電子商取引の製品推奨におけるディープラーニングの応用

電子商取引の製品推奨におけるディープラーニングの応用

[[201999]]

1. 共通アルゴリズムルーチン

電子商取引業界では、ユーザーへの商品推奨は常に非常にホットで重要なトピックです。成熟した方法は数多くありますが、それぞれに長所と短所があり、おおよそ次のようになります。

  • 商品の類似性に基づく: たとえば、食品 A と食品 B の場合、価格、味、賞味期限、ブランドなどの要素に基づいて類似性を計算できます。蒸しパンを購入する場合、途中で餃子の箱を家に持ち帰る可能性が高いと考えられます。

メリット: コールドスタート。実際、製品データがあれば、ユーザーデータがあまりないビジネスの初期段階でもレコメンデーションを行うことができます。

デメリット: 前処理が複雑です。どの製品でも、寸法は少なくとも数百になることがあります。計算、設計、エンジニアリングに適切な寸法を選択する方法も非常に重要です。

典型例:Amazonの早期推奨システム

  • 相関ルールに基づく:最も一般的な方法は、ユーザーの購買習慣を利用することです。典型的な例は「ビールおむつ」のケースです。ただし、この方法は実際の運用で最も使用されていません。まず、相関ルールを作成するには、データの量が十分でなければなりません。そうでない場合は、信頼性が低すぎます。データ量が増えると、より優れた方法があります。ハイライトがないと言えます。業界のアルゴリズムには、apriori、ftgrowなどがあります。

利点: シンプルで操作が簡単、すぐに開始でき、導入が非常に便利

デメリット: より多くのデータが必要であり、精度は平均的である

典型例: 初期のオペレーターからのパッケージの推奨

  • アイテムに基づく協調的な推奨: アイテム A は Xiao Zhang、Xiao Ming、Xiao Dong が購入し、アイテム B は Xiao Hong、Xiao Li、Xiao Chen が購入し、アイテム C は Xiao Zhang、Xiao Ming、Xiao Li が購入したとします。直感的に、アイテム A とアイテム C の購入者は (アイテム B と比較して) より類似しています。これで、アイテム C を Xiao Dong に推奨し、アイテム A を Xiao Li に推奨できます。この推奨アルゴリズムは比較的成熟しており、多くの企業で使用されています。

利点: 比較的正確で、結果の解釈性が高く、副産物を使用して製品の人気ランキングを導き出すことができます。

デメリット: 計算が複雑、データ保存のボトルネック、人気のないアイテムの推奨効果が低い

典型例: Yihaodian での早期製品推奨

  • ユーザーベースの協調的推奨: ユーザー A がコーラ、スプライト、鍋の素を購入し、ユーザー B がトイレットペーパー、服、靴を購入し、ユーザー C が鍋、ジュース、セブンアップを購入したとします。直感的に、ユーザー A とユーザー C は (ユーザー B と比較して) より類似しています。これで、ユーザー C が購入した他のものをユーザー A に推奨し、ユーザー A が購入した他のものをユーザー C に推奨することができます。長所と短所はアイテムベースの協調的推奨と同様で、重複はありません。
  • モデルベースの推奨:SVD+、固有値分解などにより、ユーザーの購買行動マトリックスを2組の重みマトリックスの積に分割します。1組のマトリックスはユーザーの行動特性を表し、もう1組のマトリックスは製品の重要度を表します。ユーザー推奨プロセスでは、ユーザーの過去のトレーニングマトリックスに基づいて各製品の可能性を計算して推奨します。

利点: 正確で、人気のない商品に対して非常に優れた推奨効果があります

欠点:計算量が非常に大きく、行列分割の効率と容量のボトルネックは常に制約されている。

標準: HP コンピュータの推奨事項

  • 時系列に基づく推薦:これはかなり特殊です。電子商取引ではあまり使われていませんが、Twitter、Facebook、Doubanでよく使われています。いいねと嫌いしかないコメントをどうやって並べ替えるかということです。詳細については、以前書いた記事を参照してください。応用:推薦システム - ウィルソン間隔法
  • ディープラーニングによるレコメンデーション:人気のCNN(畳み込みニューラルネットワーク)、RNN(再帰型ニューラルネットワーク)、DNN(ディープニューラルネットワーク)はいずれもレコメンデーションに利用されている例がありますが、まだ実験段階です。しかし、word2vecをベースにした比較的成熟した手法があり、本日はこれを中心に紹介します。

利点: 推奨効果は非常に正確で、基本的なストレージリソースが少なくて済みます。

デメリット: エンジニアリングアプリケーションが未熟で、モデルのトレーニングとパラメータ調整の技術が難しい

