機械学習モデルによる時系列予測システムの開発

Loading...

はじめに

Engineer Lab部所属の夏目です。普段はWebサイトのアクセス情報を含むビッグデータの分析を行なって、ビジネスに有効な知見を引き出すデータサイエンティストの業務と、自然言語処理モデル(BERT、他)やパブリッククラウドサービスの機械学習サービスを利用したシステムの開発を行なう機械学習エンジニアの業務をしています。今回は、その中から機械学習モデルを用いたWebサイトのアクセス数の時系列予測システムの開発をご紹介します。

f:id:kdx_writer:20220304083644j:plain
図1. 時系列予測

開発の背景

まず、Webサイトのアクセス数の予測システム開発の背景について説明したいと思います。KADOKAWAグループでは、書籍・雑誌だけでなくWebメディアを展開して記事を配信しています。そして記事を作成するにあたり、どういうジャンル(カテゴリー)の記事を掲載するとアクセス数を伸ばすことができるのかを知りたいという課題がありました。そこで、とある一つのWebメディアでは、ジャンル(カテゴリー)ごとのアクセス数の予測をすることで、いつ・どのジャンルの記事を執筆すべきなのかという企画の参考になるのではないかと考え、開発をスタートさせました。

システム構成

Webサイトのアクセスの指標(Page Views、以下PVと呼びます)の取得については、Google Analytics 360(以下GAと呼びます)を利用しています。そのため、連携が容易であり、機械学習のサービスや機能が利用できるGoogle Cloudを利用することにしました。GAとGoogle CloudのBigQueryの連携の設定(BigQuery Export)を行い、BigQueryに取り込みます。BigQuery ML(後述します)を用いて予測を行い、Googleデータポータルを用いて可視化を行うという構成になっています(図2)。

f:id:kdx_writer:20220304083855j:plain
図2. Webサイトアクセス数予測システムの構成図

予測モデル

今回のシステムではARIMA(Autoregressive integrated moving average、自己回帰和分移動平均)という時系列予測モデルを使用しました。ARIMAモデルは非定常な時系列データについて差分をとることにより定常性のある時系列データとして扱えるようにモデル化したものです(ARIMAモデルについては、書籍「入門はじめての時系列分析」(ISBN 978-4-489-02125-1)が参考になります)。

ARIMAモデルの長所としては、モデル作成(学習)を行うために必要なデータが対象変数(予測対象のデータ)のみであり、他の特徴量が必要ないことが挙げられると思います。そのため手軽にモデル作成ができます。

Google CloudのBigQuery MLでは、時系列モデルとしてARIMAモデル(「ARIMA_PLUS」モデル)が使用できますので、BigQuery MLを使用してARIMA_PLUSモデルを作成して予測に利用することにしました。

予測モデル作成と予測実施の手順

それでは予測モデル作成について順を追って説明していきます。

まず、Google AnalyticsのテーブルにSQLでクエリを行い、学習用データを作成します。作成方法の詳細は省略します。学習用データは、日付(年月日)、記事のカテゴリー、そのカテゴリーのPVの平均値(PV数の合計をページ数で割ったもの)となります。平均値を用いている理由は、記事の数、つまりページ数が多い場合は、その分PVの値が大きくなる影響を取り除くためです。ここではforecast_datasetデータセットのdata_forecastテーブルにこのデータを格納しています(図3)。なお、データは説明のための仮のデータを用いています。

f:id:kdx_writer:20220304084030j:plain
図3. 学習用データ
次にARIMAモデルを作成します。次のSQLを使用します。

CREATE OR REPLACE MODEL forecast_dataset.forecast_pv
OPTIONS
 (MODEL_TYPE = 'ARIMA_PLUS',
  TIME_SERIES_TIMESTAMP_COL = 'day',
  TIME_SERIES_ID_COL = 'category',
  TIME_SERIES_DATA_COL = 'avg_pageviews'
) AS
  SELECT category, day, avg_pageviews
  FROM `forecast_dataset.data_forecast`;

ここで指定しているオプションの説明は表1のとおりです。他に指定できるオプション等は、公式のリファレンスを参照してください。

表1. モデル作成のオプション
オプション名 説明
MODEL_TYPE モデル名(今回は「ARIMA_PLUS」)
TIME_SERIES_TIMESTAMP_COL タイムスタンプ、日付など時を示す値が格納されている列名
TIME_SERIES_ID_COL 複数の時系列を識別するためのIDが格納されている列名
TIME_SERIES_DATA_COL 予測対象の列名(今回は平均PV数)

予測モデルについては、予測したい時系列(カテゴリー)が複数ある場合、それぞれについて予測モデルを作成する必要があるわけではなく、TIME_SERIES_ID_COLを指定することにより1つのモデルで複数の時系列(複数のカテゴリー)を予測できるようにできます。モデルの作成に要する時間は数分です(テーブルのレコードの件数が数万行の場合)。

