DataCastle企业风险算法赛实战(进阶难度)

        

目录

一、数据读取及分析

1、数据读取

2、数据分析

二、数据挖掘

三、模型构建及评估

四、划重点

推荐相关文章


        去年在DataCastle上参加了华录杯算法赛,初赛前10、进复赛就没打了。相比于之前文章 kaggle风控建模实战(文末附链接),本文数据处理较为复杂、特征挖掘内容较多,适合统计学/机器学习相关专业、或者有一定模型算法/数据挖掘经验的同学,经验较浅的也可以作为进阶项目实战提升。

一、数据读取及分析

1、数据读取

        使用DataCastle上华录杯算法赛-企业安全风险评估赛道数据集,其中训练集7117条、测试集1500条,测试集没有给score、需要参赛选手上传预测结果平台自动评估反馈;下图为训练集数据,其中score为风险评分、取值范围0-100,因此这个赛题可以转为二分类模型、也可以用回归模型 数据获取见文末

        数据集中详细信息包括如下9个表,需要以业户id为主键拼接、再做特征挖掘

(1)运政业户信息

(2)运政车辆信息

(3)车辆违法违规信息(道路交通安全,来源抄告)

(4)车辆违法违规信息(交通运输违法,来源抄告)

(5)动态监控报警信息(车辆,超速行驶)

(6)动态监控报警信息(车辆,疲劳驾驶)

(7)动态监控上线率(企业,%)

(8)运政车辆年审记录信息

(9)运政质量信誉考核记录

2、数据分析

(1)训练集score分布,大多集中在高分(分数越代表安全风险越低)

(2)将数据拼接后,查看存在过交通安全、运输违法车辆对应的业户id风险评分分布情况,可以发现这部分评分整体偏低,因此是否有过违法违规行为对风险评分影响较大

二、数据挖掘

1、运政业户信息和运政车辆信息表

        均有行业类别字段(分别为企业的行业类别、车辆的行业类别),数据拼接后可以衍生类别一致性特征;

2、交通安全违法/运输违法表

        按照观察时间往前切片[0,1,5,10,15,30,60,90,180,360,720](天),分别统计不同时间窗口下的交通安全违法次数、运输违法次数

3、动态监控报警信息(车辆,超速行驶)表/动态监控报警信息(车辆,疲劳驾驶)表

        分别统计不同时间窗口下的超速报警次数;对最高时速(Km/h), 持续点数, 持续时长(秒)三个字段分别统计不同时间窗口下的max, min, mean, median, std, count, sum

4、动态监控上线率(企业,%)表

        对近3个月、近6个月上线率分别统计mean, max, min, std;分别统计近3个月、近6个月上线率不满100%的次数

5、运政车辆年审记录信息表

        分别统计近0,1,3,5,7,10,20年的年审次数、年审合格次数

6、运政质量信誉考核记录表

        分别统计近30,90,360,720天的信誉考核次数,以及考核结果为优良(AAA), 合格(AA), 基本合格(A), 不合格(B)各类别的次数

数据挖掘代码,最终特征数量548个

def get_feature_across_window(df,key,col,func,day_diff,window_list,float_fea_list=[]):
    l=[]
    for window in window_list:
        df_window=df[df[day_diff]<=window]
        if func==cnt_feature:
            df_window_sta=df_window.pipe(func,key,col).add_suffix('_'+'window'+'_'+str(window))
        elif func==float_feature_stata:
            df_window_sta=df_window.pipe(func,key,col,float_fea_list).add_suffix('_'+'window'+'_'+str(window))
        l.append(df_window_sta)
    return pd.concat(l,axis=1)
​
def cnt_feature(df,key,col):
    result=df.groupby([key])[col].count().to_frame().rename(columns={col:'cnt'})
    return result
​
STATS_LIST = ['max', 'min', 'mean', 'median', 'std','count','sum']
def float_feature_stata(df,key,col,float_fea_list,STATS_LIST=STATS_LIST):
    l=[]
    for col in float_fea_list:
        df_col_sta=df.groupby(key)[col].agg(STATS_LIST)
        df_col_sta.columns=[col+'_'+sta for sta in STATS_LIST]
        l.append(df_col_sta)
​
    return pd.concat(l,axis=1)
