机器学习 Day12 集成学习简单介绍

1.集成学习概述

1.1. 什么是集成学习

集成学习是一种通过组合多个模型来提高预测性能的机器学习方法。它类似于:

  • 超级个体 vs 弱者联盟

    • 单个复杂模型(如9次多项式函数)可能能力过强但容易过拟合

    • 组合多个简单模型(如一堆1次函数)可以增强能力而不易过拟合

集成学习通过生成多个分类器/模型,将它们的预测结果组合起来,通常能获得优于任何单一分类器的预测性能。

1.2. 机器学习的两个核心任务

  1. 如何优化训练数据 - 主要用于解决欠拟合问题——booting

  2. 如何提升泛化性能 - 主要用于解决过拟合问题——bagging

1.3. 集成学习的两种主要方法

Boosting方法

  • 逐步增强学习

  • 通过序列化方式构建模型,每个新模型都更关注前序模型处理不好的样本(错误数据增强)

  • 典型算法:AdaBoost, Gradient Boosting, XGBoost

Bagging方法

  • 采样学习集成

  • 通过并行方式构建多个模型,每个模型基于数据的随机子集

  • 典型算法:随机森林

集成学习的关键优势是:只要单分类器的表现不太差,集成后的结果通常优于单分类器。这种方法能有效平衡模型的偏差和方差,提高泛化能力

2.Bagging和随机森林

2.1Bagging集成原理

先看一个图

2.1.1. Bagging 基本概念

BaggingBootstrap Aggregating,自助聚合)是一种并行式集成学习方法,通过构建多个相互独立的基学习器,并综合它们的预测结果来提高模型的泛化能力。

核心思想

  • Bootstrap(自助采样):从训练数据中有放回地随机抽取多个子集,每个子集用于训练一个基学习器。

  • Aggregating(聚合):所有基学习器的预测结果通过投票(分类)或平均(回归)进行集成,得到最终预测。

📌 关键特点

  • 适用于高方差、低偏差的模型(如决策树、神经网络)。

  • 能有效降低方差,减少过拟合风险。(可以理解因为你随机选取数据)


2.1.2. Bagging 算法流程

  1. 自助采样(Bootstrap Sampling)

    • 从原始训练集 DD 中有放回地随机抽取 mm 个样本,构成一个子集 DiDi​。

    • 重复该过程 TT 次,得到 TT 个不同的训练子集。

  2. 基学习器训练

    • 每个子集 DiDi​ 训练一个基学习器(如决策树)。

    • 基学习器之间相互独立(可并行训练)。

  3. 集成预测

    • 分类任务:采用投票法(多数表决)

    • 回归任务:采用平均法(取均值)


2.1.3. Bagging 的典型算法:随机森林(Random Forest)

  • 改进点不仅对样本进行自助采样,还对特征进行随机选择(进一步降低相关性)

  • 优势

    • 比普通 Bagging 更鲁棒,抗过拟合能力更强。

    • 能处理高维数据,适用于分类和回归任务。


2.1.4. Bagging 的优缺点

✅ 优点

  • 有效减少方差,防止过拟合。

  • 适用于高噪声数据,鲁棒性强。

  • 可并行训练,计算效率高。

❌ 缺点

  • 低偏差、高方差的模型(如线性回归)提升有限。

  • 如果基学习器本身偏差较大,Bagging 可能无法显著提升性能。

2.2随机森林

2.2.1. 随机森林的核心概念
随机森林是一种基于 Bagging + 决策树(基学习器是决策树) 的集成学习方法,通过构建多棵决策树并综合它们的预测结果来提高模型的泛化能力。

2.2.2核心特点:

双重随机性:样本随机(自助采样),特征随机(随机选择部分特征)

投票机制:分类任务:众数投票(多数表决),回归任务:均值预测

2.2.3构造过程:

 2.2.4关键问题解答

Q1:为什么要随机抽样训练集?

  • 如果所有树使用相同的训练数据,会导致所有树高度相似,失去集成的意义。

  • 随机抽样 保证每棵树学习到数据的不同方面,提高多样性。

Q2:为什么要有放回地抽样?

  • 无放回抽样会导致每棵树的训练数据完全不同,可能引入偏差。

  • 有放回抽样 使不同树的数据分布相似但不相同,平衡偏差与方差。

2.3包外估计(之前讲的自助法)

5. 实际应用示例
(1)随机森林的 OOB 误差计算

from sklearn.ensemble import RandomForestClassifier# 启用 OOB 估计
model = RandomForestClassifier(n_estimators=100, oob_score=True)
model.fit(X_train, y_train)# 输出 OOB 准确率
print("OOB Score:", model.oob_score_)

(2)特征重要性可视化

import matplotlib.pyplot as plt# 获取特征重要性
importances = model.feature_importances_# 可视化
plt.barh(range(X.shape[1]), importances)
plt.yticks(range(X.shape[1]), X.columns)
plt.show()

6. 关键问题
包外数据能完全替代验证集吗?
可以:在随机森林中,OOB 估计已被证明是无偏的。但:对于超参数调优,建议结合交叉验证。

2.4随机森林API和案例

还是和以前一样,先实例化后使用

 案例:

import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.datasets import load_breast_cancer  # 示例数据集# 1. 加载数据(这里使用sklearn自带的乳腺癌数据集作为示例)
data = load_breast_cancer()
X = data.data
y = data.target# 2. 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 3. 初始化随机森林分类器(启用OOB估计)
rf = RandomForestClassifier(oob_score=True, random_state=42)# 4. 定义超参数网格
param_grid = {"n_estimators": [120, 200, 300, 500, 800, 1200],"max_depth": [5, 8, 15, 25, 30],"max_features": ["sqrt", "log2"]  # 添加特征选择方式
}# 5. 使用GridSearchCV进行超参数调优
gc = GridSearchCV(estimator=rf,param_grid=param_grid,cv=5,  # 使用5折交叉验证n_jobs=-1,  # 使用所有CPU核心verbose=2  # 显示详细日志
)# 6. 训练模型
gc.fit(X_train, y_train)# 7. 输出最佳参数和模型评估结果
print("\n=== 最佳参数组合 ===")
print(gc.best_params_)print("\n=== 模型评估 ===")
print(f"测试集准确率: {gc.score(X_test, y_test):.4f}")# 8. 获取最佳模型并输出OOB得分
best_rf = gc.best_estimator_
print(f"包外估计(OOB)得分: {best_rf.oob_score_:.4f}")

3.通过一个案例,来看一下我们拿到一个数据如何分析:

3.1题目介绍

 

 3.2题目分析:我说一下目前了解到的各个部分

3.1获取数据 

数据描述,可视化

3.2数据基本处理:选取特征值(部分特征值无用,比如id),对于类别不平衡数据的处理(过采样和欠采样),缺失值和异常值的处理,分割数据,将标签值转化为数字(这个案例里会讲)只有进行数据的可视化才能看到数据是否平衡,有无异常值等,所以可视化很重要。

3.3特征处理:特征预处理(归一化,标准化),特征提取(字典特征提取,文本特征提取,图像特征提取),将类别特征转换为One-hot编码。

3.4模型训练:实际上涉及到参数调优,如果算力够强使用交叉验证和网格搜索即可,不行的话可以一个一个来,我们这个案例就是。

3.5模型评估

3.3代码实现

获取数据,以及数据描述:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.utils import class_weight# 加载数据
data = pd.read_csv('./data/otto/train.csv')# 查看数据形状
print(f"数据集形状: {data.shape}")  # (61878, 95)# 查看数据概览
print(data.describe())# 可视化类别分布
plt.figure(figsize=(12, 6))
sns.countplot(x='target', data=data)
plt.title('类别分布情况')
plt.xticks(rotation=45)
plt.show()

