机器学习 第八章

目录

一、个体与集成

二、Boosting

三、Bagging和随机森林

1.Bagging

2.随机森林

四、策略

1.平均法

2.投票法

3.学习法

五、多样性

1.误差-分歧分解

2.多样性度量

3.多样性增强

实验

1.AdaBoost 决策树回归实验

2.偏差-方差分解实验

总结


一、个体与集成

集成学习通过构建并结合多个学习器来完成学习任务,有时称为多分类器系统、基于委员会的学习。其一般结构为:先产生一组个体学习器,再用某种策略将它们结合起来。

 个体学习器由一个现有的学习算法从训练数据产生。集成中只包含同种类型的个体学习器,这种集成式同质的,同质集成中的个体学习器叫做基学习器,相应的学习算法叫做基学习算法。包含不同类型的个体学习器是异质的,其对应的个体学习器叫做组件学习器。

集成学习的很多研究是针对弱学习器进行的,弱学习器就是指泛化性能略优于随机猜测的学习器。要获得好的集成,个体学习器应该好而不同,即个体学习器要有一定的准确性且学习器间要有一定的差异。

目前的集成学习方法可以分为两大类,(1)个体学习器间存在强依赖关系、必须串行生成的序列化方法,代表为Boosting(2)个体学习器间不存在强依赖关系、可同时生成的并行化方法。代表为Bagging和随机森林

二、Boosting

Boosting是一族可将弱学习器提升为强学习器的算法,其工作原理为:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行,直至基学 习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。

其中最著名的代表是AdaBoost,其有多种推导方式,最容易理解的是基于加性模型,即基学习器的线性组合,来最小化指数损失函数。若指数损失函数最小化,则分类错误率也将最小化,说明指数损失函数是分类任务0/1损失函数的一致的替代损失函数。理想的基学习器为:

h_t(x)=\underset{h}{arg\: min}E_{x\sim D_t}[\mathbb{I}(f(x)\neq h(x))]

理想的基学习器将在分布D_t下最小化分类误差。

Boosting 算法要求基学习器能对特定的数据分布进行学习,这可通过重赋权法实施。对无法接受带权样本的基学习算法,可通过重采样法来处理。从偏差-方差分解的角度看,Boosting主要关注于降低偏差,因此 Boosting 能基于泛化性能相当弱的学习器构建出很强的集成。

三、Bagging和随机森林

1.Bagging

它是并行式集成学习方法最重要的代表,其直接基于自助采样法。训练一个Bagging集成与直接使用基学习算法训练一个学习器的复杂度同阶。其次Bagging可以不经修改的直接用于多分类、回归等任务。其次还有一个优点就是由于每个基学习器只使用初始训练集中约63.2% 的样本,剩下 36.8% 的样本可用作验证集来对泛化性能进行包外估计。

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

2.随机森林

随机森林(RF)是Bagging的一个扩展变体,RF在以决策树为基学习器构建Bagging的基础之上,进一步在决策树的训练过程中引入了随机属性的选择。随机森林简单、容易实现、计算开销小,在很多现实任务中展现出很强的性能。随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。

其收敛性和Bagging相似,随机森林的训练效率常优于Bagging,因为在个体决策树的构建过程中 Bagging 使用的是确定型决策树,在选择划分属性时要对结点的所有属性进行考察;而随机森林使用的随机型决策树则只需考察一个属性子集。

四、策略

学习器结合会从三个方面带来好处,从统计方面,结合多个学习器可以降低误选而导致的泛化性能不佳;从计算方面,可以降低陷入糟糕局部极小点的风险;从表示方面,可以学的更好的相似。如下图所示:

下面是几种对学习器进行结合的常见策略

1.平均法

 对于数值型的输入最常见的方法就是平均法,分为简单平均法和加权平均法。加权平均法的表达式为H(x)=\sum_{i=1}^{T}w_ih_i(x),简单平均法是加权平均法的w_i为1/T的特例。加权平均法可认为是集成学习研究的基本出发点,对给定的基学习器,不同的集成学习方法可视为通过不同的方式来 确定加权平均法中的基学习器权重。

其权重一般从训练数据中学习得到的。在个体学习器性能相差较大时使用加权平均法,而在个体学习器性能相近时宜使用简单平均法.

2.投票法

对于分类任务,最常见的结合策略是使用投票法。其中分别有绝对多数投票法、相对多数投票法和加权投票法。标准的绝对多数投票法提供了拒绝预测选项,其在可靠性要求高的学习任务中是一个很好的机制。

在现实任务中,不同类型的个体学习器可能产生不同类型的h_i^j(x)值。常见的有:

  • 类标记:h_i^j(x)\in \left \{ 0,1 \right \},若h_i将样本x预测为类别c_j则取值为1,否则为0,使用类标记的投票叫做硬投票。
  • 类概率:h_i^j(x)\in [0,1 ],相当于对后验概率的一个估计,使用类概率的投票叫做软投票。

