머신러닝 - Pipeline

dumbbelldore·2024년 12월 30일
0

zero-base 33기

목록 보기
52/97

1. 개념

  • Scikit-learn의 파이프라인은 데이터 전처리 단계와 모델 학습 단계를 연결하여 하나의 워크플로우로 실행할 수 있게 함
  • 코드가 간결해지고 유지보수 용이성이 증가하며, 의도치 않은 데이터 누수(Data Leakage)를 방지할 수 있음
# 파이프라인 미사용 시
# 학습에는 부족함이 없지만, 가독성과 유지보수성이 다소 떨어짐

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model = LogisticRegression()
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)

print("Accuracy:", accuracy_score(y_test, y_pred))
# 파이프라인 사용 시
# 코드가 훨씬 간결하며, 누구나 직관적으로 코드 짜임새를 알아볼 수 있음

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('model', LogisticRegression())
])
pipeline.fit(X_train, y_train)

y_pred = pipeline.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))

2. 주요 특징

  • 전처리와 모델링 연결

    • 데이터 변환(스케일링, 인코딩 등)과 모델링, 학습 단계를 유기적으로 연결
    • 파이프라인 구성 시 (이름, 객체)의 튜플 형태로 정의
      pipeline = Pipeline([
         ('scaler', StandardScaler()),  # 데이터 변환
         ('model', LogisticRegression())  # 모델링
      ])
  • 교차 검증 및 하이퍼파라미터 튜닝에 적합

    • GridSearchCV, RandomizedSearchCV 등과 통합할 수 있음
  • 데이터 누수 방지

    • 학습 데이터에 대해 fit_transform()을 사용하고, 테스트 데이터에는 transform()만 적용하는 구조를 자동으로 처리

3. 사용 방법

  • 데이터 불러오기 (데이터 임의 정의, train_test_split 생략)
import pandas as pd

X = pd.DataFrame({
    "food": ["pizza", "burger", "pizza", "salad", "salad", "pizza", "burger", "pizza", "salad", "salad"],
    "grade": [9, 3, 2, 3, 2, 2, 1, 8, 7, 7]
})
y = pd.Series([1, 0, 1, 1, 0, 1, 0, 1, 0, 0], name="target")
  • 전처리 필요 컬럼 식별하여 컬럼명 추출하기
CAT_COLS = X.select_dtypes("object").columns # food
NUM_COLS = X.select_dtypes("number").columns # grade
  • 전처리 파트 정의하기
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler

preprocessor = ColumnTransformer([
    ("num", MinMaxScaler(), NUM_COLS), # 수치형 컬럼: MinMaxScaler() 적용
    ("cat", OneHotEncoder(), CAT_COLS), # 문자형 컬럼: OneHotEncoder() 적용
])
  • 파이프라인 정의하기
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC

pipeline = Pipeline([
    ("preprocessor", preprocessor),
    ("model", SVC(random_state=42)),
])
  • 하이퍼파라미터 튜닝 (필요 시 사용, GridSearchCV 예시)
param_grid = {
    'model__C': [0.1, 1, 10], # 파이프라인에서 정의한 모델의 '별칭명__파라미터명' 형식 사용
    'model__kernel': ['linear', 'rbf'],
    'model__gamma': ['scale', 'auto']
}

gs = GridSearchCV(pipeline, param_grid=param_grid, scoring='accuracy', cv=3)
gs.fit(X, y)

print(f"Best Params: {gs.best_params_}")
print(f"Best Score: {gs.best_score_:.2f}")

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글