如何使用SKlearn预测单样本值并解决accuracy_score报错
问题根因
触发ValueError: Found input variables with inconsistent numbers of samples: [4, 1]的直接原因,以及实现逻辑不符合需求的点如下:
metrics.accuracy_score的作用是统计一整个数据集上预测结果和真实标签匹配的样本占比,要求传入的真实标签序列和预测结果序列长度完全相等。你传入的Ytest是拆分得到的测试集标签,共4个样本(对应报错里的数值4),但y_pred是仅对1个新样本做预测得到的长度为1的结果,两个序列长度不匹配必然报错。而且你要的“单条输入对应的预测匹配百分比”属于单样本预测置信度,根本不是全局准确率,这个函数从用途上就选错了。- 模型训练逻辑写反:你通过
train_test_split拆分出了训练集X,Y和测试集x_test,y_test,但训练时调用model.fit(Xtext, Ytest)拿测试集做训练,完全违背训练/测试集拆分的初衷,训出来的模型没有任何泛化参考价值。
修正方案
按以下逻辑调整代码即可:
- 模型训练必须使用拆分出的训练集数据,测试集仅用于验证模型效果,不能参与训练
- 单样本的预测匹配百分比(即模型判定该样本属于预测类别的置信度)需要调用
predict_proba方法获取,该方法会返回样本对应每个类别的概率值,取预测类别对应的概率就是你要的匹配百分比 - 如果需要计算模型在测试集上的整体准确率,要先对整个测试集做预测,保证预测结果长度和
Ytest完全一致后,再调用accuracy_score
修正后的Predict方法代码如下:
def Predict(self,X,Y,Data, Xtest, Ytest): model = GaussianNB() # 用训练集完成模型训练 model.fit(X, Y) # 计算测试集整体准确率 y_test_pred = model.predict(Xtest) print("测试集整体准确率:", metrics.accuracy_score(Ytest, y_test_pred)) # 单样本预测,输出预测类别和对应匹配百分比 single_sample = [[1.0, 2.00613, 2, 5]] pred_class = model.predict(single_sample)[0] pred_confidence = model.predict_proba(single_sample).max() print(f"单样本预测类别:{pred_class},匹配百分比:{round(pred_confidence * 100, 2)}%")
额外注意:如果运行时出现数据类型相关报错,在ProcessData方法的返回语句前,把X、Y转为numpy数组即可,修改为return np.array(X), np.array(Y)。
内容的提问来源于stack exchange,提问作者user3098629
相关产品推荐
相关产品推荐