3.学习法

当训练数据很多时,可以使用学习法,即通过另一个学习器来结合。Stacking时学习法的代表。把个体学习器叫做初级学习器,用于结合的学习器叫做次级学习器或者元学习器。

其先从初始数据集训练出初级学习器,然后生成一个新数据集,用于训练次级学习器。在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记。

次级学习器的输入属性表示和次级学习算法对Stacking集成的泛化性能有很大影响。将初级学习器的输出类概率作为次级学习器的输入属性,用多响应线性回归(MLR)作为次级学习算法效果较好。

贝叶斯模型平均(BMA)基于后验概率来为不同的模型赋予权重,可以视为加权平均法的一种特殊实现。Stacking 通常优于BMA,因为其鲁棒性比 BMA 更好,而且 BMA 对模型近似误差非常敏感。

五、多样性

1.误差-分歧分解

对于示例x,定义学习器的分歧为A(h_i|x)=(h_i(x)-H(x))^2,集成的分歧为:

\bar{A}(h|x)=\sum _{i=1}^{T}w_iA(h_i|x)=\sum_{i=1}^{T}w_i(h_i(x)-H(x))^2

分歧项表征了个体学习器在样本x上的不一致性,即在一定程度上反映了个体学习器的多样性。个体学习器准确性越高、多样性越大,则集成越好。 

2.多样性度量

多样性度量用于度量集成中个体分类器的多样性,即估计个体分类器的多样化程度,可以考虑个体分类器的两两相似/不相似。对于二分类任务,可以得到一个预测结果的列联表:

其中常见的多样性度量有不合度量dis_{ij}=\frac{b+c}{m},值域为[0,1] ,值越大多样性越大;相关系数\rho _{ij}=\frac{ad-bc}{\sqrt{(a+b)(a+c)(c+d)(b+d)}},值域为[-1,1],两者无关为0,正相关为正;Q-统计量Q_{ij}=\frac{ad-bc}{ad+bc};k-统计量\kappa =\frac{p_1-p_2}{1-p_2}。k-误差图是将每一对分类器作为图上的一个点,横坐标为分类器的k值,纵坐标为平均误差。

3.多样性增强

对于多样性的增强,一般的思路是在学习过程中引入随机性,常见的做法有对数据样本、输入属性、输出表示、算法参数进行扰动。

数据样本扰动通常是基于采样法,这种做法简单高效,使用最广。稳定基学习器是指对数据样本的扰动不敏感的基学习器。

输入属性扰动有著名的子空间算法,其从初始属性集中抽取出若干个属性子集,再基于每个属性子集训练一个基学习器。

输出表示扰动的基本思路是对输出表示进行操纵以增强多样性,可以对训练样本的类标记进行扰动,比如翻转法;可以对输出表示进行转化,如输出调制法。

算法参数扰动中负相关法显示地通过正则化项来强制个体神经网络使用不同的参数,对于参数较少的算法,可以通过将其学习过程中某些环节用其他类似方式代替。

实验

1.AdaBoost 决策树回归实验

下面为一个使用AdaBoost使用 AdaBoost 进行决策树回归使用 AdaBoost 进行决策树回归进行决策树回归的实验:

import numpy as np
from sklearn.ensemble import AdaBoostRegressor
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt
import seaborn as sns

rng = np.random.RandomState(1)
X = np.linspace(0, 6, 100)[:, np.newaxis]
y = np.sin(X).ravel() + np.sin(6 * X).ravel() + rng.normal(0, 0.1, X.shape[0])

regr_1 = DecisionTreeRegressor(max_depth=4)

regr_2 = AdaBoostRegressor(
    DecisionTreeRegressor(max_depth=4), n_estimators=300, random_state=rng
)

regr_1.fit(X, y)
regr_2.fit(X, y)

y_1 = regr_1.predict(X)
y_2 = regr_2.predict(X)

colors = sns.color_palette("colorblind")

