前回の続きです。ハンガリーにおけるchikenpox(水疱瘡)のデータを使って、BUTAPESTにおける患者数の3か月分の予想を行っています。前回までの結果は、AUTOARIMAでMAE36、LightGBMでMAE38、AutokerasでMAE32、tpotでMAE34、pycaretでMAE35でした。

今回は、h2oを使ってAutoMLをしたいと思います。

H2O

特徴はJAVAで作られているところでしょうか。scikitlearnを使っていないので独自のモデルが入っているのでしょう。とにかく使ってみます。

JAVAを起動させるための呪文を唱えます。なお、google colabでの実行を想定しています。

!apt-get install openjdk-8-jdk -qq > /dev/null
!pip install h2o -qq
!npm install -g localtunnel -qq > /dev/null
get_ipython().system_raw('lt --port 54321 >> url.txt 2>&1 &')
!cat url.txt

import pandas as pd
import h2o
from h2o.automl import H2OAutoML
import matplotlib.pyplot as plt
from scipy import stats
%matplotlib inline

h2o.init(nthreads=-1)

データ

前回からのデータと同じです。このような形をしています。indexに日付が入っています。

df5

データを加工していきます。train testに分けてからh2oのデータ型に変換します。

df_train = df5.iloc[:int(df5.shape[0]*0.8),:]
df_test = df5.iloc[int(df5.shape[0]*0.8):,:]

hf_train = h2o.H2OFrame(df_train)
hf_test = h2o.H2OFrame(df_test)

y = 'next'
X = hf_train.columns
X.remove(y)

学習させます。

aml = H2OAutoML(max_runtime_secs = 600,
                seed = 42)
aml.train(x = X, 
          y = y,
          training_frame = hf_train,
          leaderboard_frame = hf_test)

結果を見てみます。

lb = aml.leaderboard
lb

一番強いのは、XGBoostですね。

再学習する方法がわからないので、上記のモデルを使って単純に1未来ずつ(3か月分の13レコード)予測しています。

leader_model = aml.leader
result_h2o = pd.DataFrame(0,
                  index=np.arange(13),
                  columns=["pred", "true_diff"])

last30 = len(df5)-13
last = len(df5)

for i in range(last30,last):

  hf_test = h2o.H2OFrame(df5.iloc[i:i+1])
  pred = leader_model.predict(hf_test)
 
  result_h2o.iloc[i-(last30),0] = pred
  result_h2o.iloc[i-(last30),1] = y_test

result_h2o["mae"] = abs(result_h2o["true_diff"]-result_h2o["pred"])
result_h2o["mae"].mean()

34.41

MAE34でした。

これまでの結果をまとめます。

Mean法、AutoArima、lightGBM、AutoKeras、tpot、pycaret、h2oを比較しました。結果は、autokerasが一番よい予測をしました。次にtpotです。

Categories:

category