E試験 2024#2 シラバスメモ②機械学習

E試験のシラバスとその概要をメモしたものです。
各サイトや生成AIに聞いたもののツギハギです。

シラバスは2024#2に準拠しています

https://www.jdla.org/certificate/engineer/

本記事は２．機械学習についてとなります。
試験範囲外部分は割愛しています。

# パターン認識

## k近傍法・近傍法

教師あり学習のクラス分類の手法
k近傍法自体は単純に未知データの距離kの周りに既知データが何個含まれてるか多数決をとって決める。
https://qiita.com/yshi12/items/26771139672d40a0be32

### kd-tree

ある位置から近い点を効率よく探すために探索するための手法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/f45a3634-affd-672e-3cb3-587df91fcea8.png)
(出所：https://opendsa-server.cs.vt.edu/ODSA/Books/CS3/html/KDtree.html)

x,y,x,yと値を見ていきながらツリーをつくる
AのXより大きいやつ小さいやつで右の枝と左の枝に分岐、その枝のYより大きいやつと小さいやつで・・・

任意の点Pが来た時に、まずAとPのXを比較し左か右か、次の枝のYと比較し右か左か・・・で探していく
(実際はユークリッド距離がまたいだ時にさかのぼって検証もする)

## 距離計算

### コサイン距離

二つのベクトルA,Bの類似度
AとBの内積をAとBの長さをかけたもので割ったもの
$\text{cosine similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|}$
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/81926f89-8c81-18c5-ca0a-1e94f755077a.png)
(出所：https://atmarkit.itmedia.co.jp/ait/articles/2112/08/news020.html)

### ユークリッド距離

いわゆる普通の距離。2次元だと算数でもやった
$\sqrt{|a_x-b_x|^2+|a_y-b_y|^2}$

n次元だと以下。(上記と混ざってややこしいがx,yは軸のx,yではなく2点x,yを意味する)
$\sqrt{\sum_{i=1}^{n}|x_i-y_i|^2}$

L2ノルムと呼ばれる

### マンハッタン距離

各次元の距離の総和を足した奴
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/ad32f945-113d-d344-e35d-032e11c35cc4.png)
(出所：https://atmarkit.itmedia.co.jp/ait/articles/2111/10/news023.html)

$\sum_{i=1}^{n}|x_i-y_i|$

L1ノルムと呼ばれる

### Lp距離

上記を一般化した式ともいえる
```math
\|\mathbf{x} - \mathbf{y}\|_p = \left( \sum_{i=1}^{n} |x_i - y_i|^p \right)^{\frac{1}{p}}
```
p=1のときマンハッタン距離になる
p=2の時ユークリッド距離になる

### マハラビノス距離

（Σ：分散共分散行列）
$d(\boldsymbol{x}, \boldsymbol{y}) =\sqrt{(\boldsymbol{x}-\boldsymbol{y})^{\mathrm{T}} \boldsymbol{\Sigma}^{-1}(\boldsymbol{x}-\boldsymbol{y})}\tag{5}$

データの相関関係を考慮して設定した距離
分散が大きいとあまり距離が離れていないと解釈、分散が小さいと距離が離れていると解釈
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/dbe4a0ba-4d22-0198-0f15-a6e95285e289.png)
(出所：https://qiita.com/shopetan/items/ceb7744facc21c3881d2)


# 機械学習の分類

教師あり学習：正解を添えて学習させてあげる
教師なし学習：正解なしで学習

## 半教師あり学習

### ブートストラップ法

ラベルありのデータを使って学習
その後ラベルなしのデータを予測
予測したデータの中から信頼度が閾値以上のものを教師データラベルとして採用

### グラフベースアルゴリズム

データ分布をもとにラベルがないデータにラベルをつけてあげる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/153620f9-3c56-df00-4d45-2e6eea11a98b.png)
(出所：https://www.ibm.com/jp-ja/topics/semi-supervised-learning)
k近傍法やSVMなどでラベルなしデータをラベルありデータから予測する


# 機械学習の課題

## 過剰適合・過少適合

### 訓練誤差

訓練中(学習中)に学習データと予測で発生している誤差

### 汎化誤差

学習完了後に作ったモデルで、学習データ以外のデータ(テストデータ)と予測で発生している誤差

#### バイアスとバリアンス

バイアス：実際値と予測値の誤差の平均。
バリアンス：予測値がどれだけ散らばってるか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/8c68c930-049a-985e-c0b7-9cdcfafbfc83.png)
(出所：https://towardsdatascience.com/bias-and-variance-in-linear-models-e772546e0c30)

バイアスもバリアンスも小さいほうがいいように思えるが、
バイアスが小さくなるように訓練しすぎると(訓練誤差をめっちゃ小さくしようとすると)過学習状態に陥り、汎化誤差が高まる可能性がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/afed94fc-df1d-2117-6075-f42b7400b85a.png)
(出所：https://wimper-1996.hatenablog.com/entry/2020/02/22/220558)

### 正則化

$min(f(\mathbf{w}))$
と損失関数があったとして
$min(f(\mathbf{w})+ペナルティ項)$
としてあげて過学習を防ぐ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/4f852b16-f132-948d-8b3d-72dd8f8cce75.png)
(出所：https://wimper-1996.hatenablog.com/entry/2020/02/22/220558)

- L1正則化
$min(f(\mathbf{w}) + \lambda \sum_{i=1}^{n} |w_i|)$
- L2正則化
$min(f(\mathbf{w}) + \lambda \sum_{i=1}^{n} w_i^2)$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/53033af7-aca5-c1c1-7d54-1ea6540e84b7.png)
(出所：https://tjo.hatenablog.com/entry/2015/03/03/190000）


| 特性               | L1正則化                                  | L2正則化                                |
|------------------|---------------------------------------|-------------------------------------|
| ペナルティの種類       | 重みの絶対値の和                             | 重みの二乗和                             |
| スパース性(ベクトルの成分の要素の多くをゼロの状態にすること)| 高い（多くの重みがゼロになる）　⇒無駄な特徴が排除され、効率的に学習が進む                   | 低い（重みがゼロになることは少ない）               |
| 数学的安定性        | 問題によっては不安定になることがある（特に高次元の場合） | 安定している（特に高次元の場合）               |
| 使用例             | 特徴選択が重要な場合、スパース性が求められる場合          | 特徴選択が重要でない場合、数値的安定性が重要な場合  |

### 次元の呪い

データの種類(データ量のことではなく説明変数の属性数)が多くなるとモデルを作る際の変数が指数関数的に増加し、学習が困難になる。
主成分分析で次元削減を行ったり、説明変数の取捨選別を行う


# 検証集合

## 訓練データ・検証データ・テストデータ

検証データとテストデータが混同しやすい。

- 訓練データ
学習時に使うデータ
- 検証データ
学習済モデルを評価するために使用する。
- テストデータ
学習後にモデルが訓練データに過剰適合していないかチェックするためのデータ

訓練と検証は学習中の精度を上げる＆確かめるために使用するイメージ
テストデータは最後の検品のイメージ

## 交差検証

### ホールドアウト法

普通に学習データ、検証データ、テストデータに適当な割合で分割する
ホールドアウトデータ≒テストデータ

### k-分割交差検証法

データが十分に多い場合はホールドアウト法で十分だが、
検証データに割くほどデータ数をあまり用意できない場合に使う。

データをk個に分割し、訓練ごとに訓練データと検証データを変化させながら行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/83bd7831-95d8-a613-9186-50269997d24c.png)

