机器学习西瓜书(周志华)学习笔记(3)-模型评估与选择(下)

       机器学习种性能比较是个很复杂的问题,需要考虑的因素很多。那么如何对单个或多个学习器在不同或相同测试集上的性能度量结果做比较呢?这就是比较检验。偏差与方差是解释学习器泛化性能的一种重要工具。                                   

                                                  4. 比较检验

       统计假设检验(hypothesis test)为我们进行学习器性能比较提供了重要依据。基于假设检验结果我们可推断出,若A在某测试集上的性能优于B,那A的泛化性能是否在统计意义上优于B,以及这个结论的把握有多大。下面介绍两种最基本的假设检验。以“错误率”作为性能度量的标准。

4.1 假设检验

       “假设”是对学习器泛化错误率分布的某种判断或猜想。我们可以通过测试获得测试错误率,但直观上测试错误率和泛化错误率相差不会太远,因此可以通过测试错误率来推测泛化错误率的分布,这就是一种假设检验。

       泛化错误率为\varepsilon的学习器,测试错误率为\varepsilon‘,那么在m个样本中,有\varepsilon’×m个样本误分类。

  • 上式表示,在m个样本中,恰有\varepsilon’×m个样本被误分类,其余样本正确的概率。
  • 它也可以表示,在包含m个样本的测试集上,泛化错误率为\varepsilon的学习器被测得测试错误率为\varepsilon‘的概率。

     给定测试错误率\varepsilon',上式P(\varepsilon’;\varepsilon)对∈求导可知,P(\varepsilon’;\varepsilon)在\varepsilon=\varepsilon’时最大,|\varepsilon-\varepsilon‘|增大时P(\varepsilon’;\varepsilon)减小。符合二项(binomial)分布。

  • 二项检验

       我们使用“二项检验”来对“\varepsilon<=0.3”(即泛化错误率是否不大于0.3)这样的假设进行检验。更一般的,考虑假设“\varepsilon<=\varepsilon_{0}”,则在1-α的概率内所能观测到的最大错误率如下式计算:

ps:

      此时,若测试错误率\varepsilon’小于临界值 (上式求得的),则根据二项检验可得出结论:在α的显著度下,假设“\varepsilon<=\varepsilon_{0}”不能被拒绝,即能以1-α的置信度认为,学习器的泛化错误率不大于\varepsilon_{0};否则该假设可被拒绝,即在α的显著度下可认为学习器的泛化错误率大于\varepsilon_{0}

  • t检验:

       在很多时候,我们并非仅做一次留出法估计,而是通过多次重复留出法或是交叉验证法等进行多次训练/测试,这样会得到多个测试错误率,此时可使用“t检验(t-test)”。假定我们得到了k个测试错误率,\hat{\varepsilon }$_1_$\hat{\varepsilon }$_2_$,...,\hat{\varepsilon }$_k_$,则平均测试错误率\overline{X}和方差S ^{2}为:

 

 

 

 

       前面介绍的两种检验方法,都是对单个学习器泛化性能的假设进行检验,现实中,我们常常需要对不同学习器的性能进行比较,下面就针对此类情况进行假设检验方法介绍。 

4.2 交叉验证t检验

       “成对t检验”:对两个学习器A和B使用K折交叉验证法,\varepsilon _{i}^{A}\varepsilon _{i}^{B}是在相同的第i折训练/测试集上得到的结果,若A和B性能相同,则\varepsilon _{i}^{A}=\varepsilon _{i}^{B}。我们对每对结果求差,\Delta _{i}=\varepsilon _{i}^{A}-\varepsilon _{i}^{B};若两个学习器性能相同,则差值均值应为0。因此,可根据差值\Delta _{1}\Delta _{2},...,\Delta _{k}来对“学习器A与B性能相同”这个假设进行t检验,计算出差值的均值μ和方差\sigma^{2},在显著度α下,若变量:

                                                                       \tau _{t}=|\frac{\sqrt{k}\mu }{\sigma}|

小于临界值 t$_{\alpha /2,k-1}_$,则假设不能被拒绝,即认为两个学习器的性能没有显著差别;否则认为二者的性能有显著差别,且平均错误率较小那个学习器性能较优。这个临界值是自由度为k-1的t分布上尾部累计分布为α/2的临界值。

        想要进行有效的假设验证,前提是测试错误率均为泛化错误率的独立采样。但在k折交叉验证中,不同轮次的训练集会有一定程度的重叠,我们采用“5×2交叉验证”来解决。

       “5×2交叉验证”法就是做5次2折交叉验证。每次2折交叉验证都产生两对测试错误率,我们对他们分别求差,得到第1折上的差值\Delta _{i}^{1}和第2折上的差值\Delta _{i}^{2}

       为了缓解测试错误率的非独立性,平均值μ的求法:仅计算第1次2折交叉验证的两个结果的平均值。但对每次二者实验都计算出其方差。之后的操作和前面的相同,这里不再赘述。

4.3 McNemar检验

       MaNemar主要用于二分类问题,与成对t检验一样也是用于比较两个学习器的性能大小。主要思想是:若两学习器的性能相同,则A预测正确B预测错误数应等于B预测错误A预测正确数,即e01=e10,且|e01-e10|服从N(1,e01+e10)分布。

       因此,如下所示的变量服从自由度为1的\chi ^{2}分布,即服从标准正态分布N(0,1)的随机变量的平方和,下式只有一个变量,故自由度为1,检验的方法同上:做出假设–>求出满足显著度的临界点–>给出拒绝域–>验证假设。 

 4.4 Friedman检验与Nemenyi后续检验

       前面说到的检验都只是在一个数据集上比较两个算法的性能,Friedman检验则可以在多组数据集进行多个学习器性能的比较,它是基于算法排序的一种检验方法。基本思想是在同一组数据集上,根据测试结果(例:测试错误率)对学习器的性能进行排序,赋予序值1,2,3…,相同则平分序值,如下图所示

        若学习器的性能相同,则它们的平均序值应该相同,且第i个算法的平均序值ri服从正态分布N((k+1)/2,(k+1)(k-1)/12),则有:

        当k和N都较大时,服从自由度为k-1的\chi ^{2}分布。

        上述是原始的Friedman检验,现在通常使用变量:

        服从自由度为k-1和(k-1)(N-1)的F分布。

        若“所有算法的性能相同”这个假设被拒绝,则需要进行后续检验,来得到具体的算法之间的差异。常用的就是Nemenyi后续检验。Nemenyi检验计算出平均序值差别的临界值域:

       下表是常用的q_{\alpha }值,若两个算法的平均序值差超出了临界值域CD,则相应的置信度1-α拒绝“两个算法性能相同”的假设。

 

2.5 偏差与方差 

       ”偏差-方差分解“(bias-variance decomposition)是解释学习算法泛化性能的一种重要工具。  

       在学习算法中,偏差度量了期望预测与真实结果的偏离程度;方差度量了同样大小的训练集的变动所导致的学习性能的变化;噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界。

  • 期望泛化误差=方差+偏差;
  • 偏差刻画学习器的拟合能力;
  • 方差体现学习器的稳定性;
  • 偏差-方差分解说明,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。

       方差和偏差具有矛盾性,这就是常说的偏差-方差窘境(bias-variance dilamma),随着训练程度的提升,期望预测值与真实值之间的差异越来越小,即偏差越来越小,但是另一方面,随着训练程度加大,学习算法对数据集的波动越来越敏感,方差值越来越大。

       换句话说:在欠拟合时,偏差主导泛化误差,而训练到一定程度后,偏差越来越小,方差主导了泛化误差。因此需要注意,不要出现过拟合的情况啦。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本章主要介绍了概率图模型的基本概念和常见类型,以及如何利用Python实现这些模型。下面是一些笔记和代码示例。 ## 概率图模型的基本概念 概率图模型是一种用于表示和处理不确定性的图形化模型,它能够将一个复杂的联合概率分布表示为多个简单的条件概率分布的乘积形式,从而简化概率推理和模型学习的过程。概率图模型主要包括两种类型:有向图模型和无向图模型。 有向图模型(Directed Acyclic Graph, DAG)又称为贝叶斯网络(Bayesian Network, BN),它用有向边表示变量之间的因果关系,每个节点表示一个随机变量,给定父节点的条件下,每个节点的取值都可以用一个条件概率分布来描述。有向图模型可以用贝叶斯公式进行概率推理和参数学习。 无向图模型(Undirected Graphical Model, UGM)又称为马尔可夫随机场(Markov Random Field, MRF),它用无向边表示变量之间的相互作用关系,每个节点表示一个随机变量,给定邻居节点的取值,每个节点的取值都可以用一个势函数(Potential Function)来描述。无向图模型可以用和有向图模型类似的方法进行概率推理和参数学习。 ## 概率图模型的Python实现 在Python中,我们可以使用`pgmpy`库来实现概率图模型。该库提供了一个简单而强大的接口来定义和操作概率图模型,支持有向图模型和无向图模型的构建、概率推理、参数学习等功能。 ### 有向图模型 以下是一个简单的有向图模型的示例: ```python from pgmpy.models import BayesianModel model = BayesianModel([('A', 'B'), ('C', 'B'), ('B', 'D')]) ``` 其中,`BayesianModel`是有向图模型的类,`('A', 'B')`表示A节点指向B节点,即B节点是A节点的子节点,依此类推。我们可以使用以下代码查看模型的结构: ```python print(model.edges()) # 输出:[('A', 'B'), ('B', 'D'), ('C', 'B')] ``` 接下来,我们可以为每个节点定义条件概率分布。以下是一个简单的例子: ```python from pgmpy.factors.discrete import TabularCPD cpd_a = TabularCPD(variable='A', variable_card=2, values=[[0.2, 0.8]]) cpd_c = TabularCPD(variable='C', variable_card=2, values=[[0.4, 0.6]]) cpd_b = TabularCPD(variable='B', variable_card=2, values=[[0.1, 0.9, 0.3, 0.7], [0.9, 0.1, 0.7, 0.3]], evidence=['A', 'C'], evidence_card=[2, 2]) cpd_d = TabularCPD(variable='D', variable_card=2, values=[[0.9, 0.1], [0.1, 0.9]], evidence=['B'], evidence_card=[2]) model.add_cpds(cpd_a, cpd_c, cpd_b, cpd_d) ``` 其中,`TabularCPD`是条件概率分布的类,`variable`表示当前节点的变量名,`variable_card`表示当前节点的取值个数,`values`表示条件概率分布的值。对于有父节点的节点,需要指定`evidence`和`evidence_card`参数,表示当前节点的父节点和父节点的取值个数。 接下来,我们可以使用以下代码进行概率推理: ```python from pgmpy.inference import VariableElimination infer = VariableElimination(model) print(infer.query(['D'], evidence={'A': 1})) # 输出:+-----+----------+ # | D | phi(D) | # +=====+==========+ # | D_0 | 0.6000 | # +-----+----------+ # | D_1 | 0.4000 | # +-----+----------+ ``` 其中,`VariableElimination`是概率推理的类,`query`方法用于查询给定变量的概率分布,`evidence`参数用于指定给定变量的取值。 ### 无向图模型 以下是一个简单的无向图模型的示例: ```python from pgmpy.models import MarkovModel model = MarkovModel([('A', 'B'), ('C', 'B'), ('B', 'D')]) ``` 其中,`MarkovModel`是无向图模型的类,与有向图模型类似,`('A', 'B')`表示A节点和B节点之间有相互作用关系。 接下来,我们可以为每个节点定义势函数。以下是一个简单的例子: ```python from pgmpy.factors.discrete import DiscreteFactor phi_a = DiscreteFactor(['A'], [2], [0.2, 0.8]) phi_c = DiscreteFactor(['C'], [2], [0.4, 0.6]) phi_b = DiscreteFactor(['A', 'C', 'B'], [2, 2, 2], [0.1, 0.9, 0.3, 0.7, 0.9, 0.1, 0.7, 0.3]) phi_d = DiscreteFactor(['B', 'D'], [2, 2], [0.9, 0.1, 0.1, 0.9]) model.add_factors(phi_a, phi_c, phi_b, phi_d) ``` 其中,`DiscreteFactor`是势函数的类,与条件概率分布类似,需要指定变量名、变量取值个数和势函数的值。 接下来,我们可以使用以下代码进行概率推理: ```python from pgmpy.inference import BeliefPropagation infer = BeliefPropagation(model) print(infer.query(['D'], evidence={'A': 1})) # 输出:+-----+----------+ # | D | phi(D) | # +=====+==========+ # | D_0 | 0.6000 | # +-----+----------+ # | D_1 | 0.4000 | # +-----+----------+ ``` 其中,`BeliefPropagation`是概率推理的类,与有向图模型类似,`query`方法用于查询给定变量的概率分布,`evidence`参数用于指定给定变量的取值。 ## 总结 本章介绍了概率图模型的基本概念和Python实现,包括有向图模型和无向图模型的构建、条件概率分布和势函数的定义、概率推理等。使用`pgmpy`库可以方便地实现概率图模型,对于概率模型的学习和应用都有很大的帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值