【数据科学竞赛入门】从往届腾讯广告大赛看如何入坑数据挖掘竞赛

目录

0.前言

1.分析任务 – 知道要干什么

2.准备一个baseline – 快速占坑

Extra1 更好的baseline

3.特征构建/相关技巧 – 真正的难点

3.1 基本统计

3.2 组合统计

3.3 word2vec技巧

3.4 转化交叉统计

Extra2-平滑转化特征

4.构造你的模型 – 决胜

4.1模型选择/训练

4.2模型融合

Extra3 Stacking

5.总结 – 如果你想拿个好名次?


0.前言

一年一度的腾讯算法竞赛(神仙打架竞赛/奥斯卡演义大赛)要开始了,由于这个竞赛也是我入坑数据科学的起点,本人也乘着这个势头分享一点如何比赛的经验。

由于博主入坑晚(研二入的坑),实际腾讯竞赛也就参加了两届(2017和2018)。18年那场还是一边搞毕设一边弄的,最后决赛拿了个69名草草收场了(后来便成为了社畜没再参加过)。所以这里只会介绍我参加过得两次竞赛,主要以2018届竞赛课题为主,当时赶着入职,打完比赛也没写总结,算是两年后的填坑吧。

P.S 本文旨在帮助萌新入坑,尽可能详细地介绍如何尽快融入腾讯算法竞赛中,并梳理一些常见的竞赛技巧(理论上其他数据科学竞赛也是一个套路,可以参考)。不过鉴于2019和2020年的比赛我没有参加,今年的情况也能与以前大不相同的,所以仅供参考(或者你可以把该文看成一篇机器学习案例教程也行)。

P.P.S 博主虽然现在还在做数据挖掘相关工作,但是两年没接触社交广告了,写这博客一来是蹭热度,而来算是做复习。文中肯定有勘误,就请大佬谅解了。

 

本文相资源如下(有git的可以帮忙给个星):

2018源码(决赛69名):https://github.com/BladeCoda/Tencent2018_Final_Phrase_Presto

2018腾讯算法竞赛任务手册:https://pan.baidu.com/s/1xDWQbpvvSikTxn1x1csJgQ 提取码:u5jr

2018腾讯算法竞赛初赛数据(由于复赛数据太大了,就不给了,初赛复赛数据格式是一样的):https://pan.baidu.com/s/1M0Ch4az50_RtGotmUJgqJA 提取码:50du

 

其他相关资源:

2017源码(决赛23名):https://github.com/BladeCoda/Tencent2017_Final_Coda_Allegro

2017年相关博客分享:https://blog.csdn.net/haphapyear/article/details/75057407

 

1.分析任务 – 知道要干什么

俗话说“透过现象看本质”,做一个数据竞赛的第一步就是知道你要干嘛。以2018年的算法竞赛为例。参考手册的描述:

 

光看这个描述可能很多人都不知道这个到底是要看嘛,所以我的建议是“看答卷”。解压出上面初赛数据,你会看到“train.csv”和“test.csv”的文件,训练数据如下,可以看到,里面就3列数据:aid(广告ID),uid(用户ID),label(标签):

而这个”test.csv”(有两个,对应比赛两个阶段,形式上没区别)就是该算法竞赛选手需要提交的内容,里面没有label,需要选手提供。结合上面的描述,不难看着这个比赛真正的目的:“给你用户与广告,要你判断该用户是否为广告的目标人群”.

实际上,这就是一个机器学习二分类的问题(“是1”或者“不是0”),不过该比赛会要你给出一个概率(用户是广告目标人群的概率),而非简单预测一个0, 1的label。知道这点后,恭喜你顺利入了本次比赛的大坑。你下一步就是以aid和uid出发,充分利用竞赛给你的数据信息,来得出所有“test.csv”中各组用户属于广告潜在目标的概率值,算的最准的就是赢家。

 

2.准备一个baseline – 快速占坑

知道任务后,当务之急就是能得到一个可以输出提交结果的模型,这个模型不需要想的很复杂。你只需要将竞赛你提供的用户特征与广告特征关联你的aid和uid,便能得到一份最简单的。

