単回帰分析でScikit-learnに説明変数を準備する際の注意点

単回帰分析でScikit-learnに説明変数を準備する際の注意点

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)