kaggle竞赛实战11——模型优化

特征优化结束后,使用分类预测客户是否是异常客户并对两类客户分别进行回归预测

为了方便更快速的调用三种不同的模型,并且同时要求能够完成分类和回归预测,此处通过定义一个函数来完成所有模型的训练过程。

  def train_model(X, X_test, y, params, folds, model_type='lgb', eval_type='regression'): #用后两个参数决定模型和解决的问题类型
         oof = np.zeros(X.shape[0]) 
         predictions = np.zeros(X_test.shape[0]) 
         scores = [] 
         for fold_n, (trn_idx, val_idx) in enumerate(folds.split(X, y)): 
             print('Fold', fold_n, 'started at', time.ctime()) 
              
             if model_type == 'lgb': 
                 trn_data = lgb.Dataset(X[trn_idx], y[trn_idx]) 
                 val_data = lgb.Dataset(X[val_idx], y[val_idx]) 
                 clf = lgb.train(params, trn_data, num_boost_round=20000,  
                                 valid_sets=[trn_data, val_data],  
                                 verbose_eval=100, early_stopping_rounds=300) 
                 oof[val_idx] = clf.predict(X[val_idx], num_iteration=clf.best_iteration) 
                 predictions += clf.predict(X_test, num_iteration=clf.best_iteration) / folds.n_splits 
              
             if model_type == 'xgb': 
                 trn_data = xgb.DMatrix(X[trn_idx], y[trn_idx]) 
                 val_data = xgb.DMatrix(X[val_idx], y[val_idx]) 
                 watchlist = [(trn_data, 'train'), (val_data, 'valid_data')] 
                 clf = xgb.train(dtrain=trn_data, num_boost_round=20000,  
                                 evals=watchlist, early_stopping_rounds=200,  
                                 verbose_eval=100, params=params) 
                 oof[val_idx] = clf.predict(xgb.DMatrix(X[val_idx]), ntree_limit=clf.best_ntree_limit) 
                 predictions += clf.predict(xgb.DMatrix(X_test), ntree_limit=clf.best_ntree_limit) / folds.n_splits 
              
             if (model_type == 'cat') and (eval_type == 'regression'): 
                 clf = CatBoostRegressor(iterations=20000, eval_metric='RMSE', **params) 
                 clf.fit(X[trn_idx], y[trn_idx],  
                         eval_set=(X[val_idx], y[val_idx]), 
                         cat_features=[], use_best_model=True, verbose=100) 
                 oof[val_idx] = clf.predict(X[val_idx]) 
                 predictions += clf.predict(X_test) / folds.n_splits 
                  
             if (model_type == 'cat') and (eval_type == 'binary'): 
                 clf = CatBoostClassifier(iterations=20000, eval_metric='Logloss', **params) 
                 clf.fit(X[trn_idx], y[trn_idx],  
                         eval_set=(X[val_idx], y[val_idx]), 
                         cat_features=[], use_best_model=True, verbose=100) 
                 oof[val_idx] = clf.predict_proba(X[val_idx])[:,1] 
                 predictions += clf.predict_proba(X_test)[:,1] / folds.n_splits 
             print(predictions) 
             if eval_type == 'regression': 
                 scores.append(mean_squared_error(oof[val_idx], y[val_idx])**0.5) 
             if eval_type == 'binary': 
                 scores.append(log_loss(y[val_idx], oof[val_idx])) 
              
         print('CV mean score: {0:.4f}, std: {1:.4f}.'.format(np.mean(scores), np.std(scores))) 
          
         return oof, predictions, scores 

下面用上面的模型构建三个子模型

 lgb_params = {'num_leaves': 63, 
                  'min_data_in_leaf': 32,  
                  'objective':'regression', 
                  'max_depth': -1, 
                  'learning_rate': 0.01, 
                  \ min_child_samples\ : 20, 
                  \ boosting\ : \ gbdt\ , 
                  \ feature_fraction\ : 0.9, 
                  \ bagging_freq\ : 1, 
                  \ bagging_fraction\ : 0.9 , 
                  \ bagging_seed\ : 11, 
                  \ metric\ : 'rmse', 
                  \ lambda_l1\ : 0.1, 
                  \ verbosity\ : -1} 
     folds = KFold(n_splits=5, shuffle=True, random_state=4096) 
     X_ntrain = ntrain[fea_cols].values 
     X_train  = train[fea_cols].values 
     X_test   = test[fea_cols].values 
     print('='*10,'回归模型','='*10) 
     oof_lgb , predictions_lgb , scores_lgb  = train_model(X_train , X_test, y_train, params=lgb_params, folds=folds, model_type='lgb', eval_type='regression') 
   #围绕不存在异常的数据做预测

 print('='*10,'without outliers 回归模型','='*10) 
     oof_nlgb, predictions_nlgb, scores_nlgb = train_model(X_ntrain, X_test, y_ntrain, params=lgb_params, folds=folds, model_type='lgb', eval_type='regression') 
   #围绕异常的数据做预测

 print('='*10,'分类模型','='*10) 
     lgb_params['objective'] = 'binary' 
     lgb_params['metric']    = 'binary_logloss' 
     oof_blgb, predictions_blgb, scores_blgb = train_model(X_train , X_test, y_train_binary, params=lgb_params, folds=folds, model_type='lgb', eval_type='binary') 
   #样本分类模型

然后将所有预测结果进行保存,包括一个分类模型、以及两个回归模型: 

 sub_df = pd.read_csv('data/sample_submission.csv') 
     sub_df[\ target\ ] = predictions_lgb 
     sub_df.to_csv('predictions_lgb.csv', index=False) 

   oof_lgb  = pd.DataFrame(oof_lgb) 
     oof_nlgb = pd.DataFrame(oof_nlgb) 
     oof_blgb = pd.DataFrame(oof_blgb) 
      
     predictions_lgb  = pd.DataFrame(predictions_lgb) 
     predictions_nlgb = pd.DataFrame(predictions_nlgb) 
     predictions_blgb = pd.DataFrame(predictions_blgb) 
      
     oof_lgb.to_csv('./result/oof_lgb.csv',header=None,index=False) 
     oof_blgb.to_csv('./result/oof_blgb.csv',header=None,index=False) 
     oof_nlgb.to_csv('./result/oof_nlgb.csv',header=None,index=False) 
      
     predictions_lgb.to_csv('./result/predictions_lgb.csv',header=None,index=False) 
     predictions_nlgb.to_csv('./result/predictions_nlgb.csv',header=None,index=False) 
     predictions_blgb.to_csv('./result/predictions_blgb.csv',header=None,index=False) 

#发现但模型情况下私榜3.61,公榜3.68,特征优化的效果十分明显

下面开始二阶段建模

 sub_df = pd.read_csv('data/sample_submission.csv') 
     sub_df[\ target\ ] = predictions_bstack*-33.219281 + (1-predictions_bstack)*predictions_nstack #异常值直接*-33.22
     sub_df.to_csv('predictions_trick.csv', index=False) 

如果担心异常值识别不一定准确,可以把上面的结果*0.5,再把直接求得的结果*0。5进行融合

sub_df = pd.read_csv('data/sample_submission.csv') 
     sub_df[\ target\ ] = (predictions_bstack*-33.219281 + (1-predictions_bstack)*predictions_nstack)*0.5 + predictions_stack*0.5 
     sub_df.to_csv('predictions_trick&stacking.csv', index=False) 

未来展望方向:

1、每个阶段都用stacking做模型融合

2、每个模型都用交叉验证

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

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

相关文章

极速下载,尽在Gopeed — 现代全能下载管理器

Gopeed:用Gopeed,让下载变得简单而高效。- 精选真开源,释放新价值。 概览 Gopeed是一个用Go语言编写的现代下载管理器,支持跨平台使用,包括Windows、macOS、Linux等。它不仅提供了基本的下载功能,还通过内…

免费的AI在线写作工具,让写作变的更简单

在如今的时代,写作已经成为了我们日常生活中不可或缺的一部分。无论是自媒体创作者、学生还是办公职场人员,都有内容创作的需求。然而,写作过程往往伴随着灵感枯竭、查找资料费时等问题。下面小编就来和大家分享几款免费的AI在线写作工具&…

流水账里的贷款密码:如何打造银行眼中的“好流水”

说到贷款,很多人可能都遇到过这样的困惑:明明觉得自己条件不错,为啥银行就是不给批呢?其实,银行在审批贷款时,除了看你的征信记录、收入证明这些基础材料外,还有一个很重要的参考指标&#xff0…

文心一言 VS 讯飞星火 VS chatgpt (287)-- 算法导论21.2 6题

