Scikit-Learn RandomforestClassifier中的子样本大小



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

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

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

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-1/e)样品来构建每个树。

您实际上可以修改 _generate_sample_indices 在forest.py中的功能,每次更改子样本的大小,谢谢 fastai lib以实现Afunction 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))

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

在版本0.22中,Scikit添加了可以调节的参数max_samples

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.randomforestclassifier.html

最新更新