Question 1000292: 推荐系统有哪些常用的评价标准

统计/机器学习 推荐系统 模型验证

有多个个性化推荐系统模型,怎么比较它们的好坏?

或者说有哪些常用的评价标准来比较不同模型的推荐精度?

谢谢!


Answer

Answer 1:

常用的评价标准:

一类是线上的评测,比如通过点击率、网站流量、A/B test等判断。这类评价标准在这里就不细说了,因为它们并不能参与到线下训练模型和选择模型的过程当中。


第二类是线下评测。评测标准很多,我挑几个常用的。我就拿给用户推荐阅读相关链接来举例好了。

1. 精度Precision:P(k)

$$P(k) = \frac{c}{k}$$

我们给某个用户推荐了k个链接,他/她点击了其中的c个链接,那么精度就是c/k。


2. 平均精度Average Precision: ap@n

$$ap@n=\sum_{k=1}^n \frac{P(k)}{\min(m,n)}$$

n是被预测的链接的总数,m是用户点击的链接的总数。

例子(1): 我们一共推荐了10个链接,用户实际上点击了我们推荐当中的第1个和第4个链接,以及另外两个其他的链接,那么对于这个用户,

$ap@10=(1/1+2/4)/4\approx 0.38$

例子(2): 我们一共推荐了10个链接,用户实际上点击了我们推荐当中的第2个,第3个和第5个链接,以及另外三个其他的链接,那么对于这个用户,

$ap@10=(1/2+2/3+3/5)/6\approx 0.29$

例子(3): 我们一共推荐了10个链接,用户实际上点击了我们推荐当中的第2个,第7个,此外没有点击其他联系,那么对于这个用户,

$ap@10=(1/2+2/7)/2\approx 0.39$

例子(4): 我们一共推荐了5个链接,用户实际上点击了我们推荐当中的第1个,第2个和第4个,以及另外6个其他链接,那么对于这个用户,

$ap@5=(1/1+2/2+3/4)/5\approx 0.55$


3. 平均精度均值Mean Average Precision: MAP@n

MAP计算的是N个用户的平均精度的均值。

$$MAP@n=\sum_{i=1}^N\frac{(ap@n)_i}{N}$$

这个$N$是用户数量。

比如说我们三个用户甲、乙、丙分别推荐了10个链接,

甲点击了我们推荐当中的第1个和第4个链接,以及另外两个其他的链接,那么$(ap@10)_1=(1/1+2/4)/4\approx 0.38.$

乙点击了我们推荐当中的第3个链接,以及另外一个其他的链接,那么$(ap@10)_2=(1/3)/2\approx 0.17.$

丙点击了我们推荐当中的第1个链接,第7个链接,以及另外三个其他的链接,那么$(ap@10)_3=(1/1+2/7)/5\approx 0.26.$

那么这个模型的平均精度均值

$$MAP@10=\frac{0.38+0.17+0.26}{3}\approx 0.27$$





--------------------补充一下,4月30号--------------------


有朋友在评论中问到如果是基于打分的个性化推荐系统,怎么来评判推荐的结果。其实这个就等同于一个回归问题了。

具体可以参考回归模型的评价方法

Answer 2:

其实我并不是完全同意,高代兄说的“基于打分的个性化推荐系统是和回归模型的评价方法一样的”。因为推荐系统是有排序的推荐的,并不是完全等价于回归问题。


基于打分的个性推荐系统可以用CG(cumulative gain),累计增益。假设我们推荐$k$个物品,这个推荐列表的$CG_k$计算公式如下:

$$CG_k=\sum_{i=1}^k \text{rel}_i.$$

$\text{rel}_i$表示第$k$个物品的相关性。假设我们共推荐$k$个电影,$rel_i$可以是用户对第$i$部电影的评分。

比如豆瓣给用户推荐了五部电影,

$M_1$,$M_2$,$M_3$,$M_4$,$M_5$,

该用户对这五部电影的评分分别是

5, 3, 2, 1, 2

那么这个推荐列表的CG等于$$CG_5=5+3+2+1+2=13.$$


CG没有考虑推荐的次序,在此基础之后我们引入对物品顺序的考虑,就有了DCG(discounted CG),折扣累积增益。公式如下:

$$DCG_k=\sum_{i=1}^k \frac{2^{\text{rel}_i}-1}{\log_2(i+1)}.$$

比如豆瓣给用户推荐了五部电影,

$M_1$,$M_2$,$M_3$,$M_4$,$M_5$,

该用户对这五部电影的评分分别是

5, 3, 2, 1, 2

那么这个推荐列表的DCG等于$$DCG_5=\frac{2^5-1}{\log_2 2}+\frac{2^3-1}{\log_2 3}+\frac{2^2-1}{\log_2 4}+\frac{2^1-1}{\log_2 5}+\frac{2^2-1}{\log_2 6}=31+4.4+1.5+0.4+1.2=38.5$$



------------更新-------------

关于ndcg可以参考我的另一个回答

怎么理解推荐系统中的NDCG?


Answer 3:

本文为项亮《推荐系统实践》一书的学习笔记



1. 用户满意度(在线)

用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。

用户调查获得用户满意度主要是通过调查问卷的形式。


2. 预测准确度(离线)

这个指标是最重要的推荐系统离线评测指标。


2.1 评分预测

评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。


对于测试集中的一个用户u和物品i,令是用户u对物品i的实际评分,而是推荐算法给出的预测评分


RMSE的定义为:

                                                                                

