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?

ensoleillé
la source

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.

Yul
la source
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 ().

user24981
la source
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']])
xilef
la source
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)
Anish
la source
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)))

Josh Grinberg
la source
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]
Yuanxu Xu
la source
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.

Shivam Agrawal
la source
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]
Richard
la source
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

Andy J.
la source
0

Certains jours, j'ai été confronté au même problème. La raison était des tableaux de tailles différentes.

Ingénieur Saliheen Afridi
la source
-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)
Naveen
la source