AutoML（EvalML）を使ってみた

* 製造業出身のデータサイエンティストがお送りする記事
* 今回はAutoML ライブラリー（EvalML）を使ってみました。

##はじめに
過去に他のAutoML ライブラリーやツールについては、別の記事に纏めておりますので下記をご参照ください。

- [PyCaret](https://qiita.com/DS27/items/bc56163b2cc48403deb0)
- [TPOT](https://qiita.com/DS27/items/0311b56972da4bef94d5)
- [VARISTA](https://qiita.com/DS27/items/32349b03e99b3f580569)
- [AutoGluon](https://qiita.com/DS27/items/032e89fe421c74b5027b)
- [Auto-Sklearn](https://qiita.com/DS27/items/08f121929d1c6eb0fcf4)
- [AutoKeras](https://qiita.com/DS27/items/8efcfe8ed132da202cdc)
- [h2o](https://qiita.com/DS27/items/daf4aee39741cc531c27)
- [Lazypredict](https://qiita.com/DS27/items/6838c54013d5ca60afa1)
- [FLAML](https://qiita.com/DS27/items/3b7498c090e7e7297ee1)

##EvalML とは
EvalML とは、Alteryx が開発しているAutoML ライブラリです。

##EvalML を使ってみた

必要なライブラリーは下記です。

```
pip install evalml
```

今回もUCI Machine Learning Repositoryで公開されているボストン住宅の価格データを用いて実施します。

```php
# ライブラリーのインポート
import os

import pandas as pd
import numpy as np

import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline

# ボストンの住宅価格データ
from sklearn.datasets import load_boston

# 前処理
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# evalml
import evalml
from evalml import AutoMLSearch

# 評価指標
from sklearn.metrics import r2_score
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error

# データセットの読込み
boston = load_boston()

# 説明変数の格納
df = pd.DataFrame(boston.data, columns=boston.feature_names)
# 目的変数の追加
df["MEDV"] = boston.target

# データの中身を確認
df.head()
```

![スクリーンショット 2020-11-09 20.33.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/2ffa1a41-98dd-2798-1f6d-8f3385bf5f75.png)

次にデータセットを分割します（train, test）。

```php
# ランダムシード値
RANDOM_STATE = 10

# 学習データと評価データの割合
TEST_SIZE = 0.2

# 学習データと評価データを作成
x_train, x_test, y_train, y_test = train_test_split(
    df.iloc[:, 0 : df.shape[1] - 1],
    df.iloc[:, df.shape[1] - 1],
    test_size=TEST_SIZE,
    random_state=RANDOM_STATE,
)
```

次にモデルの学習を行います。

```php
automl = AutoMLSearch(
    X_train=x_train,
    y_train=y_train,
    problem_type="regression",
    objective="mae",
    additional_objectives=["R2", "mse"],
    max_time=120,
    random_seed=RANDOM_STATE,
    optimize_thresholds=True,
)
automl.search()
```

次に探索したモデルの一覧を確認します。

```php
automl.rankings
```

![スクリーンショット 2021-09-03 15.43.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/4801a472-d005-a749-c336-66b083f34b49.png)

モデルの詳細は、下記コードで確認できます。

```php
automl.describe_pipeline(automl.rankings.iloc[0]["id"])
```

![スクリーンショット 2021-09-03 15.44.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/e7225e77-8661-45bc-7cb3-46cae2a46e1e.png)


次に予測を行います。

```php
# 推論
y_pred = best_model.predict(x_test)

# 評価
def calculate_scores(true, pred):
    """全ての評価指標を計算する

    Parameters
    ----------
    true (np.array)       : 実測値
    pred (np.array)       : 予測値

    Returns
    -------
    scores (pd.DataFrame) : 各評価指標を纏めた結果

    """
    scores = {}
    scores = pd.DataFrame(
        {
            "R2": r2_score(true, pred),
            "MAE": mean_absolute_error(true, pred),
            "MSE": mean_squared_error(true, pred),
            "RMSE": np.sqrt(mean_squared_error(true, pred)),
        },
        index=["scores"],
    )
    return scores


scores = calculate_scores(y_test, y_pred)
print(scores)
```

出力結果は下記のようになります。

```
              R2       MAE        MSE      RMSE
scores  0.875305  2.599936  13.040664  3.611186
```

##さいごに
最後まで読んで頂き、ありがとうございました。
今回はEvalMLを使ってみました。

訂正要望がありましたら、ご連絡頂けますと幸いです。