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 コンソールで、右上の [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 - 最初の位置引数 - データを読み込むテーブルを定義します。2 番目の位置引数である ./movies.csv は、読み込むファイルを定義します。bq load コマンドでは、ローカル ファイルに加えて、gs://my_bucket/path/to/file URI を使用して Cloud Storage からファイルを読み込むことができます。スキーマは、JSON スキーマ ファイルまたはカンマ区切りのリストとして定義できます(ここではカンマ区切りのリストを使用しました)。​これで CSV データが movies.movies テーブルに読み込まれました。

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

BigQuery を操作するには、次の 3 つの方法があります。ここでは、そのうちの 2 つを試します。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 形式)は、TRAIN、TEST、PREDICT の 3 つの値のいずれかを持つ「data_cat」フィールドを使用して、テーブル内の 3 つのカテゴリにすでに分割されています。テストとトレーニングのためにデータセットを分割することは、モデルの重要な要素です。データセット分割の詳細については、ドキュメントをご覧ください。

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

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 Model Registry 内ですべての 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. Vertex AI Model Registry にデプロイされた BQML モデル

10. クリーンアップ

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

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

11. 完了

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