当前位置: 首页 > 编程日记 > 正文

达观数据于敬:个性化推荐系统实践

达观数据于敬:个性化推荐系统实践

在DT(data technology)时代,网上购物、观看视频、聆听音乐、阅读新闻等各个领域无不充斥着各种推荐,个性化推荐已经完全融入人们的日常生活当中。个性化推荐根据用户的历史行为数据进行深层兴趣点挖掘,将用户最感兴趣的物品推荐给用户,从而做到千人千面,不仅满足了用户本质的信息诉求,也最大化了企业的自身利益,所以个性化推荐蕴含着无限商机。

号称“推荐系统之王”的电子商务网站亚马逊曾宣称,亚马逊有20%~30%的销售来自于推荐系统。其最大优势就在于个性化推荐系统,该系统让每个用户都能有一个属于自己的在线商店,并且在商店中能招到自己最感兴趣的商品。美国著名视频网站Netflix曾举办推荐系统比赛,悬赏100万美元,希望能将其推荐算法的预测准确度提升10%。美国最大的视频网站YouTube曾做过实验比较个性化推荐和热门视频的点击率,结果显示个性化推荐的点击率是后者的两倍。

达观数据拥有雄厚的研发推荐系统的技术积累,曾在ACM、CIKM、KDD、Hackathon等国际竞赛的获奖,在内容推荐,文本挖掘、广告系统等方面申请有超过三十项国家发明专利。本文从数据处理、用户行为建模到个性化推荐,分享达观数据在个性化推荐系统方面积累的一些经验。(达观数据联合创始人 于敬)

1. 数据收集及预处理

推荐系统的本质其实就是通过一定的方式将用户和喜欢的物品联系起来。物品和用户自身拥有众多属性信息进行标识。
1) 物品属性
物品表示推荐系统的客体,在不同的应用场景下,物品指代不同的待推荐事物。比如,在书籍推荐中,物品表示书籍;在电商推荐中,物品表示商品;在电影推荐中,物品表示电影;在社交网络推荐中,物品表示人。商品有多种属性标识自己是什么。


图片描述
商品属性

2) 用户属性
用户表示推荐系统的主体,自身属性包括人口统计学信息以及从用户行为数据中挖掘分析得到的偏好等。


图片描述
用户属性

3) 用户行为
用户的每一次的行为操作无不反应用户内心的本质需求,包括页面浏览、点击、收藏、购物、搜索、打分、评论等,这些数据是个性化推荐系统的最重要的数据。根据用户自身独有的行为数据,可以为每一个用户生成特有的画像。


图片描述
用户行为分析

4) 数据处理
在数据采集的过程中,难免会出现一些脏数据,在使用数据前需要进行清洗。过滤掉关键字段为空、数值异常、类型异常等数据;用户id包括cookie、手机号、email、注册id等,需要进行映射得到用户唯一id;以及数据去重等操作。另外,还有“人为”的脏数据,如作弊、刷单等行为,这些数据也需要清除,否则会严重影响后续算法的效果。达观数据在反作弊方面也做了很多工作,可有效筛选各种行为上的作弊情况。

2. 用户行为建模

