PyCaretの初心者向けまとめ（分類編）

# はじめに

Pythonの機械学習ライブラリ「[PyCaret](https://pycaret.org/ "PyCaret")」は、非常に簡単に動くライブラリですのでモデルの分析結果を出すまでは、初めての方でもサクサク出来るはずです。
ですが、モデルの種類や評価指標、解析結果の図の意味や見方がわからない場合「結局、どうしたらいいの？」という状況に陥ると思います。（私がそうでした・・・公式サイトは英語で、読むだけでも一苦労。）
このような中、共同でPyCaretを勉強してる方々の支えもあり色々と情報を仕入れることができましたので、私個人の備忘含め、PyCaretの全体像が理解できるようにこの記事に纏めてみました。

※細かい内容では無いことを予めお伝えしておきます。
※この記事は「分類編」です。
　「回帰編」は[「PyCaretの初心者向けまとめ（回帰編）」](https://qiita.com/shuhigashi/items/0fb37468e64c76f4b245 "PyCaretの初心者向けまとめ（回帰編）")を参照ください。

# １．PyCaretとは

###1-1.PyCaretとは

「PyCaret」とは、様々な種類の機械学習を少しのコードで実現してくれる便利なライブラリです。
公式サイトでは次のように紹介されています。
>PyCaretは、Pythonのオープンソースのローコード機械学習ライブラリであり、仮説から考察までのサイクルタイムを短縮することを目的としています。

>PyCaretを使用すると、選択したノートブック環境を使用して、データの準備からモデルのデプロイまで数秒で行うことができます。

https://pycaret.org/guide/ より引用
###1-2.PyCaretのメリット

- コード実装が非常に簡単（数行で実装可能）
- データの前処理も自動で実施
- ハイパーパラメータの自動最適化が可能
- 色々な解析結果を図で確認が可能

###1-3.PyCaretの実装手順

- PyCaretのインストール
- データの読み込み
- データの前処理
- 各種モデルの評価と精度の比較
- ハイパーパラメータの最適化
- モデルの精度の可視化
- モデルの確定
- 予測の実行
- 予測結果をCSVでダウンロード


# ２．環境・バージョン

- OS：windows10
- Jupyter Notebook：6.0.3
- PyCaret：2.2.1

# ３．PyCaretのインストール

まずは、pycaret のパッケージをインストールします。
※インストールに結構時間が掛かると思います。

```
pip install pycaret
```

# ４．データの読み込み
###4-1.パッケージの読み込み
次に、必要なパッケージを読み込みます。

```Python
# パッケージの読み込み
import pandas as pd
from pycaret.classification import *
```
今回は「分類」を行うので`pycaret.classification`としました。
尚、モジュール一覧は次の通りです。

| モジュール | インポート方法 |
| :----|:----|
| 分類 | pycaret.classification |
| 回帰 | pycaret.regression |
| クラスタリング | pycaret.clustering |
| 異常検出 | pycaret.anomaly |
| 自然言語処理 | pycaret.nlp |
| アソシエーション分析 | pycaret.arules |


###4-2.データの読み込み
次に、データを読み込みます。
手持ちデータか否かでやり方を分けて記載しています。
【今回の記事は手持ちではない場合で話を進めていきます。】
####手持ちデータではない場合（とりあえずPyCaretを動かしたい場合）

PyCaretに用意されているデータ【PyCaret’s Data Repository】より、チャーン分析を体験できる「社員」を使用します。
詳しくはコチラを参照してください。　https://pycaret.org/get-data/

```Python
# 使用するデータの読み込み 
from pycaret.datasets import get_data 
data = get_data('employee')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/db9b6e47-b3d1-6d20-011f-375373dfb9c4.png)
それぞれの項目の説明は以下です。

| 項目名 | 説明 | データ型 |
| :----|:----|:----:| 
| satisfaction_level | 従業員の満足度（0-1スケールで1が最大） | float64 | 
| last_evaluation | 最後の評価（0-1スケールで1が最大） | float64 | 
| number_project | 割り当てられたプロジェクトの数 | int64 | 
| average_montly_hours | 平均の月労働時間 | int64 | 
| time_spend_company | 勤続年数 | int64 | 
| Work_accident | 仕事中の事故の有無のダミー変数（1：有、0：無） | int64 | 
| promotion_last_5years | 直近5年間での昇格の有無のダミー変数（1：有、0：無） | int64 | 
| department | 部署名 | object | 
| salary | 給料のランク | object | 
| left | 退職したか否かのダミー変数（1：退職、0：在職） | int64 | 

次に、読み込んだデータ（14,999レコード）の95％を学習データ、5%をテストデータ(Unseen Dataと呼ぶ)に分けます。※最後に実施する予測の実行時に未知のデータとしてUnseen Dataを活用するためです。

```Python
# 95％を学習データ、5%をテストデータ(Unseen Dataと呼ぶ)に分ける
employee_data = data.sample(frac =0.95, random_state = 786).reset_index(drop=True)
employee_data_unseen = data.drop(employee_data.index).reset_index(drop=True)
print('Data for Modeling: ' + str(employee_data.shape))
print('Unseen Data For Predictions: ' + str(employee_data_unseen.shape))
```
分割した結果が次の通りです。
（学習データが14,249レコード、テストデータが750レコードと分割されています。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/089043db-099f-057f-97b8-54b47b2030fa.png)

####手持ちデータの場合（実務でPyCaretを動かす場合）

実務ではCSVファイルを読み込むケースが多いと思います。
その場合はPandasの`pd.read_csv`で次のように読み込んでください。

```Python
# CSVデータの読み込み
data = pd.read_csv('c:/path_to_data/file.csv')
```
[補足１]
上記のように引数を何も指定しないと、CSVファイルはUTF-8で読み込みます。
CSVファイルをShift-JISで読み書きしたいときには、引数で指定する必要があります。（以下、例）

`data = pd.read_csv('c:/path_to_data/file.csv', encoding = "shift-jis")`

[補足２]
WindowsでPythonを使う時の注意として、ファイルのパスを指定をする場合、
ファイルのパスを「¥」区切りで指定するとエラーになります。主な対処方法は次の２つです。

#####パスの区切りを¥¥にする
`data = pd.read_csv('c:\\path_to_data\\file.csv', encoding = "shift-jis")`
#####パスの区切りを/にする
`data = pd.read_csv('c:/path_to_data/file.csv', encoding = "shift-jis")`

# ５．データの前処理
次に、PyCaretを起動します。

```python
# PyCaretを起動
exp1 = setup(employee_data, target = 'left', ignore_features = None)
```

目的変数は退職したか否かを意味する「left」としています。
※setupコマンドの説明は下表の通りです。

| 項目 | 説明 | 備考 |
|:----|:----|:----:|
| 第一引数 | 解析に用いる読み込んだデータ | 必須 |
| 第二引数 | 予測に用いる目的変数の列名 | 必須 |
| 第三引数 | 分析から外す説明変数の列名 | 任意 |

実行すると次のように自動的にデータ型を設定してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/fa465a0c-1657-19d6-99fa-aa6c42a844b5.png)
データ型を変更せず、このまま続ける場合は"Enter"を押下します。

データ型の変更が必要な場合は、"quit"と入力し"Enter"を押下します。
例えば、time_spend_company 列はCategoricalとして認識されていますが、Numericとして扱いたい場合は
setupコマンドを次のようにオプションを記述します。
※オプション一覧は[こちら](https://qiita.com/Asagumo63/items/99357d4b472a9219040e#%E5%9B%9E%E5%B8%B0-regression-pycaret20 "こちら")が非常に参考になります。

```python
# PyCaretを起動（データ型を変更する場合）
exp1 = setup(employee_data, target = 'left', ignore_features = None, numeric_features = ['time_spend_company'])
```
※ `numeric_features` オプションを使用し、`, numeric_features = ['time_spend_company']`を追加しています。

これを実行すると、次のようにtime_spend_company 列がNumericとして変更されていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/4e62ffea-3910-9f1e-05b2-654ecd1b6cda.png)

setupコマンドが完了すると次のようにセットアップ結果が表示されます。
データによっては算出できない項目もあるため、その場合は「False」や「None」と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/86faee40-5dae-c1e7-78eb-256233acaab5.png)


# ６．各種モデルの評価と精度の比較
###6-1.モデルの比較
次に、モデルを比較します。

```python
# モデルの比較
compare_models()
```

これを実行すると次のように各種モデルを評価・比較し誤差の少ない順番に並べた一覧が表示されます。
（分類の場合、デフォルトではAccuracyで並べ替えられます。）
この例の場合、「Random Forest Classifier」というモデルの評価が高いことがわかります。
※各評価指標のトップが黄色で網掛けされます。
ただし、この分析ではハイパーパラメータの最適化までは行われていません。（この後に最適化を進めます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/0f6254aa-ea81-af8c-1986-b084ffc73de4.png)
尚、処理の概要は次のようになっています。

- 偏りなく、満遍なく学習データを教師データと検証データに分割し、入れ替えることを指す「交差検証（クロスバリデーション）」を実施
- デフォルトでは、教師データと検証データを7：3で分割し、Fold=10（データを10分割して、教師データと検証データを入れ替えている）として各種モデルの平均のスコアを表示している


###6-2.評価指標について
分類で使用される評価指標の概要と見方は次の通りです。（ここ重要です。）

####まずはじめに（混同行列について）

まずはじめに、分類の評価指標の数式で使用される４つの区分「**TP**、**FP**、**FN**、**TN**」について説明します。
分類結果（正しく分類した数／誤って分類した数）をまとめた表のことを「混同行列」といいます。（下表参照）
特に2値分類（0か1かの分類）のモデルの性能を測る指標として使用されます。

||Negative(=0)<br>と予測した（陰性）|Positive(=1)<br>と予測した（陽性）|
|:--|:--|:--|
|実際にNegative<br>であった（陰性）|**TN** (True Negative)<br>真陰性<br><br>正解が0の時に、<br>正しく0と予測した数|**FP** (False Positive)<br>偽陽性<br><br>正解が0の時に、<br>間違って1と予測した数|
|実際にPositive<br>であった（陽性）|**FN** (False Negative)<br>偽陰性<br><br>正解が1の時に、<br>間違って0と予測した数|**TP** (True Positive)<br>真陽性<br><br>正解が1の時に、<br>正しく1と予測した数|

####Accuracy
Accuracy(正解率)では、予測結果が実際に当たっていた割合を表します。
数式は下記の通りです。

```math
\begin{eqnarray}
Accuracy = \frac{TP+TN}{TP+FP+FN+TN}
\end{eqnarray}
```

$TP$ : (True Positive) 真陽性 正解が1の時に、正しく1と予測した数
$FN$ : (False Negative) 偽陰性 正解が1の時に、間違って0と予測した数
$FP$ : (False Positive) 偽陽性 正解が0の時に、間違って1と予測した数
$TN$ : (True Negative) 真陰性 正解が0の時に、正しく0と予測した数

|項目|概要|
|:---|:---|
|判断基準|1に近いほど良い値　|
|解釈|予測結果が実際に当たっていた割合|
|特徴|例えば、元データの95％がスパムである場合、単純に全てのメールをスパムと判断するモデルを作れば、正解率は95％となってしまうため、単純に正解率だけではモデルの性能を評価できない|

####AUC
AUC(Area Under the Curve)は、陽性/陰性の閾値を変えながらRecallとSpecificityをプロットした曲線（ROC曲線(Receiver Operating Characteristic)）の下の面積を表します。
イメージは下図の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/5fc6473a-d3f3-f719-a9ab-eaf2bd6243f3.png)
（出典：SIGNATE）

|項目|概要|
|:---|:---|
|判断基準|1に近いほど良い値　|
|解釈|AUC=0.5は、ランダムに判断したのと同じ（予測が役に立たない）<br>AUC=1.0が理想だが、現実的にはほぼありえない|
|特徴|他の指標と異なり、閾値を一意に特定せずに算出する|

####Recall
Recall(真陽性率、再現率)では、実際に陽性であるもののうち、正しく陽性であると予測できた割合を表します。
数式は下記の通りです。

```math
\begin{eqnarray}
Recall = \frac{TP}{TP+FN}
\end{eqnarray}
```

$TP$ : (True Positive) 真陽性 正解が1の時に、正しく1と予測した数
$FN$ : (False Negative) 偽陰性 正解が1の時に、間違って0と予測した数

|項目|概要|
|:---|:---|
|判断基準|1に近いほど良い値|
|解釈|実際に陽性であるもののうち、正しく陽性であると予測できた割合<br>予測の時点でどれだけ当てることができたかという指標|
|特徴|見落とし(FN)を限りなく0にしたい場合に重視する評価指標<br>**※Precisionとはトレードオフの関係**|

####Precision
Precision（適合率）では、陽性であると予測したもののうち、実際に陽性だった割合を表します。
数式は下記の通りです。

```math
\begin{eqnarray}
Precision = \frac{TP}{TP+FP}
\end{eqnarray}
```

$TP$ : (True Positive) 真陽性 正解が1の時に、正しく1と予測した数
$FP$ : (False Positive) 偽陽性 正解が0の時に、間違って1と予測した数

|項目|概要|
|:---|:---|
|判断基準|1に近いほど良い値|
|解釈|陽性であると予測したもののうち、実際に陽性だった割合<br>予測したものがどれだけ正しかったかという指標|
|特徴|誤判定(FP)を少なくしたい場合に重視する評価指標<br>**※Recallとはトレードオフの関係**|

####F1
F1(F1-score)では、PrecisionとRecallの両方を加味した評価を表します。
数式は下記の通りです。

```math
\begin{eqnarray}
F1 = \frac{2×(Precision×Recall)}{Precision+Recall}
\end{eqnarray}
```

$Precision$ : TP/(TP+FP)
$Recall$ : TP/(TP+FN)

|項目|概要|
|:---|:---|
|判断基準|1に近いほど良い値|
|解釈|F1が高いモデルは、PrecisionとRecallのバランスが取れた良いモデル|
|特徴|PrecisionとRecallの調和平均|


####Kappa
Kappa(カッパ係数)は、同じ対象に対して２つの評価間の一致度を表す場合に用いられる統計量を表します。
数式は下記の通りです。

```math
\begin{eqnarray}
Kappa = \frac{P_0 - P_C}{1 - P_C}
\end{eqnarray}
```

$P_0$ : 一致率
$P_C$ : 偶然の一致率

|項目|概要|
|:---|:---|
|判断基準|1に近いほど良い値|
|解釈|　　　<0：一致していない<br>0.00-0.20：わずかに一致<br>0.21-0.40：おおむね一致<br>0.41-0.60：適度に一致<br>0.61-0.80：かなり一致<br>0.81-1.00：ほとんど一致|
|特徴|同じ対象に対して２つの評価間の一致度を表す場合に用いられる統計量<br>偶然一致することが期待される分を除いた残りがどれくらいの割合で一致したかを計算した値|

####MCC
MCC(Matthews Correlation Coefficient)（マシューズ相関係数）は、二値分類問題で少数クラスを正とする習慣ができていない場合に使用する評価指標です。
数式は下記の通りです。

```math
MCC = \frac{((TP×TN) – (FP×FN))}{\sqrt{((TP+FP)×(TP+FN)×(TN+FP)×(TN+FN))}}\
```
$TP$ : (True Positive) 真陽性 正解が1の時に、正しく1と予測した数
$FN$ : (False Negative) 偽陰性 正解が1の時に、間違って0と予測した数
$FP$ : (False Positive) 偽陽性 正解が0の時に、間違って1と予測した数
$TN$ : (True Negative) 真陰性 正解が0の時に、正しく0と予測した数

|項目|概要|
|:---|:---|
|判断基準|1に近いほど良い値|
|解釈|-1と+1の間の値を取る<br>予測と実測が完璧にマッチすると+1<br>予測と実測が完全に不一致であると-1<br>ランダムな予測と同等であると0|
|特徴|少数クラスを正とする習慣ができていない場合に使用する|

####評価指標をどう使い分けるか？
上記の通り様々な評価指標がありますが、ここではどれを使うべきなのかを説明します。
何を目標にするかによって、それに応じた評価指標を用いるようになります。
指針は次の通りといわれています。

>(1) 特定の閾値を設定せずに評価したい場合　⇒　**AUC**
>(2) 特定の閾値を設定して評価したい場合
>　　(a) 陽性・陰性の重要度が同じ場合　⇒　**Accuracy**
>　　(b) 陽性がより重要である場合
>　　　　(ⅰ) 以下の(ⅱ), (ⅲ)の両方に着目したい場合　⇒　**F1**
>　　　　(ⅱ) 陽性と予測されたうち、実際の陽性の割合が重要である場合　⇒　**Precision**
>　　　　(ⅲ) 実際の陽性のうち、陽性と予測される割合が重要である場合　⇒　**Recall**

尚、一般的には`Precisionだけ`や`Recallだけ`を重視してモデル構築することは無く、
その両方の調和平均である`F1`を重視することが専らです。


###6-3.モデルの種類

分類では、次のモデルが搭載されています。

|ID(引数)|モデル名|概要|
|:---|:---|:---|
| rf | Random Forest Classifier |  ・ランダムフォレスト分類器<br>・決定木の王道といわれている<br>・決定木をたくさん集めて並列に扱う手法（バギング） |
| lightgbm | Light Gradient Boosting |  ・ライトジービーエム<br>・xgboostの軽量版的なモデル<br>・精度の上げるためには特徴量の調整が必要 |
| xgboost | Extreme Gradient Boosting |  ・エックスジーブースト<br>・ブースティングという手法で決定木を直列に扱う<br>・精度が比較的高いが、学習に時間が掛かる |
| catboost | CatBoost Classifier |  ・キャットブースト分類器<br>・決定木ベースの勾配ブースティングに基づくモデル<br>・カテゴリカル変数（質的変数）の扱い方が上手い<br>・決定木のツリー構造を最適にして過学習を防ぐ<br>・XgboostやLightGBMよりも精度が高くなる可能性がある |
| et | Extra Trees Classifier |  ・エクストラツリー分類器<br>・Random Forestと同じようにランダムな木を複数用意してバギングする<br>・ブートストラップサンプリングはせずに訓練データ全てを用いる<br>・シンプルで高速に動き、分類精度もRandom Forestに匹敵する |
| gbc | Gradient Boosting Classifier |  ・勾配ブースティング分類器<br>・弱い予測モデル（決定木）のアンサンブル形式で生成したもの |
| dt | Decision Tree Classifier |  ・決定木分類器<br>・条件による分岐を「根」からたどることで、最も条件に合致する「葉」を検索するアルゴリズム<br>・決定木単体では弱い予測モデル |
| ada | Ada Boost Classifier |  ・アダブースト分類器<br>・勾配ブースティング系アルゴリズムの走り<br>・直前の弱識別器で誤ったサンプルに対する重みを大きくして学習を行う |
| knn | K Nearest Neighbour |  ・K近傍法分類器<br>・次元の呪いのため、高次元データには向かない<br>・トレーニングデータ数・特徴量が増えると予測が遅くなる |
| lr | Logistic Regression | ・ロジスティック回帰<br>・"回帰"という名称がつくが分類問題で使用される学習モデル<br>・確率やダミー変数について分析、予想したいときに用いる |
| lda | Linear Discriminant Analysis | ・LDA（線形判別分析）<br>・主成分分析よりも更に精度が高い学習モデル<br>・分類するクラスの分離が最適化するよう変量のサブ空間を決める方法 |
| ridge | Ridge Classifier |  ・リッジ回帰分類器<br>・過学習を抑える手法の一つ<br>・線形回帰に正則化項(ペナルティ項)としてL2ノルムを導入したモデル |
| svm | SVM – Linear Kernel |  ・サポートベクターマシン（SVM）の一種<br>・SVMの中では一番単純で計算速度がはやい<br>・認識性能が優れた学習モデルの一つ<br>・未学習データに対して高い識別性能を得るための工夫がある |
| nb | Naives Bayes | ・単純ベイズ<br>・文書データに対してよい結果を出すことで知られている<br>・データが与えられたときの全ての推定の確率を計算し、最も確率の高いものを推定結果として出力する |
| qda | Quadratic Discriminant Analysis | ・QDA（二次判別分析）<br>・LDAと比べて、クラスごとのデータの分布が異なる場合でも柔軟にクラス分類を行うことができる |
| rbfsvm | SVM – Radial Kernel |  ・サポートベクターマシン（SVM）の一種<br>・データに関する事前知識がない場合に用いられる汎用的なカーネル<br>・最も用いられるカーネルの１つ<br>・認識性能が優れた学習モデルの一つ<br>・未学習データに対して高い識別性能を得るための工夫がある |
| gpc | Gaussian Process Classifier |・ガウス過程分類器<br> ・平均値関数と共分散関数を既知とし与えられたデータがそのガウス過程に従っていると仮定すると未知の観測値の平均と分散がわかる |
| mlp | Multi Level Perceptron |  ・多層パーセプトロン（MLP）<br>・複数の形式ニューロンが多層に接続されたネットワーク<br>・現在の機械学習の基盤となっている |



※上表のIDは次項で記載の`create_model`の引数として使用します。

# ７．ハイパーパラメータの最適化
###7-1.モデルの作成

次に、モデルを作成します。
今回は、決定木系の王道といわれる「Random Forest（ランダムフォレスト）」のモデルを作成します。

```python
# Random Forestのモデルを作成
rf = create_model('rf')
```

尚、`create_model`の引数は、windowsの場合は引数を記入する箇所で「Shift+Tab」のショートカットキーを使うとツールチップが表示されますので、コチラの内容を指定します。（上記、6-3.モデルの種類のID(引数)のことです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/f7300cae-8133-ad08-7bca-b4f036f7bcd5.png)
これを実行すると次のように初期設定である交差検証「10回」にて、検証が行われています。
Mean（平均値）、SD（標準偏差）も同時に表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/8f59d211-e6c8-5cf6-cc84-02f701acc800.png)


###7-2.ハイパーパラメータの最適化
次に、ハイパーパラメータの最適化を行います。

```python
# Random Forestのモデルを最適化
tuned_rf = tune_model(rf, n_iter = 500, optimize = 'Accuracy')
```

※tune_modelコマンドの説明は下表の通りです。

| 項目 | 説明 | 備考 |
|:----|:----|:----:|
| 第一引数 | モデルの名称 | 必須 |
| 第二引数 | ランダムグリッドサーチの回数 | 任意 |
| 第三引数 | 最適化の対象 ※デフォルトは「Accuracy」 | 任意 |

これを実行した結果（最適化後）と実行前を比較すると、最適化対象とした評価指標が増加し最適化が行われたことが確認できます。※PyCaretの最適化はランダムグリッドサーチが採用されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/8f59d211-e6c8-5cf6-cc84-02f701acc800.png)

# ８．モデルの精度の可視化
次に解析した結果を可視化します。

```python
# 解析結果の確認
evaluate_model(tuned_rf)
```

これを実行すると、解析結果を選択できるタブが表示されます。
分類でプロットされるモデルの概要と見方はそれぞれ次の通りです。（ここ重要です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/4e88159c-d964-8975-9806-f9de9bc9dc43.png)


####Hyperparameters（ハイパーパラメータ）
こちらは、ハイパーパラメータを確認できるプロットです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/64874d07-712b-2ecf-46ce-0357dc84e90a.png)


####AUC（Area Under the Curve）
こちらは、AUC(Area Under the Curve)です。
陽性/陰性の閾値を変えながらRecallとSpecificityをプロットした曲線（ROC曲線(Receiver Operating Characteristic)）の下の面積を表します。イメージは下図の通りです。
尚、前述の評価指標では数値で確認ができますが、コチラでは視覚的に確認ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/5fc6473a-d3f3-f719-a9ab-eaf2bd6243f3.png)
（出典：SIGNATE）
AUC=0.5は、ランダムに判断したのと同じ（予測が役に立たない）<br>AUC=1.0が理想だが、現実的にはほぼありえません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/2e59540b-adf4-7831-6ee3-5ffec96327b4.png)

####Confusion Matrix（混同行列）
こちらは、混同行列です。
分類結果（正しく分類した数／誤って分類した数）をまとめた表です。（下表参照）
特に2値分類（0か1かの分類）のモデルの性能を測る指標として使用されます。
尚、前述の評価指標ではこの混同行列の４つの区分を用いて算出した
各評価指標は数値で確認ができますが、コチラでは混同行列そのものを視覚的に確認ができます。

||Negative(=0)<br>と予測した（陰性）|Positive(=1)<br>と予測した（陽性）|
|:--|:--|:--|
|実際にNegative<br>であった（陰性）|**TN** (True Negative)<br>真陰性<br><br>正解が0の時に、<br>正しく0と予測した数|**FP** (False Positive)<br>偽陽性<br><br>正解が0の時に、<br>間違って1と予測した数|
|実際にPositive<br>であった（陽性）|**FN** (False Negative)<br>偽陰性<br><br>正解が1の時に、<br>間違って0と予測した数|**TP** (True Positive)<br>真陽性<br><br>正解が1の時に、<br>正しく1と予測した数|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/c4718306-72a2-6224-0c89-3d9de21528a6.png)
※デフォルトでは、交差検証（クロスバリデーション）時に学習データを
　教師データと検証データに7：3で分割しています。
　そのため、この混同行列では、検証データの3割分の分類結果がまとめられています。
　今回のケースでは、次の通りです。

|種類|レコード数|
|:--|:--|
|学習データ|14,249|
|教師データ（7割）|9,974|
|**検証データ（3割）**|**4,275**|

####Threshold（識別しきい値）
こちらは、適合率(Precision)、再現率(Recall)、F1、およびキュー率を視覚化したプロットです。
求められる予測特性に対して、しきい値をどの程度に設定すればいいかの検討に利用できます。
最適なF1は、垂直の破線としてプロットに表示されます。この場合「0.46」となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/b6fbbb14-cf06-5137-2255-a1da3268fdc1.png)

####Precision Recall（適合率・再現率曲線）
こちらは、横軸の再現率(Recall)に対して縦軸にプロットされた適合率(Precision)を確認できます。
塗りつぶされた領域が大きいほど、分類子は強力になります。赤い線は平均適合率を示しています。
適合率(Precision)と再現率(Recall)共に、どの程度のしきい値であれば予測特性を満たすかの検討に利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/a4c90004-d7b6-84f9-b799-69e966ae940d.png)

####Prediction Error（クラス予測エラー）
こちらは、実際のクラス毎に、Positive(1)またはNegative(0)のどちらに予測をしたかを積み上げ棒グラフで表したものです。
モデルがどのクラスで問題を抱えているか、さらに重要なのは、クラスごとにどのような不正解を与えているかを可視化することができます。
これにより、異なるモデルの長所と短所、およびデータセットに特有の課題をよりよく理解することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/dea2e05c-4f92-63c9-185c-65564515f8c8.png)

####Class Report（分類レポート）
こちらは、モデルの適合率(Precision)、再現率(Recall)、F1、およびサポートスコアを表示します。
二段に分かれているのは、正例を1、負例を0とした場合の指標が上段で、正例を0、負例を1とした場合の指標が下段です。
尚、サポートスコアは、指定されたデータセット内のクラスの実際の出現数です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/27ae642a-f68e-bc98-7d63-c031434f825c.png)

####Feature Selection（特徴量選択）
こちらは特徴量選択です。
特徴量(説明変数)の選択数に応じて予測スコアを折れ線グラフとして表示するものになっています。グラフの横軸が特徴量の数で、縦軸が予測精度を表し、予測精度が最大の特徴量数のところに縦に点線が引かれます。
今回の場合、特徴量の個数が17個のときに最大スコア「0.989」になったことがわかります。
特徴量選択の特徴量の選択優先順位は後述するFeature Importance（特徴量の重要度）の順位が高いもの（モデルの予測精度に大きく寄与している説明変数）から選択されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/64a0c332-269a-dbcf-87a8-1d39984daad4.png)


####Learning Curve（学習曲線）
こちらは学習曲線です。
データ数に応じた予測精度を表示するグラフで、横軸にデータサイズ、縦軸に予測精度をプロットしています。
良いモデルの指標としてはデータが増えるごとにtraining scoreが減少し、cross validation scoreが増加することが望ましいといわれています。もし、cross validation scoreとtraining scoreの差が大きかった場合は、学習数が足りてない恐れがあるため、データ数を増やすことでモデルの精度の向上が図れるかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/e33da4d1-45df-ecc1-faa1-15641cf70d57.png)


####Manifold Learning（多様体学習）
こちらは多様体学習です。
高次元データ（説明変数が複数あるもの）を2次元に落としてプロットしたグラフです。この多様体学習では、t-SNE（ティースニ） (t-Distributed Stochastic Neighbor Embedding）（t分布型確率的近傍埋め込み法)が使用されています。t-SNEの主な目的は、高次元データの視覚化です。したがって、データが2次元または3次元に埋め込まれる場合に最適に機能します。
新しい特徴量を加える場合や高次元のデータセットを扱う場合には、最も有用な特徴量だけを残して残りを捨てて特徴量の数を減らす（次元削減）のは良い考えだと言われています。なぜなら次元削減をすることでモデルが単純になって解釈しやすくなるだけでなく、汎化性能が向上するからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/e3f83bcc-18d4-f53c-186c-b23e4f52efd5.png)


####Calibration Curve（検量線）
こちらは、二値分類のモデルが出力する確率（一般には正例である確率）を横軸に、実際の割合を縦軸にプロットしたものを表します。
モデルの出力する確率が実際のものと一致していれば、曲線は原点を通る傾き1の直線になるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/e1a5b10e-198c-0930-74c3-b1da8140e0c4.png)


####Validation Curve（検証曲線）
こちらは検証曲線です。先述の学習曲線に似ています。
ハイパーパラメーターの値を変えた時の予測精度を表示するグラフで、横軸にハイパーパラメータ、縦軸に予測精度をプロットしています。一つのハイパーパラメータがどれくらい寄与するか見たいときに使用します。適切なハイパーパラメータ（例：max_depth：木の深さ）の値はどこかを確認でき、訓練精度と検証精度の差が小さく、精度が高いものを選ぶようにします。（学習不足や過学習を確認することができます。）
尚、薄く塗りつぶされた範囲は、クロスバリデーション(交差検証)により求められた精度の最大値と最小値の範囲を表しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/2410e58f-9c00-088f-e333-04f844804047.png)


また、横軸のハイパーパラメータは使用する学習モデル（アルゴリズム）によって異なります。詳細は次の通りです。

|学習モデル|横軸|
|:---|:---|
|Decision Tree Classifier <br/> Random Forest Classifier <br/> Gradient Boosting Classifier <br/> Extra Trees Classifier <br/> Extreme Gradient Boosting <br/> Light Gradient Boosting  <br/> CatBoost Classifier | **max_depth** |
|Logistic Regression<br>SVM(Linear)<br>SVM(RBF) | **C** |
|Multi Level Perceptron <br/> Ridge Classifier | **alpha** |
|Ada Boost Classifier | **n_estimators** |
|K Nearest Neighbour| **n_neighbors** |
|Gaussian Process Classifier| **max_iter_predict** |
|Quadratic Discriminant Analysis|**reg_param**|
|Naives Bayes|**var_smoothing**|

####Dimensions（RadViz Visualizer）
こちらは、多変量データ可視化アルゴリズムです。
円周上に各特徴次元を一様に配置し、各特徴量を正規化して、中心から各円弧までの軸上に点をプロットします。このメカニズムにより、たくさんの次元を持つデータを円内に簡単に描画しすることができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/194630a1-e723-a42f-c7af-b12039696a74.png)


####Feature Importance（特徴量の重要度）
こちらは特徴量の重要度です。
目的変数に及ぼす影響が大きい順に上から特徴量が表示されています。（上位10位まで）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/255d504a-fd7c-66cb-ba32-9c6feb7a2c4a.png)


####Feature Importance(ALL)（特徴量の重要度(全ての特徴量)）
こちらは特徴量の重要度(全ての特徴量)です。
Feature Importance（特徴量の重要度）では、上位10位の特徴量が表示されていますが、ここでは解析に用いたデータの全ての特徴量を表示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/7e758d0e-46e5-ca42-306a-e33c438626ea.png)


####Decision Boundary（決定境界）
こちらは、クラスを分類する決定境界は表します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/66798a44-b796-207b-70c0-b2f14bed8bc6.png)


####Lift Chart（リフトチャート）
こちらは、予測モデルの精度をはかるために使われます。
揚力曲線とベースラインの間の領域が大きいほど、モデルは優れています。
詳しくは[コチラ](https://www.synergy-marketing.co.jp/blog/expected-to-scoring-in-data-mining "データマイニングによるスコアリングと予測")を参照ください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/869078c2-85b4-d20e-7a06-5832aa449226.png)


####Gain Chart（ゲインチャート）
こちらは、予測モデルの精度をはかるために使われます。
詳しくは[コチラ](https://www.synergy-marketing.co.jp/blog/expected-to-scoring-in-data-mining "データマイニングによるスコアリングと予測")を参照ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/d08875f3-9ade-26dd-7698-d0161f37f040.png)


####Decision Tree（決定木）
※「Random Forest（ランダムフォレスト）」では表示されないため、「Decision Tree（決定木）」の結果で解説
こちらは決定木です。
木構造を用いて分類や回帰を行う機械学習の手法の一つで、比較的単純なモデルですが、モデルをツリーで表現できるので、どの説明変数が目的変数にどのように効いているのかが視覚的に分かりやすいというメリットがあります。

▼全体
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/7d046f56-8e10-7d81-bcf0-e38ef3591f9a.png)

▼拡大図（ほぼ見えないですが・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/0f96f818-9117-7a76-9868-c2f54453f51f.png)




# ９．モデルの確定
次に、モデルを確定します。（当然ながら解析結果などを考慮したうえで）

```python
#モデルの確定
final_rf = finalize_model(tuned_rf)
print(final_rf)
```

実行すると次のような最適化されたハイパーパラメータを確認することができます。
これで、学習済みのモデルができあがりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/74f8541b-910a-2258-59ab-e4aafe042cb6.png)


# 10．予測の実行
学習済みモデルが出来上がったら、冒頭で分割したUnseen Data（`employee_data_unseen`）を、
今回作成した予測モデルに投入し、退職するか否かの予測を行わせてみます。

```python
#予測の実行
unseen_predictions = predict_model(final_rf, data = employee_data_unseen)
print(unseen_predictions)
```
これを実行すると次のように予測値が`Label`、予測確率が`Score`として追加されているのが分かります。
本来は未知のデータについて、目的変数である`left`は分からないのですが、
冒頭で分割したUnseen Dataを使用しているため`left`がデータに入っています。
未知なるデータの退職した否か`left`と予測モデルが予測した予測値である`Label`を比べると、
完全に一致していることがわかります。（上下5レコードずつ、10レコードのみの表示ですが）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/ba1dda44-d413-f11c-790c-053e60e72575.png)


# 11．予測結果をCSVでダウンロード
次に、予測した結果をCSVファイルでダウンロードしてみます。
実務では予測した結果を何らかに利用することになるかと思います。

```python
#CSVファイルでダウンロードする
unseen_predictions.to_csv('unseen_data_predicted_Label.csv')
```
これを実行すると、次のようにCSVファイルがダウンロードされます。（冒頭5レコードのみ表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921945/b8b464eb-dcf9-abad-a0ad-baafc6aa13c7.png)

# 12．まとめ
実際に私がPyCaretを使ってみてPyCaretを扱う上で大切になるだろうと思ったことは次の４点でした。

- 大前提として取扱うデータをよく理解すること
- モデルの種類とそれぞれのモデルの特徴を理解すること
- 評価指標の種類と見方を理解すること
- 解析結果（図）の種類と見方を理解すること

※使いこなしてきたらデータ型やハイパーパラメータの調整ができることが大切になるのだろうと思いました。

# 13．参考文献

- [PyCaret公式サイト](https://pycaret.org/ "PyCaret")
- [scikitlearn公式サイト（データセット）](https://scikit-learn.org/stable/datasets/index.html#boston-house-prices-dataset "scikitlearn")
- [RIGHTCODEブログ 機械学習の自動化を可能にする「PyCaret」の実力を把握してみる](https://rightcode.co.jp/blog/information-technology/machine-learning-automation-pycaret "rightcode")
- [Tableauから始めるデータサイエンス PyCaret を使って東京の中古マンション価格を予測してみよう！](http://lovedata.main.jp/2020/04/26/pycaret-tokyo-housing/ "lovedata")
- [PyCaretのsetup関数の引数について](https://qiita.com/Asagumo63/items/99357d4b472a9219040e#%E5%9B%9E%E5%B8%B0-regression-pycaret20 "qiita")
- [モデルの精度評価（分類問題）](http://tkdmah.hatenablog.com/entry/2014/02/22/193008 "tkdmah")
- [PyCaretでワインの品質を分類してみた](https://qiita.com/kotai2003/items/c8fa7e55230d0fa0cc8e "qiita")
- [Pythonでの従業員の解約の予測](https://ichi.pro/post/234140040049665 "ichi.pro")
- [Accuracy/Recall/Precisionってややこしくない??](https://qiita.com/K5K/items/5da52e99861483cae876 "qiita")
- [PyCaret 2.2 : チュートリアル : 分類 – 二値分類 (初級)](https://torch.classcat.com/2020/12/15/pycaret-2-2-tutorials-binary-classification-clf101/"torch.classcat")
- [Yellowbrick Classification Visualizers](https://www.scikit-yb.org/en/latest/api/classifier/index.html"www.scikit-yb")
- [データマイニングによるスコアリングと予測](https://www.synergy-marketing.co.jp/blog/expected-to-scoring-in-data-mining "データマイニングによるスコアリングと予測")


# 14．最後に
いかがでしたでしょうか？
とりあえずPyCaretを使えて、全体像を理解いただけていれば幸いです。
細かい内容は無いので、隔靴掻痒（痒い所に手が届かない）な点はご容赦ください。

PyCaretリリース前の時代を知らない私からすると便利なPyCaretにこれから頼ってしまいそうな予感です。（これで本当にいいのか？とも思いますが。）
この界隈の玄人の方からするとPyCaretは自動車でいうところのAT車のような感じで見られているのかな？とも思います。「MT車のシフトチェンジこそが、最大燃費を叩き出す！」みたいなイメージでしょうか？

とにもかくにも、初心者の私にとっては、データサイエンスの取っ掛かりとしてPyCaretは最高のライブラリだと感じました。最後までお付き合いいただきましてありがとうございました。