参考我的2018年源码的第一部分“preProcessing.py”,该代码的功能很简单,就是将大赛提供的“adFeature.csv”与“userFeature.csv”中的特征,同“train.csv”与“test.csv”绑定起来,得到一份简单的包含特征的csv文件:“merge_m_train.csv”与“merge_m_test.csv”。接下来就将” merge_m_train.csv”灌到一个二分类模型里去训练,得到测试样本的概率就行了,这里我选的LGB模型(后面会详细介绍模型训练,这里一笔带过),参考我的“traing_LGB.py”代码。如果想试试效果只需要修改下main函数的输入即可,如下:

#主函数入口
if __name__=='__main__':
   print('LGB')
   pre=cross_validat('data/feature/merge_m_train.csv',0.2)
   predictSubmission('data/feature/merge_m_train.csv','data/feature/merge_m_test1.csv')

cross_validat为常见的五折验证,即取80%的训练样本训练,剩下20%用来评估模型的效果。predictSubmission则是使用全部训练样本训练,来推理测试样本的prob用来提交。你可以看到模型为测试样本输出了相应的概率值。

到这里你便完成了入坑,打通了从原始数据到提交结果的流程(是不是很快?)。当然上面的一切都是”Hello World”,接下来的特征构建才是重点。

Extra1 更好的baseline

在我的开源里有一个独立的“oneHotModel”文件夹,这里有一个更强大的baseline但是需要你有一个强大的机器。在官方提供的特征中,大部分都是脱敏后的离散ID数据(比如用户ID,广告ID…)。虽然在上面的介绍中我直接把这些信息丢给模型去学习,但是这是不合理的,因为离散数据不能直接作为连续值的特征看待

对离散值特征最简单的处理方法便是独热编码(one hot),举个例子,假设将人分为:[学龄前,小学生,中学生,大学生,社会人士]

这5个类别 (典型的离散型特征),那么one hot对一个大学生x的向量表示就是:x = [0,0,0,1,0]

这样经过one hot表示后,机器学习模型才能合理处理离散数据,但是问题也很明显-“很吃硬件”。如果一个离散特征有100个取值,那么这个特征最终的维度将是100维。而后续训练的消耗也可想而知。但这个baseline十分强大,以至于2018初赛早期光靠这个全独热的baseline,不做任何特征开发,也能稳坐TOP100。由于跑这个baseline起码你要有一台服务器(或云环境),因此我后续不会在这个模型的基础上介绍,而是介绍如何在前面那个看上去很low的baseline上做改进。(我实际比赛时还是用上了这个模型,这个留到最后模型融合章节说)

题外话:这个其实是2018年某大佬开源的baseline,当时这个开源导致有机器(跑得动这个baseline)和没机器的玩家出现了排名上的割裂,但其实这个baseline在理论上没有任何可讲的东西。也就是说,如果你确实想在这个比赛中获得好成绩,还是需要硬件支撑的,起码有硬件你可以为所欲为。

 

3.特征构建/相关技巧 – 真正的难点

通常来说对于一个数据挖掘任务,最重要的部分便是特征的挖掘与构建。事实上,第2节将aid与uid关联信息就是等于加入了特征,接下来要做的便是充分理解题目的业务背景与需求,构建更多“能够指导用户是否为广告潜在用户”的信息(特征)

接下来,我将详细介绍在2018年比赛我使用的一个特征,已经相关的一些数据分析的技巧。参考的代码中的“feature_dig_v1.py”~“feature_dig_v8.py”,每个文件都是基于上一个文件构造的特征数据的基础上添加特征的,且每个feature_dig生成的中间文件都可以输入“traing_LGB.py”来评估分类效果,以供展示特征的有效性。

* 当然,2018年的TOP选手已经出现了很多使用AI深度模型来自动学习特征的案例,有兴趣的可以去搜下这些大佬的作品,我这里仅从新手角度介绍一些传统方法。

3.1 基本统计

在看这节时建议你详细阅读课题手册,这里不会介绍手册中提到的基本特征信息。首先介绍的是最基本的统计特征,比如计算统计,这部分的统计详情见“feature_dig_v1.py”至”feature_dig_v3.py”(请依次运行)。顾名思义,即对官方提供的某些信息进行计数统计,例如样本中的aid在全体数据中出现的频数,用户的兴趣个数,主题个数等等。

计数特征主要是用于强调一些高频统计项,比如某个aid反复出现在数据中(那它可能是热门APP),某个用户有很多兴趣(反映出某个用户兴趣广泛),某个用户安装了大量的APP(他可能是个搞手机测试的,手动滑稽)等等。这些基本统计的计数特征毫无技巧可言,是你数据挖掘的第一步。唯一需要注意的是统计的策略,这里我将“train.csv”和“test.csv”合并起来一起统计,以保证统计时训练与测试样本信息对等。下表为我使用的计数统计特征:

