如何在 scikit-learn 中控制随机森林中的特征子集?
Posted
技术标签:
【中文标题】如何在 scikit-learn 中控制随机森林中的特征子集?【英文标题】:How to control feature subsetting in random forest in scikit-learn? 【发布时间】:2015-09-20 05:02:04 【问题描述】:我正在尝试改变随机森林算法在每个节点的子集特征中使用的方式。以 Scikit-learn 方式实现的原始算法是随机子集。我想从几个子集的几个选择中定义每个新节点的子集。 scikit-learn 中是否有直接的方法来控制这种方法?如果没有,有没有办法更新 Scikit-learn 的相同代码?如果是,您认为应该更新源代码中的哪个功能?
【问题讨论】:
【参考方案1】:短版:这就是你的全部。
我假设“每个节点的子集特征”是指随机选择样本子集以及可能用于训练森林中单个树木的特征。如果这就是您的意思,那么您不是在构建随机森林;而是在构建随机森林。你想创建一个由特定树木组成的非随机森林。
一种方法是使用您仔细指定的功能子集单独构建每个DecisionTreeClassifier
,然后使用VotingClassifier
将树木组合成森林。 (该功能仅在 0.17/dev 中可用,因此您可能必须自己构建,但构建投票分类器估计器类非常简单。)
【讨论】:
亲爱的 Andreus,非常感谢您的宝贵时间和回答。也许我的问题不是很清楚。让我解释一下。我想要的控件在节点级别,而不是在树级别。您的建议是在树的级别上。我想要的是在随机森林中发生的完全相同的事情,其中特征的子集是在森林中每棵树的每个节点的级别执行的。您提到的区别:原始RF随机子集,我要求的不是随机子集。但是,这两种解决方案仍然使用随机重新采样的数据。谢谢。 sklearn 有两个不同的随机森林。 RandomForestClassifier 不使用随机分割;它使用criterion
算法根据最大信息增益决定拆分,就像每个决策树一样。 ExtraTreesClassifier 确实在拆分中使用了一些随机性。如果你想手动控制每个节点发生的事情,也就是你自己。
亲爱的 Andreus,再次感谢您的宝贵时间。我完全同意你关于分裂点的看法。我所说的是特征的子集。每个节点的随机森林,(1)随机选择特征子集(我的问题关注),然后(2)根据基尼杂质或信息增益(您的评论点)进行拆分。但是,这两个动作都在节点级别。所以正如你所说,我必须从头开始。您的意思是为决策树构建新类还是您建议我可以在哪里编辑 Scikit-learn 代码的可能方式?谢谢。以上是关于如何在 scikit-learn 中控制随机森林中的特征子集?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?
如何在 scikit-learn 中执行随机森林模型的交叉验证?
如何在 scikit-learn 的随机森林的 graphviz-graph 中找到一个类?