SciKit-Learn 随机森林子样本大小如何可能等于原始训练数据大小?
Posted
技术标签:
【中文标题】SciKit-Learn 随机森林子样本大小如何可能等于原始训练数据大小?【英文标题】:How can SciKit-Learn Random Forest sub sample size may be equal to original training data size? 【发布时间】:2016-06-20 00:59:42 【问题描述】:在 SciKit-Learn Random Forest classifier 的文档中,声明了
子样本大小始终与原始输入样本大小相同,但如果 bootstrap=True(默认),则使用替换抽取样本。
我不明白的是,如果样本大小总是与输入样本大小相同,那么我们怎么能谈论随机选择。这里没有选择,因为我们在每次训练中都使用了所有(并且自然是相同的)样本。
我错过了什么吗?
【问题讨论】:
【参考方案1】:我相信this part of docs 回答了您的问题
在随机森林中(参见 RandomForestClassifier 和 RandomForestRegressor 类),构建集成中的每棵树 来自替换抽取的样本(即自举样本) 训练集。 另外,在分割节点时 树的构造,选择的分裂不再是 所有特征之间的最佳分割。相反,选择的拆分是 特征的随机子集之间的最佳分割。后果 这种随机性,森林的偏差通常会略微增加 (关于单个非随机树的偏差)但是,由于 平均,它的方差也减少了,通常超过补偿 为了增加偏差,从而产生一个整体更好的模型。
理解的关键在于“采样with replacement”。这意味着每个实例可以被多次绘制。这反过来意味着,训练集中的某些实例多次出现,而有些则根本不存在(袋外)。对于不同的树,这些是不同的
【讨论】:
这部分没问题,据说特征是在构造单个树的每个分割时随机选择的。但是,我想知道的是,用于训练每棵不同树的观察集(换句话说,矩阵“X”)之间是否存在差异(我不是指在单个树中分裂)。 目前还不清楚 - '样本大小与输入样本大小相同'这是否意味着每个决策树的样本大小 == 训练实例的总数?如果是这样,则意味着您每次都在选择整个训练集。【参考方案2】:当然,并不是每棵树都选择了所有样本。默认情况下,每个样本有 1-((N-1)/N)^N~0.63 的机会被一棵特定的树抽样,0.63^2 被抽样两次,0.63^3 被抽样 3 次......其中N是训练集的样本量。
平均而言,每个 bootstrap 样本选择都与其他 bootstrap 足够不同,因此决策树有足够的差异,因此树的平均预测对每个树模型的方差具有稳健性。如果样本大小可以增加到训练集大小的 5 倍以上,那么每个观察结果可能会在每棵树中出现 3-7 次,并且整体集成预测性能会受到影响。
【讨论】:
【参考方案3】:@communitywiki 的答案错过了这个问题:“我不明白的是,如果样本量始终与输入样本量相同,那么我们怎么能谈论随机选择”:它与自举本身的性质。 Bootstrapping 包括在不同时间重复相同的值,但仍具有与原始数据相同的样本大小:示例(由 Bootstrapping/Approach 的 wiki page 提供):
原始样本:[1,2,3,4,5]
Boostrap 1:[1,2,4,4,1]
引导程序 2:[1,1,3,3,5]
等等。
这就是随机选择发生的方式,而样本量仍然可以保持不变。
【讨论】:
【参考方案4】:虽然我对 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]
然后重新运行该过程。它工作得很好,我可以计算我的混淆矩阵。但我想了解如何使用引导程序并生成具有相同长度的预测数据。
【讨论】:
以上是关于SciKit-Learn 随机森林子样本大小如何可能等于原始训练数据大小?的主要内容,如果未能解决你的问题,请参考以下文章
scikit-learn RandomForestClassifier 中的子样本大小
Scikit-learn 随机森林 out of bag 样本