前回の続きです。ハンガリーにおける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です。