私は食品を販売する e ショップを開発しています。ユーザーがカートに既に持っているものに基づいて、他に何を購入できるかを提案する提案ボックスが必要です。彼がビールを持っているなら、彼もそれを買う確率の割合を下げてチップスなどを提案してほしい. しかし、私のアルゴリズムが、すべてのユーザーの以前の購入に基づいて食料品を提案することを学習することを望んでいます。どこから始めればよいですか?食料品のテーブルuser_id
、item_id
などがdate
あります。不可能なブルートフォースなしで提案ボックスを作成するにはどうすればよいですか。
12 に答える
あなたが説明しているのはレコメンデーション エンジンです。より具体的には協調フィルタリング。これは、Amazon の「x を購入した人は y も購入した」機能の心臓部であり、Netflix のレコメンデーション エンジンです。
それは重要な仕事です。たとえば、リモートでさえ役立つものを手に入れるには、そもそも e コマース サイトを構築する以上のことが簡単に必要になる可能性があります。
例えば:
- すでにバスケットに入っているアイテムを推奨したくありません。
- すでにバスケットに入っているものの安価なバージョンを推奨したくありません。
- 在庫切れの商品はおすすめしたくありません。
- 統計的に有効であるが意味のない商品を推奨したくありません (「ねえ、おむつを買ったから、ビールを買わないの?」 - スーパーマーケットでは、お父さんが外に出かけるので、統計的な相関関係があるという話があります。夜におむつを購入し、同時に 6 パックを受け取ります)。
- 現在プロモーション中の商品をおすすめしたい
- プロモーション中のアイテムに類似したアイテムを現在推奨したくない場合
私が同様のプロジェクトを試みたとき、技術者ではない人々に、おむつと一緒にビールを勧めるのは適切ではないことをコンピューターが単に理解していないことを説明するのは非常に困難でした. 基本的なソリューションが機能するようになると、除外およびエッジ ケース ロジックの構築に少なくとも同じくらいの時間がかかりました。
現実的には、これらがあなたの選択肢だと思います:
- 関連製品を手動で保守します。時間はかかりますが、奇妙につながる可能性は低いです。
- 市販のソリューションを使用する - SaaS またはこれをサポートする R のようなライブラリを含める。
- (半)ランダムな製品をお勧めします。推奨したい製品のセットを用意し、ランダムに 1 つを選択します。たとえば、プロモーション中の製品、「ベストセラー」リストにある製品、x 未満の価格の製品などです。問題になる可能性のあるカテゴリを除外します。
これらのオプションはすべて妥当な時間内に実現可能です。ゼロから適切なソリューションを構築する際の問題は、誰もがそれを Amazon と比較して評価することです。
これは、データ マイニングのApriori Algorithmによって解決される一般的な問題です。この統計を保持する別のテーブルを作成し、推奨される組み合わせに基づいて提案する必要がある場合があります。
うーん... 製品レコメンデーション エンジンを探しているのですが...基本的には、次の 3 つの種類があります。
- 協調フィルタリング
- コンテンツ ベースのフィルタリング
- ハイブリッド レコメンデーション システム
1 つ目は、ユーザーのアクティビティ、好み、行動などに関するデータを収集して保存します。このデータはエンジンに送信され、ユーザー チャネルに分割されます。各チャネルには、特定の特徴的な好き嫌いがあります。そのため、新しい訪問者がいる場合、その訪問者は分類され、特定のユーザー プロファイルが割り当てられます。すると、このプロフィールの好き嫌いに基づいてアイテムが表示されます。
現在、コンテンツベースのフィルタリングは、ユーザーの以前の閲覧履歴、好み、およびアクティビティのみを考慮して、ソーシャル性の低い別のアプローチを使用しています。基本的に、これにより、このユーザーが以前に気に入った/購入したものに基づいて推奨事項が作成されます。
しかし、なぜそれらの1つだけを選ぶのでしょうか? ハイブリッド レコメンダー システムは、両方を少しずつ使用して、パーソナライズされたソーシャル レコメンデーションを提供します。これらは通常、推奨事項の提供に関してはより正確です。
ユーザーが大量に流入している場合、協調フィルタリングは優れたオプションだと思います。Web サイトにアクセスするユーザーが 1 か月あたり 42 人だけの場合、優れたチャネルを構築するのはちょっと難しいです。コンテンツに基づく 2 番目のオプションは、製品が豊富な小さなサイトに適しています。ただし、私見ですが、3 番目のオプションはあなたに適しています。ユーザーを最初から動かし、ユーザーが生成するすべてのデータを収集するものを構築します。 、将来的には、アマゾンのようなレコメンデーション体験を提供できるようになります!
これらの 1 つを作成するのは簡単なことではありません。既にご存じのことと思いますが、過去に私のために実際に得たこの本 (個人履歴のフィルタリングを使用して!) を強くお勧めします: http://www .amazon.com/Algorithms-Intelligent-Web-Haralambos-Marmanis/dp/1933988665
頑張って、良い学習を!
アイテムを分類し、その情報を使用して選択するのが最善のアプローチだと思います。
私は食料品のウェブサイトでこれを行いましたが、結果は非常にうまくいきました. アイデアは、グループ項目をいくつかのカテゴリに交差させることです。
たとえば、バナナを取ります。果物ですが、朝食にコーンフレークやシリアルと一緒に食べるのも一般的です。シリアルも朝食用食品ですが、健康食品と見なされるものもあれば、甘いおやつと見なされるものもあります.
この種のアプローチを使用すると、次のようなテーブルの作成をすぐに開始できます。
Item | Category
-------------+------------
Banana | Breakfast
Banana | Quick
Banana | Fruit
Banana | Healthy
Museli | Breakfast
Museli | Healthy
Sugar Puffs | Breakfast
Sugar Puffs | Treat
Kiwi Fruit | Fruit
Kiwi Fruit | Healtyh
Kiwi Fruit | Dessert
Milk | Breakfast
このような簡単なルックアップを使用すると、これらのグループ化に基づいて提案する良いアイテムを簡単に見つけることができます.
誰かのバスケットにバナナ、ムゼリ、シュガーパフが入っているとしましょう。
それは3つの朝食アイテムで、2つは健康的で、1つはそれほど多くありません.
3 つすべてに一致するため、ミルクを提案します。衝動買いしない?もう一度やり直して、キウイ フルーツを入れてみてください。などなど。
ここでの考え方は、多くの異なるカテゴリ (特に、直接的には明らかでないもの) にわたってアイテムを照合し、これらのカウントを使用して顧客に最適なアイテムを提案することです。
同じ商品を購入した他の顧客のショッピング購買習慣に基づいてクロスセルを作成します。データベース (orders テーブル) にこの購入履歴があるとします。
- ビール、チップス、ソーダ
- ビール、ソーダ
- ソーダ、ケーキ
- チップス、ビール
- ケーキ、チップス、ビール
次に、顧客のカートにビールが入っている場合、顧客の買い物習慣に基づいて簡単にクエリを実行し、ビール関連のアイテムが次のように表示されることを確認できます。
- チップス(3回)
- ソーダ(2回)
- ケーキ(1回)
次に、おそらくポテトチップスとソーダを提案できます...購入履歴が多いほど、システムはより正確な提案を行います.
おそらく、Non-negative Matrix Factorization Algorithm が気に入るはずです。これは、探していることを正確に行うことができます (Neville K が言及したもの以外に)。購入した食料品を含むデータベース テーブルは、因数分解するマトリックスになります。1 つの要因は、人々が一緒に購入したものを含むマトリックスになります。このマトリックスは、各食料品を他のすべての食料品と比較するマトリックスよりもはるかに小さくなります。Fluffeh が提案するカテゴリのように、一緒にうまくいく食料品の「グループ」を自動的に見つけます。実行する手順:
- 毎日または毎週: 購入した食料品テーブルで因数分解を実行して、新しい「傾向」を見つけます。因子行列を保存します。
- 新しいショッピング カートが到着した場合: カートをパラメーターとしてソルバーを呼び出すと、ぴったり収まる商品で強化されたカートが得られます。まだカートに入っていないものを提案してください。
誰かが既に Book Programming Collective Intelligenceについて言及しています。それは良いスタートです。
そのための最良の方法は「タグパターン」を使うことだと思います。例えば:
products Table:
=================================
product_id
product_name
tags Table:
=================================
tag_id
tag_name
tags_products Table:
=================================
id_product
id_tag
products registry example:
=================================
1 | Beer
2 | Chips
3 | Cake
tags registry example:
=================================
1 | beer
2 | chips
3 | cake
tags_products registry example:
=================================
1 | 2
1 | 3
2 | 1
2 | 3
3 | 1
次に、必要なものをすべて関連付けて、簡単にクエリを実行できます:)
幸せになる。
グレッティング。
あなたの質問に対する有意義な答えを探していたところ、次のドキュメントに出会いました。
ドキュメントの一部しか読んでいませんが、質問に対する理論的な回答のようです。お役に立てば幸いです。
以前の購入に基づいてさまざまな製品を組み合わせることを学習する人工ニューラル ネットワークを使用できます。
このトピックに関する 2 つのリソースを次に示します。
上記の誰もが言うように、これを機能させるための鍵は、
「x ユーザー」は「y アイテム」も購入しました
基本的に、既存のデータベースでテーブルの行と列を増やして実験するか、人々が閲覧する製品に関する統計データを保持する新しいリンクを作成する必要があります。必要な非常に重要な列の 1 つは、評価またはいいね (Facebook のいいねではありません) です。
次のような新しいテーブルが必要になります。
- 友達テーブル (user_ID をリンクして「友達」を形成します)
- Like テーブル (Friends テーブルと Product テーブルをリンクして、「一致する」製品を作成します)
- 統計テーブル (Like テーブルと Product テーブルにリンクされます)
次のような追加の列で既存のテーブルを更新する必要もあります。
- 製品ごとの average_rating (0-5/0-10/0-100 など 0/1) の Product_table
ユーザー xとユーザー yが友達の場合、友達テーブルで ID が一致します。Like テーブルは、2 人のユーザーが友人で、次のいずれかの製品 zが好きな製品を取ります: (評価 0-5/0-10/0-100; like 0/1)どちらの方法を決定するか。
製品がいいね/評価されている場合、その ID には特定の列名の製品評価が付けられ、その評価または評価に応じて +X または -X で更新されます。また、製品が評価されているか、好かれているかどうかを平均的に判断する必要があります。例としては、評価が 50%、いいねが 100 のようなものがあります。
これがすべて完了したら、ユーザー x が製品を購入したときに、次のことを照合できます。
- ユーザーには友達がいます
- ユーザーの友人も製品 y を購入しました
- 製品 y に対する友人の評価/評価は?
- ユーザー x の友人が高く評価した、または気に入った他の製品はどれですか
- ユーザー x の友人が悪いと評価した、または気に入らなかった他の製品はどれですか
製品を提案するだけでなく、多くのことができます。ほんの少しの努力で、人々やその友人にホットな取引をすることができます。新製品が市場に登場し、製品 z と同様に、より良いだけです。X 人とその友人全員が製品 z を気に入った場合、彼らは新製品を気に入って購入する可能性があります。
1 - 例として、各製品を 3 層のカテゴリ (タイプ/機能/価格) として分類します。これにより、特定の製品が選択された場合、他のすべてのカテゴリを無視することができ、時間と労力を節約できます。次に、同じ製品からランダムな製品を選択できます (タイプ/機能/価格) 提案ボックスに入れます。
これは、理論的なマシン インテリジェンスや複雑なアルゴリズムのコーディングに煩わされたくない場合です。
ごきげんよう :)
これを行うには、次の 2 つの基本的な方法があります。
- データベース内の項目を手動で相互に関連付けます (時間はかかりますが柔軟です)。
- 過去の購入に基づいて、他の人がどのアイテムを購入したかを自動的に判断します。
後者に傾いているようです。さまざまなアイテムを販売し、他の顧客の過去の購入に基づいて関連アイテムを提案するサイトについて、このようなことを書きました。私が使用するクエリは次のとおりです。
SELECT items.*, COUNT( cartitems.itemid ) AS c FROM
items
LEFT JOIN cartitems ON ( cartitems.itemid = items.id )
LEFT JOIN carts ON ( carts.id = cartitems.cartid )
WHERE (
carts.id IN (
/* Every cart with this item: */
SELECT cartitems.cartid
FROM cartitems
WHERE ( cartitems.itemid = 123456 )
)
AND
( cartitems.itemid != 123456 ) /* Items other than this one */
AND
carts.checkedout = TRUE /* Carts that have checked out */
)
GROUP BY cartitems.itemid
ORDER BY c DESC
LIMIT 5
この例では、ユーザーが見ているアイテムの ID が 123456 であると想定しています。「カート」テーブルには、過去の購入が含まれています。「cartitems」テーブルには、過去に購入された個々のアイテムが含まれています。