LightGBM原理介绍

简介

是GBDT模型的一个进化版本,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点(备注:容易出现过拟合的风险,需要限制树的最大深度来防止过拟合)。LGB是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。

解决痛点

GBDT在每一次迭代的时候,都需要遍历整个训练数据多次。

如果把整个训练数据装进内存则会限制训练数据的大小;如果不装进内存,反复地读写训练数据又会消耗非常大的时间。尤其面对工业级海量的数据,普通的GBDT算法是不能满足其需求的。

XGB是基于预排序方法的决策树算法。这种构建决策树的算法基本思想是:首先,对所有特征都按照特征的数值进行预排序。其次,在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点。最后,在找到一个特征的最好分割点后,将数据分裂成左右子节点。这样的方法能够精确的找到分割点,缺点是空间消耗大;

原理

基于Histogram的决策树算法

直方图算法

LightGBM原理介绍_第1张图片

优点:

  • 内存占用小;
  • 计算代价小;

直方图做差加速

LightGBM原理介绍_第2张图片

带深度限制的 Leaf-wise 算法

单边梯度采样算法

  • Gradient-based One-Side Sampling 应该被翻译为单边梯度采样(GOSS)。GOSS算法从减少样本的角度出发,排除大部分小梯度的样本,仅用剩下的样本计算信息增益,它是一种在减少数据量和保证精度上平衡的算法。
  • AdaBoost中,样本权重是数据重要性的指标。然而在GBDT中没有原始样本权重,不能应用权重采样。幸运的是,我们观察到GBDT中每个数据都有不同的梯度值,对采样十分有用。即梯度小的样本,训练误差也比较小,说明数据已经被模型学习得很好了,直接想法就是丢掉这部分梯度小的数据。然而这样做会改变数据的分布,将会影响训练模型的精确度,为了避免此问题,提出了GOSS算法。
  • GOSS是一个样本的采样算法,目的是丢弃一些对计算信息增益没有帮助的样本留下有帮助的。根据计算信息增益的定义,梯度大的样本对信息增益有更大的影响。因此,GOSS在进行数据采样的时候只保留了梯度较大的数据,但是如果直接将所有梯度较小的数据都丢弃掉势必会影响数据的总体分布。所以,GOSS首先将要进行分裂的特征的所有取值按照绝对值大小降序排序(XGBoost一样也进行了排序,但是LightGBM不用保存排序后的结果),选取绝对值最大的 a*100% 个数据。然后在剩下的较小梯度数据中随机选择 b*100% 个数据。接着将这 b*100% 个数据乘以一个常数(1-a)/b,这样算法就会更关注训练不足的样本,而不会过多改变原数据集的分布。最后使用这 (a+b)*100% 个数据来计算信息增益。

互斥特征捆绑算法

高维度的数据往往是稀疏的,这种稀疏性启发我们设计一种无损的方法来减少特征的维度。通常被捆绑的特征都是互斥的(即特征不会同时为非零值,像one-hot),这样两个特征捆绑起来才不会丢失信息。如果两个特征并不是完全互斥(部分情况下两个特征都是非零值),可以用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,我们可以选择把不完全互斥的两个特征捆绑,而不影响最后的精度。互斥特征捆绑算法(Exclusive Feature Bundling, EFB)指出如果将一些特征进行融合绑定,则可以降低特征数量。

(1)解决哪些特征应该绑在一起?

  1. 构造一个加权无向图,顶点是特征,边有权重,其权重与两个特征间冲突相关;
  2. 根据节点的度进行降序排序,度越大,与其它特征的冲突越大;
  3. 遍历每个特征,将它分配给现有特征包,或者新建一个特征包,使得总体冲突最小。


(2)解决怎么把特征绑为一捆?

考虑到histogram-based算法将连续的值保存为离散的bins,我们可以使得不同特征的值分到bundle中的不同bin(箱子)中,这可以通过在特征值中加一个偏置常量来解决。比如,我们在bundle中绑定了两个特征A和B,A特征的原始取值为区间[0,10),B特征的原始取值为区间[0,20),我们可以在B特征的取值上加一个偏置常量10,将其取值范围变为[10,30),绑定后的特征取值范围为 [0, 30),这样就可以放心的融合特征A和B了。

优化

和XGB相比

为了避免上述XGBoost的缺陷,并且能够在不损害准确率的条件下加快GBDT模型的训练速度,lightGBM在传统的GBDT算法上进行了如下优化:

  • 基于Histogram的决策树算法。
  • 单边梯度采样 Gradient-based One-Side Sampling(GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。
  • 互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。
  • 带深度限制的Leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长 (level-wise) 的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。
  • 直接支持类别特征(Categorical Feature)
  • 支持高效并行
  • Cache命中率优化

自身工程优化

  • 直接支持类别特征(很多学习模型是不直接支持类别特征的,需要通过编码进行数据处理,而且决策树不太建议使用热编码处理,会存在样本切分不平衡问题,导致切分增益非常小(即浪费了这个特征)这个问题,以及影响决策树的学习)
  • 支持高效并行(1.特征并行;2.数据并行;3.投票并行)
  • cache命中率优化(直方图算法对cache比较友好)

特点

优点

  • 内存更小;
  1. 直方图算法将存储特征值转变为存储bin值,降低了内存消耗;
  2. 采用互斥特征捆绑算法减少了特征数量,降低了内存消耗;
  • 速度更快;
  1. 遍历直方图,降低时间复杂度;
  2. 单边梯度法过滤梯度小的样本,减少计算量;
  3. 利用 Leaf-wise 算法的增长策略构建树,减少计算量;
  4. 特征、数据和投票并行,加速计算;
  5. 缓存优化,增加缓存命中率;

缺点

  • 可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度限制,在保证高效率的同时防止过拟合;
  • Boosting族是迭代算法,每一次迭代都根据上一次迭代的预测结果对样本进行权重调整,所以随着迭代不断进行,误差会越来越小,模型的偏差(bias)会不断降低。由于LightGBM是基于偏差的算法,所以会对噪点较为敏感;
  • 在寻找最优解时,依据的是最优切分变量,没有将最优解是全部特征的综合这一理念考虑进去;

实例

分类

  • lightgbm原始街口
import lightgbm as lgb
from sklearn import datasets
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.metrics import roc_auc_score, accuracy_score

# 加载数据
iris = datasets.load_iris()

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3)

# 转换为Dataset数据格式
train_data = lgb.Dataset(X_train, label=y_train)
validation_data = lgb.Dataset(X_test, label=y_test)

# 参数
params = {
    'learning_rate': 0.1,
    'lambda_l1': 0.1,
    'lambda_l2': 0.2,
    'max_depth': 4,
    'objective': 'multiclass',  # 目标函数
    'num_class': 3,
}

# 模型训练
gbm = lgb.train(params, train_data, valid_sets=[validation_data])

# 模型预测
y_pred = gbm.predict(X_test)
y_pred = [list(x).index(max(x)) for x in y_pred]
print(y_pred)

# 模型评估
print(accuracy_score(y_test, y_pred))

  • sklearn接口
from lightgbm import LGBMClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.externals import joblib

# 加载数据
iris = load_iris()
data = iris.data
target = iris.target

# 划分训练数据和测试数据
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2)

# 模型训练
gbm = LGBMClassifier(num_leaves=31, learning_rate=0.05, n_estimators=20)
gbm.fit(X_train, y_train, eval_set=[(X_test, y_test)], early_stopping_rounds=5)

# 模型存储
joblib.dump(gbm, 'loan_model.pkl')
# 模型加载
gbm = joblib.load('loan_model.pkl')

# 模型预测
y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration_)

# 模型评估
print('The accuracy of prediction is:', accuracy_score(y_test, y_pred))

# 特征重要度
print('Feature importances:', list(gbm.feature_importances_))

# 网格搜索,参数优化
estimator = LGBMClassifier(num_leaves=31)
param_grid = {
    'learning_rate': [0.01, 0.1, 1],
    'n_estimators': [20, 40]
}
gbm = GridSearchCV(estimator, param_grid)
gbm.fit(X_train, y_train)
print('Best parameters found by grid search are:', gbm.best_params_)

两种不同的接口,调用同样的数据集以及拆分一样的测试集和训练集最终得到的预测准确率是一样的,均为0.933。

sklearn调用的过程中还用到了网格搜索来确定最优参数。

回归

  • lightgbm原始接口
import pandas as pd
from sklearn.model_selection import train_test_split
import lightgbm as lgb
from sklearn.metrics import mean_absolute_error
# from sklearn.preprocessing import Imputer
from sklearn.impute import SimpleImputer

# 1.读文件
data = pd.read_csv('/Users/zhimiao/Desktop/dataset/train.csv')

# 2.切分数据输入:特征 输出:预测目标变量
y = data.SalePrice
X = data.drop(['SalePrice'], axis=1).select_dtypes(exclude=['object'])

# 3.切分训练集、测试集,切分比例7.5 : 2.5
train_X, test_X, train_y, test_y = train_test_split(X.values, y.values, test_size=0.25)

# 4.空值处理,默认方法:使用特征列的平均值进行填充
# my_imputer = Imputer()
my_imputer = SimpleImputer()
train_X = my_imputer.fit_transform(train_X)
test_X = my_imputer.transform(test_X)

# 5.转换为Dataset数据格式
lgb_train = lgb.Dataset(train_X, train_y)
lgb_eval = lgb.Dataset(test_X, test_y, reference=lgb_train)

# 6.参数
params = {
    'task': 'train',
    'boosting_type': 'gbdt',  # 设置提升类型
    'objective': 'regression',  # 目标函数
    'metric': {'l2', 'auc'},  # 评估函数
    'num_leaves': 31,  # 叶子节点数
    'learning_rate': 0.05,  # 学习速率
    'feature_fraction': 0.9,  # 建树的特征选择比例
    'bagging_fraction': 0.8,  # 建树的样本采样比例
    'bagging_freq': 5,  # k 意味着每 k 次迭代执行bagging
    'verbose': 1  # <0 显示致命的, =0 显示错误 (警告), >0 显示信息
}

# 7.调用LightGBM模型,使用训练集数据进行训练(拟合)
# Add verbosity=2 to print messages while running boosting
my_model = lgb.train(params, lgb_train, num_boost_round=20, valid_sets=lgb_eval, early_stopping_rounds=5)

# 8.使用模型对测试集数据进行预测
predictions = my_model.predict(test_X, num_iteration=my_model.best_iteration)

# 9.对模型的预测结果进行评判(平均绝对误差)
print("Mean Absolute Error : " + str(mean_absolute_error(predictions, test_y)))

LightGBM原理介绍_第3张图片

  • sklearn调用接口
import pandas as pd
from sklearn.model_selection import train_test_split
import lightgbm as lgb
from sklearn.metrics import mean_absolute_error
# from sklearn.preprocessing import Imputer
from sklearn.impute import SimpleImputer


# 1.读文件
# data = pd.read_csv('./dataset/train.csv')
data = pd.read_csv('/Users/zhimiao/Desktop/dataset/train.csv')

# 2.切分数据输入:特征 输出:预测目标变量
y = data.SalePrice
X = data.drop(['SalePrice'], axis=1).select_dtypes(exclude=['object'])

# 3.切分训练集、测试集,切分比例7.5 : 2.5
train_X, test_X, train_y, test_y = train_test_split(X.values, y.values, test_size=0.25)

# 4.空值处理,默认方法:使用特征列的平均值进行填充
# my_imputer = Imputer()
my_imputer = SimpleImputer()

train_X = my_imputer.fit_transform(train_X)
test_X = my_imputer.transform(test_X)

# 5.调用LightGBM模型,使用训练集数据进行训练(拟合)
# Add verbosity=2 to print messages while running boosting
my_model = lgb.LGBMRegressor(objective='regression', num_leaves=31, learning_rate=0.05, n_estimators=20,
                             verbosity=2)
my_model.fit(train_X, train_y, verbose=False)

# 6.使用模型对测试集数据进行预测
predictions = my_model.predict(test_X)

# 7.对模型的预测结果进行评判(平均绝对误差)
print("Mean Absolute Error : " + str(mean_absolute_error(predictions, test_y)))

LightGBM原理介绍_第4张图片

两种不同的接口调用下来的拟合结果不一样,从平均绝对误差的角度来看,sklearn接口调用的效果更优,应该是参数的问题,需要进行参数调优。

参数指南

LightGBM调参指导

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

  • num_leaves:控制了叶节点的数目。它是控制树模型复杂度的主要参数。
  • 如果是level-wise,则该参数为2depth,其中depth为树的深度。但是当叶子数量相同时,leaf-wise的树要远远深过level-wise树,非常容易导致过拟合。因此应该让num_leaves小于2depth。在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 的gbdt
    • goss:表示Gradient-based One-Side Sampling 的gbdt
  • data或者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:一个整数,给出了一棵树上的叶子数。默认为 31
  • tree_learner或者tree:一个字符串,给出了tree learner,主要用于并行学习。 默认为’serial’。 可以为:
    • ‘serial’: 单台机器的tree learner
    • ‘feature’: 特征并行的tree learner
    • ‘data’: 数据并行的tree learner
    • ‘voting’: 投票并行的tree learner
  • num_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: 一个整数,表示一个叶子节点上包含的最少样本数量。默认值为 20
  • min_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正则化系数。默认为0
  • lambda_l2 或者reg_lambda: 一个浮点数,表示L2正则化系数。默认为0
  • min_split_gain 或者min_gain_to_split: 一个浮点数,表示执行切分的最小增益,默认为0
  • drop_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 会将数据文件映射到内存,然后从内存加载特征,这将提供更快的数据加载速度。但是当数据文件很大时,内存可能会被耗尽。如果数据文件太大,则将它设置为True
  • save_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_name
  • weight 或者weight_column: 一个字符串,表示样本权重列。默认为空字符串。你也可以指定一个整数,如weight=0 表示第0列是权重列。注意:它是剔除了标签列之后的索引。假如标签列为0,权重列为1,则这里weight=0。你也可以为列名添加前缀,如weight=prefix:weight_name
  • query 或者query_column或者gourp 或者group_column: 一个字符串,query/group ID 列。默认为空字符串。你也可以指定一个整数,如query=0 表示第0列是query列。注意:它是剔除了标签列之后的索引。假如标签列为0,query列为1,则这里query=0。你也可以为列名添加前缀,如query=prefix:query_name
  • ignore_column 或者 ignore_feature或者blacklist: 一个字符串,表示训练中忽略的一些列,默认为空字符串。可以用数字做索引,如ignore_column=0,1,2 表示第0,1,2 列将被忽略。注意:它是剔除了标签列之后的索引。
  • 你也可以为列名添加前缀,如ignore_column=prefix:ign_name1,ign_name2
  • 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 特征中,负的取值被视作缺失值。
  • predict_raw_score 或者raw_score或者 is_predict_raw_score:一个布尔值,表示是否预测原始得分。默认为False。如果为True则仅预测原始得分。该参数只用于prediction 任务。
  • predict_leaf_index 或者 leaf_index或者 is_predict_leaf_index: 一个布尔值,表示是否预测每个样本在每棵树上的叶节点编号。默认为False。在预测时,每个样本都会被分配到每棵树的某个叶子节点上。该参数就是要输出这些叶子节点的编号。该参数只用于prediction 任务。
  • predict_contrib 或者 contrib或者 is_predict_contrib: 一个布尔值,表示是否输出每个特征对于每个样本的预测的贡献。默认为False。输出的结果形状为[nsamples,nfeatures+1], 之所以+1 是考虑到bais 的贡献。所有的贡献加起来就是该样本的预测结果。该参数只用于prediction 任务。
  • bin_construct_sample_cnt 或者 subsample_for_bin:一个整数,表示用来构建直方图的样本的数量。默认为200000。如果数据非常稀疏,则可以设置为一个更大的值,如果设置更大的值,则会提供更好的训练效果,但是会增加数据加载时间。
  • num_iteration_predict: 一个整数,表示在预测中使用多少棵子树。默认为-1。小于等于0表示使用模型的所有子树。该参数只用于prediction 任务。
  • pred_early_stop:一个布尔值,表示是否使用早停来加速预测。默认为False。如果为True,则可能影响精度。
  • pred_early_stop_freq: 一个整数,表示检查早停的频率。默认为10
  • pred_early_stop_margin: 一个浮点数,表示早停的边际阈值。默认为0
  • use_missing: 一个布尔值,表示是否使用缺失值功能。默认为True如果为False 则禁用缺失值功能。
  • zero_as_missing: 一个布尔值,表示是否将所有的零(包括在libsvm/sparse矩阵 中未显示的值)都视为缺失值。 默认为False。如果为False,则将nan 视作缺失值。如果为True,则np.nan 和 零都将视作缺失值。
  • init_score_file: 一个字符串,表示训练时的初始化分数文件的路径。默认为空字符串,表示train_data_file+”.init” (如果存在)
  • valid_init_score_file: 一个字符串,表示验证时的初始化分数文件的路径。默认为空字符串,表示valid_data_file+”.init” (如果存在)。如果有多个(对应于多个验证集),则可以用逗号, 来分隔。

目标函数的参数:

  • sigmoid: 一个浮点数,用sigmoid 函数的参数,默认为0。它用于二分类任务和lambdarank 任务。
  • alpha: 一个浮点数,用于Huber 损失函数和Quantile regression ,默认值为0。它用于huber回归任务和Quantile 回归任务。
  • fair_c: 一个浮点数,用于Fair 损失函数,默认值为0 。它用于fair 回归任务。
  • gaussian_eta: 一个浮点数,用于控制高斯函数的宽度,默认值为0 。它用于regression_l1 回归任务和huber回归任务。
  • posson_max_delta_step: 一个浮点数,用于Poisson regression 的参数,默认值为7 。它用于poisson 回归任务。
  • scale_pos_weight: 一个浮点数,用于调整正样本的权重,默认值为0它用于二分类任务。
  • boost_from_average: 一个布尔值,指示是否将初始得分调整为平均值(它可以使得收敛速度更快)。默认为True。它用于回归任务。
  • is_unbalance或者unbalanced_set : 一个布尔值,指示训练数据是否均衡的。默认为True。它用于二分类任务。
  • max_position: 一个整数,指示将在这个NDCG 位置优化。默认为 20 。它用于lambdarank 任务。
  • label_gain: 一个浮点数序列,给出了每个标签的增益。默认值为0,1,3,7,15,….它用于lambdarank 任务。
  • num_class或者num_classes : 一个整数,指示了多分类任务中的类别数量。默认为 1它用于多分类任务。
  • reg_sqrt: 一个布尔值,默认为False。如果为True,则拟合的结果为:label‾‾‾‾‾√。同时预测的结果被自动转换为:pred2。它用于回归任务。

度量参数:

  • 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 散度
  • metric_freq或者’output_freq’:一个正式,表示每隔多少次输出一次度量结果。默认为1。
  • train_metric 或者training_metric或者 is_training_metric: 一个布尔值,默认为False。如果为True,则在训练时就输出度量结果。
  • ndcg_at 或者 ndcg_eval_at 或者eval_at: 一个整数列表,指定了NDCG 评估点的位置。默认为1,2,3,4,5 。

参考材料

  1. 深入理解LightGBM - 知乎《深入理解lightgbm》
  2. WeChat-zhihu-csdnblog-code/Ensemble Learning/LightGBM at master · Microstrong0305/WeChat-zhihu-csdnblog-code · GitHub《github数据集和代码》
  3. 无痛看懂LightGBM原文 - 知乎《无痛看懂lightgbm》
  4. 机器学习算法之LightGBM – 标点符《参数调优细节文档》
  5. 使用sklearn进行数据挖掘-房价预测(1) - Wanna_Go - 博客园《模型使用步骤》​​

你可能感兴趣的:(算法,python)