【机器学习之模型融合】Blending混合法

news2024/11/28 4:39:48

前言 

Stacking堆叠法基础知识:http://t.csdn.cn/dzAna

1、Blending的基本思想与流程👿

Blending融合是在Stacking融合的基础上改进过后的算法。在之前的课程中我们提到,堆叠法stacking在level 1上使用算法,这可以令融合本身向着损失函数最小化的方向进行,同时stacking使用自带的内部交叉验证来生成数据,可以深度使用训练数据,让模型整体的效果更好。但在这些操作的背后,存在两个巨大的问题:

  • Stacking融合需要巨大的计算量,需要的时间和算力成本较高,以及

  • Stacking融合在数据和算法上都过于复杂,因此融合模型过拟合的可能性太高

Blending直译为“混合”,但它的核心思路其实与Stacking完全一致:使用两层算法串联,level 0上存在多个强学习器,level 1上有且只有一个元学习器,且level 0上的强学习器负责拟合数据与真实标签之间的关系、并输出预测结果、组成新的特征矩阵,然后让level 1上的元学习器在新的特征矩阵上学习并预测。

然而,与Stacking不同的是,为了降低计算量、降低融合模型过拟合风险,Blending取消了K折交叉验证、并且大大地降低了元学习器所需要训练的数据量,其具体流程如下:

  • Blending的训练

    1. 将数据分割为训练集、验证集与测试集,其中训练集上的样本为𝑀𝑡𝑟𝑎𝑖𝑛,验证集上的样本为𝑀𝑣,测试集上的样本量为𝑀𝑡𝑒𝑠𝑡
       
    2. 将训练集输入level 0的个体学习器,分别在每个个体学习器上训练。训练完毕后,在验证集上进行验证,输出验证集上的预测结果。假设预测结果为概率值,当融合模型执行回归或二分类任务时,该预测结果的结构为(𝑀𝑣,1),当融合模型执行K分类任务时(K>2),该预测结果的结构为(𝑀𝑣,𝐾)。此时此刻,所有个体学习器都被训练完毕了。
       
    3. 将所有个体学习器的验证结果横向拼接,形成新特征矩阵。假设共有N个个体学习器,则新特征矩阵的结构为(𝑀𝑣,𝑁)。
       
    4. 将新特征矩阵放入元学习器进行训练。
  • Blending的测试

    1. 将测试集输入level 0的个体学习器,分别在每个个体学习器上预测出相应结果。假设测试结果为概率值,当融合模型执行回归或二分类任务时,该测试结果的结构为(𝑀𝑡𝑒𝑠𝑡,1),当融合模型执行K分类任务时(K>2),该测试结果的结构为(𝑀𝑡𝑒𝑠𝑡,𝐾)
       
    2. 将所有个体学习器的预测结果横向拼接为新特征矩阵。假设共有N个个体学习器,当融合模型执行回归或二分类任务时,则新特征矩阵的结构为(𝑀𝑡𝑒𝑠𝑡,𝑁),如果是输出多分类的概率,那最终得出的新特征矩阵的结构为(𝑀𝑡𝑒𝑠𝑡,𝑁∗𝐾)
    3. 将新特征矩阵放入元学习器进行预测。
  • 在Stacking时我们提到:在实际进行训练时,验证集肯定是远远小于训练集的,因此只使用一部分验证集进行预测的方法一定会让新特征矩阵的尺寸变得非常小。在大部分时候,这是一个劣势,但在数据量庞大、运算成本极高的场景下,只使用一部分验证集构建新特征矩阵,反而还能提升运算速度、降低运算成本、防止模型过度学习、并提升模型的抗过拟合能力。很显然的,验证集越大,模型抗过拟合能力越强,同时学习能力越弱。
  • 在实际应用时,如果数据量较大、且Stacking方法表现出过拟合程度很高,那换Blending融合可以获得更好的结果。相对的,如果Stacking算法没有表现出太强的过拟合,那换Blending融合可能导致模型的学习能力极速下降。
  • 有一种场景下,Stacking和Blending都无法发挥效用,即数据量很小、且stacking表现出强烈过拟合的情况。这种状况下,数据或许不适合模型融合场景,或者我们可以更换成规则更简单的融合方式,例如平均、投票等来查看模型的过拟合情况。在实际中,Stacking的应用是远比Blending广泛的。
  • 目前,sklearn还不支持Blending方法。