基于用户历史行为的进行挖掘分析,得到刻画用户本质需求的一组属性集合,即得到用户模型,个性化推荐的准确性很大程度上依赖于对用户属性刻画的准确性。达观数据采用了多种方式进行量化,主要包括显式用户偏好分析和隐式用户兴趣点挖掘。
1) 显式用户偏好分析
结合用户历史行为和物品信息,可以得到每种行为下的用户偏好数据,包括偏好的维度及偏好程度,如偏好的物品、品牌、类别、标签等。再将各种行为的偏好数据合并,最终得到用户在物品、品牌、类别、标签等各个维度上的偏好程度。合并不同维度的数据时,需要考虑到不同的行为类型反应用户偏好程度是不同的。比如购买行为比点击行为更能反映用户的偏好,则由购买行为计算得到的偏好数据在合并时赋予的权重要高一些。要保证各种行为的各个维度的数据具有可比性,需要进行归一化,而且同纬度的要采用相同的归一化方法。
2) 隐式用户兴趣点挖掘
除了结合物品信息进行分析计算得到的显式偏好外,还有一部分隐式兴趣点需要挖掘,这部分主要用于细分用户群体,进行有针对性的进行更有效的推荐。划分群体的准则要根据具体的业务需求而定,比如是否是高价值用户、是否价格敏感、是否对大牌情有独钟、大神用户和小白用户的区分、喜欢热门流行还是偏小众的等等。借助机器学习中的分类(如SVM)和聚类(如k-means)算法可有效解决用户群体的划分问题,牵涉到的训练和测试数据需要先根据一些规则粗略得到候选集,在结合人工标记的进行筛选。除了可以从行为数据中抽取特征外,也可以从物品和用户的属性数据中抽取特征。经过模型的训练、预测和后处理,从而将用户划分到不同的群体。
3) 协同过滤的基石
在个性化推荐中,应用很广泛的是基于用户的协同过滤算法。这个算法最重要一点是相似用户的计算。

相似度计算方法对推荐效果的影响
相似度的计算很多种方法,如余弦相似度、皮尔逊相关度等,曾经使用mahout做过的一个不同相似度度量方法下的对比测试结果,测试中score的计算使用的是绝对差值的平均,越小越好。本次测试结果表明,在基于用户的协同过滤中,使用皮尔逊相关度的计算方法,推荐效果最好。
其实不同的相似度计算方法有各自的优缺点,适用不同的应用场景,可以通过对比测试进行选取。在实际业务中,相似度的计算方法都有很多变种,比如是否考虑去除冷门物品和热门物品的影响。毕竟过于冷门和过于热门的物品对衡量用户间的相似度时区分度不好,这时就需要进行剪枝。这种基于K近邻的选取相似用户的方法,相似度的阈值设置对结果影响很大,太大的话召回物品过多,准确度会有下降。
4) 时间维度上的考量
在处理各个维度的偏好数据时,需要考虑用户行为的有价值程度是随时间衰减的,即行为发生时间距当前的时间越近,得到的数据越能表征用户将来的行为。毕竟用户的口味随着时间的推移是会变化的,所以时间越近权重越高。
另外,还需要考虑偏好和兴趣点数据的在时间上的持续和变化过程,即需要刻画用户的口味呈现的时间规律。为了解决这个问题,我们根据不同的时间间隔来界定,分长期、短期、近期和实时四个时间维度。长期的覆盖了用户几乎一直不变的兴趣,短期的覆盖了用户变化中的兴趣,而近期则反映了用户的“尝鲜”的特点。这三种兴趣是离线计算的,还要考虑用户的实时兴趣,我们通过很短的时间间隔进行近线挖掘分析,从而快速适应用户当前的信息需求。
通过上述过程,最终就为每个用户生成了各个维度上的偏好和兴趣点数据。


图片描述

3. 个性化推荐的实践经验

以用户模型和物品属性数据为载体,结合多种推荐算法和效果优化策略,个性化推荐系统将用户最感兴趣的物品精准推荐给当前用户。不同算法有自己的应用场景,所以根据业务需要、数据的丰富程度、效果衡量指标等选择合适的推荐算法,然后根据推荐结果进行不断迭代,最终完成符合预期效果的个性化推荐系统。


图片描述
个性化推荐流程

