如何开始 Kaggle 比赛之旅

作者: AI研习社 | 来源:发表于2019-05-21 10:36 被阅读14次
    image

    本文为 AI 研习社编译的技术博客,原标题 :

    How to Start Competing on Kaggle

    作者 |* Chirag Chadha*

    翻译 | IinIh 编辑 | 邓普斯•杰弗、王立鱼

    原文链接:

    https://towardsdatascience.com/how-to-begin-competing-on-kaggle-bd9b5f32dbbc

    image

    如果刚刚完成你的第一个机器学习课程,不确定如何开始使用新学的知识。那你应该从简单的Iris数据集开始,或者是练习下Titanic的数据(这可能是最先应该做的事)。但是有什么更有趣的,能直接上手,和网络上的陌生人一起比赛并获得奖金呢?

    如果你正在读这篇文章,你应该已经知道Kaggle是一个数据科学的比赛平台,在这里大家可以使用结构化(数值或者类别的表格化数据)和非结构化数据(比如文字,图像,音频),参与到大量机器学习话题的比赛中,并且带着获取奖金和人人向往的Kaggle金牌的目标。尽管你可能会说和别人一起比赛会有所胆怯,但是最重要的是学习到更多的知识,而不是关注比赛结果。带着这样的心态,你会发现比赛会变得有趣,收获满满,甚至上瘾。

    第一步选择一个比赛

    找到一个有兴趣的比赛

    在你开始一个新的比赛的时候,这是要考虑的最重要的事。你需要给自己大约两个月的时间来解决一个问题,并真正熟悉数据的来龙去脉。这需要花费大量的时间。选择了一个你没有很大兴趣的比赛,只会让你变得更加没有兴趣,在加入比赛的几个星期之后就放弃了。在比赛时间轴的早期加入,会给你更多的时候去了解背景知识,在与社区成员一起解决问题的各个阶段提高学习质量。

    聚焦在学习上

    如果你发现对比赛感到沮丧并认为这太困难了,那么就要尽可能地集中精力学习并持续向前。专注于学习材料中,这样你可以学习更多。当你不在担心在排行榜上的排名时,也许你就能找到一个突破口。

    尝试去理解分数排名最高的kernels的每一行代码。

    问问自己是否有浅显的方法能够提高他们的结果。比如说,你是否可以创建新的特征来提升模型的分数?是否可以稍微调整他们使用的学习率来获得更好的性能?去寻找一些垂下来的水果,而不要尝试重新发明轮子。这种心态能极大加速你的学习,同时确保你不会变得沮丧。

    检查规则中奇怪的规定

    这一点没有和其他内容那么重要,尽管如此还是要注意下。最近的一个比赛中包含了下面这样一条规则:

    [ 你的提交] 中不能包含机密信息和商业秘密,不能是已注册的专利或者是正在提交申请专利的应用.

    一个用户在论坛中说到,这个对规定会使得使用dropout变成违法的,这个技术已经由Google申请了专利。

    Kernels和讨论

    在整个比赛过程中你需要常常去查看下Kernels和讨论区。

    从查看一些EDAs(Exploratory Data Analyses?, Exploratory Data Analysis’s?, Exploratory Data Analysii?)开始,来判断你在这个领域和话题的兴趣程度。在你浏览别人的成果时,一边思考适合这个模型的数据的新想法,比如说特征工程等等。

    在讨论区中“欢迎”的帖子中提供了非常好的背景知识。

    获取在这个比赛领域中的知识一定是有好处的,这能够帮助你深入理解你的模型怎样工作,能极大地帮助到你的特征工程。我通常在比赛开始之前会花费一周或者两周的时间去阅读尽可能多的材料理解这个问题。为了帮助到大家,大部分的比赛组织者会在论坛中创建入门的帖子,并给出这个领域中重要的论文/文章的链接。他们也许还会提供如何解决大数据集的提示,和数据的基本见解。当您获得有关手头问题的更多信息时,这些流程总是值得检查并回顾。

    探索数据分析

    你应该关注什么?

    最初对于数据集的分析,针对你分析的数据类型的不同差别很大。但是,这些概念通常在各个领域都是相似的,下面的内容可以根据你研究的特定领域进行调整。为了简单起见,我们假设这里是结构化的数据。这里是一些在进行数据分析前基础的问题。

    1. 目标数据是怎样分布的?

    2. 在不同的特征之前是否有显著的相关性?

    3. 数据中共是否有缺失值?

    4. 训练数据和测试数据多相似?

    目标数据是怎样分布的?

    第一件事你应该做的是看下数据集中各个类别的分布。如果存在类不平衡,你需要快速找到,因为这会对模型产生重大影响。特别是在训练中一个类别会淹没到其他类别的信息。这里有一些解决不平衡类别的技术(比如,SMOTE,ADASYN,手动移除样本,模型的参数来解决不平衡的数据集),但是首先我们需要确定数据中的类别是否均匀。一个快速检查的方法就通过绘制库,seaborn,基于流行的matplotlib库。

    import seaborn as sns
    
    sns.countplot(df['target'])
    
    多类别的不平衡目标

    我们可以看到,类别90在数据中被过分表示。前面提到的SMOTE和其他技术可以创建一个更加平衡的数据集。继而,可以使得模型更好地推广到从没见过的,不存在平衡问题的数据中。

    特征之间是否存在显著的相关性?

    计算特征之间的皮尔逊相关系数(Pearson correlation coefficient)能够获得特征中极有用的信息。知道特征是否相关能够帮助我们做特征工程,或者是去除不需要的数据列。比如说,在下面展示的热图中,EXT_SOURCE_1是外部来源提供的对一个贷款申请者的信用评级。DAYS_BIRTH,申请者按天的方式计算的年龄,和EXT_SOURCE_1是负相关的。这可能意味着EXT_SOURCE_1的计算中包含了申请者的年龄。通常来说,我们想要避免包含一个能够被其他特征线性组合得到的特征(称之为线性相关),它为模型提供了冗余的信息。

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    def correlation_map(df, columns, figsize=(15,10)):
        correlation = (df.loc[:, columns]).corr()
    
        fig, ax = plt.subplots(figsize = figsize)
        sns.heatmap(correlation, annot = True, ax = ax)
    
    显示数值特征之间的Pearson相关系数正值和负值的热图

    数据中是否有缺失值?

    你总是想要确保得到一个完整的数据集,包含尽可能少的缺失值。例如,如果模型发现一个非常重要的特征,但却发现该特征中的大量行是缺失值,则可以通过输入缺失值来大大提高模型的性能。这可以通过不包含NaN的类似行推断特征的值来完成。另外一个方式(称为backfill)是用下一个非空的值来填充缺失值。特征中非空数据的均值,中值或模式有时也用于估算缺失值。pandas.DataFrame.fillna()的方法提供了一些不同的选项来处理缺失值问题,这个Kaggle Kernel也是有帮助值得一读的资源。

    但是,缺失值并不总是意味着没有记录数据。有时候,一个特征中包含NaN是有意义的,那上述的方法就不适用于这个数据行。例如,一个包含二元目标的贷款申请数据集中(是否批准申请者的申请)包含一个申请者是否拥有一辆车的特征。如果某个人没有汽车,那么另一个关于汽车登记日期的特征会包含NaN值,因为这里没有可填写的信息。

    训练数据和测试数据有多少相似?

    pandas的DataFrame对象包含了pandas.Dataframe.describe() 方法能够提供特征在数据集中的统计信息,比如说最大值,平均值,标准差,第50百分位值等等。这个方法会返回另外一个DataFrame,这样你就可以添加额外你想要的信息。比如说,你可以添加一行来检查每一列中缺失值的数量,实现的函数如下:

    def describe_df(df):
        stats_df = df.describe()
        stats_df.append(pd.Series(df.isna().any(), name='nans'))
        return stats_df
    

    这是一个非常有用的方法,可以让你快速地检查训练集和测试集中特征的相似性。但是如果是想要有一个单一数值就可以很好地了解训练集和测试集的相识度呢?那就要用到对抗验证(adversarial validation)方法了。这个词汇可能听起来有点吓人,但是一旦理解了这个技术,那它就非常的简单。对抗验证包含下面的步骤:

    1. 将训练和测试数据集结合起来组成一个大的数据集

    2. 将所有的训练行中目标特征都设置为0

    3. 在所有的测试行中目标特征都填充1(等下你就会知道这在做什么)

    4. 从数据中创建分层折叠(可以直接使用sklearn中的实现)

    5. 将LightGBM模型,或者其他模型,拟合到训练折叠并验证验证折叠

    6. 在整个数据集上做验证预测,并计算ROC曲线(area under the receiver operating characteristic curve)。我使用的是这个实现来计算这个面积。

    7. ROC曲线下面积为0.5表示模型无法区分列训练和测试行,因此两个数据集相似。 如果面积大于0.5,那么模型可以看到训练和测试集之间存在一些差异,因此值得您深入挖掘数据以确保您的模型能够在测试中做好预测。

    我找到下面的两个kernel能帮助你掌握这个技术:

    为什么从基于树的模型开始?

    开始时确定正确的模型是很重要的,当你刚开始参加比赛时可能会非常困惑。假设说你现在处理的是结构化数据,你想要在进入构建模型之前先获取数据的内在信息。在你进入一个新的比赛时,非常适合将数据扔给LightGBM或者XGBoost模型。他们都是基于树的提升模型,并且具有很好的可解释性,很容易理解。两者都提供了绘制其分割的功能,这个功能很有用,创建最大深度= 3左右的树,可以从一开始就准确查看模型分割的所利用的特征。

    lightgbm.Booster.feature_importance()方法给出了对于模型而言最重要的特征,这是从模型在特定的特征上做了多少次分割(重要类型=“分割”)或者是在特定特征上的每次分割获得了多少的信息(重要类型=“获得”)的角度上来说的。查看特征重要性在匿名数据集中特别有用,在这些数据集中,可以获取前5个特征并推断出特征可能是什么,并了解它们对模型的重要性。 这可以极大地帮助特征工程。

    即使不使用GPU,你也会发现LightGBM的训练速度是非常快的。最后,对于这两个模型都有着非常优秀的文档,初学者学习他们应该没有任何问题。

    评估

    在不知道如何使用可靠的模型评估方法时,你没有办法在比赛中得到性能最好的模型。在参与比赛之前了解官方评估指标是至关重要的。一旦确切了解你的提交是如何评估,就应该确保在训练和验证中使用官方评估指标(如果没有合适的实现方案,则使用自己的版本)。将评估指标与可靠的验证集相结合,可以避免在提交上反复,并能够快速且经常地进行测试和验证。

    此外,如果你想要在最后用单一的数值来设置模型的评估。查看训练损失与验证损失或一系列指标,包括精确度,召回率,F1得分,AUROC等,这些对于实际产品中非常有帮助,但在比赛中,你想要的是能够快速看到一个数字并说出 “这个模型比我之前的更好”。再次强调,这个数值需要是官方的指标。如果不是的话,你应该有充分的理由不这样做。

    如果你遵循上述建议,在经常的实验中,你需要一种可靠的方法来跟踪结果。我喜欢用一个跑在Docker容器上的MongoDB实例,在每次执行我的评估脚本之后,将模型和参数和验证分数发给这个实例。我为每个模型分别保存了一个表格(或者是在MongoDB中称为collection)。当我执行完成了几次实验之后,我将记录作为一个MongoDB.archive文件和csv文件,下载到我电脑的本地目录中,以便于快速浏览。代码在原文。

    在这里说明下,关于如何处理记录结果有不同的思想流派,这是我的首选方法,但我很想知道其他数据科学家如何处理它!

    Chirag Chadha 是一名在爱尔兰都柏林 UnitedHealth Group/Optum.的数据科学家。你可以使用这个邮箱与之联系(chadhac@tcd.ie), 他的LinkedIn, 或者在Kaggle 和GitHub关注他。

    要继续查看该篇文章相关链接和参考文献?

    点击如何开始 kaggle 比赛之旅?即可访问:

    社长今日推荐:2019 最新斯坦福 CS224nNLP 课程

    自然语言处理(NLP)是信息时代最重要的技术之一,也是人工智能的关键部分。NLP的应用无处不在,因为人们几乎用语言进行交流:网络搜索,广告,电子邮件,客户服务,语言翻译,医学报告等。近年来,深度学习方法在许多不同的NLP任务中获得了非常高的性能,使用单个端到端神经模型,不需要传统的,任务特定的特征工程。在本课程中,学生将深入了解NLP深度学习的前沿研究。

    课程链接:https://ai.yanxishe.com/page/groupDetail/59​

    相关文章

      网友评论

        本文标题:如何开始 Kaggle 比赛之旅

        本文链接:https://www.haomeiwen.com/subject/kcrdzqtx.html