파이프라인과 복합 estimator

파이프라인과 복합 estimator (Pipelines and composite estimators)

전처리 → 차원 축소 → 분류처럼 여러 단계가 고정된 순서로 이어지는 작업은 자주 마주쳐요. 이런 단계들을 하나의 Pipeline 객체로 묶으면 fitpredict 를 한 번만 호출해 전체 흐름을 처리할 수 있어요. 복합 estimator를 구성하는 가장 흔한 도구가 바로 Pipeline이에요.

출처: scikit-learn 공식 문서 — Pipelines and composite estimators

Pipeline을 쓰면 좋은 이유

Pipeline 은 여러 estimator를 하나로 연결해요. 데이터 처리에서 드러나는 세 가지 이점이 있어요.

  • 편의성과 캡슐화: 데이터에 대해 fitpredict 를 한 번만 호출하면 전체 estimator 시퀀스를 학습할 수 있어요.
  • 공동 파라미터 선택: 파이프라인 안 모든 estimator의 파라미터를 한 번에 그리드 서치할 수 있어요.
  • 안전성: 교차 검증에서 테스트 데이터의 통계가 모델로 새는 것을 막아요. 변환기와 예측기를 학습할 때 같은 샘플을 사용하도록 보장하기 때문이에요.

Pipeline 구성 규칙

파이프라인에서 마지막 단계를 제외한 모든 단계는 변환기(transformer) 여야 해요. 마지막 단계는 변환기든 분류기든 무엇이든 될 수 있어요. 파이프라인은 마지막 estimator가 제공하는 모든 메서드를 노출해요. 마지막 단계가 transform 을 제공하면 파이프라인도 변환기처럼 동작하고, predict 를 제공하면 X를 변환한 뒤 마지막 단계의 predict 에 넘겨줘요.

Pipeline 은 종종 ColumnTransformerFeatureUnion 과 함께 쓰이는데, 이들은 여러 변환기의 출력을 합쳐 복합 피처 공간을 만들어요. 타깃을 변환해야 할 때는 TransformedTargetRegressor 가 (예: y에 로그 변환) 그 역할을 해요.

Pipeline 만들기

(key, value) 쌍의 리스트로 만들며, key 는 단계 이름, value 는 estimator 객체예요.

>>> from sklearn.pipeline import Pipeline
>>> from sklearn.svm import SVC
>>> from sklearn.decomposition import PCA
>>> estimators = [('reduce_dim', PCA()), ('clf', SVC())]
>>> pipe = Pipeline(estimators)
>>> pipe
Pipeline(steps=[('reduce_dim', PCA()), ('clf', SVC())])

파이프라인에 fit 을 호출하는 것은 각 estimator에 차례로 fit 하고 입력을 변환해 다음 단계로 넘기는 것과 같아요. Pipeline 은 마지막 estimator가 가진 모든 메서드를 가지기 때문에, 마지막이 분류기면 파이프라인도 분류기로, 변환기면 변환기로 쓰여요.

더 알아보기