レコメンデーション システムの仕組み
I レコメンデーションシステム これらは、最も広く普及し、収益性の高いアプリケーションの 1 つです。 機械学習。 Amazon、Netflix、Spotify、YouTube など、ほぼあらゆるものからのレコメンデーションを強化します。 ユーザーエクスペリエンスをパーソナライズするプラットフォーム。目標はユーザーの好みを予測することです まだ発見していない関連コンテンツを提案します。 Amazonの売上の35%を占めると推定されています Netflix で視聴されるコンテンツの 80% はレコメンデーション システムによるものです。
主なアプローチは 3 つあります。 協調フィルタリング (行動に基づいて 同様のユーザーの)、 コンテンツベースのフィルタリング (アイテムの特性に基づく) そして ハイブリッドアプローチ 両方を組み合わせてそれぞれの限界を克服します。
この記事で学べること
- 協調フィルタリング: ユーザーベースおよびアイテムベース
- コンテンツベースのフィルタリング: 機能の類似性
- 行列分解: SVD と NMF
- ハイブリッド システムとコールド スタート問題
- 評価指標: Precision@K、NDCG、RMSE
- Pythonによる実践実装
協調フィルタリング
Il 協調フィルタリング これは、過去に同じような嗜好を持つユーザーが存在するという考えに基づいています。 彼らは将来同じような好みを持つでしょう。そこには ユーザーアイテムマトリックス 基本的なデータ構造は次のとおりです。 行はユーザー、列は項目、値は評価 (またはインタラクション) です。このマトリックス 通常はたくさんあります 散らばっている: 各ユーザーはごく一部とのみ対話しました 利用可能なアイテムの数。
Il ユーザーベースのCF ターゲットと似たユーザーを見つけて、そのユーザーにおすすめのアイテムを提案します。 彼らは感謝していました。ザ」アイテム系CF ユーザーが気に入ったアイテムに似たアイテムを見つけてそこに配置します 推奨します。類似性は通常、次の方法で測定されます。 少し似ている または ピアソン相関.
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# User-Item Matrix (0 = non valutato)
# Righe: utenti, Colonne: film
ratings = np.array([
[5, 3, 0, 1, 4], # Utente 0
[4, 0, 0, 1, 5], # Utente 1
[1, 1, 0, 5, 0], # Utente 2
[0, 0, 5, 4, 0], # Utente 3
[0, 3, 4, 0, 0], # Utente 4
])
film_names = ['Matrix', 'Inception', 'Notebook', 'Titanic', 'Interstellar']
# --- USER-BASED CF ---
# Calcola similarità' tra utenti (usando solo film valutati in comune)
user_similarity = cosine_similarity(ratings)
np.fill_diagonal(user_similarity, 0) # escludi auto-similarità'
def predict_user_based(user_id, item_id, ratings, similarity, k=2):
"""Predici il rating dell'utente per un item."""
# Trova i k utenti più' simili che hanno valutato l'item
item_ratings = ratings[:, item_id]
rated_mask = item_ratings > 0
rated_mask[user_id] = False # escludi l'utente stesso
if not rated_mask.any():
return 0
sim_scores = similarity[user_id][rated_mask]
user_ratings = item_ratings[rated_mask]
# Top-k più' simili
top_k_idx = np.argsort(sim_scores)[-k:]
top_sims = sim_scores[top_k_idx]
top_ratings = user_ratings[top_k_idx]
if top_sims.sum() == 0:
return 0
return np.dot(top_sims, top_ratings) / top_sims.sum()
# Predizioni per Utente 0 su film non visti
user = 0
print(f"Raccomandazioni per Utente {user}:")
for item in range(ratings.shape[1]):
if ratings[user, item] == 0:
pred = predict_user_based(user, item, ratings, user_similarity)
print(f" {film_names[item]:<15s}: rating predetto = {pred:.2f}")
コンテンツベースのフィルタリング
Il コンテンツベースのフィルタリング ユーザーがすでに高く評価しているアイテムと同様のアイテムを推奨します。 に基づいて 特徴 項目(映画のジャンル、監督、俳優、アーティスト、 ジャンル、音楽の BPM)。各アイテムは特徴ベクトルとして表現され、類似度は アイテム間のコサイン類似度を使用して計算されます。アイテムのコールドスタート問題に悩まされません(それだけです) 特性を知っています)が、ユーザーのプロフィール以外のアイテムを推奨することはできません。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# Database film con descrizioni
films = {
'Matrix': 'sci-fi action cyberpunk hacker virtual reality',
'Inception': 'sci-fi action dreams psychological thriller',
'Notebook': 'romance drama love story emotional',
'Titanic': 'romance drama historical ship love',
'Interstellar': 'sci-fi space exploration time gravity',
'Blade Runner': 'sci-fi cyberpunk android dystopia',
'Pride and Prejudice': 'romance historical drama society',
'Dark Knight': 'action superhero crime thriller',
}
# Crea matrice TF-IDF dalle descrizioni
film_names = list(films.keys())
descriptions = list(films.values())
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(descriptions)
# Calcola similarità' tra tutti i film
item_similarity = cosine_similarity(tfidf_matrix)
def recommend_content_based(liked_films, all_films, similarity, n=3):
"""Raccomanda film simili a quelli apprezzati."""
liked_idx = [all_films.index(f) for f in liked_films if f in all_films]
# Media della similarità' con i film apprezzati
scores = np.zeros(len(all_films))
for idx in liked_idx:
scores += similarity[idx]
scores /= len(liked_idx)
# Escludi film gia' visti
for idx in liked_idx:
scores[idx] = -1
# Top-N raccomandazioni
top_idx = np.argsort(scores)[::-1][:n]
return [(all_films[i], scores[i]) for i in top_idx]
# Raccomanda basandosi sui film apprezzati
liked = ['Matrix', 'Interstellar']
recs = recommend_content_based(liked, film_names, item_similarity)
print(f"Ti sono piaciuti: {liked}")
print("Raccomandazioni:")
for film, score in recs:
print(f" {film:<25s} (score: {score:.3f})")
行列分解: SVD
La 行列分解 ユーザー項目の疎行列を 2 つの低密度行列に分解します。 次元: 1 つはユーザー用、もう 1 つはアイテム用です。これらの行列の積は次のように近似します。 元の行列を作成し、欠損値を予測で埋めます。 SVD (特異値分解) e NMF (非負行列因数分解) 最もよく使われるテクニックです。要因 潜在的な概念は、好みのジャンルや物語のスタイルなどの抽象的な概念を捉えます。
コールドスタートの問題
Il コールドスタートの問題 レコメンダ システムの最大の課題は次のとおりです。 人にどのように勧めるか 新しいユーザー 私たちが知らないのは誰の好みですか?お勧め方法 ある 新しいアイテム まだ誰も評価してないの?解決策には次のものが含まれます。 イニシャル (オンボーディング クイズ)、人口統計情報の使用、コンテンツ ベースの組み合わせ ( アイテムのコールドスタート) と協調フィルタリングを使用し、フォールバックとして人気に基づく推奨事項を使用します。
共同作業とコンテンツベース: 協調フィルタリングにより予期せぬ好みが明らかになります (セレンディピティ)しかし、コールドスタートに悩まされます。コンテンツベースでは他のユーザーに関するデータは必要ありませんが、 ユーザーのプロファイルに限定されます (フィルター バブル)。ハイブリッド システムは両方の長所を組み合わせます 業界では標準的な選択肢です。
評価指標
レコメンダー システムのメトリクスはメトリクスに分割されます 評価予測 (RMSE、MAE) とメトリクス ランキング (Precision@K、Recall@K、NDCG)。 プレシジョン@K トップ K で推奨されている項目のうち、関連する項目がいくつあるかを測定します。 NDCG (正規化割引累積) ゲイン) 位置が考慮されます。最初の位置にある関連アイテムは、2 番目の位置よりも価値があります。 十分の一を納める。 命中率 少なくとも 1 つの関連項目が出現する確率を測定します。 推奨事項。
重要なポイント
- 協調フィルタリングは類似したユーザーを利用します。コンテンツベースではアイテムの機能を活用します
- コサイン類似度は類似性を測定するための標準的な指標です
- マトリックス因数分解 (SVD) は、ユーザーアイテムマトリックスを潜在的な因子に分解します。
- コールドスタートの問題にはハイブリッド戦略とインテリジェントなフォールバックが必要です
- Precision@K と NDCG は推奨事項を評価するための最も重要な指標です
- ハイブリッド システム (コラボレーション + コンテンツ ベース) が業界標準です