2、实现Blending算法👮

def BlendingClassifier(X,y,estimators,final_estimator,test_size=0.2,vali_size=0.4):
    """
    该函数用于实现Blending分类融合
    X,y:整体数据集,会被分割为训练集、测试集、验证集三部分
    estimators: level0的个体学习器,输入格式形如sklearn中要求的[(名字,算法),(名字,算法)...]    
    final_estimator:元学习器
    test_size:测试集占全数据集的比例
    vali_size:验证集站全数据集的比例
    
    """
    
    #第一步,分割数据集
    #1.分测试集
    #2.分训练和验证集,验证集占完整数据集的比例为0.4,因此占排除测试集之后的比例为0.4/(1-0.2)
    X_,Xtest,y_,Ytest = train_test_split(X,y,test_size=test_size,random_state=1412)
    Xtrain,Xvali,Ytrain,Yvali = train_test_split(X_,y_,test_size=vali_size/(1-test_size),random_state=1412)
    
    #训练
    #建立空dataframe用于保存个体学习器上的验证结果,即用于生成新特征矩阵
    #新建空列表用于保存训练完毕的个体学习器,以便在测试中使用
    NewX_vali = pd.DataFrame()
    trained_estimators = []
    #循环、训练每个个体学习器、并收集个体学习器在验证集上输出的概率
    for clf_id, clf in estimators:
        clf = clf.fit(Xtrain,Ytrain)
        val_predictions = pd.DataFrame(clf.predict_proba(Xvali))
        #保存结果,在循环中逐渐构筑新特征矩阵
        NewX_vali = pd.concat([NewX_vali,val_predictions],axis=1)
        trained_estimators.append((clf_id,clf))
    #元学习器在新特征矩阵上训练、并输出训练分数
    final_estimator = final_estimator.fit(NewX_vali,Yvali)
    train_score = final_estimator.score(NewX_vali,Yvali)
    
    #测试
    #建立空dataframe用于保存个体学习器上的预测结果,即用于生成新特征矩阵
    NewX_test = pd.DataFrame()
    #循环,在每个训练完毕的个体学习器上进行预测,并收集每个个体学习器上输出的概率
    for clf_id,clf in trained_estimators:
        test_prediction = pd.DataFrame(clf.predict_proba(Xtest))
        #保存结果,在循环中逐渐构筑特征矩阵
        NewX_test = pd.concat([NewX_test,test_prediction],axis=1)
    #元学习器在新特征矩阵上测试、并输出测试分数
    test_score = final_estimator.score(NewX_test,Ytest)
    
    #打印训练分数与测试分数
    print(train_score,test_score)
#逻辑回归没有增加多样性的选项
clf1 = LogiR(max_iter = 3000, C=0.1, random_state=1412,n_jobs=8)
#增加特征多样性与样本多样性
clf2 = RFC(n_estimators= 100,max_features="sqrt",max_samples=0.9, random_state=1412,n_jobs=8)
#特征多样性,稍微上调特征数量
clf3 = GBC(n_estimators= 100,max_features=16,random_state=1412) 

#增加算法多样性,新增决策树与KNN
clf4 = DTC(max_depth=8,random_state=1412)
clf5 = KNNC(n_neighbors=10,n_jobs=8)
clf6 = GaussianNB()

#新增随机多样性,相同的算法更换随机数种子
clf7 = RFC(n_estimators= 100,max_features="sqrt",max_samples=0.9, random_state=4869,n_jobs=8)
clf8 = GBC(n_estimators= 100,max_features=16,random_state=4869)

