如何建立一个神经网络,为最重要的功能推断出一组值?

时间:2018-12-20 13:31:07

标签: tensorflow machine-learning neural-network deep-learning data-science

我在这里的任务是找到一种方法来获取一个或多个最重要特征的建议值。通过更改功能的建议值,我希望分类结果也更改。

Snapshot of dataset

以下是我到目前为止尝试过的过程:

  1. 导入数据集(形状:1162 x 22)
  2. 构建一个简单的神经网络(2个隐藏层)
  3. 由于因变量只是0或1(分类问题),因此我对变量进行了热编码。所以它是[0,1]或[1,0]
  4. 分解为训练和测试数据后,我训练了我的NN模型,并获得了77.8%的准确性
  5. 要知道在确定0或1时哪个特征(最重要的21个)是最重要的,我使用随机森林分类器(scikit-learn)训练了数据,并获得了77.8%的准确性,然后使用“随机森林分类器提供的feature_importances _”。
  6. 结果,我发现一个名为“ a_L4”的功能在相对功能重要性方面排名最高。
  7. 特征'a_L4'的取值范围是0到360,因为它表示角度。在原始数据集中,“ a_L4”仅包含12个值,分别为[5、50、95、120、140、160、185、230、235、275、320、345]。
  8. 我通过为每种情况直接添加所有可能的12个值来增加原始数据集,从而给出了一个新的形状数据集(1162x12 x 22)。
  9. 我导入了增强数据集,并在先前训练过的NN模型上进行了测试。结果是失败。分类几乎没有变化,这意味着几乎没有“ 1”切换为“ 0”。
  10. 我的结论是,更改“ a_L4”的值不足以带来分类的变化。因此,我再次对第二个最重要的功能(在本例中为“ b_L7_p1”)进行了相同的操作。
  11. 因此,写出两个最重要特征可以具有的所有可能值,现在新数据集的形状变为(1162x12x6 x 22)。 “ b_L7_p1”仅允许具有6个不同的值,因此可以乘以6。
  12. 同样的结果是失败。

所以,我的问题是,在上述过程中我可能做错了什么?我是否需要继续搜索更重要的功能,并使用它们可能具有的所有可能值来扩充数据?但是由于这是一个繁琐的任务,需要手动完成多个过程,并且会导致数据集很大,所以我希望有一种方法可以构建基于推理的NN模型,该模型可以直接给出特定特征的建议值或功能。

我在这个研究领域还比较陌生,所以有人可以告诉我一些我应该搜索的关键词吗?我在Google上找不到有关此问题的任何作品或论文。

谢谢。

1 个答案:

答案 0 :(得分:0)

在这种情况下,我将通过以下方式解决该问题:

  1. 标准化整个数据集。从数据集中可以看到,您的要素具有不同的比例。使所有功能具有相同的比例非常重要。看看:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html
  2. 我现在要做的第二个事情是训练和评估一个模型(可以是您想要的任何模型)以获得所谓的基线模型。
  3. 然后,我将尝试PCA来查看是否需要所有功能。也许您对模型包括了不必要的稀疏性。参见:https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html 例如,如果您将PCA中的n_components设置为0.99,则在减少要素数量的同时保留了0.99的解释方差。
  4. 然后,我将训练模型以查看是否有任何改进。请注意,只有添加规范化本身,才能有所改进。
  5. 如果我想通过数据集本身查看哪些要素很重要,我应该这样做:https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.SelectKBest.html这将基于一些统计检验来选择指定数量的要素,例如:https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.chi2.html
  6. 训练模型并再次评估,以查看是否有改进。

另外,您应该意识到NN可以自己执行特征工程,因此计算特征重要性在某种程度上是多余的。

让我知道您是否会看到任何改进。