sklearn KNeighborsClassifier“ValueError:找到暗淡为 4 的数组。预计估计器 <= 2。”

Posted

技术标签:

【中文标题】sklearn KNeighborsClassifier“ValueError:找到暗淡为 4 的数组。预计估计器 <= 2。”【英文标题】:sklearn KNeighborsClassifier "ValueError: Found array with dim 4. Estimator expected <= 2." 【发布时间】:2018-12-15 09:28:30 【问题描述】:

我正在尝试使用 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

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

【问题讨论】:

哪一行引发了 ValueError? 这是最后一行,因为我的 testvals 数组是一个 4-D 数组。当我将目标从测试中弹出并通过预测传递数组的一个条目时,问题就解决了,我根本不需要重塑它。如@Tgsmith61591所示 【参考方案1】:

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

>>> 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 个维度的数组(即多维数组)。这是您传递给 predict 函数的 reshape 的输出:

>>> [[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')

另见this question

【讨论】:

以上是关于sklearn KNeighborsClassifier“ValueError:找到暗淡为 4 的数组。预计估计器 <= 2。”的主要内容,如果未能解决你的问题,请参考以下文章

sklearn的PCA

sklearn数据库-老鱼学sklearn

使用sklearn画二分类模型ROC曲线,PR曲线

Keras Sklearn Tuner 模块“sklearn”没有属性“管道”

导入sklearn时出现conda sklearn错误

sklearn库的安装