DriverlessAIで作成した時系列データの予測モデルを、以前に作成したSPSSのモデルと比較してみたいと思います。
リンク: SPSSを使用して時系列データの予測モデルを作成する
DriverlessAIの環境は持っていないので、2時間だけ使えるaquariumを利用します。
http://aquarium.h2o.ai/
使用するデータ
SPSSと比較したいので、以前にSPSSに投入したがデータ(加工済みcsv)をそのまま使用する。
リンク:データの入手と加工
簡単に説明すると、以下の2つのcsvを用意した。
・各店舗&部門ごとに、毎週の売上データ、および13個の追加の説明変数
・店舗番号と部門番号との組み合わせは2627パターン
・2010/3/5~2012/7/27の126週分のデータが入っているトレーニング用のcsv(2627x126=331002行)
・2012/8/3~2012/10/26の13週分のデータが入っているテスト用のcsv(2627x13=34151行)
・テスト用の方のcsvでは、売上データをすべて「0」にしている(この値を予測のために使用されないために)
トレーニング用データ(2010/3/5~2012/7/27)
モデル作成
csvをドラッグ・アンド・ドロップで投入。
トレーニングデータの方をクリックして「PREDICT」実行
学習のためのパラメータ
Tareget Column:Uriage列(売上を予測したい)
Time Column:Week列(これがこのデータの時系列情報)
Time Groups Columns:Week列、Shop列、Bumon列(店舗ごと、部門ごとの売上を予測したいので)
Forcast Horizon:13(トレーニングデータの翌週から12週間後までの、合計13週のデータを予測したいので)
GAP Between Train/Test Period:0(トレーニングデータの翌週が予測したい期間の開始日)
Accuracy=6/Time=4/Interpretability=5(6/5/5や7/4/5だと、2時間以内に終わらなかったので)
Test Datasetは入れない(後で予測値のcsvだけ取れれば良いので、ここに入れなくても良い。精度評価はSPSSと比較するのでexcelでやる。)
以上だけ設定した後にLaunch Experimentでモデル作成開始
45分くらいで完了。
予測結果を出力1(予測したい期間の説明変数を与えた場合)
「Score On Another Dataset」から、トレーニングデータと一緒に放り込んだテストデータ(Uriage列が0になっている2012/8/3以降のもの)を選択する。
余計な列はいらないので、Shop、Bumon、Week、Uriageだけを選択してcsvをダウンロード。
売上の予測値(Uriage.predicted)が入ったcsvが手に入る。
実績値のUriageが0になっているのは、DrivelessAIに答えを与えないために、テストデータのcsvのUriageを0で投入したため。
予測結果を出力2(予測したい期間の説明変数を与えない場合)
モデル作成前に「Forcast Horizon:13」を指定した。
つまり、ある時点での目的変数を予測するために、その時点から遡って13時間単位分のデータは使用しないことになっていると思われる。(未来の、未知のデータも含まれるので)
ということで、以下のようにテストデータのcsvから、すべての説明変数をnullにしてみる。
先程と同様に、「Score On Another Dataset」からcsvを投入して予測結果をダウンロードすると、微妙に結果が異なっている
同じモデルも結果が変わるということは、Forcast Horizonに数値を入れても、その期間分の直近の説明変数をが使われないわけではないということだろう。
ただ、今回のように、「Score On Another Dataset」で未知のデータをnullにして放り込んでも、一応はそれなりの精度での予測値を出してくれるっぽい。
精度検証
店舗番号と部門番号との組み合わせが2627パターンあるので、2627組x13週間の34151個の予測値をExcelで評価する。
前回のSPSSによる3パターンの予測とあわせて確認する。
精度の低い手法から試したSPSSと合わせるため、今回のDriverlessAIの結果である「予測結果を出力1」と「予測結果を出力2」の順番を入れ替えている点に注意。
SPSS_手法1:リンク
「レコードの将来への拡張」設定により、モデルに「過去の説明変数のみ与える」
SPSS_手法2:リンク
「予測したい期間の目的変数をnullにしたcsv」をモデルに入力して、モデルに「予測したい期間の説明変数も与える」
SPSS_手法3:「SPSSを使用して時系列データの予測モデルを作成する2」の手法
「レコードの将来への拡張」設定に加え、時間軸をずらしたトレーニングデータにより「予測したい期間の説明変数も与える」
DAI_手法1:今回の「予測結果を出力2」の出力
「過去の説明変数のみ与える」
DAI_手法2:今回の「予測結果を出力1」の出力
「予測したい期間の説明変数も与える」
下の方のデータは各週ごとに個別に計算したもの。直近の予測ほど精度が高いのでは?と思って調べてみたが、あまり有意な差には見えない。
ぱっと見て分かること
・SPSSよりも全体的に誤差が小さい。
・DriverlessAIは、SPSSでは誤差の大きくなっていた週についても、誤差が抑えられているように見える。
・SPSS、DriverlessAIのいずれも、予測したい期間の説明変数を与えることで、ちゃんと精度が上がっている。
各週の売上を、全店舗&全部門で合計し、予測値と実績値を比較する
SPSSよりもDriverlessAIの方が、かなりアグレッシブに予測できている印象。
DAI_手法1が、実績値と比べて全体的にプラス方向にずれているのはなぜだろうか。
誤差のばらつきをグラフ化する。
横軸の0は、実際には「誤差が-500~0の範囲の予測数」になる。一部のデータでピークが+500(実際には「誤差が0~+500の範囲の予測数」)にずれているように見えるのはそれが原因。
DriverlessAIの方がSPSSよりも
DAI_手法1が、DAI_手法2よりも全体的にプラス方向にずれているのが気になる。
DAI_手法1は正規分布になっていない感じ。
追加検証:Forcast Horizonを13以外に設定した場合
先程の検証で、Forcast Horizon=13を指定しても、直近13週間の説明変数を予測に使用していることが分かった。
では、Forcast Horizonをデフォルトの1にした場合、モデルの特性はどのように変わるのか?
先ほどと同じデータを使用してモデル作成。Forcast Horizonを1,2,4,6,8,10,20,40に指定。他のパラメータは先ほどと同じ状況でモデルを作成する。
・
・
・
「予測したい期間の説明変数を与えた場合」の結果を比較するために、説明変数を含むcsvを指定して予測値を出力した結果。
分かったこと
・Forcast Horizon値が小さとForcast Horizon値を超える長期の予測精度が劇的に落ちるが、Forcast Horizon値がある程度大きければ、Forcast Horizon値を超える長期の予測についても、それほど精度が落ちなくなる。
・Horizon値が大きすぎると短期予測に大きなハズレ予測が混ざってくる(誤差絶対値平均はあまり落ちないが誤差二乗平均が一気に悪化する)
・短期予測についてはForcast Horizonが小さいものの方が有利なことが多い。短期予測と長期予測両方の精度を上げたい場合は、複数のモデルを併用すると良いかも。
・乱数によってモデルの精度に結構なバラツキが出る。上記の表ではForcast Horizon=6の劣化が顕著だが、何度か試すと、同じ設定でも誤差二乗平均が2倍近く劣化したモデルになったこともあった。予測を安定させたいならば、同じ設定で何度か作り直した複数のモデルを併用して平均を取る手法もありかも。