PAIでレコメンデーション①

作成日:2019-12-26

PAIで商品をレコメンドする機械学習モデルを作ってみた

本記事では、PAI(Machine Learning Platform for AI)を使って、商品をレコメンドする機械学習モデルを作る方法をご紹介します。

PAI(Machine Learning Platform for AI)とは

PAI(Machine Learning Platform for AI)はAlibaba Cloudのオールインワン機械学習サービスです。
Alibaba Cloudが展開しているMLaaS(Machine Learning as a Service)であり、機械学習を従量課金制で利用することができます。

機械学習をいざ始めようとすると、プログラミングスキルや様々なライブラリの知識に加え、数学の知識も必要です。
そのため、未経験で機械学習を始めると形にするまでとても先が長いように感じます。

しかし、PAIを利用すれば機械学習専門のエンジニアでなくても比較的容易に製品の推奨、財務リスク管理、画像識別、音声認識などのサービスを迅速に構築し、人工知能を実装することが可能です。
なぜなら、PAIでは機械学習に必要なアルゴリズムがモジュール化されているのでコードを書く必要がなく、GUIによる直感的な設定が可能です。

PAIの構成

PAIは複数のコンポーネントによって構成されています。

PAI Studio

PAI-Studioは、GUIで直感的に操作が可能な機械学習モデル開発環境です。
200以上のアルゴリズムがモジュール化されており、Drag&Dropで配置できます。
アルゴリズムのパラメータはシンプルで分かりやすいGUIで設定が可能なため、専門的な知識を必要とせずに短時間で機械学習モデルを作成することができます。

PAI DSW

PAI DSW(Data Science Workshop)は、開発者が直接コードを記述することが可能な機械学習モデル開発環境です。
PAIチームによって最適化された組み込みのTensorflowフレームワークを使用しており、DSWターミナルを開いてサードパーティライブラリをインストールすることも可能です。

PAI EAS

PAI EAS(Elastic Algorithm Service)は、PAI StudioもしくはPAI DSWで作成した機械学習モデルをオンラインのRESTful APIとしてデプロイします。
Alibaba Cloudが展開しているリソースモニタリングやBlue-Greenデプロイ、バージョン管理機能などにより、高い同時実行性でのデプロイが可能です。

PAIで機械学習モデルを作るまでの流れ

実際にPAIで機械学習モデルを作るまでのステップは以下です。

  1. 利用するサービスを決定する(GUIで設定可能なPAI Studioもしくはコーディングで実装するPAI DSW)
  2. 利用するサービスのプロジェクトを作成する
  3. サービスごとの手法に沿って機械学習モデルを作成する

PAIに関するより詳しい情報は公式ドキュメントを参照してください。

https://www.alibabacloud.com/help/product/30347.htm

この記事でやること

この記事では、以下の流れで商品をレコメンドする機械学習モデルを作成&解説していきます。

  1. PAIで処理を実装するための事前準備
  2. テンプレートを利用して一瞬で処理を実装
  3. 実装した処理を動かしてみる
  4. 処理内容の確認

使用するテンプレートに関する公式ドキュメントは以下になります。

https://www.alibabacloud.com/help/doc-detail/67394.htm

PAIで処理を実装するための事前準備

PAIを使う前に

PAIの利用前に以下が必要となります。

国際サイトのAlibaba Cloudアカウント取得

上記にも記載したとおり、PAIは日本サイトではまだ公開されていません。
本記事の作業実施前に国際サイトの登録を済ませ、Alibaba Cloudコンソールが利用できる状態になっている必要があります。

PAIを購入するリージョンでMaxComputeを有効化

PAIでは、モジュール化されたアルゴリズム等のリソースとしてMaxComputeを使用します。
そのため、PAIを購入後プロジェクト作成する際にMaxComputeが有効化されている必要があります。
現時点(2019/12/12)ではPAIはJapanリージョンでは正しく動作しないため、本記事ではSingaporeリージョンで作業を行います。

この作業はPAI購入後、プロジェクト作成前に行えば問題ありません。

PAIの購入

PAIを購入します。

Alibaba Cloudの国際サイトのコンソール画面へログインし、Machine Learning画面を開きます。

img

画面を開いたらBuy Nowをクリックします。 以下の画面が表示されたら項目を設定します。

①:リージョンはAsia Pacific SE1 (Singapore)を選択します。

他の項目は選択肢が1つのみのため、デフォルトのまま②今すぐ購入をクリックします。

