在打比赛的时候一直贯穿的思考,大概就是判别各个特征的重要性。
在建立模型之前,特征重要性能够帮助训练模型,防止过拟合,提升模型的RUC效果。
建立模型之后,特征重要性能够增强模型(集成模型 非深度学习模型)的可解释性,帮助建立模型信任、做出现实意义上的决策。
建模前特征重要性判别
要构建数值型连续变量的监督学习模型,最重要的方面之一就是好好理解特征。观察一个模型的部分依赖图有助于理解模型的输出是如何随着每个特征变化而改变的。
1.featexp
一位名叫Abhay Pawar的小哥开发了一些特征工程和机器学习建模的标准方法。
- 特征理解
- 识别嘈杂特征
- 特征工程
- 特征重要性
- 特征调试
- 泄漏检测与理解
- 模型监控
特征理解
如果因变量 (分析目标) 是二分类数据,散点图就不太好用了,因为所有点不是0就是1。针对连续型变量,数据点太多的话,会让人很难理解目标和特征之间的关系。但是,用featexp可以做出更加友好的图像。
Featexp可以把一个数字特征,分成很多个样本量相等的区间(X轴)。然后,计算出目标的平均值 (Mean),并绘制出左上方的图像。在这里,平均值代表违约率。图像告诉我们,年纪 (DAYS_BIRTH) 越大的人,违约率越低。
这非常合理的,因为年轻人通常更可能违约。这些图能够帮助我们理解客户的特征,以及这些特征是如何影响模型的。右上方的图像表示每个区间内的客户数量。
get_univariate_plots(data=data_train, target_col='target', features_list=data_train.columns[0:10], data_test=data_test)
识别嘈杂特征
嘈杂特征容易造成过拟合,分辨噪音一点也不容易。
在featexp里,你可以跑一下测试集或者验证集,然后对比训练集和测试集的特征趋势,从而找出嘈杂的特征。
训练集和测试集特征趋势的对比
为了衡量噪音影响程度,featexp会计算两个指标:
-
趋势相关性 (从测试绘图中可见) :如果一个特征在训练集和验证集里面表现出来的趋势不一样,就有可能导致过拟合。这是因为,模型从训练集里学到的一些东西,在验证集中不适用。趋势相关性可以告诉我们训练集和验证集趋势的相似度,以及每个区间的平均值。上面这个例子中,两个数据集的相关性达到了99%。看起来噪音不是很严重!
-
趋势变化:有时候,趋势会发生突然变化和反复变化。这可能就参入噪音了,但也有可能是特定区间内有其他独特的特征对其产生了影响。如果出现这种情况,这个区间的违约率就没办法和其他区间直接对比了。
如果训练集和测试集没有相同的趋势:如两者相关性只有85%。有时候,可以选择丢掉这样的特征。
嘈杂特征的例子
抛弃相关性低的特征,这种做法在特征非常多、特征之间又充满相关性(95%以上的很多)的情况下比较适用。这样可以减少过拟合,避免信息丢失。不过,别把太多重要的特征都丢掉了;否则模型的预测效果可能会大打折扣。同时,你也不能用重要性来评价特征是否嘈杂,因为有些特征既非常重要,又嘈杂得不得了。
用与训练集不同时间段的数据来做测试集可能会比较好。这样就能看出来数据是不是随时间变化的了。
Featexp里有一个 get_trend_stats() 函数,可以返回一个数据框 (Dataframe) ,显示趋势相关性和趋势变化。
stats = get_trend_stats(data=data_train, target_col='target', data_test=data_test)
get_trend_stats()返回的数据框
现在,可以试着去丢弃一些趋势相关性弱的特征了,看看预测效果是否有提高。
我们可以看到,丢弃特征的相关性阈值越高,排行榜(LB)上的AUC越高。只要注意不要丢弃重要特征,AUC可以提升到0.74。有趣的是,测试集的AUC并没有像排行榜的AUC变化那么大。完整代码可以在featexp_demo记事本里面找到。
featexp_demo