使用sklearn做逻辑回归时调用accuracy_score报样本数不一致错误如何解决
错误原因
该报错和train_test_split按50%比例拆分样本无关,18151是奇数,拆分后训练集9075条、测试集9076条属于正常逻辑。
报错的核心原因是你计算准确率时传入的两组数据样本量不匹配:
- 传入
accuracy_score的第一个参数是y2_test,对应测试集标签,共9076条 - 第二个参数是
select.estimator_.predict(X2_train),是训练集特征的预测结果,共9075条
两组数据数量不一致,自然触发样本量校验报错。
修复方案
根据你要计算的准确率类型,统一传入同一数据集的特征和标签即可:
方案1:计算训练集准确率
将标签替换为训练集对应的y2_train:
print("训练集准确率 {0:2%}".format(accuracy_score(y2_train, select.estimator_.predict(X2_train))))
方案2:计算测试集准确率(更推荐,用于评估模型泛化能力)
将预测用的特征替换为测试集对应的X2_test:
print("测试集准确率 {0:2%}".format(accuracy_score(y2_test, select.estimator_.predict(X2_test))))
额外优化建议
- 定义
y2时不需要用reshape(-1,1)转为二维数组,scikit-learn分类器的标签参数默认接收一维数组,二维格式可能触发额外警告,可直接写为y2=df["diab_inc"].values。 - 若你使用
SelectFromModel的目的是筛选重要特征,建议用select.transform(X2_train)提取筛选后的特征重新训练模型,当前直接调用estimator_得到的是全量特征训练的结果,和特征选择的目标不符。
内容的提问来源于stack exchange,提问作者Víctor de la O Pascual
相关产品推荐
相关产品推荐

