
本文深入剖析在使用bootstrap重采样进行模型评估时,f1分数、精确率和召回率全部输出为1的典型原因,重点指出数据泄露、标签缺失、类别单一等关键陷阱,并提供可复现的修复方案与最佳实践。
本文深入剖析在使用bootstrap重采样进行模型评估时,f1分数、精确率和召回率全部输出为1的典型原因,重点指出数据泄露、标签缺失、类别单一等关键陷阱,并提供可复现的修复方案与最佳实践。
在Bootstrap循环中所有指标(Precision、Recall、F1)恒为1,根本原因通常不是算法本身出错,而是评估流程存在严重逻辑缺陷——最常见的是:模型始终在原始全量数据上训练与测试,而非基于每次Bootstrap生成的独立样本。
观察原代码可发现多个关键问题:
? y 未作为参数传入函数
函数签名 def bootstrap(x, Nboot): 缺失 y,导致内部 y 变量依赖全局作用域。若全局 y 是常量(如全为0或全为1)、或长度与 x 不匹配,train_test_split 可能静默失败或产生退化标签分布,最终使预测结果与真实标签完全一致(例如所有样本都被预测为唯一存在的类别),从而导致 precision_score 等返回 1.0。
? bootstrap_sample 被计算却未使用
代码中生成了 bootstrap_sample = data.iloc[chosen_rows],但后续 train_test_split(x, y, ...) 仍使用原始 x 和 y,完全绕过了Bootstrap的核心思想:在重采样数据上拟合模型。这使得每次迭代训练的模型都相同,测试集也固定,丧失了统计估计意义。
? random_state=1 固定导致每次分割完全一致
在循环内反复调用 train_test_split(..., random_state=1),会使每次划分的训练/测试集完全相同,进一步加剧结果重复性。Bootstrap要求每次迭代使用独立随机划分,random_state 应设为 None 或动态变化(如 random_state=k)。
✅ 正确做法是:对每次Bootstrap迭代,先从原始数据中重采样(含特征 X 和标签 y),再在此子集上划分训练/测试并训练模型。以下是修正后的健壮实现:
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import precision_score, recall_score, f1_score
import pandas as pd
import numpy as np
def bootstrap(X, y, Nboot, test_size=0.2, random_state=None):
"""
对分类器进行Bootstrap评估:每轮重采样原始数据,划分训练/测试,训练模型并计算指标。
Parameters:
-----------
X : array-like, shape (n_samples, n_features)
特征矩阵
y : array-like, shape (n_samples,)
标签向量(必须包含至少2个类别)
Nboot : int
Bootstrap迭代次数
test_size : float, default=0.2
测试集比例
random_state : int or None, default=None
全局随机种子(影响重采样),各次train_test_split使用不同seed
Returns:
--------
pd.DataFrame: 包含Precision, Recall, F1, Models列的结果表
"""
X, y = np.asarray(X), np.asarray(y)
if len(np.unique(y)) <p>⚠️ 关键注意事项:</p>
- 务必验证 y 的类别多样性:运行 np.unique(y, return_counts=True),确认至少有两个类别且分布合理;
- 禁用全局变量依赖:所有输入(X, y, Nboot)必须显式传参,避免隐式状态;
- 慎用 average="macro":当某类样本极少时可能触发 undefined metric,建议添加 zero_division=0 参数;
- stratify=y_boot 很重要:防止重采样后某类样本消失,导致 train_test_split 报错或指标计算异常;
- 若仍得全1结果,请检查 y_pred 与 y_test 是否完全相等(np.array_equal(y_pred, y_test)),这直接暴露了标签退化或模型过拟合问题。
通过严格遵循“重采样→划分→训练→评估”的闭环流程,并消除全局变量与固定随机种子的干扰,即可获得真实反映模型稳定性的Bootstrap性能分布。











