ValueError: Expected 2D array, got 1D array instead

ValueError: Expected 2D array, got 1D array instead

sklearnのモデルを学習する際に、fit()を実行すると「ValueError: Expected 2D array, got 1D array instead」というエラーが発生する場合があります。

エラーの原因と解決策

解決策としていくつか方法がありますが、sklearnのfit()では、DataFrame型やnumpyの行列形式(縦ベクトル)のみを受け付けていますので、その形式でfit()に渡すことでエラーを解決できます。

そのため、通常のリストやSerieis型を渡すと以下のようなエラーになりますので、

ValueError: Expected 2D array, got 1D array instead: array=[12 16 20 28 36]. Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

2D配列ではなく、1D配列(通常のリスト等)になってしまっているためです。 そのため以下のようにするとエラーになります。

このプログラムはエラーになる例です

# エラーになってしまう例
from sklearn.linear_model import LinearRegression

x = [12,16,20,28,36]
y = [700,900,1300,1750,1800]

model = LinearRegression()
model.fit(x,y)

エラーを出さすにfit()を正常に処理させるには、 二重カッコ もしくは、エラーメッセージに記載あるようにreshape(-1,1)を用いる必要があります。

from sklearn.linear_model import LinearRegression

X = [[12],[16],[20],[28],[36]]
y = [[700],[900],[1300],[1750],[1800]]

model = LinearRegression()
model.fit(X,y)

reshape(-1, 1) を用いる場合

関連テキスト:NumPy reshapeの-1に関して | AI Academy

import numpy as np
from sklearn.linear_model import LinearRegression

x = [12,16,20,28,36]
y = [700,900,1300,1750,1800]

X = np.array(x).reshape(-1,1)

model = LinearRegression()
model.fit(X,y)

reshape()はnumpy arrayに対して利用できるため、リスト型のxをnumpy arrayにしてから、reshape()を実施しています。

以下の画像の、1つ目のxは通常のリストとして定義しており、2つ目のxはnumpy arrayとしてのxです。

このように、sklearnのfit()では以下のような形状を受け付けております。

array([[12],
       [16],
       [20],
       [28],
       [36]])

fit()に渡すXの形状が以下のように行列形式であれば問題ありません。

print(X.shape) # (5,1)

質問し放題の環境で1日あたりの費用194円で学べる!業界最安値オンラインAIプログラミングスクールAI Academy Bootcamp

AI Academy Bootcampの「オンデマンド動画+チャットサポートプラン」は6ヶ月質問し放題で受講料が35,000円(税込)でご受講頂けます。
1日の受講費用換算で、なんと194円でご受講頂けます。

450種類のオリジナルテキストコンテンツに加え、5つの動画コース(AIプランナーコース、初めてのPythonプログラミング、Pythonプログラミング入門コース、データサイエンティストコース、機械学習エンジニアコース)もご受講頂けます。

業界最安値で、どこよりもお得に、効率よくAIスキルを身に付けたい方、AI人材として転職したい方は是非ご受講ご検討ください。

AI Academy Bootcamp