あれもPython,これもPython

Pythonメモ※本サイトはアフィリエイトを利用しています

ipywidgetでデータサイエンスの効率化をしたい(重回帰分析)

これの続きです。

esu-ko.hatenablog.com

基本機能は上記で終わっているので、
今回は目的変数を足してみます。

変更点

ドロップダウンで目的変数を足すことにします。

dp = wi.Dropdown(
    options=bos.columns,
    disabled=False
)

使うモデルを回帰にします。
今回はシンプルに、sklearnで回帰にします。

from sklearn.linear_model import LinearRegression

reg = LinearRegression(normalize=False)

statsmodelsを使っての回帰を調べた時の記事はこちらです。 esu-ko.hatenablog.com

また、繰り返しの分析の結果を記録に残せるようにします。 self.logに実行ごとに結果を記録します。

    y_pred = self.res.predict(self.data.loc[:,feature_names])
    log = {
        'features':feature_names,
        'coef': pd.Series(self.res.coef_,index=feature_names),
        'rms': sqrt(mean_squared_error(self.data[target_],y_pred)),
        'r2':r2_score(self.data[target_],y_pred)
    }
    self.log.append(log)

クラスにする

前回書いたようにクラスにします。
目的変数などをまとめて渡せす形に変更しました。

from sklearn.datasets import load_boston
import ipywidgets as wi
import pandas as pd
from sklearn.linear_model import LinearRegression

#評価系
from sklearn.metrics import r2_score,mean_squared_error
from math import sqrt

class RegGui:
  def __init__(self,data):
    self.log = []
    self.res = None
    self.data = data
    self.checks = [wi.Checkbox(description=n) for n in self.data.columns]

    self.dp = wi.Dropdown(
      options=data.columns,
      disabled=False
    )

    self.button = wi.Button(description='実行')
    self.button.on_click(self.on_click)    

    self.left_box = wi.VBox([self.dp])
    self.center_box = wi.VBox(self.checks)
    self.right_box = wi.VBox([self.button])


  def panel(self):
    display(wi.HBox([self.left_box, self.center_box,self.right_box]) )
    
  def on_click(self,e):

    feature_names = [cb.description for cb in self.checks if cb.value]
    target_ = self.dp.value
    reg = LinearRegression()
    self.res = reg.fit(y=self.data[target_],X=self.data.loc[:,feature_names])

    y_pred = self.res.predict(self.data.loc[:,feature_names])
    log = {
        'features':feature_names,
        'coef': pd.Series(self.res.coef_,index=feature_names),
        'rms': sqrt(mean_squared_error(self.data[target_],y_pred)),
        'r2':r2_score(self.data[target_],y_pred)
    }
    self.log.append(log)

試しにボストンデータを渡してみます

b = load_boston()
bos = pd.DataFrame(lb['data'],columns = lb['feature_names'])
bos['price'] = lb['target']
gui = RegGui(bos)
gui.panel()

プルダウンで目的変数を、チェックボックスで説明変数を選んで実行します。
回帰係数はgui.res.coef_でもとれますし、self.logから履歴もとれるようにしました。
(本当は自動でグラフを出力できるようにしたかったんですが、更新されず、何度もグラフがでてしまい、、、また勉強します)