103 votes

Erreur dans Python script "Expected 2D array, got 1D array instead :"?

Je suis ce tutoriel pour faire cette prédiction 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]))

J'utilise Python 3.6 et j'obtiens l'erreur "Expected 2D array, got 1D array instead :" Je pense que le script est pour les anciennes versions, mais je ne sais pas comment le convertir à la version 3.6.

Déjà essayé avec le :

X.reshape(1, -1)

3 votes

Quelle ligne produit l'erreur ?

12 votes

X = X.reshape(1, -1) . Reshape n'est pas en place.

2 votes

@stackoverflowuser2010 : Je pense que la dernière ligne clf.predict(<a-1d-thing>) ya que X est déjà bidimensionnel (inutile reshape nonobstant).

196voto

Ofer Sadan Points 3865

Vous êtes juste censé fournir le predict avec le même tableau 2D, mais avec une valeur que vous voulez traiter (ou plusieurs). En bref, vous pouvez simplement remplacer

[0.58,0.76]

Avec

[[0.58,0.76]]

Et ça devrait marcher.

EDIT : Cette réponse est devenue populaire donc j'ai pensé ajouter un peu plus d'explications sur ML. La version courte : nous pouvons seulement utiliser predict sur des données de même dimensionnalité que les données d'apprentissage ( X ) était.

Dans l'exemple en question, nous donnons à l'ordinateur un tas de lignes dans le fichier X (avec 2 valeurs chacun) et nous lui montrons les réponses correctes en y . Lorsque nous voulons predict en utilisant de nouvelles valeurs, notre programme s'attend à la même chose - une bouquet de fleurs de rangs. Même si nous voulons le faire sur une seule ligne (avec deux valeurs), cette ligne doit faire partie d'un autre tableau.

35 votes

Mais pourquoi cela fonctionne-t-il ? Je ne comprends pas quel est le problème.

2 votes

Comment y parvenir pour des cadres de données plus grands (dynamiquement) ?

6 votes

Pourquoi faut-il que ce soit un tableau en 2D ? Quel est le raisonnement derrière cela ?

22voto

Le problème se produit lorsque vous exécutez la prédiction sur le tableau. [0.58,0.76] . Réglez 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

6voto

DamnDev Points 161

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

J'avais juste besoin de prédire une instance d'entrée. Je l'ai pris 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 et ensuite reshape il.

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

De la docs , values convertira Series en un tableau numpy.

3voto

Satyam Mittal Points 11

J'ai rencontré le même problème. Il suffit d'en faire un tableau et, de plus, il faut mettre des doubles crochets pour en faire un élément du tableau 2D, car le premier crochet initialise le tableau et le second en fait un élément de ce tableau.

Il suffit donc de remplacer la dernière déclaration par :

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

0voto

kingarthur Points 43

Avec une fonction, ma liste de Dataframe se convertit en série. J'ai dû la reconvertir en liste Dataframe et cela a fonctionné.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X