Pythonスクリプトのエラー「2D配列が必要です。代わりに1D配列を取得しました:」?


87

このチュートリアルに従ってこの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 2017

10
X = X.reshape(1, -1)。形状変更は適切ではありません。
狂牛病の物理学者

2
@ stackoverflowuser2010:はすでに2次元clf.predict(<a-1d-thing>)であるため、最後の行を推測しXます(reshapeそれにもかかわらず役に立たない)。
マークディキンソン

@MarkDickinsonはい、最後の行はです。
JonTargaryen 2017

2
@JonTargaryen形状変更は適切な場所にありますが、結果を破棄しています。結果をに戻しXます。
狂牛病の物理学者

回答:


165

predict同じ2D配列をメソッドに提供することになっていますが、処理する1つの値(またはそれ以上)を指定します。要するに、あなたはただ置き換えることができます

[0.58,0.76]

[[0.58,0.76]]

そしてそれはうまくいくはずです。

編集:この答えは人気が出たので、MLについてもう少し説明を追加したいと思いました。短いバージョン:predictトレーニングデータ(X)と同じ次元のデータでのみ使用できます。

問題の例では、コンピューターに一連の行X(それぞれ2つの値)を指定し、で正しい応答を示していますypredict新しい値を使用したい場合、プログラムは同じこと、つまり一連の行を期待します。(2つの値を持つ)1つの行だけにそれを実行したい場合でも、その行は別の配列の一部である必要があります。


31
しかし、なぜそれが機能するのですか?何が問題なのかわかりません。
チャーリーパーカー

2
より大きなデータフレームでこれをどのように達成しますか?(動的)
すする

4
なぜそれは2D配列でなければならないのですか?この背後にある理由は何ですか?
problemofficer

19

配列で予測を実行すると、問題が発生します[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

8

私は以下のアプローチを使用します。

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

reg.predict([[2136]])

6

予測したいインスタンスのデータ型がpanda.Seriesオブジェクトであったことを除いて、同じ問題に直面しました。

さて、私はただ1つの入力インスタンスを予測する必要がありました。私は自分のデータのスライスからそれを取りました。

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

この場合、それを1次元配列に変換してから変換する必要がありますreshape

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

ドキュメントvaluesnumpyの配列にシリーズを変換します。


3

私も同じ問題に直面しました。最初のブラケットが配列を初期化し、2番目のブラケットがその配列の要素になるため、配列にする必要があります。さらに、2D配列の単一要素にするために、二重角括弧を配置する必要があります。

したがって、最後のステートメントを次のように置き換えるだけです。

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

1

私は以前に同じ問題に直面していましたが、どういうわけか解決策を見つけましたreg.predict([[3300]])。試してみてください。

以前はスカラー値を許可していたAPIですが、2D配列を指定する必要があります。


1

二重角括弧の間に引数を挿入するだけです。

regressor.predict([[values]])

それは私のために働いた


0

1つの機能で、データフレームリストがシリーズに変換されます。私はそれをデータフレームリストに戻す必要があり、それは機能しました。

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のパンダクラスです。したがって、機能のスケーリングを順番に実行してもエラーは発生しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.