社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

数据科学 | 算法工程师必备的机器学习--模型评估(下)

运筹OR帷幄 • 4 年前 • 524 次点击  
↑↑↑↑↑点击上方蓝色字关注我们!






『运筹OR帷幄』原创


作者:华校专


作者信息:

华校专,曾任阿里巴巴资深算法工程师、智易科技首席算法研究员,现任腾讯高级研究员,《Python 大战机器学习》的作者。

编者按:

算法工程师必备系列更新啦!继上次推出了算法工程师必备的数学基础后,小编继续整理了必要的机器学习知识,全部以干货的内容呈现,哪里不会学哪里,老板再也不用担心你的基础问题!

七、性能度量

  1. 给定训练集,测试集合

    对于样本 ,假设其真实标记为 ,模型预测输出为

  2. 理论上性能度量都是在测试集上进行。

  • 如果是在训练集上度量,则相应的指标为:训练准确率、训练错误率、训练 auc ...
  • 如果是在验证集上度量,则相应的指标为:验证准确率、验证错误率、验证 auc ...

7.1 分类问题性能度量

7.1.1 准确率、错误率

  1. 测试准确率:测试数据集上的准确率(其中 I 为示性函数):


    准确率衡量的是有多少比例的样本被正确判别。

  2. 测试错误率:测试数据集上的错误率:


    错误率衡量的是有多少比例的样本被判别错误,它也是损失函数为 0-1 损失时的测试误差。

