Spark を使用して行列分解推奨アルゴリズムを学習する

Spark を使用して行列分解推奨アルゴリズムを学習する

[[182792]]

協調フィルタリング推奨アルゴリズムにおける行列分解の応用では、推奨アルゴリズムにおける行列分解の応用原理をまとめました。ここでは、Spark を使用して、実用的な観点から行列分解推奨アルゴリズムを学習します。

1. Spark推奨アルゴリズムの概要

Spark MLlib では、推奨アルゴリズムは、行列分解に基づく協調フィルタリング推奨アルゴリズムのみを実装します。このアルゴリズムは、m 人のユーザーと n 個のアイテムに対応する評価行列 M を 2 つの低次元行列に分解する FunkSVD アルゴリズムに基づいています。

ここで、k は低次元への分解の次元であり、通常は m や n よりもはるかに小さくなります。 FunkSVD アルゴリズムに精通していない場合は、対応する原則の記事を確認してください。

2. Sparkレコメンデーションアルゴリズムライブラリの紹介

Spark MLlib では、Python、Java、Scala、R インターフェースをサポートするために FunkSVD アルゴリズムが実装されています。これまでの実践記事は Python をベースにしているため、この記事の後半で紹介および使用する際にも MLlib の Python インターフェースを使用します。

Spark MLlib 推奨アルゴリズムの Python インターフェースはすべて pyspark.mllib.recommendation パッケージにあり、このパッケージには Rating、MatrixFactorizationModel、ALS の 3 つのクラスがあります。 3 つのクラスがありますが、アルゴリズムは FunkSVD アルゴリズムのみです。これら 3 つのクラスの目的を以下に説明します。

Rating クラスは比較的シンプルで、ユーザー、アイテム、評価の 3 つの値をカプセル化するだけです。つまり、 Rating クラスには、ユーザー、アイテム、評価のトリプルのみが含まれ、関数インターフェースはありません。

ALS は FunkSVD モデルのトレーニングを担当します。ここで交互最小二乗法 ALS が使用される理由は、Spark が FunkSVD の行列分解の目的関数を最適化するときに ALS を使用するためです。 ALS 関数には 2 つの関数があります。1 つは train で、これは評価マトリックスを直接使用してデータをトレーニングします。もう 1 つの関数 trainImplicit は少し複雑です。これは暗黙的なフィードバック データを使用してモデルをトレーニングします。train 関数と比較すると、暗黙的なフィードバック信頼しきい値を指定するための追加パラメーターがあります。たとえば、評価マトリックスをフィードバック データ マトリックスに変換し、特定のフィードバック原則に従って対応する評価値を信頼重み値に変換できます。暗黙的なフィードバック原理は一般に特定の問題とデータに依存するため、この記事では一般的な評価行列分解についてのみ説明します。

MatrixFactorizationModel クラスは、ALS クラスを使用してトレーニングしたモデルです。このモデルは予測を行うのに役立ちます。一般的な予測には、特定のユーザーとアイテムに対応する評価、特定のユーザーが最も気に入っている N 個のアイテム、アイテムを最も気に入っている可能性のある N 個のユーザー、すべてのユーザーが最も気に入っている N 個のアイテム、すべてのアイテムを最も気に入っている N 個のユーザーが含まれます。

これらのクラスの使用方法については、後ほど例を挙げて説明します。

3. Spark推奨アルゴリズムの重要なパラメータ

ここでは、ALS モデルをトレーニングする際の重要なパラメータをまとめます。

1) 評価: 評価マトリックスに対応する RDD。入力が必要です。暗黙的なフィードバックの場合は、評価マトリックスに対応する暗黙的なフィードバック マトリックスです。

2) ランク:行列を分解したときに対応する低次元の次元。つまり、PTm×kQk×nPm×kTQk×nにおける次元kです。この値は、行列分解のパフォーマンスに影響します。値が大きいほど、アルゴリズムの実行にかかる時間が長くなり、占有するメモリも多くなります。通常、パラメータを調整する必要がありますが、一般的には 10 ~ 200 の範囲になります。

3) 反復: 交互最小二乗法を使用して行列分解を解くときに実行する反復の最大回数。この値は、評価マトリックスの次元と、評価マトリックス内の係数の次数によって異なります。一般的には、5~20倍など、あまり大きくする必要はありません。デフォルト値は 5 です。

4) lambda: lambda は Python の予約語であるため、Python インターフェースでは lambda_ が使用されます。この値は、FunkSVD 分解に対応する正規化係数です。これは主に、モデルの適合度を制御し、モデルの一般化能力を高めるために使用されます。値が大きいほど、正規化ペナルティが強くなります。大規模な推奨システムでは通常、適切な値を得るためにパラメータを調整する必要があります。

5) alpha: このパラメーターは、暗黙的なフィードバック trainImplicit を使用する場合にのみ役立ちます。暗黙的なフィードバック信頼しきい値が指定されます。値が大きいほど、ユーザーとユーザーが評価していないアイテムとの間に関連性がない可能性が高くなります。通常、適切な値を得るにはパラメータを調整する必要があります。

上記の説明から、ALS アルゴリズムの使用は非常に簡単であることがわかります。調整する必要があるパラメータは、主に行列分解のランク次元と正則化ハイパーパラメータ ラムダです。暗黙的なフィードバックの場合は、暗黙的なフィードバックの信頼しきい値アルファも調整する必要があります。

4. Spark 推奨アルゴリズムの例

以下では、Spark 行列分解推奨アルゴリズムの使用方法を具体的な例を使って説明します。

ここでは MovieLens 100K データを使用します。データのダウンロード リンクはここにあります。

データを解凍した後、u.data ファイル内のスコア データのみを使用します。このデータセットの各行には、ユーザー ID、アイテム ID、評価、タイムスタンプに対応する 4 つの列があります。私のマシンはかなり壊れているので、次の例では最初の 100 件のレコードのみを使用しました。したがって、すべてのデータを使用した場合、その後の予測は私の予測とは異なるものになります。

まず、Hadoop と Spark (バージョン 1.6 以上) がインストールされ、環境変数が設定されていることを確認する必要があります。一般的にはipythonノートブック(jupyterノートブック)で学習するので、ノートブックベースのSpark環境を構築するのが最適です。もちろん、ノートブックの Spark 環境を使用しなくても問題ありませんが、毎回実行する前に環境変数を設定する必要があります。

Spark ノートブック環境がない場合は、まず次のコードを実行する必要があります。もちろん、すでに設定している場合は、次のコードを実行する必要はありません。

アルゴリズムを実行する前に、次のように Spark Context を出力することをお勧めします。メモリ アドレスが正常に出力されれば、Spark 動作環境がセットアップされていることを意味します。

  1. 印刷sc

たとえば、私の出力は次のようになります。

まず、u.data ファイルをメモリに読み込み、最初のデータ行を出力して、正常に読み込まれたかどうかを確認します。コードをコピーするときは、データ ディレクトリに独自の u.data ディレクトリを使用する必要があることに注意してください。コードは次のとおりです。

出力は次のようになります。

  1. u'196_t242_t3_t881250949′

データが \t で区切られていることがわかります。各行の文字列を配列に分割し、タイムスタンプ列を無視して最初の 3 列のみを取得する必要があります。コードは次のとおりです。

