排序流程包括离线排序和在线排序:

  • 离线排序 读取前天(第 T - 2 天)之前的用户行为数据作为训练集,对离线模型进行训练;训练完成后,读取昨天(第 T - 1 天)的用户行为数据作为验证集进行预测,根据预测结果对离线模型进行评估;若评估通过,当天(第 T 天)即可将离线模型更新到定时任务中,定时执行预测任务;明天(第 T + 1 天)就能根据今天的用户行为数据来观察更新后离线模型的预测效果。(注意:数据生产有一天时间差,第 T 天生成第 T - 1 天的数据)
  • 在线排序 读取前天(第 T - 2 天)之前的用户行为数据作为训练集,对在线模型进行训练;训练完成后,读取昨天(第 T - 1 天)的用户行为数据作为验证集进行预测,根据预测结果对在线模型进行评估;若评估通过,当天(第 T 天)即可将在线模型更新到线上,实时执行排序任务;明天(第 T + 1 天)就能根据今天的用户行为数据来观察更新后在线模型的预测效果。

这里再补充一个数据集划分的小技巧:可以横向划分,随机或按用户或其他样本选择策略;也可以纵向划分,按照时间跨度,比如一周的数据中,周一到周四是训练集,周五周六是测试集,周日是验证集。

利用排序模型可以进行评分预测和用户行为预测,通常推荐系统利用排序模型进行用户行为预测,比如点击率(CTR)预估,进而根据点击率对物品进行排序,目前工业界常用的点击率预估模型有如下 3 种类型:

  • 宽模型 + 特征⼯程 LR / MLR + 非 ID 类特征(⼈⼯离散 / GBDT / FM),可以使用 Spark 进行训练
  • 宽模型 + 深模型 Wide&Deep,DeepFM,可以使用 TensorFlow 进行训练
  • 深模型:DNN + 特征 Embedding,可以使用 TensorFlow 进行训练

这里的宽模型即指线性模型,线性模型的优点包括:

  • 相对简单,训练和预测的计算复杂度都相对较低
  • 可以集中精力发掘新的有效特征,且可以并行化工作
  • 解释性较好,可以根据特征权重做解释

本文我们将采用逻辑回归作为离线模型,进行点击率预估。逻辑回归(Logistic Regression,LR)是基础的二分类模型,也是监督学习的一种,通过对有标签的训练集数据进行特征学习,进而可以对测试集(新数据)的标签进行预测。我们这里的标签就是指用户是否对文章发生了点击行为。

构造训练集

读取用户历史行为数据,将 clicked 作为训练集标签

spark.sql("use profile")user_article_basic = spark.sql("select * from user_article_basic").select(['user_id', 'article_id', 'clicked'])

user_article_basic 结果如下所示

user_article_basic

之前我们已经计算好了文章特征和用户特征,并存储到了 Hbase 中。这里我们遍历用户历史行为数据,根据其中文章 ID 和用户 ID 分别获取文章特征和用户特征,再将标签转为 int 类型,这样就将一条用户行为数据构造成为了一个样本,再将所有样本加入到训练集中

train = []for user_id, article_id, clicked in user_article_basic:    try:        article_feature = eval(hbu.get_table_row('ctr_feature_article', '{}'.format(article_id).encode(), 'article:{}'.format(article_id).encode()))    except Exception as e:        article_feature = []    try:        user_feature = eval(hbu.get_table_row('ctr_feature_user', '{}'.format(temp.user_id).encode(), 'channel:{}'.format(temp.channel_id).encode()))    except Exception as e:        user_feature = []    if not article_feature:        article_feature = [0.0] * 111    if not user_feature:        user_feature = [0.0] * 10    sample = []    sample.append(user_feature)    sample.append(article_feature)    sample.append(int(clicked))    train.append(sample)

接下来,还需要利用 Spark 的 Vectors 将 array 类型的 article_feature 和 user_feature 转为 vector 类型

columns = ['article_feature', 'user_feature', 'clicked']def list_to_vector(row):    from pyspark.ml.linalg import Vectors        return Vectors.dense(row[0]), Vectors.dense(row[1]), row[2]train = train.rdd.map(list_to_vector).toDF(columns)

