BigQuery MLでTwitterエンゲージメント数の予測モデル作成

機械学習・AIと聞くと、難しそう、学習コストがかかりそう、というイメージを持たれる方も多いのではないでしょうか?

今回は、SQLだけで機械学習モデルを作ることができる、BigQuery MLについてご紹介します。

プログラミングも必要なく、機械学習の知識がなくても手軽にモデル構築が可能なサービスです。

BigQuery MLとは

2018年にリリースされた、BigQueryで機械学習モデルを作成・実行できるサービスです。

SQLだけで利用できるため、学習コストもかからず、手軽に試すことができます。

公式ドキュメントに、現在サポートされているモデルの一覧が記載されています。

  • 予測 – 売り上げ予測など数値予測
    • 線形回帰
    • XGBoost
    • ディープニューラルネットワーク
  • 分類 – 購買するか否かといった0・1の分類
    • 2項ロジスティック回帰
    • 多項ロジスティック回帰
    • XGBoost
    • ディープニューラルネットワーク
  • クラスタリング – 顧客セグメントわけなど
    • K平均法クラスタリング
  • レコメンデーション – 商品のレコメンデーションなど
    • 行列分解
  • 時系列予測 – 天気予報の時間ごとの気温変動など
    • ARIMA

これ以外にも、最適なモデルを自動で選択して構築できるAutoML Tablesや、自前で作成したTensorFlowモデルを利用することもできます。

AutoML TablesとBigQuery MLの違い・使い分け

AutoML Tablesとは、表形式データを使用して機械学習モデルが作れるサービスです。

BigQuery MLと違って使用するモデルを選択する必要はなく、データの前処理からモデル構築、評価、予測までを自動で行ってくれます。

公式ドキュメントには、以下のように記載されています。

AutoML Tables は、ターゲット列のデータ型に基づいて、問題と構築すべきモデルを自動的に定義します。そのため、ターゲット列に数値データが含まれている場合、AutoML Tables は回帰モデルを構築します。ターゲット列がカテゴリデータの場合、AutoML Tables はクラスの数を検知して、バイナリモデルを構築すべきかマルチクラス モデルを構築すべきかを判定します。

データの用意と作成されたモデルの良し悪し判断以外は自動で行ってくれますが、1回のモデル作成に数時間かかります。

その点、BigQuery MLでは数分単位でモデル構築が可能です。

Googleではじめるデータエンジニアリング入門には、ベストプラクティスとして以下のように記載されています。

BigQuery  MLで機械学習モデルの学習に利用するデータを絞りこみ、ベースラインとなるモデルを構築するためのトライアンドエラーを行います。ある程度データが絞り込めた段階で、AutoML Tablesを使って一気により良いモデルを探索する、というハイブリッドなアプローチが良いと筆者は考えます。

BigQuery ML料金体系

モデル作成にかかる料金と、評価・検査・予測クエリにかかる料金との2つに分類されます。そのうちモデルの種類によっても料金が変わります。

▼米国マルチリージョンの場合

種別詳細料金
モデル作成組み込みモデル
線形回帰、ロジスティック回帰、K 平均法、行列分解、時系列のモデルなど
毎月10GBまで無料
それ以上は$250.00 per TB
外部モデル
DNN モデル、ブーストツリー モデル、AutoMLモデル
$5.00 per TB
評価・検証・予測毎月1TBまで無料
それ以上は$5.00 per TB

Twitterアナリティクスのデータを利用した線形回帰分析

BigQuery MLで、Twitterアナリティクスデータを利用した線形回帰分析を行います。

エンゲージメント数を予測対象として、モデル作成、評価、予測、重みのクエリを実行します。

Twitterアナリティクスのデータ取り込み

Twitterアナリティクスから過去28日間のCSVデータをダウンロードします。

ダウンロードしたCSVのヘッダーを日本語から英語に書き換え、Cloud Shellにアップロードします。

下記のコマンドを実行し、BigQueryへデータを取り込みます。project_idやdataset、csvファイル名は該当するものに書き換えます。

bq load --skip_leading_rows=1 --allow_quoted_newlines --source_format=CSV --autodetect {project_id}:{dataset}.tweet28days ./tweet_activity_metrics.csv

線形回帰モデル作成

CREATE MODELで線形回帰モデルを作成します。

OPTIONSにて、モデルタイプと予測対象である目的変数を設定します。そのほかにも様々なオプションがあります。

以下のクエリを実行すると、数分でモデルが作成されます。

CREATE MODEL
  {dataset}.tweet_model OPTIONS (model_type='linear_reg',
    labels=['engagement']) AS
SELECT
  tweet_text,
  PARSE_TIMESTAMP('%Y-%m-%d %H:%M:%S', REGEXP_REPLACE(time, r"( \+0000)", ":00")) AS tweet_timestamp,
  impression,
  engagement,
  engagement_rate,
  retweet,
  reply,
  tweet_like,
  profile_click,
  url_click,
  hashtag_click,
  detail_click,
  fixed_ufl_click,
  follower
FROM
  `{project_id}.{dataset}.tweet28days`

評価

次にML.EVALUATEクエリでモデルの評価を確認します。線形回帰の場合は全部で6つの評価指標が得られます。

公式ドキュメントには、特に重要な指標はr2_scoreとあります。

R2 スコアは、線形回帰予測が実際のデータに近似するかどうかを決定する統計的尺度です。0 は、平均値周辺のレスポンス データにばらつきがないことを示しています。1 は、平均値周辺のレスポンス データにばらつきがあることを示しています。

0.999…という数値ですので、良いモデルとは言えない結果となりました…

SELECT
  *
FROM
  ML.EVALUATE(MODEL {dataset}.tweet_model,
    (
    SELECT
      tweet_text,
      PARSE_TIMESTAMP('%Y-%m-%d %H:%M:%S', REGEXP_REPLACE(time, r"( \+0000)", ":00")) AS tweet_timestamp,
      impression,
      engagement,
      engagement_rate,
      retweet,
      reply,
      tweet_like,
      profile_click,
      url_click,
      hashtag_click,
      detail_click,
      fixed_ufl_click,
      follower
    FROM
      `{project_id}.{dataset}.tweet28days` ))

予測

ML.PREDICTクエリで予測をしてみます。predicted_engagementはモデルが予測したエンゲージメント数、engagementは実際のエンゲージメント数です。

SELECT
predicted_engagement,
engagement,
tweet_text
FROM
  ML.PREDICT(MODEL `{dataset}.tweet_model`,
    (
    SELECT
      tweet_text,
      PARSE_TIMESTAMP('%Y-%m-%d %H:%M:%S', REGEXP_REPLACE(time, r"( \+0000)", ":00")) AS tweet_timestamp,
      impression,
      engagement,
      engagement_rate,
      retweet,
      reply,
      tweet_like,
      profile_click,
      url_click,
      hashtag_click,
      detail_click,
      fixed_ufl_click,
      follower
    FROM
      `{project_id}.{dataset}.tweet28days` ))

重み

ML.WEIGHTSで、予測に利用される指標の重みを確認することもできます。

STRUCT(true AS standardize)を入れることで、重みの標準化が有効となります。

SELECT
  processed_input,
  weight
FROM
  ML.WEIGHTS(MODEL `{dataset}.tweet_model`, STRUCT(true AS standardize))
ORDER BY ABS(weight) DESC

まとめ

BigQuery MLの概要、料金、線形回帰の例をご紹介しました。

線形回帰以外にもさまざまなモデルがサポートされており、実業務・実サービスで利用できそうなものもあったのではないでしょうか。

学習、時間、金銭面においても低コストで気軽に取り入れることができます。

ぜひ、ご自身のデータで試してみてください!