문제해결

scikit-learn GridSearchCV ConvergenceWarning 끄기

꼬기를꼬깃꼬깃 2023. 3. 13. 14:36
먼저 아래는 일반적인 해결법들
 

1. ignore_warnings

from sklearn.exceptions import ConvergenceWarning
from sklearn.utils.testing import ignore_warnings
 
@ignore_warnings(category=ConvergenceWarning)
def ~(~):
 
모듈 앞에서 위와 같이 사용
 
2. filterwarnings, simplefilter
import warnings
from sklearn.exceptions import ConvergenceWarning

with warnings.catch_warnings():
    warnings.filterwarnings('ignore', 'Solver terminated early.*') #1
    warnings.filterwarnings('ignore', category=ConvergenceWarning) #2
 
ConvergenceWarning이 발생하는 위치(보통 fit 함수 호출)에서 #1 또는 #2로 사용

 

3. 환경변수 설정
import sklearn.exceptions

os.environ["PYTHONPATH"] = os.path.dirname(sklearn.exceptions.__file__)
os.environ["PYTHONWARNINGS"] = "ignore::exceptions.ConvergenceWarning:sklearn.svm[.*]"
 
PYTHONWARNINGS에 들어가는 필터 포맷은 action:message:category:module:line 형태

 

4. ConvergenceWarning
from sklearn.exceptions import ConvergenceWarning
ConvergenceWarning('ignore')
 
어디서 나온지 모를 사용법이라 혹시나 했는데 역시나 효과없음

위의 방법들은 GridSearchCV의 n_jobs 파라미터를 1이 아닌 값으로 사용할 경우에 효과 없음
학습이 여러 개의 쓰레드로 나눠져서 수행되면서 분기된 새로운 쓰레드에는 ignore 설정이 적용되지 않는 것이 아닐까하는 추측

 

아래는 결국 찾은 해결법
 
1. simplefilter, 환경변수
if not sys.warnoptions:
    warnings.simplefilter("ignore")                                                         #1
    os.environ["PYTHONWARNINGS"] = "ignore"                                #2

    warnings.filterwarnings('ignore', 'Solver terminated early.*')            #3
    warnings.filterwarnings('ignore', category=ConvergenceWarning)  #4
 
모듈의 시작부에 정의해야함
 
#1, #2는 모든 warning 차단
#3, #4는 max_iter로 인한 ConvergenceWarning 차단
 
위에서 안된 이유는 with ~ 부분 때문인듯함
반응형