【技巧】应赛技巧,教你如何在Kaggle比赛中排在前1%
网友Akira Sosa最近参加了Kaggle比赛,并在medium上分享了他的参赛经验,以下是全文。
最近,我参加了Kaggle比赛。虽然这是我第一次参赛,但我的成绩相当不错。我想和大家分享我的方法和从比赛中学到的东西。
Statoil/C-CORE Iceberg分类器挑战是我选择的题目。在这次比赛中,选手们使用卫星拍摄的雷达图像来对船只和冰山进行分类。inc_angle作为附加信息给出。更多的细节可以在比赛的页面上看到。
Statoil/C-CORE Iceberg分类器挑战地址:https://www.kaggle.com/c/statoil-iceberg-classifier-challenge/
下面是我的方法和总结。
成功的方法
- 堆叠,混合。
- Bagging。
- 手动特征提取。
- 测试基本模型。
- 分集(Diversity)。
- 具有不同架构的多种DNN。
- 输入的不同比例。
- 是否使用扩展。
- 伪标签。
成功的方法,但我并没有使用。
- 有效的漏洞利用(leak utilization)。
时间主要用在:
- 学习堆叠和混合。
- 构建堆叠和混合的源代码。
- 训练多个DNN。
- 在堆叠的第二阶段尝试一些分类器。
我希望进一步探索的:
- 探索性数据分析。
- 概率方法。
- 一些无监督技术。
我和其他上层人士之间的区别主要是有效漏洞利用。这意味着我应该更仔细地研究数据,但我却并没有这样做。虽然这种技术听起来有点棘手,但探索性数据分析技术使它成为可能,并且它是我们最重要的技术之一。
因为这是我的第一个挑战,我花了相当多的时间写代码。我在Github上公开了我的代码。
我的ml项目的初学者工具包。
工具包地址:https://github.com/akirasosa/ml-starter
让我们来看看更多的细节。
成功的方法
在我参加这次比赛之前,我并不太熟悉这些技术,比如堆叠和混合。幸运的是,我在比赛的前收到了Coursera的邮件。这是《如何赢得数据科学竞赛:从顶端开始学习》课程的邀请。这对我有很大的帮助,尤其是Marios第4周的课程,对我非常有帮助。我看了很多遍。
堆叠的最终架构
堆叠的多样性
堆叠的重要意义在于多样性。我使用的基本模型是简单的CNN,有4层。通过使用CNN,我做出了6种预测模式。
- CNN-4L没有强化训练,没有辅助输入。
- CNN-4L没有强化训练,MinMax缩放辅助输入。
- CNN-4L没有强化训练,标准缩放辅助输入。
- CNN-4L经过强化训练,没有辅助输入。
- CNN-4L经过强化训练,MinMax缩放辅助输入。
- CNN-4L经过强化训练,标准缩放辅助输入。
我这里使用的辅助输入来自于下面的内核。
Ensembling GBMs (LB .203~
内核地址:https://www.kaggle.com/cttsai/ensembling-gbms-lb-203
在这个内核中,它提取图像的统计信息。我用不同的缩放比例将它们输入到CNN。而且,我从线性缩放图像中提取了更多的统计数据(原始图像是Decibel,所以是对数缩放)。
在验证这些效果之后,我训练了一些更不同的架构。
- CNN-4L
- WRN (Wide Residual Net)
- VGG16
- Inception V3
- MobileNets
- VGG16 + MobileNets
因此,我可以得到36(= 6 * 6)的模型模式。其中一些模式在没有数据强化的情况下不能很好地融合,所以我最后从36个模式里选择了24个。
基本模型
我意识到在早期找到一个基本模型是很重要的。CNN 4L是这个案例的基础模型。
基本模型必须在短时间内进行训练。通过使用基本模型,我可以对几种实验进行检验,如伪标记、线性缩放图像、强化、辅助输入等。
Bagging
结果表明,bagging对DNN模型的泛化能力是相当有效的。这是其中一个模型Bagging的结果。
Bag的数量和对数损失
虽然我确信更多的bagging会带来更多的收益,但是我没有足够的计算资源。
堆叠的第二阶段
当我在第一阶段成功地获得了24种预测模式时,我尝试在第二阶段将它们输入到几个分类器中。我最后选择了两个分类器。
- NN-1L (100 bags)
- ExtraTreesClassifier (100 bags)
NN-1L在公共/私人排行榜上的对数损失分别为0.1321 / 0.1292。ExtraTreesClassifier的对数损失为0.1316 / 0.1280。由于小数据的原因,公共排行榜看起来不那么可靠。
我只是用相同的权值0.5和0.5来求均值。该平均提交的最终对数损失为0.1306 / 0.1271。
我尝试了一些基于梯度树的分类器,比如XGBoost和LightGBM。他们非常适合训练数据。虽然他们在计算机视觉上的表现很好,但在公共LB上却不是很好,我猜可能是用错误的方法解读了inc_angle的漏洞。
没有采用的成功的方法
现在,让我们来看看其他顶级的选手的方法。他们的解决方案给我留下了深刻的印象。
第三名的解决方案地址:https://www.kaggle.com/c/statoil-iceberg-classifier-challenge/discussion/48207
正如你所看到的,他开始的步骤和我的差不多。但是他不使用inc_angle来训练模型。而是选择了另一种方法,用inc_angle来计算另一种预测。因此,他得到了两种独立的概率。
然后,他将它们按照公式混合。
p = p1 * p2 / (p1 * p2 + (1 - p1) * (1 - p2))
第一名的解决方案地址:https://www.kaggle.com/c/statoil-iceberg-classifier-challenge/discussion/48241
这些方法在顶级选手中很常见,他们会仔细查看数据。第一名的解决方案的可视化是非常清晰的。
第一名的解决方案:可视化漏洞
>>为什么在group2训练样本中重新训练100+模型而不使用group1或两者?
>因为我们认为这些group2的样本分布与group1不同。对group2的训练只会消除group1所导致的“偏差”,group1中的数据全部是冰山,从而提高了group2预测的准确性,即使是在较少图像(约400次)的低成本中也能提高精度。
第二名的解决方案地址:https://www.kaggle.com/c/statoil-iceberg-classifier-challenge/discussion/48294
他调整CV,以防止他的模型利用inc_angle漏洞。
- 构建属于自己的原生docker images
- Docker-client for python使用指南
- Ansible基本配置以及使用示例
- redis超时原因系统性排查
- overlayfs存储驱动的使用以及技术探究
- 分页解决方案 之 分页算法——Pager_SQL的详细使用方法和注意事项
- 利用虚拟硬盘(把内存当作硬盘)来提高数据库的效率(目前只针对SQL Server 2000)可以提高很多
- 分页解决方案 之 分页算法——Pager_SQL的思路和使用方法
- 让你的笔记本更快一点——我的笔记本的性能测试和虚拟硬盘(把内存当成硬盘)的使用感觉
- 分页解决方案 之 数据访问函数库——另类的思路、另类的写法,造就了不一样的发展道路。
- 分页解决方案 之 QuickPager的使用方法(在UserControl里面使用分页控件的方法)
- 分页解决方案 之 QuickPager的使用方法(URL分页、自动获取数据)
- 分页解决方案 之 QuickPager的使用方法(PostBack分页、自定义获取数据)
- QuickPager asp.net 分页控件、表单控件等自定义控件下载 和介绍 【2009.09.07更新】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「2020最新」Spring最易学习教程 4—整合Mybatis 事务控制
- Head First设计模式——模板方法模式
- Head First设计模式——迭代器模式
- PR工具自带的电源网络分析功能靠谱吗?
- flask_admin使用教程
- C#使用FtpWebRequest 基础连接已经关闭:连接被意外关闭(The underlying connection was closed:The connection was closed u
- 自动化运维实践 | Ansible入门
- 通过设置JDK解决存在多个Gradle后台进程的问题
- Head First设计模式——组合模式
- mmap概述
- 什么是计算机程序?操作系统、指令、进程、线程等
- Head First设计模式——状态模式
- Head First设计模式——代理模式
- [Maven]告警[WARNING] Unable to create Maven project from repository.
- Head First设计模式——复合模式