Jpan(Tokyo)を選択して購入することは可能ですが、PAIはJpanリージョンでは対応していないため他のリージョンを選択してください。 少なくともSingaporeリージョンで購入すれば本記事の作業は完遂できます。

img

プロジェクトの作成

プロジェクトを作成します。

Machine Learning画面左に表示されるメニューからStudio-Modeling Visualizationを選択します。

img

画面上部に表示されるリージョンが、PAIを購入したリージョンでなかった場合は変更します。

img

Create Projectをクリックします。

img

プロジェクトの各項目を設定します。

①:MaxComputeの課金タイプを選択します。今回の作業はお試しのため、従量課金を選択します。
②:任意のプロジェクト名を入力します。
AliasおよびProject Descriptionは任意の項目です。

①、②を設定したら③OKをクリックします。

※PAIを購入したリージョンでMaxComputeが有効化されていない場合はプロジェクトを作成できません。
MaxComputeの課金タイプが選択できない場合はMaxComputeを有効化してからプロジェクトを作成してください。

img

プロジェクトが作成されたことを確認します。

img

以上で事前準備が完了です。

テンプレートを利用した処理の実装

準備が整いましたので、処理の実装を行います。

先ほど作成したプロジェクトのOperation列のMachine Learningをクリックします。

img

新しいタブで以下の画面が開きます。
左に表示されるインデックスのHomeをクリックします。

img

テンプレートが複数表示されるので、[Recommended Algorithms] Product RecommendationCreateをクリックします。

img

New Experiment画面が表示されるので、①Nameに任意の名前を入力し、②Createをクリックします。
DescriptionおよびSave Toは必要に応じて設定してください。

img

作成が完了するとフローチャートのような図が表示されます。
これで処理の実装は完了です。
一瞬で終わりましたね。

※下図は左に表示されるインデックスのExperimentsData SourceComponentsModelsのいずれかを選択していると表示されます。
図が表示されない場合はインデックスを確認して下さい。

img

商品レコメンド処理を動かしてみる

それではさっそく、テンプレートから作った処理を動かしてみましょう。

画面上部のRunをクリックします。

img

動き出すと完了したコンポーネントに緑のチェックマークが表示され、次のコンポーネントが開始されるまでの間、は緑の点線になります。

img

5分ほどですべて完了しました。

img

処理の実装から実行まで、あっという間にできました。

処理内容の確認

さて、テンプレートで実装した処理の内容について、公式ドキュメントにも説明があるにはありますが、少しわかりにくかったので改めて確認していきます。

インプットデータ

今回作成した機械学習モデルのインプットデータは、Alibaba Cloudによって提供されているcf_data_traincd_data_resultテーブルです。
他にも複数のテーブルがAlibaba Cloudから提供されており、PAI Studioプロジェクトを作成した時点で使用可能な状態となっています。

左に表示されるインデックスのData Sourceを選択しPublic Tablesを開くと、提供されているテーブルが確認できます。

img

cf_data_trainおよびcd_data_resultのテーブル定義は以下です。
いずれもユーザが商品対して行ったアクション履歴のデータですが、cf_data_trainテーブルは6月までのデータであり、cd_data_resultテーブルは7月以降のデータです。

img

処理の概要

処理の概要を簡単に説明します。

この処理では、ユーザが商品対して行った6月までのアクション履歴と7月以降のアクション履歴をインプットとしており、処理の目的は主に以下の2点です。

  1. 6月までのアクション履歴から、どのユーザにどの商品をレコメンドするのか決定する
  2. 1.でレコメンド対象となった商品が7月以降にどの程度購入されたのか確認する

具体的にどのような処理を行っているか、コンポーネントを4つ分けて説明します。

1⃣:6月までのアクション履歴をもとに、どの商品を買ったユーザにどの商品をレコメンドするのかを算出する

2⃣:7月以降のアクション履歴をもとに、7月以降に購入された商品のうち、1⃣で算出したレコメンド対象の商品と合致するデータを抽出する

3⃣:1⃣(6月までのアクション履歴から算出したレコメンド対象商品データ)を整形(重複データを削除)する
整形したデータの基本統計量を算出し、列ごとのデータ数や最大値、最小値などのデータ特性を取得する

4⃣:2⃣(購入されたレコメンド対象商品データ)を整形(重複データを削除)する
整形したデータの基本統計量を算出し、列ごとのデータ数や最大値、最小値などのデータ特性を取得する

img