# 性能指標

## 混同行列

例えば「その製品が良品かどうか」という予測に対して
(ここで言うPositiveかどうかは、検査してるものが「当たり」かどうかの意味。
以下の表は「良品かどうか」を判定する問題なので良品：Positive　不良品:Negativeとしているが、
 **「不良品かどうか」という問題の場合は不良品がPositiveになる。** )

|                  | **実際：** (Positive) | **実際：不良品** (Negative) | 合計 |
|------------------|----------------------------|--------------------------|---|
| **予測: 良品** | 良品を良品と判定<br/>真陽性 True Positive (TP)| 不良品を良品と判定<br/>偽陽性False Positive (FP)      |  TP+FP=当たりと予測した数<br/>(この場合不良品と予測した数)|
| **予測: 不良品**   | 良品を不良品と判定<br/>偽陰性False Negative (FN) | 不良品を不良品と判定<br/>真偽性True Negative (TN)       | FN+TN=外れと予測した数<br/>(この場合不良品と予測した数)| 
|合計|TP+FN=実際の当たりの数<br/>この場合実際の良品数|FP+TN=実際の外れの数<br/>この場合実際の不良品数||


Positive=良品と判定しちゃったが・・・
Negative=不良品と判定しちゃったが・・・
↓
True=判定は正解
False=判定は不正解

## 正解率(Accuracy)、適合率(Precision)、再現率(Recall)、F値、ROCカーブ

- 正解率(Accuracy)
$\text{Accuracy} = \frac{TP + TN}{TP + FP + FN + TN}$
要は$\frac{あってた個数}{全部の個数}$
- 適合率(Precision) 
$\text{Precision} = \frac{TP}{TP + FP}$
要は$\frac{予測があってた良品数}{良品と予測した数}$
良品判定したもの内、どのくらい正解できたか
- 再現率(Recall) : TPR(True Positive Rate)
$\text{TPR} = \frac{TP}{TP + FN}$
要は$\frac{予測があってた良品数}{実際の良品数}$
実際の良品のうち、どのくらい正解できたか
- FPR(False Positive Rate)
$\text{FPR} = \frac{FP}{FP + TN}$
要は$\frac{予測が外れた不良品数}{実際の不良品数}$


