【アンサンブル】機械学習特訓 ver.7（まとめ）

<b>【特訓 ver.7】アンサンブル学習スタート！！</b>

※この記事では、アンサンブル学習についてまとめます
## ▼学習の流れ
まずはアンサンブル学習の基本を押さえ、具体的な分析例を通して理解を深める。

■使用するデータ
乳がんに関するデータ（全データ569）
説明変数：30個（腫瘍の半径、面積、深さ・・・）
目的変数：0は悪性(癌である)、1は良性(癌でない)

このデータを使用して、様々な測定値に基づいて腫瘍が悪性か良性かを予測するモデルを構築していく。

※データセット：後日（breast_cancer_data.csv）

<font color="#FF0000">■ アンサンブル学習について学習する</font>
上記のデータを用いて、複数のモデルを組み合わせた<strong>「アンサンブル学習」</strong>を実施していく。

大まかな流れ）

① データ読み込みや前処理、分割
　- 必要に応じて質的変数の数値化（エンコーディング）を行う

② モデルの設定と訓練
　- 「アンサンブル学習」で実施する
　　- 決定木（前回までの復習）
　　- バギング（ランダムフォレスト）
　　- ブースティング（LightGBM）

　上記3つのモデルを用いて、精度の違いを③で確認していく。

③ モデルの精度の確認
　- 精度について、以下6項目で確認していく
　　(1) 混同行列（confusion matrix）
　　(2) 正解率（accuracy）
　　(3) 適合率（precision）
　　(4) 再現率（recall）
　　(5) F1スコア（F1-score）
　　(6) AUC（曲線下面積）

## ▼復習
これまでの学習で、機械学習の分類手法として、SVM（サポートベクターマシン）や決定木などを学んできた。これらの手法は、それぞれ特徴があり、データの特性や問題に応じて使い分けることが重要である。

しかし、単一のモデルでは限界がある場合も多い。そこで、複数のモデルを組み合わせて、より高い予測精度を得る手法が<strong>「アンサンブル学習」</strong>である。

## ▼アンサンブル学習とは？
アンサンブル学習とは、複数のモデルを組み合わせて、よりよい予測を行う手法である。1つのモデルだけで学習させるよりも、<b>複数のモデルを組み合わせた方が予測精度の向上が期待できる</b>。

歌の世界でも、「アンサンブル」という言葉がある。
以下の図のとおり、複数名で音色をきれいに響かせるものを示す。対して、1人で歌うこともあると思う。こんなイメージ！

以下、図のとおり、複数の歌手が調和してきれいな音色を作り出すことを指す。一人で歌う場合と比較して、一層豊かで深みのある演奏を創り出すことができる。このように、アンサンブル学習もまた、単一のモデルではなく、複数のモデルが協力することで、より正確で信頼性の高い結果を生み出すことができる。

<p float="left">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/d821aee2-6e08-1c36-e56f-999e35d0cedd.png" width=50.4%">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/bf574188-a307-cf48-a900-54ab51e0650e.png" width="47%">
</p>
<b>左図</b>：アンサンブル合唱　<b>右図</b>：ソロ

<br>
<br>

さて、ここで、人工知能には3種類の誤差が含まれることを知っておきたい。
<b>「バイアス」</b>と<b>「バリアンス」</b>と<b>「ノイズ」</b>である。

<b><font color="#FF0000">バイアス</font></b>とは、モデルの予測値と実際の値との差を示す。

<b><font color="#0000FF">バリアンス</font></b>とは、モデルの予測値のばらつきを示す。

<b>ノイズ</b>とは、偶然に発生したズレを示し、<b>減らせない誤差</b>である。
<br>

<font color="#FF0000">バイアス</font>を減らすための手法として、<font color="#FF0000">パラメータチューニング</font>を用いる。
<font color="#0000FF">バリアンス</font>を減らすための手法として、<font color="#0000FF">アンサンブル学習</font>を用いる。

現時点での理解としては、予測モデルの精度を高めるために、バイアスやバリアンスを調整する必要があり、そのために<b>アンサンブル学習</b>を用いるという認識でよい。

#### ▼ 視覚的に表現！（バイアスとバリアンス）
1次関数（未学習）、4次関数（ちょうどいい）、15次関数（過学習）を用いて、バイアスとバリアンスを図示していく。
また、トレードオフの関係についてイメージを持っていく。

▼ <font color="#FF0000"><b>バイアス</b></font>について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/ea23af3e-debe-1cc7-046e-557b14a93709.png)
理想の線は、青色の曲線。
`degree=1`（左図）の場合は、単回帰（1次関数）のため、理想の線との差分も大きい（＝バイアスが大きい）。


▼ <font color="#0000FF"><b>バリアンス</b></font>について
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/3a813308-9977-0255-c481-5112f4f2a46f.png)
`degree=1`（左図）の場合は、単純なモデルのため、何回試行しても結果があまり変わらない（＝バリアンスが小さい）。

▼ <font color="#008000"><b>トレードオフ</b></font>について（まとめ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/ac6b630f-2725-f1d5-6e19-d1b46f3ab2cc.png)
`degree=1`の場合は、バイアスが大きく、バリアンスが小さい。
ただ、バイアス（理想モデルとの差分）を減らしていくと、バリアンスが大きくなってしまい、精度が低くなる。バイアスが増えるとバリアンスが減り、このバランスを保つことが大切。そのためにアンサンブル学習を用いる。


## ▼アンサンブル学習の代表的な手法
#### ① バギング（Bagging）
ブートストラップ法で生成した複数のデータセットを用いて、それぞれのモデル（弱学習器）を学習させ、最終的にそれらのモデルの予測結果を平均化（または多数決）する手法である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/d9a8d833-37b8-c10e-3e58-db2bdcc970e7.png)


<strong>ブートストラップ法</strong>
：元のデータセットからランダムに重複を許してサンプリングし、新たなデータセットを作成する方法。

<strong>特徴</strong>：
バリアンスを小さくできるため、過学習を防ぐ効果がある。
<b>並列処理で行うため</b>、学習時間が短い。

<strong>代表的なモデル</strong>：
ランダムフォレスト（Random Forest）

<br>

#### ② ブースティング（Boosting）
同じデータセットに対して、複数のモデルを順次学習させる手法である。各ステップで前のモデルの誤差を補正するように次のモデルを学習させ、最終的にそれらを組み合わせて強力なモデルを構築する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/68409664-efe4-3545-4960-fd4b14894022.png)

<strong>特徴</strong>：
バイアスを小さくできるため、高い予測精度が期待できる。
<b>直列処理で行うため</b>、学習時間が長くなる。

<strong>代表的なモデル</strong>：
勾配ブースティング（Gradient Boosting）
XGBoost
LightGBM

<br>

#### ③ スタッキング（Stacking）
異なる種類のモデルの予測結果を新たなデータとして用い、メタモデル（上位のモデル）を学習させる手法である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/f4c22951-ddee-0162-caa6-e9ebeec7d1f6.png)
<strong>特徴</strong>：
予測精度の向上が期待できる。
結果の解釈や分析が複雑になる。
学習時間が長くなる。

## それでは実際に使ってみよう！！
【アンサンブル学習】
<b>大まかな流れ</b>

① データ読み込みや前処理、分割
　- 必要に応じて質的変数の数値化（エンコーディング）を行う

② モデルの設定と訓練
<b>　- 1. 決定木（前回までの復習）の実装
　- 2. バギング（ランダムフォレスト）の実装
　- 3. ブースティング（LightGBM）の実装</b>

③ モデルの精度の確認
　- 精度について、以下6項目で確認していく
　　(1) 混同行列（confusion matrix）
　　(2) 正解率（accuracy）
　　(3) 適合率（precision）
　　(4) 再現率（recall）
　　(5) F1スコア（F1-score）
　　(6) AUC（曲線下面積）

＜データの準備＞
<b>① データ読み込みや前処理、分割</b>

```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# データの読み込み
df = pd.read_csv("/content/breast_cancer_data.csv")
df.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/07cad5c2-70cf-fcbc-1383-e6201de0c895.png)
↑ 乳がんに関するデータ（全データ569）
説明変数【下記以外の全て】：30個（腫瘍の半径、面積、深さ 等）
目的変数【type】：0が悪性（癌）、1が良性（癌でない）

```python
#説明変数と目的変数に分ける
x = df.drop(["type"],axis=1).values
y = df["type"].values

