https://github.com/SeongwonTak/TIL_swtak/blob/master/DataScience/scikitlearn_pipeline.ipynb
개요
데이터 분석시에서는 범주형이나 스케일링, 정규화 같은 수많은 데이터 변환이 수행되어야 한다. (전처리) 이 과정을 한 번이 아닌 수 번을 해야 할 것인데 그 때마다 이 모든 변환을 직접 할 수는 없을 것이다.
다행스럽게도, Scikit-learn에서는 이 과정을 단순화 하는 도구로, 재사용하는 기능을 묶어주는 Pipeline이라는 기능이 존재한다. 이를 통해 연속된 변환을 순차적으로, 반복적으로 사용 가능하다.
예시
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
pipe_lr = make_pipeline(StandardScaler(),
PCA(n_components=3),
LogisticRegression(solver='liblinear', random_state=1))
pipe_lr.fit(X_train, y_train)
y_pred = pipe_lr.predict(X_test)
print('테스트 정확도 : %.3f' % pipe_lr.score(X_test, y_test))
k-겹 교차 검증을 이용한 성능 평가
과소적합, 과대 적합을 피하는 방법 중 하나인 K-fold cross-validation 은 다음과 같다.
이를 위해서는, 데이터를 훈련 세트, 검증 세트, 테스트 세트로 나눠 성능을 확인할 수 있게 나누어줘야 한다.
k-fold에서는 훈련 세트를 k개로 나눠, (k-1)개로 훈련을 하고, 나머지 1개로 성능을 평가한다.
이를 바탕으로, 각각의 폴드에서 얻은 성능을 기반으로 평균을 계산하여 최종 모델을 만드는 방법이다.
(그림 출처 : https://dnai-deny.tistory.com/)
이제, 각각의 fold에 대해 동일한 전처리 및 파이프라인을 적용할 수 있을 것이다. 이를 코드로 보면 다음과 같다.
#k_fold에 적용하기
from sklearn.model_selection import StratifiedKFold
kfold = StratifiedKFold(n_splits = 5).split(X_train, y_train)
scores = []
for k, (train, test) in enumerate(kfold):
pipe_lr.fit(X_train[train], y_train[train])
score = pipe_lr.score(X_train[test], y_train[test])
scores.append(score)
print('폴드 : %2d, 정확도 : %.3f' %(k+1, score))
print('정확도 : %.3f' %(np.mean(scores)))
'Archive > 데이터 분석 관련' 카테고리의 다른 글
[Data] 분류 알고리즘 - Decision Tree, Random Forest (0) | 2021.06.01 |
---|---|
[Data] 로지스틱 회귀분석 (0) | 2021.06.01 |
[Data] p-value Revisited, p-hacking이란? (0) | 2021.05.27 |
[Data] 분류의 성능평가 - Confusion Matrix (0) | 2021.05.18 |
[DS] 주성분 분석, PCA (0) | 2021.04.27 |