🗺️ [복습 3단계] 06장. 파이프라인 (Pipeline)
지금까지 우리는 '데이터 쪼개기 ➡️ 스케일링(전처리) ➡️ 모델 학습'을 따로따로 코딩했습니다.
실무에서는 이 과정을 하나로 묶어버리는데, 이것이 바로 파이프라인입니다.
"전처리와 모델 학습을 따로 하면 코드가 너무 길어지고, 나중에 모의고사(교차검증)를 여러 번 볼 때마다 실수로 데이터가 유출(Data Leakage)될 위험이 커.
그래서 공장의 **'컨베이어 벨트(파이프라인)'**를 만드는 거야.
데이터만 띡 던져주면, 컨베이어 벨트를 타고 넘어가면서 알아서 스케일링(세척)도 되고,
이어서 AI 모델(조립)까지 한 번에 쭉 통과하게 묶어버리는 거지!"
💻 핵심 코드 해설
파이프라인을 쓰면 아까 우리가 힘들게 짰던 전처리와 학습 코드가 마법처럼 짧아집니다.
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC # 서포트 벡터 머신 분류기
# 1. 컨베이어 벨트 조립 (스케일러 ➡️ 모델 순서로 묶기)
pipeline = make_pipeline(StandardScaler(), SVC())
# 2. 공부시키기 (이 한 줄로 스케일러의 fit_transform과 모델의 fit이 연속으로 실행됨!)
pipeline.fit(X_train, y_train)
# 3. 시험 보기 (이 한 줄로 Test 데이터의 transform과 모델의 predict가 연속으로 실행됨!)
pred = pipeline.predict(X_test)
📝 TODO 실습 문제: 파이프라인 컨베이어 벨트 완성하기
파이프라인의 엄청난 편리함을 직접 코드로 완성해 보세요. 아래 코드의 빈칸(___)을 채워주시면 됩니다.
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC # 서포트 벡터 머신 분류기
# (데이터는 X_train, X_test, y_train, y_test가 이미 준비되어 있다고 가정합니다)
# 1. 파이프라인 구축: StandardScaler 다음으로 '결정 트리(DecisionTreeClassifier)' 모델을 붙여주세요.
my_pipe = make_pipeline(StandardScaler(), ________())
# 2. 파이프라인 학습: 만들어진 컨베이어 벨트에 훈련용 문제와 정답을 넣고 학습시킵니다.
my_pipe.________(X_train, y_train)
# 3. 파이프라인 예측: 시험용 문제 데이터를 컨베이어 벨트에 넣어 정답을 예측합니다.
pred = my_pipe.________(X_test)
# 4. 채점
print("정확도:", accuracy_score(y_test, pred))
정답
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC # 서포트 벡터 머신 분류기
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size= 0.3,
random_state= 0,
stratify= cancer.target
)
# 1. 파이프라인 구축: StandardScaler 다음으로 '결정 트리(DecisionTreeClassifier)' 모델을 붙여준다.
my_pipe = make_pipeline(StandardScaler(), SVC())
# 2. 파이프라인 학습: 만들어진 컨베이어 벨트에 훈련용 문제와 정답을 넣고 학습을 시킨다.
my_pipe.fit(X_train, y_train)
# 3. 파이프라인 예측: 시험용 문제 데이터를 컨베이어 벨트에 넣어 정답을 예측합니다.
pred = my_pipe.predict(X_test)
# 4. 채점
print("정확도: ", accuracy_score(y_test, pred))
결과값
정확도: 0.9532163742690059
1. cancer.target의 정체
우선 cancer라는 변수에는 사이킷런(scikit-learn)에서 제공하는 '유방암(breast cancer) 데이터셋'이 통째로 들어있습니다. 이 데이터셋은 딕셔너리와 비슷한 구조로 되어 있는데, 주요 구성 요소는 다음과 같습니다.
- cancer.data: 환자들의 종양 크기, 질감 등 30가지 특성이 담긴 '문제지(X)' 데이터입니다.
- cancer.target: 각 환자의 종양이 악성(0)인지 양성(1)인지 기록된 '정답지(y)' 데이터입니다.
즉, cancer.target은 이 데이터셋의 정답(y)을 의미합니다.
2. stratify=cancer.target의 의미
train_test_split 함수에서 stratify 옵션은 "데이터를 쪼갤 때 특정 데이터의 비율을 원본과 똑같이 유지해라!"라는 명령입니다.
여기에 cancer.target을 넣었으니, 컴퓨터에게 내리는 지시사항은 다음과 같습니다.
"컴퓨터야, 데이터를 훈련용(70%)과 테스트용(30%)으로 나눌 건데, 나눌 때 원본 데이터(cancer.target)에 있는 '악성(0)'과 '양성(1)' 환자의 비율이 한쪽으로 쏠리지 않고 똑같이 유지되도록 신경 써서 나눠줘!"
3. 왜 이 옵션이 필요할까요? (비율 붕괴 방지)
만약 이 옵션을 빼고(stratify=None 또는 생략) 그냥 랜덤으로 나눈다면 어떤 일이 발생할 수 있을까요?
- 원본 데이터 569명 중 악성 환자가 212명(약 37%), 양성 환자가 357명(약 63%)이라고 가정해 보겠습니다.
- 랜덤으로 30%(테스트 데이터)를 뽑았는데, 하필 운이 나빠서 테스트 데이터에 양성 환자만 100% 뽑히고 악성 환자는 한 명도 안 뽑힐 수도 있습니다.
- 그러면 우리가 만든 AI 모델은 실전(테스트)에서 악성 종양을 진단하는 시험을 아예 치르지 못하게 됩니다. 즉, 모델의 성능을 제대로 평가할 수 없게 되죠.
이러한 '비율 붕괴 대참사'를 막기 위해, 정답지(cancer.target)의 원래 비율(37 : 63)을 훈련 데이터와 테스트 데이터 양쪽에 똑같이 보장해 달라는 안전장치가 바로 stratify입니다.
이해가 좀 되셨나요? 요약하자면 "stratify=cancer.target은 데이터를 나눌 때 암 환자(악성/양성)의 비율이 한쪽으로 치우치지 않게 골고루 섞어달라는 필수 주문"이라고 생각하시면 됩니다!
'두두 IT > 머신런닝(ML)' 카테고리의 다른 글
| TODO와 함께하는 복습 - 5 (KNN & SVM) (0) | 2026.05.25 |
|---|---|
| TODO와 함께하는 복습 - 4 (파이프라인+그리드 서치) (0) | 2026.05.25 |
| TODO와 함께하는 복습 - 2 (데이터 전처리) (0) | 2026.05.25 |
| TODO와 함께하는 복습 - 1 (머신러닝 분석, 데이터셋 나누기) (0) | 2026.05.25 |
| [ML-12] 선형모델_선형회귀 (0) | 2026.05.20 |