├── README.md
├── data_input.ipynb
├── model_bagging_lightgbm.ipynb
├── feature_select.ipynb
└── single_lightgbm_model.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | # 拍拍贷"魔镜杯"风控算法比赛实战
2 |
3 | * 比赛项目链接
4 | [“魔镜杯”风控算法大赛](https://www.kesci.com/home/competition/56cd5f02b89b5bd026cb39c9/content/0)
5 |
6 | * 知乎文章链接地址
7 | [风控模型实战--"魔镜杯"风控算法大赛](https://zhuanlan.zhihu.com/p/56864235)
8 |
9 | * 代码目录说明
10 |
11 | 1. data_input: 数据导入及合并
12 | 2. data_EDA_clean: 数据清洗
13 | 3. feature_processing: 特征工程
14 | 4. feature_select: 特征筛选
15 | 5. single_lightgbm_model:单模型--lightgbm
16 | 6. model_bagging_lightgbm:lightgbm的bagging模型
17 |
18 |
--------------------------------------------------------------------------------
/data_input.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 2,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "import numpy as np \n",
10 | "import pandas as pd \n",
11 | "import warnings\n",
12 | "warnings.filterwarnings('ignore')\n",
13 | "import os \n",
14 | "os.chdir('C:/Users/Administrator/Desktop/魔镜杯数据')"
15 | ]
16 | },
17 | {
18 | "cell_type": "code",
19 | "execution_count": 3,
20 | "metadata": {},
21 | "outputs": [],
22 | "source": [
23 | "f_train1 = pd.read_csv('first_train1.csv',encoding='gbk')\n",
24 | "f_train2 = pd.read_csv('first_train2.csv',encoding='gbk')\n",
25 | "f_train3 = pd.read_csv('first_train3.csv',encoding='gbk')\n",
26 | "f_test1 = pd.read_csv('first_test1.csv',encoding='gb18030')\n",
27 | "f_test2 = pd.read_csv('first_test2.csv',encoding='gbk')\n",
28 | "f_test3 = pd.read_csv('first_test3.csv',encoding='gbk')"
29 | ]
30 | },
31 | {
32 | "cell_type": "code",
33 | "execution_count": 4,
34 | "metadata": {},
35 | "outputs": [],
36 | "source": [
37 | "# 训练集和测试集合并\n",
38 | "f_train1['sample_status'] = 'train'\n",
39 | "f_test1['sample_status'] = 'test'\n",
40 | "df1 = pd.concat([f_train1,f_test1],axis=0).reset_index(drop=True)\n",
41 | "df2 = pd.concat([f_train2,f_test2],axis=0).reset_index(drop=True)\n",
42 | "df3 = pd.concat([f_train3,f_test3],axis=0).reset_index(drop=True)"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 6,
48 | "metadata": {
49 | "scrolled": true
50 | },
51 | "outputs": [
52 | {
53 | "data": {
54 | "text/html": [
55 | "
\n",
56 | "\n",
69 | "
\n",
70 | " \n",
71 | " \n",
72 | " | \n",
73 | " Idx | \n",
74 | " UserInfo_1 | \n",
75 | " UserInfo_2 | \n",
76 | " UserInfo_3 | \n",
77 | " UserInfo_4 | \n",
78 | " WeblogInfo_1 | \n",
79 | " WeblogInfo_2 | \n",
80 | " WeblogInfo_3 | \n",
81 | " WeblogInfo_4 | \n",
82 | " WeblogInfo_5 | \n",
83 | " ... | \n",
84 | " SocialNetwork_11 | \n",
85 | " SocialNetwork_12 | \n",
86 | " SocialNetwork_13 | \n",
87 | " SocialNetwork_14 | \n",
88 | " SocialNetwork_15 | \n",
89 | " SocialNetwork_16 | \n",
90 | " SocialNetwork_17 | \n",
91 | " target | \n",
92 | " ListingInfo | \n",
93 | " sample_status | \n",
94 | "
\n",
95 | " \n",
96 | " \n",
97 | " \n",
98 | " | 0 | \n",
99 | " 10001 | \n",
100 | " 1.000 | \n",
101 | " 深圳 | \n",
102 | " 4.000 | \n",
103 | " 深圳 | \n",
104 | " nan | \n",
105 | " 1.000 | \n",
106 | " nan | \n",
107 | " 1.000 | \n",
108 | " 1.000 | \n",
109 | " ... | \n",
110 | " -1 | \n",
111 | " 0 | \n",
112 | " 0 | \n",
113 | " 0 | \n",
114 | " 0 | \n",
115 | " 0 | \n",
116 | " 1 | \n",
117 | " 0 | \n",
118 | " 2014-3-5 | \n",
119 | " train | \n",
120 | "
\n",
121 | " \n",
122 | " | 1 | \n",
123 | " 10002 | \n",
124 | " 1.000 | \n",
125 | " 温州 | \n",
126 | " 4.000 | \n",
127 | " 温州 | \n",
128 | " nan | \n",
129 | " 0.000 | \n",
130 | " nan | \n",
131 | " 1.000 | \n",
132 | " 1.000 | \n",
133 | " ... | \n",
134 | " -1 | \n",
135 | " 0 | \n",
136 | " 0 | \n",
137 | " 0 | \n",
138 | " 0 | \n",
139 | " 0 | \n",
140 | " 2 | \n",
141 | " 0 | \n",
142 | " 2014-2-26 | \n",
143 | " train | \n",
144 | "
\n",
145 | " \n",
146 | " | 2 | \n",
147 | " 10003 | \n",
148 | " 1.000 | \n",
149 | " 宜昌 | \n",
150 | " 3.000 | \n",
151 | " 宜昌 | \n",
152 | " nan | \n",
153 | " 0.000 | \n",
154 | " nan | \n",
155 | " 2.000 | \n",
156 | " 2.000 | \n",
157 | " ... | \n",
158 | " -1 | \n",
159 | " -1 | \n",
160 | " 1 | \n",
161 | " 0 | \n",
162 | " 0 | \n",
163 | " 0 | \n",
164 | " 0 | \n",
165 | " 0 | \n",
166 | " 2014-2-28 | \n",
167 | " train | \n",
168 | "
\n",
169 | " \n",
170 | " | 3 | \n",
171 | " 10006 | \n",
172 | " 4.000 | \n",
173 | " 南平 | \n",
174 | " 1.000 | \n",
175 | " 南平 | \n",
176 | " nan | \n",
177 | " nan | \n",
178 | " nan | \n",
179 | " nan | \n",
180 | " nan | \n",
181 | " ... | \n",
182 | " -1 | \n",
183 | " -1 | \n",
184 | " 0 | \n",
185 | " 0 | \n",
186 | " 0 | \n",
187 | " 0 | \n",
188 | " 0 | \n",
189 | " 0 | \n",
190 | " 2014-2-25 | \n",
191 | " train | \n",
192 | "
\n",
193 | " \n",
194 | " | 4 | \n",
195 | " 10007 | \n",
196 | " 5.000 | \n",
197 | " 辽阳 | \n",
198 | " 1.000 | \n",
199 | " 辽阳 | \n",
200 | " nan | \n",
201 | " 0.000 | \n",
202 | " nan | \n",
203 | " 1.000 | \n",
204 | " 1.000 | \n",
205 | " ... | \n",
206 | " -1 | \n",
207 | " -1 | \n",
208 | " 0 | \n",
209 | " 0 | \n",
210 | " 0 | \n",
211 | " 0 | \n",
212 | " 0 | \n",
213 | " 0 | \n",
214 | " 2014-2-27 | \n",
215 | " train | \n",
216 | "
\n",
217 | " \n",
218 | "
\n",
219 | "
5 rows × 229 columns
\n",
220 | "
"
221 | ],
222 | "text/plain": [
223 | " Idx UserInfo_1 UserInfo_2 UserInfo_3 UserInfo_4 WeblogInfo_1 \\\n",
224 | "0 10001 1.000 深圳 4.000 深圳 nan \n",
225 | "1 10002 1.000 温州 4.000 温州 nan \n",
226 | "2 10003 1.000 宜昌 3.000 宜昌 nan \n",
227 | "3 10006 4.000 南平 1.000 南平 nan \n",
228 | "4 10007 5.000 辽阳 1.000 辽阳 nan \n",
229 | "\n",
230 | " WeblogInfo_2 WeblogInfo_3 WeblogInfo_4 WeblogInfo_5 ... \\\n",
231 | "0 1.000 nan 1.000 1.000 ... \n",
232 | "1 0.000 nan 1.000 1.000 ... \n",
233 | "2 0.000 nan 2.000 2.000 ... \n",
234 | "3 nan nan nan nan ... \n",
235 | "4 0.000 nan 1.000 1.000 ... \n",
236 | "\n",
237 | " SocialNetwork_11 SocialNetwork_12 SocialNetwork_13 SocialNetwork_14 \\\n",
238 | "0 -1 0 0 0 \n",
239 | "1 -1 0 0 0 \n",
240 | "2 -1 -1 1 0 \n",
241 | "3 -1 -1 0 0 \n",
242 | "4 -1 -1 0 0 \n",
243 | "\n",
244 | " SocialNetwork_15 SocialNetwork_16 SocialNetwork_17 target ListingInfo \\\n",
245 | "0 0 0 1 0 2014-3-5 \n",
246 | "1 0 0 2 0 2014-2-26 \n",
247 | "2 0 0 0 0 2014-2-28 \n",
248 | "3 0 0 0 0 2014-2-25 \n",
249 | "4 0 0 0 0 2014-2-27 \n",
250 | "\n",
251 | " sample_status \n",
252 | "0 train \n",
253 | "1 train \n",
254 | "2 train \n",
255 | "3 train \n",
256 | "4 train \n",
257 | "\n",
258 | "[5 rows x 229 columns]"
259 | ]
260 | },
261 | "execution_count": 6,
262 | "metadata": {},
263 | "output_type": "execute_result"
264 | }
265 | ],
266 | "source": [
267 | "df1.head()"
268 | ]
269 | },
270 | {
271 | "cell_type": "code",
272 | "execution_count": 7,
273 | "metadata": {},
274 | "outputs": [],
275 | "source": [
276 | "# 保存数据至本地\n",
277 | "df1.to_csv('C:/Users/Administrator/Desktop/魔镜杯数据/data_input1.csv',encoding='gb18030',index=False)\n",
278 | "df2.to_csv('C:/Users/Administrator/Desktop/魔镜杯数据/data_input2.csv',encoding='gb18030',index=False)\n",
279 | "df3.to_csv('C:/Users/Administrator/Desktop/魔镜杯数据/data_input3.csv',encoding='gb18030',index=False)"
280 | ]
281 | }
282 | ],
283 | "metadata": {
284 | "kernelspec": {
285 | "display_name": "Python 3",
286 | "language": "python",
287 | "name": "python3"
288 | },
289 | "language_info": {
290 | "codemirror_mode": {
291 | "name": "ipython",
292 | "version": 3
293 | },
294 | "file_extension": ".py",
295 | "mimetype": "text/x-python",
296 | "name": "python",
297 | "nbconvert_exporter": "python",
298 | "pygments_lexer": "ipython3",
299 | "version": "3.7.0"
300 | },
301 | "toc": {
302 | "base_numbering": 1,
303 | "nav_menu": {},
304 | "number_sections": true,
305 | "sideBar": true,
306 | "skip_h1_title": false,
307 | "title_cell": "Table of Contents",
308 | "title_sidebar": "Contents",
309 | "toc_cell": false,
310 | "toc_position": {},
311 | "toc_section_display": true,
312 | "toc_window_display": false
313 | }
314 | },
315 | "nbformat": 4,
316 | "nbformat_minor": 2
317 | }
318 |
--------------------------------------------------------------------------------
/model_bagging_lightgbm.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {
7 | "ExecuteTime": {
8 | "end_time": "2019-02-17T03:18:36.904108Z",
9 | "start_time": "2019-02-17T03:18:33.466960Z"
10 | },
11 | "scrolled": true
12 | },
13 | "outputs": [
14 | {
15 | "name": "stderr",
16 | "output_type": "stream",
17 | "text": [
18 | "C:\\Users\\Administrator\\Anaconda3\\envs\\py3\\lib\\site-packages\\sklearn\\utils\\__init__.py:4: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working\n",
19 | " from collections import Sequence\n"
20 | ]
21 | }
22 | ],
23 | "source": [
24 | "import numpy as np \n",
25 | "import pandas as pd\n",
26 | "import lightgbm as lgb\n",
27 | "import random\n",
28 | "from sklearn import metrics\n",
29 | "import warnings\n",
30 | "warnings.filterwarnings('ignore')\n",
31 | "import os \n",
32 | "os.chdir('C:/Users/Administrator/Desktop/魔镜杯数据')\n",
33 | "import score_card as sc"
34 | ]
35 | },
36 | {
37 | "cell_type": "code",
38 | "execution_count": 2,
39 | "metadata": {
40 | "ExecuteTime": {
41 | "end_time": "2019-02-17T03:18:42.561213Z",
42 | "start_time": "2019-02-17T03:18:36.904108Z"
43 | },
44 | "scrolled": true
45 | },
46 | "outputs": [
47 | {
48 | "data": {
49 | "text/plain": [
50 | "(49701, 161)"
51 | ]
52 | },
53 | "execution_count": 2,
54 | "metadata": {},
55 | "output_type": "execute_result"
56 | }
57 | ],
58 | "source": [
59 | "# Master数据\n",
60 | "df1 = pd.read_csv('feature_select_data1.csv',encoding='gb18030')\n",
61 | "df1.shape"
62 | ]
63 | },
64 | {
65 | "cell_type": "code",
66 | "execution_count": 3,
67 | "metadata": {
68 | "ExecuteTime": {
69 | "end_time": "2019-02-17T03:18:54.458570Z",
70 | "start_time": "2019-02-17T03:18:42.566214Z"
71 | }
72 | },
73 | "outputs": [
74 | {
75 | "data": {
76 | "text/plain": [
77 | "(49701, 124)"
78 | ]
79 | },
80 | "execution_count": 3,
81 | "metadata": {},
82 | "output_type": "execute_result"
83 | }
84 | ],
85 | "source": [
86 | "# 排序特征数据\n",
87 | "rank_df = pd.read_csv('rank_feature.csv',encoding='gbk')\n",
88 | "rank_df.shape"
89 | ]
90 | },
91 | {
92 | "cell_type": "code",
93 | "execution_count": 4,
94 | "metadata": {
95 | "ExecuteTime": {
96 | "end_time": "2019-02-17T03:18:57.831734Z",
97 | "start_time": "2019-02-17T03:18:54.461570Z"
98 | }
99 | },
100 | "outputs": [
101 | {
102 | "data": {
103 | "text/plain": [
104 | "(49701, 51)"
105 | ]
106 | },
107 | "execution_count": 4,
108 | "metadata": {},
109 | "output_type": "execute_result"
110 | }
111 | ],
112 | "source": [
113 | "# periods衍生特征数据\n",
114 | "periods_df = pd.read_csv('periods_feature.csv',encoding='gbk')\n",
115 | "periods_df.shape"
116 | ]
117 | },
118 | {
119 | "cell_type": "code",
120 | "execution_count": 5,
121 | "metadata": {
122 | "ExecuteTime": {
123 | "end_time": "2019-02-17T03:18:57.837734Z",
124 | "start_time": "2019-02-17T03:18:57.833734Z"
125 | }
126 | },
127 | "outputs": [],
128 | "source": [
129 | "# 原生特征(不含排序特征和periods衍生特征)\n",
130 | "feature1 = list(df1.columns)\n",
131 | "# 排序特征和periods衍生特征\n",
132 | "feature2 = list(rank_df.columns)+list(periods_df.columns)"
133 | ]
134 | },
135 | {
136 | "cell_type": "code",
137 | "execution_count": 6,
138 | "metadata": {
139 | "ExecuteTime": {
140 | "end_time": "2019-02-17T03:18:57.963735Z",
141 | "start_time": "2019-02-17T03:18:57.841734Z"
142 | }
143 | },
144 | "outputs": [],
145 | "source": [
146 | "# 对feature2进行随机打乱顺序\n",
147 | "random.shuffle(feature2)"
148 | ]
149 | },
150 | {
151 | "cell_type": "code",
152 | "execution_count": 7,
153 | "metadata": {
154 | "ExecuteTime": {
155 | "end_time": "2019-02-17T03:18:58.129739Z",
156 | "start_time": "2019-02-17T03:18:57.964736Z"
157 | }
158 | },
159 | "outputs": [
160 | {
161 | "data": {
162 | "text/plain": [
163 | "(49701, 336)"
164 | ]
165 | },
166 | "execution_count": 7,
167 | "metadata": {},
168 | "output_type": "execute_result"
169 | }
170 | ],
171 | "source": [
172 | "# 合并数据集\n",
173 | "df = pd.concat([df1,rank_df,periods_df],axis=1)\n",
174 | "df.shape"
175 | ]
176 | },
177 | {
178 | "cell_type": "code",
179 | "execution_count": 8,
180 | "metadata": {
181 | "ExecuteTime": {
182 | "end_time": "2019-02-17T03:18:58.272747Z",
183 | "start_time": "2019-02-17T03:18:58.133739Z"
184 | }
185 | },
186 | "outputs": [],
187 | "source": [
188 | "# 保存用户id\n",
189 | "data_idx = df.Idx"
190 | ]
191 | },
192 | {
193 | "cell_type": "code",
194 | "execution_count": 9,
195 | "metadata": {
196 | "ExecuteTime": {
197 | "end_time": "2019-02-17T03:18:58.440757Z",
198 | "start_time": "2019-02-17T03:18:58.274747Z"
199 | }
200 | },
201 | "outputs": [],
202 | "source": [
203 | "# 定义lightgbm的bagging函数\n",
204 | "def bagging_lightgbm(feature_fraction,bagging_fraction,ramdom_seed,n_feature):\n",
205 | " \n",
206 | " select_fea = feature1+feature2[:n_feature]\n",
207 | " \n",
208 | " data = df.loc[:,select_fea]\n",
209 | " train_x = data[data.sample_status=='train'].drop(['sample_status','target','Idx'],axis=1)\n",
210 | " train_y = data[data.sample_status=='train']['target']\n",
211 | " test_x = data[data.sample_status=='test'].drop(['sample_status','target','Idx'],axis=1)\n",
212 | " test_y = data[data.sample_status=='test']['target']\n",
213 | " \n",
214 | " test_user_id = list(data[data.sample_status=='test']['Idx'])\n",
215 | " \n",
216 | " \n",
217 | " dtrain = lgb.Dataset(train_x,train_y)\n",
218 | " dtest = lgb.Dataset(test_x,test_y)\n",
219 | " \n",
220 | " params={\n",
221 | " 'boosting_type':'gbdt',\n",
222 | " 'metric':'auc',\n",
223 | " 'num_leaves':30,\n",
224 | " 'min_data_in_leaf':20,\n",
225 | " 'min_sum_hessian_in_leaf':0.001,\n",
226 | " 'bagging_fraction':bagging_fraction,\n",
227 | " 'feature_fraction':feature_fraction,\n",
228 | " 'learning_rate':0.005,\n",
229 | " }\n",
230 | " \n",
231 | " # 寻找最佳的迭代次数\n",
232 | " cv_result = lgb.cv(train_set=dtrain,\n",
233 | " early_stopping_rounds=10,\n",
234 | " num_boost_round=1000,\n",
235 | " nfold=5,\n",
236 | " metrics='auc',\n",
237 | " seed=0,\n",
238 | " params=params,\n",
239 | " stratified=True,\n",
240 | " shuffle=True)\n",
241 | " max_auc = max(cv_result['auc-mean'])\n",
242 | " num_round = len(cv_result['auc-mean'])\n",
243 | " \n",
244 | " model = lgb.train(train_set=dtrain,early_stopping_rounds=10,num_boost_round=num_round,valid_sets=dtest,params=params)\n",
245 | " \n",
246 | " model_pre = list(model.predict(test_x))\n",
247 | " result_df = pd.DataFrame({'Idx':test_user_id,\n",
248 | " 'score':model_pre})\n",
249 | " return result_df\n",
250 | "\n",
251 | "# 对随机种子,bagging_fraction,feature_fraction及特征数量进行随机扰动\n",
252 | "random_seed = list(range(2018))\n",
253 | "bagging_fraction = [i/1000.0 for i in range(500,1000)]\n",
254 | "feature_fraction = [i/1000.0 for i in range(500,1000)]\n",
255 | "n_feature = list(range(50,174,2))\n",
256 | "\n",
257 | "random.shuffle(random_seed)\n",
258 | "random.shuffle(bagging_fraction)\n",
259 | "random.shuffle(feature_fraction)\n",
260 | "random.shuffle(n_feature)"
261 | ]
262 | },
263 | {
264 | "cell_type": "code",
265 | "execution_count": null,
266 | "metadata": {
267 | "ExecuteTime": {
268 | "end_time": "2019-02-17T03:18:59.134796Z",
269 | "start_time": "2019-02-17T03:18:33.508Z"
270 | }
271 | },
272 | "outputs": [],
273 | "source": [
274 | "import time \n",
275 | "a= time.time()\n",
276 | "result_df_list=[]\n",
277 | "# 建立30个子模型,保存各个子模型输出的结果\n",
278 | "for i in range(30):\n",
279 | " result_df = bagging_lightgbm(feature_fraction=feature_fraction[i],\n",
280 | " n_feature=n_feature[i],\n",
281 | " ramdom_seed=random_seed[i],\n",
282 | " bagging_fraction=bagging_fraction[i])\n",
283 | " result_df_list.append(result_df)\n",
284 | "# 对30个子模型的结果average,得到bagging模型的最终结果\n",
285 | "prep_list = [list(x['prep']) for x in result_df_list]\n",
286 | "bagging_prep= list(np.sum(score_list,axis=0)/30)\n",
287 | "b = time.time()\n",
288 | "print('运行时间:{}'.format(round(b-a,0)))"
289 | ]
290 | },
291 | {
292 | "cell_type": "code",
293 | "execution_count": 103,
294 | "metadata": {
295 | "ExecuteTime": {
296 | "end_time": "2019-02-16T14:41:12.488155Z",
297 | "start_time": "2019-02-16T14:41:12.313145Z"
298 | }
299 | },
300 | "outputs": [
301 | {
302 | "data": {
303 | "image/png": "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\n",
304 | "text/plain": [
305 | ""
306 | ]
307 | },
308 | "metadata": {
309 | "needs_background": "light"
310 | },
311 | "output_type": "display_data"
312 | }
313 | ],
314 | "source": [
315 | "# bagging模型的AUC\n",
316 | "test_y = list(df[df.sample_status=='test']['target'])\n",
317 | "sc.plot_roc(y_label=test_y,y_pred=ss)"
318 | ]
319 | }
320 | ],
321 | "metadata": {
322 | "kernelspec": {
323 | "display_name": "Python 3",
324 | "language": "python",
325 | "name": "python3"
326 | },
327 | "language_info": {
328 | "codemirror_mode": {
329 | "name": "ipython",
330 | "version": 3
331 | },
332 | "file_extension": ".py",
333 | "mimetype": "text/x-python",
334 | "name": "python",
335 | "nbconvert_exporter": "python",
336 | "pygments_lexer": "ipython3",
337 | "version": "3.7.0"
338 | },
339 | "toc": {
340 | "base_numbering": 1,
341 | "nav_menu": {},
342 | "number_sections": true,
343 | "sideBar": true,
344 | "skip_h1_title": false,
345 | "title_cell": "Table of Contents",
346 | "title_sidebar": "Contents",
347 | "toc_cell": false,
348 | "toc_position": {},
349 | "toc_section_display": true,
350 | "toc_window_display": false
351 | }
352 | },
353 | "nbformat": 4,
354 | "nbformat_minor": 2
355 | }
356 |
--------------------------------------------------------------------------------
/feature_select.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stderr",
10 | "output_type": "stream",
11 | "text": [
12 | "C:\\Users\\Administrator\\Anaconda3\\envs\\py3\\lib\\site-packages\\sklearn\\utils\\__init__.py:4: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working\n",
13 | " from collections import Sequence\n"
14 | ]
15 | }
16 | ],
17 | "source": [
18 | "import numpy as np \n",
19 | "import math \n",
20 | "import pandas as pd \n",
21 | "pd.set_option('display.float_format',lambda x:'%.3f' % x)\n",
22 | "import matplotlib.pyplot as plt \n",
23 | "plt.style.use('ggplot')\n",
24 | "%matplotlib inline\n",
25 | "import seaborn as sns \n",
26 | "sns.set_palette('muted')\n",
27 | "sns.set_style('darkgrid')\n",
28 | "import warnings\n",
29 | "warnings.filterwarnings('ignore')\n",
30 | "import os \n",
31 | "os.chdir('C:/Users/Administrator/Desktop/魔镜杯数据')\n",
32 | "import lightgbm as lgb \n",
33 | "from lightgbm import plot_importance"
34 | ]
35 | },
36 | {
37 | "cell_type": "code",
38 | "execution_count": 2,
39 | "metadata": {},
40 | "outputs": [],
41 | "source": [
42 | "# 导入feature_processing处理过后的数据\n",
43 | "data = pd.read_csv('data1_process.csv',encoding='gb18030')\n",
44 | "periods_df = pd.read_csv('periods_feature.csv',encoding='gbk')\n",
45 | "rank_df = pd.read_csv('rank_feature.csv',encoding='gbk')\n",
46 | "update_info = pd.read_csv('update_feature.csv',encoding='gbk')\n",
47 | "log_df = pd.read_csv('log_info_feature.csv',encoding='gbk')"
48 | ]
49 | },
50 | {
51 | "cell_type": "code",
52 | "execution_count": 3,
53 | "metadata": {},
54 | "outputs": [
55 | {
56 | "data": {
57 | "text/plain": [
58 | "(49701, 237)"
59 | ]
60 | },
61 | "execution_count": 3,
62 | "metadata": {},
63 | "output_type": "execute_result"
64 | }
65 | ],
66 | "source": [
67 | "# 合并衍生后的变量,data1不包含排序特征和periods衍生特征\n",
68 | "data1 = pd.merge(data,update_info,on='Idx',how='left')\n",
69 | "data1 = pd.merge(data1,log_df,on='Idx',how='left')\n",
70 | "data1.shape"
71 | ]
72 | },
73 | {
74 | "cell_type": "code",
75 | "execution_count": 4,
76 | "metadata": {
77 | "scrolled": true
78 | },
79 | "outputs": [
80 | {
81 | "data": {
82 | "text/plain": [
83 | "(49701, 412)"
84 | ]
85 | },
86 | "execution_count": 4,
87 | "metadata": {},
88 | "output_type": "execute_result"
89 | }
90 | ],
91 | "source": [
92 | "# data2包含排序特征和periods衍生特征\n",
93 | "data2 = pd.concat([data1,rank_df,periods_df],axis=1)\n",
94 | "data2.shape"
95 | ]
96 | },
97 | {
98 | "cell_type": "code",
99 | "execution_count": null,
100 | "metadata": {},
101 | "outputs": [],
102 | "source": [
103 | "data_idx = data.Idx\n",
104 | "df1 =data1.drop(['Idx'],axis=1)# 删除Idx\n",
105 | "# 测试集训练集的划分\n",
106 | "train_fea = np.array(df1[df1.sample_status=='train'].drop(['sample_status','target'],axis=1))\n",
107 | "test_fea = np.array(df1[df1.sample_status=='test'].drop(['sample_status','target'],axis=1))\n",
108 | "train_label = np.array(df1[df1.sample_status=='train']['target']).reshape(-1,1)\n",
109 | "test_label = np.array(df1[df1.sample_status=='test']['target']).reshape(-1,1)\n",
110 | "\n",
111 | "\n",
112 | "fea_names = list(df1.drop(['sample_status','target'],axis=1).columns)# 特征名字存成列表\n",
113 | "feature_importance_values = np.zeros(len(fea_names)) # \n",
114 | "\n",
115 | "# 训练10个lightgbm,并对10个模型输出的feature_importances_取平均\n",
116 | "for _ in range(10):\n",
117 | " model = lgb.LGBMClassifier(n_estimators=1000,learning_rate=0.05,n_jobs=-1,verbose = -1)\n",
118 | " model.fit(train_fea,train_label,eval_metric='auc',\n",
119 | " eval_set = [(test_fea, test_label)],\n",
120 | " early_stopping_rounds=100,verbose = -1)\n",
121 | " feature_importance_values += model.feature_importances_/10\n",
122 | "\n",
123 | "# 将feature_importance_values存成临时表\n",
124 | "fea_imp_df1 = pd.DataFrame({'feature':fea_names,\n",
125 | " 'fea_importance':feature_importance_values})\n",
126 | "fea_imp_df1 = fea_imp_df1.sort_values('fea_importance',ascending=False).reset_index(drop=True)\n",
127 | "fea_imp_df1['norm_importance'] = fea_imp_df1['fea_importance']/fea_imp_df1['fea_importance'].sum() # 特征重要性value的归一化\n",
128 | "fea_imp_df1['cum_importance'] = np.cumsum(fea_imp_df1['norm_importance'])# 特征重要性value的累加值\n",
129 | "fea_imp_df1.head()"
130 | ]
131 | },
132 | {
133 | "cell_type": "code",
134 | "execution_count": 6,
135 | "metadata": {},
136 | "outputs": [
137 | {
138 | "data": {
139 | "image/png": "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RDqrGwnzFqxrZr2B04HvgWeTDSurCsKvK73NbAvC+Nab4r58y1JLmEBy/TgbeAXhF5sBZjYQOCKXgGKX10nAdWa2vJktYWZbuHsdobvqRWa2bIx51/iLk4iISJtz9/Hu3niowxTg4bR5jhrSntzGy1kfSnhfHh4nzLyVMKQTd3+d8D48WY330pmoIUJEOqsLgTuBBwk9B9YHtk8balFsviN8iJkG3AAc6+5Px315lSV2GT2bMM/FtcDjwBOEsakPAnfnEdcehIm6JhMm4doobj8CmBvz/JSwMsjcPPIVEREpKHd/DDgMmB2HX/Ql9OBr6/MujOc93sweI7wnngNgZrsTekP8n5lt0NaxiBSLslSqcQ9dEREpJg1LaLp736RjERER6UjM7Gbg5obG+7jkZsMQwleAbdy9Pu6bRxgeMY7QOPAl4YfbfoThiADPu/veGc5zKWFOpVEZ9vUmrF51JPAOYRWuFwg9NE4mDI9cHRgLHO3ut7a23CLFTnNEiIgUUBzakKlr5RZpPRhEREQkAe4+B+jexP6XCRNcFtIlhF6NB7r7+wBmtgZwMfDLOGfFO2b2NT/2LBQpaeoRISJS5NQjQkRERERKiRoiRERERERERKTdaLJKEREREREREWk3aogQERERERERkXajhggRERERERERaTdqiBARERERERGRdqOGCBERERERERFpN2qIEBEREREREZF28//M+VHiEAbpZAAAAABJRU5ErkJggg==\n",
140 | "text/plain": [
141 | ""
142 | ]
143 | },
144 | "metadata": {
145 | "needs_background": "light"
146 | },
147 | "output_type": "display_data"
148 | }
149 | ],
150 | "source": [
151 | "# 特征重要性可视化\n",
152 | "plt.figure(figsize=(16,5))\n",
153 | "plt.rcParams['font.sans-serif']=['Microsoft YaHei']\n",
154 | "plt.subplot(1,2,1)\n",
155 | "plt.title('特征重要性')\n",
156 | "sns.barplot(data=fea_imp_df1.iloc[:10,:],x='norm_importance',y='feature')\n",
157 | "plt.subplot(1,2,2)\n",
158 | "plt.title('特征重要性累加图')\n",
159 | "plt.xlabel('特征个数')\n",
160 | "plt.ylabel('cum_importance')\n",
161 | "plt.plot(list(range(1, len(fea_names)+1)),fea_imp_df1['cum_importance'], 'r-')\n",
162 | "plt.show()"
163 | ]
164 | },
165 | {
166 | "cell_type": "code",
167 | "execution_count": 7,
168 | "metadata": {},
169 | "outputs": [
170 | {
171 | "name": "stdout",
172 | "output_type": "stream",
173 | "text": [
174 | "特征重要性为0的变量个数为 :50\n",
175 | "['_userid', '_provinceid', 'SocialNetwork_17', '_nickname', '_orderid', '_otherwebshoptype', '_phonetype', 'is_sichuan_userinfo19', '_ppdaiaccount', 'china_telecom', 'is_jilin_userinfo7', '_relationshipid', '_workyears', '_webshopurl', '_residencetypeid', '_webshoptypeid', '_schoolname', '_secondemail', '_secondmobile', '_residenceyears', 'WeblogInfo_19_H', 'WeblogInfo_19_J', '_department', 'WeblogInfo_21_B', 'WeblogInfo_19_G', 'WeblogInfo_19_F', '_age', '_bussinessaddress', '_byuserid', 'WeblogInfo_19_E', 'is_weifang_UserInfo20', '_companysizeid', '_companytypeid', '_contactid', '_creationdate', 'WeblogInfo_27', '_idnumber', '_dormitoryphone', 'is_zibo_UserInfo8', '_flag_uctobcp', '_flag_uctopvr', '_gender', '_graduatedate', '_graduateschool', '_hasbusinesslicense', '_hasbuycar', '_hasppdaiaccount', '_hassborgjj', '_idaddress', 'is_weifang_UserInfo4']\n"
176 | ]
177 | }
178 | ],
179 | "source": [
180 | "# 剔除特征重要性为0的变量\n",
181 | "zero_imp_col = list(fea_imp_df1[fea_imp_df1.fea_importance==0].feature)\n",
182 | "fea_imp_df11 = fea_imp_df1[~(fea_imp_df1.feature.isin(zero_imp_col))]\n",
183 | "print('特征重要性为0的变量个数为 :{}'.format(len(zero_imp_col)))\n",
184 | "print(zero_imp_col)"
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": 8,
190 | "metadata": {},
191 | "outputs": [
192 | {
193 | "name": "stdout",
194 | "output_type": "stream",
195 | "text": [
196 | "特征重要性比较弱的变量个数为:26\n",
197 | "['UserInfo_10', 'UserInfo_13', 'WeblogInfo_33', 'is_chengdu_UserInfo2', '_educationid', '_lastupdatedate', '_companyname', '_cityid', 'WeblogInfo_36', 'is_chengdu_UserInfo20', 'is_yantai_UserInfo2', 'is_tianjin_userinfo7', 'china_unicom', 'WeblogInfo_21_D', 'is_chengdu_UserInfo4', '_phone', '_position', '_regstepid', '_residenceaddress', '_residencephone', 'is_hunan_userinfo7', 'operator_unknown', 'WeblogInfo_21_A', 'WeblogInfo_21_C', 'is_sichuan_userinfo7', '_companyaddress']\n"
198 | ]
199 | }
200 | ],
201 | "source": [
202 | "# 剔除特征重要性比较弱的变量\n",
203 | "low_imp_col = list(fea_imp_df11[fea_imp_df11.cum_importance>=0.99].feature)\n",
204 | "print('特征重要性比较弱的变量个数为:{}'.format(len(low_imp_col)))\n",
205 | "print(low_imp_col)"
206 | ]
207 | },
208 | {
209 | "cell_type": "code",
210 | "execution_count": 9,
211 | "metadata": {},
212 | "outputs": [
213 | {
214 | "data": {
215 | "text/plain": [
216 | "(49701, 160)"
217 | ]
218 | },
219 | "execution_count": 9,
220 | "metadata": {},
221 | "output_type": "execute_result"
222 | }
223 | ],
224 | "source": [
225 | "# 删除特征重要性为0和比较弱的特征\n",
226 | "drop_imp_col = zero_imp_col+low_imp_col\n",
227 | "mydf1 = df1.drop(drop_imp_col,axis=1)\n",
228 | "mydf1.shape"
229 | ]
230 | },
231 | {
232 | "cell_type": "code",
233 | "execution_count": 10,
234 | "metadata": {},
235 | "outputs": [],
236 | "source": [
237 | "# 加上训练集测试集状态,保存数据\n",
238 | "sample_status = list(df1.sample_status)\n",
239 | "mydf1['sample_status'] = sample_status\n",
240 | "mydf1['Idx'] = data_idx\n",
241 | "mydf1.to_csv('../魔镜杯数据/feature_select_data1.csv',encoding='gb18030',index=False)"
242 | ]
243 | }
244 | ],
245 | "metadata": {
246 | "kernelspec": {
247 | "display_name": "Python 3",
248 | "language": "python",
249 | "name": "python3"
250 | },
251 | "language_info": {
252 | "codemirror_mode": {
253 | "name": "ipython",
254 | "version": 3
255 | },
256 | "file_extension": ".py",
257 | "mimetype": "text/x-python",
258 | "name": "python",
259 | "nbconvert_exporter": "python",
260 | "pygments_lexer": "ipython3",
261 | "version": "3.7.0"
262 | },
263 | "toc": {
264 | "base_numbering": 1,
265 | "nav_menu": {},
266 | "number_sections": true,
267 | "sideBar": true,
268 | "skip_h1_title": false,
269 | "title_cell": "Table of Contents",
270 | "title_sidebar": "Contents",
271 | "toc_cell": false,
272 | "toc_position": {},
273 | "toc_section_display": true,
274 | "toc_window_display": false
275 | }
276 | },
277 | "nbformat": 4,
278 | "nbformat_minor": 2
279 | }
280 |
--------------------------------------------------------------------------------
/single_lightgbm_model.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {
7 | "ExecuteTime": {
8 | "end_time": "2019-02-17T02:57:42.938856Z",
9 | "start_time": "2019-02-17T02:57:18.450164Z"
10 | }
11 | },
12 | "outputs": [
13 | {
14 | "name": "stderr",
15 | "output_type": "stream",
16 | "text": [
17 | "C:\\Users\\Administrator\\Anaconda3\\envs\\py3\\lib\\site-packages\\sklearn\\utils\\__init__.py:4: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working\n",
18 | " from collections import Sequence\n",
19 | "C:\\Users\\Administrator\\Anaconda3\\envs\\py3\\lib\\site-packages\\sklearn\\ensemble\\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release.\n",
20 | " from numpy.core.umath_tests import inner1d\n"
21 | ]
22 | }
23 | ],
24 | "source": [
25 | "import numpy as np \n",
26 | "import pandas as pd \n",
27 | "import matplotlib.pyplot as plt \n",
28 | "%matplotlib inline \n",
29 | "plt.style.use('ggplot')\n",
30 | "import seaborn as sns \n",
31 | "import os \n",
32 | "os.chdir('C:/Users/Administrator/Desktop/魔镜杯数据')\n",
33 | "import warnings \n",
34 | "warnings.filterwarnings('ignore')\n",
35 | "\n",
36 | "import lightgbm as lgb \n",
37 | "from lightgbm import plot_importance \n",
38 | "from sklearn.model_selection import GridSearchCV\n",
39 | "from sklearn.model_selection import train_test_split \n",
40 | "from sklearn import metrics\n",
41 | "from sklearn.model_selection import cross_val_score\n",
42 | "from sklearn.model_selection import StratifiedKFold\n",
43 | "\n",
44 | "import score_card as sc"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": 2,
50 | "metadata": {
51 | "ExecuteTime": {
52 | "end_time": "2019-02-17T02:57:51.284077Z",
53 | "start_time": "2019-02-17T02:57:42.938856Z"
54 | }
55 | },
56 | "outputs": [
57 | {
58 | "data": {
59 | "text/html": [
60 | "\n",
61 | "\n",
74 | "
\n",
75 | " \n",
76 | " \n",
77 | " | \n",
78 | " UserInfo_1 | \n",
79 | " UserInfo_3 | \n",
80 | " WeblogInfo_2 | \n",
81 | " WeblogInfo_4 | \n",
82 | " WeblogInfo_5 | \n",
83 | " WeblogInfo_6 | \n",
84 | " WeblogInfo_7 | \n",
85 | " WeblogInfo_8 | \n",
86 | " WeblogInfo_15 | \n",
87 | " WeblogInfo_16 | \n",
88 | " ... | \n",
89 | " _mobilephone | \n",
90 | " _qq | \n",
91 | " _realname | \n",
92 | " _turnover | \n",
93 | " update_time_cnt | \n",
94 | " update_all_cnt | \n",
95 | " log_cnt | \n",
96 | " log_timespan | \n",
97 | " avg_log_timespan | \n",
98 | " Idx | \n",
99 | "
\n",
100 | " \n",
101 | " \n",
102 | " \n",
103 | " | 0 | \n",
104 | " 1.000 | \n",
105 | " 4.000 | \n",
106 | " 1.000 | \n",
107 | " 1.000 | \n",
108 | " 1.000 | \n",
109 | " 1.000 | \n",
110 | " 14.000 | \n",
111 | " 0.000 | \n",
112 | " 6.000 | \n",
113 | " 0.000 | \n",
114 | " ... | \n",
115 | " 1.000 | \n",
116 | " 1.000 | \n",
117 | " 0.000 | \n",
118 | " 0.000 | \n",
119 | " 1.000 | \n",
120 | " 11.000 | \n",
121 | " 19.000 | \n",
122 | " 1.000 | \n",
123 | " 0.632 | \n",
124 | " 10001.000 | \n",
125 | "
\n",
126 | " \n",
127 | " | 1 | \n",
128 | " 1.000 | \n",
129 | " 4.000 | \n",
130 | " 0.000 | \n",
131 | " 1.000 | \n",
132 | " 1.000 | \n",
133 | " 1.000 | \n",
134 | " 14.000 | \n",
135 | " 0.000 | \n",
136 | " 0.000 | \n",
137 | " 7.000 | \n",
138 | " ... | \n",
139 | " 2.000 | \n",
140 | " 1.000 | \n",
141 | " 1.000 | \n",
142 | " 0.000 | \n",
143 | " 3.000 | \n",
144 | " 21.000 | \n",
145 | " 24.000 | \n",
146 | " 1.000 | \n",
147 | " 10.375 | \n",
148 | " 10002.000 | \n",
149 | "
\n",
150 | " \n",
151 | " | 2 | \n",
152 | " 1.000 | \n",
153 | " 3.000 | \n",
154 | " 0.000 | \n",
155 | " 2.000 | \n",
156 | " 2.000 | \n",
157 | " 2.000 | \n",
158 | " 9.000 | \n",
159 | " 3.000 | \n",
160 | " 0.000 | \n",
161 | " 3.000 | \n",
162 | " ... | \n",
163 | " 1.000 | \n",
164 | " 1.000 | \n",
165 | " 0.000 | \n",
166 | " 0.000 | \n",
167 | " 1.000 | \n",
168 | " 10.000 | \n",
169 | " 14.000 | \n",
170 | " 1.000 | \n",
171 | " 0.500 | \n",
172 | " 10003.000 | \n",
173 | "
\n",
174 | " \n",
175 | " | 3 | \n",
176 | " 4.000 | \n",
177 | " 1.000 | \n",
178 | " nan | \n",
179 | " nan | \n",
180 | " nan | \n",
181 | " nan | \n",
182 | " 2.000 | \n",
183 | " 0.000 | \n",
184 | " 0.000 | \n",
185 | " 0.000 | \n",
186 | " ... | \n",
187 | " 1.000 | \n",
188 | " 1.000 | \n",
189 | " 0.000 | \n",
190 | " 0.000 | \n",
191 | " 1.000 | \n",
192 | " 10.000 | \n",
193 | " 7.000 | \n",
194 | " 5.000 | \n",
195 | " 0.000 | \n",
196 | " 10006.000 | \n",
197 | "
\n",
198 | " \n",
199 | " | 4 | \n",
200 | " 5.000 | \n",
201 | " 1.000 | \n",
202 | " 0.000 | \n",
203 | " 1.000 | \n",
204 | " 1.000 | \n",
205 | " 1.000 | \n",
206 | " 3.000 | \n",
207 | " 0.000 | \n",
208 | " 0.000 | \n",
209 | " 0.000 | \n",
210 | " ... | \n",
211 | " 1.000 | \n",
212 | " 1.000 | \n",
213 | " 0.000 | \n",
214 | " 0.000 | \n",
215 | " 2.000 | \n",
216 | " 10.000 | \n",
217 | " 5.000 | \n",
218 | " 0.000 | \n",
219 | " 1.400 | \n",
220 | " 10007.000 | \n",
221 | "
\n",
222 | " \n",
223 | "
\n",
224 | "
5 rows × 161 columns
\n",
225 | "
"
226 | ],
227 | "text/plain": [
228 | " UserInfo_1 UserInfo_3 WeblogInfo_2 WeblogInfo_4 WeblogInfo_5 \\\n",
229 | "0 1.000 4.000 1.000 1.000 1.000 \n",
230 | "1 1.000 4.000 0.000 1.000 1.000 \n",
231 | "2 1.000 3.000 0.000 2.000 2.000 \n",
232 | "3 4.000 1.000 nan nan nan \n",
233 | "4 5.000 1.000 0.000 1.000 1.000 \n",
234 | "\n",
235 | " WeblogInfo_6 WeblogInfo_7 WeblogInfo_8 WeblogInfo_15 WeblogInfo_16 \\\n",
236 | "0 1.000 14.000 0.000 6.000 0.000 \n",
237 | "1 1.000 14.000 0.000 0.000 7.000 \n",
238 | "2 2.000 9.000 3.000 0.000 3.000 \n",
239 | "3 nan 2.000 0.000 0.000 0.000 \n",
240 | "4 1.000 3.000 0.000 0.000 0.000 \n",
241 | "\n",
242 | " ... _mobilephone _qq _realname _turnover update_time_cnt \\\n",
243 | "0 ... 1.000 1.000 0.000 0.000 1.000 \n",
244 | "1 ... 2.000 1.000 1.000 0.000 3.000 \n",
245 | "2 ... 1.000 1.000 0.000 0.000 1.000 \n",
246 | "3 ... 1.000 1.000 0.000 0.000 1.000 \n",
247 | "4 ... 1.000 1.000 0.000 0.000 2.000 \n",
248 | "\n",
249 | " update_all_cnt log_cnt log_timespan avg_log_timespan Idx \n",
250 | "0 11.000 19.000 1.000 0.632 10001.000 \n",
251 | "1 21.000 24.000 1.000 10.375 10002.000 \n",
252 | "2 10.000 14.000 1.000 0.500 10003.000 \n",
253 | "3 10.000 7.000 5.000 0.000 10006.000 \n",
254 | "4 10.000 5.000 0.000 1.400 10007.000 \n",
255 | "\n",
256 | "[5 rows x 161 columns]"
257 | ]
258 | },
259 | "execution_count": 2,
260 | "metadata": {},
261 | "output_type": "execute_result"
262 | }
263 | ],
264 | "source": [
265 | "df = pd.read_csv('feature_select_data1.csv',encoding='gb18030')\n",
266 | "df.head()"
267 | ]
268 | },
269 | {
270 | "cell_type": "markdown",
271 | "metadata": {},
272 | "source": [
273 | "# 两种版本的lgb默认参数模型"
274 | ]
275 | },
276 | {
277 | "cell_type": "markdown",
278 | "metadata": {},
279 | "source": [
280 | "## sklearn版本"
281 | ]
282 | },
283 | {
284 | "cell_type": "code",
285 | "execution_count": 3,
286 | "metadata": {
287 | "ExecuteTime": {
288 | "end_time": "2019-02-17T02:57:51.599095Z",
289 | "start_time": "2019-02-17T02:57:51.295077Z"
290 | }
291 | },
292 | "outputs": [],
293 | "source": [
294 | "# 默认参数模型\n",
295 | "x_train = df[df.sample_status=='train'].drop(['Idx','sample_status','target'],axis=1)\n",
296 | "x_test = df[df.sample_status=='test'].drop(['Idx','sample_status','target'],axis=1)\n",
297 | "y_train = df[df.sample_status=='train']['target']\n",
298 | "y_test = df[df.sample_status=='test']['target']"
299 | ]
300 | },
301 | {
302 | "cell_type": "code",
303 | "execution_count": 4,
304 | "metadata": {},
305 | "outputs": [
306 | {
307 | "name": "stdout",
308 | "output_type": "stream",
309 | "text": [
310 | "运行时间为6.0秒\n"
311 | ]
312 | }
313 | ],
314 | "source": [
315 | "import time\n",
316 | "start = time.time()\n",
317 | "lgb_sklearn = lgb.LGBMClassifier(random_state=0).fit(x_train,y_train)\n",
318 | "end = time.time()\n",
319 | "print('运行时间为{}秒'.format(round(end-start,0)))"
320 | ]
321 | },
322 | {
323 | "cell_type": "code",
324 | "execution_count": 5,
325 | "metadata": {},
326 | "outputs": [
327 | {
328 | "data": {
329 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXUAAAEFCAYAAAAc33cJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzt3Xd4VNXWx/HvzCSTOpAAASkiKrJFmkpHBQtNBETB/lpQARVFqZZrF1QQRFBRUSxXbFgQsWDBgiJYAVFhcwGpCkpJz/Tz/nECSTAkIUzmTFmf5/GRqVnZhF/27LPPOjbDMBBCCBEb7FYXIIQQInQk1IUQIoZIqAshRAyRUBdCiBgioS6EEDFEQl0IIWJIgtUFCHG4lFKbgKMOuDsPWAmM01p/X+q5/YBxQAfAAH4BZmit3yrnfU8C7gC6A6nAWmC61vrV0H8XQoSGzNRFrLgDaFj8XyPgLMALfKiUSgdQSo0F3gYWA52BTsW3X1BKTSn9ZsXhvxTYCvQFTgZeAV5USo0LxzckRHXY5OQjEe2KZ+pTtdZPHHB/E8xQPhf4A1gBDNRaf3jA83oAXwC9tNaLi38JbASe1Frfd8BzbwXuAZpqrXfVzHckRPXJTF3EMk/x/wPAMGDVgYEOoLX+CvgUuL74rgFABvBoOe85C+gFZIe8WiFCQNbURUxSStUFngV2AF8DdwHLK3jJF8BNxX8+EdBa67wDn1R839LQVitE6Eioi1gxTSn1cPGf7YADM8x7aq1zlVJ1gD0VvH43UK/4z5lATo1VKkQNkuUXESsewpxhdwZewAzwe7XWvxU/vgeoVcHrM4B9a+S7MINdiKgjoS5ixS6t9Xqt9W9a65GYs/SFSqkjix9fBpxawetPo2R55jtAKaX+9UtAKVVbKfWFUqpDKIsXIlQk1EWsugHwA08V334GaK2UGnzgE5VSpwD9Sj33E+BvYEw57zsC6AZsDnXBQoSCrKmLmKS13qWUug14Til1rtZ6gVJqDDBXKXU85v50H3A2MBF4TGv9WfFri5RSNwDzlFIu4EXMXxDnY25nHK+1/if835UQlZOZuohlz2PuVJmhlErVWj+JuV2xe/H9PwMXAsO01mVOKNJavwv0BloDnwPfAwOB/9NazwjftyDEoZGTj4QQIobITF0IIWKIhLoQQsSQKoW6UqqzUurLcu4foJT6QSm1TCk1LOTVCSGEOCSVhrpSagLwHJB8wP2JwHTMg0k9gOFKqSNqokghhBBVU5WZ+gbMrVwHagms11rv1Vp7gW8wT+AQQghhkUr3qWut31ZKNSvnoVqU7Y+RB9Qu7z38/oBssinmcNgIBGQwZBxKyFiUiKaxCATAMMz/Nm2Cd9+18d13NtasgSZN/v38pUvB67Ud9P3q1TNo2RJa5yxl1i+ngWEc/MkVOJyTj3IBV6nbLg7SjtQwIDu78DC+VOzIyEiVsUDGoTQZixKRNBaGAT4fbN1q48UXnWzfbmPbNjv5+bB+vaPC1+7aZdCiRaDMfSeeCHl5Npo1C9KyZZCsLIOTTw7QokWQVLsb57Jv8J3ZE2jH3l+WVLv50OGE+hrguOLud/mYJ3RMPYz3E0KIsNmzB7KzzaBescLBmjV2MjMNli1z8M8/Nv75p/zV6RYtAjRtGuSoo4K0axcgPR1ycmy0bh3glFMCNGp0aJ80Er5bjmv0SBx/bGTP96sIHtkUf9sTq/19HXKoK6UuBdK11rOLT7v+GHNt/nmt9fZqVyKEECH29982Pvkkgd9/N4M7M9Pgs88qjr3UVINAAOrXD9KjR4BGjYIcf3yQs87yk5ERwuLy80l78D5S5swm2ORIcl59i+CRTQ/7bcNyRqnPFzAi5SOV1SLp46WVZBxKyFiUqOpYBIPw5582DMNc0njkESdbt9r55RdzWcRuNwgGyy5Jp6YaFBbaaNUqwO7dNgYP9tOgQZDatQ0aNDA46aQAmeFquOz1ktmjC46NGyi6dgQFt98N6ellnpKV5Qr7mroQQoScYcAnnzj46qsEEhPN+z74IIGiInC5YOPGijftKRXgnHP8gLm8olSQzp0DnHBCsKZLr1x+vhneTidFN4zC3+J4/J27hPRLSKgLISzldsOPPzqYPt3J1187KL3/wmYzSEmBoiJzM4hSfpo3D5KeblC3rkHr1ubBSLsdLrrIb9F3UDXOhQtw3TaWvKkz8J59Du7Lr6qRryOhLoQIm4ICWLXKgb14sj11qpMlS8rGUGKiwfnn+xk+3EubNhEwuz5M9p07SL9tHEkfvIev7YkEQrBuXhEJdSFEyBkGrF9vZ9s2G5s323n6aWeFyyZXX+1l4EA/ffsmkZsbO8cXkua/RfqEMdjcReTfeR9FN9wECTUbuxLqwNy5L/Lmm68xb957JCUlMWnSvZx1Vm+6dOm2/zkDB/bhvfc+BmDJki95883XMAwDj8fDpZdezhln9Dzo+2dnZ3Pfff/B4/HQsOERjB9/J8nJJV0XPvxwIR9+uBAAr9fL+vXrWLDgYzZuXM8TTzyGzWaja9dTGDrUbK/z2GNTWb16FSkpKVx//ShatWpdE8MiRIXcbigsBJ/PhtZ2FixIoF49gyVLEvjpp/L3cZ98coDWrQMMHGgulQQC0KFDAFfxios91loMer34W55A/vTHCRx7XFi+pIQ68OmnizjrrN4sXvwJ/foNqPC5q1evYt68V5ky5TFSU1PJyclmxIihNGt2DEcffUy5r3nxxWfp1asv/foN4K23XmHBgre56KLL9j/er9+A/V932rTJnHPOQFwuFzNmTGPixMk0atSYm24awSmnnMY///zDli2befbZl8jNzWXs2JuYM+fl0A2GEMX8fvO43l9/2Skqgu3b7axcaeePP+ysXu1g8+aKE7hx4yDjxnk56ihzT3eTJga2au3niCLBIMnPz4akZNyXX4XnwkvwXHBxWH9bRUSov/FGAq+9lhjS97zkEl+VDpz8/POPNGrUhEGDBnP//XdXGuoLF77LBRdcQmpqKgC1a2cwe/ZLuFwu3n77Db74YnGZ59955/388stKLr98KACnnnoa06ZNKxPq+6xd+zt//LGBsWNvBWD27BdJSEigsLCQgoJ8atXK4IcfvqNz5y7Y7XYyMjKw2+3s3r2LunXrVWlchKhIMAjvvpvAhAnJ5OZWnMBpaQZXXeWjceMgXi+0bRvklFMCsR/cB+FYp3GNvpHEH77DPfA880CozUa4ByQiQt1K77+/gAEDBtG0aTMSExP57bdfy33evr+XXbv+oVGjxmUeq1XLvOj84MEXMXjwRf96bUFBAenFe1DT0tLIz88v92v8978vcPXVw/ffTkhI4NdfV3PvvXfQrNnRZGZmcNxxitdfn8vgwRexc+cONm3aiNvtPuTvW4gDnXNOKj/8UHbZpG9fH+3bmzPt9HQDlwvatw/U9LJwdPH5SH3iMVKnTcZISyP3iWfM2blFIuKv5qKL/JZsR8rNzWXZsqXs3buHt956g4KCfN555w1SUlLx+bxlnhsImFunGjRoyN9/7+S441rsf+yXX1ZSp05dvvvu23Jn6mlpaRQWFpKUlExBQQEul4sD5eXlsWXLJk4+uUOZ+1u3bsNbby1k9uxZzJ37EtdcM4I1a35j1KjraN78OJRqSa1a5fZRE6JSPh989lkCV16Zsv++wYN9jB3roXnz6GisZbWEn38i7aEHcJ97PvmTpmDUr29tPZZ+dYt98smH9O9/LiNH3gyA2+3mggsGcskl/8dXX33BaaedDsCqVSto1sxcLz/nnAE8/fQTnHxyB1JSUti7dw8PPng/EydOPuhMvU2bdixbtpR+/QbwzTdf07acvg6rVv1Mhw6d9t82DIORI4fx8MOPUqtWLVJTU/F6vWzZspnMzDrMmvUcO3fuYOLEe8r9JSHEwXzxhYORI5PZtevf67y//ZZPVpaEeaWKinAuXYK3Zx/8nbuwd/HX+Nu0s7oqIM5DfeHCBdx11/37bycnJ9Ojx5m43W5SUlK56qpLSU1NJTExkQkT7gCgdeu2DBx4HqNHjyQhIQGPx811142kefODH9m+8sprmDjxXhYunE+9enW54w7zaz7wwN0MG3YDRxxxBFu2bC6zrGOz2bjkkv9j3LhROJ1O6taty6233oXD4eC7777l/fcX4HQ6GTPm1hoZGxFbsrPhkktS/7UrpX37AG3aBBg0yE+3boGDvFqUlrhsKemjb8SxeVNJA64ICXSQ3i9hJ30+TDIOJWpiLAoKYO7cRP73Pzsvv5xYpjW3UgHGjvUyaFDknYEZyT8Xtrxc0h64h5QX5xBo2oy8R2fi6356jX096f0iRBwLBGDRogSmTHGyZk3Z2XhamkFBAVx4oY8pU9wUb9wSh8LrJaNndxyb/qBwxEgKbrsT0tKsrqpcEupCRKmiInjzzURmz05k3bqyQZ6aajBsmJcrr/TRpImskVeXLT8PI91lNuAaNQa/Oh5/qWNfkUhCXYgo4/fDhx8mcO21KWXuP/roIC+9VMTxx0d/vxTLGQZJ780n/fbx5E2baTbguuwKq6uqEgl1IaJEYSHcdVcSL7/s3H9fp05+pk3z0KJFMG5P+gk1+46/SL91LEkfvY+v3UkEjmpmdUmHREJdiAiXnQ0vveRk0qSk/fd17uxn6lQPSsmsPJSS3p5H+q1jsXk95N/9AEXXjazxBlyhFl3VChEHAgH45x8b772XwNtvJ7JiRcl6+YknBnjzzUJqy/lmNSMQwN+qtdmA65jmVldTLRLqQkSIzz93MHx4Srk9V3r39jNlivuQL2osKhEIkPLsUxipabivGIrngovxDLkoqttFSqgLYZFVq+zMn5/IrFllr/aTmWlwwgkBevb0M2CAn6ZNJchrgmPtGlyjR5L404+4zxuM+4qhljTgCjUJdSHC6Oabk8vtSFq3bpBevQL07++jd285s7NGeb2kznyU1OmPYNSqRe7Tc/CcN8TqqkJGQl2IMAgE4I47kvYHetOmQTp2DNC9u5+hQ5243ZF5FmUsSli5grQpD+I+fwj5E6dg1IutttUS6kLUoK++cnDBBWVP4VyypKDMXvLkZCfSPbmGFRbi/OYrvL3Pxt+pM3u++JZAjF4xLHqPBggRgfx+WLLEwRVXJFO/vqtMoI8Y4WXDhjw5OSjMEpd+TeYZ3ah15aXYt24BiNlAB5mpCxES27bZmDXLyXPPOcvcn5xs8NZbhXTqJEEebrbcHNLuv4eU/z5P4Khm5Mx7l+CRTa0uq8ZJqAtRTZs32/j2Wwc331z2dH2bzeC114ro3l2uEGQZr5fMnt2xb9lM4fU3UXDrf4iXTmbyIyfEIQgE4KOPEhg+PBm/v+zWt2nT3Fx0kQ+n8yAvFjXOlpeL4aoFTieFt4zDf3xL/AdcTSzWSagLUYnCQpg1y8mUKUn/emzmzCJOPDEo6+RWMwyS5r9F+n8mkDd1Jt5zBuC+9HKrq7KEhLoQB7FypZ3evcv2zLbZDC67zMfQoT5at5YmWpHA/ud20ieMJumTRfhObk/gmGOtLslSEupClLJjh43LL09h1aqy/ckHDfIxZoxXZuQRJunN10m/bRw2v4/8+x+kaNj14HBU/sIYJqEuRLFJk5zMmFGyxNK/v48ePQJceaXPwqpEZfwnnkTetJkEmx1tdSkRQUJdxLUPP0zgiy8cvPRSydHN448P8PnnhbJzJRIFAqQ8MwsjNRX3VdfgGXKR2YBL1sH2kx9bEZe2bLHRoUP6v+5fsyafunWlgVYkcqz5HdctN5C44mfc5w/BfdU1EublkFAXcWX3bhvnn59S5uLMixcX0KaNrJVHLI+H1BnTSJ0xDaN2bXJnv4Dn3POtripiSaiLmLdxo42HH05i+3Y7P/xQEuZDh3qZPNljYWWiKhJWrSRt6sO4h1xE/gMPY9Sta3VJEa3SUFdK2YFZQDvAA1yrtV5f6vFxwCVAEHhQaz2/hmoV4pCsWmXnpZcSmTvXXC9v2jRI/fpBLr3Ux/jxXhL/3QFXRIqCApxff4W3bz+zAddXywm0PMHqqqJCVWbqg4BkrXVXpVQXYBpwLoBSKgMYBTQH0oCVgIS6sNTff9s499xUNmwo6VfXqZOf998vsrAqUVWJS77ENWYU9u1b2fP9KoJHNpVAPwRV6dJ4KrAIQGu9HCh9zm0BsBkz0NMwZ+tChF12NnTokEb9+i5at07fH+gzZhSxZUueBHoUsOVk47huBBlDBmIkOMh55/24aMAValWZqdcCckrdDiilErTW/uLbW4HfAQfwUHlv4HDYyMiIj2Y6lXE47DIWhG4cDANGjLDx4osl85OTTjLo39/gzjsNbDYnENnNWORnAvB6SehyOmzaRGDsOIy77yEtJaXSl4l/q0qo51L6AopgLxXoZwMNgX27/j9WSi3VWn9f+g0CAYPsbLmyC0BGRqqMBaEZhwNP4x8+3MvEiSUHPnNyyntV5Innnwlbbg5GrdoAJN0yntSOJ7H32BPAY4AnPsdkn6wsV+VPKkdVll+WAv0AitfUV5d6bC9QBHi01m4gG8ioViVCHILJk51lAn3lyvwygS4inGGQ9Obr1OnYFucHCwHwXHwZRvv46qhYE6oyU58P9FJKfQvYgKFKqTHAeq31e0qpnsBypVQQ+Ab4tObKFfFu5kwnEyeWnMp/1VVepkyRMI8m9u3bSB9/C0mffYKvfUcCzY+zuqSYYjOMmj97zucLGPH68fJA8fxRu7RDHYe9e0Gpsh9HP/20gHbtov/YfDz9TCS98Srpt4/HFgxQcMfdFF0zokwDrngai8pkZbmqdbqsnHwkIt6KFXb69ClZalm1Kp+GDeVU/qjkcOA/uQN502YQPKqZ1dXEJAl1EbEOnJ137ernnXeK4r2zanTx+0l56gmM9HTcQ6/FM/hCPIMvlJ4tNagqB0qFCDvDgDZtShpu3XOPmwULJNCjiePX1WT0PZP0B+4m8YfvzDttNgn0GiYzdRGROnRIw+s1//H//XeexdWIQ+LxkDp9Cqkzp2Nk1iFnzst4B5xrdVVxQ2bqImLk5sKrryZQv76LrVvNH821ayXQo03CLytJnT4Vz+AL2fPN9xLoYSYzdWE5txumTnUyc2bZCzuvXp1PnToWFSUOTX4+ziVf4u3XH3/Hzuz9+nsCLZTVVcUlCXVhGb8fGjUqu02xSZMg8+YV0ry57G6JFolffo5r3M3Yt28racAlgW4ZWX4Rlvj117KBfv31XjZsyOPnnwsk0KOELXsv6beMJOPCQRiJieTM/0AacEUAmamLsFq92s4bbyQye3bJNpY//8yT64FGG6+XzJ49sG/fSuHNYykYeyskJ1tdlUBCXYTRsGHJLFhQcmWK227zMGaM18KKxKGy5WRj1M4Ap5OC8bcRaHkC/rYnWl2WKEWWX0SNKyqC+vVd+wP9nnvc7NoVkECPJoZB0uuvmA24Fi4AwHPRpRLoEUhm6qJG5efDMceUrJ2vXJlPo0YGtWolkp1tYWGiyuxbt+AadzPOLxbj69SFwPEtrS5JVEBCXdSYCy5I4auvzB+x9HSDDRvy5WTCKJP02lxct48HIO+hR3APHQZ2+YAfyeRvR4TcL7/YqV/ftT/Qhw71snGjBHpUcjrxde7Cnq+/w33NCAn0KCAzdREyHg/cfHMy77xjrp27XAarVuWTnl7JC0Xk8PlIeepxjLR03NcMx3P+BXjOv0D6tUQR+bUrDltREQwZksKRR7r2B/qkSW42bJBAjyYJq1eZDbgm3kviip/MO6UBV9SRmbqotmAQbropmTffLNmm2KFDgFdfLSRDLmoYPdxu0qZNJuWJxzDq1CXn+bl4+w+0uipRTRLqolqys6FFi5JdLS6Xwbp1+dIaNwol/LKKlJmP4r74Mgrum4SRkWl1SeIwSKiLQ2IYcPrpqaxZU5LeW7fmkZRUwYtExLHl55H45Rd4+w/E36kze7/5gcBxLawuS4SArKmLKisqggYNXPsD/eKLffz5pwR6tEn8/FMyu3eh1vCrsG/bCiCBHkNkpi6q5Mcf7fTrV3Kd0E2b8khNtbAgcchse3aTfvcdJM97DX8LRfaCjwg2OdLqskSISaiLgyoqgkcecfLEE2Wn4ps355GSYlFRono8HjJ79cD+158UjBlP4egJyEes2CShLv5l7Vo7w4Ylo3XJunmjRkEmT3bTp0/AwsrEobJl7zUPfCYlUXDbnfhbtiLQuo3VZYkaJGvqYr+CArPxVvfuafsD/fzzffz8cz4rVxZIoEcTwyDptbnU6diupAHXBRdLoMcBmakLfD645ppkFi0q2W8+caKbK6/0ySf0KGTfshnX2FE4v/oCb5duBE44weqSRBhJqMe5XbtsnHBCyWmfLVsG+OyzQhITK3iRiFjJr75M+h0TMGw28iY/ivvKq6VfS5yRUI9jfj/7A/3YY4MsXVog//6jnJGcjLdrN/IfeUx2tsQpCfU4tHWrjZ4909i7t6Snx7JlBRZWJKrN5yP18ekEa9XCfe11eM4bgue8IdKvJY7JvCyOGAYMHJhC+/bp+wM9KyvIjh15FlcmqiNh1Qoye/Ug7eGJJKz+xbxTGnDFPQn1OJGdDccck87y5eaHszFjPPz9dx6//SZLLlGnqIi0++8mo88Z2HbvIuel18ifMcvqqkSEkOWXOLBjh422bc2188aNg3z9dYG0xI1iCb/+QsqTM3BfdgUF9zxgXghaiGIyR4th06c7qV/ftT/Qjz8+wM8/S6BHI1teLs6F7wLg79iZvd/+SP6jj0ugi3+RUI9RmzfbeOghc5N5RobB8OFePv+8UJZbo5Dzs4/NBlwjri5pwHXscRZXJSKVLL/EoPXrbXTrZk7HH3nEPIlIRB/b7t2k33UbyW+9gV8dT/azi2SboqiUhHqM2LnTxlVXpfDTTyX9Wlq1CkigRyuPh8zexQ24xt5K4S3jpAGXqBIJ9Riwe7eNNm1KFsobNAgyfryXK66QQI82tj27MTLrmA24br/LbMDVqrXVZYkoUmmoK6XswCygHeABrtVary/1+NnAPcU3fwZGaq2NGqhVlGPTJhudOpmB3rx5gKVLZd08KhkGya/8l7R77yTv0Zl4B56HZ8hFVlclolBVDpQOApK11l2B24Bp+x5QSrmAR4D+WusuwCagXg3UKcoRCLA/0AG+/VYCPSpt2EDtIQNxjbkJf5u2+Fu3tboiEcWqEuqnAosAtNbLgQ6lHusGrAamKaW+BnZqrf8JeZXiXxYvdtCwoXnh5/r1g/z9t5wVGo2SX36RhJNPJGHlCvKmziDn7YUEjznW6rJEFKvKmnotIKfU7YBSKkFr7ceclZ8BnAjkA18rpZZprdeVfgOHw0ZGhlz7DMDhsB/WWGRnw7332pg1q+T38caNBk5ndI3v4Y5DrLDVrwtnnkXg8SdIbtKEZKsLspj8XBy+qoR6LuAqddteHOgAu4EftNY7AJRSSzADvkyoBwIG2dmFISg3+mVkpFZ7LJYvdzBwYMkP/AMPuBkxwkdhIRRG2fAezjhENa+X1JmPYtSuTdGw66F3fzIuvJDsnCKIx/E4QNz+XJQjK8tV+ZPKUZXll6VAPwClVBfM5ZZ9fgJaK6XqKaUSgC7A79WqRBzUzJnmmaH7Av2EEwKsXZvHiBGyuyWaJKz4icxe3Umb8iCO338z75QGXCLEqjJTnw/0Ukp9C9iAoUqpMcB6rfV7SqnbgY+LnztPa/1rDdUaV3bssHHvvUm8807J1SqaNg0yZYqbM8+Uy8pFlcJC0iZPIuWZJwk2OIKcl9/A2+dsq6sSMcpmGDW/+9DnCxjykcpUlY+XwSAccUTZj16ffVZA27bBmiwtrOLpY3bCD9+RMaAP7suupOCe+zFq1S7zeDyNRWVkLEpkZbmq9RFOTj6KIG43dOuWxrZt5qqYw2GwcWM+KSkWFyYOmS03B+cXi/Gcez7+jp3Z8+1PsqtFhIU09IoQhgFNm7r2B3qrVgE2bZJAj0bOjz8i89ROuK6/Fvv2bQAS6CJsZKYeAQwDGjQoWW7ZsSNPLlwRhWy7dpF+5wSS33kLf8sTyH7xFYKNm1hdlogzEuoR4NprS3Ynr18vgR6V9jXg2rmDggl3UDhqDDidVlcl4pCEusV+/93OwoXmDpetW/OkEV+Use3ejVGnuAHXXfeZDbiOb2l1WSKOyZzQQh9+mMDpp6cBMHKkVwI9mgSDJL/0PHU6tiXpvfkAeM4bIoEuLCczdQsEAnDUUel4veaOpebNA9xzj8fiqkRV2TduwDV2FM6lX+M9rQe+didZXZIQ+0moW6B379T9gf7ee4V06SInE0WL5P++QPqdt2IkOsl79HHcl10hZ4SKiCKhHmYjRthYvdpc9dq2LU+OpUUZo3ZtvKefSf7kRwk2bGR1OUL8i4R6GHXvnsratWagP/qoWwI9Gng8pD42FSMzk6LhN+AZeB6egefJ7FxELAn1MBk7Nom1a83rh65YkU/jxnJxqEiX8OP3uEbfSIJeS9HlV5l3SpiLCCehXsM8Hhg2LJlFi8xti9u2BXA6JdAjWkEBaQ9PJGX2LIING5Hz6pt4e/axuiohqkRCvQZt3WqjffuSy8299loh9esnkZ1tYVGiUglrfiPl2adwX3UNBXfei+GqZXVJQlSZhHoN0drOaaeZe9CTkgz++COfBBntiGXLycb5+Wd4zhuCv0Mn9ixfQbDZ0VaXJcQhk5gJscJCOP74dNxuc+21YcMgq1YVWFyVqIjzow9InzAa+57d+Dp1Idi4iQS6iFpyRmkIGQY0a+baH+gvvVQkgR7BbP/8g2v4VdS+8hKMellkf/iZNOASUU9m6iFiGNC2bdr+29JpMcJ5PGT26o591z8U3H4XhTfeAomJlb9OiAgnoR4ic+YksnOnmeJr1uRLoEco265dGHXrmg247p1oNuBSx1tdlhAhI9ETAsEg3HGH2T533bo86taVLYsRJxgk+YXnqNOpHUkL3gHAM2iwBLqIOTJTP0ylryd61FFBMjIsLkj8i2PD/0gffRPO5d/i7X4GvpPaW12SEDVGQv0wvf12yRAuXSoHRSNN8gvPkX737RjJKeTOmIXn4svkrFAR0yTUD4NhwMiR5kVEV6/Ol14uEShYty7enn3If3gqwQZHWF3qUsKiAAAV+0lEQVSOEDVOQr2a/H5o1Mhcdune3U+DBrKOHhHcblKnT8HIrEPRdTfiHTAI78DzrK5KiLCRA6XVNHNmybT8jTeKLKxE7JPw/XdknnUqadOn4tiwwbxTllpEnJGZejVMmuRkxgzz2nMbN+bhcFhcULzLzyftoftJee4Zgo2bkP36O/jO7Gl1VUJYQmbqh2jzZtv+QH/yySLS0yt5gahxCWt/J+X5Z3FfPYy9S5ZLoIu4JjP1Q1BYCB07mik+dKiXCy7wW1xR/LJl7zUbcJ1/gdmA67uVBJseZXVZQlhOZupV5PWafV0ATjopwOTJcqFoqzjff4/MUzvhuuk67H9uB5BAF6KYhHoV7Nhho0kT1/7b775baGE18cu2cye1rr6c2lf/H8H6Dche9DnBRo2tLkuIiCLLL5UwG3WZSy6JiQabN0tfdEt4PGT2OR377l3k33kvRdffJA24hCiHxFMFDAMaNCiZoW/fnm9hNfHJ9vffGFlZkJRE/v0PEjihNYHmx1ldlhARS5ZfKvDooyV70bduzbOwkjgUDJL83NPU7dSOpHffBsA78DwJdCEqITP1gwgEYPJkc+viunV5JCVZXFAccfxvHa7RN5L4/XK8Z5yFr0Mnq0sSImrITL0cX33loGFDc9mla1e/dF4Mo+TnnyXzzFNwrFtL7uNPk/P6OwSPbGp1WUJEDZmpl+P6683e6LVqGdICIMyCWVl4e59N3kNTMerXt7ocIaJOpaGulLIDs4B2gAe4Vmu9vpznfAAs0Fo/XROFhsucOYns2mUnKyvIb79JK90a53aTNm0ywcw6FN1wk9mAa8Agq6sSImpVZfllEJCste4K3AZMK+c5E4E6oSzMCkuWOLj9dnOW/thjbouriX0Jy5eReUY3UmdMw7Fpo9XlCBETqhLqpwKLALTWy4EOpR9USg0BgsBHIa8ujF5/PYEhQ1IB6NHDT69eAYsril22/DzsN48ic2AfbD4f2fPeJX/KdKvLEiImVGVNvRaQU+p2QCmVoLX2K6VaA5cCQ4C7D/YGDoeNjIzUw6u0Bt16q43p083fb5dfHmTOHBtQM/U6HPaIHotwsK1bjX32MwRuvIng/Q+QFudd0eRnooSMxeGrSqjnAq5St+1a632drK4AGgOfA80Ar1Jqk9Z6Uek3CAQMsrMj89T6J59MZPp0c8nlueeKGDjQT3Z2zX29jIzUiB2LmmTbsxvn4k/xXHAxtGhDxtp1ZNfOAj8Qh+NRWrz+TJRHxqJEVpar8ieVoyqhvhQYAMxTSnUBVu97QGs9Yd+flVL3AjsODPRItnWrjfvuMwN93rxCTj9dllxCzjBwvr8A161jseXm4DvlNLNfy1FHxX2YC1ETqrKmPh9wK6W+BaYDo5VSY5RSA2u2tJrXvr35sf+GG7wS6DXAvnMHtYb+H7WvuYJA4ybsXfSFNOASoobZDKPmr63p8wWMSPtIdeWVyXz0USLJyQZbtoSvp0vcfLz0eKjTsS327L0UTPgPRdeNpHQntLgZhyqQsSghY1EiK8tVrWsxxuXJR2PHJvHRR2aHv48/lh+gULLt3GmeNJSURP6kyQROaEXgWOnXIkS4xF2bgE2bbLz8stmo64UXimjZMmhxRTEiECDl2aeo27kdSfPfAsA7YJAEuhBhFncz9bFjzQOjEyZ4OOccuRxdKDj0WrMB14/f4zmrF75OXawuSYi4FVeh7nbD11+b3/K4cV6Lq4kNyXOeIf2e/2CkpZH75Gw8Qy4CW7WWAoUQIRBXod6mjbnbZfhwCfRQCdY/As/Z/cl/8BHzYhZCCEvFze6X0lcx2rrVuv7oUX90v6iItEceIli3HkUjR1X7baJ+HEJIxqKEjEWJ6u5+iZsDpaefbp56PGmSWy54UU2Jy5aSeXpXUp94DPv2rVaXI4QoR1wsvxQVwZo1DgCGDvVZXE30seXlkvbAPaS8OIfAUc3IfnshvtN6WF2WEKIccTFTv/DCFADGj/eUPv9FVJHjf+tInvsShdfdyJ4vl0mgCxHBYj7iPB747jvz2xwzRg6QVpVt926cn32M56JL8Z/cgT0//EKwcROryxJCVCKmZ+r5+XDZZeYs/fLLvTgcFhcUDQyDpHffps5pHXGNHYX9z+0AEuhCRImYnan7fHDMMSWtK0eOlFl6Zew7/iJ9wmiSFn2I78STyHtsljTgEiLKxGyoN29u7klPTDTQOp84vw5D5TweMnqfjj17L/n3TqJo+PXIAQghok9M/qvdsMFGUZG5xXPdunzS0iwuKILZd/xFsMERZgOuBx/Bf0Irgscca3VZQohqirk19cJC6NrVnJa/8kqhBPrBBAKkPPUEdTqfSNI7bwLg7T9QAl2IKBdzM/VZs8wOjC6XQc+ecuGL8jjW/I5r9EgSf/4JT++++LqeYnVJQogQibmZ+pQp5umi339fIH2lypHy7FNk9jwNx+ZN5D49h9yX35CDoULEkJiaqc+da1744sgjg9StW/M9baJRoGFjPAMGkT9xMka9elaXI4QIsZgJ9V9/tTNmjNkrfeZMt8XVRJDCQtKmPEiwXhZFN96Mt/9AvP2j/vKyQoiDiInll0AAzjzTPCI6aZKbU06RtXSAxKVfU+f0rqTOmon9r+1WlyOECIOon6kbBjRubO52SU01GDZMGnbZcnNIu+9uUl5+gUCzo8me/wG+U06zuiwhRBhE9UzdMOCII9IJBkv2pAtwrP8fya/PpfCGUWYDLgl0IeJGVM/Ub7stCcPYF+h5OJ0WF2Qh265dZgOuiy8zG3D9uJpgw0ZWlyWECLOonan7fPDCC2aK/+9/eWRkWFyQVQyDpLfnUefUDrjG31LSgEsCXYi4FLWhfuqp5oHRwYN91K5tcTEWsW/fRq3/u5Ba119L4Ohj2PvpEtlzLkSci8rll08+cfDHH+bvoyeeiNPti243GX3PxJ6XS/4DD1F07XVIb2EhRFSG+hVXmD3SP/usIO5yzP7ndnNpJTmZ/MmPmg24mh1tdVlCiAgRdcsvCxcmEAzaSEkxaNs2aHU54eP3k/LkTOp0OamkAVe//hLoQogyom6mPnOmeXD0rbcKLa4kfBy//Wo24Fq5Ak/fc2SLohDioKJqpl5QAKtWOcjMNOjYMT5m6SnPPElmr+44tm0l99kXyX3pVYJHNLS6LCFEhIqqmfrZZ6cCcPHF8XPWaKBJUzyDBpP/wMMYdetaXY4QIsLZDKPmuxn6fAEjO/vwlkvcbmja1Lzm6M6deVHbVjcjI5UKx6KggLSHHyCY1YCiUaPDV1iYVToOcUTGooSMRYmsLFe1Ui4qll8Mo2Rf+vjxnqgN9MokLvmSOj26kvrMLOz//G11OUKIKBQVyy+vv57Ali3m759x47wWVxN6tpxs0u69k5RX/ov/mGPJfm8Rvi7drC5LCBGFIn6mvnixg5tvNvelL1+eH5OzdMfGDSS/+TqFo8aw94tvJdCFENUW0TP1H3+0c8kl5sHR3r39HHNM7FzNyPb33yR99jHuSy/Hf1J79vz0K8EGR1hdlhAiylUa6kopOzALaAd4gGu11utLPT4auLj45oda6/tCVVy/fuY6+qBBPmbPjpF2AIZB0puvk37nrdgKC/GefibBRo0l0IUQIVGV5ZdBQLLWuitwGzBt3wNKqWOAy4BuQFegt1KqbSgKe+IJ83qjxx0XiJlAt2/biuPcAdQaOZzAscexd/E30oBLCBFSVVl+ORVYBKC1Xq6U6lDqsa1AX611AEAplQiEJIEnTUoCYN68olC8nfXcbjLOPgtbXi75kyZTdPVwacAlhAi5qoR6LSCn1O2AUipBa+3XWvuAXUopG/AIsEJrve7AN3A4bGRkpFa5qG3bIBCwkZFh0KpVSpVfF5G2bIEjj4SMVIwnZ2GcdCJJRzYlyeq6LOZw2A/pZyKWyViUkLE4fFUJ9VzAVeq2XWvt33dDKZUMPA/kATeU9waBgHFIJxTcf38S4OChh9xkZ/srfX5E8vtJmfU4aY88SN6jj+O54GLo3lNOrigm41BCxqKEjEWJrCxX5U8qR1VCfSkwAJinlOoCrN73QPEMfQHwudZ6crUqKMe775rr6X36RGegO1b/gmv0jST+shLPOQPxdj/D6pKEEHGiKqE+H+illPoWsAFDlVJjgPWAA+gBJCmlzi5+/u1a62XVLcjng+xsG61aBUhPr+67WCflqSdIe+BujMw65Mx5Ge+Ac60uSQgRRyoNda11ELjugLvXlvpzcigLmj/fLKl790Ao3zZsAkc1wzP4QvLvfxAjs47V5Qgh4kxENfQKBKBhQ3Md6ZtvCmjRIgra6+bnk/bQ/QQbHEHRqDGVPl3WDE0yDiVkLErIWJSIiYZeN99sTvozMoyoCPTELxZTp0cXUp57Bvvu3VaXI4QQkdUmYNkyc9/26tX5FldSMVv2XtLvvoPk11/B3/w4shcswt+lq9VlCSFE5IT6qlV2tm6107JlgKQI38Tt+GMjSfPfouCWcRSOmQDJIT2sIIQQ1RYxof6f/5hJ/tBDHosrKZ9t506SPvkI9+VX4T+pPbt//BWjQQOryxJCiDIiYk3dMOD7783fL926RdiuF8Mg6fVXqHNaR9L/MwH7X3+ad0ugCyEiUESE+ssvmycb9e8fWdcetW/ZTO0LB1Fr1PUEVEv2fr6UYMNGVpclhBAHFRHLL2+8YYb65MkRtPTidpN59llQWEjeQ1NxD70W7BHxO1AIIQ7K8lDPz4cffjB3vWRlWX8RDPvWLQSbHAnJyeQ9+jj+E1oRPLKp1WUJIUSVWD71HDbM7MLYq5fFfV58PlIfm0qdrieT9NYbAHj7nC2BLoSIKpbO1A0DFi82S5g717q+6QmrV5F+80gSf/0F98Dz8PY407JahBDicFg6U3///X07XvyWXVA6ZdbjZPQ+HfvfO8l54RXynnsJo359a4oRQojDZGmo79ub/tRTFlyurrjnTeCYY3FfeAl7v/ke7zkDwl+HEEKEkGXLL19+6WDHDvN3SsOG4TtAasvPI+2Bewg2bEThLePw9u2Ht2+/sH19IYSoSZbN1J991gnAggXh68jmXPwJmad1JvnFOdhyc8P2dYUQIlwsm6kvXWpuY+zatebPILXt2U36XbeT/Obr+Fsost//BH/HzjX+dYUQItwsCfWtW20UFtro1i082xgdWzaTtPBdCsZMoHD0eCK+Y5gQQlSTJaE+e7a59HLDDd4a+xr2nTtwfvwR7iuG4j/xZHb/9BtGVlaNfT0hhIgElqypP/OMGepnnVUDSy+GQfKrL5N5SkfS77qtpAGXBLoQIg6EPdQXLjQ/HLRvH8DhCO172zdvovYFg3DdMhJ/q9bs/fwbacAlhIgrYV9+GTXKvKDEnDkhPoPU7SazX08oKiJvynTcVwyVBlxCiLgT1lA3DCgoME8dbdQoNHvT7Zs3EWx6lNmAa/rj+Fu1Idi4SUjeWwghok1Yp7Jr15pfbsyYELTY9XpJnTaZOqd0IGnea+Zdvc+WQBdCxLWwztTnzTP7pp9yyuEdIE1Y+TOuW24k4fdfcZ83GO+ZvUJRnhBCRL2wzdQNA5580tz10qlT9UM95fHHyOh7JrY9u8n57+vkPfOC7GwRQohiYQv1M89MBaB7d3/1zv3Z14CrhcJ92RVmAy7p2SKEEGXYDKPmm2n5fAHD6TT3L27cmEd6etVfa8vLJe3+ewg2amSeDRrlMjJSyc4OX7+bSCXjUELGooSMRYmsLFe1GpKHZab+44/m//v08R9SoDs/XWQ24Hr5BWwFBTVTnBBCxJCwHCgdNcr83XHttVVrC2DbvZv0O28l+e15+I9vSfac/+Jv37EmSxRCiJgQllBftcr8f48eVTtA6ti2haQPF1Iw7jYKbxkHTmcNVieEELEjLKHu89no1Knijoz2v/7EuehD3EOvxd/uJLMBV7164ShPCCFiRth2v7RvHyz/AcMg+eUXyTy1E+n33Yl9x1/m3RLoQghxyMIW6n37/numbt+4gdqDB+AaOwp/uxPZ88W3BI9oGK6ShBAi5oTtjNIOHQ5YT3e7yezfGzwe8qbNxP1/V4KtWjt4hBBCFAtLqKekGCSaHQKw/7GRYLOjzQZcjz+Fv2Urgo0ah6MMIYSIeZWGulLKDswC2gEe4Fqt9fpSjw8DRgB+YKLW+v0D36NRI8wGXDOmkfrYVPKmP4HnwkvwntU7VN+HEEIIqramPghI1lp3BW4Dpu17QCl1BDAKOAXoAzyklPpXE4BBjb4ns1d30h55CM+AQRLmQghRQ6oS6qcCiwC01suBDqUe6wQs1Vp7tNY5wHqg7YFvMOWbbtiys8mZ+wZ5T8/BqFs3BKULIYQ4UFXW1GsBOaVuB5RSCVprfzmP5QG1D3wDezBgo7wH4lRWlsvqEiKCjEMJGYsSMhaHpyoz9Vyg9CjbiwO9vMdcQHaIahNCCHGIqhLqS4F+AEqpLsDqUo99D5ymlEpWStUGWgK/hrxKIYQQVVJp691Su1/aAjZgKGbIr9dav1e8+2U45i+IB7XWb9dsyUIIIQ4mZP3UQ7H1MVZUYSxGAxcX3/xQa31f+KsMj8rGotRzPgAWaK2fDn+V4VGFn4uzgXuKb/4MjNRa1/wFDyxQhbEYB1wCBDEni/MtKTSMlFKdgcla69MPuH8AcDdmdj6vtX62ovcJZZuAw976GEMqGotjgMuAbkBXoLdS6l87hmLIQceilIlAnbBWZY2Kfi5cwCNAf611F2ATEMsNkCoaiwzMvOgK9AYes6TCMFJKTQCeA5IPuD8RmI45Dj2A4cV5elChDPXD3voYQyoai61AX611QGsdBBIBd/hLDJuKxgKl1BDM2dhH4S8t7Coai26Yx6umKaW+BnZqrf8Jf4lhU9FYFACbgbTi/w7SDTCmbADOL+f+lphL3Xu11l7gG+C0it4olKFe7tbHgzxW7tbHGHLQsdBa+7TWu5RSNqXUVGCF1nqdJVWGx0HHQinVGrgU86NlPKjo30g94AzgVuBs4BalVIsw1xdOFY0FmJOf3zGXoWaGszArFB+L9JXz0CFnZyhDXbY+lqhoLFBKJQOvFD/nhjDXFm4VjcUVQGPgc+AqYIxSqm94ywurisZiN/CD1nqH1jofWAKcGO4Cw6iisTgbaAgcDTQFBimlOoW5vkhxyNkZylCXrY8lDjoWSikbsABYpbUeobWu2uWgotdBx0JrPUFr3bn4wNCLwKNa60VWFBkmFf0b+QlorZSqVzxj7YI5U41VFY3FXqAI8Git3ZghlhH2CiPDGuA4pVQdpZQT6A4sq+gFoezSOB/opZT6luKtj0qpMZRsfZwJfI35i+Q/xX9ZseqgYwE4MA94JBXvdgC4XWtd4V9UFKvw58La0sKusn8jtwMfFz93ntY6lic+lY1FT2C5UiqIuY78qYW1hp1S6lIgXWs9u3hcPsbMzue11tsrem3ItjQKIYSwXtiufCSEEKLmSagLIUQMkVAXQogYIqEuhBAxREJdCCFiiIS6EELEEAl1IYSIIRLqQggRQ/4fnMuk3HBO0F8AAAAASUVORK5CYII=\n",
330 | "text/plain": [
331 | ""
332 | ]
333 | },
334 | "metadata": {
335 | "needs_background": "light"
336 | },
337 | "output_type": "display_data"
338 | }
339 | ],
340 | "source": [
341 | "# 默认参数模型的AUC\n",
342 | "lgb_sklearn_pre = lgb_sklearn.predict_proba(x_test)[:,1]\n",
343 | "sc.plot_roc(y_test,lgb_sklearn_pre)"
344 | ]
345 | },
346 | {
347 | "cell_type": "code",
348 | "execution_count": 6,
349 | "metadata": {},
350 | "outputs": [
351 | {
352 | "data": {
353 | "text/plain": [
354 | "{'boosting_type': 'gbdt',\n",
355 | " 'class_weight': None,\n",
356 | " 'colsample_bytree': 1.0,\n",
357 | " 'importance_type': 'split',\n",
358 | " 'learning_rate': 0.1,\n",
359 | " 'max_depth': -1,\n",
360 | " 'min_child_samples': 20,\n",
361 | " 'min_child_weight': 0.001,\n",
362 | " 'min_split_gain': 0.0,\n",
363 | " 'n_estimators': 100,\n",
364 | " 'n_jobs': -1,\n",
365 | " 'num_leaves': 31,\n",
366 | " 'objective': None,\n",
367 | " 'random_state': 0,\n",
368 | " 'reg_alpha': 0.0,\n",
369 | " 'reg_lambda': 0.0,\n",
370 | " 'silent': True,\n",
371 | " 'subsample': 1.0,\n",
372 | " 'subsample_for_bin': 200000,\n",
373 | " 'subsample_freq': 0}"
374 | ]
375 | },
376 | "execution_count": 6,
377 | "metadata": {},
378 | "output_type": "execute_result"
379 | }
380 | ],
381 | "source": [
382 | "lgb_sklearn.get_params()"
383 | ]
384 | },
385 | {
386 | "cell_type": "markdown",
387 | "metadata": {},
388 | "source": [
389 | "## 原生版本 "
390 | ]
391 | },
392 | {
393 | "cell_type": "code",
394 | "execution_count": 14,
395 | "metadata": {
396 | "scrolled": true
397 | },
398 | "outputs": [
399 | {
400 | "name": "stdout",
401 | "output_type": "stream",
402 | "text": [
403 | "[1]\tvalid_0's auc: 0.675718\n",
404 | "Training until validation scores don't improve for 10 rounds.\n",
405 | "[2]\tvalid_0's auc: 0.683763\n",
406 | "[3]\tvalid_0's auc: 0.689045\n",
407 | "[4]\tvalid_0's auc: 0.688154\n",
408 | "[5]\tvalid_0's auc: 0.692355\n",
409 | "[6]\tvalid_0's auc: 0.692386\n",
410 | "[7]\tvalid_0's auc: 0.697619\n",
411 | "[8]\tvalid_0's auc: 0.699751\n",
412 | "[9]\tvalid_0's auc: 0.70051\n",
413 | "[10]\tvalid_0's auc: 0.702275\n",
414 | "[11]\tvalid_0's auc: 0.706518\n",
415 | "[12]\tvalid_0's auc: 0.70864\n",
416 | "[13]\tvalid_0's auc: 0.713132\n",
417 | "[14]\tvalid_0's auc: 0.715673\n",
418 | "[15]\tvalid_0's auc: 0.717739\n",
419 | "[16]\tvalid_0's auc: 0.719119\n",
420 | "[17]\tvalid_0's auc: 0.72115\n",
421 | "[18]\tvalid_0's auc: 0.723824\n",
422 | "[19]\tvalid_0's auc: 0.724232\n",
423 | "[20]\tvalid_0's auc: 0.726006\n",
424 | "[21]\tvalid_0's auc: 0.726508\n",
425 | "[22]\tvalid_0's auc: 0.726892\n",
426 | "[23]\tvalid_0's auc: 0.727921\n",
427 | "[24]\tvalid_0's auc: 0.729418\n",
428 | "[25]\tvalid_0's auc: 0.73087\n",
429 | "[26]\tvalid_0's auc: 0.732294\n",
430 | "[27]\tvalid_0's auc: 0.7336\n",
431 | "[28]\tvalid_0's auc: 0.734957\n",
432 | "[29]\tvalid_0's auc: 0.736162\n",
433 | "[30]\tvalid_0's auc: 0.737107\n",
434 | "[31]\tvalid_0's auc: 0.736938\n",
435 | "[32]\tvalid_0's auc: 0.73804\n",
436 | "[33]\tvalid_0's auc: 0.737969\n",
437 | "[34]\tvalid_0's auc: 0.738373\n",
438 | "[35]\tvalid_0's auc: 0.738153\n",
439 | "[36]\tvalid_0's auc: 0.739998\n",
440 | "[37]\tvalid_0's auc: 0.739689\n",
441 | "[38]\tvalid_0's auc: 0.740843\n",
442 | "[39]\tvalid_0's auc: 0.741177\n",
443 | "[40]\tvalid_0's auc: 0.741063\n",
444 | "[41]\tvalid_0's auc: 0.740791\n",
445 | "[42]\tvalid_0's auc: 0.741013\n",
446 | "[43]\tvalid_0's auc: 0.741408\n",
447 | "[44]\tvalid_0's auc: 0.741923\n",
448 | "[45]\tvalid_0's auc: 0.741994\n",
449 | "[46]\tvalid_0's auc: 0.74203\n",
450 | "[47]\tvalid_0's auc: 0.741826\n",
451 | "[48]\tvalid_0's auc: 0.741808\n",
452 | "[49]\tvalid_0's auc: 0.741153\n",
453 | "[50]\tvalid_0's auc: 0.740779\n",
454 | "[51]\tvalid_0's auc: 0.741177\n",
455 | "[52]\tvalid_0's auc: 0.741106\n",
456 | "[53]\tvalid_0's auc: 0.741315\n",
457 | "[54]\tvalid_0's auc: 0.740231\n",
458 | "[55]\tvalid_0's auc: 0.739891\n",
459 | "[56]\tvalid_0's auc: 0.740211\n",
460 | "Early stopping, best iteration is:\n",
461 | "[46]\tvalid_0's auc: 0.74203\n",
462 | "运行时间为6.0秒\n"
463 | ]
464 | }
465 | ],
466 | "source": [
467 | "# 原生的lightgbm\n",
468 | "lgb_train = lgb.Dataset(x_train,y_train)\n",
469 | "lgb_test = lgb.Dataset(x_test,y_test,reference=lgb_train)\n",
470 | "lgb_origi_params = {'boosting_type':'gbdt',\n",
471 | " 'max_depth':-1,\n",
472 | " 'num_leaves':31,\n",
473 | " 'bagging_fraction':1.0,\n",
474 | " 'feature_fraction':1.0,\n",
475 | " 'learning_rate':0.1,\n",
476 | " 'metric': 'auc'}\n",
477 | "start = time.time()\n",
478 | "lgb_origi = lgb.train(train_set=lgb_train,\n",
479 | " early_stopping_rounds=10,\n",
480 | " num_boost_round=400,\n",
481 | " params=lgb_origi_params,\n",
482 | " valid_sets=lgb_test)\n",
483 | "end = time.time()\n",
484 | "print('运行时间为{}秒'.format(round(end-start,0)))"
485 | ]
486 | },
487 | {
488 | "cell_type": "code",
489 | "execution_count": 13,
490 | "metadata": {
491 | "scrolled": false
492 | },
493 | "outputs": [
494 | {
495 | "data": {
496 | "image/png": "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\n",
497 | "text/plain": [
498 | ""
499 | ]
500 | },
501 | "metadata": {
502 | "needs_background": "light"
503 | },
504 | "output_type": "display_data"
505 | }
506 | ],
507 | "source": [
508 | "# 原生的lightgbm的AUC\n",
509 | "lgb_origi_pre = lgb_origi.predict(x_test)\n",
510 | "sc.plot_roc(y_test,lgb_origi_pre)"
511 | ]
512 | },
513 | {
514 | "cell_type": "markdown",
515 | "metadata": {},
516 | "source": [
517 | "# 调参"
518 | ]
519 | },
520 | {
521 | "cell_type": "code",
522 | "execution_count": 18,
523 | "metadata": {},
524 | "outputs": [],
525 | "source": [
526 | "# 确定最大迭代次数,学习率设为0.1 \n",
527 | "base_parmas={'boosting_type':'gbdt',\n",
528 | " 'learning_rate':0.1,\n",
529 | " 'num_leaves':40,\n",
530 | " 'max_depth':-1,\n",
531 | " 'bagging_fraction':0.8,\n",
532 | " 'feature_fraction':0.8,\n",
533 | " 'lambda_l1':0,\n",
534 | " 'lambda_l2':0,\n",
535 | " 'min_data_in_leaf':20,\n",
536 | " 'min_sum_hessian_inleaf':0.001,\n",
537 | " 'metric':'auc'}\n",
538 | "cv_result = lgb.cv(train_set=lgb_train,\n",
539 | " num_boost_round=200,\n",
540 | " early_stopping_rounds=5,\n",
541 | " nfold=5,\n",
542 | " stratified=True,\n",
543 | " shuffle=True,\n",
544 | " params=base_parmas,\n",
545 | " metrics='auc',\n",
546 | " seed=0)"
547 | ]
548 | },
549 | {
550 | "cell_type": "code",
551 | "execution_count": 20,
552 | "metadata": {},
553 | "outputs": [
554 | {
555 | "name": "stdout",
556 | "output_type": "stream",
557 | "text": [
558 | "最大的迭代次数: 51\n",
559 | "交叉验证的AUC: 0.7271732572229754\n"
560 | ]
561 | }
562 | ],
563 | "source": [
564 | "print('最大的迭代次数: {}'.format(len(cv_result['auc-mean'])))\n",
565 | "print('交叉验证的AUC: {}'.format(max(cv_result['auc-mean'])))"
566 | ]
567 | },
568 | {
569 | "cell_type": "code",
570 | "execution_count": 24,
571 | "metadata": {},
572 | "outputs": [
573 | {
574 | "name": "stdout",
575 | "output_type": "stream",
576 | "text": [
577 | "运行时间为:109.0\n"
578 | ]
579 | }
580 | ],
581 | "source": [
582 | "# num_leaves ,步长设为5\n",
583 | "param_find1 = {'num_leaves':range(30,60,5)}\n",
584 | "cv_fold = StratifiedKFold(n_splits=5,random_state=0,shuffle=True)\n",
585 | "start = time.time()\n",
586 | "grid_search1 = GridSearchCV(estimator=lgb.LGBMClassifier(learning_rate=0.1,\n",
587 | " n_estimators = 51,\n",
588 | " max_depth=-1,\n",
589 | " min_child_weight=0.001,\n",
590 | " min_child_samples=20,\n",
591 | " subsample=0.8,\n",
592 | " colsample_bytree=0.8,\n",
593 | " reg_lambda=0,\n",
594 | " reg_alpha=0),\n",
595 | " cv = cv_fold,\n",
596 | " n_jobs=-1,\n",
597 | " param_grid = param_find1,\n",
598 | " scoring='roc_auc')\n",
599 | "grid_search1.fit(x_train,y_train)\n",
600 | "end = time.time()\n",
601 | "print('运行时间为:{}'.format(round(end-start,0)))"
602 | ]
603 | },
604 | {
605 | "cell_type": "code",
606 | "execution_count": 29,
607 | "metadata": {},
608 | "outputs": [
609 | {
610 | "name": "stdout",
611 | "output_type": "stream",
612 | "text": [
613 | "[mean: 0.73008, std: 0.01408, params: {'num_leaves': 30}, mean: 0.72994, std: 0.01638, params: {'num_leaves': 35}, mean: 0.72868, std: 0.01652, params: {'num_leaves': 40}, mean: 0.72776, std: 0.01038, params: {'num_leaves': 45}, mean: 0.72917, std: 0.01601, params: {'num_leaves': 50}, mean: 0.72519, std: 0.01338, params: {'num_leaves': 55}]\n",
614 | "\t\n",
615 | "{'num_leaves': 30}\n",
616 | "\t\n",
617 | "0.7300782078536177\n"
618 | ]
619 | }
620 | ],
621 | "source": [
622 | "print(grid_search1.grid_scores_)\n",
623 | "print('\\t')\n",
624 | "print(grid_search1.best_params_)\n",
625 | "print('\\t')\n",
626 | "print(grid_search1.best_score_)"
627 | ]
628 | },
629 | {
630 | "cell_type": "code",
631 | "execution_count": 30,
632 | "metadata": {},
633 | "outputs": [
634 | {
635 | "name": "stdout",
636 | "output_type": "stream",
637 | "text": [
638 | "[mean: 0.73327, std: 0.01248, params: {'num_leaves': 26}, mean: 0.73188, std: 0.01426, params: {'num_leaves': 28}, mean: 0.73355, std: 0.01589, params: {'num_leaves': 30}, mean: 0.73318, std: 0.01272, params: {'num_leaves': 32}]\n",
639 | "\t\n",
640 | "{'num_leaves': 30}\n",
641 | "\t\n",
642 | "0.733552244998121\n"
643 | ]
644 | }
645 | ],
646 | "source": [
647 | "# num_leaves,步长设为2 \n",
648 | "param_find2 = {'num_leaves':range(26,34,2)}\n",
649 | "grid_search2 = GridSearchCV(estimator=lgb.LGBMClassifier(estimator=51,\n",
650 | " learning_rate=0.1,\n",
651 | " min_child_weight=0.001,\n",
652 | " min_child_samples=20,\n",
653 | " subsample=0.8,\n",
654 | " colsample_bytree=0.8,\n",
655 | " reg_lambda=0,\n",
656 | " reg_alpha=0\n",
657 | " ),\n",
658 | " cv=cv_fold,\n",
659 | " n_jobs=-1,\n",
660 | " scoring='roc_auc',\n",
661 | " param_grid = param_find2)\n",
662 | "grid_search2.fit(x_train,y_train)\n",
663 | "print(grid_search2.grid_scores_)\n",
664 | "print('\\t')\n",
665 | "print(grid_search2.best_params_)\n",
666 | "print('\\t')\n",
667 | "print(grid_search2.best_score_)"
668 | ]
669 | },
670 | {
671 | "cell_type": "code",
672 | "execution_count": 36,
673 | "metadata": {},
674 | "outputs": [
675 | {
676 | "name": "stdout",
677 | "output_type": "stream",
678 | "text": [
679 | "运行时间:312.0 秒\n",
680 | "[mean: 0.73155, std: 0.01112, params: {'min_child_samples': 15, 'min_child_weight': 0.001}, mean: 0.73155, std: 0.01112, params: {'min_child_samples': 15, 'min_child_weight': 0.002}, mean: 0.73155, std: 0.01112, params: {'min_child_samples': 15, 'min_child_weight': 0.003}, mean: 0.73355, std: 0.01589, params: {'min_child_samples': 20, 'min_child_weight': 0.001}, mean: 0.73355, std: 0.01589, params: {'min_child_samples': 20, 'min_child_weight': 0.002}, mean: 0.73355, std: 0.01589, params: {'min_child_samples': 20, 'min_child_weight': 0.003}, mean: 0.73206, std: 0.01434, params: {'min_child_samples': 25, 'min_child_weight': 0.001}, mean: 0.73206, std: 0.01434, params: {'min_child_samples': 25, 'min_child_weight': 0.002}, mean: 0.73206, std: 0.01434, params: {'min_child_samples': 25, 'min_child_weight': 0.003}, mean: 0.73210, std: 0.01145, params: {'min_child_samples': 30, 'min_child_weight': 0.001}, mean: 0.73210, std: 0.01145, params: {'min_child_samples': 30, 'min_child_weight': 0.002}, mean: 0.73210, std: 0.01145, params: {'min_child_samples': 30, 'min_child_weight': 0.003}]\n",
681 | "\t\n",
682 | "{'min_child_samples': 20, 'min_child_weight': 0.001}\n",
683 | "\t\n",
684 | "0.733552244998121\n"
685 | ]
686 | }
687 | ],
688 | "source": [
689 | "# 确定num_leaves 为30 ,下面进行min_child_samples 和 min_child_weight的调参,设定步长为5\n",
690 | "param_find3 = {'min_child_samples':range(15,35,5),\n",
691 | " 'min_child_weight':[x/1000 for x in range(1,4,1)]}\n",
692 | "grid_search3 = GridSearchCV(estimator=lgb.LGBMClassifier(estimator=51,\n",
693 | " learning_rate=0.1,\n",
694 | " num_leaves=30,\n",
695 | " subsample=0.8,\n",
696 | " colsample_bytree=0.8,\n",
697 | " reg_lambda=0,\n",
698 | " reg_alpha=0\n",
699 | " ),\n",
700 | " cv=cv_fold,\n",
701 | " scoring='roc_auc',\n",
702 | " param_grid = param_find3,\n",
703 | " n_jobs=-1)\n",
704 | "start = time.time()\n",
705 | "grid_search3.fit(x_train,y_train)\n",
706 | "end = time.time()\n",
707 | "print('运行时间:{} 秒'.format(round(end-start,0)))\n",
708 | "print(grid_search3.grid_scores_)\n",
709 | "print('\\t')\n",
710 | "print(grid_search3.best_params_)\n",
711 | "print('\\t')\n",
712 | "print(grid_search3.best_score_)"
713 | ]
714 | },
715 | {
716 | "cell_type": "code",
717 | "execution_count": 37,
718 | "metadata": {},
719 | "outputs": [
720 | {
721 | "name": "stdout",
722 | "output_type": "stream",
723 | "text": [
724 | "运行时间:826.0 秒\n",
725 | "[mean: 0.73467, std: 0.01475, params: {'colsample_bytree': 0.5, 'subsample': 0.5}, mean: 0.73467, std: 0.01475, params: {'colsample_bytree': 0.5, 'subsample': 0.6}, mean: 0.73467, std: 0.01475, params: {'colsample_bytree': 0.5, 'subsample': 0.7}, mean: 0.73467, std: 0.01475, params: {'colsample_bytree': 0.5, 'subsample': 0.8}, mean: 0.73467, std: 0.01475, params: {'colsample_bytree': 0.5, 'subsample': 0.9}, mean: 0.73467, std: 0.01475, params: {'colsample_bytree': 0.5, 'subsample': 1.0}, mean: 0.73500, std: 0.01559, params: {'colsample_bytree': 0.6, 'subsample': 0.5}, mean: 0.73500, std: 0.01559, params: {'colsample_bytree': 0.6, 'subsample': 0.6}, mean: 0.73500, std: 0.01559, params: {'colsample_bytree': 0.6, 'subsample': 0.7}, mean: 0.73500, std: 0.01559, params: {'colsample_bytree': 0.6, 'subsample': 0.8}, mean: 0.73500, std: 0.01559, params: {'colsample_bytree': 0.6, 'subsample': 0.9}, mean: 0.73500, std: 0.01559, params: {'colsample_bytree': 0.6, 'subsample': 1.0}, mean: 0.73053, std: 0.01389, params: {'colsample_bytree': 0.7, 'subsample': 0.5}, mean: 0.73053, std: 0.01389, params: {'colsample_bytree': 0.7, 'subsample': 0.6}, mean: 0.73053, std: 0.01389, params: {'colsample_bytree': 0.7, 'subsample': 0.7}, mean: 0.73053, std: 0.01389, params: {'colsample_bytree': 0.7, 'subsample': 0.8}, mean: 0.73053, std: 0.01389, params: {'colsample_bytree': 0.7, 'subsample': 0.9}, mean: 0.73053, std: 0.01389, params: {'colsample_bytree': 0.7, 'subsample': 1.0}, mean: 0.73355, std: 0.01589, params: {'colsample_bytree': 0.8, 'subsample': 0.5}, mean: 0.73355, std: 0.01589, params: {'colsample_bytree': 0.8, 'subsample': 0.6}, mean: 0.73355, std: 0.01589, params: {'colsample_bytree': 0.8, 'subsample': 0.7}, mean: 0.73355, std: 0.01589, params: {'colsample_bytree': 0.8, 'subsample': 0.8}, mean: 0.73355, std: 0.01589, params: {'colsample_bytree': 0.8, 'subsample': 0.9}, mean: 0.73355, std: 0.01589, params: {'colsample_bytree': 0.8, 'subsample': 1.0}, mean: 0.73304, std: 0.01103, params: {'colsample_bytree': 0.9, 'subsample': 0.5}, mean: 0.73304, std: 0.01103, params: {'colsample_bytree': 0.9, 'subsample': 0.6}, mean: 0.73304, std: 0.01103, params: {'colsample_bytree': 0.9, 'subsample': 0.7}, mean: 0.73304, std: 0.01103, params: {'colsample_bytree': 0.9, 'subsample': 0.8}, mean: 0.73304, std: 0.01103, params: {'colsample_bytree': 0.9, 'subsample': 0.9}, mean: 0.73304, std: 0.01103, params: {'colsample_bytree': 0.9, 'subsample': 1.0}, mean: 0.73427, std: 0.01462, params: {'colsample_bytree': 1.0, 'subsample': 0.5}, mean: 0.73427, std: 0.01462, params: {'colsample_bytree': 1.0, 'subsample': 0.6}, mean: 0.73427, std: 0.01462, params: {'colsample_bytree': 1.0, 'subsample': 0.7}, mean: 0.73427, std: 0.01462, params: {'colsample_bytree': 1.0, 'subsample': 0.8}, mean: 0.73427, std: 0.01462, params: {'colsample_bytree': 1.0, 'subsample': 0.9}, mean: 0.73427, std: 0.01462, params: {'colsample_bytree': 1.0, 'subsample': 1.0}]\n",
726 | "\t\n",
727 | "{'colsample_bytree': 0.6, 'subsample': 0.5}\n",
728 | "\t\n",
729 | "0.7349957573843382\n"
730 | ]
731 | }
732 | ],
733 | "source": [
734 | "# 确定min_child_weight为0.001,min_child_samples为20,下面对subsample和colsample_bytree进行调参\n",
735 | "param_find4 = {'subsample':[x/10 for x in range(5,11,1)],\n",
736 | " 'colsample_bytree':[x/10 for x in range(5,11,1)]}\n",
737 | "grid_search4 = GridSearchCV(estimator=lgb.LGBMClassifier(estimator=51,\n",
738 | " learning_rate=0.1,\n",
739 | " min_child_samples=20,\n",
740 | " min_child_weight=0.001,\n",
741 | " num_leaves=30,\n",
742 | " subsample=0.8,\n",
743 | " colsample_bytree=0.8,\n",
744 | " reg_lambda=0,\n",
745 | " reg_alpha=0\n",
746 | " ),\n",
747 | " cv=cv_fold,\n",
748 | " scoring='roc_auc',\n",
749 | " param_grid = param_find4,\n",
750 | " n_jobs=-1)\n",
751 | "start = time.time()\n",
752 | "grid_search4.fit(x_train,y_train)\n",
753 | "end = time.time()\n",
754 | "print('运行时间:{} 秒'.format(round(end-start,0)))\n",
755 | "print(grid_search4.grid_scores_)\n",
756 | "print('\\t')\n",
757 | "print(grid_search4.best_params_)\n",
758 | "print('\\t')\n",
759 | "print(grid_search4.best_score_)"
760 | ]
761 | },
762 | {
763 | "cell_type": "code",
764 | "execution_count": 39,
765 | "metadata": {},
766 | "outputs": [
767 | {
768 | "name": "stdout",
769 | "output_type": "stream",
770 | "text": [
771 | "运行时间:692.0 秒\n",
772 | "[mean: 0.73386, std: 0.01566, params: {'reg_alpha': 0.001, 'reg_lambda': 0.001}, mean: 0.73284, std: 0.01099, params: {'reg_alpha': 0.001, 'reg_lambda': 0.01}, mean: 0.73024, std: 0.01294, params: {'reg_alpha': 0.001, 'reg_lambda': 0.03}, mean: 0.73565, std: 0.01237, params: {'reg_alpha': 0.001, 'reg_lambda': 0.08}, mean: 0.73300, std: 0.01580, params: {'reg_alpha': 0.001, 'reg_lambda': 0.1}, mean: 0.73713, std: 0.01489, params: {'reg_alpha': 0.001, 'reg_lambda': 0.3}, mean: 0.73173, std: 0.01727, params: {'reg_alpha': 0.01, 'reg_lambda': 0.001}, mean: 0.73586, std: 0.01282, params: {'reg_alpha': 0.01, 'reg_lambda': 0.01}, mean: 0.73424, std: 0.01136, params: {'reg_alpha': 0.01, 'reg_lambda': 0.03}, mean: 0.73601, std: 0.01579, params: {'reg_alpha': 0.01, 'reg_lambda': 0.08}, mean: 0.73688, std: 0.01218, params: {'reg_alpha': 0.01, 'reg_lambda': 0.1}, mean: 0.73459, std: 0.01598, params: {'reg_alpha': 0.01, 'reg_lambda': 0.3}, mean: 0.73395, std: 0.01492, params: {'reg_alpha': 0.03, 'reg_lambda': 0.001}, mean: 0.73688, std: 0.01137, params: {'reg_alpha': 0.03, 'reg_lambda': 0.01}, mean: 0.73430, std: 0.01592, params: {'reg_alpha': 0.03, 'reg_lambda': 0.03}, mean: 0.73501, std: 0.01268, params: {'reg_alpha': 0.03, 'reg_lambda': 0.08}, mean: 0.73462, std: 0.01437, params: {'reg_alpha': 0.03, 'reg_lambda': 0.1}, mean: 0.73890, std: 0.01465, params: {'reg_alpha': 0.03, 'reg_lambda': 0.3}, mean: 0.73408, std: 0.01293, params: {'reg_alpha': 0.08, 'reg_lambda': 0.001}, mean: 0.73217, std: 0.01456, params: {'reg_alpha': 0.08, 'reg_lambda': 0.01}, mean: 0.73468, std: 0.01092, params: {'reg_alpha': 0.08, 'reg_lambda': 0.03}, mean: 0.73542, std: 0.01050, params: {'reg_alpha': 0.08, 'reg_lambda': 0.08}, mean: 0.73603, std: 0.01564, params: {'reg_alpha': 0.08, 'reg_lambda': 0.1}, mean: 0.73706, std: 0.01759, params: {'reg_alpha': 0.08, 'reg_lambda': 0.3}, mean: 0.72988, std: 0.01310, params: {'reg_alpha': 0.1, 'reg_lambda': 0.001}, mean: 0.73350, std: 0.01248, params: {'reg_alpha': 0.1, 'reg_lambda': 0.01}, mean: 0.73526, std: 0.01280, params: {'reg_alpha': 0.1, 'reg_lambda': 0.03}, mean: 0.73386, std: 0.01461, params: {'reg_alpha': 0.1, 'reg_lambda': 0.08}, mean: 0.73635, std: 0.01596, params: {'reg_alpha': 0.1, 'reg_lambda': 0.1}, mean: 0.73542, std: 0.01512, params: {'reg_alpha': 0.1, 'reg_lambda': 0.3}, mean: 0.73620, std: 0.00951, params: {'reg_alpha': 0.3, 'reg_lambda': 0.001}, mean: 0.73713, std: 0.01541, params: {'reg_alpha': 0.3, 'reg_lambda': 0.01}, mean: 0.73943, std: 0.01238, params: {'reg_alpha': 0.3, 'reg_lambda': 0.03}, mean: 0.73593, std: 0.01351, params: {'reg_alpha': 0.3, 'reg_lambda': 0.08}, mean: 0.73402, std: 0.01277, params: {'reg_alpha': 0.3, 'reg_lambda': 0.1}, mean: 0.73655, std: 0.00920, params: {'reg_alpha': 0.3, 'reg_lambda': 0.3}]\n",
773 | "\t\n",
774 | "{'reg_alpha': 0.3, 'reg_lambda': 0.03}\n",
775 | "\t\n",
776 | "0.739431056578461\n"
777 | ]
778 | }
779 | ],
780 | "source": [
781 | "param_find5 = {'reg_lambda':[0.001,0.01,0.03,0.08,0.1,0.3],\n",
782 | " 'reg_alpha':[0.001,0.01,0.03,0.08,0.1,0.3]}\n",
783 | "grid_search5 = GridSearchCV(estimator=lgb.LGBMClassifier(estimator=51,\n",
784 | " learning_rate=0.1,\n",
785 | " min_child_samples=20,\n",
786 | " min_child_weight=0.001,\n",
787 | " num_leaves=30,\n",
788 | " subsample=0.5,\n",
789 | " colsample_bytree=0.6,\n",
790 | " ),\n",
791 | " cv=cv_fold,\n",
792 | " scoring='roc_auc',\n",
793 | " param_grid = param_find5,\n",
794 | " n_jobs=-1)\n",
795 | "start = time.time()\n",
796 | "grid_search5.fit(x_train,y_train)\n",
797 | "end = time.time()\n",
798 | "print('运行时间:{} 秒'.format(round(end-start,0)))\n",
799 | "print(grid_search5.grid_scores_)\n",
800 | "print('\\t')\n",
801 | "print(grid_search5.best_params_)\n",
802 | "print('\\t')\n",
803 | "print(grid_search5.best_score_)"
804 | ]
805 | },
806 | {
807 | "cell_type": "code",
808 | "execution_count": 44,
809 | "metadata": {},
810 | "outputs": [],
811 | "source": [
812 | "# 将最佳参数再次带入cv函数,设定学习率为0.005\n",
813 | "best_params = {\n",
814 | " 'boosting_type':'gbdt',\n",
815 | " 'learning_rate':0.005,\n",
816 | " 'num_leaves':30,\n",
817 | " 'max_depth':-1,\n",
818 | " 'bagging_fraction':0.5,\n",
819 | " 'feature_fraction':0.6,\n",
820 | " 'min_data_in_leaf':20,\n",
821 | " 'min_sum_hessian_in_leaf':0.001,\n",
822 | " 'lambda_l1':0.3,\n",
823 | " 'lambda_l2':0.03,\n",
824 | " 'metric':'auc'\n",
825 | "}\n",
826 | "\n",
827 | "best_cv = lgb.cv(train_set=lgb_train,\n",
828 | " early_stopping_rounds=5,\n",
829 | " num_boost_round=2000,\n",
830 | " nfold=5,\n",
831 | " params=best_params,\n",
832 | " metrics='auc',\n",
833 | " stratified=True,\n",
834 | " shuffle=True,\n",
835 | " seed=0)"
836 | ]
837 | },
838 | {
839 | "cell_type": "code",
840 | "execution_count": 50,
841 | "metadata": {
842 | "scrolled": true
843 | },
844 | "outputs": [
845 | {
846 | "name": "stdout",
847 | "output_type": "stream",
848 | "text": [
849 | "最佳参数的迭代次数: 889\n",
850 | "交叉验证的AUC: 0.7357671213094057\n"
851 | ]
852 | }
853 | ],
854 | "source": [
855 | "print('最佳参数的迭代次数: {}'.format(len(best_cv['auc-mean'])))\n",
856 | "print('交叉验证的AUC: {}'.format(max(best_cv['auc-mean'])))"
857 | ]
858 | },
859 | {
860 | "cell_type": "code",
861 | "execution_count": 61,
862 | "metadata": {},
863 | "outputs": [
864 | {
865 | "data": {
866 | "text/plain": [
867 | "LGBMClassifier(boosting_type='gbdt', class_weight=None, colsample_bytree=0.6,\n",
868 | " importance_type='split', learning_rate=0.005, max_depth=-1,\n",
869 | " min_child_samples=20, min_child_weight=0.001, min_split_gain=0.0,\n",
870 | " n_estimators=900, n_jobs=-1, num_leaves=30, objective=None,\n",
871 | " random_state=0, reg_alpha=0.3, reg_lambda=0.03, silent=True,\n",
872 | " subsample=0.5, subsample_for_bin=200000, subsample_freq=0)"
873 | ]
874 | },
875 | "execution_count": 61,
876 | "metadata": {},
877 | "output_type": "execute_result"
878 | }
879 | ],
880 | "source": [
881 | "lgb_single_model = lgb.LGBMClassifier(n_estimators=900,\n",
882 | " learning_rate=0.005,\n",
883 | " min_child_weight=0.001,\n",
884 | " min_child_samples = 20,\n",
885 | " subsample=0.5,\n",
886 | " colsample_bytree=0.6,\n",
887 | " num_leaves=30,\n",
888 | " max_depth=-1,\n",
889 | " reg_lambda=0.03,\n",
890 | " reg_alpha=0.3,\n",
891 | " random_state=0)\n",
892 | "lgb_single_model.fit(x_train,y_train)"
893 | ]
894 | },
895 | {
896 | "cell_type": "code",
897 | "execution_count": 64,
898 | "metadata": {},
899 | "outputs": [
900 | {
901 | "name": "stdout",
902 | "output_type": "stream",
903 | "text": [
904 | "lightgbm单模型的AUC:0.7535371506640257\n"
905 | ]
906 | },
907 | {
908 | "data": {
909 | "image/png": "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\n",
910 | "text/plain": [
911 | ""
912 | ]
913 | },
914 | "metadata": {},
915 | "output_type": "display_data"
916 | }
917 | ],
918 | "source": [
919 | "pre = lgb_single_model.predict_proba(x_test)[:,1]\n",
920 | "print('lightgbm单模型的AUC:{}'.format(metrics.roc_auc_score(y_test,pre)))\n",
921 | "sc.plot_roc(y_test,pre)"
922 | ]
923 | }
924 | ],
925 | "metadata": {
926 | "kernelspec": {
927 | "display_name": "Python 3",
928 | "language": "python",
929 | "name": "python3"
930 | },
931 | "language_info": {
932 | "codemirror_mode": {
933 | "name": "ipython",
934 | "version": 3
935 | },
936 | "file_extension": ".py",
937 | "mimetype": "text/x-python",
938 | "name": "python",
939 | "nbconvert_exporter": "python",
940 | "pygments_lexer": "ipython3",
941 | "version": "3.7.0"
942 | },
943 | "toc": {
944 | "base_numbering": 1,
945 | "nav_menu": {},
946 | "number_sections": true,
947 | "sideBar": true,
948 | "skip_h1_title": false,
949 | "title_cell": "Table of Contents",
950 | "title_sidebar": "Contents",
951 | "toc_cell": false,
952 | "toc_position": {},
953 | "toc_section_display": true,
954 | "toc_window_display": false
955 | }
956 | },
957 | "nbformat": 4,
958 | "nbformat_minor": 2
959 | }
960 |
--------------------------------------------------------------------------------