​
​
window_list=[0,1,5,10,15,30,60,90,180,360,720]
def traffic_safety_data_pre(df,window_list):
    df_copy=df.copy()
    df_copy['行业类别']=df_copy['行业类别'].map({'包车客运':'道路旅客运输','危货运输':'道路危险货物运输'})
    df_copy['观察时间']='2022-06-30'
    df_copy['day_diff']=(pd.to_datetime(df_copy['观察时间'])-pd.to_datetime(df_copy['违规时间'])).dt.days
    
    key,col,func,day_diff,window_list='车牌号','行业类别',cnt_feature,'day_diff',window_list
    result=df_copy.pipe(get_feature_across_window,key,col,func,day_diff,window_list)
    return result
​
def speeding_data_pre(df,window_list):
    df_copy=df.rename(columns={'车牌号码':'车牌号'}).copy()
    df_copy['观察时间']='2022-06-30'
    df_copy['day_diff']=(pd.to_datetime(df_copy['观察时间'])-pd.to_datetime(df_copy['开始时间'])).dt.days
    
    key,col,func,day_diff,window_list='车牌号','报警类型',float_feature_stata,'day_diff',window_list
    float_fea_list=['最高时速(Km/h)', '持续点数', '持续时长(秒)']
    df_float=df_copy.pipe(get_feature_across_window,key,col,func,day_diff,window_list,float_fea_list)
    
    key,col,func,day_diff,window_list='车牌号','报警类型',cnt_feature,'day_diff',window_list
    df_cnt=df_copy.pipe(get_feature_across_window,key,col,func,day_diff,window_list)
    
    
    return pd.concat([df_float,df_cnt],axis=1)
    
def get_launch_df(df):
    df_copy=df.copy()
    three_month_col=[str(month)+'月上线率' for month in [4,5,6]]
    six_month_col=[str(month)+'月上线率' for month in [1,2,3,4,5,6]]
    stata_list=['mean','max','min','std']
    df_fea_3month=df_copy[three_month_col].agg(stata_list,axis=1).add_prefix('three_month_')
    df_fea_6month=df_copy[six_month_col].agg(stata_list,axis=1).add_prefix('six_month_')
    
    df_fea_3month_cnt=df_copy[df_copy[three_month_col]!=1].count(axis=1).to_frame().rename(columns={0:'not1_cnt'}).add_prefix('three_month_')
    df_fea_6month_cnt=df_copy[df_copy[six_month_col]!=1].count(axis=1).to_frame().rename(columns={0:'not1_cnt'}).add_prefix('six_month_')
    
    return pd.concat([
        df_copy,
        df_fea_3month,
        df_fea_6month,
        df_fea_3month_cnt,
        df_fea_6month_cnt
    ],axis=1)
​
def annual_review_df(df):
    df_copy=df.rename(columns={'车辆牌照号':'车牌号'}).copy()
    df_copy['观察时间']=2022
    df_copy['year_diff']=df_copy['观察时间']-df_copy['年审年度']
    
    key,col,func,day_diff,window_list='车牌号','审批结果',cnt_feature,'year_diff',[0,1,3,5,7,10,20]
    df_review_cnt=df_copy.pipe(get_feature_across_window,key,col,func,day_diff,window_list).add_prefix('review_')
    
    df_qualified_cnt=df_copy[df_copy['审批结果']=='年审合格'].pipe(get_feature_across_window,key,col,func,day_diff,window_list).add_prefix('qualified_')
    df_annual_review=pd.concat([df_review_cnt,df_qualified_cnt],axis=1)
​
    return df_annual_review
​
def reputation_assessment_df(df):
    df_copy=df.copy()
    df_copy['观察时间']='2022-06-30'
    df_copy['day_diff']=(pd.to_datetime(df_copy['观察时间'])-pd.to_datetime(df_copy['考核日期'])).dt.days
    
    key,col,func,day_diff,window_list='业户ID','质量信誉考核结果',cnt_feature,'day_diff',[30,90,360,720]
    df_reputation_all=df_copy.pipe(get_feature_across_window,key,col,func,day_diff,window_list).add_prefix('reputation_all_')
    
    l=[]
    for grade in ['优良(AAA)', '合格(AA)', '基本合格(A)', '不合格(B)']:
        key,col,func,day_diff,window_list='业户ID','质量信誉考核结果',cnt_feature,'day_diff',[30,90,360,720]
        df_reputation_grade=df_copy[df_copy['质量信誉考核结果']==grade].pipe(get_feature_across_window,key,col,func,day_diff,window_list).add_prefix('reputation_'+re.findall('\((.*?)\)',grade)[0]+'_')
        l.append(df_reputation_grade)
    df_reputation_assessment=pd.concat([df_reputation_all]+l,axis=1)
    return df_reputation_assessment
