返回介绍

数学基础

统计学习

深度学习

工具

Scala

二、调参

发布于 2023-07-17 23:38:23 字数 22876 浏览 0 评论 0 收藏 0

2.1 调参指导

  1. 针对 leaf-wise 树的参数优化:

    • num_leaves:控制了叶节点的数目。它是控制树模型复杂度的主要参数。

      如果是level-wise, 则该参数为 $ MathJax-Element-3 $ ,其中 $ MathJax-Element-2 $ 为树的深度。

      但是当叶子数量相同时,leaf-wise 的树要远远深过level-wise 树,非常容易导致过拟合。因此应该让 num_leaves 小于 $ MathJax-Element-3 $

      leaf-wise 树中,并不存在depth 的概念。因为不存在一个从leavesdepth 的合理映射

    • min_data_in_leaf: 每个叶节点的最少样本数量。它是处理leaf-wise 树的过拟合的重要参数。

      将它设为较大的值,可以避免生成一个过深的树。但是也可能导致欠拟合。

    • max_depth: 控制了树的最大深度。

      该参数可以显式的限制树的深度。

  2. 针对更快的训练速度:

    • 通过设置 bagging_fractionbagging_freq 参数来使用 bagging 方法
    • 通过设置 feature_fraction 参数来使用特征的子抽样
    • 使用较小的 max_bin
    • 使用 save_binary 在未来的学习过程对数据加载进行加速
  3. 获取更好的准确率:

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

    • 使用较小的 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 来避免生成过深的树

2.2 参数

  1. 参数的格式为key1=value1 key2=value2...。 (注意:这里是针对lightgbm可执行程序的配置。在PythonAPI 中,可以直接设定)

    • 在配置文件和命令行中都可以设置参数。
    • 如果在命令行中设置参数时,在= 前后都不应该有空格
    • 在使用配置文件设置参数时,一行只能包含一个参数。你可以使用# 来注释。
    • 如果一个参数在命令行和配置文件中均出现,则优先使用命令行中的参数。

2.2.1 核心参数

  1. config 或者 config_file: 一个字符串,给出了配置文件的路径。默认为空字符串。

  2. task: 一个字符串,给出了要执行的任务。可以为:

    • 'train' 或者 'training':表示是训练任务。默认为'train'
    • 'predict' 或者 'prediction'或者'test':表示是预测任务。
    • 'convert_model': 表示是模型转换任务。将模型文件转换成if-else 格式。
  3. 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 参数可以用于设置整数标签的增益(权重)

  4. boosting 或者 'boost' 或者 'boosting_type': 一个字符串,给出了基学习器模型算法。可以为:

    • 'gbdt': 表示传统的梯度提升决策树。默认值为'gbdt'
    • 'rf': 表示随机森林。
    • 'dart': 表示带dropoutgbdt
    • goss:表示Gradient-based One-Side Samplinggbdt
  5. data或者train 或者train_data:一个字符串,给出了训练数据所在的文件的文件名。默认为空字符串。

    lightgbm将使用它来训练模型。

  6. valid 或者test或者valid_data 或者test_data: 一个字符串,表示验证集所在的文件的文件名。默认为空字符串。

    lightgbm 将输出该数据集的度量。

    如果有多个验证集,则用逗号, 分隔。

  7. 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 棵树。
  8. learning_rate 或者shrinkage_rate: 一个浮点数,给出了学习率。默认为 0.1

    dart 中,它还会影响dropped trees 的归一化权重。

  9. num_leaves或者num_leaf: 一个整数,给出了一棵树上的叶子数。默认为 31

  10. tree_learner 或者 tree:一个字符串,给出了tree learner,主要用于并行学习。 默认为'serial'。 可以为:

    • 'serial': 单台机器的tree learner
    • 'feature': 特征并行的tree learner
    • 'data': 数据并行的tree learner
    • 'voting': 投票并行的tree learner
  11. num_threads 或者 num_thread 或者nthread:一个整数, 给出了lightgbm 的线程数。默认为OpenMP_default

    • 为了更快的速度,应该将它设置为真正的CPU 内核数,而不是线程的数量(大多数CPU 使用超线程来使每个CPU内核生成2个线程)。
    • 当数据集较小的时候,不要将它设置的过大
    • 对于并行学习,不应该使用全部的CPU核心,因为这会使得网络性能不佳
  12. device: 一个字符串,指定计算设备。默认为'cpu'。 可以为'gpu','cpu'

    • 建议使用较小的max_bin 来获得更快的计算速度
    • 为了加快学习速度,GPU 默认使用32位浮点数来求和。你可以设置gpu_use_dp=True 来启动64位浮点数,但是它会使得训练速度降低。

