推荐系统指标评测——覆盖率与基尼系数的算法与应用
评测指标是衡量推荐系统优劣的数据支持,目前应用广泛的有:点击率、转化率、精准率、召回率、F1值、覆盖率、多样性等等。不同的指标衡量的标准和目的是不一样的...今天就来介绍一下覆盖率和多样性是如何计算和应用的。
更多推荐系统资源,请参考——《推荐系统那点事儿》
覆盖率
如何评价推荐系统的优劣,可以通过推荐的内容覆盖率来衡量。当然它并不是唯一的准则....覆盖率顾名思义就是推荐商品占整个推荐池的比例,它描述了一个推荐系统对长尾商品的挖掘能力(推荐池即你想推荐的商品池子,由于大部分电商都有一些脏数据或者自己定义了推荐数据的来源,因此才会出现自己的推荐池。)。
然后我们应用了一些算法,得到了推荐结果。那么试想一下,你的推荐系统作用是什么?
- 让热销更热销?让冷门更冷门?
- 所有商品出现的几率都一样...
上面两种场景,第二种或许才是大家期望的吧。如果推荐系统的覆盖率是100%,就意味着任何的商品内容都有可能出现在用户面前;而如果覆盖率只有10%,那么就意味着只能推荐十分之一的商品给用户,推荐的内容就太狭窄了。
然而覆盖率只能说明商品的种类问题,不能说明每种商品的出场频率
。因此就需要额外的指标来说明了——基尼系数。
基尼系数
基尼系数描述的是物品流行度的分布趋势,流行度按照《推荐系统实践》作者项亮的解释,就是人与物品发生交互的连接数,我这边就把它定义为点击数了。
按照基尼系数的定义,有这样一个分布图:
点击次数 |
个数 |
---|---|
1 |
30w |
2 |
20w |
... |
... |
400 |
2 |
520 |
1 |
然后分别格式化点击次数和个数,我这边有个思路就是给每一列增加一个行号:
点击次数 |
个数 |
行号 |
---|---|---|
1 |
30w |
101 |
2 |
20w |
100 |
... |
... |
... |
400 |
2 |
2 |
520 |
1 |
1 |
然后对行号除以10,给他分成十组:
点击次数 |
个数 |
行号 |
---|---|---|
1 |
30w |
10 |
2 |
20w |
10 |
... |
... |
... |
400 |
2 |
1 |
520 |
1 |
1 |
再累加个数,就把数据平均的分到了十个桶中,类似bucket统计。Y轴则直接除以最大值即可,这样把X轴和Y轴都归一化到0-1之间即可,然后应用上面的公式就能计算出对应的基尼系数。
得到归一化后的值就很好计算了 :
select 1-((sum(c2)*2+1)/10) from t
最终就能得到对应的基尼系数。
应用
推荐系统如果想要用好基尼系数,需要搜集一个原始的用户行为的基尼系数值G1,以及推荐系统后用户点击的基尼系数值G2。如果G2>G1,就说明推荐系统让热销更热销,而长尾更冷门....我们就需要调整推荐算法,增加商品的覆盖率,改善商品的推荐分布了。
参考
- 推介一个简便易用的基尼系数计算公式
- python基尼系数的计算公式
- 《推荐系统实践》
- 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 数组属性和方法
- C++基础 STL简介
- 基于层次聚类的工业数据分析研究
- 详细记录了python爬取小说《元尊》的整个过程,看了你必会~
- C++基础 静态库与动态库
- 《重构-代码整洁之道TypeScript版》第3天
- 可读代码编写炸鸡十 - 保持单纯
- C++基础 多线程笔记(二)
- JVM详解之:HotSpot VM中的Intrinsic methods
- C++基础 多线程笔记(一)
- C++基础 数据类型占字节大小分析
- socket方式传输文件
- 《重构-代码整洁之道TypeScript版》第2天
- 堆积柱形图(stacked barplot)展示密码子偏向性的RSCU值
- 《重构-代码整洁之道TypeScript版》第一天
- Hive小知识之分桶抽样