【集成学习】lightgbm调参

lightgbm使用leaf_wise tree生长策略,leaf_wise_tree的优点是收敛速度快,缺点是容易过拟合。

# lightgbm关键参数

# lightgbm调参方法cv

  1 # -*- coding: utf-8 -*-
  2 """
  3 # 作者:wanglei5205
  4 # 邮箱:[email protected]
  5 # 博客:http://cnblogs.com/wanglei5205
  6 # github:http://github.com/wanglei5205
  7 """
  8 ### 导入模块
  9 import numpy as np
 10 import pandas as pd
 11 import lightgbm as lgb
 12 from sklearn import metrics
 13
 14 ### 载入数据
 15 print(‘载入数据‘)
 16 dataset1 = pd.read_csv(‘G:/ML/ML_match/IJCAI/data3.22/3.22ICJAI/data/7_train_data1.csv‘)
 17 dataset2 = pd.read_csv(‘G:/ML/ML_match/IJCAI/data3.22/3.22ICJAI/data/7_train_data2.csv‘)
 18 dataset3 = pd.read_csv(‘G:/ML/ML_match/IJCAI/data3.22/3.22ICJAI/data/7_train_data3.csv‘)
 19 dataset4 = pd.read_csv(‘G:/ML/ML_match/IJCAI/data3.22/3.22ICJAI/data/7_train_data4.csv‘)
 20 dataset5 = pd.read_csv(‘G:/ML/ML_match/IJCAI/data3.22/3.22ICJAI/data/7_train_data5.csv‘)
 21
 22 print(‘数据去重‘)
 23 dataset1.drop_duplicates(inplace=True)
 24 dataset2.drop_duplicates(inplace=True)
 25 dataset3.drop_duplicates(inplace=True)
 26 dataset4.drop_duplicates(inplace=True)
 27 dataset5.drop_duplicates(inplace=True)
 28
 29 print(‘数据合并‘)
 30 trains = pd.concat([dataset1,dataset2],axis=0)
 31 trains = pd.concat([trains,dataset3],axis=0)
 32 trains = pd.concat([trains,dataset4],axis=0)
 33
 34 online_test = dataset5
 35
 36 ### 数据拆分(训练集+验证集+测试集)
 37 print(‘数据拆分‘)
 38 from sklearn.model_selection import train_test_split
 39 train_xy,offline_test = train_test_split(trains,test_size = 0.2,random_state=21)
 40 train,val = train_test_split(train_xy,test_size = 0.2,random_state=21)
 41
 42 # 训练集
 43 y_train = train.is_trade                                               # 训练集标签
 44 X_train = train.drop([‘instance_id‘,‘is_trade‘],axis=1)                # 训练集特征矩阵
 45
 46 # 验证集
 47 y_val = val.is_trade                                                   # 验证集标签
 48 X_val = val.drop([‘instance_id‘,‘is_trade‘],axis=1)                    # 验证集特征矩阵
 49
 50 # 测试集
 51 offline_test_X = offline_test.drop([‘instance_id‘,‘is_trade‘],axis=1)  # 线下测试特征矩阵
 52 online_test_X  = online_test.drop([‘instance_id‘],axis=1)              # 线上测试特征矩阵
 53
 54 ### 数据转换
 55 print(‘数据转换‘)
 56 lgb_train = lgb.Dataset(X_train, y_train, free_raw_data=False)
 57 lgb_eval = lgb.Dataset(X_val, y_val, reference=lgb_train,free_raw_data=False)
 58
 59 ### 设置初始参数--不含交叉验证参数
 60 print(‘设置参数‘)
 61 params = {
 62           ‘boosting_type‘: ‘gbdt‘,
 63           ‘objective‘: ‘binary‘,
 64           ‘metric‘: ‘binary_logloss‘,
 65           }
 66
 67 ### 交叉验证(调参)
 68 print(‘交叉验证‘)
 69 min_merror = float(‘Inf‘)
 70 best_params = {}
 71
 72 # 准确率
 73 print("调参1:提高准确率")
 74 for num_leaves in range(20,200,5):
 75     for max_depth in range(3,8,1):
 76         params[‘num_leaves‘] = num_leaves
 77         params[‘max_depth‘] = max_depth
 78
 79         cv_results = lgb.cv(
 80                             params,
 81                             lgb_train,
 82                             seed=2018,
 83                             nfold=3,
 84                             metrics=[‘binary_error‘],
 85                             early_stopping_rounds=10,
 86                             verbose_eval=True
 87                             )
 88
 89         mean_merror = pd.Series(cv_results[‘binary_error-mean‘]).min()
 90         boost_rounds = pd.Series(cv_results[‘binary_error-mean‘]).argmin()
 91
 92         if mean_merror < min_merror:
 93             min_merror = mean_merror
 94             best_params[‘num_leaves‘] = num_leaves
 95             best_params[‘max_depth‘] = max_depth
 96
 97 params[‘num_leaves‘] = best_params[‘num_leaves‘]
 98 params[‘max_depth‘] = best_params[‘max_depth‘]
 99
100 # 过拟合
101 print("调参2:降低过拟合")
102 for max_bin in range(1,255,5):
103     for min_data_in_leaf in range(10,200,5):
104             params[‘max_bin‘] = max_bin
105             params[‘min_data_in_leaf‘] = min_data_in_leaf
106
107             cv_results = lgb.cv(
108                                 params,
109                                 lgb_train,
110                                 seed=42,
111                                 nfold=3,
112                                 metrics=[‘binary_error‘],
113                                 early_stopping_rounds=3,
114                                 verbose_eval=True
115                                 )
116
117             mean_merror = pd.Series(cv_results[‘binary_error-mean‘]).min()
118             boost_rounds = pd.Series(cv_results[‘binary_error-mean‘]).argmin()
119
120             if mean_merror < min_merror:
121                 min_merror = mean_merror
122                 best_params[‘max_bin‘]= max_bin
123                 best_params[‘min_data_in_leaf‘] = min_data_in_leaf
124
125 params[‘min_data_in_leaf‘] = best_params[‘min_data_in_leaf‘]
126 params[‘max_bin‘] = best_params[‘max_bin‘]
127
128 print("调参3:降低过拟合")
129 for feature_fraction in [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]:
130     for bagging_fraction in [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]:
131         for bagging_freq in range(0,50,5):
132             params[‘feature_fraction‘] = feature_fraction
133             params[‘bagging_fraction‘] = bagging_fraction
134             params[‘bagging_freq‘] = bagging_freq
135
136             cv_results = lgb.cv(
137                                 params,
138                                 lgb_train,
139                                 seed=42,
140                                 nfold=3,
141                                 metrics=[‘binary_error‘],
142                                 early_stopping_rounds=3,
143                                 verbose_eval=True
144                                 )
145
146             mean_merror = pd.Series(cv_results[‘binary_error-mean‘]).min()
147             boost_rounds = pd.Series(cv_results[‘binary_error-mean‘]).argmin()
148
149             if mean_merror < min_merror:
150                 min_merror = mean_merror
151                 best_params[‘feature_fraction‘] = feature_fraction
152                 best_params[‘bagging_fraction‘] = bagging_fraction
153                 best_params[‘bagging_freq‘] = bagging_freq
154
155 params[‘feature_fraction‘] = best_params[‘feature_fraction‘]
156 params[‘bagging_fraction‘] = best_params[‘bagging_fraction‘]
157 params[‘bagging_freq‘] = best_params[‘bagging_freq‘]
158
159 print("调参4:降低过拟合")
160 for lambda_l1 in [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]:
161     for lambda_l2 in [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]:
162         for min_split_gain in [0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]:
163             params[‘lambda_l1‘] = lambda_l1
164             params[‘lambda_l2‘] = lambda_l2
165             params[‘min_split_gain‘] = min_split_gain
166
167             cv_results = lgb.cv(
168                                 params,
169                                 lgb_train,
170                                 seed=42,
171                                 nfold=3,
172                                 metrics=[‘binary_error‘],
173                                 early_stopping_rounds=3,
174                                 verbose_eval=True
175                                 )
176
177             mean_merror = pd.Series(cv_results[‘binary_error-mean‘]).min()
178             boost_rounds = pd.Series(cv_results[‘binary_error-mean‘]).argmin()
179
180             if mean_merror < min_merror:
181                 min_merror = mean_merror
182                 best_params[‘lambda_l1‘] = lambda_l1
183                 best_params[‘lambda_l2‘] = lambda_l2
184                 best_params[‘min_split_gain‘] = min_split_gain
185
186 params[‘lambda_l1‘] = best_params[‘lambda_l1‘]
187 params[‘lambda_l2‘] = best_params[‘lambda_l2‘]
188 params[‘min_split_gain‘] = best_params[‘min_split_gain‘]
189
190
191 print(best_params)
192
193 ### 训练
194 params[‘learning_rate‘]=0.01
195 lgb.train(
196           params,                     # 参数字典
197           lgb_train,                  # 训练集
198           valid_sets=lgb_eval,        # 验证集
199           num_boost_round=2000,       # 迭代次数
200           early_stopping_rounds=50    # 早停次数
201           )
202
203 ### 线下预测
204 print ("线下预测")
205 preds_offline = lgb.predict(offline_test_X, num_iteration=lgb.best_iteration) # 输出概率
206 offline=offline_test[[‘instance_id‘,‘is_trade‘]]
207 offline[‘preds‘]=preds_offline
208 offline.is_trade = offline[‘is_trade‘].astype(np.float64)
209 print(‘log_loss‘, metrics.log_loss(offline.is_trade, offline.preds))
210
211 ### 线上预测
212 print("线上预测")
213 preds_online =  lgb.predict(online_test_X, num_iteration=lgb.best_iteration)  # 输出概率
214 online=online_test[[‘instance_id‘]]
215 online[‘preds‘]=preds_online
216 online.rename(columns={‘preds‘:‘predicted_score‘},inplace=True)           # 更改列名
217 online.to_csv("./data/20180405.txt",index=None,sep=‘ ‘)                   # 保存结果
218
219 ### 保存模型
220 from sklearn.externals import joblib
221 joblib.dump(lgb,‘lgb.pkl‘)
222
223 ### 特征选择
224 df = pd.DataFrame(X_train.columns.tolist(), columns=[‘feature‘])
225 df[‘importance‘]=list(lgb.feature_importance())                           # 特征分数
226 df = df.sort_values(by=‘importance‘,ascending=False)                      # 特征排序
227 df.to_csv("./data/feature_score_20180331.csv",index=None,encoding=‘gbk‘)  # 保存分数

