一场冠军两场Top,我的CCF比赛总结!

2023-11-07 01:20

本文主要是介绍一场冠军两场Top,我的CCF比赛总结!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文是代码届的小白同学的分享,虽然刚入门学习,但已经有很多收获,希望能继续加油进步。

个人介绍

本人计算机专业研二在读,本科电子信息工程,由于疫情的原因,开学也晚了,很多都受到了影响,6月底七月初才开始学习机器学习的理论知识和深度学习的理论知识。

暑假两个月的学习过程中,感觉自己学的还行,就想找些比赛来看看,也是机缘巧合吧,看到Datawhale公众号Coggle数据科学在介绍CCF的算法比赛,就抱着尝试的心情,选择了几个报名。

7984c8e07493bfe94e588b12898b9411.png

从0基础入门Kaggle,到天池再到后来的CCF比赛,短短的几个月对数据科学竞赛有了一定的了解,希望后序的比赛和明年的CCF比赛中可以拿到前排大奖。

这次CCF比赛一共参与了6个比赛,五个正式赛和一个训练赛。(理论学习终归是理论,从理论到实践还是有一段距离的,从比赛中你可以学习到很多东西,也可以帮助你把学到的知识充分利用一下,比赛真的可以帮助你快速成长,多参加比赛多与大佬交流,你会进步的更快!)

其中有四个结构化的比赛,有两个NLP方面的比赛,留个比赛自己真正全程参与的就3个,还有一个也花了一些时间,有两个比赛就点了参赛,但是没有提及结果。

45944df6966f71b23bc17fccdff96cb7.png

女朋友是我不断上分的动力!

下面依次介绍一下自己全程参与的几个比赛吧,也总结一些从比赛中学到的知识。

室内用户运动时序数据分类

比赛地址:https://www.datafountain.cn/competitions/484

比赛类型:结构化、时序数据

这个赛题和队友的一起努力下,也取得了第一名的成绩,这个比赛我之前自己也写了一个baseline。

7d4a974bdbace73c5de4b8e6954c2c8e.png

数据简介

基于上述实际需求以及深度学习的进展,本次训练赛旨在构建通用的时间序列分类算法。通过本赛题建立准确的时间序列分类模型,希望大家探索更为鲁棒的时序特征表述方法。

6ebd300f31316509d8519683ac22c312.png

其实这个赛题是比较模糊的,没有给出很具体的说明,对于数据中的,一开始大家都是直接把数据丢到模型中去,然后直接提交结果就有一个不错的分数。

比赛收获

也是第一次接触这种时序类的题目,一开始也不知道如何下手,在队友分享的干货下,我们开始造特征,把造的特征加入到原来的数据中去,然后在一起训练,确实起到了不错的作用,分数提升的也是挺大的。

所以,如果当一个比赛给你的特征比较少,你要学会从给的数据中去挖掘新的特征,如下等等,一共造了30多新特征。

#统计特征    max_X=data.x.max()min_X=data.x.min()range_X=max_X-min_Xvar_X=data.x.var()std_X=data.x.std()mean_X=data.x.mean()median_X=data.x.median()kurtosis_X=data.x.kurtosis()skewness_X =data.x.skew()Q25_X=data.x.quantile(q=0.25)Q75_X=data.x.quantile(q=0.75)#聚合特征#差分值max_diff1_x=data.x.diff(1).max()min_diff1_x=data.x.diff(1).min()range_diff1_x=max_diff1_x-min_diff1_xvar_diff1_x=data.x.diff(1).var()std_diff1_x=data.x.diff(1).std()mean_diff1_x=data.x.diff(1).mean()median_diff1_x=data.x.diff(1).median()kurtosis_diff1_x=data.x.diff(1).kurtosis()skewness_diff1_x =data.x.diff(1).skew()Q25_diff1_X=data.x.diff(1).quantile(q=0.25)Q75_diff1_X=data.x.diff(1).quantile(q=0.75)

另外从这个比赛中还学到了Stacking的融合方法,加上构造的新特征,然后使用这种融合方法,分数提升特别特别大,其他的比赛我不清楚,至少这个比赛是这样的!

企业非法集资风险预测

比赛地址:https://www.datafountain.cn/competitions/469

比赛类型:结构化、分类

这个比赛官方给的数据还是比较多的,如何从多表中提取有用的特征是这个比赛的关键!

我之前也写了一个baseline分享,是在水哥的baseline基础改进的,最后排名A榜排名36,B榜79。整体还是不错的。

7020a50bc3d873dba52e3d91ed92407b.png

d16b3c2482dc4547dd889343b9fb82bd.png

数据简介

该数据集包含约25000家企业数据,其中约15000家企业带标注数据作为训练集,剩余数据作为测试集。数据由企业基本信息、企业年报、企业纳税情况等组成,数据包括数值型、字符型、日期型等众多数据类型(已脱敏),部分字段内容在部分企业中有缺失,其中第一列id为企业唯一标识。

数据说明

这里以第一个表base_info.csv为例,包含数据集7和8中涉及到的所有企业的基本信息,每一行代表一个企业的基本数据,每一行有33列,其中id列为企业唯一标识,列之间采用“,”分隔符分割。

700839fef6c2badd44a30a12b821f4d7.png

#读取数据
base_info = pd.read_csv(PATH + 'base_info.csv')
#输出数据shape和不重复企业id数
print(base_info.shape, base_info['id'].nunique())
#读取数据
base_info.head(1)
#查看缺失值,这里借助了missingno这个包,import missingno as msno。
msno.bar(base_info)#查看缺失值

41a68092cf0c6abe3816c3b1c8aaebe5.png

这个图就很明显的看出哪些数据存在缺失值,横轴是特征,纵轴的数据是非缺失值数,每个柱形的白色区域都代表缺失!

比赛收获

  • 特征的选择与构造

这个比赛给的数据中,很多表是存在缺失值的,对于缺失值的处理,对于特征的选择与构造,特征交叉、分桶等,都需要有一定的了解,因为好的特征是进行下一步模型训练的基础。关于特征的处理可以参考我之前写的一篇文章。

#orgid 机构标识 oplocdistrict 行政区划代码   jobid 职位标识 
base_info['district_FLAG1'] = (base_info['orgid'].fillna('').apply(lambda x: str(x)[:6]) == \base_info['oplocdistrict'].fillna('').apply(lambda x: str(x)[:6])).astype(int)
base_info['district_FLAG2'] = (base_info['orgid'].fillna('').apply(lambda x: str(x)[:6]) == \base_info['jobid'].fillna('').apply(lambda x: str(x)[:6])).astype(int)
base_info['district_FLAG3'] = (base_info['oplocdistrict'].fillna('').apply(lambda x: str(x)[:6]) == \base_info['jobid'].fillna('').apply(lambda x: str(x)[:6])).astype(int)#parnum 合伙人数 exenum 执行人数  empnum 从业人数
base_info['person_SUM'] = base_info[['empnum', 'parnum', 'exenum']].sum(1)
base_info['person_NULL_SUM'] = base_info[['empnum', 'parnum', 'exenum']].isnull().astype(int).sum(1)base_info['opfrom'] = pd.to_datetime(base_info['opfrom'])#opfrom 经营期限起 
base_info['opto'] = pd.to_datetime(base_info['opto'])#opto 经营期限止
base_info['opfrom_TONOW'] = (datetime.now() - base_info['opfrom']).dt.days
base_info['opfrom_TIME'] = (base_info['opto'] - base_info['opfrom']).dt.days#opscope 经营范围 
base_info['opscope_COUNT'] = base_info['opscope'].apply(lambda x: len(x.replace("\t", ",").replace("\n", ",").split('、')))#对类别特征做处理
cat_col = ['oplocdistrict', 'industryphy', 'industryco', 'enttype','enttypeitem', 'enttypeminu', 'enttypegb','dom', 'oploc', 'opform','townsign']#如果类别特征出现的次数小于10转为-1
for col in cat_col:base_info[col + '_COUNT'] = base_info[col].map(base_info[col].value_counts())col_idx = base_info[col].value_counts()for idx in col_idx[col_idx < 10].index:base_info[col] = base_info[col].replace(idx, -1)        
base_info = base_info.drop(['opfrom', 'opto'], axis=1)#删除时间for col in ['industryphy', 'dom', 'opform', 'oploc']:base_info[col] = pd.factorize(base_info[col])[0]

