web-dev-qa-db-ja.com

sklearnの問題:回帰の実行時にサンプル数が一貫しない配列が見つかりました

この質問は以前に尋ねられたようですが、受け入れられた回答をさらに明確にするためにコメントすることはできず、提供された解決策を理解できませんでした。

自分のデータでsklearnを使用する方法を学習しようとしています。基本的に、過去100年間の2つの異なる国のGDPの年間変化率(%)を取得しました。今のところ、単一の変数を使用して学習しようとしています。私が本質的にしようとしていることは、sklearnを使用して、国BのGDPの変化率が与えられる場合、国AのGDP変化%を予測することです。

問題は私が言っているエラーを受け取ることです:

ValueError:一貫しないサンプル数の配列が見つかりました:[1 107]

これが私のコードです:

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()

何が悪いのですか?私は基本的に、自分の単純なデータにsklearnチュートリアル(いくつかの糖尿病データセットを使用)を適用しようとしました。私のデータには、日付、国Aの特定の年のGDPの変化率、および国Bの同じ年のGDPの変化率が含まれています。

私は解決策を試しました herehere(基本的に最初のリンクで解決策についてもっと調べようとしています) ですが、まったく同じエラーが表示されます。

見たい場合の完全なトレースバックは次のとおりです。

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

Fit(X、y)では、入力パラメーターXは2次元配列であると想定されています。ただし、データ内のXが1次元のみの場合は、次のように2次元配列に変形することができます。regr.fit(chntrain_X.reshape(len(chntrain_X), 1), chntrain_Y)

6
Chang Men

np.newaxisも使用できます。例はX = X[:, np.newaxis]です。 ロジスティック関数 でメソッドを見つけました

0
Cloud Cho

私はあなたと同じような問題を抱えていて、解決策を見つけました。

次のエラーがある場合:

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

[1 107]の部分は、基本的に配列が間違っていることを示しています。 Sklearnは、1行で107列のデータがあると考えています。

これを修正するには、Xデータを次のように転置してみてください。

chntrain.T

フィットを再実行します。

regr.fit(chntrain, austrain)

「抑制」データがどのように見えるかに応じて、これも転置する必要がある場合があります。

0
bobo
regr.fit(chntrain, austrain)

これは正しくありません。 fitの最初のパラメーターは、特徴ベクトルを参照するXである必要があります。 2番目のパラメーターはyである必要があります。これは、Xに関連付けられた正解(ターゲット)ベクトルです。

たとえば、GDPがある場合、次のようになります。

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

名前から判断すると、chntrainaustrainはどちらも特徴ベクトルです。データのロード方法から判断すると、おそらく最後の列がターゲットですか?

多分あなたは次のようなことをする必要があります:

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)

しかし、データの正確なストレージ形式を知らなければ、それを知ることはできません。

0
IVlad

chntrainを1次元ではなく2次元配列に変更してみてください。つまり、(len(chntrain), 1)に変形します。

予測のために、chntestも2次元配列に変更します。

0
qg_jinn