本文参考下链 ,如果对数据集或书内更多更多讲解内容感兴趣,请直接购买
智能风控(原理,算法与工程实践)www.amazon.cn这篇手码了一遍梅子行在书中的递归筛选方案,梳理的框架上是这样的.
- 首先定义了在风控场景下,特征迭代筛选和两个关键性指标:
- KS: 模型的正负样本体现的关键指标,这与普通学习任务中的针对AUC,Precision等的优化方向不一样,所以基本自己定义了一个评价指标。
- PSI: 模型各个在各个检测分段上的检测稳定性.
也就是区分能力要强,模型结果要稳定.
需要注意的是,我们在使用XGBoost的时候其实有自带一个Featureimportance功能(上一篇写xgboost有提到,分为weight, gain和cover三种不同形式),如果我们在入模之前没有对模型特征做相关性的处理的话,直接使用XGBoost进行特征筛选是不合理的. 我下面举个例子:
如果有两个特征的分布是像上图这样的,可以发现他们的相关性一定是差不多的,在XGBOOST用于分裂时2个特征肯定会被随机用来分树,那么这两个本身如果重要性比较高的话,特征的真正重要性就会丢失。
回到书中的内容,这节先定义了2个评估模型效果的函数
SolveKS:
用于计算当前模型在某数据集上的KS,KS值对模型的评价不会受到样本不均衡问题的影响.
这些函数都继承自之前XGBoost父类
注意这个函数还加了个Weight参数,这是为了还原真实样本比例下的比例,举个例子,正样本有100,负样本有10000,对负样本按照0.4的比例进行下采样,就会得到4000的负样本,对100的正样本和4000的负样本进行建模,但是需要将负样本的权重设置为2.5,才能还原到初始的正负样本的比例
def sloveKS(self, model, X, Y, Weight):
Y_predict = [s[1] for s in model.predict_proba(X)]
nrows = X.shape[0]
#还原权重
lis = [(Y_predict[i], Y.values[i], Weight[i]) for i in range(nrows)]
#按照预测概率倒序排列
ks_lis = sorted(lis, key=lambda x: x[0], reverse=True)
KS = list()
bad = sum([w for (p, y, w) in ks_lis if y