2021-10-10に更新

【ラビット・チャレンジ】機械学習 (編集中)

ラビット・チャレンジ 機械学習 E資格 【ラビット・チャレンジ】受講レポート 公開下書き

ラビット・チャレンジの受講レポート。


線形回帰モデル

線形≒比例
→n次元空間における超平面の方程式
ベクトルでも表すことが可能

\begin{split}
        y &= a_0 + a_1 x_1 + a_2 x_2 + \cdots + a_{n-1} x_{n-1}\\  
        &= a_0 + \sum_{i=1}^{n-1} a_i x_i\\  
        &= \sum_{i=0}^{n-1} a_i x_i, \mathrm{where} x_0 = 1\\  
        &= a^T x, \mathrm{where}\\  
        &a = 
        \begin{pmatrix}
            a_0 \\  
            a_1 \\  
            \vdots \\  
            a_{n-1}
        \end{pmatrix} (n-vector) \\  
        &a^T = (a_0 a_1 \cdots a_{n-1})\\  
        &x = 
        \begin{pmatrix}
            x_0 \\  
            x_1 \\  
            \vdots \\  
            x_{n-1} \\  
        \end{pmatrix} (n-vector) \\  
        &(a_0 a_1 \cdots a_{n-1})
        \begin{pmatrix}
            x_0 \\  
            x_1 \\  
            \vdots \\  
            x_{n-1}
        \end{pmatrix}
    \end{split}

回帰問題

  • ある入力から出力を予測
    • 線形回帰:直線
    • 非線形回帰:曲線
  • 回帰で扱うデータ
    • 入力 (各要素を説明変数または特徴量と呼ぶ)
      • m次元のベクトル
      • \boldsymbol{x} = (x_1, x_2, \cdots, x_m)^T \in \mathbb{R}^m (←太字はベクトル、細字は要素、\mathbb{R}は実数全体)
    • 出力 (目的変数)
      • スカラー値
      • y \in \mathbb{R}^1

参考:

  • Vapnikの原理
  • 密度比推定 (東工大 杉山先生の研究がおもしろい)

線形回帰モデル

  • 入力とm次元パラメータの線形結合を出力するモデル

    • 予測値にはハットをつける
  • 教師データ:

    • {(x_i, y_i); i = 1, \cdots, n}
  • パラメータ:
    • \boldsymbol{w} = (w_1, w_2, \cdots, w_m)^T \in \mathbb{R}^m
  • 線形結合:
    • \hat{y} = \boldsymbol{w} ^T \boldsymbol{x} + w_0 = \sum ^m _{j=1} w_j x_j + w_0
    • 入力ベクトルと未知のパラメータの各要素を掛け算して足し合わせたもの
    • 出力は1次元
  • モデルのパラメータ
    • 特徴量が予測値に対してどのように影響を与えるかを決定する重みの集合
      • 重みが大きいほど影響大
      • y軸との交点を表す

説明変数が1次元の場合

【モデル数式】

\overbrace{y}^{objective variable} = \underbrace{w_0}_{intercept} + \overbrace{w_1}^{regression coefficient} \underbrace{x_1}_{explanatory variable} + \overbrace{ \epsilon }^{error}

x, y:既知 / 入力データ
w:未知 / 学習で決める

目的変数の予測に必要な説明変数をモデルに含めていない場合、
その説明変数の影響は誤差に乗っかってくる

【連立方程式】

y_1 = w_0 + w_1 x_1 + \epsilon_1
y_1 = w_0 + w_1 x_1 + \epsilon_1
\vdots
y_1 = w_0 + w_1 x_1 + \epsilon_1

【行列表現】

\boldsymbol{y} = X \boldsymbol{w} + \epsilon

\overbrace{
        \begin{pmatrix}
            y_1 \\  
            y_2 \\  
            \vdots \\  
            y_n
        \end{pmatrix}
    }^{n * 1}
    = 
    \overbrace{
        \begin{pmatrix}
            1 & x_1 \\  
            1 & x_2 \\  
            \vdots & \vdots \\  
            1 & x_n
        \end{pmatrix}
    }^{n *2}
    \overbrace{
        \begin{pmatrix}
            w_0 \\  
            w_1
        \end{pmatrix}
    }^{2 * 1}

プログラムを書くときは、行列のshapeに注意

説明変数が多次元の場合(m > 1)

【モデル数式】