1⃣6月までのアクション履歴からレコメンド対象商品データを算出

1⃣では以下を行っています。

  1. 6月までのアクション履歴をデータベースから読み込む。
  2. 状態が購入済のレコードのみを抽出する。
  3. どのユーザがどの商品を購入したかという情報をもとに、それぞれの商品に最も類似している商品を導き出す。(アイテムベースの協調フィルタリング)
    アウトプットはユーザID、商品ID、類似商品ID。
  4. 3.のデータを整形する。
  5. 1.のデータと4.のデータを内部結合する(キーはそれぞれの商品ID)。
    アウトプットはユーザID、商品ID、類似商品ID。

img

文章だけではわかりづらいので、それぞれの処理の設定を見ていきましょう。

6月までのアクション履歴をデータベースから読み込む

PAIではRead MaxCompute Tableコンポーネントによって、MaxComputeのデータベースからテーブルを読み込むことが可能です。
設定を確認するため、Read MaxCompute Tableコンポーネントをクリックします。

img

右側に設定画面が表示されます。
Table Selectionタブをクリックすると読み込むテーブルが確認でき、Column Informationタブをクリックするとテーブルの列情報が確認できます。
また、他のコンポーネントのでも同様ですが、設定画面の下に表示されるコンポーネント名Read MaxCompute Tableをクリックすると、コンポーネントの概要が確認できます。

img

コンポーネントを右クリックしView Dataをクリックすると、コンポーネントの処理完了後のアウトプットデータを100レコードまで確認することができます。
こちらも他のコンポーネントでも同様の機能です。

img

状態が購入済のレコードのみを抽出

SQL ScriptコンポーネントではSQL文を使用することが可能です。
先ほどと同様にコンポーネントをクリックして設定画面を開きます。

img

設定画面上部のInput Sourceでは、で繋がれたインプットデータがt1 t2 t3 t4として自動的にマッピングされます。
これにより、SQL文を入力する際に実際のテーブル名ではなく${t1}と表すことが可能です。
テンプレートではインプットが1つのため、t1にのみマッピングされています。

SQL文は画面下部に表示されていますが、見えづらいためMaximizeをクリックします。

img

SQL文はこの画面で編集可能です。
テンプレートではt1にマッピングされたテーブルから、状態が購入済み(1)のデータのみを抽出するSQL文が確認できます。

img

先ほどと同様にView Dataでコンポーネントの処理結果を参照すると、active_type列が1のレコードのみであることが確認できます。

img

購入データから類似商品を導き出す(アイテムベースの協調フィルタリング)

ここで、今回のメインである協調フィルタリングのコンポーネントが登場します。
誰がどの商品を購入したかという情報をもとに、それぞれの商品に類似している商品を協調フィルタリングで導き出します。
協調フィルタリングのコンポーネントとして、PAIではCollaborative Filteringコンポーネントが用意されています。

img

Collaborative Filteringコンポーネントは同じユーザに購入された商品同士は類似性が高いと判断するアルゴリズムとなっており、いくつか設定項目があります。
メインとなる項目を簡単に説明します。

Fields Settingタブ

①:ユーザ名やユーザIDなど、ユーザを判別する列を設定
②:商品名や商品IDなど、商品を判別する列を設定

Prameters Settingタブ

①:類似度の計算手法を設定します。ここではjaccardを選択しておりますが、他にwbcosineasymcosineがあります。
※jaccardについてはjaccardとはで説明します。
②:類似商品をいくつ求めるかを設定します。ここでは最も類似度の高い1つの商品を求める設定がされています。

img

View Dataでコンポーネントの処理結果を参照します。
ユーザID列が削除され、類似商品列(similarity列)が追加されています。
類似商品列の値は[商品IDと最も類似度の高い商品ID]:[類似度]という構造になっています。
例えば、1レコード目であれば、IDが1000の商品と最も類似性の高い商品のIDは11849であり、その類似度は1となります。

img

jaccardとは

jaccardは、集合Aと集合Bの類似度を集合ABどちらかもしくは両方に含まれる要素うち、集合AB両方に含まれている要素が占める割合によって求める手法です。
言い換えると、2つの集合に共通する要素がどの程度あるのかを調べ、共通要素が多ければ多いほど似ている(類似度が高い)と判断します。
計算式は以下になります。
計算結果は0~1の間であり、1に近ければ近いほど類似度が高いという判断ができます。 img

