Pythonを使用して独自の映画レコメンデーションシステムを作成する
公開: 2021-03-09Netflixがあなたの興味に合った映画をどのように提案しているか疑問に思いますか? それとも、ユーザーにもそのような提案をすることができるシステムを構築したいですか?
答えが「はい」の場合、この記事では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つのタイプがあります。 コンテンツベースのフィルタリングは、ユーザーからデータを収集し、それに応じてアイテムを提案します。 その長所と短所のいくつかを以下に示します。 協調フィルタリングアルゴリズムは、多くの一般的なアプリケーションの主要な駆動アルゴリズムになりつつあります。 ますます多くの企業が、リッチなパーソナライズされたコンテンツの配信に焦点を合わせています。 たとえば、このメッセージは多くのeコマースWebサイトで見たことがあるでしょう。これを購入した顧客も購入しました。協調フィルタリングとは何ですか?そのタイプは何ですか?
1.ユーザーベースの協調フィルタリング:このタイプの協調フィルタリングの背後にある考え方は、ユーザーを優先して、たとえば「A」と言い、同様の設定を持つ他のユーザーを見つけて、これらのユーザーの設定を「A」に提供することです。まだ遭遇していません。
アイテムベースの協調フィルタリング:ここでは、同じような好みのユーザーを見つける代わりに、「A」の好みに似た映画を見つけて、まだ視聴していない映画をお勧めします。 コンテンツベースのフィルタリングの長所と短所は何ですか?
利点
1.協調フィルタリングとは異なり、モデルはプライマリユーザー自体からの提案を受け取るため、同様の設定を持つ他のユーザーに関するデータを収集する必要はありません。
2.モデルは、他の数人だけが見たあなたの好みに応じて、あなたに最高の映画のいくつかを推薦することができます。
短所
1.この手法では、特定のドメインに関する多くの情報が必要になるため、提供される機能の品質は、手作業で設計された機能とほぼ同じです。
2.ユーザーの既存の関心に応じてのみ機能するため、映画を推奨する機能は制限されています。 協調フィルタリングアルゴリズムを使用する人気のあるアプリケーションはどれですか?
以下は、世界中で人気のあるユーザーベースを持つアプリケーションの一部です。
1. YouTubeは、このアルゴリズムを他のいくつかの強力なアルゴリズムとともに使用して、ホームページに推奨ビデオを提供します。
2. Amazon、Flipkart、MyntraなどのEコマースWebサイトも、このアルゴリズムを使用して製品の推奨事項を提供します。
3.ビデオストリーミングプラットフォームは、ユーザー評価、平均評価、および関連コンテンツを使用してパーソナライズされた提案を提供する、ここでの最大の例です。