预测重要性的随机森林(Matlab)

机器算法验证 matlab 特征选择 随机森林
2022-04-16 00:43:49

我正在处理一个包含大约 150,000 个观测值和 50 个特征的数据集,最终模型使用 SVM。为了减少功能数量,我决定考虑使用 RF,这样 SVM 优化不会花费太长时间。我目前在 Matlab 中使用TreeBagger实现并且有几个问题。

  1. 在调查特征重要性时,是否应该调整 RF 以获得最高的 CV 性能?模型的准确性是否会影响报告的预测变量重要性的准确性?
  2. 处理重要性被低估的两个相关特征之一的最佳方法是什么?这可以通过多次训练 RF 并平均特征排名来消除吗?
  3. 似乎没有任何方法可以在 TreeBagger 中手动选择拆分标准,我也找不到任何关于默认值的文档。有人知道吗?如果没有,假设它使用 Gini 是否安全?
  4. TreeBagger 的特征重要性与 Matlab 的fitensemble生成的特征重要性相比如何?这支持 bagging 和不同的 boosting 算法,以及不同的拆分标准。但是,据我所知,这些不会调用 Breiman 的 RF 算法。当指定要采样的特征数量时,唯一的 Matlab 函数是 TreeBagger。如果我错了,请纠正我。就目前而言,由于更多的选择和更好的文档,fitensemble 看起来更具吸引力。
2个回答
  1. 您所描述的将是一种方法。对于分类,TreeBagger 默认为每个决策拆分随机选择 sqrt(p) 预测器(Breiman 推荐的设置)。根据您的数据和树的深度,您的 50 个预测变量中的一些可能会因为不走运而被视为比其他预测变量更少的次数。这就是为什么为了估计预测器的重要性,我通常将“nvartosample”设置为“all”。这提供了一个精度稍低的模型,确保每个预测变量都被合理地包括在内。

  2. 如果您在默认设置下运行 TreeBagger,这通常不是问题。例如,如果您有两个强相关特征,其中一个包含在随机选择的 7 个预测变量中进行拆分,另一个可能不包含在这 7 个中。如果您想通过检查每个预测变量来采用我的方案拆分,通过将“代理”设置为“全部”来使用代理拆分。培训将花费更长的时间,但您将获得有关预测器重要性的完整信息,而不管其他预测器、预测器之间的关联。

  3. TreeBagger 文档和帮助在底部有这样的声明:

“除了上述可选参数外,此方法接受所有可选 fitctree 和 fitrtree 参数,但 'minparent' 除外。有关更多详细信息,请参阅 fitctree 和 fitrtree 的文档。”

查看 fitctree 和 fitrtree 的文档。

  1. 'Bag' 方法的 fitensemble 使用与 TreeBagger 中相同的默认设置实现 Breiman 的随机森林。您可以将要采样的特征数量更改为您喜欢的任何内容;只需阅读 templateTree 的文档。fitensemble 返回的对象有一个 predictorImportance 方法,该方法显示由于每个预测器上的拆分而导致的累积增益。TreeBagger 相当于 DeltaCriterionDecisionSplit 属性(或类似的东西)。此外,TreeBagger 具有 3 个 OOBPermuted 属性,它们是预测变量重要性的替代度量。

是的,对所有预测变量进行抽样通常会损害模型的准确性。我们追求的是预测重要性值,而不是准确性。无论哪种方式,这都是一个启发式过程。使用随机森林估计 SVM 的预测变量重要性只能让您了解哪些预测变量可能很重要。可以构建数据集,其中 RF 无法识别对 SVM 很重要的预测因子(假阴性),反之亦然(假阳性)。如果您想更加信任您的预测器选择过程,请使用 SVM 作为基础学习器进行顺序反向消除。