在上一篇文章中,我们介绍了几种模型,包括朴素贝叶斯、KNN、KMeans、EM、线性回归和逻辑回归。今天我们就来和大家谈谈如何评价这些模型。均方误差的概念很简单,和回归模型中的损失函数一样。可以理解为我们的预测值和真实值之间的偏差。我们用y代表样本的真实值,用y_代表模型的预测值。那么均方误差可以写成:其中m是样本数,是一个常数。我们也可以忽略。如果忽略它,它就是平方差之和。好像没有什么特别的说法。而如果不计算均值,求和可能会很大,所以通常我们都会计算均值。这里的MSE是meansquareerror的缩写,意思是均方差。我们都知道,统计中的方差表示样本距离均值的波动程度。方差越大,指标越不稳定,波动性越大。在回归模型场景中,我们衡量的不是与均值的离散程度,而是与实际值的离散程度。两者的意思很相似,应该不难理解。均方误差越小,模型越接近真实值,所以它不仅可以作为模型训练时的损失函数,也可以作为我们人工审核模型效果的参考。回归模型一般使用的指标是均方误差,而分类模型要复杂得多,涉及多个指标。让我们一一看看。TP、TN、FP、FN这四个值看似傻傻的不清楚,但是一旦我们理解了他们的英文,其实就非常容易理解了。T表示true,也就是真,那么F自然就表示false,也就是假。P表示positive,可以理解为正,N表示negative,表示负。这里的阴阳没有逻辑意义,只代表范畴。我们也可以理解为01或者A和B,因为没有逻辑因子,所以叫同一个。所以这四个就是真假阴阳的排列组合。带T的都代表true,可以理解为预测正确。比如TP是truepositive,就是说测试是阳性,实际上是阳性。同理,TN为真阴,测为阴性,实为阴性。F表示预测错误,FP为falsepositive,即测试为阳性,但实际为负,表示测试错误。同理,FN是假阴性,测试是阴性,其实是阳性。我们用医院检测代入这些数值就可以理解。TP和TN表示检测试剂功能强大,检测准确。但是FP和FN说明检测试剂不好,如果检测错了,要么健康人检测出疾病,要么检测不到疾病。显然,在医学检测场景中,假阳性是可以接受的,但假阴性则不行。因为假阳性可以再次检测判断是阴还是阳,如果漏掉了假阳性,对患者会有不好的影响,所以一般来说,医学检测试剂比标准的要灵敏,所以我们可以试试不放过漏网之鱼。召回率召回率的英文单词是recall。我觉得这个词的翻译很好。中文的意思与英文基本相同。有的教科书也把它翻译成召回率。感觉意思不够好。最好叫召回率更优雅。最多一些。让我们假设一个场景。例如,A是一名排长,他手下有10名士兵。有一个任务需要A召集所有成员来执行。A一声令下,召集了8个人。那么召回率为80%。我们把它放到机器学习的场景中也是一样。在二分类场景中,一般来说,模型主要考虑正例。可以理解为沙子里淘金,反面的例子就是沙子,一般价值不大,正面的例子就是金子,这就是我们需要的。所以召回率就是我们预测准确的正例占所有正例的比例。我们将上面的TP、TN、FP、FN代入计算,可以得到:TP是我们预测准确的正例,也就是被我们召回的部分,那么正例有多少?答案是召回的正例加上没有召回的正例,没有召回的正例说明预测错误,预测为负例。但是他们不是负例,所以是假负样本,自然是FN。这里稍微绕了点弯路,重点是recall是针对positiveexamples的,不要担心negativeexamples。就好比你去淘金,你明明不在乎沙子的情况,你只在乎金子有没有捞上来,这没有任何意义。这两个值你可能在很多机器学习的书上看到过。可能你读的时候还记得它们的区别,但是读完就忘记了,甚至可能会掉进去。混乱的状态。这种情况并不少见,我也经历过,甚至在面试时也弄错了。这其中很大一部分原因是翻译的问题,这两个值的翻译太接近了。我们很难区分中文中准确率和准确率的区别。在我们看来,这两个词是等价的,但是在英语中,这两个词是有区别的。所以我们要想搞清楚这两者,需要看英文解释,而不是只记住一个概念。在英文中,准确率是英文precision,字典中的解释是:precision定义为真阳性占所有阳性结果(包括真阳性和假阳性)的比例。翻译就是所有预测为正例的样本中,正确的比例。准确率英文是accuracy,英文解释是:accuracy是真实结果(包括truepositives和truenegatives)在总体中所占的比例。翻译是准确预测结果的概率。既然预测结果是准确的,那么显然既包含了Positiveexample也包含了negativeexamples。从英文的描述中,我们可以清楚地看出这两个概念的区别。两者都是正确预测的一部分,但准确率只是针对正例的,而准确率是针对所有样本的,包括正例和负例。我个人认为把这两个翻译成screeningaccuracy和judgmentaccuracy比较容易理解。如果只有precision和accuracy可能还好,再加上上面说的recallrate,你可能真的会头晕。让我们举个例子来阐明这三个指标。假设在国共内战期间,tg要抓军统的间谍,已经把100人关在一个村子里,交给A??和B去寻找间谍。其中,A选出18人,其中间谍12人,B选出10人,其中间谍8人。假设我们知道一共有20个间谍,那么这两个人的召回率、准确率和查准率分别是多少?我们先来看A。让我们从一个简单的回忆开始。由于总共有20个间谍,A找出了其中的12个,那么召回率为12/20=0.6。准确率是筛选的正确率。我们一共筛选了18个人,其中12个人答对了,所以准确率为12/18=2/3。准确率是整体正确率。它正确判断了12名间谍和80名普通人。准确率为(12+82-8)/100,即86%。我们再来看B。它的召回率为8/20=0.4,准确率为8/10=0.8,准确率为(8+90-12)/100=86%。从上面的例子中,我们可以得到精度和准确度的公式。其中,准确率是正确筛选的概率,是正确筛选的数量除以筛选的样本数量。正确的筛选数自然是TP。总筛选正确数和错误数,错误筛选数为FP,所以:准确率即为整体正确率,即所有正确数除以样本数:recall和recall之间的trade-offprecision我们继续研究刚才的例子。从A和B的结果来看,我们会发现两者的准确率都非常高。高,均为86%。但是你会发现这个值是没有意义的,因为如果我不抓间谍的话,准确率还能达到80%。因为负样本太多,增加了整体的准确率,并不能说明问题。如果负样本的比例越大,准确率就会进一步提高。比如在医疗行业,有些疾病的检测准确率光看是没有用的,因为本身发病率就不高,而且大量是阴性样本。如果什么都检测不到,也可以获得很高的准确率。明白了这一点之后,也会减少很多的欺骗,比如很多假药或者假器械骗子就是利用准确性来欺骗消费者。在负例不重要的场景下,我们一般不参考准确率,因为它会受到负例的影响。那么recall和precision这两个值我们应该参考哪个呢?让我们回到问题场景。有两个人,A和B。A的召回率较高,20个间谍中有12个被发现。但是B的准确率更高,查到的10个人中有8个是间谍,命中率非常高。那么这两个人谁更强呢?代入问题的场景,你会发现这个问题没有标准答案,答案完全取决于他们的上级。如果老板是个利己主义者,比较注重业绩,宁可杀了错误也不放过,那他显然会认为A比较好,因为他抓了更多的奸细。如果老板是一个富有同情心和仁慈的人,他显然会更喜欢B,如果他犯的错误越少,他对老百姓的伤害就越小。所以这不是一个技术问题,而是一个哲学问题。哪个更好,完全取决于问题的角度和问题的场景。如果我们换个场景,那就不一样了。如果是疾病筛查的场景,我可能想要更高的召回率,尽可能多地召回阳性病例。对于不准确的检测结果,我们可以多检测几次以增加信心,但如果漏检了一些样本,就会存在患者漏诊的风险。如果是风控场景,发现作弊后往往会进行严厉的处罚。当然,我们更看重的是准确率,因为一旦发现错误,会给用户带来巨大的伤害,可能会被卸载,再也回不来了。宁可放过它,也不愿杀死它。有没有一个指标可以综合考虑recall和precision的?或者是的,这个值叫做F1-score。它的定义是:如果熟悉数学的同学会发现f1-score本质上是recall和precision的混合平均值,我们可以用它来平衡recall和precision,方便我们做一个trade-off。我们也可以计算刚才A和B的f1-score。经过计算,A的f1-score为0.631,B的f1-score为0.533,综合来看,A更好。召回率和准确率的权衡我们继续刚才的例子。如果你做过很多模型,你会发现在机器学习领域,召回率和精度是两个不可调和的值。如果一个模型的准确率很高,它通常会被召回。低,但是recall高,准确率低,我们很难把precision和recall一起提高,这是为什么呢?我以逻辑回归模型为例,我们看下图:图中的l1,l2和l3可以看成是三个不同的模型。显然,我们可以看到l1的精度最高,但召回率最低,而l3的精度最低,但召回率最高。这是由两个原因造成的。第一个原因是我们的样本存在误差,尤其是关键边缘的数据会因为误差而相互渗透。第二个原因是模型的拟合能力有限。比如在这个例子中,我们使用的是线性模型,我们只能将样本划分成一个线性平面。如果扩大recall,必然会混入更多的错误样本,如果提高precision,则必然会降低recall。显然,这是一个交易,英文是trade-off,我们不能两者兼得,我们必须在两者之间做出选择。当然,如果换成拟合能力更强大的模型,比如gbdt或者神经网络,效果会更好,但也不是没有代价的。模型训练越复杂,需要的样本就越多。如果没有足够的样本,模型越复杂,就越难收敛。这是考验算法工程师的经典场景,我们需要根据自己的场景做出合适的选择。什么是扩大召回,或提高精度。以逻辑回归模型为例,我们使用0.5位的阈值来判断是正例还是负例。理论上,如果我们提高这个阈值,可以提高模型的准确率,但同时召回率也会下降。相反,如果我们降低阈值,我们会得到更多的正例,这意味着更多的负例会被误判为正例,准确率会下降。综上所述,今天介绍的概念既是机器学习的基础,也是面试的常客。作为一个合格的算法工程师,这是必须要明白的。如果你感到困惑,你可以想想抓间谍的例子。非常生动有效,一定能帮助你加深记忆。
