我是如何迈出Kaggle 比赛之路的?

点击上方关注,All in AI中国

我是如何迈出Kaggle 比赛之路的?

您可能刚刚完成了第一次机器学习课程,但您不确定从何处开始应用您新发现的知识。你可以通过玩Iris数据集或梳理泰坦尼克号记录来开始(这可能是你应该做的第一件事)。但是有什么比直接跳入互联网上与随机陌生人竞争更有趣的呢?

如果您正在阅读本文,您可能已经知道Kaggle是一个数据科学竞赛平台,在这个平台上发烧友会参与各种机器学习主题,使用结构化(数值和/或分类数据表格格式)和非结构化数据(例如文本) / 图像 / 音频),旨在获得奖金和令人垂涎的Kaggle金牌。虽然您可能会发现与其他人竞争的想法有时候会让人害怕,但重要的是要记住,目标始终是尽可能多地学习而不是专注于结果。通过这种思维方式,你会发现比赛变得有趣、有价值,甚至让人上瘾。

选择比赛的第一步

找一个你感兴趣的竞争对手

在开始新的比赛时,这是最重要的一个考虑因素。你想给自己大约两个月的时间来解决一个问题,并真正熟悉数据的来龙去脉。这是一段相当长的时间,选择一个你不兴趣的比赛将让你的兴趣急剧下降。在时间轴的早期加入也让你有更多的时间来获得知识,并提高你的学习质量。在与社区其他人一起解决问题的各个阶段学习。

专注于学习

如果你在竞争中受到挫败,觉得这太困难了,那么就要尽可能地集中精力学习并继续前进。通过这种方法,您将以这种方式学到更多东西。当你不再担心自己在排行榜上的位置时,你甚至可能会发现自己取得了突破!

尝试了解最高得分内核的每一行

问问自己是否有一些明显的方法可以改善他们的工作。例如,您是否可以创建一个可以提高模型得分的新功能?你能稍微调整一下他们用于提高性能的学习率吗?追求容易实现的目标,不要试图重新发明轮子。这种心态将极大地加速您的学习,同时确保您不会感到沮丧。

寻找规则中的奇怪规定

这个并不像其他因素那么重要,但值得一提。最近的竞赛包含一条规则如下:

[您提交的内容]不包含机密信息或商业机密,也不是注册专利或未决专利申请的主题

论坛中的一位用户表示,这项规定将使dropout非法,因为这是谷歌专利技术!

内核和讨论

应在比赛过程中定期检查内核和讨论选项卡

首先查看一些EDA并测量您在域和主题中的兴趣水平。想想在您根据数据、特征工程等的合适模型类型浏览其他作品时,任何出现的新颖的想法都会对您有所帮助。

讨论选项卡中的“欢迎”帖子提供了一个很好的背景阅读

在竞争领域获取领域知识是没有坏处的。这有助于深入了解模型的性能,并可以极大地帮助进行特征工程。我通常会在比赛开始时花一到两周时间尽可能地了解问题空间。为了解决这个问题,大多数竞赛组织者在论坛中创建了一个登录帖子,其中包含链接到该领域的重要论文/文章。他们还可能提供有关如何处理更大数据集的提示以及对数据的基本见解。当您获得有关手头问题的更多信息时,这些线程总是值得检查并回顾过去。

探索性数据分析

你应该关注什么?

您对数据集的初始分析将根据您正在检查的数据类型而有所不同。但是,这些概念在各个领域通常是相似的,以下信息可以根据您的具体领域进行调整。为简化,让我们假设我们正在查看结构化数据。在任何初始EDA中都有一些基本问题要:

  1. 目标是如何分配的?
  2. 功能之间是否存在显著的相关性?
  3. 数据中是否有任何缺失值?
  4. 训练和测试数据有多相似?

目标是如何分配的?

在任何数据集中要注意的第一件事是类的分布。如果存在类不平衡,您可能希望快速找到,因为这会对您的模型产生重大影响。特别是如果一个班级在训练中淹没了其他人的信息。有许多技术可以处理类不平衡(例如SMOTE,ADASYN,手动删除样本,处理不平衡数据集的模型参数),但首先我们要找出数据中是否有不均匀表示的类。检查这个的快速方法是通过绘图库seaborn,基于流行的matplotlib。

import seaborn as sns
sns.countplot(df['target'])

我是如何迈出Kaggle 比赛之路的?

多级目标失衡

我们可以看到,类90在我们的数据中被过度表示。上述SMOTE技术和其他技术可以创建更平衡的训练数据集。反过来,这可以使模型更好地推广,而这种不平衡可能不存在。

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

计算要素之间的Pearson相关系数可以提供对特征的一些宝贵见解。了解特征是否相关可以允许创造性的特征工程或删除不必要的列。例如,在下面显示的heatmap图中,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)

我是如何迈出Kaggle 比赛之路的?

相关heatmap图显示数值特征之间的Pearson相关系数的正值和负值

数据中是否有任何缺失值?

您始终希望确保拥有一个完整的训练数据集。例如,如果您的模型发现一个非常重要的特征,但事实证明该特征中的大量行是缺失值,则可以通过输入缺失值来大大提高模型的性能。这可以通过基于不包含NaN的类似行推断特征的值来完成。另一种策略(称为回填)是使用下一个非空值填充缺失值。其余特征的均值、中值或模式有时也用于估算缺失值。 pandas.DataFrame.fillna()方法提供了一些不同的选项来处理这种情况,这个Kaggle内核是一个非常有用的资源。

但是,缺失值并不总是意味着没有记录数据。有时,为某个不适用于该行的要素包含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

这是一种非常有用的方法,可以让您快速检查训练和测试中的特征之间的相似性。但是如果您有一个单一的数字值可以让你对训练和测试的近距离一目了然呢?这就是对抗性验证的用武之地。我知道这听起来有点吓人,但是一旦你理解它,它就会变得非常简单。对抗性验证涉及以下步骤:

  1. 将您的训练和测试数据集连接成一个大型数据集
  2. 将所有训练行的目标要素设置为值0
  3. 在所有测试行中为目标要素填写值1(您可以看到它的位置)
  4. 根据数据创建分层折叠(我喜欢使用sklearn实现)
  5. 将LightGBM等模型拟合到训练折叠并验证验证折叠
  6. 采取将LightGBM等模型拟合到训练折叠并验证验证折叠
  7. 对整个数据集进行验证预测,并在ROC曲线下计算区域。我使用这个实现来计算面积。

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

我发现以下两个内核对于掌握这种技术非常有用:

Adversarial Santander | Kaggle

Adversarial CNN of PTP for VSB Power V12 | Kaggle

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

确定正确的模型开始是很重要的,当你刚开始时可能会非常困惑。让我们再假设您正在使用结构化数据,并且希望在进入建模之前获得对数据有一些深入的见解。我发现LightGBM或XGBoost模型非常适合在您进入一个新的竞争对手时抛出数据。这些都是基于树的增强模型,具有高度可解释性和易于理解的特点。两者都提供了绘制分割的功能,因此创建最大深度= 3左右的树可以很有用,并且可以从一开始就准确查看模型分割的特征。

lightgbm.Booster.feature_importance()方法显示了模型最重要的特性的分割数的模型在一个特定的功能(importance_type =“分裂”)或每个分割获得的信息量的特定功能(importance_type =“增益”)。查看特征重要性在匿名数据集中特别有用,在这些数据集中,您可以获取前5个特征,并推断出特征可能是什么,并了解它们对模型有多重要性。这可以极大地帮助特征工程。

您还会发现LightGBM甚至在不使用gpu的情况下也可以快速地进行训练(请原谅我的双关语)。最后,对于这两个模型都有很好的文档,所以初学者应该没有任何问题。

评估

如果没有可靠的评估方法,你可能在竞争中拥有最好的表现模型,却不知道它。一旦掌握了如何评估提交的内容,就应该确保在训练和验证中使用官方评估指标(如果没有合适的实施方案,则使用您自己的版本)。将此与可靠的验证集相结合,可以避免您通过提交进行刻录,并允许您快速且经常地进行实验。

此外,您希望以最终获得单个数字的方式设置模型评估。查看训练损失与验证损失或一系列指标,包括精确度、召回率、F1得分、AUROC等,有时可用于生产,但在竞争中,您希望能够快速浏览一个数字并说出“这个模型比我之前的型号更好”。同样,这个数字应该是官方指标。如果不是,你应该有充分的理由不这样做。

如果您遵循上述建议,您将会发现您经常进行实验,所以您需要一种可靠的方法来跟踪结果。我喜欢使用在Docker容器中运行的MongoDB实例,每次运行我的评估脚本后,我都会向其发送模型参数和验证分数。我为每个模型保留了一个单独的表(或MongoDB喜欢称之为集合的集合)。当我完成一些实验后,我将这些记录以MongoDB .archive文件和.csv的形式转储到机器上的一个本地目录中,以便快速读取。应该注意的是,关于如何处理录制结果有不同的思想流派,这是我的首选方法,但我很想知道其他数据科学家如何处理它!

我是如何迈出Kaggle 比赛之路的?

编译出品

相关推荐