六、假设对 UNION 过程做一个简单的改动,在采用链表表示中拿掉让集合对象的 tail 指针总指向每个表的最后一个对象的要求。无论是使用还是不使用加权合并启发式策略,这个修改不应该改变 UNION 过程的渐近运行时间。(提示:而不是把一个表链接到另一个表后…

常见数字化转型方案撰写的思维模式

通过这一段时间的学习和倾听,结合DAMA数据管理知识体系学习与项目实践,对大部分数据治理类项目、信息化建设和数字化转型项目的思维模式做了一些总结梳理,具体有如下四种,供参考。 一、方法1:结合环境六边形法 1.要点题,弄清楚问题是什么 2.目标原则有哪些,补充哪些 3.…

java实现微信小程序登录

一、引入核心pom <!-- 微信小程序 --><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-miniapp</artifactId><version>4.5.0</version></dependency><dependency><groupId>o…

如何使用代理ip上网移动转电信

在一些特定的工作场景中&#xff0c;比如跨网办公、数据分析等&#xff0c;我们常常需要将网络IP从一种类型转换到另一种类型。如需将移动网络转电信IP代理。那么&#xff0c;如何使用代理IP上网移动转电信呢&#xff1f;接下来&#xff0c;将为您揭示一个便捷的方法&#xff0…

怎样在Java中进行日志记录?

怎样在Java中进行日志记录&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在软件开发中&#xff0c;日志记录是一项至关重要的技术&#xff0c;它可…

【Linux】系统文件IO·文件描述符fd

前言 C语言文件接口 C 语言读写文件 1.C语言写入文件 2.C语言读取文件 stdin/stdout/stderr 系统文件IO 文件描述符fd&#xff1a; 文件描述符分配规则&#xff1a; 文件描述符fd&#xff1a; 前言 我们早在C语言中学习关于如何用代码来管理文件&#xff0c;比如文件的…

《Fundamentals of Power Electronics》——绕组导体中的涡流

绕组导体中的涡流也会导致功率损耗。这可能导致铜耗大大超过上述公式预测的值。特殊的导体涡流机制被称为集肤效应和紧邻效应。这些机制在多层绕组的大电流导体中最为明显&#xff0c;特别是在高频变换器中。 下图说明了一个简单变压器绕组中的邻近效应。

Android C++系列:C++最佳实践3继承与访问控制

1. 背景 Java中有四种访问控制:public、protected、default、private,它们的使用范围可以用下面一张表概括: 类内部本包子类外部包public是是是是protected是是是否default是是否否private是否否否整个结构还是比较简单的,从类内部到本包到子类到外部包权限越来越小,比较…

【LC刷题】DAY13:110 257 440

【LC刷题】DAY13&#xff1a;110 257 440 文章目录 【LC刷题】DAY13&#xff1a;110 257 440110. 平衡二叉树 [link](https://leetcode.cn/problems/balanced-binary-tree/description/)257. 二叉树的所有路径 [link](https://leetcode.cn/problems/binary-tree-paths/descript…

微软TTS最新模型,发布9种更真实的AI语音

很高兴与大家分享 Azure AI 语音翻译产品套件的两个重大更新&#xff1a; 视频翻译和增强的实时语音翻译 API。 视频翻译&#xff08;批量&#xff09; 今天&#xff0c;我们宣布推出视频翻译预览版&#xff0c;这是一项突破性的服务&#xff0c;旨在改变企业本地化视频内容…

二分查找(算法篇)

算法之二分查找 二分查找 概念&#xff1a; 针对于已经预先排序好的数据&#xff0c;每次将数据进行对半查找&#xff0c;然后看它中间的数据是否是要找的&#xff0c;如果是就返回中间位置&#xff0c;不是就判断该数据是在前半部分还是后半部&#xff0c;然后在进而取其中…

详解 ClickHouse 的建表优化

一、explain 查看执行计划 explain 功能是从 20.6 版本才成为正式的功能&#xff0c;之前的版本需要到 log 日志中查看执行过程 1. 基本语法 explain [plan | ast | syntax | pipeline] [setting1value1, setting2value2,...] select ... [format ...];plan&#xff1a;默认查…

记录一些可用的AI工具网站

记录一些可用的AI工具网站 AI对话大模型AI图片生成AI乐曲生成AI视频生成AI音频分离 AI对话大模型 当前时代巅峰&#xff0c;Microsoft Copilot&#xff1a;https://copilot.microsoft.com AI图片生成 stable diffusion模型资源分享社区&#xff0c;civitai&#xff1a;https…

更改ip后还被封是ip质量的原因吗?

不同的代理IP的质量相同&#xff0c;一般来说可以根据以下几个因素来进行判断&#xff1a; 1.可用率 可用率就是提取的这些代理IP中可以正常使用的比率。假如我们无法使用某个代理IP请求目标网站或者请求超时&#xff0c;那么就代表这个代理不可用&#xff0c;一般来说免费代…

mysql学习——SQL中的DQL和DCL

SQL中的DQL和DCL DQL基本查询条件查询聚合函数分组查询排序查询分页查询 DCL管理用户权限控制 学习黑马MySQL课程&#xff0c;记录笔记&#xff0c;用于复习。 DQL DQL英文全称是Data Query Language(数据查询语言)&#xff0c;数据查询语言&#xff0c;用来查询数据库中表的记…

SpringSecurity-重写默认配置

重写UserDetailService组件 1.注入Bean的方式 /*** author: coffee* date: 2024/6/22 21:22* description: 重写springsecurity默认组件&#xff1a;注入Bean的方式*/Configuration public class ProjectConfig {/*** 重写userDetailsService组件*/Beanpublic UserDetailsSer…

【LC刷题】DAY12:226 144 94 145

【LC刷题】DAY12&#xff1a;226 144 94 145 文章目录 【LC刷题】DAY12&#xff1a;226 144 94 145226. 翻转二叉树 [link](https://leetcode.cn/problems/invert-binary-tree/)101. 对称二叉树 [link](https://leetcode.cn/problems/invert-binary-tree/description/)104. 二叉…