【Ensemble Learning】第 4 章:混合组合

2023-11-10

在前面的章节中,我们讨论了如何混合训练数据,以及如何混合机器学习模型来创建更强大的模型——利用集成学习的力量。

让我们继续这个学习过程。在本章中,我们介绍并解释了两种强大的集成学习技术,它们利用机器学习模型的混合组合来构建更强大的模型。我们一次处理一个不同的组合。

以下是本章的目标。

  • 介绍和解释boosting

  • 检查如何使用 scikit-learn 实现提升

  • 介绍和解释堆叠

  • 检查如何使用 scikit-learn 实现提升

  • 看看其他混合组合的例子

Boosting

让我们通过学习过程的类比来开始讨论提升。假设你希望一个班级的学生在所有科目上都表现出色,但有些学生在单元测试中表现不佳。我们可以识别这些学生,并更加强调他们得分较低的科目,以便他们与其他学生相提并论。为了提供更多的重点,我们通过增加课程和分配额外的时间来解决学生的薄弱环节来调整学习过程。这可确保学生在所有科目中的整体表现更好。

让我们对机器学习进行同样的类比。我们从一组学习者开始。每个 ML 学习器都接受训练对象的特定子集的训练。如果模型学习者的表现较差,我们可以更加重视该特定学习者。这被称为提升

首先,让我们讨论一种最简单但最重要的增强技术,AdaBoost。

AdaBoost

为了更好地理解AdaBoost,请查看图4-1。最初使用模型分类器训练数据。红框内的数据子集为误分类数据;而绿色框代表正确分类的数据。

为了提高模型的性能,我们不是对分类器模型中的所有数据赋予相同的权重,而是增加错误分类数据的权重并再次运行训练。由于我们增加了错误分类的数据点/观察的权重,在下一次迭代中,它们具有更高的正确分类概率,因为模型将更加重视这些数据点。我们重复这个过程直到n次迭代,当我们达到我们想要的模型性能时。这些弱分类学习器的组合使用投票(见图4-2)来获得最终模型。请注意,这通常优于非常复杂的技术。

总之,为了提高效率,我们可以更新错误分类的观察值的权重。略微增加错误分类的观察值的权重有助于提高下一次迭代中正确分类的观察值的数量。通过重复这些迭代,我们可以从一个非常弱的分类器中得到一个高质量的分类器。即使我们使用性能较弱的机器学习模型,我们也可以提高输出结果。

图 4-1 AdaBoost提升

图 4-2 AdaBoost boosting中 n 个学习者的投票

清单4-1显示了如何将 AdaBoost 与 scikit-learn 库一起使用。

默认情况下,scikit-learn 使用基本学习器作为最大深度 = 1的决策树分类器。为了制作 AdaBoost分类器,我们传递了一个附加参数 n_estimators(在此示例中,n_estimators = 100)。AdaBoost 在基础学习器的每个额外提升权重副本上运行,直到存在完美的数据拟合或达到 n_estimators 限制。最多,它将创建 100 个我们的基本决策树学习器副本,每个副本都有提升的权重。

您可以在https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html阅读更多关于 scikit-learn 中 AdaBoost 分类器的不同参数的信息。

from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.ensemble import AdaBoostClassifier
X, y = load_iris(return_X_y=True)
clf = AdaBoostClassifier(n_estimators=100)
scores = cross_val_score(clf, X, y, cv=5)
print(scores.mean())
# Output: 0.9466...

清单 4-1 AdaBoost 使用scikit-learn

梯度提升

梯度提升类似于一般的提升方法。您需要迭代地增加或提升弱学习器。与 AdaBoost 不同,在 AdaBoost 中,您在增加分类不当的观察值的权重后添加一个新学习器,而在梯度提升中,您可以根据先前预测器产生的残差训练一个新模型。如果这没有意义,请不要担心。让我们看一个例子。

首先,尝试理解残差 的概念。图4-3是一个示例数据集。X0 到 X3 是特征/变量,Y 是基本事实或目标值。

图 4-3 残留误差

现在让我们假设在这个数据集上有一个训练有素的简单决策,深度很低(弱学习者)。训练完成后,我们的决策树上的预测/推断列在 Pred 列中。

每个观察的每个输出与机器学习模型的预测输出之间的差异称为残差 。在图4-3中,Error 列表示残差字段。

在基于梯度的增强方法中,您学习了一个新的分类器;您不是将特征 X0 到 X3,而是将先前分类器的残差作为训练新模型的新目标 (YNew)。

让我们总结一下到目前为止讨论的所有步骤。

1.在训练集上使用决策树回归器。

2.对第一个的残差使用第二个决策树回归器。

3.在第二个的残差上使用第三个决策树回归器。

您现在拥有一个包含三棵树的集成,您可以通过对所有树的预测求和来对新实例进行预测。

该算法的输出如图4-4所示。

图 4-4 残留误差(续)

清单4-2是在scikit-learn 库中使用梯度提升的示例代码。默认情况下,scikit-learn 使用基本学习器作为最大深度 = 1 的决策树分类器。

您可以在https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html阅读有关scikit-learn 中梯度提升分类器参数的更多信息。

from sklearn.datasets import make_hastie_10_2
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import cross_val_score
X, y = make_hastie_10_2(random_state=0)
clf = GradientBoostingClassifier(
   n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0
).fit(X, y)
scores = cross_val_score(clf, X, y, cv=5)
print(scores.mean())
# Output: 0.9225

清单 4-2 使用scikit-learn 进行梯度提升

XGBoost

XGBoost 是一种最先进的算法和软件系统,专门研究残差梯度提升技术。它通过添加以下参数改进了香草梯度提升技术(我们不会详细介绍)。

  • 它动态确定用作弱学习器的决策树的深度,并为深度较高的预防树添加惩罚参数。这可以防止过度拟合并提高性能。

  • 它使用树上叶节点的比例收缩。

  • 它添加了随机化参数以实现最佳学习。

清单4-3是将 XGBoost 与 scikit-learn 和 XGBoost 库结合使用的示例代码。

XGBoost 库的文档位于https://xgboost.readthedocs.io/en/latest/

XGBoost 的官方 GitHub 页面位于https://github.com/dmlc/xgboost/。您可以在其中找到分类和回归问题中的各种代码示例。

提示

要在 Anaconda Python 3.7 版中轻松安装 XGBoost 库,请使用以下命令:conda install -c conda-forge xgboost

import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
# 读入数据
iris = load_breast_cancer()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 将 DMatrix 用于 xgbosot
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)
# 设置 xgboost 参数
param = {
   'max_depth': 5,  # 每棵树的最大深度
   'eta': 0.3,  # 每次迭代的训练步骤
   'silent': 1,  # 日志记录模式 - 安静
   'objective': 'multi:softprob',  # 多类训练的错误评估
   'num_class': 3}  # 该数据集中存在的类数
num_round = 200  # 训练迭代次数
bst = xgb.train(param, dtrain, num_round)
# 做出预测
preds = bst.predict(dtest)
preds_rounded = np.argmax(preds, axis=1)
print(accuracy_score(y_test, preds_rounded))
# Output: 0.9649122807017544

清单 4-3 使用 scikit-learn 和 XGBoost 库的乳腺癌数据集 XGBoost 示例

Stacking

堆叠是一种与混合组合略有不同的方式。

在这种集成技术中,我们首先一起训练多个模型(基础学习 器)以获得预测。在堆叠中,各个预测的结果随后被视为下一个训练数据,并以称为元学习 器的另一层的形式添加(见图4-5)。

您可以将此技术视为将一层机器学习学习器堆叠在另一个机器学习学习器之上。

想象一下,您正在参加电视游戏节目,必须回答一个历史问题。您向您的两个朋友寻求帮助;一个是历史专业,另一个是计算机科学专业。你更相信谁能给出正确答案?您的知识使您能够更加信任您的历史朋友的回答(或者从技术上讲,为潜在的学习者之一提供更高的价值)。

堆叠基于相同的想法:我们不是使用简单的函数 (例如硬投票)来聚合集成中所有学习者的预测,而是训练一个模型来执行这种聚合。让我们看一个例子来更好地理解这一点。

图 4-5 Stacking

