로지스틱 회귀
- 로지스틱 회귀는 선형 회귀 방식을 분류에 적용한 알고리즘이다
- 로지스틱이 선형 회귀와 다른 점은 학습을 통해 선형 함수의 최적선을 찾는 것이 아니라 시그모이드 함수 최적선을 찾고 반환값을 확률로 간주해 확률에 따라 분류를 결정하는 것
- y = 1/(1+e − x)
- 시그모이드 함수는 x값이 아무리 커지거나 작아져도 y값은 항상 0과 1사이를 반환한다.
- LogisticRegression 클래스의 solver 파라미터에서는 Ibfgs, liblinear, newton-cg, sag, saga 값을 적용해서 최적화를 선택할 수 있다
- Ibfgs: 사이킷런 0.22 버전부터 solver의 기본값, 메모리 공간 절약, CPU 코어 수가 많다면 최적화를 병렬로 수행
- liblinear: 버전 0.21까지는 얘가 기본값, 다차원, 작은 데이터셋에서 효과적으로 동작하지만 국소 최적화 이슈가 있음, 병렬 최적화 불가능
- newton-cg: 좀 더 정교한 최적화 가능, 대용량 데이터에선 속도가 느림
- sag: 경사하강법 기반의 최적화 적용, 대용량 데이터에서 속도가 빠름
- saga: sag와 유사, L1 정규화 가능
- 다양한 solver값이 있지만 성능 차이는 사실 미비함. 일반적으로는 Ibfgs, liblinear를 선택함
위스콘신 유방암 데이터로 실습하기
In [1]:
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
cancer = load_breast_cancer()
In [2]:
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
#평균 0, 분산 1로 데이터 분포도 변환
scaler = StandardScaler()
data_scaled = scaler.fit_transform(cancer.data)
X_train, X_test, y_train, y_test = train_test_split(data_scaled, cancer.target, test_size=0.3, random_state=0)
solver = Ibfgs로 학습하기
In [3]:
from sklearn.metrics import accuracy_score, roc_auc_score
#solver인자값을 입력하지 않고 디폴트인 Ibfgs로 수행
lr_clf = LogisticRegression()
lr_clf.fit(X_train, y_train)
lr_preds = lr_clf.predict(X_test)
print('accuracy: {0:.3f}, roc_auc: {1:.3f}'.format(accuracy_score(y_test, lr_preds), roc_auc_score(y_test, lr_preds)))
accuracy: 0.977, roc_auc: 0.972
서로 다른 solver값으로 학습하기
solver는 최적화에 상대적으로 많은 반복 횟수가 필요할 수 있으므로 max_iter=600으로 설정
In [4]:
solvers = ['Ibfgs', 'liblinear', 'newton-cg', 'sag', 'saga']
for solver in solvers:
lr_clf = LogisticRegression(solver=solver, max_iter=600)
lr_clf.fit(X_train, y_train)
lr_preds = lr_clf.predict(X_test)
print('solver: {0}, accuracy: {1:.3f}, roc_auc: {2:.3f}'.format(solver, accuracy_score(y_test, lr_preds), roc_auc_score(y_test, lr_preds)))
---------------------------------------------------------------------------
InvalidParameterError Traceback (most recent call last)
<ipython-input-4-c93df0622d0c> in <cell line: 3>()
3 for solver in solvers:
4 lr_clf = LogisticRegression(solver=solver, max_iter=600)
----> 5 lr_clf.fit(X_train, y_train)
6 lr_preds = lr_clf.predict(X_test)
7
/usr/local/lib/python3.10/dist-packages/sklearn/linear_model/_logistic.py in fit(self, X, y, sample_weight)
1158 """
1159
-> 1160 self._validate_params()
1161
1162 solver = _check_solver(self.solver, self.penalty, self.dual)
/usr/local/lib/python3.10/dist-packages/sklearn/base.py in _validate_params(self)
598 accepted constraints.
599 """
--> 600 validate_parameter_constraints(
601 self._parameter_constraints,
602 self.get_params(deep=False),
/usr/local/lib/python3.10/dist-packages/sklearn/utils/_param_validation.py in validate_parameter_constraints(parameter_constraints, params, caller_name)
95 )
96
---> 97 raise InvalidParameterError(
98 f"The {param_name!r} parameter of {caller_name} must be"
99 f" {constraints_str}. Got {param_val!r} instead."
InvalidParameterError: The 'solver' parameter of LogisticRegression must be a str among {'saga', 'liblinear', 'newton-cholesky', 'sag', 'lbfgs', 'newton-cg'}. Got 'Ibfgs' instead.
- LogisticRegression 클래스의 또다른 주요 하이퍼파라미터로 penalty와 C가 있음
- penalty는 규제의 유형을 설정, 기본은 L2
- C는 규제 강도를 조절하는 alpha값의 역수. 즉, C = 1/alpha. 값이 작을수록 규제 강도가 크다
- L1, L2 규제의 경우 solver 설정에 따라 영향을 받음→ Ibfgs, newton-dg, sag의 경우 L2 규제만 가능
- → Liblinear, saga의 경우 L1, L2 규제가 모두 가능하지만
위스콘신 데이터에서 GridSearchCV를 이용하여 solver, penalty, C를 최적화해보자
In [4]:
from sklearn.model_selection import GridSearchCV
params = {'solver': ['liblinear', 'Ibfgs'],
'penalty': ['l1', 'l2'],
'C': [0.01, 0.1, 1, 5, 10]}
lr_clf = LogisticRegression()
grid_clf = GridSearchCV(lr_clf, param_grid = params, scoring='accuracy', cv=3)
grid_clf.fit(data_scaled, cancer.target)
print('최적 하이퍼 파라미터: {0}, 최적 평균 정확도: {1:.3f}'.format(grid_clf.best_params_, grid_clf.best_score_))
최적 하이퍼 파라미터: {'C': 0.1, 'penalty': 'l2', 'solver': 'liblinear'}, 최적 평균 정확도: 0.979
C값은 0.1, penalty는 l2 규제, solver가 liblinear일 때 평균 정확도는 0.979로 가장 좋은 성능을 나타냄
'Data Science > 파이썬 머신러닝 완벽 가이드' 카테고리의 다른 글
[sklearn] (36) 회귀 실습 - kaggle 자전거 대여 수요 예측하기 (0) | 2023.06.30 |
---|---|
[sklearn] (35) 회귀 트리 RandomForestRegressor, DecisionTreeRegressor... (0) | 2023.06.27 |
[sklearn] (33) 규제 선형 모델 - 릿지, 라쏘, 엘라스틱넷 회귀 (0) | 2023.06.16 |
[sklearn] (32) 다항 회귀와 과대적합/과소적합 (0) | 2023.06.15 |
[sklearn] (31) LinearRegression을 활용한 보스턴 주택 가격 회귀 분석 (0) | 2023.06.15 |