sklearn KNeighborsClassifier "ValueError: Found array with dim 4. Estimator expected <= 2."

sklearn KNeighborsClassifier "ValueError: Found array with dim 4. Estimator expected <= 2."

我正在尝试使用 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: Found array with dim 4. Estimator expected <= 2."

我相当确定它与我的阵列形状有关,我试图重塑它,但没有成功。我该怎么办?

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

>>> 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 个 dims 的数组(即多维数组)。这是您传递给预测函数的重塑输出:

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

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

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

Sklearn 需要一个二维数组。这是修复它的方法......如果你想预测整个矩阵,只需 运行:

knn.predict(test)

如果您只想预测一个样本,您可以这样做:

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

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

y_test = test.pop('quality')

另见