機械学習の概要理解

【ドラフト中】

## はじめに（モチベーション）

機械学習、そんなに難しいことをやっているような気がしていません。
いや、全然初心者で全く使いこなせていないないのですが、概要・イメージを捉えるだけであれば「えいや」とできるような予感があります。
そこで本記事では、復習も兼ねて機械学習の概要をまとめていきます。

## 機械学習とは

機械学習とは、適切なパラメータを力づくで見付ける手法のことを指します。
例えば、数式$3x_{1} + 2x_{2} + 4x_{3} = 1100$を満たすようなパラメータ($x_{1}, x_{2}, x_{3}$)を見付けるために、パラメータに次々に適当な数字を入れ込んでいくことをします。イメージは、下記の通りです。

|$x_{1}$|$x_{2}$|$x_{3}$|$3x_{1} + 2x_{2} + 4x_{3}$|正誤|
|:-----:|:-----:|:-----:|:------------------------:|:--:|
|1      |1      |1      |9                         |誤  |
|1      |1      |2      |13                        |誤  |
|1      |2      |1      |11                        |誤  |
|...    |...    |...    |...                       |... |
|200    |100    |75     |1100                      |正  |

### 数式と現実の紐付け
ちなみにここで、$3x_{1} + 2x_{2} + 4x_{3} = 1100$のような数式は、現実的な問題と紐付けられます。
例えば、リンゴ、バナナ、スイカの画像が１枚ずつあったとします。そしてそれらの画像全体の赤さ具合・緑具合・青さ具合の平均値を考えます。
（もう少し細かく言うと、この平均値は、ある画像について全ての画素のRGB値の平均値を取ったもの、とお考えください）

|         |赤さ具合平均値  |緑具合平均値 |青さ具合平均値  |
|:-------:|:-------------:|:----------:|:-------------:|
|リンゴ画像|200            |100         |75             |
|バナナ画像|200            |200         |50             |
|スイカ画像|150            |150         |100            |

リンゴは赤さ具合が強く、バナナは黄色（赤さ＋緑）具合が強い……といった塩梅です。
ここで、赤さ具合平均値を$x_{1}$、緑具合平均値を$x_{2}$、青さ具合平均値を$x_{3}$とおけば、下記のような表を作ることができます。

|         |$x_{1}$        |$x_{2}$     |$x_{3}$        |$3x_{1} + 2x_{2} + 4x_{3}$|
|:-------:|:-------------:|:----------:|:-------------:|:------------------------:|
|リンゴ画像|200            |100         |75             |**1100**                  |
|バナナ画像|200            |200         |50             |1200                      |
|スイカ画像|150            |150         |100            |400                       |

この章では、数式$3x_{1}+2x_{2}+4x_{3}=1100$を満たすようなパラメータ($x_{1},x_{2},x_{3}$)を探していました。そして、リンゴ画像のパラメータ($x_{1}=200, x_{2}=100, x_{3}=75$)はこれを満たすものです。
そうです、$3x_{1}+2x_{2}+4x_{3}=1100$は、リンゴを判定するためのリンゴ方程式だったのです。

### 再び、機械学習とは

つまり、①現実を数値に落とし込み、②その数値を元に判定用の数式を作り、③その数式を元に予測する。これが機械学習です。

## 機械学習実践のイメージ

実際に機械学習を実践しようとすると、もう少し気にしなければいけないことが出てきます。この章では、そういった部分について触れていきます。

### ①現実を数値に落とし込む

前章で「現実を数値に落とし込む」と述べました。何を、どんな数値に落とし込めば良いのでしょう。

例えば、日本株価。これは分かりやすいと思います。昨日の株価、２日前の株価、３日前の株価……を使うことができるような気がします。
でもどうでしょう、日本株価と米国株価を併せて考えることで、精度が上がるかもしれません。

また、株価の変化率を見てみるのも面白そうな気がします。昨日と２日前の株価の変化率、２日前と３日前の株価の変化率……も使えそうな気がします（この日は２％下落していたとか）。

一般に、現実を数値に落とし込む際には下記の悩みがつきまといます。

1. 現実の「何」を数値化するか
1. 数値化したものを「組合せ」て、新しい数値を作り出すかどうか
1. データに「欠損」がある場合はどうするか
1. （おまけ）文字列の数値化
1. （おまけ）数値のスケールを揃える

#### 1. 現実の「何」を数値化するか

株価など明らかに数値で見えているものは良いのですが、画像では何を数値化すれば良いのか少し迷います。

また、株価は最初から数値で見えていると言っても、前述のように海外の株価もあります。
もっと言えば、株価には始値・高値・安値・終値と種類があります。

どれを選ぶかは、完全に**エンジニアリング（コツ、経験と勘、ベストプラクティス）**の域[A]です。

