当前位置:   article > 正文

LightGBM操作指南_lightgbm 中booster_方法是什么

lightgbm 中booster_方法是什么

转自:https://mp.weixin.qq.com/s/9gEfkiZyZkoIgwRCYISQgQ

LightGBM是基于XGBoost的一款可以快速并行的树模型框架,内部集成了多种集成学习思路,在代码实现上对XGBoost的节点划分进行了改进,内存占用更低训练速度更快。

LightGBM官网:https://lightgbm.readthedocs.io/en/latest/

参数介绍:https://lightgbm.readthedocs.io/en/latest/Parameters.html

本文内容如下,原始代码获取方式见文末。

  • 1 安装方法

  • 2 调用方法

    • 2.1 定义数据集

    • 2.2 模型训练

    • 2.3 模型保存与加载

    • 2.4 查看特征重要性

    • 2.5 继续训练

    • 2.6 动态调整模型超参数

    • 2.7 自定义损失函数

  • 2.8 调参方法

    • 人工调参

    • 网格搜索

    • 贝叶斯优化

1 安装方法

LightGBM的安装非常简单,在Linux下很方便的就可以开启GPU训练。可以优先选用从pip安装,如果失败再从源码安装。

  • 安装方法:从源码安装

  1. git clone --recursive https://github.com/microsoft/LightGBM ; 
  2. cd LightGBM
  3. mkdir build ; cd build
  4. cmake ..
  5. # 开启MPI通信机制,训练更快
  6. # cmake -DUSE_MPI=ON ..
  7. # GPU版本,训练更快
  8. # cmake -DUSE_GPU=1 ..
  9. make -j4
  • 安装方法:pip安装

  1. # 默认版本
  2. pip install lightgbm
  3. # MPI版本
  4. pip install lightgbm --install-option=--mpi
  5. # GPU版本
  6. pip install lightgbm --install-option=--gpu

2 调用方法

在Python语言中LightGBM提供了两种调用方式,分为为原生的API和Scikit-learn API,两种方式都可以完成训练和验证。当然原生的API更加灵活,看个人习惯来进行选择。

2.1 定义数据集

  1. df_train = pd.read_csv('https://cdn.coggle.club/LightGBM/examples/binary_classification/binary.train', header=None, sep='\t')
  2. df_test = pd.read_csv('https://cdn.coggle.club/LightGBM/examples/binary_classification/binary.test', header=None, sep='\t')
  3. W_train = pd.read_csv('https://cdn.coggle.club/LightGBM/examples/binary_classification/binary.train.weight', header=None)[0]
  4. W_test = pd.read_csv('https://cdn.coggle.club/LightGBM/examples/binary_classification/binary.test.weight', header=None)[0]
  5. y_train = df_train[0]
  6. y_test = df_test[0]
  7. X_train = df_train.drop(0, axis=1)
  8. X_test = df_test.drop(0, axis=1)
  9. num_train, num_feature = X_train.shape
  10. # create dataset for lightgbm
  11. if you want to re-use data, remember to set free_raw_data=False
  12. lgb_train = lgb.Dataset(X_train, y_train,
  13.                         weight=W_train, free_raw_data=False)
  14. lgb_eval = lgb.Dataset(X_test, y_testreference=lgb_train,
  15.                        weight=W_testfree_raw_data=False)

