Scikit-learnの単回帰分析で説明変数の指定する時の注意点です。
初心者はハマりやすいところですから注意しましょう。
次のサンプルは’G1’(1学期の成績)から単回帰分析を行い’G3’(最終学期)の成績を予測するモデルです。
問題は説明変数 X の設定のところです。
サンプルはカリフォルニア大学アーバイン校が提供する学生の個人情報と成績のサンプルを使用。
http://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip
サンプルコード
import numpy as np import pandas as pd import requests, zipfile from io import StringIO import io # データ取得 url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/00356/student.zip' r = requests.get(url, stream=True) z = zipfile.ZipFile(io.BytesIO(r.content)) z.extractall() student_data_math = pd.read_csv('./student-mat.csv',sep=';') from sklearn import linear_model # 線形回帰のインスタンスを生成 reg = linear_model.LinearRegression() # この記述なら2次元の表現になる # student_data_math[['G1']].valuesとしても良い X = student_data_math.loc[:, ['G1']].values # 説明変数に "一期目の数学の成績" X = student_data_math.loc[:, ['G1']].values # 目的変数 "最終の数学の成績" Y = student_data_math['G3'].values # 学習 reg.fit(X, Y) # 回帰係数 print('回帰係数:', reg.coef_) # 切片 print('切片:', reg.intercept_) x = [[10],[15],[18]] result = reg.predict(x) result # 決定係数 print('決定係数:', reg.score(X, Y))
ここで問題の、説明変数の取り出し方法は次のようにするとエラーになります。
X = student_data_por['G1'].values
正しい記述は次のようにします。
X = student_data_por[['G1']].values
この2つのXの値は微妙に違います。
「X = student_data_por[‘G1’].values」 では1次元のデータになります。
「X = student_data_por[[‘G1’]].values」 とすると、2次元のデータになります。
Scikit-learnの単回帰分析では、説明変数は2次元のデータを準備する必要があります。
またreshape()を使用して2次元にすることもできます。
X = student_data_por['G1'].values.reshape(-1,1)