式だけで覚えようとするとこんがらがるので、以下で覚えといて混同行列と照らし合わせた方が良い。
PとかNは良品と「予測」した数
Fが付くと「実際」は逆

- F値
適合率とTPR(再現率)を組み合わせたもの。
$\text{F1 Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}$
(=調和平均$\frac{2}{\frac{1}{Precision}+\frac{1}{Recall}}$)

- ROCカーブ、AUC
予測モデルの閾値を変えていき(過剰に検出する様にするか、検出率を弱めるか)
その時のTPR(再現率)を縦軸とFPRを横軸に持ったカーブ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/0533217c-b30b-d828-f76f-ae925cc930c3.png)
(出所：https://zero2one.jp/ai-word/roc-curve-and-auc/)

### 物体検出における性能指標

- Intersection-over-Union (IoU)
物体検出時の性能指標
IoUが大きい程(正解と予測が重なっているほど)、物体検出がうまくできていることを表す。
A：正解領域
B：予測領域

$\text{IoU} = \frac{A \cap B}{A \cup B}$
要は$\frac{重なってる面積}{全部の面積}$

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/72b43fa8-b0e3-51f6-a118-423a32356da3.png)
(出所：https://qiita.com/CM_Koga/items/82d446658957d51836cf)

- AP・mean Average Precision(mAP)
APは適合率(Precision)と再現率(Recall)のグラフの面積部分
まずは適合率と再現率のグラフ(PRグラフ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/3b448fc7-1689-0f3e-f545-51119a1da050.png)
(出所：https://jonathan-hui.medium.com/map-mean-average-precision-for-object-detection-45c121a31173
https://blog.deepblue-ts.co.jp/image-processing/objectdetection_ap/)

グラフが若干わかりづらいが、
適合率をおさらいすると$\frac{正解の予測があってた}{正解と予測した数}$

最初の時点では予測回数1で正解1なので1から始まる(グラフのの始点)、2回目正解だとしたら2回予測して2回当たりなのでやはり2/2で1。3回目の外したので予測した回数3で正解回数2で0.75・・・という風に回数を重ねれば下がっていく

再現率をおさらいすると$\frac{正解の予測があってた個数}{実際の正解の個数}$
実際の正解個数が5個だと仮定すると、
最初正解すると1/5、2回目も正解なので2/5、3回目は外してしまったので変わらず2/5・・・という風に回数を重ねれば上がっていく。最終的に全部正解するまで繰り返してこの例では10回目でようやく5/5になったので1になる

**AP**はこのグラフの面積となる
底辺は必ず1(再現率が1になるまで続けるので)、高さは上記のグラフの通り正解率が高いと高さが高くなる＝面積が広くなる
面積は0～1の範囲となる。

**mAP**はこれの多クラス版


- micro平均/macro平均
多値クラス分類の指標

**macro平均** はクラスごとの平均値(マクロ平均適合率であれば適合率のクラスごとの平均、マクロ平均再現率であれば再現率のクラスごとの平均、マクロF1も同様)

**micro平均** は全クラスのTP,FP,FNを総計してから適合率、再現率、F1を計算する。 多値クラス分類においてはこれは **正解率に一致する。**
(例えば適合率TP＋FPの合計は270+205+125=500で結果$\frac{TP}{全数}$となり。再現率TP+FNは300+200+100こちらも$\frac{TP}{全数}$となり正解率の式と一致することがわかる)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666388/8843a869-c91c-7e0c-ecb6-36a4a9ed797f.png)
(出所：https://analysis-navi.com/?p=553)


# 評価関数　RMSE/MSE、MAE
回帰問題で使用。
どれも予測値と正解の誤差が全体的にどうかを表す。低くなっていれば精度が高い。
- MAE
$\text{MAE}=\frac{1}{n}\sum_{i=1}^{n}|\hat{y}_i-y_i|$ 　※$\hat{y}:予測した値 y:正解値$
単純に正解と予測値の誤差を総和したもの
- MSE
いわゆる最小二乗法
$\text{MSE}=\frac{1}{n}\sum_{i=1}^{n}(\hat{y}_i-y_i)^2$ 　※$\hat{y}:予測した値 y:正解値$
正解と予測値の誤差の二乗を総和したもの
- RMSE
MSEの平方根を取ったもの
$\text{RMSE}=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(\hat{y}_i-y_i)^2}$
MSEだと二乗する関係で学習データと単位が合わないという問題があるので元に戻してあげている

MAEとMSE/RMSEの主な違いとしてはバラつきの捉え方
MSEは誤差が二乗されるためより中心から外れたものがより強調される(いわゆる分散をとっている)。
悪く言うと外れ値があった時に影響が大きく出てしまう。