2.2 模型训练

  1. params = {
  2.     'boosting_type''gbdt',
  3.     'objective''binary',
  4.     'metric''binary_logloss',
  5.     'num_leaves'31,
  6.     'learning_rate'0.05,
  7.     'feature_fraction'0.9,
  8.     'bagging_fraction'0.8,
  9.     'bagging_freq'5,
  10.     'verbose'0
  11. }
  12. generate feature names
  13. feature_name = ['feature_' + str(colfor col in range(num_feature)]
  14. gbm = lgb.train(params,
  15.                 lgb_train,
  16.                 num_boost_round=10,
  17.                 valid_sets=lgb_train,  # eval training data
  18.                 feature_name=feature_name,
  19.                 categorical_feature=[21])

2.3 模型保存与加载

  1. # save model to file
  2. gbm.save_model('model.txt')
  3. print('Dumping model to JSON...')
  4. model_json = gbm.dump_model()
  5. with open('model.json''w+'as f:
  6.     json.dump(model_json, f, indent=4)

2.4 查看特征重要性

  1. # feature names
  2. print('Feature names:', gbm.feature_name())
  3. # feature importances
  4. print('Feature importances:', list(gbm.feature_importance()))

2.5 继续训练

  1. continue training
  2. # init_model accepts:
  3. 1. model file name
  4. 2. Booster()
  5. gbm = lgb.train(params,
  6.                 lgb_train,
  7.                 num_boost_round=10,
  8.                 init_model='model.txt',
  9.                 valid_sets=lgb_eval)
  10. print('Finished 10 - 20 rounds with model file...')

2.6 动态调整模型超参数

  1. # decay learning rates
  2. # learning_rates accepts:
  3. 1. list/tuple with length = num_boost_round
  4. 2function(curr_iter)
  5. gbm = lgb.train(params,
  6.                 lgb_train,
  7.                 num_boost_round=10,
  8.                 init_model=gbm,
  9.                 learning_rates=lambda iter: 0.05 * (0.99 ** iter),
  10.                 valid_sets=lgb_eval)
  11. print('Finished 20 - 30 rounds with decay learning rates...')
  12. # change other parameters during training
  13. gbm = lgb.train(params,
  14.                 lgb_train,
  15.                 num_boost_round=10,
  16.                 init_model=gbm,
  17.                 valid_sets=lgb_eval,
  18.                 callbacks=[lgb.reset_parameter(bagging_fraction=[0.7* 5 + [0.6* 5)])
  19. print('Finished 30 - 40 rounds with changing bagging_fraction...')

2.7 自定义损失函数

  1. # self-defined objective function
  2. # f(preds: array, train_data: Dataset) -> grad: array, hess: array
  3. # log likelihood loss
  4. def loglikelihood(preds, train_data):
  5.     labels = train_data.get_label()
  6.     preds = 1/ (1+ np.exp(-preds))
  7.     grad = preds - labels
  8.     hess = preds * (1. - preds)
  9.     return grad, hess
  10. # self-defined eval metric
  11. # f(preds: array, train_data: Dataset) -> name: string, eval_result: float, is_higher_better: bool
  12. binary error
  13. # NOTE: when you do customized loss function, the default prediction value is margin
  14. # This may make built-in evalution metric calculate wrong results
  15. For example, we are doing log likelihood loss, the prediction is score before logistic transformation
  16. # Keep this in mind when you use the customization
  17. def binary_error(preds, train_data):
  18.     labels = train_data.get_label()
  19.     preds = 1/ (1+ np.exp(-preds))
  20.     return 'error', np.mean(labels != (preds > 0.5)), False
  21. gbm = lgb.train(params,
  22.                 lgb_train,
  23.                 num_boost_round=10,
  24.                 init_model=gbm,
  25.                 fobj=loglikelihood,
  26.                 feval=binary_error,
  27.                 valid_sets=lgb_eval)
  28. print('Finished 40 - 50 rounds with self-defined objective function and eval metric...')

2.8 调参方法

人工调参

For Faster Speed

  • Use bagging by setting bagging_fraction and bagging_freq

  • Use feature sub-sampling by setting feature_fraction

  • Use small max_bin

  • Use save_binary to speed up data loading in future learning

  • Use parallel learning, refer to Parallel Learning Guide <./Parallel-Learning-Guide.rst>__

For Better Accuracy

  • Use large max_bin (may be slower)

  • Use small learning_rate with large num_iterations

  • Use large num_leaves (may cause over-fitting)

  • Use bigger training data

  • Try dart

Deal with Over-fitting

  • Use small max_bin

  • Use small num_leaves

  • Use min_data_in_leaf and min_sum_hessian_in_leaf

  • Use bagging by set bagging_fraction and bagging_freq

  • Use feature sub-sampling by set feature_fraction

  • Use bigger training data

  • Try lambda_l1lambda_l2 and min_gain_to_split for regularization

  • Try max_depth to avoid growing deep tree

  • Try extra_trees

  • Try increasing path_smooth

网格搜索

  1. lg = lgb.LGBMClassifier(silent=False)
  2. param_dist = {"max_depth": [4,57],
  3.               "learning_rate" : [0.01,0.05,0.1],
  4.               "num_leaves": [300,900,1200],
  5.               "n_estimators": [50100150]
  6.              }
  7. grid_search = GridSearchCV(lg, n_jobs=-1, param_grid=param_dist, cv = 5, scoring="roc_auc", verbose=5)
  8. grid_search.fit(train,y_train)
  9. grid_search.best_estimator_, grid_search.best_score_

贝叶斯优化

  1. import warnings
  2. import time
  3. warnings.filterwarnings("ignore")
  4. from bayes_opt import BayesianOptimization
  5. def lgb_eval(max_depth, learning_rate, num_leaves, n_estimators):
  6.     params = {
  7.              "metric" : 'auc'
  8.         }
  9.     params['max_depth'= int(max(max_depth, 1))
  10.     params['learning_rate'= np.clip(01, learning_rate)
  11.     params['num_leaves'= int(max(num_leaves, 1))
  12.     params['n_estimators'= int(max(n_estimators, 1))
  13.     cv_result = lgb.cv(params, d_train, nfold=5, seed=0, verbose_eval =200,stratified=False)
  14.     return 1.0 * np.array(cv_result['auc-mean']).max()
  15. lgbBO = BayesianOptimization(lgb_eval, {'max_depth': (48),
  16.                                             'learning_rate': (0.050.2),
  17.                                             'num_leaves' : (20,1500),
  18.                                             'n_estimators': (5200)}, random_state=0)
  19. lgbBO.maximize(init_points=5, n_iter=50,acq='ei')
  20. print(lgbBO.max)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/258020?site
推荐阅读
相关标签
  

闽ICP备14008679号