《机器学习》周志华--第8章集成学习。笔记+习题

集成学习的目的是: 通过适当的学习方法将弱学习器转化为强学习器
方法要点为:优而不同

8.1个体与集成

1.集成学习概念和一般结构

在这里插入图片描述

  • 集成学习概念

集成学习(多分类器系统/基于委员会的学习):生成一组个体学习器并将它们结合起来。

  • 示意图在这里插入图片描述
    集成学习可得到比单一学习器更好的泛化性能,尤其是弱学习器:泛化性能略大于50%

2.结构

在这里插入图片描述

3.性能

在这里插入图片描述
举一个简单的例子:在二分类任务中,假定三个分类器在三个测试样本上的表现如图所示:在这里插入图片描述

通过单一变量法,a表示好而不同的分类器,b表示好但相同的分类器,c表示不好但不同的分类器。

其中 √ 表示分类正确,× 表示分类错误,集成学习的结果通过投票法(voting)产生,即 少数服从多数。
在图(a)中,每个分类器都只有66.6% 的精度,但集成学习却达到了100%;
在图(b)中,三个分类器没有差别,集成之后性能没有提高;
在图© 中,每个分类器的精度都只有33.3%,集成学习的结果变得更糟。
这个简单的例子显示出:要获得好的集成,个体学习器应好而不同。

在分类器的错误率相互独立的前提下集成的错误率:(Hoeffding不等式)在这里插入图片描述
随着个体分类器数目T增大,集成错误率下降。

4.分类

在这里插入图片描述

8.2Boosting

主要关注降低偏差,可将弱学习器提升为强学习器的算法

1.工作机制

在这里插入图片描述
在这里插入图片描述

2.AdaBoosting

在这里插入图片描述
在这里插入图片描述
详细总结:link.
有两个例子
链接: link.
链接: link.
把第2个例子转过来。

一个二元分类问题,如何划分红球和篮球。显然这个问题用一个线性分类器的话很难取得最好的效果。有没有办法通过组合一系列和正方形平行的线(每条线都相当于一个线性分类器)来获得一个比较好的分类效果呢?
第一步:先矮子里拔将军,选择一条平行于四边且最不坏的线段。下图第一排中间的小图里,直线把图分为左边(红点)和右边(蓝点)两类,被错分的点只有3个,这似乎是能得到的最好的结果了。然后我们想去找第二条线(第二个线性分类器)。如果只是基于现有的这些点的话那么说不定得到的线段还是和之前那条差不多,那多个线段(线性分类器)就没有意义了。所以我们要稍微调整一下某些点在分类结果里的重要性,提升他们的权重。我们在这里提升了那三个被错分的点的权重。
第二步:我们找到了一条新的线段,因为之前提升了把蓝点和蓝点分在一起的重要性,所以这条线段没有选择平行于上下两边把上面4个点(1红3蓝)和下面7个点(5红2蓝)分开,而是选择尽可能多地把蓝点归在一起。然而这次不同的是我们分错的是右边那4个红点,于是我们放大那4个红点,提升他们的权重。在这里插入图片描述
不断重复这一过程。在这里插入图片描述
最终我们得到了多个线性分类器,把这些线性分类器的结果做一个线性组合,我们就得到了整个集成模型的结果。每个线性分类器的结果的系数(权重)取决于它的表现,表现越好,权重越高。比如第一条线段的分类错误就优于第二条线段,那么它获得的权重也就会更大。集成模型的效果非常好。
在这里插入图片描述
顺带一提,第一条线段的分类正确率是8/11,第二条线段的分类正确率是7/11,第三条线段的分类正确率是8/11,确实要好于随机猜测(以1/2为界)。

3.对基学习器的要求

在这里插入图片描述

8.3Bagging与随机森林

在这里插入图片描述

1.思路

在这里插入图片描述

2.分类:取样方法

在这里插入图片描述

3.Bagging

主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。

在这里插入图片描述

  • 流程
    在这里插入图片描述
    Bagging 的算法描述图如下:在这里插入图片描述

  • 对预测输出进行结合
    在这里插入图片描述

  • 优点

List item
优点:复杂度低,仅比只用基学习算法多了一个采样和投票环节,能直接用于分类、回归,自主采样剩余样本可用于对泛化性能的外包估计↓

