sklearn KNeighborsClassifier“ ValueError:找到的数组具有暗4。估计器期望值<=2。”

时间:2018-07-06 18:34:04

标签: python scikit-learn knn

我正在尝试使用sklearn kneighborsclassifier对葡萄酒质量数据进行训练。这是我的代码:

from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
import numpy as np

dataframe = pd.read_csv("winequality-white.csv")
dataframe = dataframe.drop(["fixed acidity", "pH", "sulphates"], axis=1)

test = dataframe[110:128]
train = dataframe[15:40]

Y = train["quality"]
X = train.drop(["quality"], axis=1)


#print(X)
#print(Y)

knn = KNeighborsClassifier()
knn.fit(X, Y)
testvals = np.array(test.loc[110, :])
testvals = testvals.reshape(1, -1)
print(knn.predict([[testvals]]))

我收到错误“ ValueError:找到的数组具有暗4。估计器预期<= 2。”

我相当确定它与数组的形状有关,并且我尝试过重塑它,但是没有运气。我该怎么办?

1 个答案:

答案 0 :(得分:0)

请考虑以下(可重复的)示例设置:

>>> import pandas as pd
>>> import numpy as np
>>> test = pd.DataFrame.from_records(data=np.random.rand(120, 4))
>>> testvals = np.array(test.loc[110, :])

当您将向量传递给预测函数时,重整向量的方式是创建一个数组,该数组具有超过预期的2个暗角(即多维数组)。这是您要传递给预测函数的重塑输出:

>>> [[testvals.reshape((-1, 1))]]
[[array([[ 0.25174728],
       [ 0.24603664],
       [ 0.01781963],
       [ 0.49317648]])]]

我们可以证明这会产生一个4-d数组:

>>> np.asarray([[testvals.reshape((-1, 1))]]).ndim
4

Sklearn需要一个二维数组。解决方法如下:如果要预测整个矩阵,请运行:

knn.predict(test)

如果您只想预测一个样本,则可以执行以下操作:

knn.predict([test.loc[110].tolist()])

顺便说一句,值得一提的是,您还没有从test弹出目标,因此功能数量在您这样做之前是不匹配的:

y_test = test.pop('quality')

另请参阅this question