推荐系统通过分析用户的行为数据和物品的特征信息,向用户推送其可能感兴趣的内容,是提升平台用户留存和转化的重要手段。用Python构建推荐系统的过程逻辑清晰,核心围绕数据、算法、评估三个维度展开。

推荐系统的基础准备
在构建推荐系统前,需要先准备好对应的数据集,常见的公开数据集有MovieLens电影评分数据集、电商用户行为数据集等。数据集通常包含用户ID、物品ID、用户行为得分、物品特征等字段,首先需要对数据进行清洗和预处理。
数据预处理步骤
- 去除重复数据和缺失值,保证数据完整性
- 对用户行为数据进行归一化处理,统一评分尺度
- 拆分训练集和测试集,通常按照8:2的比例划分
import pandas as pd
from sklearn.model_selection import train_test_split
# 读取数据集,这里以MovieLens小数据集为例
data = pd.read_csv('ratings.csv')
# 查看数据基本信息
print(data.head())
# 去除缺失值
data = data.dropna()
# 拆分训练集和测试集
train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
print(f"训练集大小: {len(train_data)}, 测试集大小: {len(test_data)}")
推荐算法核心流程解析
推荐算法的核心流程可以分为四个关键环节,每个环节都直接影响最终推荐的效果。
1. 特征工程
特征工程的作用是从原始数据中提取对推荐有用的特征,包括用户特征、物品特征、交叉特征等。例如用户的年龄、性别、历史行为偏好,物品的类别、标签、发布时间等,都可以作为推荐的特征输入。
2. 算法选型
常用的推荐算法分为三类,开发者可以根据业务场景选择合适的算法:
| 算法类型 | 核心逻辑 | 适用场景 |
|---|---|---|
| 协同过滤 | 基于用户或物品的行为相似度进行推荐 | 用户和物品数量适中的场景 |
| 基于内容的推荐 | 基于物品的特征和用户的历史偏好匹配推荐 | 物品特征丰富的场景 |
| 混合推荐 | 结合多种算法的优势进行推荐 | 对推荐精度要求高的场景 |
3. 模型训练
以最经典的协同过滤算法中的用户协同过滤为例,计算用户之间的相似度,找到和目标用户兴趣相似的其他用户,将这些用户喜欢的物品推荐给目标用户。
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
# 构建用户-物品评分矩阵
user_item_matrix = train_data.pivot_table(index='userId', columns='movieId', values='rating').fillna(0)
# 计算用户之间的余弦相似度
user_similarity = cosine_similarity(user_item_matrix)
user_similarity_df = pd.DataFrame(user_similarity, index=user_item_matrix.index, columns=user_item_matrix.index)
def get_recommendations(user_id, top_n=5):
# 获取和目标用户最相似的10个用户
similar_users = user_similarity_df[user_id].sort_values(ascending=False)[1:11]
# 获取相似用户看过的电影,且目标用户没看过的
user_movies = set(user_item_matrix.loc[user_id][user_item_matrix.loc[user_id] > 0].index)
recommend_scores = {}
for similar_user_id, similarity in similar_users.items():
similar_user_movies = set(user_item_matrix.loc[similar_user_id][user_item_matrix.loc[similar_user_id] > 0].index)
# 过滤掉目标用户已经看过的电影
new_movies = similar_user_movies - user_movies
for movie in new_movies:
# 加权计算推荐得分
if movie not in recommend_scores:
recommend_scores[movie] = 0
recommend_scores[movie] += similarity * user_item_matrix.loc[similar_user_id, movie]
# 按得分排序,返回前top_n个推荐
sorted_recommend = sorted(recommend_scores.items(), key=lambda x: x[1], reverse=True)
return [movie_id for movie_id, score in sorted_recommend[:top_n]]
# 测试推荐结果
test_user_id = 1
recommend_list = get_recommendations(test_user_id)
print(f"为用户{test_user_id}推荐的电影ID列表: {recommend_list}")
4. 模型评估
推荐模型的评估需要使用对应的评估指标,常用的指标包括准确率、召回率、F1值、均方根误差等。以准确率召回率为例,计算推荐结果中用户实际喜欢的物品占比,以及用户实际喜欢的物品中被推荐出来的占比。
from sklearn.metrics import accuracy_score, recall_score
def evaluate_model(test_data, top_n=5):
total_precision = 0
total_recall = 0
test_users = test_data['userId'].unique()
for user_id in test_users:
# 获取测试集中该用户实际喜欢的物品
actual_movies = set(test_data[test_data['userId'] == user_id]['movieId'])
# 获取模型推荐的物品
recommend_movies = set(get_recommendations(user_id, top_n))
if len(recommend_movies) == 0:
continue
# 计算命中数
hit_count = len(actual_movies & recommend_movies)
# 计算准确率和召回率
precision = hit_count / len(recommend_movies) if len(recommend_movies) > 0 else 0
recall = hit_count / len(actual_movies) if len(actual_movies) > 0 else 0
total_precision += precision
total_recall += recall
avg_precision = total_precision / len(test_users)
avg_recall = total_recall / len(test_users)
print(f"平均准确率: {avg_precision:.4f}, 平均召回率: {avg_recall:.4f}")
return avg_precision, avg_recall
# 执行评估
evaluate_model(test_data)
推荐系统的优化方向
基础的推荐系统搭建完成后,还可以从多个方向进行优化提升效果。例如引入时间序列特征,考虑用户兴趣的漂移;加入冷启动处理方案,解决新用户和新物品没有行为数据的问题;结合深度学习模型,使用神经网络提取更复杂的特征关系,进一步提升推荐的准确性和多样性。