@yanglfyangl
2018-07-02T05:07:22.000000Z
字数 3818
阅读 1565
“用户画像”从生产到应用,背后的标签逻辑是什么?
深解京东个性化推荐系统演进史
精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么?
信息流推荐之EdgeRank
各大推荐引擎 整理
推荐引擎实践--策略篇.pdf
使用 Neo4j 来构建实时的推荐引擎
流动的推荐系统——兴趣Feed技术架构与实现
36氪首发 | 今日头条推荐算法原理全文详解
推荐的几种方式:
- 规则定义型
- 统计分析型
- 学习预测型
常见的打标签方式:
常见的推荐方式:
是指这些指标的赋值体现的是用户生而有之或者事实存在的,不以外界条件或者自身认知的改变而改变的属性。比如:性别、年龄、是否生育等。
用户类:
- 用户信息
- 地址信息
- 学校信息
- 职业信息
- ...
圈子类:
- ...
帖子类:
- ...
朋友圈类:
- ...
活动类:
- ...
由其他属性推导而来的属性,比如星座,我们可以通过用户的生日推导,比如用户的品类偏好,则可以通过日常购买来推导。
- 由好友关系推导
- 由加入的圈子所在的属性推导出来
- 由加入群所在的属性推导出来
- ...
产品内外实际发生的行为被记录后形成的赋值,比如用户的登陆时间,页面停留时长等。
- 登录时间,在线时间。
- 点赞朋友圈或帖子推导出来。
- 由加入群所在的属性推导出来。
- 参加的活动推导出来。
- ...
用户自我表达的态度和意愿。比如说我们通过一份问卷向用户询问一些问题,并形成标签,如询问用户:是否愿意结婚,是否喜欢某个品牌等。当然在大数据的需求背景下,利用问卷收集用户标签的方法效率显得过低,更多的是利用产品中相关的模块做了用户态度信息收集。
- 根据商品评价推导出来。
- 根据热点评价推导出来。
- ...
测试属性是指来自用户的态度表达,但并不是用户直接表达的内容,而是通过分析用户的表达,结构化处理后,得出的测试结论。比如,用户填答了一系列的态度问卷,推导出用户的价值观类型等。
- 各种调查问卷的结果得出来。
- ...
千人一面
- 收集用户信息为重点,一切行为均不能遗漏。
- 围绕每个人建立一套粗略喜好标签模型。
- 一定要快,因为用户随时可能离开,给出有兴趣的推荐,对用户留存很好。
千人十面
- 我们首先要做的就是将用户分组,将有相似喜好的用户找到。(可以用余弦计算方式)
- 这时候再进来的用户,我们也就可以相应的放在疑似库里了,等到收集到相应的新用户行为,也就能确定这个新用户的相关喜好方向了,成本会减小很
千人百面
- 需要设定动作权重系数,例如:有效打开=5, 分享=4, 收藏=3, 互动=2 , 其它跳转=1, 无效打开=-2 , 点×=-5。
千人千面
- 前面收集了所有的数据
- 要使用协同过滤矩阵及拆解来解决问题
社交的重点是:人、关系、内容、互动; 它们之前的桥梁是推荐算法。**
希望达到的功能举例:
我刚刚加入平台,什么都不太熟悉,平台可以根据我的
1. 爱好
2. 星座
3. 年纪
4. 平台上的好友
5. 看过的帖子
6. 聊过的天
7. 。。。
给我推荐一些合适的圈子出来。
我和朋友在钓鱼,天气很热,朋友聊到的时候,系统给我推荐一个太阳伞
UserInfoDTO
(姓名,性别,手机号,星座。。。)List<UserID>
UserAccessDTO
(什么时间,什么情况下,访问了什么模块。。。)UserEventDTO
( 在什么地方发了什么"比如帖子",评论了什么,喜欢了什么。。。)CircleInfoDTO
(圈坐标,圈类型,圈主。。。)List<UserID>
CircleEventDTO
( 什么时间,什么人,做了什么事,得到了什么)CircleInfoDTO
(群主,创建时间)List<UserID>
CircleEventDTO
( 什么时间,什么人,做了什么事,得到了什么)GoodsInfoDTO
List<UserID>
OrderEventDTO
( 什么时间,什么人,什么情况下,购买了什么商品)RecommendInfoDTO
List<UserID>
RecommendEventDTO
( 推荐后的用户反馈是什么)。。。
产品思路基础
1. 人以类聚,物以群分;
2. 同场景下的推荐,以用户反应做为评价标准更有效些。
3. 虽然是用户为主,但需要给运营留下足够的空间。
技术思路基础
1. 以End-End为主导进行分层
2. 每层用机器学习算法解决
3. 将每层通过外部调用整合起来达到最终效果。
4. 适当的缓存,降低并发对系统产生的影响。(组合推荐一般比较慢)
本质上推荐都是打标签为基础。如何解决标签不准造成的麻烦呢。
我们会分成两种标签
- 用户自定义标签
- 统计算法打标签
- 机器学习算法打标签
用户自定义标签并不是指用户随意给打的标签,而是系统给一些标签的定义,由用户进行选择。当一些新用户或新圈子,新群没有标签的时候,通过聚类/分类算法给他们进行一定的聚类,聚类到已经有的分组上,并标记成“机器学习算法标签”。
为什么要有排序,比如说:
我的好友喜欢了某个主题,在没有任何其它数据的情况下,可能系统会推荐我也喜欢这个主题;
但事实上是,也许我看了一下最上面的后,对它们不感兴趣,反而是最下面的某个我感兴趣。
这种情况下,最好的方式是对我感兴趣的部分进行一定的加权后,再进行推荐。
我们可以参考EdgeRank的思路进行推荐,大概流程如下
- 推荐引擎先根据各种标签进行推荐。
- 推荐结果放到zset中。
- 根据用户历史喜好和用户点击,对结果进行排序。
- 用户历史的对各种类目喜好信息存到图中。
- 各种权重会有一定的规则提高或降低,比如:用户点击一次加5,每天对此类目不再关注则降低2。(这样可以让推荐更加人性化,将时间因素加进去)
- 由规则引擎来进行调度。
- 将准时实时全定义成“规则”函数
- 用统计引擎来存储数据。
- 用HanLP来做标签处理
- 用mahout在dev环境下做离线计算
- 线上环境待定(可自己搭建Spark集群,也可以使用华为云现有机器学习方案)
用户部分:
if 新加用户 then
用户数据清洗;
用户基础数据标签提取 and 存入用户基础标签库 ;
新用户快速分类;
if 用户更新 then
用户数据清洗
用户基础数据标签提取 and 存入用户基础标签库 ;
新用户快速分类;
if 用户上传坐标 then
坐标清洗
用户位置标签提取 and 存入用户位置标签库 ;
新用户快速分类;
if 加好友 then 存入本用户好友标签库 ;
。。。
。。。
帖子部分:
if 新/改帖子 then
文本清洗
抽取关键字
存入“关键字_时间:[帖子]”列表 ;
if 点赞 then
存入用户动作表; //用户动作表为离线分析做基础数据准备。
if 评论 then
文本清洗
存入用户动作表 ;
朋友圈部分:
略
规则类似如下:
if 新数据量 > 1000 then
清洗新数据
重新预测
存入用户/帖子标签
。。。
推荐库中存的数据有如下的内容
UserTag_MyTag_UserID:[淘宝达人]
UserTag_"淘宝达人"_Date_"0629":[userID1:score, userID2:score, userID3:score]
UserTag_"淘宝达人"_Date_"0628":[userID1:score, userID2:score, userID3:score]
。。。
UserTag_"天蝎"_Date_"0629":[userID1:score, userID2:score, userID3:score]
UserTag_"天蝎"_Date_"0628":[userID1:score, userID2:score, userID3:score]
。。。
基于此,推荐的召回方式如下
// 随机种子用于每次返回不同的数据,支持类似换一批的操作。
List querySuggestByUser(String newUserID, String randomSeed){
List myTagList = getMyTagbyUserID(newUserID);
//逻辑如下:
// 1. 先取今天的,再取最近三天的。
// 2. 如果满足10条了,则停止。
List timeList;
timeList.add(0629);
timeList.add(0628);
timeList.add(0627);
List suggestList;
for() {
suggestList.add(getUserListByTime(myTagList.get(i), timeList));
}
return reOrderBySeed(suggestList, randomSeed)
}
这样,有新用户加入的时候,推荐可以比较快的给出。同时,如果是运营想推广的部分,通过权重的增加,也可以相对容易的实现。