使用ranger分类森林时低sample.fraction下预测概率恒为0.5的原因
问题原因分析
这个现象是训练集类别绝对平衡+纯噪声协变量+随机森林采样/分裂机制共同作用的结果,具体拆解如下:
1. 分层采样让每棵树的训练集类别完全对等
你的代码里,sample.fraction = c(5/65, 5/65) 搭配 replace=TRUE,会触发ranger的分层有放回采样逻辑:
- 总样本数为65,每个类别的采样数量为
65 × 样本比例,也就是类别0和类别1各抽取5个样本。 - 类别0原始只有5个样本,因此是有放回重复抽取这5个样本;类别1从60个样本中有放回抽取5个。
- 最终每棵树的训练集都是5个类别0 + 5个类别1,两类数量完全相等。
2. 纯噪声协变量无法提供有效分裂信号
你用的noise是和响应变量完全无关的随机噪声,因此:
- 任何基于
noise的分裂都无法降低节点的不纯度(比如Gini系数),只能产生无意义的随机分裂。 - 结合ranger默认的
min.node.size=5(分类问题的最小叶子节点大小),10个样本的训练集最多只能分裂成两个各含5个样本的叶子节点。而随机分裂噪声变量后,两个叶子节点的类别比例会呈现对称分布(比如一组2个0+3个1,另一组3个0+2个1),单棵树对任意样本的预测概率平均仍为0.5。
3. 多棵树的预测平均后保持精确0.5
由于每棵树的训练集结构完全对称,分裂结果的类别比例也对称,150棵树的预测概率会以0.5为中心严格对称分布。最终所有袋外样本的预测概率平均后,精确等于0.5,没有任何波动。
为什么调整后预测值脱离精确0.5?
情况1:数据量翻倍(df2)
- 总样本数变为130,采样数量为
130×(5/65)=10,每棵树的训练集是10个类别0 + 10个类别1。 - 此时分裂后的叶子节点类别比例不再严格对称(比如一组4个0+6个1,另一组6个0+4个1;或者3个0+7个1,另一组7个0+3个1等),不同树的预测概率会出现非对称的微小差异。
- 多棵树的预测平均后,结果会在0.5附近波动,而非精确等于0.5。
情况2:调整sample.fraction至6/65
- 采样数量变为
65×(6/65)=6,类别0需要从5个原始样本中有放回抽取6个(会出现重复样本),类别1抽取6个。 - 此时训练集的类别平衡被打破(虽然数量都是6,但类别0的样本是重复抽取的,噪声分裂后的叶子节点比例不再对称),单棵树的预测概率会偏离0.5,最终森林的平均结果也会波动。
内容的提问来源于stack exchange,提问作者cmac
相关产品推荐
相关产品推荐

