# 파이프라인 미사용 시
# 학습에는 부족함이 없지만, 가독성과 유지보수성이 다소 떨어짐
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))
전처리와 모델링 연결
(이름, 객체)의 튜플 형태로 정의pipeline = Pipeline([
('scaler', StandardScaler()), # 데이터 변환
('model', LogisticRegression()) # 모델링
])교차 검증 및 하이퍼파라미터 튜닝에 적합
GridSearchCV, RandomizedSearchCV 등과 통합할 수 있음데이터 누수 방지
fit_transform()을 사용하고, 테스트 데이터에는 transform()만 적용하는 구조를 자동으로 처리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)),
])
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}")
*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.