Python実践機械学習システム100本ノック 学習メモ

# はじめに
Python、AI初心者な自分がAI関連の部署に異動になったので、以下の書籍を読んで勉強始めました。

* [下山　輝昌,三木　孝行,伊藤　淳二『Python実践機械学習システム100本ノック』秀和システム](https://www.amazon.co.jp/Python%E5%AE%9F%E8%B7%B5%E6%A9%9F%E6%A2%B0%E5
%AD%A6%E7%BF%92%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF-%E4%B8%8B%E5%B1%B1-%E8%BC%9D%E6%98%8C/dp/479806341X)

個人的に見返すため、あと学習内容のアウトプットを目的として、雑多にメモしていきます。


# 機械学習関連

## 用語

### 目的変数、説明変数
* 目的変数：機械学習の結果、予測したい変数の事。`y`で表す。
* 説明変数：予測に使用する変数の事。`X`で表す。

競馬の着順を予想したいとした場合は以下のような例になるはず。

* 目的変数：着順
* 説明変数：馬場状態、馬の情報、騎手の情報

### カテゴリカル変数

データのカテゴリー分けを表す変数の事。

* 売り上げデータにおける店舗名、商品名

機械学習は数値を扱うものであり、上記のような変数はそのままでは学習に使えない。
`ワンホットエンコーディング`にて0と1のフラグに置き換える

### ワンホットエンコーディング

カテゴリカル変数を機械学習で扱えるように、0と1のフラグに置き換えること。
置き換えた後の変数の事を`ダミー変数`という。
例として、売上データの店舗名をワンホットエンコーディングする。

* 変換前

| ID | 売上 | 店舗名 |
|:-:|:-:|:-:|
| 1 | 2,000 | 店舗A |
| 2 | 3,200 | 店舗B |
| 3 | 1,900 | 店舗C |
| 4 | 2,900 | 店舗B |
| 5 | 3,600 | 店舗C |

* 変換後


| ID | 売上 | 店舗A | 店舗B | 店舗C |
|:-:|:-:|:-:|:-:|:-:|
| 1 | 2,000 | 1 | 0 | 0 |
| 2 | 3,200 | 0 | 1 | 0 |
| 3 | 1,900 | 0 | 0 | 1 |
| 4 | 2,900 | 0 | 1 | 0 |
| 5 | 3,600 | 0 | 0 | 1 |

カテゴリに応じて列を作り、そのカテゴリに属しているレコードに1が設定されるイメージ。

### 多重共線性（マルチコ：`multi-colinearlity`）

多変量解析において、説明変数間に高い相関が認められる場合に発生する事象の事。
発生する具体的なケースとしては、上記で述べたダミー変数を試用している場合に発生する。
例えば、上記のデータでは必ずどこかの店舗に属している。
つまり店舗A～Cの説明変数間に対して完全に相関してしまっている。
結果として誤差が大きくなり、解析結果が不安定となってしまう。
対応としては、作成したダミー変数のうち、1列を削除するなどが挙げられる。
（上記の例であれば、「店舗A」を削除するとか。）


### 表現力
与えられた訓練データを再現するモデルの力の事。
モデルの表現力が高すぎると、訓練データの些細な違いまでモデルが学習してしまう。
すると、未知のデータに対する予測が難しくなる。

### 汎化性能

データに含まれる誤差の部分を無視する力の事。
汎化性能が高いほど未知のデータに対する識別能力が高いという扱いになる。
ただ、汎化性能が高すぎても鈍感なモデルになる。
汎化性能と表現力はトレードオフ。
同じ学習データを使用しても使用するモデルによって差がでる。


### 交差検証（cross-validation）

個々のモデルの汎化性能を評価する手法。
学習結果の評価のため、学習データと未知のデータ（テストデータ）に適用した時の結果を比較する。
代表的な交差検証の一つに`K-分割交差検証`がある。
これはデータをK個に分割し、そのうちの一つをテストデータ、残りの`K-1`個を学習データとし正解率の評価を行う。


### 予測結果と混合行列

モデルの予測結果はいかに分類される。

| 種類 | 説明 |
|:-:|:-:|
| True Negative（真陰性） | 予測結果は`負`、実際も`負` |
| False Negative（偽陰性）|予測結果は`負`、実際は`正`|
| True Positive（真陽性）|予測結果は`正`、実際も`正` |
| False Positive（偽陽性）| 予測結果は`正`、実際は`負` | 

マトリクス（混合行列）で表すと以下となる。

|  | 予測は負 | 予測は正 |
|:-:|:-:|:-:|
| 実際は負 | TN(True Negative) | FP(False Positive)  |
| 実際は正 | FN(False Positive) | TP(True Positive) |

### 評価指標

モデルの評価指標として`正解率`、`再現率`、`適合率`、`F値`という指標が扱われる。
それぞれの値は上記の`TP`などから算出する。

#### 正解率（Accuracy）

全部の合計の内、予測結果と実際の結果が合致している割合（TNとTP）。
式で書くと以下のようになる。
$Accuracy = \frac{TP + TN}{TP + FP + TN + FN}$

#### 再現率（Recall）

実際は`正`だった物のうち、どの程度予想できていたかという割合。`正`の物に対しての正答率となる。
式で書くと以下のようになる。
$Recall = \frac{TP}{FN + TP}$

#### 適合率（Precision）

`正`と予測した物のうち、実際と合っていた件数の割合。
式で書くと以下となる。
$Precision = \frac{TP}{FP+TP}$


#### F値（F-measure）
`適合率`と`再現率`の調和平均の事。
式で書くと以下となる。
$F = \frac{2 × Precision * Recall}{Precision + Recall}$




# 参考資料
[下山　輝昌,三木　孝行,伊藤　淳二『Python実践機械学習システム100本ノック』秀和システム](https://www.amazon.co.jp/Python%E5%AE%9F%E8%B7%B5%E6%A9%9F%E6%A2%B0%E5
%AD%A6%E7%BF%92%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0100%E6%9C%AC%E3%83%8E%E3%83%83%E3%82%AF-%E4%B8%8B%E5%B1%B1-%E8%BC%9D%E6%98%8C/dp/479806341X)
[pandasでワンホットエンコーディング（ダミー変数）](https://qiita.com/nomuyoshi/items/c8127787c4ce320729da#%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E5%89%8D%E3%81%AB-get_dummies-%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)
[重回帰分析における多重共線性への対応](https://wannko5296.hatenablog.com/entry/2019/08/16/233237)
[汎化性能、表現力はトレードオフな事が分かる記事](https://masamunetogetoge.com/overfit-and-generalization)
[交差検証（クロスバリデーション）とは？合わせてグリッドサーチに関しても学ぼう！](https://aiacademy.jp/media/?p=263)
[【入門者向け】機械学習の分類問題評価指標解説(正解率・適合率・再現率など)](https://qiita.com/FukuharaYohei/items/be89a99c53586fa4e2e4)