오늘은 케글 대회를 나가면서 익숙해지게 된 pipeline의 사용법을 알아보려 한다.
Pipeline이란?
pipeline은 피처 처리, 인코딩, 스케일링의 변환과 ML 알고리즘 학습, 예측 등을 함께 묶어서 실행할 수 있는 유틸리티이다.
사이킷런 공식문서에서도 강력하게 사용하라고 권장하는 사항이니 만큼 잘 알아두기로 하자.
일반적으로 xgboost를 예를 들어서 코드가 만들어 지는 것을 보자.
머신러닝이 돌아가기 위해서는 모든 피처 데이터의 형태가 수치형 자료이여야 한다. 그렇기에 인코딩을 진행해줘야 하고 단위(크기)를
맞춰줘야 하기 때문에 standardscaler을 사용해줘야 한다.
Pipeline을 사용하지 않은 코드(스케일링, 인코딩)
import numpy as np
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
from sklearn.preprocessing import StandardScaler
cat_cols_tr = list(train_data.select_dtypes(exclude = np.number).columns)
num_cols_tr = list(train_data.select_dtypes(include = np.number).columns)
cat_cols_ts = list(test_data.select_dtypes(exclude = np.number).columns)
num_cols_ts = list(test_data.select_dtypes(include = np.number).columns)
for i in cat_cols_tr:
encoder = LabelEncoder()
encoder.fit(train_data[i])
train_data[i]=encoder.transform(train_data[i])
for i in cat_cols_ts:
encoder = LabelEncoder()
encoder.fit(test_data[i])
test_data[i]=encoder.transform(test_data[i])
test_data
scaler = StandardScaler()
train_data[num_cols_tr]=scaler.fit_transform(train_data[num_cols_tr])
test_data[num_cols_ts]=scaler.fit_transform(test_data[num_cols_ts])
이런 식으로 인코딩과 스케일링을 진행해야 한다.
하지만 pipeline을 사용한다면
Pipeline을 사용한 코드
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.matrics import accuracy_score
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from xgboost import XGBClassifier
from scipy.stats import loguniform
params = {
'max_depth': 정수값,
'min_child_weight': 정수값,
'colsample_bytree': 실수값,
'gamma': 실수값,
'learning_rate': 실수값,
'n_estimators': 정수값
}
column_transformer = ColumnTransfomer(
transformers=[('sclaer', StandardScaler(), num_cols_tr),
('encoder', OneHotEncoder(handle_unknown='ignore'), cat_cols_tr)
], remainder='passthrough')
xgb_clf = XGBClassfier(**params,objective='multi:softmax', num_class=7)
pipeline= Pipeline(
steps=[('preprocessing', column_transfomer),
('clf', xgb_clf)
])
pipeline.fit(X_train, y_train)
ColumnTransfomer( )라는 모듈로 스케일링과 인코딩을 한번에 설정해서 column_transfomer에 지정해주고 pipeline안에 코드에
넣어주기만 하면 인코딩과 스케일링이 끝나게 된다. 매우 간단하게 코드가 정리 되는 것을 볼 수 있다.
여기서 꿀팁!! 꼭 알고 있어야 한다.(매우 중요!!!)
원래라면 우리가 최적의 하이퍼 파라미터를 찾았거나 평가지표가 가장 높게 나오는 파라미터 값을 알고 있을 때, 우리는 XGBClassifier( )안에 모두 일일히 적어주어야 한다.
xgb_clf = XGBClassfier(objective='multi:softmax', num_class=7,max_depth=8, min_child_weight=10,
colsample_bytree=0.7, gamma=0.24, learning_rate=0.01, n_estimators=300)
각각의 값을 써줘야 한다.
하지만 여기서 더 편하게 할 수 있는 방법이 있는데 하이퍼 파라미터들을 딕셔너리 형태로 변수에 저장해서 바로 XGBClassifier( )안에 매개변수로 넣어주는 것이다.
params = {
'max_depth': 정수값,
'min_child_weight': 정수값,
'colsample_bytree': 실수값,
'gamma': 실수값,
'learning_rate': 실수값,
'n_estimators': 정수값
}
xgb_clf = XGBClassfier(**params, objective='multi:softmax', num_class=7)
pipeline= Pipeline([
('preprocessing', column_transfomer),
('clf', xgb_clf)
])
이 때 유의해야 할 점은 XGBClassifier( ) 매개변수 안으로 params가 들어갈 때 **params로 넣어주어야 한다는 것이다.
꼭 **를 붙여서 넣어 주어야 한다.!!!
여기서 만약 랜덤서치cv를 이용해서 최적의 하이퍼 파라미터를 찾고 교차검증을 진행하고 싶다면 밑에 코드대로 만들면 된다.
from sklearn.preprocessing import StandardScaler, OneHotEncoder,LabelEncoder
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from lightgbm import LGBMClassifier
from sklearn.model_selection import train_test_split, RandomizedSearchCV
from sklearn.metrics import accuracy_score
from scipy.stats import loguniform
import warnings
warnings.filterwarnings('ignore')
params={
'clf__learning_rate': loguniform(0.001, 0.1),
'clf__n_estimators': np.arange(100,1000),
'clf__max_depth': np.arange(5,30),
'clf__min_child_samples': np.arange(10,21),
'clf__colsample_bytree': loguniform(0.1,1.1),
'clf__reg_lambda': loguniform(0.1,1.1),
'clf__reg_alpha': loguniform(0.1,1.1),
'clf__subsample': loguniform(0.5, 1.5),
'clf__num_leaves': np.arange(30,60)
}
columns_transform = ColumnTransformer([
('sclaer', StandardScaler(), num_cols_tr),
('encoder', OneHotEncoder(handle_unknown='ignore'),cat_cols_tr),
],remainder='passthrough')
pipeline = Pipeline([
('preprocesser', columns_transform),
('clf', LGBMClassifier(random_state=42, objective='multiclass', num_class=7))
])
random_cv = RandomizedSearchCV(estimator = pipeline,
param_distributions=params,
n_iter=200,
scoring='accuracy',
n_jobs=-1,
cv=5,
)
random_cv.fit(X_train, y_train)
여기서 param_grid에서 clf__가 붙은 이유는 param_grid가 RandomizedSearchCV를 통해서 들어가게 되고 그것은 pipeline에서
pipeline = Pipeline([
('preprocesser', column_transform),
('clf', LGBMClassifier(random_state=42, objective='multiclass', num_class=7 ))
])
'clf'안에 들어가있는 LGBMClassifier로 들어가기에 param_grid의 하이퍼 파라미터는 clf__가 생성자로 붙게 되는 것이다.
만약 우리가 'classifier'라고 정해준다면 param_grid의 들어가는 하이퍼 파라미터들 앞에는 classifier__가 들어가게 될 것이다.
이로써 pipeline의 사용법을 알아보았다. 사이킷런 공식문서에서도 권장하는 사항이며, 인코딩과 스케일링, 피처 변환, 처리를 한번에 할 수 있게 해주는 유틸리티이기 때문에 꼭 기억하고 앞으로 pipeline에 익숙해 지도록 하자!!! @@
'머신러닝' 카테고리의 다른 글
OrdinalEncoder (LabelEncoder vs OrdinalEncoder) (0) | 2024.03.06 |
---|---|
데이터 인코딩 (순서가 있는 특성 매핑) (2) | 2024.03.06 |
피처 스케일링과 정규화(StandardScaler, MinMaxScaler), 스케일링 변환시 유의점 (2) | 2024.02.23 |
Feature Engineering - 데이터 인코딩(레이블 인코딩, 원-핫 인코딩) (0) | 2024.02.23 |
머신러닝 회귀모델 경사하강법 (0) | 2024.02.22 |