본문 바로가기
파이썬 라이브러리를 활용한 머신러닝

Algorithm Chains and Pipelines - Automatic Model Selection

by 일일과제중 2019. 12. 23.
반응형

 

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

 

파이프라인을 사용하는 주된 목적은 그리드 서치 때문입니다.

 

GridsearcCV와 Pipeline을 연결하는 것에서 더 나아가, 파이프라인을 구성하는 단계도 탐색 대상으로 삼을 수 있습니다. 

 

탐색 범위가 넒어집니다.

 

모든 알고리즘을 시도해보는 것이 필수적인 머신러닝 전략은 아닙니다. 

 

SVC, MLPClassifier, RandomForest Classifier를 비교해보겠습니다.

 

SVC는 데이터 스케일을 조정해야 하므로 StandardScaler를 사용할지 또는 전처리를 하지 않을지 판단해야합니다.

 

MLPClassifier도 전처리가 필요한지 판단해야합니다.

 

RandomForestClassifier에는 전처리가 필요 없습니다.

 

 

Cancer 데이터셋 예시

 

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, GridSearchCV

pipe = Pipeline([('preprocessing', None), ('classifier', SVC())])
hyperparam_grid = [
    {'classifier': [SVC()], 'preprocessing' : [StandardScaler(), MinMaxScaler(), None],
    'classifier__gamma' : [0.001, 0.01, 0.1, 1, 10, 100],
    'classifier__C' : [0.001, 0.01, 0.1, 1, 10, 100]},
    {'classifier': [MLPClassifier(solver='lbfgs')], 'preprocessing' : [StandardScaler(), MinMaxScaler(), None],
    'classifier__hidden_layer_sizes' : [(10,), (20,), (50,), (100,)],
    'classifier__activation' : ['tanh', 'relu']},
    {'classifier' : [RandomForestClassifier(n_estimators=100)],
    'preprocessing' : [None], 'classifier__max_features': [1,2,3]}]
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=1)

grid = GridSearchCV(pipe, hyperparam_grid, scoring='accuracy', refit=True, cv=kfold)
grid.fit(X_train, y_train)

print("최적의 매개변수:\n{}\n".format(grid.best_params_))
print("최상의 교차 검증 점수: {:.2f}".format(grid.best_score_))
print("테스트 세트 점수: {:.2f}".format(grid.score(X_test, y_test)))

그림1

 

그리드 서치의 결과는 StandardScaler 전처리를 사용하고 C=10, gamma=0.01인 SVC에서 최상의 결과를 얻었습니다.

 

 

Iris 데이터셋 예시

 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
cancer = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, GridSearchCV

pipe = Pipeline([('preprocessing', None), ('classifier', SVC())])
hyperparam_grid = [
    {'classifier': [SVC()], 'preprocessing' : [StandardScaler(), MinMaxScaler(), None],
    'classifier__gamma' : [0.001, 0.01, 0.1, 1, 10, 100],
    'classifier__C' : [0.001, 0.01, 0.1, 1, 10, 100]},
    {'classifier': [MLPClassifier(solver='lbfgs')], 'preprocessing' : [StandardScaler(), MinMaxScaler(), None],
    'classifier__hidden_layer_sizes' : [(10,), (20,), (50,), (100,)],
    'classifier__activation' : ['tanh', 'relu']},
    {'classifier' : [RandomForestClassifier(n_estimators=100)],
    'preprocessing' : [None], 'classifier__max_features': [1,2,3]}]
kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=1)

grid = GridSearchCV(pipe, hyperparam_grid, scoring='accuracy', refit=True, cv=kfold)
grid.fit(X_train, y_train)

print("최적의 매개변수:\n{}\n".format(grid.best_params_))
print("최상의 교차 검증 점수: {:.2f}".format(grid.best_score_))
print("테스트 세트 점수: {:.2f}".format(grid.score(X_test, y_test)))

그림2

 

 

Summary and Outlook

 

머신러닝 워크플로의 여러 처리 단계를 연결해주는 도구인 Pipeline 파이썬 클래스를 소개했습니다.

 

파이프라인을 사용하면 여러 단계를 하나의 파이썬 객체로 캡슐화해주고 scikit-learn의 fit, predict, transform 인터페이스를 사용할 수 있습니다. 

 

실제 머신러닝 어플리케이션에서는 모델을 단독으로 사용하는 경우가 거의 없으며 여러 처리 단계가 계속해서 이뤄집니다.

 

특성 추출, 전처리, 모델의 완벽한 조합을 찾는 것은 예술에 가까운 일이라 어느 정도 시행착오가 필요합니다. 

 

파이프라인을 사용하면 여러 다른 처리 단계를 손쉽게 시도해볼 수 있습니다.

 

Pipeline 클래스는 코드를 간결하게 작성하도록 도와줍니다.

 

 

파이썬 라이브러리를 활용한 머신러닝 책과 성균관대학교 강석호 교수님 수업 내용을 바탕으로 요약 작성되었습니다.

반응형

댓글