使用sklearn手写数字数据集时遇Bad input shape错误求助
解决SVM训练时的ValueError: bad input shape问题
嘿,我来帮你排查这个错误!你遇到的ValueError: bad input shape (1787, 64)是因为训练模型时特征数据和标签数据的形状完全不匹配,咱们一步一步来修正:
错误根源分析
看你的代码,这里有个关键的赋值错误:
y = digits.data[:-10]
digits.data是用来训练的特征矩阵(每个手写数字样本被转换成64维的向量,形状为(样本数, 64)),而模型训练需要的y应该是对应每个样本的分类标签(也就是这个数字是0-9中的哪一个,形状为(样本数,)的一维数组),正确的标签数据存在digits.target里。
另外还有两个小问题:
- 导入语句
import sklearn import matplotlib.pyplot as plt存在语法错误,应该拆分成两行书写 - 最后一行
plt.show缺少括号,必须写成plt.show()才会弹出图像窗口
修正后的完整代码
import sklearn import matplotlib.pyplot as plt from sklearn import datasets from sklearn import svm digits = datasets.load_digits() clf = svm.SVC(gamma=0.01, C=100) # 特征数据用digits.data,标签用digits.target x = digits.data[:-10] y = digits.target[:-10] clf.fit(x, y) # 注意:predict需要传入二维数组,把单个样本reshape成(1,64)的形状 print("prediction:", clf.predict(digits.data[-1].reshape(1, -1))) plt.imshow(digits.images[-1], cmap=plt.cm.gray_r, interpolation="nearest") plt.show()
额外说明
我还补充了一个细节:clf.predict(digits.data[-1].reshape(1, -1))。因为predict方法要求输入的是二维特征矩阵(哪怕只有一个样本),直接传digits.data[-1]是一维数组会报错,所以用reshape(1, -1)把它转换成(1,64)的符合要求的形状。
这样修改后,代码就能正常训练模型、预测最后一个样本,并且显示对应的手写数字图像啦!
内容的提问来源于stack exchange,提问作者Jairulez
相关产品推荐
相关产品推荐

