不知道你有没有这样的感受,在刚刚入门机器学习的时候,我们一般都是从MNIST、CIFAR-10这一类知名公开数据集开始快速上手,复现别人的结果,但总觉得过于简单,给人的感觉太不真实。因为这些数据太“完美”了(干净的输入,均衡的类别,分布基本一致的测试集,还有大量现成的参考模型),要成为真正的数据科学家,光在这些数据集上跑模型却是远远不够的。而现实中你几乎不可能遇到这样的数据(现实数据往往有着残缺的输入,类别严重不均衡,分布不一致甚至随时变动的测试集,几乎没有可以参考的论文),这往往让刚进入工作的同学手忙脚乱,无所适从。
Kaggle则提供了一个介于“完美”与真实之间的过渡,问题的定义基本良好,却夹着或多或少的难点,一般没有完全成熟的解决方案。在参赛过程中与论坛上的其他参赛者互动,能不断地获得启发,受益良多。即使对于一些学有所成的高手乃至大牛,参加Kaggle也常常会获得很多启发,与来着世界各地的队伍进行厮杀的刺激更让人欲罢不能。更重要的是,Kaggle是业界普遍承认的竞赛平台,能从Kaggle上的一些高质量竞赛获取好名次,是对自己实力极好的证明,还能给自己的履历添上光辉的一笔。如果能获得金牌,杀入奖金池,那更是名利兼收,再好不过。
Kaggle适用于以下人群:
我是小白,但是对数据科学充满求知欲。
我想要历练自己的数据挖掘和机器学习技能,成为一名真正的数据科(lao)学(si)家(ji)。
我想赢取奖金,成为人生赢家。
0简介Kaggle创办于年,目前已经被Google收购,是全球顶级的数据科学竞赛平台,在数据科学领域中享有盛名。笔者参加了由Quora举办的QuoraQuestionPairs比赛,并且获得了前1%的成绩(支队伍)。这是笔者Kaggle首战,所以写下此文来系统化地梳理比赛的思路,并且和大家分享我们参赛的一些心得。
QuoraQuestionPairs是一个自然语言(NLP)比赛,比赛的题目可以简单地概括为“预测两个问句的语义相似的概率”。其中的样本如下:
也许是作为Kaggle上为数不多的NLP比赛,这看似简单的比赛却吸引了众多的参赛队伍。由于这是NLP问题,所以接下来的介绍都会偏向于NLP,本文会分为以下三个部分:
打Kaggle比赛的大致套路。(比赛篇)
我们队伍和其他出色队伍的参赛经验。(经验篇)
完成Kaggle比赛需要学会哪些实用的工具。(工具篇)
1比赛篇为了方便,我们先定义几个名词:
Feature特征变量,也叫自变量,是样本可以观测到的特征,通常是模型的输入。
Label标签,也叫目标变量,需要预测的变量,通常是模型的标签或者输出。
TrainData训练数据,有标签的数据,由举办方提供。
TestData测试数据,标签未知,是比赛用来评估得分的数据,由举办方提供。
TrainSet训练集,从TrainData中分割得到的,用于训练模型(常用于交叉验证)。
ValidSet验证集,从TrainData中分割得到的,用于验证模型(常用于交叉验证)。
1.1分析题目拿到赛题以后,第一步就是要破题,我们需要将问题转化为相应的机器学习问题。其中,Kaggle最常见的机器学习问题类型有:
回归问题
分类问题(二分类、多分类、多标签)多分类只需从多个类别中预测一个类别,而多标签则需要预测出多个类别。
比如Quora的比赛就是二分类问题,因为只需要判断两个问句的语义是否相似。
1.数据分析(DataExploration)所谓数据挖掘,当然是要从数据中去挖掘我们想要的东西,我们需要通过人为地去分析数据,才可以发现数据中存在的问题和特征。我们需要在观察数据的过程中思考以下几个问题:
数据应该怎么清洗和处理才是合理的?
根据数据的类型可以挖掘怎样的特征?
数据中的哪些特征会对标签的预测有帮助?
1..1统计分析对于数值类变量(NumericalVariable),我们可以得到min,max,mean,meduim,std等统计量,用pandas可以方便地完成,结果如下:
从上图中可以观察Label是否均衡,如果不均衡则需要进行oversample少数类,或者downsample多数类。我们还可以统计NumericalVariable之间的相关系数,用pandas就可以轻松获得相关系数矩阵:
观察相关系数矩阵可以让你找到高相关的特征,以及特征之间的冗余度。而对于文本变量,可以统计词频(TF),TF-IDF,文本长度等等,更详细的内容可以参考这里
1..可视化人是视觉动物,更容易接受图形化的表示,因此可以将一些统计信息通过图表的形式展示出来,方便我们观察和发现。比如用直方图展示问句的频数:
或者绘制相关系数矩阵:
常用的可视化工具有matplotlib和seaborn。当然,你也可以跳过这一步,因为可视化不是解决问题的重点。
1.3数据预处理(DataPreprocessing)刚拿到手的数据会出现噪声,缺失,脏乱等现象,我们需要对数据进行清洗与加工,从而方便进行后续的工作。针对不同类型的变量,会有不同的清洗和处理方法:
对于数值型变量(NumericalVariable),需要处理离群点,缺失值,异常值等情况。
对于类别型变量(CategoricalVariable),可以转化为one-hot编码。
文本数据是较难处理的数据类型,文本中会有垃圾字符,错别字(词),数学公式,不统一单位和日期格式等。我们还需要处理标点符号,分词,去停用词,对于英文文本可能还要词性还原(lemmatize),抽取词干(stem)等等。
1.4特征工程(FeatureEngineering)都说特征为王,特征是决定效果最关键的一环。我们需要通过探索数据,利用人为先验知识,从数据中总结出特征。
1.4.1特征抽取(FeatureExtraction)我们应该尽可能多地抽取特征,只要你认为某个特征对解决问题有帮助,它就可以成为一个特征。特征抽取需要不断迭代,是最为烧脑的环节,它会在整个比赛周期折磨你,但这是比赛取胜的关键,它值得你耗费大量的时间。
那问题来了,怎么去发现特征呢?光盯着数据集肯定是不行的。如果你是新手,可以先耗费一些时间在Forum上,看看别人是怎么做FeatureExtraction的,并且多思考。虽然FeatureExtraction特别讲究经验,但其实还是有章可循的:
对于NumericalVariable,可以通过线性组合、多项式组合来发现新的Feature。
对于文本数据,有一些常规的Feature。比如,文本长度,Embeddings,TF-IDF,LDA,LSI等,你甚至可以用深度学习提取文本特征(隐藏层)。
如果你想对数据有更深入的了解,可以通过思考数据集的构造过程来发现一些magicfeature,这些特征有可能会大大提升效果。在Quora这次比赛中,就有人公布了一些magicfeature。
通过错误分析也可以发现新的特征(见1.5.小节)。
1.4.特征选择(FeatureSelection)在做特征抽取的时候,我们是尽可能地抽取更多的Feature,但过多的Feature会造成冗余,噪声,容易过拟合等问题,因此我们需要进行特征筛选。特征选择可以加快模型的训练速度,甚至还可以提升效果。
特征选择的方法多种多样,最简单的是相关度系数(Correlationcoefficient),它主要是衡量两个变量之间的线性关系,数值在[-1.0,1.0]区间中。数值越是接近0,两个变量越是线性不相关。但是数值为0,并不能说明两个变量不相关,只是线性不相关而已。
我们通过一个例子来学习一下怎么分析相关系数矩阵:
相关系数矩阵是一个对称矩阵,所以只需要哪家医院能治好白癜风北京哪个医院治疗白癜风比较好