可以看到标签值是一个不平衡数据,所以需要进行处理。

数据预处理

 (1)确定特征值和标签值

# 首先需要确定特征值\标签值
y = data["target"]
x = data.drop(["id", "target"], axis=1)

(2)类别不平衡问题处理

# 欠采样获取数据
from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_resampled, y_resampled = rus.fit_resample(x, y)# 图形可视化,查看数据分布
import seaborn as sns
sns.countplot(y_resampled)
plt.show()

 

看到处理完毕,并且 类别平衡。

(3)标签值的转化

使用转换器即可

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y_resampled = le.fit_transform(y_resampled)

 

(4)分割数据 

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2)

 特征工程   这个数据全是0-1数据,是被脱敏处理过后的数据,无需再进行处理

模型训练与评估(这里要使用要求的损失函数)

# 模型训练
rf = RandomForestClassifier(oob_score=True)#使用包外估计
rf.fit(x_train, y_train)# 模型预测
y_pre = rf.predict(x_test)# 计算模型准确率
accuracy = rf.score(x_test, y_test)
print(f"模型在测试集上的准确率: {accuracy}")# 查看袋外分数
oob_score = rf.oob_score_
print(f"模型的包外估计分数: {oob_score}")

 按要求评估:

from sklearn.metrics import log_loss
log_loss(y_test, y_pre, eps=1e-15, normalize=True)
#normalize是将损失进行归一化

但我们会发现这样会报错,因为 这个评估函数要求输入是一堆矩阵,y_test是一个one-hot编码矩阵,后面的也要求是相应的大小。于是我们更改方式:

from sklearn.preprocessing import OneHotEncoder
one_hot = OneHotEncoder(sparse=False)#不是密集矩阵y_test1 = one_hot.fit_transform(y_test.reshape(-1, 1))
y_pre1 = one_hot.fit_transform(y_pre.reshape(-1, 1))

对于 y_test.reshape(-1, 1) :y_test 原本可能是一维数组,reshape(-1, 1) 将其转换为二维列向量形式,因为 OneHotEncoder 要求输入数据是二维数组。

这样就可以了吗,但是我们可以通过将预测值的那个矩阵替换为概率矩阵,就是每一行代表一个样本,每一列是代表这个样本属于这个类别的概率:这样会降低特别大

# 改变预测值的输出模式,让输出结果为百分比概率
y_pre_proba = rf.predict_proba(x_test)# 再次查看袋外分数
oob_score = rf.oob_score_
print(f"模型的袋外分数: {oob_score}")# 第二次 logloss 模型评估
log_loss_value_2 = log_loss(y_test1, y_pre_proba, eps=1e-15, normalize=True)
print(f"第二次计算的 log_loss 值: {log_loss_value_2}")

 参数调优 最好使用网格搜索的方法,当算力小的时候可以如下调优

# 确定n_estimators的取值范围
tuned_parameters = range(10, 200, 10)
# 创建添加存放accuracy的一个numpy数组
accuracy_t = np.zeros(len(tuned_parameters))
# 创建添加error的一个numpy数组(就是要求的损失函数数组)
error_t = np.zeros(len(tuned_parameters))
# 调优过程实现
for j, one_parameter in enumerate(tuned_parameters):rf2 = RandomForestClassifier(n_estimators=one_parameter,max_depth=10,max_features=10,min_samples_leaf=10,oob_score=True,random_state=0,n_jobs=-1)rf2.fit(x_train, y_train)# 输出accuracyaccuracy_t[j] = rf2.oob_score_# 输出log_lossy_pre = rf2.predict_proba(x_test)error_t[j] = log_loss(y_test, y_pre, eps=1e-15, normalize=True)print(error_t)# 优化结果过程可视化
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(20, 4), dpi=100)
axes[0].plot(tuned_parameters, error_t)
axes[1].plot(tuned_parameters, accuracy_t)
axes[0].set_xlabel("n_estimators")
axes[0].set_ylabel("error_t")
axes[1].set_xlabel("n_estimators")
axes[1].set_ylabel("accuracy_t")
axes[0].grid(True)
axes[1].grid(True)
plt.show()
for j, one_parameter in enumerate(tuned_parameters):