原文地址:https://www.cnblogs.com/wanglei5205/p/8722237.html

时间: 2024-07-31 03:25:32

【集成学习】lightgbm调参的相关文章

LightGBM 调参方法(具体操作)

 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share https://www.imooc.com/article/43784?block_id=tuijian_wz 鄙人调参新手,最近用lightGBM有

深度学习网络调参技巧

转自https://zhuanlan.zhihu.com/p/24720954?utm_source=zhihu&utm_medium=social 之前曾经写过一篇文章,讲了一些深度学习训练的技巧,其中包含了部分调参心得:深度学习训练心得.不过由于一般深度学习实验,相比普通机器学习任务,时间较长,因此调参技巧就显得尤为重要.同时个人实践中,又有一些新的调参心得,因此这里单独写一篇文章,谈一下自己对深度学习调参的理解,大家如果有其他技巧,也欢迎多多交流. 好的实验环境是成功的一半 由于深度学习实

从下往上看--新皮层资料的读后感 第五部分 从perceptron 感知机学习自动调参开始

从上节已经知道perceptron 不是什么智能算法,在它的基础上我们需要去解决调参的问题.既然是调节参数,总要有个目标和手段吧,看看这些大神怎么搞的.首先建立目标,对于生活里面常常会面对分类的问题,比如:在人群中把流氓分子找出来,我们已经有3000个强奸犯和7000个普通的人的档案记录. 大家希望找到一个办法,给出新的档案,按照这个档案的情况识别第10001个人是不是是不是流氓.好吧,这很不道德,流氓好像也显得太多,但我们姑且这么干吧.首先我们先用人的模式干一次这个事情.先把应用题要求梳理一下

深度学习_调参经验

面对一个图像分类问题,可以有以下步骤: 1.建立一个简单的CNN模型,一方面能够快速地run一个模型,以了解这个任务的难度 卷积层1:卷积核大小3*3,卷积核移动步长1,卷积核个数64,池化大小2*2,池化步长2,池化类型为最大池化,激活函数ReLU. 卷积层2:卷积核大小3*3,卷积核移动步长1,卷积核个数128,池化大小2*2,池化步长2,池化类型为最大池化,激活函数ReLU. 卷积层3:卷积核大小3*3,卷积核移动步长1,卷积核个数256,池化大小2*2,池化步长2,池化类型为最大池化,激

深度学习-网络调参技巧

最近在做深度学习实验,跑一次实验轻则以小时计.重则以天计,实在没有那么多的时间可以等待,因此想想用尽可能少的实验次数,得到尽可能好的实验效果.这样的话,问题就可以归结为如何设计合适的网络结构.如何设计合适的训练策略,主要就是: 层数.每一层卷积核个数.卷积权重初始化方式.dropout ratio.BN.全连接层神经元个数.Relu等网络结构参数应该如何选? 学习率.decay等solver参数又该如何设置? 在参考炼丹实验室的基础上,并结合自己的体会,谈谈对调参的理解,大家如果有其他技巧,也欢

深度学习调参经验汇总

此篇文章是在原创教程这个栏目下,但实际上是一篇汇总整理文章.相信大家在做深度学习时对调参尤为无奈,经验不足乱调一通,或者参数太多无从下手,我也如此.希望通过此文汇总网上一些调参的经验方法,供大家参考.此文会对网上每一篇调参文章做简练的总结与提炼,以此为此文的组成单元,并附上原文的链接.如果遇到不对的地方,欢迎指正~本文也将不定期更新,最后祝大家调参(炼金)顺利! 有多少人工,就有多少智能!(笑哭脸) 人工智障 炼金大法 你已经是成熟的算法了,要学会自己调参 正文开始 UNIT 1 case1:网

Deep Learning 调参

整理一下如何调参,开始是准备翻译,后来加入了一些自己的理解,有少部分不是很确定的没有写出来,如果有问题可以看原文,在末尾有写出.水平有限,如果有错误请指出. 获取数据:确保有足够多的高质量输入-输出的数据集,而且要有代表性. 有时并没有这么大的数据集,比如字符识别中对mnist数据库的训练,很容易就可以达到98%的识别率,但是真正用在实际中会发现效果并没有那么好,把数据库的图片存到硬盘看一下,会发现几乎所有字体都在图片正中,大小几乎一样,而且没有大幅度的旋转,所以这里图片的代表性就不够强,有必要

[转]使用sklearn进行集成学习——理论

转:http://www.cnblogs.com/jasonfreak/p/5657196.html 目录 1 前言2 集成学习是什么?3 偏差和方差 3.1 模型的偏差和方差是什么? 3.2 bagging的偏差和方差 3.3 boosting的偏差和方差 3.4 模型的独立性 3.5 小结4 Gradient Boosting 4.1 拟合残差 4.2 拟合反向梯度 4.2.1 契机:引入损失函数 4.2.2 难题一:任意损失函数的最优化 4.2.3 难题二:无法对测试样本计算反向梯度 4.

[转]使用sklearn进行集成学习——实践

转:http://www.cnblogs.com/jasonfreak/p/5720137.html 目录 1 Random Forest和Gradient Tree Boosting参数详解2 如何调参? 2.1 调参的目标:偏差和方差的协调 2.2 参数对整体模型性能的影响 2.3 一个朴实的方案:贪心的坐标下降法 2.3.1 Random Forest调参案例:Digit Recognizer 2.3.1.1 调整过程影响类参数 2.3.1.2 调整子模型影响类参数 2.3.2 Gradi