【python 机器学习】机器学习算法之LightGBM

2024-09-07 05:58

本文主要是介绍【python 机器学习】机器学习算法之LightGBM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法介绍:
LightGBM 由微软2017年提出,主要用于解决 GDBT 在海量数据中遇到的问题,以便其可以更好更快地用于工业实践中。从 LightGBM 名字我们可以看出其是轻量级(Light)的梯度提升机(GBM),其相对 XGBoost 具有训练速度快、内存占用低的特点。
实际上,XGBoost和lightGBM都属于GBDT的一种实现,旨在优化算法的性能,提升算法的训练速度,与XGBoost相比,lightGBM更适应于数据量更大的场景。从GBDT->XGBoost->lightGBM,在模型训练阶段,是不能百分百地断定lightGBM就比GBDT和XGBoost好,因为数据量的大小也决定了模型的可行性。所以实际场景中,还是建议一一尝试之后再做抉择。

在这里插入图片描述

高效梯度提升(LightGBM)
(1)、LightGBM也能提供比XGBoost更高的准确性和更短的训练时间;
(2)、支持并行的树增强操作,即使在大型数据集上(相比于 XGBoost)也能提供更快的训练速度;
(3)、使用直方图histogram-esquealgorithm,将连续的特征转化为离散的特征,从而实现了极快的训练速度和较低的内存使用率;
(4)、通过使用垂直拆分(leaf-wise split)而不是水平拆分(level-wise split)来获得极高的准确性,这会导致非常快速的聚合现象,并在非常复杂的树结构中能捕获训练数据的底层模式。可以通过使用 num_leaves 和 max_depth 这两个超参数来控制过度拟合;

LightGBM在很多方面会比XGBoost表现的更为优秀。它有以下优势:

1、更快的训练效率

2、低内存使用

3、更高的准确率

4、支持并行化学习

5、可处理大规模数据

6、支持直接使用category特征

LightGBM调参指导:

针对 leaf-wise 树的参数优化:num_leaves:控制了叶节点的数目。它是控制树模型复杂度的主要参数。如果是level-wise,则该参数为  ,其中depth为树的深度。但是当叶子数量相同时,leaf-wise的树要远远深过level-wise树,非常容易导致过拟合。因此应该让num_leaves小于  。在leaf-wise树中,并不存在depth的概念。因为不存在一个从leaves到depth的合理映射。min_data_in_leaf:每个叶节点的最少样本数量。它是处理leaf-wise树的过拟合的重要参数。将它设为较大的值,可以避免生成一个过深的树。但是也可能导致欠拟合。max_depth: 控制了树的最大深度。该参数可以显式的限制树的深度。针对更快的训练速度:通过设置 bagging_fraction 和 bagging_freq 参数来使用 bagging 方法通过设置 feature_fraction 参数来使用特征的子抽样使用较小的 max_bin使用 save_binary 在未来的学习过程对数据加载进行加速获取更好的准确率:使用较大的 max_bin (学习速度可能变慢)使用较小的 learning_rate 和较大的 num_iterations使用较大的 num_leaves (可能导致过拟合)使用更大的训练数据尝试 dart缓解过拟合:使用较小的 max_bin使用较小的 num_leaves使用 min_data_in_leaf 和 min_sum_hessian_in_leaf通过设置 bagging_fraction 和 bagging_freq 来使用 bagging通过设置 feature_fraction 来使用特征子抽样使用更大的训练数据使用 lambda_l1, lambda_l2 和 min_gain_to_split 来使用正则尝试 max_depth 来避免生成过深的树核心参数:config 或者config_file:一个字符串,给出了配置文件的路径。默认为空字符串。task: 一个字符串,给出了要执行的任务。可以为:‘train’ 或者 ‘training’:表示是训练任务。默认为’train’。‘predict’ 或者 ‘prediction’或者’test’:表示是预测任务。‘convert_model’: 表示是模型转换任务。将模型文件转换成if-else 格式。application或者objective或者app:一个字符串,表示问题类型。可以为:‘regression’或’regression_l2’或’mean_squared_error’或’mse’或’l2_root’或’root_mean_squred_error’或’rmse’:表示回归任务,但是使用L2损失函数。默认为’regression’‘regression_l1’或者mae或者mean_absolute_error:表示回归任务,但是使用L1损失函数。‘huber’: 表示回归任务,但是使用huber 损失函数。‘fair’: 表示回归任务,但是使用fair 损失函数。‘poisson’: 表示Poisson 回归任务。‘quantile’: 表示quantile回归任务。‘quantile_l2’:表示quantile回归任务,但是使用了L2 损失函数。‘mape’ 或者’mean_absolute_precentage_error’: 表示回归任务,但是使用MAPE 损失函数‘gamma’: 表示gamma 回归任务。‘tweedie’: 表示tweedie 回归任务。‘binary’: 表示二分类任务,使用对数损失函数作为目标函数。‘multiclass’: 表示多分类任务,使用softmax 函数作为目标函数。必须设置num_class 参数‘multiclassova’ 或者’multiclass_ova’ 或者’ova’ 或者’ovr’: 表示多分类任务,使用one-vs-all 的二分类目标函数。必须设置num_class 参数‘xentropy’ 或者’cross_entropy’: 目标函数为交叉熵(同时具有可选择的线性权重)。要求标签是[0,1] 之间的数值。‘xentlambda’ 或者’cross_entropy_lambda’: 替代了参数化的cross_entropy 。要求标签是[0,1]之间的数值。‘lambdarank’:表示排序任务。在lambdarank 任务中,标签应该为整数类型,数值越大表示相关性越高。label_gain 参数可以用于设置整数标签的增益(权重)boosting 或者’boost’ 或者 ‘boosting_type’: 一个字符串,给出了基学习器模型算法。可以为:‘gbdt’: 表示传统的梯度提升决策树。默认值为’gbdt’‘rf’: 表示随机森林。‘dart’: 表示带dropout 的gbdtgoss:表示Gradient-based One-Side Sampling 的gbdtdata或者train或者train_data:一个字符串,给出了训练数据所在的文件的文件名。默认为空字符串。lightgbm将使用它来训练模型。valid或者test或者valid_data或者test_data:一个字符串,表示验证集所在的文件的文件名。默认为空字符串。lightgbm将输出该数据集的度量。如果有多个验证集,则用逗号分隔。num_iterations或者num_iteration或者num_tree或者num_trees或者num_round或者num_rounds或者num_boost_round 一个整数,给出了boosting的迭代次数。默认为 100。对于python/R包,该参数是被忽略的。对于python,使用train()/cv()的输入参数num_boost_round来代替。在内部,lightgbm对于multiclass 问题设置了num_class*num_iterations 棵树。learning_rate或者shrinkage_rate: 个浮点数,给出了学习率。默认为1。在dart 中,它还会影响dropped trees 的归一化权重。num_leaves或者num_leaf:一个整数,给出了一棵树上的叶子数。默认为 31tree_learner或者tree:一个字符串,给出了tree learner,主要用于并行学习。 默认为’serial’。 可以为:‘serial’: 单台机器的tree learner‘feature’: 特征并行的tree learner‘data’: 数据并行的tree learner‘voting’: 投票并行的tree learnernum_threads 或者num_thread 或者nthread:一个整数, 给出了lightgbm 的线程数。默认为OpenMP_default。为了更快的速度,应该将它设置为真正的CPU 内核数,而不是线程的数量(大多数CPU 使用超线程来使每个CPU内核生成2个线程)。当数据集较小的时候,不要将它设置的过大对于并行学习,不应该使用全部的CPU核心,因为这会使得网络性能不佳device: 一个字符串,指定计算设备。默认为’cpu’。 可以为’gpu’,’cpu’。建议使用较小的max_bin 来获得更快的计算速度为了加快学习速度,GPU 默认使用32位浮点数来求和。你可以设置gpu_use_dp=True 来启动64位浮点数,但是它会使得训练速度降低。学习控制参数:max_depth: 一个整数,限制了树模型的最大深度,默认值为-1。如果小于0,则表示没有限制。min_data_in_leaf 或者 min_data_per_leaf 或者 min_data或者min_child_samples: 一个整数,表示一个叶子节点上包含的最少样本数量。默认值为 20min_sum_hessian_in_leaf 或者 min_sum_hessian_per_leaf或者 min_sum_hessian 或者 min_hessian或者min_child_weight: 一个浮点数,表示一个叶子节点上的最小hessian 之和。(也就是叶节点样本权重之和的最小值) 默认为1e-3 。feature_fraction或者sub_feature或者colsample_bytree:一个浮点数,取值范围为[0.0,1.0], 默认值为0。如果小于1.0,则lightgbm 会在每次迭代中随机选择部分特征。如0.8 表示:在每棵树训练之前选择80% 的特征来训练。feature_fraction_seed: 一个整数,表示feature_fraction 的随机数种子,默认为2。bagging_fraction 或者sub_row 或者 subsample:一个浮点数,取值范围为[0.0,1.0], 默认值为0。如果小于1.0,则lightgbm 会在每次迭代中随机选择部分样本来训练(非重复采样)。如0.8 表示:在每棵树训练之前选择80% 的样本(非重复采样)来训练。bagging_freq 或者subsample_freq:一个整数,表示每bagging_freq 次执行bagging。如果该参数为0,表示禁用bagging。bagging_seed 或者 bagging_fraction_seed:一个整数,表示bagging 的随机数种子,默认为 3 。early_stopping_round 或者 early_stopping_rounds或者early_stopping:一个整数,默认为0。如果一个验证集的度量在early_stopping_round 循环中没有提升,则停止训练。如果为0则表示不开启早停。lambda_l1 或者reg_alpha: 一个浮点数,表示L1正则化系数。默认为0lambda_l2 或者reg_lambda: 一个浮点数,表示L2正则化系数。默认为0min_split_gain 或者min_gain_to_split: 一个浮点数,表示执行切分的最小增益,默认为0drop_rate: 一个浮点数,取值范围为[0.0,1.0],表示dropout 的比例,默认为1。 该参数仅在dart 中使用skip_drop: 一个浮点数,取值范围为[0.0,1.0],表示跳过dropout 的概率,默认为5。 该参数仅在dart 中使用max_drop: 一个整数,表示一次迭代中删除树的最大数量,默认为50。 如果小于等于0,则表示没有限制。 该参数仅在dart 中使用uniform_drop:一个布尔值,表示是否想要均匀的删除树,默认值为False。 该参数仅在dart 中使用xgboost_dart_mode: 一个布尔值,表示是否使用xgboost dart 模式,默认值为False。该参数仅在dart 中使用drop_seed: 一个整数,表示dropout 的随机数种子,默认值为 4。 该参数仅在dart 中使用top_rate: 一个浮点数,取值范围为[0.0,1.0],表示在goss 中,大梯度数据的保留比例,默认值为2。该参数仅在goss 中使用other_rate: 一个浮点数,取值范围为[0.0,1.0],表示在goss 中,小梯度数据的保留比例,默认值为1。该参数仅在goss 中使用min_data_per_group:一个整数,表示每个分类组的最小数据量,默认值为100。用于排序任务max_cat_threshold: 一个整数,表示category 特征的取值集合的最大大小。默认为 32 。cat_smooth: 一个浮点数,用于category 特征的概率平滑。默认值为 10。它可以降低噪声在category 特征中的影响,尤其是对于数据很少的类。cat_l2: 一个浮点数,用于category 切分中的L2 正则化系数。默认为 10 。top_k 或者 topk: 一个整数,用于投票并行中。默认为20 。将它设置为更大的值可以获得更精确的结果,但是会降低训练速度。IO 参数:max_bin: 一个整数,表示最大的桶的数量。默认值为 255。lightgbm 会根据它来自动压缩内存。如max_bin=255 时,则lightgbm 将使用uint8 来表示特征的每一个值。min_data_in_bin: 一个整数,表示每个桶的最小样本数。默认为3。该方法可以避免出现一个桶只有一个样本的情况。data_random_seed: 一个整数,表示并行学习数据分隔中的随机数种子。默认为1它不包括特征并行。output_model或者model_output或者model_out: 一个字符串,表示训练中输出的模型被保存的文件的文件名。默认txt 。input_model或者model_input或者model_in: 一个字符串,表示输入模型的文件的文件名。默认空字符串。对于prediction任务,该模型将用于预测数据,对于train任务,训练将从该模型继续output_result或者 predict_result或者prediction_result:一个字符串,给出了prediction 结果存放的文件名。默认为txt。pre_partition 或者 is_pre_partition: 一个布尔值,指示数据是否已经被划分。默认值为False。 如果为true,则不同的机器使用不同的partition 来训练。它用于并行学习(不包括特征并行)is_sparse或者 is_enable_sparse或者enable_sparse: 一个布尔值,表示是否开启稀疏优化,默认为True。如果为True则启用稀疏优化。two_round 或者two_round_loading或者 use_two_round_loading: 一个布尔值,指示是否启动两次加载。默认值为False,表示只需要进行一次加载。默认情况下,lightgbm 会将数据文件映射到内存,然后从内存加载特征,这将提供更快的数据加载速度。但是当数据文件很大时,内存可能会被耗尽。如果数据文件太大,则将它设置为Truesave_binary或者is_save_binary或者 is_save_binary_file: 一个布尔值,表示是否将数据集(包括验证集)保存到二进制文件中。默认值为False。如果为True,则可以加快数据的加载速度。verbosity 或者verbose:一个整数,表示是否输出中间信息。默认值为1。如果小于0,则仅仅输出critical 信息;如果等于0,则还会输出error,warning 信息; 如果大于0,则还会输出info 信息。header或者has_header:一个布尔值,表示输入数据是否有头部。默认为False。label 或者label_column:一个字符串,表示标签列。默认为空字符串。你也可以指定一个整数,如label=0 表示第0列是标签列。你也可以为列名添加前缀,如label=prefix:label_nameweight 或者weight_column: 一个字符串,表示样本权重列。默认为空字符串。你也可以指定一个整数,如weight=0 表示第0列是权重列。注意:它是剔除了标签列之后的索引。假如标签列为0,权重列为1,则这里weight=0。你也可以为列名添加前缀,如weight=prefix:weight_namequery 或者query_column或者gourp 或者group_column: 一个字符串,query/group ID 列。默认为空字符串。你也可以指定一个整数,如query=0 表示第0列是query列。注意:它是剔除了标签列之后的索引。假如标签列为0,query列为1,则这里query=0。你也可以为列名添加前缀,如query=prefix:query_nameignore_column 或者 ignore_

这篇关于【python 机器学习】机器学习算法之LightGBM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144250

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig