ConvergenceWarning: The max_iter was reached which means the coef_ did not converge warnings

Hyunjun Kim·2024년 11월 21일

Error

목록 보기
3/4

ConvergenceWarning은 모델이 주어진 max_iter(최대 반복 횟수) 내에서 수렴하지 못했을 때 발생하는 경고다.

모델이 손실 함수(loss function)를 충분히 최소화하지 못한 경우를 의미하는데,
아래와 같은 방법들로 문제를 해결해볼 수 있음.

  1. max_iter 값 늘려보기
  2. 정규화 강도(C)를 추가해 과적합을 방지하기
  3. 데이터가 표준화(스케일링)되었는지 확인하기
  4. 수렴 문제가 있는 solver는 제외하고 실험하기

1. max_iter 값을 늘리기

max_iter 값을 100에서 300, 500, 또는 1000으로 늘려보자.
반복 횟수를 증가시키면 모델이 수렴할 가능성이 높아짐

수정 파라미터:

pythonparams = {
    'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga'],
    'max_iter': [100, 300, 500, 1000]  # max_iter 값을 점진적으로 늘림
}

grid_lor = GridSearchCV(model_lor2, param_grid=params, scoring='accuracy', cv=5)
grid_lor.fit(X_train, y_train)

print('최고의 하이퍼 파라미터:', grid_lor.best_params_)
print('최고의 정확도:', round(grid_lor.best_score_, 3))

2. 정규화 강도(C) 추가

Logistic Regression 모델이 과적합(overfitting) 때문에 수렴하지 않을 가능성도 있음. 이 경우엔 정규화 강도(C)를 추가해서 완화할 수 있다.

  • 작은 C 값은 더 강한 정규화를 적용한다.

수정 예시:

params = {
    'solver': ['newton-cg', 'lbfgs', 'liblinear'],
    'max_iter': [100, 300, 500],
    'C': [0.01, 0.1, 1, 10, 100]  # 정규화 강도
}

grid_lor = GridSearchCV(LogisticRegression(), param_grid=params, scoring='accuracy', cv=5)
grid_lor.fit(X_train, y_train)

print('최고의 하이퍼 파라미터:', grid_lor.best_params_)
print('최고의 정확도:', round(grid_lor.best_score_, 3))

3. 데이터 스케일링 확인하기

Age_mm_sc, Fare_sd_sc 등 특징(feature)들이 이미 표준화된 상태인지 확인해보자.
Logistic Regression의 일부 solver(saga, sag)는 데이터가 스케일링되지 않은 경우 수렴하기 어렵다.

만약 스케일링이 되어 있지 않다면, 아래와 같이 표준화를 해보자.

코드 예시:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)  # 특징 스케일링

4. 수렴 문제를 일으키는 Solver 제외

solver 중 일부(sag, saga)는 특히 데이터셋이 작거나 스케일링이 적절하지 않은 경우 수렴 문제가 발생할 수 있다.
newton-cg, lbfgs, liblinear 중심으로 학습을 진행해보자.

코드 예시:

params = {
    'solver': ['newton-cg', 'lbfgs', 'liblinear'],
    'max_iter': [100, 300, 500]
}

grid_lor = GridSearchCV(LogisticRegression(), param_grid=params, scoring='accuracy', cv=5)
grid_lor.fit(X_train, y_train)

print('최고의 하이퍼 파라미터:', grid_lor.best_params_)
print('최고의 정확도:', round(grid_lor.best_score_, 3))
profile
Data Analytics Engineer 가 되

0개의 댓글