清单4-4是在 scikit-learn 库中使用堆叠的示例代码。此外,如果您想将堆栈应用于任何回归问题,您可以借助清单4-5,我们在其中使用 scikit 学习库来处理回归问题。

您可以从https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.StackingClassifier.html的参考页面阅读更多关于scikit-learn中堆叠分类器的不同参数的信息。

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import LinearSVC
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.ensemble import StackingClassifier
X, y = load_iris(return_X_y=True)
estimators = [
   ("rf", RandomForestClassifier(n_estimators=10, random_state=42)),
   ("svr", make_pipeline(StandardScaler(), LinearSVC(random_state=42))),
]
clf = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression())
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
clf.fit(X_train, y_train).score(X_test, y_test)
# Output: 0.9…

清单 4-4 使用 scikit-learn 的堆叠分类器

from sklearn.datasets import load_diabetes
from sklearn.linear_model import RidgeCV
from sklearn.svm import LinearSVR
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import StackingRegressor
X, y = load_diabetes(return_X_y=True)
estimators = [("lr", RidgeCV()), ("svr", LinearSVR(random_state=42))]
reg = StackingRegressor(
   estimators=estimators,
   final_estimator=RandomForestRegressor(n_estimators=10, random_state=42),
)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
reg.fit(X_train, y_train).score(X_test, y_test)
# Output: 0.3...

清单 4-5 用 scikit-learn 进行堆叠回归

概括

