Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

非線形回帰モデルのまとめ

この記事は個人的なお勉強用のメモです。

講義

非線形回帰モデル

線形(=比例)ではないモデル。

\begin{align}
y&=w_0+w_1x+w_2x^2+w_3x^3 (3次関数)\\
y&=w_0+w_1 \sin x + w_2 \cos x + w_3 \log x
\end{align}

$x$ をそのままではなく、$\phi(x)$ を使う。
$\phi(x)$ は $x$ の任意の関数。基底関数という。
パラメータ $w$ は線形のまま。

\begin{align}
\phi_2(x) &= x^2\\
\phi_3(x) &= x^3\\
\phi_4(x) &= \sin x\\
\phi_5(x) &= \cos x\\
\phi_6(x) &= \log x\\
\end{align}

【重要】以下の式は、$x$ については非線形だが、重み $w$ については線形。

\hat{y}=w_0+w_1\phi_1(x)+w_2\phi_2(x)+...+w_m\phi_m(x)
  • 規定展開法
    • 回帰関数として、基底関数と呼ばれる既知の非線形関数とパラメータベクトルの線形結合を使用
    • 未知パラメータは線形回帰モデルと同様に最小二乗法や最尤法により推定

よく使われる基底関数(Φファイ)

  • 多項式関数(x_nのような関数)
  • ガウス型基底関数(正規分布。$\phi$ ごとに平均 $\mu$ と分散 $\sigma^2$ が異なる)
  • スプライン関数 / Bスプライン関数

例えば多項式関数の場合、$m$ を指定する。
$m=3$ の場合、$w_1x^1 + w_2x^2 + w_3x^3$ になる。
上の式は3次式。つまり、3次式のグラフになる。
多項式の場合は、次数によってグラフが変化する。
どれくらい曲線をくねらせたいかによる。

  • 説明変数
    $x_i=(x_{i1},x_{i2},...,x_{im}) \in R^m$
  • 非線形関数ベクトル
    $\phi(x_i)=(\phi_1(x_i),\phi_2(x_i),...,\phi_k(x_i))^T \in R^k$
    $x_i$ に対して 様々な $\phi()$ を適用する。
  • 非線形関数の計画行列
    $\Phi=\Bigl(\phi(x_1), \phi(x_2), ..., \phi(x_n)\Bigr)^T \in R^{n\times k}$
  • 重み
    $\hat{w}=(\Phi^T\Phi)^{-1}\Phi^Ty$
    ↑ 線形回帰の $X$ が $\Phi$ に変わっただけ。線形回帰での式は $\hat{w}=(X^TX)^{-1}X^Ty$
  • 最尤法(最小二乗法)による予測値
    $\hat{y}=\Phi(\Phi^{(train)T} \Phi^{(train)})^{-1}\Phi^{(train)T}y^{(train)}$
    ↑ 線形回帰の $X$ が $\Phi$ に変わっただけ。線形回帰での式は $\hat{y}=X(X^TX)^{-1}X^Ty$

学習の度合い

  • 未学習(underfitting)
    学習データに対して、十分小さな誤差が得られないモデルのこと。誤差が大きい。 データの構造を充分に表現できていない。 対策:表現力の高いモデルを利用する。
  • 過学習(overfitting)
    学習データに対しては小さな誤差は得られたが、テストデータでは誤差が大きいモデルのこと。
    • 対策1:学習データの数を増やす(数の暴力での学習)
    • 対策2:不要な基底関数(変数)を削除して表現力を抑止。特徴量選択とも。どこまで削除するのかが難しい。
    • 対策3:正則化法を利用して表現力を抑止($w$ を $0$ に近づけたり $0$ にしたり)

ほどよい適切な学習をさせるのが重要。

正則化法

不要な基底関数を削除(上の対策2)

  • 基底関数の数、位置やバンド幅によりモデルの複雑さが変化
  • 解きたい問題に対して多くの基底関数を用意してしまうと、過学習の問題が起こるため適切な基底関数を用意(CVなどで選択)
  • 特徴量の数が多ければ多いほど組み合わせ爆発が起きてしまう。

