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

Algorithm Chains and Pipelines - Building Pipelines

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

 

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

 

대부분의 머신러닝 애플리케이션은 하나의 알고리즘으로 이뤄져 있지 않고, 여러 단계의 처리 과정과 머신러닝 모델이 연결되어 있습니다. (스케일 조정, 특성 공학 등)

 

데이터 변환 과정과 머신러닝 모델을 쉽게 연결해주는 Pipeline 파이썬 클래스를 설명하겠습니다.

 

Pipeline과 GridSearchCV를 함께 사용하여 각 처리 단계에서 필요한 매개변수 탐색을 동시에 수행합니다. 

 

 

 

파이프라인 구축하기 - 데이터 전처리와 하이퍼파라미터 선택 

 

GridSearchCV를 사용해서 더 좋은 SVC 하이퍼파라미터를 찾으려고 합니다. 

 

스케일을 조정한 데이터를 사용해서 SVC의 매개변수에 대해 그리드 서치를 수행했습니다.

 

그러나 데이터의 최솟값과 최댓값을 계산할 때 학습을 위해 훈련 세트에 있는 모든 데이터를 사용하였습니다.

 

그런 다음에 스케일이 조정된 훈련 데이터에서 교차 검증을 사용해 그리드 서치를 수행했습니다. 

 

 

from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

# 데이터 적재와 분할
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=0)

# 훈련 데이터의 최솟값, 최댓값을 계산합니다. 
scaler = MinMaxScaler().fit(X_train)

# 훈련 데이터의 스케일을 조정합니다. 
X_train_scaled = scaler.transform(X_train)


svm = SVC()

# 스케일 조정된 훈련데이터에 SVM을 학습시킵니다. 
svm.fit(X_train_scaled, y_train)

# 테스트 데이터의 스케일을 조정하고 점수를 계산합니다. 
X_test_scaled = scaler.transform(X_test)
print("테스트 점수: {:.2f}".format(svm.score(X_test_scaled, y_test)))

테스트 점수: 0.95

 

 

from sklearn.model_selection import GridSearchCV

# 이 코드는 예를 위한 것입니다. 실제로 사용하지 마세요.
param_grid = {'C' : [0.001, 0.01, 0.1, 1, 10, 100],
             'gamma' : [0.001, 0.01, 0.1, 1, 10, 100]}
grid = GridSearchCV(SVC(), param_grid=param_grid, cv=5)
grid.fit(X_train_scaled, y_train)
print("최상의 교차 검증 정확도: {:.2f}".format(grid.best_score_))
print("테스트 점수: {:.2f}".format(grid.score(X_test_scaled, y_test)))
print("최적의 매개변수: ", grid.best_params_)

최상의 교차 검증 정확도: 0.98

테스트 점수: 0.97

최적의 매개변수: {'C': 1, 'gamma': 1}

 

 

그림1

 

교차 검증 동안 데이터 처리와 최종 평가가 어떻게 다른지 보여줍니다. 

 

 

파이프라인

 

데이터의 스케일을 조정하기 위해 전체 훈련 세트를 전체 훈련 세트를 이용했습니다. '

 

하지만 이는 새로운 데이터가 모델에 나타날 떄와 완전히 다릅니다.

 

교차 검증의 분할 방식은 모델이 새 데이터를 만났을 때를 올바로 반영하지 못하고 있습니다. 

 

검증 폴드 데이터의 정보가 모델 구축 과정에 이미 누설되었으므로 교차 검증에서 최적의 하이퍼파라미터를 찾지 못하고 낙관적인 결과가 만들어지게 됩니다. 

 

데이터셋의 정보를 이용하는 모든 처리 과정은 데이터셋의 훈련 부분에만 적용되어야 하므로 교차 검증 반복 안에 있어야 합니다.

 

이런 방식을 구현하려면 Pipeline을 사용하면 됩니다. 

 

 

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

iris = load_iris()
X_trainval, X_test, y_trainval, y_test = train_test_split(
iris.data, iris.target, test_size=0.25, random_state=0)

print("Size of trainval set: {}, size of test set:"
     " {}\n".format(X_trainval.shape[0], X_test.shape[0]))

Size of trainval set: 112, size of test set: 38

 

아이리스 데이터셋을 사용하겠습니다. 

 

 

from sklearn.pipeline import Pipeline

pipe = Pipeline([('scaler', StandardScaler()), ('svm', SVC())])

 

StandardScaler로 데이터의 스케일을 조정하고 SVM 모델을 훈련시키는 워크플로를 Pipeline을 사용해 표현했습니다. 

 

각 단계를 리스트로 전달하여 파이프라인 객체를 만듭니다. 각 단계는 추정기의 객체와 임의이 이름으로 구성된 튜플입니다. 

 

여기서는 두 개의 단계를 만들었습니다. 

 

 

from sklearn.model_selection import StratifiedKFold, GridSearchCV

kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=2)
hyperparam_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 = GridSearchCV(pipe, hyperparam_grid, scoring='accuracy', refit=True, cv=kfold)
grid_search.fit(X_trainval, y_trainval)

print("Best score on validation set: {:.2f}".format(grid_search.best_score_))
print("Best hyperparameters: {}".format(grid_search.best_params_))

Best score on validation set: 0.97

Best hyperparameters: {'svm__C': 100, 'svm__gamma': 0.01}

 

그리드 서치에 파이프라인을 사용하는 방식 역시 다른 추정기를 사용할 때와 같습니다.

 

탐색할 하이퍼파라미터 그리드를 정의하고, 이 하이퍼파라미터 그리드와 파이프라인으로 GridSearchCV의 객체를 만듭니다.

 

하이퍼파라미터 그리드를 만들 때 조금 달라지는 것이 있습니다.

 

각 하이퍼파라미터가 파이프라인의 어떤 단계에 속한 것인지 알려줘야 합니다. C와 gamma 하이퍼파라미터는 두 번째 단계인 SVC의 하이퍼파라미터입니다.

 

이 단계의 이름을 "svm"이라고 지정했습니다. 파이프라인용 하이퍼파라미터 그리드는 단계 이름과 하이퍼파라미터 이름을 "__"로 연결해 만듭니다. 

 

 

그림2

 

교차 검증 반복 안에서 전처리가 될 때 데이터 사용 형태입니다. 

 

 

결론

 

파이프라인을 사용하면 머신러닝 워크플로에 필요한 모든 처리 단계를 하나의 scikit-learn 추정기로 캡슐화할 수 있습니다.

 

전처리 + 분류 과정을 위한 코드를 줄일 수 있습니다.

 

이전에 본 그리드 서치와 다른 점은 교차 검증의 각 분할에 scaler가 훈련 폴드에 매번 적용되어, 매개변수 검색 과정에 검증 폴드의 정보가 누설되지 않은 것입니다. 

 

 

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

반응형

댓글