電脳ヨーグルト

プログラミングの備忘録と私生活を

sklearnを用いて単回帰分析をしてみた

f:id:at25250410:20180804172940p:plain

前の記事の延長で、jupyter notebookでsklearnを用いた単回帰分析を行っていきます。

www.prog-ganbaru.com

目標

前回、matplotlibを用いて20点満点の数学のテストについて、一学期の生徒の成績と、生徒の最終成績を散布図にしました。

f:id:at25250410:20180804155126p:plain

今回は、一学期の生徒の成績のデータ(G1)と、生徒の最終成績のデータ(G3)を用いて、新たに、一学期のテストの結果しかない、生徒A君が現れたとき、A君の最終成績を予測するようなモデル(回帰直線)を求めていきます。


f:id:at25250410:20180804155502p:plain


Y = aX + b

という、おなじみの直線の式を求めます。

Y(最終成績のG3)、X(一学期の成績のG1)は、既にデータとして持っているので、これを基に、傾きaと切片bを出します。

そもそも単回帰分析とは

回帰分析のうち、単回帰分析というのは1つの目的変数を1つの説明変数で予測するもので、その2変量の間の関係性をY=aX+bという一次方程式の形で表します。

例えば、a(傾き)とb(Y切片)がわかれば、X(身長)からY(体重)を予測することができるわけです。


単回帰分析は、この出力と入力の関係が1変数のみで成り立つ式を仮定して解いていきます。

ちなみに、Y = aX1 + bX2 + cのように、入力が2変数以上ある場合は、重回帰分析といいます。


ここでは、線形単回帰という出力と入力が線形の関係に成り立つ(y = ax +b)という仮定のもと、式を立てて計算してみます。


線形単回帰分析は、以下のsklearnモジュールのlinear_modelをインポートして、インスタンスを作成します。


f:id:at25250410:20180804164852p:plain

#インポート
from sklearn import linear_model

# 線形回帰のインスタンスを生成
clf = linear_model.LinearRegression()



次に、生徒たちの一学期の数学の点数G1をX、生徒たちの数学の最終成績G3をYとして、データをセットし、線形回帰のfitを使って、予測モデルを計算します。

# ilocはデータフレームから、行と列を指定して取り出す。loc[:, ['G1']]は、G1列のすべての列を取り出すことをしている
# marixの型に直しているので、注意

X = student_data_math.loc[:,['G1']].as_matrix()

# 目的変数に "最終の数学の成績" を利用
Y = student_data_math['G3'].as_matrix()

# 予測モデルを計算、ここでa,bを算出
clf.fit(X, Y)

# 回帰係数
print("回帰係数:", clf.coef_)
coef_は係数です。

# 切片
print("切片:", clf.intercept_)
intercept_は切片です。


f:id:at25250410:20180804155407p:plain

【出力結果】
回帰係数: [1.106]
切片: -1.6528038288004616


このように、コンピュータが自動で、簡単に係数aと、切片bを求めてくれました。


ものの数行で回帰直線を求められたわけですが、少し補足説明です。

X = student_data_math.loc[:,['G1']].as_matrix()で、loc[:, ['G1']]と書いているのは、clf.fit()で計算するために、Xを二次元する必要があるからです。

また、.as_matrix()は、データフレーム型からnumpyのarray型に変換しないと、clf.fit()が使えないため、使用しています。

as_matrix()について、こちらの記事が詳しいです。


publicjournal.hatenablog.com


clf.fit()に、XとYを放り込むだけで、簡単に回帰直線を求めることができましたが、clf.fit()で実際にどのような計算がされているかについても少し確認します。

最小二乗法

cif.fit()の中では、最小二乗法という手法で係数aと切片bを計算しています。


この方法は、実際の目的変数のデータ(Y)と予測したデータ(f(X))の差の二乗和をとり、それが最小になる時の係数と切片を求めています。


式で表現すると、yを実測値、f(x)=ax+bを予測値として、以下の式を最小にするように計算しています
(計算方法としては、この式を微分していくのですが、割愛します)。


f:id:at25250410:20180804172340p:plain


Yとf(X)の差(誤差)の二乗の和を最小にしています。


予測したい最終の数学の成績G3は、predict(説明変数)で計算できます。


線形回帰式を表示させると、冒頭の直線が出力されます。

f:id:at25250410:20180804155502p:plain


ちなみに、オプションの'r'はredのことで、回帰式に色付けしています。