PyCaret使ってみる

[MYJLabアドベントカレンダー](https://qiita.com/advent-calendar/2021/myjlab)15日目の記事です
昨日は@Kuroi_Ccの[VS Codeしか勝たん](https://qiita.com/Kuroi_Cc/items/7f4bc810538daf4d3c35)でした。
ブレークポイントや拡張機能について紹介してくれました😊

今日の記事はPyCaretについて書きたいと思います。

## PyCaretとは
PyCaretはオープンソースの機械学習ライブラリです。データの前処理やモデルの比較を自動で行ってくれます。自分でパラメータを設定することもできます。公式サイトは[ここ](https://pycaret.org/)から。

結論から言うとデータの前処理から予測結果までのコードはこんな感じです

```pycaret.ipynb
from pycaret.regression import *
from pycaret.datasets import get_data

traffic = get_data("traffic")
exp = setup(traffic, target='traffic_volume')
model = create_model(lgmb)
predict_model(model)

```


## 環境
* GoogleColaboratory


## やること
trafficデータを使ってtraffic_volumeの予測をしてみたいと思います


## インストール

以下のコードでインストールします

```pycaret.ipynb
!pip install pycaret
```

## PyCaretをインポート
```pycaret.ipynb
from pycaret.regression import *
```
回帰を行うのでregressionにしています。
分類の場合はclassification、クラスタリングの場合はclusteringとやるとできます。

2行目ではデータセットを取得しています。データセットは[PyCaret's Data Repository](https://pycaret.org/get-data/)から確認できます。


## データセットを取得
```pycaret.ipynb
from pycaret.datasets import get_data
traffic = get_data("traffic")
```

データの中身を見てみます
![dataset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935019/e708efe3-3dc1-629c-294f-7ff33001fe14.png)

カラム数は8個
降水量や天候、ラッシュの時間などがあります

* holiday
* temp
* rain_1h
* snow_1h
* clouds_all
* weather_main
* Rush Hour
* traffic_volume

## データの前処理
```pycaret.ipynb
exp = setup(traffic, target='traffic_volume')
```
前処理はsetupを使います。データセットと目的変数を設定します

* データはtraffic
* 目的変数はtraffic_volume
* データ分割はデフォルトで訓練データは0.7、テストデータ0.3になっています

他に設定できる値は以下です

```
data: pd.DataFrame, 
target: str, 
train_size: float=0.7, 
test_data: Optional[pd.DataFrame]=None, 
preprocess: bool=True, 
imputation_type: str='simple', 
iterative_imputation_iters: int=5, 
categorical_features: Optional[List[str]]=None, categorical_imputation: str='constant', categorical_iterative_imputer: Union[str, Any]='lightgbm',
ordinal_features: Optional[Dict[str, list]]=None, high_cardinality_features: Optional[List[str]]=None, high_cardinality_method: str='frequency', 
numeric_features: Optional[List[str]]=None, numeric_imputation: str='mean',
numeric_iterative_imputer: Union[str, Any]='lightgbm', 
date_features: Optional[List[str]]=None, 
ignore_features: Optional[List[str]]=None, 
normalize: bool=False, 
normalize_method: str='zscore', 
transformation: bool=False, 
transformation_method: str='yeo-johnson', handle_unknown_categorical: bool=True, unknown_categorical_method: str='least_frequent', 
pca: bool=False, 
pca_method: str='linear', 
pca_components: Optional[float]=None, 
ignore_low_variance: bool=False, 
combine_rare_levels: bool=False, 
rare_level_threshold: float=0.1, 
bin_numeric_features: Optional[List[str]]=None, remove_outliers: bool=False, 
outliers_threshold: float=0.05, 
remove_multicollinearity: bool=False, multicollinearity_threshold: float=0.9, remove_perfect_collinearity: bool=True, 
create_clusters: bool=False, 
cluster_iter: int=20, 
polynomial_features: bool=False, 
polynomial_degree: int=2, 
trigonometry_features: bool=False, 
polynomial_threshold: float=0.1, 
group_features: Optional[List[str]]=None, 
group_names: Optional[List[str]]=None, 
feature_selection: bool=False, 
feature_selection_threshold: float=0.8, feature_selection_method: str='classic', feature_interaction: bool=False, 
feature_ratio: bool=False, 
interaction_threshold: float=0.01, 
transform_target: bool=False, 
transform_target_method: str='box-cox', 
data_split_shuffle: bool=True, 
data_split_stratify: Union[bool, 
List[str]]=False, 
fold_strategy: Union[str, Any]='kfold', 
fold: int=10, 
fold_shuffle: bool=False, 
fold_groups: Optional[Union[str, pd.DataFrame]]=None, n_jobs: Optional[int]=-1, 
use_gpu: bool=False, 
custom_pipeline: Union[Any, Tuple[str, Any], List[Any], ListTuple[str, Any]]]=None, 
html: bool=True, 
session_id: Optional[int]=None, 
log_experiment: bool=False, 
experiment_name: Optional[str]=None, 
log_plots: Union[bool, list]=False, 
log_profile: bool=False, 
log_data: bool=False, 
silent: bool=False, 
verbose: bool=True, 
profile: bool=False, 
profile_kwargs: Dict[str, Any]=None
```

前処理の設定ができたら実行します。するとデータタイプの確認画面が表示されるので、確認をしてEnterキーを押します
![setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935019/f5836b06-89f2-56a4-7e5b-a64ecc6b1487.png)


## モデル
公式のチュートリアルにモデルの比較というものがありました
```pycaret.ipynb
compare_model()
```
上記を実行することで各モデルの性能の評価をしてくれます。各モデルの平均絶対誤差、平均絶対誤差などを比較することができます。
![compare_model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935019/b9a977af-0f21-b584-a614-5137f81f0ec8.png)

そして一番R2が高かったモデルのパラメータも出力してくれます
![lgmb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935019/2309a51f-aa75-5e19-acec-9859d4102dd0.png)

## モデルの設定

```pycaret.ipynb
model = create_model(lgmb)
```

crate_modelを使って使うモデルを設定します。今回はLGBMRegressorを使うので引数にlgmbを書きます。
実行すると自動でクロスバリデーションをしてくれます。

## 予測結果
予測をしてみます。predict_modelを使って、上記で設定したモデルを設定します。

```pycaret.ipynb
predict_model(model)
```
実行すると表が出力されます。この表の一番右に行くと予測結果のカラムがあります。
![predict.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935019/dfdf14eb-ec08-c304-e28c-fb4313dd8091.png)

ここまで前処理から予測までやってみました

## まとめ
今回はPyCaretについてでした。気になった方は[チュートリアル](https://pycaret.readthedocs.io/en/latest/tutorials.html)やってみてください。

## 参考文献

* [Regression Tutorial (REG101) - Level Beginner](https://github.com/pycaret/pycaret/blob/master/tutorials/Regression%20Tutorial%20Level%20Beginner%20-%20REG101.ipynb)