【Python】sklearn fit()時に発生するエラーの原因と解決方法

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

sklearnのモデルを学習する際に、fit()を実行すると「ValueError: Expected 2D array, got 1D array instead」というエラーが発生する場合があります。エラーメッセージには.reshape(1,-1)を使うように書いてあり、.reshape(1,-1)を使えばエラー回避出来ますが、本質的に理解できていない・・・という方もいらっしゃるのではないでしょうか?

この記事では「ValueError: Expected 2D array, got 1D array instead」の原因とエラーの解決方法を解説致します。

エラーの原因と解決策

エラーの原因ですが、sklearnのfit()では、第一引数のXには、DataFrame型やnumpyの行列形式(縦ベクトル)のみを受け付けています。そのため、それ以外の通常のリスト型などを引数に渡してしまったり、データの形状が1D配列の場合エラーになってしまいます。(通常のリストや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.

このエラーは、Xの形状が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)

機械学習を効率よく学ぶには?

機械学習を効率よく学ぶには、普段から機械学習を扱っている現役のデータサイエンティストや機械学習エンジニアに質問できる環境で学ぶことです。独学で勉強しているとエラーが発生したり、ちょっとした疑問点も解決しなくても、次に進めてしまいます。この勉強方法だと効率も悪いです。
質問し放題かつ、体系的に学べる動画コンテンツでデータ分析技術を学びたい方は、オンラインで好きな時間に勉強できるAI Academy Bootcampがオススメです。受講料も業界最安値の35,000円(6ヶ月間質問し放題+オリジナルの動画コンテンツ、テキストコンテンツの利用可能)なので、是非ご活用ください。