特征名

描述

count_i{i}

当前用户第i个兴趣组的兴趣个数。

count_k{i}

当前用户第i个喜好关键词组的项目个数。

count_t{i}

当前用户第i个喜好主题组的项目个数。

count_aa

用户活跃APP个数

count_ai

用户安装APP个数

i{i}_e

对用户的第i个兴趣组编号后计数

k{i}_e

对用户的第i个关键词组编号后计数

t{i}_e

对用户的第i个主题组编号后计数

{feature}_c

对指定特征做计数统计,这里计数feature有:

[aid, uid, adid, camid, creid]

* 每个阶段添加新特征后,代码会生成“data/feature/train_vX.csv”与“data/feature/test_vX.csv”的中间文件,传入“traing_LGB.py”即可评估当前特征的分类效果,后面不再赘述。

 

3.2 组合统计

       还是很简单的计数特征,即两两组特征结合在一起计数,主要用来反映特征的高频组合,举个例子:女生可能比男生更喜欢服装类的广告,但是当用户年龄过高时,对时装的喜好可能和性别就没什么关系了。 简单来说,就是把两个特征项组合成元组来计数统计(本质还是计数),我当时只对广告特征进行了组合计数统计,说实话这里特征效果其实很一般,能不用就不用。如果你的模型够强,应该是能自动学习到特征间的组合关系的,而不是自行指定提取。组合统计在“feature_dig_v4.py”里,我使用的组合统计特征有:

特征名

描述

adv_ad

对广告ID与广告主ID组合计数。

cam_ad

对广告ID与推广计划主ID组合计数。

pro_ad

对广告ID与产品ID组合计数。

adc_ad

对广告ID与广告类型ID组合计数

 

3.3 word2vec技巧

 这里开始就有些干货了(其实还是很low),如果你观察用户特征会发现,用户的兴趣等特征时一个ID列表,这种信息当然不能喂给机器学习模型,我们需要对用户的兴趣进行提炼,这里是我当时使用的一个有效方法。我们可以把用户的特征列表[id1, id2, …, id_x]看出是一个文本,为什么可以这样呢?因为相似用户的兴趣可能很相近,因此他们兴趣的组合可能也会很相似:比如一个二次猿很大几率同时喜欢漫画和动画。因此,用户的兴趣列表存在着类似于自然语言的上下文关系

 我这里通过NLP经典的词向量Word2vec来学习用户兴趣(或主题等其他特征列表)的上下文分布,将各个兴趣映射为向量,然后对兴趣向量做聚类提取用户的兴趣细节信息。具体做法参考“feature_dig_v5.py”至”feature_dig_v7.py”。步骤与代码略讲解如下:

Step1. 训练兴趣的词向量:将一个兴趣ID看做一个“单词”,而一个用户的兴趣列表即为一条“文本”,套用gensim库的word2vec训练即可。

def trainingForWords(sentences,filepath,fnum):
    #设定词向量参数

    print('开始训练') 
    num_features=fnum #词向量的维度
    min_word_count=5 #词频数最低阈值
    num_workers=-1 #线程数,想要随机种子生效的话,设为1
    context=10 #上下文窗口大小
    downsampling=1e-3 #与自适应学习率有关
    num_iter=15
    hs=0
    sg=1#是否使用skip-gram模型
    
    model_path=filepath
    model=Word2Vec(sentences,workers=num_workers,hs=hs,
                   size=num_features,min_count=min_word_count,seed=77,iter=num_iter,
                   window=context,sample=downsampling,sg=sg)
    model.init_sims(replace=True)#锁定训练好的word2vec,之后不能对其进行更新 
    model.save(model_path)#讲训练好的模型保存到文件中
    print('训练完成')
    return model

Word2vec训练很耗时,机器不行迭代次数可以少一点.

Step2. 对兴趣进行聚类:由于个兴趣ID都被映射为了向量,这边便能对各个兴趣根据相似性进行聚类,这里使用最简单的kmeans:

def knnClusterForW2V(filepath,outpath,cluster_num):
    W2Vmodel=loadForWord(filepath)
    vocab=list(W2Vmodel.wv.vocab.keys())
    vectors=[W2Vmodel[vocab[i]] for i in (range(len(vocab)))]
    print('开始聚类')
    clf=KMeans(n_clusters=cluster_num,random_state=77)
    clf.fit(vectors)
    print('聚类完成,开始讲词典转化为类别字典')
    dict_re={vocab[i]:clf.labels_[i] for i in range(len(vocab))}
    print('保存字典。。。。')
    with open(outpath,'wb') as f:
        pk.dump(dict_re,f)
    return dict_re

Step3. 获取用户兴趣里最频繁的类别:最后我们对用户所有的兴趣取其聚类类别,然后根据出现最频繁的那个类别来构造特征

def flist2clusterFeature(flist,dic,c_num):
    re=[]
    print('开始进行转化')
    for item in flist:
        if isinstance(item,float):
            re.append(c_num)
        else:
            clist=[]
            for i in item.strip().split(' '):
                if i not in dic:
                    clist.append(c_num)
                else:
                    clist.append(dic[i])
            re.append(getMaxCnum(clist))
    print('转化完成')
    return re

由于Word2Vec的训练方式有很多种(使用HS或负采样,用CBOW或skip_gram),因此我训练了很多组类似的特征(充数),具体的特征有:

特征名

描述

k1_ec, k2_ec

对兴趣关键词1,2做skipgram聚类特征

t1_ec, t2_ec

对兴趣主题1,2做skipgram聚类特征

k1_ec_cbow, k2_ec_cbow

对兴趣关键词1,2做cbow聚类特征

t1_ec_cbow, t2_ec_cbow

对兴趣主题1,2做cbow聚类特征

……

其他特征类似,比如把负采样改为HS,不一一列全。

至于为什么只用对兴趣主题1,2和关键词1,2构造w2v聚类特征,一来是因为扛不住,二来类似的特征构造多了基本也无法产生后续提升了

*如果你对word2vec感兴趣,可以阅读这篇博客,这里不做介绍了https://www.cnblogs.com/peghoty/p/3857839.html

 

3.4 转化交叉统计

一般来说,我们可以称正例“用户是广告的潜在用户”为一次“转化”(即为正样本),那么显然“历史转化”统计时很强大的特征:比如某个用户作为潜在用户出现的次数,或者某个广告历史的潜在用户数量(广告历史转化越多,它越可能是热门)。但是这里变出现了一个问题,这里转化特征需要用到label信息,而我们只有“train.csv”中能拿到label,“test.csv”中没用label(当然没有,否则这比赛就告诉你答案了)。我们就不能像3.1的特征一样拼接“train.csv”和“test.csv”来进行计数,需要使用一个常见的转化特征统计技巧“交叉统计”。

简单来说,就是扣掉一部分训练数据的label,用剩余有label的数据来计算扣掉label的数据的统计特征,已达到和测试数据对等的条件(因为测试数据也没有label)。交叉统计特征见“feature_dig_v8.py”,详细构造步骤如下:

Step1: 对训练数据进行窗口切分:例如这里我将训练数据平均切为5等分。

Step2: 训练数据构造特征:使用窗口2~5的训练数据统计窗口1中的转化特征,使用窗口1,3,4,5的训练数据统计窗口2的转化特征,以此类推。原则就是统计当前传统的转化特征时,不能使用本窗口的label(因为对验证集构造交叉特征时,也取不到label),大致的图例如下:

Step3: 测试数据构造特征:看到这里你会发现一个问题,对训练数据构造交叉统计特征,每一份窗口数据都是拿剩余的4份窗口数据计算的。那么对测试数据构造特征,也当然只能拿4/5的训练数据来统计,否则就不对等了。当时很简单地就使用了训练数据的头4/5,现在想想当时很蠢,这样会造成测试数据的统计和训练数据第5个窗口的统计完全一样(第5个窗口,也是使用的训练数据头4/5统计的),可以尝试更好的方法(比如打乱训练数据顺序后取4/5等)。

可以看到,这个其实就行机器学习常见的交叉检验(cross validation)的变形应用,所已一般管这种特征交交叉统计特征。这里我使用的交叉特征有:

特征名

描述

uid_w

对用户ID做交叉转化次数统计。

cid_w

对推广计划主ID做交叉转化次数统计。

pid_w

对产品ID做交叉转化次数统计。

aid_w

对广告ID做交叉转化次数统计

 

Extra2-平滑转化特征

鉴于18届比赛渣电脑无法应付巨大数据量,有部分特征当时没有用到,因此在这里大致补充下,这些特征在2017届比赛时使用过,有兴趣可以参考下我当时的分享。

这里介绍的有一个比较经典的广告特征,即转化平滑。在3.4中我们介绍了与转化有关的特征,这类特征其实就是带上了label做统计,但是同时这么做会很危险,当你的构造的特征与label相关性过高,就会造成“标签泄露”,导致训练时效果很好,但是提交结果却完全崩掉。例如:你统计了某个用户的转化次数,但是这个用户只在训练集里出现了一次,就会导致这个用户的转化特征(1次)与label值(1)相等,而模型直接过拟合。此外,转化特征还会收到时间因素的影响:比如一个广告上线比较晚,那么你对该广告统计的转化次数自然也就越少,但实际这个广告可能很热门。

为了使转化特征更“保险”,这里会进行“平滑”处理:即利用整体数据为转化特征学习一个先验值,然后再在这个值得几次上做统计。这里便缓解了后上线广告,以及低频出现的用户对转化特征的带来的危险。有兴趣的可以学习下这篇博客:https://blog.csdn.net/mytestmy/article/details/19088519

 

4.构造你的模型 – 决胜

某种意义上来说,如果你的模型很牛批,可能特征工程都没那么重要了(相对而言),比如最近几年比赛,大佬都上深度网络进行自动特征提取了。但是鉴于本文定位就是入坑项,所以相对模型这块的介绍会low一点。

4.1模型选择/训练

说来惭愧,其实如果你打算用上面的纯统计特征做模型,那么你的选择项并不多。实际上,除了那些自创模型的top大佬,大家用的都差不多,即梯度提升树(GBDT)一类的模型,比如本文使用的LightGBM (LGB),还有流行的xgboost(XGB)。再次限于当时的硬件条件,18届我只使用的相对更高效的LGB,如果想了解XGB还是得回去看看我17年的比赛分享。此外,鉴于广告竞赛离散特征(如各种脱敏后的ID)很多,我建议你去了解下FFM(field-aware factorization machines),这类模型更适合处理稀疏特征,这里不做详细介绍(问就是当时带不动)。

LGB的训练见“traing_LGB.py”,如果你使用python库,那么训练很简单:

def trainClassifierLGBM(x_train,y_train):
    print('使用LIGHTBGM进行训练')
    lgb_train = lgb.Dataset(x_train, y_train)
    params = {
        'task': 'train',
        'boosting_type': 'gbdt',
        'objective': 'binary',
        'metric': 'auc',
        #'max_depth':3,
        'num_leaves': 2500, #2500(暂定)
        #'max_bin':150,  
        'learning_rate': 0.04,#0.04暂定)
        'feature_fraction': 0.4,
        'lambda_l1': 0.5,#0.5暂定
        'lambda_l2': 0.5,#0.5暂定
        #'bagging_fraction': 0.85,
        #'bagging_freq': 5,
        'verbose': 0,
    }
    
    #origin:learning_rate': 0.02,num_boost_round=700,'num_leaves': 1000
    
    lgbm = lgb.train(params,
                lgb_train,
                num_boost_round=700) #700(预测)
    print(params)
    return lgbm

将训练数据打包成Dataset喂给模型即可(调包侠)。至于LGB如何调参,当时我用的很low的方法,即10折验证+手动调参:即选择10%的训练数据扣掉label做为验证数据,剩余90%的作为训练数据训练模型,以推理验证数据的label并计算评估指标。然后手动调整模型的参数,使10折验证的效果更好。这里需要注意的是,拿10折验证的效果最好的参数去训练最终模型,并一定代表你提交的结果能获取最佳成绩

 

4.2模型融合

       俗话说的好,“三个臭皮匠顶一个诸葛亮”,更何况当一个团队有三个大佬时。参加数据竞赛时你会发现,往往最后一天榜单排名会完全刷新,原因就在此:大佬团队在最后一天集齐了“龙珠”,他们开始搞模型融合了。顾名思义,模型融合就是把几个模型的结果,整成一个准确更高的结果。常见方法有Blending和Stacking,当然还有简单粗暴的直接加权平均。有兴趣可以参考这篇博文:https://blog.csdn.net/sinat_35821976/article/details/83622594

Blending我没有使用过,Stacking后续再补充,这里先介绍一下相对更简单,谁都会用的加权评估方法:实际可能low到不用介绍了,即使用模型A对测试数据推理出一份结果r1,然后用模型B推理一份结果r2,最后对两份结果做一个加权平均:r3 = k1 * r1 + k2 * r3 (k1 + k2 =1)