\overbrace{y}^{objective variable} = \underbrace{w_0}_{intercept} + \overbrace{w_1}^{regression coefficient} \underbrace{x_1}_{explanatory variable} +  \overbrace{w_2}^{regression coefficient} \underbrace{x_2}_{explanatory variable} + \overbrace{ \epsilon }^{error}

x, y:既知 / 入力データ
w:未知 / 学習で決める

データは回帰局面に誤差が加わり観測されていると仮定

【連立方程式】

y_1 = w_0 + w_1 x_{11} + w_2 x_{12} + \cdots + w_m x_{1m} + \epsilon_1
y_1 = w_0 + w_1 x_{11} + w_2 x_{12} + \cdots + w_m x_{1m} + \epsilon_1
\vdots
y_1 = w_0 + w_1 x_{11} + w_2 x_{12} + \cdots + w_m x_{1m} + \epsilon_1

\Longrightarrow \boldsymbol{y} = \underbrace{X}_{design matrix} \boldsymbol{w}

未知パラメータwは最小に情報により推定

【行列表現】

\boldsymbol{y} = X \boldsymbol{w} + \epsilon

\overbrace{
        \begin{pmatrix}
            y_1 \\  
            y_2 \\  
            \vdots \\  
            y_n
        \end{pmatrix}
    }^{n * 1}
    = 
    \overbrace{
        \begin{pmatrix}
            1 & x_{11} & \cdots & x_{1m} \\  
            1 & x_{21} & \cdots & x_{2m} \\  
            \vdots & \vdots & \vdots & \vdots \\  
            1 & x_{n1} & \cdots & x_{nm}
        \end{pmatrix}
    }^{n * (m + 1)}
    \overbrace{
        \begin{pmatrix}
            w_0 \\  
            w_1 \\  
            \vdots \\  
            w_m
        \end{pmatrix}
    }^{(m + 1) * 1}

備考:

  • 行列を見てこんがらがったら、いったん連立方程式に変換して考えてみるとよい
  • データ数n > m+1でないと解けない
  • 参考文献 「機械学習のエッセンス

汎化

データを学習用と検証用に分割
→モデルの汎化性能を測定するため

最小二乗法

線形回帰モデルのパラメータはこの方法で推定

  • 平均二乗誤差(残差平方和)
    • データとモデル出力の二乗誤差の和
  • 最小二乗法
    • 学習データの平均二乗誤差を最小とするパラメータを探索
      • その勾配が0となる点を求めればよい

\sum _i \overbrace{ (\hat{y}_i - y_i)^2 }^{square \space error} = \sum _i \epsilon^2_i

※二乗損失は一般に外れ値に弱い
→Huber損失、Tukey損失

参考文献:

  • イラストで学ぶ機械学習

\mathrm{ MSE }_{\mathrm{train<span>}</span><span>}</span>= J(W) = \frac{1}{n_{train<span>}</span><span>}</span> \sum_{i=1}^{n_{train<span>}</span><span>}</span> (\overbrace{ \hat y_i^{(train)} }^{W^T x_i^{(train)<span>}</span><span>}</span> - y_i^{(train)})^2

  • \hat{ \boldsymbol{w} } = \mathrm{arg} \space \mathrm{min} \space \mathrm{MSE} _{\mathrm{train<span>}</span><span>}</span>
    \qquad \boldsymbol{w} \in \mathbb{R}^{m+1}
    • MSEを最小にするようなw (m次元)
    • arg:パラメータを指す
    • min:最小値
  • \frac{\partial}{\partial \boldsymbol{w<span>}</span><span>}</span> \mathrm{MSE}_{\mathrm{train<span>}</span><span>}</span> = 0
    • MSEをwに関して微分したものが0となるwの点を求める

\sumを行列に変換】

 \hat{ \boldsymbol{w} } = \mathrm{arg} \space \mathrm{min} \space \mathrm{MSE} _{\mathrm{train<span>}</span><span>}</span>

\frac{\partial}{\partial \boldsymbol{w<span>}</span><span>}</span> \mathrm{MSE} _{\mathrm{train<span>}</span><span>}</span> = 0

\Longrightarrow \frac{\partial}{\partial \boldsymbol{w<span>}</span><span>}</span> {\frac{1}{n_{train<span>}</span><span>}</span> \sum_{i=1}^{n_{train<span>}</span><span>}</span> ( \hat y_i^{(train)} - y_i^{(train)} )^2 } = 0

\Longrightarrow \frac{\partial}{\partial \boldsymbol{w<span>}</span><span>}</span> {\frac{1}{n_{train<span>}</span><span>}</span> \sum_{i=1}^{n_{train<span>}</span><span>}</span> ( \boldsymbol{x}_i^T \cdot \boldsymbol{w} - y_i^{(train)} )^2 } = 0

\Longrightarrow \frac{\partial}{\partial \boldsymbol{w<span>}</span><span>}</span> {\frac{1}{n_{train<span>}</span><span>}</span> (\boldsymbol{X} \boldsymbol{w} - \boldsymbol{y})^T (\boldsymbol{X} \boldsymbol{w} - \boldsymbol{y}) } = 0

\qquad \qquad \boldsymbol{X} \boldsymbol{w} - \boldsymbol{y}

\qquad \qquad \longrightarrow
\overbrace{
    \begin{pmatrix}
       1 & x_{11} & \cdots & x_{1m} \\  
       1 & x_{21} & \cdots & x_{2m} \\  
       \vdots & \vdots & \vdots & \vdots \\  
       1 & x_{n1} & \cdots & x_{nm}
   \end{pmatrix}
}^{X}
\overbrace{
    \begin{pmatrix}
        w_0 \\  
        w_1 \\  
        \vdots \\  
        w_m
    \end{pmatrix}
}^{w} -
\overbrace{
    \begin{pmatrix}
        y_1 \\  
        y_2 \\  
        \vdots \\  
        y_n
    \end{pmatrix}
}^{y}

\Longrightarrow \frac{1}{n_{train<span>}</span><span>}</span> \cdot \frac{\partial}{\partial \boldsymbol{w<span>}</span><span>}</span> \{ (\boldsymbol{w}^T \boldsymbol{X}^T  - \boldsymbol{y}^T) (\boldsymbol{X} \boldsymbol{w} - \boldsymbol{y}) \} = 0

\Longrightarrow \frac{1}{n_{train<span>}</span><span>}</span> \cdot \frac{\partial}{\partial \boldsymbol{w<span>}</span><span>}</span> { \boldsymbol{w}^T \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w} - \overbrace{ \boldsymbol{w}^T \boldsymbol{X}^T \boldsymbol{y} - \boldsymbol{y}^T \boldsymbol{X} \boldsymbol{w} }^{equal} - \boldsymbol{y}^T\boldsymbol{y} } = 0

\Longrightarrow \frac{1}{n_{train<span>}</span><span>}</span> \cdot \frac{\partial}{\partial \boldsymbol{w<span>}</span><span>}</span> { \underbrace{ \boldsymbol{w}^T \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w} }_{quadratic \space term \space of \space w} - \overbrace{ 2 \boldsymbol{w}^T \boldsymbol{X}^T \boldsymbol{y} }^{primary \space term \space of \space w} - \boldsymbol{y}^T\boldsymbol{y} } = 0

\Longrightarrow \frac{1}{n_{train<span>}</span><span>}</span> { 2 \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w} - 2 \boldsymbol{X}^T \boldsymbol{y} } = 0

\begin{split}
        (because) \frac{ \partial( \boldsymbol{w} ^T \boldsymbol{w} ) }{ \partial \boldsymbol{w} }  &= \boldsymbol{x} \\  
        \frac{\partial (\boldsymbol{w} ^T A \boldsymbol{w})}{\partial \boldsymbol{w<span>}</span><span>}</span> &= (A + A^T) \cdot \boldsymbol{x} \\  
        &= 2A \boldsymbol{x} (A:symmetric \space matrix)
    \end{split}

\Longrightarrow 2 \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w} - 2 \boldsymbol{X}^T \boldsymbol{y} = 0

\Longrightarrow 2 \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w} = 2 \boldsymbol{X}^T \boldsymbol{y}

\Longrightarrow \overbrace{ (\boldsymbol{X}^T \boldsymbol{X})^{-1} (\boldsymbol{X}^T \boldsymbol{X}) }^{A^{-1}A = I (identity \space matrix)} \cdot \boldsymbol{w} = (\boldsymbol{X}^T \boldsymbol{X})^{-1} \boldsymbol{X}^T \cdot \boldsymbol{y}

\Longrightarrow \boldsymbol{w} = (\boldsymbol{X}^T \boldsymbol{X})^{-1} \cdot \boldsymbol{X}^T \boldsymbol{y}

参考書籍:

  • Matrix Cook Book

【回帰係数】

\hat{ \boldsymbol{w} } = (X^{(train)T} X^{(train)})^{-1} X^{(train)T} \boldsymbol{y} ^{(train)}

【予測値】

\hat{ \boldsymbol{y} } = X (X^{(train)T} X^{(train)})^{-1} X^{(train)T} \boldsymbol{y} ^{(train)}

\hat{ \boldsymbol{w} } = \underbrace{(X^{T} X)^{-1<span>}</span><span>}</span> X^{T} \boldsymbol{y}

↑逆行列は常に存在するわけではない (一般化逆行列)

\hat{ \boldsymbol{y} } = \overbrace{ X_* }^{new \space input \space to \space predict(n_*)} \cdot \hat{ \boldsymbol{w} } = \overbrace{ X_* }^{n_* \times (m+1)} \cdot \overbrace{ (X^{T} X)^{-1} X^{T} \boldsymbol{y} }^{(m+1) \times 1}

X_* \cdot \hat{ \boldsymbol{w} } =  X_* \cdot (X^{T} X)^{-1} X^{T} の部分を射影行列という

ハンズオン

ボストンの住宅価格予測

【データセットの中身を確認する際の注意点】

  • 不正な値がないか?
    • 範囲外の値?外れ値?
  • ヒストグラムに直してみる
  • avr, min, maxを確認してみる
  • 上限を超えた値は一律上限の値にされている、など

まず最初の数行を見て、気になる点があれば表示する行数を増やしてみて確認する

【予測した値がおかしかった際に疑うこと】

  • モデルの設計をミスした?
    • 範囲外の値をとらないモデルにする?
  • 元のデータセットにない値を使って予測しようとした?
    • →外挿問題

ドメイン知識に基づいて、予測結果が正しいかを確認する


非線形回帰モデル

単回帰 / 重回帰

y = w_0 + w_1 \cdot x \quad / \quad y = w_0 + w_1 \cdot x_1 + w_2 \cdot x_2 + \cdots + w_m \cdot x_m

非線形な回帰を考えたい:
e.g.

  • y = w_0 + w_1 \cdot x + w_2 \cdot \overbrace{ x^2 }^{ \phi_2(x) } + w_3 \cdot \overbrace{ x^3 }^{ \phi_3(x) }
  • y = w_0 + w_1 \cdot \overbrace{ \sin x } + w_2 \cdot \overbrace{ \cos x } + w_3 \cdot \overbrace{ \log x }

→Idea: xの代わりに、\phi(x) を用いる
 xが\phi(x) に代わるだけ!

※xから\phi(x) に代えても、wについては線形のまま
f(x) = ax^2+bx+c ・・・xについての2次関数
f(x) = ax^2+bx+c ・・・aについての1次関数

予測モデル:\hat y = w_0 + w_1 \cdot \phi_1(x) + w_2 \cdot \phi_w(x) + \cdots + w_m \cdot \phi_m(x)
→これは重みwについて線形 (linear-in-parameter)

  • 基底展開法
    • 回帰係数として、基底関数とパラメータベクトルの線形結合を使用
      • 基底関数:既知の非線形関数
    • 未知パラメータは最小2乗法や最尤法により推定
      • (線形回帰モデルと同様)

\qquad \qquad y_ = w_0 + \sum _{j=1}^m w_j \overbrace{ \phi_j(x_i) }^{basis \space function} + \epsilon_i

  • よく使われる基底関数
    • 多項式関数
      • \phi_j = x^j
    • ガウス型基底関数
      • \phi_j(x) = \exp{ \frac{(x - \mu_j)^2}{2h_j} }
    • スプライン関数 / Bスプライン関数

☆基底関数 \phi(x) に多項式関数\phi_j = x^j を考える

\begin{split}
        \hat y_i &= w_0 + w_1 \cdot \overbrace{ \phi_1(x_i) }^{x_i^1} + w_2 \cdot \overbrace{ \phi_2(x_i) }^{x_i^2} + \cdots + w_9 \cdots \overbrace{ \phi_9(x_i) }^{x_i^9} \\  
        &= \overbrace{ w_0 } + \overbrace{ w_1 } \cdot x_i + \overbrace{ w_2 } \cdot x_i^2 + \cdots + \overbrace{ w_9 } \cdot x_i^9 \\ 
\end{split}

↑求めるべきwについては線形であることに注意

何度でもクリック!→

marshmallow444

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

marshmallow444 の最近の記事