在 SciKit-Learn Random Forest classifier 的文档中,指出
子样本大小始终与原始输入样本大小相同,但如果 bootstrap=True(默认),则使用替换绘制样本。
我不明白的是,如果样本量总是与输入样本量相同,那么我们怎么能谈论随机选择。这里没有选择,因为我们在每次训练中使用所有(自然是相同的)样本。
我在这里错过了什么吗?
在 SciKit-Learn Random Forest classifier 的文档中,指出
子样本大小始终与原始输入样本大小相同,但如果 bootstrap=True(默认),则使用替换绘制样本。
我不明白的是,如果样本量总是与输入样本量相同,那么我们怎么能谈论随机选择。这里没有选择,因为我们在每次训练中使用所有(自然是相同的)样本。
我在这里错过了什么吗?
我相信这部分文档回答了你的问题
在随机森林中(参见 RandomForestClassifier 和 RandomForestRegressor 类),集成中的每棵树都是从训练集中的替换样本(即引导样本)中构建的。此外,在树的构建过程中拆分节点时,选择的拆分不再是所有特征中最好的拆分。相反,选择的分割是特征的随机子集之间的最佳分割。由于这种随机性,森林的偏差通常会略微增加(相对于单个非随机树的偏差),但由于平均化,它的方差也会降低,通常超过补偿偏差的增加,因此产生了一个整体更好的模型。
理解的关键在于“用替换抽取的样本”。这意味着可以多次绘制每个实例。这反过来意味着,训练集中的某些实例多次出现,而有些则根本不存在(袋外)。对于不同的树,这些是不同的
当然,并不是每棵树都选择了所有样本。默认情况下,每个样本有 1-((N-1)/N)^N~0.63 的机会被一棵特定的树抽样,0.63^2 被抽样两次,0.63^3 被抽样 3 次......其中 N 是训练集的样本大小。
每个 bootstrap 样本选择在平均上与其他 bootstrap 有足够的不同,因此决策树有足够的不同,因此树的平均预测对每个树模型的方差是稳健的。如果样本大小可以增加到训练集大小的 5 倍以上,那么每个观察结果可能会在每棵树中出现 3-7 次,并且整体集成预测性能会受到影响。
@communitywiki 的答案错过了这个问题:“我不明白的是,如果样本量总是与输入样本量相同,那么我们怎么能谈论随机选择”:这与自举的性质有关本身。Bootstrapping 包括在不同时间重复相同的值,但仍具有与原始数据相同的样本大小:示例(由Bootstrapping/Approach 的wiki页面提供):
原始样本:[1,2,3,4,5]
Boostrap 1:[1,2,4,4,1]
引导程序 2:[1,1,3,3,5]
等等。
这就是随机选择发生的方式,并且样本量仍然可以保持不变。
虽然我对 python 很陌生,但我遇到了类似的问题。
我试图将 RandomForestClassifier 拟合到我的数据中。我将数据分成训练和测试:
train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size=0.2, random_state=0)
DF 的长度是相同的,但在我预测模型之后:
rfc_pred = rf_mod.predict(test_x)
结果有不同的长度。
为了解决这个问题,我将引导选项设置为 false:
param_grid = {
'bootstrap': [False],
'max_depth': [110, 150, 200],
'max_features': [3, 5],
'min_samples_leaf': [1, 3],
'min_samples_split': [6, 8],
'n_estimators': [100, 200]
}
并重新运行该过程。它工作得很好,我可以计算我的混淆矩阵。但我想了解如何使用引导程序并生成具有相同长度的预测数据。