「初手lightgbm」に代わる「初手PyCaret」

#1. 「初手lightgbm」とPyCaret
データ分析を行う上で、少し前まで「初手lightgbm」なる言葉があったと思いますが、これは大量のデータを扱ったとしても、比較的に早くモデルを作成でき、データのインサイトを素早く確認できるからであったからだと思います。しかしながら、機械学習の進化は早く、AutoMLを使用すると、モデル間での精度の比較などを簡単に行えるようになり、これらを使いこなすことがデータ分析の時間の節約に大きくつながると考えられるため、自分のまとめのためにも、PyCaretの使い方を簡単に纏ます。また実際KaggleにSubmissionを行い、モデルの精度を見たいと思います。

#2. 使用するデータ「Titanic」
今回使用するデータはKaggle初心者向けのデータであるTitanicです。Titanicのデータはデータ量が小さいという欠点がありますが、以下のようなインサイトがありました。

1. 女性は生き残りやすい（男性は死亡しやすい）
2. 子供のほうが生き残りやすい
3. １，２等級の方が生き残りやすい（高クラスの部屋に泊まっている人が生き残りやすい）

PyCaretを使用してこれらを確認する方法を順に追っていきます。

#3. PyCaretを使用したモデル作成方法
###3.1. 特徴量の設定とモデルの作成
TitanicのTrainとTestのデータをKaggleから取得し、事前にTrain、Testとして読み込んでおきます。
今回は、分類問題であるためpycaret.classificationを使用します。ターゲット変数は「Survived」であり、
特徴量として使用したいもの（したくないもの）をcategorical_features、numeric_features、ignore_featuresに設定していきます。こちらでcatboost、lightgbmなどを複数のモデル含む作成が完了です。

```python:python
from pycaret.classification import *
exp = setup(train, target = 'Survived',categorical_features=["Pclass","Sex","Embarked"], 
        numeric_features=["Age","SibSp","Parch","Fare"],ignore_features=["PassengerId","Name","Ticket","Cabin"])
```

###3.2​. 各モデルの精度の比較
3.1でモデルの作成を終えたので、次に精度の比較に移ります。
精度の比較は次の1行で行うことが出来ます。

```python:python
compare_models()
```
以下が比較表ですが、今回の場合は「Accuracy」で精度を比較すると、GradientBoostClassifierが、一番良かったようです。
今回、モデルの精度として「Accuracy」を選んだ理由は、KaggleのTitanicは「Accuracy」で評価がされているからです。

![1compare_models.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541839/7a9ab104-88b1-ca8c-8580-26b157f6ee82.jpeg)

###3.3.　ハイパーパラメーターのチューニング 
以前は、ハイパーパラメータのチューニングのためにグリッドサーチを行い大変な思いをしていましたが、PyCaretでは
モデルをクリエイトして、tune_modelという関数で簡単にチューニングも行うことが可能です。またハイパーパラメータの詳細も以下のように、簡単に確認ができます。

```python:python
gbc = create_model('gbc')
tuned_gbc = tune_model(gbc, n_iter = 20, optimize = 'Accuracy')
print(tuned_gbc)
```
![2gbc_hyperparameter.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541839/1172e523-72d6-f7ad-c83f-330db2c7f8fb.jpeg)

###3.4.　モデルの解釈
モデルの解釈についても、PyCaretは様々な機能が1行でできるため、大きな時間の節約になります。
いくつかどのように解釈をするか簡単に纏めます。

```python:python
evaluate_model(tuned_gbc)
```
1.ConfusionMatrix
ConfusionMatrixは、モデルによる予想と、実際の値がどうであったかを表わした表です。以下の表では、縦が実際の値(1:生存、0:死亡)を表しており、横軸がモデルによって予想されたものになります。つまり、1.モデルが死亡を予想し、実際に死亡したケース数が157コ（左上）、2.モデルが生存を予想し、実際死亡だったケース数は6コ（右上）、3.モデルが死亡を予想し実際生存であったケース数が37コ（左下）、4.モデルが生存を予想し実際生存であったケース数が68コ（右下）、と解釈できます。1～4.の全ケースを足すと268コになり、モデルの予想と実際のケースがあっていた1.と4.のケースの合計が225コであるため、Accuracyは0.84（=225÷268）となります。また、このモデルでは、3.モデルが死亡を予想し実際生存であったケース数での間違いが多いこともわかります。

![3ConfusionMatrix.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541839/64368ace-4324-d36e-88ba-cfe6e24456ff.jpeg)

2.Learning Curve
PyCaretでは、モデルを作成するときに10Fold Crossvalidationを行います。Trainの全データの10%を使用してモデルを10Fold Crossvalidationで評価、全データの20%を使用してモデルを10Fold Crossvalidationで評価と、データ数を徐々に増やしていきながらモデルの精度を見ることにより、「モデルのバリアンスやバイアスが高いかどうか」、「データをさらに集めることがこの問題の解決に役立つかどうか」ということがわかります。以下の場合では、Trainのデータが560であっても、TrainingScoreとCrossValidationScoreの間に差があるため、データ数を増加させることにより、まだ精度が上がることが期待できると思われます。

![4LearningCurve.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541839/83dff327-e7a8-c2d0-36f5-17bb93aa9ab3.jpeg)

3.Feature Importance
Feature Importanceは、モデルに大きく影響を与えている特徴量を知るための一つの手段です。今回の目的の1つに、
データのインサイトを知るという目的がありました。Titanicのデータは、女性（Sex_female）、Age(年齢)、
Fare(料金)などが重要な特徴量として上げられており、データのインサイトについて調べやすくなっています。

![5FeatureImportance.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541839/a048e92f-36b9-e5cc-286a-530943a45879.jpeg)


#4. KaggleにSubmitしてみて結果を確認してみる
Kaggleにサブミットしたところ、スコアが0.77511であり、Public Leaderboardの結果は7781位（全体：51907）であり、トップ15%ほどの成績でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541839/a3892ac9-8640-6f79-16a1-9d6d01e9b4a4.png)

#5. BenderModelの作成
PyCaretでは複数モデルのブレンでイングも1行で簡単にできます。Blendについての詳細は[こちら](https://pycaret.org/blend-models/)からどうぞ。
ちなみに、モデルをブレンドして作成した結果をKaggleにサブミットしたところ、単体よりもわずかながらスコアが良くなりました。

```python:python
blender_specific = blend_models(estimator_list = compare_models(n_select = 2), method = 'auto')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541839/ed3a3d9c-2aee-3132-3bc6-0ba5fc6a88cc.png)


#5. 最後に
非常に大まかではありますが、PyCaretについて纏めてみました。そこまでプログラムを書く必要がなく、データのインサイト、モデルの精度等を、短時間に簡単に見ることが出来るため、今後積極的に使用していきたいと思いました。