模型融合model fusion与模型聚合model ensemble:提升机器学习性能的艺术

诸神缄默不语-个人CSDN博文目录

文章目录

  • 引言
  • 基模型
  • 模型融合与模型聚合的基本概念
  • 常见的模型聚合方法
    • 简单平均法
    • 加权平均模型输出
    • 加权平均模型参数
    • 投票法
    • bagging
    • 堆叠法(Stacking)
    • 提升法(Boosting)
      • GBDT
  • 新的模型聚合工作
  • 模型融合与聚合的应用
  • 结论
  • 参考资料

引言

在机器学习领域,单一模型往往难以达到最佳性能。模型融合(Model Fusion)和模型聚合(Model Ensemble)是提高预测准确性和鲁棒性的有效策略。它们通过组合多个模型的预测结果来改善单一模型可能存在的不足。本文将介绍模型融合和模型聚合的基本概念、常见方法及其应用。

基模型

同样的参数,不同的初始化方式。
不同的参数,通过cross-validation,选取最好的几组
同样的参数,模型训练的不同阶段,即不同迭代次数的模型
不同的模型,进行线性融合,例如RNN和传统模型

模型融合与模型聚合的基本概念

模型融合是指在模型层面上,将不同的模型组合在一起,通过特定的算法来整合多个模型的输出。模型融合的目标是综合不同模型的优点,以达到比单个模型更好的预测效果。

模型聚合则更侧重于通过策略性地组合多个模型的预测结果来提高整体的预测准确率。它通常涉及构建多个独立的模型,并利用某种形式的平均或投票机制来综合这些模型的预测。

常见的模型聚合方法

简单平均法

简单平均法是最直接的模型聚合方法,它对所有模型的预测结果求平均,以获取最终的预测值。

def simple_average(predictions):return sum(predictions) / len(predictions)

加权平均模型输出

与简单平均法类似,加权平均法为不同模型的预测结果分配不同的权重。这种方法在某些模型预测结果更可靠时非常有效。

def weighted_average(predictions, weights):weighted_sum = sum(p * w for p, w in zip(predictions, weights))return weighted_sum / sum(weights)

参考文献:

  1. (1994 Information and Computation) The Weighted Majority Algorithm:加权平均输出

加权平均模型参数

  1. (1985 SIGGRAPH) Animating Rotation with Quaternion Curves:球面线性插值
  2. (2022 ICML) Model soups: averaging weights of multiple fine-tuned models improves accuracy without increasing inference time:线性加权平均
  3. (2022 NeurIPS) Patching open-vocabulary models by interpolating weights:任务算术
  4. (2022 NeurIPS) Merging Models with Fisher-Weighted Averaging:利用补充数据,根据模型梯度或表示计算融合权重,消除了超参数调优的需求
  5. (2023 ICLR) Dataless Knowledge Fusion by Merging Weights of Language Models:利用补充数据,根据模型梯度或表示计算融合权重,消除了超参数调优的需求
  6. (2023 NeurIPS) TIES-Merging: Resolving Interference When Merging Models:在模型融合前修剪低振幅变化的参数值,以避免冗余参数干扰

投票法

对于分类问题,投票法是一种常用的模型聚合策略。它根据多个模型的预测类别进行投票,选出得票最多的类别作为最终预测。
投票可以选择不同模型都运行输出,也可以选择一个模型运行多次。

from collections import Counterdef majority_vote(predictions):votes = Counter(predictions)majority = votes.most_common(1)[0][0]return majority

参考文献:

  1. (2011 IJCNN) Turning Bayesian Model Averaging Into Bayesian Model Combination

bagging

它将数据分成N折,每个基模型学习其中N-1折数据。
对于相同部分,直接采取;对于不同部分,采用投票的方式做出集体决策。

堆叠法(Stacking)

堆叠是一种更复杂的模型聚合方法,将多个不同模型的预测结果作为输入,训练一个新的模型来产生最终的预测。这种方法能够有效地利用不同模型的预测能力。

Stacking(堆叠泛化)是一种集成学习技术,通过结合多个不同的基模型,使用一个元模型(或称为次级学习器)来整合各基模型的预测结果,以获得更好的预测性能。以下是使用Python和scikit-learn库实现的一个简单的Stacking示例。这个例子中,我们将使用三个基模型(决策树、K近邻、支持向量机)和一个元模型(逻辑回归),来解决一个分类问题。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.base import BaseEstimator, TransformerMixin, ClassifierMixin
from sklearn.base import clone
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
import numpy as np# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 定义Stacking类
class StackingClassifier(BaseEstimator, ClassifierMixin, TransformerMixin):def __init__(self, base_classifiers, meta_classifier):self.base_classifiers = base_classifiersself.meta_classifier = meta_classifierdef fit(self, X, y):# 克隆基模型,避免修改原始模型self.clones_ = [clone(clf) for clf in self.base_classifiers]# 训练基模型for clf in self.clones_:clf.fit(X, y)# 创建用于训练元模型的数据集meta_features = np.column_stack([clf.predict(X) for clf in self.clones_])# 训练元模型self.meta_classifier_ = clone(self.meta_classifier).fit(meta_features, y)return selfdef predict(self, X):# 基模型的预测结果meta_features = np.column_stack([clf.predict(X) for clf in self.clones_])# 元模型的最终预测return self.meta_classifier_.predict(meta_features)# 实例化基模型和元模型
base_classifiers = [DecisionTreeClassifier(), KNeighborsClassifier(), SVC(probability=True)]
meta_classifier = LogisticRegression()# 创建Stacking分类器
stacking_clf = StackingClassifier(base_classifiers=base_classifiers, meta_classifier=meta_classifier)# 训练Stacking分类器
stacking_clf.fit(X_train, y_train)# 在测试集上进行预测
y_pred = stacking_clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"Stacking Classifier Accuracy: {accuracy:.2f}")

在这个例子中,我们首先定义了一个StackingClassifier类,它接受基模型列表和一个元模型作为输入。在训练阶段,每个基模型独立地在完整的训练数据集上进行训练。接着,我们使用这些基模型的预测结果来训练元模型,元模型的任务是综合这些预测结果,输出最终的预测。最后,我们使用训练好的Stacking分类器在测试集上进行预测,并计算准确率。

请注意,这个示例仅用于演示Stacking的基本概念和实现方法。在实际应用中,您可能需要根据具体问题调整模型的选择、超参数等。

提升法(Boosting)

在这里插入图片描述

提升法是一种迭代技术,它通过连续地修改数据的权重,训练一系列的模型。每个模型都试图纠正前一个模型的错误,最终的预测结果是这些模型的加权和。

每个学习器按照串行的方法生成。把几个基本学习器层层叠加,但是每一层的学习器的重要程度不同,越前面的学习的重要程度越高。它聚焦样本的权重。每一层在学习的时候,对前面几层分错的样本“特别关注”,建立了每个机器学习器之间的依赖关系,因此提升了整体模型的准确率。

Boosting 是一种集成学习技术,通过顺序地训练模型,使得后续的模型能够修正前一个模型的错误,最终的预测结果是通过组合所有模型的预测来完成的。Boosting 方法的一个著名实例是 AdaBoost(自适应增强)。以下是使用 Python 和 scikit-learn 库实现的一个 AdaBoost 示例,其中使用决策树作为基学习器来解决一个分类问题。

值得一提的是很多树类的boost还可以作为特征筛选器,有特征重要程度评分的功能。

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score# 加载数据集
data = load_breast_cancer()
X, y = data.data, data.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 初始化基学习器
base_estimator = DecisionTreeClassifier(max_depth=1)# 初始化AdaBoost分类器
ada_boost_clf = AdaBoostClassifier(base_estimator=base_estimator, n_estimators=50, learning_rate=1.0, random_state=42)# 训练模型
ada_boost_clf.fit(X_train, y_train)# 在测试集上进行预测
y_pred = ada_boost_clf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"AdaBoost Classifier Accuracy: {accuracy:.2f}")

在这个示例中,我们首先加载了乳腺癌数据集并划分成训练集和测试集。然后,我们使用 DecisionTreeClassifier 作为基学习器初始化了 AdaBoost 分类器。AdaBoost 分类器的 n_estimators 参数设置为 50,意味着将顺序地训练 50 个决策树;learning_rate 参数控制着每个基学习器的贡献程度。之后,我们训练 AdaBoost 分类器并在测试集上进行预测,最后计算并输出模型的准确率。

AdaBoost 是 boosting 方法中的一个基本算法,除此之外,还有其他的 boosting 方法,如 Gradient Boosting 和 XGBoost 等,它们在处理各种机器学习问题时非常有效。这些方法提供了不同的策略来调整后续模型重点关注的数据点,从而改进模型的性能。

GBDT

  1. 随机森林
  2. XGBoost
  3. LightGBM
  4. CatBoost