我自己在代码里把这些字段的含义都加上了,也便于自己理解这些含义,从而做一些处理,大家同样可以把这些含义加上。

  • 模型的选择

关于模型的选择大家基本都是选择集成学习的几个比较火的模型,比如XGboost、Lightgbm和Catboost等。

这些单模在很多比赛中就有不错的成绩,如果将这些模型的结果融合可能效果会更好,当然有的比赛可能几个模型的效果存在差异性,而且这些集成学习的模型可以自动对缺失值的特征自行处理!

但是建议大家去学习一下这几个集成学习的理论知识,对你的后序的学习或者比赛都有很大的帮助。

面向数据治理的内容分类

比赛地址:https://www.datafountain.cn/competitions/471

比赛类型:自然语言处理、文本分类

这是一个NLP相关的比赛,说实话NLP的相关理论我看的不多,所以这个比赛也算是一个作为个人学习的入门比赛吧,我也没有使用到深度学习的方法,用的是传统的机器学习做的,实验室也没有条件做深度学习,对深度学习的这块模型也只是做了简单的了解。

ed8b7e4cf25125f0d14e63ca6f9fa2f6.png

数据简介

  1. 已标注数据:共7000篇文档,类别包含7类,分别为:财经、房产、家居、教育、科技、时尚、时政,每一类包含1000篇文档。

  2. 未标注数据:共33000篇文档。

  3. 分类分级测试数据:共20000篇文档,包含10个类别:财经、房产、家居、教育、科技、时尚、时政、游戏、娱乐、体育。

cf259d63e91639feb8dadc9633807584.png

数据说明

这个比赛总体来说就是一个分类的任务,但是存在一个难点就是,官方只给了7个类别的训练集,但是需要你预测的是十个类别的,因此另外的三个类别就需要你自己给他们加上标签,然后在一起训练!

比赛收获

第一次接触NLP的知识,真的是小白一枚,很多理论知识也不是很了解,所以这个比赛也是投机取巧的方式吧,对文本类型的数据也学到了一些新的概念。

  • 思路1:TF-IDF+机器学习分类器

直接使用TF-IDF对文本提取特征,使用分类器进行分类,分类器的选择上可以使用SVM、LR、XGboost等

  • 思路2:FastText

FastText是入门款的词向量,利用Facebook提供的FastText工具,可以快速构建分类器

  • 思路3:WordVec+深度学习分类器

WordVec是进阶款的词向量,并通过构建深度学习分类完成分类。深度学习分类的网络结构可以选择TextCNN、TextRnn或者BiLSTM。

  • 思路4:Bert词向量

Bert是高配款的词向量,具有强大的建模学习能力。

总结

第一次参加这种数据科学竞赛,收获也是蛮多的,在比赛中可以快速的成长,和其他同学交流,可以学到很多新的知识,有些内容可能只是在理论中看到过,但是并没有实际操作过。

通过竞赛可以学到更多理论中看不到的技巧和方法,第一次的CCF比赛圆满结束,转战其他的比赛吧,明年的CCF比赛我还会回来的!

 竞赛交流群 邀请函 #

126d653084a74b0c3e65d01b1b6b115a.png

△长按添加竞赛小助手

添加Coggle小助手微信(ID : coggle666)

13f2ade8959f1a9c389fd43c9056b993.png干货学习,三连

这篇关于一场冠军两场Top,我的CCF比赛总结!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/360292

相关文章

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

整数Hash散列总结

方法:    step1  :线性探测  step2 散列   当 h(k)位置已经存储有元素的时候,依次探查(h(k)+i) mod S, i=1,2,3…,直到找到空的存储单元为止。其中,S为 数组长度。 HDU 1496   a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 。 x在 [-100,100] 解的个数  const int MaxN = 3000

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel