scikit-learn RandomForestClassifier 中的子样本大小

Posted

技术标签:

【中文标题】scikit-learn RandomForestClassifier 中的子样本大小【英文标题】:Subsample size in scikit-learn RandomForestClassifier 【发布时间】:2017-04-12 09:05:07 【问题描述】:

如何控制用于训练森林中每棵树的子样本的大小? 根据 scikit-learn 的文档:

随机森林是一种适合多种决策的元估计器 数据集的各种子样本上的树分类器并使用 平均以提高预测精度和控制过拟合。 子样本大小始终与原始输入样本相同 大小,但如果 bootstrap=True,则使用替换绘制样本 (默认)。

所以bootstrap 允许随机性但找不到如何控制子样本的数量。

【问题讨论】:

【参考方案1】:

Scikit-learn 不提供此选项,但您可以通过结合使用树和装袋元分类器的(较慢)版本轻松获得此选项:

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

clf = BaggingClassifier(base_estimator=DecisionTreeClassifier(), max_samples=0.5)

顺便说一句,Breiman 的随机森林确实没有将子样本作为参数,完全依赖于 bootstrap,因此大约 (1 - 1 / e) 的样本用于构建每棵树。

【讨论】:

不要认为是这种情况,因为API 写道:“子样本大小始终与原始输入样本大小相同,但如果引导程序,则使用替换抽取样本=True(默认)”。【参考方案2】:

其实你可以修改forest.py中的_generate_sample_indices函数来改变每次subsample的大小,感谢fastailib实现了一个函数set_rf_samples 为此,它看起来像这样

def set_rf_samples(n):
    """ Changes Scikit learn's random forests to give each tree a random sample of
    n random rows.
    """
    forest._generate_sample_indices = (lambda rs, n_samples:
        forest.check_random_state(rs).randint(0, n_samples, n))

您可以将此功能添加到您的代码中

【讨论】:

答案取自 fast.ai 库。来源 (github.com/fastai/fastai/blob/…)

以上是关于scikit-learn RandomForestClassifier 中的子样本大小的主要内容,如果未能解决你的问题,请参考以下文章

如何从 python 输出 RandomForest 分类器?

scikit-learn随机森林调参小结

转载:scikit-learn随机森林调参小结

使用 scikit-learn 并行生成随机森林

如何在 scikit-learn 的随机森林的 graphviz-graph 中找到一个类?

在 Python Scikit-Learn 中训练测试拆分得分高但 CV 得分低