机器学习——模型评估

  “没有测量,就没有科学。”这是科学家门捷列夫的名言。在计算机科学特别是机器学习领域中,对模型的评估同样至关重要。只有选择与问题相匹配的评估方法,才能快速地发现模型选择或训练过程中出现的问题,迭代地对模型进行优化。模型评估主要分为离线评估在线评估两个阶段。针对分类、排序、回归、 序列预测等不同类型的机器学习问题,评估指标的选择也有所不同。知道每种评 估指标的精确定义、有针对性地选择合适的评估指标、根据评估指标的反馈进行 模型调整,这些都是机器学习在模型评估阶段的关键问题,也是一名合格的算法工程师应当具备的基本功。

  在模型评估过程中,分类问题、排序问题、回归问题往往需要使用不同的指 标进行评估。在诸多的评估指标中,大部分指标只能片面地反映模型的一部分性 能。如果不能合理地运用评估指标,不仅不能发现模型本身的问题,而且会得出 错误的结论。下面以Hulu的业务为背景,假想几个模型评估场景,看看大家能否 触类旁通,发现模型评估指标的局限性。

1 模型评估指标

1.1 准确率

  Hulu的奢侈品广告主们希望把广告定向投放给奢侈品用户。Hulu通过第三方 的数据管理平台(Data Management Platform,DMP)拿到了一部分奢侈品用户的 数据,并以此为训练集和测试集,训练和测试奢侈品用户的分类模型。该模型的 分类准确率超过了95%,但在实际广告投放过程中,该模型还是把大部分广告投给 了非奢侈品用户,这可能是什么原因造成的?在解答该问题之前,我们先回顾一下分类准确率的定义。
  准确率是指分类正确的样本占总样个数的比例:
    $Accuracy = frac{n_{correct}}{n_{total}}$
  其中 $n_{correct }$为被正确分类的样本个数, $n_{total } $ 为总样本的个数。
  准确率的局限性:准确率是分类问题中最简单也是最直观的评价指标,但存在明显的缺陷,当不同总类的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。比如:当负样本占99%,分类器把所有样本都预测为负样本也可以得到99%的准确率,换句话说总体准确率高,并不代表类别比例小的准确率高
  明确了这一点,这个问题也就迎刃而解了。显然,奢侈品用户只占Hulu全体 用户的一小部分,虽然模型的整体分类准确率高,但是不代表对奢侈品用户的分 类准确率也很高。在线上投放过程中,我们只会对模型判定的“奢侈品用户”进行 投放,因此,对“奢侈品用户”判定的准确率不够高的问题就被放大了。为了解决这个问题,可以使用更为有效的平均准确率(每个类别下的样本准确率的算术平 均)作为模型评估的指标。

1.2 精确率和召回率

  精确率是指正确分类的正样本个数占分类器判定为正样本的样本个数的比例。
  召回率是指正确分类的正样本个数占真正的正样本数的比例。
  精确率是针对预测结果而言,它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP),也就是
    $P=frac{TP}{TP+FP} $
  而召回率是针对我们原来的样本而言的,表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。
    $R=frac{T P}{T P+F N}$
  其实就是分母不同,一个分母是预测为正的样本数,另一个是原来样本中所有的正样本数。

  •  举个栗子
  • 假设我们手上有60个正样本,40个负样本,我们要找出所有的正样本,系统查找出50个,其中只有40个是真正的正样本,计算上述各指标。
  •  TP: 将正类预测为正类数 40
  •  FN: 将正类预测为负类数 20
  •  FP: 将负类预测为正类数 10
  •  TN: 将负类预测为负类数 30
  •  准确率(accuracy) = 预测对的/所有 = (TP+TN)/(TP+FN+FP+TN) = 70%
  •  精确率(precision) = TP/(TP+FP) = 80%
  •  召回率(recall) = TP/(TP+FN) = 2/3

  在信息检索领域,精确率和召回率又被称为查准率查全率
  查准率=检索出的相关信息量 / 检索出的信息总量
  查全率=检索出的相关信息量 / 系统中的相关信息总量
  Precison 值和 Recall 值是既矛盾又统一的两个指标,为了提高 Precison 值,分类器需要尽量在‘更有把握’时才把样本预测为正样本,但此时往往会因为过于保守而漏掉很多‘没有把握’的正样本,导致Recall值降低 。
  在排序问题中,通常没有一个确定的阈值把得到的结果直接判定为正样本或负样本,而是采用 Top N 返回结果的 Precision 值和 Recall 值来衡量排序模型的性能,即认为模型返回的 Top N 的结果就是模型判定的正样本,然后计算 N 个位置上的 Precision 和前 N 个位置上的 Recall 。

1.3 P-R曲线

  P-R曲线的横轴是召回率,纵轴是精确率。对于一个排序模型来说,其P-R曲 线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本, 小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R 曲线是通过将阈值从高到低移动而生成的。图2.1是P-R曲线样例图,其中实线代表 模型A的P-R曲线,虚线代表模型B的P-R曲线。原点附近代表当阈值最大时模型的 精确率和召回率。

  
              图2.1 P-R曲线样例图

  由图可见,当召回率接近于0时,模型A的精确率为0.9,模型B的精确率是1, 这说明模型B得分前几位的样本全部是真正的正样本,而模型A即使得分最高的几 个样本也存在预测错误的情况。并且,随着召回率的增加,精确率整体呈下降趋 势。但是,当召回率为1时,模型A的精确率反而超过了模型B。这充分说明,只用 某个点对应的精确率和召回率是不能全面地衡量模型的性能,只有通过P-R曲线的 整体表现,才能够对模型进行更为全面的评估。

1.4 F1分数

  F1分数是精度和召回率的谐波平均值,正常的平均值平等对待所有的值,而谐波平均值回给予较低的值更高的权重,因此,只有当召回率和精度都很高时,分类器才能得到较高的F1分数
    $F_1 = frac{1}{frac{1}{精度}+frac{1}{召回率}}$
  F1分数对那些具有相近的精度和召回率的分类器更为有利。但这并不一定能符合你的期望,在某些情况下,你更关心的是精度,而另一些情况下,你可能真正关心的是召回率。精确率与召回率的权衡将是很值得思考的问题。

1.5 均方误差、根均方误差、绝对百分比误差

  均方误差:
    $MSE =frac{1}{n}sum_{i=1}^n(y_{pred} - y_i)^2$
  根均方误差:
    $RMES = sqrt{MSE}$
  均方误差和根均方误差都会受到异常值的影响,而影响最终的模型评估
  平均绝对百分比误差:
    $MAPE = sum_{i=1}^n|frac{(y_{pred}-y_i)}{y_i}|*frac{100}{n}$
  平均绝对百分比误差提高了异常值的鲁棒性,相当于把每个点的误差进行了归一化处理,降低了个别离群带来的绝对误差的影响

1.6 ROC曲线

1.6.1 什么是ROC曲线?

  二值分类器是机器学习领域中最常见也是应用最广泛的分类器。评价二值分类器的指标很多,比如precision,recall,F1 score,P-R曲线等,但发现这些指标或多或少只能反映模型在某一方面的性能,相比而言,ROC曲线则有很多优点,经常作为评估二值分类器最重要的指标之一
  ROC曲线是Receiver Operating Characteristic Curve的简称,中文名为'受试者工作特征曲线'
  ROC曲线的横坐标假阳性率(FPR),纵坐标真阳性率(TPR),FPR和TPR的计算方法分别为:
    $FPR = frac{FP}{N}$
    $TPR = frac{TP}{P}$
  上式中,P是真实的正样本的数量N是真实的负样本的数量TP是P个正样本中 被分类器预测为正样本的个数FP是N个负样本中被分类器预测为正样本的个 数
  只看定义确实有点绕,为了更直观地说明这个问题,我们举一个医院诊断病 人的例子。假设有10位疑似癌症患者,其中有3位很不幸确实患了癌症(P=3), 另外7位不是癌症患者(N=7)。医院对这10位疑似患者做了诊断,诊断出3位癌症 患者,其中有2位确实是真正的患者(TP=2)。那么真阳性率TPR=TP/P=2/3。对 于7位非癌症患者来说,有一位很不幸被误诊为癌症患者(FP=1),那么假阳性率 FPR=FP/N=1/7。对于“该医院”这个分类器来说,这组分类结果就对应ROC曲线上 的一个点(1/7,2/3)。

1.6.2 ROC曲线绘制

  事实上,ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的,通过下面的例子进一步来解释“截断点”的概念。
  在二值分类问题中,模型的输出一般都是预测样本为正例的概率。假设测试集中有20个样本,表2.1是模型的输出结果。样本按照预测概率从高到低排序。在输出最终的正例、负例之前,我们需要指定一个阈值,预测概率大于该阈值的样 本会被判为正例,小于该阈值的样本则会被判为负例。比如,指定阈值为0.9,那 么只有第一个样本会被预测为正例,其他全部都是负例。上面所说的“截断点”指 的就是区分正负预测结果的阈值。
  
      表2.1 二值分类模型的输出结果样例

  就本例来说,当截断点选择为正无穷时,模型把全部样本预测为负例,那 么 FP 和 TP 必然都为 0,FPR 和 TPR 也都为 0,因此曲线的第一个点的坐标就是 (0,0)。当把截断点调整为 0.9 时,模型预测 1 号样本为正样本,并且该样本确实 是正样本,因此,TP=1,20个样本中,所有正例数量为P=10, 故 TPR=TP/P=1/10 ;这里没有预测错的正样本,即FP=0,负样本总数 N=10, 故 FPR=FP/N=0/10=0,对应 ROC 曲线上的点(0,0.1)。依次调整截断点,直到画出全部的关键点,再连接关键点即得到最终的 ROC 曲线,如图2.2所示。
  

              图2.2 ROC曲线