MAE采用绝对值计算预测误差,它的定义为:

                                                         

2.2 TopN推荐

网站在提供推荐服务时,一般是给童虎一个个性化的推荐列表,这种推荐叫TopN推荐。TopN推荐的预测准确率一般通过准确率(precision)和召回率(recall)度量。


令R(u)是根据用户在训练集上的行为给用户做出的推荐列表,而T(u)是用户在测试集上的行为列表。

推荐系统的准确率定义为:                                              

                                                      

推荐系统的召回率定义为:

                                                       

比如有一个训练集为(苹果,香蕉,橘子,草莓,哈密瓜,西红柿,黄瓜),用户选中其中几样,以此训练,

测试集为(梨子,菠萝,龙眼,黑莓,白菜,冬瓜)

根据用户在训练集上的行为:

给用户做出的推荐列表为R(u) =(梨子,菠萝,龙眼),用户在测试集上的实际行为列表T(u) =(梨子,黑莓,白菜,冬瓜)

那么R(u)和T(u)的交集为1,R(u)=3,T(u)=4,故准确率为1/3,召回率为1/4



3. 覆盖率

覆盖率(Coverage)描述一个推荐系统对物品长尾的发掘能力。最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。


假设系统的用户集合为U,总物品集合为I ,推荐系统给每个用户推荐一个长度为N的物品列表R(u):

                                                         

可以通过研究物品在推荐列表中出现的次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比较平,那么说明推荐系统的覆盖率比较高,而如果这个分布比较陡峭,说明这个推荐系统的覆盖率比较低。在信息论和经济学中有两个著名的指标可以用来定义覆盖率。


第一个是信息熵:

                                                                                                                          

这里p(i)是物品i的流行度除以所有物品流行度之和。

第二个指标是基尼系数(Gini Index):

                                                                                                                     

这里,是按照物品流行度p从小到大排序的物品列表中的第j个物品。

评测推荐系统是否具有马太效应的简单办法就是使用基尼系数。


4. 多样性

用户的兴趣是广泛的,一个经常看动漫的用户也可以喜欢其他类型的视频。为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴趣领域,即推荐结果需要具有多样性。

多样性描述了推荐列表中物品两两之间的不相似性。假设定义了物品i和物品j之间的相似度,那么用户u的推荐列表R(u)的多样性定义为:

                                                   

而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:

                                                   


5. 新颖性

新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。

评测新颖度最简单的方法是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。


6.惊喜度

惊喜度是指出乎用户意料的,推荐用户认知范围外的物品给用户且令用户满意。

目前没有什么公认的惊喜度的指标定义方式。


7.信任度

两个不同的信任系统,尽管推荐结果可能相同,但是用户可能会选择更让他信任的那个。比如京东和淘宝推荐同样的物品给用户,假如用户更多在淘宝上消费的话,用户可能会更倾向于使用淘宝推荐的物品。


8.实时性

在新闻类网站上,例如今日头条和微博,物品具有很强的实时性。比如一条新闻,系统需要第一时间推送给用户。推荐昨天的新闻显然不如推荐今天的新闻。

推荐系统的实时性包括两个方面。首先,推荐系统需要实时的更新推荐列表来满足用户新的行为变化。第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。


9. 健壮性

推荐系统会面对各种各样的作弊行为,针对推荐系统的规则来设计一些作弊行为,以此来攻击推荐系统。而健壮性是指衡量一个推荐系统抗击作弊的能力。

算法健壮性的评测主要利用模拟攻击。

在实际的系统中,提高系统的健壮性,除了选择健壮性高的算法,还有以下方法。

1. 设计推荐系统时尽量使用代价比较高的用户行为。如在用户的购买行为和浏览行为中,显然购买行为的代价更高。

2. 在使用数据时,进行攻击检测,从而对数据进行清理。

Answer 4:

推荐系统除了精度,当然还有召回啊,参考推荐系统中的召回(recall)是什么意思

此外,如果你是用pairwise ranking的话,任何二元分类的评分方法都可以用来测试你的这个推荐系统,比如roc auc之类。


Question 1000321: kappa statistic怎么理解?有什么意义?

统计/机器学习 模型验证 描述性统计

kappa statistic怎么理解?有什么意义?


Answer

Answer 1:

Kappa值或者Kappa系数是用来度量两个被观测对象的一致程度。一般用希腊字母$\kappa$来表示。

$\kappa$是如何计算的?我们直接上栗子。假设我们有两个对象,对,对象,男生甲和女生乙,相亲。媒婆想知道他们两个能不能处得来,首先就想问能不能吃到一块去。就分别问两个人二十道菜,他们只需回答“喜欢”或者“不喜欢”这道菜。媒婆非常认真,做了下面的表,


$a$是男生喜欢、女生也喜欢吃的菜的数量,$b$是男生喜欢、女生不喜欢的菜的数量,以此类推。

Kappa值的计算公式如下

$$\kappa=\frac{\frac{a+d}{a+b+c+d}-\frac{(a+c)\times(a+b)+(b+d)\times(c+d)}{(a+b+c+d)^2}}{1-\frac{(a+c)\times(a+b)+(b+d)\times(c+d)}{(a+b+c+d)^2}}$$

$\kappa$的值在$-1$$1$之间。

越接近1,两者越一致、越吻合。换句话说,男生甲和女生乙是有缘人!我们喜欢一样的东西,也讨厌一样的东西。

接近0,表面两者之间符合偶然的预期。换句话说,男生甲和女生乙是路人!

