《机器学习by周志华》学习笔记-线性模型-03

1、多分类学习

1.1、背景

我们在上一节介绍了「线性判别分析(LDA)」,LDA的从二分类任务可以推广到多分类任务中。

而现实中常遇到的多分类学习任务。有些二分类的学习方法可以直接推广到多分类,但是更多情况下是基于一些策略,利用二分类学习器来解决多分类的问题。

1.2、概念

我们通常将「分类学习器」简称「分类器(classifier)」,多个「分类器」的集成使用,则称为「集成学习」。

一般的,分类器使用「多分类学习」的方法来完成分类任务。本章主要介绍了「多分类学习」的方法。

1.3、基本思路

「多分类学习」的基本思路是「拆解法」,即将「多分类任务」拆成「若干个二分类任务」求解。

具体来说就是:

  • 先对问题进行拆分;
  • 然后为「拆出的每个二分类任务」训练出一个「分类器」;
  • 最后对这些分类器进行「集成使用」;

在测试时,对这些分类器的预测结果进行集成,获得最终的多分类结果。这里的关键如下:

  • 如何对多分类任务进行拆分
  • 如何对多个分类器进行集成

1.4、拆分策略

给定m个示例的数据集D有n个类别,y是其所有示例的真实标记,所有类别集合用C表示,则:

D=\left \{ (x_{1} ,y_{1} ),(x_{2} ,y_{2} ),...,(x_{m} ,y_{m} )\right \}

C=\left \{ C_{1},C_{2},...,C_{n} \right \}

yi\in C

常见的拆分策略有三种:

  • 一对一(One vs.One,简称OvO)
  • 一对其余(One vs.Rest,简称OvR):亦称OvA(One vs.All),但OvA这个说法不严格,因为不可能把“所有类”作为反类。
  • 多对多(Many vs.Many,简称MvM)

后面我们将详细介绍这三种拆分策略。

1.4.1、一对一(OvO)

首先,将n个类别「两两配对」,从而产生\hat{n}个二分类任务,即\hat{n}个二分类器。

\hat{n}=C_{n}^{2}=\frac{A_{n}^{2}}{A_{2}^{2}}=\frac{n\times (n-1)}{2\times 1}= \frac{n(n-1)}{2}

其次,每个二分类任务,都C_{i}表示正例,C_{j}表示反例。

再次,将D的所有m个样本同时提交给\hat{n}个二分类器。

最后,结果通过投票产生,即把被预测的最多的类别作为最终分类结果。

如下图所示:

1.4.2、一对其余(OvR)

首先,每次将一个类的样例作为正例、其余的类作为反例来训练,从而产生n次训练任务、n个二分类器以及预测结果。

其次,将D的所有m个样本同时提交给n个二分类器。

最后,分情况选择分类结果:

  • 当只有一个分类器预测为正例,则对应类别就是分类结果,例如下图的C3
  • 当有多个分类器预测为正例,则考虑每个分类器预测的置信度,选择最大的类别作为分类结果。

OvO与OvR对比:

对比类别 OvO OvR 分析
训练分类器个数 n n(n-1)/2 OvO的存储开销、测试(训练)时间较大。
每个分类器训练样例数 2个类别的样例 n个类别的样例 在类别很多的时候,OvO的测试(训练)时间、开销更小。
预测性能 / / 依赖于二者的数据分布,多数情况都差不多。

1.4.3、多对多(MvM)

就是将若干个类的样例作为「正例」,其他类的样例作为「反例」。其构造必须有特殊的设计,不能随意选取。

OvO和OvR是MvM的一种拆分方式,属于MvM的特例。

我们会在下面介绍一种常用的选取技术「纠错输出码(Error Correcting Output Codes,简称ECOC)」,它是将编码的思维引入类别拆分,并尽可能在编码过程中具有容错性,其工作主要分为以下2步:

第一步:编码

  • 对n个类别做m次划分,每次划分将一部分类别划分为「正类」,另一部分为「反类」,从而形成一个二分类训练集。
  • 一共产生m个训练
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

vanilla698

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值