【机器学习】(西瓜书习题8.5)编程实现Bagging模型,以决策树桩为基学习器,在西瓜数据集3.0a上训练一个Bagging集成,并与教材图8.6进行比较。

news2025/1/18 7:03:57

1)问题理解与分析

编程实现Bagging模型,以决策树桩为基学习器,在西瓜数据集3.0a上训练一个Bagging集成,并与教材图8.6进行比较。

2Bagging算法原理阐述

若想得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立;虽然 “独立” 在现实任务中无法做到,但可以设法使基学习器尽可能具有较大的差异。给定一个训练数据集,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器。这样,由于训练数据不同,我们获得的基学习器可望具有比较大的差异。然而,为获得好的集成,我们同时还希望个体学习器不能太差。如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分训练数据,甚至不足以进行有效学习,这显然无法确保产生出比较好的基学习器。为解决这个问题,我们可考虑使用相互有交叠的采样子集。

Bagging是并行式集成学习方法最著名的代表。从名字即可看出,它直接基于自助采样法(bootstrap sampling)。给定包含m个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过m次随机采样操作,我们得到含m个样本的采样集,初始训练集中有的样本在采样集里多次出现,有的则从未出现。可以做一个简单的估计,初始训练集中约有36.8%的样本未出现在采样集中,约有63.2%的样本出现在采样集中。照这样,我们可采样出T个含m个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。这就是Bagging的基本流程。在对预测输出进行结合时,Bagging通常对分类任务使用简单投票法,对回归任务使用简单平均法。若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者。

3Bagging算法设计思路

Bagging集成模型流程图如下:

4Bagging实验流程分析

Bagging集成模型伪代码描述如下:

 

5)实验数据的选择(训练集和测试集划分)、实验结果展示、优化与分析

本实验使用的数据集是西瓜数据集3.0,只使用连续型属性。题目要求采用的基学习器是决策树桩,本身偏差较大,并且Bagging集成只有降低方差的效果,对于偏差并无改善,所以集成后的训练误差仍然很低,于是将基学习器改为完整决策树。当基学习器数量为3时,我的结果与周志华《机器学习》(西瓜书)对比如下:

 

前者17个样本预测正确16个,正确率为94.1%;后者17个样本预测正确16个,正确率94.1%。

当基学习器数量为5时,我的结果与周志华《机器学习》(西瓜书)对比如下:

 

 

前者17个样本预测正确16个,正确率为94.1%;后者17个样本预测正确17个,正确率100%。

当基学习器数量为11时,我的结果与周志华《机器学习》(西瓜书)对比如下:

 

前者17个样本预测正确17个,正确率为100%;后者17个样本预测正确17个,正确率100%。

6)代码结构注释、核心源代码简要分析

Bagging集成模型核心代码如下。列表H保存各个基学习器,H_pre存储每次迭代后H对于训练集的预测结果,error保存每次迭代后H的训练误差。

T = 20
H = []  
m = len(Y)
H_pre = np.zeros(m)  
error = []  
for t in range(T):
    boot_strap_sampling = np.random.randint(0, m, m)
    Xbs = X[boot_strap_sampling]
    Ybs = Y[boot_strap_sampling]
    h = tree.DecisionTreeClassifier().fit(Xbs, Ybs)
    H.append(h)
    # 计算并存储当前步的训练误差
    H_pre += h.predict(X)
    Y_pre = (H_pre >= 0) * 2 - 1
    error.append(sum(Y_pre != Y) / m)

def predict(H, X1, X2):
    # 预测结果
    # 仅X1和X2两个特征,X1和X2同维度
    X = np.c_[X1.reshape(-1, 1), X2.reshape(-1, 1)]
    Y_pre = np.zeros(len(X))
    for h in H:
        Y_pre += h.predict(X)
    Y_pre = 2 * (Y_pre >= 0) - 1
    Y_pre = Y_pre.reshape(X1.shape)
    return Y_pre

7)本次实验解决的主要问题、在理论学习与动手编程上的主要收获

在本次实验中,我编程实现了Bagging集成模型,并与AdaBoost集成模型进行了对比。在样本选择上,Bagging的训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的,而Boosting每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化,而权值是根据上一轮的分类结果进行调整。Bagging使用均匀取样,每个样例的权重相等,Boosting根据错误率不断调整样例的权值,错误率越大则权重越大。Bagging的所有预测函数的权重相等,Boosting的每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。Bagging的各个预测函数可以并行生成,Boosting的各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

完整代码:

# -*- coding: utf-8 -*-
"""
前面采用决策树桩来进行Bagging集成,效果较差,
现在改用全决策树full-tree来集成,观察效果。
全决策树算法不再自编,直接采用sklearn工具。
"""

import numpy as np
import matplotlib.pyplot as plt
from sklearn import tree

# 设置出图显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def predict(H, X1, X2):
    # 预测结果
    # 仅X1和X2两个特征,X1和X2同维度
    X = np.c_[X1.reshape(-1, 1), X2.reshape(-1, 1)]
    Y_pre = np.zeros(len(X))
    for h in H:
        Y_pre += h.predict(X)
    Y_pre = 2 * (Y_pre >= 0) - 1
    Y_pre = Y_pre.reshape(X1.shape)
    return Y_pre

# >>>>>西瓜数据集3.0α
X = np.array([[0.697, 0.46], [0.774, 0.376], [0.634, 0.264], [0.608, 0.318], [0.556, 0.215],
              [0.403, 0.237], [0.481, 0.149], [0.437, 0.211], [0.666, 0.091], [0.243, 0.267],
              [0.245, 0.057], [0.343, 0.099], [0.639, 0.161], [0.657, 0.198], [0.36, 0.37],
              [0.593, 0.042], [0.719, 0.103]])
Y = np.array([1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1])

# >>>>>Bagging
T = 20
H = []  # 存储各个决策树桩,每行表示#划分特征,划分点,左枝取值,右枝取值
m = len(Y)
H_pre = np.zeros(m)  # 存储每次迭代后H对于训练集的预测结果
error = []  # 存储每次迭代后H的训练误差
for t in range(T):
    boot_strap_sampling = np.random.randint(0, m, m)
    Xbs = X[boot_strap_sampling]
    Ybs = Y[boot_strap_sampling]
    h = tree.DecisionTreeClassifier().fit(Xbs, Ybs)
    H.append(h)
    # 计算并存储当前步的训练误差
    H_pre += h.predict(X)
    Y_pre = (H_pre >= 0) * 2 - 1
    error.append(sum(Y_pre != Y) / m)

# >>>>>绘制训练误差变化曲线
plt.title('训练误差的变化')
plt.plot(range(1, T + 1), error, 'o-', markersize=2)
plt.xlabel('基学习器个数')
plt.ylabel('错误率')
plt.show()

# >>>>>观察结果
x1min, x1max = X[:, 0].min(), X[:, 0].max()
x2min, x2max = X[:, 1].min(), X[:, 1].max()
x1 = np.linspace(x1min - (x1max - x1min) * 0.2, x1max + (x1max - x1min) * 0.2, 100)
x2 = np.linspace(x2min - (x2max - x2min) * 0.2, x2max + (x2max - x2min) * 0.2, 100)
X1, X2 = np.meshgrid(x1, x2)

for t in [3, 5, 11]:
    plt.title('前%d个基学习器' % t)
    plt.xlabel('密度')
    plt.ylabel('含糖量')
    # 画样本数据点
    plt.scatter(X[Y == 1, 0], X[Y == 1, 1], marker='p', c='b', s=100, label='好瓜')
    plt.scatter(X[Y == -1, 0], X[Y == -1, 1], marker='*', c='green', s=100, label='坏瓜')
    plt.legend()
    # 画基学习器划分边界
    for i in range(t):
        # 由于sklearn.tree类中将决策树的结构参数封装于内部,
        # 不方便提取,这里采用一个笨办法:
        # 用predict方法对区域内所有数据点(100×100)进行预测,
        # 然后再用plt.contour的方法来找出划分边界
        Ypre = predict([H[i]], X1, X2)
        plt.contour(X1, X2, Ypre, colors='k', linewidths=1, levels=[0])
    # 画集成学习器划分边界
    Ypre = predict(H[:t], X1, X2)
    plt.contour(X1, X2, Ypre, colors='r', linewidths=5, levels=[0])
    plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178124.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6、算术运算符与算术表达式