#### 2. 数値化したものを「組合せ」て、新しい数値を作り出すかどうか

数値同士を組合せて、より良い指標を準備できるかもしれません。
前述のように、株価であれば変化率を見るのが面白そうです。
また先程の果物の例で言えば、「黄色さ指標」というものがあれば精度の助けになるでしょう。

ここも、**エンジニアリング**の域[B]です。

#### 3. データに「欠損」がある場合はどうするか

株価の一部のデータが飛んでいたり、画像の一部が欠けてしまっていたらどうしましょう。
そこは計算から除外するべきでしょうか、周りのデータから補完するべきでしょうか。
補完するのであれば、どのように？

ここも、**エンジニアリング**の域[C]です。

！キーワード：欠損値、dropna

#### 4. （おまけ）文字列の数値化

数値化したい対象が、文字列の場合があります。
ここは黙々と、数値に変換するところです。

例えば、ある画像を見て「これは数値化しがたい。赤色は"赤色"、緑色は"緑色"、青色は"青色"だ！」と考えたとしましょう。
別にこれ自体は良いんです。問題は、機械学習させるときには数値化しておかないと計算できないことです。

シンプルに赤色=1、緑色=2、青色=3と置き換えたくなります。
しかしこれをすると、青色/3 > 緑色/2 > 赤色/1という不等号関係が成り立ってしまい、計算がおかしくなります。

正解は、下記のようにフラグ化して管理することです。

|色  |赤色フラグ|緑色フラグ|青色フラグ|
|:--:|:-------:|:-------:|:-------:|
|赤色|1        |0        |0        |
|緑色|0        |1        |0        |
|青色|0        |0        |1        |

ちなみに、文字列でも明確に順序付けができる場合、素直に数値化して問題ありません。
例えば、下記のように。

|サイズ|数値|
|:---:|:--:|
|L    |3   |
|M    |2   |
|S    |1   |

ここで、$L = 3 \times S, M = 2 \times S$の関係が現実で成り立っていないといけません。

！キーワード：カテゴリデータ、名義特徴量、順序特徴量、クラスラベル、エンコード、one-hotエンコーディング

#### 5. （おまけ）数値のスケールを揃える

例えば株価の例で、下記のような数値を集めたとしましょう。

|     |日本株価 / $x_{1}$|日本株価（変化率）/ $x_{2}$|
|:---:|:---------------:|:------------------------:|
|１日前|21988           |0.0104                    |
|２日前|21761           |0.0137                    |
|３日前|21466           |0.0048                    |

どう見ても、$x_{1}$の値が大きすぎて、計算の際に$x_{2}$の影響を打ち消してしまいます。
ここも黙々と、数値のスケールを揃えていきます。

例えばmin-maxスケーリングと呼ばれるものを適用すると、下記のようになります。
（一番大きい数字が１，一番小さい数字が０、他はその間の何かの数値に変換されます）

|     |日本株価 / $x_{1}$|日本株価（変化率）/ $x_{2}$|
|:---:|:---------------:|:------------------------:|
|１日前|1.000           |0.629                     |
|２日前|0.565           |1.000                     |
|３日前|0.000           |0.000                     |

！キーワード：スケーリング、正規化、標準化（おすすめ）、min-maxスケーリング

### ②数値を元に判定用の数式を作る

ここまで頑張っても、まだ悩みは尽きません。
目的に応じた数式を作らないといけないからです。

ここの数式は、テンプレが用意されています。

1. ランダムフォレスト
1. XGBoost
1. NN

他にももっといっぱいあるのですが、個人の趣味で使うだけであれば、これくらいを使っておけば取り敢えず良いかと思います。①で準備した数値を入れ込みましょう。数式が出てきます。

### ③数式を元に予測する

②で数式を得た後は、その数式を元に色々と予測をしてあげます。

できた数式は、数値化された現実に上手くフィッティングされたものです。
この数式を未来の方向に少し伸ばしてあげることで、数式は予測を行います。

i) 間違ったフィッティングをしていた場合、ii) 突然、過去と違う事態が起こった場合は、当然予測は外れます。

機械学習はあくまで相関関係を見るので、因果関係を見るものではありません。
出てきた数式のレビューは、**エンジニアリング**の域[D]です。

## まとめ

お疲れ様でした。ここまでで、機械学習実践のイメージを一通り舐め終わりました。
流れを再掲すると、下記の通りです。

```
① 現実を数値に落とし込む
  1. 現実の「何」を数値化するか、決める
  2. 数値化したものを「組合せ」て、新しい数値を作り出すかどうか、決める
  3. データに「欠損」がある場合はどうするか、決める
  4. （おまけ）文字列の数値化
  5. （おまけ）数値のスケールを揃える
② 数値を元に判定用の数式を作る
③ 数式をゴリゴリと解く
```

## メモ
教師あり、教師なし