kaggle竞赛实战7——其他方案之lightgbm

本文换种方案,用wrapper+lightgbm建模+TPE调优

接下来是特征筛选过程,此处先择使用Wrapper方法进行特征筛选,通过带入全部数据训练一个LightGBM模型,然后通过观察特征重要性,选取最重要的300个特征。当然,为了进一步确保挑选过程的有效性,此处我们考虑使用交叉验证的方法来进行多轮验证。实际多轮验证特征重要性的过程也较为清晰,我们只需要记录每一轮特征重要性,并在最后进行简单汇总即可。我们可以通过定义如下函数完成该过程:

          # Part 1.划分特征名称,删除ID列和标签列 
          print('feature_select_wrapper...') 
          label = 'target' 
          features = train.columns.tolist() 
          features.remove('card_id') 
          features.remove('target')


          # Step 2.配置lgb参数 
          # 模型参数 
          params_initial = { 
              'num_leaves': 31, 
              'learning_rate': 0.1, 
              'boosting': 'gbdt', 
              'min_child_samples': 20, 
              'bagging_seed': 2020, 
              'bagging_fraction': 0.7, 
              'bagging_freq': 1, 
              'feature_fraction': 0.7, 
              'max_depth': -1, 
              'metric': 'rmse', 
              'reg_alpha': 0, 
              'reg_lambda': 1, 
              'objective': 'regression' 
          } 


          # 控制参数 
          # 提前验证迭代效果或停止 
          ESR = 30 
          # 迭代次数 
          NBR = 10000 
          # 打印间隔 
          VBE = 50 

import lightgbm as lgb

 # 实例化评估器 
          kf = KFold(n_splits=5, random_state=2020, shuffle=True) 
          # 创建空容器 
          fse = pd.Series(0, index=features) 

 for train_part_index, eval_index in kf.split(train[features], train[label]): 
              # 封装训练数据集 
              train_part = lgb.Dataset(train[features].loc[train_part_index], 
                                       train[label].loc[train_part_index]) 
              # 封装验证数据集 
              eval = lgb.Dataset(train[features].loc[eval_index], 
                                 train[label].loc[eval_index]) 
              # 在训练集上进行训练,并同时进行验证 
              bst = lgb.train(params_initial, train_part, num_boost_round=NBR, 
                              valid_sets=[train_part, eval], 
                              valid_names=['train', 'valid'], 
                              early_stopping_rounds=ESR, verbose_eval=VBE) 
              # 输出特征重要性计算结果,并进行累加 
              fse += pd.Series(bst.feature_importance(), features) 
           
          # Part 4.选择最重要的300个特征 
          feature_select = ['card_id'] + fse.sort_values(ascending=False).index.tolist()[:300] 
          print('done') 
          return train[feature_select + ['target']], test[feature_select]  

最后调用该函数

 train_LGBM, test_LGBM = feature_select_wrapper(train, test) 

part4:使用lightgbm训练,先做超参数搜索

首先设置一部分参数不变,防止后续它被设置为默认值

 def params_append(params): 

         params['feature_pre_filter'] = False 
          params['objective'] = 'regression' 
          params['metric'] = 'rmse' 
          params['bagging_seed'] = 2020 
          return params  

接着进行模型训练

          # Part 1.划分特征名称,删除ID列和标签列 
          label = 'target' 
          features = train.columns.tolist() 
          features.remove('card_id') 
          features.remove('target') 
           
          # Part 2.封装训练数据 
          train_data = lgb.Dataset(train[features], train[label]) 


          # Part 3.内部函数,输入模型超参数输出损失值的函数 
          def hyperopt_objective(params): 

              # 创建参数集 
              params = params_append(params) 
              print(params) 

               # 借助lgb的cv过程,输出某一组超参数下损失值的最小值 

             res = lgb.cv(params, train_data, 1000, 
                           nfold=2, 
                           stratified=False, 
                           shuffle=True, 
                           metrics='rmse', 
                           early_stopping_rounds=20, 
                           verbose_eval=False, 
                           show_stdv=False, 
                           seed=2020)#cv是lgb自带的交叉熵过程

             return min(res['rmse-mean'])

#接下来开始搜索参数

params_space = { 
              'learning_rate': hp.uniform('learning_rate', 1e-2, 5e-1), 
              'bagging_fraction': hp.uniform('bagging_fraction', 0.5, 1), 
              'feature_fraction': hp.uniform('feature_fraction', 0.5, 1), 
              'num_leaves': hp.choice('num_leaves', list(range(10, 300, 10))), 
              'reg_alpha': hp.randint('reg_alpha', 0, 10), 
              'reg_lambda': hp.uniform('reg_lambda', 0, 10), 
              'bagging_freq': hp.randint('bagging_freq', 1, 10), 
              'min_child_samples': hp.choice('min_child_samples', list(range(1, 30, 5))) 
          } #uniform表示是连续空间

          # Part 5.TPE超参数搜索 

params_best = fmin( 
              hyperopt_objective, #目标函数
              space=params_space, 
              algo=tpe.suggest, #搜索算法
              max_evals=30,
              rstate=RandomState(2020)) 

带入训练数据测试函数性能

  best_clf = param_hyperopt(train_LGBM)  

得到左优参数 best_clf

 {'bagging_fraction': 0.9022336069269954, 
          'bagging_freq': 2, 
          'feature_fraction': 0.9373662317255621, 
          'learning_rate': 0.014947332175194025, 
          'min_child_samples': 5, 
          'num_leaves': 7, 
          'reg_alpha': 2, 
          'reg_lambda': 3.5907566887206896}  

part5 正式进入训练部分

 # 数据准备过程 
      label = 'target' 
      features = train_LGBM.columns.tolist() 
      features.remove('card_id') 
      features.remove('target') 
       
      # 数据封装 
      lgb_train = lgb.Dataset(train_LGBM[features], train_LGBM[label])  

    # 在全部数据集上训练模型 
      bst = lgb.train(best_clf, lgb_train)  

   # 在测试集上完成预测 
      bst.predict(train_LGBM[features])  

    # 简单查看训练集RMSE 
      np.sqrt(mean_squared_error(train_LGBM[label], bst.predict(train_LGBM[features])))  

#  接下来,对测试集进行预测,并将结果写入本地文件  

 test_LGBM['target'] = bst.predict(test_LGBM[features]) 
      test_LGBM[['card_id', 'target']].to_csv(\  result/submission_LGBM.csv\  , index=False)  

提交到kaggle发现结果不如随机森林,决定再用交叉验证进行均值集成

def train_predict(train, test, params): 

         label = 'target' 
          features = train.columns.tolist() 
          features.remove('card_id') 
          features.remove('target') 


          # Part 2.再次申明固定参数与控制迭代参数 
          params = params_append(params) 
          ESR = 30 
          NBR = 10000 
          VBE = 50 
           
          # Part 3.创建结果存储容器 
          # 测试集预测结果存储器,后保存至本地文件 
          prediction_test = 0 
          # 验证集的模型表现,作为展示用 
          cv_score = [] 
          # 验证集的预测结果存储器,后保存至本地文件 
          prediction_train = pd.Series() 
           
          # Part 3.交叉验证 
          kf = KFold(n_splits=5, random_state=2020, shuffle=True) 
          for train_part_index, eval_index in kf.split(train[features], train[label]): 
              # 训练数据封装 
              train_part = lgb.Dataset(train[features].loc[train_part_index], 
                                       train[label].loc[train_part_index]) 
              # 测试数据封装 
              eval = lgb.Dataset(train[features].loc[eval_index], 
                                 train[label].loc[eval_index]) 
              # 依据验证集训练模型 
              bst = lgb.train(params, train_part, num_boost_round=NBR, 
                              valid_sets=[train_part, eval], 
                              valid_names=['train', 'valid'], 
                              early_stopping_rounds=ESR, verbose_eval=VBE) 
              # 测试集预测结果并纳入prediction_test容器 
              prediction_test += bst.predict(test[features]) 
              # 验证集预测结果并纳入prediction_train容器 
              prediction_train = prediction_train.append(pd.Series(bst.predict(train[features].loc[eval_index]), 
                                                                   index=eval_index)) 
              # 验证集预测结果 
              eval_pre = bst.predict(train[features].loc[eval_index]) 
              # 计算验证集上得分 
              score = np.sqrt(mean_squared_error(train[label].loc[eval_index].values, eval_pre)) 
              # 纳入cv_score容器 
              cv_score.append(score) 
               
          # Part 4.打印/输出结果 
          # 打印验证集得分与平均得分 
          print(cv_score, sum(cv_score) / 5) 
          # 将验证集上预测结果写入本地文件 
          pd.Series(prediction_train.sort_index().values).to_csv(\  preprocess/train_lightgbm.csv\  , index=False) 
          # 将测试集上预测结果写入本地文件 
          pd.Series(prediction_test / 5).to_csv(\  preprocess/test_lightgbm.csv\  , index=False) 
          # 测试集平均得分作为模型最终预测结果 
          test['target'] = prediction_test / 5 
          # 将测试集预测结果写成竞赛要求格式并保存至本地 
          test[['card_id', 'target']].to_csv(\  result/submission_lightgbm.csv\  , index=False) 
          return  ]

最后去算得分

 train_LGBM, test_LGBM = feature_select_wrapper(train, test) 
      best_clf = param_hyperopt(train_LGBM) 
      train_predict(train_LGBM, test_LGBM, best_clf)  

发现分比之前都有提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.00002 Postgresql的内存管理-一条sql执行过程中的内存上下文是怎么样的?

文章目录 调试前动作调试步骤总结一条sql的内存上下文复杂查询简单查询调试前动作 1、后台启动postgresql -D x 2、使用客户端登录psql,且执行\d+ 3、此时查看进程 ps ux [db_postg@iZ2ze5nkcqlxobs6vm854iZ ~]$ ps ux USER PID %CPU %MEM VSZ RSS TTY STA…

PTA 7-4 按层遍历二叉树

用先序和中序序列构造一棵二叉树(树中结点个数不超过10个),通过用队记录结点访问次序的方法实现对二叉树进行按层遍历,即按层数由小到大、同层由左到右输出按层遍历序列。 输入格式: 第一行输入元素个数 第二行输入先序序列&am…

撸广告小游戏开发app源码搭建

开发一个基于观看广告赚钱的小游戏App,源码搭建的过程会涉及到多个方面,包括游戏设计、广告集成、用户奖励机制、后端服务搭建等。以下是一个大致的开发流程和考虑点: 游戏设计与规划 确定游戏类型:选择适合观看广告赚钱的游戏类…

STM32(十):SPI (标准库函数)

前言 上一篇文章已经介绍了如何用STM32单片机中USART通信协议来串口通信,并向XCOM串口助手发送信息。这篇文章我们来介绍一下如何用STM32单片机中SPI接口来实现LED的闪亮并玩转WS2812B灯带。 一、实验原理 串行通信之前的博客里有所介绍,可以查看以下…

Web Components与框架集成:Vue React案例分析

一直以来,都梦想着打造一个完全自定义、可复用且跨框架的UI组件库,让我的项目开发变得更加高效。在一次偶然的机会下,我接触到了Web Components,一种原生的Web API,它允许我们创建自定义的HTML标签,实现组件…

【Qt】styleSheet设置

1. ui中设置 #toolButton1{color: rgb(190, 192, 193); background-color:#404142; border:0px solid #2E2E2E;padding-top: 15px } #toolButton1::hover{background-color:rgb(94,95,96); } #toolButton1::checked{color:black; background-color:#f0f0f0; border:0px soli…

2024.6.2力扣刷题记录

