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。”的主要内容,如果未能解决你的问题,请参考以下文章