微信读书冷启动用户书籍推荐初探:一个借助微信用户画像的方法
引言
微信读书 App 中的书籍推荐系统,逐渐开始在运营活动中(每周热榜、新手卡片)使用,尝试从技术侧帮助运营侧提高转活动的化率。
对微信读书的活跃用户,我们根据其读书时长、点评书等用户行为,做书籍推荐。对微信读书新增用户,由于缺少用户行为数据,无法使用这种方法做推荐,此类问题常被称为推荐系统冷启动问题。
然而,我们发现微信用户画像,比如基础属性(年龄、城市、性别等)和公众号阅读兴趣等,与微信读书用户的阅读兴趣相关。借助微信用户画像进行书籍推荐,准确率较随机推荐提升约 1 倍。
分析建模
如何评估微信用户画像与微信读书用户阅读兴趣是否相关?
我们建立预测模型进行初步验证,步骤如下:
- 准备数据集:微信读书n本热门书籍,把热门书架加入书架的用户及其微信画像
- 预测模型:把问题化简成 n 分类的问题,输入微信画像、输出预测书1 ~ n
- 假设:微信读书用户加书架的行为,可以反映其阅读偏好
- 在数据集基础上建立的预测模型,可以衡量用户画像和加书架的相关性。结合假设,该模型可以衡量用户画像和阅读偏好的相关性
如果有相关性,那么我们得到的预测模型就可以用于冷启动书籍推荐。
分析数据
微信用户画像基础属性
基础属性包括:城市,年龄,性别等。
其中,城市属性可以转化为 n 线城市作为属性。猜测城市、年龄、性别等属性,与阅读偏好的关联较大。
微信用户画像扩展属性:公众号阅读兴趣
包括一级分类如:如育儿、饮食、旅游、金融财经、时尚美容、养生培训等。
其中,每个用户每月都有一个阅读兴趣记录,由偏好类别、权重组成。比如:用户A 201608 养生健康0.8 教育培训0.1 时尚美容0.1。
选取四本书,抽取加书架的用户,统计这些用户的公众号阅读兴趣的人数累加和,按人数降序排列结果如下:
《囚徒健身:用失传的技艺练就强大的生存实力 保罗·威德 谷红岩译》
兴趣标签 |
有对应兴趣标签的人数 |
---|---|
健身运动 |
388 |
养生健康 |
259 |
教育培训 |
238 |
旅游 |
235 |
… |
… |
《逆龄养颜术(我最想要的美肌能量书)》梅切尔·沙尔
兴趣标签 |
有对应兴趣标签的人数 |
---|---|
养生健康 |
652 |
教育培训 |
437 |
时尚美容 |
418 |
旅游 |
306 |
… |
… |
《信用卡,从卡奴到卡神(简七理财010)》简七理财
兴趣标签 |
有对应兴趣标签的人数 |
---|---|
金融财经 |
400 |
养生健康 |
385 |
教育培训 |
338 |
旅游 |
272 |
… |
… |
《轻断食:正在横扫全球的瘦身革命》 麦克尔·莫斯利 咪咪·史宾赛
兴趣标签 |
有对应兴趣标签的人数 |
---|---|
养生健康 |
784 |
教育培训 |
505 |
旅游 |
491 |
时尚美容 |
305 |
… |
… |
猜测此属性与阅读偏好强相关。
特征选取
我们分别取微信用户基础属性、公众号阅读兴趣属性、基础属性+阅读兴趣作为特征。
准备数据集
- 随机选取 n 本书,找出曾经加书架的用户(采样确保每本书籍用户数相等,且每个用户书架只有 n 本中的一本),获取用户的微信画像属性 x
- 将 n 本书编号 1~n
- 提取出标签(书籍编号) y 和属性 x,把样本按 6:4 划分成训练集、测试集
模型选择
使用 Spark mllib 提供的 Random Forest 算法。
在该模型中,输入用户画像 x,输出预测书籍标签 y。
选择 Random Forest 的原因有:
- 训练结果为决策树,容易解读和实现
- 能够处理高维数据,不用做特征选择,适应性强
将数据划分为训练集和测试集,使用训练集训练模型,最后得到随机森林,即多颗决策树。树节点是决策的过程,树叶是决策结果;权衡多颗树的决策,最终得到模型的预测结果。取其中一颗举为例:
例 Tree0:
If (男)
If ( 微信好友 <= 294.0)
If ( n线城市 <= 2.0)
推荐《罗辑思维》
Else ( n线城市 > 2.0)
《看见》
Else ( 微信好友 > 294.0)
If ( n线城市 <= 1.0)
《罗辑思维》
Else ( n线城市 > 1.0)
《罗辑思维》
Else (女)
If ( 微信好友 <= 417.0)
If ( 微信好友 <= 230.0)
《如果你曾奋不顾身爱上一个人》
Else ( 微信好友 > 230.0)
《如果你曾奋不顾身爱上一个人》
Else ( 微信好友 > 417.0)
If ( 微信好友 <= 1150.0)
《如果你曾奋不顾身爱上一个人》
Else ( 微信好友 > 1150.0)
《罗辑思维》
训练模型
将数据集按 6:4 分为训练集、测试集。
使用训练集训练模型,得到模型参数w。
测试模型
在测试集上,使用模型和参数 w,验证准确率。
验证模型
实验数据集来自加书架的用户属性,假设『微信读书用户加书架的行为,可以反映其阅读偏好』,模型准确率高,可以推论微信画像与微信读书用户阅读偏好相关。
然而,我们希望这个推荐算法能够用与运营活动的书籍推荐,因此需要进行 A/B 测试,来验证随机森林推荐算法的有效性。
效果评估
在 4 本书选择 1 本进行推荐的任务中:
(随机推荐准确率的期望是25%)
特征 |
训练集 |
测试集 |
测试集准确率 |
---|---|---|---|
微信基础属性 |
7907 |
5432 |
39.96% |
公众号阅读兴趣 |
8038 |
5301 |
32.35% |
微信基础属性+公众号阅读兴趣 |
8025 |
5314 |
38.85% |
在 10 本书选择 1 本进行推荐的任务中:
(随机推荐准确率的期望是 10%)
特征 |
训练集 |
测试集 |
测试集准确率 |
---|---|---|---|
微信基础属性 |
19175 |
12662 |
19.00% |
公众号阅读兴趣 |
19126 |
12711 |
16.38% |
微信基础属性+公众号阅读兴趣 |
19137 |
12700 |
19.00% |
在 20 本书选择 1 本进行推荐的任务中:
(随机推荐准确率的期望是 5%)
特征 |
训练集 |
测试集 |
测试集准确率 |
---|---|---|---|
微信基础属性 |
34131 |
23112 |
11.04% |
公众号阅读兴趣 |
34275 |
22968 |
9.13% |
微信基础属性+公众号阅读兴趣 |
34319 |
22924 |
10.78% |
在 50 本书选择 1 本进行推荐的任务中:
(随机推荐准确率的期望是 2%)
特征 |
训练集 |
测试集 |
测试集准确率 |
---|---|---|---|
微信基础属性 |
79575 |
52704 |
5.02% |
公众号阅读兴趣 |
79424 |
52855 |
4.66% |
微信基础属性+公众号阅读兴趣 |
79188 |
53091 |
5.30% |
在 100 本书选择 1 本进行推荐的任务中:
(随机推荐准确率的期望是 1%)
特征 |
训练集 |
测试集 |
测试集准确率 |
---|---|---|---|
微信基础属性 |
127688 |
85649 |
2.86% |
公众号阅读兴趣 |
128132 |
85205 |
2.54% |
微信基础属性+公众号阅读兴趣 |
127927 |
85410 |
3.05% |
在 200 本书选择 1 本进行推荐的任务中:
(随机推荐准确率的期望是 0.5%)
特征 |
训练集 |
测试集 |
测试集准确率 |
---|---|---|---|
微信基础属性 |
146692 |
97783 |
2.81% |
公众号阅读兴趣 |
146142 |
98333 |
2.62% |
微信基础属性+公众号阅读兴趣 |
146641 |
97834 |
2.94% |
总结
根据结果,我们发现微信基础属性与微信读书用户阅读偏好的相关性最高,尤其是年龄、性别、n 线城市、好友数等属性。
其次,用户公众号阅读兴趣与推荐书籍相关,但没有基础属性的显著,可作为推荐策略的考量因素。
在 n 本书推荐 1 本的任务中,结合微信用户画像的先验信息推荐,与随机推荐相比,准确率增加约一倍。
因此,对于微信读书的冷启动用户,运营侧可以考虑结合微信用户画像进行运营活动的书籍推荐(人为设定推荐规则或者使用随机森林),以提高转化率。应用随机森林进行推荐时,需做 A/B 测试以验证模型的有效性。
引用
TODO
- Vue2.0,lifeCycle ['laɪfˌsaɪkl] -- 生命周期大白话~
- 什么生命周期,在我看来就是各种回调 &&电商项目作业检查 -- 张xx
- 小知识点 -- nodejs中的console.log打印输出在哪里?
- 学js少看书肯定是不成的,要多看。
- 抽象是啥?就是一群人的特征;js中的call是啥?就是我想用你家的电饭锅
- 从node事件到观察者 -- 学习要有一根线索
- Joy:一款用于捕获和分析网络内部流量数据的工具
- 老尚,能讲讲闭包么?“可以,没问题,马上”
- PHP代码安全杂谈
- angularJs,请问vue是你失散多年的亲人吗?
- 无监督学习神经网络——自编码
- 不学不知道,sort()方法中的坑
- js数组去重的思路与缓动公式
- vue.js 的组件感觉比react的直观&&面试相关的七个实例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- leetcode之最短补全词
- React基础(10)-React中编写样式CSS(styled-components)
- 十大经典排序算法 (动态演示 + 代码)
- 学生成绩管理系统案例
- C 语言指针详解
- 04 CentOS6.5系统语言切换为中文
- 【SpringBoot DB 系列】Redis 高级特性之 Bitmap 使用姿势及应用场景介绍
- 踩坑:一次年轻代GC长暂停问题的解决与思考
- 监听MySQL的binlog日志工具分析:Canal
- 小解c# foreach原理
- 3分钟短文:任命管理员,给Laravel普通用户提权
- this到底是什么?
- ES5面向对象基础
- 面试官问我啥是OAuth 2.0,两个案例讲懂他~
- 年轻代频繁ParNew GC,导致http服务rt飙高