sklearn.linear_modelによる線形回帰分析に、いくつかの曲線を当てはめた時の決定係数の変化


線形回帰分析は、与えあれたデータが最も近似する直線の式と、その式に与えられたデータがどれくらい近いかを算出してくれます。(雑な解釈ですが・・・)今回、以下のソース中のy - y7で示される曲線に対し線形回帰分析を行い、決定係数の違いを確認しました。yは、直線そのものですが、y1-y7は曲線になっています。

ソース

import pandas as pd 
from sklearn.linear_model import LinearRegression

import matplotlib.pyplot as plt


#データ準備
dt={
    "x"  :[1100 , 1200 , 1300 , 1400 , 1500 , 1600 , 1700 ]  ,
    "y"  :[1100 , 1200 , 1300 , 1400 , 1500 , 1600 , 1700 ]  ,
    "y1" :[1100 , 1100 , 1100 , 1100 , 1100 , 1700 , 1700 ]  ,
    "y2" :[1100 , 1100 , 1700 , 1700 , 1700 , 1700 , 1700 ]  ,
    "y3" :[1100 , 1150 , 1350 , 1350 , 1550 , 1550 , 1700 ]  ,
    "y4" :[1100 , 1200 , 2300 , 1400 , 1500 , 1600 , 1700 ]  ,
    "y5" :[1100 , 1200 ,  500 , 1400 , 1500 , 1600 , 1700 ]  ,
    "y6" :[1100 , 1700 , 1100 , 1700 , 1100 , 1700 , 1700 ]  ,
    "y7" :[1100 , 1100 , 1200 , 1300 , 1450 , 1520 , 1700 ]  ,
    }

#描画位置
pos={
    "y" :[0,0]  ,
    "y1":[0,1]  ,
    "y2":[1,0]  ,
    "y3":[1,1]  ,
    "y4":[2,0]  ,
    "y5":[2,1]  ,
    "y6":[3,0]  ,
    "y7":[3,1]  ,
}


yset=list(dt.keys())
yset.remove("x")
yset.sort()

x=pd.DataFrame(dt["x"])


#描画関連初期化
len_yset=len(yset)
fig, ax = plt.subplots(int(len_yset/2),2  , figsize=(13,8),constrained_layout=True )  # Create a figure and an axes.

for y_val in yset :
    y=pd.DataFrame(dt[y_val])

    #線形回帰モデルの実行

    #model = LinearRegression(fit_intercept=False)     #線形回帰モデルの呼び出し(切片は計算に使用しない)
    model = LinearRegression()          #線形回帰モデルの呼び出し
    model.fit(x   , y)                  #モデルの訓練

    coef=round(model.coef_[0][0] ,2)              #回帰変数
    intercept=round(model.intercept_[0] ,2)       #回帰直線の切片
    score=round(model.score(x,y) ,2)              #決定係数


    #text出力
    print("{} : y={}x {:+}  決定係数 {} ".format(y_val , coef ,intercept ,score))

    #描画
    ax[pos[y_val][0] , pos[y_val][1] ].plot(dt["x"] , dt[y_val]  , label= y_val)
    ax[pos[y_val][0] , pos[y_val][1] ].set_title("y={}x {:+}  決定係数 {} ".format(coef ,intercept ,score) , fontname="MS Gothic")  # Add a title to the axes.
    ax[pos[y_val][0] , pos[y_val][1] ].legend()  # Add a legend.
plt.show()

結果

y 決定係数
y y=1.0x -0.0 1.0
y1 y=1.07x -228.57 0.63
y2 y=1.07x +28.57 0.63
y3 y=1.0x -7.14 0.96
y4 y=0.64x +642.86 0.12
y5 y=1.29x -514.29 0.47
y6 y=0.64x +542.86 0.19
y7 y=1.03x -106.43 0.96

直線のy=1、直線に近いもの(y3,y7)は決定係数が1に近いが、それ以外は、0.6以下となっている。やっぱ、「決定係数」と言うだけのことはある。

回帰分析についての、私なりの素人解釈になりましたが、間違い等ありましたら指摘していただけると助かります。

参考

LinearRegression クラスについてメモ
sklearn.linear_model.LinearRegression