使用单条鸢尾花数据训练SVM时出现bad input shape ()错误求助
解决SVM训练时的ValueError: bad input shape ()问题
我来帮你搞定这个报错!这个错误的根源很明确:你传入SVM的标签train_y1是一个单个标量值,但scikit-learn的fit方法要求目标变量y必须是1维数组(形状为(n_samples,)),哪怕只有一个样本也得保持数组结构,不能是单独的数值。
问题出在哪?
当你写train_y[i]的时候,你取到的是train_y数组里的单个元素(比如'Iris-setosa'),它的形状是()(标量),而SVM需要的是形状为(1,)的1维数组,这就触发了形状不匹配的错误。
修复步骤
1. 先补全代码里缺失的训练集拆分逻辑
你的代码里直接用了train_X和train_y,但没从拆分后的train数组里提取特征和标签,先补上这部分:
train_X = train[:, :-1] # 取前4列作为特征 train_y = train[:, -1] # 取最后一列作为标签 test_X = test[:, :-1] # 测试集特征 test_y = test[:, -1] # 测试集标签
2. 修正标签的形状(二选一即可)
方法一:用切片保留数组维度
不要直接取train_y[i],而是用切片i:i+1获取长度为1的数组:train_y1 = train_y[i:i+1] # 形状为(1,)的数组,符合要求方法二:用reshape转换标量为1维数组
如果已经取了标量,可以用reshape把它转成数组:train_y1 = train_y[i].reshape(-1, 1)
完整修复后的代码
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn import svm from sklearn import metrics np.random.seed(1) iris = pd.read_csv("Iris.csv") iris.drop("Id", axis=1, inplace=True) iris = iris.values train, test = train_test_split(iris, test_size=0.3) # 拆分特征与标签 train_X = train[:, :-1] train_y = train[:, -1] test_X = test[:, :-1] test_y = test[:, -1] i = 0 train_X1 = train_X[i:i+1, :] train_y1 = train_y[i:i+1] # 用切片获取1维数组 model = svm.SVC() model.fit(train_X1, train_y1) # 现在形状匹配,不会报错了 prediction = model.predict(test_X) print('The test accuracy of the SVM is :', metrics.accuracy_score(prediction, test_y))
额外说明
如果你要逐行循环训练模型,每次都要保证传入的y是1维数组,用train_y[i:i+1]的方式就能稳定满足这个要求,避免再次触发形状错误。
内容的提问来源于stack exchange,提问作者Omar Rafique
相关产品推荐
相关产品推荐