再将 article_feature, user_feature 合并为统一输入到 LR 模型的特征列 features,这样就完成训练集的构建

train = VectorAssembler().setInputCols(columns[0:1]).setOutputCol('features').transform(train)

模型训练

Spark 已经实现好了 LR 模型,通过指定训练集 train 的特征列 features 和标签列 clicked,即可对 LR 模型进行训练,再将训练好的模型保存到 HDFS

from pyspark.ml.feature import VectorAssemblerfrom pyspark.ml.classification import LogisticRegressionlr = LogisticRegression()model = lr.setLabelCol("clicked").setFeaturesCol("features").fit(train)model.save("hdfs://hadoop-master:9000/headlines/models/lr.obj")

加载训练好的 LR 模型,调用 transform() 对训练集做出预测(实际场景应该对验证集和训练集进行预测)

from pyspark.ml.classification import LogisticRegressionModelonline_model = LogisticRegressionModel.load("hdfs://hadoop-master:9000/headlines/models/lr.obj")sort_res = online_model.transform(train)

预测结果 sort_res 中包括 clicked 和 probability 列,其中 clicked 为样本标签的真实值,probability 是包含两个元素的列表,第一个元素是预测的不点击概率,第二个元素则是预测的点击概率,可以提取点击率(CTR)

def get_ctr(row):    return float(row.clicked), float(row.probability[1])score_label = sort_res.select(["clicked", "probability"]).rdd.map(get_ctr)

模型评估

离线模型评估指标包括:

  • 评分准确度 通常是均方根误差(RMSE),用来评估预测评分的效果
  • 排序能力 通常采用 AUC(Area Under the Curve),即 ROC 曲线下方的面积
  • 分类准确率(Precision) 表示在 Top K 推荐列表中,用户真实点击的物品所占的比例
  • 分类召回率(Recall) 表示在用户真实点击的物品中,出现在 Top K 推荐列表中所占的比例

当模型更新后,还可以根据商业指标进行评估,比例类的包括:点击率(CTR)、转化率(CVR),绝对类的包括:社交关系数量、用户停留时长、成交总额(GMV)等。

推荐系统的广度评估指标包括:

  • 覆盖率 表示被有效推荐(推荐列表长度大于 c)的用户占全站用户的比例,公式如下:

我们这里主要根据 AUC 进行评估,首先利用 model.summary.roc 绘制 ROC 曲线

import matplotlib.pyplot as pltplt.figure(figsize=(5,5))plt.plot([0, 1], [0, 1], 'r--')plt.plot(model.summary.roc.select('FPR').collect(),         model.summary.roc.select('TPR').collect())plt.xlabel('FPR')plt.ylabel('TPR')plt.show()

ROC 曲线如下所示,曲线下面的面积即为 AUC(Area Under the Curve),AUC 值越大,排序效果越好

利用 Spark 的 BinaryClassificationMetrics() 计算 AUC

from pyspark.mllib.evaluation import BinaryClassificationMetricsmetrics = BinaryClassificationMetrics(score_label)metrics.areaUnderROC

也可以利用 sklearn 的 roc_auc_score() 计算 AUC,accuracy_score() 计算准确率

from sklearn.metrics import accuracy_score, roc_auc_score,import numpy as nparr = np.array(score_label.collect())# AUCroc_auc_score(arr[:, 0], arr[:, 1]) # 0.719274521004087# 准确率accuracy_score(arr[:, 0], arr[:, 1].round()) # 0.9051438053097345

