如何将 RandomForest 折叠成等效的决策树?
How to collapse a RandomForest into an equivalent decision tree?
按照我的理解,在创建随机森林时,该算法将一堆随机生成的决策树捆绑在一起,对它们进行加权,使其适合训练数据。
是否可以将森林的平均值简化为简单的决策树?而且,如果是这样 - 我如何访问和展示这棵树?
我在这里要做的是提取树中的信息,以帮助识别主要属性、它们的边界值和树中的位置。我假设这样一棵树可以让人类(或计算机启发式)了解数据集中的哪些属性最能洞察确定目标结果。
这可能看起来是一个幼稚的问题 - 如果是这样,请耐心等待,我是新手,想进入一个我充分理解它的阶段。
RandomForest 使用 bootstrap 通过对数据进行替换抽样(bagging)来创建许多训练集。每个 bootstrapped 集都非常接近原始数据,但略有不同,因为它可能有一些点的倍数,而原始数据中的其他一些点将丢失。 (这有助于创建一大堆相似但不同的集合,作为一个整体代表您的数据来自的人口,并允许更好的概括)
然后它为每个集合拟合一个决策树。然而,常规决策树在每一步所做的是遍历每个特征,为每个特征找到最佳分割,最后选择在产生最佳特征的特征中进行分割。在 RandomForest 中,不是遍历每个特征来找到最佳分割,而是 在每个步骤尝试随机子样本(默认为 sqrt(n_features))。
因此,RandomForest 中的每棵树都适合 bootstrapped 随机训练集。在每个分支步骤中,它只查看特征的子样本,因此某些分支会很好,但不一定是理想的拆分。这意味着每棵树都不太适合原始数据。但是,当您对所有这些(次理想的)树的结果进行平均时,您会得到一个可靠的预测。常规 DecisionTrees 过度拟合数据,这种双向随机化(装袋和特征二次抽样)允许它们泛化并且森林通常做得很好。
问题在于:虽然您可以对每棵树的输出进行平均,但您无法真正"average the trees" 获得"average tree"。由于树是一堆链接起来的 if-then 语句,因此无法采用这些链并得出一个产生与每个链的平均结果相同的结果的链。森林中的每棵树都是不同的,即使出现相同的特征,它们也会出现在树木的不同地方,无法组合。您不能将 RandomForest 表示为一棵树。
您可以做两件事。
1) 正如 RPresle 提到的,您可以查看 .feature_importances_
属性,它针对每个特征平均来自不同树的分裂分数。这个想法是,虽然你不能得到一棵平均树,但你可以通过平均每个特征在每棵树中的分数来量化森林中每个特征的使用量和效率。
2) 当我拟合一个 RandomForest 模型并需要深入了解正在发生的事情,这些特征如何影响结果时,我也会拟合一个决策树。现在,这个模型本身通常一点也不好,它很容易被 RandomForest 超越,我不会用它来预测任何东西,而是通过绘制和查看这棵树中的分裂,结合 .feature_importances_
森林,我通常对大局有很好的了解。
按照我的理解,在创建随机森林时,该算法将一堆随机生成的决策树捆绑在一起,对它们进行加权,使其适合训练数据。
是否可以将森林的平均值简化为简单的决策树?而且,如果是这样 - 我如何访问和展示这棵树?
我在这里要做的是提取树中的信息,以帮助识别主要属性、它们的边界值和树中的位置。我假设这样一棵树可以让人类(或计算机启发式)了解数据集中的哪些属性最能洞察确定目标结果。
这可能看起来是一个幼稚的问题 - 如果是这样,请耐心等待,我是新手,想进入一个我充分理解它的阶段。
RandomForest 使用 bootstrap 通过对数据进行替换抽样(bagging)来创建许多训练集。每个 bootstrapped 集都非常接近原始数据,但略有不同,因为它可能有一些点的倍数,而原始数据中的其他一些点将丢失。 (这有助于创建一大堆相似但不同的集合,作为一个整体代表您的数据来自的人口,并允许更好的概括)
然后它为每个集合拟合一个决策树。然而,常规决策树在每一步所做的是遍历每个特征,为每个特征找到最佳分割,最后选择在产生最佳特征的特征中进行分割。在 RandomForest 中,不是遍历每个特征来找到最佳分割,而是 在每个步骤尝试随机子样本(默认为 sqrt(n_features))。
因此,RandomForest 中的每棵树都适合 bootstrapped 随机训练集。在每个分支步骤中,它只查看特征的子样本,因此某些分支会很好,但不一定是理想的拆分。这意味着每棵树都不太适合原始数据。但是,当您对所有这些(次理想的)树的结果进行平均时,您会得到一个可靠的预测。常规 DecisionTrees 过度拟合数据,这种双向随机化(装袋和特征二次抽样)允许它们泛化并且森林通常做得很好。
问题在于:虽然您可以对每棵树的输出进行平均,但您无法真正"average the trees" 获得"average tree"。由于树是一堆链接起来的 if-then 语句,因此无法采用这些链并得出一个产生与每个链的平均结果相同的结果的链。森林中的每棵树都是不同的,即使出现相同的特征,它们也会出现在树木的不同地方,无法组合。您不能将 RandomForest 表示为一棵树。
您可以做两件事。
1) 正如 RPresle 提到的,您可以查看 .feature_importances_
属性,它针对每个特征平均来自不同树的分裂分数。这个想法是,虽然你不能得到一棵平均树,但你可以通过平均每个特征在每棵树中的分数来量化森林中每个特征的使用量和效率。
2) 当我拟合一个 RandomForest 模型并需要深入了解正在发生的事情,这些特征如何影响结果时,我也会拟合一个决策树。现在,这个模型本身通常一点也不好,它很容易被 RandomForest 超越,我不会用它来预测任何东西,而是通过绘制和查看这棵树中的分裂,结合 .feature_importances_
森林,我通常对大局有很好的了解。