今回は、各アイテムを集合とし、購入されたユーザを要素としてアイテム同士の類似度を算出しています。
以下のようなアイテムA、アイテムBの類似度を求めるとします。

アイテムA(アイテムAを購入したユーザ)= ["user1","user2","user3","user4"] アイテムB(アイテムBを購入したユーザ)= ["user1","user2","user3","user5","user6","user7"]

img

まず、アイテムABどちらかもしくは両方を購入したユーザの数を求めます。

アイテムABどちらかもしくは両方を購入したユーザの数 = 7("user1","user2","user3","user4","user5","user6","user7")

次に、アイテムABの両方を購入したユーザの数を求めます。

アイテムAB両方を購入したユーザの数 = 3("user1","user2","user3")

最後に、アイテムABどちらかもしくは両方を購入したユーザ(7人)のうち、アイテムAB両方を購入したユーザ(3人)の割合を求めます。

[アイテムAB両方を購入したユーザの数] / [アイテムABどちらかもしくは両方を購入したユーザの数]=3/7(0.4286)よって、アイテムABの類似度は0.4286となります。

類似商品データを整形する

類似商品さえわかれば類似度は不要なため、データから削除します。
データを整形するために再びSQL Scriptコンポーネントを使用します。

img

先ほどと同様の方法でSQL文を確認すると、類似商品列の値のコロンから先を削除し、列名を変更していることが確認できます。

[商品IDと最も類似度の高い商品ID]:[類似度] → [商品IDと最も類似度の高い商品ID]`similarity`列 → `similar_item`列

img

View Dataでコンポーネントの処理結果を参照すると、コロンから先が削除され、列名が変更されていることを確認できます。

img

6月までのアクション履歴と類似商品データを内部結合する

類似商品データだけではどのユーザに商品をレコメンドしてよいのかがわからないため、6月までのアクション履歴と内部結合を行います。
結合はJoinコンポーネントを使用します。

img

各項目について説明します。

①:結合タイプを選択します。ここでは内部結合を意味するInner Joinを選択しています。
②:結合キーを設定します。
③:左のテーブルからアウトプットする列を選択します。
④:右のテーブルからアウトプットする列を選択します。

img

③および④をクリックすると以下のような画面が表示され、チェックボックスをクリックすることで選択が可能です。

img

View Dataでコンポーネントの処理結果を参照します。
どのユーザにどの商品をレコメンドするのかを導き出すことができました。

img

2⃣算出したレコメンド対象商品データのうち7月以降に購入された商品のデータを抽出

2⃣では以下を行っていきます。

  1. 7月以降のアクション履歴をデータベースから読み込む。
  2. 状態が購入済みのレコードのみを抽出する。
  3. 1⃣のデータ(ユーザ毎のレコメンド対象商品データ)と2.のデータを内部結合する
    (キーは「1⃣の類似商品IDと2.の商品ID」と、それぞれのユーザID) 。 アウトプットはユーザID、商品ID(類似商品ID)。

img

7月以降のアクション履歴をデータベースから読み込む

1⃣と同様にRead MaxCompute Tableコンポーネントを使用してデータを読み込みます。

img

View Dataでコンポーネントの処理結果を参照すると、7月以降のアクション履歴が読み込めていることが確認できます。

img

状態が購入済のレコードのみを抽出

1⃣ではSQL Scriptコンポーネントを使用してレコードを抽出しましたが、ここではFiltering and Mappingコンポーネントを使用しています。

img

各項目について説明します。

①:アウトプットする列を選択する。
②:アウトプットするレコードの条件を入力する。ここでは状態が購入済み(1)のレコードのみという条件が入力されています。

img

②をクリックすると以下のような画面が表示され、チェックボックスをクリックすることで選択が可能です。
Joinコンポーネントと同じですね。

img

View Dataでコンポーネントの処理結果を参照すると、選択した列のみがアウトプットされていることを確認できます。(状態が購入済みかどうかはこれだけだとわかりませんが…。)

img

今回は1⃣のようにSQL Scriptコンポーネントを使用してもFiltering and Mappingコンポーネントを使用しても同じようにデータを抽出することができます。(アウトプットする列の指定は微妙に変えてましたが)
Filtering and Mappingコンポーネントのほうが直感的で設定ができ入力ミスが少ないように感じますが、複数のインプットから複雑な条件での抽出はできません。
SQL ScriptコンポーネントではSQL文を自分で用意しなくてはなりませんが、インプットデータを4つまで設定でき、複雑な条件での抽出が可能です。
状況に応じて使い分けるとよさそうですね。

