表格数据深度学习简介
撰写:2018年4月29日by 雷切尔·托马斯(Rachel Thomas)有一种强大的技术是 赢得Kaggle比赛 并在Google(根据Jeff Dean的说法), Pinterest的和 因斯塔卡特,但是很多人甚至没有意识到可能: 将深度学习用于表格数据,尤其是 分类变量的嵌入.
尽管您可能听到了什么, 能够 将深度学习用于您可能保存在SQL数据库,Pandas DataFrame或Excel电子表格中的数据类型(包括时间序列数据)。我将其称为 表格数据,尽管它也可以称为 关系数据, 结构化数据或其他字词(请参阅我的 Twitter民意调查和评论 进行更多讨论)。

表格数据是行业中最常用的数据类型,但是与计算机视觉和自然语言处理的深度学习相比,表格数据的深度学习受到的关注要少得多。这篇文章涵盖了将神经网络应用于表格数据的一些关键概念,特别是为分类变量创建嵌入的想法,并重点介绍了该模型的2个相关模块。 法斯特图书馆:
快速结构化
:此模块可用于Pandas DataFrames,不依赖于PyTorch,可与fastai库的其余部分分开使用,以处理和处理表格数据。fastai.column_data
:此模块还可以与Pandas DataFrames一起使用,并提供将DataFrames(具有连续变量和分类变量)转换为ModelData对象的方法,这些对象可以在训练神经网络时轻松使用。它还包括一个用于创建分类变量嵌入的实现,这是一种强大的技术,我将在下面进行解释。
从这篇文章中的材料开始于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的库中,以及 因斯塔卡特具有嵌入 用于其杂货,商店和顾客。

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竞赛第三名,其中涉及使用来自连锁店的时间序列数据来预测未来的销售。这项比赛的第一和第二名得主使用依赖专业知识的复杂合奏,而第三名则是一个单一模型,没有特定领域的特征工程。

在我们的 第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.)
该模块中的其他有用方法使您可以:
- Fill in missing values with the median whilst adding a boolean indicator variable (
fix_missing
) - Change any columns of strings in a Pandas DataFrame to a column of 猫egorical values (
train_cats
)