본문 바로가기
두두 IT/머신런닝(ML)

TODO와 함께하는 복습 - 3 (파이프라인)

by DoDo's 2026. 5. 25.
반응형

🗺️ [복습 3단계] 06장. 파이프라인 (Pipeline)

지금까지 우리는 '데이터 쪼개기 ➡️ 스케일링(전처리) ➡️ 모델 학습'을 따로따로 코딩했습니다.

실무에서는 이 과정을 하나로 묶어버리는데, 이것이 바로 파이프라인입니다.

"전처리와 모델 학습을 따로 하면 코드가 너무 길어지고, 나중에 모의고사(교차검증)를 여러 번 볼 때마다 실수로 데이터가 유출(Data Leakage)될 위험이 커.
그래서 공장의 **'컨베이어 벨트(파이프라인)'**를 만드는 거야.
데이터만 띡 던져주면, 컨베이어 벨트를 타고 넘어가면서 알아서 스케일링(세척)도 되고,
이어서 AI 모델(조립)까지 한 번에 쭉 통과하게 묶어버리는 거지!"

💻 핵심 코드 해설

파이프라인을 쓰면 아까 우리가 힘들게 짰던 전처리와 학습 코드가 마법처럼 짧아집니다.

Python
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 실습 문제: 파이프라인 컨베이어 벨트 완성하기

파이프라인의 엄청난 편리함을 직접 코드로 완성해 보세요. 아래 코드의 빈칸(___)을 채워주시면 됩니다.

Python
 
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은 데이터를 나눌 때 암 환자(악성/양성)의 비율이 한쪽으로 치우치지 않게 골고루 섞어달라는 필수 주문"이라고 생각하시면 됩니다!

반응형