web-dev-qa-db-ja.com

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

私は このチュートリアル に従ってこの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)
46
JonTargaryen

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

[0.58,0.76]

[[0.58,0.76]]

そして、それは動作するはずです

88
Ofer Sadan

配列[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
12

予測したいインスタンスのデータ型が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)

docs から、valuesはSeriesをnumpy配列に変換します。

2
devsaw

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

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

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

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

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

reg.predict([[2136]])
0
Vikas Rathour

1つの機能を使用すると、データフレームリストがシリーズに変換されます。私はそれをDataframeリストに変換し直さなければならなかった、そしてそれは働いた。

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

Int64型からDataFrameへの独立変数および従属変数のXおよびY行列。1D配列から2D配列に変換されます。つまり、X = pd.DataFrame(X)およびY = pd.dataFrame(Y)ここで、pd Pythonのパンダクラスです。したがって、機能のスケーリングは順番にエラーにつながりません!

0
Chahat Agarwal