2.2.2 学习控制参数

  1. max_depth: 一个整数,限制了树模型的最大深度,默认值为-1

    • 如果小于0,则表示没有限制。
  2. min_data_in_leaf 或者 min_data_per_leaf 或者 min_data或者min_child_samples

    : 一个整数,表示一个叶子节点上包含的最少样本数量。默认值为 20

  3. min_sum_hessian_in_leaf 或者 min_sum_hessian_per_leaf或者 min_sum_hessian 或者 min_hessian或者min_child_weight: 一个浮点数,表示一个叶子节点上的最小hessian 之和。(也就是叶节点样本权重之和的最小值) 默认为1e-3

  4. feature_fraction或者sub_feature或者colsample_bytree: 一个浮点数,取值范围为[0.0,1.0], 默认值为1.0

    如果小于1.0,则lightgbm 会在每次迭代中随机选择部分特征。如0.8 表示:在每棵树训练之前选择80% 的特征来训练。

  5. feature_fraction_seed: 一个整数,表示feature_fraction 的随机数种子,默认为2。

  6. bagging_fraction 或者sub_row 或者 subsample:一个浮点数,取值范围为[0.0,1.0], 默认值为1.0

    如果小于1.0,则lightgbm 会在每次迭代中随机选择部分样本来训练(非重复采样)。如0.8 表示:在每棵树训练之前选择80% 的样本(非重复采样)来训练。

  7. bagging_freq 或者subsample_freq: 一个整数,表示每bagging_freq 次执行bagging

    如果该参数为0,表示禁用bagging

  8. bagging_seed 或者 bagging_fraction_seed: 一个整数,表示bagging 的随机数种子,默认为 3 。

  9. early_stopping_round 或者 early_stopping_rounds或者early_stopping: 一个整数,默认为0。

    如果一个验证集的度量在early_stopping_round 循环中没有提升,则停止训练。如果为0则表示不开启早停。

  10. lambda_l1 或者reg_alpha: 一个浮点数,表示L1正则化系数。默认为0

  11. lambda_l2 或者reg_lambda: 一个浮点数,表示L2正则化系数。默认为0

  12. min_split_gain 或者min_gain_to_split: 一个浮点数,表示执行切分的最小增益,默认为0

  13. drop_rate: 一个浮点数,取值范围为[0.0,1.0],表示dropout 的比例,默认为0.1。 该参数仅在dart 中使用

  14. skip_drop: 一个浮点数,取值范围为[0.0,1.0],表示跳过dropout 的概率,默认为0.5。 该参数仅在dart 中使用

  15. max_drop: 一个整数,表示一次迭代中删除树的最大数量,默认为50。 如果小于等于0,则表示没有限制。 该参数仅在dart 中使用

  16. uniform_drop:一个布尔值,表示是否想要均匀的删除树,默认值为False。 该参数仅在dart 中使用

  17. xgboost_dart_mode: 一个布尔值,表示是否使用xgboost dart 模式,默认值为False。该参数仅在dart 中使用

  18. drop_seed: 一个整数,表示dropout 的随机数种子,默认值为 4。 该参数仅在dart 中使用

  19. top_rate: 一个浮点数,取值范围为[0.0,1.0],表示在goss 中,大梯度数据的保留比例,默认值为 0.2。该参数仅在goss 中使用

  20. other_rate: 一个浮点数,取值范围为[0.0,1.0],表示在goss 中,小梯度数据的保留比例,默认值为 0.1。该参数仅在goss 中使用

  21. min_data_per_group:一个整数,表示每个分类组的最小数据量,默认值为100。用于排序任务

  22. max_cat_threshold: 一个整数,表示category 特征的取值集合的最大大小。默认为 32 。

  23. cat_smooth: 一个浮点数,用于category 特征的概率平滑。默认值为 10。

    它可以降低噪声在category 特征中的影响,尤其是对于数据很少的类。

  24. cat_l2: 一个浮点数,用于category 切分中的L2 正则化系数。默认为 10 。

  25. top_k 或者 topk: 一个整数,用于投票并行中。默认为20 。

    将它设置为更大的值可以获得更精确的结果,但是会降低训练速度。

