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

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

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

        传统机器学习的主要特征为需要人为设计定义数据特征并利用传统机器学习算法进行模型训练和通常受到数据量的限制。为缓解传统机器学习的大数据训练局限性,往往采用增量方式进行学习。常见的传统机器学习算法包括线性回归、逻辑回归、决策树、支持向量机、朴素贝叶斯、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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

20240615给飞凌的OK3588-C开发板刷Rockchip原厂的Buildroot后的测试报告

20240615给飞凌的OK3588-C开发板刷Rockchip原厂的Buildroot后的测试报告: 【切记,由于没有替换DTS的,开发板发热量巨大!因此配备鼓风机进行加强散热了】 0、adb 默认没有 1、HDMI IN 4K 2024/6/15 20:32 4K全屏 2、HDMI OUT …

博客论坛系统java博客管理系统基于springboot+vue的前后端分离博客论坛系统

文章目录 博客论坛系统一、项目演示二、项目介绍三、部分功能截图四、部分代码展示五、底部获取项目源码(9.9¥带走) 博客论坛系统 一、项目演示 博客论坛系统 二、项目介绍 基于springbootvue的前后端分离博客论坛系统 系统角色&#xff1a…

【Arthas案例】某应用依赖两个GAV不同但包含两个相同全限定类名StaticLoggerBinder,引起log4j.Level类找不到异常

3分钟内解决问题 两个不同的GAV依赖冲突,包含相同全限定类名,引起ClassNotFoundException Maven依赖的三坐标体系GAV(G-groupId,A-artifactId,V-version) 【案例1】某应用依赖两个GAV不同的jar,但包含两个相同全限定类…

虚函数机制-动态绑定的应用

虚函数使得程序在运行的时候根据指针指向对象的类型来确定调用哪个函数。 下图中:都为静态绑定。因为在编译器就确定了可以调用的函数 此时当基类指针指向派生类对象时,因为没有virtual关键字,所以在编译阶段就根据指针类型确定了要指向的函…

MEMS:Lecture 17 Noise MDS

讲义 Minimum Detectable Signal (MDS) Minimum Detectable Signal(最小可检测信号)是指当信号-噪声比(Signal-to-Noise Ratio, SNR)等于1时的输入信号水平。简单来说,MDS 是一个系统能够分辨出信号存在的最低输入信号…

Tomcat基础详解

第一篇:Tomcat基础篇 lecture:邓澎波 一、构建Tomcat源码环境 工欲善其事必先利其器,为了学好Tomcat源码,我们需要先在本地构建一个Tomcat的运行环境。 1.源码环境下载 源码有两种下载方式: 1.1 官网下载 https://…

matplotlib twinx多y轴但单个图例

matplotlib 用 twinx 画多 y 轴参考 [1]。现想在画图例时,多个 y 轴的图例画在一起,写法参考 [2]。本文展示一个简例,效果: Code 要手动指定颜色,否则原 y 轴的用色和新 y 轴会重合。 import matplotlib.pyplot as…

基于SVD的点云配准(下)

点云配准及特征提取详细解读 本篇博客将介绍一个用于点云配准的 C++ 代码示例,该示例使用 PCL(Point Cloud Library)库来处理和配准两个点云数据集。我们将逐步解析代码的关键部分,并解释每个步骤的作用。 代码说明 代码的整体结构及其主要功能: int main(int argc, ch…

VRChat 2024年裁员原因与背景深度分析

VRChat,作为2022年元宇宙/VR社交领域的巨头,近期在2024年宣布裁员计划,其背后原因和背景值得业界尤其是仍在纯元宇宙虚拟空间创业的同仁们重点关注。 一、创始人决策失误 根据CEO的邮件披露,VRChat的创始人因缺乏经验和过度自信…

Vue基本使用-02

上节我们讲了什么是mvvm模型,以及我们vue的一些常用指令,今天给大家讲一下vue的基本使用,在将之前我们需要重点讲解我们的一个指令,v-model指令 v-model v-model 可以在组件上使用以实现双向绑定,什么是双向绑定呢?意思就是当我们…

[C#]使用C#部署yolov10的目标检测tensorrt模型

【测试通过环境】 win10 x64vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super cuda和tensorrt版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll,TensorRtExtern源码地址:T…

IP地址、子网掩码、网段、网关

前面相同就是在同一个网段 如果子网掩码和网络号相与的结果是一样的,那么他们就在同一个子网 IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?_掩码248可以用几个ip-CSDN博客

第九届星华杯网络邀请赛

T1喵星人的身高 T2犇犇碑 T3嘤嘤词典 T4三角区间和

REST风格

黑马程序员Spring Boot2 文章目录 1、REST简介1.1 优点1.2 REST风格简介1.3 注意事项 2、RESTful入门案例 1、REST简介 1.1 优点 隐藏资源的访问行为,无法通过地址的值对资源适合中操作书写简化 1.2 REST风格简介 按照RST风格访问资源时使用行为动作区分对资源进…

滚珠螺杆失效的常见原因及应对措施!

滚珠螺杆,由螺杆、螺母、钢球、预压片、反向器和防尘器组成,是精密机床中必不可少的组件,也是工业界使用最广泛的零组件之一。在长期使用过程中,滚珠螺杆难免会发生失效或运动停止的情况,影响机械设备的正常运行和最终…

PlugLink:让数据分析与工作流无缝连接(附源码)

PlugLink:让数据分析与工作流无缝连接 引言 数据分析和自动化工作流已成为各个企业和个人提高效率的关键手段。今天,我要介绍一款名为PlugLink的工具,它不仅能帮助你轻松进行数据分析,还能将这些分析结果无缝连接到你的工作流中&…

视频信号发生器上位机

在液晶屏测试、电视机信号测试、视频处理器测试中,经常需要使用视频信号发生器,市场上专业的视频信号发生器通常需要大几千元,多则上万元,而且设备测试仪器是一套硬件,没有办法像软件一样复制传播。所以我开发了一套基…

12月5-7日西安氢能源及燃料电池产业博览会

展会概况: 作为战略性新兴产业,发展氢能已经成为全国各地布局未来产业的重要方向。2023年以来,在政策与市场的双重驱动下,氢能的应用领域正在不断拓展和创新,当前我国氢能源迎来发展热潮,预计到 2025 年国…

L52--- 144. 二叉树的后序遍历(深搜)---Java版

1.题目描述 2.思路 (1)二叉树后序遍历:左右根 (2)根节点的压入: 根节点首先被压入stack中,然后被弹出并压入output中。 遍历过程: stack用于存储需要遍历的节点。 output用于反转遍历顺序。 入栈顺序: 左子节点先入栈,右子节点后入栈。这…

GStreamer 源码编译,在 Clion 下搭建调试环境

前言 最近在学习 GStreamer,官方提供了一些教程,本人希望能够断点调试,以便学习代码逻辑。本文记录如何在 Clion 搭建 GStreamer 源码编译、调试环境 步骤 下载源码 git clone https://gitlab.freedesktop.org/gstreamer/gstreamer.gitCl…