2019百度大数据竞赛_城市区域功能分类_Turing队 top4 竞赛故事分享

       非常感谢主办方举办这次比赛,给了我一个难得的学习机会。从组队,到初赛34名,再到半决赛第4名,这三个月充满了艰辛与感慨。一次次学习新的方法与trick,一次次遇到瓶颈又顿生苦恼,一次次豁然开朗又突破自我。这三个月的日日夜夜的上下求索是我最最珍贵的一段经历,这一路走来的酸甜苦辣必将让我一直铭记,在比赛过程中形成的思维方式必将让我受益终生。下面我将分享我与这次比赛的故事。

  • 缘起

       我来自中南大学,是一名计算机专业的研一学生,研究方向与计算机视觉相关。之前有过一次参加数据科学竞赛的经历,kaggle的鲸鱼分类比赛,但是并未取得较好的成绩。因此我迫切的希望能够再有一次机会去锻炼自己、证明自己。还记得三个月前,导师在群里发了这个比赛的链接,我毫不犹豫地就报名参加了。和两个同门、两个本科同学组了队,就全身心的投入了比赛。万幸的是,导师对我参加比赛给予了很大的支持,让我有充足的时间全力以赴参与这个比赛。我对这个比赛的着迷,以至于每天一不留神就写代码到凌晨两点,早上提前醒来等候八点钟的排行榜刷新。这次比赛融入了我的生活。

  • 初赛--集成 实践得真知

       初赛开始后,我和队友细读赛题、分析赛题。赛题提供了两种模态的数据,一个是遥感图片数据,一个是用户访问的文本数据。因为研究生期间的研究方向一直围绕视觉领域,所以在对文本模态的数据进行分析后,我们对文本数据进行了转化,不考虑细粒度的用户信息,将访问数据的文本转化为只含有每个小时的总人数的矩阵,这样访问数据的文本也可以由卷积神经网络端到端的完成特征提取。将图片的卷积网络提取的特征和访问数据的卷积网络提取的特征进行拼接,实现了特征的融合,再接全连接层进行分类即可。在比赛之前,我使用的深度学习框架一直是TensorFlow和Keras,但是在初赛查资料的过程中,发现了pytorch的CNN预训练模型使用起来非常方便,因此我们在比赛中,卷积模型方面使用了pytorch框架,深刻感受到了它的便利。在仔细查看遥感图像后,发现有一部分图片可能是受云雾的影响,一片黑或者一片白,就想办法剔除掉这些样本。针对各个类别的图片样本不均衡问题,我们对样本进行了重采样。在初赛后期,根据验证集的混淆矩阵使用了带权损失函数,使得模型对各个类别分类效果更好;改用Adam优化器,使得模型更容易收敛。在训练时使用了数据增强,减缓了对训练集的过拟合。尽管使用了这些trick,但是单个网络的准确率还是比较低。在遇到瓶颈后,开始查阅一些kaggle获奖者的经验分享,发现大多数成功者都用到了集成学习。比赛之前对于集成学习的了解还局限在西瓜书上那一堆干巴巴的文字,并没有实践过,因此我们训练了多个不同的卷积网络模型,用各个卷积网络的输出直接进行平均的方法进行集成,惊奇的发现,一个基于概率平均的集成学习方法竟然比最好的单个模型提高了百分之三。这也为我们队在初赛中达到第34名奠定了基础。这也是我从这次比赛的实践中才能学到的知识,如果只是通过西瓜书上关于集成学习的介绍,我可能永远不知道这个trick是这样的有效。

  • 半决赛(1--试错 永不言弃

       时间很快来到了半决赛。在半决赛这段时间内,我们遇到了两个瓶颈,所幸在队友的共同努力下,找到了两个有效的突破方法,才最终实现了初赛34名,半决赛第4名的逆袭。在半决赛一开始,我们仍然把这个比赛当作纯粹的计算机视觉比赛,把访问数据的文本使用卷积网络处理。在预留了验证集后,将初赛的模型在训练集上重新训练了一番。但是慢慢的,我们被别的队伍超过。我们开始尝试一些别的更深的模型,Densenet和Nasnet,但是由于训练集样本数量实在太大,在Nasnet训练一轮的时间竟然需要48个小时,但是最令人难受的是,我们在Densenet和Nasnet上训练的模型均没有收敛,集成进去反而变差。我们尝试了一种可变的学习率方法,而不是使用始终不变的学习率,但是效果也不明显。我们使用了5折交叉训练,这样将会得到更多的模型,尽管5折的模型彼此相关性较大,但还是带来了些许提升,但是并没有引起质变。名次一天天的下降,最差时我们队掉到了18名。忙忙碌碌一整天,准确率却丝毫不升,接连几天这种状态给我带来了日益加重的失落感和负面情绪。让我咬紧牙关坚持下去的是身为队长的责任,我们开始发散思维,想出了许多有潜在可能提升效果的方法,不断的试错。期间经历太多的挫折,比如改变集成方法,将基于概率平均的集成改为基于投票的集成、基于准确率加权的集成、基于网格搜索的加权等等,但是仍然没有明显效果。第一个瓶颈期困扰了我们队很久。终于,与队友的一次偶然闲聊,找到了突破瓶颈的方法。

  • 半决赛(2--机遇 灵光一现的对话

       在实在没有好想法时,约一个队友聊一聊。各自交换了一些想法,聊到了下一步尝试特征工程,离群点样本剔除等方法。后来忽然聊到了用户ID这个信息,这个信息是我们从未利用起来的,用户ID真的是可有可无的吗?组委会出题完全可以不给用户ID啊,直接一行一个用户的到访时间不就行了?于是,之前参加过广告点击率预测竞赛的队友很敏锐地捕捉到了这一点,加上之前队友在比赛中使用规则得到了不错的结果,对访问数据的用户ID建立规则进行分类,这个想法使我们最终突破了第一个瓶颈。合理挖掘和利用visit数据中的用户ID信息是利用规则的关键。一个显而易见的例子,如果训练集中用户1一共在100个样本中出现过,并且有80次出现的样本是类别1,有20次出现的样本属于类别2,那么以后只要在测试集的样本里出现用户1这个老用户,我们就认为这个测试样本有大约80%的概率属于类别1。在大量样本的统计结果下,上述这个看似简单的规则就可以起到很好的作用。这就是我们使用规则时的启蒙思想。在使用了规则之后,将多个卷积网络模型进行投票,如果票数低于阈值就直接输出规则的结果,这使得我们的线上分数达到了大约0.79。但是这样先卷积网络模型投票再使用规则的集成方法,也有一个显而易见的缺点,神经网络模型进行投票,票数的阈值设为多少呢?票数这个超参数对于最终的结果起到决定作用,我们坚信这样的集成不是最优的。而且如果我们有多个规则,卷积网络投票之后该由多个规则怎样决策呢?因此我们开始探索一种好的集成方法,能够兼顾卷积网络和规则的结果。这是我们遇到的第二个瓶颈。

  • 半决赛(3--化蝶 兼顾卷积与规则的lgb

       卷积网络模型的输出是小于1的值,而规则的输出值一般是上万的数量级,如何去集成呢?即使将卷积模型和规则的输出各自归一化,也会造成模型间的不公平。此时,stacking这个trick让我们突破了第二个瓶颈。根据stacking的策略,通俗一点说,就是用模型去集成模型。使用预留的验证集样本训练集成模型。将所有卷积模型和所有规则在验证集的输出进行拼接,将其作为lgb的输入,真实类别标注作为lgb的输出,训练一个lgb分类器,实现了端到端的集成学习,这使得我们的分数突破了0.84。另外我们探索了一种有效的归一化方法,先对每个模型各自进行零均值归一化,再使用softmax函数,使得集成对于所有基模型是相对公平的,直接带来了百分之一的提升效果。

  • 回归

        在半决赛的第一次提交,我们队是暂时排在第4名。半决赛的最后一天,很幸运我们又回归第4名。这历时一个月的半决赛我们积极进取,咬牙坚持,两次突破了大瓶颈。所有队友的紧密配合实现了逆袭。再次感谢主办方提供的这次学习机会,一次参赛,终生受益!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值