본문 바로가기
Archive/데이터 분석 관련

[Data] Scikit-learn을 통한 Pipeline 구축

by 다람이도토리 2021. 6. 1.

https://github.com/SeongwonTak/TIL_swtak/blob/master/DataScience/scikitlearn_pipeline.ipynb

 

SeongwonTak/TIL_swtak

Today, I learned. Contribute to SeongwonTak/TIL_swtak development by creating an account on GitHub.

github.com

 

개요

데이터 분석시에서는 범주형이나 스케일링, 정규화 같은 수많은 데이터 변환이 수행되어야 한다. (전처리) 이 과정을 한 번이 아닌 수 번을 해야 할 것인데 그 때마다 이 모든 변환을 직접 할 수는 없을 것이다.

다행스럽게도, 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)))