典型例: Suning.com の会員向け製品推奨

2. item2vecプロジェクトの紹介

Suning は現在、約 4 億点の製品を扱っており、カテゴリは 10,000 を超え、主要カテゴリは 40 近くあります。従来の共同推奨とリアルタイム計算を使用すると、サーバーのコストと計算能力が非常に制限されます。これまでにも、推奨に基づくクロスセリングや、ユーザーの行動に基づく推奨の推定など、いくつかのアプリケーションが導入されています。メンバーのR&D部門は主な推奨アプリケーション部門ではないため、より効率的で高速で比較的正確な、よりシンプルなモデルを選択することが予想されます。そのため、word2vecの元のアルゴリズムに基づいてitemNvecメソッドを模倣しました。

まず、itemNvec を理論的に分解してみましょう。

パート1: n-gram

対象製品に対する前後の製品の影響度

これは、Yigoo における 2 人のユーザー、userA と userB の消費タイムラインです。灰色のボックスが観察対象です。灰色のボックス内の userA と userB の購入アイテムを変更すると、直感的にわかる可能性はどれくらいでしょうか。

直感的に、これは不可能、または決して一般的ではないことが分かるので、特定のカテゴリの一部のユーザーについては、その消費行動が継続的に影響を受けるという最初の仮定が立てられます。言い換えれば、私が何を購入するかは、以前に何を購入したかによって決まります。上記をアルゴリズム言語で説明するにはどうすればよいでしょうか?

思い出してみましょう。ナイーブベイズはどのようにスパムを分類したのでしょうか?

