如何使用sklearn KNN进行预测?出现维度匹配报错如何解决?
问题原因分析
- 第一次报错的核心原因:sklearn所有模型的
predict()方法要求输入的特征矩阵必须是二维结构,格式为(样本数量, 特征数量)。你直接取X_test[0]得到的是一维数组,形状为(64,)(digits数据集每个样本有64个像素特征),不符合输入要求,所以触发第一个维度提示报错。 - 第二次报错的核心原因:你按照提示选了错误的reshape方式,
reshape(-1,1)会把数组转为(64, 1)的结构,相当于传入了64个单特征的样本,和训练时每个样本64个特征的维度完全不匹配,所以触发维度不一致报错。
正确解决方法
你需要按照报错提示里的单样本场景处理逻辑,将单条测试样本转为(1, 特征数)的二维结构,有两种常用写法:
方法1:使用reshape(1, -1)调整维度
将预测代码修改为:
print(model.predict(X_test[0].reshape(1, -1)))
这里reshape(1,-1)会自动计算特征维度,最终得到形状为(1,64)的数组,和训练集维度完全匹配。
方法2:使用切片直接获取二维数组
取测试集样本时用切片操作,得到的结果天然是二维结构,无需额外reshape:
print(model.predict(X_test[0:1]))
完整可运行代码
import numpy as np import sklearn.datasets from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier data = sklearn.datasets.load_digits() X_train, X_test, y_train, y_test = train_test_split(data['data'], data['target']) model = KNeighborsClassifier().fit(X_train, y_train) # 两种写法二选一即可 print(model.predict(X_test[0].reshape(1, -1))) # print(model.predict(X_test[0:1]))
内容的提问来源于stack exchange,提问作者Lucas Bezerra
相关产品推荐
相关产品推荐

