推荐系统整理(一)Baseline

其实我发现我很多内容都是只有(一)
因为很多东西学了又懒得再发出来了,所以都只剩个开头。往往都觉得,开头必须开个好头,到了后面学了又什么也不想写了。但,总而言之,重要的东西还是记一记。自用自用。
这里是实验室朋友邀请去推荐系统比赛,但···我最近都在搞信号,好久没有做大数据了,得重新看起。首先,对推荐系统常用模型做一个整理吧。(协同那些我就略去了)

Baseline

以均值波动为例(我自己乱创的词)。
一般来说,大数据量的所有人的评分平均,就是一个比较合理的结果。
由于个人原因,每个人对每一个物品的评分都有一些个人化的波动。同时,有些特别烂或者特别好的东西会受到一致差评或好评。那么baseline就是做这样一件事:

  • 求all平均值
  • 求用户评分偏置(波动)
  • 求物品评分偏置(波动)
    预测评分= 均值+波动1+波动2

从而,整个问题变成了求均值,求偏置(user、item)问题。
均值很容易求,可以直接通过python的一些模块求出。
那么针对性的偏置呢?
做线性回归,构建损失函数(比如,均方差),优化损失(比如,梯度下降)。

优化的时候,可以加入正则化系数,避免过拟合。

所以我们要做的事情就是:

  • 计算出所有用户对所有物品评分的平均值
  • 在均值基础上+用户评分偏置+物品评分偏置作为预测评分(这就是我们采用的模型方程)
  • 处理数据:groupby用户数据并聚合(agg)为list(list包含什么列:对不同类型物品的评分和物品id)(agg还可以进行统计操作比如max min等等),看到同个用户的行为统计。物品同理。然后计算global mean。(虽然如此清晰,还是先可视化一下数据再处理,对,还要注意data type)
  • 划分数据集为训练集、测试集。
  • 求解所有用户的评分偏置、所有物品的得分偏置
  • 怎么求解呢?训练,用函
### 实现基于协同过滤的推荐系统 为了构建个基于协同过滤的推荐系统,可以采用矩阵分解方法来预测用户对项目的潜在评分。这种方法的核心是在于根据用户过去的行为数据(如评分和点击),建立用户-项目交互矩阵,并对其进行低秩近似。 #### 数据准备 首先需要收集并整理用户行为的数据集。通常这些数据会被构建成个二维表格形式,其中每行代表位用户,而每列则对应着不同的商品或服务。表内的数值反映了特定用户对该项目的评价分数或其他类型的反馈信息。 ```python import pandas as pd from sklearn.model_selection import train_test_split # 假设有个DataFrame df,包含了'userId', 'movieId', 和 'rating' data = { "userId": [1, 1, 2, 2], "movieId": [10, 20, 10, 30], "rating": [5, 4, 3, 5] } df = pd.DataFrame(data) # 将数据分为训练集和测试集 train_df, test_df = train_test_split(df, test_size=0.2) ``` #### 构建模型 接下来就是创建实际用于做预测的机器学习模型。这里介绍两种常见的做法: ##### 隐语义因子法(SVD++) 隐语义因子法是种广泛应用的技术,它试图找到隐藏在显式评分背后的因素向量。SVD++ 是种改进版本,在考虑直接给出的评价值之外还加入了额外的信息源,比如未打分的商品列表等。 ```python from surprise import SVDpp from surprise import Dataset from surprise import Reader from surprise.model_selection import cross_validate reader = Reader(rating_scale=(1, 5)) dataset = Dataset.load_from_df(train_df[['userId', 'movieId', 'rating']], reader) algo_svdpp = SVDpp() cross_validate(algo_svdpp, dataset, measures=['RMSE'], cv=5, verbose=True) ``` ##### 基于邻域的方法(User-based CF & Item-based CF)种方式是计算相似度得分,即找出那些具有相同喜好的邻居们或是属性相近的产品来进行推荐。对于新加入系统的用户来说,这种方式能够快速提供个性化的建议。 ```python from surprise.prediction_algorithms.knns import KNNWithMeans from surprise.similarities import cosine sim_options_user_based = {'name': 'cosine', 'user_based': True} sim_options_item_based = {'name': 'pearson_baseline', 'user_based': False} algo_ubcf = KNNWithMeans(sim_options=sim_options_user_based) algo_ibcf = KNNWithMeans(sim_options=sim_options_item_based) for algo in [algo_ubcf, algo_ibcf]: cross_validate(algo, dataset, measures=['RMSE'], cv=5, verbose=True) ``` 上述代码展示了如何使用 Surprise 库中的 `KNNWithMeans` 类分别实现了基于用户的协同过滤(user-based CF)以及基于物品的协同过滤(item-based CF)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值