表格数据深度学习简介

有一种强大的技术是 赢得Kaggle比赛 并在Google(根据Jeff Dean的说法), Pinterest的因斯塔卡特,但是很多人甚至没有意识到可能: 将深度学习用于表格数据,尤其是 分类变量的嵌入.

尽管您可能听到了什么, 能够 将深度学习用于您可能保存在SQL数据库,Pandas DataFrame或Excel电子表格中的数据类型(包括时间序列数据)。我将其称为 表格数据,尽管它也可以称为 关系数据, 结构化数据或其他字词(请参阅我的 Twitter民意调查和评论 进行更多讨论)。

摘自Pinterest博客文章“将深度学习应用于相关的引脚”
摘自Pinterest博客文章“将深度学习应用于相关的引脚”

表格数据是行业中最常用的数据类型,但是与计算机视觉和自然语言处理的深度学习相比,表格数据的深度学习受到的关注要少得多。这篇文章涵盖了将神经网络应用于表格数据的一些关键概念,特别是为分类变量创建嵌入的想法,并重点介绍了该模型的2个相关模块。 法斯特图书馆:

从这篇文章中的材料开始于1:59:45左右开始更详细地介绍 第3课视频 并继续 第4课 我们的免费在线 面向程序员的实用深度学习 课程。要查看如何在实践中使用此方法的示例代码,请查看我们的 第3课jupyter笔记本.

分类变量的嵌入

充分利用表格数据的深度学习的一项关键技术是对分类变量使用嵌入。这种方法允许捕获类别之间的关系。也许星期六和星期日的行为类似,也许星期五的行为类似于周末和工作日的平均值。类似地,对于邮政编码,可能存在在地理上彼此接近的邮政编码以及具有相似社会经济地位的邮政编码的模式。

从词嵌入中汲取灵感

捕获类别之间的这些多维关系的一种方法是使用嵌入。这与单词嵌入(例如Word2Vec)所使用的思想相同。例如,单词嵌入的3维版本可能类似于:

小狗 [0.9、1.0、0.0]
[1.0,0.2,0.0]
小猫 [0.0、1.0、0.9]
[0.0、0.2、1.0]

请注意,第一个维度捕获的是与狗有关的事物,第二个维度捕获的是年轻。这个例子是手工制作的,但是在实践中,您将使用机器学习来找到最佳的表示形式(虽然会捕获语义值(如狗狗和青年),但它们可能不会如此清晰地与单个维度对齐)。你可以退房 我的词嵌入研讨会 有关单词嵌入如何工作的更多详细信息。

我的词嵌入研讨会的插图:婴儿动物词的向量靠得更近,不相关的词(例如“雪崩”)离得更远
我的词嵌入研讨会的插图:婴儿动物词的向量靠得更近,不相关的词(例如“雪崩”)离得更远

将嵌入应用于类别变量

类似地,当使用分类变量时,我们将通过浮点数向量来表示每个类别(此表示的值是在训练网络时学习的)。

例如,一周中某天的嵌入的4维版本可能类似于:

星期日 [.8,.2,.1,.1]
星期一 [.1,.2,.9,.9]
星期二 [.2,.1,.9,.8]

在这里,星期一和星期二相当相似,但与星期日却有很大不同。同样,这是一个玩具示例。在实践中,我们的神经网络将在训练时为每个类别学习最佳的表示形式,并且每个维度(或方向,不一定与序数维度一致)可能具有多种含义。在这些关系中可以捕捉到丰富的关系 分布式表示.

重用预训练的分类嵌入

嵌入 捕获比原始类别更丰富的关系和复杂性。一旦了解了您在企业中常用的类别的嵌入(例如产品,商店ID或邮政编码),就可以将这些经过预先训练的嵌入用于其他模型。例如,Pinterest已创建 引脚的128维嵌入 在名为Pin2Vec的库中,以及 因斯塔卡特具有嵌入 用于其杂货,商店和顾客。

摘自Instacart博客文章“使用表情符号进行深度学习(非数学)”
摘自Instacart博客文章“使用表情符号进行深度学习(非数学)”

The 法斯特图书馆 contains an implementation for 猫egorical variables, which work with Pytorch’s nn.Embedding module, so this is not something you need to code from hand each time you want to use it.

将某些连续变量视为分类

我们通常建议将月,年,周几和其他一些变量视为分类变量,即使它们可以被视为连续变量。通常,对于类别数量相对较少的变量,这会导致更好的性能。这是数据科学家做出的建模决策。通常,我们希望将以浮点数表示的连续变量保持为连续。

尽管我们可以选择将连续变量视为分类变量,但事实并非如此:任何分类变量都必须视为分类变量。

时间序列数据

将神经网络与分类嵌入一起使用的方法也可以应用于时间序列数据。实际上,这是Yoshua Bengio学生用来 在Kaggle出租车比赛中赢得第一名(纸 这里),使用GPS点和时间戳的轨迹来预测出租车的行驶时间。它也被 Kaggle Rossmann竞赛第三名,其中涉及使用来自连锁店的时间序列数据来预测未来的销售。这项比赛的第一和第二名得主使用依赖专业知识的复杂合奏,而第三名则是一个单一模型,没有特定领域的特征工程。

Kaggle出租车轨迹竞赛的获奖建筑
Kaggle出租车轨迹竞赛的获奖建筑

在我们的 第3课jupyter笔记本 我们为您解决了 Kaggle Rossmann比赛。此数据集(与许多数据集一样)包括 分类数据 (例如商店所在的州或3种不同商店类型之一)和 连续数据 (例如距最近竞争对手的距离或当地天气的温度)。 fastai库使您可以输入分类变量和连续变量作为神经网络的输入。

将机器学习应用于时间序列数据时,几乎总是希望选择一个验证集,该验证集是 最新可用日期 你有数据。正如我写的 以前的帖子,“如果您的数据是时间序列的,那么选择数据的随机子集将太容易了(您可以在要预测的日期之前和之后查看数据),并且不能代表大多数业务用例(您将在哪里使用历史数据来构建将来使用的模型)。”

成功将深度学习与时间序列数据一起使用的一个关键是将日期拆分为多个类别变量(年,月,周,星期几,月中的某天,以及布尔值,确定是否为月/季度/月/年)。 fastai库实现了一种为您处理此问题的方法,如下所述。

Fastai库中要了解的模块

我们将在未来几个月内发布有关fastai库的更多文档,但该文档已在pip和github上提供,并且已在 面向程序员的实用深度学习 课程。 fastai库建立在Pytorch的基础上,对使用神经网络的最佳实践和有用的高级抽象进行了编码。 fastai库获得了最先进的结果,最近被用来赢得 斯坦福大学DAWNBench竞赛 (最快的CIFAR10培训)。

fastai.column_data

fastai.column_data.ColumnarModelData 以Pandas DataFrame作为输入并创建一种ModelData对象(该对象包含用于训练,验证和测试集的数据加载器,这是在训练模型时跟踪数据的基本方式)。

快速结构化

The 快速结构化 module of the 法斯特图书馆 is built on top of Pandas, and includes methods to transform DataFrames in a number of ways, improving the performance of machine learning models by pre-processing the data appropriately and creating the right types of variables.

For instance, 快速结构化.add_datepart converts dates (e.g. 2000-03-11) into a number of variables (year, month, week, day of week, day of month, and booleans for whether it’s the start/end of a month/quarter/year.)

该模块中的其他有用方法使您可以: