ディープラーニングを使用して映画を推奨するにはどうすればよいでしょうか?独自の推奨システムを作成する方法を教えます!

ディープラーニングを使用して映画を推奨するにはどうすればよいでしょうか?独自の推奨システムを作成する方法を教えます!

導入

ほとんどすべての人が、家族や友人と一緒に映画を観ながら余暇を過ごすのが好きです。誰でもこんな経験をしたことがあるでしょう。2時間以内に映画を観ようと思っていたのに、何を見たらいいのかわからず20分間ソファに座っていました。決断力が再び失われ、良い気分が憂鬱に変わりました。したがって、映画を選択するときに推奨事項を提供するコンピュータ エージェントが本当に必要です。

今日では、インテリジェントな映画推奨システムが日常生活の一部になっています。

Data Science Central はかつてこう言っていました。

「確かなデータは入手困難だが、事情に詳しい関係者は、アマゾンやネットフリックスなどの大手電子商取引プラットフォームでは、推奨システムによって収益が最大10~25%増加していると推定している。」

このプロジェクトでは、映画推奨のための基本的なアルゴリズムをいくつか研究し、ディープラーニングを映画推奨システムに統合しようとしました。

映画はエンターテインメントと視覚芸術を組み合わせた素晴らしい例です。映画ポスターは、映画の情報を観客に直接かつ迅速に伝えることができます。デザインマンティックは「公開前でも公開後でも、映画のポスターはギミックを作る上で重要な要素です。ほとんどの人(ターゲット層)は、ポスターを見てチケットを買うか映画を見るかを決めます」と語る。ポスターのフォントだけで映画の雰囲気を推測することさえできるのだ。

ちょっと魔法のように聞こえますが、ポスターを見るだけで映画のジャンルを予測することが可能なのです。私にとっては、ポスターを一目見るだけで、その映画を見たいかどうかが分かります。たとえば、私は漫画ファンではないので、漫画をテーマにしたポスターを見るとすぐに、自分の好みではないことがわかります。意思決定のプロセスは非常に簡単で、映画のレビューを読む必要はありません (実際にレビューを読む時間がある人がいるかどうかはわかりません)。そこで、標準的な映画推奨アルゴリズムに加えて、ディープラーニングを使用してポスターを処理し、類似の映画をユーザーに推奨しました。最終的な目標は、人間の視覚を模倣し、ポスターを見るだけでディープラーニングを使用して直感的な映画推奨システムを作成することです。このプロジェクトは、Ethan Rosenthal のブログからインスピレーションを得ました。私は彼のブログのコードをこのプロジェクトのアルゴリズムに合わせて修正しました。

MovieLens からダウンロードした映画データセットを使用しました。 9,066 本の映画と 671 人のユーザーが含まれ、100,000 件の評価と 1,300 件のタグに分類されています。このデータセットは 2016 年 10 月に最終更新されました。

協調フィルタリング

大まかに言えば、レコメンデーション システムには 3 つの種類があります (単純な評価方法を除く)。

  • コンテンツベースの推奨

  • 協調フィルタリング

  • ハイブリッドモデル

「コンテンツベースの推奨」は回帰問題です。映画のコンテンツを特徴として使用し、ユーザーの映画の評価を予測します。

しかし、「協調フィルタリング」による推薦システムでは、コンテンツの特徴を事前に取得することは一般的に不可能です。ユーザー間の類似性(ユーザーが映画に同じ評価を与えること)と映画間の類似性(ユーザーの評価が似ている映画)を通じて潜在的な特徴を学習し、ユーザーの映画の評価を予測します。さらに、映画の特徴を学習した後、映画間の類似性を測定し、ユーザーの過去の視聴情報に基づいて最も類似した映画をユーザーに推奨することができます。

「コンテンツベースの推奨」と「協調フィルタリング」は、10年以上前には最も先進的な技術でした。明らかに、予測結果を改善できるモデルやアルゴリズムは数多く存在します。たとえば、ユーザーの映画評価に関する事前情報が不足している場合、暗黙的な行列分解を使用して、ユーザーの映画評価を好みや信頼度レベル (たとえば、ユーザーが映画の推奨をクリックした回数) に置き換え、協調フィルタリングを実行できます。さらに、「コンテンツ推奨」と「協調フィルタリング」の手法を組み合わせて、コンテンツを副次情報として使用することで予測精度を向上させることもできます。このハイブリッド アプローチは、「Learning to Rank」アルゴリズムを使用して実装できます。

