我一直在优化从 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的数据集。是不是因为我的训练阶段缺乏数据,所以禁用引导程序会给我带来更好的结果?