NumPy/Pandas Python 回帰

sklearnに頼らずRidge回帰を自力で書いてみて正則化項の影響を考えてみるテスト

投稿日:


タイトルの通り。Losso回帰と違って損失関数を偏微分するだけで出来そうなのでやってみる。
Ridge回帰は線形回帰の1種だけれども、損失関数として最小二乗法をそのまま使わず、
\(L_2\)ノルムの制約を付けたものを使う(\(L_2\)正則化)。

データとモデル

教師データ\(\boldsymbol{y}\)、訓練データ\(\boldsymbol{x}\)があるとする。
(または目的変数\(\boldsymbol{y}\)、説明変数\(\boldsymbol{x}\)があるとする。)
例えば\(p\)次の属性データが\(n\)個あり、それらと結果の対応が分かっている状況。
\begin{eqnarray}
\boldsymbol{y} &=& \begin{pmatrix}
y_1 \\
y_2 \\
\vdots \\
y_p
\end{pmatrix} ,
\boldsymbol{x} &=& \begin{pmatrix}
x_{11} & x_{21} & \cdots & x_{n1} \\
x_{12} & x_{22} & \cdots & x_{n2} \\
\vdots & \vdots & \ddots & \vdots \\
x_{1p} & x_{2p} & \cdots & x_{np}
\end{pmatrix}
\end{eqnarray}
モデルは以下。特徴ベクトル\(\boldsymbol{w}\)は訓練データの重み。
特徴空間において損失を最小化する特徴ベクトルを求める問題。
\begin{eqnarray}
\boldsymbol{y} &=& \boldsymbol{w} \boldsymbol{x} + k \\
\boldsymbol{w} &=& \begin{pmatrix}
w_1 & w_2& \cdots &w_p
\end{pmatrix}
\end{eqnarray}

損失関数

普通の2乗損失に正則化項(\(L_2\)ノルムを定数倍した値)を付けたものを損失関数として利用する。
正則化項の係数はハイパーパラメータとして調整する値。逆数なのはsklearnに従う。
\begin{eqnarray}
L(\boldsymbol{w}) = |\boldsymbol{y} - \boldsymbol{w} \boldsymbol{x}|^2 +C |\boldsymbol{w}|^2
\end{eqnarray}
特徴ベクトルは以下。(mathjaxでargminが出せない...)
\begin{eqnarray}
\newcommand{\argmin}[1]{\underset{#1}{\operatorname{arg}\,\operatorname{min}}\;}
\boldsymbol{w} = \argmin w L(\boldsymbol{w}) = \argmin w |\boldsymbol{y} - \boldsymbol{w} \boldsymbol{x}|^2 + C |\boldsymbol{w}|^2
\end{eqnarray}

特徴ベクトルを求める

勾配=0と置けば上の式の解を得られる。
損失関数が微分可能だからできる技。
\begin{eqnarray}
\frac{\partial L(\boldsymbol{w})}{\partial \boldsymbol{w}} &=& 2 \boldsymbol{w}^T (\boldsymbol{y} - \boldsymbol{w} \boldsymbol{x}) + C \boldsymbol{w} \\
&=& 0
\end{eqnarray}
変形する。
\begin{eqnarray}
2 \boldsymbol{x}^T (\boldsymbol{x}\boldsymbol{w}-\boldsymbol{y}) + C \boldsymbol{w} &=& 0 \\
\boldsymbol{x}^T (\boldsymbol{x}\boldsymbol{w}-\boldsymbol{y}) + C \boldsymbol{w} &=& 0 \\
\boldsymbol{x}^T \boldsymbol{x} \boldsymbol{w} -\boldsymbol{x}^T \boldsymbol{y} + C\boldsymbol{w} &=& 0 \\
(\boldsymbol{x}^T \boldsymbol{x} +C E) \boldsymbol{w} &=& \boldsymbol{x}^T \boldsymbol{y} \\
\boldsymbol{w} &=& (\boldsymbol{x}^T \boldsymbol{x} + C E)^{-1} \boldsymbol{x}^T \boldsymbol{y}
\end{eqnarray}

テストデータを作る

練習用にsklearnのbostonデータを使ってみる。
ボストンの住宅価格が目的変数、属性データが説明変数として入ってる。

散布図行列を表示してみる。
PRICEと関係がありそうなZN,RM,AGE,DIS,LSTATの5個を使ってみる。

特徴ベクトルを自力で計算する

これを自力で計算してみる。\(C=0.01\)、\(C=0\)、\(C=100\)としてみた。
\begin{eqnarray}
\boldsymbol{w} &=& (\boldsymbol{x}^T \boldsymbol{x} + C E)^{-1} \boldsymbol{x}^T \boldsymbol{y}
\end{eqnarray}

\(C=0\)のとき、つまり最小二乗法のとき。

sklearnを使う

sklearnのridge回帰モデルを使うと以下みたいになる。

出てきた特徴ベクトルを並べてみる

自力で計算したものとsklearnに計算してもらったものを並べてみる。
似てるのか似ていないのかよくわからない .. けど、RMの寄与度が高いというのは似ている。

自力で計算したモデルの正答率を求めてみないとなんとも...
そして、正規化項の係数の大小がどう影響するのか、あまり良くわからなかった..。
\(L_2\)ノルムの制約を付けると、パラメタの大小が滑らかになると言いたかったのだけども。

あと、訓練データに対して68%、テストデータに対して58%という感じで、
大して成績が良くない...。 

-NumPy/Pandas, Python, 回帰
-,

Copyright© ikuty.com , 2019 AllRights Reserved Powered by AFFINGER4.