ValueError:类的数量必须大于一;得到 1

Posted

技术标签:

【中文标题】ValueError:类的数量必须大于一;得到 1【英文标题】:ValueError: The number of classes has to be greater than one; got 1 【发布时间】:2017-08-17 17:25:24 【问题描述】:

我正在尝试按照本教程编写一个 SVM,但使用我自己的数据。 https://pythonprogramming.net/preprocessing-machine-learning/?completed=/linear-svc-machine-learning-testing-data/

我不断收到此错误:

ValueError: The number of classes has to be greater than one; got 1

我的代码是:

header1 = ["Number of Sides", "Standard Deviation of Number of Sides/Perimeter",
      "Standard Deviation of the Angles", "Largest Angle"]
header2 = ["Label"]
features = header1
features1 = header2

def Build_Data_Set():

    data_df = pd.DataFrame.from_csv("featureVectors.csv")
    #data_df = data_df[:3]
    X = np.array(data_df[features].values)

    data_df2 = pd.DataFrame.from_csv("labels.csv")
    y = np.array(data_df2[features1].replace("Circle",0).replace("Triangle",1)
                 .replace("Square",2).replace("Parallelogram",3)
                 .replace("Rectangle",4).values.tolist())

    return X,y

def Analysis():

    test_size = 4
    X,y = Build_Data_Set()
    print(len(X))

    clf = svm.SVC(kernel = 'linear', C = 1.0)
    clf.fit(X[:-test_size],y[:-test_size])

    correct_count = 0

    for x in range(1, test_size+1):
            if clf.predict(X[-x])[0] == y[-x]:
                correct_count += 1

    print("Accuracy:", (correct_count/test_size) * 100.00)

用于 X 的特征数组如下所示:

[[4, 0.001743713493735165, 0.6497055601752815, 90.795723552739275], 
 [4, 0.0460937435599832, 0.19764217920409227, 90.204147248752378], 
 [1, 0.001185534503063044, 0.3034913722821194, 60.348908179729023], 
 [1, 0.015455289770298222, 0.8380914254332884, 109.02120657826231], 
 [3, 0.0169961646358455, 0.2458746325894564, 136.83829993466398]]

Y 中使用的标签数组如下所示:

 ['Square', 'Square', 'Circle', 'Circle', 'Triangle']

到目前为止,我只使用了 5 组数据,因为我知道该程序无法正常工作。

我已经附上了他们 csv 文件中值的图片,以防万一。

featureVectors.csv

Labels.csv

Printing X.shape and y.shape and showing the full error

【问题讨论】:

哪一行给出了错误?当您print(len(X)) 时,您是否也可以打印X.shapey.shape 并告诉我们输出是什么? @exp1orer 我编辑了帖子,您要求的所有信息现在应该在最后一张附加图片中 谢谢,看我的回答。 【参考方案1】:

在我看来问题出在这一行:

clf.fit(X[:-test_size],y[:-test_size])

由于 X 有 5 行,并且您已将 test_size 设置为 4,因此 X[:-test_size] 仅给出一行(第一行)。阅读 python 的切片符号,如果这让您感到困惑:Explain Python's slice notation

所以训练集中只有一个类(在本例中为“Square”)。我想知道你是否打算做X[:test_size],它会给出前 4 行。无论如何,尝试在更大的数据集上进行训练。


我可以通过以下方式重现您的错误:

import numpy as np
from sklearn import svm
X = np.array([[4, 0.001743713493735165, 0.6497055601752815, 90.795723552739275], 
 [4, 0.0460937435599832, 0.19764217920409227, 90.204147248752378], 
 [1, 0.001185534503063044, 0.3034913722821194, 60.348908179729023], 
 [1, 0.015455289770298222, 0.8380914254332884, 109.02120657826231], 
 [3, 0.0169961646358455, 0.2458746325894564, 136.83829993466398]])

y =  np.array(['Square', 'Square', 'Circle', 'Circle', 'Triangle'])
print X.shape # (5,4)
print y.shape # (5,)

clf = svm.SVC(kernel='linear',C=1.0)

test_size = 4
clf.fit(X[:-test_size],y[:-test_size])

【讨论】:

以上是关于ValueError:类的数量必须大于一;得到 1的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:类的数量必须大于一(python)

类的数量必须大于一;得了1分

ValueError: n_splits=10 不能大于每个类的成员数

ValueError:模型的特征数量必须与输入匹配(sklearn)

我试图在seaborn中旋转标签45°,但得到ValueError: "Grouper和轴的长度必须相同"

ValueError:新名称的长度必须为 1,得到 2