基于scikit-learn的机器学习分类任务实践——集成学习

news2024/10/7 19:28:08

一、传统机器学习分类流程与经典思想算法简述

        传统机器学习是指,利用线性代数、数理统计与优化算法等数学方式从设计获取的数据集中构建预测学习器,进而对未知数据分类或回归。其主要流程大致可分为七个部分,依次为设计获取数据特征集(特征构造和特征提取)、探索性地对数据质量分析评价、数据预处理、数据集划分、机器学习算法建模(学习器选择、特征筛选与参数调优)、任务选择(分类或回归)和精度评价与泛化性评估,设计获取数据特征集和机器学习算法建模是机器学习最为重要且关键的部分。

        传统机器学习的主要特征为需要人为设计定义数据特征并利用传统机器学习算法进行模型训练和通常受到数据量的限制。为缓解传统机器学习的大数据训练局限性,往往采用增量方式进行学习。常见的传统机器学习算法包括线性回归、逻辑回归、决策树、支持向量机、朴素贝叶斯、K最近邻等,而基于集成学习(模型融合、弱分类器集成和混合专家模型)、Bagging和Boosting思想又涌现出了随机森林、极端梯度提升和其它强大组合学习器等机器学习算法。

图一 传统机器学习通用流程图示

二、集成学习简述

1、集成学习定义[5]

        "模型集成"和"集成学习"是相同的概念。它们都指的是将多个机器学习模型组合在一起,以提高预测的准确性和稳定性的技术。通过结合多个模型的预测结果,集成学习可以减少单个模型的偏差和方差,并提供更可靠的预测结果。

2、集成学习的主要研究方向[7]

        模型融合模型融合在最初的时候被称为“分类器结合”,这个领域主要关注强评估器,试图设计出强大的规则来融合强分类器的结果,以获取更好的融合结果。这个领域的手段主要包括了投票法Voting、堆叠法Stacking、混合法Blending等,且被融合的模型需要是强分类器。

        弱分类器集成弱分类器集成主要专注于对传统机器学习算法的集成,这个领域覆盖了大部分我们熟悉的集成算法和集成手段,如装袋法bagging、提升法boosting。这个领域试图设计强大的集成算法,来将多个弱学习器提升为强学习器。

        混合专家模型(mixture of experts)混合专家模型常常出现在深度学习(神经网络)的领域。在其他集成领域当中,不同的学习器是针对同一任务、甚至在同一数据上进行训练,但在混合专家模型中,我们将一个复杂的任务拆解成几个相对简单且更小的子任务,然后针对不同的子任务训练个体学习器(专家),然后再结合这些个体学习器的结果得出最终的输出。

三、基于scikit-learn和XGBoost机器学习库的分类器构建

        scikit-learn机器学习库的运算均在CPU上实现且具有大数据量限制,而XGBoost库是GPU并行计算的工程实现库。XGBoost库可以实现在GPU上进行基于随机森林和极致梯度提升算法的分类训练任务。

1、决策树

# 决策树生成及训练
clf = tree.DecisionTreeClassifier(criterion="entropy"         #{"gini","entropy","log_loss"}不纯度计算方法
                                #   ,random_state=4        #固定随机种子,从而可复现这棵决策树
                                  ,max_depth=7              #{None,int}决策树可生长的最大深度
                                  ,max_features=None          #{None,int,float,"sqrt","log2"}分枝时所参与考虑的最大特征个数
                                  ,min_samples_leaf=1      #{1,int or float}分枝会向着满足每个子节点至少都包含设定值个样本的方向去发展,float[0,1]会作为比率乘以样本数
                                  ,splitter = "best"       #{"best","random"} 每一个节点分裂的方法。“best”会优先选择更重要的特征进行分枝;“random”在分枝时更加随机,树会更深
                                  ,min_impurity_decrease=0.0  #{0.0,float}若节点不纯度大于等于该值则必须再次进行节点分裂
                                  ,max_leaf_nodes=None         #{None,int}设置决策树只能生长出的最大叶子节点数
                                  ,class_weight=None        #{"None","balanced",dict {0:weight0,1:weight1,2:weight2,3:weight3} 以四分类为例,列表索引为类别标签
                                                           #使用class_weight参数对样本标签进行一定均衡,给少量的标签更多的权重,调整损失函数,让模型更偏向少数类,向捕获少数类的方向建模
                                  ,min_weight_fraction_leaf=0.0   #{0,0,float}min_weight_fraction_leaf搭配class_weight使用
                                 )
