LightGBM 训练及调参
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附近,这样是为了加快收敛的速度。这对于调参是很有必要的。
- 对决策树基本参数调参
- 正则化参数调参
- 最后降低学习率,这里是为了最后提高准确率
学习率和迭代次数
我们先把学习率先定一个较高的值,这里取 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 训练及调参相关推荐
- XGboost模型训练与调参
XGboost XGboost是(Gradient Boosting Decision Tree)梯度提升树的一种实现. DBDT Model cycle: [外链图片转存失败,源站可能有防盗链机制, ...
- python 随机森林调参_Python机器学习实践:随机森林算法训练及调参-附代码
原标题:Python机器学习实践:随机森林算法训练及调参-附代码 文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 ...
- 天下苦深度强化学习久矣,这有一份训练与调参技巧手册
©作者 | 申岳 单位 | 北京邮电大学 研究方向 | 机器人学习 天下苦 RL 久矣,其中最苦的地方莫过于训练和调参了,人人欲"调"之而后快. 在此为 RL 社区贡献一点绵薄之力 ...
- 【经验】深度强化学习训练与调参技巧
来源:知乎(https://zhuanlan.zhihu.com/p/482656367) 作者:岳小飞 天下苦 RL 久矣,其中最苦的地方莫过于训练和调参了,人人欲"调"之而后快 ...
- 谷歌发布颠覆性研究:不训练不调参,AI自动构建超强网络,告别炼丹一大步...
来源:凹非寺 机器学习全靠调参?这个思路已经过时了. 谷歌大脑团队发布了一项新研究: 只靠神经网络架构搜索出的网络,不训练,不调参,就能直接执行任务. 这样的网络叫做WANN,权重不可知神经网络. 它 ...
- Caret模型训练和调参更多参数解读(2)
trainControl函数控制参数 trainControl函数用于定义train函数运行的一些参数,如交叉验证方式.模型评估函数.模型选择标准.调参方式等. 部分参数解释如下: method: 重 ...
- SVM模型训练和调参
一.不同核函数需调参数不同 SVM中有两个很重要的参数,即C和gamma. 如何使SVM得到好的结果: 1.对数据进行归一化: 2.应用RBF核函数: 3.用cross-validation和grid ...
- 随机森林算法训练及调参-附代码
随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为&q ...
- Python机器学习实践:随机森林算法训练及调参-附代码
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 来源 | 博客园 作者 | 战争热诚 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法 ...
最新文章
- css动画使用背景图片卡顿_CSS入门学习笔记(二):布局与定位
- getprivateprofilestring读不到数据_电商系列(三)如何构建数据库的主从架构!
- (笔记)Mysql命令select from:查询表中的数据(记录)
- activiti流程跟踪图简单详解
- Leetcode 148. 排序链表 解题思路及C++实现
- c/c++函数指针(Hook前奏1)
- 为一个优秀的C++程序员
- centos 安装低版本内核_Docker安装教程
- 第一节 42字符串基础
- 对离散点进行积分的python程序实现_Stochastic Calculus(Python)(四)
- 山东理工计算机组成原理试题,山东理工计算机组成原理试题
- j2Cache线上异常问题排查记录
- ios 添加浮动效果_自定义悬浮窗详解(模拟IOS小球拖动,轮盘滑动)
- Processing简介和环境搭建
- 微信小程序与uni-app的区别
- 如何编写udf函数(收藏篇)
- java什么是网络接口_Java语言:什么叫面向接口编程(来自网络)
- 云端身份证识别OCr
- 介绍一款Excel数据收集软件,简单好用
- java ssm基于springboot的通知反馈系统