LightGBM是微软开源的一个快速的,分布式的,高性能的基于决策树算法的梯度提升算法,对比于XGBoost算法来说准确率在大部分情况下相较无几,但是在收敛速度,内存占用情况下相较于XGBoost来说较为优秀。详细的算法原理可见LightGBM官方文档。

在已经有了训练值和label的情况下可以创建lightgbm进行训练了,这里我是先对数据集进行划分得到了X_train,X_test, y_train, y_test

from sklearn.model_selection import train_test_splitX_train,X_test, y_train, y_test =train_test_split(train,target_train,test_size=0.3, random_state=0)

然后将X_train在用K-Fold划分进行训练,训练的代码:

from sklearn.metrics import r2_score
import lightgbm as lgb
from lightgbm import LGBMRegressor
from sklearn.model_selection import KFold,cross_val_score,GridSearchCV
import time
#参数
params = {'num_leaves': 85,'min_data_in_leaf': 1,'min_child_samples':20,'objective': 'regression','learning_rate': 0.01,"boosting": "gbdt","feature_fraction": 0.9,"bagging_freq": 0,"bagging_fraction": 0.6,"bagging_seed": 23,"metric": 'rmse',"lambda_l1": 0.2,"nthread": 4,
}
#5折K-Fold
folds = KFold(n_splits=5, shuffle=True, random_state=15)
oof_lgb = np.zeros(len(X_train))
predictions_lgb = np.zeros((len(X_test)))
start = time.time()
for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train.values, y_train.values)):print("fold n°{}".format(fold_))print('trn_idx:',trn_idx)print('val_idx:',val_idx)trn_data = lgb.Dataset(X_train.iloc[trn_idx],label=y_train.iloc[trn_idx])val_data = lgb.Dataset(X_train.iloc[val_idx],label=y_train.iloc[val_idx])num_round = 10000clf = lgb.train(params,trn_data,num_round,valid_sets = [trn_data, val_data],verbose_eval=500,early_stopping_rounds = 200)oof_lgb[val_idx] = clf.predict(X_train.iloc[val_idx], num_iteration=clf.best_iteration)print(oof_lgb)predictions_lgb += clf.predict(X_test, num_iteration=clf.best_iteration) / folds.n_splitsprint(predictions_lgb)
print("CV Score: {}".format(r2_score( y_train, oof_lgb)))#还可以根据需要输出特征贡献值表格

部分运行结果截图

可以看到模型在训练集上r2得分0.89,在测试集上也有0.9左右,应该是较好地收敛了

调参

参考blog:https://blog.csdn.net/u012735708/article/details/83749703
lightGBM需要调的参数除了主要分为以下方面
学习控制参数:




下表 整理了为了达到Faster Speed ,better accuracy ,over-fitting 三种目的时,可以调的参数

LightGBM的调参基本流程如下:

首先选择较高的学习率,大概0.1附近,这样是为了加快收敛的速度。这对于调参是很有必要的。

  1. 对决策树基本参数调参
  2. 正则化参数调参
  3. 最后降低学习率,这里是为了最后提高准确率

学习率和迭代次数

我们先把学习率先定一个较高的值,这里取 learning_rate = 0.1,其次确定估计器boosting/boost/boosting_type的类型,不过默认都会选gbdt。

迭代的次数,也可以说是残差树的数目,参数名为n_estimators/num_iterations/num_round/num_boost_round。我们可以先将该参数设成一个较大的数,然后在cv结果中查看最优的迭代次数,具体如代码。

在这之前,我们必须给其他重要的参数一个初始值。初始值的意义不大,只是为了方便确定其他参数。下面先给定一下初始值:

以下参数根据具体项目要求定:

‘boosting_type’/‘boosting’: ‘gbdt’
‘objective’: ‘binary’ / ‘regression’
‘metric’: ‘auc’

首先选定初始参数