让我们快速回顾一下本章所涵盖的内容。

  • 结合合奏

  • 重要的组合技巧:boosting 和 stacking

  • 各种提升技术,包括 AdaBoost、梯度提升和 XGBoost

  • Stacking 将一组集成学习器添加到其他学习器之上,形成元学习器

  • 使用 scikit-learn 中的代码示例堆叠分类和回归问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Ensemble Learning】第 4 章:混合组合 的相关文章

  • SpringBoot集成Swagger4

    Swagger是一种工具 可以帮助开发人员设计 构建 文档化和测试 RESTful Web 服务 Swagger提供了一种交互式文档格式 可以使用它来了解 API 的用法 参数 返回值等等 Spring Boot提供了集成Swagger的简
  • 代码随想录算法训练营第一天

    Leetcode704 二分查找 题目链接 关键词 二分查找 循环不变量 区间 问题思路 二分查找的应用 关键在于循环过程中区间的维护 记住循环不变量原则 在这个问题中循环不变量是区间的定义 注意左闭右开和左开右闭的区别 class Sol
  • 含分布式电源的配电网日前两阶段优化调度模型(Matlab代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 文献来源 4 Matlab代码 数据 文章讲解 1 概述 文
  • 互联网产品上线流程,及面试题分类

    一 基础情况 问题1 自我介绍 3mins 与自我介绍 1min 问题2 为什么你要来这个行业 问题3 为什么你要来这个岗位 问题4 为什么你能胜任这份工作 问题5 为什么你要离职 问题6 过往经历STAR故事描述 问题7 你的职业规划是什
  • 【100%通过率 】【华为OD机试真题 c++ 】最大数字【 2023 Q1 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 给定一个由纯数字组成以字符串表示的数值 现要求字符串中的每个数字最多只能出现2次 超过的需要进行删除 删除某个重复的数字后 其它数字相对位置保持
  • 解决ubuntu远程ssh连接不了问题

    安装openssh server sudo apt get install openssh server 在 etc ssh目录下 vim sshd config 发现该文件只可读 在终端输入命令 sudo passwd 然后输入当前用户的
  • 机器学习之集成学习(实验记录)

    集成学习实验任务 一 实验目标 二 实验内容 三 实验任务及步骤 四 实验总结 一 实验目标 了解集成学习的基本结构 训练方法 实现方法 并通过随机森林与Adaboost算法加深理解 二 实验内容 概念 集成学习 Ensemble lear
  • Allegro使用总结-查看Layout基本操作:

    好久没用CSDN写过笔记了 没想到无意间打开 编辑器更新啦 以前巨难用的 富文本编辑器 终于改观了 变的好像语雀 1 视图 画面操作 a 画面缩放 Zoom F11 F12 或 鼠标滚轮 补充 Zoom分辨率调节 Setup user pr
  • 微信支付的收款功能被限制了怎么办,收款受限制怎么解除?

    使用小程序做电商 商城的微信支付的收款功能会遇到被限制的情况 直接影响用户下单后的付款操作 其实也不单单是小程序 商城APP中也会冒出类似的提示 遇到这种事情不要慌 根据具体的异常提示给出不同的解决方案 微信支付被限制的错误提示 我们列举两
  • C语言实现推箱子小游戏

    一 设计目的 用简单的C语言知识制作的推箱子游戏 通过上下左右键将所有箱子移动到目标位置 2 让我们更好地了解和巩固C语言知识 并实际运用 同时运用一些不太常见的知识点 二 功能描述 1 模块功能 本程序可分为初始界面 进行游戏 判定通关三
  • 【INS-30014】无法检查指定的位置是否位于CFS上的解决办法

    安装oracle数据库过程中 出现 INS 30014 无法检查指定的位置是否位于CFS上的解决办法如下 安装过程中 选择 仅安装数据库软件 在安装成功后 使用DBCA工具创建以及配置数据库即可
  • 业务流程图怎么画?3步+8张案例,5分钟教你快速上手!

    业务流程图能很好地帮助我们梳理业务 高效表达需求 尤其是产品经理在梳理业务时 经常会用到业务流程图 业务流程图会在产品经理画原型图前 帮助梳理产品业务流程 避免做无用功 今天从业务历程图的基本介绍 常用场景和绘制方法三方面介绍 让大家对业务
  • Anaconda + jupyter notebook + jupyter lab环境配置

    1 更换源 1 1 pip源 pip config set global index url https pypi tuna tsinghua edu cn simple pip config set install trusted hos
  • Linux命令·rm

    linux中删除文件和目录的命令 rm命令 rm是常用的命令 该命令的功能为删除一个目录中的一个或多个文件或目录 它也可以将某个目录及其下的所有文件及子目录均删除 对于链接文件 只是删除了链接 原有文件均保持不变 rm是一个危险的命令 使用
  • STM32 HAL——GPIO

    HAL的代码规范建议 以下内容是我自己参照HAL做的总结 如果公司有固定的编码规范 就跟公司保持一致 如果没有 那就推荐和所用库保持一致 注意 因人而异 并不具有普遍适用性 HAL库有如下代码规范 1 目录名除了专有词汇外 统一是单词首字母
  • Qt的基本语法及其使用(一)

    Qt的概念 Qt是通用的C 开发界面框架 C 图形用户界面 应用程序开发框架 既可以开发GUI程序也可以开发开发非GUI程序 Qt是面向对象的框架 使用特殊的代码生成扩展 Qt的历史 1991由QT公司研发 2008年被诺基亚收购 2012
  • Git clone 时 出现SSL certificate problem error

    出现这个问题的原因是本地默认开启了SSL认证 但是在本地找不到SSL证书 解决办法就是关掉 SLL认证 git clone 时加上参数 no ssl check 完整的命令应该是 git clone no ssl check https g
  • 【CV with Pytorch】第 7 章 :图像异常检测

    机器学习的研究使我们进入了研究各种模式和行为的过程 它使我们能够构建可以研究封闭环境的模型 预测能力通常遵循模型训练过程 这是我们在训练模型时需要经常问的一个重要问题 还有另一个问题需要回答 多少数据足以帮助模型理解分布 以便我们有一个好的
  • Nim 游戏

    你和你的朋友 两个人一起玩 Nim 游戏 桌子上有一堆石头 你们轮流进行自己的回合 你作为先手 每一回合 轮到的人拿掉 1 3 块石头 拿掉最后一块石头的人就是获胜者 假设你们每一步都是最优解 请编写一个函数 来判断你是否可以在给定石头数量
  • 多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

    背景介绍 1 最近有一个大数据量插入的操作入库的业务场景 需要先做一些其他修改操作 然后在执行插入操作 由于插入数据可能会很多 用到多线程去拆分数据并行处理来提高响应时间 如果有一个线程执行失败 则全部回滚 2 在spring中可以使用 T

随机推荐