Light GBM은 XGBoost보다 개선된 성능과 빠른 수행률을 보여주어 많은 대회의 상위 랭커들이 활용하는 모델이라고 할 수 있습니다!
저는 LGBMClaasifier 모델을 활용할 때 특히 주의해야 할 부분을 짚어보려고 하는데요, LGBMClassifier hyper parameter 중 'boost_from_averge' 설정입니다.
Light GBM이 버전업 됨에 따라 boost_from_average 파라미터의 디폴트 값이 False에서 True로 변경되었습니다.
레이블 값이 극도로 불균형한 분포인 데이터의 경우 boost_from_average = True 값은 재현율과 roc_auc_score를 매우 저하시킵니다!
Light GBM 2.1.0이상 버전이거나, 불균형한 데이터 세트에서 예측 성능이 매우 저조할 경우 LightGBM 객체 생성 시 boost_from_average = False로 파라미터를 설정해야 합니다.
하나의 예시로 실습 데이터에 많이 활용되는 kaggle의 신용카드 사기 검출을 활용해보겠습니다.
먼저, 예측에 필요한 함수들을 생성하겠습니다.
* get_clf_eval : 모델 평가
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
def get_clf_eval(y_test, pred=None, pred_proba=None):
print('오차행렬 \n', confusion_matrix(y_test, pred))
print('정확도 :', accuracy_score(y_test, pred))
print('정밀도 : ',precision_score(y_test, pred))
print('재현율 :', recall_score(y_test, pred))
print('f1 score :', f1_score(y_test, pred))
print('roc auc score :', roc_auc_score(y_test, pred_proba))
* get_model_train_eval : model만 바꿔서 학습 및 예측
def get_model_train_eval(model, ftr_train = None, ftr_test = None, tgt_train=None, tgt_test=None):
model.fit(ftr_train, tgt_train)
pred = model.predict(ftr_test)
pred_proba = model.predict_proba(ftr_test)[:,1]
get_clf_eval(tgt_test, pred, pred_proba)
* get_preprocessed_df : 전처리 및 필요없는 컬럼 삭제
from sklearn.preprocessing import StandardScaler
def get_preprocessed_df(df=None):
df_copy = df.copy()
scaler = StandardScaler()
amount_n = scaler.fit_transform(df['Amount'].values.reshape(-1,1))
df_copy.insert(0,'Amount_scaled', amount_n)
df_copy.drop(['Time','Amount'],axis=1, inplace=True)
return df_copy
boost_from_average의 True / False 비교
** 저는 Logistic Regression과 LGBM의 예측 성능을 비교하였습니다.
1) boost_from_average = True의 경우
X_train, X_test, y_train, y_test = get_train_test_dataset(card_df)
print('##logistic 성능 예측')
get_model_train_eval(lr_clf, X_train, X_test, y_train, y_test)
print('##LGBMClassifier 성능 예측')
lgbm_clf = LGBMClassifier(n_estimators=1000, num_leaves=64, n_jobs=-1, boost_from_average=True)
get_model_train_eval(lgbm_clf,X_train, X_test, y_train, y_test )
결과 : Logistic Regression의 roc 점수가 0.95인 반면 LGBMClassifier의 roc는 0.49에 밖에 못미치는 것을 볼 수 있습니다.
2) boost_from_average=False의 경우
X_train, X_test, y_train, y_test = get_train_test_dataset(card_df)
print('##logistic 성능 예측')
get_model_train_eval(lr_clf, X_train, X_test, y_train, y_test)
print('##LGBMClassifier 성능 예측')
lgbm_clf = LGBMClassifier(n_estimators=1000, num_leaves=64, n_jobs=-1, boost_from_average=False)
get_model_train_eval(lgbm_clf,X_train, X_test, y_train, y_test )
결과 : LGBMClassifier가 Logistic Regression에 비해 높은 성능을 보임을 알 수 있습니다.
앞서와 같이 데이터에 따라 다른 파라미터 설정이 요구되며, 분류 지도학습 시 레이블 값이 극도로 불균형한 분포를 띄는 경우 LGBMClassifier의 파라미터 중 boost_from_average=False로 설정해주어야 합니다 !
'python > 파이썬 머신러닝 완벽가이드' 카테고리의 다른 글
[NLP] pipeline을 활용한 직관적인 코드짜기! (0) | 2022.05.03 |
---|---|
[NLP] 피처백터화 / 희소행렬 (0) | 2022.05.02 |
[NLP] NLP 기초, 텍스트 전처리의 모든 것 (0) | 2022.04.30 |
[python] SMOTE를 활용한 오버샘플링 (0) | 2022.03.26 |
[python] 교차검증을 간단하게 cross_val_score() (0) | 2022.03.15 |