본문 바로가기

머신러닝

알고리즘 체인과 파이프라인

데이터 변환 과정과 머신러닝 모델을 쉽게 연결해줌 -> pipeline

매개변수 그리드는 __를 붙여줌

param_grid = {'svm__C': [0.001,0.01,0.1,1,10,100],
             'svm__gamma': [0.001,0.01,0.1,1,10,100]}

검증 세트로 나눌 때, 데이터 스케일을 조정할 때 훈련세트에 있는 모든 데이터를 이용하면 안됨.

새로운 데이터셋의 최솟값과 최댓값이 훈련데이터와 다를 수 있기 떄문이다.

grid search는 교차검증을 내부에서 사용

 

아래와 같이 해야함.

검증 폴드 데이터의 정보가 누설됨.

따라서 교차검증의 분할이 모든 전처리 과정보다 앞서 이뤄져야함

pipeline은 fit, predict, score를 제공함

pipeline을 사용하는 경우는 지도학습 모델과 전처리 단계를 연결할 때이다.

 

pipeline에는 원소가 튜플인 리스트로 매개변수가 들어감.

from sklearn.pipeline import Pipeline
pipe = Pipeline([('scaler', MinMaxScaler()), ('svm', SVC())])
pipe.fit(X_train, y_train)
pipe.score(X_test, y_test)

pipe의 fit은 첫번째로 scaler의 fit을 호출하여 훈련데이터를 변환하고

두번째로 변환된 데이터에 svm모델을 훈련시킴

 

score를 호출하면 먼저 scaler를 사용하여 테스트 데이터를 변환하고 score호출

from sklearn.pipeline import Pipeline
pipe = Pipeline([('scaler', MinMaxScaler()), ('svm', SVC())])

param_grid = {'svm__C': [0.001,0.01,0.1,1,10,100],
             'svm__gamma': [0.001,0.01,0.1,1,10,100]}
             
             
             
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(pipe, param_grid=param_grid, cv=5)
grid.fit(X_train, y_train)
print(grid.best_score_)
print(grid.score(X_test, y_test))
print(grid.best_params_)

 

전처리 말고도 특성 추출, 특성 선택, 스케일 변경, 분류 4단계를 포함하는 파이프라인도 만듣ㄹ 수 있음

마지막이 분류가 아니라 회귀나 군집도 가능

 

마지막 단계를 제외하고는 모두 transform 메서드를 가지고 있어야함. (다음 데이터를 위해서)

 

pipeline.fit이 실행되는 동안 파이프라인은 각 단계에서 이전 단계의 transform 출력을 입력으로 받아 fit과 transform 메서드를 차례로 호출하고 마지막 단계는 fit만 호출함

predict는 transform 호출하다가 마지막에 predict호출

 

마지막이 predict를 가질 필요는 없으므로 스케일 변환이나 pca만 포함하는 것도 만들 수 있음

make_pipeline : 이름을 부여안해도 됨

from sklearn.pipeline import make_pipeline

pipe_short = make_pipeline(MinMaxScaler(), SVC(C=100))

 

자동으로 이름 만들어 주는데 파이썬 클래스 이름의 소문자 버전임

같으면 뒤에 숫자 붙음

from sklearn.decomposition import PCA

pipe = make_pipeline(StandardScaler(), PCA(n_components=2), StandardScaler())
pipe.steps

[('standardscaler-1', StandardScaler()),
 ('pca', PCA(n_components=2)),
 ('standardscaler-2', StandardScaler())]

 

 

 name_steps로 각 단계 접근

#파이프라인 적용함
pipe.fit(cancer.data)

components = pipe.named_steps['pca'].components_
print(components.shape)

파이프라인을 사용하는 주된 목적은 grid search임

from sklearn.linear_model import LogisticRegression
pipe = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))

make_pipeline이므로LogisticRegression단계의 이름은 logisticregression임

param_grid = {'logisticregression__C': [0.01,0.1,1,10,100]}

X_train, X_test, y_train, y_test = train_test_split(cancer.data,cancer.target, random_state=4)
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(X_train, y_train)

최적 매개변수 확인

grid.best_estimator_

Pipeline(steps=[('standardscaler', StandardScaler()),
                ('logisticregression', LogisticRegression(C=1, max_iter=1000))])

 

 

전처리와 모델의 매개변수를 위한 그리드 서치

boston = load_boston()
X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=0)

from sklearn.linear_model import Ridge
from sklearn.preprocessing import PolynomialFeatures
pipe = make_pipeline(StandardScaler(), PolynomialFeatures(), Ridge())
param_grid = {'polynomialfeatures__degree': [1,2,3],
             'ridge__alpha': [0.001,0.01,0.1,1,10,100]}
grid = GridSearchCV(pipe, param_grid=param_grid, cv=5)
grid.fit(X_train, y_train)

 

 

모델 선택을 위한 그리드 서치

연결하는 것만이 아닌 파이프라인을 구성하는 단계도 탐색 대상으로 삼을 수 있다.

예를 들어 standardscaler와 minmaxscaler를 쓸지 정함

 

하지만 탐색범위가 너무늘어남

여기선 단계 이름을 직접 지정해주자

또한 각 모델마다 매개변수와 전처리가 다르므로 비대칭 매개변수 그리드 탐색을 하자

pipe = Pipeline([('preprocessing', StandardScaler()), ('classifier', SVC())])

from sklearn.ensemble import RandomForestClassifier

param_grid = [
    {'classifier':[SVC()], 'preprocessing':[StandardScaler()],
    'classifier__gamma':[0.001,0.01,0.1,1,10,100],
    'classifier__C':[0.001,0.01,0.1,1,10,100]},
    {'classifier':[RandomForestClassifier(n_estimators=100)],
    'preprocessing':[None], 'classifier__max_features':[1,2,3]}
]

계산 비용이 높은 파이프라인과 방대한 양의 매개변수 탐색을 해야한다면 dask-ml을 찾아보자

 

 

 

요약

실제 머신러닝 애플리케이션에서는 모델을 단독으로 사용하지 않음, 여러가지 처리 단계가 연속됨

또한 파이프라인을 사용하면 fit, predict, score를 제공해주고 

특히 교차 검증을 사용하여 모델을 평가하고 그리드 서치를 사용하여 매개변수 선택을 할 때 모든 처리 단계를 pipeline으로 묶는 것은 필수적이다.

 

 

 

 

 

 

 

 

'머신러닝' 카테고리의 다른 글

파이썬 머신러닝 완벽가이드 - 2장  (0) 2021.09.15
파이썬 머신러닝 완벽가이드 - 1장  (0) 2021.09.07
모델 평가와 성능 향상  (0) 2021.08.05
데이터 표현과 feature engineering  (0) 2021.07.31
clustering  (0) 2021.07.25