正則化法(罰則化法)(上の対策3)

  • 「モデルの複雑さに伴って、その値が大きくなる正則化項(罰則項)を課した関数」を最小化
  • 正則化項(罰則化項)
    • 形状によっていくつもの種類があり、それぞれ推定量の性質が異なる
  • 正則化(平滑化)パラメータ
    • モデルの曲線のなめらかさを調整適切に決める必要あり
S_\gamma=(y-\Phi w)^T (y-\Phi w) + \gamma R(w)

$\gamma$:正則化パラメータ

正則化項(罰則項)の役割

  • 無い→最小二乗推定量
  • L2ノルムを利用→Ridge推定量
  • L1ノルムを利用→LASSO推定量

正則化パラメータの役割

  • 小さく→制約面が大きく
  • 大きく→制約面が小さく

Ridge推定

パラメータを0に近づけるよう推定
縮小推定という。

あのグラフの意味。
- $x$ 軸は $w_0$、$y$ 軸は $w_1$
- 中央の円は $w_0$ と $w_1$ に対する制約。その範囲内でこれらのパラメータを決定する。
- 右上の楕円は MSE
- 楕円の中央は、MSEの最小値
- MSEの最小値を取るような $w_0$, $w_1$ を選ぶと過学習を起こしてしまう。
- 楕円の年輪みたいなものは、MSEが同じ値を指す等高線のようなもの
- その等高線が中央の円と交わる部分をRidge推定量という
- Ridge推定量の $w_0$, $w_1$ を採用する。
- これらの値は小さいため、入力 $x$ に対する影響を小さくできる。

Ridge推定の場合は、中央の図形は円になる。

正則化パラメータ $\gamma$ の値が変わると、制約の大きさが変わる。
正則化をすると、基底関数が多くても過学習を起こさない。

LASSO推定

いくつかのパラメータを正確に0に推定
意味のないパラメータを使わない、という意味
スパース推定という(スパースとはすかすかという意味)
角の部分=係数が0(図の場合、横軸の値=0、つまり横軸のパラメータは見ない)
LASSO推定の場合は、中央の図形は四角形になる。

モデル選択

モデルを構成する要素

  • 基底関数の個数
  • 基底関数の位置
  • 基底関数のバンド幅(分散の部分とか)
  • 正則化パラメータ

いろいろと要素があるが、最適なモデルを作成するには、交差検証法で決定する。

ホールドアウト法

  • データを学習用とテスト用に分割(例:70%を学習用、30%をテスト用)
  • データの交換はしない
  • データが少ない場合に問題が起きやすい(外れ値が学習用に含まれるとそれを学習してしまう)

クロスバリデーション(交差検証)

  • データを学習用とテスト用に分割
  • それを繰り返す(5回繰り返すと、5つモデルができる、それぞれで精度検証する)
  • 精度の平均をCV(Cross Validation)値と呼ぶ
  • CV値の小さなモデルを採用する

グリッドサーチ

  • ハイパーパラメータはあらかじめ決めて必要がある場合がある(「ハイパラ調整」)。
  • $\lambda$ と $m$ というパラメータがある場合、それぞれの値の組み合わせを確かめる。これをグリッドサーチという。
  • 各パラメータに与える値は候補を用意する。

実装演習

image.png

線形回帰モデル(LinearRegression)の場合、スコア(0.177)も低く、
学習できていないことがグラフからも明らか。

image.png

KernelRidgeクラスを用いてkernelパラメータにrbfを与えている。
rbfを与えると放射基底関数(Radial basis function)という基底関数が採用される模様。
ネット上にあるグラフを見る限りでは、正規分布のようなグラフをしている。
このような非線形回帰モデルの場合、曲線となって学習用データの間をほどよく通っている。

image.png

