学习笔记(九)用IV值和随机森林挑选特征


数据是金融数据,我们要做的是预测贷款用户是否会逾期,表格中,status是标签:0表示未逾期,1表示逾期。
Misson1 - 构建逻辑回归模型进行预测
Misson2 - 构建SVM和决策树模型进行预测
Misson3 - 构建xgboost和lightgbm模型进行预测
Mission4 - 记录五个模型关于precision,rescore,f1,auc,roc的评分表格,画出auc和roc曲线图
Mission5 - 关于数据类型转换以及缺失值处理(尝试不同的填充看效果)以及你能借鉴的数据探索
Mission6 - 交叉验证和网格搜索调参
Mission7 - stacking 融合模型
Mission8 - 分别用IV值和随机森林挑选特征,再构建模型,进行模型评估

特征筛选 (判定贷款用户是否逾期)

数据的前期预处理请参考
当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:

  • 特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
  • 特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。

这里将简单介绍IV值和随机森林对特征的挑选

1. IV值进行特征选择

直观逻辑上大体可以这样理解“用IV去衡量变量预测能力”这件事情:我们假设在一个分类问题中,目标变量的类别有两类:Y1,Y2。对于一个待预测的个体A,要判断A属于Y1还是Y2,我们是需要一定的信息的,假设这个信息总量是I,而这些所需要的信息,就蕴含在所有的自变量C1,C2,C3,……,Cn中,那么,对于其中的一个变量Ci来说,其蕴含的信息越多,那么它对于判断A属于Y1还是Y2的贡献就越大,Ci的信息价值就越大,Ci的IV就越大,它就越应该进入到入模变量列表中。
IV的特征划分标准可参考:https://blog.csdn.net/a786150017/article/details/84573202

1.1 IV的计算

对于一个待评估变量,他的IV值究竟如何计算呢?为了介绍IV的计算方法,我们首先需要认识和理解另一个概念——WOE,因为IV的计算是以WOE为基础的。

1.1.1 WOE的计算

WOE的全称是“Weight of Evidence”,即证据权重。WOE是对原始自变量的一种编码形式。
要对一个变量进行WOE编码,需要首先把这个变量进行分组处理(也叫离散化、分箱等等,说的都是一个意思)。分组后,对于第i组,WOE的计算公式如下:
在这里插入图片描述
具体可以结合例子看:数据挖掘模型中的IV和WOE详解
对这个公式做一个简单变换,可以得到:
在这里插入图片描述

1.2 IV的计算公式

对于分组i,会有一个对应的IV值,计算公式如下:
在这里插入图片描述
有了一个变量各分组的IV值,我们就可以计算整个变量的IV值,方法很简单,就是把各分组的IV相加:
在这里插入图片描述
其中n为分组个数。

代码实现

先封装计算IV的方法

def CalcIV(Xvar,Yvar):
    N_0=np.sum(Yvar==0)
    N_1=np.sum(Yvar==1)
    N_0_group=np.zeros(np.unique(Xvar).shape)
    
    N_1_group=np.zeros(np.unique(Xvar).shape)
    for i in range(len(np.unique(Xvar))):
        N_0_group[i] = Yvar[(Xvar==np.unique(Xvar)[i])&(Yvar==0)].count()
        N_1_group[i] = Yvar[(Xvar==np.unique(Xvar)[i])&(Yvar==1)].count()
    iv = np.sum((N_0_group/N_0-N_1_group/N_1)*np.log((N_0_group/N_0)/(N_1_group/N_1)))
    if iv>=1.0:## 处理极端值
        iv=1
    return iv

def caliv_batch(df,Yvar):
    ivlist=[]
    for col in df.columns:
        iv=CalcIV(df[col],Yvar)
        ivlist.append(iv)
    names=list(df.columns)
    iv_df=pd.DataFrame({'Var':names,'Iv':ivlist},columns=['Var','Iv'])

    return iv_df,ivlist
im_iv, ivl = caliv_batch(datafinal,data_train)

统计的结果如下:
在这里插入图片描述

再进行数据处理:

threshold = 0.02
threshold2 = 0.6
data_index=[]
for i in range(len(ivl)):
    if (im_iv['Iv'][i]< threshold)|(im_iv['Iv'][i] > threshold2):
        data_index.append(im_iv['Var'][i])
datafinal.drop(data_index,axis=1,inplace=True)

在这里插入图片描述
最终标准归一化后并使用上一篇的stacking(包括结果的对比)请参考训练得出结果:
在这里插入图片描述
虽然将特征删去了将近50个,但是对最后的结果并没有多大的影响。

2. 随机森林进行特征选择

随机森林是以决策树为基学习器的集成学习算法。随机森林非常简单,易于实现,计算开销也很小,更令人惊奇的是它在分类和回归上表现出了十分惊人的性能,因此,随机森林也被誉为“代表集成学习技术水平的方法”。

2.1 随机森林简单理解

只要了解决策树的算法,那么随机森林是相当容易理解的。随机森林的算法可以用如下几个步骤概括:

  1. 用有抽样放回的方法(bootstrap)从样本集中选取n个样本作为一个训练集
  2. 用抽样得到的样本集生成一棵决策树。在生成的每一个结点:
    (1) 随机不重复地选择d个特征
    (2) 利用这d个特征分别对样本集进行划分,找到最佳的划分特征(可用基尼系数、增益率或者 信息增益判别)
  3. 重复步骤1到步骤2共k次,k即为随机森林中决策树的个数。
  4. 用训练得到的随机森林对测试样本进行预测,并用票选法决定预测的结果。
    在这里插入图片描述
    更详细的说明可参考:利用随机森林对特征重要性进行评估

2.2 代码的实现

from sklearn.ensemble import RandomForestClassifier
feat_lables = datafinal.columns
forest = RandomForestClassifier(n_estimators=10000, random_state=0,n_jobs=1)
forest.fit(datafinal, data_train)
importance = forest.feature_importances_
imp_result = np.argsort(importance)[::-1]

for i in range(datafinal.shape[1]):
	print("%2d. %-*s %f"%(i+1, 30, feat_lables[i], importance[imp_result[i]]))

显示相关结果:
在这里插入图片描述
进行筛选处理:

threshold = 0.01
data_index = list(datafinal.columns[ importance < threshold])
datafinal.drop(data_index,axis=1,inplace=True)
datafinal.shape

可看出只留下了48个特征
在这里插入图片描述

最终标准归一化后并同样使用上一篇的stacking(包括结果的对比)训练得出结果:
在这里插入图片描述
可以看出,同样删除了40多个特征,但是对结果并没有太大的影响。

3. 总结

  1. 使用IV时出现太多的“inf”对结果是否有影响?如何处理这些?
  2. 随机森林最后的划分标准应该如何确定?
  3. 还是那句话,特征工程的知识需要多学。
  • 6
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值