接近-1,表面两者之间的相符程度非常低。换句话说,男生甲和女生乙是冤家,死对头!我喜欢你讨厌的东西,我讨厌你喜欢的东西。

具体来算两个例子。


$$\kappa=\frac{\frac{3+2}{20}-\frac{11\times 10+10\times 7}{20^2}}{1-\frac{11\times 10+10\times 7}{20^2}}=-0.5$$

说明这两人在饮食口味上有点相反,符合程度很低。于是媒婆重新找了女生来相亲。


这次一算Kappa系数,发现有0.3,虽然不是很高,但是说明口味还是比较接近的。

例子讲完了,下面说一说应用。之前kappa系数在医学领域应用比较多,比如利用症状的阴性和阳性诊断病情的一致性。现在在机器学习领域,也越来越多得被重视。Kappa系数可以用来评价一个分类器的准确性,特别是在标签不平衡的状态下。比如说


如果采用一般的方法来评价这个分类器的话,我们发现它的精度到达了90%,看起来还不错。可实际并不是这样的。因为这个样本本身就很不平衡,95%的标签是“+”。计算一下,我们可以发现这个分类器的Kappa系数只有-0.05,说明这个预测结果不理想。


Answer 2:

kappa又叫做Cohen's kappa。可以用来衡量一个二元分类器的准确性,而且非常实用于标签非平衡的情况。

kappa的数值在-1到1之间。越大说明分类器越好。

kappa = 0,说明这个分类器和随便猜测没什么区别。这里的猜测是按照整体的分布进行猜测。比如已知90%的标签是1,你也是按照这个概率随机猜测。如果按照其他概率来猜测,得到的kappa很可能是负数。

kappa > 0.1,说明模型凑合,马马虎虎

kappa > 0.4,说明模型还行

kappa > 0.8,说明模型挺好的


------补充------

上面的数值仅供参考。



Question 1000354: 交叉验证是如何进行的?

统计/机器学习 模型验证

交叉验证是如何进行的?k-fold交叉验证的这个k又是什么意思,起了什么作用?


Answer

Answer 1:

Cross Validation(交叉验证)的思想是充分利用训练集来验证模型的精度。

一般来说,交叉验证会特地说明是用的多少fold。中文一般翻译为折。

一个k-fold cross validation是把训练集随机的分成等数量的k份,每一份数据集轮流当验证集,剩下的k-1的数据集当训练集。因为一共有k个数据集,所以我们就有可以验证k次。我们把这k次的预测精度的平均值当作模型的预测精度。

下图就是一个4-fold cross validation。我们先把数据随机分成四等份(如果不能被k整除,我们就大概近似k等份)。


下面进行交叉验证。首先是把第1个数据集当作测试集,用2,3,4当作训练集来训练模型,再用训练好的模型来预测数据集1,对比其真实值,得到了一个预测精度。然后再把数据集2当作测试集,用1,3,4训练出一个新的模型,在数据集2上测试,又得到一个预测精度。依此类推,我们就可以得到4个预测精度。将它们取平均值,就得到了模型的4-fold cross validation的预测精度。


Answer 2:

如图


Question 1000471: k-fold cross validation的k怎么选

统计/机器学习 模型验证

k一般是怎么选?这方面的资料很难找到。

谢谢!


Answer

Answer 1:

如果k取得比较小,比如2,3,4,可能偏差会比较大。

如果k取得比较大,比如20,30,会特别费时间。

我通常一般取5到10之间的数。

如果cross validation的结果对你很重要,你愿意花时间去做的话,我推荐可以做多次cross validation。因为k-fold cross validation中每个fold的validation error不是独立的。比如说,你可以先做5-fold cross validation,然后重新随机划分,再重复4次5-fold cross validation。

Answer 2:

一般都是随便设定的哈,3到10都可以吧。因为cross validation本身就是用来选模型参数的,再花大功夫选k是不是显得有点多此一举?我个人都是设定fold=5

Answer 3:

如果数据量很大的话,k的选择就不那么重要了,甚至做train test split就足够了


Question 1000482: R里有没有package可以画ROC,计算AUC的?

统计/机器学习 模型验证 R

R里有没有package可以画ROC,计算AUC的?能够有例子如何使用更好!

谢谢!


Answer

Answer 1:

可以用pROC 

#加载pROC
library(pROC)

#画出ROC曲线
plot.roc(actual, prediction)

#计算ROC AUC
auc(actual, prediction)


Answer 2:

pROC比较慢,github上有人贴出了一个更快的版本。代码如下:

fastROC <- function(probs, class) {

    class_sorted <- class[order(probs, decreasing=T)]

    TPR <- cumsum(class_sorted) / sum(class)

    FPR <- cumsum(class_sorted == 0) / sum(class == 0)

    return(list(tpr=TPR, fpr=FPR))

}



# Helpful function adapted from: https://stat.ethz.ch/pipermail/r-help/2005-September/079872.html

fastAUC <- function(probs, class) {

    x <- probs

    y <- class

    x1 = x[y==1]; n1 = length(x1); 

    x2 = x[y==0]; n2 = length(x2);

    r = rank(c(x1,x2))  

    auc = (sum(r[1:n1]) - n1*(n1+1)/2) / n1 / n2

    return(auc)

}



Question 1000490: unsupervised learning也会over-fitting吗?

统计/机器学习 无监督学习 模型验证 过拟合

