了解 RandomForestRegressor 中的 max_features 参数
Posted
技术标签:
【中文标题】了解 RandomForestRegressor 中的 max_features 参数【英文标题】:Understanding max_features parameter in RandomForestRegressor 【发布时间】:2014-07-19 08:05:33 【问题描述】:在使用自举样本构建随机森林中的每棵树时,对于每个终端节点,我们从 p 个变量中随机选择 m 个变量以找到最佳分割(p 是数据中的特征总数)。我的问题(针对 RandomForestRegressor)是:
1) max_features 对应什么(m 或 p 或其他)?
2) 是从max_features变量中随机选择m个变量(m的值是多少)?
3) 如果 max_features 对应于 m,那么我为什么要将它设置为等于 p 以进行回归(默认)?这个设置的随机性在哪里(即,它与 bagging 有什么不同)?
谢谢。
【问题讨论】:
【参考方案1】:直接来自documentation:
[
max_features
] 是分割节点时要考虑的随机特征子集的大小。
所以max_features
就是你所说的m。当max_features="auto"
,m = p 并且树中没有进行特征子集选择,所以“随机森林”实际上是普通回归树的bagged ensemble。文档继续说
经验良好的默认值是
max_features=n_features
用于回归问题,max_features=sqrt(n_features)
用于分类任务
通过不同地设置max_features
,您将获得一个“真正的”随机森林。
【讨论】:
那么为什么他们声称“经验良好的默认值是回归问题的 max_features=n_features”?正如您所说,这只是装袋-随机森林不应该比装袋更好吗? @csankar69:我不是回归树方面的专家。我确实在 RF 上工作,因为我使用它们进行分类,我可以向你保证,它们的作者在这些问题上是知识渊博的。在任何情况下,您都可以自己检查属性装袋是否有助于解决您的问题。 我 95% 确定回归的 max_features=n_features 是 scikit 的一个错误。 RF 的原始论文给出了回归的 max_features = n_features/3。使用前者甚至没有意义,它甚至不是射频。 感谢@UlysseMizrah 的评论! The Wikipedia article 参考 The Elements of Statistical Learning: 2nd Edition(Hastie et. al. 2009, p. 592),其中报告说原作者推荐 n_features / 3。我想我会发布这些额外的参考,以防万一有人感兴趣。max_features=n_features
是否具有良好默认值的问题在stats.stackexchange.com/q/324370/295421 和github.com/scikit-learn/scikit-learn/issues/7254 上进行了深入讨论【参考方案2】:
@lynnyi,max_features 是在每个拆分级别而不是在整个决策树构造上考虑的特征数量。更清楚一点,在每个决策树的构建过程中,RF 仍然会使用所有的特征(n_features),但它只考虑“max_features”特征的数量进行节点分裂。并且“max_features”特征是从整个特征中随机选择的。您可以通过在 max_features=1 的 RF 中绘制一棵决策树来确认这一点,并检查该树的所有节点以计算所涉及的特征数量。
【讨论】:
这更像是对另一条评论的评论,而不是对问题的回答。 抱歉,我现在只有不到 50 个声望可以发表评论。 等一下,随机森林中的每棵树实际上都使用了所有特征,但是在每个节点上随机选择它们的子集?还是每棵树都采用特征子集并从那里获得每个节点的 max_features? @Ambleu,“随机森林中的每棵树实际上都使用了所有特征,但是在每个节点上随机选择它们的子集”是正确的。【参考方案3】:max_features 基本上是随机选择的特征数量,并且在拆分时没有替换。假设您有 10 个独立的列或特征,那么 max_features=5 将在每次拆分时随机选择 5 个特征且不替换。
【讨论】:
以上是关于了解 RandomForestRegressor 中的 max_features 参数的主要内容,如果未能解决你的问题,请参考以下文章
将 GridSearchCV 用于 RandomForestRegressor
sklearn 中的 RandomForestRegressor 给出负分
RandomForestRegressor 和 feature_importances_ 错误