AI 활용 소프트웨어 개발/AI, 머신러닝, 딥러닝

머신러닝 / Pipeline / ColumnTransformer / GridSearchCV

ha2yong 2025. 11. 18. 19:12

머신러닝 파이프라인(Pipeline), 컬럼 변환기(ColumnTransformer), GridSearchCV 완전 정리

본 문서는 머신러닝 실무에서 가장 많이 사용되는
Pipeline, ColumnTransformer, GridSearchCV
정의부터 사용법, 주요 메소드, 실전 예시, 그리고 데이터 전처리 및 모델 학습 팁까지
하나의 문서로 정리한 자료입니다.

이 글만 읽으면 머신러닝 워크플로우 전체를 이해하고 바로 적용할 수 있습니다.

────────────────────────────────────────────

1. Pipeline

1-1. Pipeline이란?

여러 단계의 데이터 전처리와 모델 학습 과정을
하나의 흐름(Workflow)으로 묶어주는 Scikit-Learn 기능.

기존 방식(수동으로 전처리 → 모델 학습)은
GridSearchCV, Cross Validation에 문제를 일으킬 수 있지만
Pipeline은 모든 단계를 일관된 구조로 관리해준다.

1-2. 언제 사용하는가?

  • 전처리 + 모델 학습을 하나의 작업으로 묶고 싶을 때
  • GridSearchCV가 전처리까지 포함하여 교차검증을 수행하도록 만들고 싶을 때
  • train/test 간 데이터 누수를 방지하고 싶을 때
  • 모델 구성과 파라미터 튜닝을 체계적으로 하고 싶을 때

1-3. 주요 메소드

 

메소드 설명
fit(X, y) 전체 파이프라인 학습
predict(X) 예측값 반환
predict_proba(X) 확률 기반 예측
named_steps 파이프라인 내부 단계 접근
set_params(**kwargs) 파라미터 변경

1-4. 기본 사용 예시

 

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

numeric_features = ['lead_time', 'adr']
categorical_features = ['hotel', 'deposit_type']

preprocessor = ColumnTransformer([
    ('num', StandardScaler(), numeric_features),
    ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
])
 

────────────────────────────────────────────

2. ColumnTransformer

2-1. ColumnTransformer란?

컬럼별로 다른 전처리 방법을 적용할 수 있도록 해주는 도구.

예:

  • 숫자 컬럼 → 표준화(StandardScaler)
  • 범주형 컬럼 → OneHotEncoder
  • 특정 컬럼만 log 변환

2-2. 주요 기능

  • 컬럼별로 서로 다른 Pipeline 적용 가능
  • 수치/카테고리/날짜/특수 컬럼을 자동 분리하여 처리
  • 전처리 후 전체 특징 벡터를 하나로 결합

2-3. 주요 메소드


메소드 설명
fit_transform(X) 컬럼별 전처리 + 변환
transform(X) 학습된 전처리로 변환
get_feature_names_out() OneHot 후 생성된 전체 feature 이름 반환
named_transformers_ 내부에 어떤 변환기가 있는지 조회

2-4. 기본 사용 예시

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder

numeric_features = ['lead_time', 'adr']
categorical_features = ['hotel', 'deposit_type']

preprocessor = ColumnTransformer([
    ('num', StandardScaler(), numeric_features),
    ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
])
 
 

────────────────────────────────────────────

3. GridSearchCV

3-1. GridSearchCV란?

모델의 하이퍼파라미터를 자동으로 탐색하는 기능.

  • 여러 파라미터 조합을 시도
  • Cross Validation 기반 평가
  • 가장 성능 좋은 파라미터를 best_params_로 반환
  • 해당 파라미터가 적용된 전체 Pipeline을 best_estimator_로 반환

3-2. 주요 속성


속성 설명
best_params_ 최고 성능의 파라미터 조합
best_estimator_ 최고 성능의 Pipeline 전체 모델
best_score_ 최고 CV 성능
cv_results_ 모든 조합별 성능 상세결과

3-3. param_grid 키 이름 규칙

형식:

'스텝이름__파라미터이름'

예:

'model__n_estimators'
'preprocess__num__scaler__with_mean'