​
​
def get_all_df(df_list,df_train_label):
    
    df_all=df_list[1].rename(columns={'车辆牌照号':'车牌号'}).merge(df_train_label,left_on=['车牌号'],right_on=['car_id'],how='left').drop(['car_id'],axis=1)
    df_all['sample_label']=np.where(df_all.score.notnull(),'train','test')
    df_all=df_all.merge(df_list[0],on=['业户ID'],how='left')
    df_all.rename(columns={'行业类别_x':'车辆行业类别','行业类别_y':'企业行业类别'},inplace=True)
    df_all['类别一致性']=np.where(df_all['车辆行业类别']==df_all['企业行业类别'],1,0)
    
    df_traffic_safety=df_list[2].pipe(traffic_safety_data_pre,[30,90,180,360,720])
    df_illegal_trans=df_list[3].pipe(traffic_safety_data_pre,[30,90,180,360,720])
    df_speeding=df_list[4].pipe(speeding_data_pre,window_list)
    df_fatigue_driving=df_list[5].pipe(speeding_data_pre,window_list)
    df_launch=df_list[6].pipe(get_launch_df)
    df_annual_review=df_list[7].pipe(annual_review_df)
    df_reputation_assessment=df_list[8].pipe(reputation_assessment_df)
    
    df_license_concat=pd.concat([
        df_traffic_safety.add_prefix('traffic_safety_'),
        df_illegal_trans.add_prefix('illegal_trans_'),
        df_speeding.add_prefix('speeding_'),
        df_fatigue_driving.add_prefix('fatigue_driving_'),
        df_annual_review.add_prefix('annual_review_')
    ],axis=1)
    df_launch.columns=['launch_'+col if col not in ['企业名称'] else col for col in df_launch.columns]
    
    df_all=df_all.merge(df_license_concat.reset_index(),on=['车牌号'],how='left')
    df_all=df_all.merge(df_launch,on=['企业名称'],how='left')
    df_all=df_all.merge(df_reputation_assessment.reset_index(),on=['业户ID'],how='left')
​
    return df_all
​
df_all=get_all_df(df_list,df_train_label)
print(df_all.shape)
df_all.head()
                             
​
fea_list=['车牌颜色','车辆行业类别','企业行业类别','类别一致性']+list(df_all.loc[:,'traffic_safety_cnt_window_30':].columns)
len(fea_list)

三、模型构建及评估

        使用xgb构建回归模型,使用mse、mae、r2进行评估(其他回归模型、二分类模型的方式大家可以自行尝试)

from math import sqrt
from sklearn.metrics import mean_absolute_error,mean_squared_error,r2_score
​
def init_params_regression():
    params_xgb={
        'objective':'reg:squarederror',
        'eval_metric':'rmse',
#        'silent':0,
        'nthread':4,
        'n_estimators':500,
        'eta':0.02,
#        'num_leaves':10,
        'max_depth':3,
        'min_child_weight':50,
        'scale_pos_weight':1,
        'gamma':5,
        'reg_alpha':2,
        'reg_lambda':2,
        'subsample':0.8,
        'colsample_bytree':0.8,
        'seed':123
    }
    return params_xgb
​
def mse_value(y_value,df,model):
    y_pred=model.predict(df)
    mae=mean_absolute_error(y_value, y_pred)
    mse=mean_squared_error(y_value, y_pred)
    r2=r2_score(y_value, y_pred)
​
    return mae,mse,r2
    
def model_train_sklearn_regression(model_label,train,y_name,model_var,params=None,random_state=123):
    
    if params is None:
        params=init_params_regression()
    x_train,x_test, y_train, y_test =train_test_split(train[model_var],train[y_name],test_size=0.2, random_state=random_state)
​
    model=XGBRegressor(**params)
    
    model.fit(x_train,y_train,eval_set=[(x_train, y_train),(x_test, y_test)],verbose=False) # 调参时设verbose=False
    train_mae,train_mse,train_r2=mse_value(y_train,x_train,model)
    test_mae,test_mse,test_r2=mse_value(y_test,x_test,model)
    all_mae,all_mse,all_r2=mse_value(train[y_name],train[model_var],model)
    
    dic={
        'model_label':model_label,
        'train':y_train.count(),
        'test':y_test.count(),
        'all':train.shape[0],
        'train_mse':train_mse,'train_mae':train_mae,'train_r2':train_r2,
        'test_mse':test_mse,'test_mae':test_mae,'test_r2':test_r2,
        'all_mse':all_mse,'all_mae':all_mae,'all_r2':all_r2,
    }
    return dic,model
    
