PyCaretでをボストン不動産価格を予測してみた

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

今回は、回帰問題のボストン不動産問題をPyCaretでかけてみます。

**前回の記事：
[1. PyCaretでワインの品質を分類してみた](https://qiita.com/kotai2003/items/c8fa7e55230d0fa0cc8e)  **
**[2. PyCaretでタイタニック生存予想をしてみた](https://qiita.com/kotai2003/items/a377f45ddee9829ed2c5)  **


#1. PyCaretのインストール

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

```
pip install pycaret
```

#2.データの取得

PyCaretはいくつのオープンソースデータセットをget_data()で提供しています。
提供しているデータセットの一覧は、下記のリンクで確認可能です。
https://pycaret.org/get-data/#datasets

今回はボストン不動産価格データセットを使います。

```Python
from pycaret.datasets import get_data
dataset = get_data('boston')
```

>結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/3ae946e5-cc67-490e-93ba-49c59a820b20.png)


Pandasのprofile_report()を使い、データの中身を見てみます。

```Python
import pandas_profiling
dataset.profile_report()
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/40bcac0b-d5f8-dcde-e9f0-f56679b5f4e4.png)

データの説明です。

ボストン不動産のデータサイズは、506行X14列です。
このデータには、説明変数の説明です。

1. crim:　町ごとの一人当たりの犯罪率
2. zn:　25,000平方フィートを超える区画に分けられた住宅地の割合。
3. indus:　町あたりの非小売業の割合(面積比）
4. chas: Charles River dummy variable (= 1 路が川と接している場合; 0 その他).
5. nox: 窒素酸化物濃度（1000万分の1）
6. rm: 住居あたりの部屋の平均数
7. age: 1940年より前に建てられた所有者が居住するユニットの割合。（データセットの調査年度が1978年）
8. dis: 5つのボストン雇用センターまでの距離の加重平均
9. rad: 環状高速道路へのアクセシビリティのインデックス
10. tax: 10,000ドルあたりの固定資産税率
11. ptratio: 町別の生徒-教師比率
12. black:　=1000（Bk-0.63）^ 2, ここでBkは、町の黒人の割合。
13. lstat: 人口の低いステータス（%）

14. medv(**目的変数**):所有者が居住する住宅の中央値（\ $ 1000s）


#3.データの前処理
sample()を利用し、データセット90％を学習データに、10％をテストデータに分けます。

```Python
data = dataset.sample(frac=0.9, 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))
```
結果 (10項目まで表記）
>Data for Modeling: (455, 14)
Unseen Data For Predictions: (51, 14)


setup()を利用して、データの前処理を行います。その時、目的変数を引数target=medvと指定します。

```Python
from pycaret.regression import *
exp_reg101 = setup(data = data, target = 'medv',session_id=12) 
```

結果 (10項目まで表記）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/6ee8ae39-900d-2ccd-fca5-03a336afc3a0.png)


#4.モデルの比較

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

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

https://pycaret.org/regression/

```Python
compare_models()
```

catBoost RegressorのRMSE=3.1399で、R^2=0.859でした。今回は、PyCaretの性能評価ということで、8位のLinear Regression(R^2=0.6739)で話を進めます。

結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/caaf9ac3-2aa5-f1b3-24ab-cb506481e0b6.png)


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

```Python
lr = create_model('lr')
```
R-2の平均が0.6739でした。(k-fold法、n_fold=10)
結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/05d2712d-bc62-f0c5-366a-c73284ec6544.png)


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

```Python
tuned_lr = tune_model('lr')
```

結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/2f44a0a2-8545-f57f-e576-10da79791682.png)


チューニング前のR^2の平均が0.6739、チューニング後の平均が0.6739と改善されませんでした。Linear Regressionの場合、tuned_model()は、あまり期待できないかもしれません。


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


```Python
plot_model(tuned_lr)
```
結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/04829346-5070-d05d-29cb-42f986a9fc66.png)


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

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

結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/cd023f9f-5ca2-f19b-5e2f-cdf752ea763d.png)



#9.予測

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

```Python
final_lr = finalize_model(tuned_lr)
unseen_predictions = predict_model(final_lr, data=data_unseen)
unseen_predictions.head()
```
Label列は、予測の結果を意味します。medv列は正解です。

結果 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/44bff6be-899a-75b7-d449-4675dcdfd317.png)


#10.まとめ

1. PyCaretで回帰問題を分析を行いました。

## 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.PyCaret Classification, https://pycaret.org/classification/
3. 最速でPyCaretを使ってみた, https://qiita.com/s_fukuzawa/items/5dd40a008dac76595eea
4.PyCaretでワインの品質を分類してみた。 https://qiita.com/kotai2003/items/c8fa7e55230d0fa0cc8e
5. PyCaretでタイタニック生存予想をしてみた。https://qiita.com/kotai2003/items/a377f45ddee9829ed2c5