#创建数据集
import pandas as pd
column_name = ['真实标签','模型输出概率']
datasets = [['p',0.9],['p',0.8],['n',0.7],['p',0.6],
           ['p',0.55],['p',0.54],['n',0.53],['n',0.52],
           ['p',0.51],['n',0.505],['p',0.4],['p',0.39],
           ['p',0.38],['n',0.37],['n',0.36],['n',0.35],
           ['p',0.34],['n',0.33],['p',0.30],['n',0.1]]
data = pd.DataFrame(datasets,index = [i for i in range(1,21,1)],columns=column_name)
print(data)
#绘制ROC曲线
# 计算各种概率情况下对应的(假阳率,真阳率)
points = {0.1:[1,1],0.3:[0.9,1],0.33:[0.9,0.9],0.34:[0.8,0.9],0.35:[0.8,0.8],
        0.36:[0.7,0.8],0.37:[0.6,0.8],0.38:[0.5,0.8],0.39:[0.5,0.7],0.40:[0.4,0.7],
        0.505:[0.4,0.6],0.51:[0.3,0.6],0.52:[0.3,0.5],0.53:[0.2,0.5],0.54:[0.1,0.5],
        0.55:[0.1,0.4],0.6:[0.1,0.3],0.7:[0.1,0.2],0.8:[0,0.2],0.9:[0,0.1]}
X = []
Y = []
for value in points.values():
        X.append(value[0])
        Y.append(value[1])
import matplotlib.pyplot as plt
plt.scatter(X,Y,c = 'r',marker = 'o')
plt.plot(X,Y)
plt.xlim(0,1)
plt.ylim(0,1)
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()
代码

  其实,还有一种更直观地绘制ROC曲线的方法。首先,根据样本标签统计出正负样本的数量,假设正样本数量为P,负样本数量为N;接下来,把横轴的刻度间隔设置为1/N,纵轴的刻度间隔设置为1/P;再根据模型输出的预测概率对样本进行排序(从高到低);依次遍历样本,同时从零点开始绘制ROC曲线,每遇到一 个正样本就沿纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,直到遍历完所有样本,曲线最终停在(1,1)这个 点,整个ROC曲线绘制完成。

1.6.3 AUC

  AUC指的是ROC曲线下的面积大小,该值能够量化地反映基于ROC曲线衡量出的模型性能。计算AUC值只需要沿着ROC横轴做积分就可以了。 由于ROC曲线一般都处于 $y=x$ 这条直线的上方(如果不是的话,只要把模型预测的概率反转成 $1−p$ 就可以得到一个更好的分类器),所以AUC的取值一般在 0.5~1 之间。AUC越大,说明分类器越可能把真正的正样本排在前面,分类性能越好。

1.6.4 ROC曲线相比P-R曲线有什么特点?

  相比 P-R曲线,ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状 能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。
  举例来说,图2.3是ROC曲线和P-R曲线的对比图,其中图2.3(a)和图 2.3(c)是ROC曲线,图2.3(b)和图2.3(d)是P-R曲线,图2.3(c)和图 2.3(d)则是将测试集中的负样本数量增加10倍后的曲线图。
  
                图2.3   ROC曲线和P-R曲线的对比

2 模型评估方法

2.1 Holdout检验

  Holdout检验是最简单也是最直接的验证方法,它将原始的样本随机划分为训练集和验证集两部分。sklearn.model_selction.train_test_split函数就是使用该方法。比方说,将样本按照70%-30%的比例分成两部分,70%的样本用于模型训练,30%的样本用于模型验证
  Holdout检验的缺点很明显,即在验证集上计算出来的评估指标与原始分组有很大关系,为了消除随机性,研究者们引入了 '交叉验证' 的思想。

2.2 交叉验证

  k-flod交叉验证:首先将全部样本划分成K个大小相等的样本子集,依次遍历这k个子集,每次把当前子集作为验证集,其余的子集作为训练集。最后把K次评估指标的平均值作为最终的评估指标,在实际实验中,K经常取10
  留一验证:每次留下一个样本作为验证集,其余所有样本作为测试集,样本总数为n,依次对n个样本进行遍历,进行n次验证,再将评估指标求平均值得到最终的评估指标,在样本总数较多的情况下,留一验证法的时间开销极大。