在这里插入图片描述

4.随机森林

随机森林是Bagging的一个扩展变体
在这里插入图片描述
在这里插入图片描述
随机森林的起始性能往往相对较差, 特别是在集成中只包含一个基学习器时,这很容易理解,因为通过引入属性扰动,随机森林中个体学习器的性能往往有所降低。然而,随着个体学习器数目的增加,随机森林通常会收敛到更低的泛化误差。值得一提的是,随机森林的训练效率常优于Bagging,因为在个体决策树的构建过程中, Bagging 使用的是 确定型决策树,在选择划分属性时要对结点的所有属性进行考察,而随机森林使用的 随机型决策树 则只需考察一个属性子集。

5.二者区别

在这里插入图片描述

8.4结合策略

1.好处

在这里插入图片描述
直观示意图如下:

在这里插入图片描述

2.平均法

在这里插入图片描述
在这里插入图片描述
其中 𝝎i是个体学习器的权重,一般是从训练数据中习得。在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法.
在这里插入图片描述

3.投票法

对分类任务最常见的结合策略
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
应注意:

在这里插入图片描述

4.学习法

训练数据很多
在这里插入图片描述
算法描述图如下,这里假定初级学习器使用不同学习算法产生,即初级集成是异质的。在这里插入图片描述

8.5多样性

在这里插入图片描述

1.误差-分歧分解

在这里插入图片描述
在这里插入图片描述

2.多样性度量

用于度量集成中个体分类器的多样性,考虑个体分类器的两两相似性。
两个分类器的预测结果列联表
在这里插入图片描述
a,b,c,d为对应预测的样本数目。
常见的多样性度量:在这里插入图片描述

3.多样性增强

在这里插入图片描述
输入属性扰动的算法流程在这里插入图片描述

习题

在这里插入图片描述

3.自己编程实现一个AdaBoost,以不剪枝决策树为基学习器,在西瓜数据集3.0α上训练一个AdaBoost集成,并与图8.4比较。
链接: link.

4.GradientBoosting是一种常用的Boosting算法,是分析其与AdaBoost的异同。

GradientBoosting与AdaBoost相同的地方在于要生成多个分类器以及每个分类器都有一个权值,最后将所有分类器加权累加起来

不同在于:
AdaBoost通过每个分类器的分类结果改变每个样本的权值用于新的分类器和生成权值,但不改变每个样本不会改变。
GradientBoosting将每个分类器对样本的预测值与真实值的差值传入下一个分类器来生成新的分类器和权值(这个差值就是下降方向),而每个样本的权值不变。

5.试编程实现Bagging,以决策树桩为学习器,在西瓜数据集3.0α上训练一个Bagging集成,并与8.6进行比较。
链接: link.

以决策树桩作为Bagging的基学习器,效果不太好。尝试了下,设置基学习器数量为21时算是拟合最好的,决策边界如下:请添加图片描述

8.6 试析 Bagging 通常为何难以提升朴素贝叶斯分类器的性能.

Bagging主要是降低分类器的方差,而朴素贝叶斯分类器没有方差可以减小。对全训练样本生成的朴素贝叶斯分类器是最优的分类器,不能用随机抽样来提高泛化性能。

7.试述随即森林为什么比决策树Bagging集成的训练速度快。

随机森林不仅会随机样本,还会在所有样本属性中随机几种出来计算。这样每次生成分类器时都是对部分属性计算最优,速度会比Bagging计算全属性要快。

8.MultiBoosting算法与Iterative Bagging的优缺点。

MultiBoosting由于集合了Bagging,Wagging,AdaBoost,可以有效的降低误差和方差,特别是误差。但是训练成本和预测成本都会显著增加。
Iterative Bagging相比Bagging会降低误差,但是方差上升。由于Bagging本身就是一种降低方差的算法,所以Iterative Bagging相当于Bagging与单分类器的折中。

9.试设计一种可视化多样性度量,并与k-误差图比较。

暂无

10.试设计一种能提升k近邻分类器性能的集成学习算法。

可以使用Bagging来提升k近邻分类器的性能,每次随机抽样出一个子样本,并训练一个k近邻分类器,对测试样本进行分类。最终取最多的一种分类。

  • 15
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
很好,以下是第十四的部分习题python实现: 14.1 腐蚀图像分割 ```python import numpy as np import matplotlib.pyplot as plt from scipy.misc import ascent from scipy.ndimage import grey_erosion img = ascent() # 载入一张灰度图像 selem = np.ones((50,50)) # 定义一个50x50的结构元素 eroded = grey_erosion(img, footprint=selem) # 使用结构元素进行腐蚀操作 # 显示原图和腐蚀后的图像 fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(8, 4)) ax = axes.ravel() ax[0].imshow(img, cmap=plt.cm.gray) ax[0].set_title('Original image') ax[1].imshow(eroded, cmap=plt.cm.gray) ax[1].set_title('Eroded image') plt.show() ``` 14.2 高斯混合模型 ```python import numpy as np from scipy.stats import norm class GMM: def __init__(self, n_components, max_iter=100, tol=1e-6): self.n_components = n_components self.max_iter = max_iter self.tol = tol def fit(self, X): n_samples, n_features = X.shape # 初始化参数 self.weights = np.ones(self.n_components) / self.n_components self.means = X[np.random.choice(n_samples, self.n_components, replace=False)] self.covs = [np.eye(n_features) for _ in range(self.n_components)] for i in range(self.max_iter): # E步,计算每个样本在各分模型下的后验概率 probs = np.zeros((n_samples, self.n_components)) for j in range(self.n_components): probs[:, j] = self.weights[j] * norm.pdf(X, self.means[j], self.covs[j]) probs /= probs.sum(axis=1, keepdims=True) # M步,更新参数 weights_new = probs.mean(axis=0) means_new = np.dot(probs.T, X) / probs.sum(axis=0, keepdims=True).T covs_new = [] for j in range(self.n_components): diff = X - means_new[j] cov_new = np.dot(probs[:, j] * diff.T, diff) / probs[:, j].sum() covs_new.append(cov_new) self.weights = weights_new self.means = means_new self.covs = covs_new # 判断收敛 if np.abs(weights_new - self.weights).max() < self.tol \ and np.abs(means_new - self.means).max() < self.tol \ and np.abs(covs_new - self.covs).max() < self.tol: break def predict(self, X): probs = np.zeros((X.shape[0], self.n_components)) for j in range(self.n_components): probs[:, j] = self.weights[j] * norm.pdf(X, self.means[j], self.covs[j]) return probs.argmax(axis=1) ``` 14.3 隐马尔可夫模型 ```python import numpy as np class HMM: def __init__(self, n_states, n_features): self.n_states = n_states self.n_features = n_features def fit(self, X, max_iter=100, tol=1e-6): n_samples = len(X) # 初始化参数 self.pi = np.ones(self.n_states) / self.n_states self.A = np.ones((self.n_states, self.n_states)) / self.n_states self.B = np.ones((self.n_states, self.n_features)) / self.n_features for i in range(max_iter): # E步,计算前向概率和后向概率 alpha = np.zeros((n_samples, self.n_states)) beta = np.zeros((n_samples, self.n_states)) alpha[0] = self.pi * self.B[:, X[0]] for t in range(1, n_samples): alpha[t] = np.dot(alpha[t-1], self.A) * self.B[:, X[t]] beta[-1] = 1 for t in range(n_samples-2, -1, -1): beta[t] = np.dot(self.A, self.B[:, X[t+1]] * beta[t+1]) gamma = alpha * beta / alpha[-1].sum() # M步,更新参数 self.pi = gamma[0] self.A = np.dot(gamma[:-1].T, self.A * self.B[:, X[1:]] * beta[1:]) / gamma[:-1].sum(axis=0).reshape(-1, 1) self.B = np.zeros((self.n_states, self.n_features)) for k in range(self.n_features): mask = X == k self.B[:, k] = gamma[mask].sum(axis=0) / gamma.sum(axis=0) # 判断收敛 if np.abs(alpha[-1].sum() - 1) < tol: break def predict(self, X): alpha = np.zeros((len(X), self.n_states)) alpha[0] = self.pi * self.B[:, X[0]] for t in range(1, len(X)): alpha[t] = np.dot(alpha[t-1], self.A) * self.B[:, X[t]] return alpha[-1].argmax() ``` 以上是部分习题的python实现,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪呀呀呀呀呀呀呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值