AutoML（h2o）を使ってみた

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

##はじめに
過去に他の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 を使ってみた

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

```
pip install h2o
```

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

```php
import h2o
from h2o.automl import H2OAutoML

import sys, os, os.path
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

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

h2o.init(
    nthreads=-1,     # number of threads when launching a new H2O server
    max_mem_size=12  # in gigabytes
)

# データセットの読込み
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,
)

train = pd.merge(x_train, y_train, left_index=True, right_index=True)
test = pd.merge(x_test, y_test, left_index=True, right_index=True)

h2o_train = h2o.H2OFrame(train)
h2o_test = h2o.H2OFrame(test)

# 説明変数/目的変数のカラムを指定
kw = h2o.H2OFrame(list(h2o_train.columns))

feature_cols = kw.columns[:-1]
target_cols = "MEDV"
```

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

```php
# max_runtime_secsは最大実行時間を指定
aml = H2OAutoML(
    max_runtime_secs=30,  # 30 sec
    max_models=None,  # no limit
    stopping_metric ='rmse',
    sort_metric ='rmse',
    seed = RANDOM_STATE,
    )

aml.train(
    y=target_cols,
    training_frame=h2o_train,
    )
```

次に構築したモデルを精度が良い順に並べ替えます。

```
lb = aml.leaderboard
lb.head(rows=lb.nrows)
```

下記のような感じで結果が得られます。

```
model_id	rmse	mean_residual_deviance	mse	mae	rmsle
XGBoost_grid__1_AutoML_20210626_013754_model_2	3.19587	10.2136	10.2136	2.20228	0.151833
StackedEnsemble_AllModels_AutoML_20210626_013754	3.20798	10.2912	10.2912	2.15506	0.147123
StackedEnsemble_BestOfFamily_AutoML_20210626_013754	3.21329	10.3252	10.3252	2.17433	0.150384
XGBoost_grid__1_AutoML_20210626_013754_model_1	3.34327	11.1775	11.1775	2.21535	0.157374
GBM_grid__1_AutoML_20210626_013754_model_2	3.36674	11.3349	11.3349	2.25457	0.158063
XGBoost_grid__1_AutoML_20210626_013754_model_4	3.40357	11.5843	11.5843	2.37371	0.166969
XGBoost_grid__1_AutoML_20210626_013754_model_6	3.42693	11.7438	11.7438	2.27779	0.148145
XGBoost_grid__1_AutoML_20210626_013754_model_5	3.469	12.034	12.034	2.42595	0.165229
XGBoost_3_AutoML_20210626_013754	3.48431	12.1404	12.1404	2.3979	0.166476
XGBoost_2_AutoML_20210626_013754	3.53963	12.529	12.529	2.37003	0.163193
XGBoost_grid__1_AutoML_20210626_013754_model_3	3.73328	13.9373	13.9373	2.45021	0.161169
GLM_1_AutoML_20210626_013754	4.71116	22.195	22.195	3.16006	0.238895
XRT_1_AutoML_20210626_013754	4.88533	23.8665	23.8665	3.1366	0.220186
DeepLearning_grid__1_AutoML_20210626_013754_model_1	4.90804	24.0888	24.0888	2.92665	0.234542
DeepLearning_grid__2_AutoML_20210626_013754_model_1	5.00784	25.0785	25.0785	3.1436	0.203084
DRF_1_AutoML_20210626_013754	5.09842	25.9939	25.9939	3.29748	0.221645
DeepLearning_grid__3_AutoML_20210626_013754_model_1	5.14636	26.4851	26.4851	3.20357	0.208465
GBM_1_AutoML_20210626_013754	5.35071	28.6301	28.6301	3.75348	0.251125
GBM_2_AutoML_20210626_013754	5.40162	29.1774	29.1774	3.64102	0.242478
GBM_5_AutoML_20210626_013754	5.70855	32.5875	32.5875	3.91314	0.249996
GBM_grid__1_AutoML_20210626_013754_model_1	5.9224	35.0748	35.0748	3.90731	0.251146
DeepLearning_1_AutoML_20210626_013754	5.98339	35.801	35.801	3.9921	0.275222
GBM_3_AutoML_20210626_013754	6.51416	42.4342	42.4342	4.56239	0.295999
GBM_grid__1_AutoML_20210626_013754_model_3	6.81432	46.4349	46.4349	4.7091	0.304199
GBM_4_AutoML_20210626_013754	6.97555	48.6583	48.6583	4.90997	0.313206
XGBoost_1_AutoML_20210626_013754	10.5989	112.336	112.336	7.36687	0.68645
```

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

```php
# Get the top model of leaderboard
aml.leader
```

![スクリーンショット 2021-06-26 10.49.12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/2244ef71-fa9f-a609-bdf9-4c45760a9dcf.jpeg)
![スクリーンショット 2021-06-26 10.49.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/15f56278-1c04-88c5-3963-9e04bf283ece.jpeg)
![スクリーンショット 2021-06-26 10.50.11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/743453/e6464277-47e2-fa55-51ca-271dfa083e29.jpeg)

テストデータは下記で予測できます。

```php
# 予測
y_pred = aml.leader.predict(h2o_test)
```

##さいごに
最後まで読んで頂き、ありがとうございました。
h2o も実装簡単でした。

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