相当于给原本的要调优的值加了一个从0开始的索引,方便把每个值存到数组里

注意我们并不是选取数组里最小的作为最优调参,而是通过绘图查看趋势,通常选取趋势平缓的转折点

之后我们固定这个参数,继续进行调优,直到全部调优完毕!

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

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

相关文章

通过爬虫方式实现头条号发布视频(2025年4月)

1、将真实的cookie贴到代码目录中toutiaohao_cookie.txt文件里,修改python代码里的user_agent和video_path, cover_path等变量的值,最后运行python脚本即可; 2、运行之前根据import提示安装一些常见依赖,比如requests等; 3、2025年4月份最新版; 代码如下: import js…

Linux ssh免密登陆设置

使用 ssh-copy-id 命令来设置 SSH 免密登录,并确保所有相关文件和目录权限正确设置,可以按照以下步骤进行: 步骤 1:在源服务器(198.120.1.109)生成 SSH 密钥对 如果还没有生成 SSH 密钥对,首先…

《让机器人读懂你的心:情感分析技术融合奥秘》

机器人早已不再局限于执行简单机械的任务,人们期望它们能像人类伙伴一样,理解我们的喜怒哀乐,实现更自然、温暖的互动。情感分析技术,正是赋予机器人这种“理解人类情绪”能力的关键钥匙,它的融入将彻底革新机器人与人…

Linux笔记---进程间通信:匿名管道

1. 管道通信 1.1 管道的概念与分类 管道(Pipe) 是进程间通信(IPC)的一种基础机制,主要用于在具有亲缘关系的进程(如父子进程、兄弟进程)之间传递数据,其核心特性是通过内核缓冲区实…

Ollama API 应用指南

1. 基础信息 默认地址: http://localhost:11434/api数据格式: application/json支持方法: POST(主要)、GET(部分接口) 2. 模型管理 API (1) 列出本地模型 端点: GET /api/tags功能: 获取已下载的模型列表。示例:curl http://lo…

【OSCP-vulnhub】Raven-2

目录 端口扫描 本地/etc/hosts文件解析 目录扫描: 第一个flag 利用msf下载exp flag2 flag3 Mysql登录 查看mysql的运行权限 MySql提权:UDF 查看数据库写入条件 查看插件目录 查看是否可以远程登录 gcc编译.o文件 创建so文件 创建临时监听…

Podman Desktop:现代轻量容器管理利器(Podman与Docker)

前言 什么是 Podman Desktop? Podman Desktop 是基于 Podman CLI 的图形化开源容器管理工具,运行在 Windows(或 macOS)上,默认集成 Fedora Linux(WSL 2 环境)。它提供与 Docker 类似的使用体验…

极狐GitLab 权限和角色如何设置?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 权限和角色 (BASIC ALL) 将用户添加到项目或群组时,您可以为他们分配角色。该角色决定他们在极狐GitLab 中可以执…

解锁现代生活健康密码,开启养生新方式

在科技飞速发展的当下,我们享受着便捷生活,却也面临诸多健康隐患。想要维持良好状态,不妨从这些细节入手,解锁科学养生之道。​ 肠道是人体重要的消化器官,也是最大的免疫器官,养护肠道至关重要。日常可多…

Kafka 主题设计与数据接入机制

一、前言:万物皆流,Kafka 是入口 在构建实时数仓时,Kafka 既是 数据流动的起点,也是后续流处理系统(如 Flink)赖以为生的数据源。 但“消息进来了” ≠ “你就能处理好了”——不合理的 Topic 设计、接入方…

