
Google BigQuery MLを使えば、BigQueryコンソールから離れることなく、わずか数分でGoogle Cloudの利用料金を予測できます。
はじめに
線形回帰はとてもシンプルな手法ですが、現実世界のさまざまな問題に対して効率的かつ精度の高い予測を行えます。仕組みが単純なため学習の設定が容易で、収束も速いという利点があります。
本記事では、Google Cloudの請求データを分析し、月間支出を見積もるシンプルな予測モデルを構築する方法をご紹介します。さらに面白くするために、Google BigQueryのみを使用し、請求データをすべてデータウェアハウスのエコシステム内で完結させます。
今回はGoogle Billing Exportsを利用します。BigQueryへの請求エクスポートを使うと、日次の使用量と料金を一日を通じて自動的に、指定したBigQueryデータセットに書き出せます。Google Billing Exportsの詳細はこちらをご覧ください。
データとコードのサンプルはこちらから入手できます: https://github.com/doitintl/BigQueryML-Examples
生データ
下表は、当社が保有する2つのGoogle Cloud請求アカウントで利用された各種サービスの請求内容をまとめたものです。
BigQueryへのGoogle Billing Exportsのサンプルデータ
目指すモデル
目標は、ある日までに発生したすべての請求情報をもとに、当月の合計請求額を予測することです。
このモデルがあれば、全体の支出を見積もるだけでなく、異常値の検知や過剰請求のアラートも実現できます。
前提条件
このモデルでは、月間請求額が次の3つの変数に対して線形に依存すると仮定します。

1つ目の変数は、現在の日次消費トレンドを表します。残る2つは月末までの残日数と現時点の累積請求額です。これら3つを組み合わせることで、月内に残る支出額を推定できます。
日次粒度でのデータ集計
モデルには日次粒度のデータが必要なため、BigQueryでデータを日単位に集計します。
https://gist.github.com/gidutz/2ce58c9391c979b63ac1bbe3bfece7c5
得られるスキーマは次のとおりです。
account_name — アカウントID
day — 月末までの残日数
month — 請求月
year — 請求年
daily_cost — 当該請求日における全サービスの合計支払額
monthly_cost — ラベル。当月中に発生する全請求(将来分を含む)の合計
日次粒度で集計したデータを新しいテーブルとして保存し、MLデータセットの生成に使います。

ウィンドウ集計の計算
次に、各アカウントについて月初から当日までに発生した請求額を計算します。ここでは集計用のウィンドウ関数を使います。この関数を使えば、月初から当日までの平均日次支出も同時に算出できます。
集計ウィンドウ関数の構文はこちらを参照してください: [1]
analytic_function_name ( [ argument_list ] ) OVER ( [ PARTITION BY partition_expression_list ] [ ORDER BY expression [{ ASC | DESC }] [, ...] ] [ window_frame_clause ] )billing_daily_monthlyテーブルに対しては、次のように使用します。
https://gist.github.com/gidutz/da662ead3e013c45436b10b574585c06
データをプロットすると、月間請求額はほぼ線形に積み上がっていくことが分かります。

この結果から、支出予測には線形モデルが適していると確信できます。さらに、傾きの月ごとのばらつきが小さいことから、選択した特徴量が独立変数に対して十分統計量になっていると考えられます。
もちろん、特徴量を増やしてより複雑なモデルを使えば、予測精度はさらに向上するでしょう。そうしたモデルはGoogle Cloud MLなど他のツールで構築できます。ただ今回は、データの準備はこれで完了です。
(やった!)
BigQuery MLによる線形回帰モデルの学習
データが揃ったら、登場したばかり(2018年8月時点)のBigQuery MLを使って線形回帰モデルを学習させます。
データセットへのモデルのフィッティングは、驚くほど簡単です!
https://gist.github.com/gidutz/7a0bd510494285fd679cde71944e9d77
予測の実行とモデルの評価
保存したモデルは、そのまま予測に利用できます。次のクエリでは、月間の最終支出額の推定と、日次予測の相対絶対誤差(Relative Absolute Error)の算出を同時に行います。
https://gist.github.com/gidutz/f7de19eee11478d75757e4bdc3b25001
下表のような結果を保存しておけば、監視・アラートなどシステムの他のコンポーネントから活用できます。モデルの平均相対絶対誤差(Mean Relative Absolute Error)はおよそ3.0%と、悪くない水準です。(なお本デモ用に生成したデータでの値で、実データでは約2.0%の誤差を達成しました)
予測のサンプル
他の記事もご覧になりたい方は、ブログをチェックするか、GadのTwitterをフォローしてください。
謝辞: Vadim Solovey — 編集
amiel m — テクニカルレビュー
キーワード:BigQueryML、BigQuery MLチュートリアル、BigQuery MLサンプル