在 sklearn.RandomForestClassifier 中不使用引导时会发生什么?

机器算法验证 机器学习 Python 随机森林 scikit-学习
2022-03-20 19:02:40

我一直在优化从 sklearn 实现构建的随机森林模型。此随机森林实现中的参数之一允许您设置 Bootstrap = True/False。在将我的模型的超参数调整到我的数据集时,随机搜索和遗传算法都一致地发现,设置 bootstrap=False 会产生更好的模型准确度增加 >1%)。我在最后使用 3-fold CV 和一个单独的测试集来确认所有这些。调整后的模型始终让我达到约 98% 的准确率。数据集有几千个示例,分为两个类。

我的问题是:如果关闭引导程序,随机森林是否仍然是随机的?我认为随机森林的整个前提是,与单个决策树(随着它的增长而看到整个数据集)不同,RF 随机划分原始数据集并在几个决策树中划分分区。如果 bootstrapping 被关闭,那是不是意味着你只有n 个决策树从同一个原始数据语料库中生长出来?或者当引导关闭时,数据集被均匀地分成n个分区并以非随机的方式分布到n棵树?

此外,从算法中去除随机性的主要前提会提高准确性是没有意义的。


注意:使用随机数据集进行了快速测试,设置 bootstrap = False 再次获得了更好的结果。

from sklearn.ensemble import RandomForestClassifier as rfc
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(n_samples=10000, n_features=4000, n_informative=3000, n_redundant=600, random_state=0, shuffle=True)
X_train, X_test, y_train, y_test = train_test_split(X, y)

clf_True = rfc(bootstrap=True, random_state=0)
clf_False = rfc(bootstrap=False, random_state=0)

clf_True.fit(X_train, y_train)
clf_False.fit(X_train, y_train)

scoreTrue = clf_True.score(X_test, y_test)
scoreFalse = clf_False.score(X_test, y_test)

>>>scoreTrue =  0.5232; scoreFalse = 0.5336

引擎盖下发生了什么?

编辑:我在上面的这个示例脚本中增加了特征的数量,因为在我正在使用的数据集(大型文本语料库)中,我有数十万个独特的术语,只有几千个训练/测试实例。我相信引导从训练阶段省略了大约 1/3的数据集。是不是因为我的训练阶段缺乏数据,所以禁用引导程序会给我带来更好的结果?

1个回答

我的问题是:如果关闭引导程序,随机森林是否仍然是随机的?

是的,它仍然是随机的。在没有引导的情况下,所有数据都用于拟合模型,因此对于每个阶段的所选示例,树之间没有随机变化。然而,随机森林有第二个变异来源,即在每次拆分时尝试的随机特征子集。

我认为随机森林的整个前提是,与单个决策树(随着它的增长而看到整个数据集)不同,RF 随机划分原始数据集并在几个决策树中划分分区。

这是不正确的。随机森林s 每棵树的数据,然后生成一棵决策树,该决策树在每次拆分时只能使用随机的特征子集。文档指出“子样本大小始终与原始输入样本大小相同,但如果 bootstrap=True(默认),则抽取样本以替换”,这意味着bootstrap=False抽取的样本大小等于训练示例的数量无需替换,即始终使用相同的训练集。

有关随机森林过程及其统计特性的详细说明,请参见 Leo Breiman,“随机森林”,机器学习第 45 卷第 1 期(2001 年)以及 Hastie 等人的相关章节,统计学习要素

sklearn如果我们检查源代码,我们可以验证这种行为在实现中具体存在,这表明原始数据在以下情况下没有进一步改变。bootstrap=False

    if forest.bootstrap:
      ...irrelevant...
    elif class_weight == 'balanced_subsample':
      ...irrelevant...
    else:
      tree.fit(X, y, sample_weight=sample_weight, check_input=False)

如果 bootstrapping 被关闭,那是不是意味着你只有 n 个决策树从同一个原始数据语料库中生长出来?

是的,需要理解的是,每次拆分只能选择随机的特征子样本。在 sklearn 中,随机森林被实现为一个或多个实例的集合sklearn.tree.DecisionTreeClassifier,它实现了随机特征子采样。

或者当引导关闭时,数据集被均匀地分成n个分区并以非随机的方式分布到n棵树?

不。