web-dev-qa-db-fra.com

problème apparenté: Tableaux trouvés avec un nombre incohérent d'échantillons lors d'une régression

cette question semble avoir déjà été posée, mais je ne peux pas commenter pour obtenir des éclaircissements supplémentaires sur la réponse acceptée et je ne pouvais pas comprendre la solution proposée.

J'essaie d'apprendre à utiliser Sklearn avec mes propres données. En gros, je viens tout juste de connaître le pourcentage annuel de variation du PIB de 2 pays différents au cours des 100 dernières années. J'essaie simplement d'apprendre en utilisant une seule variable pour le moment. Ce que je cherche essentiellement à faire, c’est d’utiliser sklearn pour prédire quel sera le pourcentage de variation du PIB pour le pays A en fonction du pourcentage de variation du PIB du pays B.

Le problème est que je reçois une erreur disant: 

ValueError: Tableaux trouvés avec un nombre incohérent d'échantillons: [1 107]

Voici mon code:

import sklearn.linear_model as lm
import numpy as np
import scipy.stats as st
import matplotlib.pyplot as plt
import matplotlib.dates as mdates


def bytespdate2num(fmt, encoding='utf-8'):#function to convert bytes to string for the dates.
    strconverter = mdates.strpdate2num(fmt)
    def bytesconverter(b):
        s = b.decode(encoding)
        return strconverter(s)
    return bytesconverter

dataCSV = open('combined_data.csv')

comb_data = []

for line in dataCSV:
    comb_data.append(line)

date, chngdpchange, ausgdpchange = np.loadtxt(comb_data, delimiter=',', unpack=True, converters={0: bytespdate2num('%d/%m/%Y')})


chntrain = chngdpchange[:-1]
chntest = chngdpchange[-1:]

austrain = ausgdpchange[:-1]
austest = ausgdpchange[-1:]

regr = lm.LinearRegression()
regr.fit(chntrain, austrain)

print('Coefficients: \n', regr.coef_)

print("Residual sum of squares: %.2f"
      % np.mean((regr.predict(chntest) - austest) ** 2))

print('Variance score: %.2f' % regr.score(chntest, austest))

plt.scatter(chntest, austest,  color='black')
plt.plot(chntest, regr.predict(chntest), color='blue')

plt.xticks(())
plt.yticks(())

plt.show()

Qu'est-ce que je fais mal? J'ai essentiellement essayé d'appliquer le didacticiel de sklearn (ils ont utilisé un ensemble de données sur le diabète) à mes propres données simples. Mes données ne contiennent que la date, le% de variation du PIB du pays A pour cette année spécifique et le% de variation du PIB du pays B pour la même année. 

J'ai essayé les solutions ici et ici (essentiellement pour en savoir plus sur la solution dans le premier lien) , mais je reçois exactement la même erreur.

Voici le suivi complet au cas où vous voudriez le voir:

Traceback (most recent call last):
  File "D:\My Stuff\Dropbox\Python\Python projects\test regression\tester.py", line 34, in <module>
    regr.fit(chntrain, austrain)
  File "D:\Programs\Installed\Python34\lib\site-packages\sklearn\linear_model\base.py", line 376, in fit
    y_numeric=True, multi_output=True)
  File "D:\Programs\Installed\Python34\lib\site-packages\sklearn\utils\validation.py", line 454, in check_X_y
    check_consistent_length(X, y)
  File "D:\Programs\Installed\Python34\lib\site-packages\sklearn\utils\validation.py", line 174, in check_consistent_length
    "%s" % str(uniques))
ValueError: Found arrays with inconsistent numbers of samples: [  1 107]
9
pyman

Vous pouvez aussi utiliser np.newaxis. L'exemple peut être X = X[:, np.newaxis]. J'ai trouvé la méthode à Fonction logistique

0
Cloud Cho

J'ai eu des problèmes similaires à vous et j'ai trouvé une solution.

Où vous avez l'erreur suivante:

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

La partie [1 107] dit essentiellement que votre tableau est dans le mauvais sens. Sklearn pense que vous avez 107 colonnes de données avec 1 ligne.

Pour résoudre ce problème, essayez de transposer les données X comme suit:

chntrain.T

La ré-exécuter votre ajustement:

regr.fit(chntrain, austrain)

Selon l'apparence de vos données "austrain", vous devrez peut-être également les transposer.

0
bobo
regr.fit(chntrain, austrain)

Cela ne semble pas correct. Le premier paramètre à fit devrait être une X, qui fait référence à un vecteur de caractéristiques. Le deuxième paramètre doit être y, qui est le vecteur de réponses correctes (cibles) associé à X.

Par exemple, si vous avez le PIB, vous pourriez avoir:

X[0] = [43, 23, 52] -> y[0] = 5
# meaning the first year had the features [43, 23, 52] (I just made them up)
# and the change that year was 5

D'après vos noms, chntrain et austrain sont des vecteurs d'entités. À en juger par la façon dont vous chargez vos données, la dernière colonne est peut-être la cible?

Peut-être devez-vous faire quelque chose comme:

chntrain_X, chntrain_y = chntrain[:, :-1], chntrain[:, -1]
# you can do the same with austrain and concatenate them or test on them if this part works
regr.fit(chntrain_X, chntrain_y)

Mais nous ne pouvons pas savoir sans connaître le format de stockage exact de vos données.

0
IVlad

Essayez de changer chntrain en un tableau à deux dimensions au lieu de 1-D, c'est-à-dire une nouvelle structure en (len(chntrain), 1).

Pour la prédiction, remplacez également chntest par un tableau à deux dimensions.

0
qg_jinn