首页 文章详情

神经网络模型特征重要性-谷歌解决方案

机器学习初学者 | 537 2022-04-11 18:56 0 0 0
UniSMS (合一短信)

背景


树模型的特征重要性是相对容易计算出来的,那么对于神经网络我们该如何得到其特征重要性呢?网上的方法包括permutation importance, null importance, 随机对特征进行mask等方法,本文要介绍的是牛津大学和谷歌提出的基于Gated Residual Networks (GRN) and Variable Selection Networks (VSN)的特征重要性计算方法。


使用GRN计算特征重要性的基本逻辑


1


提供特征列和target列,特征根据数据类型指定为数值型或离散型;

2


将数据划分为验证集和训练集;

3


在训练集上,根据第一步提供的列定义,对数值型特征分别进行归一化,对离散型特征进行embedding(相当于给每一列离散特征创建一个类别词典),然后将两者拼接后传给GRN模块,计算得到每个特征的权重,再将权重和前面拼接后的结果按元素相乘,最后接全连接层,获得预测结果,与真实值计算loss,迭代训练。

其中,GRN模块获取拼接输入后,分成两路,其中一路经过多层变换最后额外使用sigmoid激活函数作为“门”对变换结果进行选择性加权,另一路则作为residual connection直接与前者的输出相加,起到防止过拟合的作用。

4


取验证集得分最优的情况下各个特征的权重为特征的重要性。


使用案例

我们的开源项目AutoX把GRN计算特征重要性以及特征选择的函数进行了封装:

使用GRN_feature_selection进行特征重要性计算:

from autox.autox_competition.feature_selection import GRN_feature_selectionGRN_feature_selection = GRN_feature_selection()
column_definition = { "cat":['investment_id'], "num":[]}for i in range(300): column_definition['num'].append((f'f_{i}'))
GRN_feature_selection.fit(train[used], train[target], column_definition)
# Train[used]是完成了包含所有特征的dataframe# Train[target]是标签列# column_definition中指定了特征的类型(特征属于类别型变量还是连续型变量)


查看所有特征的重要性:

GRN_feature_selection.feature2weight


选择top_k重要性的特征:

train_select = GRN_feature_selection.transform(train[used], top_k=20)test_select = GRN_feature_selection.transform(test[used], top_k=20)


完整案例地址

https://www.kaggle.com/code/hengwdai/grn-featureselection-autox


开源项目地址

https://github.com/4paradigm/AutoX


参考资料

Lim B, Arik S O, Loeff N, et al. Temporal fusion transformers for interpretable multi-horizon time series forecasting[J]. arXiv preprint arXiv:1912.09363, 2019.

往期精彩回顾




good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter