如何确定神经网络中的特征重要性?

数据挖掘 神经网络 喀拉斯 特征选择 rnn 序列到序列
2021-10-02 05:00:22

我有一个神经网络来解决时间序列预测问题。它是一个序列到序列的神经网络,目前它在每个具有十个特征的样本上进行训练。该模型的性能是平均的,我想调查添加或删除功能是否会提高性能。我已经使用 keras 构建了神经网络。

我包括的功能是:

  1. 历史数据
  2. 历史数据的季度滞后系列(4 系列)
  3. 每周一系列的价值变化
  4. 四个时间不变特征平铺以延长系列的长度。(另外4个系列)

我知道我可以多次运行模型来更改每次包含的功能组合。然而,除了调整超参数(因为这可能是 8 个功能在一组超参数上效果很好,但在另一组超参数上效果不佳),这确实是很多可能的组合。

是否有任何单独的方法可以用来判断某个功能是否可能为模型增加价值?

我特别担心我有四个时不变特征被输入到模型中,该模型旨在处理时变数据,我想要一种方法来衡量它们的影响以及它们是否添加了任何东西?

3个回答

不要删除一个特征来找出它的重要性,而是随机化或打乱它。

运行训练 10 次,每次随机选择不同的特征列,然后比较性能。以这种方式完成后,无需调整超参数。

这是我的建议背后的理论:特征重要性

链接到与@scholle 相同的论文,但以不同的方式解释流程(书籍论文)。

  1. 您不需要多次训练模型。上面链接中描述的算法需要一个训练有素的模型开始。
  2. 给定一个经过训练的模型,计算一些数据集上感兴趣的度量(本书讨论了使用训练集与测试集的优缺点)。
  3. 对于同一数据集中的每个特征,将相关特征的值打乱。对于每个观察,所有其他特征和标签应保持不变。
  4. 使用这个打乱的数据集(一次一个打乱的特征)对模型执行推理,并计算每次传递所需的度量。
  5. 现在计算原始度量(未更改的数据集)和为每个特征传递获得的度量之间的差异(书中还提到了除以置换分数/原始分数)。

瞧!特征重要性列表是第 5 步的排序输出(按降序排列 - 值越高意味着特征对所讨论的模型更重要)。

编辑- 我应该使用训练集还是测试/开发集来做排列特征的重要性?

上面链接的书解决了这个问题。更简洁的答案可以在SKLearn 的文档中找到:

排列重要性可以在训练集或保留测试或验证集上计算。使用保留集可以突出显示哪些特征对检查模型的泛化能力贡献最大。在训练集上重要但在保留集上不重要的特征可能会导致模型过拟合。

您可以使用SHAP来做这种事情,它也会查看排列重要性。