2.3 自助法

  不管是Holdout检验还是交叉验证,都是基于划分训练集和测试集的方法进行模型评估的,然而,当样本规模较小时,将样本集进行划分会让训练集进一步减少,这可能会影响模型训练效果,自助法是可以维持训练集样本规模的验证方法
  自助法是基于自助采样法的检验方法,对于总数为n的样本集合,进行n次有放回的随机抽样,得到大小为n的训练集,n次采样过程中,有的样本会被重复采样,有的样本没有被抽到过,将这些没有被抽到过的样本作为训练集,进行模型验证。

  模型评估方法可以参考本博客《机器学习——评估方法》

2.4 超参数调优

  为了进行超参数调优,一般会采用网格搜索、随机搜索、贝叶斯优化等算法。超参数搜索算法一般包括以下几个要素:
  (1)目标函数,即算法需要最大化/最小化的目标;
  (2)搜索范围,一般通过上限和下限来确定;
  (3)算法的其他参数,如搜索步长。

2.4.1 网格搜索

  网格搜索可能是最简单、应用最广泛的超参数搜索算法,它通过查找搜索范围内的所有的点来确定最优值。如果采用较大的搜索范围以及较小的步长,网格搜索有很大概率找到全局最优解,然而这种搜索方案十分消耗计算资源和时间,特别是需要调优的超参数比较的时候,因此,在实际应用过程中,网格搜索法一般会先使用较大的搜索范围和较大的步长,来寻找全局最优解可能的位置,然后会逐渐缩小搜索范围和步长,来寻找更精确的最优值,这种操作方案可以降低所需的时间和计算量,但由于目标函数一般是非凸的,所有很可能会错过全局最优解,sklearn提供了GridSearchCV类实现网格搜索。

2.4.2 随机搜索

  随机搜索的思想与网格搜索的思想比较相似,只是不再测试上界和下界之间的所有值,而是在搜索范围中随机选取样本点。它的理论依据是,如果样本点足够大,那么通过随机采样也能大概率地找到全局最优解或近似解,随机搜索一般会比网格搜索要快一些,但是和网格搜索的快速版一样,它的结果也是没法保证的,sklearn提供了RandomizedSearchCV类实现随机搜索。

2.4.3 贝叶斯优化算法

  贝叶斯优化算法在寻找最优超参数时,采用了与网格搜索,随机搜索完全不同的方法,网格搜索和随机搜索在测试一个新点时,会忽略前一个点的信息,而贝叶斯优化算法则充分利用了之前的信息,贝叶斯优化算法通过对目标函数形状进行学习,找到使目标函数向全局最优值提升的参数。具体来说,它学习目标函数形状的方法是,首先根据先验分布,假设一个搜索函数,然后,每一次使用新的采样点来测试目标函数时,利用这个信息来更新目标函数的先验分布,最后,算法测试由后验分布给出的全局最值最可能出现的位置的点。
  对于贝叶斯优化算法,有一个需要注意的地方,一旦找到了一个局部最优值,它会在该区域不断采样,所以很容易陷入局部最优值,为了弥补这个缺陷,贝叶斯优化算法会在探索和利用之间找到一个平衡点,'探索'就是在还未取样的区域获取采样点,而'利用'则是根据后验分布在最可能出现全局最优值的区域进行采样。

3 优化过拟合与欠拟合

3.1 降低过拟合风险的方法

  (1)从数据入手,获得更多的训练数据。使用更多的训练数据是解决过拟合问题最有效的手段,因为更多的样本能够让模型学习到更多更有效的特征,减少噪音的影响,当然,直接增加实验数据一般是很困难的,但是可以通过一定的规则来扩充训练数据。比如,在图像分类的问题上,可以通过图像的平移、旋转、缩放等方式扩充数据;更进一步地,可以使用生成式对抗网络来合成大量的新训练数据
  (2)降低模型复杂度。在数据较少时,模型过于复杂是产生过拟合的主要因素,适当降低模型复杂度可以避免拟合过多的采样噪音。例如,在神经网络中减少网络层数、神经元个数等;在决策树模型中降低树的深度、进行剪枝等
  (3)正则化方法
  (4)集成学习方法。集成学习是把多个模型集成在一起,来降低单一模型的过拟合风险。

3.2 降低欠拟合风险方法

  (1)添加新特征。当特征不足或现有特征与样本标签的相关性不强时,模型容易出现不拟合,通过挖掘'上下文特征''ID类特征''组合特征'等新的特征,往往能够取得更好的效果,在深度学习的潮流中,有很多类型可以帮组完成特征工程,如因子分解机
  (2)增加模型复杂度。简单模型的学习能力较差,通过增加模型的复杂度可以使模型拥有更强的拟合能力,例如,在线性模型中添加高次项,在神经网络模型中增加网络层数或神经元个数等。
  (3)减少正则化系数。正则化是用来防止过拟合的,但当模型出现欠拟合现象时,则需要针对性地减少正则化系数。

因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/15040190.html

原文地址:https://www.cnblogs.com/BlairGrowing/p/15040190.html