ValueError:y 应该是一维数组,得到一个形状为 (285, 30) 的数组

数据挖掘 机器学习 Python scikit-学习 支持向量机
2022-03-02 06:55:19

我在下面使用这个数据集,并试图找到数据集的支持向量机。我也有我的代码和错误。

http://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_breast_cancer.html#sklearn.datasets.load_breast_cancer 在此处输入图像描述

import numpy as np
from sklearn import svm,datasets
breastcancer = datasets.load_breast_cancer()
#print(breastcancer)
everydata = breastcancer.data
#print(everydata)
everytarget = breastcancer.target
traindata = []
traintarget = []
testdata = []
testclasses = []
#Class 0 data separtion
for i in range(0,140):
    traindata.append(everydata[i])
    traintarget.append(everytarget[i])
for i in range(140,212):
    testdata.append(everydata[i])
#Class 1 data separation
for i in range(212,357):
    traindata.append(everydata[i])
    traintarget.append(everytarget[i])
for i in range(357,569):
    testdata.append(everydata[i])
traindata = np.concatenate((everydata[:140, :],everydata[212:357, :]),axis=0)
traintarget = np.concatenate((everydata[:140],everydata[212:357]),axis=0)
testdata = np.concatenate((everydata[140:212, :],everydata[357:569, :]),axis=0)
print(len(traindata))
print(traintarget)
print(testdata)
dd = svm.SVC(kernel='linear')
dd.fit(traindata,traintarget)
decide = dd.predict(testdata)
print(decide)

为什么我收到此错误是我的串联不正确。结果应该在最后输出 0 和 1。

2个回答

问题是您正在使用everydaydata来构建traintarget数据集,但您应该使用everytarget. 这就是为什么要抱怨形状,因为标签应该是一维的。

尝试替换这个:

traintarget = np.concatenate((everydata[:140],everydata[212:357]),axis=0)

有了这个:

traintarget = np.concatenate((everytarget[:140],everytarget[212:357]),axis=0)

所以错误在你的dd.fit(traindata,traintarget)车道上上升了。如果你打印你的traintarget.shape(),你会看到它是(285, 30). 目标(通常称为 y_train)是应该只有训练集输出的数组,因此模型可以学习 X_train(traindata)和 y_train 之间的链接。

在这里,您的 y_train 有 30 个属性,当您的错误提到您时,它应该是 1(只是您正在查看的 1 或 0 目标)。

实际上,在您的 traintarget (y_train) 中,您必须将该列与 30 个 traindata (X_train) 隔离,该列表示您要为其训练模型的目标。

为了适合您的模型,您需要:您的 traindata 不包括目标(类似于您必须预测的数据),并且您的 traintarget 仅包含与您的 traindata 对应的目标。