集成模型篩選特徵shap

訓練完整的集成模型(xgboost、LightGBM、CatBoost)可以參考這篇博客的流程

  1. 首先數值型不變,因爲不需要做標準化處理,然後文本型轉爲woe編碼;
  2. 計算IV,將大於0.5(舉例)的變量抽出去做加分規則,不然模型很可能只在頭部有區分能力,把對應的樣本也從開發樣本中去掉,有助於提高模型在中分段的區分能力;
  3. 計算相關係數,把相關係數大於0.75(舉例)的變量中,IV小的那個去掉,避免特徵重要性同時被削弱;
  4. 訓練模型,使用SHAP刪除貢獻較小的特徵,雖然邏輯和特徵重要性差不多,但是他的一致性是個很好的性質,和書中的迭代刪除效果差不多,邏輯也更簡單;
  5. 計算PSI,刪除開發樣本和測試集以及oot上,PSI大於0.1的特徵;
  6. 自動調參,和書上相同的邏輯,但是參數搜索方式建議使用貝葉斯優化或者遺傳算法一類的會快一點;
  7. 逐個特徵刪除,個人最喜歡的一步,和書上邏輯一模一樣,逐個去掉特徵看oot上的ks是否提高,這一步看似使用了oot信息,但其實刪特徵是不會過擬合的,數據量可以的話,一般這樣處理之後roc曲線幾乎完全重合,線上穩定性也特別好;
  8. 從開發樣本拆出30%樣本,或者有測試集就直接用測試集,作爲提前停止。將oot和開發樣本合併,重新擬合模型,結束。

其中用到shap篩選特徵,參考官方文檔利用SHAP解釋Xgboost模型特徵選擇之gbdt的shap

import shap

fea_imp1 = pd.DataFrame()
fea_imp1['varname'] = feature_names_2
fea_imp1['importance'] = xgc.feature_importances_
explainer = shap.TreeExplainer(xgc, dtrain[feature_names_2])
shap_values = explainer.shap_values(dtrain[feature_names_2])

fea_imp1['shap_value'] = np.sum(np.abs(shap_values), axis=0) #取絕對值
fea_imp1.sort_values('shap_value', ascending=False, inplace=True)

SHAP值幅度的絕對值總和對特徵進行排序,並使用SHAP值顯示每個特徵對模型輸出的影響分佈。顏色代表特徵值(紅色高,藍色低)

shap.summary_plot(shap_values, dtrain[feature_names_2])

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章