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)
])
동작 원리:
- 수치형 파이프라인: 결측치(평균) 대체 → 정규화(0-1 또는 표준화)
- 범주형 파이프라인: 결측치(최빈값) 대체 → 원-핫 인코딩
- 좌우 연결(concatenate): 두 결과를 가로로 붙여 최종 데이터셋 생성
- 분류 모델에 입력: 정제된 특성 데이터로 훈련
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: 로지스틱 회귀의 정규화 강도
동작:
- 모든 파라미터 조합 생성
- 교차검증 반복
- 최고 성능 조합 반환
커스텀 변환자: 파이프라인 확장
사용자 정의 변환 로직이 필요할 때, 기존 파이프라인에 통합 가능한 커스텀 변환자를 작성할 수 있다.
필수 상속 클래스:
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개 코어 사용 효과: 그래프 탐색 속도 대폭 향상 (특히 대규모 데이터셋에서).
선행 개념
이 개념을 배우기 전에 필수로 알아야 할 것:
- Module 5-1 → ml-pipelines-sas-beginner-guide: Pipeline의 기초 개념
- 왜?: 이 소스는 기초 Pipeline을 가정하고, ColumnTransformer, GridSearchCV, 커스텀 변환자 등 고급 기법을 다룸
- Module 2: 스케일링, 인코딩 등 전처리 기초
후속 개념 (이 개념이 선행)
이 개념을 배운 후 다음 단계:
- Module 5-3 → data-leakage-prevention-ml: Pipeline을 통한 데이터 누수 방지 심화
- 예: “GridSearchCV에서 교차검증 시 각 폴드마다 파이프라인이 독립적으로 fit되어 누수 방지”
- Module 6-2 → docker-compose-multi-service-orchestration: 훈련된 파이프라인을 Docker로 배포
연결되는 위키 페이지
- ml-pipeline — ML 파이프라인 개념 및 설계 원칙
- hyperparameter-tuning — 하이퍼파라미터 최적화 기법
- scikit-learn — Scikit-learn 라이브러리 및 주요 클래스
- pandas-dataframe — 판다스 데이터 조작