【绘制图像轮廓|凸包特征检测】图像处理(OpenCV) -part7

15 绘制图像轮廓 15.1 什么是轮廓 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。相对于边缘,轮廓是连续的,边缘不一定连续,如下图所示。轮廓是一个闭合的、封闭的形状。 轮廓的作用: 形状分析 目标识别 …

uniapp中使用<cover-view>标签

文章背景&#xff1a; uniapp中遇到了原生组件(canvas)优先级过高覆盖vant组件 解决办法&#xff1a; 使用<cover-view>标签 踩坑&#xff1a; 我想实现的是一个vant组件库中动作面板的效果&#xff0c;能够从底部弹出框&#xff0c;让用户进行选择&#xff0c;我直…

Kafka常见问题及解决方案

Kafka 是一个强大的分布式流处理平台&#xff0c;广泛用于高吞吐量的数据流处理&#xff0c;但在实际使用过程中&#xff0c;也会遇到一些常见问题。以下是一些常见的 Kafka 问题及其对应的解决办法的详细解答&#xff1a; 消息丢失 一、原因 1.生产端 网络故障、生产者超时…

leetcode 二分查找应用

34. Find First and Last Position of Element in Sorted Array 代码&#xff1a; class Solution { public:vector<int> searchRange(vector<int>& nums, int target) {int low lowwer_bound(nums,target);int high upper_bound(nums,target);if(low high…

【Docker】在容器中使用 NVIDIA GPU

解决容器 GPU 设备映射问题&#xff0c;实现 AI 应用加速 &#x1f517; 官方文档&#xff1a;NVIDIA Container Toolkit GitHub 常见错误排查 若在运行测试容器时遇到以下错误&#xff1a; docker: Error response from daemon: could not select device driver ""…

通过Quartus II实现Nios II编程

目录 一、认识Nios II二、使用Quartus II 18.0Lite搭建Nios II硬件部分三、软件部分四、运行项目 一、认识Nios II Nios II软核处理器简介 Nios II是Altera公司推出的一款32位RISC嵌入式处理器&#xff0c;专门设计用于在FPGA上运行。作为软核处理器&#xff0c;Nios II可以通…

JAVA设计模式——(三)桥接模式

JAVA设计模式——&#xff08;三&#xff09;桥接模式&#xff08;Bridge Pattern&#xff09; 介绍理解实现武器抽象类武器实现类涂装颜色的行为接口具体颜色的行为实现让行为影响武器修改武器抽象类修改实现类 测试 适用性 介绍 将抽象和实现解耦&#xff0c;使两者可以独立…

k8s 证书相关问题

1.重新生成新证书 kubeadm init phase certs apiserver-etcd-client --config ~/kubeadm.yaml这个命令表示生成 kube-apiserver 连接 etcd 使用的证书,生成后如下 -rw------- 1 root root 1.7K Apr 23 16:35 apiserver-etcd-client.key -rw-r--r-- 1 root root 1.2K Apr 23 …

比较:AWS VPC peering与 AWS Transit Gateway

简述: VPC 对等连接和 Transit Gateway 用于连接多个 VPC。VPC 对等连接提供全网状架构,而 Transit Gateway 提供中心辐射型架构。Transit Gateway 提供大规模 VPC 连接,并简化了 VPC 间通信管理,相比 VPC 对等连接,支持大量 VPC 的 VPC 间通信管理。 VPC 对等连接 AWS V…

制造企业PLM深度应用:2025年基于PDCA循环的7项持续改进指标

制造企业的产品生命周期管理&#xff08;PLM&#xff09;在数字化转型的浪潮中扮演着至关重要的角色。PLM深度应用不仅能够提升产品研发效率、保证产品质量&#xff0c;还能增强企业在市场中的竞争力。随着2025年智能制造目标的推进&#xff0c;基于PDCA循环的持续改进对于PLM的…