機械学習 学習まとめ: 全体

# 機械学習

## 機械学習の定義
- コンピュータプログラムは、タスクT(アプリケーションにさせたいこと)を性能指標Pで測定し、その性能が経験E(データ)により改善される場合、 タスクTおよび性能指標Pに関して経験Eから学習すると言われている (トム・ミッチェル 1997)
    - 人がプログラムするのは認識の仕方ではなく、学習の仕方
    - タスクとは、分類や回帰など

## 機械学習のモデリングプロセス
1. 問題設定
1. データ選定
1. データの前処理
1. 機械学習モデルの選定
1. モデルの学習(パラメータ推定)
1. モデルの評価


## データの前処理(Preprocessing)
- ダミー変数化
    - 変数が数値であることを前提とした手法の場合には、カテゴリーデータをダミー変数化などによって、何らかの数値に置き換える
- 加工
    - One-hot vector
        - 1つだけ1が立っている(他は全て0)ベクトルで表現する
    - Bag of words
        - 特に文書において、単語の出現頻度を数えて頻度ベクトルで表現する
- 欠損処理や外れ値除去
- 中心化(Centering)
    - データの平均値が0になるように全てのデータを平行移動する処理
    - これによって切片を考慮しなくてよくなる
- 正規化(Normalization)
    - データのスケールを揃えること
    - 一般的は、最小値0、最大値1に揃える
        - ただし、大きな外れ値があると、正規化の結果0付近にデータが固まってしまうため、事前に外れ値を取り除くなどの処理も必要
- 標準化(Standardization)
    - 平均0、標準偏差1(二乗である分散も1)に変換すること
        - この場合も外れ値によって、標準化後の分布の広がりに影響が出るため注意が必要
- 正則化(Regularization)は、用語として似ているが、過学習を抑止するためにパラメーターに何らかの制約を課す手法であり、データの前処理とは無関係であることに注意


## 機械学習モデルの種類
- 教師あり学習: データ集合の各データの特徴量とラベル(もしくは目標値)の関係を学習するアルゴリズム
    - タスク: 予測
        - 線形回帰・非線形回帰(Regression)
    - タスク: 分類(Classification)
        - ロジスティック回帰
        - 最近傍・k-近傍アルゴリズム(k近傍法)
        - SVM(Support Vector Machine)
    - 一部のデータにラベルがない半教師あり学習というアルゴリズムも存在する
- 教師なし学習: 教師となるラベル(もしくは目標値)なしで何らか(データの特性や確率分布等)の学習をするアルゴリズム
    - タスク: クラスタリング
        - k-meansアルゴリズム(k平均法)
    - タスク: 次元削減
        - 主成分分析
- 強化学習: 固定のデータ集合を用いるだけでなく、学習結果のフィードバックとして新たな経験を得て学習するアルゴリズム

## 特徴選択
- 学習に使用される説明変数を選択すること
    - 説明変数の数が多い場合、特徴選択を行うことで計算時間の短縮、過学習抑制(汎化性能の向上)、モデルの解釈性の向上などの効果が期待できる
- アプローチとしては大きく3つ
    - フィルタ法: 学習を伴わずに、特徴度の重要度を測定して、有効な特徴量を選択するアプローチ
        - 重要度には、相関係数などが用いられる
        - 一般に高速だが、良い特徴が選択されるかどうかはその重要度に依存する
    - ラッパー法: 学習と変数選択を何度も繰り返すことで最適な特徴量の組み合わせを探すアプローチ
        - 計算に時間がかかる
        - 検証誤差の小さい特徴量の組み合わせを見つけやすい
            - ただし、検証データに過剰適合する可能性もあるので注意
        - ステップワイズ法が代表例
    - 埋め込み法: Lasso(L1正則化)などの手法を用いて学習と同時に最適な特徴量の組み合わせを見つけるアプローチ
        - フィルタ法とラッパー法の中間的な性質をもつ

