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の助けを借りて作成されたことが判明しました。 !

秋の就職活動は静かに過ぎ去りましたが、信頼できるインターンシップ先を見つけたい大学生にとって、すべて...

...

Java 実装と読み取り/書き込みロック アルゴリズムの考え方

問題の背景: 複数のスレッドが共有リソースへの読み取りおよび書き込みアクセスを実行します。書き込みス...

世界中で生産される食料の50%が毎年廃棄されている?

世界の食品サプライチェーンの複雑さには驚かされることがあります。何千万もの農場が何百万もの食料品店や...

...

「人工バカ」、いつまで我慢できるの?

[[251715]]毎年、メディアでは AI の失敗に関する報道が見られます。なぜこのようなばかげ...

...

世界中で人気のGPT-3がなぜ人々の仕事を破壊しているのか?

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

2020 年のトップ 10 テクノロジー トレンド

変化だけが唯一不変です。これは私たちの職業生活にも当てはまります。最近はテクノロジーが非常に急速に発...

...

20200202 千年に一度の対称性の日、すべての「回文アルゴリズム」をキャッチする時が来ました!

[[313923]]今日は2020年2月2日、「千年に一度の対称の日」として知られています。202...

Google ドキュメントでテキスト要約を自動的に生成できるようになりました。

私たちの多くは、毎日たくさんのファイルを処理する必要があります。新しい文書を受け取ったとき、通常は、...

とても怖い!最初のAIはすでに詐欺行為を行っている

​​ [[250441]]​​この記事はGeek View (ID: geekview) の許可を得...

GoogleのAIチップ設計能力は人間より優れているのか?社内研究者が疑問を呈し解雇された

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