赞
踩
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
结果展示
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。