问题建模
机器学习解决问题的通用流程:问题建模——特征工程——模型选择——模型融合
其中问题建模主要包括:设定评估指标,选择样本,交叉验证
解决一个机器学习问题都是从问题建模开始,首先需要收集问题的资料,深入理解问题,然后将问题抽象成机器可预测的问题。在这个过程中要明确业务指标和模型预测目标,根据预测目标选择适当指标用于模型评估。接着从原始数据中选择最相关的样本子集用于模型训练,并对样本子集划分训练集和测试集,应用交叉验证的方法对模型进行选择和评估。
评估指标
评估指标很多,我们应该选择一个能跟业务指标波动一致的评估指标,这样通过观察评估指标就能判断模型效果,可以大大提高模型迭代效率。
评估指标用于反应模型效果,在预测问题中,要评估模型的效果,就需要将模型预测结果 f ( x ) f(x) f(x)和真真实标注 Y Y Y进行比较,评估指标定义为 f ( x ) f(x) f(x)和 Y Y Y的函数。
s c o r e = m e t r i c ( f ( x ) , Y ) score = metric(f(x),Y) score=metric(f(x),Y)
通常线下使用的是机器学习评估指标,线上使用的是业务指标,如果线下指标和线上指标不同,则可能会出现线下指标变好而线上指标变差的现象。为此,在一个新问题的开始阶段,都会进行多轮模型迭代,来探索和线上业务指标一致的线下指标,尽可能使线下指标的变趋势和线上指标一致。
分类指标
1. 精确率、召回率、准确率、错误率和F函数
1.1 精确率和召回率
精确率和召回率主要用于二分类问题(从其公式推导也可看出),结合混淆矩阵有:
精确率P和召回率R的定义为:
精 确 率 ( P r e c i s i o n ) = T r u e P o s i t i v e T r u e P o s i t i v e + F a l s e P o s i t i v e 精确率(Precision) = \frac{True \ Positive}{True \ Positive + False \ Positive} 精确率(Precision)=True Positive+False PositiveTrue Positive
召 回 率 ( R e c a l l ) = T r u e P o s i t i v e T r u e P o s i t i v e + F a l s e N e g a t i v e 召回率(Recall) = \frac{True \ Positive}{True \ Positive + False \ Negative} 召回率(Recall)=True Positive+False NegativeTrue Positive
上述计算公式中的Positive与Negative是预测标签,True与false代表预测正误;
要注意,精确率和召回率是二分类指标,不适用多分类,由此得到P-R曲线以及ROC曲线均是二分类评估指标(因为其横纵轴指标均为二分类混淆矩阵计算得到),而准确率适用于多分类评估。(可以将多分类问题转换为二分类问题进行求解,将关注的类化为一类,其他所有类化为一类)
理想情况下,精确率和召回率两者都越高越好。然而事实上这两者在某些情况下是矛盾的,精确率高时,召回率低;精确率低时,召回率高; 关于这个性质通过观察PR曲线不难观察出来。比如在搜索网页时,如果只返回最相关的一个网页,那精确率就是100%,而召回率就很低;如果返回全部网页,那召回率为100%,精确率就很低。因此在不同场合需要根据实际需求判断哪个指标跟重要。
上图分析一下:
- recall是相对真实的答案而言: true positive / golden set 。假设测试集里面有100个正例,你的模型能预测覆盖到多少,如果你的模型预测到了40个正例,那你的recall就是40%。
- precision是相对你自己的模型预测而言:true positive /retrieved set。假设你的模型一共预测了100个正例,而其中80个是对的正例,那么你的precision就是80%。我们可以把precision也理解为,当你的模型作出一个新的预测时,它的confidence score 是多少,或者它做的这个预测是对的的可能性是多少。
- 一般来说呢,鱼与熊掌不可兼得。如果你的模型很贪婪,想要覆盖更多的sample,那么它就更有可能犯错。在这种情况下,你会有很高的recall,但是较低的precision。如果你的模型很保守,只对它很sure的sample作出预测,那么你的precision会很高,但是recall会相对低。
这样一来呢,我们可以选择只看我们感兴趣的class,就是minority class的precision,recall来评价模型的好坏。
1.2 准确率和错误率
准确率和错误率既可用于二分类也可用于多分类:
准
确
率
(
a
c
c
u
r
a
c
y
)
=
T
P
+
T
N
T
P
+
F
P
+
F
N
+
T
N
准确率(accuracy)= \frac{TP+TN}{TP+FP+FN+TN}
准确率(accuracy)=TP+FP+FN+TNTP+TN
错 误 率 ( e r r o r r a t e ) = F P + F N T P + F P + F N + T N 错误率(error rate) = \frac{FP+FN}{TP+FP+FN+TN} 错误率(errorrate)=TP+FP+FN+TNFP+FN
上述公式是准确率、错误率针对二分类情况时候的计算公式
精确率和准确率是比较容易混淆的两个评估指标,两者是有区别的。精确率是一个二分类指标,而准确率能应用于多分类,其计算公式为:
准 确 率 ( a c c u r a c y ) = 1 n ∑ i = 1 n I ( f ( x i ) = y i ) 准确率(accuracy) = \frac{1}{n}\sum_{i=1}^{n}I(f(x_i)=y_i) 准确率(accuracy)=n1i=1∑nI(f(xi)=yi)
1.3 F函数:
F1函数是一个常用指标,F1值是精确率和召回率的调和均值,即
2 F 1 = 1 P + 1 R \frac{2}{F_1} = \frac{1}{P} + \frac{1}{R} F12=P1+R1
F 1 = 2 P R P + R F_1 = \frac{2PR}{P+R} F1=P+R2PR
F值可泛化为对精确率和召回率赋不同权值进行加权调和:
F α = ( 1 + α 2 ) P R α 2 P + R F_{\alpha} = \frac{(1+\alpha^2) PR}{\alpha^2 P+R} Fα=α2P+R(1+α2)PR
利用 α \alpha α给P和R赋予不同的权重,若 α = 1 \alpha = 1 α=1则为F1值。
下面是两个场景:
- 地震的预测对于地震的预测,我们希望的是RECALL非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲PRECISION。情愿发出1000次警报,把10次地震都预测正确了;也不要预测100次对了8次漏了两次。
- 嫌疑人定罪基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。及时有时候放过了一些罪犯(recall低),但也是值得的。对于分类器来说,本质上是给一个概率,此时,我们再选择一个CUTOFF点(阀值),高于这个点的判正,低于的判负。那么这个点的选择就需要结合你的具体场景去选择。反过来,场景会决定训练模型时的标准,比如第一个场景中,我们就只看RECALL=99.9999%(地震全中)时的PRECISION,其他指标就变得没有了意义。
2. ROC曲线、PR曲线
2.1 PR曲线
我们以召回率R为横轴、以精确率P为纵轴,能够画出P-R曲线,如下图:
从上图不难发现,precision 与 Recall的折中(trade off),曲线越靠近右上角性能越好,曲线下的面积叫 AP 分数,能在一定程度上反应模型的精确率和召回率都很高的比例。但这个值不方便计算,综合考虑精度与召回率一般使用 F1 函数或者 AUC 值(因为ROC曲线很容易画,ROC曲线下的面积也比较容易计算).
先看平滑不平滑,在看谁上谁下(同一测试集上),一般来说,上面的比下面的好(红线比黑线好);
F1(计算公式略)当P和R接近就也越大,一般会画连接(0,0)和(1,1)的线,该直线线和 PRC 重合的地方的F1是这条线最大的F1(光滑的情况下),此时的 F1 对于 P-R 曲线就好象 AUC 对于ROC一样。一个数字比一条线更方便调模型。
注:既然 Precision 与 Recall 都是二分类指标,则 PR 曲线也必然是二分类指标,虽然可以将precision、Recall及PR曲线应用到多分类,但是这种情况相当于是多分类转换为二分类情况分析(将关注的类视为一类,将其他所有类化为一类)
2.2 ROC曲线
在众多的机器学习模型中,很多模型输出的是预测概率,而使用精确率、召回率这类指标进行模型评估时,还需要对预测概率设分类阈值,比如预测概率大于阈值为正例,反之为负例。这使得模型多了一个超参数,并且这超参数会影响模型的泛化能力。
接受者操作特征(Receiver Operating Characteristic, ROC)曲线不需要设定这样的阈值,ROC曲线纵坐标是真正率,横坐标是假正率,如下图,去对应的计算公式为:
真 正 率 ( T r u e P o s i t i v e R a t e ) = T P T P + F N 真正率(True \ Positive \ Rate) = \frac{TP}{TP+FN} 真正率(True Positive Rate)=TP+FNTP
假 正 率 ( F a l s e P o s i t i v e R a t e ) = F P F P + T N 假正率(False \ Positive \ Rate) = \frac{FP}{FP+TN} 假正率(False Positive Rate)=FP+TNFP
同时,TPR与FPR又有其他名称,如下:
-
sensitivity = recall = true positive rate
-
specificity = 1- false positive rate
假设我们的 minority class,也就是正例,是1。反例,为0。
Y
^
\hat{Y}
Y^ 是真实 label Y 的估计(estimate)。
看出来没有,sensitivity和specificity是条件于真实label Y的概率的。我们讲这个叫条件概率嘛。那么意思就是说,无论Y的真实概率是多少,都不会影响sensitivity和specificity。也就是说,这两个metric是不会受imbalanced data 影响的,那就很客观了啊,是不是!而precision呢,就会随着你的测试集里面的正反比例而变化哦。
另外值得注意的是,AUC的计算方法同时考虑了学习器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器做出合理的评价。 AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价学习器性能的一个原因。
例如在癌症预测的场景中,假设没有患癌症的样本为正例,患癌症样本为负例,负例占比很少(大概0.1%),如果使用准确率评估,把所有的样本预测为正例便可以获得99.9%的准确率。但是如果使用AUC,把所有样本预测为正例,TPR为1,FPR为1。这种情况下学习器的AUC值将等于0.5,成功规避了样本不均衡带来的问题。
这个曲线就是以true positive rate 和 false positive rate为轴,取不同的threshold点画的啦。有人问了,threshold是啥子哦。这么说吧,每个分类器作出的预测呢,都是基于一个probability score的。一般默认的threshold呢都是0.5,如果probability>0.5,那么这个sample被模型分成正例了哈,反之则是反例。
真正率(True Positive Rate)就是召回率Recall
ROC曲线和P-R曲线有些类似,ROC曲线越靠近左上角性能越好。左上角坐标为(0, 1),即FPR=0,TPR=1,根据FPR和TPR公可以得知,此时FN=0, FP=0,模型对所有样本分类正确,绘制ROC曲线很简单,首先对所有样本按预测概率排序,以每条样本的预测概率为阈值,计算相应的FPR和TPR,然后线段连接。
当数据量少时,绘制的ROC曲线不平滑;当数据量大时,绘制的ROC曲线会趋于平滑。
ROC curve 可以很好的回答什么问题呢——“不论class的基本概率怎么样,我的模型in general能表现得多好?”
一般来说呢,最优的threshold就是橙色曲线离蓝色虚线(基准线)最远的一点啦,或者橙色曲线上离左上角最近的一点,再或者是根据用户自己定义的cost function来的。
一般来说,如果ROC是光滑的,那么基本可以判断没有太大的overfitting(比如图中0.2到0.4可能就有问题,但是样本太少了),这个时候调模型可以只看AUC,面积越大一般认为模型越好。
1. 主要作用
-
ROC曲线能很容易的查出任意阈值对学习器的泛化性能影响。
-
有助于选择最佳的阈值。ROC曲线越靠近左上角,模型的查全率就越高。最靠近左上角的ROC曲线上的点是分类错误最少的最好阈值,其假正例和假反例总数最少。
-
可以对不同的学习器比较性能。将各个学习器的ROC曲线绘制到同一坐标中,直观地鉴别优劣,靠近左上角的ROC曲所代表的学习器准确性最高。
2. 优点
-
该方法简单、直观、通过图示可观察分析方法的准确性,并可用肉眼作出判断。ROC曲线将真正例率和假正例率以图示方法结合在一起,可准确反映某种学习器真正例率和假正例率的关系,是检测准确性的综合代表。
-
在生物信息学上的优点:ROC曲线不固定阈值,允许中间状态的存在,利于使用者结合专业知识,权衡漏诊与误诊的影响,选择一个更加的阈值作为诊断参考值。
3. AUC
3.1 什么是AUC
AUC是一个模型评价指标,只能用于二分类模型的评价,对于二分类模型,还有很多其他评价指标,比如logloss,accuracy,precision。如果你经常关注数据挖掘比赛,比如kaggle,那你会发现AUC和logloss基本是最常见的模型评价指标。
为什么AUC和logloss比accuracy更常用呢?因为很多机器学习的模型对分类问题的预测结果都是概率,如果要计算accuracy,需要先把概率转化成类别,这就需要手动设置一个阈值,如果对一个样本的预测概率高于这个预测,就把这个样本放进一个类别里面,低于这个阈值,放进另一个类别里面。所以这个阈值很大程度上影响了accuracy的计算。使用AUC或者logloss可以避免把预测概率转换成类别。
AUC是Area under curve的首字母缩写。AUC就是ROC曲线下的面积,衡量学习器优劣的一种性能指标。 从定义可知,AUC可通过对ROC曲线下各部分的面积求和而得。假定ROC曲线是由坐标为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , ⋯   , ( x m , y m ) } \{(x_1, y_1), (x_2, y_2), (x_3, y_3), \cdots, (x_m, y_m)\} {(x1,y1),(x2,y2),(x3,y3),⋯,(xm,ym)}的点按序连接而形成,则AUC可估算为:
A U C = 1 2 ∑ i = 1 m − 1 ( x i + 1 − x i ) ( y i + y i + 1 ) AUC = \frac{1}{2}\sum_{i=1}^{m-1}(x_{i+1} - x_i)(y_i + y_{i+1}) AUC=21i=1∑m−1(xi+1−xi)(yi+yi+1)
3.2 AUC的意义
通过AUC的定义我们知道了AUC是什么,怎么算,但是它的意义是什么呢。如果从定义来理解AUC的含义,比较困难,实际上AUC和Mann–Whitney U test有密切的联系。
从Mann–Whitney U statistic的角度来解释,AUC就是从所有1样本中随机选取一个样本, 从所有0样本中随机选取一个样本,然后根据你的分类器对两个随机样本进行预测,把1样本预测为1的概率为p1,把0样本预测为1的概率为p0,p1>p0的概率就等于AUC。
即AUC是指随机给定一个正样本和一个负样本,分类器输出该正样本为正的那个概率值比分类器输出该负样本为正的那个概率值要大的可能性。
所以AUC反应的是分类器对样本的排序能力。 根据这个解释,如果我们完全随机的对样本分类,那么AUC应该接近0.5。(所以一般训练出的模型,AUC>0.5,如果AUC=0.5,这个分类器等于没有效果,效果与完全随机一样,如果AUC<0.5,则可能是标签标注错误等情况造成);
另外值得注意的是,AUC的计算方法同时考虑了学习器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器做出合理的评价。AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价学习器性能的一个原因。
这个指标尤其适用在某些场景下(如 CTR 预估),每次要返回的是最有可能点击的若干个广告(根据CTR排序, 选择排在前面的若干个),实际上便是在考验模型的排序能力。除此之外,CTR 中存在着样本不均衡的问题,正负样本比例通常会大于 1:100,如果采用 PR 曲线,则会导致 AUC 发生剧变,无法较好反映模型效果。
然而,ROC 曲线不会随着类别分布的改变而改变的优点在一定程度上也是其缺点。因为 ROC 曲线这种不变性其实影响着的是 AUC 值,或者说是评估分类器的整体性能。但是在某些场景下,我们会更关注正样本,这时候就要用到 PR 曲线了。
比如说信用卡欺诈检测,我们会更关注 precision 和 recall,比如说如果要求预测出为欺诈的人尽可能准确,那么就是要提高 precision;而如果要尽可能多地预测出潜在的欺诈人群,那么就是要提高 recall。一般来说,提高二分类的 threshold 就能提高 precision,降低 threshold 就能提高 recall,这时便可观察 PR 曲线,得到最优的 threshold。
此外,AUC和Wilcoxon Test of Ranks等价;AUC还和基尼(Gini)系数有联系,满足 G i n i + 1 = 2 ∗ A U C Gini+1 = 2*AUC Gini+1=2∗AUC
3.3 AUC的计算方法:
AUC的计算方法有多种,从物理意义角度理解,AUC计算的是ROC曲线下的面积:
A U C = ∑ i ∈ ( P + N ) ( T P R i + T P R I − 1 ) ∗ ( F P R i − F P R i − 1 ) 2 AUC = \sum_{i \in (P+N)}\frac{(TPR_i + TPR_{I-1})*(FPR_i - FPR_{i-1})}{2} AUC=i∈(P+N)∑2(TPRi+TPRI−1)∗(FPRi−FPRi−1)
从概率意义角度理解,AUC考虑的是样本的排序质量,它与排序误差有密切关系,可得到计算公式:
A
U
C
=
∑
i
∈
P
r
a
n
k
i
−
∣
P
∣
∗
(
∣
P
∣
+
1
)
2
∣
P
∣
∗
∣
N
∣
AUC = \frac{\sum_{i \in P}rank_i - \frac{|P|*(|P|+1)}{2}}{|P|*|N|}
AUC=∣P∣∗∣N∣∑i∈Pranki−2∣P∣∗(∣P∣+1)
其中,rank为样本排序位置从1开始, ∣ P ∣ |P| ∣P∣为正样本数, ∣ N ∣ |N| ∣N∣为负样本数。
AUC计算主要与排序有关,所以它对排序敏感,而对预测分数没那么敏感。
最后,我们在讨论一下:在多分类问题下能不能使用ROC曲线来衡量模型性能?
我的理解:ROC曲线用在多分类中是没有意义的。只有在二分类中Positive和Negative同等重要时候,适合用ROC曲线评价。如果确实需要在多分类问题中用ROC曲线的话,可以转化为多个“一对多”的问题。即把其中一个当作正例,其余当作负例来看待,画出多个ROC曲线。
“ROC 曲线具有不随样本比例而改变的良好性质,因此能够在样本比例不平衡的情况下较好地反映出分类器的优劣。”
AUC计算主要与排序有关,所以他对排序敏感,而对预测分数没那么敏感。
AUC指标的不足之处:
- 只反映了模型的整体性能,看不出在不同点击率区间上的误差情况;
- 只反映了排序能力,关注的是概率值的相对大小,与阈值和概率值的绝对大小没有关系,没有反映预测精度;(简单说,如果对一个模型的点击率统一乘以2,AUC不会变化,但显然模型预测的值和真实值之间的offset扩大了。)
- AUC只关注正负样本之间的排序,并不关心正样本内部,或者负样本内部的排序。这也体现了AUC的本质:任意个正样本的概率都大于负样本的概率的能力。
4. 对数损失
对数损失(logistic loss,logloss)是对预测概率的似然估计,其标准形式为:
l o g l o s s = − l o g P ( Y ∣ X ) logloss = -logP(Y|X) logloss=−logP(Y∣X)
对数损失最小化本质上是利用样本中的已知分布,求解导致这种分布的最佳模型参数,是这种分布出现概率最大。
对数损失对应的二分类的计算公式为:
l o g l o s s = − 1 N ∑ i = 1 N ( y ⋅ l o g p i + ( 1 − y ) ⋅ l o g ( 1 − p i ) ) logloss = -\frac{1}{N}\sum_{i=1}^{N}(y \cdot logp_i + (1-y) \cdot log(1-p_i)) logloss=−N1i=1∑N(y⋅logpi+(1−y)⋅log(1−pi))
其中, y ∈ { 0 , 1 } y \in \{0,1\} y∈{0,1}, p i p_i pi为第 i i i条样本预测为1的概率。
对数损失在多分类问题中也使用广泛,其计算公式为:
l o g l o s s = − 1 N ⋅ 1 C ⋅ ∑ i = 1 N ∑ j = 1 C y i j ⋅ l o g p i j logloss = - \frac{1}{N}\cdot \frac{1}{C} \cdot \sum_{i=1}^{N} \sum_{j=1}^{C} y_{ij}\cdot logp_{ij} logloss=−N1⋅C1⋅i=1∑Nj=1∑Cyij⋅logpij
其中, N N N为样本数, C C C为类别数, y i j = 1 y_{ij} = 1 yij=1表示第 i i i条样本的类别为 j j j, p i j p_{ij} pij为第 i i i条样本类别 j j j的概率。
logloss衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。与AUC不同,logloss对预测概率敏感。
5. 推荐系统评估指标
5.1 用户满意度
用户满意度没有办法离线计算,只能通过用户调查或者在线实验获得。
在在线系统中,用户满意度主要通过一些对用户行为的统计得到。比如在电子商务网站中,用户如果购买了推荐的商品,就表示他们在一定程度上满意。因此,我们可以利用购买率度量用户的满意度。此外,有些网站会通过设计一些用户反馈界面收集用户满意度。更一般的情况下,我们可以用点击率、用户停留时间和转化率等指标度量用户的满意度。
5.2 预测准确度
预测准确度度量一个推荐系统或者推荐算法预测用户行为的能力。这个指标是最重要的推荐系统离线评测指标。
-
预测准确率流程:
在计算该指标时需要有一个离线的数据集,该数据集包含用户的历史行为记录。然后,将该数据集通过时间分成训练集和测试集。最后,通过在训练集上建立用户的行为和兴趣模型预测用户在测试集上的行为,并计算预测行为和测试集上实际行为的重合度作为预测准确度。
-
评分预测:
很多提供推荐服务的网站都有一个让用户给物品打分的功能。那么,如果知道了用户对物品的历史评分,就可以从中习得用户的兴趣模型,并预测该用户在将来看到一个他没有评过分的物品时,会给这个物品评多少分。预测用户对物品评分的行为称为评分预测。
评分预测的预测准确度一般通过均方根误差(RMSE)和平均绝对误差(MAE)计算。对于测试集中的一个用户u和物品i,令 r u i r_{ui} rui 是用户 u 对物品 i 的实际评分,而 r ^ u i \hat{r}_{ui} r^ui 是推荐算法给出的预测评分,那么RMSE的定义为:
R M S E = ∑ u , i ∈ T ( r u i − r ^ u i ) 2 ∣ T ∣ RMSE = \frac{\sqrt{\sum_{u,i \in T}{(r_{ui} - \hat{r}_{ui})^2}}}{|T|} RMSE=∣T∣∑u,i∈T(rui−r^ui)2
MAE采用绝对值计算预测误差,它的定义为:
M A E = ∑ u , i ∈ T ∣ r u i − r ^ u i ∣ ∣ T ∣ MAE = \frac{\sum_{u,i \in T}{|r_{ui} - \hat{r}_{ui}|}}{|T|} MAE=∣T∣∑u,i∈T∣rui−r^ui∣
关于RMSE和MAE这两个指标的优缺点, Netflix认为RMSE加大了对预测不准的用户物品评分的惩罚(平方项的惩罚),因而对系统的评测更加苛刻。研究表明,如果评分系统是基于整数建立的(即用户给的评分都是整数),那么对预测结果取整会降低MAE的误差。
-
TopN推荐:
网站在提供推荐服务时,一般是给用户一个个性化的推荐列表,这种推荐叫做TopN推荐。TopN推荐的预测准确率一般通过准确率(precision)/召回率(recall)度量。
令R(u)是根据用户在训练集上的行为给用户作出的推荐列表,而T(u)是用户在测试集上的行为列表。那么,推荐结果的召回率定义为:
R e c a l l = ∑ u , i ∈ U ∣ R ( u ) ∩ T ( u ) ∣ ∑ u ∈ U ∣ T ( u ) ∣ Recall=\frac{\sum_{u,i\in{U}}|R(u)\cap{T(u)}|}{\sum_{u\in{U}}|T(u)|} Recall=∑u∈U∣T(u)∣∑u,i∈U∣R(u)∩T(u)∣
推荐结果的准确率定义为:
P
r
e
c
i
s
i
o
n
=
∑
u
∈
U
∣
R
(
u
)
⋂
T
(
u
)
∣
∑
u
∈
U
∣
R
(
u
)
∣
Precision = \frac{\sum_{u\in U}|R(u) \bigcap T(u)|}{\sum_{u \in U} |R(u)|}
Precision=∑u∈U∣R(u)∣∑u∈U∣R(u)⋂T(u)∣
有的时候,为了全面评测TopN推荐的准确率和召回率,一般会选取不同的推荐列表长度N,计算出一组准确率/召回率,然后画出准确率/召回率曲线(precision/recall curve)。
-
关于评语预测和TopN推荐的讨论:
对此,亚马逊前科学家Greg Linden指出电影推荐的目的是找到用户最有可能感兴趣的电影,而不是预测用户看了电影后会给电影什么样的评分。因此,TopN推荐更符合实际的应用需求。也许有一部电影用户看了之后会给很高的分数,但用户看的可能性非常小。因此,预测用户是否会看一部电影,应该比预测用户看了电影后会给它什么评分更加重要。因此,本书主要也是讨论TopN推荐。
5.3 覆盖率
覆盖率(coverage)描述一个推荐系统对物品长尾的发掘能力。 覆盖率有不同的定义方法,最简单的定义为推荐系统能够推荐出来的物品占总物品集合的比例。假设系统的用户集合为U,推荐系统给每个用户推荐一个长度为N的物品列表R(u)。那么推荐系统的覆盖率可以通过下面的公式计算:
C o n v e r a g e = ∣ U u ∈ U R ( u ) ∣ I Converage = \frac{|U_{u \in U} R(u)|}{I} Converage=I∣Uu∈UR(u)∣
从上面的定义可以看到,覆盖率是一个内容提供商会关心的指标。以图书推荐为例,出版社可能会很关心他们的书有没有被推荐给用户。覆盖率为100%的推荐系统可以将每个物品都推荐给至少一个用户。此外,从上面的定义也可以看到,热门排行榜的推荐覆盖率是很低的,它只会推荐那些热门的物品,这些物品在总物品中占的比例很小。一个好的推荐系统不仅需要有比较高的用户满意度,也要有较高的覆盖率。
但是上面的定义过于粗略。覆盖率为100%的系统可以有无数的物品流行度分布。为了更细致地描述推荐系统发掘长尾的能力,需要统计推荐列表中不同物品出现次数的分布。如果所有的物品都出现在推荐列表中,且出现的次数差不多,那么推荐系统发掘长尾的能力就很好。因此,可以通过研究物品在推荐列表中出现次数的分布描述推荐系统挖掘长尾的能力。如果这个分布比较平,那么说明推荐系统的覆盖率较高,而如果这个分布较陡峭,说明推荐系统的覆盖率较低。在信息论和经济学中有两个著名的指标可以用来定义覆盖率。第一个是信息熵:
H
=
−
∑
i
=
1
n
p
(
i
)
l
o
g
p
(
i
)
H = -\sum_{i=1}^{n}p(i)log\ p(i)
H=−i=1∑np(i)log p(i)
这里p(i)是物品i的流行度除以所有物品流行度之和。
第二个指标是基尼系数(Gini Index):
G
=
1
n
−
1
∑
j
=
1
n
(
2
j
−
n
−
1
)
p
(
i
j
)
G = \frac{1}{n-1}\sum_{j=1}^{n}(2j-n-1)p(i_j)
G=n−11j=1∑n(2j−n−1)p(ij)
这里,
i
j
i_j
ij 是按照物品流行度p()从小到大排序的物品列表中第j个物品。
社会学领域有一个著名的马太效应,即所谓强者更强,弱者更弱的效应。如果一个系统会增大热门物品和非热门物品的流行度差距,让热门的物品更加热门,不热门的物品更加不热门,那么这个系统就有马太效应。
那么,推荐系统是否有马太效应呢?推荐系统的初衷是希望消除马太效应,使得各种物品都能被展示给对它们感兴趣的某一类人群。但是,很多研究表明现在主流的推荐算法(比如协同过滤算法)是具有马太效应的。评测推荐系统是否具有马太效应的简单办法就是使用基尼系数。 如果G1是从初始用户行为中计算出的物品流行度的基尼系数,G2是从推荐列表中计算出的物品流行度的基尼系数,那么如果G2 > G1,就说明推荐算法具有马太效应。
5.4 多样性
为了满足用户广泛的兴趣,推荐列表需要能够覆盖用户不同的兴趣领域,即推荐结果需要具有多样性。
多样性描述了推荐列表中物品两两之间的不相似性。因此,多样性和相似性是对应的。假设 s ( i , j ) ∈ [ 0 , 1 ] s(i, j) \in [0,1] s(i,j)∈[0,1] 定义了物品 i 和 j 之间的相似度,那么用户 u 的推荐列表 R(u) 的多样性定义如下:
D
i
v
e
r
s
i
t
y
(
R
(
u
)
)
=
1
−
∑
i
,
j
∈
R
(
u
)
,
i
≠
j
s
(
i
,
j
)
1
2
∣
R
(
u
)
∣
(
∣
R
(
u
)
∣
−
1
)
Diversity(R(u)) = 1 - \frac{\sum_{i,j \in R(u), i \neq j }s(i,j)}{\frac{1}{2}|R(u)|(|R(u)| -1)}
Diversity(R(u))=1−21∣R(u)∣(∣R(u)∣−1)∑i,j∈R(u),i̸=js(i,j)
而推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
D
i
v
e
r
s
i
t
y
=
1
∣
U
∣
∑
u
∈
U
D
i
v
e
r
s
i
t
y
(
R
(
u
)
)
Diversity = \frac{1}{|U|} \sum_{u \in U} Diversity(R(u))
Diversity=∣U∣1u∈U∑Diversity(R(u))
从上面的定义可以看到,不同的物品相似度度量函数
s
(
i
,
j
)
s(i, j)
s(i,j) 可以定义不同的多样性。如果用内容相似度描述物品间的相似度,我们就可以得到内容多样性函数,如果用协同过滤的相似度函数描述物品间的相似度,就可以得到协同过滤的多样性函数。
5.5 新颖性
新颖的推荐是指给用户推荐那些他们以前没有听说过的物品。在一个网站中实现新颖性的最简单办法是,把那些用户之前在网站中对其有过行为的物品从推荐列表中过滤掉。
O’scar Celma在博士论文“Music Recommendation and Discovery in the Long Tail”中研究了新颖度的评测。评测新颖度的最简单方法是利用推荐结果的平均流行度,因为越不热门的物品越可能让用户觉得新颖。因此,如果推荐结果中物品的平均热门程度较低,那么推荐结果就可能有比较高的新颖性。
用推荐结果的平均流行度度量新颖性比较粗略,因为不同用户不知道的东西是不同的。因此,要准确地统计新颖性需要做用户调查。
5.6 惊喜度
惊喜度(serendipity)是最近这几年推荐系统领域最热门的话题。
惊喜度 VS 新颖性
如果推荐结果和用户的历史兴趣不相似,但却让用户觉得满意,那么就可以说推荐结果的惊喜度很高,而推荐的新颖性仅仅取决于用户是否听说过这个推荐结果。
5.7 信任度
对于基于机器学习的自动推荐系统,存在信任度(trust)的问题,如果用户信任推荐系统,那就会增加用户和推荐系统的交互。特别是在电子商务推荐系统中,让用户对推荐结果产生信任是非常重要的。同样的推荐结果,以让用户信任的方式推荐给用户就更能让用户产生购买欲,而以类似广告形式的方法推荐给用户就可能很难让用户产生购买的意愿。
-
度量推荐系统的信任度:
度量推荐系统的信任度只能通过问卷调查的方式,询问用户是否信任推荐系统的推荐结果。
-
提高推荐系统的信任度方法:
-
首先需要增加推荐系统的透明度(transparency),而增加推荐系统透明度的主要办法是提供推荐解释。只有让用户了解推荐系统的运行机制,让用户认同推荐系统的运行机制,才会提高用户对推荐系统的信任度。
-
其次是考虑用户的社交网络信息,利用用户的好友信息给用户做推荐,并且用好友进行推荐解释。这是因为用户对他们的好友一般都比较信任,因此如果推荐的商品是好友购买过的,那么他们对推荐结果就会相对比较信任。
-
5.8 实时性
推荐系统的实时性包括两个方面:
首先,推荐系统需要实时地更新推荐列表来满足用户新的行为变化。 很多推荐系统都会在离线状态每天计算一次用户推荐列表,然后于在线期间将推荐列表展示给用户。这种设计显然是无法满足实时性的。与用户行为相应的实时性,可以通过推荐列表的变化速率来评测。如果推荐列表在用户有行为后变化不大,或者没有变化,说明推荐系统的实时性不高。
实时性的第二个方面是推荐系统需要能够将新加入系统的物品推荐给用户。 这主要考验了推荐系统处理物品冷启动的能力。
5.9 健壮性
任何一个能带来利益的算法系统都会被人攻击,这方面最典型的例子就是搜索引擎。搜索引擎的作弊和反作弊斗争异常激烈,这是因为如果能让自己的商品成为热门搜索词的第一个搜索果,会带来极大的商业利益。推荐系统目前也遇到了同样的作弊问题,而健壮性(即robust, 鲁棒性)指标衡量了一个推荐系统抗击作弊的能力。
算法健壮性的评测:
算法健壮性的评测主要利用模拟攻击。首先,给定一个数据集和一个算法,可以用这个算法给这个数据集中的用户生成推荐列表。然后,用常用的攻击方法向数据集中注入噪声数据,然后利用算法在注入噪声后的数据集上再次给用户生成推荐列表。最后,通过比较攻击前后推荐列表的相似度评测算法的健壮性。如果攻击后的推荐列表相对于攻击前没有发生大的变化,就说明算法比较健壮。
在实际系统中,提高系统的健壮性,除了选择健壮性高的算法,还有以下方法。
- 设计推荐系统时尽量使用代价比较高的用户行为。比如,如果有用户购买行为和用户浏览行为,那么主要应该使用用户购买行为,因为购买需要付费,所以攻击购买行为的代价远远大于攻击浏览行为。
- 在使用数据前,进行攻击检测,从而对数据进行清理。
5.10 商业目标
很多时候,网站评测推荐系统更加注重网站的商业目标是否达成,而商业目标和网站的盈利模式是息息相关的。**一般来说,最本质的商业目标就是平均一个用户给公司带来的盈利。**不过这种指标不是很难计算,只是计算一次需要比较大的代价。因此,很多公司会根据自己的盈利模式设计不同的商业目标。
不同的网站具有不同的商业目标。比如电子商务网站的目标可能是销售额,基于展示广告盈利的网站其商业目标可能是广告展示总数,基于点击广告盈利的网站其商业目标可能是广告点击总数。因此,设计推荐系统时需要考虑最终的商业目标,而网站使用推荐系统的目的除了满足用户发现内容的需求,也需要利用推荐系统加快实现商业上的指标。
总结
- 精确率(Precision)是指在所有系统判定的“真”的样本中,确实是真的的占比,就是TP/(TP+FP)。
- 召回率(Recall)是指在所有确实为真的样本中,被判为的“真”的占比,就是TP/(TP+FN)。
- TPR(True Positive Rate)的定义,跟Recall一样。
- FPR(False Positive Rate),又被称为“Probability of False Alarm”,就是所有确实为“假”的样本中,被误判真的样本,或者FP/(FP+TN)
- F1值是为了综合考量精确率和召回率而设计的一个指标,一般公式为取P和R的harmonic mean:2PrecisionRecall/(Precision+Recall)。
- ROC=Receiver Operating Characteristic,是TPR vs FPR的曲线;与之对应的是Precision-Recall Curve,展示的是Precision vs Recall的曲线。