web-dev-qa-db-fra.com

Erreur lors de l'utilisation de Sklearn et de la régression linéaire: formes (1,16) et (1,1) non alignées: 16 (dim 1)! = 1 (dim 0)

J'ai commencé à apprendre sur l'apprentissage automatique et je suis tombé sur youtube siraj et ses vidéos Udacity et je voulais essayer de ramasser quelques choses.

Sa vidéo en référence: https://www.youtube.com/watch?v=vOppzHpvTiQ&index=1&list=PL2-dafEMk2A7YdKv4XfKpfbTH5z6rEEj

Dans sa vidéo, il avait un fichier txt qu'il avait importé et lu, mais quand j'ai essayé de recréer le fichier txt, il ne pouvait pas être lu correctement. Au lieu de cela, j'ai essayé de créer un pandas dataframe avec les mêmes données et d'effectuer la régression linéaire/prédire dessus, mais j'ai ensuite obtenu l'erreur ci-dessous.

Variables d'entrée trouvées avec un nombre d'échantillons incohérent: [1, 16] et quelque chose sur le passage de tableaux 1d et j'ai besoin de les remodeler.

Puis quand j'ai essayé de les remodeler en suivant ce post: Sklearn: ValueError: variables d'entrée trouvées avec des nombres d'échantillons incohérents: [1, 6]

Je reçois cette erreur ....

formes (1,16) et (1,1) non alignées: 16 (dim 1)! = 1 (dim 0)

Voici mon code ci-dessous. Je sais que c'est probablement une erreur de syntaxe, je ne suis pas encore familier avec ce scklearn et je voudrais de l'aide.

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model

#DF = pd.read_fwf('BrainBodyWeight.txt')
DF = pd.DataFrame()
DF['Brain'] = [3.385, .480, 1.350, 465.00,36.330, 27.660, 14.830, 1.040, 4.190, 0.425, 0.101, 0.920, 1.000, 0.005, 0.060, 3.500 ]

DF['Body'] = [44.500, 15.5, 8.1, 423, 119.5, 115, 98.2, 5.5,58, 6.40, 4, 5.7,6.6, .140,1, 10.8]

try:
    x = DF['Brain']
    y = DF['Body']

    x = x.tolist()
    y = y.tolist()

    x = np.asarray(x)
    y = np.asarray(y)


    body_reg = linear_model.LinearRegression()
    body_reg.fit(x.reshape(-1,1),y.reshape(-1,1))
    plt.scatter(x,y)
    plt.plot(x,body_reg.predict(x))
    plt.show()
except Exception as e:
    print(e)

Quelqu'un peut-il expliquer pourquoi sklearn n'aime pas mon entrée ????

8
NoviceCoder

De documentation LinearRegression.fit () nécessite un tableau x avec [n_samples,n_features] forme. C'est pourquoi vous remodelez votre tableau x avant d'appeler fit. Si vous ne le faites pas, vous aurez un tableau de forme (16,), qui ne répond pas à la [n_samples,n_features] forme, il n'y a pas n_features donné.

x = DF['Brain']
x = x.tolist()
x = np.asarray(x)

# 16 samples, None feature
x.shape
(16,)

# 16 samples, 1 feature
x.reshape(-1,1).shape
(16,1)

La même exigence vaut pour la fonction LinearRegression.predict (et aussi pour la cohérence), il vous suffit simplement de faire le même remodelage lors de l'appel de la fonction de prédiction.

plt.plot(x,body_reg.predict(x.reshape(-1,1)))

Ou bien, vous pouvez simplement remodeler le tableau x avant d'appeler des fonctions.

Et pour référence de fonctionnalité, vous pouvez facilement obtenir le tableau de valeurs numpy interne en appelant simplement DF['Brain'].values. Vous n'avez pas besoin de le convertir en liste -> tableau numpy. Vous pouvez donc simplement utiliser ceci au lieu de toute la conversion:

x = DF['Brain'].values.reshape(1,-1)
y = DF['Body'].values.reshape(1,-1)

body_reg = linear_model.LinearRegression()
body_reg.fit(x, y)
6
umutto