scikit-learn模型score方法报1D数组预期2D数组的ValueError问题
报错触发原因
这个报错和你观察到的“两个待比对数组形状一致、元素总数相同”完全无关,核心触发点是你调用scikit-learn决策树模型dtc.score()方法时,传参顺序和传参内容完全不符合方法的定义规则:
- scikit-learn框架下所有带预测功能的模型,自带的
.score()方法有固定的入参规范:- 第一个位置参数:必须传入测试用的特征矩阵
X_test,结构要求是二维,形状为(测试样本量,特征维度) - 第二个位置参数:传入对应测试样本的真实标签
y_test
- 第一个位置参数:必须传入测试用的特征矩阵
- 你当前写的调用代码是
dtc.score(y_test, y_pred_dtr),完全打乱了这个规范:- 你把本来要作为真实标签传入的
y_test(长度200的一维标签数组),塞到了第一个参数的“测试特征矩阵”位置。方法内部做维度校验时,发现第一个参数是一维结构,不符合二维特征矩阵的要求,就抛出了引导你做reshape的提示——这不是你的y数据需要重塑,是传错了位置。 - 你传入的第二个参数
y_pred_dtr(模型的预测标签)根本不是score方法需要的入参:score方法内部会基于第一个参数传入的X_test,自动跑一遍预测流程生成预测值,再和第二个参数的真实值比对算分,你手动把预测值传进去完全是逻辑错配。
- 你把本来要作为真实标签传入的
可落地解决方法
- 修正
.score()的调用参数顺序:把之前建模流程中留存的测试特征矩阵X_test作为第一个入参传入,第二个入参传真实标签y_test,不需要对任何标签数组做reshape。正确调用示例:# 标准调用格式:模型.score(测试特征矩阵, 测试真实标签) test_accuracy = dtc.score(X_test, y_test) - 如果你只是想手动比对两组标签的准确率,不需要调用模型的score方法,直接用NumPy逐元素比对计算即可,完全兼容一维标签结构,不会触发维度校验:
# 逐元素比对结果一致的比例即为预测准确率 accuracy = (y_test == y_pred_dtr).mean() - 避坑提示:不要按照报错提示硬给你的标签数组做reshape——就算reshape之后能通过维度校验,因为参数位置错配,算出来的准确率是完全错误的,没有参考意义。
内容的提问来源于stack exchange,提问作者user14981754
相关产品推荐
相关产品推荐

