たった数行で機械学習体験(後編)。PyCaretを詳しく解説。モデルの構築と評価の分析。

#unseen dataに関して
PyCaretを勉強していると、unseen dataをテストデータと勘違いしそうですが、unseen dataはテストデータではあるのですが詳しく説明すると、

トレーニングデータで予測モデルを作成
トレーニングデータにテストデータを組み合わせて最終予測モデルを作成
最後に、そのモデルにunseen dataを入力して、モデルの精度を確認

という流れになります。

#前回のおさらい

[たった数行で機械学習体験(前編)。PyCaretを詳しく解説。データセット準備から複数モデルの精度比較まで。](https://qiita.com/koichi_hiphopdream/items/d63bb89d0674599dfb41)の続きになります。
前回はデータセットの準備から、モデルの精度比較まで行いました。

#今回の目的
part2では、モデルの作成から、プロット、最終モデルの作成までを行います。

#訓練データを使ってモデルを作成

compare_models()の目的は、トレーニングされたモデルを作成する事ではなく、パフォーマンスの高いモデルを評価し、モデルの候補を選定する為にあります。今回は、ランダムフォレストを使ってモデルをトレーニングします。

```code.py
rf = create_model('rf')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/9921190a-ea7e-b075-35f6-dd62ff896b44.png)


tune_model()は、ハイパーパラメーターのランダムグリッドサーチです。デフォルトでは、精度を最適化するように設定されています。

```code.py
tuned_rf = tune_model('rf')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/fcf71f30-9cb2-0f8b-79cc-67967d09d7a4.png)

例えば、ランダムフォレストで、AUCの値を高くするモデルを作成したい場合は、以下のようなコードになります。

```code.py
tuned_rf_auc = tune_model('rf', optimize = 'AUC')
```

tuned_modelで作成したモデルの方が、1.45%精度が高くなったので、こちらを使っていきます。

#モデルの精度をプロット

AUC Plotを実行

```code.py
plot_model(tuned_rf, plot = 'auc')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/407c38c2-ea16-26c8-7274-6944544c1d2a.png)

Precision-Recall Curve

```code.py
plot_model(tuned_rf, plot = 'pr')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/98feafbe-a03c-d382-db9a-7ecdb0161330.png)

Feature Importance Plot

```code.py
plot_model(tuned_rf, plot='feature')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/6f288c5b-de68-fe86-0c34-bcc9f831ce6a.png)

```code.py
evaluate_model(tuned_rf)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/8bd03b13-bf42-1ab1-2c17-21ece74d8b54.png)



Confusion Matrix

```code.py
plot_model(tuned_rf, plot = 'confusion_matrix')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/f1e7d2e2-5a1f-71fb-a783-98f2f4d596ba.png)

#訓練データとテストデータを組み合わせて予測モデルの作成へ

最終的に予測モデルを完成させる前に、テストデータを使って、学習モデルが過剰適合していないか確認します。ここで、精度の差が大きくなってしまう場合は、検討が必要になりますが、今回は精度に大きな違いは無いので先に進みます。

```code.py
predict_model(tuned_rf);
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/db0ab67b-e783-1501-3f86-c16cab4e550f.png)

いよいよ最終版の予測モデルが完成します。
ここのモデルには、トレーニングデータとテストデータが組み合わさったモデルが完成されます。

```code.py
final_rf = finalize_model(tuned_rf)
print(final_rf)
```

>RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
                       criterion='gini', max_depth=10, max_features='auto',
                       max_leaf_nodes=None, max_samples=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=2, min_samples_split=10,
                       min_weight_fraction_leaf=0.0, n_estimators=70,
                       n_jobs=None, oob_score=False, random_state=123,
                       verbose=0, warm_start=False)


```code.py
predict_model(final_rf);
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/9f03475f-6ca1-6a55-d1f4-bb16fc1dbb7a.png)

精度やAUCのパフォーマンスが高くなっていますね。これはテストデータが組み合わさり、予測モデルの品質が向上したからです。

#unseen dataを用いてモデルの評価

では、最後にunseen data(1200のデータセット)を使って、予測モデルを評価します。

```code.py
unseen_predictions = predict_model(final_rf, data=data_unseen)
unseen_predictions.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267677/18c5b1fa-4bd1-ac40-723a-a79858e316fa.png)

データセットに、LabelとScoreが追加されています。
Labelは、モデルが予測したラベルになります。
Scoreは、予測の確率になります。

#モデルの保存

予測する新しいデータが増えた場合に、もう一度最初から実行するのは大変です。PyCaretには、save_modelが用意されており、モデルを保存しておく事ができます。

```code.py
save_model(final_rf,'Final RF Model')
```

>Transformation Pipeline and Model Succesfully Saved

#保存したモデルのロード

モデルのロードをするには、以下を実行します。

```code.py
saved_final_rf = load_model('Final RF Model')
```

>Transformation Pipeline and Model Sucessfully Loaded

先ほどのunseen dataを使います。結果は、先ほどと同じなので省略します。

```code.py
new_prediction = predict_model(saved_final_rf, data=data_unseen)
```

```code.py
new_prediction.head()
```

#さいごに
Level Beginnerチュートリアルの解説の実行をしてみました。
十数行で、ここまでできてしまうのはびっくりです。
機械学習をするハードルが、さらに低くなった気がします。

ご指摘等あれば、コメントいただければと思います。
読んでいただき、ありがとうございました。