params=init_params_regression() 
params.update({'n_estimators':900,'eta':0.65})
​
model_result,model=model_train_sklearn_regression('label',df_all[df_all['sample_label']=='train'],'score',
                                       fea_list[3:],params=params)
model_result

四、划重点

        关注公众号 Python风控模型与数据分析,回复 企业风险算法实战 获取本篇数据及代码

推荐相关文章

租房价格分析及预测(xgb+catboost+rf)

kaggle风控建模实战(XGB+LGB+RF+LR)

NGBoost参数详解及实战

catboost参数详解及实战(强推)

风控算法赛lgb实战-拍拍贷魔镜杯

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows11恢复组策略编辑器功能的方法

原因分析 日常工作学习中,对 Windows 计算机上的问题进行故障排除时,有些高级用户经常使用组策略编辑器轻松修复它。通过其分层结构,您可以快速调整应用于用户或计算机的设置。如果搜索结果中缺少组策略编辑器,则可能必须使用注册表编辑器作为疑难解答工具,这是一种更复杂…

【windows】添加共享打印机错误:0x000006ba

【问题描述】 添加共享打印机的时候&#xff0c;提示操作无法完成。 错误&#xff1a;0x000006ba。 【解决方法】 一、看下服务里 打印机服务Print Spooler是否正常启动&#xff1b; 二、打印机服务Print Spooler没有的话&#xff1b;&#xff08;开始–运行—services.msc 回…

vue3+ts封装图标选择组件

概要 讲解在vue3的项目中封装一个简单好用的图标选择组件。 效果 第一步&#xff0c;准备图标数据 数据太多&#xff0c;大家去项目中看。项目地址https://gitee.com/nideweixiaonuannuande/xt-admin-vue3 第二步&#xff0c;页面与样式编写 <template><div>…

【IDEA使用maven package时,出现依赖不存在以及无法从仓库获取本地依赖的问题】

Install Parent project C:\Users\lxh\.jdks\corretto-1.8.0_362\bin\java.exe -Dmaven.multiModuleProjectDirectoryD:\学习\projectFile\study\study_example_service "-Dmaven.homeD:\Program Files\JetBrains\IntelliJ IDEA2021\plugins\maven\lib\maven3" "…

Flink日志采集-ELK可视化实现

一、各组件版本 组件版本Flink1.16.1kafka2.0.0Logstash6.5.4Elasticseach6.3.1Kibana6.3.1 针对按照⽇志⽂件⼤⼩滚动⽣成⽂件的⽅式&#xff0c;可能因为某个错误的问题&#xff0c;需要看好多个⽇志⽂件&#xff0c;还有Flink on Yarn模式提交Flink任务&#xff0c;在任务执…

Linux基础环境开发工具的使用(yum,vim,gcc,g++)

Linux基础环境开发工具的使用[yum,vim,gcc,g] 一.yum1.yum的快速入门1.yum安装软件2.yum卸载软件 2.yum的生态环境1.操作系统的分化2.四个问题1.服务器是谁提供的呢?2.服务器上的软件是谁提供的呢?3.为什么要提供呢?4.yum是如何得知目标服务器的地址和下载链接呢?5.软件源 …

VMware打开centos黑屏解决方法汇总以及解决出现的bug(Centos7系统网络异常等)

VMware打开centos黑屏解决方法汇总 前言&#xff1a;一. VMware打开centos黑屏解决方法汇总一 .情况情况一&#xff1a;情况二情况三 二. 解决方法最简单的方法&#xff1a;一. 以管理员权限在命令行执行1. 管理员身份运行cmd2. 输入“netsh winsock reset”,回车3. 重启电脑即…

Python条件判断的运用

问题 在生活中&#xff0c;我们可以通过判断条件是否成立&#xff0c;来决定执行哪个分支。选择语句有多种形式&#xff1a;if语句&#xff0c;if-else语句&#xff0c;if-elif-else语句等。 Python使用if条件判断语句来实现条件判断时&#xff0c;可以在多个循环中实现对问题的…

Linux-----nginx的简介,nginx搭载负载均衡以及nginx部署前后端分离项目

目录 nginx的简介 是什么 nginx的特点以及功能 Nginx负载均衡 下载 安装 负载均衡 nginx的简介 是什么 Nginx是一个高性能的开源Web服务器和反向代理服务器。它的设计目标是为了解决C10k问题&#xff0c;即在同一时间内支持上万个并发连接。 Nginx采用事件驱动的异…

【云原生-K8s】Kubernetes安全组件CIS基准kube-beach安装及使用

基础介绍kube-beach介绍kube-beach 下载百度网盘下载wget下载 kube-beach安装kube-beach使用基础参数配置信息解读示例结果说明 基础介绍 为了保证集群以及容器应用的安全&#xff0c;Kubernetes 提供了多种安全机制&#xff0c;限制容器的行为&#xff0c;减少容器和集群的攻…

身份证二要素核验API:提高身份验证的精确性与效率

前言 在数字时代&#xff0c;身份验证已经成为各行各业的重要环节。无论是金融交易、电子商务还是在线服务&#xff0c;确保用户身份的准确性至关重要。身份证二要素核验API&#xff0c;作为一种先进的技术解决方案&#xff0c;正在逐渐崭露头角&#xff0c;为身份验证带来了精…

el-table中的el-input标签修改值,但界面未更新,解决方法

el-table中的el-input标签修改值&#xff0c;界面未更新 在el-table中的el-input里面写的change事件根本不触发&#xff0c;都不打印&#xff0c;试了网络上各种方法都没用 然后换成input事件&#xff0c;input事件会触发&#xff0c;但界面也未更新。我在触发事件的时候&…

Mac允许任何来源的的安装包进行安装

首先打开终端&#xff0c;开启“任何来源”&#xff0c;执行如下命令&#xff1a; sudo spctl --master-disable 然后回车&#xff0c;继续输入密码&#xff08;密码输入时是不可见的&#xff09;&#xff0c;然后回车。 接着打开【系统偏好设置】&#xff0c;选择【安全性与…

react-router

一、react-router是什么 react-router是一个用于管理React应用程序中路由的库。路由是指确定应用程序如何根据URL路径来渲染不同的组件和页面。使用react-router可以将应用程序的不同页面映射到不同的URL路径&#xff0c;以及在用户导航时动态地加载适当的组件。这样&#xff…

【实战Flask API项目指南】之五 RESTful API设计

实战Flask API项目指南之 RESTful API设计 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握 Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界时…

sublime怎么调中文?

Sublime Text是一个功能强大的文本编辑器&#xff0c;它被广泛使用于编码过程中。在开发过程中&#xff0c;Sublime Text界面的语言设置通常默认为英语&#xff0c;无法直接输入中文。那么如何调整Sublime Text编辑器的设置&#xff0c;以允许在界面中输入和编辑中文呢&#xf…

嵌入式web boa配置流程详解

boa配置流程详解 前期准备boa介绍操作目的下载boa 配置流程1.解压boa服务器2.配置Makefile3.编译boa服务器4.修改boa配置文件5.增加权限并编译cgi6.测试demo7.错误示例 附录A history附录B boa.conf 前期准备 boa介绍 Boa服务器是一个小巧高效的web服务器&#xff0c;是一个运…

虹科示波器 | 汽车免拆检修 | 2012 款上汽大众帕萨特车 发动机偶尔无法起动

一、故障现象 一辆2012款上汽大众帕萨特车&#xff0c;搭载CFB发动机&#xff0c;累计行驶里程约为12万km。车主反映&#xff0c;将点火开关置于起动挡&#xff0c;偶尔只能听到“咔哒”一声&#xff0c;起动机没有反应&#xff0c;类似蓄电池亏电时起动发动机的现象。为此&…

优思学院|质量管理工作困难重重,为何仍有人乐此不疲?

有一位网友说道&#xff1a;质量管理工作困难重重&#xff0c;为何仍有人乐此不疲&#xff1f;我完全理解他的困惑&#xff0c;质量管理工作的确是个不容易的任务&#xff0c;充满挑战&#xff0c;需要不断的努力和耐心。尽管如此&#xff0c;很多人依然选择从事这个领域的工作…

学习c++的第二天

目录 数据类型 基本数据类型 typedef 声明 枚举类型 类型转换 变量类型 变量定义 变量声明 左值&#xff08;Lvalues&#xff09;和右值&#xff08;Rvalues&#xff09; 变量作用域 数据类型 基本数据类型 C 为程序员提供了种类丰富的内置数据类型和用户自定义的数…
最新文章