
로지스틱 회귀분석
종속변수가 범주형 자료일 때 적용하는 회귀모델
주택소유여부같은 범주형 레이블은 예측함수를 만들기 어렵기 때문에 평균 소유 비율로 변환한다.
본래의 자료를 확률-> 오즈(odds) -> 로그(log)로 변환하여 선형회귀모델을 적용한 모델이라고 할 수 있다.
1) scikit-learn
LogisticRegression은 sklearn.linear_model 안에서 불러온다.
LogisticRegression의 하이퍼파라미터는 'C', 디폴트 값은 'C=1'이다.
하위 옵션 중 solver라는 옵션은 연산 속도와 관련된 주요 하이퍼파라미터이다.
데이터양이 수백~수십만 건인 경우 solver='sag'로 설정하면 평균경사하강법을 적용하여 속도를 향상시킬 수 있다.
2) 데이터 준비
import warnings
warnings.filterwarnings("ignore")
import pandas as pd
data=pd.read_csv('breast-cancer-wisconsin.csv', encoding='utf-8')
X=data[data.columns[1:10]]
y=data[["Class"]]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
위스콘신 대학의 'breast-cancer-wisconsin.csv' 파일로 예측분류를 진행해본다.
특성치(X)와 레이블(y)로 데이터셋을 나누고, train_test_split으로 훈련, 테스트 데이터를 분리한다.
결과가 범주형 데이터이므로 stratify = y 옵션을 설정한다!
3) 정규화(Min-Max)
#min-max 정규화
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train)
X_scaled_train = scaler.transform(X_train)
X_scaled_test = scaler.transform(X_test)
sklearn.preprocesiing에서 MinMaxScaler 라이브러리를 불러와 정규화를 진행했다.
사용하기 편하도록 scaler에 MinMaxScaler()를 담아주었고, X_train 데이터로 fit 해주었음
4) 기본 모델 적용
#하이퍼파라미터 C=1(디폴트)로 분석
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_scaled_train, y_train)
pred_train = model.predict(X_scaled_train)
model.score(X_scaled_train, y_train)
하이퍼파라미터 C=1인 기본 디폴트로 분석을 진행한다.
sklearn.linear_model에서 LogisticRegression 라이브러리를 불러와 model에 넣었다.
그 다음 정규화된 데이터 X_scaled_train와 y_train으로 fit 해준다.
예측치를 pred_train에 저장한 뒤 model.score로 정확도를 확인하는 과정
5) 혼동행렬과 다양한 평가 지표 확인
#혼동행렬
from sklearn.metrics import confusion_matrix
confusion_train = confusion_matrix(y_train, pred_train)
print("훈련데이터 오차행렬:\n", confusion_train)
#다양한 평가지표 확인
from sklearn.metrics import classification_report
cfreport_train = classification_report(y_train, pred_train)
print("분류예측 레포트 :\n", cfreport_train)
혼동행렬
sklearn.metrics에서 confusion_matrix 라이브러리를 불러온다.
다양한 평가지표 확인
sklearn.metrics에서 classification_report 라이브러리를 불러온다.
위 코드와 동일하게 test 데이터의 혼동행렬, 다양한 평가지표도 확인해주었다.
6) 하이퍼파라미터 조정(그리드탐색, 랜덤탐색)
#그리드탐색
param_grid = {'C' : [0.001, 0.01, 0.1, 1, 10, 100]}
from sklearn.model_selection import GridSearchCV
grid_search = GridSearchCV(LogisticRegression(), param_grid, cv=5)
grid_search.fit(X_scaled_train, y_train)
print("Best Parameter: {}".format(grid_search.best_params_))
print("Best Score: {:.4f}".format(grid_search.best_score_))
print("TestSet Score: {:4f}".format(grid_search.score(X_scaled_test, y_test)))
#랜덤탐색
from scipy.stats import randint
param_distribs = {'C' : randint(low=0.001, high=100)}
from sklearn.model_selection import RandomizedSearchCV
random_search = RandomizedSearchCV(LogisticRegression(), param_distributions=param_distribs, n_iter=100, cv=5)
random_search.fit(X_scaled_train, y_train)
print("Best Parameter: {}".format(random_search.best_params_))
print("Best Score: {:.4f}".format(random_search.best_score_))
print("TestSet Score: {:.4f}".format(random_search.score(X_scaled_test, y_test)))
그리드탐색은 sklearn.model_selection에서 GridSearchCV 라이브러리를,
랜덤탐색은 sklearn.model_selection에서 RandomizedSearchCV와 scipy.stats에서 randint 라이브러리를 불러온다.
'자기계발 > Python' 카테고리의 다른 글
| [빅데이터분석기사] 15 나이브 베이즈 (0) | 2022.06.21 |
|---|---|
| [빅데이터분석기사] 14 K-최근접이웃법(KNN) (0) | 2022.06.21 |
| [빅데이터분석기사] 12 다중분류 (0) | 2022.06.20 |
| [빅데이터분석기사] 11 모델평가 (0) | 2022.06.20 |
| [빅데이터분석기사] 10 하이퍼파라미터(Grid Search, Random Search) (0) | 2022.06.19 |