sklearn:LinearRegression.fit()を呼び出したときに、サンプル数が一貫していない配列が見つかりました


102

単純な線形回帰を行おうとしていますが、次のエラーが発生します。

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

生成されるもの:

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

これらの選択は同じ次元でなければならず、それらは派手な配列でなければならないので、何が欠けていますか?

回答:


116

sklearnには(行番号、列番号)のデータ形式が必要なようです。データの形状が(行番号)のような(999, )場合、機能しません。を使用してnumpy.reshape()、配列の形状をに変更する必要があります(999, 1)。たとえば、

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

私の場合、それでうまくいきました。


6
データの形状は(10L、)ですが、(10L、1)に変換するにはどうすればよいですか。data = data.reshape(len(data)、1)を使用すると、結果の形状は(10L、1)ではなく(10L、1L)になります
user3841581

@ user3841581この投稿を参照してください。
George Liu

1
@Boernコメントをありがとう。X_trainのサイズは(N、1)にする必要があることも発見しましたが、y_trainのサイズは(N、1)ではなく(N、)にする必要があります。それ以外の場合は機能しません。
CrossEntropy 2017

data.reshape(...)は、データがSeriesオブジェクトの場合、奪取警告を表示する場合があります。data.values.reshape(...)を使用してください
NightFurry

data = data.reshape(-1,1)
イタチ

24

(df2という名前の)パンダデータフレームを使用しているようです。

次のこともできます。

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

注:パンダシリーズをnumpy.ndarrayに変換し、numpy.ndarrayに属性to_frame()がないため、「値」を削除しました。


11

Udacityディープラーニングファンデーションコースで見た:

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

2
ありがとう!これは本当に簡単で理解しやすいものです。
ファンA.ナバロ

実際には、Yパラメータは(長さ、)形状として期待されます。ありがとう!
Michael_Zhang

5

regr.fitの「X」引数は行列である必要があると思うので、以下が機能するはずです。

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

4

データをに変換したため、このエラーが発生しましたnp.array。データをnp.matrix代わりに変換して転置することで問題を修正しました。

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

正しい: regr.fit(np.transpose(np.matrix(x_list)), np.transpose(np.matrix(y_list)))


2
expects X(feature matrix)

次のようなタプルに機能を配置してみてください:

features = ['TV'、 'Radio'、 'Newspaper']
X =データ[機能]

1

私も同様の問題に直面しました。私の場合の問題は、Xの行数がyの行数と等しくないことでした。

つまり、機能列からいくつかの行を削除したため、機能列のエントリ数はターゲット変数の全体数と等しくありませんでした。


0

2つのアレイ(array1およびarray2)を分析するには、次の2つの要件を満たす必要があります。

1)numpy.ndarrayである必要があります

確認する

type(array1)
# and
type(array2)

それがそれらの少なくとも1つに当てはまらない場合は、

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

2)寸法は次のようにする必要があります。

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

Nは、配列内のアイテムの数です。array1に適切な数の軸を提供するには、以下を実行します。

array1 = array1[:, numpy.newaxis]

0

上で述べたように、X引数は、既知の次元を持つ行列または派手な配列でなければなりません。したがって、おそらくこれを使用できます:

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

したがって、データフレームは既知の次元を持つ配列に変換され、それを再形成する必要はありません


-1

列車テストの分割中に、間違いを犯した可能性があります

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

上記のコードは正しいです

あなたは間違っている以下のようにしたかもしれません

x_train,y_train,x_test,y_test=sklearn.model_selection.train_test_split(X,Y,test_size)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.