7.1.2 查准率、查全率

  1. 对于二分类问题,通常将关注的类作为正类,其他类作为负类。令:

    分类结果的混淆矩阵(confusion matrix)定义为:


    预测:正类预测:反类
    真实:正类TPFN
    真实:反类FPTN
  • TP:分类器将正类预测为正类的数量(True Positive) 。即:真正类 的数量。
  • FN:分类器将正类预测为负类的数量(False Negative) 。即:假负类 的数量。
  • FP:分类器将负类预测为正类的数量(False Positive)。即:假正类 的数量。
  • TN :分类器将负类预测为负类的数量(True Negative) 。即:真负类 的数量。
  • 查准率(precision):  。

    它刻画了所有预测为正类的结果中,真正的正类的比例。

  • 查全率(recall):  。

    它刻画了真正的正类中,被分类器找出来的比例。

  • 不同的问题中,有的侧重差准率,有的侧重差全率。

    • 对于推荐系统,更侧重于查准率。即推荐的结果中,用户真正感兴趣的比例。因为给用户展示的窗口有限,必须尽可能的给用户展示他真实感兴趣的结果。
    • 对于医学诊断系统,更侧重与查全率。即疾病被发现的比例。因为疾病如果被漏诊,则很可能导致病情恶化。
  • 查准率和查全率是一对矛盾的度量。一般来说查准率高时查全率往往偏低,而查全率高时查准率往往偏低。

    • 如果希望将所有的正例都找出来(查全率高),最简单的就是将所有的样本都视为正类,此时有FN=0。此时查准率就偏低(准确性降低)。
    • 如果希望查准率高,则可以只挑选有把握的正例。最简单的就是挑选最有把握的那一个样本。此时有FP=0。此时查全率就偏低(只挑出了一个正例)。

    7.1.3 P-R 曲线

    1. 对二类分类问题,可以根据分类器的预测结果对样本进行排序:排在最前面的是分类器认为“最可能”是正类的样本,排在最后面的是分类器认为“最不可能”是正类的样本。

      假设排序后的样本集合为 ,预测为正类的概率依次为

      在第 轮,将 作为分类阈值来。即:


      此时计算得到的查准率记做,查全率记做

      以查准率为纵轴、查全率为横轴作图,就得到查准率-查全率曲线,简称 P-R曲线。该曲线由点组成。

    2. P-R曲线从左上角(0,1) 到右下角(1,0)

    • 开始时第一个样本(最可能为正例的)预测为正例,其它样本都预测为负类。此时:

      a. 查准率很高,几乎为1。

      b. 查全率很低,几乎为0,大量的正例没有找到。

    • 结束时所有的样本都预测为正类。此时:

      a. 查全率很高,正例全部找到了,查全率为1。

      b. 查准率很低,大量的负类被预测为正类。

  • P-R曲线直观显示出分类器在样本总体上的查全率、查准率。因此可以通过两个分类器在同一个测试集上的P-R 曲线来比较它们的预测能力:

    • 如果分类器BP-R曲线被分类器A的曲线完全包住,则可断言:A的性能好于B

    • 如果分类器AP-R曲线与分类器B的曲线发生了交叉,则难以一般性的断言两者的优劣,只能在具体的查准率和查全率下进行比较。

      a. 此时一个合理的判定依据是比较P-R曲线下面积大小,但这个值通常不容易计算。

      b. 可以考察平衡点。平衡点Break-Even Point:BEPP-R曲线上查准率等于查全率的点,可以判定:平衡点较远的P-R曲线较好。

    7.1.4 ROC曲线

    1. 定义真正例率(True Positive Rate) 为:

      它刻画了真正的正类中,模型预测为正类的概率。它也就等于正类的查全率。

    2. 定义假正例率(False Positive Rate) 为:

      它刻画了真正的负类中,模型预测为正类的概率。它就等于 1 减去负类的查全率。

    3. 对二类分类问题,可以根据分类器的预测结果对样本进行排序:排在最前面的是分类器认为“最可能”是正类的样本,排在最后面的是分类器认为“最不可能”是正类的样本。

      假设排序后的样本集合为 ,预测为正类的概率依次为

      在第 轮,将 作为分类阈值来。即:


      此时计算得到的真正例率记做,假正例率记做

      以真正例率为纵轴、假正例率为横轴作图,就得到ROC曲线。该曲线由点 组成。

    4. ROC曲线从左下角(0,0) 到右上角(1,1)

    • 开始时第一个样本(最可能为正例的)预测为正例,其它样本都预测为负类。此时:

      a. 真正例率很低,几乎为0,因为大量的正例未预测到。

      b. 假正例率很低,几乎为0,因为此时预测为正类的样本很少,所以几乎没有错认的正例。

    • 结束时所有的样本都预测为正类。此时:

      a. 真正例率很高,几乎为1,因为所有样本都预测为正类。

      b. 假正例率很高,几乎为1,因为所有的负样本都被错认为正类。

  • ROC曲线中:

    • 对角线对应于随机猜想模型。
    • (0,1)对应于理想模型:没有预测错误,FPR 恒等于0,TPR恒等于1。
    • 通常ROC曲线越靠近点(0,1)越好。
  • 可以通过两个分类器在同一个测试集上的ROC 曲线来比较它们的预测能力:

    • 如果分类器AROC曲线被分类器B的曲线完全包住,则可断言:B的性能好于A

    • 如果分类器AROC曲线与分类器B的曲线发生了交叉,则难以一般性的断言两者的优劣。

      此时一个合理的判定依据是比较ROC曲线下面积大小,这个面积称作AUC:Area Under ROC Curve

  • P-R曲线和ROC曲线刻画的都是阈值的选择对于分类度量指标的影响。

    通常一个分类器对样本预测的结果是一个概率结果,比如正类概率 0.7。但是样本是不是正类还需要与阈值比较。

    这个阈值会影响了分类器的分类结果,比如:是阈值 0.5 还是阈值 0.9。

    • 如果更重视查准率,则将阈值提升,比如为 0.9 。
    • 如果更看重查全率,则将阈值下降,比如为 0.5 。
  • P-R曲线和ROC曲线上的每一个点都对应了一个阈值的选择,该点就是在该阈值下的(查准率,查全率) /(真正例率,假正例率)

    沿着横轴的方向对应着阈值的下降。

  • AUCROC 曲线的面积,其物理意义为:从所有正样本中随机挑选一个样本,模型将其预测为正样本的概率为 p_1 ;从所有负样本中随机挑选一个样本,模型将其预测为正样本的概率为 p_0 。 的概率就等于 AUC

    • 如果对完全随机的对样本进行分类,则 的概率为0.5,因此AUC=0.5

    • AUC 在样本不平衡的条件下依然适用。如:在反欺诈场景下,假设正常用户为正类(设占比 99.9%),欺诈用户为负类(设占比 0.1%)。

      如果使用准确率评估,则将所有用户预测为正类即可获得 99.9%的准确率。很明显这并不是一个很好的预测结果,因为欺诈用户全部未能找出。

      如果使用AUC 评估,则此时FPR=1,TPR=1,对应的 AUC=0.5 。因此AUC 成功的指出了这并不是一个很好的预测结果。

    • AUC 反应的是模型对于样本的排序能力(根据样本预测为正类的概率来排序)。如:AUC=0.8 表示:给定一个正样本和一个负样本,在 80% 的情况下,模型对正样本预测为正类的概率大于对负样本预测为正类的概率。

    • AUC 对于均匀采样不敏感。如:上述反欺诈场景中,假设对正常用户进行均匀的降采样。任意给定一个负样本

      设模型对其预测为正类的概率为 。降采样前后,由于是均匀采样,因此预测为正类的概率大于 和小于 的真正样本的比例没有发生变化。因此AUC 保持不变。

      但是如果是非均匀的降采样,则预测为正类的概率大于 和小于 的真正样本的比例会发生变化,这也会导致AUC 发生变化。

    • 正负样本之间的预测为正类概率之间的差距越大,则AUC 越高。因为这表明正负样本之间排序的把握越大,区分度越高。

      如:在电商场景中,点击率模型的AUC 要低于购买转化模型的AUC 。因为点击行为的成本低于购买行为的成本,所以点击率模型中正负样本的差别要小于购买转化模型中正负样本的差别。

    7.1.5 F1 值

    1. F_1 为查准率与查全率的调和均值:
    2. F_1 更一般的形式: , 其中 度量了查全率对查准率的相对重要性。

    7.1.6 代价矩阵

    1. 实际应用过程中,不同类型的错误所造成的后果可能有所不同。如:将健康人诊断为患者,与将患者诊断为健康人,其代价就不同。

      为权衡不同类型错误所造成的不同损失,可以为错误赋予非均等代价(unequal cost)。

      对于二类分类问题,可以设定一个“代价矩阵”(cost matrix),其中 表示将第 i 类样本预测为第 j 类样本的代价。通常表示预测正确时的代价为0 。


      预测:第0类预测:第1类
      真实:第0类0cost01
      真实:第1类cost10
      0

      前面讨论的性能度量都隐式的假设均等代价,即

    2. 在非均等代价下,希望找到的不再是简单地最小化错误率的模型,而是希望找到最小化总体代价total cost的模型。

    3. 在非均等代价下,ROC曲线不能直接反映出分类器的期望总体代价,此时需要使用代价曲线cost curve

    • 代价曲线的横轴就是正例概率代价。

      其中 p 为正例(第0类)的概率。

    • 代价曲线的纵轴为:

      其中:

      FPR为假正例率

      它刻画了模型将真实的负样本预测为正类的概率。

      FNR为假负例率

      它刻画了模型将真实的正样本预测为负类的概率。

    7.1.7 宏查准率/查全率、微查准率/查全率

    1. 有时候可能得到了多个二分类混淆矩阵。如:在多个数据集上进行训练/测试。

      此时希望在多个二分类混淆矩阵上综合考察查准率和查全率。

    2. 假设有 m 个二分类混淆矩阵,有两种方法来综合考察:

    • 宏查准率、宏查全率:先在各个混淆矩阵上分别计算查准率和查全率,记作 ;然后计算平均值。

      这样得到的是宏查准率(macro-P),宏查全率(macro-F),宏F1(macro-F1) :


    • 微查准率、微查全率:先将个混淆矩阵对应元素进行平均,得到 TP,FP,TN,FN 的平均值,记作;再基于这些平均值计算微查准率(`micro-P`),微查全率(`micro-F`),微`F1`(`micro-F1`):


    7.2 回归问题性能度量

    1. 均方误差mean square error:MSE


    2. 均方根误差root mean squared error:RMSE


    3. 均方根对数误差root mean squared logarithmic error:RMSLE


      为使得log 有意义,也可以使用:


      优势:

    • 当真实值的分布范围比较广时(如:年收入可以从 0 到非常大的数),如果使用MAE、MSE、RMSE 等误差,这将使得模型更关注于那些真实标签值较大的样本。

      RMSLE 关注的是预测误差的比例,使得真实标签值较小的样本也同等重要。

    • 当数据中存在标签较大的异常值时,RMSLE 能够降低这些异常值的影响。

  • 平均绝对误差mean absolute error:MAE


  • 八、超参数调节

    1. 大多数学习算法都有些超参数需要设定。超参数配置不同,学得的模型性能往往有显著差别,这就是参数调节(parameter tuning):对每种超参数配置都训练出模型,然后把对应最好模型的超参数作为结果。

    2. 由于很多超参数是在实数范围内取值,因此现实中常用做法是对每个超参数选定一个范围和变化步长。如在[0,1)范围内以 0.2为步长。

      这样选出的超参数可能不是最佳的,但是这是在计算开销和性能之间取折中的结果。

    3. 当模型选择完成后,学习算法和超参数配置已经选定,此时应该用数据集重新训练模型。

      这个模型在训练过程中使用了 个样本,这才是最终提交的模型。

    8.1 搜索策略

    1. 超参数搜索有三种常见的策略:

    • 手动搜索:手动选择超参数。
    • 网格搜索:当超参数的数据相对较少时,这个方法很实用。
    • 随机搜索:通常推荐这种方式。

    8.1.1 手动搜索

    1. 手动选择超参数需要了解超参数做了些什么,以及机器学习模型如何才能取得良好的泛化。

    2. 手动搜索超参数的任务是:在给定运行时间和内存预算范围的条件下,最小化泛化误差。

    3. 手动调整超参数时不要忘记最终目标:提升测试集性能。

    • 加入正则化只是实现这个目标的一种方法。

    • 如果训练误差很低,也可以通过收集更多的训练数据来减少泛化误差。

      如果训练误差太大,则收集更多的训练数据就没有意义。

    • 实践中的一种暴力方法是:不断提高模型容量和训练集的大小。

      这种方法增加了计算代价,只有在拥有充足的计算资源时才可行

    8.1.2 网格搜索

    1. 网格搜索的做法是:

    • 对于每个超参数,选择一个较小的有限值集合去搜索。
    • 然后这些超参数笛卡尔乘积得到多组超参数。
    • 网格搜索使用每一组超参数训练模型,挑选验证集误差最小的超参数作为最好的超参数。
  • 如何确定搜索集合的范围?

    • 如果超参数是数值,则搜索集合的最小、最大元素可以基于先前相似实验的经验保守地挑选出来。
    • 如果超参数是离散的,则直接使用离散值。
  • 通常重复进行网格搜索时,效果会更好。假设在集合 {-1,0,1}上网格搜索超参数

    • 如果找到的最佳值是 1,那么说明低估了 的取值范围。此时重新在 {1,2,3} 上搜索。
    • 如果找到的最佳值是 0,那么可以细化搜索范围以改进估计。此时重新在 {-0.1,0,0.1} 上搜索。
  • 网格搜索的一个明显问题时:计算代价随着超参数数量呈指数级增长。

    如果有 m 个超参数,每个最多取 n 个值,那么所需的试验数将是 O(n^m) 。虽然可以并行试验,但是指数级增长的计算代价仍然不可行。

  • 8.1.3 随机搜索

    1. 随机搜索是一种可以替代网格搜索的方法,它编程简单、使用方便、能更快收敛到超参数的良好取值。

    • 首先为每个超参数定义一个边缘分布,如伯努利分布(对应着二元超参数)或者对数尺度上的均匀分布(对应着正实值超参数)。
    • 然后假设超参数之间相互独立,从各分布中抽样出一组超参数。
    • 使用这组超参数训练模型。
    • 经过多次抽样 -> 训练过程,挑选验证集误差最小的超参数作为最好的超参数。
  • 随机搜索的优点:

    • 不需要离散化超参数的值,也不需要限定超参数的取值范围。这允许我们在一个更大的集合上进行搜索。
    • 当某些超参数对于性能没有显著影响时,随机搜索相比于网格搜索指数级地高效,它能更快的减小验证集误差。
  • 与网格搜索一样,通常会基于前一次运行结果来重复运行下一个版本的随机搜索。

  • 随机搜索比网格搜索更快的找到良好超参数的原因是:没有浪费的实验。

    • 在网格搜索中,两次实验之间只会改变一个超参数 (假设为 )的值,而其他超参数的值保持不变。

      如果这个超参数 的值对于验证集误差没有明显区别,那么网格搜索相当于进行了两个重复的实验。

    • 在随机搜索中,两次实验之间,所有的超参数值都不会相等,因为每个超参数的值都是从它们的分布函数中随机采样而来。因此不大可能会出现两个重复的实验。

    • 如果 超参数与泛化误差无关,那么不同的 值:

      a. 在网格搜索中,不同值、相同的其他超参数值,会导致大量的重复实验。

      b. 在随机搜索中,其他超参数值每次也都不同,因此不大可能出现两个重复的实验(除非所有的超参数都与泛化误差无关)。

    8.2 调整原则

    1. 通常先对超参数进行粗调,然后在粗调中表现良好的超参数区域进行精调。

    2. 超参数随机搜索,并不意味着是在有效范围内随机均匀取值。需要选择合适的缩放来进行随机选取。

    • 对于学习率,假设其取值范围为0.000001~1

      如果进行均匀取值,取10个,那么有 90% 的随机值都位于区间 [0.1,1]。则[0.000001,0.1] 之间没有足够的探索。这种做法明显不合理。

      此时需要使用对数缩放,在对数轴上均匀随机取点。

    • 对于指数加权移动平均的超参数 。假设其取值范围为 0.9~0.9999

      由于 刻画了结果使用过去多少个周期的数据来加权平均。因此如果进行均匀取值,则:

      a.0.9~0.9005 之间取值时, 变化不大。

      b.0.9990~0.9995 之间取值时, 变化非常大。

      越接近 1, 对于它的变化越敏感。此时,需要对使用对数缩放,在对数轴上均匀随机取点。

    • 如果选择了错误的缩放,如果取值的总量足够大,也可以得到不错的结果。

      尤其当配合了粗调 \-> 精调 策略时,最终还是会聚焦到合适的超参数范围上。

  • 通常情况下,建议至少每隔几个月重新评估或者修改超参数。因为随着时间的变化,真实场景的数据会逐渐发生改变:

    由于这些变化,原来设定的超参数可能不再适用。

    • 可能是由于用户的行为、偏好发生了改变。
    • 可能是采样的方式发生了改变。
    • 也可能仅仅是由于数据中心更新了服务器。
  • 有两种超参数调整策略:

    • 如果数据足够大且没有足够的计算资源,此时只能一次完成一个试验。

      则可以每天观察模型的表现,实时的、动态的调整超参数。

    • 如果数据不大,有足够的计算资源可以同一时间完成大量的试验,则可以设置多组超参数设定,然后选择其中表现最好的那个。

    九、传统机器学习的挑战

    1. 传统机器学习算法的两个困难:

    • 维数灾难:当数据的维数很高时,很多机器学习问题变得相当困难。因为许多传统机器学习算法简单地假设:一个新样本的输出应该大致与最接近的训练样本的输出相同

    • 选择性偏好:某些算法偏好于选择某类函数。

      最广泛的隐式偏好是:要学习的函数是平滑的或者局部不变性的。

      这个先验知识表明:要学习的函数不会在一个小区域内发生较大的变化。很多简单算法完全依赖此先验知识来达到良好的泛化。

    本文福利

    可以在 公众号后台 回复关键词:“ DS 获取大量由我平台编辑精心整理的学习资料,如果觉得有用, 请勿吝啬你的留言和赞哦!


    —— 完 ——




    文章须知

    文章作者:华校专 

    责任编辑:周岩 Logic 征帆

    审核编辑:阿春

    微信编辑:Logic

    本文由『运筹OR帷幄』原创发布

    如需转载请在公众号后台获取转载须知


    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/113693
     
    524 次点击