1) 基于内容的推荐
主要过程是将用户的信息特征和物品对象的特征相匹配的过程,从而得到待推荐的物品集合。通过用户模型中的类别、标签、品牌等各维度的偏好数据,在全量物品列表中寻找与之匹配的用户感兴趣的物品列表,并给出用户感兴趣的程度。根据挖掘的兴趣点,对部分用户进行有针对性的推荐,为其“量身定制”推荐结果,满足其特有的需求。基于内容的推荐方法,优点是能保证推荐内容的相关性,并且根据内容特征可以解释推荐结果,而且对新物品的推荐是也能有很好的考量。缺点是由于内容高度匹配,导致推荐结果的惊喜度较差,而且对新用户不能提供可靠的推荐结果。
2) 基于协同过滤的推荐
协同过滤方法主要基于群体智慧,认为相似的用户对新物品的喜好也是相似的,相似的物品对于同一用户来说,喜好程度也是相似的。这种方法克服了基于内容方法的一些弊端,最重要的是可以推荐一些内容上差异较大但是又是用户感兴趣的物品。大致分为两类:基于近邻的方法和基于模型的方法。前者在数据预测中直接使用已有数据进行预测,将用户的所有数据加载到内存中进行运算。基于模型的方法则是通过数据进行模型训练,然后为用户预测新的物品,主要包括:pLSA(Probabilistic Latent Semantic Analysis)、LDA(Latent Dirichlet Allocation)、SVM(Support Vector Machines)、SVD(Singular Value Decomposition)等。
基于用户模型中的相似用户列表和偏好的物品列表,分别使用基于用户的和基于物品的协同过滤,将相似用户喜欢的物品和相似的物品加入到推荐的候选集当中。同时,推荐权重的计算会考量相似度的大小及物品自身的质量分。
3) 基于知识的推荐
当用户的行为数据较少同时又有明确的需求时,协同过滤和基于内容的推荐效果不尽人意,但是基于知识的推荐可以帮助我们解决这类问题。这种方法不需要用户行为数据就能推荐,所以不存在冷启动问题。推荐结果主要依赖两种形式,一是用户需求跟物品之间相似度,一种是明确的推荐规则。实际应用主要是以强规则为主。
4) 补足策略
当用户历史数据比较局限或者在冷启动的时候,导致待推荐物品的数量不足没有达到预定要求时,根据用户模型的数据,结合挖掘的各种榜单进行补足,如全局热门、分类热门等。
5) 多算法融合
单一算法有各自的优缺点,并不能满足实际的线上需求。为了提供最优质的个性化推荐服务,保证推荐结果的多样性、新颖性和惊喜度,需要融合多个推荐算法,进行混合推荐。常见的混合方法有以下几种:
a) 加权式混合
主要是对每个算法赋予不同的权重,通过将多个推荐算法的结果进行加权组合在一起,最后排序得到推荐结果。


图片描述

不同推荐算法的结果需要归一化在相同的范围内,并且各个算法的权重之和为1。

b) 交叉式混合
主要是直接将不同的推荐算法的结果组合在一起推荐给用户,从而每个推荐算法的优质结果都会被展示给用户。


图片描述

c) 切换式混合
主要是根据不同应用场景决定使用哪一种推荐算法,应用场景改变的话则切换推荐算法。例如在新闻推荐时,首先使用基于内容的推荐,当找不到合适的内容时,接着使用协同过滤算法进行跨内容的推荐,最后使用朴素贝叶斯分类器找到与用户长期兴趣匹配的结果。
d) 串联混合
主要是将不同的推荐算法进行排序,后面的推荐算法对前面的不断优化,最终得到一个多级优化下的推荐结果。
e) 分级混合
主要是先界定不同的算法的好坏,优先使用好算法的推荐结果,得不到结果时再使用次好的,依次类推。
达观数据在实践中充分利用了各种混合方法来提高推荐效果,并取得了优异的成效。例如基于加权式和分级混合的流程是,首先通过权重的大小来衡量每种推荐算法结果的好坏,产生待推荐的物品集合,在合并的时候,将优先使用好的推荐算法的结果。实践中则是各种指标综合权衡,整个过程也要复杂很多。(达观数据 于敬 陈运文)
6) 重排序
排序学习(Learning To Rank, LTR)一直是机器学习中的热门研究领域。由于排序过程牵涉到各种维度的参数数据,导致调参费时费力,而且很可能会出现过拟合现象。而机器学习方法不仅有成熟的理论基础,而且很容易融合多种特征,通过不断的迭代来进行参数优化,可有效解决数据稀疏、过拟合等问题。著名的Netflix 公司就在他们的推荐系统中全面应用了LTR 技术。


图片描述
排序学习的流程

对于已标注的训练集,首先选定LTR方法,确定损失函数,以最小化损失函数为目标进行优化即可得到排序模型的相关参数,这就是学习过程。预测过程将待预测结果输入学习得到的排序模型中,即可得到结果的相关得分,利用该得分进行排序即可得到待预测结果的最终顺序。LTR分按点(pointwise)、按对(pairwise) 和按表(listwise) 三种方法,涉及到的常见模型有LR(Logistic Regression)、SVM、DT(Decision Tree)。
关于排序模型的选择,LR 算法主要适用于特征数很多、样本量很大的情况。如果是样本量很大,但是特征比较少的情况时,建议使用DT的算法。主要是因为在特征数较少时,对应的问题往往是非线性的,此DT算法可以发挥自身的优势。另外,SVM在解决非线性分类问题是效果也非常好。相对于另外两种方法,按表的方法往往更加直接,它专注于自己的目标和任务,直接优化排序结果,因此往往效果也是最好的。
经过多个推荐算法的处理,最终得到待推荐物品的结合,使用少量维度的特征进行排序过于简单,效果也大打折扣。基于推荐算法得到的相关特征,结合物品和用户的特征进行组合,可以得到各种特征,并且有些特征是正相关有些是负相关,需要不断优化。借助机器学习方法得到了最终的物品排序,呈现给用户。

4. 结束语

本文从构建用户模型到个性化推荐,介绍了达观数据的一些实践经验。个性化推荐系统能有效解决信息过载和长尾物品两个方面的问题,不仅提供了极佳的用户体检,满足了用户的信息需求,也帮助了企业挖掘其中蕴含的无限商机。达观数据一直致力于为企业提供优质的大数据服务,经过多年的摸索,目前在个性化推荐系统研发和效果提升方面已经积累了丰富的实战经验。当然新技术也在不断出现,深度学习的兴起也给个性化推荐效果的提升带来了更大的契机和想象空间,达观数据也在这方面进行不断探索,后续有机会再跟大家一起分享。(达观数据 于敬)

相关文章:

C语言Free时报错HEAP CORRUPTION DETECTED

char *k1; k1 (char *) malloc(4*sizeof(char)); v1 (char *) malloc(4*sizeof(char)); strcpy(k1,"abcd"); free(k1); 在linux下不会报错,但是在VC环境会报错:HEAP CORRUPTION DETECTED 出现这个错误的原因一般都是操作new申请的内存溢…

DivCSS网页布局中CSS无效的十个常见原因

在学习DivCSS网页布局的知识,可是W3C validation有时难以操作,但用它你可以查看由版面设计引起的差错。验证程序抛出大量差错和警告,说明你的XHTML尚未完善,可能无法在不同浏览器上保持一致功能。下面十个细微的失效问题难住了大批…

如何创建计算机视觉场景训练数据

作者 | 刘明宽 数据科学部门负责人,澳鹏(Appen)美国 曾任eBay首席研究科学家(数据科学总监)对于一些精度要求不太高,或者不太复杂的计算机视觉应用场景,利用一些现有的开源数据集如ImageNet/Coc…

express中的bin/www文件详解

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env node 表明是node执行文件,在做repl工具时候的会用的 "#!"是标识符/usr/bin是环境变量的绝对路径/env 如果是直接#!/usr/bin node ,则执行这个文件的时候,会从/usr/bin中找node命令,如果没有,则…

深度分析typedef--定义自己的数据类型

最近在看redis源码的时候看到Ae.h的时候看到如下源码: /* Types and data structures */ typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask); typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *client…

Go对Python产生的冲击

作者 | yuliao来源 | 懒编程(ID: hackpython)Go 的流行让以 Python 为主流语言的开发者(比如我)产生了一定的危机感。上一次有这种危机感还是做 Android 开发的时候,当时用 Java 做 Android 开发,Google 强…

