【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 章:混合组合 的相关文章

  • wmic命令学习

    我目前知道wmic可以查询进程 还可以查询服务 查询进程使用wmic process 如果想知道进程的名字 进程号 执行文件路径可以通过get来获取 还可以根据where筛选进程进行查询 wmic process get name proc
  • 本地镜像发布到私有库

    情景 涉及机密的文件 公司不可能提供镜像给公网 所以需要创建一个私有仓库用于存放敏感的镜像 Docker Registry帮助我们搭建私有的仓库供团队使用 相当于一个私有的hub仓库 本地拉取registry镜像 运行私有库 相当于自己本地
  • 11年做安卓开发至今,我失业了,我跟CSDN的缘分

    今天来写篇自己的文章 自己工作的文章 11年毕业到现在 我彻底失业了 是真的失业了 不过失业我觉得没什么可怕 至少干了这些年 也攒下了一些生活费 至少饿不死就行了 我失业也是因为自己有业 并不害怕 从11年做开发 那个时候就边做开发 边思考
  • Java代码判断当前操作系统是Windows或Linux或MacOS

    package com magic system public class SystemUtils 判断操作系统是否是 Windows return true 操作系统是 Windows false 其它操作系统 public static
  • 微信支付的收款功能被限制了怎么办,收款受限制怎么解除?

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

    kettle同步数据时会将空字符串 自动转换为 null 如果表字段非空则会报错 解决方案如下 方案一 kettle菜单栏 编辑 编辑kettle properties文件 配置项 KETTLE EMPTY STRING DIFFERS F
  • jvm 远程调试配置

    jstatd方式 创建配置文件 随便找个目录就可以 cat gt jstatd policy grant codebase file java home lib tools jar permission java security AllP
  • Python安全攻防之第二章Python语言基础

    2 3 Python模块的安装与使用 python模块的安装 pip3 install 模块名称 py 3 m pip install 模块名称 python模块的导入与使用 1 Import模块名称 采用 Import模块名称 方式时 需
  • 什么是Java?

    刚开始学习Java时 对于老师讲述的Java的发展历程毫无兴趣 觉得只要会用就行了 直到有一天我的朋友突然问我 你们学的Java是什么呀 面对他突如其来的问题 我一下有点不知所措 刚想开口却又不知道说些什么 只能慢慢的吐出那几个字 一门编程
  • 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
  • Nginx基础03:配置文件nginx.conf(Part2)

    上一篇文章概述与罗列了 全局配置块 events配置块 http全局块 的基本配置与属性 本篇文章将继续深入server块的配置项 以及相关应用 上篇文章地址 Nginx基础02 配置文件nginx conf Part1 如何使用本篇文章
  • 【路径规划】基于A*算法和Dijkstra算法的路径规划(Python代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码实现 1 概述 Dijkstr
  • C4D和3dmax有什么区别?

    很多小伙伴都知道3d Max和C4D都是一款三维制作软件 可是 很少见到游戏公司使用C4D软件制作模型呢 反而设计师们用的最多的就是3dmax 而C4D往往用于广告行业 那么C4D和3d max的区别是什么呢 一 性质不同 1 3Dmax
  • 数字后端知识点扫盲——后端设计流程及使用工具

    1 DFT Design For Test 可测性设计 芯片每一步往往都自带测试电路 DFT的目的就是在设计的时候就考虑将来的测试 DFT的常见方法是 在设计中插入scan chain 将非扫描单元 如寄存器 变为扫描单元 DFT工具是sy
  • Linux命令·rm

    linux中删除文件和目录的命令 rm命令 rm是常用的命令 该命令的功能为删除一个目录中的一个或多个文件或目录 它也可以将某个目录及其下的所有文件及子目录均删除 对于链接文件 只是删除了链接 原有文件均保持不变 rm是一个危险的命令 使用
  • 通过微信小程序实现登录功能

    后端服务器可以在CSDN上开通 价格优惠 CSDN开发云 https img home csdnimg cn images 20220518054835 png https dev csdn net activity utm source
  • Nim 游戏

    你和你的朋友 两个人一起玩 Nim 游戏 桌子上有一堆石头 你们轮流进行自己的回合 你作为先手 每一回合 轮到的人拿掉 1 3 块石头 拿掉最后一块石头的人就是获胜者 假设你们每一步都是最优解 请编写一个函数 来判断你是否可以在给定石头数量
  • Adobe软件还行吗?

    前段时间 美国政府 准备通过诉讼阻止Adobe去年公布的 以200亿美元收购Figma的交易 理由是此举属于反竞争行为 新闻一出 Adobe股价旋即下跌 但跌幅并不像2022年刚公布这笔交易时那么迅猛 看起来 相较于收购成功 投资者们反而希
  • 多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!

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

    厚积才能薄发 一个优秀的设计师的天性一定是想要获得更多网站设计灵感 擅于为新项目寻找创意切入点 搜索设计参考资源 最新的设计趋势 今天为大家带来了一组免费可商用的网站设计案例 通过这些网站设计案例 你可以获得 寻找不同风格的网站灵感 配色

随机推荐