企业非法集资风险预测_2020CCF--企业非法集资风险预测83.35baseline

333d4318236ac8e30cca4da905594f9b.png
企业非法集资风险预测 竞赛 - DataFountain​www.datafountain.cn
b50d16067845d0ea42964f26edc14e06.png
代码地址​github.com

欢迎大家开源关注我的github仓库以及该知乎专栏,该仓库用于记录和定期提供各大数据科学竞赛的赛事消息和原创baseline,思路分享以及博主的一些竞赛心得和学习资料等. 主要涵盖:kaggle, 阿里天池,华为云大赛校园赛,百度aistudio,和鲸社区,datafountain等。目前已经总结了多个比赛的获奖方案和baseline

赛题描述:

背景:非法集资严重干扰了正常的经济、金融秩序,使参与者遭受经济损失,甚至生活陷入困境,极易引发社会不稳定和大量社会治安问题,甚至引发局部地区的社会动荡。如何根据大量的企业信息建立预测模型并判断企业是否存在非法集资风险,对监管部门、企业合作伙伴、投资者都具有一定的价值。任务:利用机器学习、深度学习等方法训练一个预测模型,该模型可学习企业的相关信息,以预测企业是否存在非法集资风险。赛题的难点在于数据集包括大量的企业相关信息,如何从中提取有效的特征并进行风险预测成为本赛题的关键问题

解决思路:

目前只提交了9次,后续有时间会继续做,所以还会继续更新效果更好的代码!目前的特征基本没有怎么做,所以改进空间还有很大。目测好好做数据和特征筛选会取得很好的成绩,但是最稳的还是有一个稳定的线下验证,如果有一个和线上同升/降的验证集,比赛基本拿下一半了
  1. 缺失值填补(一半缺失的列删除,对于类别特征:NaN当作单独一个类别进行数值编码)
  2. object类型数值编码
  3. 交叉特征和分桶特征,对于几个重要的特征(企业类别,细分类这种做交叉特征是很有意义的)
  4. merge每一个表格的数据(基本信息表,纳税表,年度报表,变动表,舆论表,其余)
  5. 选出category特征给catboost单独指定
  6. 暴力搜索参数
  7. 随机森林单模五折交叉验证:线下:832,线上:829
  8. catboost单模五折交叉验证:线下:841,线上:828
  9. 随机森林+catboost融合(取前20重要的特征:线上834
  10. 特征筛选十分重要,避免过度拟合到线下的验证数据
  • 缺失值填补(一半缺失的列删除,对于类别特征:NaN当作单独一个类别进行数值编码)
  • object类型数值编码
  • 交叉特征和分桶特征,对于几个重要的特征(企业类别,细分类这种做交叉特征是很有意义的)
  • merge每一个表格的数据(基本信息表,纳税表,年度报表,变动表,舆论表,其余)
  • 选出category特征给catboost单独指定
  • 暴力搜索参数
  • 随机森林单模五折交叉验证:线下:832,线上:829
  • catboost单模五折交叉验证:线下:841,线上:828
  • 随机森林+catboost融合(取前20重要的特征:线上834
  • 特征筛选十分重要,避免过度拟合到线下的验证数据

数据分析:

本赛题数据缺失值较多,除了企业的基本信息较为齐全外,其余各表信息均有缺失。很多企业id空缺 训练集总共14865条样本,其中正例:13884,负例981.约为14:1.

下面是对数据的初步分析:

base_info=pd.read_csv('train/base_info.csv')#企业的基本信息
annual_report_info=pd.read_csv('train/annual_report_info.csv')#企业的年报基本信息
tax_info=pd.read_csv('train/tax_info.csv')#企业的纳税信息
change_info=pd.read_csv('train/tax_info.csv')#变更信息
news_info=pd.read_csv('train/news_info.csv')#舆情信息
other_info=pd.read_csv('train/other_info.csv')#其它信息
entprise_info=pd.read_csv('train/entprise_info.csv')#企业标注信息{0: 13884, 1: 981}
entprise_evaluate=pd.read_csv('entprise_evaluate.csv')#未标注信息print('base_info shape:',base_info.shape,'id unique:',len(base_info['id'].unique()))
print('annual_report_info shape:',annual_report_info.shape,'id unique:',len(annual_report_info['id'].unique()))
print('tax_info shape:',tax_info.shape,'id unique:',len(tax_info['id'].unique()))
print('change_info shape:',change_info.shape,'id unique:',len(change_info['id'].unique()))
print('news_info shape:',news_info.shape,'id unique:',len(news_info['id'].unique()))
print('other_info shape:',other_info.shape,'id unique:',len(other_info['id'].unique()))
print('entprise_info shape:',entprise_info.shape,'id unique:',len(entprise_info['id'].unique()))
print('entprise_evaluate shape:',entprise_evaluate.shape,'id unique:',len(entprise_evaluate['id'].unique()))

处理base_info数据:主要是对数据object列进行数值编码

# #处理base_info数据
base_info_clean=base_info.drop(['opscope','opfrom','opto'],axis=1)#............................对object类型进行编码...............................
base_info_clean['industryphy']=base_info_clean['industryphy'].fillna("无")
base_info_clean['dom']=base_info_clean['dom'].fillna("无")
base_info_clean['opform']=base_info_clean['opform'].fillna("无")
base_info_clean['oploc']=base_info_clean['oploc'].fillna("无")
#
dic={}
cate=base_info_clean.industryphy.unique()
for i in range(len(cate)):dic[cate[i]]=ibuf = pd.DataFrame()
buf_group = base_info_clean.groupby('industryphy',sort=False)
for name,group in buf_group:group['industryphy'] = dic[name]buf = pd.concat([buf,group],ignore_index=True)
print('finished 1....')
#
dic={}
cate=buf.dom.unique()
for i in range(len(cate)):dic[cate[i]]=ibuf_group = buf.groupby('dom',sort=False)
buf = pd.DataFrame()
for name,group in buf_group:group['dom'] = dic[name]buf = pd.concat([buf,group],ignore_index=True)
print('finished 2....')
#
dic={}
cate=buf.opform.unique()
for i in range(len(cate)):dic[cate[i]]=ibuf_group = buf.groupby('opform',sort=False)
buf = pd.DataFrame()
for name,group in buf_group:group['opform'] = dic[name]buf = pd.concat([buf,group],ignore_index=True)
print('finished 3....')
#
dic={}
cate=buf.oploc.unique()
for i in range(len(cate)):dic[cate[i]]=ibuf_group = buf.groupby('oploc',sort=False)
buf = pd.DataFrame()
for name,group in buf_group:group['oploc'] = dic[name]buf = pd.concat([buf,group],ignore_index=True)
print('finished 4....')
#
buf=buf.fillna(-1)
#
buf_group = buf.groupby('id',sort=False).agg('mean')
base_info_clean=pd.DataFrame(buf_group).reset_index()
#
print('编码完毕.................')

对一些重要的特征进行交叉组合和分桶构造新特征

#........................分桶.................................
def bucket(name,bucket_len):gap_list=[base_info_clean[name].quantile(i/bucket_len) for i in range(bucket_len+1)]len_data=len(base_info_clean[name])new_col=[]for i in base_info_clean[name].values:for j in range(len(gap_list)):if gap_list[j]>=i:encode=jbreaknew_col.append(encode)return new_col
#注册资本_实缴资本
base_info_clean['regcap_reccap']=base_info_clean['regcap']-base_info_clean['reccap']
#注册资本分桶
base_info_clean['regcap']=base_info_clean['regcap'].fillna(base_info_clean['regcap'].median())
base_info_clean['bucket_regcap']=bucket('regcap',5)
#实缴资本分桶
base_info_clean['reccap']=base_info_clean['reccap'].fillna(base_info_clean['reccap'].median())
base_info_clean['bucket_reccap']=bucket('reccap',5)
#注册资本_实缴资本分桶
base_info_clean['regcap_reccap']=base_info_clean['regcap_reccap'].fillna(base_info_clean['regcap_reccap'].median())
base_info_clean['bucket_regcap_reccap']=bucket('regcap_reccap',5)
print('分桶完毕.................')
#.............................交叉.........................
#作两个特征的交叉
def cross_two(name_1,name_2):new_col=[]encode=0dic={}val_1=base_info[name_1]val_2=base_info[name_2]for i in tqdm(range(len(val_1))):tmp=str(val_1[i])+'_'+str(val_2[i])if tmp in dic:new_col.append(dic[tmp])else:dic[tmp]=encodenew_col.append(encode)encode+=1return new_col
#作企业类型-小类的交叉特征
base_info_clean['enttypegb']=base_info_clean['enttypegb'].fillna("无")
base_info_clean['enttypeitem']=base_info_clean['enttypeitem'].fillna("无")
new_col=cross_two('enttypegb','enttypeitem')#作企业类型-小类的交叉特征
base_info_clean['enttypegb_enttypeitem']=new_col
#
#行业类别-细类的交叉特征
base_info_clean['industryphy']=base_info_clean['industryphy'].fillna("无")
base_info_clean['industryco']=base_info_clean['industryco'].fillna("无")
new_col=cross_two('industryphy','industryco')#作企业类型-小类的交叉特征
base_info_clean['industryphy_industryco']=new_col
print('交叉特征完毕.................')

处理其它几个表格的方式相同,完整代码见文章开头的github地址!

目前没有几个手工特征,之前试过一个特征不做,就用原始数据也能到82.5+的成绩。所以模型的改进空间还有很大,预祝大家取得好成绩!

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

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

相关文章

协程,IO模式

1、协程(别人的模块,达到单线程并发效果) 程序的运行状态: 阻塞: IO阻塞 非阻塞: 运行 就绪 单线程实现并发: 在应用程序里控制多个任务的切换保存状态 可以把IO减下来,但是不可能降…

php中mysql和mysqli_php mysqli中-和::有什么区别?

->用来访问实例的成员,一般左面是一个类实例(或者$this), 右面是一个函数或者属性. 箭头也可以通过类实例来访问静态函数.::用来访问静态成员、常量,访问父类中的成员. 一般左面是一个类名,或self、parent、static关键字, 右面是一个静态函…

全国计算机等级考试题库二级C操作题100套(第05套)

第05套: 给定程序中,函数fun的功能是将参数给定的字符串、整数、浮点数写到文本 文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoi和atof将 字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。 请在程序的下划…

华为p40 pro原理图_4188起 华为P40/Pro/Pro+国行发布 顶配8888 河图正式上线!

声音 | 小白昨天晚上19:30,华为举行了时长两个多小时的新品发布会,正式带来了华为P40系列国行版,以及一系列的手机配件类新品和其他新品(见后面的文章),由于详细配置之前海外发布会已经公布的差不多了,咱废…

mysql日期加减

1. MySQL 为日期增加一个时间间隔:date_add() set dt now(); select date_add(dt, interval 1 day); - 加1天 select date_add(dt, interval 1 hour); -加1小时 select date_add(dt, interval 1 minute); - 加1分钟 select date_add(dt, int…

Chapter2(变量和基础类型)--C++Prime笔记

数据类型选择的准则:①当明确知晓数值不可能为负时,选用无符号类型。②使用int执行整数运算。在实际应用中,short常常显得太小而long一般和int有一样的尺寸。如果运算范围超过int的表示范围,则选用long long。③在算术表达式中不要…

redis 值字符串前面部分乱码_StringBoot 整合Redis解决存储乱码(通过StringRedisSerializer来进行序列化)...

org.springframework.bootspring-boot-starter-redis1.4.7.RELEASE注意:spring-boot-starter-data-redis与spring-boot-starter-redis引入的包基本一致,都是基于Jedis的,所以没区别。第一种方法:在你需要调用RedisTemplate的类中引…

全国计算机等级考试题库二级C操作题100套(第06套)

第06套: 给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正确时, 程序输出: x15.000000, x23.000000, x1x1x1x240.000000 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。 注意:源程序…

最新处理器排名_安兔兔Android处理器天梯榜发布:最强的还是它

点击上方蓝字【安兔兔】关注我文章每天不断更!为了让大家对自己使用的手机处理器性能有一个更直观的认知,安兔兔今天正式发布了Android手机处理器天梯榜。由于安兔兔V8增加了存储和刷新率在总分方面所占据的权重,因此为了避免手机配置对排名造…

vue动态切换css文件_如何在vue组件中动态的引入css文件?

问题描述如标签描述的不准确,请见新直能分支调二浏页器朋代说谅我的需求是开的接都上的和,近很触是没他电同近很触是没发多套皮肤,打包的时候只加载其中某一种的皮肤(不需要动态换肤),因为css文件过大,后期配套的css文…

fastreport 直接调网络打印机_为什么UV打印机不能打印凹凸不平的材料?

大家都知道UV打印机又叫万能平板打印机,顾名思义就是什么都能打?答案当然是否定的!万能只是说它可以打印的材料很广泛,而不是大家根据字面所理解的。那么什么样的材料是UV打印机所不能打印的呢?今天小编就单单讲讲其中…

[译]JavaScript:ES6中的模板字符串简介

原文:http://tc39wiki.calculist.org/es6/template-strings/ ES6中的模板字符串(template string)是一种能在字符串文本中内嵌表达式的字符串字面量(string literal).这种操作在其他语言(比如shell->perl->php等)中通常称之为字符串内插(string interpolation)或者叫变量…

全国计算机等级考试题库二级C操作题100套(第07套)

第07套: 程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的信息。函数fun的功能是输出这位学生的信息。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLA…

【NOI 2018】归程(Kruskal重构树)

题面在这里就不放了。 同步赛在做这个题的时候,心里有点纠结,很容易想到离线的做法,将边和询问一起按水位线排序,模拟水位下降,维护当前的各个联通块中距离$1$最近的距离,每次遇到询问时输出所在联通块的信…

jdbc连接mysql数据库的常用对象_JDBC常用对象

主要作用:注册驱动 实际开发中使用Class.forName("com.mysql,jdbc.Drive");这种方式,因为之前的方式会导致注册两次驱动获得连接 Connection getConnection(String url,String username,String password)url写法:jdbc:mysql://loca…

latex大括号 多行公式_如何快速入门 LaTeX,在 XMind 2020 中轻松输入方程。

数学方程输入对于很多理工科朋友来说是一件让人头疼的事情。不仅是数学方程本身就纷繁复杂花样百出,各种输入语法更是劝退无数人。然而很多看似复杂的东西其实并非如想象中的难,抓住本质即可快速入门。今天和大家分享下如何快速入门 LaTeX,在…

全国计算机等级考试题库二级C操作题100套(第08套)

更多干货推荐可以去牛客网看看,他们现在的IT题库内容很丰富,属于国内做的很好的了,而且是课程刷题面经求职讨论区分享,一站式求职学习网站,最最最重要的里面的资源全部免费!!!点击进…

部署及配置Lync Server 2013 监控功能

在上面一篇文章中我们已经部署了存档功能,并且在标准版环境搭建了一台SQLServer服务器作为后端数据库服务器,有了这台服务器我们可以做什么呢?存档,当然还有监控,以及整个CMS。当然这都是一步一步演变的,并…

python处理excel的方法有哪些_python简单处理excel方法

1 # codingutf-8 2 3 import xlrd # 读模块4 import xlwt # 写模块5 6 7 def read_excel():8 """9 读取excel文件方法说明(此函数只是对xlrd用法的说明,看看就好。xlrd已经很好用了)10 :return:11 """12 # 打开…

mysql 客户服务号获取_《MySQL排错指南》——1.4 获取查询信息-阿里云开发者社区...

本节书摘来自异步社区出版社《MySQL排错指南》一书中的第1章,第1.4节,作者:【美】Sveta Smirnova(斯维特 斯米尔诺娃),更多章节内容可以访问云栖社区“异步社区”公众号查看。1.4 获取查询信息正如前一节看到的一样,数…