新的模型聚合工作

  1. (2023 ACL) LLM-Blender: Ensembling Large Language Models with Pairwise Ranking and Generative Fusion:聚合LLM,先比较LLM之间的细微差别,然后组合排名靠前的candidates,生成增强后的输出
  2. (2024 ICLR) FuseLLM:Knowledge Fusion of Large Language Models:提出了一种多语言模型知识融合的新范式,它利用源语言模型生成的概率分布矩阵,将集体知识和各自优势转移到目标模型。与模型聚合方法(需要并行部署多个模型)相比, FuseLLM支持将不同架构的多个源语言模型融合到目标模型中。
  3. (2024) FuseChat: Knowledge Fusion of Chat Models

模型融合与聚合的应用

模型融合和聚合广泛应用于各种机器学习任务中,包括但不限于图像识别、自然语言处理、推荐系统等领域。通过结合不同模型的独特优势,可以显著提升任务的性能。

结论

模型融合和模型聚合是提升机器学习模型性能的重要手段。虽然这些方法增加了模型的复杂性,但它们在提高预测准确性、减少过拟合方面发挥着不可替代的作用。未来,随着机器学习领域的不断发展,我们期待出现更多高效的融合与聚合技术。

参考资料

  1. 我还没看
    1. (2009 周志华) Ensemble Learning
    2. (2018 WIREs Data Mining Knowl Discov) Ensemble learning: A survey
  2. 【模型融合】集成学习(boosting, bagging, stacking)原理介绍、python代码实现(sklearn)、分类回归任务实战_stacking集成模型-CSDN博客:看了一点。感觉整体写得很全面、有概括性,以后慢慢细看,看了整理信息到我的博文里。

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

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

相关文章

GooleNet神经网络介绍

一、简介 GoogleNet,也称为GoogLeNet,是谷歌工程师设计的一种深度神经网络结构,它在2014年的ImageNet图像识别挑战赛中取得了冠军。该神经网络的设计特点主要体现在其深度和宽度上,通过引入名为Inception的核心子网络结构&#x…

Science Robotics 逼真面部表情的机器人

人类可以产生数千种不同的面部表情来传达无数微妙的情绪状态,这种能力是人类社会互动中最有效和最有效的界面之一。在 2019 年冠状病毒病流行期间,口罩使社交互动变得尴尬,因为它们掩盖了面部表情。同时,当摄像机打开时&#xff0…

数据可视化为什么能在智慧港口中发挥作用?

随着全球贸易活动日益频繁,港口作为国际贸易的重要节点,其运营效率与智能化程度直接影响着整个物流链的效能。在此背景下,智慧港口的概念应运而生,它借助先进的信息技术手段对传统港口进行改造升级,其中,数…

[CSS]中子元素在父元素中居中

元素居中 对于当行文字居中&#xff0c;比较简单&#xff0c;设置text-align:center和text-height为盒子高度即可 对于父元素中子元素居中&#xff0c;要实现的话有以下几个方法 方法1&#xff1a;利用定位margin&#xff1a;auto <style>.father {width: 500px;heig…

Kubernetes-running app on kube

Docker 安装Docker 首先&#xff0c;您需要在Linux机器上安装Docker。如果您不使用Linux&#xff0c;则需要启动一个Linux虚拟机(VM)并在该虚拟机中运行Docker。如果你使用的是Mac或Windows系统&#xff0c;并按照指令安装Docker, Docker将为你建立一个虚拟机&#xff0c;并在…

基于 SymPy 的反函数求解

原文&#xff1a;https://blog.iyatt.com/?p14396 例一 f(x) 2x 3 这个函数很简单&#xff0c;可以看出它的反函数是&#xff08;令 yf(x) &#xff09;&#xff1a;$$x\frac{y-3}{2}$$ 使用 SymPy 求解可以采用这样的思路&#xff1a; 已知函数 f(x)2x3, 令 y f(x), 即构…

[yolox]ubuntu上部署yolox的ncnn模型

首先转换pytorch->onnx->param模型&#xff0c;这个过程可以查资料步骤有点多&#xff0c;参考blog.51cto.com/u_15660370/6408303&#xff0c;这里重点讲解转换后部署。 测试环境&#xff1a; ubuntu18.04 opencv3.4.4(编译过程省略&#xff0c;参考我其他博客) 安装…

USB - libusbg vs libusbgx

libusbg GitHub - libusbg/libusbg: USB Gadget Configfs Library libusbgx GitHub - linux-usb-gadgets/libusbgx: C library encapsulating the Linux kernel USB gadget configfs userspace API functionality libusbg 和 libusbgx 都是与 Linux 中 USB gadgets配置相关的…

List操作add,clear,addall报错UnsupportedOperationException的解决办法

ArrayList和Arrays.ArrayList是两码事 ArrayList 支持 add&#xff0c;clear&#xff0c;addall Arrays.ArrayList不支持add&#xff0c;clear&#xff0c;addall 这个方法的使用时候&#xff0c;传递的数组必须是对象数组&#xff0c;而不是基本数据类型 JDK源码 /** *返回由…

Linux 安装部署高性能缓存服务redis

Linux 系统安装Redis 5 注意事项&#xff1a; 下载Redis 文件包&#xff0c;并上传至linux服务上解压 tar -zxvf redis.tar安装&#xff1a; 编译 make PREFIX/usr/local/redis install配置&#xff1a; redis.conf daemonize yes bind 127.0.0.1 192.168.1.221 supervised…

2024.3.31 机器学习周报

引言 Abstract 文献阅读 1、题目 Lite-HRNet: A Lightweight High-Resolution Network 2、引言 我们提出了一个高效的高分辨率网络&#xff0c;Lite-HRNet&#xff0c;用于人体姿态估计。首先&#xff0c;我们简单地将Shuf Chronenet中的高效shuffle块应用于HRNet&#x…

逻辑分析仪使用杂记

50MSa为采样深度&#xff1a;对被测信号一次采集的样点总数。它决定了一次采样所能采集到的数据量的多少&#xff0c;深度越大&#xff0c;一次采集的数据量越大。 16MHZ为采样率&#xff1a;对被测信号进行采样的频率&#xff0c;也就是每秒所采集的样点数。它决定了一次采样…

小程序内多种直播方案对比

我可以为您提供一个基于您提供信息的简单对比表&#xff0c;以便您对比视频号直播、小程序直播和三方SDK直播的不同特点和成本。在做出最终决定前&#xff0c;建议您还需要考虑直播质量、用户体验、后续支持和维护等因素。 特点/平台视频号直播小程序直播三方SDK直播直播方式通…

328——二维矩阵值变为1最小操作次数 next、nextInt、nextLine

一、next、nextInt、nextLine区别 1.next() next()不光是接收键盘输入的内容&#xff0c;而且还进行分割。例如默认分隔符为空格 Scanner sc new Scanner(System.in);while (true){String str sc.next();System.out.println(str "A");}// 输出结果 input&#…

【算法】归并排序(迭代法)

简介 归并排序有两种实现方法: 递归法(Top-down implementation)迭代法(Bottom-up implementation)关于归并排序的介绍请看之前的 归并排序(递归法)。 算法步骤(迭代) 设待排列序列有 n 个序列。子序列宽度为 width = 1。 将宽度为 width 的子序列每对相邻两个子序…

备考ICA----Istio实验14---出向流量管控Egress Gateways实验

备考ICA----Istio实验14—出向流量管控Egress Gateways实验 1. 发布测试用 pod kubectl apply -f istio/samples/sleep/sleep.yaml kubectl get pods -l appsleep2. ServiceEntry 创建一个ServiceEntry允许流量访问edition.cnn.com egressgw/edition-ServiceEntry.yaml api…

代码随想录Day38

Day 38 动态规划 part01 今日任务 斐波那契数 爬楼梯 使用最小花费爬楼梯 代码实现 斐波那契数 //递归public int fib(int n) {if (n 0) {return 0;}if (n 1) {return 1;}return fib(n - 1) fib(n - 2);}//动态规划public int fib2(int n) {if (n < 1) return n;in…

科技下乡:数字乡村改变乡村生活方式

在科技飞速发展的时代&#xff0c;数字化、信息化浪潮正以前所未有的速度席卷全球。在这场科技革命中&#xff0c;乡村不再是滞后的代名词&#xff0c;而是成为了数字乡村建设的热土。科技下乡&#xff0c;让数字乡村成为了改变乡村生活方式的重要力量。 一、科技下乡&#xf…

(学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

STM32之HAL开发——I2C读写EEPROM

I2C功能框图&#xff08;F1系列&#xff09; STM32 的 I2C 外设可用作通讯的主机及从机&#xff0c;支持 100Kbit/s 和 400Kbit/s 的速率&#xff0c;支持 7 位、 10 位设备地址&#xff0c;支持 DMA 数据传输&#xff0c;并具有数据校验功能&#xff0c;I2C 外设还支持 SMBus2…