LightGBM官方地址:
https://lightgbm.readthedocs.io/en/v3.3.2/
LightGBM,轻量的梯度提升机(Light Gradient Boosting Machine),由微软开源的一款SOTA Boosting算法框架。LightGBM与XGBoost 算法类似,其基本思想都是对所有特征都按照特征的数值进行排序,找到一个特征上的最好分割点,将数据分裂成左右子节点。
两种算法都有很多的优点,比如更快的训练效率、更高的准确率、支持并行化学习、大规模数据的处理等,但XGBOOST也有一些明显的缺点,如在选择树的分隔节点时,需要遍历所有的特征值,计算量大,内存占用量也大,还有易产生过拟合等。
而LightGBM基于此还有几个方面的优化:
任务
设置提升类型
目标函数,默认回归
一棵树上的叶子数,控制了叶节点的数目,控制树模型复杂度的主要参数。
学习率
boosting 的迭代次数
树的最大深度限制,防止过拟合
一个叶子上数据的最小数量. 可以用来处理过拟合.
一个叶子上的最小 hessian 和. 类似于 min_data_in_leaf, 可以用来处理过拟合.
叶子节点最小样本数,防止过拟合
随机选择特征比例,加速训练及防止过拟合
随机种子数,保证每次能够随机选择样本的一致性
类似随机森林,它将在不进行重采样的情况下随机选择部分数据,可以用来加速训练,也可以用来处理过拟合
bagging 的频率, 0 意味着禁用 bagging. k 意味着每 k 次迭代执行bagging,为了启用 bagging, bagging_fraction 设置适当
如果一个验证集的度量在 early_stopping_round 循环中没有提升, 将停止训练
L1正则
L2正则
最小切分的信息增益值
大梯度树的保留比例
小梯度树的保留比例
每个分类组的最小数据量
分类特征的最大阈值
工具箱的最大数特征值决定了容量 工具箱的最小数特征值可能会降低训练的准确性, 但是可能会增加一些一般的影响(处理过度学习)
LightGBM 将根据 max_bin 自动压缩内存。 例如, 如果 maxbin=255, 那么 LightGBM 将使用 uint8t 的特性值
如果设置为 true LightGBM 则将数据集(包括验证数据)保存到二进制文件中。 可以加快数据加载速度。
一般默认是1,显示信息。# <0 显示致命的, =0 显示错误 (警告), >0 显示信息
评估函数,二分类问题多用l2, auc, binary_logloss等
由于LightGBM参数众多,本文只是列举一些常用重要的参数,其他更多详细参数见官方文档。
class lightGbmModel():
def __int__(self):
pass
def loadData(self):
# load and describle dataset
initial_file = pd.read_excel('D:/program/card_clients.xls', engine='xlrd', skiprows = [0], index_col=[0])
print(initial_file.head(), initial_file.describe(), initial_file.info())
# split train and test
x = initial_file.drop('default payment next month', axis=1)
y = initial_file['default payment next month']
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.3, random_state = 123)
return x_train, x_test, y_train, y_test
def trainModel(self,x_train, x_test, y_train, y_test):
# training model
lgb_train = lgb.Dataset(x_train, y_train)
lgb_eval = lgb.Dataset(x_test, y_test, reference=lgb_train)
evals_result = {}
params = {
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'binary',
'metric': {'l2', 'auc', 'binary_logloss'},
'num_leaves': 50,
'max_depth': 6,
'max_bin': 200,
'learning_rate': 0.01,
'feature_fraction': 1,
'bagging_fraction': 0.7,
'bagging_freq': 5,
'verbose': 1
}
lgbm = lgb.train(params, lgb_train, num_boost_round=1000, valid_sets=lgb_eval, evals_result=evals_result, early_stopping_rounds=100)
joblib.dump(lgbm, 'lgbm_model.pkl')
return lgbm, evals_result
def plog_importance(lgbm):
# plot feature importance
fig, ax = plt.subplots(figsize=(5, 10))
lgb.plot_importance(lgbm, max_num_features=10, ax=ax, importance_type='split')
plt.show()
def proba_to_label(self, y_pred):
for i in range(0, len(y_pred)):
if y_pred[i] >= 0.5:
y_pred[i] = 1
else:
y_pred[i] = 0
return y_pred
def predict_metrics_score(self, y_true, y_pred):
accuracy = metrics.accuracy_score(y_true, y_pred)
auc = metrics.roc_auc_score(y_true, y_pred)
return accuracy, auc
def predict_evaluate(self):
x_train, x_test, y_train, y_test = self.loadData()
lgbm, evals_result = self.trainModel(x_train, x_test, y_train, y_test)
# predict test
y_train_pred = lgbm.predict(x_train, num_iteration=lgbm.best_iteration)
y_test_pred = lgbm.predict(x_test, num_iteration=lgbm.best_iteration)
# evaluate model
train_result = self.predict_metrics_score(y_train, self.proba_to_label(y_train_pred))
test_result = self.predict_metrics_score(y_test, self.proba_to_label(y_test_pred))
return train_result, test_result