更新ADT到Android L的方法

android ADT无法更新到20? 哈哈,有办法,windows 进入host 写入例如以下所有,是的所有。然后在到sdk manager中方可更新 #Google Services START #Googleapis↓ 61.19.1.54 mt0.googleapis.com 61.19.1.54 mt1.googleapis.com 61…

php.ini安全配置详细解释

PHP本身再老版本有一些问题,比如在 php4.3.10和php5.0.3以前有一些比较严重的bug,所以推荐使用新版。另外,目前闹的轰轰烈烈的SQL   Injection也是在PHP上有很多利用方式,所以要保证  安全,PHP代码编写是一方面&am…

5 亿微博数据疑泄露,Python 爬虫如何避免踩天坑?

作者 | 马超来源 | CSDN(ID:CSDNnews)3月19日,默安科技CTO魏兴国发微博称,微博数据泄露了不少用户的手机号,当中涉及不少微博认证的明星和企业家。亦有网友在他的微博评论区表示:“有超过5.38亿…

GDB使用总结

经典编译参数: # cc -g -o xx xx.c 或者 # cc xx.c -g -o xx 如果调试不是进程总的程序 可以直接 #gdb 程序名即可 # i 打印行号 #break 行号 #r 重新开始调试 利用set args 命令就可以修改发送给程序的参数,而使用show args 命令…

Spring概述

Spring 是什么Spring是一个开源的轻量级Java SE(Java 标准版本号)/Java EE(Java 企业版本号)开发应用框架,其目的是用于简化企业级应用程序开发。应用程序是由一组相互协作的对象组成。而在传统应用程序开发中&#xf…

Nginx模块开发

最简单的Nginx模块开发,虽然简单,但是是最重要的第一步。 主要是看:http://blog.codinglabs.org/articles/intro-of-nginx-module-development.html 1.准备模块文件 在nginx-1.4.2安装目录新建一个自己的模块的目录 # mkdir myModule 再新…

程序猿惯用口头禅与内心真实 OS,快来看看你中招没?

作者 | 他二哥来源 | 腾讯技术工程滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS滑动查看真实内心 OS【end】◆精彩推荐◆推荐阅读百万人学AI:CSDN…

每日学习笔记(1)

1,python2.4不支持下面这种异常处理语法 try: except: finally: 只有2.5以上才行,为此只能改成下述写法,damn fuck python 2.4... try: try: except: finally: 2,python实现单例模式的一种方法: class MyCl…

linux svn使用方法

1 安装 svn sudo apt-get install subversion 2 查看svn版本号 svn version 3 下载源代码 下面以举例 svn co svn://192.168.5.88/ erppurchase -username hming -password hming /var/www/test 4更新代码 cd /var/www/test/ svn up 当前目录下所有的文件都更新 svn up -r 200…

64% 的企业未实现智能化,5成公司算法工程师团队规模小于 10人,AI 工程师的机遇在哪里?...

整理 | 夕颜责编 | 唐小引出品 | CSDN(ID:CSDNnews)当前,人工智能技术已应用于各行各业,落地成为大家关注的核心问题。在经历了 2019 年的行业低谷期之后,无论是行业巨头还是新兴独角兽,都开始审视 AI 能够…

指针的本质--u_char*指针在Nginx源码中的应用及原因

