行列分解モデルを使用して明示的なフィードバックに基づくレコメンデーションを作成する


このチュートリアルでは、行列分解モデルを作成し、movielens1m データセット内の顧客の映画レーティングでトレーニングする方法について説明します。次に、行列分解モデルを使用して、ユーザーにおすすめの映画を生成します。

ユーザー提供の評価を使用してモデルをトレーニングすることを、明示的なフィードバックによるトレーニングと呼びます。明示的なフィードバックをトレーニング データとして使用する場合、行列分解モデルは交互最小二乗アルゴリズムを使用してトレーニングされます。

目標

このチュートリアルでは、次のタスクについて説明します。

  • CREATE MODEL ステートメントを使用して行列分解モデルを作成する。
  • ML.EVALUATE 関数を使用してモデルを評価する。
  • ML.RECOMMEND 関数でモデルを使用して、ユーザー向けの映画レコメンデーションを生成します。

料金

このチュートリアルでは、Google Cloud の課金対象となる次のコンポーネントを使用します。

  • BigQuery
  • BigQuery ML

BigQuery の費用の詳細については、BigQuery の料金ページをご覧ください。

BigQuery ML の費用の詳細については、BigQuery ML の料金をご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 新しいプロジェクトでは、BigQuery が自動的に有効になります。既存のプロジェクトで BigQuery を有効にするには、

    Enable the BigQuery API.

    Enable the API

    に移動します。

必要な権限

  • データセットを作成するには、bigquery.datasets.create IAM 権限が必要です。
  • 接続リソースを作成するには、次の権限が必要です。

    • bigquery.connections.create
    • bigquery.connections.get
  • モデルを作成するには、次の権限が必要です。

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • 推論を実行するには、次の権限が必要です。

    • bigquery.models.getData
    • bigquery.jobs.create

BigQuery における IAM ロールと権限の詳細については、IAM の概要をご覧ください。

データセットの作成

ML モデルを格納する BigQuery データセットを作成します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] ページに移動

  2. [エクスプローラ] ペインで、プロジェクト名をクリックします。

  3. 「アクションを表示」> [データセットを作成] をクリックします。

    データセットを作成する。

  4. [データセットを作成する] ページで、次の操作を行います。

    • [データセット ID] に「bqml_tutorial」と入力します。

    • [ロケーション タイプ] で [マルチリージョン] を選択してから、[US (米国の複数のリージョン)] を選択します。

      一般公開データセットは US マルチリージョンに保存されています。わかりやすくするため、データセットを同じロケーションに保存します。

    • 残りのデフォルトの設定は変更せず、[データセットを作成] をクリックします。

      データセットの作成ページ

Movielens データをアップロードする

bq コマンドライン ツールを使用して、movielens1m データを BigQuery にアップロードします。

movielens1m データをアップロードする手順は次のとおりです。

  1. Cloud Shell を開きます。

    Cloud Shell をアクティブにする

  2. 評価データを ratings テーブルにアップロードします。コマンドラインで、次のクエリを貼り付けて Enter キーを押します。

    curl -O 'http://files.grouplens.org/datasets/movielens/ml-1m.zip'
    unzip ml-1m.zip
    sed 's/::/,/g' ml-1m/ratings.dat > ratings.csv
    bq load --source_format=CSV bqml_tutorial.ratings ratings.csv \
      user_id:INT64,item_id:INT64,rating:FLOAT64,timestamp:TIMESTAMP
    
  3. 映画データを movies テーブルにアップロードします。コマンドラインで次のクエリを貼り付け、Enter キーを押します。

    sed 's/::/@/g' ml-1m/movies.dat > movie_titles.csv
    bq load --source_format=CSV --field_delimiter=@ \
    bqml_tutorial.movies movie_titles.csv \
    movie_id:INT64,movie_title:STRING,genre:STRING
    

モデルを作成する

行列分解モデルを作成し、ratings テーブルのデータをトレーニングします。このモデルは、ユーザーが提供した映画の評価に基づいて、すべてのユーザー - アイテム ペアの評価を予測するようにトレーニングされています。

次の CREATE MODEL ステートメントは、これらの列を使用して推奨事項を生成します。

  • user_id - ユーザー ID。
  • item_id - 映画 ID。
  • rating - ユーザーがアイテムに与えた 1 ~ 5 の明示的な評価。

