Python脚本中的错误“预期的2D数组,而是获取了1D数组:”?


81

我正在按照本教程进行ML预测:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

style.use("ggplot")
from sklearn import svm

x = [1, 5, 1.5, 8, 1, 9]
y = [2, 8, 1.8, 8, 0.6, 11]

plt.scatter(x,y)
plt.show()

X = np.array([[1,2],
             [5,8],
             [1.5,1.8],
             [8,8],
             [1,0.6],
             [9,11]])

y = [0,1,0,1,0,1]
X.reshape(1, -1)

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

print(clf.predict([0.58,0.76]))

我正在使用Python 3.6,但出现错误“预期的2D数组,而是获取1D数组:”我认为该脚本适用于旧版本,但我不知道如何将其转换为3.6版本。

已经尝试使用:

X.reshape(1, -1)

3
哪条线产生错误?
stackoverflowuser2010

10
X = X.reshape(1, -1)。重塑未就位。
疯狂物理学家

2
@ stackoverflowuser2010:我猜最后一行clf.predict(<a-1d-thing>),因为X已经是二维的了(reshape尽管没用)。
马克·迪金森

@MarkDickinson是的,最后一行是。
JonTargaryen

2
@JonTargaryen整形在正确的位置,但是您正在放弃结果。将结果分配回X
疯狂物理学家

Answers:


156

您只需要为该predict方法提供相同的2D数组,但要提供一个您要处理(或更多)的值。简而言之,您可以替换

[0.58,0.76]

[[0.58,0.76]]

它应该工作。

编辑:这个答案变得很流行,所以我想我将添加有关ML的更多解释。简短的版本:我们只能predict在与训练数据(X)具有相同维数的数据上使用。

在所讨论的示例中,我们给计算机添加了许多行X(各有2个值),并在中显示了正确的响应y。当我们想predict使用新值时,我们的程序期望的是相同的-一堆行。即使我们只想对一行(具有两个值)进行处理,该行也必须是另一数组的一部分。


31
但是为什么行得通呢?我不明白问题是什么。
查理·帕克

2
对于较大的数据框,如何实现?(动态)
Sip

3
为什么必须是2D阵列?这背后的原因是什么?
问题人员

17

在数组上运行预测时,会发生此问题[0.58,0.76]。通过在调用之前重塑问题来解决此问题predict()

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style

style.use("ggplot")
from sklearn import svm

x = [1, 5, 1.5, 8, 1, 9]
y = [2, 8, 1.8, 8, 0.6, 11]

plt.scatter(x,y)
plt.show()

X = np.array([[1,2],
             [5,8],
             [1.5,1.8],
             [8,8],
             [1,0.6],
             [9,11]])

y = [0,1,0,1,0,1]

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

test = np.array([0.58, 0.76])
print test       # Produces: [ 0.58  0.76]
print test.shape # Produces: (2,) meaning 2 rows, 1 col

test = test.reshape(1, -1)
print test       # Produces: [[ 0.58  0.76]]
print test.shape # Produces (1, 2) meaning 1 row, 2 cols

print(clf.predict(test)) # Produces [0], as expected

7

我使用以下方法。

reg = linear_model.LinearRegression()
reg.fit(df[['year']],df.income)

reg.predict([[2136]])

5

除了要预测的实例的数据类型是panda.Series对象之外,我还面临相同的问题。

好吧,我只需要预测一个输入实例即可。我从一部分数据中获取了它。

df = pd.DataFrame(list(BiogasPlant.objects.all()))
test = df.iloc[-1:]       # sliced it here

在这种情况下,您需要先将其转换为一维数组reshape

 test2d = test.values.reshape(1,-1)

docsvalues将Series转换为numpy数组。


2

我遇到了同样的问题。您只需要使其成为一个数组,而且必须放置双方括号以使其成为2D数组的单个元素,因为第一个括号将初始化该数组,第二个使其成为该数组的元素。

因此,只需将最后一条语句替换为:

print(clf.predict(np.array[[0.58,0.76]]))


1

只需将参数插入双方括号之间即可:

regressor.predict([[values]])

对我有用


0

通过一个功能,我的数据框列表转换为系列。我不得不将其转换回数据框列表,并且它可以正常工作。

if type(X) is Series:
    X = X.to_frame()

-1

自变量和因变量的X和Y矩阵分别从int64类型转换为DataFrame,以便将其从1D数组转换为2D数组。即X = pd.DataFrame(X)和Y = pd.dataFrame(Y),其中pd是python中的pandas类。因此依次进行功能缩放不会导致任何错误!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.