我们一般都是回归问题、分类问题经常提到over-fitting,那么unsupervised learning,比如聚类,也会不会出现over-fitting?


Answer

Answer 1:

会的。和监督式学习一样,是有可能发生过拟合的,当然也有可能会欠拟合。

一个简单的例子是用K-Means做聚类,如果K太小,很可能会发生欠拟合(模型过于笼统)


如果K太大,很可能发生过拟合(模型过于细致)


Answer 2:

不光是聚类,其他非监督学习的算法也会出现过拟合。

过拟合的本质就是过分地学习了训练样本中的噪音杂质,从而削弱了泛化能力


比如PCA,如果样本中有一些离谱的噪点,PCA算法的损失函数就会很大程度地被噪点影响。当你把训练出来的PCA作用在新的数据集上的时候,你得到的结果也许就非常离谱,因为你对训练集过拟合了。


同样的问题也会出现在autoencoder上,在某个数据集上训练出一个autoencoder,网络中的权重或者结构可以用来重建原数据。当你的损失函数没有考虑到正则化的时候或者你的网络很复杂的时候,autoencoder很可能出现过拟合,训练好的autoencoder在新的数据集上作用之后,输出的数值就未必能够复原新数据集了。


Question 1000505: Stratified k-fold cross validation(分层交叉验证)

统计/机器学习 模型验证

Stratified cross validation和一般cross validation有什么区别?


Answer

Answer 1:

对于常规的k-fold CV,每个fold都是从训练集随机抽出来。

对于stratified k-fold CV,每个fold都是按照类别的比例抽出来的。


比如这个分类任务一共有三个类别A、B、C,它们的比例是1:2:10。那么每个fold中的A、B、C的比例也必须是1:2:10。

stratified k-fold CV实现起来也很容易。先把A类别的数据随机分成k组,再把B类数据分成k组,然后C类分成k组,最后再把它们合并起来,就得到了k组满足1:2:10的数据了。

stratified cross validation是优于一般的cross validation的。因为test set能充分代表整体数据,此外CV出来的k个预测结果的方差也会变小,使得cv error更可靠。

对于非平衡分类,stratified CV的优点就更加明显了。如果二元分类中分类A只占有0.01%,分类B占有99.99%,当你使用常规的CV的时候,可能你的训练集里甚至都没有足够的A来训练,或者测试集里A的数量极少,严重影响了验证结果的可靠性。



Question 1000545: 如果我用交叉验证,还是否需要单独分出测试集?

统计/机器学习 模型验证

比方说我用100k条数据,我有两个思路

1. 我用这100k条数据做k-fold交叉验证,来调模型参数

2. 我先随机划分出70k条数据做训练集用来根据交叉验证调参数,调好之后再用剩下的30k条数据做测试集

哪个思路是对的呢?


Answer

Answer 1:

虽然这两个都没有错对之分,但是在数据量允许的情况下,更建议第2个思路。

对于思路1,如果你用交叉验证的预测误差作为模型的预测误差,这是有偏差的。因为交叉验证的误差通常是小于真实测试误差的。

思路2是我推荐的。因为你的测试集一定要和你的模型本身独立、无关,测试集不能参与模型的训练。引申开来,还有第二层意思,你利用70k的数据训练完模型后,不能根据在30k测试集上的表现再回去重新调整参数,因为一旦你这样做了,你就很可能会过拟合,你的交叉验证也就没有意义了。



Question 1000578: 回归问题中的stratified cross validation?

统计/机器学习 模型验证

stratified cross validation对于分类问题,是按照标签比例生成每个fold,使得每个fold中标签的比例都是和原数据集一样的。那么回归问题怎么处理?如何按照比例?按照什么比例?


Answer

Answer 1:

可能这个问题还没定论,根据sklearn中的StratifiedKFold也尚未实现针对于回归问题的Stratified Cross Validation。


一种比较合理的能够实现Stratified Cross Validation的方法是对所有真实值按照四等分点分成四份,然后从这四等分的子集中随机划分K组,再将它们重新组合,成为那K个fold的数据集。这样能保证每个fold中真值的分布比较接近。

Answer 2:

也可以从feature中挑一个categorical feature,然后按照这个feature中各个类别的比例来生成k个fold的数据。


Question 1000766: 怎么评价一个聚类算法?

统计/机器学习 无监督学习 模型验证

聚类算法不同于监督式学习,没有y的真实值,那怎么评价一个聚类算法?


Answer

Answer 1:

1. 通过聚类指标来看 ,包括RMSSTD,SPRSQ,RSQ,CCC,伪F,伪T等

2. 通过散点图看,是否聚类的是你想要的。

3. 看每个聚类的各个指标的平均值,如果各个指标的值都很明显区分,可以业务上解释,即为聚类效果好。

Answer 2:

如果没有真实的y,那么可以用calinski-harabaz-index 或者 silhouette coefficient


Question 1001112: micro和macro F1 score分别是什么意思?

统计/机器学习 模型验证

micro和macro F1 score分别是什么意思?谢谢各位大神!



Answer

Answer 1:

F1 score是一个用来评价二元分类器的度量。先回顾一下它的计算公式:

$$F_1=\frac{2}{\frac{1}{\text{recall}} + \frac{1}{\text{precision}}}=2\frac{\text{recall}\times \text{precision}}{\text{recall} + \text{precision}}$$


F1是针对二元分类的,那对于多元分类器,有没有类似F1 score的度量方法呢?有的,而且还不止一种,常用的有两种,这就是题主所问的两种,一种叫做macro-F1,另一种叫做micro-F1。


macro-F1

假设对于一个多分类问题,有三个类,分别记为1、2、3,

$TP_i$是指分类$i$的True Positive;

$FP_i$是指分类$i$的False Positive;

$TN_i$是指分类$i$的True Negative;

$FN_i$是指分类$i$的False Negative。

接下来,我们分别计算每个类的精度(precision)

$$\text{precision}_{i}=\frac{TP_i}{TP_i+FP_i}$$

macro精度就是所有精度的均值

$$\text{precision}_{ma}=\frac{\text{precision}_{1}+\text{precision}_{2}+\text{precision}_{3}}{3}$$

类似地,我们分别计算每个类的召回(recall)

$$\text{recall}_{i}=\frac{TP_i}{TP_i+FN_i}$$

macro召回就是所有召回的均值

$$\text{recall}_{ma}=\frac{\text{recall}_{1}+\text{recall}_{2}+\text{recall}_{3}}{3}$$

最后macro-F1的计算公式为

$$F_{1, ma}=2\frac{\text{recall}_{ma}\times \text{precision}_{ma}}{\text{recall}_{ma} + \text{precision}_{ma}}$$


micro-F1

假设对于一个多分类问题,有三个类,分别记为1、2、3,

$TP_i$是指分类$i$的True Positive;

$FP_i$是指分类$i$的False Positive;

$TN_i$是指分类$i$的True Negative;

$FN_i$是指分类$i$的False Negative。

接下来,我们来算micro精度(precision)

$$\text{precision}_{mi}=\frac{TP_1+TP_2+TP_3}{TP_1+FP_1+TP_2+FP_2+TP_3+FP_3}$$

以及micro召回(recall)

$$\text{recall}_{mi}=\frac{TP_1+TP_2+TP_3}{TP_1+FN_1+TP_2+FN_2+TP_3+FN_3}$$

最后micro-F1的计算公式为

$$F_{1, mi}=2\frac{\text{recall}_{mi}\times \text{precision}_{mi}}{\text{recall}_{mi} + \text{precision}_{mi}}$$


如果这个数据集中各个类的分布不平衡的话,更建议使用mirco-F1,因为macro没有考虑到各个类别的样本大小。


Answer 2:

F1是针对二元的,对于多元的F1,我们就要变着法子求个均值F1,macro和micro就是不同的求均值的方式。

至于具体怎么求,上面已经回答的很清楚了。



Question 1001389: 推荐系统中的召回(recall)是什么意思?

统计/机器学习 推荐系统 模型验证

推荐系统中的召回(recall)是什么意思?如何理解推荐系统中的召回?

它和二元分类的召回是一个意思吗?



Answer

Answer 1:

推荐系统中的精度(precision)和召回(recall)本质上和二元分类中的概念是一样的。

推荐系统往往只推荐有限个(如k个)物品给某个用户。真正相匹配的物品我们称之为相关物品(也就是二元分类中的阳性)。

$$k召回(recall ~at~k)=\frac{所推荐的k个物品中相关物品的个数}{所有相关物品的个数}$$

$$k精度(precision ~at~k)=\frac{所推荐的k个物品中相关物品的个数}{k}$$

比如说,根据你的喜好,我们推荐了10个商品,其中真正相关的是5个商品。在所有商品当中,相关的商品一共有20个,那么

k召回 = 5 / 20

k精度 = 5 / 10


另外可以参考这个问题推荐系统有哪些常用的评价标准



Question 1001420: 十折交叉验证

统计/机器学习 模型验证

如果我做十次十折交叉验证  但是一次交叉验证我只想画一个ROC曲线    我应该怎么去做啊


Answer

Answer 1:

你的标签没有添加编程语言,所以也不知道你说的是R还是python还是其他什么。不过这个跟语言关系也不大。


就比如说是3-fold吧,你有A,B,C三个部分:

你用A和B,预测C,得到C的预测值

你用A和C,预测B,得到B的预测值

你用B和C,预测A,得到A的预测值

你把A,B,C的预测值合起来成一个array,对比A,B,C的真实标签,然后你就可以画出一个ROC了。


如果你是用python的话,sklearn里有sklearn.model_selection.cross_val_predict,可以返回A,B,C合起来的预测值。



Question 1001846: 如何在保持查全率不变的情况下提高查准率?

统计/机器学习 模型验证

一道面试题,在我的理解中查全率与查准率是一个互相限制的量,往往查全率的提升会导致查准率的下降,相反亦然,那么面试官考察这道题目的意图在哪?


Answer

Answer 1:

对于同一个模型来说,通过改变阈值来提高查准率(precision),当然会导致查全率下降(recall)。

如果从整体上提高了模型,那两者可能都会提高。



Question 1002382: 测试集和验证集的区别?

统计/机器学习 模型验证

测试集和验证集都是用来评估模型准确度的,那么有什么区别呢?


Answer

Answer 1:

在建模过程中通常会定义三个数据集:

  • 训练集(train set) —— 用来训练模型
  • 验证集(development set)—— 用来调参、选择特征以及调整其他和学习算法相关的选项,也称之为保留的验证集(Hold-out cross validation set
  • 测试集 —— 用来评估算法的性能,但不能作为调参、选择特征等算法相关的选择的依据

个人理解,测试集是必须的,因为需要它来评估模型的泛化性能。而验证集不是必须的,可以用交叉验证来代替,并且交叉验证可以提高训练数据的使用率,但交叉验证不是任何时候都可行,例如当训练时间很长的时候,一般就用验证集来做模型选择。

参考:

Machine Learning Yearning: 5. Your development and test sets

Answer 2:

训练数据集(Training Set): 是一些我们已经知道输入和输出的数据集训练机器去学习,通过拟合去寻找模型的初始参数。例如在神经网络(Neural Networks)中, 我们用训练数据集和反向传播算法(Backpropagation)去每个神经元找到最优的比重(Weights)。


验证数据集(Validation Set):也是一些我们已经知道输入和输出的数据集,通过让机器学习去优化调整模型的参数,在神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点;在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。


测试数据集(Test Set):用户测试模型表现的数据集,根据误差(一般为预测输出与实际输出的不同)来判断一个模型的好坏。


为什么验证数据集和测试数据集两者都需要?


因为验证数据集(Validation Set)用来调整模型参数从而选择最优模型,模型本身已经同时知道了输入和输出,所以从验证数据集上得出的误差(Error)会有偏差(Bias)。

但是我们只用测试数据集(Test Set) 去评估模型的表现,并不会去调整优化模型。


在传统的机器学习中,这三者一般的比例为training/validation/test = 50/25/25, 但是有些时候如果模型不需要很多调整只要拟合就可时,或者training本身就是training+validation (比如cross validation)时,也可以training/test =7/3.


但是在深度学习中,由于数据量本身很大,而且训练神经网络需要的数据很多,可以把更多的数据分给training,而相应减少validation和test


Answer 3:

可以看看这个,算是相关问题、答案也类似

如果我用交叉验证,还是否需要单独分出测试集?

Answer 4:

我们说的测试集都是指代比赛数据,工业界是没有的,只有训练数据,然后切分验证和训练。


Question 1002437: 怎么理解聚类算法的评价指标Rand Index(RI)?

统计/机器学习 无监督学习 模型验证

怎么理解聚类算法的评价指标Rand Index(RI)?谢谢!


Answer

Answer 1:

Rand Index是比较两个聚类结果的,也可以比较一个聚类算法的结果和真实分类情况。

Rand Index的想法是枚举样本中的所有的pair,然后看有多少个pair在聚类算法1和聚类算法2的情况是一致的。

比如说,有五个数据点,x是聚类1返回的结果,y是聚类2返回的结果

x:[1, 1, 2, 3, 3]

y:[2, 2, 3, 1, 2]

x[0, 1] = [1, 1],在同一簇中

y[0, 1] = [2, 2],也在同一簇中。

所以[0, 1]这一对在聚类1和聚类2中是一致的。

x[0, 2] = [1, 2],不在同一簇中

y[0, 2] = [2, 3],也不在同一簇中。

所以[0, 2]这一对在聚类1和聚类2中也是一致的。

如果有$n$个数据点,那么

$$\text{Rand Index}=\frac{\text{一致的对数}}{\frac{1}{2}n(n-1)}$$

分母上就是说$n$个数据点,一共有$\frac{1}{2}n(n-1)$个pair。


以上面的例子来说,Rand Index=0.7。因为一共有10对,其中3对不一致,分别是

x[0, 4]与y[0, 4] 

x[1, 4]与y[1, 4] 

x[3, 4]与y[3, 4] 


很显然, Rand Index是0到1之间的数。如果是1,就表示两个聚类结果完全一样。

Answer 2:

rand index的python实现。

代码很简单,看懂代码了就理解rand index了

def RandIndedx(x, y):

    l = len(x)

    agrees = 0

    for i in range(l-1):

        for j in range(i+1, l):

            x_status = int(x[i] == x[j])

            y_status = int(y[i] == y[j])

            agrees += int(x_status == y_status)

    return agrees * 2 / (l * (l - 1))



Question 1002561: 怎么理解推荐系统中的NDCG?

统计/机器学习 推荐系统 模型验证

怎么理解推荐系统中的NDCG?看起来非常复杂,有清楚的同学可以介绍下吗?

如果能有浅显的例子就更好啦,非常感谢!


Answer

Answer 1:

可能大家接触比较多的是MAP,MAP考虑的是0和1的排序。而NDCG则是考虑到评分的排序。

说到NDCG就需要从CG开始说起。

CG(cumulative gain,累计增益)可以用于评价基于打分/评分的个性推荐系统。假设我们推荐$k$个物品,这个推荐列表的$CG_k$计算公式如下:

$$CG_k=\sum_{i=1}^k \text{rel}_i.$$

$\text{rel}_i$表示第$k$个物品的相关性或者评分。假设我们共推荐$k$个电影,$rel_i$可以是用户对第$i$部电影的评分。

比如豆瓣给用户推荐了五部电影,

$M_1$,$M_2$,$M_3$,$M_4$,$M_5$,

该用户对这五部电影的评分分别是

5, 3, 2, 1, 2

那么这个推荐列表的CG等于$$CG_5=5+3+2+1+2=13.$$

CG没有考虑推荐的次序,在此基础之后我们引入对物品顺序的考虑,就有了DCG(discounted CG),折扣累积增益。公式如下:

$$DCG_k=\sum_{i=1}^k \frac{2^{\text{rel}_i}-1}{\log_2(i+1)}.$$

比如豆瓣给用户推荐了五部电影,

$M_1$,$M_2$,$M_3$,$M_4$,$M_5$,

该用户对这五部电影的评分分别是

5, 3, 2, 1, 2

那么这个推荐列表的DCG等于$$DCG_5=\frac{2^5-1}{\log_2 2}+\frac{2^3-1}{\log_2 3}+\frac{2^2-1}{\log_2 4}+\frac{2^1-1}{\log_2 5}+\frac{2^2-1}{\log_2 6}=31+4.4+1.5+0.4+1.2=38.5$$

DCG没有考虑到推荐列表和每个检索中真正有效结果个数,所以最后我们引入NDCG(normalized discounted CG),顾名思义就是标准化之后的DCG。

$$NDCG_k=\frac{DCG_k}{IDCG_k}$$

其中$IDCG$是指ideal DCG,也就是完美结果下的DCG。

继续上面的例子,如果相关电影一共有7部

$M_1$,$M_2$,$M_3$,$M_4$,$M_5$,$M_6$,$M_7$

该用户对这七部电影的评分分别是

5, 3, 2, 1, 2 , 4, 0

把这7部电影按评分排序

5, 4, 3, 2, 2, 1, 0

这个情况下的完美DCG是$$IDCG_5=\frac{2^5-1}{\log_2 2}+\frac{2^4-1}{\log_2 3}+\frac{2^3-1}{\log_2 4}+\frac{2^2-1}{\log_2 5}+\frac{2^2-1}{\log_2 6}=31+9.5+3.5+1.3+1.2=46.5$$

所以

$$NDCG_5 = \frac{DCG_5}{IDCG_5}=\frac{38.5}{46.5}=0.827$$

NDCG是0到1的数,越接近1说明推荐越准确。


Question 1003295: 为什么决策树中用熵而不是基尼不纯度来作为划分依据?

统计/机器学习 特征选择 模型验证

决策树通常用熵而不是基尼不纯度来作为划分依据来选择特征,这是为什么?

熵和基尼不纯比有什么明显的优势呢?


Answer

Answer 1:

熵和基尼相互之间从分类效果上说并没有所谓的优势和劣势,基尼计算起来有优势。

有一篇对它们进行理论比较的文章Theoretical Comparison between the Gini Index and Information Gain Criteria

论文最后的结论是

“We found  that they disagree only in 2%, which explains why most previously published empirical results concluded that it is not  possible to decide which one of the two tests to prefer”

只有2%的情况下,它们两个找到了不同的划分,这也解释了为什么过去的种种实验结果无法判断孰优孰劣了。

Answer 2:

并不存在这样的说法。

决策树既可以用熵也可以用基尼,而且本来它们也是很接近的,$p_j$表示样本中标签$j$的占比,样本中一共有$m$中标签,那么

$$\text{熵}=-\sum_{i=1}^m p_j\log p_j$$

$$\text{基尼}=1-\sum_{i=1}^m p^2_j$$

所以我们看出主要的区别就是基尼中把$\log p_j$换成了$p_j$,相比于熵,基尼反而有计算量小的优势(不用算$\log$)。


Question 1003482: 聚类问题需不需要分出测试集?

统计/机器学习 无监督学习 模型验证

以前做K-Means之类的聚类,好像都没有划分训练集和测试集,都是用了整个数据集。

我想知道聚类问题到底需不需要分出测试集?


Answer

Answer 1:

这个问题见仁见智吧

分出test data有时候可以用来检验是否overfitting


Question 1003502: 精度-召回曲线的起点和终点是什么?

统计/机器学习 模型验证

ROC的起点是[0, 0],终点是[1, 1],但是感觉精度-召回曲线的起点和终点并不是[0, 1]到[1, 0],而且不同的模型可能起点终点不同,那理论上精度-召回曲线的起点和终点是什么?


Answer

Answer 1:

终点是确定的,是$(1, p)$,$p$是样本中正样本的比重。

可以看看precision-recall曲线下面积有什么意义?里jkm_pku的回答。

Answer 2:

召回-recall = TP/(TP+FN),表示predict的positive占事实positive的比例

精度-precision = TP/(TP+FP),表示predict的positive中事实positive的比例

理论上来说,PR曲线的起点和终点可能是[0,1]之间的任何点


Question 1003649: 量化交易以及时间序列中的回测(backtesting)是什么意思?

统计/机器学习 金融数学 模型验证 时间序列

量化交易以及时间序列中的回测(backtesting)是什么意思?


Answer

Answer 1:

回测一般是用在量化交易上。比如你设计了一个投资组合,然后你在过去的历史数据上测试你的投资组合的收益,这个就是回测。

更概括地说,就是用历史数据来测试一个算法或者模型,就是回测。


Question 1003677: binomial deviance是什么意思?

统计/机器学习 模型验证 描述性统计

binomial deviance是什么意思?求解释


Answer

Answer 1:

binomial deviance用来描述逻辑回归的拟合度,类似于线性回归的$R^2$。

binomial deviance本质上和logloss是等价的。逻辑回归的log-likelihood是

$$l = \sum_{i=1}^n y_i (\alpha + \beta x_i)-\sum_{i=1}^n \log(1+\text{exp}(\alpha+\beta x_i))$$

binomial deviance就等于

$$-2l$$


Question 1004644: XGBoost使用hyperop调参的度量集

统计/机器学习 模型验证

我使用hyperopt对xgboost模型调参,想请教一下,当度量标准是准确率的负数即(fmin(-accuracy))的时候,是使用的验证集上的准确率还是测试集上的准确率。


另外我在一批测试集上测试的模型准确率达到了90%,另选了一批测试集准确率只有百分之77%。是否合理? 模型出现了什么问题,导致的泛化不好。ps: 测试集并没有进入模型训练。


Answer

Answer 1:

模型尽量不要用准确率做评估。对于二分类模型,划分正负样本的这个阈值,直接定0.5不一定最优,auc更合适一些。二分类模型本质上是排序模型,强行定义了一个阈值不合适,这样不稳定。推荐用auc做度量

hyperopt的fmin迭代模型的函数不是你自己定义的吗?具体返回的值肯定要看你自己的设置呀。


Question 1005496: SMAPE是什么?

统计/机器学习 模型验证 描述性统计

SMAPE是什么?MAPE是mean absolute percentage error。多了个S是什么意思呢?


Answer

Answer 1:

S是对称的意思,SMAPE算是对MAPE的修正吧,如果数值本身很小的话,预测偏差一点百分比就会差很多。

SMAP的计算方法就是下面这样,$F_t$是预测值,$A_t$是真实值。

        


Question 1005756: 医学统计里的c-index或者c-statistic是什么意思?

统计/机器学习 模型验证 描述性统计

医学统计的文献里出现的c-index或者c-statistic是什么意思?

初来乍到,多多包涵!谢谢各位!


Answer

Answer 1:

c-index是concordance index,也叫做一致性指数。

比如说有$m$个病人,预测A病人存活时间长于B病人,并且预测结果与实际情况一致,那么我们就称为这是一致的对子。c-index就是从$m$个病人中一致的对子的比例。所以c-index是0到1的数,当c-index是0.5的时候,表面预测相当于随机预测。

对于二元分类的情况,c-index就完全等价于roc auc。上面的例子我们也可以看出c-index也可以用于回归模型、生存模型的评价。


Question 1005787: roc space是什么意思?

统计/机器学习 模型验证

roc是用来评价分类器的曲线,那么roc space是什么意思?


Answer

Answer 1:

ROC space就是横轴为Specificity(FPR, 假阳性率),纵轴为sensitivity(TPR,真阳性率),$[0, 1]\times[0,1]$范围内的空间。这个空间能够包涵所以二元分类器的表现。如果分类器是概率分类器,那么这个分类器在roc space中就是一个曲线;如果分类器是标签分类器,那么这个分类器就是roc space中的一个点。



Question 1005897: 怎么理解图像识别里的dice系数?

统计/机器学习 模型验证 描述性统计 计算机视觉

怎么理解图像识别里的dice系数?越接近1越相似吗?模型效果越好吗?


Answer

Answer 1:

图像分割,目标检测中比较常用到dice coefficient。它的取值范围是0到1,越接近1说明模型越好。

dice coefficient是像素级别的,真实的目标出现在某片区域A,你的模型预测的目标区域为B,那么dice coefficient就等于

$$\frac{2\times \text{A和B重叠区域的像素个数}}{\phantom{1234}\text{A的像素个数}+\text{B的像素个数}\phantom{1234}}$$

Answer 2:

假设蓝色是模型预测的区域,红色是ground truth,dice系数就可以表示为下图中右边的公式

左边的公式表示的是IoU,也就是Jaccard系数,也是在图像中比较常用


Question 1005911: R里怎么计算log loss?

统计/机器学习 模型验证 R 损失函数

R里怎么计算log loss?


Answer

Answer 1:

你可以按照定义手算。或者装一个MLmetrics的library,然后用里面的logloss

library(MLmetrics)

LogLoss(y_pred, y_true)

Question 1007396: 学习曲线异常分析

统计/机器学习 模型验证

1,以下是用分别用逻辑回归与神经网络得出的学习曲线,通过sklearn learning_curve 方法获取并画出的图。这个图有点奇怪,为什么train dataset和cv dataset都是一个方向并且比较一致的?请高手帮忙分析一下,如下图:


2,这两个模型通过测试数据得出的相关评价指标都比较高的,如下:



Answer

Answer 1:

你的train_size是什么意思?

在训练刚开始的时候方向一致是很正常的,根据你的图里来看,两个模型可能都还在欠拟合的阶段,所以training accuracy和cv accuracy都是在上升。一般来说t随着训练次数增加,模型会从欠拟合状态变为过拟合的状态,这个过程中train的accuracy会持续上升,而cv的accuracy会在某个点之后开始下降,开始下降的这个点就是这个模型的最优状态。


Question 1007402: 火车站晚点预测

统计/机器学习 模型验证 时间序列 R 应用场景

如何根据已知的前一个火车站到达时间预测下一个火车站的火车到达时间,用什么模型比较好,无法用时间序列,因为给予的时间,日期都是随机的,不连续


Answer

Answer 1:

可以用回归,你的y可以是到下一站的实际晚点的分钟数,正数就是晚点了,0就是正点了,负数就是早了,这样y就是纯数值的,所以就是一个回归问题。线性回归,randomforest都可以做回归的。

正点到站所需要的分钟数、车次信息、日期、甚至天气可以作为x。


Question 1022032: 目标检测里IOU是什么意思?

统计/机器学习 模型验证 计算机视觉

目标检测里IOU是什么意思?


Answer

Answer 1:

IOU就是交集和并集的比值,Intersection over Union

交集就是你预测的区域和实际的区域的交集,并集就是你预测的区域和实际的区域的并集。

IoU就是交集的面积比上并集的面积。所以是0到1之间的数值,越接近1越准确。


来自sofasofa(一个专业的机器学习社区),建议去sofa社区阅读,这里只是记录。防止网站在网络中走失。