2.2.3 IO 参数

  1. max_bin: 一个整数,表示最大的桶的数量。默认值为 255。

    • lightgbm 会根据它来自动压缩内存。如max_bin=255 时,则lightgbm 将使用uint8 来表示特征的每一个值。
  2. min_data_in_bin: 一个整数,表示每个桶的最小样本数。默认为3。

    该方法可以避免出现一个桶只有一个样本的情况。

  3. data_random_seed: 一个整数,表示并行学习数据分隔中的随机数种子。默认为1

    它不包括特征并行。

  4. output_model或者model_output或者model_out: 一个字符串,表示训练中输出的模型被保存的文件的文件名。默认LightGBM_model.txt

  5. input_model或者model_input或者model_in: 一个字符串,表示输入模型的文件的文件名。默认空字符串。

    • 对于prediction任务,该模型将用于预测数据
    • 对于train任务,训练将从该模型继续
  6. output_result或者 predict_result或者prediction_result:一个字符串,给出了prediction 结果存放的文件名。默认为LightGBM_predict_result.txt

  7. pre_partition 或者 is_pre_partition: 一个布尔值,指示数据是否已经被划分。默认值为False。 如果为true,则不同的机器使用不同的partition 来训练。

    它用于并行学习(不包括特征并行)

  8. is_sparse或者 is_enable_sparse或者enable_sparse: 一个布尔值,表示是否开启稀疏优化,默认为True

    如果为True则启用稀疏优化。

  9. two_round 或者two_round_loading或者 use_two_round_loading: 一个布尔值,指示是否启动两次加载。默认值为False,表示只需要进行一次加载。

    • 默认情况下,lightgbm 会将数据文件映射到内存,然后从内存加载特征,这将提供更快的数据加载速度。但是当数据文件很大时,内存可能会被耗尽。
    • 如果数据文件太大,则将它设置为True
  10. save_binary或者is_save_binary或者 is_save_binary_file: 一个布尔值,表示是否将数据集(包括验证集)保存到二进制文件中。默认值为False

    如果为True,则可以加快数据的加载速度。

  11. verbosity 或者verbose: 一个整数,表示是否输出中间信息。默认值为1。

    • 如果小于0,则仅仅输出critical 信息;如果等于0,则还会输出error,warning 信息; 如果大于0,则还会输出info 信息。
  12. header或者has_header : 一个布尔值,表示输入数据是否有头部。默认为False

  13. label 或者label_column: 一个字符串,表示标签列。默认为空字符串。

    • 你也可以指定一个整数,如label=0 表示第0列是标签列。
    • 你也可以为列名添加前缀,如label=prefix:label_name
  14. weight 或者weight_column: 一个字符串,表示样本权重列。默认为空字符串。

    • 你也可以指定一个整数,如weight=0 表示第0列是权重列。注意:它是剔除了标签列之后的索引。

      假如标签列为0,权重列为1,则这里weight=0

    • 你也可以为列名添加前缀,如weight=prefix:weight_name

  15. query 或者query_column或者gourp 或者group_column: 一个字符串,query/group ID 列。默认为空字符串。

    • 你也可以指定一个整数,如query=0 表示第0列是query列。注意:它是剔除了标签列之后的索引。

      假如标签列为0query列为1,则这里query=0

    • 你也可以为列名添加前缀,如query=prefix:query_name

  16. ignore_column 或者 ignore_feature或者blacklist: 一个字符串,表示训练中忽略的一些列,默认为空字符串。

    • 可以用数字做索引,如ignore_column=0,1,2 表示第0,1,2 列将被忽略。注意:它是剔除了标签列之后的索引。
    • 你也可以为列名添加前缀,如ignore_column=prefix:ign_name1,ign_name2
  17. categorical_feature 或者categorical_column或者cat_feature或者 cat_column: 一个字符串,指定category 特征的列。默认为空字符串。

    • 可以用数字做索引,如categorical_feature=0,1,2 表示第0,1,2 列将作为category 特征。注意:它是剔除了标签列之后的索引。
    • 你也可以为列名添加前缀,如categorical_feature=prefix:cat_name1,cat_name2
    • categorycal 特征中,负的取值被视作缺失值。
  18. predict_raw_score 或者raw_score或者 is_predict_raw_score: 一个布尔值,表示是否预测原始得分。默认为False

    如果为True则仅预测原始得分。

    该参数只用于prediction 任务。

  19. predict_leaf_index 或者 leaf_index或者 is_predict_leaf_index: 一个布尔值,表示是否预测每个样本在每棵树上的叶节点编号。默认为False

    在预测时,每个样本都会被分配到每棵树的某个叶子节点上。该参数就是要输出这些叶子节点的编号。

    该参数只用于prediction 任务。

  20. predict_contrib 或者 contrib或者 is_predict_contrib: 一个布尔值,表示是否输出每个特征对于每个样本的预测的贡献。默认为False

    输出的结果形状为[nsamples,nfeatures+1], 之所以+1 是考虑到bais 的贡献。所有的贡献加起来就是该样本的预测结果。

    该参数只用于prediction 任务。

  21. bin_construct_sample_cnt 或者 subsample_for_bin: 一个整数,表示用来构建直方图的样本的数量。默认为200000

    • 如果数据非常稀疏,则可以设置为一个更大的值
    • 如果设置更大的值,则会提供更好的训练效果,但是会增加数据加载时间
  22. num_iteration_predict: 一个整数,表示在预测中使用多少棵子树。默认为-1。

    小于等于0表示使用模型的所有子树。

    该参数只用于prediction 任务。

  23. pred_early_stop:一个布尔值,表示是否使用早停来加速预测。默认为False

    如果为True,则可能影响精度。

  24. pred_early_stop_freq: 一个整数,表示检查早停的频率。默认为10

  25. pred_early_stop_margin: 一个浮点数,表示早停的边际阈值。默认为 10.0

  26. use_missing: 一个布尔值,表示是否使用缺失值功能。默认为True

    如果为False 则禁用缺失值功能。

  27. zero_as_missing: 一个布尔值,表示是否将所有的零(包括在libsvm/sparse矩阵 中未显示的值)都视为缺失值。 默认为False

    • 如果为False,则将np.nan 视作缺失值。
    • 如果为True,则np.nan 和 零都将视作缺失值。
  28. init_score_file: 一个字符串,表示训练时的初始化分数文件的路径。默认为空字符串,表示train_data_file+".init" (如果存在)

  29. valid_init_score_file: 一个字符串,表示验证时的初始化分数文件的路径。默认为空字符串,表示valid_data_file+".init" (如果存在)

    如果有多个(对应于多个验证集),则可以用逗号, 来分隔。

