이전 내용
로지스틱 회귀
로지스틱 회귀는 선형 회귀 방식을 분류에 적용한 알고리즘으로, 분류에 사용된다.
회귀는 가중치 변수가 선형 인지 아닌지에 따라 선형 또는 비선형으로 나뉜다.
로지스틱 회귀가 선형 회귀와 다른 점은 학습을 통해 선형 함수의 회귀 최적선을 찾는 게 아니라 시그모이드 함수 최적선을 찾고 이 시그모이드 함수의 반환 값을 확률로 간주해 확률에 따라 분류를 결정한다는 것이다.
로지스틱 회귀는 선형 회귀 방식을 기반으로 하되, 시그모이드 함수를 이용해 분류를 수행하는 회귀이며, 사이킷런은 LogisticRegression 클래스를 제공한다. 이 클래스에서 solver 파라미터의 'lbfgs', 'liblinear', 'newton-cg', 'sag', 'saga' 값을 적용해서 최적화를 선택할 수 있다.
- lbgfs: solver의 기본 설정 값(사이킷런 0.22 버전부터). 메모리 공간 절약, CPU 코어 수가 많다면 최적화를 병렬로 수행 가능
- liblinear: 사이킷런 0.21 버전 까지 solver의 기본 설정. 다차원이고 작은 데이터 세트에서 효과적으로 동작하나, 국소 최적화에 이슈가 있고 병렬로 최적화 불가
- newton-cg: 좀 더 정교한 최적화를 가능하게 하나, 대용량의 데이터에서 속도가 느려짐
- sag(Stochastic Average Gradient): 경사 하강법 기반의 최적화 적용. 대용량의 데이터에서 빠르게 최적화
- saga: sag와 유사한 최적화 방식이며, L1 정규화 가능
해당 페이지에서 '1.1.11.3. 솔버 ' 부분에 더 자세한 내용이 나온다.
로지스틱 회귀는 가볍고 빠르지만, 이진 분류 예측 성능도 뛰어나 로지스틱 회귀를 이진 분류의 기본 모델로 사용하는 경우가 많다. 또한 로지스틱 회귀는 희소한 데이터 세트 분류에도 뛰어난 성능을 보여 텍스트 분류에서도 자주 사용된다.
LogisticRegression 클래스를 이용한 위스콘신 유방암 데이터세트 분석
위스콘신 유방암 데이터 세트 기반에서 로지스틱 회귀로 암 여부를 판단해본다.
[대략적인 순서]
- 사이킷런의 load_breast_cancer()를 호출해 전체 데이터 세트 생성
- 정규 분포 형태의 표준 스케일링 적용한 뒤, train_test_split()을 이용해 데이터 세트 분리(훈련/테스트)
- 로지스틱 회귀를 이용해 학습 및 예측 수행하고, ROC-AUC 값 측정
# 로지스틱 회귀 - 위스콘신 유방암 데이터 세트
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
# 데이터 로드
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
cancer = load_breast_cancer()
# 정규 분포 형태의 표준 스케일링 적용 및 데이터 세트 분할
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# StandardScaler() 로 평균이 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)
# 로지스틱 회귀를 이용해 학습 및 예측 수행하고, 정확도와 ROC-AUC 값 산출
from sklearn.metrics import accuracy_score, roc_auc_score
# solver 인자값을 생성자로 입력하지 않으면 solver='lbfgs'
lr_clf = LogisticRegression()
lr_clf.fit(X_train, y_train)
lr_preds = lr_clf.predict(X_test)
# 정확도와 ROC-AUC 측정
print('accuracy: {0:.3f}, roc_auc: {1:.3f}'.format(accuracy_score(y_test, lr_preds),
roc_auc_score(y_test, lr_preds)))
[서로 다른 solver 값으로 로지스틱 회귀를 학습하고 성능 평가]
특정 solver는 최적화에 상대적으로 많은 반복 횟수가 필요할 수 있으므로 max_iter 값을 600으로 설정
※ max_iter: solver로 지정된 최적화 알고리즘이 최적 수렴할 수 있는 최대 반복 회수
# 서로 다른 solver 값으로 로지스틱 회귀 학습
solvers = ['lbfgs', 'liblinear', 'newton-cg', 'sag', 'saga']
# 여러 개의 solver 값별로 LogisticRegression 학습 후 성능 평가
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)
# accuracy와 ROC-AUC 측정
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)))
▶ 데이터 세트가 작아 개별 solver별 차이는 크지 않다.
[GridSearchCV를 이용해 solver, penalty, C 최적화]
Solver와 max_iter 외에 사이킷런 LogisticRegression 클래스의 주요 하이퍼 파라미터
- penalty: 규제의 유형을 설정. ('l2' ▶ L2 규제, 'l1' ▶ L1 규제, 기본은 'l2')
- C: 규제 강도를 조절하는 alpha 값의 역수. C=1/alpha 이며, C 값이 작을수록 규제 강도가 크다
L1, L2 규제의 경우 solver 설정에 다라 영향을 받는데,
liblinear, saga 는 L1, L2 규제가 모두 가능하나, lbfgs, newton-cg, sag의 경우는 L2 규제만 가능.
# GridSearchCV를 이용해 solver, penalty, C 최적화
from sklearn.model_selection import GridSearchCV
params={'solver':['liblinear', 'lbfgs'],
'penalty':['l2', 'l1'],
'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_))
다음 내용
[출처]
사이킷런 공식 블로그
파이썬 머신러닝 완벽 가이드
'[파이썬 Projects] > <파이썬 머신러닝>' 카테고리의 다른 글
[머신러닝] 회귀 - 자전거 대여 수요 예측 (1) | 2024.10.23 |
---|---|
[머신러닝] 회귀 트리 (5) | 2024.10.23 |
[머신러닝] 회귀 - 규제 선형 모델: 릿지, 라쏘, 엘라스틱넷 (1) | 2024.10.22 |
[머신러닝] 회귀 - 다항 회귀와 과대(과소) 적합 (3) | 2024.10.22 |
[머신러닝] 회귀 - LinearRegression 클래스 (2) | 2024.10.21 |