lightgbm的使用和参数说明

文章目录

  • use
    • ```import lightgbm as lgb```
      • data interface
      • 设置参数
      • 训练、预测
      • 模型保存
    • ```lightgbm.sklearn.LGBMClassifier()```
  • tuning
    • **ref:**
    • **note:**
      • 针对 Leaf-wise (最佳优先) 树的参数优化
      • 针对更快的训练速度
      • 针对更好的准确率
      • 处理过拟合
  • 具体调参方式总结

use

两种的底层都是一致的

import lightgbm as lgb

import lightgbm as lgb

zh_doc python包的相关介绍

data interface

LightGBM Python 模块能够使用以下几种方式来加载数据:

  • libsvm/tsv/csv txt format file(libsvm/tsv/csv 文本文件格式)
  • Numpy 2D array, pandas object(Numpy 2维数组, pandas 对象)
  • LightGBM binary file(LightGBM 二进制文件)

np 2D array形式:

data = np.random.rand(500, 10)  # 500 个样本, 每一个包含 10 个特征
label = np.random.randint(2, size=500)  # 二元目标变量,  0 和 1
train_data = lgb.Dataset(data, label=label)

还可以:指定 feature names(特征名称)和 categorical features(分类特征)、设置权重、分数等

【具体见文档zh_doc python包的相关介绍】

设置参数

LightGBM 可以使用一个 pairs 的 list 或一个字典来设置参数. 例如:

  • Booster(提升器)参数:

    param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'}
    param['metric'] = 'auc'
    
  • 您还可以指定多个 eval 指标:

    param['metric'] = ['auc', 'binary_logloss']
    

训练、预测

训练

param_list、train_dataset是必需的

num_round = 10
bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])

LightGBM 也支持加权训练,它需要一个额外的 加权数据 。 它需要额外的 query 数据 用于排名任务。

支持交叉验证

num_round = 10
lgb.cv(param, train_data, num_round, nfold=5)

支持提前停止

valid_sets:至少有一个. 如果有多个,它们都会被使用(如果有一个验证集)。

该模型将开始训练, 直到验证得分停止提高为止. 验证错误需要至少每个 early_stopping_rounds 减少以继续训练.

如果提前停止, 模型将有 1 个额外的字段: bst.best_iteration. 请注意 train() 将从最后一次迭代中返回一个模型, 而不是最好的一个.

如果您指定多个评估指标, 则它们都会用于提前停止.

bst = lgb.train(param, train_data, num_round, valid_sets=valid_sets, early_stopping_rounds=10)
bst.save_model('model.txt', num_iteration=bst.best_iteration)

预测

# 7 个样本, 每一个包含 10 个特征
data = np.random.rand(7, 10)
ypred = bst.predict(data)

如果在训练过程中启用了提前停止, 可以用 bst.best_iteration 从最佳迭代中获得预测结果:

ypred = bst.predict(data, num_iteration=bst.best_iteration)

模型保存

在训练完成后, 可以使用如下方式来存储模型:

bst.save_model('model.txt')

训练后的模型也可以转存为 JSON 的格式:

json_model = bst.dump_model()

以保存模型也可以使用如下的方式来加载.

bst = lgb.Booster(model_file='model.txt')  #init model

[具体见文档zh_doc python包的相关介绍]

lightgbm.sklearn.LGBMClassifier()

同sklearn方式

fit函数包含了早停等

tuning

LightGBM 使用 leaf-wise 的树生长策略, 而很多其他流行的算法采用 depth-wise 的树生长策略. 与 depth-wise 的树生长策略相较, leaf-wise 算法可以收敛的更快. 但是, 如果参数选择不当的话, leaf-wise 算法有可能导致过拟合.

ref:

zh_doc 参数优化

note:

针对 Leaf-wise (最佳优先) 树的参数优化

  1. num_leaves

    控制树模型复杂度的主要参数。应让其小于2^(max_depth),因为depth 的概念在 leaf-wise 树中并没有多大作用,并不存在从leavesdepth的映射

  2. min_data_in_leaf

    用于处理过拟合,该值取决于训练样本数和num_leaves,几百或几千即可。设置较大避免生成一个过深的树,可能导致欠拟合。

    min_data_in_leaf, default=20, type=int, alias=min_data_per_leaf , min_data, min_child_samples

    • 一个叶子上数据的最小数量. 可以用来处理过拟合.
  3. max_depth

    显示限制树的深度

针对更快的训练速度

  • 通过设置 bagging_fractionbagging_freq 参数来使用 bagging 方法
  • 通过设置 feature_fraction 参数来使用特征的子抽样
  • 使用较小的 max_bin
  • 使用 save_binary 在未来的学习过程对数据加载进行加速
  • 使用并行学习, 可参考 并行学习指南