## バイアスとバリアンス
- 機械学習の予測によって生じる誤差は3つの成分に分けて考えることができる
    - バイアス: モデルの表現力が不足していることによって生じる誤差
    - バリアンス: 学習データの選び方によって生じる誤差(データが変わることによって発生する誤差)
    - ノイズ: データの測定誤差などによって生じる誤差
- バイアスとバリアンスはトレードオフの関係にある
    - 線形回帰のようなシンプルなアルゴリズムでは、モデルの表現力に限界があるため、(データによらず全体的に)バイアスが高くなる
    - 一方で、複雑なモデルの場合、学習データが適切でないと過学習してしまい、未知のデータをうまく予測できない、すなわち未知のデータになった途端に誤差がであるバリアンスが大きくなる

## 最尤推定
- ロジスティック回帰ではベルヌーイ分布を前提とする
    - ベルヌーイ分布
        - 数学において、確率$p$で1 、確率$(1 − p)$で0 をとる、離散確率分布
            - コイン投げのイメージ
            - 詳細は「確率・統計」を参照
- 最尤推定: データからそのデータを生成したであろう尤もらしい分布(パラメーター)を推定したい
    - n回の試行で$y_1, y_2, \cdots, y_n$が同時に起こる確率(pは既知)
        - $ P(y_1, y_2, \cdots, y_n; p) = \displaystyle \prod_{i=1}^n p^{y_i}(1-p)^{1-y_i} $
    - 逆に$y_1, y_2, \cdots, y_n$のデータが得られた際の尤度関数
        - $ P(y_1, y_2, \cdots, y_n; p) = \displaystyle \prod_{i=1}^n p^{y_i}(1-p)^{1-y_i} $
            - ここでは$p$が未知
    - 尤度関数を最大化するようなパラメーターを選ぶ推定方法を最尤推定という
        - $ P(y_1, y_2, \cdots, y_n| w_0, w_1, \cdots, w_m) $
        $ = \displaystyle \prod_{i=1}^n p^{y_i}(1-p)^{1-y_i} $
        $ = \displaystyle \prod_{i=1}^n σ(\boldsymbol{w}^T\boldsymbol{x_i})^{y_i}(1-σ(\boldsymbol{w}^T\boldsymbol{x_i}))^{1-y_i} $
        $ = L(\boldsymbol{w}) $

        - 尤度関数Lを最大とするパラメーターを探索する
    - 対数をとると微分の計算が簡単になる
        - 実装時の計算時の桁落ちを防ぐためにもlogをとることが必要
        - $ E(w_0, w_1, \cdots, w_m) $
        $ = - \log L(w_0, w_1, \cdots, w_m) $
        $ = - \displaystyle \sum_{i=1}^n \lbrace y_i \log p_i + (1 - y_i) \log (1 - p_i) \rbrace $
            - ここで$p_i = σ(\boldsymbol{w}^T\boldsymbol{x_i}) $
            - 尤度は積$\prod$だが、対数になることで和$\sum$になる
            - 対数尤度関数が最大になる点と尤度関数が最大になる点は同じ
            - 尤度関数にマイナスをかけたものを最小化、とすることによって、最小2乗法の最小化と考え方を揃える
- 勾配降下法(Gradient descent)
    - 反復学習によりパラメーターを逐次的に更新するアプローチの一つ
    - 最小二乗法は、微分が0になる値を解析的に求めることが可能
    - これに対し、対数尤度関数で解析的に値を求めることが困難
    - $ \boldsymbol{w}^{(k+1)} = \boldsymbol{w}^{(k)} - η\dfrac{∂E(\boldsymbol{w})}{∂\boldsymbol{w}} $
        - $η$は学習率というハイパーパラメーターであり、パラメーターの収束のしやすさを調整
        - $ \dfrac{∂E(\boldsymbol{w})}{∂\boldsymbol{w}} = - \displaystyle \sum_{i=1}^n (y_i-p_i) \boldsymbol{x_i} $
        - 結果的に、$ \boldsymbol{w}^{(k+1)} = \boldsymbol{w}^{(k)} + η \displaystyle \sum_{i=1}^n (y_i-p_i) \boldsymbol{x_i}$
        - ただし、勾配降下法では、パラメーターを更新するのにn個全てのデータに対する和を計算する必要がある
        - これを回避するために、確率的勾配降下法が利用できる
    - 勾配降下法については、「最適化手法」を参照

## 性能指標

### 回帰問題での性能指標
- 平均絶対誤差: Mean Absolute Error (MAE)
    - 予測値と真値の差の絶対値の平均
    - $ MAE = \dfrac{1}{n} \displaystyle \sum_{i=1}^n \vert f_i - y_i \vert $
    - 誤差の平均と解釈できるため、直感的にわかりやすい
- 平均二乗誤差: Mean Squared Error (MSE)
    - 予測値と真値の差の二乗の平均
    - $ MSE = \dfrac{1}{n} \displaystyle \sum_{i=1}^n ( f_i - y_i )^2 $
    - 予測値と真値の差を二乗するため、真値から大きく外れたデータが多いと、MSEが大きくなりやすい
    - MSEの単位は、目的変数の単位の二乗
- 平均二乗誤差平方根: Root Mean Squared Error (RMSE)
    - MSEの平方根
    - $ RMSE = \sqrt{\dfrac{1}{n} \displaystyle \sum_{i=1}^n ( f_i - y_i )^2} $
    - RMSEの単位は、目的変数の単位と同じになるため、MSEよりは直感的にわかりやすい

### 分類問題での性能指標
- 混同行列(Confusion Matrix)
    |--|Predicted Positive|Predicted Negative|
    |--|--|--|
    |**Actual Positive**|真陽性(True Positive)|偽陰性(False Negative)|
    |**Actual Negative**|偽陽性(False Positive)|真陰性(True Negative)|
- 正解率(Accuracy)
    - 正解した数 / 予測対象となった全データ数
    - $ \dfrac{TP+TN}{TP+FN+FP+TN} $
    - しかし分類したいクラスに偏りがある場合、正解率はあまり意味をなさない
        - 例えば、90%がAだった場合、全てAと予測するだけで正解率90%となる
- 再現率(Recall)
    - 「本当にPositiveなもの」の中から、Positiveと予測できる割合
        - 本当にNegativeなものは考慮していない
    - $ \dfrac{TP}{TP+FN} $
    - Positiveの抜け漏れを少なくしたい場合に利用
        - 例えば病気の検診
        - FNを最小化したい、逆にFPは再検査で救えるため許容
- 適合率(Precision)
    - モデルが「Positive」と予測したものの中で、本当にPositiveである割合
    - $ \dfrac{TP}{TP+FP} $
    - 見逃し(False Negative)が多くても、より正確な予測をしたい場合に利用
        - 「重要なメールをスパムメールと誤判別」されるより「スパムと予測したものが確実にスパム」である方が有益
        - スパムメールを検出できなくても(False Negative)、自分で対処可能
- F値
    - 再現率と適合率両方が高いのが理想的だが、実際には両者はトレードオフの関係にある
    - このため、再現率(Recall)と適合率(Precision)の調和平均をF値として利用することがある
        - F値が高いほど、バランスよくRecallとPrecisionが高い
        - F1 scoreともいう
    - $ F値　= 2\dfrac{Recall * Precision}{Recall + Precision} $
- この他、MCC(Matthews Correlation Coefficient)という指標もある
    - F値はラベルの付け方(例えば「あり = 1」に対し、「あり = 0」とするなど)によって、値が変わってしまうのが欠点であるが、MCCはこの点が改善されている
    - 1に近いほど分類器として性能が高い

## データ分割と汎化性能
- データの分割
    - 学習(訓練)用データ： 機械学習モデルの学習(訓練)に利用するデータ
    - テスト用データ： 学習済みモデルの精度を検証するためのデータ
    - この他にハイパーパラメーター調整用に用いる検証用データを用意することもある
- 分割することにより、モデルの汎化性能(Generalization)を測定する
- 過学習と未学習
    - 訓練誤差(学習用データでの誤差)もテスト誤差(テスト用データでの誤差)も小さい: 汎化しているモデルの可能性
    - 訓練誤差(学習用データでの誤差)は小さいが、テスト誤差(テスト用データでの誤差)が大きい(むしろ大きくなっていっている): 過学習(過剰適合)
    - 訓練誤差(学習用データでの誤差)もテスト誤差(テスト用データでの誤差)も小さくならない: 未学習(過小適合)
- ホールドアウト法
    - 有限のデータを学習用とテスト用の2つに分割
        - 学習用データの数が少ないと、十分な学習ができない
        - テスト用データの数が少ないと、性能評価の精度が悪くなる
    - データ数が少ない場合には、ホールドアウト法を使うべきではない
- クロスバリデーション(交差検証)
    - データをk個の重複しない集合に分割し、そのうちの一つをテスト用、残りを学習用とする
    - テスト用を入れ替えながら、k個モデルを作る(モデル1-1, 1-2, ..., モデル1-k)
    - k個のモデルをそれぞれ性能検証する
        - 精度の平均をCV(Cross Validation)値と呼ぶ
            - 精度はあくまでもテスト用データでの精度
    - モデルを変えながら(例えば基底関数を変える、これによってモデル2-1, 2-2, ..., モデル2-kを作る)、それぞれCV値を算出し、CV値が最も低いモデルを採用する
- ハイパーパラメーターの調整
    - グリッドサーチ
        - パラメーターの組み合わせをしらみつぶしして、最適なものを探す
    - ランダムサーチ
        - 指定された各ハイパーパラメーターの範囲で、探索点をランダムに選択しながら探索を進める
    - ベイズ最適化(Bayesian optimization)
        - ハイパーパラメーターも含めて最適化問題とする
            - 予測モデルとしてはガウス過程回帰を用いる
        - 過去の試行結果から次に行う範囲を確率分布を用いて計算する
        - 最近はこちらが主流

## 過学習と未学習の対策
- 未学習: 学習データに対して、十分小さな誤差が得られていないモデル
    - 対策1: 学習データの数を増やし、学習を進める 
    - 対策2: より表現力の高いモデルを利用する
- 過学習: 学習データでの誤差は小さいが、テストデータでの誤差が大きい
    - 対策1: 学習データの数を増やす
    - 対策2: 不要な基底関数(変数)を削除して表現力を抑止
    - 対策3: 正則化法を利用して表現力を抑止
- 正則化法
    - $ S_γ = (\boldsymbol{y} - \boldsymbol{Φ}\boldsymbol{w})^T(\boldsymbol{y} - \boldsymbol{Φ}\boldsymbol{w}) + γR(\boldsymbol{w}) $の最小化を図る
        - $γR(\boldsymbol{w})$が罰則項で、モデルの複雑さに伴う罰則を加える
    - 正則化項(罰則項)
        - ない: 最小二乗推定量
        - L2ノルム($ \sqrt{x_1^2+x_2^2+\cdots+x_n^2} $): Ridge推定量
            - Ridgeは円なので、円の中で0に近づける(が0になるのは難しい)
        - L1ノルム($ |x_1| + |x_2| + \cdots + |x_n| $): Lasso推定量
            - Lassoの方が角が尖っているので、いくつかのパラメーターが0になる(結果的にスパースになる)
        - Elastic NetではL1ノルムとL2ノルムの両方を加える
    - 正則化項を加えると、($\boldsymbol{w}$が大きい)本当のMSEにはならず、L2ノルムやL1ノルムを満たす($\boldsymbol{w}$が制約される)中での最小値となる