このプロジェクトでは、「協調フィルタリング」手法に焦点を当てます。まず、回帰を使用する代わりに映画(ユーザー)の類似性を使用して評価を予測し、類似性に基づいて映画を推奨する方法について説明します。次に、回帰を使用して潜在的な特徴を同時に学習し、映画を推奨する方法について説明します。最後に、レコメンデーションシステムでディープラーニングを活用する方法について説明します。

映画の類似点

協調フィルタリングに基づく推奨システムの場合、最初のステップは評価マトリックスを確立することです。各行はユーザーを表し、各列はユーザ​​ーの映画の評価に対応します。確立されたスコアリング マトリックスは次のとおりです。

  1. df = pd.read_csv( 'ratings.csv' , sep= ',' )
  2. df_id = pd.read_csv( 'links.csv' 、 sep= ',' )
  3. df = pd.merge(df, df_id, on=[ 'movieId' ])
  4. 評価マトリックス = np.zeros((df.userId.unique().shape[0], max(df.movi​​eId)))
  5. df.itertuples()の場合:
  6. 評価マトリックス[行[1]-1、行[2]-1] = 行[3]
  7. 評価マトリックス = 評価マトリックス[:,:9000]

ここで、「ratings.csv」にはユーザー ID、映画 ID、評価、および時間情報が含まれ、「link.csv」には映画 ID、IMDB ID、および TMDB ID が含まれます。各映画には、API を使用して映画データベース Web サイトからポスターを取得するために IMDB ID が必要です。そのため、2 つのテーブルを結合します。評価マトリックスのスパース性を次のようにテストしました。

  1. スパース性 = float (len(ratings.nonzero()[0]))
  2. スパース性 /= (ratings.shape[0] * ratings.shape[1])
  3. スパース性 *= 100

ゼロ以外のエントリの数がわずか 1.40% の場合、評価マトリックスはスパースです。ここで、トレーニングとテストの目的で、評価マトリックスを 2 つの小さなマトリックスに分解します。評価マトリックスから 10 件の評価を削除し、テスト セットに追加しました。

  1. トレーニングマトリックス = 評価マトリックス.コピー()
  2. テストマトリックス = np.zeros(ratings_matrix.shape)
  3. i がxrange(rating_matrix.shape[0])内にある場合:
  4. 評価IDx = np.ランダム選択(
  5. 評価マトリックス[i, :].nonzero()[0],
  6. サイズ=10,
  7. 置き換え=True)
  8. トレーニングマトリックス[i, 評価IDx] = 0.0
  9. テストマトリックス[i, 評価IDx] = 評価マトリックス[i, 評価IDx]

ユーザーと映画の類似度(コサイン)は、次の式に従って計算されます。

ここでs(u,v)はユーザーuとv間のコサイン類似度です。

  1. 類似度ユーザー = train_matrix.dot(train_matrix.T) + 1e-9
  2. ノルム = np.array([np.sqrt(np.diagonal(similarity_user))])
  3. 類似ユーザー = ( 類似ユーザー / (ノルム * ノルム.T) )
  4. 類似度ムービー = train_matrix.T.dot(train_matrix) + 1e-9
  5. ノルム = np.array([np.sqrt(np.diagonal(similarity_movie))])
  6. 類似度ムービー = ( 類似度ムービー / (ノルム * ノルム.T) )

ユーザー間の類似性を利用して、各ユーザーの映画の評価を予測し、対応する MSE を計算できます。予測は類似ユーザーからの評価に基づいています。具体的には、スコア予測は次の式に従って実行できます。

映画 i に対するユーザー u の予測は、映画に対するユーザー v の評価の (正規化された) 加重合計です。重みはユーザー u と v 間の類似度です。

  1. sklearn.metricsからmean_squared_errorをインポートする
  2.  
  3. 予測 = similarity_user.dot(train_matrix) / np.array([np.abs(similarity_user).sum(axis=1)]).T
  4.  
  5. 予測 = 予測[テスト行列.nonzero()].flatten()
  6.  
  7. test_vector = test_matrix[test_matrix.nonzero()].flatten()
  8.  
  9. mse = 平均二乗誤差(予測、テストベクトル)
  10.  
  11. 'MSE = ' + str(mse)を印刷します。

予測のMSEは9.8252です。この数字は何を意味していますか?この推奨システムは良いものでしょうか、それとも悪いものでしょうか? MSE 結果だけを見て予測パフォーマンスを評価するのは、あまり直感的ではありません。そこで、映画の推薦を直接調べて評価します。興味のある映画を検索し、コンピュータエージェントにいくつかの映画を推薦してもらいます。まず、どの映画が推奨されているかを確認できるように、対応する映画のポスターを入手する必要があります。 IMDB ID とその API を使用して、映画データベース Web サイトからポスターを取得します。

  1. 輸入リクエスト
  2. jsonをインポート
  3. IPython.displayからImageをインポート
  4. IPython.displayからdisplayをインポートする
  5. IPython.displayからHTMLをインポートする
  6. idx_to_movie = {}
  7. df_id.itertuples()の場合:
  8. idx_to_movie[行[1]-1] = 行[2]
  9. 映画
  10. 6 = 6 です
  11. idx = 0
  12. 映画 = [ idx_to_movie[x] 、 xnp.argsort (similarity_movie[idx,:])[:-k-1:-1] ]
  13. 映画 = filter(lambda imdb: len(str(imdb)) == 6, 映画)
  14. 表示数 = 5
  15. URL = [0]*n_display
  16. IMDB = [0]*n_表示
  17. 私 = 0
  18. 映画の中映画:
  19. (URL[i], IMDB[i]) = get_poster(映画、base_url)
  20. 私 += 1
  21. 画像 = ''  
  22. iが範囲(n_display)場合:
  23. 画像 += "<img style='幅: 100px; 余白: 0px; \
  24. float : left; border: 1px solid black; ' src=' %s' />" \
  25. % URL[i]
  26. 表示(HTML(画像))

楽しいことがやって来ます!映画を検索して、最も類似した 4 つのおすすめを見てみましょう。左端の「Heat」と、それに続く 4 つのおすすめ映画を検索してみましょう。

『ヒート』は、ロバート・デ・ニーロとアル・パチーノ主演で1995年に公開されたアメリカの犯罪映画です。検索結果は良さそうです。しかし、『リービング・ラスベガス』はあまりお勧めできないかもしれません。『ザ・ロック』にはニコラス・ケイジが出演しているし、『ヒート』が好きな視聴者にはお勧めできる映画だと思います。これは類似度マトリックスと協調フィルタリングの欠点の 1 つである可能性があります。さらにいくつか例を見てみましょう。

これは大丈夫そうです。 『トイ・ストーリー2』は『トイ・ストーリー』が好きな観客には絶対にお勧めです。しかし、フォレスト・ガンプは私には合わないようです。どうやら、トイ・ストーリーにトム・ハンクスの声が出ていることから、フォレスト・ガンプも推薦されたようです。注目すべきは、ポスターを見るだけで、映画のジャンルや雰囲気など、『トイ・ストーリー』と『フォレスト・ガンプ』の違いがわかるということだ。全ての子供が『トイ・ストーリー』を愛していると仮定すると、彼らは『フォレスト・ガンプ』を無視するかもしれません。

交代確率勾配降下法

前回の説明では、ユーザーと映画の間のコサイン類似度を計算し、それを使用して映画に対するユーザーの評価を予測し、特定の映画に基づいて他の映画を推奨しました。ここで、問題を回帰問題として定式化できます。つまり、すべての映画の潜在的特徴 y とすべてのユーザーの重みベクトル x を追加します。目標は、評価予測の MSE を最小化することです (2 ノルム正則化条件下)。

Leifeng.com (公式アカウント: Leifeng.com) 注意: 重みベクトルと特徴ベクトルはどちらも決定変数です。明らかに、これは凸関数の問題ではなく、この非凸関数の収束についてあまり心配する必要はありません。非凸関数の最適化問題を解決する方法は数多くあります。 1 つのアプローチは、重みベクトル (ユーザー用) と特徴ベクトル (映画用) を交互に解くことです ()。重みベクトルを処理する場合、固有ベクトルは定数ベクトルであると想定されます。固有ベクトルを処理する場合、重みベクトルは定数ベクトルであると想定されます。この回帰問題を解決する別の方法は、重みベクトルの更新と特徴ベクトルの更新を組み合わせて、同じ反復で更新することです。さらに、確率的勾配降下法を使用して計算を高速化することもできます。ここでは、確率的勾配降下法を使用してこの回帰問題を解決します。MSE 予測は次のようになります。

この MSE は、類似度マトリックスを使用して得られる MSE よりもはるかに小さくなります。もちろん、グリッド検索とクロス検証を使用してモデルとアルゴリズムのパラメータを調整することもできます。映画検索の推奨事項を見てみましょう。

見た目はあまり良くありません。 Heat を検索してこれらの 4 つの映画を勧められるべきではなかったと思います。これらの映画は Heat とはまったく関係がなさそうです。これらの 4 つの映画はロマンスやドラマです。大スターが出演するアメリカの犯罪映画を探しているのに、なぜドラマ映画を見たいと思うのでしょうか? これには困惑します。優れた MSE の結果は、まったく関係のない推奨を示す場合があります。

そこで、協調フィルタリングに基づく推奨システムの弱点について説明しましょう。

  • 協調フィルタリング方式では、データを使用して類似のユーザーや映画を検出するため、ニッチな映画よりも人気のある映画が推奨される可能性が高くなります。

  • 新しく公開された映画の使用データはあまりないため、協調フィルタリングによって新しい映画がユーザーに推奨されることを期待するのは非現実的です。

次に、協調フィルタリングの問題に対する別のアプローチ、つまりディープラーニングを使用した映画の推奨について考えます。

ディープラーニング

VGG16 を使用して、Keras でニューラル ネットワークをトレーニングします。データセットにはターゲットがないので、最後から 4 番目のレイヤーを特徴ベクトルとして取得します。この特徴ベクトルを使用して、データセット内の各映画を説明します。 Leifeng.com は、ニューラル ネットワークをトレーニングする前に、いくつかの前処理が必要であることをお知らせします。トレーニング プロセスは次のとおりです。

  1. df_id = pd.read_csv( 'links.csv' 、 sep= ',' )
  2. idx_to_movie = {}
  3. df_id.itertuples()の場合:
  4. idx_to_movie[行[1]-1] = 行[2]
  5. 合計映画数 = 9000
  6. 映画 = [0]*合計映画数
  7. i が範囲 (len(movies))内にある場合:
  8. idx_to_movie.keys()i があり、len(str(idx_to_movie[i])) == 6 の場合:
  9. 映画[i] = (idx_to_movie[i])
  10. 映画 = フィルター(lambda imdb: imdb != 0, 映画)
  11. total_movies = len(映画)
  12. URL = [0]*合計映画数
  13. IMDB = [0]*合計映画数
  14. URL_IMDB = { "url" : [], "imdb" : []}
  15. 私 = 0
  16. 映画の中映画:
  17. (URL[i], IMDB[i]) = get_poster(映画、base_url)
  18. URL[i] != base_url+ ""の場合:
  19. URL_IMDB[ "url" ].append(URL[i])
  20. URL_IMDB[ "imdb" ].append(IMDB[i])
  21. 私 += 1
  22. # URL = filter(lambda url: url != base_url+"", URL)  
  23. df = pd.DataFrame(データ = URL_IMDB)
  24. 合計ムービー数 = len(df)
  25. urllibをインポートする
  26. poster_path = "/Users/wannjiun/Desktop/nycdsa/project_5_recommender/posters/"  
  27. iが範囲(total_movies)の場合:
  28. urllib.urlretrieve(df.url[i], poster_path + str(i) + ".jpg" )
  29. keras.applications からVGG16をインポートします
  30. keras.applications.vgg16 からpreprocess_inputをインポートします
  31. keras.preprocessing からimage を kimage としてインポートします
  32. 画像 = [0]*合計ムービー数
  33. x = [0]*合計映画数
  34. iが範囲(total_movies)の場合:
  35. image[i] = kimage.load_img(poster_path + str(i) + ".jpg" , target_size=(224, 224))
  36. x[i] = kimage.img_to_array(画像[i])
  37. x[i] = np.expand_dims(x[i], 軸=0)
  38. x[i] = 前処理入力(x[i])
  39. モデル = VGG16(include_top=False, 重み= 'imagenet' )
  40. 予測 = [0]*合計映画数
  41. matrix_res = np.zeros([total_movies,25088])
  42. iが範囲(total_movies)の場合:
  43. 予測[i] = model.predict(x[i]).ravel()
  44. 行列_res[i,:] = 予測[i]
  45. 類似度の深さ = matrix_res.dot(matrix_res.T)
  46. ノルム = np.array([np.sqrt(np.diagonal(similarity_deep))])
  47. 類似度の深さ = 類似度の深さ / 規範 / 規範.T

コードでは、まず API と IMDB ID を使用して、TMDB Web サイトから映画のポスターを取得します。次に、ポスターは VGG16 に送信され、ニューラル ネットワークがトレーニングされます。最後に、VGG16 によって学習された特徴を使用してコサイン類似度を計算します。映画の類似性を取得した後、最も類似性の高い映画を推奨できます。 VGG16 には合計 25088 個の学習済み機能があり、データセット内の各映画を説明するために使用されます。