レコメンド対象商品データと7月以降の購入データを結合

6月までのアクション履歴をもとに算出したレコメンド対象商品が7月以降購入されたかどうかを確認するために、内部結合を行います。
1⃣と同様にJoinコンポーネントを使用します。

img

各項目を確認します。

①:内部結合を設定しています。
②:結合キーとしてそれぞれのユーザIDを指定しています。
③:結合キーとしてレコメンド対象商品のIDと7月以降に購入された商品のIDを指定しています。
④:アウトプットする列としてレコメンド対象商品データのユーザIDを指定しています。
⑤:アウトプットする列として7月以降に購入された商品データの商品IDを指定しています。

img

img

View Dataでコンポーネントの処理結果を参照します。
各ユーザがレコメンド対象商品を7月以降に購入したかどうかが判明しました。

img

3⃣レコメンド対象商品データの重複削除と基本統計量の算出

3⃣では以下を行っていきます。

  1. 1⃣のデータ(ユーザ毎のレコメンド対象商品データ)を受け取り、重複レコードを削除する。
  2. 1.のデータの基本統計を算出する。

img

重複レコードの削除

1⃣のユーザ毎のレコメンド対象商品データを受け取り、重複レコードを削除します。
こちらはSQL Scriptコンポーネントを使用しています。

img

SQL文を確認すると、完全一致するレコードを対象に重複削除を行っていることが確認できます。

img

View Dataでコンポーネントの処理結果を参照します。

img

テーブルの基本統計を算出

テーブルの基本統計を算出するには、Full table statisticsコンポーネントを使用します。

img

主な設定項目について説明します。

Fields Settingタブ

①:統計対象とする列を選択します。選択しない場合はデフォルトで全列を対象とします。
ここでは選択していないので、テーブル全体の基本統計を算出します。

img

View Dataでコンポーネントの処理結果を参照すると、ユーザ毎のレコメンド対象商品データの基本統計が算出されていることを確認できます。
count18065となっているので、18065通りのレコメンドが可能です。
※レコメンド対象のユーザとアイテムの組み合わせが18065通りであり、ユーザもしくはアイテムの重複を含みます。

img

4⃣実際に購入されたレコメンド対象商品データの重複削除と基本統計量の算出

4⃣では以下を行っていきます。

  1. 2⃣のデータ(レコメンド対象商品購入実績データ)を受け取り、重複レコードを削除する。
  2. 1.のデータの基本統計を求める。

img

4⃣はインプットが異なるもののほとんど3⃣と同一の処理のため、説明は割愛します。

重複レコードの削除

SQL Scriptコンポーネントを使用します。

img

重複削除のSQL文が設定されています。

img

View Dataでコンポーネントの処理結果を参照します。

img

テーブルの基本統計を算出

Full table statisticsコンポーネントを使用します。

img

統計対象の列を選択していないため、テーブル全体の基本統計を算出します。

img

View Dataでコンポーネントの処理結果を参照すると、ユーザ毎のレコメンド対象商品データの基本統計が算出されていることを確認できます。
count60となっているので、60通りのレコメンドは商品の購入に繋がっていることになります。
※購入に繋がったユーザとアイテムの組み合わせが60通りであり、ユーザもしくはアイテムの重複を含みます。

img

さいごに

以上で、PAIを利用して商品をレコメンドする機械学習モデルの作成がほんの数ステップで完了する方法をご紹介しました。
ただ、今回紹介させていただいたテンプレートで作ったものはあくまでサンプルモデルであって、実用化するには精度が不十分です。

例えば、類似度を求めるときに購入済みのデータのみをインプットとしているため、カートに入っていたりお気に入り登録されている商品の情報は考慮されていません。
また、レコメンドする際も、カートに入れている商品やお気に入り登録している商品、ただ閲覧しただけの商品の全ての類似商品を平等にレコメンドしており優先度づけされていません。

PAIを使いこなすには多少の知識が必要になってきますが、こんな感じでコンポーネントをぺたぺた貼っていけばPAIで機械学習ができるんだ~と思っていただければ幸いです。

もしもPAIのコンポーネントをもっと知りたい!という方がいたら、こちらのドキュメントを参照してください。

https://www.alibabacloud.com/help/doc-detail/69073.htm

Close

Alibaba Cloudを始めてみましょう

ソフトバンクは、Alibaba Cloudのアカウント開設から、サービス展開までをお手伝いします。
Hatena