出力は次のようになります。

  1. [u'196′, u'242′, u'3′]

この時点で評価マトリックス配列に対応する RDD を取得しましたが、これらのデータはまだ文字列です。Spark に必要なのは、いくつかの Rating クラスに対応する配列です。そこで、RDD のデータ型を変換します。コードは次のとおりです。

出力は次のようになります。

  1. 評価(ユーザー=196、製品=242、評価=3.0)

データはすでに Rating クラスに基づく RDD であることがわかります。これで、ソートされたデータをトレーニングに使用できるようになりました。コードは次のとおりです。行列分解の次元を 20、最大反復回数を 5、正則化係数を 0.02 に設定します。実際のアプリケーションでは、クロス検証を通じて適切な行列分解次元と正則化係数を選択する必要があります。ここでは例なので簡略化します。

モデルをトレーニングした後、最終的に推奨システムの予測を行うことができます。

まず、アイテム 20 に対するユーザー 38 の評価を予測するなど、簡単な予測を行います。コードは次のとおりです。

  1. model.predict(38,20) を印刷する

出力は次のようになります。

  1. 0.311633491603

スコアは高くないことがわかります。

次に、ユーザー 38 にとって最も人気のある 10 個のアイテムを予測してみましょう。コードは次のとおりです。

  1. 印刷モデル。推奨製品(38,10)

出力は次のようになります。

  1. [ 評価(ユーザー=38、製品=95、評価=4.995227969811873)、  
  2. 評価(ユーザー=38、製品=304、評価=2.5159673379104484)、  
  3. 評価(ユーザー=38、製品=1014、評価=2.165428673820349)、  
  4. 評価(ユーザー=38、製品=322、評価=1.7002266119079879)、  
  5. 評価(ユーザー=38、製品=111、評価=1.2057528774266673)、  
  6. 評価(ユーザー=38、製品=196、評価=1.0612630766055788)、  
  7. 評価(ユーザー=38、製品=23、評価=1.0590775012913558)、  
  8. 評価(ユーザー=38、製品=327、評価=1.0335651317559753)、  
  9. 評価(ユーザー=38、製品=98、評価=0.9677333686628911)、  
  10. 評価(ユーザー=38、製品=181、評価=0.8536682271006641)]

ユーザー 38 が気に入る可能性のあるアイテムが 10 個あり、対応するスコアは高いものから低いものまでの範囲にあることがわかります。

次に、アイテム 20 を推奨する可能性が最も高い 10 人のユーザーを予測してみましょう。コードは次のとおりです。

  1. model.recommendUsers(20,10) を印刷します。

出力は次のようになります。

  1. [ 評価(ユーザー=115、 製品 =20、 評価 =2.9892138653406635)、  
  2. 評価(ユーザー=25、製品=20、評価=1.7558472892444517)、  
  3. 評価(ユーザー=7、製品=20、評価=1.523935609195585)、  
  4. 評価(ユーザー=286、製品=20、評価=1.3746309116764184)、  
  5. 評価(ユーザー=222、製品=20、評価=1.313891405211581)、  
  6. 評価(ユーザー=135、製品=20、評価=1.254412853860262)、  
  7. 評価(ユーザー=186、製品=20、評価=1.2194811581542384)、  
  8. 評価(ユーザー=72、製品=20、評価=1.1651855319930426)、  
  9. 評価(ユーザー=241、製品=20、評価=1.0863391992741023)、  
  10. 評価(ユーザー=160、製品=20、評価=1.072353288848142)]

それでは、各ユーザーに最もおすすめされる上位 3 つのアイテムを見てみましょう。コードは次のとおりです。

  1. model.recommendProductsForUsers(3).collect() を印刷する

出力は非常に長いので、ここではコピーしません。

各アイテムで最も推薦に値するユーザー3名は以下の通りです。

  1. model.recommendUsersForProducts(3).collect() を印刷する

また、出力が非常に長いため、ここではコピーしません。

上記の例が Spark 行列分解推奨アルゴリズムの使用に役立つことを願っています。

<<:  Google がディープラーニング ライブラリ TensorFlow Fold をリリース、動的計算グラフをサポート

>>:  今年、データ サイエンティストはどのようなアルゴリズムを使用しましたか?

ブログ    
ブログ    

推薦する

...

AIの開発パターンは「データ」から「知識」へと進化している

半世紀以上前に誕生して以来、人工知能(AI)革命は全世界に大きな影響を与えてきました。特に過去10年...

マスク氏:ニューラリンクが初めて人体にチップを埋め込み、製品化へ

マスク氏の脳コンピューターインターフェース企業ニューラリンクがついに人間に対する臨床研究を開始した。...

...

AIがデータセンター運営者が直面する課題をどう解決するか

業界の専門家が、業界内で発生する運用上の課題の解決に AI がどのように役立つか、データ センター業...

ナレッジグラフの紹介と応用

[[376661]]人間は知識を獲得する過程で、物事の本質にますます注意を払うようになります。人工知...

スマート水利建設を加速する必要があり、ドローンが大きな推進力となる

夏の気温が上昇し続け、雨季が近づいているため、我が国の水利インフラは再び大きな試練に直面することにな...

...

...

人工知能の進化:過去、現在、そして未来

近年、人工知能はロボットが人間のように考え、行動することを可能にする強力なツールへと発展しました。さ...

気候変動との戦い: AIはエネルギーソリューションをリードできる

AI と機械学習をエネルギーと組み合わせることで、再生可能エネルギーの導入を加速することができます。...

ByteDance によって否定された中国版 Sora の何がそんなに素晴らしいのでしょうか?

執筆者 | Yun Zhao制作:51CTO テクノロジースタック(WeChat ID:blog)最...

AIは教育分野にどのように貢献できるのでしょうか?

調査機関Markets&Marketsの予測によると、2023年までに世界の教育業界における...

AIに関する4つの最も一般的な誤解

[[398369]]この記事はLeiphone.comから転載したものです。転載する場合は、Leip...

入社1年目のアルゴリズムエンジニアから新人への手紙

[[271455]]ビッグデータダイジェスト制作出典: towarddatascienceコンピレー...