【初心者】機械学習のモデリングについて整理してみた

# 背景・目的
私は、現在データエンジニアリングを生業としています。普段は、データ基盤の構築や、パフォーマンスチューニングなどビックデータに関する業務に従事しています。
ビックデータの収集や、蓄積、分析などの環境構築の経験はそこそこありますが、機械学習による予測や分類などのスキルは持ち合わせていませんでした。
今まで機械学習を避け続けてきましたが、一念発起し学ぼうと思います。

学び方としては、AWS Certified Machine Learning – Specialty（以降、ML試験という。）の勉強を通して、理解を深めていきます。ML試験のガイドの第3分野に、第 3 分野: モデリングから学びたいと思います。

今回は、**モデリング**について学びたいと思います。

なお、過去の機械学習の調べてみたシリースは下記にまとめています。
- 2.探索的データ分析
- [2.1.モデリング用のデータをサニタイズおよび準備する](https://qiita.com/zumax/items/d763d39e42520016b241)
    - [【初心者】探索的データ解析とは何かを調べてみた](https://qiita.com/zumax/items/52c97307bf18f407bb6e)
    - [【初心者】データのスケーリングを調べてみた](https://qiita.com/zumax/items/ca7184dcf4e7fd242128)
    - [【初心者】データの拡張を調べてみた](https://qiita.com/zumax/items/0727e329f3322897d3e7)
    - [【初心者】データアノテーションを調べてみた](https://qiita.com/zumax/items/d0da86b68b05b99cb23e)
- 2.2.特徴エンジニアリングを実行する
    - [【初心者】特徴量エンジニアリングについて調べてみた](https://qiita.com/zumax/items/3b6e771ef1fcaf3edd91)
    - [【初心者】特徴量エンジニアリング（データのビニング）について調べてみた](https://qiita.com/zumax/items/dc0c86736dd5362cf118)
    - [【初心者】特徴量エンジニアリング（トークナイゼーション）について調べてみた。](https://qiita.com/zumax/items/5286c51ecc0a81b66b87)
    - [【初心者】特徴量エンジニアリング（外れ値）について調べてみた](https://qiita.com/zumax/items/2a07f6d3502fc9a16a44)
    - [【初心者】特徴量エンジニアリング（合成データ）について調べてみた](https://qiita.com/zumax/items/654eae53dae77f222433)
    - [【初心者】特徴量エンジニアリング（ダミー変数[One-Hotエンコーディング]）について調べてみた](https://qiita.com/zumax/items/de5cef1ac4a281400764)
    - [【初心者】特徴量エンジニアリング（次元低減）について調べてみた](https://qiita.com/zumax/items/d92342c3da94020eedec)
- 2.3 機械学習のデータを分析および視覚化する
    - [【初心者】機械学習のデータを分析および視覚化を調べてみた](https://qiita.com/zumax/items/1879441180372858d006)
    - [【初心者】機械学習のクラスタリングを調べてみた](https://qiita.com/zumax/items/41f1366f4f1a00eee1f0)
    - [【初心者】機械学習のクラスタリング（エルボー法）を調べてみた](https://qiita.com/zumax/items/f72941a10a6b9460c5de)
    - [【初心者】機械学習の用途やジャンルを学ぶ](https://qiita.com/zumax/items/b0849a8b21d6a4a1fddb)
- 機械学習プロセス
    - [【初心者】AWS Machine Learning Lensを整理する](https://qiita.com/zumax/items/93f9635b3be51fe483e1)

# まとめ
- モデリングは、以下の流れで進める。
    - ビジネス上の課題に対して適切なアルゴリズムを選択する。
    - モデルのトレーニングと評価に使用するデータを分割する。
    - ハイパーパラメータにより目標値までトレーニングする
    - 　モデルを評価する
- SageMakerには組み込みアルゴリズムや、カスタマイズされたものが使用できる・

# 概要
## ビジネス上の課題を機械学習の課題として捉え直す
機械学習が問題に対する適切なソリューションか判断する必要があります。
機械学習は、**データの隠れたパターンを識別する**ことを目的としている。機械学習では大量データを活用して、パターンと構造についてモデルをトレーニングし、予測を行います。

- 機械学習に適しているユースケース
    - ルールをコーディングできないような場合に適しています。多くの要因が解答に影響する場合、ルールが多くの要因に依存しルールが重複、細かく分類されるような場合、人間がコーディングするのは困難。このような場合に、機械学習により解決できる可能性がある。
    - また、スケールできないような大量データを扱う場合にも効果的です。
    - 例えば、膨大な履歴データを分析し予測するようなクレジットカードの不正取引判定や、電子メールのスパムフィルターのようなユースケースがが考えられます。
- 機械学習に適していないユースケース
    - プログラミングできるような単純なルールや計算


### 機械学習アルゴリズムのアルゴリズム
大きく以下のように分類されます。

- 教師あり学習
    - 変数と既知の結果の関係を確認することでパターンを学習する
        - 画像認識のような例で、動物の画像と対応するラベルを与えて学習・予測する場合など
    - 適切にラベル付けられることが前提
- 教師なし学習
    - 入力から出力がどのようにマッピングされるか不明な場合、教師なし学習が当てはまる可能性がある
    - 一般的な教師なし学習はクラスタリングと呼ばれる。
    - 特定のグループをクラスタ化するような場合に用いられる。
        - 購入した商品により、大企業向けか中小企業向けかクラスタリングし、マーケティング戦略を考えるなど
- 強化学習
    - 環境内におけるエージェントが、現在の状態を観測し、取るべき行動を決定する問題を扱う機械学習の一種。
    - エージェントは行動を選択することで環境から報酬を得る。強化学習は一連の行動を通じて報酬が最も多く得られるような方策（policy）を学習する。
    - 環境はマルコフ決定過程として定式化される。代表的な手法としてTD学習やQ学習がある。

### 教師あり学習
分類と回帰に分類できる。更に分類は、バイナリ分類と複数クラス分類に分けられる。

#### バイナリ分類
クレジットカードの不正判定のように、不正か不正ではないかのように結果が2つのカテゴリに分類されます。

#### 複数クラス分類
お客様がコールセンターに電話する理由を予測する場合(ITサポート、返品、商品問い合わせ)など、結果が3つ以上に分類される場合。

#### 回帰
株価の予測など整数などの連続した値にマッピングする場合

### ビジネス上の問題を機械学習に捉え直す
問題の定義方法は、ビジネスニーズとユースケースにより変わる。
例えば、ビジネス上の問題として、「製品の販売予測」があった場合、機械学習としては、以下のように考えられます。
- 顧客が各製品に対しての購入数を予測する必要があるか？
    - この場合は、ターゲットは数値となるので回帰になる。
- 100以上購入する製品を予測する必要があるか？
    - この場合は、ターゲットは100個以上か100個未満のバイナリ問題となる。

<!--
教師あり学習
回帰と分類
教師なし学習
クラスタリング
異常検出
ディープラーニング
パーセプトロン
人工ニューロンのコンポーネント
-->

## 特定の機械学習の課題に対して適切なモデルを選択する
機械学習の問題を適切なアルゴリズムにマッピングする。

### 分類の問題の例
- バイナリ分類
    - ROIを最大化させるにあたり、顧客にDMを送るべきか、送らないべきか
- 複数クラス分類
    - 顧客を、VIP、優良顧客、一般顧客に分類する
- SageMakerでは以下のアルゴリズムが組み込みで利用できる。
    - 線形学習
    - XGBoost
    - K近傍法

### 回帰の問題の例
- 顧客へDMを送った際のROIはどれくらいか
- SageMakerでは以下のアルゴリズムが組み込みで利用できる。ハイパーパラメータを設定師それらのアルゴリズムに量的な結果を生成できるように指示できる。
    - 線形学習
    - XGBoost

### NL、CV用のSageMakerアルゴリズム
- NLP
    - 自然言語処理アルゴリズム
    - SageMakerでは、以下の組み込みアルゴリズムが利用できる。
        - BlazingText
            - Word2vecとテキスト分類アルゴリズムの高度に最適化されたアルゴリズムの実装を提供
        - Sequence2sequence
            - 教師ありアルゴリズム。
            - 入力がテキスト、オーディオなどのトークンのシーケンス
        - Object2Vec
            - Word2vec埋め込み手法を、BlazingTextアルゴリズムで最適化された単語について一般化したもの
- CV
    - コンピュータビジョンアルゴリズム
    - SageMakerでは、以下の組み込みアルゴリズムが利用できる。
        - 画像分類
            - 教師あり学習
            - 画像分類に使用される
        - 物体検出アルゴリズム
            - 単一のディープニューラルアルゴリズムネットワークを使用して画像内の物体を検出して分類する
            - 教師あり
            - 入力として画像を取得し、画像シーン内のオブジェクトの全てのインスタンスを識別する
            - オブジェクトは、指定されたコレクション内のいずれかのクラスに分類され、そのクラスに属しているという信頼性スコアがつけられる。
        - セマンティックセグメンテーションアルゴリズム
            - 画像内の全てのピクセルに事前定義されたクラスのセットからのクラスラベルでタグ付けする


#### その他のトレーニングアルゴリズム
トレーニングアルゴリズムには、以下のオプションもある。
- SageMakerでSparkを使用する
- カスタムコードを送信し、TensorFlow、MXNetなどのディープラーニングフレームワークでトレーニグする
- 独自のカスタムアルゴリズムを使用して、コードをDockerイメージとしてまとめる
- AWS Marketplaceからアルゴリズムをサブスクライブする

<!--
Linear Learner (線形学習)
XGBoost
K-means
決定木
ランダムフォレスト
画像分類
オブジェクト検出
セマンティックセグメンテーション
-->


## 機械学習モデルのトレーニングを行う
アルゴリズムを選択した後は、トレーニング、調整、評価を行う。これらは反復して行うものです。

### データを分割してトレーニングと評価を適切に区別する
まずは、データを分割して、トレーニングと評価の取り組みを区分する。

#### ホールドアウト法
一般的には、全てのラベル付きデータを以下に分類する。
- トレーニングデータセット 80%(70%)
    - モデルをトレーニングしパターンを表示する
- 検証セット 10%(15%)
    - 検証データを使用して、ハイパーパラメータをチューニングしながらモデルパフォーマンスを推定したり、検討しているモデル間でパフォーマンスを比較する。
- テストセット 10%（15%）
    - テストデータを使用して、最終的に使用するトレーニング済みモデルの予測品質を評価する

#### 交差検証
複数のモデルのパフォーマンスを比較する場合に使用する。
最終的に本番環境で最高のパフォーマンスを実行するモデルを選択する。


#### K分割交差検証
一般的な検証方法。
- 入力データをK個のデータのサブセットに分割し、以下のように使用する
    - K-1個のサブセットでモデルをトレーニングに使用
    - トレーニングに使用しなかったサブセットは評価に使用
- 上記をK個のデータの全てが一回ずつ評価データになるようにK回学習を行い精度の平均を取る。

### SageMakerでトレーニングジョブを作成する
上記までで、選択したアルゴリズムと分割したデータを使用して実際のトレーニングジョブが実行できるようになった。
以下のステップでトレーニングジョブを作成する。
- SageMakerでは、トレーニングデータ用のS3バケットと、トレーニングジョブ出力用のS3バケットのURLを指定する
- SageMakerでモデルトレーニングに使用するコンピューティングリソース（インスタンス）を指定する
- トレーニングコードが保存されるECRのパスを指定する

<!--
トレーニングジョブ用の Amazon SageMaker ワークフロー
コンテナを使用したトレーニングジョブの実行
独自のコンテナを構築する
P3 インスタンス
ディープラーニング用の ML トレーニングジョブのコンポーネント
-->

## ハイパーパラメータの最適化を実施する
モデルは最初から本番環境で必要なレベルになることは稀。多くの場合、追加でトレーニング後にチューニングする必要がある。
多くの場合、追加特徴量エンジニアリングの実行、新しいアルゴリズムの試用などを行う。
チューニングには、ハイパーパラメータの調整がある。

### ハイパーパラメータとは？
機械学習アルゴリズムの動作を制御するためのパラメータ。
トレーニングジョブを実行する前にチューニングできる。トレーニングの時間、モデルの収束、モデルの精度に関連してモデルのトレーニングに大きな影響を与える。
ハイパーパラメータには、以下のカテゴリがあります。
- モデルハイパーパラメータ
    - モデル自体を定義
        - フィルタサイズ
        - プーリング
        - ストライド
        - パディングなどのニュラールネットワークアーキテクチャ属性
- オプティマイザハイパーパラメータ
    - モデルがデータに基づいてパターンを学習する方法に関連する
    - ニューラルネットワークモデルに使用される
    - 以下のようなものがある
        - 勾配降下法や確率的勾配降下法などのオプティマイザ
        - Adam などのモーメンタムを使用したオプティマイザ
        - Xavier 初期化や He 初期化などのメソッドを使用したパラメータウェイトの初期化
- データハイパーパラメータ
    - データの属性に関連している
    - データが不足している場合、データのバリエーションが十分ではない場合に使用される

### ハイパーパラメータのチューニングは大きな労力を要する
従来は、手動で行われており、直感と経験に基づき手動で選択していた。これらは満足できる結果が得られるまで何度も繰り返される。
効率的とは言えなく、この他にサーチメソッドを使用したハイパーパラメータのチューニング方法が開発されてきた。
- グリッド検索
    - ハイパーパラメータとその異値で構成されるグリッドを設定する。
    - 可能な組み合わせ毎にモデルがトレーニングされ検証データでスコアが生成される
    - ハイパーパラメータの組み合わせ毎に施行されるため、効率的ではない
- ランダム検索
    - ランダムな組み合わせが選択される
    - サーチイテレーションの回数は、時間とリソースの制約に基づき設定される

### SageMakerではハイパーパラメータの自動チューニングも行われる
勾配降下法、ベイズ最適化、進化的アルゴリズムなどのメソッドを使用して、最適なハイパーパラメータ設定のためのガイド付きサーチを実行する自動ハイパーパラメータチューニングがある。
SageMakderでは自動ハイパーパラメータチューニングを実行できる。
- 指定したアルゴリズムとハイパーパラメータの範囲を指定して、データセットに対して多数のトレーニングジョブを実行することでモデルの最適なバージョンを見つける。
- 選択したメトリクスでの測定に基づいて、最もパフォーマンスの高いモデルになるハイパーパラメータ値を選択できる

<!--
Amazon SageMaker を使用したハイパーパラメータのチューニングジョブ
チューニングする一般的なハイパーパラメータ:
- モーメンタム
- オプティマイザ
- 活性化関数
- ドロップアウト
- 学習率
正則化:
- ドロップアウト
- L1/L2
-->

## 機械学習モデルを評価する
モデルのトレーニングとチューニングが完了したら、モデルを評価して新規データと将来的なデータでターゲットを予測できるか判断します。

### トレーニング済みのモデルを通じてテストセットを実行し、予測を真の値と比較する
モデルの評価に使用するメトリクスは、使用している機械学習のタイプとアルゴリズムにより異なります。

分類問題の場合、混同行列はモデル評価の構成要素になる。
予測が真、偽、実測が真、偽であるときに組み合わせにより、以下のように整理できる。

| |予測（P） |予測（N） |
|:--|:--|:--|
|実測（P） | 真陽性（TP） |偽陰性(FN) |
|実測（N） | 偽陽性(FP) | 真陰性(TN) |

#### 精度
予測の合計数に対する正しい予測の比率
```
(TP+TN) / (TP+FP+FN+FP)
```

#### 適合性
陽性と予測したデータのうち実際に陽性であるものの割合
```
TP/(TP+FP)
```

#### 再現率
陽性と識別される正しいセットの割合
```
TP/(TP+FN)
```

<!--
回帰のメトリクス: 二乗誤差合計、RMSE
感度
特異度
ニューラルネットワーク関数 (最後のレイヤーの Softmax など)
-->

# 考察
機械学習アルゴリズムについて、今後実装して特徴を理解する。

# 参考
https://d1.awsstatic.com/ja_JP/training-and-certification/docs-ml/AWS-Certified-Machine-Learning-Specialty_Exam-Guide.pdf

https://ja.wikipedia.org/wiki/%E5%BC%B7%E5%8C%96%E5%AD%A6%E7%BF%92

https://aiacademy.jp/media/?p=263