2.2.4 目标函数的参数

  1. sigmoid: 一个浮点数,用sigmoid 函数的参数,默认为 1.0。

    它用于二分类任务和lambdarank 任务。

  2. alpha: 一个浮点数,用于Huber 损失函数和Quantile regression ,默认值为 1.0。

    它用于huber回归任务和Quantile 回归任务。

  3. fair_c: 一个浮点数,用于Fair 损失函数,默认值为 1.0 。

    它用于fair 回归任务。

  4. gaussian_eta: 一个浮点数,用于控制高斯函数的宽度,默认值为 1.0 。

    它用于regression_l1 回归任务和huber回归任务。

  5. posson_max_delta_step: 一个浮点数,用于Poisson regression 的参数,默认值为 0.7 。

    它用于poisson 回归任务。

  6. scale_pos_weight: 一个浮点数,用于调整正样本的权重,默认值为 1.0

    它用于二分类任务。

  7. boost_from_average: 一个布尔值,指示是否将初始得分调整为平均值(它可以使得收敛速度更快)。

    它。默认为True

    它用于回归任务。

  8. is_unbalance或者unbalanced_set : 一个布尔值,指示训练数据是否均衡的。默认为True

    它用于二分类任务。

  9. max_position: 一个整数,指示将在这个NDCG 位置优化。默认为 20 。

    它用于lambdarank 任务。

  10. label_gain: 一个浮点数序列,给出了每个标签的增益。默认值为0,1,3,7,15,....(即 $ MathJax-Element-4 $ )

    它用于lambdarank 任务。

  11. num_class或者num_classes : 一个整数,指示了多分类任务中的类别数量。默认为 1

    它用于多分类任务。

  12. reg_sqrt: 一个布尔值,默认为False

    如果为True,则拟合的结果为: $ MathJax-Element-5 $ 。同时预测的结果被自动转换为: $ MathJax-Element-6 $ 。

    它用于回归任务。

