模型评估
准确率accuracy是指分类正确的样本数与总样本数之比,即。其缺点在于,当样本类别比例非常不均衡时,如正负样本比为1:9,全部预测为负就可以得到90%的准确率。为了解决这个问题,可以使用平均准确率(每个类别样本准确率的算术平均)。
精确率和召回率多用于二分类,可结合混淆矩阵进行理解:
TP和TN是预测正确的样本,FP和FN是预测错误的样本,TP+TN+FP+FN=样本总数。
精确率(查准率,Precision)是指分类器分类正确的正样本数与判定为正样本的样本数之比。召回率(查全率,Recall)是指分类正确的正样本数与真正的正样本数之比:
在信息检索中,精确率关注的是检索出的信息中有多少比例是用户感兴趣的,召回率关注的是用户感兴趣的信息中有多少被检索出来了,两者都越高越好,但精确率与召回率是既矛盾又统一的两个指标:精确率高时,召回率低;精确率低时,召回率高。如在搜索网页时,如果只返回最相关的那一个网页,那精确率就是100%,而召回率就很低;如果返回全部网页,那召回率为100%,而精确率就很低。
以精确率P为纵轴,以召回率R为横轴、可以画出P-R曲线。许多机器学习模型的输出是预测样本为正例的概率,如果对所有的预测结果按照预测概率进行降序排序,给定一个阈值可以将预测结果划分为两部分,大于阈值的为正例,小于阈值的为负例。可以根据需要选取不同的阈值,如果重视精确率,可以设定一个较高的阈值,如果更重视召回率,可以设定一个较低的阈值,整条P-R曲线是通过将阈值从高到低移动而生成的。
P-R曲线越靠近右上角性能越好,曲线下的而积叫AP分数(Average Precision Score,平均精确率分数)。对比不同模型的AP分数,能在一定程度上反映模型的精确率和召回率都高的比例,但这个值通常不容易计算,可以使用综合考虑精确率和召回率的指标:F1值和ROC曲线。
F1值
F1值是精准率和召回率的调和平均值,它定义为
F值可泛化为对精确率和召回率赋不同权重进行加权调和,不同α值表示对精确率和召回率的不同偏好,α<1精确率有更大影响,α>1召回率有更大影响:
ROC与AUC
ROC(受试者工作特征,Receiver Operating Characteristic),纵坐标为真正率(True Positive Rate,TPR)表示预测为正样本并且预测正确的概率,TPR越高越好;横坐标为假正率(False Positive Rate,FPR)表示预测为正样本但是预测错了的概率,FPR越低越好。公式为:,其中,P是真实的正样本数,N是真实的负样本数,TP是P个正样本中被分类器预测为正样本的个数,FP是N个负样本中被分类器预测为正样本的个数。
ROC曲线的绘制:
为什么使用AUC进行模型评估?
AUC是否可以直接用作损失函数去优化呢?
可以,在一定条件下,RankBoost算法优化的全局函数就是AUC,可以使用RankBoost算法优化AUC的近似值或对AUC进行局部优化。(paper);xgboost提供了直接优化AUC的功能,目标函数设置为:objective = 'rank:pairwise'
P-R曲线与ROC曲线对比
当正负样本的分布发生变化时,P-R曲线的形状一般会发生比较剧烈的变化,而ROC曲线的形状能够基本保持不变。这使得ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能。
AUC
物理意义为:模型将某个随机正类别样本排列在某个随机负类别样本之上的概率。从所有正样本中随机挑选一个样本,模型将其预测为正样本的概率为P1;从所有负样本中随机挑选一个样本,模型将其预测为正样本的概率为P0。P1>P0的概率就等于AUC
。AUC
反应的是模型对于样本的排序能力(根据样本预测为正类的概率来排序)。如:AUC=0.8
表示:给定一个正样本和一个负样本,在 80%
的情况下,模型对正样本预测为正类的概率大于对负样本预测为正类的概率。(
将正样本排在负样本前面的概率)
AUC
在样本不平衡的条件下依然适用。如:在反欺诈场景下,假设正常用户为正类(设占比 99.9%),欺诈用户为负类(设占比 0.1%)。如果使用准确率评估,则将所有用户预测为正类即可获得 99.9%的准确率。这并不是一个很好的预测结果,因为欺诈用户全部未能找出。使用AUC
评估,则此时FPR=1,TPR=1
,对应的AUC=0.5
。AUC
成功的指出了这并不是一个很好的预测结果。AUC
对于均匀采样不敏感。如:上述反欺诈场景中,假设对正常用户进行均匀的降采样。任意给定一个负样本N1,设模型对其预测为正类的概率为P1。降采样前后,由于是均匀采样,因此预测为正类的概率大于P1和小于P1的真正样本的比例没有发生变化。因此AUC
保持不变。但是如果是非均匀的降采样,则预测为正类的概率大于P1和小于P1的真正样本的比例会发生变化,这也会导致AUC
发生变化。AUC
越高。因为这表明正负样本之间排序的把握越大,区分度越高。如:在电商场景中,点击率模型的AUC
要低于购买转化模型的AUC
。因为点击行为的成本低于购买行为的成本,所以点击率模型中正负样本的差别要小于购买转化模型中正负样本的差别。AUC的计算
余弦相似度
在机器学习中,常使用余弦相似度分析两个特征向量之间的相似性,其取值范围是[−1,1],相同的两个向量之间的相似度为1;1减去余弦相似度可以得到余弦距离,取值范围为[0,2],相同的两个向量余弦距离为0。对于两个向量A和B,其余弦相似度定义为,即两个向量夹角的余弦,关注的是向量之间的角度关系,并不关心它们的绝对大小。
余弦相似度与欧氏距离异同点:
特征向量经过归一化后,欧氏距离与余弦距离有着单调的关系,此时选择距离最小(相似度最大)的近邻,使用余弦相似度和欧氏距离的结果是相同的。即其中|| A−B ||2表示欧氏距离,cos(A,B)表示余弦相似度,(1−cos(A,B))表示余弦距离。
在文本、图像、视频等领域,研究的对象的特征维度往往很高,欧氏距离受维度的影响较大,范围不固定,含义比较模糊,而余弦相似度在高维情况下依然保持“相同时为1,正交时为0,相反时为−1”的性质。当一对文本的长度差距很大、但内容相近时,如果使用词频或词向量作为特征,它们在特征空间中的的欧氏距离通常很大;而如果使用余弦相似度的话,它们之间的夹角可能很小,因而相似度高。
总体来说,欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。例如,统计两部剧的用户观看行为,用户A的观看向量为(0,1),用户B为(1,0);此时二者的余弦距离很大,而欧氏距离很小;我们分析两个用户对于不同视频的偏好,更关注相对差异,显然应当使用余弦距离。而当我们分析用户活跃度,以登陆次数(单位:次)和平均观看时长(单位:分钟)作为特征时,余弦距离会认为(1,10)、(10,100)两个用户距离很近;但显然这两个用户活跃度是有着极大差异的,此时我们更关注数值绝对差异,应当使用欧氏距离。
分类损失函数
损失函数可以让我们对模型进行评估,并且为模型参数的优化提供了方向,但没有任何一种损失函数适用于所有的模型。损失函数的选取依赖于参数的数量、异常值、机器学习算法、梯度下降的效率、导数求取的难易和预测的置信度等若干方面。
1、0-1损失:预测值和目标值不相等为1,否则为0:
缺点:定义过于严格,如果真实值为1,预测值为0.999,预测应该正确,但是上式会判定为预测错误,可以对其改进为感知损失;由于其非凸、非光滑的特点,算法很难直接对该函数进行优化。可以使用其代理损失函数是合页损失或交叉熵损失。
2、感知损失:引入超参数阈值t,感知机中取t=0.5。
3、合页损失(Hinge Loss)
合页损失在SVM中解决几何间隔最大化问题,它是0-1损失函数相对紧的凸上界,且当≥1时,该函数不对其做任何
惩罚。Hinge损失在=1处不可导,因此不能用梯度下降法进行优化,而是用次梯度下降法:
AdaBoost使用指数损失做为损失函数:
5、对数似然损失
对数似然损失是对预测概率的似然估计,其最小化的本质是利用样本中的已知分布,求解导致这种分布的最佳模型参数,使这种分布出现概率最大。它衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。其标准形式为:。
对数似然损失函数在二分类时可以化简为交叉熵损失函数。交叉熵表示两个概率分布之间的距离,交叉熵越大,两个概率分布距离越远,概率分布越相异;交叉熵越小,两个概率分布距离越近,概率分布越相似,通过交叉熵可以判断哪个预测结果与标准答案更接近。
交叉熵损失函数的计算公式为:
对数损失在多分类问题中的计算公式为:
平均绝对误差
平均绝对误差(Mean Absolute Error, MAE),L1范数损失。MAE是目标值与预测值之差绝对值的和再取平均,因为预测误差有正有负,绝对值可以避免正负抵消,不需要考虑误差的方向。其中,N为样本数,为第i条样本的真实值,为第i条样本的预测值。
均方根误差
均方误差(Mean Squared Error, MSE),L2范数损失。MSE是目标值与预测值之差平方和再取平均,能够很好地反映回归模型预测值与真实值的偏离程度。
均方根误差
均方根误差(Root Mean Squared Error, RMSE)是对MSE进行了开根号处理,使loss与标签值在量级上统一。
MAE与MSE不同点:
加权平均绝对误差
加权平均绝对误差(Weighted Mean Absolute Error, WMAE)是基于MAE的变种评估指标,对每条样本考虑不同的权重,比如考虑时间因素,离当前时间越久的样本权重越低。是第i条样本的权重:
平均绝对百分比误差
平均绝对百分比误差(Mean Absolute Percent Error,MAPE)把每个点的误差进行了归一化,通过计算绝对误差百分比来表示预测效果,降低了个别离群点带来的绝对误差的影响。计算与量纲无关,在特定场景下不同问题具有一定可比性,如MAPE = 10,这表示预测平均偏离真实值10%。它定义为:
MAPE的缺点:在真实值0处无定义,如果真实值接近0可能导致MAPE大于100%。而且,MAPE对负值误差的惩罚大于正值误差。基于这些缺点从也有一些改进的一评价指标,如MASE,sMAPE、MDA。
均方根对数误差
均方根对数误差(Root Mean Squared Logarithmic Error, RMSLE )对预测值偏小样本的惩罚比对预测值偏大样本的惩罚大,如二手手机真实售价是2000元,预测成1800元的惩罚会比预测成2200元的大。如果损失函数选用RMSLE,没办法直接优化RMSLE,通常会先对预测目标进行对数变换,使用RMSE作为损失函数,最后预测值再还原,其公式为:
Huber损失——平滑平均绝对误差
L1损失对于异常值更鲁棒,但它的导数不连续,在寻找最优解时收敛较慢;L2损失对于异常值敏感,但在优化过程中更为稳定和准确。Huber Loss 结合了MAE和MSE的优点,使用超参数δ来调节误差的阈值,当预测误差大于阈值时采用线性误差,预测误差小于阈值时采用平方误差,对异常值不敏感且在极值点处连续且可导,是一种鲁棒的回归损失函数。其表达式是一个连续可微的分段函数:
对数双曲余弦Log-Cosh损失函数
对数双曲余弦损失是一种比L2更为平滑的损失函数,它的优点在于对于小的误差log(cosh(x))与(x**2)/2很相近,对于大的误差与abs(x)-log2很相近,在拥有MSE优点的同时也不会受到异常值的太多影响。它拥有Huber的所有优点,并且在每一个点都是二次可导的。
R方损失(R Squared):
分子是模型预测产生的错误,分母是使用预测值为y的均值产生的错误,R2越大犯错误越小。
分位数损失(Quantile Loss):预测取值区间而不是一个具体的取值点时可以用分位数损失。
Huber和Log-cosh损失函数的Python代码:
# huber loss
def huber(true, pred, delta):
loss = np.where(np.abs(true-pred) < delta , 0.5*((true-pred)**2), delta*np.abs(true - pred) - 0.5*(delta**2))
return np.sum(loss)
# log cosh loss
def logcosh(true, pred):
loss = np.log(np.cosh(pred - true))
return np.sum(loss)
参考:
https://blog.csdn.net/google19890102/article/details/50522945
https://www.cnblogs.com/massquantity/p/8964029.html
https://redstonewill.com/1584/
更全的回归指标分析:https://www.jianshu.com/p/9846a55aeef9
https://www.cnblogs.com/massquantity/p/8964029.html
https://blog.csdn.net/qq_14845119/article/details/80787753
本文中所有的代码和图片都可以在这个地方找到!