Ridge回帰。
上のグラフではほどよく学習できている。
指定している数値のパラメータは次のとおり。
- rbf_kernel関数のgammaパラメータ(値は50)
- Ridgeクラスのalphaパラメータ(値は30)

gammaを500にしたところ、グラフがヨレヨレになって
まるで過学習を起こしたかのようなグラフになった。
しかし、あまり学習用のデータを通らない。
これは過学習とは言わないのか。

gammaを5にしたところ、緩やかな曲線になった。

gammaを50に戻して、alphaを300にしたところ、
緩やかな曲線になった。

alphaを3にしたところ、30のときと大きく変わりはない。

いずれも正則化パラメータであり、適切な値を指定する必要であることがわかる。

image.png

非線形回帰。
PolynomialFeaturesクラスによって、1乗から9乗までの多項式を作成している。
このグラフは講義の中でも出てきたが、4乗以上では曲線が重なっており
5乗以上のモデルを作る意味はなさそうに見える。

image.png

LASSO回帰。
上のグラフは配布されているソースをそのまま実行した結果。
Lassoクラスのalphaパラメータに10000が指定されており、直線になっている。
これは極度に汎化性能が高い状態。
このalphaパラメータを0.001くらいにすると、ほどよい曲線になった。

演習問題(修了テスト~練習問題~)

問題11(k-分割交差検証)

k-分割交差検証(K-fold cross-validation)

  • データセットをk個の重複しない集合に分割
  • k-1個の集合は訓練データ
  • 残りの1個の集合は検証用データ
  • これをk回繰り返して、平均をとる

問題12(k-分割交差検証)

利点

  • サイズの小さいデータセットを活用できる。
  • 繰り返し学習と評価を行うことで、過学習を防ぐ。

問題13(k-分割交差検証)

欠点

  • k回繰り返して学習と評価を行うため、計算時間がかかる。

問題32(L1正則化の式)

L1ノルムに基づいて絶対値の足し算をする。(マンハッタン距離の足し算)
これに正則化パラメータ $\lambda$ を掛ける。$\lambda$ は外部から与える。
掛けた値を元の式に加える。
よって、損失関数 $C'(W)$ をL1正則化した式はこちら。

C'(W)=C(W)+\lambda (|w_1|+|w_2|+,..,+|w_n|)

問題33(L1正則化の特徴)

  • L1正則化すると、係数が0になるため、モデルの解釈はしやすくなる。
  • L1正則化すると、要素に0を含むことが多くなる。これをスパース(すかすか)という。
  • L1正則化はLASSO正則化とも呼ばれる。Ridge正則化はL2正則化。
  • 正則化パラメータ $\lambda$ を大きくすると、重みが大きくなることへのペナルティが重くなる。

問題34(L1正則化の実装)

L1正則化は、絶対値の足し算。
すべての行を足してスカラー値を出力する必要があるので、axisの指定はしない。
axis=0を指定すると、縦方向に足し算された行列が出力される。
axis=1を指定すると、横方向に足し算された行列が出力される。

loss = loss_function(t,y) + weight_delay_lambda * np.sum(np.abs(W))

問題35(L2正則化の式)

L2ノルム(ユークリッド距離)を求める。
正則化パラメータを掛ける。
元の式に加える。

C'(W)=C(W)+\frac{1}{2}\lambda \sqrt{(w_1^2+w_2^2+,...+w_n^2)}

上の式には $\lambda$ の前に $\frac{1}{2}$ が付いているが、
付いていない場合もあるとのこと。

問題36(L2正則化の特徴)

  • L2正則化を加えると、訓練データに対する認識制度は低くなる(代わりに汎化性能が上がる)。
  • L2正則化を加えると、重み $W$ の大きさが小さくなり、汎化性能が高くなる。
  • L2正則化を加えると、重み $W$ に $0$ の要素が多くなりやすい。(正確には、$0$ に近い要素が多くなりやすい)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away