clf = clf.fit(Xtrain,Ytrain)

2、随机森林

# 基于scikit-learn实现随机森林分类器
clf = ensemble.RandomForestClassifier(n_estimators=50
                                        ,random_state=0
                                        ,criterion="gini"
                                        ,max_depth=8
                                        ,max_features=None
                                        ,min_impurity_decrease=0
                                        ,min_samples_split=2
                                        ,n_jobs=-1
                                        ,bootstrap=True
                                        ,oob_score=False
                                        )
clf = clf.fit(Xtrain,Ytrain)
# 基于XGBoost库实现随机森林分类器
RF_param = {"booster":"gbtree"              #随机森林必须设置为gbtree
            ,"num_parallel_tree":40          #相当于n_estimators,即森林的树数量
            ,"max_depth":8               
            ,"subsample": 0.8               #训练集采样
            ,"eta":1                        #随机森林必须设置为1
            ,"objective":"multi:softmax"
            ,"num_class":7
            ,"colsample_bytree":0.8         #{default=1,(0,1]}在建立提升树时对特征采样的比率
            ,"colsample_bylevel":0.8       #{default=1,(0,1]}在树的每一层级所考虑的特征采样比率
            ,"colsample_bynode":0.8         #{default=1,(0,1]}在树的每一节点需要分枝时所考虑的特征采样比率
            ,"tree_method":"hist"
            ,"device":"cuda"
            ,"verbosity":0                 #在训练过程中不打印信息
            # "random_state":0               #为了随机森林模型可复现,可以添加该参数
           }
# 训练迭代次数
num_boost_round = 1            #随机森林必须设置为1,防止变为提升随机森林
RF_train = xgb.DMatrix(X,Y)
RF_bst_model = xgb.train(RF_param,RF_train,num_boost_round) 

3、极致梯度提升

hyper_param = { "booster":"dart"                 #提升方法选择{"gbtree","gblinear","dart"},default为gbtree
                    ,"objective":"multi:softmax"                #优化目标函数(可参考https://blog.csdn.net/weixin_41990278/article/details/90945550)
                    ,"num_class":7                # 若"objective":"multi:softmax"则需要该参数搭配使用,以明确分类类别数
                    ,"max_depth":14                #(对模型影响起到重要作用)
                    ,"gamma":0                    #{default=0}(gamma参数与max_depth相互影响)该参数表示在树的叶子节点上进一步再分枝所需的最小减少损失
                    ,"eta":0.4946027456790744          #{default=0.3}模型提升学习率
                    ,"subsample": 0.7322769765320624                #训练集的采样比例(即用于训练模型的子样本占整个样本集合的比例)
                    ,"sampling_method":"uniform"   #{default=uniform},采样方式有uniform、subsample,gradient_based
                    ,"colsample_bytree":0.8296436370552397         #{default=1,(0,1]}在建立提升树时对特征采样的比率
                    ,"colsample_bylevel":0.9324152350516648        #{default=1,(0,1]}在树的每一层级所考虑的特征采样比率
                    ,"colsample_bynode":0.7855729164259361         #{default=1,(0,1]}在树的每一节点需要分枝时所考虑的特征采样比率
                    ,"lambda":0.00021262200589351114                   #{default=1}权重的L2正则项
                    ,"alpha":3.481194252535334e-06                    #{default=1}权重的L1正则项
                    ,"tree_method":"auto"           #{default=auto}构造树的方法,{exact,approx,hist(auto)}
                    ,"max_leaves":0                 #{default=0}树的最大叶子节点数量,不可用于tree method = exact
                    ,"device":"cuda"             #(缩短运算时间)将验证训练放置于GPU上训练
                    ,"nthread":-1                   #运行训练器的并行线程数(本机满线程则设置为-1)
                    # ,"scale_pos_weight":1          #{default=1}控制正负样本比例,用于数量不平衡数据集
                    # ,"grow_policy":"depthwise"      #{default=depthwise,lossguide}控制节点生长的方式,须在tree method = hist or approx下使用
                    # ,"seed":0             #可复现模型的参数,随机种子
                    # ,"num_parallel_tree":1         # 每一次训练迭代所构建的树的数量
                    # ,"verbosity":0                #[0,3]训练中是否打印每次训练的信息.(0-不打印;1-warning;2-info,3-debug)
                    }

# 开始训练
xy_train = xgb.DMatrix(X,Y)
num_boost_round = 70
bst_model = xgb.train(hyper_param,xy_train,num_boost_round)

API使用文档:

/*1*/ API reference — pandas 2.2.2 documentation

/*2*/ NumPy reference — NumPy v1.26 Manual

/*3*/ API Reference — scikit-learn 1.5.0 documentation

/*4*/ XGBoost Tutorials — xgboost 2.0.3 documentation(GPU计算并行化工程库)

/*5*/ API Reference — Optuna 3.6.1 documentation(超参数优化)

/*6*/ PhiK — Phi_K correlation library documentation(PhiK相关系数计算,适用类别标签和间隔变量)

参考资料:

[1] (超爽中英!) 2024公认最好的【吴恩达机器学习】教程!附课件代码 Machine Learning Specialization_哔哩哔哩_bilibili

[2] 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost总结

[3] HF.048 I Nature帮你整理了最核心的统计概念和方法,你确定不看看吗?(二)

[4] 突破机器学习核心点,特征工程!! (qq.com)

[5] 【机器学习】集成模型/集成学习:多个模型相结合实现更好的预测-腾讯云开发者社区-腾讯云 (tencent.com)

[6] 随机森林Python实战_哔哩哔哩_bilibili

[7] 【技术干货】集成算法专题:XGBoost(2022新版)_哔哩哔哩_bilibili

[8] 综述:机器学习中的模型评价、模型选择与算法选择! (qq.com)

[9] 机器学习8大调参技巧! (qq.com)

[10] 机器学习中7种常用的线性降维技术总结 (qq.com)

参考论文:

/**1**/ https://dl.acm.org/doi/pdf/10.1145/2939672.2939785(XGBoost)

/**2**/ https://link.springer.com/content/pdf/10.1023/a:1010933404324.pdf

/**3**/ http://www.cs.ecu.edu/~dingq/CSCI6905/readings/BaggingBoosting.pdf

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

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

相关文章

Reactor 网络模型、Java代码实例

文章目录 1. 概述2. Reactor 单线程模型2.1 ByteBufferUtil2.2 服务端代码2.3 客户端2.4 运行截图 3. Reactor多线程模型3.1 服务端代码3.2 运行截图 4. 主从 Reactor多线程模型4.1 服务端代码4.2 运行截图 参考文献 1. 概述 在 I/O 多路复用的场景下,当有数据处于…

ChatTTS-WebUI测试页面项目

概述 分享可以一个专门为对话场景设计的文本转语音模型ChatTTS,例如LLM助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。在HuggingFace中开源的版本为4万小时训练且未SFT的版本. 该模型能够预测和控制细粒度的韵律特…

跪求大数据把我推给做投资交易的红薯!

在qq群里认识了君诺金融Juno Markets外汇交易平台的业务经理,平台上大剌剌的打出20%交易返现活动,一时听信了他们的话在该平台有开户入金做交易,做了这家平台的代理,然而君诺金融Juno Markets平台却不给佣金,我都是属于…

浏览器必备插件:最新Allow copy万能网页复制下载,解锁网页限制!

今天阿星给大家安利一个超级实用的小工具,专治那些“禁止复制”的网页文字。学生党、资料搜集狂人,你们有福了! 想象一下,你在网上冲浪,突然遇到一篇干货满满的文章,正想复制下来慢慢品味,结果…

值传递和址传递

值传递 上面的代码是想要交换x,y的值,把x,y传递给swap函数之后,执行下面的操作: 在swap中a和b交换了,但是和x,y没有关系,所以x,y在main中不会变。 址传递 下面再看把x…

springcloud gateway转发websocket请求的404问题定位

一、问题 前端小程序通过springcloud gateway接入并访问后端的诸多微服务,几十个微服务相关功能均正常,只有小程序到后端推送服务的websocket连接建立不起来,使用whireshark抓包,发现在小程序通过 GET ws://192.168.6.100:8888/w…

Apple Intelligence 横空出世!它的独家秘诀在哪里?

在 WWDC 2024 大会上,苹果公司揭晓了自家的生成式 AI 项目——Apple Intelligence,其策略核心在于采用 ⌈ 更为聚焦的小型模型 ⌋ ,而非盲目追求大模型的普遍趋势。横空出世的它究竟有什么过人之处?一文带你探究竟!生成…

[DDR4] DDR1 ~ DDR4 发展史导论

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR4》 内存和硬盘是电脑的左膀右臂, 挑起存储的大梁。因为内存的存取速度超凡地快, 但内存上的数据掉电又会丢失,一直其中缓存的作用,就像是我们的工…

2786. 访问数组中的位置使分数最大

