【问题标题】:How to collapse a RandomForest into an equivalent decision tree?如何将 RandomForest 折叠成等效的决策树?
【发布时间】:2015-09-12 04:06:51
【问题描述】:

按照我的理解,在创建随机森林时,该算法将一堆随机生成的决策树捆绑在一起,对它们进行加权以使其适合训练数据。

可以说可以将森林的平均值简化为简单的决策树吗?而且,如果是这样 - 我如何访问和展示这棵树?

我在这里要做的是提取树中的信息,以帮助识别主要属性、它们的边界值和在树中的位置。我假设这样的树将为人类(或计算机启发式)提供关于数据集中哪些属性为确定目标结果提供最深入了解的洞察力。

这似乎是一个幼稚的问题 - 如果是这样,请耐心等待,我是新手,想达到一个我充分理解它的阶段。

【问题讨论】:

  • 如果你想发现哪个特征是最重要的,那么也许你只需要查看 RandomForest 对象的feature_importances_ 属性。问题是 randomForest 是为了解决决策树精度的问题。随机方面会倾向于消除错误......不知道恢复到独特的树是否明智。也许其他人对此有更多线索
  • 感谢 RPresle - 是的,这有助于确定每个属性的相对重要性 - 但缺少的部分是我假设/想象平均决策树可能有效使用的边界条件 - 然后再说一次,正如您所说,我认为平均边界条件不一定是正确的。显示属性“num_mcflurrys”是否被确定为对确定结果“超重”很重要仍然可能是有益的,可能有一些方法可以找出有多少“num_mcflurrys”可能被认为是有意义的边界?

标签: scikit-learn random-forest


【解决方案1】:

RandomForest 使用引导程序通过对数据进行替换(bagging)抽样来创建许多训练集。每个自举集都非常接近原始数据,但略有不同,因为它可能具有某些点的倍数,而原始数据中的某些其他点将丢失。 (这有助于创建一大堆相似但不同的集合,它们作为一个整体代表您的数据来自的人群,并允许更好的泛化)

然后它适合每个集合的决策树。然而,常规决策树在每一步所做的是循环每个特征,为每个特征找到最佳分割,最后选择在所有特征中产生最佳分割的特征进行分割。在 RandomForest 中,您只需在每一步尝试随机子样本(默认为 sqrt(n_features)),而不是循环遍历每个特征以找到最佳分割。

因此,RandomForest 中的每棵树都适合自举随机训练集。并且在每个分支步骤中,它只查看特征的子样本,因此一些分支会很好,但不一定是理想的分割。这意味着每棵树都不太适合原始数据。但是,当您对所有这些(次理想)树的结果进行平均时,您会得到一个可靠的预测。常规决策树过度拟合数据,这种双向随机化(装袋和特征子采样)允许它们进行泛化,而森林通常做得很好。

这里有一个问题:虽然您可以平均每棵树的输出,您不能真正“平均树”以获得“平均树”。由于树是一组链接的 if-then 语句,因此无法获取这些链并得出一个生成与每个链的平均结果相同的结果的单个链。森林中的每棵树都是不同的,即使出现相同的特征,它们也会出现在树的不同位置,从而无法组合。您不能将 RandomForest 表示为一棵树。

你可以做两件事。

1) 正如 RPresle 所提到的,您可以查看 .feature_importances_ 属性,该属性对每个特征平均来自不同树的分割分数。这个想法是,虽然您无法获得一棵平均树,但您可以通过平均每棵树的得分来量化每个特征在森林中的使用量和效率。

2) 当我拟合 RandomForest 模型并需要深入了解正在发生的事情、特征如何影响结果时,我还拟合了单个决策树。现在,这个模型本身通常一点都不好,它很容易被 RandomForest 超越,我不会用它来预测任何东西,但是通过绘制和查看这棵树中的分裂,结合.feature_importances_森林,我通常对大局有一个很好的了解。

【讨论】:

  • 谢谢你,它有帮助 - 我现在可以看到如何从随机森林的结果中直接提取我正在寻找的信息(一种“超级树”)是不可能的- 但是您关于拟合单个决策树的建议提供了实现该结果的间接方法 - 所以我会尝试一下 - 非常感谢!
猜你喜欢
  • 2014-06-14
  • 2015-03-16
  • 2021-06-24
  • 1970-01-01
  • 2020-03-23
  • 2018-03-27
  • 2011-04-28
  • 2021-06-17
  • 2020-08-29
相关资源
最近更新 更多