c++ vector排序_个性化推荐系统源代码之基于LR模型的推荐系统离线排序方案相关推荐

  1. example 排序_个性化推荐系统源代码之基于 WideDeep模型的在线排序

    上图是 Wide&Deep 模型的网络结构,深度学习可以通过嵌入(Embedding)表达出更精准的用户兴趣及物品特征,不仅能减少人工特征工程的工作量,还能提高模型的泛化能力,使得用户行为预估 ...

  2. list对oracle结果集排序了_文章推荐系统系列之基于 FTRL模型的在线排序

    文章推荐系统系列: 1.推荐流程设计 2.同步业务数据 3.收集用户行为数据 4.构建离线文章画像 5.计算文章相似度 6.构建离线用户画像 7.构建离线用户和文章特征 8.基于模型的离线召回 9.基 ...

  3. ios 按时间排序_如何按应用而不是时间对iOS通知进行排序

    ios 按时间排序 By default, iOS shows notifications in the order you received them. That can be handy, of ...

  4. sql多字段求和降序排序_快速入门:Excel中如何按照多个字段排序

    Excel排序怎么排?我们经常使用表格来搜集记录信息.如果我们表格中的数据过多,而且没有进行数据的归纳总结.那应该是件让人头大的事儿,为了获得更加准确的数据,我们需要对Excel中的内容进行排序.排序 ...

  5. python输入数字并排序_「每日一练」巧用Python实现数字排序

    原标题:「每日一练」巧用Python实现数字排序 数字排序在我们的生产和生活中占着非常大的比重,这种思维和技术可以让一组数据更快更明了的展现在我们的面前,极大的提高了我们的工作效率! 那么,你知道如何 ...

  6. 基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统

    本文是对经典论文的阅读笔记,大部分为论文的中文翻译内容(笔者英语水平也就六级飘过的水准,不喜勿喷) 论文标题:Matrix factorization techniques for recommend ...

  7. vba 自动排序_学会这个Excel表格技巧之后,立刻实现自动排序,太牛了

    怎么实现自动排序呢?老师从网上下载的2018年各大城市最新平均工资排行表 当我改动其中一个城市的平均工资时,比如广州由7965改为10000,整个表格的顺序会自动调整: 是不是很神奇的样子,怎么做到的 ...

  8. 人名和成绩一起排序_#excel中怎么让人名和他的成绩一起排序#excle排序 怎么弄同名次...

    excel中怎么让人名和他的成绩一起排序 以下图2007版EXCEL表格为示例成绩(D列)格进行排序,在EXCEL们选择整行然成绩的高低进行排序时,人名默认和成绩一起排序. 1.整行选中需要排序的数据 ...

  9. spyder开多个程序_【程序源代码】基于Vue+ElementUI web开发框架

    " 关键字:开发框架 vue  web 开发框架" 正文:开发框架 web 开发框架  vue 01 - 基于 Vue + ElementUI 的web项目工程框架 专注于中台系统 ...

最新文章

  1. Java基础入门语法和安装
  2. 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)
  3. 查找mysql的分区情况_MySQL 5.5 查看分区表的执行计划
  4. C语言位操作符的使用
  5. 终极指南:如何使用Visual Studio Code进行 Java 开发?
  6. 设计模式学习笔记-观察者模式
  7. Go 切片使用绕坑指南
  8. 腾讯的全球地址数据文件及Xml->Json的处理
  9. [转载] python开源人工智能项目_推荐 10 个饱受好评且功能独特的开源人工智能项目
  10. MJRefresh自定义刷新动画
  11. 佐藤hiroko-爱拯救了我(步之物语)
  12. 软件测试案例|移动APP非功能性测试
  13. php halt,ThinkPHP halt和$this-error区别?
  14. MySQL基础学习笔记——关于KEY的说明
  15. 浅析人工智能体系建设
  16. ][互动大奖] Webby Awards 2012 第16届威比奖
  17. 尺寸不会再乱 主板板型规格知识大解析
  18. 迷宫系列(四)其他细节和DFS的实际应用(重要)
  19. 【图像处理】CloudCompare 设置背景、点云颜色
  20. Odoo 的css文件中,如何设置列宽

热门文章

  1. HTTP协议及其POST与GET操作差异 C#中如何使用POST、GET等
  2. Java 算法 区间K大数查询
  3. php怎样实现表格自动缩放字体,php实现在限定区域里自动调整字体大小的类实例,字体大小实例_PHP教程...
  4. php代码的健壮性,代码健壮性的几点思考 - 逍遥客 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  5. java exec source报错_Mac 下maven路径报错的坑
  6. java中请求转发与重定向_JavaEE进阶 请求转发与请求重定向
  7. android 图片拍照,Android获取图片拍照时间
  8. java集合课程,I学霸官方免费课程三十三:Java集合框架之Map集合
  9. 计算机软考可以直接高级吗,计算机软考没有中级能考高级吗
  10. 服务器磁盘空间占用,大文件查找