这并不是一个难题,但是我确实在做题中得到了一些启发,所以记录一下 先讲一讲这个题目的做法: 首先不难想到这是一个dp问题,(由 i 可以跳到 j ) 而且应该不难, 要不然就不是medium了,doge 那么,暴力的dp就是: dp[j] max (dp[i] nums OR dp[j] dp[i] nums - x) , i<j, 前…

mongodb 集群安装

1. 配置域名 Server1&#xff1a; OS version: CentOS Linux release 8.5.2111 hostnamectl --static set-hostname mongo01 vi /etc/sysconfig/network # Created by anaconda hostnamemong01 echo "192.168.88.20 mong1 mongo01.com mongo02.com" >> /…

【笔记】【矩阵的二分】668. 乘法表中第k小的数

力扣链接&#xff1a;题目 参考地址&#xff1a;参考 思路&#xff1a;二分查找 把矩阵想象成一维的已排好序的数组&#xff0c;用二分法找第k小的数字。 假设m行n列&#xff0c;则对应一维下标范围是从1到mn&#xff0c;初始&#xff1a; l1; rmn; mid(lr)/2 设mid在第i行&a…

【C++11】第一部分(一万六千多字)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 C11简介 统一的列表初始化 &#xff5b;&#xff5d;初始化 std::initializer_list 声明 auto decltype 右值引用和移动语义 左值引用和右值引用 左值引…

C#实现WMI获取硬盘参数

文章目录 背景涉及框架及库WMI查询小工具参数解释U盘移动硬盘本机设备 总结 背景 因为需求需要涉及获取硬盘的SN参数&#xff0c;但是又不想要获取到U盘或移动硬盘设备的SN&#xff0c;所以就浅浅的研究了一下。 以下就是我目前发现的一些参数的作用&#xff0c;够我用了。。。…

QT QFileDialog文件选择对话框

QT QFileDialog文件选择对话框 选择txt或者cpp文件&#xff0c;读取内容并显示 参考&#xff1a; QT写入文件与读取文件内容_qt往一个文件写东西-CSDN博客 #include "QtFilePreview.h" #include "qfiledialog.h" #include "qfile.h" #includ…

【记录】ChatGLM3-6B大模型部署、微调(二):微调

前言 上文记录了ChatGLM3-6B大模型本地化部署过程&#xff0c;本次对模型进行微调&#xff0c;目的是修改模型自我认知。采用官方推荐微调框架&#xff1a;LLaMA-Factory 安装LLaMA-Factory # 克隆项目 git clone https://github.com/hiyouga/LLaMA-Factory.git 安装依赖 # 安装…

Android入门第68天-自动更新/升级怎么做(生产级实例)

开篇 今天我们进入第68讲。 在第60天左右其实很多同学们已经进入了APP应用开发了,因为60天内容足以让大家踏上正实的Android开发生涯。 随着开发的深入,我们发觉日常工作中无非就是一些组件的嵌套、合理应用。当代码迭代、功能迭代越来越频繁后我们面临着另一个问题,即:…

Flutter项目,Xcode15, 编译正常,但archive报错

错误提示 PhaseScriptExecution [CP]\ Embed\ Pods\ Frameworks /Users/目录/Developer/Xcode/DerivedData/Runner-brgnkruocugbipaswyuwsjsnqkzm/Build/Intermediates.noindex/ArchiveIntermediates/Runner/IntermediateBuildFilesPath/Runner.build/Release-iphoneos/Runner…

世界酒中国菜全球组委会发布2024年度VIS视觉融合潘通柔和桃色调

世界酒中国菜全球组委会发布2024年度VIS视觉 融合潘通柔和桃色调引领全球风尚 2023年12月7日&#xff0c;国际色彩权威机构&#xff08;潘通&#xff09;Pantone公司发布了2024年度代表色&#xff1a;Peach Fuzz&#xff08;PANTONE 13-1023&#xff09;柔和桃色调&#xff0…

Mybatis动态sql标签

动态SQL标签简介: MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。 Mybatis中实现动态sql的标签有&#x…

重生之 SpringBoot3 入门保姆级学习(22、场景整合 远程调用阿里云天气服务获取天气)

重生之 SpringBoot3 入门保姆级学习&#xff08;22、场景整合 远程调用阿里云天气服务获取天气&#xff09; 6.3 远程调用三方 API 6.3 远程调用三方 API 1、创建项目时需要选择 Spring Reactive Web 2、0元购买天气服务 API &#xff0c;我这里买了是生产中没有购买的话会显示…