【Python】 XGBoost vs LightGBM:两大梯度提升框架的对比


原谅把你带走的雨天
在渐渐模糊的窗前
每个人最后都要说再见
原谅被你带走的永远
微笑着容易过一天
也许是我已经 老了一点
那些日子你会不会舍不得
思念就像关不紧的门
空气里有幸福的灰尘
否则为何闭上眼睛的时候
又全都想起了
谁都别说
让我一个人躲一躲
你的承诺
我竟然没怀疑过
反反覆覆
要不是当初深深深爱过
我试着恨你
却想起你的笑容
                     🎵 陈楚生/单依纯《原谅》


在机器学习领域,XGBoost(Extreme Gradient Boosting)和LightGBM(Light Gradient Boosting Machine)是两种非常流行且高效的梯度提升框架。它们在各种数据科学竞赛和实际应用中表现出色,尤其是在处理大规模数据和高维数据时。本文将对XGBoost和LightGBM进行详细对比,帮助你理解它们的优劣和适用场景。

什么是XGBoost和LightGBM?

  • XGBoost:由Tianqi Chen等人开发,是一种基于梯度提升决策树(GBDT)的开源框架。XGBoost因其高效、准确和可扩展性而受到广泛欢迎。

  • LightGBM:由微软开发,是另一种基于GBDT的框架。LightGBM以其快速训练速度和低内存占用著称,特别适用于大数据场景。

主要特点对比

  1. 速度和性能
    训练速度:LightGBM通常比XGBoost更快。这是因为LightGBM采用了基于直方图的算法,减少了数据扫描次数,提高了效率。
    内存使用:LightGBM的内存占用通常较低,因为它通过直方图方法和特征捆绑技术减少了内存使用。
  2. 算法实现
    XGBoost:采用按层生长的决策树(level-wise),即每次分裂所有节点。这种方法可以更好地控制树的结构,但在大数据集上效率较低。
    LightGBM:采用按叶子生长的决策树(leaf-wise),即每次选择增益最大的叶子节点进行分裂。这种方法可以生成更深的树,提高模型的准确性,但可能导致过拟合,需要通过设置最大深度或叶子节点数来控制。
  3. 特征处理
    类别特征:LightGBM能够直接处理类别特征,而XGBoost需要对类别特征进行预处理,如one-hot编码。
    缺失值处理:XGBoost和LightGBM都能够自动处理缺失值,但LightGBM在处理大规模数据时表现更好。
  4. 并行和分布式计算
    并行计算:XGBoost和LightGBM都支持并行计算,但LightGBM在大规模数据集上的分布式计算能力更强。
    分布式训练:LightGBM能够更好地支持分布式训练,适用于超大规模数据集。
    实际应用对比

数据准备

假设我们有一个客户流失预测的数据集,包含客户特征和是否流失的标注(流失为1,未流失为0)。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, classification_report# 加载数据
df = pd.read_csv('customer_churn.csv')# 特征和目标变量
X = df.drop('churn', axis=1)
y = df['churn']# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
XGBoost模型训练和评估
python
复制代码
import xgboost as xgb# 转换数据格式为DMatrix
dtrain = xgb.DMatrix(X_train, label=y_train)
dtest = xgb.DMatrix(X_test, label=y_test)# 设置XGBoost参数
params = {'booster': 'gbtree','objective': 'binary:logistic','eval_metric': 'logloss','eta': 0.1,'max_depth': 6,'scale_pos_weight': 80,'subsample': 0.8,'colsample_bytree': 0.8,'seed': 42
}# 训练模型
num_round = 100
bst = xgb.train(params, dtrain, num_round)# 模型预测
y_pred_prob = bst.predict(dtest)
y_pred = (y_pred_prob > 0.5).astype(int)# 评估模型
print(f"XGBoost Accuracy: {accuracy_score(y_test, y_pred)}")
print("XGBoost Classification Report:")
print(classification_report(y_test, y_pred))

LightGBM模型训练和评估

