機械学習実践のプロセス ～概要から基本的な実践～

## はじめに

- 以前に投稿した[機械学習実践のプロセス ~Randomforest (Regression)](https://qiita.com/subretu2/items/4c8b2129b701c691a618)を改めて書き直し、どちらかというと、一般的な内容で、機械学習とは何か、また、機械学習を使ったモデル作成の一連プロセスについてまとめました。
- この記事を読んで、少しでも機械学習についての理解に役に立てれば幸いです( ˘ω˘ ) 

## 章立て


1. 機械学習とは
1. 機械学習の実践に必要スキル
2. 機械学習プロジェクトの流れ
1. 機械学習モデル作成のプロセス  
4-1.  データクレンジング  
4-2.  データの分割  
4-3.  アルゴリズムの選定  
4-4.  モデル作成  
4-5.  モデルの性能評価  
4-6.  モデルの性能をあげるには

## 1. 機械学習とは

- 機械学習とは、与えられたデータからいくつかのパターンを認識・学習し、未知のデータを予測、分類すること。

- 機械学習は、大きく分けて「教師あり学習」と「教師なし学習」の2つに分類される。
- 各学習ごとに回帰、分類、クラスタリングといった手法が存在する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/264860/c8a93b29-0c15-1aef-0d65-d0d32c8d22fd.png)


- 回帰、分類、クラスタリングについての簡単な説明は以下の通り。


|回帰|分類|クラスタリング|
|----|----|----|
|過去のデータから「パターン」を学習し、未知の結果を予測すること|過去のデータから「分類方法」を学習し、未知のデータを分類すること|未知のデータを、「類似性」をもとにグループ化すること|

- また、回帰や分類などにも様々なアルゴリズムがあり、用途に応じてこれらを使い分けてモデルを作成し、未知のデータ予測や分類を行う。

## 2.  機械学習の実践に必要なスキル

- 機械学習の実践によく使用されるプログラム言語は「Python」であり、Pythonは機械学習関連のライブライリーが豊富なことから、現在では主流となっている。
- 機械学習では、データベースにデータを格納し、SQLでデータ作成や加工を行うこともよくあるので、データベースやSQLに関する知識も必要になる。
- 機械学習のアルゴリズムの選定、モデルのさらなる性能向上のためのパラメータや特徴量(説明変数)の調整などには、機械学習、統計学、数学、また、解析しようとしている業界や事業についての知識や知見、トレンドなどの情報であるドメイン知識も必要とされる。

## 3.機械学習を使ったプロジェクトの流れ

- 機械学習を使ったデータ予測モデル作成のプロジェクトは、一例であるが、以下のような手順で行われることが多い。 
- ➀モデルを作成後、➁～➃の手順を繰り返し、最適なモデルができれば、➄デプロイするといった流れになる。  

 【データ予測モデル作成の流れ】
　➀学習データと機械学習アルゴリズムをもとにモデルを作成
　➁性能を検証
　➂ハイパーパラメータ、説明変数などの調整
　➃モデルを再作成
　➄最適なモデルをデプロイ
　※番号は以下のイメージ図と連携

![image.png](https://qiita-image-store.s3.amazonaws.com/0/264860/88bcf581-5af1-e653-cc7f-0f77dfafda59.png)

- 次章で、データ予測モデル作成の流れにおける、➀モデル作成から➂調整までのプロセスについてまとめる。

## 4.機械学習モデル作成のプロセス

- 今回は、教師あり学習(回帰)を用いたモデル作成を前提とする。

### 4-1.  データクレンジング
- 機械学習において、データクレンジングは重要であり、なぜなら、学習データは単に量が多ければ良いというものではないからである。
- 不適切な学習データを与えると、それが悪影響となってモデルの性能が低下してしまう可能性があるので、学習データに対して適切なクレンジングを行い、質の良いデータにする必要がある。
- 以下にデータクレンジングの一例を記す。
    - 欠損値がある場合、ランダム値やその列(または行)の平均値、または、前後の値との平均値などで穴埋めをする。
    - 欠損値がある場合、その列(または行)を除去する。


### 4-2.  データの分割

- モデル作成後に、モデルの性能を確かめるために、モデル作成に使用していないデータを使って評価を行う。
- そのため、モデル作成に使用する学習用データと、モデルの評価に使用するテスト用データに分割する。
- 学習用データとテスト用データの比率に決まりはないが、基本的には学習用データの方が多くなるように分割することがほとんどで、比率は７：３や８：２となる場合が多い。
- 以下の図は、分割したデータのイメージ（例：気温、湿度、風速より電力量を予測）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/264860/c7c8ca17-013f-4c41-6bf8-ab6b7b73b6cf.png)


### 4-3.アルゴリズムの選定

- 機械学習の手法には、様々なアルゴリズムがある。
- 以下は、アルゴリズムの一例。

