web-dev-qa-db-fra.com

erreur dans le script python "Tableau 2D attendu, tableau 1D obtenu à la place:"?

Je suis ce tutoriel pour faire cette prédiction ML:

Tutoriel de lien

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]))

J'utilise Python 3.6 et j'obtiens l'erreur "Tableau 2D attendu, tableau 1D à la place:" Je pense que le script est destiné aux anciennes versions, mais je ne sais pas comment le convertir en version 3.6.

Déjà essayer avec le:

   X.reshape(1, -1)
35
JonTargaryen

Vous êtes simplement censé fournir à la méthode predict le même tableau 2D, mais une valeur à traiter (ou plus). En bref, vous pouvez simplement remplacer

[0.58,0.76]

Avec

[[0.58,0.76]]

Et ça devrait marcher

70
Ofer Sadan

Le problème se produit lorsque vous exécutez la prédiction sur le tableau [0.58,0.76]. Résolvez le problème en le remodelant avant d'appeler 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
10

J'ai rencontré le même problème, sauf que le type de données de l'instance que je voulais prédire était un objet panda.Series.

Eh bien, je n'avais besoin que de prédire une instance d'entrée. Je l'ai pris à partir d'une tranche de mes données.

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

Dans ce cas, vous devrez le convertir en un tableau 1-D, puis reshape.

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

À partir de docs , values convertira Series en un tableau numpy.

2
devsaw

J'ai rencontré le même problème. Vous devez simplement en faire un tableau et, en outre, vous devez mettre des crochets doubles pour en faire un élément unique du tableau 2D, car le premier crochet initialise le tableau et le second en fait un élément de ce tableau. 

Donc, remplacez simplement la dernière déclaration par:

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

J'utilise l'approche ci-dessous.

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

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

Avec une fonctionnalité, ma liste Dataframe est convertie en série. Je devais le reconvertir en une liste Dataframe et cela a fonctionné.

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

Les matrices X et Y des variables indépendantes et des variables dépendantes, respectivement, en DataFrame de type int64 afin qu’elle soit convertie du tableau 1D en tableau 2D ) où pd est de classe pandas en python. et ainsi, la mise à l'échelle des fonctionnalités ne provoque aucune erreur!

0
Chahat Agarwal