目录 一、算术运算符 二、算术表达式 三、优先级与结合性 1. 算术运算符的优先级 2. 算术运算符的结合性 四、自增/自减运算符 一、算术运算符 算术运算符包括两个单目运算符(正和负)和5个双目运算符(即乘法、除法、取模、…

ARP渗透与攻防(六)之限制网速攻击

系列文章 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 ARP渗透与攻防(三)之流量分析 ARP渗透与攻防(四)之WireShark截获用户数据 ARP渗透与攻防(五)之Ettercap劫持用户流量 ARP限制网速攻击 大家没想到吧,ARP还能限制对方网速。当kali欺骗了网关和受…

Linux-Ubuntu入门到精通之常用终端指令之操作文件目录和文件内容(2)

常用的终端命令 ctrl shift 放大终端窗口的字体显示 ctrl - 缩小终端窗口的字体显示 按 上/下 光标键可以在曾经使用过的命令之间来回切换 如果想要退出选择,并且不想执行当前选中的命令,可以按 ctrl c . ls 常用选项(白色…

DFS(四)39. 组合总和 1079. 活字印刷

39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复…

flowable定时任务和表单

流程定义定时激活 : act_re_procdef 的 suspension_status ClassPathResource classPathResource new ClassPathResource("hehe/HistoryDemo01.bpmn20.xml");repositoryService.createDeployment().addInputStream(classPathResource.getFilename(),clas…

【HBase入门】3. HBase数据模型

简介 在HBASE中,数据存储在具有行和列的表中。这是看起来关系数据库(RDBMS)一样,但将HBASE表看成是多个维度的Map结构更容易理解。 { “zzzzz” : “woot”, “xyz” : “hello”, “aaaab” : “world”, “1” : “x”, “aaaaa” : “y” } 术语 表…

MCAL系列介绍05-ICU

本文框架1. 前言2. 基本概念3. ICU采集过程3.1 获取周期占空比3.2 获取边沿数量3.3 获取时间戳4. Autosar系列文章快速链接1. 前言 ICU驱动器是使用Input Capture Uint模块(ICU)解调PWM信号、计数脉冲、测量频率和占空比、生成简单中断以及唤醒中断的模…

ROS学习寄录之知识学习

1 ROS核心概念 1.1 节点(Node) (1)执行具体任务的进程、独立运行的可执行文件 (2)不同节点可以使用不同的语言,可分布式运行在不同的主机 (3)节点在系统中的名称必须…

HTML总结

web开发是创建Web页面或App等前端界面呈现给用户的过程。web开发开发是从网页制作演变而来,早期网站主要内容都是静态,用户使用网站的行为也以浏览为主。随着互联网技术的发展,各种终端设备应用程序与用户沟通交互的界面,都是由We…

Java基础 Stream流方法引用异常文件

Stream流 引例 需求&#xff1a;按照下面要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 1. 把所有以“曹”开头的元素存储到新集合中 2. 把曹开头&#xff0c;长度为3的元素存储到新集合中 List<String> list List.of("曹操", "…

关于2倍图的理解

在电脑端1个css像素1个物理像素 所以一个长宽都是100px的照片&#xff0c;需要100✖100px的物理像素 而在移动端存在多倍图的关系&#xff0c;假如是2倍图的关系 即&#xff1a;1个css像素需要2个物理发光点 假如现在有一个长宽都是100px像素的照片 放在手机上也是长宽也是100…

TCP/IP IP地址概念与应用

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.什么是IP地址 二.IP地址的组成 三.IP地址分类 A类IP地址 …

雅睿生物在创业板IPO终止:安信证券为保荐人,曾计划募资7.5亿元

近日&#xff0c;深圳证券交易所创业板披露的信息显示&#xff0c;苏州雅睿生物技术股份有限公司&#xff08;下称“雅睿生物”&#xff09;提交了关于撤回首次公开发行股票并在创业板上市申请文件的申请&#xff0c;保荐人提交了撤回保荐的申请。 据贝多财经了解&#xff0c;雅…

Heatmap关键点检测算法

** Heatmap 方法汇总 高斯热图与坐标回归方法探讨 L1与 L2 Loss的对比分析 关键点之热力图Heatmap与坐标FC回归 Heatmap-based和Regression-based 一般来说&#xff0c;我们可以把姿态估计任务分成两个流派&#xff1a;Heatmap-based和Regression-based。 其主要区别在于监…

GROMACS 教程--水中的溶菌酶

GROMACS 教程–水中的溶菌酶 中文教程&#xff1a;http://jerkwin.github.io/ 英文教程&#xff1a;http://www.mdtutorials.com 此示例将指导新用户完成模拟系统的设置过程&#xff0c;该模拟系统在一盒水和离子中包含蛋白质&#xff08;溶菌酶&#xff09;。每个步骤都将包含…

学习3dmax多边形建模挤出操作

新建一个长方体&#xff0c;右键&#xff0c;转换为可编辑多边形&#xff1b; 右键以后&#xff0c;这个Convert To菜单&#xff0c;有时有有时没有&#xff0c;我还没弄清&#xff0c; 操作层级选中如下&#xff0c; 选中挤出命令&#xff0c;Extrude&#xff0c; 挤了一下&a…

元宇宙3D设计系统【构思与展望】

Metaverse 似乎是一个迷人的未来主义命题&#xff0c;“有一天”我们将拥有数十亿人愿意“生活在其中”的虚拟世界。 显然&#xff0c;我们还没有看到真正的“元宇宙”产品&#xff0c;3-5 年内也不太可能看到这样的产品。 那么&#xff0c;是什么阻碍了元宇宙在短期内成为现实…

ccflow 代码分析

ccflow 代码分析目录概述需求&#xff1a;设计思路实现思路分析1.参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happ…

线段树的原理和应用

目录 一、前言 二、线段树的概念 1、区间最值问题RMQ (Range Minimum/Maximum Query) &#xff08;1&#xff09;暴力法 &#xff08;2&#xff09;高效的办法&#xff1a;线段树 &#xff08;3&#xff09;把数列放在二叉树上 &#xff08;4&#xff09;查询最小值的复…

反向放大电路并联电容与积分电路并联电阻的区别?

运放反相比例放大电路中反馈电阻两端经常并联一个电容&#xff0c;而运放积分电路的反馈电容上常常并联一个电阻&#xff0c;两者电路结构相似&#xff0c;如下所示&#xff08;隐去阻容值&#xff09;&#xff0c;二者有何区别呢&#xff1f;电阻、电容分别又起到什么作用&…