GNU下的void *p相当于char *p 也就是移动一个字节。 下面的代码是Nginx中内存池的结构体代码,其中last和end是表示内存地址的。 last是u_char*指针类型也就是unsigned char typedef struct {u_char *last;u_char *end;ngx_pool_t …

原来这就是乡下人

来源:http://user.qzone.qq.com/313998514/blog/1215427152#!app2&viaQZ.HashRefresh&poscatalog_private 今天早晨一早就去做家教了, 原因是我的学生要去香港去学习七天, 明天就要走了, 所以为了赶时间, 今天的课就提到早晨来上. 这些都很正常, 早晨6:17我…

如何查看Apache的连接数和当前连接数

查看Apache的连接数和当前的连接数以及IP访问次数,下面有个不错的示例,大家可以参考下,希望对大家解决问题有所帮助查看了连接数和当前的连接数 复制代码 代码如下:netstat -ant | grep $ip:80 | wc -l netstat -ant | grep $ip:80 | grep ES…

linux环境insight安装与使用

去官网下载:ftp://sourceware.org/pub/insight/releases 安装步骤 # wget ftp://sourceware.org/pub/insight/releases/insight-6.8-1a.tar.bz2 # tar xvf insight-6.8-1a.tar.bz2 # cd ./ # ./configure --prefix/usr/local/insight # make 注意第一次make…

磁盘加密软件TrueCrypt知识大全(二)之创建文件型加密卷

磁盘加密软件TrueCrypt知识大全(二)之创建文件型加密卷 1、在“TrueCrypt”窗口中选择“创建加密卷(C)”按钮,在向导中选择“创建文件型加密卷”,然后一直下一步。 2、在TrueCrypt加密卷创建向导中单击“选…

你的企业在什么情况下需要人工智能?快来看看你需要具备哪些条件与能力吧!...

作者 | Anzhela Sychyk译者 | 风车云马 责编 | 徐威龙出品 | AI科技大本营(ID:rgznai100)如今有关人工智能的炒作多得令人眼花缭乱。各个行业都极力采用这种技术,以获得相对于其他企业的竞争优势——降低运营成本,并改善客户体验。…

struts2学习笔记--线程安全问题小结

在说struts2的线程安全之前,先说一下,什么是线程安全?这是一个网友讲的, 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的&#x…

函数指针--Nginx和Redis中两种回调函数写法

1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connection_handler_pt)(int c); //仿redis风格 typedef void redisCommandProc(int c); typedef struct { int a; //结构内定义函数指针变量pshow voi…

人生苦短,不光要用Python,还要在VSCode里用

作者 | imbennyguo出品 | CSDN博客在程序员圈子里&#xff0c;Visual Studio Code&#xff08;以下简称VSCode&#xff09;可以说是目前最火的代码编辑器之一了。它是微软出品的一款可扩展的轻量级开源编辑器&#xff0c;并且支持全平台系统。这些特性使得VSCode颇受欢迎&#…

从XXX 产品的失败谈起

从XXX 产品的失败谈起 从去年年中公司开始秘密研究一项高级产品&#xff0c;以替换陈旧体系下的老款产品&#xff0c;为此&#xff0c;创建了一个产品开发部 门&#xff0c;由七八个富有本行业开发经验的全职成员构成&#xff0c;经过一年多的努力&#xff0c;即将投入市场了&…

C++ 经常使用类 string类

6.3.2使用string对象 string word"I love China" *链接字符串* string descriptionadjective " " word; _Note_: 不能连接两个字符串字面量&#xff0c;以下的语句是错误的 string test "I have" "a dream"; 6.3.3訪问字符串中的字…

Nginx源码分析--字符串处理

ngx_string.cvoid ngx_strlow(u_char *dst, u_char *src, size_t n); 将src的前n个字符转换成小写存放在dst字符串当中&#xff0c;调用者需要保证dst指向的空间大于等于n。操作不会对原字符串产生变动。如要更改原字符串&#xff0c;可以&#xff1a;ngx_str_t str ngx_strin…

信息保留的二值神经网络IR-Net,落地性能和实用性俱佳 | CVPR 2020

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导语&#xff1a;在CVPR 2020上&#xff0c;商汤研究院链接与编译组和北京航空航天大学刘祥龙老师团队提出了一种旨在优化前后向传播中信息流的实用、高效的网络二值化新算法IR-Net。不同于以往二值神经网络大多关注量…

Jq-table最后一行添加样式

豪情姓名QQE-mail豪情249056406jikeytanggmail.comtony1234567puaggmail.comtony1234567puaggmail.comtony1234567puaggmail.comtony1234567puaggmail.com豪情啊不得了真是的运行代码