目录 一、力扣每日一题-575. 分糖果 模拟 二、100307. 候诊室中的最少椅子数 模拟 三、100311. 无需开会的工作日 1.差分(超内存) 2.合并数组 一、力扣每日一题-575. 分糖果 模拟 class Solution:def distributeCandies(self, candyType: List[i…

Docker面试整理-Docker与虚拟机的区别是什么?

Docker 容器和传统的虚拟机(VM)都是提供隔离的运行环境以部署和运行应用程序的技术,但它们在架构和性能上存在显著的不同。了解这些差异可以帮助你选择最适合特定需求的解决方案: 基础架构:虚拟机:每个虚拟机都包括完整的操作系统、应用程序、必需的库和二进制文件,运行在…

故障预警 vs 故障分类:哪个更有意义,哪个更具挑战性?

故障预警 vs 故障分类:哪个更有意义,哪个更具挑战性? 在现代工业系统中,风力发电机、制造设备等关键装置的可靠性和稳定性对生产效率至关重要。为此,故障预警和故障分类成为保障设备正常运行的重要手段。那么&#xf…

UI案例——登陆系统

UI的登陆界面实例 在学习了UILabel,UIButton,UIView,UITextField的内容之后,我们就可以写一个简单的登陆界面 我们可以通过UILabel来编写我们显示在登陆界面上的文字比方说下面这两行字就是通过UILabel去实现的。 下面给出一下实现…

每日5题Day17 - LeetCode 81 - 85

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前! 第一题:81. 搜索旋转排序数组 II - 力扣(LeetCode) class Solution {public boolean search(int[] nums, int target) {int n nums.length;if (n…

【MySQL】MySQL 图形化界面 - 使用说明(MySQL Workbench)

一、安装软件 Navicat,SQLyog 这些软件都不错,不过都需要收费,当然也有破解版。下面用 MySQL Workbench,它是官方提供的工具。 二、使用操作 这个软件本质是一个客户端,现在要让数据库能够远程登录。不过一般不会远程…

Love-Yi情侣网站3.0存在SQL注入漏洞

目录 1. 前言 2. 网站简介 3. 寻找特征点 3.1 第一次尝试 3.2 第二次尝试 4.资产搜索 5.漏洞复现 5.1 寻找漏洞点 5.2 进行进一步测试 5.2.1 手动测试 1.寻找字段 2.寻找回显位 3.查询当前用户 5.2.2 sqlmap去跑 6.总结 1. 前言 朋友说自己建了一个情侣网站,看到…

Golang省市二级联动实现 从数据收集、清洗到数据存储

1.背景: 最近在写项目,在项目中有一个需求是获取用户的地理位置,一开始是打算让前端使用JSON包的形式去实现,但是考虑到后期可能需要对省市的数据做一些修改和控制操作,所以改为后端实现,并向后台暴露一套…

密码加密及验证

目录 为什么需要加密? 密码算法分类 对称密码算法 非对称密码算法 摘要算法 DigestUtils MD5在线解密工具原理 实现用户密码加密 代码实现 为什么需要加密? 在MySQL数据库中,我们常常需要对用户密码、身份证号、手机号码等敏感信息进…

【数据结构】树与二叉树——树的基本概念

树的基本概念 导读一、树的定义二、树的基本术语2.1 结点之间的关系2.2 基本概念2.3 度为m的树与m叉树 三、树的性质结语 导读 大家好,很高兴又和大家见面啦!!! 从今天开始,我们将进入第五章的内容——树与二叉树的学…

微服务:Rabbitmq的WorkQueue模型的使用、默认消费方式(消息队列中间件)

文章目录 WorkQueue模型控制预取消息个数 WorkQueue模型 当然,一个队列,可以由多个消费者去监听。 来实现一下. 生产者: Testpublic void testWorkQueue() throws InterruptedException {// 队列名称String queueName "simple.queue…

NoSQL实战(MongoDB搭建主从复制)

什么是复制集? MongoDB复制是将数据同步到多个服务器的过程; 复制集提供了数据的冗余备份并提高了数据的可用性,通常可以保证数据的安全性; 复制集还允许您从硬件故障和服务中断中恢复数据。 保障数据的安全性 数据高可用性 (2…

Leecode---技巧---只出现一次的数字 / 多数元素

题解&#xff1a; 利用异或运算 a⊕a 0 的性质&#xff0c;可用来消除所有出现了两次的元素&#xff0c;最后剩余的即为所得。 class Solution { public:int singleNumber(vector<int>& nums){// 初始化为0int ans 0;for(int x: nums){// 异或操作ans ^ x;}retur…

1、 认识信号完整性、信号完整性设计、信号完整性仿真

1. 什么是信号完整性&#xff1f; 狭义上讲&#xff0c;就是信号由源经过传输到达宿时没有发生任何变化。实际中&#xff0c;上述的情况是不存在了&#xff0c;任何信号经过传输以后不可能完全不变&#xff0c;幅度、相位或频率的不变总有一款是系统不能给与的&#xff01;&a…