「弊社では請求書、武器販売、航空母艦整備等も承っております」という文章はスパムでしょうか?

  1. P1(「スパム」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  2. =p("spam")p("弊社は請求書、武器販売、航空母艦のメンテナンスを提供できます"/"spam")/p("弊社は請求書、武器販売、航空母艦のメンテナンスを提供できます")
  3. =p("スパム")p("請求書","武器","航空母艦"/"スパム")/p("請求書","武器","航空母艦")

同じ理由

  1. P2(「通常のメール」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  2. =p("通常郵便")p("請求書", "武器", "航空母艦"/"通常郵便")/p("請求書", "武器", "航空母艦")

p1 と p2 のサイズを比較するだけで、次のように直接記述できます。

  1. P1(「スパム」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  2. =p("スパム")p("請求書"/"スパム")p("武器"/"スパム")p("航空母艦"/"スパム")
  3. P2(「通常のメール」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  4. =p("通常郵便")p("請求書"/"通常郵便")p("武器"/"通常郵便")p("航空母艦"/"通常郵便")

しかし、「当社は請求書、武器販売、航空母艦整備などに対応できます」という文言の順序がどのように変わっても、最終結果には影響しません。ただし、需要の早い段階で購入したものは、後の項目に大きな影響を与えます。

冷蔵庫 => 洗濯機 => ワードローブ => テレビ => ソーダ、この注文プロセスは合理的です

冷蔵庫 => 洗濯機 => ソーダ => テレビ => ワードローブ、この順序付けのプロセスは比較的起こりにくい

しかし、ナイーブベイズの場合、それらは一貫しています。

したがって、ここで検討する順序は、依然として前述のスパムの問題です。

  1. P1(「スパム」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  2. =p("スパム")p("請求書")p("武器"/"請求書")p("武器"/"航空母艦")
  3. P1(「通常のメール」|「当社は請求書、武器販売、航空母艦のメンテナンスを提供できます」)
  4. =p("通常郵便")p("請求書")p("武器"/"請求書")p("武器"/"航空母艦")

ここでは、各単語は前の単語にのみ依存します。理論的には、1〜3 個の単語に依存することは通常許容されます。ベイズの順序に関する上記の考察は、有名なマルコフの仮定に基づいています。つまり、次の単語の出現は、その前の 1 つ以上の単語の結合確率のみに依存します。関連する詳細な理論的な数式はここでは示しませんが、これにはアイデアが含まれています。

パート2: ハフマン符号化

より大規模なデータストレージ

私たちがよく使用するユーザーとアイテムのマッピングは、ワンホットエンコーディングの形式で実装されていますが、これには、データストレージ係数と次元障害の可能性が非常に高いという大きな欠点があります。

元のデータセットに戻ります。現在、Suning には約 4 億の製品、10,000 を超える製品カテゴリ、約 40 の主要なカテゴリがあります。同時に、メンバー数は 3 億に達しています。ユーザーベースの共同推奨のために、ユーザー製品に対応する購入関係マトリックスを構築する必要がある場合、4 億 x 6 億の 1/0 マトリックスを作成する必要がありますが、これはほぼ不可能です。Huffman は、ストレージに近似バイナリ ツリーの形式を使用します。

Yiguo 製品の購入金額を例に、ワンホットエンコーディングストレージ方式をバイナリツリーに置き換える方法を説明します。

818 Suning プロモーション期間中、統計によると、冷蔵庫 => 洗濯機 => 乾燥機 => テレビ => ワードローブ => ダイヤモンド (購入アイテムの順序は上記のとおり) というユーザーの注文チェーンがあり、その中で冷蔵庫が 15 万台、洗濯機が 8 万台、乾燥機が 6 万台、テレビが 5 万台、ワードローブが 3 万台、ダイヤモンドが 1 万個販売されたと仮定します。

ハフマン木の構築プロセス

1. 二分木のノードとして{15,8,6,5,3,1}が与えられ、各木には1つのノードしかないので、6つの別々の木が存在する。

2. マージするノードの重み値が最小の2つのツリー、つまり{3}と{1}を選択します。マージ後、新しい重み3+1=4を計算します。

3. ノードリストから{3}、{1}ツリーを削除し、3+1=4の新しい結合ツリーを元のノードリストに戻します。

4. 木が1本だけ残るまで手順2~3を繰り返します。

各層の各分岐プロセスでは、重みの大きいノードを 1 と見なし、重みの小さいノードを 0 と見なすことができます。その逆も同様です。例えば、ダイヤモンドのコードは 1000 で、灰色のボックスの位置であり、洗濯機のコードは 111 であることを知る必要があります。このストレージは 0/1 ストレージ方式を使用し、組み合わせ位置の配置長さも考慮して、データ ストレージ スペースを節約します。

パート3: ノード確率

現在のデータの確率密度関数を最大化する

ダイヤモンドの位置については、ハフマンコードは 1000 です。これは、各バイナリ選択で 1 を 1 回、0 を 3 回分割する必要があり、各分割プロセスで 1/0 のみを選択できることを意味します。これは、ロジスティック回帰の 0/1 分類に似ていますか? したがって、ここでも、lr のクロスエントロピーを損失関数として直接使用します。

実際、多くの機械学習アルゴリズムでは、まずモデルを想定し、次に損失関数を構築し、データを使用して損失関数をトレーニングして argmin (損失関数) のパラメータを見つけ、それを元のモデルに戻します。

このダイヤモンドの例を詳しく見てみましょう。

最初のステップ

p(1|第1層の未知のパラメータ)=シグモイド(第1層の未知のパラメータ)

ステップ2

  1. p(0|第2層の未知のパラメータ)=シグモイド(第2層の未知のパラメータ)

同様に、3 番目と 4 番目のレイヤーは次のようになります。

  1. p(0| 3番目の未知のパラメータ)=シグモイド( 3番目の未知のパラメータ)
  2.  
  3. p(0|第4層の未知のパラメータ)=シグモイド(第4層の未知のパラメータ)

次に、p(1|第1層の未知パラメータ)xp(0|第2層の未知パラメータ)xp(0|第3層の未知パラメータ)xp(0|第4層の未知パラメータ)の最大値に対応する各層の未知パラメータを見つけます。 解法はロジスティック解法に似ています。未知パラメータ分布の偏微分を使用し、後で勾配降下法を使用します(必要に応じて最大値、バッチ、ニュートン)。

パート4: 近似ニューラルネットワーク

製品の類似性

パート3では、p(1|第1層の未知のパラメータ)のロジックがあります。第1層の未知のパラメータの1つは、積ベクトルです。

例えば:

「ビール => スイカ => カミソリ => ペプシ」の順番で商品を購入したユーザーが 1,000 万人いる

10万人のユーザーが「ビール=>リンゴ=>カミソリ=>ペプシ」の順序で商品を購入しました。ネイビー・ベイズやn-gramなどの従来の確率モデルによれば、P(ビール=>スイカ=>カミソリ=>ペプシ)>>p(ビール=>リンゴ=>カミソリ=>ペプシ)となります。しかし、実際には、これら2つのグループは同じグループであり、属性特性も同じである必要があります。

各製品の特徴ベクトルをランダムに初期化し、パート 3 の確率モデルを通じてトレーニングし、最後に単語ベクトルのサイズを決定しました。さらに、これはニューラル ネットワーク アルゴリズムを通じて実行することもできます。

Bengio らは、2001 年に NIPS に発表された論文「A Neural Probabilistic Language Model」で詳細な手法を紹介しました。

ここで知っておく必要があるのは、最小次元の積について、0-1 点 (0、0、0、0、0、1、0、0、0、0、0...) を積ベクトル (0.8213、0.8232、0.6613、0.1234、...) に置き換えたということです。単一の積ベクトルは意味がありませんが、積ベクトルのペア間のコサイン類似度を比較して、カテゴリの類似度や積カテゴリの類似度を比較することができます。

3. Pythonコードの実装

1. データの読み取り

  1. # -*- コーディング:utf-8 -*-
  2. pandasをpdとしてインポートする
  3. numpyをnpとしてインポートする
  4. matplotlib をmtとしてインポートします
  5. gensim.modelsからword2vecをインポートする
  6. sklearn.model_selectionからtrain_test_split をインポートします
  7.  
  8. order_data = pd.read_table( 'C:/Users/17031877/Desktop/SuNing/cross_sell_data_tmp1.txt' )
  9. dealed_data = order_data.drop ( 'member_id' 、axis=1 )
  10. 処理されたデータ = pd.DataFrame(処理されたデータ).fillna(値 = '' )

2. シンプルなデータ統合

  1. # データの結合
  2. dealed_data = dealed_data[ 'top10' ] + [ " " ] + dealed_data[ 'top9' ] + [ " " ] + dealed_data[ 'top8' ] + [ " " ] + \
  3. 取引データ[ 'top7' ] + [ " " ] + 取引データ[ 'top6' ] + [ " " ] + 取引データ[ 'top5' ] + [ " " ] + 取引データ[
  4. 'top4' ] + [ " " ] + 取引データ[ 'top3' ] + [ " " ] + 取引データ[ 'top2' ] + [ " " ] + 取引データ[ 'top1' ]
  5.  
  6. # データ列
  7. dealed_data = [s.encode( 'utf-8' ).split()で、dealed_data内のs を分割します]
  8.  
  9. # データ分割
  10. train_data、test_data = train_test_split(dealed_data、test_size=0.3、random_state=42) です。

3. モデルのトレーニング

  1. # オリジナルデータのトレーニング
  2. # sg=1,スキップグラム;sg=0,SBOW
  3. # hs=1:階層的ソフトマックス、ハフマンツリー
  4. # 負 = 0 非負サンプリング
  5. モデル = word2vec.Word2Vec(train_data、sg=1、min_count=10、window=2、hs=1、negative=0)

次のステップは、モデルを使用して推奨製品をトレーニングすることです。ここでは、特定のビジネス ニーズと実際のデータ量に応じて選択できる 3 つのアイデアがあります。

3.1 類似製品マッピング表

  1. # 最後に閲覧した商品に最も類似した上位 3 つの商品グループ
  2. x = 1000
  3. 結果 = []
  4. 結果 = pd.DataFrame(結果)
  5. iが範囲(x)場合:
  6. test_data_split = [s.encode( 'utf-8' ).split() をtest_data[i]内のsに対して実行します
  7. k = len(テストデータ分割)
  8. 最後の1つ = テストデータ分割[k - 1]
  9. last_one_recommended = model.most_similar(last_one, topn=3)
  10. tmp = 最後の1つ推奨[0] + 最後の1つ推奨[1] + 最後の1つ推奨[2]
  11. last_one_recommended = pd.concat([pd.DataFrame(last_one), pd.DataFrame(np.array(tmp))], axis=0)
  12. 最後の1つを推奨 = 最後の1つを推奨.T
  13. 結果 = pd.concat([pd.DataFrame(last_one_recommended), 結果], 軸=0)

ユーザーが最後の操作で注目したアイテム x を考慮し、ユーザーが購入したアイテムを除外します。残りのアイテムは、ユーザーがまだ興味を持っているが、適切なアイテムや安価なアイテムを見つけられていないアイテムを表します。アイテム ベクトル間の類似性を通じて、類似性の高いアイテムを直接計算し、ユーザーに推奨することができます。

3.2 商品の最大購入可能数

ユーザーが過去に購入したアイテムの順序に基づいて、現在のターゲット ユーザーが最近購入したアイテムに基づいて次に購入する可能性が高いものを特定します。

たとえば、過去のデータから、携帯電話とコンピュータを購入したユーザーは、今後 1 週間以内にバックパックを購入する可能性が最も高いことがわかります。この場合、最近コンピュータと携帯電話を購入したユーザーにコンピュータ バッグ製品をプッシュして、潜在的な日常的なニーズを刺激することができます。

  1. # ベクターライブラリ
  2. rbind_data = pd.concat(
  3. [order_data[ 'top1' ], order_data[ 'top2' ], order_data[ 'top3' ], order_data[ 'top4' ], order_data[ 'top5' ],
  4. order_data[ 'top6' ]、order_data[ 'top7' ]、order_data[ 'top8' ]、order_data[ 'top9' ]、order_data[ 'top10' ]]、axis=0)
  5. x = 50
  6. 開始 = []
  7. 出力= []
  8. スコア_最終 = []
  9. iが範囲(x)場合:
  10. スコア = np.array(-1000000000000000)
  11. 名前= np.array(-1000000000000000)
  12. ニューススコア = np.array(-1000000000000000)
  13. tmp = テストデータ[i]
  14. k = 長さ(tmp)
  15. 最後の1つ = tmp[k - 2]
  16. tmp = tmp[0:(k - 1)]
  17. jが範囲(数値)の場合:
  18. tmp1 = tmp[:]
  19. ターゲット = rbind_data_level[j]
  20. tmp1.append(ターゲット)
  21. テストデータ分割 = [tmp1]
  22. ニューススコア = model.score(test_data_split)
  23. ニューススコア > スコアの場合:
  24. スコア = ニューススコア
  25. 名前= tmp1[長さ(tmp1) - 1]
  26. それ以外
  27. 合格
  28. start.append(最後の1つ)
  29. 出力.append(名前)
  30. score_final.append(スコア)

3.3 連想記憶の推奨

3.2では、ユーザーの最近の購買行動に基づいて、過去のユーザーの購買行動データからパターンを発見し、推奨商品を提供しました。同様のロジックがもう 1 つあり、以下に示すように、過去のユーザーの単一の購入に関するデータを参照して、対象ユーザーの最新の商品購入に基づいて推論を行うというものです。

この実装も非常にシンプルです。自分でコードを書いたわけではないので、投稿しません。私はまだword2vecでpredict_output_word(context_words_list, topn=10)を使用しています。学習済みモデルへの入力としてコンテキスト単語が与えられた場合、中心単語の確率分布を報告します。

実際、詳細に行うのはかなり複雑です。ここでは単にいくつかのアイデアを投稿しただけです。理解できない場合は、私にプライベートメッセージを送ってください。以上です。最後に、読んでいただきありがとうございました。

<<:  Raft アルゴリズムの原理と CMQ への応用 (パート 1)

>>:  効率的な多次元空間ポイントインデックスアルゴリズム - Geohash と Google S2

ブログ    
ブログ    

推薦する

AIが70年間で急成長した理由が明らかに!タイム誌の4枚の写真がアルゴリズムの進化の謎を明らかにする

過去 10 年間の AI システムの進歩のスピードは驚くべきものでした。 2016年の囲碁対局でアル...

...

OpenAI: LLMはテストを受けていることを感知し、合格するために情報を隠して人間を騙す | 対策も添付

AIはここまでの発展を経て意識を獲得したのでしょうか?数日前、チューリング賞受賞者のベンジオ氏が参加...

Go-OpenAI を使用して ChatGPT を簡単に呼び出し、無限の創造性を解き放ちましょう。

今日は、go-openai を使用して chatGPT を呼び出すという興味深いトピックを皆さんと共...

サーバーが過負荷状態です! GANで生成された肖像油絵は人気があり、一瞬でルネッサンス時代に戻ることができます

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

HanSight 万小川: 国内のセキュリティベンダーはセキュリティ人工知能を推進すべき

[51CTO.com より引用] RSA カンファレンスは、世界の IT セキュリティ動向のバロメー...

自己教師学習の効率限界を突破! Ma Yi と LeCun が共同で EMP-SSL をリリース: 特別なトリックは不要、30 エポックで SOTA を達成可能

過去数年間、教師なし学習と自己教師あり学習 (SSL) は大きな進歩を遂げてきました。SSL を通じ...

数学的論理とコンピュータプログラムコードの深いつながり:互いの鏡像

DNAの二重らせん構造やブラックホールの存在など、いくつかの科学的発見は何か新しいことを明らかにする...

需要は拡大し続けており、配達ロボットには克服すべきいくつかの大きな技術的課題がある

特別なイベントの影響を受けて、非接触型の配達や食事が需要のトレンドになっています。その結果、業界にお...

...

自然言語処理がビジネスインテリジェンスの未来である理由

[[187102]] Siri に道順を尋ねるたびに、複雑なコード列がアクティブ化され、「Siri」...

AIが製造業に力を与え、PowerLeader Serverは製品、サービス、生産に焦点を当てる

ビッグデータ、モノのインターネット、人工知能に代表される新世代の情報技術は大きな進歩を遂げ、産業化を...

...

...