HOOOS

Python快速上手:构建并评估你的第一个用户行为推荐系统

0 14 推荐小能手 Python推荐系统Surprise
Apple

Python快速上手:构建并评估你的第一个用户行为推荐系统

想不想拥有一个能猜中用户心思的推荐系统?今天,就带你用Python从零开始,构建一个基于用户历史行为的简易推荐系统,并学会如何评估它的效果。别害怕,这比你想象的要容易!

1. 推荐系统:原理与算法初探

推荐系统,顾名思义,就是根据用户的喜好和行为,推荐他们可能感兴趣的东西。常见的推荐算法有很多,但对于入门来说,协同过滤是最容易理解和实现的。

协同过滤的核心思想是:物以类聚,人以群分。简单来说,就是如果两个用户对某些物品的喜好相似,那么他们对其他物品的喜好也很可能相似;如果两个物品被很多用户喜欢,并且这些用户之间也有很多共同的喜好,那么这两个物品也很可能相似。

协同过滤又分为以下两种:

  • 基于用户的协同过滤 (User-Based Collaborative Filtering):找到与目标用户兴趣相似的用户群体,然后将这些用户喜欢但目标用户未接触过的物品推荐给目标用户。
  • 基于物品的协同过滤 (Item-Based Collaborative Filtering):计算物品之间的相似度,然后将与目标用户喜欢的物品相似的物品推荐给目标用户。

对于初学者,基于物品的协同过滤往往更简单,效果也更好,因为它更稳定,受新用户的影响较小。因此,我们这里选择基于物品的协同过滤。

2. Python库:Surprise闪亮登场

为了简化开发,我们使用一个强大的Python推荐系统库:Surprise (Simple Python RecommendatIon System Engine)。Surprise内置了多种推荐算法,并提供了方便的评估工具。

安装Surprise:

pip install scikit-surprise

安装完成后,就可以开始使用了。

3. 数据准备:让推荐系统“吃饱饭”

推荐系统需要数据才能工作。这里我们使用Surprise自带的MovieLens数据集,它包含了用户对电影的评分数据。

from surprise import Dataset

data = Dataset.load_builtin('ml-100k') # 加载MovieLens 100k数据集

这个数据集包含了用户ID、电影ID和评分三个字段。你可以把它想象成一张表格,每一行代表一个用户对一部电影的评分。

如果你有自己的数据:

Surprise也支持自定义数据集。你需要将数据整理成特定的格式,然后使用Reader类来读取。

例如,如果你的数据是CSV格式,包含user_id, item_id, rating三个字段,你可以这样读取:

from surprise import Reader
from surprise import Dataset

reader = Reader(line_format='user item rating', sep=',', rating_scale=(1, 5))
data = Dataset.load_from_file('your_data.csv', reader=reader)

4. 算法选择与训练:打造推荐引擎

Surprise提供了多种推荐算法,例如:

  • KNN算法 (K-Nearest Neighbors):基于邻近用户的评分进行预测。
  • SVD算法 (Singular Value Decomposition):矩阵分解算法,将用户-物品评分矩阵分解为用户特征矩阵和物品特征矩阵。
  • NMF算法 (Non-negative Matrix Factorization):非负矩阵分解算法,与SVD类似,但要求分解后的矩阵为非负。

对于初学者,SVD算法通常是一个不错的选择,因为它效果较好,并且易于理解。

from surprise import SVD
from surprise.model_selection import train_test_split

trainset, testset = train_test_split(data, test_size=0.25) # 将数据集划分为训练集和测试集
algo = SVD()
algo.fit(trainset) # 在训练集上训练算法

5. 预测与推荐:让系统“大显身手”

训练完成后,就可以使用模型进行预测和推荐了。

预测单个用户对单个物品的评分:

user_id = '196' # 用户ID
item_id = '242' # 电影ID
rating = algo.predict(user_id, item_id).est # 预测用户196对电影242的评分
print(f'用户 {user_id} 对电影 {item_id} 的预测评分: {rating}')

为用户推荐N个最感兴趣的物品:

from collections import defaultdict

def get_top_n(predictions, n=10):
    top_n = defaultdict(list)
    for uid, iid, true_r, est, _ in predictions:
        top_n[uid].append((iid, est))

    for uid, user_ratings in top_n.items():
        user_ratings.sort(key=lambda x: x[1], reverse=True)
        top_n[uid] = user_ratings[:n]

    return top_n

predictions = algo.test(testset)
top_n = get_top_n(predictions, n=10)

for uid, user_ratings in top_n.items():
    print(f'用户 {uid} 推荐列表:')
    for iid, rating in user_ratings:
        print(f'  电影 {iid}: {rating}')

这段代码首先遍历所有预测结果,将每个用户的评分最高的N个物品保存在一个字典中。然后,它遍历这个字典,打印每个用户的推荐列表。

6. 评估指标:衡量推荐效果

推荐系统的好坏需要评估。常见的评估指标有:

  • 均方根误差 (RMSE):衡量预测评分与实际评分之间的偏差。
  • 平均绝对误差 (MAE):与RMSE类似,但对异常值不敏感。
  • 准确率 (Precision):推荐的物品中,用户真正感兴趣的比例。
  • 召回率 (Recall):用户感兴趣的物品中,被推荐的比例。

Surprise提供了方便的评估工具:

from surprise import accuracy

accuracy.rmse(predictions) # 计算RMSE
accuracy.mae(predictions) # 计算MAE

理解准确率和召回率:

准确率和召回率通常用于评估推荐列表的质量。准确率高意味着推荐的物品更精准,召回率高意味着推荐的物品更全面。在实际应用中,需要根据具体场景权衡准确率和召回率。

7. 优化与改进:让推荐系统更上一层楼

这只是一个简单的推荐系统,还有很多可以优化和改进的地方:

  • 尝试不同的算法:Surprise提供了多种算法,可以尝试不同的算法,看看哪个效果更好。
  • 调整算法的参数:每种算法都有很多参数可以调整,可以通过交叉验证等方法找到最佳参数。
  • 加入更多特征:除了用户ID和物品ID,还可以加入用户的年龄、性别、职业等信息,以及物品的类别、标签等信息,以提高推荐的准确性。
  • 处理冷启动问题:对于新用户或新物品,由于缺乏历史数据,推荐效果往往较差。可以采用一些特殊的策略来处理冷启动问题,例如:基于内容的推荐、热门推荐等。

总结

通过本文,你已经学会了使用Python和Surprise库构建一个简单的基于用户历史行为的推荐系统,并学会了如何评估它的效果。记住,这只是一个开始,推荐系统是一个充满挑战和机遇的领域,希望你能不断学习和探索,打造出更智能、更个性化的推荐系统!

更深入的学习资源:

祝你学习愉快!

点评评价

captcha
健康