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')