
该问题源于训练-测试数据划分未在每次bootstrap迭代中基于重采样数据执行,导致模型始终在原始固定数据上训练和评估,若原始标签分布单一或存在数据泄露,将产生虚假的100%指标。
该问题源于训练-测试数据划分未在每次bootstrap迭代中基于重采样数据执行,导致模型始终在原始固定数据上训练和评估,若原始标签分布单一或存在数据泄露,将产生虚假的100%指标。
在使用Bootstrap评估分类器性能时,一个常见但隐蔽的错误是混淆了重采样目标与实际建模数据。你提供的代码中,核心问题在于:
chosen_rows = np.random.choice(numb_rows, replace=True, size=numb_rows) bootstrap_sample = data.iloc[chosen_rows] # ← 此样本未被用于后续建模! ... X_train, X_test, Y_train, Y_test = train_test_split(x, y, test_size=0.2, random_state=1) # ← 仍用原始x/y!
✅ 关键错误:bootstrap_sample 被生成却未参与模型训练;train_test_split 始终对原始 x 和 y 划分——这意味着每次循环都在同一份静态数据上重复训练和测试。若原始 y 标签高度不平衡(如全为同一类)、或模型在该固定数据集上过拟合(如决策树未剪枝且样本量小),就极易输出 precision=recall=f1=1.0。
? 正确做法:Bootstrap的核心是「对观测单元(样本行)重采样 → 在重采样子集上完整拟合并评估模型」。因此,x 和 y 必须同步从 bootstrap_sample 中提取,并确保 train_test_split 作用于该重采样数据:
for k in range(Nboot):
# 1. 重采样原始数据索引(假设data包含x和y)
chosen_rows = np.random.choice(len(data), replace=True, size=len(data))
bootstrap_sample = data.iloc[chosen_rows].copy()
# 2. 从重采样数据中分离特征与标签(需确保data结构合理)
X_boot = bootstrap_sample.drop(columns=['target']).values # 替换'target'为你的标签列名
y_boot = bootstrap_sample['target'].values
# 3. 在重采样数据上划分训练/测试集(注意:test_size应适中,避免过小导致评估不稳定)
X_train, X_test, Y_train, Y_test = train_test_split(
X_boot, y_boot, test_size=0.2, random_state=42 + k # 每次random_state不同,避免重复划分
)
# 4. 训练、预测、评估(保持average="macro"一致性)
model = DecisionTreeClassifier(random_state=42 + k).fit(X_train, Y_train)
y_pred = model.predict(X_test)
precision.append(metrics.precision_score(Y_test, y_pred, average="macro", zero_division=0))
recall.append(metrics.recall_score(Y_test, y_pred, average="macro", zero_division=0))
f1.append(metrics.f1_score(Y_test, y_pred, average="macro", zero_division=0))
models.append(model)⚠️ 必须检查的前置条件:
- y 必须作为函数参数显式传入(原代码缺失),且不能是常量数组(如 np.ones(n));
- data 需包含完整特征+标签,或确保 x/y 与 bootstrap_sample 行索引严格对齐;
- 若 y 中某类在某个 Bootstrap 子集中完全缺失,precision_score 等会报 UndefinedMetricWarning;建议添加 zero_division=0 参数避免中断;
- random_state 在 train_test_split 中不应固定为 1(否则每次划分完全相同),应随循环变化(如 42 + k)或设为 None。
? 总结:Bootstrap评估的有效性依赖于「每次迭代独立重采样→独立建模→独立评估」的闭环。任何跳过重采样数据、复用原始数据的行为,都会使指标失去统计意义。调试时,可打印 np.unique(y_boot) 和 len(Y_train), len(Y_test) 验证每次迭代的数据多样性。


















