逻辑回归交叉验证精度差异显著,多数折叠精度异常达100%求助
逻辑回归交叉验证异常问题排查
问题背景
我在进行逻辑回归交叉验证时遇到异常:前两个折叠的训练、测试精度约为66%(符合预期的60%-70%范围),但其余所有折叠的训练与测试精度均为100%,这显然不符合预期。
我手动划分了训练/验证折叠,所有折叠均使用scikit-learn的LogisticRegression模型训练。已反复检查折叠创建方式与数据处理流程,确认无误;每次训练/评估前都会重新初始化模型,不存在跨折叠迭代优化的情况;各折叠的正负类比例也符合预期。即便训练精度高,也不该出现测试精度100%的情况。
运行代码如下:
results = [] for i in range(len(TRAIN_FOLDS)): # i = 2 train_fp = os.path.join(TRAIN_DIR, TRAIN_FOLDS[i]) val_fp = os.path.join(VAL_DIR, VAL_FOLDS[i]) print("RUNNING:", train_fp) wes_data_train = sc.read_h5ad(train_fp) print("training data shape:", wes_data_train.X.shape) wes_data_val = sc.read_h5ad(val_fp) print("val data shape:", wes_data_val.X.shape) print("proportion responders:", (wes_data_val.obs['response'] == 1).sum() / len(wes_data_val.obs['response'])) # fit and score the data lr = LogisticRegression() lr.fit(wes_data_train.X, wes_data_train.obs['response']) coeff_df = pd.DataFrame(lr.coef_, columns=wes_data_train.var.features) # print("coeffs:", lr.coef_) print("train acc:", lr.score(wes_data_train.X, wes_data_train.obs['response'])) print("test acc:", lr.score(wes_data_val.X, wes_data_val.obs['response']))
各折叠结果显示:前两个折叠精度约66%,其余折叠训练、测试精度均为100%。
可能原因与排查方向
- 数据泄漏问题:
- 检查后续折叠的训练集与验证集是否存在样本重叠。可提取训练集和验证集的样本ID,做交集验证,确认是否有重复样本同时出现在训练和验证文件中。
- 确认数据预处理流程是否合规:是否先划分折叠再单独做标准化/归一化?如果先对全量数据做预处理再划分,后续折叠的验证集会用到训练集的统计信息,甚至直接包含训练数据特征,导致泄漏。
- 数据本身异常:
- 检查后续折叠的特征是否存在与目标变量强关联甚至完全对应的字段。可计算每个特征与
response的相关系数,查看是否有系数接近1或-1的特征。 - 核对后续折叠的验证集样本量:如果样本量极小(比如仅几个样本),模型可能刚好全猜对,出现100%精度。结合代码中打印的
val data shape确认样本数量是否正常。
- 检查后续折叠的特征是否存在与目标变量强关联甚至完全对应的字段。可计算每个特征与
- 模型与标签异常:
- 打印后续折叠的模型系数
lr.coef_,查看是否有特征系数极大,说明模型依赖某个强预测特征(大概率是泄漏特征)。同时检查LogisticRegression的max_iter参数是否足够,确认模型是否真的收敛。 - 重新核对后续折叠的
proportion responders输出,确认正负类比例是否真的符合预期,是否出现验证集全为同一类标签的情况(可能代码计算逻辑有误)。
- 打印后续折叠的模型系数
- 文件读取错误:
- 检查后续折叠的
train_fp和val_fp是否指向错误文件,比如训练集与验证集指向同一文件,或验证集文件是训练集的副本。可手动查看文件路径对应的内容,确认训练、验证数据是否正确。
- 检查后续折叠的
内容的提问来源于stack exchange,提问作者pistachiodesserts
相关产品推荐
相关产品推荐