plt.figure()
plt.scatter(X, y, color=colors[0], label="training samples")
plt.plot(X, y_1, color=colors[1], label="n_estimators=1", linewidth=2)
plt.plot(X, y_2, color=colors[2], label="n_estimators=300", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Boosted Decision Tree Regression")
plt.legend()
plt.show()

结果为:

主要使用了sklearn的一些库函数来实现,最后使用plt来将结果可视化出来。 

2.偏差-方差分解实验

代码为:

import matplotlib.pyplot as plt
import numpy as np

from sklearn.ensemble import BaggingRegressor
from sklearn.tree import DecisionTreeRegressor

# Settings
n_repeat = 50  # Number of iterations for computing expectations
n_train = 50  # Size of the training set
n_test = 1000  # Size of the test set
noise = 0.1  # Standard deviation of the noise
np.random.seed(0)

# Change this for exploring the bias-variance decomposition of other
# estimators. This should work well for estimators with high variance (e.g.,
# decision trees or KNN), but poorly for estimators with low variance (e.g.,
# linear models).
estimators = [
    ("Tree", DecisionTreeRegressor()),
    ("Bagging(Tree)", BaggingRegressor(DecisionTreeRegressor())),
]

n_estimators = len(estimators)


# Generate data
def f(x):
    x = x.ravel()

    return np.exp(-(x**2)) + 1.5 * np.exp(-((x - 2) ** 2))


def generate(n_samples, noise, n_repeat=1):
    X = np.random.rand(n_samples) * 10 - 5
    X = np.sort(X)

    if n_repeat == 1:
        y = f(X) + np.random.normal(0.0, noise, n_samples)
    else:
        y = np.zeros((n_samples, n_repeat))

        for i in range(n_repeat):
            y[:, i] = f(X) + np.random.normal(0.0, noise, n_samples)

    X = X.reshape((n_samples, 1))

    return X, y


X_train = []
y_train = []

for i in range(n_repeat):
    X, y = generate(n_samples=n_train, noise=noise)
    X_train.append(X)
    y_train.append(y)

X_test, y_test = generate(n_samples=n_test, noise=noise, n_repeat=n_repeat)

plt.figure(figsize=(10, 8))

# Loop over estimators to compare
for n, (name, estimator) in enumerate(estimators):
    # Compute predictions
    y_predict = np.zeros((n_test, n_repeat))

    for i in range(n_repeat):
        estimator.fit(X_train[i], y_train[i])
        y_predict[:, i] = estimator.predict(X_test)

    # Bias^2 + Variance + Noise decomposition of the mean squared error
    y_error = np.zeros(n_test)

    for i in range(n_repeat):
        for j in range(n_repeat):
            y_error += (y_test[:, j] - y_predict[:, i]) ** 2

    y_error /= n_repeat * n_repeat

    y_noise = np.var(y_test, axis=1)
    y_bias = (f(X_test) - np.mean(y_predict, axis=1)) ** 2
    y_var = np.var(y_predict, axis=1)

    print(
        "{0}: {1:.4f} (error) = {2:.4f} (bias^2) "
        " + {3:.4f} (var) + {4:.4f} (noise)".format(
            name, np.mean(y_error), np.mean(y_bias), np.mean(y_var), np.mean(y_noise)
        )
    )

    # Plot figures
    plt.subplot(2, n_estimators, n + 1)
    plt.plot(X_test, f(X_test), "b", label="$f(x)$")
    plt.plot(X_train[0], y_train[0], ".b", label="LS ~ $y = f(x)+noise$")

    for i in range(n_repeat):
        if i == 0:
            plt.plot(X_test, y_predict[:, i], "r", label=r"$\^y(x)$")
        else:
            plt.plot(X_test, y_predict[:, i], "r", alpha=0.05)

    plt.plot(X_test, np.mean(y_predict, axis=1), "c", label=r"$\mathbb{E}_{LS} \^y(x)$")

    plt.xlim([-5, 5])
    plt.title(name)

    if n == n_estimators - 1:
        plt.legend(loc=(1.1, 0.5))

    plt.subplot(2, n_estimators, n_estimators + n + 1)
    plt.plot(X_test, y_error, "r", label="$error(x)$")
    plt.plot(X_test, y_bias, "b", label="$bias^2(x)$"),
    plt.plot(X_test, y_var, "g", label="$variance(x)$"),
    plt.plot(X_test, y_noise, "c", label="$noise(x)$")

    plt.xlim([-5, 5])
    plt.ylim([0, 0.1])

    if n == n_estimators - 1:
        plt.legend(loc=(1.1, 0.5))

plt.subplots_adjust(right=0.75)
plt.show()

结果为:

该实验说明并比较了单个估计器与bagging集成的期望均方误差的偏差-方差分解。在回归分析中,估计量的期望均方误差可以用偏差、方差和噪声进行分解。方差项衡量的是估计器在拟合同一问题的不同随机实例时预测的可变性。左上角的图展示了在随机数据集LS上训练的单个决策树对一维回归问题的预测。左下角的图绘制了单个决策树的期望均方误差的逐点分解。右侧图像对应于左侧的图,但使用的是bagging决策树集合。

总结

本章主要介绍了集成相关的知识,集成学习是机器学习领域的一项重要技术,它通过组合多个基学习器来提升整体模型的性能。集成学习是一种机器学习范式,它通过构建并结合多个基学习器来完成学习任务。这些基学习器在单独使用时的性能可能不如最优的单一学习器,但通过某种策略将它们结合起来后,可以获得比单一学习器显著优越的泛化性能。这就是集成的目的之一。

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值