'max_depth': 5     # 由于数据集不是很大,所以选择了一个适中的值,其实4-10都无所谓。
'num_leaves': 30   # 由于lightGBM是leaves_wise生长,官方说法是要小于2^max_depth
'subsample'/'bagging_fraction':0.8           # 数据采样
'colsample_bytree'/'feature_fraction': 0.8   # 特征采样

用lgb自带的cv调参n_estimators,注意调参时学习率最好设为0.1,加快收敛速率,有益于调参

import lightgbm as lgb
params = {    'boosting_type': 'gbdt','objective': 'regression','metric': 'auc','nthread':4,'learning_rate':0.1,#为了加快收敛的速度'num_leaves':30, 'max_depth': 5,   'subsample': 0.8, 'colsample_bytree': 0.8, }data_train = lgb.Dataset(X_train, y_train)
cv_results = lgb.cv(params, data_train, num_boost_round=1000, nfold=5, stratified=False, shuffle=True, metrics='auc',early_stopping_rounds=50,seed=0)
print('best n_estimators:', len(cv_results['auc-mean']))
print('best cv score:', pd.Series(cv_results['auc-mean']).max())

使用sklearn的GridSearchCV调参

确定max_depth和num_leaves

这是提高精确度的最重要的参数

from sklearn.model_selection import GridSearchCVparams_test1={'max_depth': range(3,8,1), 'num_leaves':range(5, 100, 5)}gsearch1 = GridSearchCV(estimator = lgb.LGBMRegressor(boosting_type='gbdt',objective='regression',metrics='auc',learning_rate=0.1, n_estimators=20, max_depth=6, bagging_fraction = 0.8,feature_fraction = 0.8), param_grid = params_test1, cv=5,n_jobs=-1)
gsearch1.fit(X_train,y_train)
#明确是用Regressor还是Classifier
#regressor问题参数中不能加入scoring='roc_auc' 因为roc曲线是用于评估二分类的

确定min_data_in_leaf和max_bin in

params_test2={'max_bin': range(5,256,10), 'min_data_in_leaf':range(1,102,10)}gsearch2 = GridSearchCV(estimator = lgb.LGBMRegressor(boosting_type='gbdt',objective='regression',metrics='auc',learning_rate=0.1, n_estimators=20, max_depth=7,num_leaves = 85, bagging_fraction = 0.8,feature_fraction = 0.8), param_grid = params_test2, cv=5,n_jobs=-1)
gsearch2.fit(X_train,y_train)
gsearch2.cv_results_, gsearch2.best_params_, gsearch2.best_score_

确定feature_fraction、bagging_fraction、bagging_freq

params_test3={'feature_fraction': [0.6,0.7,0.8,0.9,1.0],'bagging_fraction': [0.6,0.7,0.8,0.9,1.0],'bagging_freq': range(0,81,10)
}
gsearch3 = GridSearchCV(estimator = lgb.LGBMRegressor(boosting_type='gbdt',objective='regression',metrics='auc',learning_rate=0.1, n_estimators=20, max_depth=7,num_leaves = 85,max_bin = 195,min_data_in_leaf = 1, bagging_fraction = 0.8,feature_fraction = 0.8), param_grid = params_test3, cv=5,n_jobs=-1)
gsearch3.fit(X_train,y_train)
gsearch3.best_params_, gsearch3.best_score_

确定lambda_l1和lambda_l2

params_test4={'lambda_l1': [1e-5,1e-3,1e-1,0.0,0.1,0.3,0.5,0.7,0.9,1.0],'lambda_l2': [1e-5,1e-3,1e-1,0.0,0.1,0.3,0.5,0.7,0.9,1.0]
}

确定 min_split_gain

params_test5={'min_split_gain':[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]}

LightGBM 训练及调参相关推荐

  1. XGboost模型训练与调参

    XGboost XGboost是(Gradient Boosting Decision Tree)梯度提升树的一种实现. DBDT Model cycle: [外链图片转存失败,源站可能有防盗链机制, ...

  2. python 随机森林调参_Python机器学习实践:随机森林算法训练及调参-附代码

    原标题:Python机器学习实践:随机森林算法训练及调参-附代码 文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 ...

  3. 天下苦深度强化学习久矣,这有一份训练与调参技巧手册

    ©作者 | 申岳 单位 | 北京邮电大学 研究方向 | 机器人学习 天下苦 RL 久矣,其中最苦的地方莫过于训练和调参了,人人欲"调"之而后快. 在此为 RL 社区贡献一点绵薄之力 ...

  4. 【经验】深度强化学习训练与调参技巧

    来源:知乎(https://zhuanlan.zhihu.com/p/482656367) 作者:岳小飞 天下苦 RL 久矣,其中最苦的地方莫过于训练和调参了,人人欲"调"之而后快 ...

  5. 谷歌发布颠覆性研究:不训练不调参,AI自动构建超强网络,告别炼丹一大步...

    来源:凹非寺 机器学习全靠调参?这个思路已经过时了. 谷歌大脑团队发布了一项新研究: 只靠神经网络架构搜索出的网络,不训练,不调参,就能直接执行任务. 这样的网络叫做WANN,权重不可知神经网络. 它 ...

  6. Caret模型训练和调参更多参数解读(2)

    trainControl函数控制参数 trainControl函数用于定义train函数运行的一些参数,如交叉验证方式.模型评估函数.模型选择标准.调参方式等. 部分参数解释如下: method: 重 ...

  7. SVM模型训练和调参

    一.不同核函数需调参数不同 SVM中有两个很重要的参数,即C和gamma. 如何使SVM得到好的结果: 1.对数据进行归一化: 2.应用RBF核函数: 3.用cross-validation和grid ...

  8. 随机森林算法训练及调参-附代码

    随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为&q ...

  9. Python机器学习实践:随机森林算法训练及调参-附代码

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法 ...

最新文章

  1. css动画使用背景图片卡顿_CSS入门学习笔记(二):布局与定位
  2. getprivateprofilestring读不到数据_电商系列(三)如何构建数据库的主从架构!
  3. (笔记)Mysql命令select from:查询表中的数据(记录)
  4. activiti流程跟踪图简单详解
  5. Leetcode 148. 排序链表 解题思路及C++实现
  6. c/c++函数指针(Hook前奏1)
  7. 为一个优秀的C++程序员
  8. centos 安装低版本内核_Docker安装教程
  9. 第一节 42字符串基础
  10. 对离散点进行积分的python程序实现_Stochastic Calculus(Python)(四)
  11. 山东理工计算机组成原理试题,山东理工计算机组成原理试题
  12. j2Cache线上异常问题排查记录
  13. ios 添加浮动效果_自定义悬浮窗详解(模拟IOS小球拖动,轮盘滑动)
  14. Processing简介和环境搭建
  15. 微信小程序与uni-app的区别
  16. 如何编写udf函数(收藏篇)
  17. java什么是网络接口_Java语言:什么叫面向接口编程(来自网络)
  18. 云端身份证识别OCr
  19. 介绍一款Excel数据收集软件,简单好用
  20. java ssm基于springboot的通知反馈系统

热门文章

  1. 关于vue3移除了filter 另外一种过滤方法
  2. 声学所ZJ系列压电测试仪之多层压电陶瓷变压器的振动与疲劳
  3. springboot 整合xcf 发布 webservice
  4. 5W无线充IC发光鼠标垫可以充手机过EMC认证
  5. 如果你看到钟的时间是3 15 那一刻时针和分针的夹角是多少 肯定不是0度 Google 谷歌 百度 baid
  6. 自己动手实现DNS协议
  7. android天气预报软件界面设计
  8. 高考指南|人工智能人才缺口大,高校专业建设防止“一窝蜂”
  9. for语句和for-in语句
  10. iOS 底层原理-alloc流程