机器学习之lightGBM模型

一、lightGBM模型介绍
1. lightGBM模型简介

lightGBM模型是一个梯度提升决策树(GBDT)的实现,其本质原理就是利用基分类器(决策树)训练集成,得到最优的模型。相同的模型还有XGBoost,但因为XGBoost模型在多维度的大数据集下,计算效率较差和可扩展性较低(主要原因是对于每个特征,它们都要扫描所有的数据样本来评估所有可能分枝点的信息增益),lightGBM模型为了解决这个问题,提出了两个技术:单边梯度采样算法(Gradient-based One-Side Sampling,GOSS)和互斥特征捆绑算法(Exclusive Feature Bundling,EFB)。

2. lightGBM模型基本原理
  1. 直方图算法
    梯度提升决策树(GBDT)训练时最大的消耗就是寻找最好的分枝点。预排序算法是寻找分枝点最流行的算法之一,它在预排序的特征值中遍历所有可能的分枝点。这个方法非常简单并且可以找到最佳分枝点,但是却非常耗时和占内存。另一个常见的寻找最佳分枝点的算法是直方图算法。直方图算法将特征的连续值分割正离散的bins(箱),在训练的过程中使用bins构造特征直方图。lightGBM模型在直方图算法上还做了加速。一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到,在速度上可以提升一倍。通常构造直方图时,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。在实际构建树的过程中,LightGBM还可以先计算直方图小的叶子节点,然后利用直方图做差来获得直方图大的叶子节点,这样就可以用非常微小的代价得到它兄弟叶子的直方图。
    直方图算法伪代码:
    机器学习之lightGBM模型_第1张图片

  2. 带深度限制的 Leaf-wise 算法
    在Histogram算法之上,lightGBM模型对树的增长策略也做了优化,首先它抛弃了大多数GBDT工具使用的按层生长 (level-wise) 的决策树生长策略,而使用了带有深度限制的按叶子生长 (leaf-wise) 算法。同Level-wise相比,Leaf-wise的优点是:在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度;Leaf-wise的缺点是:可能会长出比较深的决策树,产生过拟合。因此LightGBM会在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。

  3. 单边梯度采样算法
    在梯度提升决策树(GBDT)中,数据样本一开始并没有初始权重。而在计算信息增益时,不同梯度的样本其重要程度也不一样,根据信息增益的定义,梯度越大,计算信息增益时贡献越大。因此lightGBM模型在训练时计算信息增益会保留梯度大的样本并随机采样一些梯度小的样本(这样做能保持原来数据的分布)。这样做比使用同一采样比例随机采样有更精确的评估。

为了减少采样对数据分布的影响,GOSS为小梯度数据样本引入了一个常数乘法器,具体操作就是首先对样本按梯度的绝对值大小排序,然后选取前a个样本,再从剩下的样本中随机采用b个样本。之后在计算信息增益时用常数1-a/b来放大小梯度的采样样本。

单边梯度采样算法伪代码:
机器学习之lightGBM模型_第2张图片

  1. 互斥特征捆绑算法
    高维度数据常常是稀疏的,特征空间的稀疏性为设计无损的方式减少特征数量提供了可能性。具体来说,在稀疏特征空间中,许多特征是互斥的(即它们不会同时取非零值)。因此,我们可以安全的将互斥的特征捆绑起来。通过设置特征扫描算法,我们可以用捆绑的特征和用单个特征构建一样的直方图。而构建直方图的复杂度从O(#data*#feature)降低到O(#data*#bundle)。

如何决定将哪些特征捆绑在一起
找到最优的捆绑策略是一个NP-hard问题。这意味着我们不能在有限的时间内找到最优解。因此为了寻找近似最优解我们将最优捆绑问题转换成图着色问题,将每个特征作为结点,将不互斥的结点用边连起来。然后使用贪婪算法进行求解。然而我们发现很多特征即使不是100%互斥,也很少同时取非零值。如果算法运行小部分特征冲突,便能得到更少的特征捆绑数,计算效率更高。这样方法对精度的影响也很小。
算法的伪代码:
机器学习之lightGBM模型_第3张图片
如何捆绑
为了降低相应的训练复杂度,我们需要一个好的方法来将这些特征合并到同一个bundle中。关键是确保原始特性的值可以从合并的bundle中标识出来。因为直方图算法是用离散的bins替代特征的连续值。我们让互斥的特征分布到不同的bins中构建捆绑。这可以通过在特征值中加一个偏置常量来解决。比如,我们在bundle中绑定了两个特征A和B,A特征的原始取值为区间[0,10),B特征的原始取值为区间[0,20),我们可以在B特征的取值上加一个偏置常量10,将其取值范围变为[10,30),绑定后的特征取值范围为 [0, 30),这样就可以放心的融合特征A和B了。
算法伪代码:
机器学习之lightGBM模型_第4张图片

二、lightGBM模型优缺点

优点:

  1. 训练时采用了直方图算法寻找最佳分枝点,提升了训练速度。
  2. 采用单边梯度采样算法,减少了计算量。
  3. 使用leaf-wise算法的增长策略构建决策树,减少了不必要的计算。
  4. 降低了内存消耗。

缺点:

  1. 使用leaf-wise算法可能形成较深的决策树,产生过拟合。
三、lightGBM模型参数

lightGBM模型的参数特别多,这里只介绍部分核心参数,详情见官网

参数 描述
objective 模型应用的类型,有回归、二分类、多分类、交叉熵、排序等,其参数值可以是"regression"、“binary”、“multiclass”、“cross_entropy”、"lambdarank"等
boosting 森林的构建策略,参数值可以是"gbdt":传统的梯度提升决策树;“rf”:随机森林;“dart”:带dropout的梯度提升决策树;“goss”:单边梯度采样策略
data(train_data) 训练数据
valid(valid_data) 验证数据
num_iterations boosting的迭代次数
learning_rate 学习率
num_leaves 树的叶子节点数
max_depth 树的最大深度,可以控制过拟合
min_data_in_leaf 一个叶子节点中最小的样本数,通常用来处理过拟合
feature_fraction lightGBM模型训练时每次迭代选择特征的比例,默认是1表示每次迭代选择全部的特征,设置为0.8表示随机选择特征中的80%个特征进行训练
is_unbalance 样本标签是否分布均匀
四、lightGBM模型应用
import numpy as np
import pandas as pd
import lightgbm as lgb

# 获取数据
train_data = pd.read_csv(r'./train_data.csv', index_col=0)
X = train_data.iloc[:, 1:]
y = train_data.iloc[:, 0]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=420)
# 转换为Dataset数据格式
train_set = lgb.Dataset(X_train, label=y_train)
vali_set = lgb.Dataset(X_test, label=y_test)
# 参数 
params = {
    'learning_rate': 0.03,
    'num_leaves': 512,  # 叶子节点数
    'metric': {'l2', 'auc'},  # 评估函数
    'objective': 'regression',  # 目标函数
    'boosting': 'dart',   #  rf:随机森林  dart:带dropout 的gbdt
    'scale_pos_weight': 96,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'min_data_in_leaf': 100
}
# 模型训练
gbm = lgb.train(params, train_set, valid_sets=[vali_set], num_boost_round=250)
# 预测数据集
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)
# 模型保存
gbm.save_model(r"./model.txt")

你可能感兴趣的:(人工智能,机器学习)