モデルを作成する手順は次のとおりです。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    BigQuery に移動

  2. クエリエディタに次のクエリを貼り付け、[実行] をクリックします。

    CREATE OR REPLACE MODEL `bqml_tutorial.mf_explicit`
      OPTIONS (
        MODEL_TYPE = 'matrix_factorization',
        FEEDBACK_TYPE = 'explicit',
        USER_COL = 'user_id',
        ITEM_COL = 'item_id',
        L2_REG = 9.83,
        NUM_FACTORS = 34)
    AS
    SELECT
      user_id,
      item_id,
      rating
    FROM `bqml_tutorial.ratings`;

    クエリが完了するまでに約 10 分かかります。完了すると、mf_explicit モデルが [エクスプローラ] ペインに表示されます。クエリは CREATE MODEL ステートメントを使用してモデルを作成するため、クエリの結果は表示されません。

トレーニングの統計情報を取得する

必要に応じて、Google Cloud コンソールでモデルのトレーニング統計情報を表示できます。

機械学習アルゴリズムは、さまざまなパラメータを使用してモデルを反復処理し、損失を最小限に抑えるモデルのバージョンを選択することでモデルを構築します。このプロセスを経験損失最小化と呼びます。モデルのトレーニング統計情報では、モデルの各反復処理に関連付けられた損失を確認できます。

モデルのトレーニング統計情報を表示する手順は次のとおりです。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    BigQuery に移動

  2. [エクスプローラ] ペインでプロジェクトを開き、bqml_tutorial データセットを開き、[モデル] フォルダを開きます。

  3. mf_explicit モデルをクリックし、[トレーニング] タブをクリックします。

  4. [表示形式] セクションで、[テーブル] をクリックします。結果は次のようになります。

    +-----------+--------------------+--------------------+
    | Iteration | Training Data Loss | Duration (seconds) |
    +-----------+--------------------+--------------------+
    |  11       | 0.3943             | 42.59              |
    +-----------+--------------------+--------------------+
    |  10       | 0.3979             | 27.37              |
    +-----------+--------------------+--------------------+
    |   9       | 0.4038             | 40.79              |
    +-----------+--------------------+--------------------+
    |  ...      | ...                | ...                |
    +-----------+--------------------+--------------------+
    

    [トレーニング データの損失] 列は、モデルのトレーニング後に計算された損失指標を表します。これは行列分解モデルであるため、この列には平均二乗誤差が表示されます。

ML.TRAINING_INFO 関数を使用して、モデルのトレーニング統計情報を確認することもできます。

モデルを評価する

ML.EVALUATE 関数を使用してモデルのパフォーマンスを評価します。ML.EVALUATE 関数は、モデルから返された予測映画評価を、トレーニング データの実際のユーザー映画評価と比較して評価します。

モデルを評価する手順は次のとおりです。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    BigQuery に移動

  2. クエリエディタに次のクエリを貼り付け、[実行] をクリックします。

    SELECT
      *
    FROM
      ML.EVALUATE(
        MODEL `bqml_tutorial.mf_explicit`,
        (
          SELECT
            user_id,
            item_id,
            rating
          FROM
            `bqml_tutorial.ratings`
        ));

    結果は次のようになります。

    +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+
    | mean_absolute_error | mean_squared_error  | mean_squared_log_error | median_absolute_error |      r2_score      | explained_variance |
    +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+
    | 0.48494444327829156 | 0.39433706592870565 |   0.025437895793637522 |   0.39017059802629905 | 0.6840033369412044 | 0.6840033369412264 |
    +---------------------+---------------------+------------------------+-----------------------+--------------------+--------------------+
    

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

    ML.EVALUATE 関数の出力の詳細については、行列分解モデルをご覧ください。

また、入力データを指定せずに ML.EVALUATE を呼び出すこともできます。これはトレーニングで計算された評価指標を使用します。

ユーザー / アイテムペアのサブセットの予測評価を取得する

ML.RECOMMEND を使用して、5 人のユーザーが各映画に付けた評価の予測値を取得します。