#データを学習用と検証用に分割
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(
    x,y,train_size=0.7,random_state=0)
```
データの準備完了！

<b>② モデルの設定と訓練</b>
決定木、ランダムフォレスト、LightGBMそれぞれで実装し、モデル精度の違いについて検証していく。
（※各モデルは、同条件下にするためハイパーパラメータも調整済）

##### 1. 決定木（前回までの復習）の実装
```python
#決定木
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier(max_depth = None, min_samples_leaf = 1, min_samples_split = 10)
model.fit(x_train,y_train)
```
##### 2. バギング（ランダムフォレスト）の実装
```python
#ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(max_depth=None, min_samples_leaf=1, min_samples_split=2, n_estimators=100)
model.fit(x_train, y_train)
```
##### 3. ブースティング（LightGBM）の実装
```python
#LightGBM
import lightgbm as lgb
model = lgb.LGBMClassifier(learning_rate = 0.5, max_depth = -1, n_estimators = 100, num_leaves = 31)
model.fit(x_train,y_train)
```


<b>③ それぞれのモデルの精度を確認</b>
```python
# 混同行列の出力
from sklearn.metrics import confusion_matrix,precision_score,recall_score,f1_score,roc_auc_score

# 混同行列の出力
print("Confusion Matrix:")
print(confusion_matrix(y_true=y_test, y_pred=model.predict(x_test)))

# 性能指標の計算と表示
print("正解率(train) =", model.score(x_train, y_train))
print("正解率(test) =", model.score(x_test, y_test))
print("適合率 =", precision_score(y_true=y_test, y_pred=model.predict(x_test)))
print("再現率 =", recall_score(y_true=y_test, y_pred=model.predict(x_test)))
print("F1スコア =", f1_score(y_true=y_test, y_pred=model.predict(x_test)))
print("AUC =", roc_auc_score(y_true=y_test, y_score=model.predict_proba(x_test)[:, 1]))
```
上記をテンプレートとして、分類の結果をそれぞれ出力する。
<b>左図</b>：1.決定木
<b>中図</b>：2.ランダムフォレスト
<b>右図</b>：3.LightGBM

<p float="left">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/ecf65d52-8b2b-5823-e033-c8a6decd9a83.png" width=33%">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/e53f02fb-2fce-5fe1-84db-3db44bf1a79c.png" width="32%">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3853135/457926c8-3cfb-2281-8094-b785aa2fd33a.png" width="32.5%">
</p>

多くの評価指標（正解率、再現率、F1スコア、AUC）において、LightGBMが最も高い性能を示している。また、同じくランダムフォレストも非常に高い性能を示しており、LightGBMに次ぐ性能。特に、適合率が高く、用途に応じてこちらのモデルを使用するケースもありそう。
一方で、決定木は他の二つのモデルと比較してやや劣る結果となっており、特にテストデータに対する正解率、AUCが他のモデルより低い。

<br>

<b>＜考察＞</b>
LightGBMが高い性能を示した理由としては、<b>ブースティング手法により、各モデルが前のモデルの誤差を補正しながら学習した</b>ため、データの複雑なパターンをより正確に捉えることができた。

一方、ランダムフォレストは<b>バギング手法により、多数の決定木を組み合わせて予測することで、個々のモデルのばらつきを平均化し</b>、安定した予測ができた。

決定木は<b>単一のモデルであるため、データに対する適合度が前述のアンサンブル手法と比較して劣る場合もあり</b>、過学習や未学習のリスクが高く、モデルの汎化性能が低下する可能性もある。

<br>

<b>＜まとめ＞</b>
アンサンブル学習は、複数のモデルを組み合わせることで、単一のモデルよりも高い予測精度を達成する手法である。

決定木分析などの単一モデルをパワーアップさせたものがアンサンブル学習（ランダムフォレスト、LightGBM）と認識されがちであるが、デメリットもあり、モデルの解釈が難しくなり、学習時間が長くなる傾向にある。
また、扱うデータによっては、決定木の方が精度が高くなる場面もある。

<br>
<b>以上。</b>