训练完整的集成模型(xgboost、LightGBM、CatBoost)可以参考这篇博客的流程
- 首先数值型不变,因为不需要做标准化处理,然后文本型转为woe编码;
- 计算IV,将大于0.5(举例)的变量抽出去做加分规则,不然模型很可能只在头部有区分能力,把对应的样本也从开发样本中去掉,有助于提高模型在中分段的区分能力;
- 计算相关系数,把相关系数大于0.75(举例)的变量中,IV小的那个去掉,避免特征重要性同时被削弱;
- 训练模型,使用SHAP删除贡献较小的特征,虽然逻辑和特征重要性差不多,但是他的一致性是个很好的性质,和书中的迭代删除效果差不多,逻辑也更简单;
- 计算PSI,删除开发样本和测试集以及oot上,PSI大于0.1的特征;
- 自动调参,和书上相同的逻辑,但是参数搜索方式建议使用贝叶斯优化或者遗传算法一类的会快一点;
- 逐个特征删除,个人最喜欢的一步,和书上逻辑一模一样,逐个去掉特征看oot上的ks是否提高,这一步看似使用了oot信息,但其实删特征是不会过拟合的,数据量可以的话,一般这样处理之后roc曲线几乎完全重合,线上稳定性也特别好;
- 从开发样本拆出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值显示每个特征对模型输出的影响分布。1、颜色代表特征值(红色高,蓝色低)本身的大小;2、中间的shap_value=0基准线,右侧表示对结果的贡献是正的,在分类问题上就是逾期概率越高。因此第一个变量tx_riskscore 右边红色的多,即tx_riskscore 越大,逾期概率越高。
shap.summary_plot(shap_values, dtrain[feature_names_2])
二、单个样本的解释
也可以解释单个样本逾期概率的高了主要是受哪些变量影响(下面是官网的例子)
# visualize the first prediction's explanation (use matplotlib=True to avoid Javascript)
shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])
explainer.expected_value即训练样本的平均值,就是下图的base value,红色表示该样本中特征的影响是正向的,蓝色表示影响是负向的,同时条形图的长短表示影响程度的高低。