SQL を使用した BQML による映画評価の予測

1. はじめに

この Codelab では、SQL のみを使用して BigQuery ML カスタムモデルで映画スコア予測モデルを作成し、VertexAI にデプロイします。学習内容:

  1. Cloud Shell を使用して BigQuery データセットを作成し、ファイルからデータを読み込む方法
  2. BigQuery ML を教師あり学習に使用して、コーディングをあまり行わずに SQL クエリのみを使用して、映画スコア予測用のマルチクラス回帰予測モデルを作成する方法

作成するアプリの概要

次のものを作成します。

  • テーブルとモデル コンポーネントが格納された BigQuery データセット
  • SQL クエリを使用して映画の評価を予測する BigQuery ML モデル
  • Vertex AI Model Registry にモデルをデプロイする

要件

  • ブラウザ(ChromeFirefox など)
  • 課金を有効にした Google Cloud プロジェクト

2. プロジェクトを作成する

  1. Google Cloud コンソールのプロジェクト選択ページで、Google Cloud プロジェクトを選択または作成します。
  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
  3. BigQuery に移動して API を有効にします。ブラウザに次の URL を入力して、BigQuery ウェブ UI を直接開くこともできます。 https://console.cloud.google.com/bigquery

3. Cloud Shell をアクティブにする

  1. Cloud Shell(Google Cloud で動作するコマンドライン環境)を使用します。この環境には bq がプリロードされています。Cloud Console の右上にある [Cloud Shell をアクティブにする] をクリックします。6757b2fb50ddcc2d.png
  2. Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project
  1. プロジェクトが設定されていない場合は、次のコマンドを使用して設定します。
gcloud config set project <PROJECT_ID>

gcloud コマンドとその使用方法については、ドキュメントをご覧ください。

4. トレーニング データの準備

これは、データ関連のすべてのプロジェクト、プロダクト、アプリで重要なステップです。最適なデータセットを準備して ML プロジェクトで使用できるようにするには、テクノロジーに加えて多くのドメイン知識が必要です。この Codelab では、すでに準備されている データ ファイルを使用します。

5. データセットの作成と読み込み

BigQuery データセットはテーブルのコレクションです。データセット内のすべてのテーブルは、同じデータ ロケーションに保存されます。また、カスタム アクセス制御をアタッチして、データセットとそのテーブルへのアクセスを制限することも可能です。

  1. Cloud Shell で bq mk コマンドを使用して、「movies」というデータセットを作成します。
bq mk --location=<<LOCATION>> movies

ロケーションをリージョン(asia-south1)に設定します。

  1. データファイル(.csv)が用意できていることを確認します。Cloud Shell で次のコマンドを実行し、リポジトリのクローンを作成してプロジェクトに移動します。
git clone <<repository link>>

cd movie-score
  1. bq load コマンドを使用して、CSV ファイルを BigQuery テーブルに読み込みます(BigQuery UI から直接アップロードすることもできます)。
bq load --source_format=CSV --skip_leading_rows=1 movies.movies_score \
./movies_bq_src.csv \ Id:numeric,name:string,rating:string,genre:string,year:numeric,released:string,score:string,director:string,writer:string,star:string,country:string,budget:numeric,company:string,runtime:numeric,data_cat:string

オプションの説明: –source_format=CSV - データファイルの解析時に CSV データ形式を使用します。–skip_leading_rows=1 - CSV ファイルの最初の行はヘッダー行であるため、スキップします。Movies.movies - 最初の位置引数。データを読み込むテーブルを定義します。./movies.csv - 2 番目の位置引数。読み込むファイルを定義します。bq load コマンドは、ローカル ファイルに加えて、gs://my_bucket/path/to/file URI を使用して Cloud Storage からファイルを読み込むことができます。スキーマは、JSON スキーマ ファイルまたはカンマ区切りのリストとして定義できます(ここではカンマ区切りのリストを使用しました)。これで完了です。CSV データがテーブル movies.movies に読み込まれました。

  1. 次の 3 つの方法のいずれかでクエリを実行します。

BigQuery は 3 つの方法で操作できます。そのうちの 2 つを試してみましょう。a. BigQuery ウェブ UI b. bq コマンド c. API

SELECT name, rating, genre, runtime FROM movies.movies_score limit 3;

BigQuery Web SQL ワークスペースを使用してクエリを実行しました。SQL ワークスペースは次のようになります。

109a0b2c7155e9b3.png

bq コマンドを使用する場合:

bq query --use_legacy_sql=false \
SELECT name, rating, genre, runtime FROM movies.movies_score limit 3;

6. 1 ~ 10 段階で映画の評価を予測する

BigQuery ML は、ロジスティック回帰モデルタイプでの教師あり学習をサポートしています。2 つのカテゴリのどちらに値が分類されるかを予測するには 2 項ロジスティック回帰モデルタイプを使用し、複数のカテゴリのうちのどれに値が分類されるかを予測するには多項回帰モデルタイプを使用します。これらはデータを 2 つ以上のカテゴリに分類するため、分類問題と呼ばれます。

モデルの選択に関する簡単な注意点: ここで選んだモデルは、実験的に選んだものです。最初はいくつかのモデルを実行し、その結果の評価に基づいて最終的に LOGISTIC REG にすることで、シンプルさを保ち、いくつかのデータベースから実際の映画の評価に近い結果を取得できました。これはモデルを実装するためのサンプルにすぎず、このユースケースに推奨されるモデルとは限りません。他の実装方法として、スコアを予測するのではなく、このロジスティック回帰モデルを使用して映画の結果を GOOD / BAD として予測する方法があります。

トレーニング データを選択する

映画データ(CSV)は、テーブル内の 3 つのカテゴリに分割されています。これは、3 つの値(TRAIN、TEST、PREDICT)のいずれかを持つフィールド「data_cat」を使用しています。テストとトレーニングのためにデータセットを分割することは、モデルの重要な側面です。データセットの分割について詳しくは、ドキュメントをご覧ください。

ロジスティック回帰モデルを作成する

CREATE MODEL ステートメントをオプション「LOGISTIC_REG」とともに使用して、ロジスティック回帰モデルを作成してトレーニングできます。

BigQuery ウェブ UI SQL ワークスペースで次のクエリを実行します。

CREATE OR REPLACE MODEL
  `movies.movies_score_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
   data_split_method='NO_SPLIT',
    input_label_cols=[score']
  ) AS
SELECT
  * EXCEPT(id, data_cat)
FROM
  ‘movies.movies_score'
WHERE
  data_cat = 'TRAIN';

クエリの詳細:

  1. CREATE MODEL ステートメントは、SELECT ステートメントのトレーニング データを使用してモデルをトレーニングします。
  2. OPTIONS 句 は、モデルタイプとトレーニング オプションを指定します。ここでは、LOGISTIC_REG オプションでロジスティック回帰モデルタイプを指定しています。2 項ロジスティック回帰モデルか多項ロジスティック回帰モデルかを指定する必要はありません。BigQuery ML はラベル列の一意の値の数に基づいてどちらをトレーニングするかを判断できます。
  3. data_split_method=‘NO_SPLIT' を指定すると、BQML はクエリ条件(data_cat = ‘TRAIN')に従ってデータをトレーニングします。また、このオプションで ‘AUTO_SPLIT' を使用して、フレームワーク(この場合はサービス)がトレーニング/テスト分割のパーティションをランダム化することをおすすめします。
  4. input_label_cols オプションは、SELECT ステートメントでラベル列として使用する列を指定します。ここでは、ラベル列は score であるため、モデルは他の行の値に基づいて、score の 10 個の値のどれに分類される可能性が高いかを学習します。
  5. ‘auto_class_weights=TRUE' オプションは、トレーニング データ内のクラスラベルのバランスをとります。デフォルトでは、トレーニング データは重み付けされません。トレーニング データ内のラベルが不均衡である場合、モデルは最も出現回数の多いラベルクラスをより重視して予測するように学習することがあります。
  6. SELECT ステートメントは、CSV データで読み込んだテーブルにクエリを実行します。WHERE 句は入力テーブルの行をフィルタして、このステップで TRAIN データセットのみが選択されるようにします。

作成すると、BigQuery SQL ワークスペースの [SCHEMA] セクションに次のように表示されます。

ラベル

93efd0c1a7883690.png

機能

8c539338df1a9652.png

ロジスティック回帰モデルを評価する

モデルを作成したら、ML.EVALUATE 関数を使用してモデルの性能を評価します。ML.EVALUATE 関数は、実際のデータに照らして予測値を評価します。モデルの評価に使用するクエリは次のとおりです。

SELECT
  *
FROM
  ML.EVALUATE (MODEL movies.movies_score_model,
    (
    SELECT
      *
    FROM
      movies.movies_score
    WHERE
      data_cat= TEST'
    )
  )

ML.EVALUATE 関数は、前のステップでトレーニングしたモデルと、SELECT サブクエリによって返された評価データを取得します。この関数は、モデルに関する統計を単一行で返します。

b54b0ebd6514a498.png

ロジスティック回帰を実行しているため、結果には上記のスクリーンショットに表示されている指標(適合率、再現率、精度、F1 スコア、log_loss、roc_auc)が含まれます。これらは、モデルのパフォーマンスを評価するうえで非常に重要です。また、入力データを指定せずに ML.EVALUATE を呼び出すこともできます。ML.EVALUATE はトレーニング中に導出された評価指標を取得します。これは、自動的に予約された評価データセットを使用します。

主な指標の概要:

適合率 - 陽性と特定されたもののうち、実際に陽性だった割合はいくつか。適合率 = 真陽性 /(真陽性 + 偽陽性)再現率 - 実際に陽性だったもののうち、陽性と正しく特定された割合はいくつか。再現率 = 真陽性 /(真陽性 + 偽陰性)精度 - 分類モデルを評価する指標。モデルが実際に正しく予測した割合。精度 = 正しい予測数 / 予測の総数

ML.PREDICT を使用して映画の評価を予測する

次のクエリは、データセットの PREDICT 部分にある各映画のスコアを予測します。

SELECT
  *
FROM
  ML.PREDICT (MODEL movies.movies_score_model,
    (
    SELECT
      *
    FROM
      movies.movies_score
    WHERE
      data_cat= PREDICT'
     )
  )

結果のスニペットを以下に示します。

1efb91967acc1f0c.png

モデルの結果には、1 ~ 10 段階(分類)で映画の予測スコアが表示されます。各映画に対して複数の予測行があるのはなぜでしょうか。これは、モデルが予測されるラベルと、それぞれの発生確率を降順で返したためです。

予測結果とモデルを分析する

予測結果の一部として、次の 2 つの分析ステップを実行できます。

  1. モデルがこれらの予測結果を生成する理由を理解するには、ML.EXPLAIN_PREDICT 関数を使用します。
  2. 一般に、所得階層を決定するうえで最も重要な特徴量を特定するには、ML.GLOBAL_EXPLAIN 関数を使用します。

これらの手順について詳しくは、ドキュメントをご覧ください。

7. BigQuery AutoML を使用して映画の評価を予測する

AutoML は、BigQuery サービスにモデルを作成させ、モデルの結果が生成されるまで待つ場合に便利です。AUTOML 機能は BQML(model_type=AUTOML_CLASSIFIER または AUTOML_REGRESSOR)で直接使用できます。データがすでに BigQuery にある場合は、呼び出しがはるかに簡単になります。

CREATE OR REPLACE MODEL movies.auto_movies
       OPTIONS(model_type='AUTOML_CLASSIFIER',
               input_label_cols=['score'],
               budget_hours=1.0)
AS 
SELECT
  * EXCEPT(id, data_cat)
FROM
  movies.movies_score;

モデルが作成されたら、カスタム BQML モデルで説明したように、EVALUATE、PREDICT、EXPLAIN_PREDICT の手順を実行できます。BigQuery AutoML について詳しくは、 ドキュメントをご覧ください。

8. ワンクリックで BQML モデルを Vertex AI Model Registry にデプロイする

Vertex AI モデル レジストリ内ですべての ML モデルを確認できるようになり、組織のモデル管理とデプロイが容易になりました。モデルには、BigQuery ML、AutoML で構築されたモデル、カスタム トレーニング済みモデルなどが含まれます。手順は次のとおりです。

CREATE OR REPLACE MODEL
  `movies.movies_score_model`
OPTIONS
  ( model_type='LOGISTIC_REG',
    auto_class_weights=TRUE,
   data_split_method='NO_SPLIT',
   model_registry='vertex_ai',
  vertex_ai_model_version_aliases=['logistic_reg', 'experimental'],
    input_label_cols=[score']
  ) AS
SELECT
  * EXCEPT(id, data_cat)
FROM
  ‘movies.movies_score'
WHERE
  data_cat = 'TRAIN';

CREATE MODEL クエリに model_registry="vertex_ai" オプションを含めて、BigQuery ML が Vertex AI Model Registry に明示的に登録するモデルを選択できるようにします。詳細については、こちらの ブログをご覧ください。

9. まとめ

30 分以内に次のことを行いました。

  1. 分析プロジェクトのデータベースとして BigQuery を設定した
  2. BigQuery データ SQL のみを使用して、他のコーディングを行わずにカスタム予測モデルを作成した
  3. SQL クエリのみを使用して BQ Auto ML モデルを作成した
  4. BQML モデルを Vertex AI Model Registry にデプロイした

10. クリーンアップ

この投稿で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

11. 完了

おめでとうございます!BQML カスタムと AutoML を使用して映画スコア予測モデルを作成し、Vertex AI Model Registry にデプロイしました。これらはすべて SQL のみを使用して行いました。