2.2.5 度量参数

  1. metric:一个字符串,指定了度量的指标,默认为:对于回归问题,使用l2 ; 对于二分类问题,使用binary_logloss;对于lambdarank 问题,使用ndcg

    • 'l1' 或者 mean_absolute_error或者 mae或者 regression_l1: 表示绝对值损失
    • 'l2' 或者mean_squared_error或者 mse或者 regression_l2或者 regression:表示平方损失
    • 'l2_root' 或者root_mean_squared_error或者 rmse:表示开方损失
    • 'quantile': 表示Quantile 回归中的损失
    • 'mape' 或者 'mean_absolute_percentage_error' :表示MAPE 损失
    • 'huber': 表示huber 损失
    • 'fair': 表示fair 损失
    • 'poisson': 表示poisson 回归的负对数似然
    • 'gamma': 表示gamma 回归的负对数似然
    • 'gamma_deviance': 表示gamma 回归的残差的方差
    • 'tweedie': 表示Tweedie 回归的负对数似然
    • 'ndcg': 表示NDCG
    • 'map' 或者'mean_average_precision': 表示平均的精度
    • 'auc': 表示AUC
    • 'binary_logloss'或者'binary': 表示二类分类中的对数损失函数
    • 'binary_error': 表示二类分类中的分类错误率
    • 'multi_logloss'或者 'multiclass'或者 'softmax'或者 'multiclassova'或者 'multiclass_ova',或者'ova'或者 'ovr': 表示多类分类中的对数损失函数
    • 'multi_error': 表示多分类中的分类错误率
    • 'xentropy'或者'cross_entropy': 表示交叉熵
    • 'xentlambda' 或者'cross_entropy_lambda': 表示intensity 加权的交叉熵
    • 'kldiv'或者'kullback_leibler': 表示KL 散度

    如果有多个度量指标,则用逗号, 分隔。

  2. metric_freq或者'output_freq': 一个正式,表示每隔多少次输出一次度量结果。默认为1 。

  3. train_metric 或者training_metric或者 is_training_metric: 一个布尔值,默认为False

    如果为True,则在训练时就输出度量结果。

  4. ndcg_at 或者 ndcg_eval_at 或者eval_at: 一个整数列表,指定了NDCG 评估点的位置。默认为1,2,3,4,5

2.2.6 网络参数

这里的参数仅用于并行学习,并且仅用于socket 版本,而不支持mpi 版本。

  1. num_machines 或者num_machine : 一个整数,表示并行学习的机器的数量。默认为 1 。

  2. local_listen_port 或者local_port: 一个整数,表示监听本地机器的端口号。默认为12400

    训练之前,你应该在防火墙中开放该端口。

  3. time_out: 一个整数,表示允许socket 的超时时间(单位:分钟)。默认值为 120

  4. machine_list_file 或者mlist: 一个字符串,指示了并行学习的机器列表文件的文件名。默认为空字符串。

    该文件每一行包含一个IP和端口号。格式是ip port,以空格分隔。

2.2.7 GPU 参数

  1. gpu_platform_id: 一个整数,表示OpenCL platform ID。通常每个GPU 供应商都会 公开一个OpenCL platform。 默认为-1(表示系统级的默认platform )

  2. gpu_device_id: 一个整数,表示设备ID。 默认为-1 。

    在选定的platform 上,每个GPU 都有一个唯一的设备ID-1 表示选定platform 上的默认设备。

  3. gpu_use_dp: 一个布尔值,默认值为False

    如果为True, 则在GPU 上计算时使用双精度(否则使用单精度)

2.2.8 模型参数

  1. convert_model_language: 一个字符串,目前只支持'cpp'

    如果该参数被设置,且task='train', 则该模型会被转换。

  2. convert_model: 一个字符串,表示转换模型到一个文件的文件名。默认为'gbdt_prediction.cpp'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文