3-4. 기본 사용 예시

 
from sklearn.model_selection import GridSearchCV

param_grid = {
    'model__n_estimators': [100, 200],
    'model__max_depth': [5, None],
    'model__min_samples_split': [2, 5]
}

grid = GridSearchCV(pipeline, param_grid, cv=5, scoring='roc_auc')
grid.fit(X_train, y_train)

best_model = grid.best_estimator_

────────────────────────────────────────────

4. Pipeline + ColumnTransformer + GridSearchCV 종합 예시

아래 예시는
숫자/범주형 컬럼 전처리 → 랜덤포레스트 분류 → 하이퍼파라미터 탐색
전체 ML Workflow를 하나의 구조로 구현한 실전 예시입니다.

 
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import roc_auc_score, accuracy_score, f1_score

# 1. 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)

# 2. 컬럼 정의
numeric_features = X_train.select_dtypes(include=['int64', 'float64']).columns
categorical_features = X_train.select_dtypes(include=['object', 'bool']).columns

# 3. 컬럼 변환기 정의
preprocessor = ColumnTransformer([
    ('num', StandardScaler(), numeric_features),
    ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
])

# 4. 전체 파이프라인 구성
pipeline = Pipeline([
    ('preprocess', preprocessor),
    ('model', RandomForestClassifier())
])

# 5. 하이퍼파라미터 탐색
param_grid = {
    'model__n_estimators': [100, 200],
    'model__max_depth': [5, None],
    'model__min_samples_split': [2, 5]
}

grid = GridSearchCV(
    pipeline, param_grid, cv=5, scoring='roc_auc', n_jobs=-1)

grid.fit(X_train, y_train)
best_model = grid.best_estimator_

# 6. 테스트 성능 평가
y_pred = best_model.predict(X_test)
y_proba = best_model.predict_proba(X_test)[:, 1]

print("Test ROC-AUC:", roc_auc_score(y_test, y_proba))
print("Test Accuracy:", accuracy_score(y_test, y_pred))
print("Test F1:", f1_score(y_test, y_pred))

────────────────────────────────────────────

5. 머신러닝 전처리 및 모델 학습 팁

5-1. 데이터 전처리 팁

  • 숫자형 컬럼은 StandardScaler 또는 MinMaxScaler 적용
  • 범주형은 OneHotEncoding
  • Boolean은 categorical로 처리하는 것이 일반적
  • 로그 변환은 음수/0 존재 여부 반드시 확인
  • 결측값은 반드시 train/test split 이전에 split하고, Pipeline 안에서 처리

5-2. 모델 학습 팁

  • RandomForest / XGBoost는 scale에 크게 민감하지 않지만
    LinearRegression / SVM / KNN은 반드시 표준화 필요
  • 분류 문제 평가 지표는 Accuracy만 보면 위험
    ROC-AUC, F1을 반드시 함께 확인
  • 데이터 누수(Leakage) 방지
    Target과 관련된 뒤늦게 알 수 있는 컬럼은 반드시 제거해야 함

5-3. GridSearchCV 팁

  • param_grid는 Pipeline 스텝 이름 기반으로 작성
  • scoring='roc_auc'는 이진 분류에서 가장 안정적인 지표
  • n_jobs=-1로 CPU 전체 사용
  • cv=5~10이 안정적

5-4. 모델 해석 팁

  • RandomForest/XGBoost는 feature_importances_로 중요도 확인
  • ColumnTransformer.get_feature_names_out()으로 실제 feature 목록 생성
  • SHAP 값을 통해 개별 데이터의 예측 근거 분석
  • ConfusionMatrix로 FP/FN 패턴 확인

────────────────────────────────────────────

6. 마무리

Pipeline, ColumnTransformer, GridSearchCV는
전처리부터 모델 학습, 하이퍼파라미터 튜닝까지
전체 머신러닝 과정을 일관된 구조로 자동화할 수 있는 핵심 기술입니다.

이 세 가지를 자유자재로 활용하면
데이터 분석 프로젝트의 수준이 한 단계 올라가며,
데이터 누수 방지, 안정적 모델 평가, 자동 최적화 구성이 가능해집니다.