root@의지박약공부노트 ~$

sklearn.linear_model.LogisticRegression

카테고리 없음
@2021-09-28 15:46:52

 sklearn의 여러 모델들을 사용하다 보니, 유독 logistic regressor에서만 다음과 같은 warning message가 나타나는 것을 볼 수 있습니다. 

/opt/conda/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:762: ConvergenceWarning: lbfgs failed to converge (status=1): STOP: TOTAL NO. of ITERATIONS REACHED LIMIT. Increase the number of iterations (max_iter) or scale the data as shown in: https://scikit-learn.org/stable/modules/preprocessing.html Please also refer to the documentation for alternative solver options: https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)

 Warning message를 읽어보니 주어진 iteration안에서 모델이 수렴하지 못해서 나타나는 문제인것 같습니다. 그렇다면 iteration이 무엇인지 알아야할듯 합니다. epoch, iteration, batch는 항상 헷갈립니다. 우선 이해를 위해 정리하고 넘어가겠습니다.

 

epoch : 전체 학습을 몇회 진행할지에 대한 값입니다. 모델을 10회 학습시키고 싶다면, epoch = 10이 됩니다.

iteration : 1epoch를 몇 번에 나누어 진행할지에 대한 값입니다. 일반적으로 batch size에 의해 결정됩니다. 

batch size : 1회의 iteration에 몇개의 데이터를 담을지에 대한 값입니다. 

 


예를들어 볼까요? 우선 우리에겐 1024개의 데이터가 있다고 가정하겠습니다. 모델을 학습시키는데 batch size = 128이라면, iteration은 8이 되고, 8회의 iteration이 끝나면 1epoch가 종료되었다고 할 수 있습니다. 


 다시 우리의 문제로 넘어와보겠습니다. sklearn.linear_model.LogisticRegression의 max_iter의 default값은 100이라고 합니다. 100회의 iter에서 모델이 충분히 수렴하지 못해 발생하는 warning같습니다.

  여기까지 이해하셨다면 알 수 있겠지만, 이때 빠른 해결책은 크게 다음과 같습니다.

1. max_iter값을 늘려준다 : iter의 최대치를 늘려줘 데이터가 수렴하는 기회를 늘려줍니다.

2. 데이터를 normalize 해준다 : 데이터를 정규화해 빠르게 수렴할 수 있게 도와줍니다.

3. solver를 바꿔준다 : 최적화를 도와주는 알고리즘을 바꿔줍니다. default는 lbfgs이며, 선택시 여러 측면을 고려해야 합니다. 

 

참고 : sklearn 공식문서 sklearn.linear_model.LogisticRegression — scikit-learn 1.0 documentation 

 

sklearn.linear_model.LogisticRegression

Examples using sklearn.linear_model.LogisticRegression: Release Highlights for scikit-learn 1.0 Release Highlights for scikit-learn 1.0, Release Highlights for scikit-learn 0.23 Release Highlights ...

scikit-learn.org