从零搭建推荐系统—算法篇( 二 )


接下来需要对整个样本集做处理,否则会引入大量噪声,不能让模型很好的拟合出样本分布 。
非真实用户访问样本
例如爬虫、机器人等大量非真实用户的频繁访问,带来大量高曝光未点击行为,会严重影响样本数据分布,一段时间窗口有大量相同用户id频繁访问远超正常访问量的均值等,刷次数方差较大的数据需要去除
极少行为用户样本
这类用户样本虽然是真实行为,但极少的行为并不能为其在模型中找到属于该类用户的“规律”,或者说引入这些数据后,模型会开始学习这类用户的数据分布,对整体分布的拟合带来噪声,易引起模型过拟合 。通常对这类用户可以看做类似新用户,通过用户冷启动的手段为其探索兴趣补充推荐 。
特征缺失值及异常值等处理
这里参考特征工程处理方法,针对方差较大的少量异常值做抛弃或均值处理,缺失值用均值或中值代替等
正负样本处理
机器学习中正负样本的选取也直接关系着训练出的模型效果,在推荐系统中不同公司也有针对自家业务采取的样本划分方法 。

  • 一次请求会产生N条推荐结果,但大部分手机端通常用户只能看到其中的m条,m<N,通过客户端埋点计算出用户真实可见曝光的物料,在这批物料中选取点击与未点击样本直观上一次曝光中可能有点击或无点击
  • 早期yutube推荐中,会对所有用户选取相同数量训练样本,可以同时避免低活跃用户和高活跃用户对整体模型的影响,使训练的模型更符合绝大多数用户行为
  • 对于有曝光无点击行为的用户,其曝光未点击的负样本可随机选取,这样可以学到这类用户“不感兴趣”的部分
  • 样本在通过定时任务整合时需要做shuffle打散,避免同类用户样本数据扎堆引起数据分布偏差,在训练模型时,也通过batch训练方式中每个batch的样本也进行shuffle打散
总之正负样本处理还是要根据深入理解业务和用户行为基础上进行调整,可以让模型学习到更适合的效果 。
生成样本数据后,将样本随机分成训练集与测试集,一般为七三开或八二开,丢给模型来训练了
模型训练首次搭建排序模型可以先用基础模型如LR或GBDT跑出一个baseline快速上线,后续逐步迭代为复杂模型 。推荐算法模型一般经历了由简入繁的过程,数据量不断增大,模型不断复杂,大规模数据集下深度学习模型已经逐渐成为主流,但这也是行业头部公司所独享,只有他们才有足够的数据和算力来支撑庞大复杂的模型,绝大多数公司在中等数据集下,仍然使用主流的线性模型,通过分析用户行为及数据,构建特征工程及样本数据优化,得来的效果要比深度学习模型更好 。
从零搭建推荐系统—算法篇

文章插图
 
模型训练过程根据使用的框架不同,大体流程可以统一成下面的伪代码
# 从文件读入训练集与测试集 train_data = https://www.isolves.com/it/cxkf/sf/2021-04-27/read(TRAIN_DATA_FILE) test_data = read(TEST_DATA_FILE) # 对数据处理并生成样本与特征数据结构 y_train, x_train = preprocess(train_data) y_test, x_test = preprocess(test_data) # 实例化模型,传入参数 # 对经典模型各主流框架中只需传入参数,若需对模型结构调整需要自己实现模型结构 model = SomeModel(y_train, x_train, y_test, x_test, batchsize, optimizer, learning_rate, other_param...) # 开始训练 model.fit() # 评估模型效果 model.evaluate() 通过优化训练数据、优化模型超参等方法训练得到AUC指标较好的模型,可提供给线上应用 。模型训练可根据数据量和计算复杂度离线按天或小时定时训练更新 。
线上预测通常线上使用预测服务的形式实时提供模型推断功能,这时需要通过推荐引擎接口将待排序候选集的物料id、用户id以及请求上下文信息传给预测服务 。预测服务中也分为特征抽取、物料打分排序、模型同步校验等模块 。通过传入的物料id及用户id,可以从特征库中在线抽取特征,结合上下文特征得到所有候选集的特征信息,进而通过模型中各特征权重,计算每个物料的打分 。这个过程中注意被抽取的特征id要同训练好模型中的特征权重id保持一致,同时各物料特征抽取和打分过程可以通过并行化方式提升系统性能 。训练好的模型由离线训练流程定时同步到线上预测服务机器,注意同步时需要同时把模型的checksum一并同步并在服务端进行校验,当同步失败时仍使用缓存的上次同步模型进行预测,避免数据不一致 。候选集物料被打分后进行整体排序,结果返回给推荐引擎 。


推荐阅读