予測レーティングを取得する手順は次のとおりです。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    BigQuery に移動

  2. クエリエディタに次のクエリを貼り付け、[実行] をクリックします。

    SELECT
      *
    FROM
      ML.RECOMMEND(
        MODEL `bqml_tutorial.mf_explicit`,
        (
          SELECT
            user_id
          FROM
            `bqml_tutorial.ratings`
          LIMIT 5
        ));

    結果は次のようになります。

    +--------------------+---------+---------+
    | predicted_rating   | user_id | item_id |
    +--------------------+---------+---------+
    | 4.2125303962491873 | 4       | 3169    |
    +--------------------+---------+---------+
    | 4.8068920531981263 | 4       | 3739    |
    +--------------------+---------+---------+
    | 3.8742203494732403 | 4       | 3574    |
    +--------------------+---------+---------+
    | ...                | ...     | ...     |
    +--------------------+---------+---------+
    

レコメンデーションの生成

予測された評価を使用して、各ユーザーの上位 5 つのおすすめ映画を生成します。

推奨事項を生成する手順は次のとおりです。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    BigQuery に移動

  2. 予測された評価をテーブルに書き込みます。クエリエディタに次のクエリを貼り付け、[実行] をクリックします。

    CREATE OR REPLACE TABLE `bqml_tutorial.recommend`
    AS
    SELECT
      *
    FROM
      ML.RECOMMEND(MODEL `bqml_tutorial.mf_explicit`);
  3. 予測された評価を映画情報と結合し、ユーザーごとに上位 5 件の結果を選択します。クエリエディタに次のクエリを貼り付け、[実行] をクリックします。

    SELECT
      user_id,
      ARRAY_AGG(STRUCT(movie_title, genre, predicted_rating) ORDER BY predicted_rating DESC LIMIT 5)
    FROM
      (
        SELECT
          user_id,
          item_id,
          predicted_rating,
          movie_title,
          genre
        FROM
          `bqml_tutorial.recommend`
        JOIN
          `bqml_tutorial.movies`
          ON
            item_id = movie_id
      )
    GROUP BY
      user_id;

    結果は次のようになります。

    +---------+-------------------------------------+------------------------+--------------------+
    | user_id | f0_movie_title                      | f0_genre               | predicted_rating   |
    +---------+-------------------------------------+------------------------+--------------------+
    | 4597    | Song of Freedom (1936)              | Drama                  | 6.8495752907364009 |
    |         | I Went Down (1997)                  | Action/Comedy/Crime    | 6.7203235758772877 |
    |         | Men With Guns (1997)                | Action/Drama           | 6.399407352232001  |
    |         | Kid, The (1921)                     | Action                 | 6.1952890198126731 |
    |         | Hype! (1996)                        | Documentary            | 6.1895766097451475 |
    +---------+-------------------------------------+------------------------+--------------------+
    | 5349    | Fandango (1985)                     | Comedy                 | 9.944574012151549  |
    |         | Breakfast of Champions (1999)       | Comedy                 | 9.55661860430112   |
    |         | Funny Bones (1995)                  | Comedy                 | 9.52778917835076   |
    |         | Paradise Road (1997)                | Drama/War              | 9.1643621767929133 |
    |         | Surviving Picasso (1996)            | Drama                  | 8.807353289233772  |
    +---------+-------------------------------------+------------------------+--------------------+
    | ...     | ...                                 | ...                    | ...                |
    +---------+-------------------------------------+------------------------+--------------------+
    

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

  • 作成したプロジェクトを削除する。
  • または、プロジェクトを保存して、データセットを削除する。

データセットを削除する

プロジェクトを削除すると、プロジェクト内のデータセットとテーブルがすべて削除されます。プロジェクトを再利用する場合は、このチュートリアルで作成したデータセットを削除できます。

  1. 必要に応じて、Google Cloud コンソールで BigQuery ページを開きます。

    BigQuery ページに移動

  2. ナビゲーションで、作成した bqml_tutorial データセットをクリックします。

  3. ウィンドウの右側にある [データセットを削除] をクリックします。この操作を行うと、データセット、テーブル、すべてのデータが削除されます。

  4. [データセットの削除] ダイアログ ボックスでデータセットの名前(bqml_tutorial)を入力し、[削除] をクリックして確定します。

プロジェクトの削除

プロジェクトを削除するには:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

次のステップ