Scikit-learn 파이프라인 고급 기법 (Medium)

Source: https://medium.com/@sahin.samia/scikit-learn-pipelines-explained-streamline-and-optimize-your-machine-learning-processes-f17b1beb86a4 Type: Article By: Sahin Ahmed Published: 2024-04-07 Valid as of: 2026-04-26

핵심 Takeaway

  • Scikit-learn 파이프라인은 전처리와 모델링을 번들로 묶어 코드 반복 최소화 및 재현성 보장
  • Transformer (fit/transform 메서드) vs Estimator (fit/predict 메서드) 역할 분명화
  • ColumnTransformer: 수치형/범주형 데이터에 서로 다른 전처리 분기 병렬 적용
  • Feature Union: 여러 변환자를 병렬 실행하여 출력 결합 (PCA + 특성선택 동시 적용)
  • GridSearchCV: 파이프라인의 모든 단계 하이퍼파라미터를 체계적으로 최적화
  • 커스텀 변환자: BaseEstimator + TransformerMixin 상속, fit/transform 구현으로 기존 파이프라인에 통합 가능
  • 캐싱(caching): fit된 변환자 재사용으로 교차검증 중 중복 계산 방지; n_jobs=-1 병렬화로 CPU 다중 코어 활용

상세 요약

파이프라인의 코어: Transformer vs Estimator

Transformer (변환자):

  • 목적: 데이터를 새로운 표현으로 변환
  • 메서드: fit(X, y) (훈련 데이터로부터 변환 규칙 학습) + transform(X) (규칙 적용)
  • 예: 스케일러(StandardScaler), 인코더(OneHotEncoder), 결측치 대체(SimpleImputer)
  • 특징: fit된 상태를 객체에 저장 → 다른 데이터에 동일 변환 반복 가능

Estimator (추정자/모델):

  • 목적: 예측 모델 학습 및 예측
  • 메서드: fit(X, y) (훈련) + predict(X) (예측)
  • 예: 로지스틱 회귀(LogisticRegression), 그래디언트 부스팅(GradientBoostingClassifier)
  • 특징: 파이프라인 마지막에 위치하며 최종 출력 생성

ColumnTransformer: 혼합 데이터 타입 처리

데이터셋에 수치형 + 범주형 컬럼이 함께 있을 때, 각각 다른 전처리가 필요하다.

구현 패턴:

ColumnTransformer([
    ('numeric', Pipeline([
        ('imputer', SimpleImputer(strategy='mean')),
        ('scaler', StandardScaler())
    ]), numeric_cols),
    ('categorical', Pipeline([
        ('imputer', SimpleImputer(strategy='most_frequent')),
        ('encoder', OneHotEncoder())
    ]), categorical_cols)
])

동작 원리:

  1. 수치형 파이프라인: 결측치(평균) 대체 → 정규화(0-1 또는 표준화)
  2. 범주형 파이프라인: 결측치(최빈값) 대체 → 원-핫 인코딩
  3. 좌우 연결(concatenate): 두 결과를 가로로 붙여 최종 데이터셋 생성
  4. 분류 모델에 입력: 정제된 특성 데이터로 훈련

Feature Union: 병렬 변환자 조합

단일 입력 데이터에 여러 변환자를 독립적으로 적용한 후 결과를 합치는 기법.

사용 사례:

  • PCA (주성분분석)로 차원 축소 (20개 특성 → 5개 주성분)
  • SelectKBest로 상위 K개 특성 선택
  • 두 결과를 결합하여 모델에 입력

코드 구조:

FeatureUnion([
    ('pca', PCA(n_components=5)),
    ('kbest', SelectKBest(k=5))
]) → 최종 10개 특성 생성

GridSearchCV: 하이퍼파라미터 최적화

파이프라인의 모든 단계(전처리 + 모델)의 하이퍼파라미터를 동시에 최적화.

매개변수 명명 규칙:

param_grid = {
    'preprocessor__numeric__scaler__with_mean': [True, False],
    'classifier__C': [0.1, 1, 10],
    'classifier__penalty': ['l1', 'l2']
}
  • preprocessor__numeric__scaler__with_mean: 전처리 단계의 스케일러 옵션
  • classifier__C: 로지스틱 회귀의 정규화 강도

동작:

  1. 모든 파라미터 조합 생성
  2. 교차검증 반복
  3. 최고 성능 조합 반환

커스텀 변환자: 파이프라인 확장

사용자 정의 변환 로직이 필요할 때, 기존 파이프라인에 통합 가능한 커스텀 변환자를 작성할 수 있다.

필수 상속 클래스:

  • BaseEstimator: 자동 파라미터 저장 (생성자 인자)
  • TransformerMixin: fit/transform 메서드 구현 확인

구현 예시:

from sklearn.base import BaseEstimator, TransformerMixin
 
class MyTransformer(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None):
        # 규칙 학습 (예: 컬럼별 평균)
        self.mean_ = X.mean()
        return self
    
    def transform(self, X):
        # 규칙 적용 (예: 평균 뺄셈)
        return X - self.mean_

파이프라인 통합:

pipeline = Pipeline([
    ('custom', MyTransformer()),
    ('classifier', LogisticRegression())
])

성능 최적화: 캐싱 & 병렬화

캐싱 (Caching): 문제: 교차검증(K-Fold) 중 같은 변환자가 여러 번 fit되면서 중복 계산 발생.

해결: 파이프라인의 memory 파라미터로 fit된 변환자 캐시.

Pipeline([...], memory='/tmp/sklearn_memory')

효과: fit 계산 1회만 수행, 이후 폴드에서 캐시된 결과 재사용.

병렬화 (Parallelization): GridSearchCV의 n_jobs 파라미터:

  • n_jobs=-1: 모든 CPU 코어 활용
  • n_jobs=4: 4개 코어 사용 효과: 그래프 탐색 속도 대폭 향상 (특히 대규모 데이터셋에서).

선행 개념

이 개념을 배우기 전에 필수로 알아야 할 것:

  1. Module 5-1 → ml-pipelines-sas-beginner-guide: Pipeline의 기초 개념
    • 왜?: 이 소스는 기초 Pipeline을 가정하고, ColumnTransformer, GridSearchCV, 커스텀 변환자 등 고급 기법을 다룸
  2. Module 2: 스케일링, 인코딩 등 전처리 기초

후속 개념 (이 개념이 선행)

이 개념을 배운 후 다음 단계:

  1. Module 5-3 → data-leakage-prevention-ml: Pipeline을 통한 데이터 누수 방지 심화
    • 예: “GridSearchCV에서 교차검증 시 각 폴드마다 파이프라인이 독립적으로 fit되어 누수 방지”
  2. Module 6-2 → docker-compose-multi-service-orchestration: 훈련된 파이프라인을 Docker로 배포

연결되는 위키 페이지