R语言验证身高80分位与篮球关联时重复抽样准确率一致问题排查
问题原因分析
导致所有轮次准确率完全相同的原因有两点,核心是代码的测试集选取逻辑存在错误:
1. 测试集抽样逻辑bug
你通过as.numeric(rownames(train_i))获取训练集对应的原始行号,但dplyr的sample_frac函数在处理tibble类型数据时,默认不会保留原始数据集的行号,返回的训练集会被重置行号为1~2100(3000条样本的70%)。
这就意味着你每一轮迭代的sid永远是1到2100,对应的测试集test_i永远是原始数据集的第2101~3000行,训练集、分位阈值、测试集每一轮完全相同,准确率自然不会发生变化。
修复方案
替换迭代内的抽样逻辑为基础R的索引抽样即可:
train_idx <- sample(1:nrow(my_data), size = 0.7 * nrow(my_data)) train_i <- my_data[train_idx, ] test_i <- my_data[-train_idx, ]
2. 数据集构造的特殊属性
你构造的数据集三个分组的身高完全没有重叠:
- data3身高范围约为155~185,80%样本标签为不参与篮球运动
- data2身高范围约为187~193,80%样本标签为参与篮球运动
- data1身高范围约为195~225,80%样本标签为参与篮球运动
这种完全分离的身高分布,会导致不管怎么随机抽取训练集,计算得到的80%分位阈值永远落在193~195的区间内,刚好区分data1和剩下的两组。就算你修复了抽样bug,多轮迭代的准确率波动也会非常小。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

