sklearn: a trouvé des tableaux avec un nombre d'échantillons incohérent lors de l'appel de LinearRegression.fit ()


102

J'essaie juste de faire une simple régression linéaire mais je suis déconcerté par cette erreur pour:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].values, df2.iloc[1:1000, 2].values)

qui produit:

ValueError: Found arrays with inconsistent numbers of samples: [  1 999]

Ces sélections doivent avoir les mêmes dimensions, et elles doivent être des tableaux numpy, alors que me manque-t-il?

Réponses:


116

Il semble que sklearn nécessite la forme de données de (numéro de ligne, numéro de colonne). Si la forme de vos données est (numéro de ligne,) comme (999, ), cela ne fonctionne pas. En utilisant numpy.reshape(), vous devez changer la forme du tableau en (999, 1), par exemple en utilisant

data=data.reshape((999,1))

Dans mon cas, cela a fonctionné avec ça.


6
ma forme de données est (10L,), comment puis-je la convertir en (10L, 1). Quand j'utilise data = data.reshape (len (data), 1), la forme résultante est (10L, 1L) not (10L, 1)
user3841581

@ user3841581 veuillez vous référer à ce post .
George Liu

1
@Boern Merci pour le commentaire. J'ai aussi découvert que X_train devrait être de taille (N, 1) mais y_train devrait être de taille (N,) pas (N, 1), sinon cela ne fonctionne pas, du moins pas pour moi.
CrossEntropy

data.reshape (...) peut afficher un avertissement de dépréciation si les données sont un objet Series. Utilisez data.values.reshape (...)
NightFurry

data = data.reshape (-1,1)
Itachi

24

On dirait que vous utilisez pandas dataframe (du nom df2).

Vous pouvez également effectuer les opérations suivantes:

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, 5].to_frame(), df2.iloc[1:1000, 2].to_frame())

REMARQUE: j'ai supprimé les "valeurs" car cela convertit la série pandas en numpy.ndarray et numpy.ndarray n'a pas d'attribut to_frame ().


11

Vu sur le cours de base Udacity Deep Learning:

df = pd.read_csv('my.csv')
...
regr = LinearRegression()
regr.fit(df[['column x']], df[['column y']])

2
Merci! C'est vraiment le plus simple et le plus facile à comprendre!
Juan A. Navarro

En fait, le paramètre Y est attendu sous la forme d'une forme (longueur). Merci!
Michael_Zhang

5

Je pense que l'argument "X" de regr.fit doit être une matrice, donc ce qui suit devrait fonctionner.

regr = LinearRegression()
regr.fit(df2.iloc[1:1000, [5]].values, df2.iloc[1:1000, 2].values)

4

J'ai rencontré cette erreur car j'ai converti mes données en fichier np.array. J'ai résolu le problème en convertissant mes données en un à la np.matrixplace et en prenant la transposition.

ValueError: regr.fit(np.array(x_list), np.array(y_list))

Correct: regr.fit(np.transpose(np.matrix(x_list)), np.transpose(np.matrix(y_list)))


2
expects X(feature matrix)

Essayez de mettre vos fonctionnalités dans un tuple comme celui-ci:

features = ['TV', 'Radio', 'Newspaper']
X = données [caractéristiques]

1

J'ai fait face à un problème similaire. Le problème dans mon cas était que le nombre de lignes dans X n'était pas égal au nombre de lignes dans y.

c'est-à-dire que le nombre d'entrées dans les colonnes de caractéristiques n'était pas égal au nombre d'entrées dans la variable cible puisque j'avais supprimé certaines lignes des colonnes de freature.


0

Pour analyser deux tableaux (array1 et array2), ils doivent répondre aux deux exigences suivantes:

1) Ils doivent être un numpy.ndarray

Vérifier avec

type(array1)
# and
type(array2)

Si ce n'est pas le cas, au moins l'un d'entre eux effectue

array1 = numpy.ndarray(array1)
# or
array2 = numpy.ndarray(array2)

2) Les dimensions doivent être les suivantes:

array1.shape #shall give (N, 1)
array2.shape #shall give (N,)

N est le nombre d'éléments qui se trouvent dans le tableau. Pour fournir à array1 le bon nombre d'axes, procédez comme suit:

array1 = array1[:, numpy.newaxis]

0

Comme il a été mentionné ci-dessus, l'argument X doit être une matrice ou un tableau numpy avec des dimensions connues. Vous pourriez donc probablement utiliser ceci:

df2.iloc[1:1000, 5:some_last_index].values

Ainsi, votre dataframe serait converti en un tableau avec des dimensions connues et vous n'aurez pas besoin de le remodeler



-1

pendant la période d'essai du train, vous avez peut-être fait une erreur

x_train,x_test,y_train,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)

Le code ci-dessus est correct

Vous avez peut-être fait comme ci-dessous ce qui est faux

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.