AutoML（AutoKeras）を使ってみた

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

##はじめに
最近、AutoML 関係のライブラリーやツールが世の中に多く普及し始めているなと認識し、手探りで調べております。
過去に他の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 を使ってみた

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

```
pip install autokeras
```

tensorflow もバッググラウンドで使用するため、インストールされていない方はtensorflow も別途必要になります。

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

```php
import pandas as pd
import matplotlib.pyplot as plt
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

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

import tensorflow as tf
import autokeras as ak

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

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

# ランダムシード値
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,
)

df_train = pd.concat([x_train, y_train], axis=1)
df_test = pd.concat([x_test, y_test], axis=1)

feature_names = boston.feature_names
label_name = ["MEDV"]
```

下記でモデルを学習します。

```php
reg = ak.StructuredDataRegressor(
    overwrite=True,
    max_trials=10,  # It tries 10 different models.
    )

reg.fit(
    x=df_train[feature_names],
    y=df_train[label_name],
    validation_split=0.2,
    )
```

最適モデルは下記で出力できます。

```php
model = reg.export_model()
model.summary()
```
出力結果は下記のような感じです。

```
Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 13)]              0         
_________________________________________________________________
multi_category_encoding (Mul (None, 13)                0         
_________________________________________________________________
normalization (Normalization (None, 13)                27        
_________________________________________________________________
dense (Dense)                (None, 1024)              14336     
_________________________________________________________________
re_lu (ReLU)                 (None, 1024)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 32)                32800     
_________________________________________________________________
re_lu_1 (ReLU)               (None, 32)                0         
_________________________________________________________________
regression_head_1 (Dense)    (None, 1)                 33        
=================================================================
Total params: 47,196
Trainable params: 47,169
Non-trainable params: 27
_________________________________________________________________
```

tf.keras.Model なので、使い回しは比較的便利なのかなと思います。

次にテストデータに対して予測します。

```php
y_pred = reg.predict(x=df_test[feature_names])

# 評価
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.876561  2.873366  12.909305  3.592952
```

AutoKeras を使ってみた感想としては、実装は簡単でした。
ただ、学習は時間がかかりますね。パラメータで調整はできるので、必要に応じて調整するという感じでしょうか。

##さいごに
最後まで読んで頂き、ありがとうございました。

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