ディープラーニングを使った映画推薦システムを見てみましょう。

フラッシュポイントはロマンスドラマではもう登場しません!これらの映画のポスターには、濃い青、キャラクターが描かれているなど、いくつかの共通の特徴があります。もう一度トイストーリーを観てみましょう。

「フォレスト・ガンプ」はもうお勧めできません!結果は良さそうです。とても満足しています。他のものも試してみます!

これらのポスターにはすべて 1 人または 2 人の人物が描かれており、クールな色彩テーマになっていることに注目してください。

これらのポスターは、対応する映画の雰囲気が楽しく、緊張感があり、アクションシーンが多いことを観客に知らせたいので、ポスターの色も非常に強力です。

前のセットとは異なり、これらのポスターは観客に、これらの映画は一人の男性に関するものであることを伝えたいのです。

カンフー・パンダに似た映画を見つけました。

このグループはとても興味深いです。そっくりなモンスターたちとトム・クルーズ!

これらのポスターにはすべて、同じようなポーズの女性が登場します。待って、それはオニールだ! ?

スパイダーマンが無事発見されました!

これらのポスターの印刷デザインは非常に似ています。

結論は

レコメンデーション システムでディープラーニングを使用する方法はいくつかあります。

  • 教師なし学習

  • 協調フィルタリングから潜在的特徴を予測する

  • ディープラーニングによって生成された特徴を補助情報として利用する

映画のポスターには、仕掛けや興味を喚起する視覚的な要素があります。このプロジェクトでは、教師なしディープラーニングを使用して、ポスターを通じて映画の類似性を学習しました。もちろん、これはレコメンデーション システムでディープラーニングを使用するための最初のステップに過ぎず、試せることはたくさんあります。たとえば、ディープラーニングを使用して、協調フィルタリングによって生成された潜在的な特徴を予測できます。 Spotify の音楽推奨でも同様のアプローチが採用されています。画像処理の代わりに、曲のサウンドを処理してディープラーニングを使用し、協調フィルタリングで潜在的な特徴を予測します。別の方向性も考えられます。ディープラーニングで学習した特徴を補助情報として利用し、予測の精度を向上させることです。

<<:  TensorFlow 機械学習の初心者向けガイド: 線形回帰を実装するには?

>>:  Node.jsを使用してテキストコンテンツをセグメント化し、キーワードを抽出する

ブログ    
ブログ    

推薦する

開発から生産まで: 機械学習に関する 7 つの実践的な提案

この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...

...

顔認識にはリスクがあり、米国は全面的に禁止しているが、なぜ中国はこれほど広く推進しているのだろうか?

顔認識にはリスクがあり、米国は全面的に禁止しているが、なぜ中国はこれほど広く推進しているのだろうか?...

...

自動運転車の未来はどうなるのか?マッキンゼーは言う

自動運転車は徐々に現実のものとなりつつありますが、まだ多くの疑問が残っています。消費者は本当に運転の...

機械学習の導入を成功させるための3つのヒント

人工知能の時代において、機械学習、自然言語処理 (NLP)、認知検索技術が急速に導入されているのは当...

...

AIがスマートフォンを制御するようになると、アプリ時代の終焉が近づいているかもしれない

Mobile World Congress 2024 で AI について言及しないわけにはいきません...

アルゴリズム実践者が知っておくべき TensorFlow のヒント 10 選

導入これらを習得することで、モデルをより効率的にして開発効率を向上させることができます。 [[343...

2030年までに、人工知能のせいで世界中で8億人が失業するでしょう!ビル・ゲイツの失業者へのアドバイス

[[219257]]人工知能は本質的には人間のシミュレーションです。人間の思考をシミュレートする方法...

暗号化アルゴリズムの革命的な進歩、データ保護の問題を解決するか?

[[423975]]独自のクラウドクラスターを構築するこれらは 50 ドル未満の小型コンピュータで...

...

...

機械学習でよく使われる損失関数についてどれくらい知っていますか?

機械は損失関数を通じて学習します。これは、特定のアルゴリズムが与えられたデータをどれだけ適切にモデル...

ByteDance Wanka Cluster の技術詳細が明らかに: GPT-3 トレーニングが 2 日間で完了、コンピューティング パワーの使用率は Nvidia Megatron-LM を上回る

Sora のテクノロジーの分析が進むにつれて、 AI インフラストラクチャの重要性がますます明らかに...