学习笔记(九)用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 随机森林简单理解
只要了解决策树的算法,那么随机森林是相当容易理解的。随机森林的算法可以用如下几个步骤概括:
- 用有抽样放回的方法(bootstrap)从样本集中选取n个样本作为一个训练集
- 用抽样得到的样本集生成一棵决策树。在生成的每一个结点:
(1) 随机不重复地选择d个特征
(2) 利用这d个特征分别对样本集进行划分,找到最佳的划分特征(可用基尼系数、增益率或者 信息增益判别) - 重复步骤1到步骤2共k次,k即为随机森林中决策树的个数。
- 用训练得到的随机森林对测试样本进行预测,并用票选法决定预测的结果。
更详细的说明可参考:利用随机森林对特征重要性进行评估
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. 总结
- 使用IV时出现太多的“inf”对结果是否有影响?如何处理这些?
- 随机森林最后的划分标准应该如何确定?
- 还是那句话,特征工程的知识需要多学。