#研发解决方案介绍#Recsys-Evaluate(推荐评测)
本文档适用人员:研发
在语义的世界里,可以近似地说:万事万物都是特征提取。 你只要找到特征,事情就好办。…………你期望毕其功于一役吗?自然语言处理的真实应用里是很难有什么场景找到一个通吃特征的。都是一层一层特征叠加的。一层特征去掉一部分垃圾数据。如此反复,终成正果。注意方法论。
统计粗且糙,乃大锤。规则细而精,乃小锤。先大场后细棋。
- 推荐位展示次数、商品投放次数;
- 推荐位展示点击率、商品投放点击率;
- 最重要的是下单转化率和成单转化率(或叫支付转化率)这两个硬指标。
- 实时(至少是近乎实时)统计几个展示性指标
- 区分网站端和移动客户端的推荐展示效果
- 进一步区分不同客户端,如 iOS 和 Android
- 图
- 数据概览
- 图
- 按推荐位类型或推荐算法归纳各种指标
- 看了又看
- 浏览过该商品的用户购买了
- 您可能对以下商品感兴趣(猜你喜欢)
- 商品周边商品(注:只能是本地生活服务类商品)
- 签到弹窗推荐
- 商品附近门店
- 门店周边美食
- 附近吃喝玩乐
- 图
- ……
- 常见的评测推荐效果的两种实验方法
- 离线试验:
- 做法:从日志系统中取得用户的行为数据,然后将数据集分成训练数据和测试数据,比如80%的训练数据和20%的测试数据(还可以交叉验证),然后在训练数据集上训练用户的兴趣模型,在测试集上进行测试
- 优点:它不需要实际用户的交互
- 缺点:离线实验只能评测一个很狭窄的数据集切面,主要是关于算法预测或者评估的准确性
- 目的:提前过滤掉性能较差的算法
- AB测试:
- 做法:通过一定的规则把用户随机分成几组,并对不同组的用户采用不同的推荐算法,这样的话能够比较公平地获得不同算法在实际在线时的一些性能指标
- 图
- 推荐服务接口测试界面
- 暴露出来,让我们手工就可以提交,看看效果
- 数据上报:——Piwik
- 主站本身部署了 开源流量统计系统 Piwik,所以在网页的各种推荐位上按规则埋点即可
- 实例:“浏览过该商品的用户还购买了”推荐栏第一位商品的a元素增加了wwe属性:wwe="t:goods,w:rec,id:ae45c145d1045c9d51c270c066018685,rec:101_01_103"
- 浏览器完全加载完成后, Piwik JavaScript 会向服务器端发送埋点数据
- Piwik 服务器端收到后,写磁盘日志文件
- 数据采集:——Flume
- Piwik 集群的每一台服务器上都部署了 Flume Agent
- agent 会向 推荐数据收集 Flume 集群 推送日志,譬如配置为每增加一行日志就推送,或每5分钟推送一次
- 手机客户端的埋点日志则存放在无线服务器端的 MySQL 中,所以我们用脚本每分钟读取一次数据,放到 flume 的监控目录下
- 数据接入:——Kafka
- 由于数据采集速度和数据处理速度不一定匹配,因此添加一个消息中间件 Linkedin Kafka 作为缓冲
- 数据流转方式为 Flume Source-->Flume Channel-->Flume Sink,那么我们写一个 Kafka Sink 作为消息生产者,将 sink 从 channel 里接收到的日志数据发送给消息消费者
图- 流式计算:——Storm
- Storm 负责对采集到的数据进行实时计算
- Storm Spout 负责从外部系统不间断地读取数据,并组装成 tuple 发射出去,tuple 被发射后在 Topology 中传播
- 所以我们要写一个 Kafka Spout 作为消息消费者拉日志数据
- 再写些 Storm Bolt 处理数据
,一个Topology的结构示意图- 数据输出:——Redis
- Storm Bolt 实时分析数据之后,将统计结果写入 Redis
- 数据统计:——MySQL
- 评测系统实时数据直接从 Redis 中读取,并查询主站数据库追踪成单情况,同步到 MySQL 中,作为报表展示数据源
- piwik javascript
- piwik servers
- flume agent
- 自定义 kafka sink
- 自定义 kafka spout
- 自定义 storm bolt
- redis
- 评测系统计算
- mysql
- 评测系统报表展示
- 如果配置为每新增一条日志就采集,那么 flume 到 kafka 的实时数据可能会由于单条过快,造成 storm spout 消费 kafka 消息速率跟不上。延时可以是数据发射到 stream 中后进行 hbase 的计算操作引起的(注:hbase 的性能确实堪忧,不适合这种实时数据处理,尤其是加了较多索引之后);
- 可参考的一个数据:storm 单条流水线的处理能力大约为 20000 tupe/s (每个tuple大小为1000字节);
- tuple 过多,会由于 kafka 的 message 需要 new String() 进行获取,会报 gc 的异常;
- tuple 在 stream 中的大量堆积,造成超时自动回调 fail() 的函数;
- 可以进行多 tuple 结构的优化,把多个 log 打包成一个 tuple
- 就一般情况而言,单条发射能扛得住
|
KafkaSink.java
|
|
import kafka.javaapi.producer.Producer;
……
public class KafkaSink extends AbstractSink implements Configurable {
……
private Producer<String, byte[]> producer;
……
@Override
public Status process() throws EventDeliveryException {
Channel channel = getChannel();
Transaction tx = channel.getTransaction();
try {
tx.begin();
Event e = channel.take();
if (e == null) {
tx.rollback();
return Status.BACKOFF;
}
producer.send(new KeyedMessage<String, byte[]>(topic, e.getBody()));
tx.commit();
return Status.READY;
} catch (Exception e) {
|
|
KafkaSpout.java
|
|
public abstract class KafkaSpout implements IRichSpout {
……
@Override
public void activate() {
……
for (final KafkaStream<byte[], byte[]> stream : streamList) {
executor.submit(new Runnable() {
@Override
public void run() {
ConsumerIterator<byte[], byte[]> iterator = stream.iterator();
while (iterator.hasNext()) {
if (spoutPending.get() <= 0) {
sleep(1000);
continue;
}
MessageAndMetadata<byte[], byte[]> next = iterator.next();
byte[] message = next.message();
List<Object> tuple = null;
try {
tuple = generateTuple(message);
} catch (Exception e) {
e.printStackTrace();
}
if (tuple == null || tuple.size() != outputFieldsLength) {
continue;
}
collector.emit(tuple);
spoutPending.decrementAndGet();
}
}
|
|
EvaluateBolt.java
|
|
public class EvaluateBolt extends BaseBasicBolt {
……
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
……
if (LogWebsiteSpout.PAGE_EVENT_BROWSE.equals(event)) {
if (LogWebsiteSpout.PAGE_TYPE_GOODS.equals(pageType)) {
incrBaseStatistics(baseKeyMap, BROWSE_ALL, 1);
} else if (LogWebsiteSpout.PAGE_TYPE_PAY1.equals(pageType)) {
incrBaseStatistics(baseKeyMap, ORDER_ALL, 1);
}
String recDisplay = input.getStringByField(LogWebsiteSpout.FIELD_REC_DISPLAY);
recDisplayStatistics(recDisplay, time, pageType, baseKeyMap);
} else if (LogWebsiteSpout.PAGE_EVENT_CLICK.equals(event)) {
String recType = input.getStringByField(LogWebsiteSpout.FIELD_REC_TYPE);
|
评测指标定义:
- 投放点击率:推荐浏览量/推荐商品投放量
- 展现点击率:推荐浏览量/推荐位展现次数
- 推荐展示率::推荐位展示次数/总浏览量
- 推荐浏览量:经由推荐产生的浏览量
- 推荐商品投放量:推荐位投放的推荐商品数量(如:用户浏览A商品,那在浏览或购买推荐位产生的推荐商品为5个,则推荐商品投放量+5)
- 推荐位展现次数:如果推荐位有推荐商品并展示,计数+1

#研发解决方案介绍#Recsys-Evaluate(推荐评测)的更多相关文章
- #研发解决方案介绍#Tracing(鹰眼)
郑昀 最后更新于2014/11/12 关键词:GoogleDapper.分布式跟踪.鹰眼.Tracing.HBase.HDFS. 本文档适用人员:研发 分布式系统为什么需要 Tracing? ...
- #研发解决方案介绍#IdCenter(内部统一认证系统)
郑昀 基于朱传志的设计文档 最后更新于2014/11/13 关键词:LDAP.认证.权限分配.IdCenter. 本文档适用人员:研发 曾经一个IT内部系统配一套帐号体系和授权 线上生产环境里 ...
- #研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案
郑昀 基于李丹和刘奎的文档 创建于2014/12/5 关键词:监控.dashboard.PHP.graphite.statsd.whisper.carbon.grafana.influxdb.Pyth ...
- #研发解决方案介绍#基于ES的搜索+筛选+排序解决方案
郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中 ...
- #研发中间件介绍#定时任务调度与管理JobCenter
郑昀 最后更新于2014/11/11 关键词:定时任务.调度.监控报警.Job.crontab.Java 本文档适用人员:研发员工 没有JobCenter时我们要面对的: 电商业务链条很长,业 ...
- #研发中间件介绍#异步消息可靠推送Notify
郑昀 基于朱传志的设计文档 最后更新于2014/11/11 关键词:异步消息.订阅者集群.可伸缩.Push模式.Pull模式 本文档适用人员:研发 电商系统为什么需要 NotifyServer? ...
- 著名ERP厂商的SSO单点登录解决方案介绍一
SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户 ...
- #研发解决方案#分布式并行计算调度和管理系统Summoner
郑昀 创建于2015/11/10 最后更新于2015/11/12 关键词:佣金计算.定时任务.数据抽取.数据清洗.数据计算.Java.Redis.MySQL.Zookeeper.azkaban2.oo ...
- IT运维监控解决方案介绍
现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...
随机推荐
- Vimium 下载 像个 Geek 一样去浏览
插件地址(被墙):https://chrome.google.com/webstore/detail/dbepggeogbaibhgnhhndojpepiihcmeb 本地下载:http://file ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(十六 ) ConnectionStatic
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- iBoxDB的学习与使用
1. 引言 一次偶然的机会接触到了iBoxDB这样一个小型的嵌入式对象数据库.感觉非常惊讶有这样轻巧的数据库.iBoxDB 本身是一个NOSQL 同时也有关系数据库的特点. 说说iBoxDB的优点: ...
- 修复 XE7 , XE8 Frame 内 PopupMenu 快捷键失效问题
问题:将 Frame 含 PopupMenu 放置 Form 后,在 Frame 里的 PopupMenu 失效,无法按快捷键. 适用:(XE7 update 1 / XE8) for Windows ...
- Java集合类中的哈希总结
JAVA集合类中的哈希总结 目 录 1.哈希表 2.Hashtable.HashMap.ConcurrentHashMap.LinkedHashMap.TreeMap区别 3.Hashtable.Ha ...
- Spring mvc web.xml中 urlpatten的配置问题
在使用spring mvc 是我们会配置spring 的DispatcherServlet作为请求的转发器. <servlet> <servlet-name>spring< ...
- PHP内核探索之变量(6)- 后续内核探索系列大纲备忘
年前因为工作比较饱和,现在又忙着换工作的事情,基本停止了对博文的更新.后续的博文,还是慢慢补上吧. 为了不至于过于发散,先搞个未成形的大纲,如下: PHP内核探索之变量 不平凡的字符串 PHP内核探 ...
- jQuery Transit 过渡效果
jQuery Transit 使用 CSS3 的新特性来实现过渡效果,比默认的.animate方法要顺畅得多. 因为使用 CSS3 进行过渡效果,所以对不支持 CSS3 的浏览器效果有所下降. 语法和 ...
- 15款最好的 jQuery Modal(模态窗口)插件
jQuery 模态窗口插件帮助网站开发人员显示网页中的特定内容,让用户聚焦到这个地方.模态窗口是嵌入到当前网页中,不用重定向到新网页的弹出窗口.这种技术可以用在图像画廊,电子商务网站,登陆框,电子邮件 ...
- [deviceone开发]-基础文件管理器
一.简介 主要实现本地文件管理功能,主要功能为复制.粘贴.剪切目录或者文件. 二.效果 三.相关下载 https://github.com/do-project/code4do/tree/master ...