본문 바로가기

끄적끄적

Pipeline.. 너 뭐세요?

🛠️ 머신러닝 Pipeline이란? 데이터 누수를 막는 가장 안전한 방법

1. Pipeline이란?

머신러닝 모델을 학습할 때는 단순히 모델만 학습하는 것이 아니라, 여러 전처리 과정을 함께 수행해야 한다. 예를 들어 이번 반도체 불량 예측 프로젝트에서는 다음과 같은 흐름을 사용하였다.

Train/Test Split ↓ MinMaxScaler (-1 ~ 1) ↓ SimpleImputer ↓ SMOTE ↓ CatBoost ↓ Prediction

 

이처럼 전처리부터 모델 학습까지의 과정을 하나로 묶어 관리하는 기능이 바로 Pipeline이다.

즉, Pipeline은 여러 단계를 각각 따로 실행하는 것이 아니라, 하나의 모델처럼 사용할 수 있게 만들어준다.

2. Pipeline 없이 학습하면 생기는 문제

Pipeline을 사용하지 않으면 전처리를 직접 순서대로 수행해야 한다.

scaler.fit(X_train) X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) imputer.fit(X_train_scaled) X_train_imputed = imputer.transform(X_train_scaled) X_test_imputed = imputer.transform(X_test_scaled) X_train_resampled, y_train_resampled = smote.fit_resample(X_train_imputed, y_train) model.fit(X_train_resampled, y_train_resampled)

 

이 방식도 불가능한 것은 아니지만, 전처리 단계가 많아질수록 코드가 길어지고 실수 가능성이 커진다. 특히 Train 데이터와 Test 데이터를 잘못 섞어 사용하는 데이터 누수(Data Leakage)가 발생할 수 있다.

핵심 문제
전체 데이터에 먼저 스케일링, 결측치 대체, SMOTE 등을 적용한 뒤 Train/Test를 나누면 Test 데이터의 정보가 학습 과정에 섞인다. 이 경우 모델 성능이 실제보다 과대평가될 수 있다.

3. Pipeline 사용 방법

Pipeline을 사용하면 전처리와 모델을 하나의 객체로 묶을 수 있다.

from imblearn.pipeline import Pipeline 
from sklearn.preprocessing import MinMaxScaler 
from sklearn.impute import SimpleImputer 
from imblearn.over_sampling import SMOTE 
from catboost import CatBoostClassifier 

pipe = Pipeline(steps=[ ("scaler", MinMaxScaler(feature_range=(-1, 1))), 
("imputer", SimpleImputer(strategy="mean")), 
("smote", SMOTE(random_state=42)), ("model", 
CatBoostClassifier(random_state=42, verbose=0)) ])

 

pipe.fit(X_train, y_train)

 

Pipeline을 사용하면 fit() 한 번으로 스케일링, 결측치 대체, SMOTE, 모델 학습이 순서대로 수행된다. 

y_pred = pipe.predict(X_test)

 

예측도 마찬가지로 pipe를 사용하여 한 줄로 작성할 수 있다.

4. Pipeline 내부 동작 방식

Pipeline에서 fit()을 실행하면 내부적으로 다음 과정이 순서대로 진행된다.

X_train ↓ MinMaxScaler.fit_transform() ↓ SimpleImputer.fit_transform() ↓ SMOTE.fit_resample() ↓ CatBoost.fit()

 

반면 predict()를 실행할 때는 학습이 아니라 변환만 수행된다.

X_test ↓ MinMaxScaler.transform() ↓ SimpleImputer.transform() ↓ CatBoost.predict()

 

중요한 점은 Test 데이터에는 fit()이 수행되지 않는다는 것이다. 즉, Test 데이터의 평균, 최솟값, 최댓값 등의 정보가 학습 과정에 들어가지 않는다.

5. Pipeline의 핵심 장점: 데이터 누수 방지

Pipeline의 가장 중요한 장점은 데이터 누수(Data Leakage)를 방지할 수 있다는 점이다.

예를 들어 4-Fold Cross Validation을 수행한다고 가정해보자.

Train Data 80% ↓ Fold 1 - 학습 데이터 75% - 검증 데이터 25% Fold 2 - 학습 데이터 75% - 검증 데이터 25% Fold 3 - 학습 데이터 75% - 검증 데이터 25% Fold 4 - 학습 데이터 75% - 검증 데이터 25%

 

Pipeline을 사용하지 않으면 실수로 전체 Train 데이터에 먼저 전처리를 적용한 뒤 Fold를 나눌 수 있다. 이 경우 검증 데이터의 정보가 전처리 과정에 포함되어 모델 성능이 실제보다 좋게 나올 수 있다. 하지만 Pipeline을 사용하면 각 Fold마다 다음 과정이 자동으로 지켜진다.

Fold 내부 학습 데이터 
↓ 
fit() 
↓ 
Fold 내부 검증 데이터 
↓ 
transform()

 

즉, 각 Fold의 검증 데이터는 학습에 사용되지 않고 변환만 적용된다. 따라서 Cross Validation 과정에서도 데이터 누수를 방지할 수 있다.

6. 이번 반도체 불량 예측 프로젝트 적용 예시

이번 프로젝트에서는 반도체 제조 공정에서 수집된 센서 데이터를 이용하여 최종 불량 여부를 예측하였다. 데이터는 5개 공정 단계와 40개 센서 피처로 구성되어 있으며, Label은 정상 0, 불량 1로 구성된 이진 분류 문제이다.

최종 모델링 Flow는 다음과 같이 구성하였다.

Train/Test = 8:2 
↓ 
MinMaxScaler (-1 ~ 1) 
↓ 
SimpleImputer (Mean) 
↓ 
SMOTE 
↓ 
4-Fold Cross Validation 
↓ 
CatBoost 
↓ 
모델 평가 - Recall - F1-score - ROC-AUC 
↓ 
Best Model 선정

이 과정에서 Pipeline을 사용한 이유는 다음과 같다.

항목 설명
MinMaxScaler 센서 변수들의 범위를 -1~1로 맞춰 모델 입력값의 스케일 차이를 줄임
SimpleImputer 결측치를 각 컬럼의 평균값으로 대체
SMOTE 불량 데이터가 적은 불균형 문제를 완화하기 위해 소수 클래스 샘플을 합성
CatBoost 비선형 관계와 변수 간 상호작용을 학습할 수 있는 부스팅 기반 분류 모델

특히 SMOTE는 반드시 학습 데이터에만 적용되어야 한다. Test 데이터까지 SMOTE를 적용하면 실제 평가 환경과 달라지고, 모델 성능이 과대평가될 수 있다. Pipeline을 사용하면 Cross Validation 내부에서도 SMOTE가 학습 Fold에만 적용되므로 안전하다.

실무적 관점
제조 품질 예측에서는 모델 성능 자체도 중요하지만, 평가 과정이 신뢰 가능해야 한다. Pipeline은 전처리와 학습 과정을 일관되게 유지하여 모델 성능 평가의 신뢰도를 높이는 역할을 한다.

7. 이번 글 요약

이번 글 요약

  • Pipeline은 스케일링, 결측치 대체, SMOTE, 모델 학습을 하나의 흐름으로 묶어주는 기능이다.
  • Pipeline을 사용하면 Cross Validation 과정에서 Train 데이터에만 fit이 적용되어 데이터 누수를 방지할 수 있다.
  • 이번 반도체 불량 예측 프로젝트에서는 MinMaxScaler, SimpleImputer, SMOTE, CatBoost를 Pipeline으로 구성하여 안정적인 모델 학습 및 평가를 수행하였다.