Databricksにおけるレコメンデーションシステムのwide-and-deepモデルの構築とサービング

[Build and serve a wide\-and\-deep model in a recommender system \| Databricks on AWS](https://docs.databricks.com/machine-learning/reference-solutions/recommender-wide-n-deep.html) [2022/9/23時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

レコメンデーションシステム機械学習パイプラインの構築には、通常は以下のステージが含まれます。
![](https://docs.databricks.com/_images/wide-and-deep-recommender-diagram.png)

このリファレンスソリューションでは青色のステージをカバーしています。([本書でカバーされていないトピックは？](#本書でカバーされていないトピックは)をご覧下さい)


# Databricksツールのハイライト

このノートブックでは、機械学習パイプラインの構築をシンプルにするための、いくつかのDatabricksのツールをカバーしています。

- [SparkDatasetConverter](https://qiita.com/taka_yayoi/items/33086561e44c4eee027c#petastorm%E3%82%92%E7%94%A8%E3%81%84%E3%81%9Fspark%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%81%8B%E3%82%89%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%89)
- [MLflowモデルレジストリ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995)
- [MLflowモデルサービング](https://qiita.com/taka_yayoi/items/b5a5f83beb4c532cf921)

# データ

このノートブックで使用するデータは以下のDeltaテーブルから構成されています:

- `user_profile`: `user_id`の値と静的なプロファイルを格納。
- `item_profile`: `item_id`の値と静的なプロファイルを格納。
- `user_item_interaction`: ユーザーとアイテムのインタラクションがあったイベントを格納。このテーブルは、モデルを構築、評価するために3つのDeltaテーブルに分割されます: `train`, `validation`, `test`

このデータのフォーマットはレコメンデーションの問題においては一般的なものです。いくつかのサンプルとしては:

- 広告のレコメンデーションにおいては、アイテムが広告で、ユーザー・アイテムのインタラクションはユーザーによる広告のクリックの記録です。
- オンラインショッピングのレコメンデーションにおいては、アイテムは商品で、ユーザー・アイテムのインタラクションはユーザーのレビューや注文の履歴です。

ご自身のデータセットにノートブックを対応させるには、ご自身のデータをDeltaテーブルに保存し、テーブル名とロケーションを指定するだけです。データロードのコードは大部分を再利用することができます。

データセット生成ノートブックの詳細を見ていきましょう。

## データセットの生成・保存用ノートブック

https://github.com/taka-yayoi/public_repo_2/blob/master/recommendation/01-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E7%94%9F%E6%88%90%E3%81%A8%E4%BF%9D%E5%AD%98.py

# モデル

このノートブックではwide-and-deepモデルを使用します([論文](https://arxiv.org/abs/1606.07792) | [tensorflowの実装](https://www.tensorflow.org/api_docs/python/tf/estimator/DNNLinearCombinedClassifier))。これは記憶と汎化の両方を取り扱うためにwideな線形モデルとdeepなニューラルネットワークを組み合わせた人気のモデルです。

このモデルは、レコメンデーション問題に対応する数多くのディープラーニングや
一般的な機械学習パイプラインの中の一つの例です。ここでのフォーカスは、どの様にワークフローを構築するのかを説明することです。ご自身のユースケースに応じて別のモデルに切り替えたり、さらに良い評価指標のためにモデルをチューニングすることができます。

## レコメンデーションシステムにおけるwide-and-deepモデルの構築・サービング用ノートブック

https://github.com/taka-yayoi/public_repo_2/blob/master/recommendation/02-wide-and-deep%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E6%A7%8B%E7%AF%89%E3%81%A8%E3%82%B5%E3%83%BC%E3%83%93%E3%83%B3%E3%82%B0.py

# 本書でカバーされていないトピックは？

ここでのノートブックのフォーカスはレコメンデーションシステムの実装方法の説明なので、以下のステージはカバーされていません。これらのステージは、ワークフロー図で灰色のブロックとなっています。

1. データ収集と探索的データ分析。[Databricksで初めてのETLワークロードを実行する](https://qiita.com/taka_yayoi/items/e27fd8b44308ea4ec8d8)をご覧ください。
1. 特徴量エンジニアリング。レコメンデーションシステムにおいて特徴量エンジニアリングは重要な位置を占めており、このトピックに関しては数多くの情報が存在します。このノートブックでは、キュレーションされたユーザー・アイテムインタラクションのデータセットがあることを前提としています。このノートブックd使用したデータセットの詳細については、[データ](#データ)を参照ください。特徴量エンジニアリングの詳細に関しては以下のリソースを活用ください。
    - Databricksのソリューションアクセラレータ[Personalizing the Customer Experience with Recommendations](https://databricks.com/blog/2020/12/18/personalizing-the-customer-experience-with-recommendations.html)では、レコメンデーションシステムにおける特徴量エンジニアリングのサンプルを説明しています。
    - scikit-learn、MLlib、転送学習を用いた特徴量エンジニアリングのサンプルについては、[Preprocess data](https://docs.databricks.com/machine-learning/preprocess-data/index.html)をご覧下さい。
1. モデルチューニング。モデルのパフォーマンスを改善するためのモデルチューニングには、特徴量エンジニアリング、モデルの構造、モデルのハイパーパラメータ、さらにはデータ収集ステージのアップデートを含む既存パイプラインのコードの改善が関連します。Databricksにおけるモデルチューニングのためのツールの詳細に関しては、[Databricksにおけるハイパーパラメーターチューニング](https://qiita.com/taka_yayoi/items/ac30f00aa851707c0dbf)をご覧ください。


### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)