参考《百面机器学习》
在机器学习中,准确率(Accuracy)是一个比较常见的模型评估指标,通过准确率,我们可以大致判断模型的性能如何,但是,准确率确有一定的局限性。试想有100个样本,其中有90个都是正样本,只有10个是负样本,然后有一个分类器将所有的结果都预测成了正类,那么,我们得到的准确率便是90%,可是对于负样本来说,预测正确的个数却是0个。那么这个分类器的性能算好吗?当然不算。即便是具有90%的正确率,但是在样本集中数据的分布是严重不均衡的(实际项目中绝大多数情况的数据都是不均衡的),因此虽然负样本全部被预测错了也具有90%的正确率。因此,准确率的局限性在于数据集样本的分布是否均匀。
准确率公式为:
精确率和召回率分别是模型性能的另外两种指标,精确率(precision)是指将正样本成功预测为正例的个数占所有预测为正例的样本个数的比例,召回率(recall)是指将正样本成功预测为正例的个数占所有真正的正样本个数的比例。精确率和召回率的公式如下:
TP是指正确将样本预测为正例的个数(事实上是正例),TN是指正确将样本预测为负例的个数(事实上是负例),FP是指错误将样本预测为正例的个数(事实上是负例),FN是指错误将样本预测为负例的个数(事实上是正例)。
精确率和召回率这一对指标通常是联合使用的,有趣的是,精确率和召回率是一对既矛盾又统一的指标。为了提高精确率,分类器需要在“更有把握”时才会把样本预测为正样本,但此时会因为分类器过于“保守谨慎“而将需要正例预测为负例,导致召回率降低。(通俗来讲就是宁可错杀1000不肯放过一个,置信度非常高的样本我才预测为正例,有一点瑕疵,分类器就将他预测为负例)
即便是精确率非常高,也可能会导致召回率非常低,因此精确率和召回率在一定程度上是互相矛盾的。因此,在评估一个模型时,我们需要同时考察精确率和召回率。最直观的方式是通过精确率和召回率绘制P-R曲线,如下图:
在图中的每个点都是通过不同的阈值对分类器预测出来的样本得分值计算pricision和recall得到的。当阈值很大时,只有少数得分值较高的样本被预测为正例,其他全被判别为负例,此时的阈值过于保守,因此精确率非常高,但是召回率几乎接近于0.。随着阈值的降低,越来越多负例”逆袭“为正例,但是这会影响对正例的误判,因此准确率下降而召回率升高。
在图中,当召回率较低时,A的精确率不如B;但是当召回率接近于1的时候,A的精确率反而要高于B。通过这一点足以证明一件事,单单只通过一个点是无法更好的衡量模型的性能的, 只有绘制出P-R曲线才能否更直观的对模型进行全面评估。
除此之外,F1-score也是一个可以综合评估模型性能的指标,它是通过精确率和召回率的调和平均得到的,它被定义为:
最小均方根误差(RMSE)通常用来评估回归模型预测值与真实值得偏离程度,RMSE越小,则模型拟合的效果越好。但是,对于有些情况而言,即便是模型性能较好也会导致RMSE居高不下,这是因为在数据中存在一些噪音离群点,这些噪音离群点虽然少,但是对RMSE得影响却非常大,这是RMSE居高不下得一个重要原因。那么,如何解决这个问题呢?
第一,我们可以对拿到的数据进行过滤操作,即去噪或者说是排除离群点。
第二,提高模型的性能,将离群点产生得机制考虑进去。
第三,寻找一个更合适得指标来评估模型,比如平均绝对百分比误差(MAPE),它被定义为:
相比RMSE,MAPE把每个点的误差进行了归一化处理,降低了个别离群点带来的误差影响。
ROC得历史我这里就不详细说明了,ROC曲线与P-R曲线都是用来评估模型性能的一种评价指标。对于ROC曲线,其纵坐标为真阳性率(TPR),横坐标为假阳性率(FPR),TPR和FPR得计算方法如下:
在机器学习中,还有一种更加直观得ROC曲线绘制方法,假设正样本数量为P,负样本数量为N;接下来,把横轴的刻度间隔设置为1/N,纵轴的刻度间隔设置为1/P;再根据模型输出的预测概率对样本进行排序(从高到低);依次遍历样本,同时从零点开始绘制ROC曲线,每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,直到遍历完所有样本,曲线最终停在(1,1)这个点,整个ROC曲线绘制完成。
在ROC曲线中,通常通过计算ROC曲线的AUC(ROC曲线得积分)值来衡量模型的性能。通常来说,AUC的值在0.5~1之间(如果不在这个区间,那可能你的模型出现问题了)AUC的值越大,说明分类效果越好。
相比P-R曲线,ROC曲线有一个很重要的特征。在数据样本分布发生变化时,P-R曲线的变化十分剧烈,而ROC曲线却几乎没有太大的变化,如下图。ROC曲线的这一点特征在许多场景下是非常有用的。但是如果你想评估不同模型在特定数据集上的表现,P-R曲线则能更加直观的反应模型的性能。
这个知识点我们在高中就已经学过了,没错,其实就是向量的内积夹角:
相比欧氏距离来说,余弦距离更加关注的两个向量之间的方向是否一致,而不关注其模长引起的差距。在某些场景下,比如NLP,余弦距离要比欧氏距离具有更好的性能,比如说一篇长文章和一篇短文章描述的是一个含义,但是由于篇幅长度不同,欧氏距离相差甚大,而采用余弦距离则可以判别这两篇文章的语义是否接近。
在一些场景,例如Word2Vec中,其向量的模长是经过归一化的,此时欧氏距
离与余弦距离有着单调的关系,即
其中|| A−B || 2 表示欧氏距离,cos(A,B)表示余弦相似度,(1−cos(A,B))表示余弦距
离。在一些情况下余弦距离显然就不如欧氏距离,比如有两个二维向量(1,10)和(10,100),很明显这两个向量具备线性关系,因此余弦距离为0,但事实上这两个向量相差十分巨大,这时,欧氏距离就可以更好的反应向量间的距离了。
对于距离的定义,需要满足三个性质:正定性,对称性和满足三角不等式。
正定性:
因此余弦距离满足正定性。
三角不等式:
该性质并不成立,下面给出一个反例。给定A=(1,0),B=(1,1),C=(0,1),则有:
因此,余弦距离并不是严格定义的距离。此外,在机器学习中,KL距离(在信息论中又叫相对熵)也不是一个严格定义的距离,其表达式为:
为什么需要A/B测试?
如何做A/B测试?
将被测用户随机分为两个桶,其中一个桶使用新开发且想测试的模型,而另外一个桶使用旧模型。
Holdout检验是最简单最直接的方法,通过将数据样本集按一定比例划分为训练集和验证集(比如0.7和0.3),但是这种方法会由随机性引起计算出的评价指标不够前面,也就是说模型的评估指标与训练集和验证集的原始分组有关。
交叉验证是一个比较常用的验证方法,它将样本分为K个大小相等的样本子集,一次遍历每个子集,把每次当前的子集当作验证集,其余的全部作为测试集。
无论是Holdout还是交叉验证,都是基于划分训练集和测试集的方法进行的评估。然而,当训练集较小时,将样本进行划分后会让训练集进一步的减小,从而增加了过拟合风险。自助法是基于自助采样法的检验方法。对于总数为n的样本集合,进行n次有放回的随机抽样,得到大小为n的训练集。n次采样过程中,有的样本会被重复采样,有的样本没有被抽出过,将这些没有被抽出的样本作为验证集,进行模型验证,这就是自助法的验证过程。
网格搜索是通过给定一个参数调优的取值或区间,在这个参数的范围内依次训练模型并观察评估结果。如果给定一个较大的参数范围和较小的步长,往往会找到损失函数的全局最优解,但是这将会消耗大量的计算开销。为了减小计算开销,可以先设置较大的步长,通过网格搜索找到损失函数最优解的大致范围,然后缩小步长进行精确的参数搜索。
随机搜索是在给定参数区间内进行搜索,与网格搜索类似,只不过速度比网格搜索要快,如果参数样本量足够大,也可以找到损失函数最优解的位置。
贝叶斯优化算法在寻找最优最值参数时,采用了与网格搜索、随机搜索完全不同的方法。网格搜索和随机搜索在测试一个新点时,会忽略前一个点的信息;而贝叶斯优化算法则充分利用了之前的信息。贝叶斯优化算法通过对目标函数形状进行学习,找到使目标函数向全局最优值提升的参数。具体来说,它学习目标函数形状的方法是,首先根据先验分布,假设一个搜集函数;然后,每一次使用新的采样点来测试目标函数时,利用这个信息来更新目标函数的先验分布;最后,算法测试由后验分布给出的全局最值最可能出现的位置的点。对于贝叶斯优化算法,有一个需要注意的地方,一旦找到了一个局部最优值,它会在该区域不断采样,所以很容易陷入局部最优值。为了弥补这个缺陷,贝叶斯优化算法会在探索和利用之间找到一个平衡点,“探索”就是在还未取样的区域获取采样点;而“利用”则是根据后验分布在最可能出现全局最值的区域进行采样。
过拟合是指模型的学习能力太强,将所有点(其中包括噪声点和离群点)全部拟合起来,导致模型的泛化能力下降。判断过拟合最明显的标志是训练集效果很好,而验证集的效果很差。
欠拟合是指模型的学习能力较弱,并没有学到数据之间的太多规律,导致模型失效,欠拟合最明显的标志是训练集和验证机的效果都很差。
如何解决过拟合和欠拟合?
解决过拟合的方法如下:
解决欠拟合方法:
好啦,今天先到这里啦。GOODBYE!