├── 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 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | "
IdxUserInfo_1UserInfo_2UserInfo_3UserInfo_4WeblogInfo_1WeblogInfo_2WeblogInfo_3WeblogInfo_4WeblogInfo_5...SocialNetwork_11SocialNetwork_12SocialNetwork_13SocialNetwork_14SocialNetwork_15SocialNetwork_16SocialNetwork_17targetListingInfosample_status
0100011.000深圳4.000深圳nan1.000nan1.0001.000...-100000102014-3-5train
1100021.000温州4.000温州nan0.000nan1.0001.000...-100000202014-2-26train
2100031.000宜昌3.000宜昌nan0.000nan2.0002.000...-1-11000002014-2-28train
3100064.000南平1.000南平nannannannannan...-1-10000002014-2-25train
4100075.000辽阳1.000辽阳nan0.000nan1.0001.000...-1-10000002014-2-27train
\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 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | "
UserInfo_1UserInfo_3WeblogInfo_2WeblogInfo_4WeblogInfo_5WeblogInfo_6WeblogInfo_7WeblogInfo_8WeblogInfo_15WeblogInfo_16..._mobilephone_qq_realname_turnoverupdate_time_cntupdate_all_cntlog_cntlog_timespanavg_log_timespanIdx
01.0004.0001.0001.0001.0001.00014.0000.0006.0000.000...1.0001.0000.0000.0001.00011.00019.0001.0000.63210001.000
11.0004.0000.0001.0001.0001.00014.0000.0000.0007.000...2.0001.0001.0000.0003.00021.00024.0001.00010.37510002.000
21.0003.0000.0002.0002.0002.0009.0003.0000.0003.000...1.0001.0000.0000.0001.00010.00014.0001.0000.50010003.000
34.0001.000nannannannan2.0000.0000.0000.000...1.0001.0000.0000.0001.00010.0007.0005.0000.00010006.000
45.0001.0000.0001.0001.0001.0003.0000.0000.0000.000...1.0001.0000.0000.0002.00010.0005.0000.0001.40010007.000
\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": "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\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 | --------------------------------------------------------------------------------