鱼佬:百行代码入手数据挖掘赛!
↑↑↑关注后"星标"Datawhale
每日干货 & 每月组队学习,不错过
Datawhale干货
作者:鱼佬,武汉大学,Datawhale成员
本实践以科大讯飞xDatawhale联合举办的数据挖掘赛为例,给出了百行代码Baseline,帮助学习者更好地结合赛事实践。同时,在如何提分上进行了详细解读,以便于大家进阶学习。
数据及背景
给定实际业务中借款人信息,邀请大家建立风险识别模型,预测可能拖欠的借款人。
实践&数据下载地址:https://challenge.xfyun.cn/topic/info?type=car-loan&ch=dw-sq-1
实践代码
Baseline采用LightGBM模型,进行了必要的注释和代码实现,分数为0.58左右。
## 导入第三方包
import pandas as pd
import numpy as np
import lightgbm as lgbfrom sklearn.model_selection import KFold
from sklearn.metrics import f1_score, roc_auc_scoreimport warnings
warnings.filterwarnings('ignore')## 读取数据集,具体下载方式可见操作手册
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
sample_submit = pd.read_csv('sample_submit.csv')## 训练数据及测试数据准备
all_cols = [f for f in train.columns if f not in ['customer_id','loan_default']]x_train = train[all_cols]
x_test = test[all_cols]
y_train = train['loan_default']## 作为baseline部分仅使用经典的LightGBM作为训练模型,我们还能尝试XGBoost、CatBoost和NN(神经网络)
def cv_model(clf, train_x, train_y, test_x, clf_name='lgb'):folds = 5seed = 2021kf = KFold(n_splits=folds, shuffle=True, random_state=seed)train = np.zeros(train_x.shape[0])test = np.zeros(test_x.shape[0])cv_scores = []for i, (train_index, valid_index) in enumerate(kf.split(train_x, train_y)):print('************************************ {} ************************************'.format(str(i+1)))trn_x, trn_y, val_x, val_y = train_x.iloc[train_index], train_y[train_index], train_x.iloc[valid_index], train_y[valid_index]train_matrix = clf.Dataset(trn_x, label=trn_y)valid_matrix = clf.Dataset(val_x, label=val_y)params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'auc','min_child_weight': 5,'num_leaves': 2 ** 7,'lambda_l2': 10,'feature_fraction': 0.9,'bagging_fraction': 0.9,'bagging_freq': 4,'learning_rate': 0.01,'seed': 2021,'nthread': 28,'n_jobs':-1,'silent': True,'verbose': -1,}model = clf.train(params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], verbose_eval=500,early_stopping_rounds=200)val_pred = model.predict(val_x, num_iteration=model.best_iteration)test_pred = model.predict(test_x, num_iteration=model.best_iteration)train[valid_index] = val_predtest += test_pred / kf.n_splitscv_scores.append(roc_auc_score(val_y, val_pred))print(cv_scores)print("%s_scotrainre_list:" % clf_name, cv_scores)print("%s_score_mean:" % clf_name, np.mean(cv_scores))print("%s_score_std:" % clf_name, np.std(cv_scores))return train, testlgb_train, lgb_test = cv_model(lgb, x_train, y_train, x_test)## 预测结果
sample_submit['loan_default'] = lgb_test
sample_submit['loan_default'] = sample_submit['loan_default'].apply(lambda x:1 if x>0.25 else 0).values
sample_submit.to_csv('baseline_result.csv', index=False)
上分策略
上述Baseline是一个较为简单的Baseline,试跑排名第8。如果想常挂榜首,需要考虑持续优化,这里给出几种方法:
1. 加入特征工程
本代码实践仅使用了赛题原始的特征,并没有进行过多的特征工程,这里还是很值得优化,并且相信会有很多提升点。特征工程对比赛结果的影响非常大,这里给出常见的几种特征工程操作的介绍:特征交互、特征编码和特征选择。
特征交互
交互特征的构造非常简单,使用起来却代价不菲。如果线性模型中包含有交互特征时,那它的训练时间和评分时间就会从 O(n) 增加到 O(n2),其中 n 是单一特征的数量。
特征和特征之间组合
特征和特征之间衍生
特征编码
one-hot编码
label-encode编码
特征选择
特征选择技术可以精简掉无用的特征,以降低最终模型的复杂性,它的最终目的是得到一个简约模型,在不降低预测准确率或对预测准确率影响不大的情况下提高计算速度。
特征选择不是为了减少训练时间(实际上,一些技术会增加总体训练时间),而是为了减少模型评分时间
2. 进行参数优化
对于模型的参数部分baseline部分并没有进行过多的优化和实验,当然这也是个比较大的优化的,下面给出几种调参的参考方法。
贪心调参
先使用当前对模型影响最大的参数进行调优,达到当前参数下的模型最优化,再使用对模型影响次之的参数进行调优,如此下去,直到所有的参数调整完毕。
网格调参
sklearn 提供GridSearchCV用于进行网格搜索,只需要把模型的参数输进去,就能给出最优化的结果和参数。相比起贪心调参,网格搜索的结果会更优,但是网格搜索只适合于小数据集,一旦数据的量级上去了,很难得出结果。
贝叶斯调参
给定优化的目标函数(广义的函数,只需指定输入和输出即可,无需知道内部结构以及数学性质),通过不断地添加样本点来更新目标函数的后验分布(高斯过程,直到后验分布基本贴合于真实分布)。简单的说,就是考虑了上一次参数的信息,从而更好的调整当前的参数。
3. 尝试新的模型
作为Baseline部分仅使用经典的LightGBM作为训练模型,我们还能尝试XGBoost、CatBoost和NN(神经网络),这里推荐两篇Datawhale成员吴忠强的文章做参考。
上分利器
XGBoost模型
https://blog.csdn.net/wuzhongqiang/article/details/104854890
LightGBM模型
https://blog.csdn.net/wuzhongqiang/article/details/105350579
事实上
4. 进行模型融合
模型融合是一种能在各种的机器学习任务上提高准确率的强有力技术,可谓是机器学习比赛大杀器,现在介绍基础上分和进阶上分两种方式。
基础上分
简单平均和加权平均是常用的两种比赛中模型融合的方式。其优点是快速、简单。
平均:(简单实用)
简单平均法
加权平均法
投票:
简单投票法
加权投票法
综合:
排序融合
log融合
进阶上分
stacking在众多比赛中大杀四方,但是跑过代码的小伙伴想必能感受到速度之慢,同时stacking多层提升幅度并不能抵消其带来的时间和内存消耗,实际环境中应用还是有一定的难度。
此外,在有答辩环节的比赛中,主办方也会一定程度上考虑模型的复杂程度,所以说并不是模型融合的层数越多越好的。
stacking:
构建多层模型,并利用预测结果再拟合预测。
blending:
选取部分数据预测训练得到预测结果作为新特征,带入剩下的数据中预测。
boosting/bagging
当然在比赛中将加权平均、stacking、blending等混用也是一种策略,可能会收获意想不到的效果哦!
点阅读原文,开启实践↓
鱼佬:百行代码入手数据挖掘赛!相关推荐
- 【精简教程版】100行代码入手天池CV赛事
Datawhale 作者:阿水.陈信达 Datawhale成员 本文针对阿里天池<零基础入门CV赛事-街景字符编码识别>,给出了百行代码Baseline,帮助cv学习者更好地结合赛事实践 ...
- 精简教程版 | 100行代码入手天池CV赛事
来源:Datawhale 本文长度为7200字,建议阅读10分钟 本文从数据分析和解题思路分析两方面对阿里赛题进行了详细解读. 本文针对阿里天池<零基础入门CV赛事-街景字符编码识别>,给 ...
- 基于Ganos百行代码实现亿级矢量空间数据在线可视化
简介: 本文介绍如何使用RDS PG或PolarDB(兼容PG版或Oracle版)的Ganos时空引擎提供的数据库快显技术,仅用百行代码实现亿级海量几何空间数据的在线快速显示和流畅地图交互,且无需关注 ...
- Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛
北京 上海巡回站 | NVIDIA DLI深度学习培训 2018年1月26/1月12日 NVIDIA 深度学习学院 带你快速进入火热的DL领域 阅读全文 ...
- python图像分类代码_Kaggle—So Easy!百行代码实现排名Top 5%的图像分类比赛
Kaggle-So Easy!百行代码实现排名Top 5%的图像分类比赛 作者:七月在线彭老师 说明:本文最初由彭老师授权翟惠良发布在公众号"七月在线实验室"上,现再由July重新 ...
- js 监听 安卓事件_百行代码实现js事件监听实现跨页面数据传输
百行代码实现js事件监听实现跨页面数据传输 使用场景 类似消息队列的使用场景,支持同页面和跨页面通信,发送消息和接收消息 技术原理 跨页面通信: 基于事件监听,通过监听 storage事件监听回调机制 ...
- 百行代码打造一个DI容器(支持瞬时生命周期、单利生命周期、构造函数自动注入、属性自动注入、字段自动注入)...
DI注入在.Net平台是非常流行的, 很多项目都用到了,很多开发人员或多或少也用到DI容器了,感觉DI容器很神奇很厉害.本文将通过百行代码展示DI容器的内部核心代码(包括组件的瞬时生命周期.单利生命周 ...
- 猜猜乐游戏php源码,C/C++百行代码实现热门游戏消消乐功能的示例代码
游戏设计 首先我们需要使用第三方框架,这里我使用的是sfml,不会使用sfml在我的上几篇文章当中-扫雷(上)有详细的开发环境搭建介绍 首先准备图片资源 一张背景图片,一张宝石图片 窗口初始化加载图片 ...
- Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋
Python百日百行代码挑战-day8,day9,day10,游戏实战系列-五子棋 写在前面 需要用到的工具包和参考 游戏设定 初始化 切换下棋方 判断五子连珠(核心) 鼠标点击流程事件 成品展示 打 ...
最新文章
- minEnclosingCircle函数
- libevent安装总结 - jinfg2008的专栏 - 博客频道 - CSDN.NET
- JS经典面试题05-变量连续声明var a = b = 1
- 路由器配置——OSPF协议(2)
- XSS和CSRF详解与防御
- 雷鸟html签名设置,thunderbird 使用OpenPGP加解密邮件
- uiview生命周期
- 阿里P8架构师谈:Docker简介、组成架构、使用步骤、以及生态产品
- 换行与回车(\r \n)的起源以及在编制语言中的使用
- 中兴V889D刷机变砖不用怕 V889D救砖教程发布【转载】
- django的render的特殊用法
- doip 源码_汽车DoIP通讯协议的前世今生
- java程序员挣外快_Java程序员如何赚外快
- SDRAM控制器设计(8)SDRAM控制器仿真验证
- Centos7修改IP地址
- 摄影爱好者尝试图库销售时需要注意什么?| 拍者手记
- Android开发这么久你竟然还不知道Dropbox?
- mysql查询所有男生中姓王的_MySQL的查询练习
- Latex---局部调大字体--下划线--首行缩进--悬挂缩进
- R语言|forest plot