|アルゴリズム|説明|
|----|----|
|サポートベクターマシン(SVM)|教師あり学習を用いるパターン認識モデルの一つで、2つのグループ間の最も距離の離れた箇所（最大マージン）を見つけ出し、その真ん中に識別の線を引き、2クラスのパターン識別器を構成する手法。|
|決定木|条件分岐によってグループを分割して分類する手法で、その際にグループがなるべく同じような属性で構成されるように分割する。|
|ランダムフォレスト|分類や回帰に使え、決定木をたくさん作って多数決する（または平均を取る）ような手法。<br>バギング（bootstrap aggregatingの略）を使って、データセットを複数のサブセットに分割し、サブセットからデータをランダムに選択して各決定木を作成し、最終出力を多数決（分類の場合）または平均値（回帰の場合）から決定する。
|Xgboost|勾配ブースティングとも呼ばれる手法で、弱学習学習器を逐次的に構築する手法。|

- これらの中から、用途に応じたアルゴリズムを選定し、モデル作成に使用する。

### 4-4.  モデル作成

- モデルの作成にはPythonを使用する(Pythonのバージョンは3以上)
- Pythonには機械学習用のライブラリーが豊富に揃っており、その中でも「scikit-learn」というライブラリーを用いることで、機械学習のモデル作成を行うことができる。
- また、以下のライブラリーも機械学習を行う上でのデータ処理、数値計算、可視化に利用することが多い。
    -  pandas：データ処理
    -  numpy：数値計算
    -  matplotlib：可視化
- その他、使用するアルゴリズムによっては、別途ライブラリーが必要になるので注意すること。
(例：xgboostを使用するには、xgboostライブラリーが別途必要)

- モデル作成時には、「ハイパーパラメータ」と呼ばれる、械学習アルゴリズムの挙動を制御するパラメータを指定する。
- ハイパーパラメータはアルゴリズムによって指定する種類や値が違っているので注意すること。
※各アルゴリズムに使用されるハイパーパラメータについては、各アルゴリズムを提供するライブラリーの公式ドキュメントや機械学習のアルゴリズムに関するドキュメント等を見て理解すること。

### 4-5.  モデルの性能評価

- モデル作成後、未知のデータに対するモデルの性能を確かめる。
- データを分割した際のテスト用データを使用して予測を行い、結果より評価指標を算出する。
- 評価指標の主要なものは以下の通り。

|評価指標|内容|
|---|---|
|MAE|・実際の値と予測値の絶対値を平均値。<br>・値が小さいほど誤差が少なく、予測モデルが正確に予測できていることを示す。|
|MSE|・予測値と実測値の差を二乗した値の平均値。<br>・二乗することで偏差のプラス・マイナスを吸収すると同時に、大きな誤差の影響をより大きく、小さな誤差をより小さく反映する。<br>・値が小さいほど誤差が少なく、予測モデルが正確に予測できていることを示す。|
|RMSE|・MSEの平方根。<br>・二乗したことの影響を平方根を取ることで指標と予測値・実測値とのスケールを合わせたもの。<br>・値が小さいほど誤差が少なく、予測モデルが正確に予測できていることを示す。|
|R2|・モデルの当てはまりの良さを示す指標。<br>・値が1に近いほど、モデルの当てはまりがよいとされる(当てはまりの悪い場合、マイナスとなることもある)|
|MASE|・スケーリングされたMAE。<br>「ナイーブな予測（1期前と同じ値とする）」との誤差でスケーリングされた予測誤差。<br>・値が小さいほど、予測モデルの精度がよいということを示す。|

### 4-6. モデルの性能を上げるために

- 作成したモデルの性能は、4-5で説明した正確に予測でいているかを示す評価指標と、未知のデータに対しても適用できるか示す汎用性*によって判断できる。
    - 学習データでは評価指標や予測精度が高いが、学習データと異なるデータ（今回で言うとテストデータ）では評価指標や予測精度が低くなる、つまり、学習データだけに最適化され汎用性がない状態であることを「過学習」といい、機械学習を行う上で、よく発生する課題と言われている。
    - 過学習を防ぐことが、汎用性の向上につながる。

- モデルの性能や汎用性を上げるには、ハイパーパラメータ、説明変数などを調整するなど、様々な方法があるが、ここでは一例を以下に記す。

#### ハイパーパラメータの調整  
- ハイパーパラメータの複数の組み合わせを試し、最も評価精度の良いものを探索する方法であるグリッドサーチを行い、最適なハイパーパラメータでモデルを作成する。
- ハイパーパラメータ自動最適化ツールである「optuna」などを使用して、最適なハイパーパラメータを選定する。

#### 説明変数の削減
- 寄与度(各説明変数の目的変数に対する重要度)を算出することができるため、寄与度の低いものを説明変数から除外する。 
- 統計学的には、相関係数が0に近いと2つの変数間に相関がないと言われているため、目的変数と相関係数が低い説明変数を除外する。  
※目的変数との相関係数は低いが寄与度が高いといったように、相関係数だけでは判断できないケースも存在するので、注意すること。 

#### 学習用データの追加
- 学習用に使用したデータに、追加できるデータがある場合は追加する。
(例：2017、2018年度のデータを用いてモデルを作成していたが、2016年度のデータも学習用データに追加する)
- 外部データを加える。
(例：気象庁から該当期間の気象データを取得して、学習用データに追加する)
- 時系列データの場合、過去の情報を加える（例：予測時間の10分前の気温、湿度、風速）