Pipeline
테스트 데이터셋에 있는 별도의 샘플처럼 새로운 데이터의 스케일을 조정하고 압축하기 위해서는훈련 데이터셋에서 학습한 파라미터를 재사용 해야 한다.(동일 차원으로 변형해주기 위해서)
Pipeline을 이용하면, 여러 개의 변환 단계를 포함한 모델을 학습하고 새로운 데이터에 대한 예측을 만들 수 있다.
위스콘신 유방암 데이터셋을 이용한 데이터셋 생성
import pandas as pd
df=pd.read_csv('https://archive.ics.uci.edu/ml/'
'machine-learning-databases'
'/breast-cancer-wisconsin/wdbc.data', header=None)
from sklearn.preprocessing import LabelEncoder
X=df.loc[:,2:].values
y=df.loc[:, 1].values
le=LabelEncoder()
y=le.fit_transform(y)
le.classes_
array(['B', 'M'], dtype=object)
B는 종양이 악성임을, M은 종양이 양성임을 말해준다.
라벨 인코딩을 통해서 B(악성)은 0, M(양성)은 1로 변환
>>> le.transform(['M','B'])
데이터셋을 훈련 데이터셋(전체 데이터의 80%)와 테스트 데이터셋(전체 데이터셋의 20%)로 분류
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test=\
train_test_split(X, y, test_size=0.2, stratify=y, random_state=1)
선형 분류기를 사용하기 전에 특성을 표준화 해야 한다.
유방암 데이터셋을 기존 30차원에서 2차원으로 압축한다고 할 때,
StandardScaler, PCA, LogisticRegression 객체를 하나의 Pipeline으로 구성할 수 있다.
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
pipe_lr=make_pipeline(StandardScaler(), PCA(n_components=2), LogisticRegression(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))
make_pipeline 함수는 여러개의 사이킷런 변환기(입력에 대해 fit 메서드와 transform 메서드를 지원하는 객체)와
그 뒤에 fit메서드와 predict 메서드를 구현한 사이킷런 추정기를 연결할 수 있다.
위에서는 두개의 변환기(StandardScaler, PCA)와 하나의 추정기(LogisticRegression)을 make_pipeline에 입력
이후 make_pipeline은 Pipeline클래스 객체를 반환
pipeline 객체에 fit 메서드와 transform 메서드를 호출하면, 데이터가 중간 단계의 모든 변환기의 fit와 transform 메서드를
거쳐서 추정기 객체에 도달(추정기는 변환된 훈련 데이터셋을 사용하여 학습한다.)
위에서 StandardScaler fit, transform 이후, PCA fit, transform 처리
pipeline에서 test dataset은 predict 메서드를 통해서
주입된 데이터는 중간 단계의 transform 메서드를 통과한다. 마지막 단계에서 추정기 객체가 변환된 데이터에 대한 예측을 반환
아래 코드를 통해서 추정기 객체를 주피터 노트북에서 시각해 준다.
from sklearn import set_config
set_config(display='diagram')
pipe