目录
一、误差与拟合
1. 泛化误差与经验误差
2. 损失函数与训练误差
3. 过拟合与欠拟合
4. 过拟合的另一种现象:数据泄露
二、评估方法
1. 留出法
2. 交叉验证法(留一法)
3. 自助法
4. 调参与最终模型
三、性能度量
1. 混淆矩阵
2.准确率
3.精确率(查准率)和召回率(查全率)
4. F1值和Fβ值
5. ROC曲线及其AUC值
6. AUC值的计算
7. 代价敏感错误率与代价曲线
四、比较检验
1.性能比较的三个要素
2.假设检验
(1)估计假设精度
(2)采样理论基础
(3)多次训练/测试的检验-t检验
(4)交叉验证 t 检验
(5)McNemar 检验
(6)Friedman检验与 Nemenyi后续检验
五、偏差与方差
泛化误差:在“未来”样本上的误差(generalization error)
经验误差:在训练样本上的误差(training error),也称为训练误差
错误率 :分类错误的样本数占样本总数的比例(error)
精度 :1-错误率(accuracy)
我有个小问号????
不是说泛化误差越小越好,那经验误差是否越小越好?
当然不是,因为会出现“过拟合”问题
2.1 损失函数
损失函数是关于模型计算结果f(x)和样本实际目标结果y的非负实值函数,记作L(y,f(x)).用它来解释模型在每个样本实例上的误差,损失函数的值越小,说明预测值与实际值越接近,即模型的拟合效果越好. 损失函数主要包括以下几种: 0-1损失函数、平方损失函数、绝对损失函数、对数损失函数.
2.2 训练误差
损失函数仅是对一个样本而言,模型优化目标函数应当是使全局损失函数最小,即所有样本的损失函数的均值,其中训练误差可表示为:
在机器学习表现不佳的原因要么是过度拟合或欠拟合数据。
监督式机器学习通常理解为逼近一个目标函数f,此函数映射输入变量(X)到输出变量(Y)得到Y=f(X)
这种特性描述可以用于定义分类和预测问题和机器学习算法的领域。
从训练数据中学习目标函数的过程中,我们必须考虑的问题是模型在预测新数据时的泛化性能。泛化好坏是很重要的,因为我们收集到的数据只是样本,其带有噪音并且是不完全的。
在机器学习中,我们描述从训练数据学习目标函数的学习过程为归纳性的学习。
归纳与特别的样本中学习到通用的概念有关,而这就是监督式机器学习致力于解决的问题。这与推演不同,其主要是另一种解决问题和寻求从通常的规则中找寻特别的内容。
泛化即是,机器学习模型学习到的概念在它处于学习的过程中时模型没有遇见过的样本时候的表现。
好的机器学习模型的模板目标是从问题领域内的训练数据到任意的数据上泛化性能良好。这让我们可以在未来对模型没有见过的数据进行预测。
在机器学习领域中,当我们讨论一个机器学习模型学习和泛化的好坏时,我们通常使用术语:过拟合和欠拟合.
在统计学中,拟合指的是你逼近目标函数的远近程度。
这个术语同样可以用于机器学习中,因为监督式机器学习算法的目标也是逼近一个未知的潜在映射函数,其把输入变量映射到输出变量。
统计学通常通过用于描述函数和目标函数逼近的吻合程度来描述拟合的好坏。
这类理论中的一些在机器学习中也是有用的(例如,计算残差),但是一些技巧假设我们已经知道了我们要逼近的函数。这和机器学习的场景就不同了。
如果我们已经知道了目标函数的形式,我们将可以直接用它来做预测,而不是从一堆有噪音的数据中把它费力的学习出来。
过拟合指的是模型对于训练数据拟合程度过当的情况。
当某个模型过度的学习训练数据中的细节和噪音,以至于模型在新的数据上表现很差,我们称过拟合发生了。这意味着训练数据中的噪音或者随机波动也被当做概念被模型学习了。而问题就在于这些概念不适用于新的数据,从而导致模型泛化性能的变差。
过拟合更可能在无参数非线性模型中发生,因为学习目标函数的过程是易变的具有弹性的。同样的,许多的无参数器学习算法也包括限制约束模型学习概念多少的参数或者技巧。
例如,决策树就是一种无参数机器学习算法,非常有弹性并且容易受过拟合训练数据的影响。这种问题可以通过对学习过后的树进行剪枝来解决,这种方法就是为了移除一些其学习到的细节。
欠拟合指的是模型在训练和预测时表现都不好的情况。
一个欠拟合的机器学习模型不是一个良好的模型并且由于在训练数据上表现不好这是显然的。
欠拟合通常不被讨论,因为给定一个评估模型表现的指标的情况下,欠拟合很容易被发现。矫正方法是继续学习并且试着更换机器学习算法。
理想上,你肯定想选择一个正好介于欠拟合和过拟合之间的模型。
这就是我们学习的目标,但是实际上很难达到。
为了理解这个目标,我们可以观察正在学习训练数据机器学习算法的表现。我们可以把这个过程划分为分别是训练过程和测试过程。
随着时间进行,算法不断地学习,模型在训练数据和测试数据上的错误都在不断下降。但是,如果我们学习的时间过长的话,模型在训练数据上的表现将继续下降,这是因为模型已经过拟合并且学习到了训练数据中的不恰当的细节以及噪音。同时,测试数据集上的错误率开始上升,也即是模型的泛化能力在下降。
这个完美的临界点就处于测试集上的错误率开始上升时,此时模型在训练集和测试集上都有良好的表现。
你可以用你自己喜爱的机器学习算法来实践这个实验。而在实践中这通常是无用的,因为在测试数据上运用这个技巧来选择训练停止的时机,这意味着这个测试集对于我们并不是“不可见的”或者单独的衡量标准。数据的一些知识(许多有用的知识)已经泄露到了训练过程。
通常有两种手段可以帮助你找到这个完美的临界点:重采样方法和验证集方法。
过拟合和欠拟合可以导致很差的模型表现。但是到目前为止大部分机器学习实际应用时的问题都是过拟合。
过拟合是个问题因为训练数据上的机器学习算法的评价方法与我们最关心的实际上的评价方法,也就是算法在位置数据上的表现是不一样的。
当评价机器学习算法时我们有两者重要的技巧来限制过拟合:
最流行的重采样技术是k折交叉验证。指的是在训练数据的子集上训练和测试模型k次,同时建立对于机器学习模型在未知数据上表现的评估。
1、数据泄露现象
机器学习中还有一个与过拟合非常相似的现象:训练时模型表现的非常好,但是在真实的预测中表现的很差。这种情况可能是数据泄露。数据泄露又叫特征穿越,指的是在建模过程中的数据收集、处理时不小心将未来信息引入到训练集中。当把未来信息引入到训练集中时,模型训练的效果往往非常好,但真实的预测效果会大打折扣。
2、数据泄露容易发生的场景
数据泄露一般发生在时间序列场景或具有时间属性的场景中。例如,在金融的信贷领域,建模工程师在取数的时候,误取到了建模时间点之后的还款信息、表现等。
3、检查数据泄露的方法
(1)数据探索性分析
查看特征分布和特征与目标之间的关系,并从具体问题角度出发,分析和论证该特征的含义。
(2)特征分析
可以进行特征与目标变量的相关性分析,使用一些统计算法,去分析特征的重要性。如果有表现特别突出的特性,需重点检查。
(3)模型比较
详细的模型性能评估和分析,与之前的版本的模型和行业模型进行对比。
(4)加强测试
对模型进行现场测试,查看真实环境的表现与模型训练效果是否有很大差别。
4、避免出现数据泄露需要注意的点
(1)具有时间属性的场合要严格控制时间,取得所需历史快照数据,并追溯变量业务的物理含义;
(2)使用特征区分力指标进行直观检查,重点检查区分力强的特征;
(3)当怀疑某个特征有泄露的可能性时,不要使用;
(4)不要使用ID类的变量;
(5)只有在训练数据集或交叉验证的训练组中执行数据信息提取等相关处理方法(特征选择、异常值删除、编码、特征缩放和降维等),交叉验证时在每个循环周期内独立进行;
(6)在独立的、模型完全未见的数据集上进行模型的最终评估;
(7)采取管道方式,使用统一的数据处理方法。
如何获得测试结果???
在学习得到的模型投放使用之前,通常需要对其进行性能评估。为此, 需使用一个“测试集”(testing set)来测试模型对新样本的泛化能力,然后以测试集上的“测试误差”(testing error)作为泛化误差的近似。
而“测试集”的获得,我们一般假设是从样本真实分布中独立采样获得的,所以要求测试集和训练集中的样本尽量互斥
给定一个已知的数据集,将数据集拆分成训练集S和测试集T,通常的做法包括:
注意:
将数据集分层采样划分为k个大小相似的互斥子集,每次用k-1个子集的并集作为训练集,余下的子集作为测试集,最终返回k个测试结果的均值,“k折交叉验证”(k-fold cross validation)。k最常用的取值是10,其他常用的k值有5、20等。
与留出法类似,将数据集D划分为k个子集同样存在多种划分方式,为了减小因样本划分不同而引入的差别,k折交叉验证通常随机使用不同的划分重复p次,最终的评估结果是这p次k折交叉验证结果的均值,例如常见的“10次10折交叉验证”。
假设数据集D包含m个样本,若令k=m,则得到留一法:
以自助采样法为基础,对数据集D有放回采样m次得到训练集D′ , D\D′用做测试集。
约有 36.8% 的样本不出现,称为“包外估计”(out-of-bag estimation)
注意:
算法的参数:一般由人工设定,亦称“超参数”
模型的参数:一般由学习确定
调参过程相似:先产生若干模型,然后基于某种评估方法进行选择
注:参数调得好不好往往对模型最终性能有关键影响
区别:训练集 vs. 测试集 vs. 验证集(validation set)
算法参数选定后,要用“训练集+验证集”重新训练最终模型
模型持久化(model persistence):
性能度量(performance measure)是衡量模型泛化能力的评价标准,反映了任务需求。
使用不同的性能度量往往会导致不同的评判结果
什么样的模型是“好”的,不仅取决于算法和数据,还取决于任务需求。
评价指标:
准确率、精确率(查准率)、召回率(查全率)、F1值、ROC曲线的AUC值,都可以作为评价一个机器学习模型好坏的指标(evaluation metrics),而这些评价指标直接或间接都与混淆矩阵有关,前四者可以从混淆矩阵中直接计算得到,AUC值则要通过ROC曲线进行计算,而ROC曲线的横纵坐标又和混淆矩阵联系密切,所以在了解这些评价指标之前,先知道什么是混淆矩阵很有必要,也方便记忆。
对于一个二分类问题,我们可以得到如表 1所示的的混淆矩阵(confusion matrix):
表 1:混淆矩阵
Actual class(真实结果) |
|||
positive class(正向) |
negative class(负向) |
||
Predicted class (预测结果) |
positive class(正向) |
True Positive(TP) |
False Positive(FP) |
negative class(负向) |
False Negative(FN) |
True Negative(TN) |
表 1 所示的混淆矩阵中,行表示数据在模型上的预测类别(predicted class/predicted condition),列表示数据的真实类别(actual class/true condition)。在看混淆矩阵时,要分清样本的真实类别和预测类别,有些地方的行列表示可能和这里不一致。在sklearn中,二分类问题下的混淆矩阵需要分别将表 1 中的predicted class和Actual class对调,将横纵坐标的positive class和negative class都分别对调,再重新计算混淆矩阵。
通过混淆矩阵,我们可以很直观地看清一个模型在各个类别(positive和negative)上分类的情况。
表 2:TP、FP、FN、TN
TP | 真实类别为positive,模型预测的类别也为positive |
FP | 预测为positive,但真实类别为negative,真实类别和预测类别不一致 |
FN | 预测为negative,但真实类别为positive,真实类别和预测类别不一致 |
TN | 真实类别为negative,模型预测的类别也为negative |
TP、FP、TN、FN,第二个字母表示样本被预测的类别,第一个字母表示样本的预测类别与真实类别是否一致。
查准率(P):被分为正类的样本中实际为正类的样本比例。
查全率(R):实际为正类的样本中被分为正类的样本比例。
PR图:
BEP:
准确率(accuracy)计算公式如下所示:
准确率表示预测正确的样本(TP和TN)在所有样本(all data)中占的比例。
在数据集不平衡时,准确率将不能很好地表示模型的性能。可能会存在准确率很高,而少数类样本全分错的情况,此时应选择其它模型评价指标。
positive class的精确率(precision)计算公式如下:
positive class的召回率(recall)计算公式如下:
positive class的精确率表示在预测为positive的样本中真实类别为positive的样本所占比例;positive class的召回率表示在真实为positive的样本中模型成功预测出的样本所占比例。
positive class的召回率只和真实为positive的样本相关,与真实为negative的样本无关;而精确率则受到两类样本的影响。
F1度量:基于查准率和查全率的调合平均(harmonic mean)
F1值的计算公式如下:
F1值就是精确率和召回率的调和平均值,F1值认为精确率和召回率一样重要。
若对查准率/查全率有不同偏好:
Fβ值的计算公式如下:
AUC全称为Area Under Curve,表示一条曲线下面的面积,ROC曲线的AUC值可以用来对模型进行评价。ROC曲线如图所示:
ROC曲线
(注:图片摘自https://en.wikipedia.org/wiki/Receiver_operating_characteristic)
ROC曲线的纵坐标True Positive Rate(TPR)在数值上就等于positive class的recall,记作recallpositive,横坐标False Positive Rate(FPR)在数值上等于(1 - negative class的recall),记作(1 - recallnegative)如下所示:
通过对分类阈值θθ(默认0.5)从大到小或者从小到大依次取值,我们可以得到很多组TPR和FPR的值,将其在图像中依次画出就可以得到一条ROC曲线,阈值θ取值范围为[0,1]。
通过对分类阈值θ(默认0.5)从大到小或者从小到大依次取值,我们可以得到很多组TPR和FPR的值,将其在图像中依次画出就可以得到一条ROC曲线,阈值θ取值范围为[0,1]。
ROC曲线在图像上越接近左上角(0,1)模型越好,即ROC曲线下面与横轴和直线FPR = 1围成的面积(AUC值)越大越好。直观上理解,纵坐标TPR就是recallpositive值,横坐标FPR就是(1 - recallnegative),前者越大越好,后者整体越小越好,在图像上表示就是曲线越接近左上角(0,1)坐标越好。
AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间AUC作为数值可以直观的评价分类器的好坏,值越大越好。
首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面,从而能够更好地分类。
方法一 :定义法
从定义可知,AUC可通过ROC曲线下各部分的面积求和而得。假定ROC曲线是由坐标为{(x1,y1), {(x2,y2),…,{(xm,ym)}的点按序连接而形成(x1=0, xm=1),则AUC可估算为:
AUC=0.75
方法二 :排序损失法
形式化地看,AUC考虑的是样本预测的排序质量,因此它与排序误差有紧密联系。给定m^+个正例和m^−个反例,令D^+和D^−分别表示正、反例集合,则排序“损失”(loss)定义为:
所以:AUC=1-0.25=0.75
方法三 :排序收益法
方法四 :排序法
为均衡不同类型错误所造成的不同损失,可为错误赋予“非均等代价”(unequal cost)
以二分类为例,引入了“代价矩阵”(cost matrix):
在非均等错误代价下,我们希望的是最小化“总体代价”,这样“代价敏感”的错误率:
同样对于ROC曲线,在非均等错误代价下,演变成了“代价曲线”,代价曲线横轴是取值在[0,1]之间的正例概率代价,式中p表示正例的概率,纵轴是取值为[0,1]的归一化代价。
代价曲线的绘制:
1.希望比较的和实际获得的性能并不相同,两者对比结果也可能不会相同。
2.测试集的性能与测试集本身的选择有很大关系,也就是说,测试数据好,性能就好,数据不好,性能也跟着不好。
3. 很多机器学习算法都具有随机性,相同的参数、相同的测试集,运行多次,结果却不同。
注: 直接选取相应评估方法在相应度量下比大小的方法不可取!
由于泛化错误率与测试错误率比较接近,因此,可根据测试错误率估推出泛化错误率的分布。
泛化错误率为ϵ 学习器被测得测试错误率为ϵ ^ 的概率:
比较检验的重要方法是统计假设检验
数理统计学中根据一定假设条件由样本推断总体的一种方法。 在总体的分布函数完全未知或已知其形式,但不知其参数的情况,为了推断总体的某些未知特性,提出某些关于总体的假设。我们要根据样本对所提出的假设作出是接受还是拒绝的决策。
假设检验四步走:
问题:假设检验在机器学习的【比较检验】中究竟如何应用呢?
分为四步加以分析:
在评估一个假设时,我们一般更感兴趣:
估计其对未来实例的分类精度 知道这一精度估计中的可能的误差(即与此估计相联系的误差门限)
定义学习问题的框架如下:
有一多有可能实例的空间X,其上定义了多个目标函数。假定X中不同实例具有不同的出现频率,即存在一个未知的概率分布D。学习任务是在假设空间H上学习一个目标函数f。
确切区分两种精度(或两种错误率):
离散值假设的置信区间:
要基于某离散值假设h 在样本S 上观察到的样本错误率,估计 它的真实错误率,其中:
样本S 包含n 个样例,它们的抽取按照概率分布D,抽取过程是相互独立的,并且不依赖于h
n≥30
假设h 在这n 个样例上犯了r 个错误(errorS(h)=r/n)
测量样本错误率相当于在作一个有随机输出的实验。我们先从分布D 中随机抽取出n 个独立的实例,形成样本S,然后测量样本错误率errorS(h) ,如果将实验重复多次,每次抽取大小为n 的不同的样本Si,将可以得到不同的errorSi(h)的值,它取决于不同Si 的组成中的随机差异。这种情况下,第i 个这样的实验的输出errorSi(h)被称为一随机变量(random variable)。一般情况下,可以将随机变量看成一个有随机输出的实验。
设想要运行 k 个这样的随机实验,测量随机变量errorS1(h) ,errorS2(h),⋯⋯,errorSk(h)。 然后我们以图表的形式显示出观察到的每个错误率值的频率。当k 不断增长,该图表将呈现二项分布。
即对于足够大的样本,二项分布可以很好地由正态分布来近似:
置信区间:某个参数 p 的N%置信区间是一个以N%的概率包含p 的区间
推导置信区间的一般方法:
在包含了 m 个样本的测试集上,【泛化错误率为ϵ的学习器】被测得测试错误率为ϵ ̂ 的概率为:
给定泛化错误率后,测试错误率与样本数的乘积(即测试错误数)是一个典型的二项分布
考虑到这 k个测试错误率可以看做泛化错误率ϵ的独立采样,则变量:
服从自由度为 k−1的t分布。
对两个学习器A和B,使用 k 折交叉验证法得到的测试错误率分别为ϵ i A \epsilon_i^AϵiA和ϵ i B \epsilon_i^BϵiB。
对 k 折交叉验证产生的 k 对测试错误率:先对每对结果求差,Δ i = ϵ i A − ϵ i B \Delta_i=\epsilon_i^A-\epsilon_i^BΔi=ϵiA−ϵiB, 若两个学习器性能相同,则差值均值班为零。对"学习器 A 与 B 性能相同"这个假设做 t 检验,在显著度 α 下,若变量为:
小于临界值则假设不能被拒绝,即认为两个学习器的性能没有显著差差别; 否则可认为两个学习器的性能有显著差别,且平均错误率较小的那个学习 器性能较优。
学习器 A 和 B 的测试错误率列联表为:
我们可以构建自由度为 1 的 χ2 分布,
为解决一组数据集上的多个算法比较,我们构建基于算法排序的Friedman 检验。
N是数据集的个数,k是算法的个数。在 k 和 N 都较大时,服从自由度为 k-1 的 χ2 分布.
常用的Friedman 检验为:
若"所有算法的性能相同"这个假设被拒绝,则说明算法的性能显著不同.这时需进行"后续检验" (post-hoc test)来进一步区分各算法.常用的有 Nemenyi 后续检验。
Nemenyi 检验计算出平均序值差别的临界值域:
偏差:指的是预测的期望值与真实值的偏差,度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力;(准确度)
方差:每一次预测值与预测值的期望之间的差均方,度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;(稳定性)
噪声:表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。(难度)
偏差一方差分解说明,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。
偏差-方差窘境:
此图说明了什么问题呢?
给出了寻找最优平衡点的数学描述。若模型复杂度大于平衡点,则模型的方差会偏高,模型倾向于过拟合;若模型复杂度小于平衡点,则模型的偏差会偏高,模型倾向于欠拟合。