import lightgbm as lgb# 创建LightGBM数据集
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)# 设置LightGBM参数
params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'binary_logloss','learning_rate': 0.1,'num_leaves': 31,'max_depth': -1,'min_data_in_leaf': 20,'feature_fraction': 0.8,'bagging_fraction': 0.8,'bagging_freq': 5,'lambda_l1': 0.1,'lambda_l2': 0.1,'scale_pos_weight': 80,'verbose': -1
}# 训练模型
num_round = 100
bst = lgb.train(params, train_data, num_round, valid_sets=[test_data], early_stopping_rounds=10)# 模型预测
y_pred_prob = bst.predict(X_test, num_iteration=bst.best_iteration)
y_pred = (y_pred_prob > 0.5).astype(int)# 评估模型
print(f"LightGBM Accuracy: {accuracy_score(y_test, y_pred)}")
print("LightGBM Classification Report:")
print(classification_report(y_test, y_pred))

总结

XGBoost和LightGBM都是强大的梯度提升框架,各有优劣:

  • XGBoost:适用于各种数据集,算法成熟稳定,参数调节细腻。
  • LightGBM:在大规模数据和高维数据上表现更佳,训练速度更快,内存占用更低,适合需要快速迭代的大数据场景。

选择合适的框架取决于具体的应用场景和数据特征。在实际应用中,可以尝试两种框架并进行对比,以选择性能最佳的模型。希望本文能帮助你更好地理解和使用XGBoost和LightGBM,为你的机器学习项目提供有力支持。

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

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

相关文章

泰拉瑞亚从零开始的开服教程

前言 本教程将讲诉使用Linux系统搭建泰拉瑞亚服务器(因为网上已经有很完善的windows开服教程了),使用的Linux发行版是Debian11,服务端使用的程序是TShock,游戏版本是1.4.4.9 所需要准备的 一台服务器(本教程使用的是…

tldk之tle简单记录

文章目录 1.tle简介2.tle处理tcp3.tle处理udp4.tle封装包头 项目中遇到了tldk中tle的使用,不太熟悉,这里记录一下,方便以后回顾 tldk源码位置: tldk源码 简单理解:这里我们项目大概dpdk从网卡收到数据包之后&#xff…

解决Jupyter运行代码显示Kernel Restarting的错误

在Jupyter notebook上运行代码时发现如下错误: 使用VS Code运行在日志表中发现错误存在: 它表明在初始化"libiomp5md.dll"库时发生问题,因为该库已经被初始化过了,这个错误可能是由于程序中重复初始化OpenMP库导致的&am…

深入探索C++ Vector容器:灵活的动态数组秘籍

目录 ​编辑 引言 一、初识vector:构造与初始化 二、动态管理:添加与删除元素 三、访问与遍历:多种方式直达元素 四、容量与大小:动态调整的艺术 五、进阶技巧:高效运用vector 结语 引言 在C编程的世界里&…

驱动命令之insmod depmod modprobe rmmod modinfo lsmod

insmod命令 insmod需指定所需加载模块的路径&#xff0c;且只加载所指定的模块&#xff0c;如果所指定的模块依赖于其他模块&#xff0c;insmod不会自动添加&#xff1b; 语法 insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 符号值] 参数说明&#xff1a; -f…

微信小程序如何跳转微信公众号

1. 微信小程序如何跳转微信公众号 1.2. 微信公众号配置 登录微信公众号&#xff0c;点击【小程序管理】&#xff1a;   点击【添加】&#xff1a;   点击【关联小程序】&#xff1a;   输入小程序进行关联&#xff1a; 1.2. 微信小程序配置 登录微信小程序&#xf…

vue-router配置路由重定向不生效问题

概述 在做前端vue项目测试时&#xff0c;发现在路由配置中配置访问地址“http://ip:port/” 重定向到某个地址时&#xff0c;界面没有显示重定向后的地址。 能保证的是我的vue写法绝对没错。 简要代码 App.vue: <template><div id"app"><rout…

SQL注释方法 -- 单行注释/多行注释

三种注释方法 # 注释同行后面的内容&#xff1b; /* */ 注释中间的内容&#xff0c;可多行&#xff1b; -- 行注释&#xff0c;-- 后必须加空格。 # 注释同行后面的内容&#xff1b;/* 注释中间的内容&#xff0c; 可多行&#xff1b; */ -- 行注释&#xff0c;-- 后…

Django之Ajax实战笔记--城市级联操作

1. 项目架构搭建 1.1 创建项目tpdemo,创建应用myapp # 创建项目框架tpdemo$ django-admin startproject tpdemo$ cd tpdemo# 在项目中创建一个myapp应用$ python manage.py startapp myapp# 创建模板目录$ mkdir templates$ mkdir templates/myapp$ cd ..$ tree tpdemotpdemo…

HTTP的由来以及发展史

HTML&HTML5的学习探索 01、Html的由来和发展史 01-01、Html的由来 HTML的英文全称是 Hypertext Marked Language&#xff0c;即超文本标记语言。HTML是由Web的发明者 Tim Berners-Lee&#xff08;蒂姆伯纳斯李&#xff09;于1990年创立的一种标记语言&#xff0c; 他是万…

Sip协议(一)

Sip协议(一) 本文主要介绍sip协议 1: 简介 ​ SIP&#xff08;Session Initiation Protocol&#xff0c;会话发起协议&#xff09;是一种应用层协议&#xff0c;它被广泛应用于VoIP&#xff08;Voice over Internet Protocol&#xff0c;互联网语音通信&#xff09;中。 ​…

返回枚举类给前端

1. 前言 在实际开发过程中&#xff0c;前端的下拉框或者单选按钮的内容通常的需要和后端匹配的&#xff0c;故一般会由后端将下拉框的内容或单选框的内容传给前端&#xff0c;而这些内容在后端一般是由枚举类存储的&#xff0c;如果后端直接返回枚举类&#xff0c;返回结果将会…

K-means聚类算法详细介绍

目录 &#x1f349;简介 &#x1f348;K-means聚类模型详解 &#x1f348;K-means聚类的基本原理 &#x1f348;K-means聚类的算法步骤 &#x1f348;K-means聚类的优缺点 &#x1f34d;优点 &#x1f34d;缺点 &#x1f348;K-means聚类的应用场景 &#x1f348;K-mea…

SQL Server2019安装步骤教程(图文)_最新教程

一、下载SQL Server2019 1.到微软官网下载SQL Server Developer版本&#xff0c;官网当前的2019版本下载需要注册账号。 不想注册的朋友&#xff0c;可以选择从网盘下载&#xff1a;点击此处直接下载 2.下载之后先解压&#xff0c;解压后执行exe安装程序。打开之后的界面如下…

学 Java 具体能干什么?

学习 Java 后&#xff0c;你可以从事许多不同的工作和项目&#xff0c;涵盖了广泛的应用领域。以下是一些具体的应用场景和工作方向&#xff1a; 1. 企业级应用开发 Java 是企业级应用开发的首选语言之一&#xff0c;特别适合开发大规模、分布式、多层次的企业应用程序。 Jav…

在UbuntuLinux系统上安装MySQL和使用

前言 最近开始计划在Ubuntu上写一个webserver的项目&#xff0c;看到一些比较好的类似的项目使用了MySQL&#xff0c;我就打算先把环境搞好跑一下试试&#xff0c;方便后面更进一步的学习。其实在本机windows上我已经有一个mysql&#xff0c;不过 在Unbuntu上安装MySQL 首先…

ai - RAG

RAG & web <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>ChatGPT 应用页面</title><…

1960-2022年世界银行WDI面板数据(1400+指标)

1960-2022年世界银行WDI面板数据&#xff08;1400指标&#xff09; 1、时间&#xff1a;1960-2022年 2、来源&#xff1a;世界银行WDI 指标&#xff1a;包括健康、公共部门、农业与农村发展、城市发展、基础设施、外债、性别、援助效率、教育、气候变化、环境、社会保护与劳…

【Python】机器学习中的过采样和欠采样:处理不平衡数据集的关键技术

原谅把你带走的雨天 在渐渐模糊的窗前 每个人最后都要说再见 原谅被你带走的永远 微笑着容易过一天 也许是我已经 老了一点 那些日子你会不会舍不得 思念就像关不紧的门 空气里有幸福的灰尘 否则为何闭上眼睛的时候 又全都想起了 谁都别说 让我一个人躲一躲 你的承诺 我竟然没怀…

【Vue2入门技能树】:Vue2项目从入门到放弃所遇到的问题汇总

1、body中自带 margin: 8px 的问题 解决办法&#xff1a;在 public 目录下的 index.html 中加入如下样式即可 <style>* {margin: 0;} </style>2、使用vue-router、vuex ①在项目所在文件夹下打开 cmd 终端&#xff0c;然后运行如下代码&#xff0c;等待安装 //…