PyCaretとGoogle Colaboratoryによる機械学習超入門

## 概要

[「Qiita夏祭り」](https://qiita.com/summer-festival)、[「機械学習を使って、データから予測モデルを作って使おう！」](https://qiita.com/official-events/ff7f07f95b9ed2407d1f)の記事です。

👇コチラも読んでください！
[DataRobotによるAutoML超入門](https://qiita.com/daikikatsuragawa/items/d05bfd4f4abcc2ccc4bd)

本記事は機械学習超入門として、[PyCaret](https://pycaret.org/)と[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)を使って、比較的少ない準備、コード量で機械学習を試す方法について紹介します。

今日、[自動機械学習（AutoML）](https://docs.microsoft.com/ja-jp/azure/machine-learning/concept-automated-ml)が開発されています。これにより、機械学習はコーディングや機械学習のスキルはなくても様々な人が今よりも低いハードルで利用できる技術になりつつあるかと思います。それゆえ、機械学習とはどんなものなのか、まずは簡単に触ってみたいという人も増えるかと思い、本記事を執筆しました。

※本記事を読みながら試してくださった方々へ。本記事はローコンテクストであるほど良いと思っています。わかりにくい表記や追記すべき内容などありましたら気兼ねなく編集リクエストや、コメントをしてくださると幸いです。🙇‍♂️

### 対象読者

とにかく機械学習を試してみたいと思っている以下のような方々を対象としています。

- 機械学習はなんとなく理解した
- とにかく使ってみたいが環境構築や例外でつまづきたくはない
- 細かいテクニックや応用については後回しでいい
- まずは予測モデルを生成して結果を出してみたい

### PyCaret

機械学習において必要になるであろう、データの前処理、予測モデルの生成、評価などをたった数行のコードで実現させることができるPython言語のライブラリです。 分類、回帰、クラスタリング、異常検出、自然言語処理、アソシエーションルールマイニングを扱うことが可能です。コーディングのハードルが低く、プログラミングが苦手、未経験な方でも簡単に実践的な機械学習を試すことができます。このような点でAutoMLである[DataRobot](https://www.datarobot.com/jp/)との類似点も多いです。DataRobotなどAutoML導入の検討のためにも利用してみてはいかがでしょうか。

しかし、利用しているPythonのバージョンなど環境によって、環境構築、導入についてつまずくこともちらほらあるかと思います。実際、自分もローカルの環境で試そうとしてつまずくことがありました。それゆえ、Google Colaboratoryでつまずく事なく試す方法を紹介します。

## PyCaretとGoogle Colaboratoryによる機械学習

### 0. 前提

今回は、[Kaggle](https://www.kaggle.com/)で公開されているデータセットを用いて「タイタニックの生存者予測」を実施します。ラベル`Survived`に対して、正負の二値を分類します。

#### 必要なもの

- Googleアカウント
- データセットのダウンロード
  - [Titanic: Machine Learning from Disaster | Kaggle](https://www.kaggle.com/c/titanic/data)

### 1. 準備

#### データの保存

Kaggleより取得した、今回扱うデータである`train.csv`、`test.csv`をマイドライブ内に作成した`data`というフォルダ内に保存します。

#### PyCaretのインストール

適当なノートブックを用意します。はじめに、PyCaretをインストールします。

```sh

! pip install pycaret
```

#### Google Driveのマウント

Google Driveをマウントします。これにより、ノートブックからGoogle Drive内のファイルの操作が可能となります。

```py

from google.colab import drive
from google.colab import files
drive.mount("/content/drive")
```

実行後、出現するURLにアクセスし、`authorization code`を取得してください。そして、`Enter your authorization code:`以下の入力欄にペーストしてエンターを押下してください。これによりマウントが完了します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/8d35a099-6224-36a1-a3c0-69cd045d5e76.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/2dad4dff-3ed3-32e3-4eda-72c881768797.png)

`Mounted at /content/drive`と出力されていたらOK。

例えば、マイドライブ内の`hoge.csv`というファイルを選択したい場合のパスは`drive/My Drive/hoge.csv`となります。

今回扱うデータである`train.csv`、`test.csv`をマイドライブ内に設けた`Colab Notebooks`内の`data`というフォルダ内に保存しました。この時、それぞれのパスは、`drive/My Drive/Colab Notebooks/data/train.csv`、`drive/My Drive/Colab Notebooks/data/test.csv`となります。

### 2. データの読み込み・確認

まずはー型式でトレーニングデータを読み込みます。中身を確認したところ、予測を試みる正解データの名前は`Survived`であることがわかります。

```py

import pandas as pd
train_data = pd.read_csv("drive/My Drive/Colab Notebooks/data/train.csv")
train_data.head()
```
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/ab5e0f77-0639-cfac-4fc8-e24ee5753500.png)

### 3. 前処理

`setup()`を利用して、データの前処理を行います。今回は分類を行うため`pycaret.classification`をimportします。その時、目的変数を引数`target`で`Survived`と指定します。以下を実行し、質問に答えるだけで、少なくとも予測モデルの生成に必要な最低限の前処理が完了します。

```py

from pycaret.classification import *
exp_clf101 = setup(data = train_data, target = "Survived", session_id = 123)
```

データ型の解釈が表示されます。問題ない場合はエンターを押下すると実行が進みます。問題ある場合は、引数による明示的な設定が必要です。入力欄にquitと入力して実行を止めてください。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/f8d60fc8-056f-07fd-786e-1cd5ec7cbc5c.png)

前処理の結果の詳細が表示されます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/c98f1666-49b4-b447-8e58-dc1a7fa6ef9d.png)

（今回は省略していますが、項目は41までありました。）

### 4. 予測モデルの比較

`compare_models()`で、データセットを複数の予測モデルを用いて分析を行い、その結果を表として出力します。予測モデルの選択をするさい、役に立つ機能です。PyCaret version 1.0.0が提供する予測モデルは14種類です。下記のリンクで確認が可能です。

https://pycaret.org/classification/

```py

compare_models()
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/ee63088a-6e51-952f-12e0-5ec807198d60.png)

黄色のハイライトを受けている部分がその評価値における最も優れた予測モデルを差します。

### 5. 予測モデルの生成

`create_model()`により予測モデルを生成します。今回は、Kaggleなどでも利用される頻度の高い予測モデルである[LightGBM](https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf)を利用します。
利用したい予測モデルとその引数の文字列との対応は以下より確認してください。

https://pycaret.org/classification/

```py

model = create_model("lightgbm")
```
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/e05d9c63-2b12-ba14-64af-a9af33d97960.png)

### 6. 予測モデルの評価

`evaluate_model()`を使い、同時に複数の評価値の確認が可能です。本来、クロスバリデーションなどによりテストデータを分割する作業が必要ですが、PyCaretはそこも勝手にやってくれます。

```py

evaluate_model(model)
```

以下より、可視化したい評価値を選択できます。

AUCを選択した場合

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/716c3876-8cc7-e8de-0d48-1df3934f2062.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/09215182-b468-7b82-7230-42343f09367c.png)

Confusion Matrixを選択した場合

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/803076e6-32d6-7570-53da-705600bd9920.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/513a3814-b613-a671-3b29-02b4dc747a4c.png)

Precision Recallを選択した場合

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/2eba5765-e92d-afdc-0e49-4820bce55871.png)

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/381b6381-cab1-023e-a847-8c7cd6bf4457.png)


### 7. 予測

`finalize_model()`で予測モデルをFinalizeした後、`predict_model()`で予測します。 予測の時には、テストデータ（ここでは、`test.csv`)を使います。

```py

final_model = finalize_model(model)
data_unseen = pd.read_csv("drive/My Drive/Colab Notebooks/data/test.csv")
result = predict_model(final_model, data = data_unseen)
```

元の内容に対して、LabelとScoreという予測結果に関する列が追加されています。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408337/6d33fdb9-8ea8-6ff6-1e03-864cca97d12f.png)

Kaggleなどのコンペでは最終的に出力するファイルの形が決められていることがほとんどです。出力結果から`PassengerId`と予測値である`Label`を`Survived`に置換してcsvとして出力する例を以下に示します。

```py

result[["PassengerId", "Label"]].rename(columns={"Label": "Survived"}).to_csv("drive/My Drive/Colab Notebooks/data/submit.csv", index=False)
```

## まとめ

タイタニック生存予測のデータセットを利用し、PyCaretとGoogle Colaboratoryによる機械学習超入門を紹介しました。機械学習へのハードルを低く感じていただけたら幸いです。

（2020年07月01日追記）
以下の記事に掲載していただきました！ありがとうございます！

- [Python記事まとめ(毎日自動更新)](https://qiita.com/kamata1729/items/eaf1d7b945b3a61a4fdd#_reference-97ff1ee77fa09c6c18a8)（2020年07月01日 00時00分更新 ）


## おまけ

### a.前処理時にカテゴリ変数と量的変数を明示的に指定する方法

```py

cat_features = ["Pclass","Name", "Sex", "SibSp", "Parch", "Ticket", "Cabin", "Embarked"]
num_features = ["Age", "Fare"]

from pycaret.classification import *
exp_titanic = setup(data = train_df, target = "is_canceled", session_id = 123, categorical_features=cat_features, numeric_features = num_features)
```

### b. 予測モデルをチューニングする方法

```py

tuned_model = tune_model("lightgbm")
```

### c. アンサンブルをする方法

決定木をバギング

```py

dt = create_model("dt")
dt_bagged = ensemble_model(dt, method = "Bagging")
```

決定木をブースティング

```py

dt = create_model("dt")
dt_boosted = ensemble_model(dt, method = "Boosting")
```

### d. ブレンドをする方法

３つの予測モデルをブレンドさせた予測モデル`blender`を生成

```py

model1 = create_model("lightgbm")
model2 = create_model("rf")
model3 = create_model("xgboost")

blender = blend_models([model1, model2, model3])
```

全ての予測モデルをブレンドさせた予測モデル`blend_all`を生成

```py

blend_all = blend_models()
```

### e. スタッキングをする方法

```py

model1 = create_model("lightgbm")
model2 = create_model("rf")
model3 = create_model("xgboost")

stacker = stack_models(estimator_list = [model2, model3], meta_model = model1)
```