特征选择一
建模时如果特征过多容易造成“维度灾难”,降低模型效果,因此特征选择非常重要,本文结合特征重要性和特征相关性来挑选特征。
衡量特征重要性有很多方法,如统计变量IV值、Gini值等,还可以通过一些模型如决策树、随机森林等得到特征的重要性importance等方法,以上方法主要是采取监督方法(即X变量对Y变量的重要性)来衡量变量的预测力。此外特征之间的相关性分析属于特征选择的非监督方法。下面以IV值和相关性结合为例进行介绍。
首先计算特征的IV,计算方法和代码在之前的文章中有介绍,Python计算IV值,计算结果存在数据框iv_df中,如下图:
然后计算特征之间的相关系数,计算结果存在数据框corr_mat中,如下图:
最后,通过IV值和相关系数的结合选择特征,算法如下:
(1)剔除IV值<iv_thred的特征,剔除特征放入列表except_var,并对iv_df按IV值降序排列;
(2)按IV值从大到小选择iv_df中特征Var,若特征Var不在except_var中,则将Var放入列表remain_var;
(3)剔除与Var相关系数大于cor_thred的特征,并将剔除特征加入列表except_var;
(4)重复步骤(2)和(3),直至结束,则列表remain_var中的特征即为选择的特征。
python代码如下,其中cormat是相关系数数据框,iv_df是IV值数据框,cor_thred是相关系数的阈值,iv_thred是IV值阈值。
def Feature_Select_cor_iv(cormat, iv_df, cor_thred, iv_thred): except_var = set(iv_df['Var'][(~iv_df['Var'].isin(cormat.index)) | (iv_df['Iv']<iv_thred)]) iv_df = iv_df.sort_values(by=['Iv'], ascending=[False]) remain_var = [] for var in iv_df.Var: if var in except_var: continue else: corr = cormat.loc[(cormat[var]>cor_thred) & (cormat[var]<1), var] except_var = except_var.union(set(corr.index)) remain_var.append(var) except_var = list(except_var) return remain_var, except_var
br
根据上面得到的cor_mat和iv_df,运行该代码:
remain_vars, ex_vars = Feature_Select_cor_iv(corr_mat, iv_df, 0.7, 0.03)
br
得到remain_vars,选出了预测力最强且相关性较弱的18个特征。
可以验证一下相关系数是否大于0.7,如下图,不同特征之间的相关系数<0.7。
来源|大数据风控的一点一滴
作者|小石头
更多精彩,戳这里: