본문 바로가기

Study/Introduction to ML with python - 한빛

[Book] 6. 알고리즘 체인과 파이프라인 - (1)

Book Title : Introduction to Machine Learning with Python

- 파이썬 라이브러리를 활용한 머신러닝 -

지은이 : 안드레아스 뮐러, 세라 가이도

옮긴이 : 박해선

출판사 : 한빛미디어

 

코드 출처

https://github.com/rickiepark/introduction_to_ml_with_python

 

GitHub - rickiepark/introduction_to_ml_with_python: 도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의

도서 "[개정판] 파이썬 라이브러리를 활용한 머신 러닝"의 주피터 노트북과 코드입니다. Contribute to rickiepark/introduction_to_ml_with_python development by creating an account on GitHub.

github.com


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

  • 데이터 변환 과정과 머신러닝 모델을 쉽게 연결해주는 Pipeline 파이썬 클래스를 설명
모델 체인의 예, 데이터 분할 후 최솟값, 최댓값을 찾아 데이터의 스케일링을 바꾸고 SVM 훈련 코드
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("테스트 점수", svm.score(X_test_scaled, y_test))

 

6.1 데이터 전처리와 매개변수 선택

  • GridSearchCV를 사용해 더 좋은 SVC 매개변수 찾기
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("best score", grid.best_score_)
print("test score", grid.score(X_test_scaled, y_test))
print("best param", grid.best_params_)

best score 0.9812311901504789
test score 0.972027972027972
best param {'C': 1, 'gamma': 1}

 

  • 최적의 매개변수를 찾는데 GridSearchCV를 사용했지만 교묘한 함정이 있음
  • 교차 검증의 반복마다 선택된 검증 폴드는 전체 훈련 세트의 일부이며, 데이터의 스케일을 조정하기 위해 전체 훈련 세트를 이용, 하지만 이는 새로운 데이터가 나타날 때와  완전히 다름
  • 새로운 데이터가 관측되면 이 데이터는 훈련 데이터의 스케일 조정에 사용되지 않은 것이라, 그 최솟값과 최댓값이 훈련 데이터와 다를 수 있음
  • 결론적으로, 검증 폴드 데이터의 정보가 모델 구축 과정에 이미 누설되었으므로 교차 검증에서 최적의 매개변수를 찾지 못함

6.2 파이프라인 구축하기

  • 사이킷런에서 cross_val_score 함수와 GridSearchCV로 위 방식을 구현하려면 Pipeline을 사용하면 됩니다.
  • MinMaxScaler로 데이터의 스케일을 조정하고 SVM 모델을 훈련시키는 워크 플로를 Pipeline을 사용해 표현해보겠음
from sklearn.pipeline import Pipeline

# scaler 이란 이름으로 MinMaxScaler 객체 생성
# svm 이란 이름으로 SVC 객체 생성
pipe = Pipeline([("scaler", MinMaxScaler()), ("svm", SVC())])


# 첫번쨰 단계(scaler)의 fit 메서드를 호출하여 훈련 데이터를 변환
# 마지막으로 변환된 데이터에 SVM 모델 훈련
pipe.fit(X_train, y_train)

# 테스트 점수

# pipeline에서 score 메서드 호출하면 , 
# 먼저 scaler를 사용해 테스트 데이터를 변환하고, 변환된 데이터 SVM 모델의 score 메서드 호출
print("test score", pipe.score(X_test, y_test))

 

  • 파이프라인을 사용하면 “전처리 + 분류” 과정을 위해 작성해야 할 코드가 줄어듦
  • cross_val_score나 GridSearchCV에 파이프라인을 하나의 추정기 처럼 사용하는 장점이 있음