Pythonを使用して独自の映画レコメンデーションシステムを作成する

公開: 2021-03-09

Netflixがあなたの興味に合った映画をどのように提案しているか疑問に思いますか? それとも、ユーザーにもそのような提案をすることができるシステムを構築したいですか?

答えが「はい」の場合、この記事ではPythonを使用して映画のレコメンデーションシステムを構築する方法を説明しているので、適切な場所に来ました。

ただし、「どのように」について説明する前に、「何」に精通している必要があります。

目次

レコメンデーションシステム:それは何ですか?

レコメンデーションシステムは、私たちの日常生活の非常に不可欠な部分になっています。 AmazonやFlipkartなどのオンライン小売業者からYouTubeやFacebookなどのソーシャルメディアプラットフォームまで、すべての主要なデジタル企業はレコメンデーションシステムを使用して、クライアントにパーソナライズされたユーザーエクスペリエンスを提供しています。

日常生活におけるレコメンデーションシステムの例は次のとおりです。

  • 製品を購入するときにAmazonから得られる提案は、レコメンダーシステムの結果です。
  • YouTubeは、レコメンダーシステムを使用して、好みに合った動画を提案します。
  • Netflixには、興味に応じて番組や映画を提案するための有名なレコメンデーションシステムがあります。

レコメンダーシステムは、データを使用してユーザーの製品を提案します。 このデータは、ユーザーが入力した興味や履歴などに関するものである可能性があります。機械学習とAIを研究している場合、レコメンダーシステムの人気が高まり、高度化するにつれて、レコメンダーシステムを研究する必要があります。

レコメンデーションシステムの種類

レコメンデーションシステムには2つのタイプがあります。

1.コラボレーティブレコメンデーションシステム

共同推薦システムは、そのアイテムの類似ユーザーの類似性に従ってアイテムを提案します。 同じような興味や好みを持つユーザーをグループ化し、それに応じて製品を提案します。

たとえば、あなたと他の1人のユーザーがSholayを気に入ったとします。 さて、Sholayを見て気に入った後、他のユーザーはGolmaalが好きになりました。 あなたと他のユーザーは同じような興味を持っているので、レコメンダーシステムはこのデータに基づいてGolmaalを視聴することを提案します。 これは協調フィルタリングです。

2.コンテンツベースのレコメンデーションシステム

コンテンツベースのレコメンダーシステムは、ユーザーから受け取ったデータに基づいてアイテムを提案します。 明示的なデータ(「いいね」、「共有」など)または暗黙的なデータ(監視履歴)に基づく可能性があります。 レコメンデーションシステムは、このデータを使用してユーザー固有のプロファイルを作成し、そのプロファイルに基づいてアイテムを提案します。

基本的な映画推薦システムの構築

レコメンダーシステムの基本について説明したので、映画レコメンダーシステムの構築を始めましょう。

完全なMovieLensデータセットを使用して、Pythonベースの映画レコメンデーションシステムの構築を開始できます。 このデータセットには、2600万以上の評価、45,000以上の映画に適用される750,000のタグアプリケーションが含まれています。 このデータセットに存在するタグゲノムデータには、1200万を超える関連性スコアがあります。

基本的な映画推薦システムを作成するために完全なデータセットを使用しています。 ただし、このプロジェクトでは、より小さなデータセットを自由に使用できます。 まず、必要なすべてのライブラリをインポートする必要があります。

Pythonベースの基本的な映画推薦システムは、映画の人気とジャンルに応じて映画を提案します。 このシステムは、批評家の称賛を受けている人気のある映画は、一般の視聴者に好まれる可能性が高いという考えに基づいて機能します。 このような映画のレコメンデーションシステムは、パーソナライズされた提案を提供しないことに注意してください。

それを実装するために、人気と評価に従って映画を並べ替え、ジャンルの引数を渡して、ジャンルのトップ映画を取得します。

入力

md=pd。 read_csv('../ input / movies_metadata.csv')

md.head()

出力