如果你有2个以上的模型,那么加权同理。这里唯一的问题在于每个模型的权重如何确定。如果你比赛最后一天没有什么开发计划了,可以尝试用提交来试出一个最好的权重,不过一般没有人这么干。最简单的办法还是之前提到的“10折”:即你单独取10%的数据做验证集,然后用90%的数据来训练模型,并探索最优的加权权重。

这是18年比赛我唯一使用的融合方法,当然结果就是,决赛最后一天被吊打到69名。当时我融合的是本文介绍的LGB模型,加上那个基于one-hot的baseline,权重也没有做太多尝试。我的融合参考代码“resultProcessing.py”(说实话,加权平均什么的没什么好讲的)。

 

Extra3 Stacking

  之所以把Stacking放额外节讲是因为18年我没使用(原因还是那个),但是这个融合方法用好了就是大杀器,如果你硬件资源充分的话……

 详情还是见我17年比赛的分享代码,这里依然是大致介绍。简单来说,Stacking便是把“一个模型推理的结果,作为融合模型特征”,举例来说,我现在有两个模型一个LGB与XGB。我想使用Stacking融合这两个模型,就是将其中一个模型的预测结果作为另一个模型的特征,其实具体操作和之前3.4提到的交叉特征很类似:

Step1: 将训练数据切成N个窗口,这里假设为5份。

Step2: 构造训练数据的Stacking特征,假设我们想用XGB构造Stacking特征,那么先用窗口2~5训练模型来预测窗口1个结果;然后用窗口1,3,4,5训练模型预测窗口2的结果,以此类推。这样所有训练数据都得到了XGB的Stacking特征,图例如下:

Step3: 构造验证数据的Stacking特征,这个就很简单了,直接用训练数据训练模型预测验证集即可(就是训练单模型推理一样)。

Step4: 融合,现在你拥有了XGB对训练数据,与验证数据的推理结果,便可以将这些结果作为特征加入另一个模型(比如LGB)的训练;此外,如果你资源足够,还可以用其他模型如LGB,RF来构造上述Stacking特征,然后将所有模型的预测结果作为特征,输入一个上层模型如LR来训练,这种做法更合理一些,但是会需要花费更多时间。

 理论上,使用Stacking可以有效融合多个模型的结果,比加权平均强上不少,但是问题也很明显,过于吃资源。除非你保证当前的单模型已经万无一失,建议不要去轻易做融合。

 

5.总结 – 如果你想拿个好名次?

上面便是我在腾讯2018年广告竞赛的全部经验(附带一些2017年的经验),虽然不一定适用于今年的比赛,但是流程上对于入坑应该够了,但是如果你立志通过这个比赛拿一个好名次,上面的东西远远不够,我的建议如下:

  1. 上面的东西可能过时了:上面的纯统计模型还能在17届比赛中驰骋,但是实际上从18开始大佬们已经开始转向使用NN来做模型了,因为对离散特征做embedding比绞尽脑汁挖特征更有效,且更符合实际场景。
  2. 弄台靠谱的机器(环境)不怕你有神技,就怕你没机器,更怕你对手有神技还有机器。本文介绍中有很多extra的内容,都是我17届比赛中使用过,但是18届没有资源使用的方法。如果你想入坑NN,那机器更加时比不可少。(貌似最近的比赛可以申请环境了?)
  3. 找一队小伙伴,但是不要只做一个模型:一个队有3个大佬自然很强大,但是3个大佬的队伍不可能只做一个模型。参考我之前提到的模型融合,如果你找到了2个队友,建议你们在必要的交流后尽可能各自输出一个模型,最后一天模型融合,你们可能就是那个爆榜的靓仔。
  4. 保证自己能全力投入:当然有大佬可以做到一个人carry几个赛事,但是对大多数人来说一个赛事时需要巨大精力的,不投入可能第二天都被洗榜了(18届忙着毕业,几天没管,最后从20+吊打到60+)。

最后,我觉着参加一个数据竞赛对于想要进入数据科学领域的童鞋来说是很有必要的,它可以让你真正接触实战,而不是对着用烂的公开数据集做一些别人做烂的工作;同事,比赛提供了一个巨大的平台,让你能与各路大佬交流经验。相信主要认真参与,哪怕没有名次也能让你获取宝贵收获。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值