estimators = [("Logistic Regression",clf1), ("RandomForest", clf2)
              , ("GBDT",clf3), ("Decision Tree", clf4), ("KNN",clf5) 
              #, ("Bayes",clf6)
              #, ("RandomForest2", clf7), ("GBDT2", clf8)
             ]
final_estimator = RFC(n_estimators= 100
                      #, max_depth = 8
                      , min_impurity_decrease=0.0025
                      , random_state= 420, n_jobs=8)

从结果来看,投票法表现最稳定和优异,这与我们选择的数据集是较为简单的数据集有关,同时投票法也是我们调整最多、最到位的算法。在大型数据集上运行时,Stacking和Blending会展现出更多的优势。

 

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

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

相关文章

好家伙,这几个隐藏功能,太香了

很多小伙伴可能被小畅的问题搞糊涂了,因为很多人只会在电脑上堆砌各种小应用,而忽略了Windows原有的实用功能。 而我们也千万不要小看这些功能,它们说不定能在关键时刻助你一臂之力,帮到你不少忙呢! 那么今天小畅就为大…

MobaXterm连接出现 Network error: Connection timed out 问题解决

MobaXterm连接出现 Network error: Connection timed out: 接前文:CentOS安装, 点此查看文章,安装之后的SSH连接: 解决思路如下: 1、检查虚拟机端是否安装ssh 一般情况是可以自动安装的,直接在终端输入s…

系统分析师案例必备知识点汇总---2023系列文章一

一、系统规划 (视频内容:系统分析师-专业知识模块中的系统规划视频) 1 、可行性研究 经济可行性 技术可行性 法律可行性 用户使用可行性 也称为投资收益分析 或成本效益分析,主 要评估项目的建设成 本、运行成本和项目 建成后可能的经济收 益。 技…

eggjs框架源码解读

文章目录前言Egg进程模型Egg应用程序结构egg运行启动的内幕加载插件扩展内置对象加载中间件加载service加载路由加载配置设置应用信息执行业务逻辑文件加载机制结语前言 eggjs 是阿里在 Nodejs 技术上的一大杰作,也是对开源世界的一大贡献。里面包含了很多技术结晶…

Linux---进程概念

目录 1. 什么是进程? 2. 描述进程---PCB task_struct---PCB的一种 task_ struct内容分类 3. 组织进程 4. 查看进程 通过系统调用获取进程标示符 通过系统调用创建进程---fork初识 1. 什么是进程? 其实,我们启动一个软件&#xf…

SLAM本质剖析番外-李群李代数的微分和导数

0. 简介 这几个月,博主已经从SLAM算法的使用向着算法的数学推导进行了记录和分享,之前也分享了李群李代数关注核心一文,从现象中解释了李群和李代数表达的含义。但是这还不够,所以这次作者作为SLAM本质剖析的番外,来介…

基础数字(一)位运算 哈希(数组中元素出现次数)

目录 力扣剑指 Offer II 070. 排序数组中只出现一次的数字 数组中只出现一次的数(其它数出现k次)_牛客题霸 数组中只出现一次的两个数字_牛客题霸_牛客网 数组中出现次数超过一半的数字_牛客题霸_牛客网 缺失的第一个正整数_牛客题霸_牛客网 力扣剑指…

[杂记]算法:前缀和与差分数组

这篇讲一下前缀和与差分数组的关系 1. 前缀和 1.1 一维数组前缀和 前缀和在处理数组中的连续子数组的某一段加和的问题中很有用, 因为是拿空间换时间, 可以将线性复杂度降低为常数时间复杂度. 前缀和的道理很简单, 对于数组arr[i],i0,...,n−1arr[i], i 0, ..., n - 1arr[i…

《Linux Shell脚本攻略》学习笔记-第四章

4.1 简介 本章主要介绍sed、awk、grep、cut等命令,这些工具可以相互结合以满足文本处理需求。 正则表达式是一种基础的模式匹配技术。 4.2 使用正则表达式 正则表达式是由字面文本和具有特殊意义的符号组成的。 1)位置标记 位置标记锚点是标识字符串位置…

Anaconda安装、opencv环境配置、jupyter notebook使用虚拟环境

目录一、Anaconda 的安装二、opencv 3.4.1.15版本安装三、jupyter notebook使用虚拟环境四、运行报错-缺库一、Anaconda 的安装 Anaconda官网:Anaconda Installers Anaconda历史版本:Anaconda Index of 这边建议和我装一样anaconda3 python3.7&#xf…

opencv的图像基本操作(基于jupyter Notebook)

opencv的基本操作cv2是opencv在python中的缩写,函数开头用cv2cv2.imread(cat.jpg) #读入图片cat.jpgcv2.imwrite(mycat.png,img) #图片img保存为mycat.pngcv2.imshow(image,img) #创建窗口,显示图像cv2.waitKey(10000) #等待时间,以 毫秒为单…

整数分解

问题描述 将 3 分解成两个正整数的和, 有两种分解方法, 分别是 312312 和 321321 。注意顺序不同算不同的方法。 将 5 分解成三个正整数的和, 有 6 种分解方法, 它们是 113122113122 131212221311131212221311 。 请问, 将 2021 分解成五个正整数的和, 有多少种分解方法? …

Android大厂面试100题,涵盖测试技术、环境搭建、人力资源

测试技术面试题 1、什么是兼容性测试?兼容性测试侧重哪些方面? 2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题? 3、测试的策略有哪些? 4、正交表测试用例…

Sinutrain下载安装与开启OPC UA---kalrry

Sinumerik下载安装与开启OPC UA---kalrry前言一、安装前准备二、Win7安装1、软件安装2、开启授权3、文件配置4、客户端连接三、Win10/11安装四、启动后使用前言 本教程只适用于 Sinutrain-v4.7 版本,其他版本配置目录有所改变建议安装到默认路径,否则后…

【云原生】k8s安全机制

内容预知 前言 1. 认证(Authentication) 1.1 k8s集群内的三种认证方式 1.2 k8s集群内的认证说明 (1)需要被认证的访问类型 (2)安全性说明 (3)证书颁发的方式 (4&a…

Qt中使用qt自带的函数实现各种进制间的相互转换,easy.

文章目录一.十进制转各种进制第一种:使用QString的静态函数number第二种:使用QString的拼接函数arg二.各种进制相互转换一.十进制转各种进制 第一种:使用QString的静态函数number ①使用QString的静态函数number即可,如我把字符…

嵌入式linux-进程状态与进程关系

1. 进程状态 1.1什么是进程状态 Linux 系统下进程通常存在 6 种不同的状态,分为:就绪态、运行态、僵尸态、可中断睡眠状态(浅度 睡眠)、不可中断睡眠状态(深度睡眠)以及暂停态。 下面我们来一一总结一下&…

数据湖之Hudi基础:入门介绍和编译部署

主要记录下Hudi的概述和打包编译等内容,方便参考 文章目录简介官网发展历史Hudi特性使用场景安装部署编译环境准备编译hudi1.源码包上传到服务器2.修改pom文件3.修改源码兼容hadoop34.手动安装kafka依赖(非必须)5.解决spark模块依赖冲突6.执行…

【基础篇】4 # 链表(上):如何实现LRU缓存淘汰算法?

说明 【数据结构与算法之美】专栏学习笔记 链表结构 数组需要一块连续的内存空间来存储,对内存的要求比较高, 而链表并不需要一块连续的内存空间,它通过指针将一组零散的内存块串联起来使用。 结点:指的是内存块后继指针 next…

Postgresql源码(98)lex与yacc的定制交互方式

1 背景知识一:LEX %option prefix Postgresql中使用%option prefix"core_yy",影响范围:yy_create_buffer,yy_delete_buffer,yy_flex_debug,yy_init_buffer,yy_flush_buffer,yy_load_buffer_state,yy_switch_to_buffer,yyin,yyleng…