モデルの作成が完了すると、Google Cloudコンソールで作成したモデル(名前はforecast_pv)が確認できます(図4)。

f:id:kdx_writer:20220304090640j:plain
図4. 作成したモデル
次に作成した予測モデルの確認を行います。ML.ARIMA_EVALUATEを含む次のSQLを実行します。

SELECT
 *
FROM
 ML.ARIMA_EVALUATE(MODEL forecast_dataset.forecast_pv);

実行結果(図5)のうち、特にseasonal_periodsを確認します。ここで、年単位の周期(YEARLY)でアクセス数が変化するものは、その年単位の周期が適切に捉えられているかどうかを確認します。もし、データによって他の周期(月単位等)が想定される場合は、同様に確認します。

f:id:kdx_writer:20220304090855j:plain
図5. ML.ARIMA_EVALUATEの実行
また、SQLを実行しなくても、モデルを開いた画面の「評価」タブの「季節性の周期」のところでも確認できます(図6)。
f:id:kdx_writer:20220304090923j:plain
図6. モデルの評価
なお、他にML.ARIMA_COEFFICIENTS関数もあり、ARIMAモデルのパラメータ(係数)が確認できます。

次に作成した予測モデルで予測を行います。予測はML.FORECAST関数を含む次のSQLを実行します。

SELECT
  category,
  DATE(forecast_timestamp) AS day,
  forecast_value,
  prediction_interval_lower_bound,
  prediction_interval_upper_bound
FROM
  ML.FORECAST(MODEL forecast_dataset.forecast_pv,
              STRUCT(90 AS horizon,
                     0.8 AS confidence_level));

horizonは予測日数です。学習に用いたデータの最終日の翌日(例えば学習用データが1月31日までなら2月1日)から何日分の予測を行うかを指定しています。ここでは90日の予測を行う指定となっています。また、confidence_levelは信頼区間に関する指定であり、実行結果(図7)に含まれるprediction_interval_lower_boundからprediction_interval_upper_boundまでの区間に入る確率が指定した値になるような区間を出力する指定となっています。ここでは80%(0.8)になるように指定しています。

このようにBigQuery MLでは、予測の実施もテーブルへのクエリ同様にSQLで行えるようになっており、インタフェース的に扱いやすくなっています。

f:id:kdx_writer:20220304091144j:plain
図7. 予測結果

ユーザインタフェース

予測結果が得られましたが、それはSQLの実行結果の表形式のデータとなっています。これをもっと分かりやすく直感的に理解できるようにするため、可視化を行いました。

BigQueryのデータを可視化する方法としてGoogleデータポータルを使用すると比較的容易にダッシュボードを作成できますので、Googleデータポータルを使用してダッシュボードを作成しました。

Googleデータポータルでは、データソースとしてBigQueryを選択します(図8)。

f:id:kdx_writer:20220304091259j:plain
図8. Googleデータポータルでのデータソースの選択
そして、カスタムクエリを設定します(図9)。ここでは学習に用いた今までの実績値と予測値をUNION ALLで結合しています。
f:id:kdx_writer:20220304091334j:plain
図9. カスタムクエリの設定
次に、このデータソースをもとにグラフを編集して、ダッシュボードを作成します(図10)。ここでは日単位の実績値・予測値を月単位に集計して表示させています。ダッシュボードによる可視化で、直感的に理解しやすいユーザインタフェースとなりました。
f:id:kdx_writer:20220304091404j:plain
図10. ダッシュボード
ただし、Googleデータポータルのグラフの制限として、同じグラフに載せることができる系列(時系列データ)は20個までに制限されています。そのため、20を超える系列(カテゴリー)がある場合は、グラフを別にしなくてはなりませんでした。

おわりに

今回はBigQuery MLを使用してARIMAモデルを作成して予測を行い、ダッシュボードでの可視化を行いました。ARIMAモデルではPVなどの予測対象の値(対象変数)のみを学習用データとして利用しましたが、記事の内容(ジャンル、カテゴリー)によっては他の情報、例えば天気の情報や休日の情報などを用いるとより精度を向上させることが可能になると考えています。そのため、現在はVertex AI AutoML Forecasting(表形式データの予測モデル)やAWSのAmazon Forecastでの予測モデル作成にも取り組んでいます。また、Amazon Forecastの予測結果については、使用するツールの制限に囚われず、より自由度の高い可視化を行うため、Vue.jsでダッシュボードを開発中です。その詳細については、また後日このブログで紹介したいと考えています。

KADOKAWA Connectedでは中途採用を進めております。 ご興味がある方はこちらの求人一覧ページからご応募をお願いいたします。

※ 今回紹介したGoogle Cloud、AWSのサービスやその機能については、2022年2月時点の情報を掲載しております。ご利用になる場合は、念のため公式サイト等で最新の情報をご確認ください。

※ Google Cloud、Google Analytics、BigQuery、Vertex AIはGoogle LLC の商標です。その他の会社名、製品名、サービス名は各社の登録商標または商標です。