pythonで回帰分析(重回帰分析)

pythonで回帰分析(重回帰分析)をするときのまとめ。結果の出力まで。

scikitlearnを使う

後述のstatsmodelsが機能は充実しているが、サクッと使いたいor他のモデルを使っている場合はこちら。係数の比較などをしたいので、データは規格化しています。

from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression

scaler = StandardScaler()
clf = LinearRegression()

y = target #インプットデータ
X = x_data #インプットデータ 

scaler.fit(X)
clf.fit( scaler.transform(X), y )
y_pred = clf.predict(scaler.transform(X)) # yの予測
print( clf.coef_) # 重み(係数の確認)
print( clf.score(scaler.transform(X),y ) # スコアの確認

statsmodelsを使う

import statsmodels.api as sm
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

y = target #インプットデータ
X = x_data #インプットデータ 
#X = X.reshape(-1,1) #型の変換が必要な時
scaler.fit(X)
X = scaler.transform(X)
X = sm.add_constant(X)

model  = sm.OLS( y, X )
result = model.fit()
y_pred =  result.predict( X ) #yの予測
print( result.summary() ) # 重回帰のデータを出力

stasmodelを使ったあとのモデルの保存

result.save('foo') # statsmodelsの標準機能、pickleで保存

# summaryを適当なテキストデータで保存
file = open('summary.txt', 'w')
file.write(str(result.summary()))
file.close()

グラフを作成

回帰分析したので、予測値と実測値を比較する図を(ざっくり)作成します。下記は一例。

from decimal import Decimal, ROUND_HALF_UP

xy_min  = 0
xy_max = 4
plt.figure(figsize=(6,6)) # グラフは正方形
plt.plot( y_pred, y, 'o' )
plt.xlim([xy_min,xy_max])
plt.ylim([xy_min,xy_max])
plt.plot([xy_min,xy_max],[xy_min,xy_max],'k-')
plt.xlabel('Predicted')
plt.ylabel('Measured')
rs = str(Decimal(str(str( result.rsquared ))).quantize(Decimal('0.001'), rounding=ROUND_HALF_UP)) #スコアをstr形式に変換
plt.text(0.2,3.7,'R-squared: '+rs) # 適当な位置にスコアを表示
plt.savefig('result.png')