针对更好的准确率

  • 使用较大的 max_bin (学习速度可能变慢)
  • 使用较小的 learning_rate 和较大的 num_iterations
  • 使用较大的 num_leaves (可能导致过拟合)
  • 使用更大的训练数据
  • 尝试 dart

处理过拟合

  • 使用较小的 max_bin
  • 使用较小的 num_leaves
  • 使用 min_data_in_leafmin_sum_hessian_in_leaf
  • 通过设置 bagging_fractionbagging_freq 来使用 bagging
  • 通过设置 feature_fraction 来使用特征子抽样
  • 使用更大的训练数据
  • 使用 lambda_l1, lambda_l2min_gain_to_split 来使用正则
  • 尝试 max_depth 来避免生成过深的树

具体调参方式总结

LightGBM 调参方法(具体操作)

LightGBM 训练及调参

zh_doc 参数

可以查看参数的别名和说明,如果调参出现重名,就会报warning。如:lambda_l1 is set=0, reg_alpha=0.0 will be ignored. Current value: lambda_l1=0

对于基于决策树的模型,调参的方法都是大同小异。一般都需要如下步骤:

  1. 首先选择较高的学习率,大概0.1附近,这样是为了加快收敛的速度。这对于调参是很有必要的。
  2. 对决策树基本参数调参
  3. 正则化参数调参
  4. 最后降低学习率,这里是为了最后提高准确率
other_params = {'num_leaves': 31, 'objective': None, 'learning_rate': 0.1, 'max_depth': -1, 'reg_alpha': 0.0,
                'reg_lambda': 0.0, 'n_estimators': 100, 'boosting_type': 'gbdt', 'device': 'gpu',
                'min_child_samples': 20, 'subsample': 1.0, 'subsample_freq': 0, 'colsample_bytree': 1.0,

                'class_weight': None, 'importance_type': 'split',
                'min_child_weight': 0.001, 'min_split_gain': 0.0, 'n_jobs': -1, 'random_state': None,
                'subsample_for_bin': 200000, 'silent': True}

data_list_dict = get_data_np_dict(cell_name, feature_name, method_name)

# 第一次:max_depth、num_leaves
print("第一次")
cv_params = {'max_depth': [-1, 0, 3, 4, 5, 6, 7, 8], 'num_leaves': range(21, 200, 10)}
# cv_params = {'max_depth': range(3, 8, 4), 'num_leaves': range(5, 100, 45)}
best_params = lgb_grid_greedy(cv_params, other_params, '1')
other_params.update(best_params)

# 第二次
print("第二次")
cv_params = {'max_bin': range(5, 256, 10), 'min_child_samples': range(10, 201, 10)}
# cv_params = {'max_bin': range(5, 256, 100), 'min_child_samples': range(1, 102, 50)}
# cv_params = {'max_depth': [3, 4, ], 'min_child_weight': [1, 2, ]}
best_params = lgb_grid_greedy(cv_params, other_params, '2')
other_params.update(best_params)
# print(other_params)

# 第三次
print("第三次")
cv_params = {'colsample_bytree': [0.6, 0.7, 0.8, 0.9, 1.0],
             'subsample': [0.6, 0.7, 0.8, 0.9, 1.0],
             'subsample_freq': range(0, 81, 10)
             }
# cv_params = {'colsample_bytree': [0.6, 0.7, ],
#              'subsample': [0.6, 0.7, ],
#              'subsample_freq': range(0, 81, 40)
#              }
best_params = lgb_grid_greedy(cv_params, other_params, '3')
other_params.update(best_params)
# print(other_params)

# 第四次
print("第四次")
cv_params = {'reg_alpha': [1e-5, 1e-3, 1e-1, 0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0],
             'reg_lambda': [1e-5, 1e-3, 1e-1, 0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0]
             }
# cv_params = {'reg_alpha': [1e-5, 1e-3, ],
#              'reg_lambda': [1e-5, 1e-3, ]
#              }
best_params = lgb_grid_greedy(cv_params, other_params, '4')
other_params.update(best_params)
# print(other_params)

# 第五次
print("第五次")
cv_params = {'min_split_gain': [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]}
# cv_params = {'min_split_gain': [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]}
best_params = lgb_grid_greedy(cv_params, other_params, '5')
other_params.update(best_params)
# print(other_params)

# 第六次
print("第六次")
cv_params = {'learning_rate': [0.001, 0.01, 0.05, 0.07, 0.1, 0.2, 0.5, 0.75, 1.0]}
# cv_params = {'learning_rate': [0.01, 0.05, ]}
best_params = lgb_grid_greedy(cv_params, other_params, '6')
other_params.update(best_params)
# print(other_params)

你可能感兴趣的:(ML,and,DL,神经网络,机器学习,深度学习,lightgbm)