【ラビットチャレンジ】実装演習レポート②機械学習

<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js">
</script>
<script type="text/x-mathjax-config">
 MathJax.Hub.Config({
 tex2jax: {
 inlineMath: [['$', '$'] ],
 displayMath: [ ['$$','$$'], ["\\[","\\]"] ]
 }
 });
</script>

# 概要
E資格受験のための認定講座「ラビットチャレンジ」の実装演習レポート、機械学習編です。
確認テストと実装演習は省略しています。情報の網羅性は低いですがご理解ください。
外部資料からの内容は※をつけています。
※１：「AIエンジニアを目指す人のための機械学習入門」

# 機械学習の課題
* 過剰適合（overfitting）
  * モデルが学習データに過剰に適合し、テストデータや未知のデータには十分な精度が得られない現象
  * データに対してモデルの次元が大きすぎる or データ数が少なすぎる
* 過小適合（underfitting）
  * モデルが学習データに十分に適合できず、学習データおよび未知のデータに十分な精度が得られない現象
  * データに対してモデルの次元が小さすぎる

一般的に、データ数が多いほど過小・過剰適合は緩和される。課題解決のためには以下のような手法がとられる。

* 正則化
  * パラメータに制約を与え、モデルの複雑さによる過剰適合を防ぐ手法
* 深層学習
  * 機械学習の手法のひとつで、ほぼ全ての分野に適用可能
  * ニューラルネットワークにおいて多層化されたもの
  * 特徴量の設計が必要ない（入力から自動で獲得）
  * 大規模なデータセット収集の負荷が大きい
  * GPUなどの計算リソースが必要
  * 計算時間がかかる
  * 適合状況を見極めて正則化やモデルのパラメータ調整をする

# 性能指標
* 性能指標
  * モデルの予測精度を定量的に評価する基準

**分類タスク**
* 混同行列
  * 予測とその結果をまとめたもの
  
  ||実際は陽性|実際は陰性|
  |---|---|---|
  |予測は陽性|TP|FP|
  |予測は陰性|FN|TN|
* 正解率（Accuracy）
  * 全データのうち予測が当たった割合
  $$
  \frac{TP+TN}{TP+FP+FN+TN}
  $$
* 適合率（Precision）
  * 陽性と予測したデータのうち、実際に陽性だった割合
  $$
  \frac{TP}{TP+FP}
  $$
* 再現率（Recall）
  * 実際の陽性データのうち、陽性だと予測した割合
  $$
  \frac{TP}{TP+FN}
  $$ 
* F値
  * 適合率と再現率のバランスをとっている
  * クラス数の偏りに影響を受けにくい
  $$
  \frac{2×Precision×Recall}{Precision+Recall}
  $$
* ROC曲線
  * 偽陽性率と再現率の曲線
  * 直線だとランダムなモデルと同じ

**回帰タスク**
* MSE（平均二乗誤差）
$$
\frac{1}{N}\sum_{i}^{N} (y_i-t_i)^2
$$
* RMSE（平均平方二乗誤差）
  * 誤差の単位が同じ
$$
\sqrt{\frac{1}{N}\sum_{i}^{N} (y_i-t_i)^2}
$$
* MAE（平均絶対誤差）
  * 外れ値の影響が小さい
  $$
  \frac{1}{N}\sum_{i}^{N} |y_i-t_i|
  $$

# 線形回帰モデル
* 線形回帰モデル
  * 回帰問題を解くための機械学習モデル
  * 教師あり学習
  * 入力$x$とパラメータ$w$の線形結合（内積）
  $$
  {\hat{y}} = {w}^T{x} + w_0 = \sum_{j=1}^{m} w_jx_j + w_0
  $$
  * 未知パラメータは最小二乗法で推定
    * 平均二乗誤差の最小化（勾配が０の点を求める）
* データの分割
  * 学習用データと検証用データに分割
  * 未知のデータに対する精度、汎化性能を測る
  * 実装の際は乱数シードを固定することで実行のたびに同じ分割ができる（実行手順と結果の再現性を確保）※１
* 特徴量エンジニアリング※１
  * モデルの性能向上のためにより良い特徴量を作成
  * データを正規化してスケール調整
* 実装の流れ※１
  * ライブラリのインポート
  * 訓練データと検証データの用意
  * モデルを実装して学習
  * 検証データで性能評価
  * 未知のデータを回帰

# 非線形回帰モデル
* 基底展開法
  * 基底関数とパラメータベクトルの線型結合を回帰関数に使用
    * 多項式関数
    * ガウス型基底関数 など
  * 未知パラメータは最小二乗法や最尤法で推定
* 正則化によって適切な表現力のモデルを作る
  * L2（Ridge推定量）
  * L1（Lasso推定量）
  * 使用する特徴量すべてが重要な場合はL2、特徴量が減ってもいい場合はL1を採用する※１
  * 二つを組み合わせたElastic Net※１
* ホールドアウト法
  * データを学習用とテスト用に分割
  * データが大量にないと良い性能評価が出ない
* クロスバリデーション（交差検証）
  * 汎化性能の評価手法
  * k-分割交差検証
    * データをk個に分割してそのうち１つをテストデータに、残りのk-1個を学習データにする
    * k個のデータ全てが一回ずつテストデータになるようにk回学習を行なって精度の平均をとる（CV値） 
* グリッドサーチ
  * チューニングパラメータ探索手法
  * 全チューニングパラメータの組み合わせで評価値を算出し、最も良いものを採用
  
# ロジスティック回帰モデル
* クラス分類のための教師ありモデル
* 線形分離
* 入力とパラメータの線型結合をシグモイド関数に入力
* 出力は0~1（クラス1になる確率を表現）
* 最尤推定
  * 尤度関数を最大化するパラメータを推定
  * 勾配降下法（対数尤度関数を微分）
  
# 主成分分析
* 次元圧縮
* 各変数の間の相関をなくす
* 分散共分散行列の固有値問題を解く

# k近傍法（kNN）
* 教師あり分類手法
* あるデータ点の最近傍k個が最も多く所属するクラスに識別
* kを大きくすると決定境界はなめらかになる

# k平均法（k-means）
* 教師なしクラスタリング手法
* データをk個のクラスタに分類
* 流れ
  * 各クラスタ中心を設定（ランダム）
  * 各データ点に対して、各クラスタ中心との距離を計算し最も近いクラスタを割り当てる
  * クラスタの中心（平均）を計算
  * 割り当てと計算を繰り返す
* 特徴量のスケールをそろえる※１
  * 正規化
  $$
 x_{norm} = \frac{x-x_{min}}{x_{max}-x_{min}}
  $$
  値が0~1になる
  外れ値の影響が大きい
  * 標準化
  $$
  x_{std} = \frac{x-μ}{σ}
  $$
  μ：平均 σ：標準偏差
  平均０標準偏差１の正規分布に従うように調整
  外れ値の影響が小さい
* 初期値依存問題※１
    * k-means++
    *  各クラスタ重心がなるべく離れるように初期値設定
* 複雑な形のデータ分布には使えない※１
  * 傾いた楕円
  * 多様体上の非線形クラスタ

# パターン認識
* 近似最近傍探索
  * 最も近いものを厳密に探索せず、近似的に近いものを取得する手法
  * 高次元の計算コストと精度のバランスをとる
  * k近傍法に使える
* kd-tree
  * k次元空間にある点を分類するデータ構造
  * 次元ごとにデータ集合の分割を繰り返す
  * 類似データを高速に探索
  * 高次元データには適さない