大人所属_to_collection バジェットジャンルビデオid imdb_id original_title 概要収益タイトル
誤り('id'L 10194、' name':'トイストーリーコレクション') 30000000 [{'id':16、'name':'Animvation'}… 誤り862 tt0114709 トイ・ストーリーウッディが率いるアンディのおもちゃは幸せに暮らしています… 373554033 トイ・ストーリー
1 誤りNaN 65000000 {{'id':12、'name':'Adventure'}… 誤り8844 tt0113497 ジュマンジ兄弟のジュディとピーターが… 262797249 ジュマンジ
2 誤り('id':119050、'name':'Grumpy Old Men) 0 {{'id':10749、'name':'Romance'}… 誤り15602 tt0113228 不機嫌そうな老人家族の結婚式は古代を再燃させます… 0 不機嫌そうな老人
3 誤りNaN 16000000 {{'id':35、'name':'コメディ'}… 誤り31357 tt0114885 息を吐くのを待っています騙され、虐待され、踏みにじられた… 81452156 息を吐くのを待っています

入力

md ['genres'] = md ['genres']。fillna('[]')。apply(literal_eval).apply(lambda x:[i ['name'] for i in x] if isinstance(x、list ) そうしないと [])

私たちのチャートの公式

トップムービーのチャートを作成するために、TMDBの評価を使用しました。 IMDBの加重評価式を使用して、次のようなグラフを作成します。

加重評価(WR)=(iaouaouaouaouaou)

ここで、vは映画が獲得した投票数、mは映画がチャート上で獲得する必要のある最小投票数、Rは映画の平均評価、Cはレポート全体の平均投票数を表します。 。

チャートの作成

データセットと数式が揃ったので、グラフの作成を開始できます。 投票数が95%以上の映画のみをチャートに追加します。 まず、上位250のグラフを作成します。

入力

vote_counts = md [md ['vote_count']。notnull()] ['vote_count']。astype('int')

vote_averages = md [md ['vote_average']。notnull()] ['vote_average']。astype('int')

C =vote_averages.mean()

C

出力

5.244896612406511

入力

m =vote_counts.quantile(0.95)

m

出力

434.0

入力

md ['year'] = pd.to_datetime(md ['release_date']、errors ='coerce')。apply(lambda x:str(x).split('-')[0] if x!=np。 nan else np.nan)

入力

修飾=md[(md ['vote_count']> = m)&(md ['vote_count']。notnull())&(md ['vote_average']。notnull())] [['title'、'year '、'vote_count'、'vote_average'、'人気'、'ジャンル']]

修飾['vote_count']=修飾['vote_count']。astype('int')

修飾['vote_average']=修飾['vote_average']。astype('int')

qualified.shape

出力

(2274、6)

ご覧のとおり、チャートに掲載されるには、映画の投票数が434以上である必要があります。 映画がチャートに入力する必要がある平均評価は5.24であることに気付いたかもしれません。

入力

def weighted_rating(x):

v = x ['vote_count']

R = x ['vote_average']

return(v /(v + m)* R)+(m /(m + v)* C)

入力

qualified ['wr'] =qualified.apply(weighted_rating、axis = 1)

入力

修飾=qualified.sort_values('wr'、ascending = False).head(250)

これらすべてが整ったら、チャートを作成しましょう。

全体的なトップ映画

入力

qualified.head(15)

出力

タイトル投票数投票_平均人気ジャンルwr
15480 インセプション2010年14075 8 29.1081 [アクション、スリラー、サイエンスフィクション、ミステリー、A… 7.917588
12481 ダークナイト2008年12269 8 123.167 [ドラマ、アクション、犯罪、スリラー] 7.905871
22879 星間2014年11187 8 32.2135 [アドベンチャー、ドラマ、サイエンスフィクション] 7.897107
2843 ファイトクラブ1999年9678 8 63.8696 [ドラマ] 7.881753
4863 ロードオブザリング:リングの交わり2001年8892 8 32.0707 [アドベンチャー、ファンタジー、アクション] 7.871787
292 パルプ・フィクション1994年8670 8 140.95 [スリラー、犯罪] 7.868660
314 ショーシャンクの空に1994年8358 8 51.6454 【ドラマ・犯罪】 7.864000
7000 ロードオブザリング:王の帰還2003年8226 8 29.3244 [アドベンチャー、ファンタジー、アクション] 7.861927
351 フォレストガンプ1994年8147 8 48.3072 [コメディ、ドラマ、ロマンス] 7.860656
5814 ロードオブザリング:2つの塔2002年7641 8 29.4235 [アドベンチャー、ファンタジー、アクション] 7.851924
256 スターウォーズ1977 6778 8 42.1497 [アドベンチャー、アクション、サイエンスフィクション] 7.834205
1225 バック・トゥ・ザ・フューチャー1985年6239 8 25.7785 [アドベンチャー、コメディ、サイエンスフィクション、家族] 7.820813
834 ゴッドファーザー1972年6024 8 41.1093 【ドラマ・犯罪】 7.814847
1154 帝国の逆襲1980年5998 8 19.471 [アドベンチャー、アクション、サイエンスフィクション] 7.814099
46 Se7en 1995年5915 8 18.4574 [犯罪、ミステリー、スリラー]

出来上がり、Pythonベースの基本的な映画推薦システムを作成しました!

ここで、レコメンダーシステムの提案をジャンルベースに絞り込み、より正確にできるようにします。 結局のところ、誰もがゴッドファーザーを平等に好きである必要はありません。

ジャンルを絞り込む

そこで、今度はレコメンダーシステムをよりジャンル固有になるように変更します。

入力

s = md.apply(lambda x:pd.Series(x ['genres'])、axis = 1).stack()。reset_index(level = 1、drop = True)

s.name='ジャンル'

gen_md = md.drop('genres'、axis = 1).join(s)

入力

def build_chart(genre、percentile = 0.85):

df = gen_md [gen_md ['genre'] == genre]

vote_counts = df [df ['vote_count']。notnull()] ['vote_count']。astype('int')

vote_averages = df [df ['vote_average']。notnull()] ['vote_average']。astype('int')

C =vote_averages.mean()

m =vote_counts.quantile(パーセンタイル)

修飾=df[(df ['vote_count']> = m)&(df ['vote_count']。notnull())&(df ['vote_average']。notnull())] [['title'、'year '、'vote_count'、'vote_average'、'人気']]

修飾['vote_count']=修飾['vote_count']。astype('int')

修飾['vote_average']=修飾['vote_average']。astype('int')

qualified ['wr'] =qualified.apply(lambda x:(x ['vote_count'] /(x ['vote_count'] + m)* x ['vote_average'])+(m /(m + x ['投票数'])* C)、axis = 1)

修飾=qualified.sort_values('wr'、ascending = False).head(250)

資格を返す

これで、恋愛小説のジャンルの映画を分類し、上位の映画を推薦するレコメンダーシステムを作成しました。 以前のチャートではあまり表示されなかったため、ロマンスのジャンルを選択しました。

ロマンスのトップ映画

入力

build_chart('Romance')。head(15)

出力

タイトル投票数投票_平均人気wr
10309 Dilwale Dulhania Le Jayenge 1995年661 9 34.457 8.565285
351 フォレストガンプ1994年8147 8 48.3072 7.971357
876 めまい1958年1162 8 18.2082 7.811667
40251 あなたの名前。 2016年1030 8 34.461252 7.789489
883 お熱いのがお好き1959年835 8 11.8451 7.745154
1132 シネマパラディソ1988年834 8 14.177 7.744878
19901 ペーパーマン2012年734 8 7.19863 7.713951
37863 シングストリート2016年669 8 10.672862 7.689483
882 アパート1960年498 8 11.9943 7.599317
38718 お嬢さん2016年453 8 16.727405 7.566166
3189 街の明かり1931年444 8 10.8915 7.558867
24886 彼の見た目2014年262 8 5.71127 7.331363
45437 ハートビートで2017年146 8 20.82178 7.003959
1639 タイタニック1997年7770 7 26.8891 6.981546
19731 世界にひとつのプレイブック2012年4840 7 14.4881 6.970581

これで、選択したジャンルに応じて上位の映画を提案する映画推薦システムができました。 このレコメンダーシステムを、アクション、ドラマ、サスペンスなどの他のジャンルでもテストすることをお勧めします。レコメンダーシステムが提案するお気に入りのジャンルの上位3本の映画を下のコメントセクションで共有してください。

映画レコメンデーションシステムの詳細

お気づきの方もいらっしゃると思いますが、Pythonベースの映画レコメンデーションシステムの構築は非常に簡単です。 必要なのは、データサイエンスに関する少しの知識と、完全に機能するレコメンダーシステムを作成するための少しの努力だけです。

ただし、より高度なレコメンダーシステムを構築したい場合はどうでしょうか。 大企業が使用を検討する可能性のあるレコメンダーシステムを作成したい場合はどうなりますか?

レコメンダーシステムとデータサイエンスについて詳しく知りたい場合は、データサイエンスコースを受講することをお勧めします。 コースでは、データサイエンスと機械学習の基本的かつ高度な概念をすべて学びます。 さらに、疑問や混乱を避けるために、コース全体を通してあなたを導く業界の専門家から学びます。

upGradでは、複数のデータサイエンスと機械学習のコースを提供しています。 あなたの興味に応じて、以下から誰でも選ぶことができます:

  • データサイエンスのPGディプロマ
  • データサイエンスの科学のマスター
  • データサイエンスのPG認定
  • 機械学習とAIのPGディプロマ
  • 機械学習とAIの科学のマスター

これらのコースとは別に、データサイエンスと機械学習に関する他の多くのコースを提供しています。 ぜひチェックしてみてください!

最終的な考え

これで、映画のレコメンデーションシステムを構築する方法がわかりました。 システムを作成したら、必ず他の人と共有し、進捗状況を示してください。 レコメンダーシステムにはさまざまな用途があるため、それらについて学ぶことで、業界で確実に優位に立つことができます。

協調フィルタリングとは何ですか?そのタイプは何ですか?

協調フィルタリングは、ユーザーの好みに基づいてモデルを構築するアプローチの一種の推奨システムです。 ユーザーの履歴は、協調フィルタリングのデータセットとして機能します。 協調フィルタリングには、以下に示す2つのタイプがあります。

1.ユーザーベースの協調フィルタリング:このタイプの協調フィルタリングの背後にある考え方は、ユーザーを優先して、たとえば「A」と言い、同様の設定を持つ他のユーザーを見つけて、これらのユーザーの設定を「A」に提供することです。まだ遭遇していません。
アイテムベースの協調フィルタリング:ここでは、同じような好みのユーザーを見つける代わりに、「A」の好みに似た映画を見つけて、まだ視聴していない映画をお勧めします。

コンテンツベースのフィルタリングの長所と短所は何ですか?

コンテンツベースのフィルタリングは、ユーザーからデータを収集し、それに応じてアイテムを提案します。 その長所と短所のいくつかを以下に示します。
利点
1.協調フィルタリングとは異なり、モデルはプライマリユーザー自体からの提案を受け取るため、同様の設定を持つ他のユーザーに関するデータを収集する必要はありません。
2.モデルは、他の数人だけが見たあなたの好みに応じて、あなたに最高の映画のいくつかを推薦することができます。
短所
1.この手法では、特定のドメインに関する多くの情報が必要になるため、提供される機能の品質は、手作業で設計された機能とほぼ同じです。
2.ユーザーの既存の関心に応じてのみ機能するため、映画を推奨する機能は制限されています。

協調フィルタリングアルゴリズムを使用する人気のあるアプリケーションはどれですか?

協調フィルタリングアルゴリズムは、多くの一般的なアプリケーションの主要な駆動アルゴリズムになりつつあります。 ますます多くの企業が、リッチなパーソナライズされたコンテンツの配信に焦点を合わせています。 たとえば、このメッセージは多くのeコマースWebサイトで見たことがあるでしょう。これを購入した顧客も購入しました。
以下は、世界中で人気のあるユーザーベースを持つアプリケーションの一部です。
1. YouTubeは、このアルゴリズムを他のいくつかの強力なアルゴリズムとともに使用して、ホームページに推奨ビデオを提供します。
2. Amazon、Flipkart、MyntraなどのEコマースWebサイトも、このアルゴリズムを使用して製品の推奨事項を提供します。
3.ビデオストリーミングプラットフォームは、ユーザー評価、平均評価、および関連コンテンツを使用してパーソナライズされた提案を提供する、ここでの最大の例です。