PyCaretでワインの品質を分類してみた

#はじめに
先日、リリースされた機械学習ライブラリーPyCaretを使ってみました。
データの特徴量分析や複数のモデルとの性能比較作業が自動化され、これまでのデータサイエンティストの作業時間がだいぶ減ると思います。


#1. PyCaretのインストール

下記のコードを実行しインストールします。
Anacondaを使っていますが、PyCaret専用の仮想環境を立ち上げてインストールしました。
既存のCondaで管理されてる仮想環境では、エラーが発生する場合があります。(恐らくpipとcondaとの衝突が原因）

```
pip install pycaret
```

#2.データの取得

今回はWine Qualityデータセットを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/9661dd69-96fa-6211-90f4-36e0ddb95d52.png)

データセットには、説明変数として11項目、ワインの品質を表す目的変数（Quality)1項目で整理されています。

**説明変数**
1 - fixed acidity　(固定酸度)
2 - volatile acidity (揮発性酸性)
3 - citric acid (クエン酸)
4 - residual sugar (残糖)
5 - chlorides (塩化物)
6 - free sulfur dioxide (遊離二酸化硫黄)
7 - total sulfur dioxide (総二酸化硫黄)
8 - density (密度)
9 - pH 
10 - sulphates (硫酸塩)
11 - alcohol (アルコール)

**目的変数**
12 - quality (品質)(score between 0 and 10)


データセットは、下記のサイトでダウンロード可能です。
http://archive.ics.uci.edu/ml/datasets/Wine+Quality
http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv



```Python
from pycaret.datasets
import pandas as pd
dataset = pd.read_csv('winequality-white.csv',sep=";",encoding="utf-8")
dataset.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/1fc52128-6f0b-e32d-ca00-c37c5ef45667.png)

そして、95％を訓練データ、5%をテストデータ(Unseen Dataと呼ぶ)に分けます。

```Python
data = dataset.sample(frac =0.95, random_state = 786).reset_index(drop=True)
data_unseen = dataset.drop(data.index).reset_index(drop=True)
print('Data for Modeling: ' + str(data.shape))
print('Unseen Data For Predictions: ' + str(data_unseen.shape))
```

結果
>
Data for Modeling: (4653, 12)
Unseen Data For Predictions: (245, 12)


#3.データの前処理
setup()を利用して、データの前処理を行います。その時、目的変数を引数でqualityと指定します。

```Python
from pycaret.classification import *
exp_clf101 = setup(data = data, target = 'quality', session_id=123) 
```

結果 (10項目まで表記）
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/4308fe5e-00c6-fb0f-77b3-3d09686e1562.png)


#4.モデルの比較

compare_models()で、データセットを複数の分類モデルを用いて分析を行い、その結果を表にまとめます。どの分類モデルを使うか検討の時、かなり役に立つ機能です。

Pycaretが提供する分類モデルは10種類以上で、下記のリンクで確認が可能です。

https://pycaret.org/classification/

```Python
compare_models()
```

Extra Trees Classifierを使うと、Accuracy 65.95%でした。例えば、こういう機能を使わず、最初からSVMだけで分析をした場合、Accuracyは32.03%です。 [ワインの品質データ、SVM分析事例](https://ymgsapo.com/2019/01/06/ai-wine-quality/)

結果 
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/2b30b2e3-eb2c-76ef-0505-90343f6738d8.png)


#5.分析モデルの生成
分類モデルを選択して、モデリングを行います。create_model()を使います。
今回は、Light Gradient Boosting Machineモデルを利用します。

```Python
lightgbm = create_model('lightgbm')
```

結果 
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/967b234f-5463-b0ef-b63a-fb04bf15ad5a.png)


#6.分析モデルのチューニング
tune_modelを用いて、モデルのチューニングも行います。

```Python
tuned_lightgbm = tune_model('lightgbm')
```

結果 

チューニング前のAccuracyの平均が0.6393、チューニング後のAccuracyの平均が0.6414と改善されました。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/ad2dfc99-194c-40fd-faf9-8b2feb122412.png)


#7.分析モデルの可視化
plot_modelを用いて、分析結果を可視化します。

まず、AUC曲線をプロットします。

```Python
plot_model(tuned_lightgbm, plot = 'auc')
```
結果 
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/511e8d74-ebd0-4acb-3508-734a76330328.png)

次に、混同行列をプロットします。

```Python
plot_model(tuned_lightgbm, plot = 'confusion_matrix')
```
結果 
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/c5effe01-f1d6-6c10-4711-1f8d81a9fe34.png)


#8.分析モデルの評価
evaluate_model()を使い、複数の評価を同時に行うことが可能です。

```Python
evaluate_model(tuned_lightgbm)
```
黄色い枠の中のボタンを押すと、各々の評価結果が表示されます。

結果 
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/72819ba0-5925-ae39-08ab-cc888135a651.png)

#9.予測

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

```Python
final_lightgbm = finalize_model(tuned_lightgbm)
unseen_predictions = predict_model(final_lightgbm, data=data_unseen)
unseen_predictions.head()
```
最後のLabel列は、予測の結果を意味します。

結果 
>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/e6ec7897-0c93-8dbc-4bba-99120a08d89b.png)

#10.まとめ

1. ワイン品質のデータセットを利用し、PyCaretで分析を行いました。
2. 大変使いやすいです。商用分析ツールのAlteryx, DataRobotにも負けないほどの高い分析機能だと思います。
3. 次回は、PyCaretの回帰問題に取り組んでみたいと思います。

後続記事を書きました。宜しければ、こちらの記事も読んで頂ければと思います。
**[PyCaretでタイタニック生存予想をしてみた](https://qiita.com/kotai2003/items/a377f45ddee9829ed2c5)**

## 10.1  分析に使用したPycaret関数一覧
1. データの前処理：　setup()
2. モデルの比較：   compare_models()
3. 分析モデルの生成：   create_model()
4. チューニング：  tune_model()
5. 可視化：  plot_model()
6. 評価：  evaluate_model()
7. 予測：  finalize_model(), predict_model()


#11.参考資料

1.PyCaret Home Page , http://www.pycaret.org/
2.Wine Quality Dataset, http://archive.ics.uci.edu/ml/datasets/Wine+Quality
3.PyCaret Classification, https://pycaret.org/classification/
4. 最速でPyCaretを使ってみた, https://qiita.com/s_fukuzawa/items/5dd40a008dac76595eea
5.【Python】機械学習でワインの品質を判定する, https://ymgsapo.com/2019/01/06/ai-wine-quality/