Xgboost和Lightgbm使用对比

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 01:22   11   0

一、Xgboost

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/1/4 14:24
# @Author  : zhm
# @File    : XgbTrain.py
# @Software: PyCharm
from Util import load_data
import xgboost as xgb
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')

def begin():
    if not os.path.exists('model/train.buffer'):
        x_train, y_train, x_test, y_test = load_data()
        dtrain = xgb.DMatrix(x_train, label=y_train)
        # dtest = xgb.DMatrix(x_test, label=y_test)
        dtrain.save_binary("model/train.buffer")
        # dtest.save_binary("model/test.buffer")
    else:
        dtrain = xgb.DMatrix("model/train.buffer")
        # dtest = xgb.DMatrix("model/test.buffer")
    param = {'bst:max_depth': 8, 'bst:eta': 0.1, 'objective': 'reg:logistic'}
    param['nthread'] = 4
    plst = param.items()
    # evallist = [(dtest, 'eval'), (dtrain, 'train')]
    # bst = xgb.train(plst, dtrain, 20, evallist)
    bst = xgb.train(plst, dtrain, 20)
    bst.save_model('model/model')
    bst.dump_model('model/dump.raw.txt')



if __name__ == '__main__':
    begin()

任务参数

根据任务、目的设置的参数,比如回归任务与排序任务的目的是不同的

  • objective,训练目标,分类还是回归
    • reg:linear,线性回归
    • reg:logistic,逻辑回归
    • binary:logistic,使用LR二分类,输出概率
    • binary:logitraw,使用LR二分类,但在进行logistic转换之前直接输出分类得分
    • count:poisson,泊松回归
    • multi:softmax,使用softmax进行多分类,需要设置类别数num_class
    • multi:softprob
    • rank:pairwise,进行排序任务,最小化pairwise损失
    • reg:gamma,gamma回归
    • reg:tweedie,tweedie回归
  • 评价指标eval_metric,默认根据目标函数设置,针对验证集,默认情况下,最小均方误差用于回归,错分用于分类,平均精确率用于排序等,可以同时使用多个评估指标,在python里使用列表来放置
    • 均方误差rmse
    • 平均绝对值误差mae
    • 对数损失logloss,负的对数似然
    • 错误率error,根据0.5作为阈值判断的错分率
    • 自定义阈值错分率error@t
    • 多分类错分率merror
    • 多分类对数损失mlogloss
    • auc主要用来排序
    • ndcg,normalized discounted cumulative gain及其他的一些针对泊松回归等问题的评价指标

命令行参数

  • num_round迭代次数,也对应基学习器数目
  • task当前对模型的任务,包括
    • 训练train
    • 预测pred
    • 评估/验证eval
    • 导出模型dump
  • 导入导出模型的路径model_inmodel_out
  • fmap,feature map用来导出模型
二、Lightgbm
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/1/8 14:32
# @Author  : zhm
# @File    : LgbmTrain.py
# @Software: PyCharm
from Util import load_data
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import lightgbm as lgb

def begin():
    if not os.path.exists('lgb_model/train.buffer'):
        x_train, y_train, x_test, y_test = load_data()
        dtrain = lgb.Dataset(x_train, y_train)
        dtrain.save_binary("lgb_model/train.buffer")
    else:
        dtrain = lgb.Dataset("lgb_model/train.buffer")
    params = {
        'task': 'train',
        'boosting_type': 'gbdt',
        'objective': 'regression',
        'learning_rate': 0.1,
        'max_depth': 8,
        'verbose': 3
    }
    print('Start training...')
    # train
    gbm = lgb.train(params,
                    dtrain,
                    num_boost_round=100)
    gbm.save_model('lgb_model/model')


if __name__ == '__main__':
    begin()



核心参数

  • 叶节点数num_leaves,与模型复杂度直接相关(leaf-wise)
  • 任务目标
    • 回归regression,对应的损失函数如下
      • regression_l1,加了l1正则的回归,等同于绝对值误差
      • regression_l2,等同于均方误差
      • huber,Huber Loss
      • fair,Fair Loss
      • poisson,泊松回归
    • 分类
      • binary,二分类
      • multiclass,多分类
    • 排序
      • lambdarank
  • 模型
    • boosting
      • gbdt,传统的梯度提升决策树
      • rf,随机森林
      • dart,Dropouts meet Multiple Additive Regression Trees
      • goss,Gradient-based One-Side Sampling
  • 迭代次数num_iterations,对于多分类问题,LightGBM会构建num_class*num_iterations的树
  • 学习率/步长learning_rate,即shrinkage
  • 树的训练方式tree_learner,主要用来控制树是否并行化训练
    • serial,单机的树学习器
    • feature,特征并行的树学习器
    • data,数据并行的树学习器
  • 线程数num_threads
  • 设备device,使用cpu还是gpu
    • cpu
    • gpu

训练控制参数

防止过拟合

  • 树的最大深度max_depth,主要用来避免模型的过拟合,设为负数值则表明不限制
  • 叶节点的最少样本数min_data_in_leaf
  • 叶节点的最小海森值之和min_sum_hessian_in_leaf
  • 列采样feature_fraction,每棵树的特征子集占比,设置在0~1之间,可以加快训练速度,避免过拟合
  • 行采样bagging_fraction,不进行重采样的随机选取部分样本数据,此外需要设置参数bagging_freq来作为采样的频率,即多少轮迭代做一次bagging;
  • 早停止early_stopping_roung,在某一验证数据的某一验证指标当前最后一轮迭代没有提升时停止迭代
  • 正则化
    • lambda_l1
    • lambda_l2
  • 切分的最小收益min_gain_to_split

IO参数

直方图相关

  • 最大直方图数max_bin,特征值装载的最大直方图数目,一般较小的直方图数目会降低训练的准确性但会提升整体的表现,处理过拟合
  • 直方图中最少样本数min_data_in_bin,设置每个直方图中样本数的最小值,同样防止过拟合

特征相关

  • 是否预排序is_pre_partition
  • 是否稀疏is_sparse
  • 类别特征列categorical_feature,声明类别特征对应的列(通过索引标记),仅支持int类型
  • 声明权重列weight,指定一列作为权重列

内存相关

  • 分阶段加载数据two_round,一般LightGBM将数据载入内存进行处理,这样会提升数据的加载速度,但是对于数据量较大时会造成内存溢出,所以此时需要分阶段载入
  • 保存数据为二进制save_binary,将数据文件导出为二进制文件,下次加载数据时就会更快一些

缺失值

  • 是否处理缺失值use_missing
  • 是否将0值作为缺失值zeros_as_missing

目标参数

  • sigmoid,sigmoid函数中的参数,用于二分类和排序任务
  • scale_pos_weight,设置正例在二分类任务中的样本占比
  • 初始化为均值boost_from_average,调整初始的分数为标签的均值,加速模型训练的收敛速度,仅用于回归任务
  • 样本类别是否不平衡is_unbalance
  • num_class,用于多分类


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP