特征工程艺术中不可避免的四个步骤是什么?
数据仓库有一种存储数据的独特方式,这取决于组织的法规要求。因此,当发布或获取此数据以训练模型时,它可能不是模型用来以最大可能概率预测目标值的最佳形式。该数据可能具有许多不相关的特征,并且可能缺少用于预测的基本驱动特征。假设,我希望我的模型从包含以下特征的数据集学习预测纽约市的出租车费用: 出租车编号、预订时间(唯一随机标识符)、费用、接送地点、供应商名称、出租车类型、出租车颜色、目的地、预订编号 。你真的认为 cab no,booking_number 和 cab_color 可以帮助预测车费吗?不,它可能不会,相反,它可能会最终混淆我们的模型,因为 驾驶室编号 和 预订 _ 编号 可能会有不规则的幅度,而 驾驶室 _ 颜色 显然不是一个因素,因为它几乎不会影响骑车人的体验。这里,出现了伟大的特征工程方法论。特征工程包括我们对数据执行的任何操作,以将其转换为能够在使用训练模型进行预测时产生最高可能精确度的形式,包括选择好的特征、转换它们、导出合成特征、任何预处理等…
要素工程从保留现有的良好要素开始,创建额外的有用要素并从数据集中丢弃不相关的要素。以下四种策略可以帮助我们将数据集塑造成最适合模型的形式。
1。特征应该对模型结果 有影响——例如在上面的例子中,供应商名称,取货地点、预订时间、出租车类型、目的地实质上是驱动费用的值。所以,这些都是好的特性。另一方面, cab_color、c ab no 和 booking_number 不会影响票价,所以这三个很可能被丢弃**。**
2。特征值应该是数值,大小合理——比如上面数据集中的皮卡 _ 位置不是数值,可以是纽约市的任何地址,同样是目的地和出租车类型。我们需要将这些非数字特征转换成数字特征。变换位置的一种简单方式是将它们分类成期望粒度的区域(限于五个区或接近地标或在每条街道等)。)然后对它们进行编码;驾驶室类型和供应商名称也可以编码。此外, booking_time (从开始收集数据的特定日期起以秒为单位)不具有合理的量值,因此在用于导出合成特征(如 booking_day 、 booking_hour 、 booking_month )后,可以将其丢弃。这些综合功能非常有用,因为高峰时段的票价更高,周末也可能更便宜。此外,在假日季节(几个月),许多游客涌入纽约,票价上涨。此外,如果某些旅行的费用比其他旅行的费用高得多,它可能会被视为异常值而被直接拒绝。直方图有助于识别异常值。
- 特性应该有足够多的对应例子——例如,如果对于type _ of _ cabcategory(private,shared),我们没有足够的例子来说明‘shared’属性,这个特性就不能成为一个好的指示器。它会偏向于私人出租车的结果。根据经验,每个特性值至少应该有十个例子。
4。特性应该以人类的洞察力和理解力为指导——例如,我们如何理解我们可以创建 booking_hour 或 booking_month 作为特性。这是因为我们从自己的经验中意识到这种情况的普遍发生。因此,无论是主题专业知识还是一般的人类经验,在特征工程中都是有价值的。
机器学习模型的预测准确性在很大程度上取决于特征工程,数据科学家花费大约 50%至 75%的时间来为模型设计特征。一天结束时,你的模型只会按照你训练它的方式运行。特征工程既是一门艺术也是一门科学,你做得越多,就越擅长。
量化时间序列数据之间同步性的四种方法
数据科学教程
计算同步度量的样本代码和数据,包括皮尔逊相关、时间滞后交叉相关、动态时间弯曲和瞬时相位同步。
Airplanes flying in synchrony, photo by Gabriel Gusmao on Unsplash
在心理学中,个体之间的同步可以是一个重要的信号,它提供了关于社会动态和社会互动的潜在结果的信息。人们已经在许多领域观察到了个体之间的同步,包括身体运动( Ramseyer & Tschacher,2011 )、面部表情( Riehle,Kempkensteffen,& Lincoln,2017 )、瞳孔扩张( Kang & Wheatley,2015 ),以及神经信号( Stephens,Silbert,& Hasson,2010 )。然而,术语同步可以有多种含义,因为有多种方法来量化两个信号之间的同步。
在本文中,我调查了一些最常见的同步指标和测量技术的优缺点,包括皮尔逊相关、时间滞后互相关(TLCC)和加窗 TLCC、动态时间弯曲和瞬时相位同步。举例来说,这些指标是使用样本数据计算的,其中微笑的面部表情是从两个参与者进行 3 分钟对话的视频镜头中提取的(如下截图)。要跟进,请随意下载样本提取的面部数据和包含所有示例代码的 Jupyter 笔记本。
概述
- 皮尔逊相关
- 时间滞后互相关(TLCC)和加窗 TLCC
- 动态时间扭曲(DTW)
- 瞬时相位同步
Sample data is the smiling facial expression between two participants having a conversation.
1.皮尔逊相关——简单最好
Pearson correlation 测量两个连续信号如何随时间共同变化,并以-1(负相关)到 0(不相关)到 1(完全相关)之间的数字表示线性关系。它很直观,容易理解,也容易解释。使用 Pearson correlation 时需要注意两件事:1)异常值会扭曲相关估计的结果,2)它假设数据是同方差的,因此数据的方差在整个数据范围内是同质的。一般来说,相关性是全局同步性的一个快照度量。因此,它不提供关于两个信号之间的方向性的信息,例如哪个信号在前,哪个信号在后。
Pearson 关联在多个包中实现,包括 Numpy、Scipy 和 Pandas。如果数据中有空值或缺失值,Pandas 中的关联函数会在计算前删除这些行,而如果使用 Numpy 或 Scipy 的实现,则需要手动删除这些数据。
以下代码加载的是样本数据(在同一个文件夹中),使用 Pandas 和 Scipy 计算 Pearson 相关性,并绘制过滤后的中值数据。
再一次,总体皮尔逊 r 是对全局同步性的度量,它将两个信号之间的关系简化为单个值。尽管如此,还是有一种方法可以利用皮尔逊相关来观察瞬间的局部同步。一种计算方法是通过测量一小部分信号中的皮尔逊相关,并沿着滚动窗口重复该过程,直到覆盖整个信号。这可能有点主观,因为它需要任意定义窗口大小,你想重复这个过程。在下面的代码中,我们使用 120 帧(~4 秒)的窗口大小,并在下图中绘制时刻同步。
Sample data on top, moment-to-moment synchrony from moving window correlation on bottom.
总的来说,皮尔逊相关是一个很好的起点,因为它提供了一种非常简单的方法来计算全局和局部同步性。然而,这仍然不能提供对信号动态的洞察,例如哪个信号首先出现,这可以通过互相关来测量。
2.时间滞后互相关——评估信号动态
时间滞后互相关(TLCC)可以识别两个信号之间的方向性,例如领导者-追随者关系,其中领导者发起由追随者重复的响应。有几种方法可以研究这种关系,包括经济学中使用的格兰杰因果关系,但请注意,这些仍然不一定反映真正的因果关系。尽管如此,我们仍然可以通过观察互相关来判断哪个信号先出现。
http://robosub.eecs.wsu.edu/wiki/ee/hydrophones/start
如上所示,TLCC 是通过递增移动一个时间序列向量(红色)并重复计算两个信号之间的相关性来测量的。如果峰值相关性位于中心(offset=0),这表明两个时间序列在该时间最同步。然而,如果一个信号领先于另一个信号,则峰值相关可能处于不同的偏移。下面的代码使用 pandas 功能实现了一个互相关函数。它还可以包装数据,以便仍然通过添加来自信号另一侧的数据来计算边缘上的相关值。
Peak synchrony is not at the center, suggesting a leader-follower signal dynamic.
在上面的图中,我们可以从负偏移推断出受试者 1 (S1)正在引导交互(当 S2 向前推进 46 帧时,相关性最大化)。但这又一次评估了全球水平的信号动态,例如在整个 3 分钟期间谁领先。另一方面,我们可能会认为互动甚至可能更加动态,这样领导者和追随者的角色会随时变化。
为了评估更细粒度的动态,我们可以计算加窗时间滞后互相关(WTLCC)。这个过程在信号的多个窗口中重复时间滞后互相关。然后,我们可以分析每个窗口,或者对窗口求和,这将提供一个分数,比较两个个体之间领导者与追随者之间的互动差异。
Windowed time lagged cross correlation for discrete windows
上面的图将时间序列分成 20 个均匀的块,并计算每个窗口中的互相关。这让我们对交互中发生的事情有了更细粒度的了解。例如,在第一个窗口(第一行)中,右边的红色峰值表示 S2 最初领导交互。然而,在第三或第四个窗口(行),我们可以看到 S1 开始更多地引导互动。我们也可以连续计算,得到更平滑的图,如下所示。
Rolling window time lagged cross correlation for continuous windows
时间滞后互相关和窗口时间滞后互相关是可视化两个信号之间的细粒度动态交互的好方法,例如领导者-追随者关系以及它们如何随时间变化。然而,这些信号是在假设事件同时发生且持续时间相似的情况下计算的,这将在下一节讨论。
3.动态时间弯曲——长度不同的信号的同步
动态时间弯曲(DTW)是一种计算两个信号之间的路径的方法,该方法可以最小化两个信号之间的距离。这种方法最大的优点是还可以处理不同长度的信号。最初是为语音分析而设计的(在这个视频中了解更多),DTW 计算每帧之间的欧几里德距离,以计算将匹配两个信号的最小路径。一个缺点是它不能处理丢失的值,所以如果你有丢失的数据点,你需要预先插值。
XantaCross [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)]
为了计算 DTW,我们将使用dtw
Python 包来加速计算。
这里我们可以看到白色凸线中显示的最小路径。换句话说,较早的主题 2 数据与较晚的主题 1 数据的同步相匹配。最小路径代价为 d =.33,可与其他信号相比。
4.瞬时相位同步。
最后,如果您有一个您认为可能具有振荡特性的时间序列数据(例如 EEG、fMRI),您也可以测量瞬时相位同步。这种方法还可以测量两个信号之间的瞬间同步。这可能有些主观,因为您需要将数据过滤到感兴趣的波长,但您可能有确定此类波段的理论原因。为了计算相位同步,我们需要提取信号的相位,这可以通过使用希尔伯特变换来完成,希尔伯特变换将信号分解为相位和功率(点击了解关于希尔伯特变换的更多信息)。这使我们能够评估两个信号是同相(一起上下移动)还是异相。
Gonfer at English Wikipedia [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)]
Filtered time series (top), angle of each signal at each moment in time (middle row), and instantaneous phase synchrony measure (bottom).
瞬时相位同步测量是计算两个信号之间瞬间同步的好方法,无需像滚动窗口相关那样任意决定窗口大小。如果你想知道瞬时相位同步与窗口相关相比如何,点击这里查看我之前的博客文章。
结论
这里我们介绍了四种测量时间序列数据同步性的方法:皮尔逊相关、时间滞后交叉相关、动态时间弯曲和瞬时相位同步。确定同步度量标准将基于您拥有的信号类型、您对数据的假设以及您希望从数据中获得什么同步信息的目标。欢迎在下面留下任何问题或评论!
查看下面 Jupyter 笔记本中的所有代码,并使用此处提供的样本数据。
*新增 2021.05.12:在 Google Colab 中直接打开教程!
如果您觉得本教程很有用,并将在您的研究项目中使用,请考虑引用这篇文章,并附上以下参考:
Cheong,J. H. (2020 年 12 月 8 日)。量化时间序列数据同步性的四种方法。【https://doi.org/10.17605/OSF.IO/BA3NY
谢谢引用!
西蒙,O. B .,布阿尔,I .,罗哈斯,D. C .,霍尔登,S. K .,克鲁格,B. M .,&戈什,D. (2021)。使用最小生成树、边缘切割和脑磁图来理解帕金森认知衰退的新方法。科学报道, 11 (1),1–17。
Pagay,V. (2021)。用微型张力计揭示植物水势的动态方面。 bioRxiv 。
Galvis,d .,Zavala,e .,Walker,J. J .,Upton,t .,Lightman,S. L .,Angelini,G. D .,… & Gibbison,B. (2021)。大手术期间和术后全身炎症和下丘脑-垂体-肾上腺(HPA)轴的动态相互作用。 bioRxiv 。
Bente,g .,Novotny,e .,Roth,d .,和 Al-Issa,A. (2020 年)。超越刻板印象:分析非言语融洽中的性别和文化差异。心理学前沿, 11 。
机器学习中的水力压裂特征
特征空间破解新数据引入潜在有用的新类,如果检测到的话。具有低于可接受的分类置信度的新数据点的增长率的突增表明新的数据区正在特征空间中被划分出来……
唯一不变的是变化。数据也不例外。检测数据演变允许我们进一步分析它对未来的决策意味着什么。例如,我们可能会根据症状周围的一些初始数据,将患者分为简单的死亡或不死亡。但是随着死亡的发展,症状及其适当的治疗方案也在发展。经过轻微症状训练以检测死者存在的模型仍然可以检测到具有急性症状的死者。但是我们希望在对这些新数据进行分类的同时也能检测到异常,发出警报并将其标记为可能需要新的类。预先区分急性、中度和轻度病例,并对患者进行分类,在许多层面上都有巨大的好处。
显然,特征的数量没有改变,用于数据分类的基本概念也没有改变。但是输入数据的分布已经改变。新数据在先前没有数据的同一特征空间中划分出区域。这是特征空间细分,或者更滑稽地说,是特征空间的分裂。
在旧数据/类上训练的模型将按照它知道的类存储任何和所有数据——这并不奇怪。但是将新区域标记和识别为潜在的新兴新类别是非常有用的。这实质上是这篇文章的目标。重点是介绍一种方法。为了做到这一点,我们考虑一个具有两个特性和几个类的简单问题。虽然问题是人为的,但视觉效果可以帮助你理解问题的关键。重现结果的代码可以从 github 获得。
当您在数据中检测到新的类时,该做什么取决于问题。例如,如果我们确实决定一个新的类是有保证的,我们可以标记这个标记的新数据的一部分并重新训练模型
1.特征空间分割
在 N 个类上训练的分类器必须将输入数据放入这 N 个类中的任何一个。包括所有旧的和任何新的数据点的整个特征空间已经被分成 N 个区域。但是训练分类器的数据可能没有完全覆盖这些区域。当新数据开始进入这些先前的空白区时,这表明数据正在演变。
Figure 1. Features have not changed. New data has come in to carve out a distinct zone for itself in the same feature space
例如,一个模型可能已经预先根据诸如“通话”、“移动”等术语的存在/不存在将通信设备分类为台式电话或寻呼机…但是这个模型将会对对讲机和移动电话感到非常困惑,因为它们已经声称拥有同一个特征空间的不同部分。根据描述中术语的具体丰富程度,模型可能会将其中一些产品标记为寻呼机,而将其他产品标记为台式电话,这正是分类器经过训练要做的事情。但是它不是最佳的。如果我们有能力检测到新数据到达这些以前的空白区域,我们就可以检查这些数据,并可能为它们定义新的类别。添加移动电话和对讲机作为新的类别,并训练分类器来预测它们,这将是对分类器非常有用的增强。
虽然我们可以在较低的维度中可视化新出现的裂缝和新的数据区,但在较高的维度中这是不实际的。我们需要一个全球性的衡量标准,作为正在进行的新数据分类的一部分。这一全球指标的表现应该为我们寻找新兴的区域/类别提供线索。从分类置信度中得出的一个指标就是我们在这里用来识别特征空间压裂的指标。让我们回顾一下什么是分类置信度。
2.分类置信度
大多数分类器本质上是概率性的(有显著的例外,如 SVM,即使有从距离度量导出概率的方法)。也就是说,当要求分类器预测新数据点的类别时,它首先给出该数据点属于任何可用类别的概率列表。然后,它选择概率最高的类。现在考虑下面的论点——大部分是常识。
- 每个新数据点都被放在一个类中,即分类器计算出的概率最高的类。概率越高,这个数据点分类的置信度就越大。
- 落在具有大量训练数据的区域中的新数据点将以高置信度被分类。
- 与上面第 2 点相反。也就是说,落在具有很少或没有训练数据的区域中的新数据点肯定会被分配一个类别,但是具有较低的置信度。
下图 2A 用一个玩具 2 特征 2 类问题说明了这一点,该问题使用逻辑回归作为建立在充分分离的数据上的分类器。在线性边界上,点属于任一类的概率为 0.5,即置信度最小。随着我们远离边界并进入包含数据的区域,某个点属于正确类的估计概率会更高,也就是说,置信度会更高。
通常,数据点的分类置信度是该数据点可能属于 N 个类别中的任何一个的 N 个概率中的最大值。
分类置信度
图 2B 显示了在整个特征空间上计算的该模型的分类置信度。
Figure 2. (2A) The classifier is trained with the well segregated data on the left, yielding a perfect decision boundary. (2B) Given the classifier in 2A, the classification confidence of points all across the feature space is shown. The classifier has high confidence in the zones with a lot of training data compared to the zones with little or no training data
水力压裂指示器
从上面的讨论可以得出,当新数据落在先前未填充的区域中时,那些新数据点的分类置信度会较低。因此,我们选择一个阈值置信水平,并保存由模型预测的分类置信度低于该阈值的新分类数据点的计数。当没有划分出新的区域时,该计数将以其正常的背景速率增加,因为总会有一些名义量的数据进入未被占用的区域。但是当数据发展时,新数据的更高(高于背景)部分开始进入那些先前的空白区域。这将表现为该计数的增长率持续(假设数据继续以这种方式发展)激增——当然,其他条件都相同。
粗略地说,我们可以通过寻找低于阈值分类置信度的新数据点数量增长率的突增来识别特征空间压裂
压裂指示器
作为分类任务的一部分,我们计算分类置信度所需的概率已经由分类器提供。因此,在正在进行的分类练习中,低于阈值置信度的数据点的数量及其增长率很容易计算和跟踪。当我们检测到该压裂指标持续激增时,我们可以触发一个任务,以低分类置信度对特定的新数据进行采样,并决定是否为它们创建新的类。我花了一些时间才走到这一步,但这就是方法。我们将用一个例子和代码片段来结束这篇文章
3.模拟
考虑下面图 3.1 中所示的四个数据区和类别(A、B、C 和 D)的初始良好隔离布局。我们特意在每个区域/类别中为传入的数据留出足够的空间,以划分出新的区域/类别。下面是给定三个顶点的情况下将数据注入任意三角形区域的代码片段。
多项式逻辑回归分类器是根据图 3.1 中的数据进行训练的。假设这些类是线性且完全可分的,那么它会得到一个完美的 f1 分数。垂直和水平轴/线实际上是获得的决策边界。具有低分类置信度(< 0.75)的点被获得用于跟踪。
Figure 3. As time passes by the ‘active’ data zones grow from the four A-B-C-D in 3.1 to the eight zones A-B-C-D-A’-B’-C’-D’ in 3.5 in that order
3.1 低分类置信度区域
以下代码片段模拟了成批的新数据(当然没有标签),每批数据都向当时的活动数据区添加了初始点数的大约 1%。活动数据区从 A-B-C-D 开始,按以下顺序发展:A-B-C-D-A ’ = > A-B-C-D-A '-B ’ = > A-B-C-D-A '-B '-C ’ = > A-B-C-D-A '-B '-C '-D '。从上面的图 3.2-3.5 可以清楚地看出,随着时间的推移,新的数据区 A '到 D '在特征空间中被划分出来。
我们跟踪低于阈值分类置信度的数据点。图 4 显示了这些数据点的空间分布。正如所料,没有训练数据显示的区域是这些图表中亮起的区域。
Figure 4. The data points with low classification confidence are right the middle of the zones that offered no training data to the model.
这是一个 2 特征问题,我们可以将特征空间的压裂可视化,如图 4 所示。压裂指标有助于我们在更高的维度上检测同样的问题,因为它是一个全局标量测量。
3.2 压裂指示器
从图 4 中可以清楚地看出,当开始划分新的数据区时,点的数量的增加速率必须有一个突增。因为我们在分类练习中记录了这个数字,所以很容易生成下面的图 5。
Figure 5. A spike in the rate of increase of points with lower than thresold classification confidence occurs when a new data zone starts to be carved out.
4.结论
我们的目标是通过全局测量来识别特征空间压裂,该全局测量可用于触发对受影响的新数据的评估,以评估添加新类的潜在有用性。
- 我们将数据点的分类置信度定义为所有概率中的最大值,该数据点可能属于训练的任何类别
- 我们将压裂指标定义为低于某个阈值分类置信度的新数据点数量的增长率
- 借助于一个理想的、人为的问题(恒定的新数据速率、稳定发展的新数据区等),我们证明了压裂指标的突增指向了潜在新类别的增加。
真实数据包括噪声、可变数据速率、不断发展的数据区和正在消亡的数据区。尽管如此,如图 5 所示的仪表板监控图在生产中正在进行的分类练习中还是很有用的。如果不是为了精确定位一个新类有用的确切时间,而是为了检测什么时候应该拆分一个“非上述”桶。
原载于 2019 年 5 月 6 日【http://xplordat.com。
用数据帧构建数据
探索性数据分析
将开放数据导入业务框架
The Charging Bull in New York City. Photo: Author
在任何挑战的开始,特别是对于数据科学家经常面临的复杂和模糊的挑战,构建一个思考过程来解决基本问题是最初的任务之一。许多行业雇佣拥有特定领域知识的主题专家,他们不断开发、教授和增强独特的思维范式。
功能性组织结构将具有特定技能的员工划分到不同的部门,如人力资源、销售、营销、财务和工程等。这可能会产生筒仓效应,产生有用的信息,但不一定共享。作为回应,公司组建跨职能团队,以促进整个组织的共享和学习。
这些团队可以提高公司的整体效率,因为他们加强了公司相互依赖的内部网络。例如,可以通过整合(比如)数据科学家推断的信息和见解来改善战略决策。因此,让我们来看看如何将快速增长的数据导入企业领导者熟悉的直观框架中。
探索性数据分析
商业战略家和顾问经常通过进行形势分析来探索一个行业,形势分析考虑了 5C(背景、消费者、公司、竞争和合作)。增长份额矩阵,通常称为 BCG 矩阵,是由波士顿咨询集团在 1970 年推出的,是一个流行的可视化市场分析的商业框架。
波士顿矩阵根据成分增长率和市场份额评估市场,创建了四个象限,分别称为狗、问号、星星和现金牛。多元化公司在成熟、高份额的市场中拥有业务线,这些市场会产生超额现金流,也在具有高增长机会的细分市场中拥有业务线,这些细分市场通常需要大量现金投资。
Dogs 指的是低增长、低份额的市场,通常难以实现收支平衡。分析师的传统智慧是清算这个领域的业务。
问号是高增长、低份额的市场,既有潜力又有风险。新企业通过选择和剥离战略瞄准这一领域。
星号是问号,已被广泛用于成为市场领导者。由于激烈的竞争,持续的增长推动公司投资。
摇钱树是成熟的市场,在这里,根深蒂固的参与者可以用最少的投资维持他们的地位,让他们能够榨取可靠的现金流。
让我们用一个真实的例子来看看我们如何将波士顿矩阵中的概念应用到一个特定的行业。此外,我们可以获取免费的开放数据,并以有意义的方式组织信息来填充图表。最后,我们可以在一个交互式的、基于云的可视化环境中呈现我们的市场分析,可以通过查询来访问分层信息。
宠物护理行业
从蟒蛇到蟒蛇再到熊猫,数据科学家对动物有很强的亲和力。Robbrecht van Amerongen 编制了一份编程语言动物园中最受欢迎的清单。作为启发,我们可以通过搜索快速增长和备受喜爱的宠物护理行业的可用开放数据源来生成 BCG 矩阵(注意:市场研究的成本高达$9,450⁴).
美国宠物用品协会(APPA)预计,2019 年宠物护理行业将超过 750 亿美元,比上年增长 3.9%。⁵消费者支出类别主要是宠物食品(320 亿美元)、兽医护理(190 亿美元)和用品及非处方药(160 亿美元)。现在,让我们在网上搜索信息来源,以发展我们自己的市场分析。
纽约街区
我们可以在 Kaggle 上搜索数据集,但只会找到七个关于宠物的结果,尽管有无数的猫和狗图像库。⁶最权威和完整的数据集是纽约市狗许可数据集,它跟踪 15 列和 122k 记录,作为纽约市开放数据倡议的一部分。⁷
该数据集包括纽约有执照的狗的区和邮政编码信息,这提供了按位置旋转数据的可能性,但区似乎太粗糙,邮政编码似乎太精细。因此,让我们参考纽约州卫生部对纽约市社区的邮政编码定义,它将纽约市细分为 42 个可管理的社区。⁸
First 10 neighborhoods in New York, mixed format (wide and long). Image: Author
最初的 Pandas 数据帧被安排在一个多层次的索引中,除了邮政编码,它被打包成一个宽格式。不过,该表的目标是将 NYC Dog Licensing 数据集中的每个记录的邮政编码映射到其各自的邻域。因此,第一项任务是将表重新调整为长格式,以便于处理,可以通过邮政编码进行索引。
First 10 neighborhoods in New York, long format. Image: Author
竞争对手集中度
除了代表纽约消费市场的特许狗数据,我们还可以收集有关商业竞争的信息。Yelp Fusion API 拥有纽约各种商业的综合数据库。⁹通过搜索宠物店和宠物服务,我们可以收集到 1502 家在 2019 年积极迎合宠物护理行业的独特商家。
First 10 New York pet stores and pet services actively operating in 2019. Image: Author
市场集中度是衡量行业竞争力的一个基本指标,市场可以介于完全竞争和垄断竞争之间。没有每个商店的收入或客户流量数据,我们不得不做出一个很大且不切实际的假设,即每个商店都是等效的。话虽如此,我们可以用每家连锁店的数量来代表总市场份额。
集中度汇总了该行业顶尖公司的总市场份额。以⁰为例,我们四大公司的 CR4 仅占 8.9%,而 CR8 占 11.9%,这表明市场高度分散。或者,美国司法部在反垄断案件中使用的赫芬达尔-赫希曼指数在 0(完全竞争)和 10,000(垄断)的范围内是 31。
Concentration Ratios for the top 8 firms in the New York pet care industry. Image: Author
类似地,我们可以将竞争对手的数据按邻居分组,并测量地理集中度或密度。我们测量 CR4 为 30.6%,CR8 为 49.9%,这意味着一半的宠物店和服务位于八个社区。所有邻域份额的平方和为 448 的邻域 HHI 仍然被认为是不集中的。
Concentration Ratios for the top 8 neighborhoods in the New York pet care industry. Image: Author
市场尺寸
纽约市开放数据方便地让我们下载整个纽约市狗许可数据集作为一个 CSV 文件,我们可以导入到熊猫数据框架。我们注意到它有许可证颁发的年份和许可证到期的年份,这使我们能够统计在给定的年份中有多少有效的许可证狗。这个指标与数字营销中的月活跃用户(MAU)非常相似。
First 10 of 121,713 New York licensed dogs from 2014–2022. Image: Author
现在,我们已经收集了我们的邻居、宠物企业和特许狗数据集,我们可以将它们插入到 SQL 数据库中,并通过一些强大的查询将它们连接到单个数据框架中。通过只选择每个日历年中有效的狗许可证,我们可以计算每个街区从 2014 年到 2019 年的 5 年复合年增长率(CAGR) ⁴。
Market share and growth rate (2014–2019) of pet care industry for first 10 neighborhoods in New York. Image: Author
现在,我们已经计算了纽约每个街区的许可狗的市场份额和增长率,我们可以在 Plotly 等数据可视化引擎中以 BCG 矩阵的形式呈现我们的分析。⁵我们可以通过将数据点划分为每个社区的宠物商店的数量,并用每个商店的特许狗的数量来给这些数据点添加阴影,从而增加图表的丰富性。
纽约许可养狗的增长份额矩阵展示了一种引人注目的邻里模式,它遵循着一条从最初的狗,发展到问号,成为明星,成熟为摇钱树的轨迹。我们可以很容易地看到,四个社区享有很高的市场份额,其中两个提供了机会,因为它们没有得到宠物企业的充分服务。
Growth-Share Matrix of licensed dogs in New York. Source: Author¹⁶
为该分析编写的源代码可在 github 上获得,其中包括从 Yelp 和 NYC Open Data 收集数据集,用 Python、Pandas 和 SQL 处理数据,并在 Plotly 中呈现 BCG 矩阵。整个 Plotly 代码很短,可以由 Plotly 自动上传和托管,Plotly 为修改和可嵌入的链接提供了一个仪表板。
Visualizing the BCG Growth-Share Matrix with Plotly. Source: Author¹⁸
小心缝隙
宠物企业的市场份额只能通过给定社区内企业或公司拥有的实体店数量来计算,这可以通过收入或客流量数据来提高。
纽约市经济发展公司估计,纽约只有 20%的狗获得许可,因此需要注意的是,纽约市许可的狗数据集只是整个狗种群的样本。
狗数据集于 2014 年开始跟踪数据,因此在随后的几年里,注册量出现了明显的峰值。注册数量的增长不应与实际养狗数量的增长相混淆。
狗的数据集最后一次更新是在 2017 年,所以最近颁发的许可证没有被捕获,而正在进行的到期将在 2022 年前使狗的数量减少。这种数据上的差距会影响 CAGR 比率,取决于所考虑的年份。
鉴于任何数据集的局限性,我们现在应该有信心收集开放的数据源,进行市场分析并可视化 BCG 矩阵,以便我们的数据可以轻松地与企业领导者相关联。
参考
- T.J. Steenburgh 和 J. Avery,“营销分析工具包:形势分析”,哈佛商学院背景说明 510–079,2010 年。
- A.Ovans,“改变世界的图表”,《哈佛商业评论》,2011 年。
- R.van Amerongen,“欢迎来到受动物王国启发的编程语言动物园”, AMIS,数据驱动博客,2018 年 1 月 14 日。
- “2018-2025 年按宠物类型(狗、猫、鱼、鸟)、产品、竞争格局和细分市场预测的宠物护理市场规模、份额和趋势分析报告”,大观研究,2018 年。
- J.巴克斯特,“美国人在宠物上的支出比以往任何时候都多:720 亿美元,”美国宠物产品协会,2019 年 3 月 21 日。
- 卡格尔,https://www.kaggle.com,2019。
- 心理健康和卫生部,“纽约市狗许可数据集”,载于纽约市 OpenData,https://data . cityofnewyork . us/Health/NYC-Dog-Licensing-Dataset/nu7n-tubp,2019 年 7 月 25 日更新。
- “纽约市街区的邮政编码定义”,纽约州卫生部,https://www . Health . ny . gov/statistics/cancer/registry/appendix/Neighborhoods . htm,2006 年更新。
- Yelp Fusion,【https://www.yelp.com/fusion】T2,2019。
- Y.谭,“中国银行业效率与竞争的测度”,载《中国银行业的效率与竞争》,昌多斯出版社,2016 年。
- C.R. Laine,“Herfindahl-Hirschman 指数:从消费者角度看集中程度”,《反托拉斯公报,1995 年 6 月 1 日。
- “赫芬达尔-赫希曼指数”,美国司法部,https://www.justice.gov/atr/herfindahl-hirschman-index,2018 年 7 月 31 日更新。
- 米(meter 的缩写))Knoop,“应用洞察:MAU 究竟是如何计算的?“《广告周刊》,2009 年 1 月 12 日。
- J.Fernando,“复合年增长率— CAGR”, Investopedia ,2020 年 11 月 13 日更新。
- 剧情,https://plotly.com,2019。
- A.C. Dick,“纽约各街区许可养狗的增长份额矩阵”,载于 Plotly,https://chart-studio . plot ly . com/~ Adam . c . Dick/2/Growth-Share-Matrix-of-Licensed-Dogs-in-New York-by-Neighborhood,2019。
- A.C. Dick,“用 DataFrames 构建数据”,载于 GitHub,https://github.com/acdick/framing_data_with_dataframes,2019 年。
- A.C. Dick,《在 Plotly 中可视化 BCG 矩阵》,载于 GitHub,https://gist . GitHub . com/AC Dick/52 eef 3c 723 a 2361 a 187 e 78 ff 808 EB 14,2019。
法国 2019 年人工智能大会:从学生的角度看
The amazing team of organizers!
我知道距离我的上一篇文章已经过去了很长时间,发生了很多事情,我有其他的优先事项,我的一些其他文章仍然需要结束,但这次不是,所以我们带着一些新的东西再来一次!
今天,我将讲述我上周参加的一个非常有趣的活动,我将尝试综合我所理解的内容,并给你一些我在研究后发现的有用链接,如果你想深入了解的话。
长话短说:去年 6 月作为一名计算机系统工程师毕业,现在我在巴黎攻读计算机视觉硕士,在大城市的一个优势是你可以找到的活动和会议的数量和质量,我很幸运地发现了“法国是 AI ”。
法国是人工智能,是 2016 年发起的一项倡议,旨在支持和促进法国人工智能生态系统。活动在巴黎市中心的创业园区站 F 举行。
STATION F, Paris (France)
老实说,我想去的主要原因是为了见见伟大的 Yoshua Benjio ,但不幸的是,他因腿骨折而无法参加活动,然而,其余发言者的质量正如我所期待的那样好,在大多数情况下,我必须实时学习许多新单词才能赶上。
我将尝试从我的角度对我所看到的给予反馈,并给你一些链接,以防你想看得更深。你可以在这里找到会议的日程。正如你所看到的,这是非常激烈的,所以我将只谈论我可以跟随的人,我想提一下,我喜欢他们使用的细节和技术词汇的水平,这在其他活动中通常不会出现。
我记得的第一个演讲是“关于多智能体学习的评估和培训”,由 Google DeepMind 的一位研究科学家做的,在那里他展示了他们的最新成果: α-Rank ,这是一种在大规模多智能体交互中对智能体进行评估和排序的方法。演讲者鼓励寻找更古老的方法,并举了一个强化学习的例子,这是一种古老的方法,但在过去几年里引起了科学界的极大兴趣。然后,他给出了使用纳什均衡的 3 个缺点(详情请查阅论文),以及为什么他们使用马尔可夫-康利链。
下一位演讲者是 NAVER LABS 的研究员 Naila Murray,她谈到了“在虚拟世界中学习视觉模型”,她展示了他们在过去几年中一直在做的一系列工作,这里我要打断一下,我不知道这意味着什么,但根据我的理解:使用合成数据训练模型时存在过度拟合的问题,他们找到了一些使用合成视频生成真实世界数据的解决方案,如果我错了,请纠正我。
然后我们与谷歌大脑研究员 Nicolas Papernot 讨论了对抗性攻击(和著名的“熊猫”照片),以及基于 DNN 的解决方案中的隐私保护,以及在使用私人训练数据时如何使用有效的方法。
If you reverse-engineer a model, you can easily trick it to have this kind of results
然后由 Cretio 做了一个关于他们如何大规模使用广告推荐系统的演示,并使用了一个 SVD 变换近似(随机化 SVD)和非常大的矩阵。在这里你可以看到他们系统的简要描述。
Criteo recommender systems presentation
下一个发言人伤害了我的感情😂我的意思是我去年的毕业设计是关于特征选择的,听她的演讲让我觉得:
更严重的是,他们正在处理一个“高维小样本”的问题,当你有这么多特征,但没有足够的数据来训练一个稳健的模型时,这就是基因组学的主要困难之一。她提出了三个建议:1)使用结构化的先验知识 2)对每对特征和表型之间的关联进行统计测试 3)使用核。
我喜欢下一位演讲者,让·庞塞,Inria 的研究主管,不仅仅是因为这完全直接关系到我的研究领域,还因为他用来说服你这些挑战的重要性的论据和方法。
更多关于对抗性攻击的演讲是由巴黎多菲纳大学教授兼 MILES 的负责人 Jamal Atif 提出的。我以前没有这方面的知识,我听不懂他在说什么,但他介绍了他的团队开发的许多方法,这些方法似乎非常有效。
然后,就在午餐前,我们听取了来自纽约一家专注于 NLP 的初创公司humping Face的 Thomas Wolf 的演讲,他在演讲中介绍了迁移学习,其工具,以及趋势。我认为这是一家非常有前途的初创公司,尤其是在开发了他们的版本BERTdistil BERT 之后。
休息之后,我们听取了夏羽·马利特关于“深度神经网络的数学解释”的演讲,以及他如何在学习的重要性上输给了(他试图证明你不需要有一个大的数据集来获得好的结果)。
在那之后,Google 的工程主管 Noe Lutz——Brain Applied Zurich 向我们介绍了 TensorFlow 2.0,我不得不说他们所做的改进是惊人的,尤其是因为我有很多东西要赶上(我猜从 1.7 开始就没有使用 tf 了)。
“使用机器学习管理城市移动性”是 Dominique Barth 做的一个非常有趣的演讲,因为它完全是关于使用强化学习( 1 、 2 、 3 、 4 、 5 和 6 )来解决这个问题,并且在一定程度上理解演讲者所谈论的内容总是一件令人愉快的事情。
接下来的演讲由脸书人工智能研究所的研究科学家 Natalia Neverova 进行,她指出视觉人类理解的下一个里程碑是获得图像中每个像素的语义含义以及它们到物体特定部分的映射,以及从 2D 重建 3D 姿势和形状的问题。跟踪最先进的问题是很重要的,因为即使你只是一名学生或来自行业,你也可以为解决这些问题做出贡献,因为你有自己的观点,可能连像 FAIR 这样的大实验室都没有考虑到。
下一位演讲者是微软法国公司的 CTO & CSO Bernard Ourghanlian,他再次谈到了人工智能中的隐私、对抗性攻击和伦理,以及全同态加密方法如何解决许多问题,并解释了其背后的动机,还说这是一种有前途的方法,即使它可能会产生潜在的性能成本。他还展示了用于此目的的微软编译器 CHET。
在这个休息时间,我有机会与谷歌苏黎世机器学习研究负责人 Olivier Bousquet 面对面交谈,我问他他们正在研究的热门话题,不出所料,强化学习再次出现在桌面上,这使得讨论更加有趣,因为我可以保持对话活跃(不幸的是,我不太擅长与女士们交谈😥).
说到 Olivier,他是下一个演讲者,他的演讲是关于“解决许多任务的模型”。他首先展示了人工智能在具体任务方面有多好,如 ImageNet 分类,以及它们如何超越了人类现在的误差容忍水平(最高 1%误差< = > 99%+准确率)。但是他说我们仍然远没有解决视觉或语言的实际问题,为什么我们不考虑一个模型来解决许多任务。怎么做呢?他认为有一个秘方可能行得通(提示:是自我监督和转移学习)他举了 BERT 的例子(不是芝麻街的那个)。最后,他谈到了一种方法他们正在研究制作多任务模型:通过使用多个基本模型。
下一个演讲是关于“将纵向形状数据集聚类成独立或分支轨迹的混合物”,由我们大学的教授 Stephanie Allassonniere 主讲😎。他们的贡献是从一组患者中重组疾病的进化,以提供整个群体的进化。怎么会?我不会比她解释得更好( 1 、 2 、 3 、 4 、 5 ),但总的来说,我所理解的主要思想是根据特征子集来推断疾病的演变。
Test, learn then Scale, I really like this “motto”
下一位演讲者是史蒂夫·贾勒特,他介绍了人工智能在法国跨国电信公司 Orange Group 的应用,他是人工智能、数据工程和人工智能战略的负责人。我真的很喜欢他将今天的人工智能与 1995 年的手机进行比较,以及 Orange 对非洲国家的愿景,这些国家不一定能接入互联网。
下一个演讲是由来自 Criteo 的研究员 Vianny Perchet 所做的“竞争与合作的人工智能”。这让我看到了数据的一个非常关键的用例:你如何确保你用来训练你的模型的数据的完整性,尤其是在竞争中?你怎样才能找到一个双赢的局面或者一个“纳什均衡”?
贾丝汀·卡塞尔的演讲与我们一整天所看到的有所不同,她谈到了“社交人工智能”,以及这些系统的目标如何不是达到人类的水平,而是,特别是在与孩子们互动时,不要愚弄他们,并给他们能力说这不是一个真正的人类,但即使在这种情况下,利用它的帮助。
我错过了下一位演讲者(来自 INRIA/ENS 的 Francis Bach)的大部分演讲,他谈到了“机器学习的分布式优化”,但你可以从他的结论中看到他,给出了他们得到的一些结果以及关于如何优化分布式 ML 算法的其他观点。
来自 CentraleSupelec 的 Maria Vakalopoulou 向我们介绍了他们最近在医疗保健以及人工智能和医学成像方面的工作,以及她对该领域未来的看法。
现在,大家都在等待的演讲开始了:2018 年图灵奖得主(严和辛顿)因其对人工智能进步的卓越贡献而获奖,Yoshua Bengio,正如我们之前提到的那样不能来,但仍然通过视频电话发表了他的演讲。他提到了很多方面,其中之一是目前的系统 1 和系统 2 认知类别,最后,他谈到了他将如何定义达到“人类水平的人工智能”的下一步,并缩小两个系统之间的差距。他在两周前做了一个类似的演讲,内容完全相同,所以你可以在这里查看。
然后,我们有一个有趣的小组,讨论如何在欧洲进行人工智能监管,以及各国如何合作,在当地监管的基础上增加一个共同的、更强有力的监管。
Nicolas 和 Emmanuel 透露,就人工智能投资而言,法国显然是欧洲第一国家,主要是因为英国因英国退出欧盟困境失去了一些兴趣,但欧洲仍有很长的路要走,才能赶上美国。
最后,我知道这是一篇很长的文章(你可以想象我们当时的日子),我要感谢主办方:法兰西数码,感谢他们邀请我参加这次会议。我来到法国才一个月,我不知道其他会议/活动如何,但我喜欢大多数演讲中的技术含量。
如果你在那里,你有什么要补充的,或者你想纠正什么,请留下评论,我接受所有的反馈,因为我还在学习。
你正在阅读 Amine 的一篇文章,他是一名年轻的计算机视觉学生,他是这样进行机器学习的:
Credits: instagram.com/neuralnetmemes
利用成本敏感的机器学习进行欺诈检测
依赖于实例的成本敏感分类算法的概念
在传统的两类分类问题中,我们的目标是最小化错误分类,并使用准确性、F-score 或 AUC-ROC 曲线等指标来衡量模型性能。然而,在某些问题上,为了降低总成本,允许更多的错误分类是最好的。如果与错误分类相关的成本因样本而异,我们应该应用依赖于示例的成本敏感学习方法。但是让我们从头开始…
在本文中,我将通过在信用卡欺诈数据集上训练和测试各种模型来解释示例依赖成本敏感机器学习的概念。请注意,我选择这个任务的模型是为了说明这个概念,而不是为了获得最佳的预测结果。本文提供了部分代码,完整的代码可以在我的 GitHub 上找到。
什么是成本敏感学习?
传统的分类模型假设所有的误分类错误具有相同的成本,而成本敏感模型考虑了因分类类型和样本而异的成本。
让我们来看看信用卡交易的案例。未经真实持有人授权的交易被认为是欺诈性的(通常占所有交易的很小一部分)。信用卡欺诈检测系统应该自动识别和阻止这种欺诈交易,同时避免阻止合法交易。
每种分类的相关成本是多少?让我们假设下面的场景。如果系统没有识别出欺诈性交易,钱就会丢失,持卡人需要得到全部交易金额的补偿。如果系统将交易标记为欺诈,则交易会被阻止。在这种情况下,会产生管理成本,因为需要联系持卡人并更换卡(如果交易被正确标记为欺诈)或重新激活卡(如果交易实际上是合法的)。让我们也做一个简化的假设,即管理成本总是相同的。如果系统正确地将交易标记为合法,则交易会被自动批准,并且不会产生任何费用。这导致了与每个预测场景相关的以下成本:
请注意,“正”是预测为欺诈的交易,“负”是预测为合法的交易。“真”和“假”分别指正确和不正确的预测。
因为交易成本取决于样本,假阴性的成本可以低到可以忽略不计(例如,对于 0.10 美元的交易),在这种情况下,阳性预测的管理成本将超过补偿成本,或者非常高(例如,对于 10,000 美元的交易)。
成本敏感学习背后的思想是将这些依赖于示例的成本考虑在内,并做出旨在最小化总成本而不是最小化错误分类的预测。
成本敏感型培训与成本依赖型分类
让我们考虑两种不同的方法。第一个是用损失函数训练模型,该损失函数最小化实际成本($)而不是误分类错误。在这种情况下,我们需要为损失函数提供与四种情况(假阳性、假阴性、真阳性和真阴性)中的每一种相关联的成本,以便模型可以学习相应地做出最佳预测。
第二种方法是训练常规模型,但是在根据最低预期成本进行预测时对每个样本进行分类。在这种情况下,不需要训练集的成本。然而,这种方法只适用于预测概率的模型,然后可以使用概率来计算预期成本。
在下文中,我将使用成本敏感损失函数的模型称为**“成本敏感模型”,将在进行预测时使预期成本最小化的模型称为“成本分类模型”**
实施和评估模型
在这个案例研究中,我使用了一个信用卡欺诈数据集(可在 Kaggle 上获得),有 284,000 个样本和 30 个特征。目标变量指示交易是合法的(0)还是欺诈的(1)。数据高度不平衡,只有 0.17%的欺诈交易。我对以下五个模型进行了训练和评估。
- 常规 逻辑回归(来自 scikit-learn)
- 常规人工神经网络(内置于 Keras)
- 成本敏感人工神经网络 (Keras)
- 成本分类逻辑回归
- 成本分类人工神经网络
在实践中,人工神经网络(“ann”)可能不是欺诈检测的首选。基于树的模型,例如随机森林和梯度推进机器,具有可解释性的优势,并且通常执行得更好。为了说明的目的,我使用了人工神经网络,因为成本敏感损失函数的实现相对简单。此外,正如我将要展示的,一个简单的人工神经网络可以产生非常好的结果。
为了评估结果,我使用了两个不同的指标。第一个是传统的 F1-score,它衡量精度和召回率,但不考虑错误分类的示例依赖成本。
为了评估模型在成本方面的表现,我首先根据模型是预测假阳性、假阴性、真阳性还是真阴性,以及与每个案例相关的成本,来计算由预测产生的所有成本的总和。
然后,我计算了在所有情况都被预测为负的情况下会发生的总成本(“cost_max”),并将成本节约定义为实际预测减少成本的部分。
为了评估模型,我使用了五重交叉验证,并将数据分成五个不同的训练集(80%)和测试集(20%)。下一节给出的结果指的是五个测试集的平均结果。
逻辑回归
因为基本模型服务于 scikit-learn 库中的常规逻辑回归模型。下图显示了预测概率和交易金额之间的分布。如果没有对成本敏感的分类,欺诈概率和交易金额之间就没有明显的关联。
逻辑回归表现相当好,平均测试集 F1 得分为 0.73,成本节约为 0.48。
人工神经网络
接下来,我在 Keras 中构建了一个 ANN,它具有三个完全连接的层(50、25 和 15 个神经元)和两个脱离层。我运行了两个时期的模型,并使用了 50 的批量大小。使用 Keras 的顺序模型 API,Python 中的实现如下所示:
from keras.models import Sequential
from keras.layers import Dense, Dropoutdef ann(indput_dim, dropout=0.2):
model = Sequential([
Dense(units=50, input_dim=indput_dim, activation='relu'),
Dropout(dropout),
Dense(units=25, activation='relu'),
Dropout(dropout),
Dense(15, activation='relu'),
Dense(1, activation='sigmoid')])
return modelclf = ann(indput_dim=X_train.shape[1], dropout=0.2)
clf.compile(optimizer='adam', loss='binary_crossentropy')
clf.fit(X_train, y_train, batch_size=50, epochs=2, verbose=1)
clf.predict(X_test, verbose=1)
下面是用人工神经网络预测的欺诈概率的分布。类似于逻辑回归模型,欺诈概率和交易金额之间没有明显的关系。
在 F1 分数和成本节约方面,人工神经网络优于逻辑回归模型。
成本敏感人工神经网络
现在事情变得更有趣了。成本敏感型人工神经网络与常规人工神经网络相同,不同之处在于成本敏感型损失函数。之前的两个模型都使用对数损失(“二元交叉熵”)作为损失函数:
这个损失函数同等地惩罚假阴性和假阳性。现在让我们来看看一个对成本敏感的损失函数。在这里,所有四种可能的结果(假阳性、假阴性、真阳性和真阴性)都被考虑,并且每种结果都带有特定的成本。成本敏感损失函数如下所示:
请记住第一部分,真阳性和假阳性被认为是同样昂贵的(阻止事务的固定管理成本)。真否定的成本是 0 美元(无行动),假否定的成本是交易金额(假设我们必须偿还整个交易)。注意,在这四个成本中,只有假阴性的成本是依赖于实例的。这具有这样的效果,随着交易金额的增加,相对于正面预测的管理成本,对未识别的欺诈交易的惩罚增加。因此,损失函数应该训练一个模型,当交易金额较高时,该模型更有可能拒绝可疑交易。交易金额从 0 美元到 25,691 美元不等,平均值为 88 美元,我假设固定管理成本为 3 美元。
在 Python 中,我们相应地定义了假阳性、假阴性、真阳性和真阴性的代价。因为假阴性的代价是依赖于实例的,所以它们用长度等于样本数的向量来表示。
cost_FP = 3
cost_FN = data['Amount']
cost_TP = 3
cost_TN = 0
在 Keras 中实现一个示例依赖损失函数很棘手,因为 Keras 不允许将除 y_true 和 y_pred 之外的参数传递给损失函数。通过将损失函数包装到另一个函数中,可以将常量变量传递给损失函数。然而,假阴性的代价取决于实例。因此,我使用了一个技巧,将假阴性的成本作为逗号后的数字添加到 y_true,并在自定义损失函数中提取它们,同时将 y_true 舍入到原始整数值。Keras 中转换 y_true 的函数和自定义损失函数的实现如下所示:
import keras.backend as Kdef create_y_input(y_train, c_FN):
y_str = pd.Series(y_train).reset_index(drop=True).\
apply(lambda x: str(int(x)))
c_FN_str = pd.Series(c_FN).reset_index(drop=True).\
apply(lambda x: '0'*(5-len(str(int(x)))) + str(int(x))
return y_str + '.' + c_FN_strdef custom_loss(c_FP, c_TP, c_TN):
def loss_function(y_input, y_pred):
y_true = K.round(y_input)
c_FN = (y_input - y_true) * 1e5
cost = y_true * K.log(y_pred) * c_FN +
y_true * K.log(1 - y_pred) * c_TP) +
(1 - y_true) * K.log(1 - y_pred) * c_FP +
(1 - y_true) * K.log(y_pred) * c_TN)
return - K.mean(cost, axis=-1)
return loss_function
然后,我调用定义的函数来创建 y_input 向量,训练对成本敏感的人工神经网络并进行预测:
y_input = create_y_input(y_train, cost_FN_train).apply(float)
clf = ann(indput_dim=X_train.shape[1], dropout=0.2)
clf.compile(optimizer='adam', loss=custom_loss(cost_FP, cost_TP,
cost_TN))
clf.fit(X_train, y_input, batch_size=50, epochs=2, verbose=1)
clf.predict(X_test, verbose=1)
在下面的分布图中,我们可以看到成本敏感学习的效果。随着交易金额的增加,预测的总体分布向右扩展(欺诈概率更高)。请注意,在这种情况下,由于问题的性质和损失函数的定义,“预测的欺诈概率”意味着“我们应该将交易识别为欺诈吗?”而不是“交易是否欺诈”。
评估显示了成本敏感学习的预期效果。成本节约增加了 5 %, F1 分数下降了相似的幅度。成本敏感分类的结果是更多的误分类,而总误分类成本较低。
成本分类模型
与使用定制损失函数训练的成本敏感模型相反,成本分类模型基于预测概率计算预期成本。预测合法交易和欺诈交易的预期成本计算如下:
然后,分类器选择预计会导致较低成本的预测。
因此,我使用了常规逻辑回归和人工神经网络的概率预测结果,并根据预期成本对预测进行了重新分类。下图以逻辑回归模型为例,展示了成本相关分类的效果。请注意,预测概率的分布与常规逻辑回归模型产生的分布没有变化。然而,通过成本相关分类,随着交易金额的增加,该模型倾向于将欺诈概率小的交易识别为欺诈。在图的右侧,我们看到即使欺诈概率接近 1,金额非常小的交易也被预测为合法。这是由于假设真阳性携带 3 美元的管理成本。
根据预期成本对预测进行分类会在成本节约方面产生更好的结果(在 F1 分数方面会产生明显更差的结果)。虽然对人工神经网络实施成本敏感损失函数可降低 5%的成本,但成本分类人工神经网络可降低 10%的成本。
结论
本文阐述了两种根本不同的方法,例如基于成本敏感分类的信用卡欺诈预测。成本敏感训练模型需要自定义损失函数,而成本分类模型只需要每个类别的概率和与每个结果相关联的成本来对交易进行分类。在我的示例案例中,成本分类模型以大量的错误分类为代价实现了稍微好一点的成本节约。此外,成本分类模型更容易实现,因为它不需要用于训练的定制损失函数。然而,成本分类方法仅适用于预测概率的模型,而逻辑回归和人工神经网络可以方便地预测概率。然而,更广泛用于欺诈检测的基于树的模型通常将预测直接分成类别,使得成本分类方法不可行。基于树的模型的成本敏感方法虽然在概念上类似于本文中介绍的方法,但在实现上更加复杂。如果你对这个话题感兴趣,我建议你看看下面提到的文章。
感谢阅读这篇文章。请随时通过下面的评论区发表评论或提出问题,或者通过 LinkedIn 与我联系。
为这个插图创建的代码可以在我的 GitHub 上访问
信用卡欺诈数据集可在 Kaggle 上获得
如果你有兴趣学习更多关于基于树的模型的成本敏感学习,我推荐这篇来自 A. C. Bahnsen,D. Aouada 和 B. Ottersten 的论文以及 costcla GitHub 库
使用本福德定律(Python 代码)进行欺诈检测
本福德定律的发现
你有没有注意到一个给定的数字有多少机会以数字 1 开头?数字 1 成为前导数字的概率和 9 一样吗?让你知道一个数字的前导数字代表它的非零最左边的数字。例如,在 29 和 0.037 中,它们分别是 2 和 3。嗯,上一个问题的答案是否定的……根据本福特定律,也称为第一位数字定律,自然发生的数字分布中前导数字的出现频率是可预测的,不均匀的,但更接近幂律分布。事实上,一个给定的数字以 1 开头的可能性是以 9 开头的 6 倍!这是非常不合逻辑的,因为大多数人会期望均匀分布 U(1,9),其中所有数字在第一个槽中出现的可能性相同,因此他们期望概率为 1/9,即约 11.1%。让我们考虑 Pr(D1=d)是一个给定数字有第一个数字 d 和 Pr(D2=d)有前两个数字的概率,下表提供了 1881 年纽康观察到的所有十进制数字 probs。
Probabilities of leading numbers
The frequency of occurrence of leading digits according to Benford’s law
纽康注意到*最前面的页面,用于从最低数字开始的数字,比后面的页面更磨损,这就是为什么前导数字更有可能是小的而不是大的。*然后,在 1938 年,物理学家弗兰克·本福特通过收集超过 20,000 个真实世界数字的样本,重新发现了纽科姆定理,使用的数据来源包括河流、街道地址、读者文摘杂志中包含的数字、分子量、棒球统计数据、死亡率等等。因为他普及了这项科学发现,他得到了所有的荣誉。根据他的 Benford 的说法,在这些看似完全不同的数据集中出现了一种轶事模式,这些数据集中的前导数字 d 遵循对数衰减分布:
Pr(D1=d) = log10(1 + 1/d)
而不是像人们可能天真地猜测的那样均匀分布。
应用
建模:本福德定律最广为人知的一个主要应用领域是直觉建模。它基于以下非常简单的想法:
***If a certain set of values follows Benford's Law then model's for the corresponding predicted values should also follow Benford's Law.***
它可用于人口增长、金融指数和任何本福特数据集的模型中。
**欺诈检测:**这是与数据挖掘、专家系统和神经网络等领域相关的最流行的应用程序。它来自于这样的观察:
***Manipulated or fraudulent data do not trend to confirm to Benford's Law, whereas unmanipulated data do.***
根据上面的陈述,本福德定律可以被宣布为一个重要的规则,以便在已经计算了分类值的字段(如医疗测试结果、所得税收入或客户退款)中调查数据集的欺诈模式。该标准还可以检测非虚假相关应用程序中受大量低价值交易、数据收集和缺失数据问题、缩减值和偏差影响的缺陷。
应用本福特定律
本文的下一个重点是本福特的法律批判角色。这些科目是与自然存在的数字相协调的财务和会计数据。如果我们假设某人拥有价值 1000 美元的股票共同基金。他的基金要达到 2,000 美元的收益率,就必须增长 100%才能翻倍。除此之外,要从 2,000 元进一步增加到 3,000 元,只需增加 50%。正如我们之前提到的第一个数字是 4,它需要再增长 33%。正如本福特定律预测的那样,为了让第一位数字 1 变成 2,需要比 3 变成 4 有更多的增长,以此类推。事实上,本福特分布是一个“分布”,金融项目有一种安慰的倾向。
安然公司:这是本福特定律的一个重要例证,它揭露了大企业在财务数据上的偏差。这个例子来自安然公司,它对会计欺诈进行了规范,如下图所示。2001 年安然的灾难是当时历史上最大的灾难,其结果导致许多首席执行官入狱。
Frequency of first digits from Enron’s financial data vs certain frequency based on Benford’s law (after the Wall Street Journal)
在这篇文章中,我选择了最近选举中公开的两个特定数据集。第一个是【2016 年美国总统选举第二个来自【2018 年俄罗斯总统选举。
对于我的第一个项目,我从不切实际的 Python 项目中获取数据。我只考虑了唐纳德·特朗普和希拉里·克林顿的选票,这是伊利诺伊州 102 个县的选票。曝光的谣言声称有 500 多万人非法投票。伊利诺伊州选举官员证实,黑客访问了数千份记录,但据称他们没有损害任何数据。第二个数据集可以在 Kaggle 上找到。
本福特拟合优度测试
假设
1.这些数字需要是随机的,没有分配,没有强加的最小值或最大值。
2.这些数字应该覆盖几个数量级,数据集应该很大。文献中的建议要求至少有 100 到 1,000 个样本,尽管本福特定律已被证明适用于仅包含 50 个数字的数据集。
卡方检验
为了用 Benfardw 定律进行模拟,通常使用的拟合优度检验是卡方检验,这是一种经常使用的方法,用于确定经验(观察到的)分布是否与理论(预期的)分布显著不同。让我们假设零假设:
何:观测分布和理论分布相同
使用的显著性水平(p 值)为 0.05。
【2016 年美国大选
首先,我们导入一些库
#import libraries
import numpy as np
import pandas as pd
import sys
import math
import matplotlib.pyplot as plt
而且,我们加载我们的数据,提供一部分 EDA。
def load_data(filename,var):
df=pd.read_excel(filename)
data=df[var]
return df,data
#Data exploratory
data.describe()
df.info()
df.describe().transpose
df.isnull().sum()
下一步是创建一个函数,该函数将列的字符串名称作为参数,例如“Trump”。输出结果是观察数据的第一个数字,1,2,3,4,5,6,7,8 和 9,总量和每个前导数字出现的百分比。
def count_first_digit(data_str):
mask=df[data_str]>1.
data=list(df[mask][data_str])
for i in range(len(data)):
while data[i]>10:
data[i]=data[i]/10
first_digits=[int(x) for x in sorted(data)]
unique=(set(first_digits))#a list with unique values of first_digit list
data_count=[]
for i in unique:
count=first_digits.count(i)
data_count.append(count)
total_count=sum(data_count)
data_percentage=[(i/total_count)*100 for i in data_count]
return total_count,data_count, data_percentage# Benford's Law percentages for leading digits 1-9
BENFORD = [30.1, 17.6, 12.5, 9.7, 7.9, 6.7, 5.8, 5.1, 4.6]
如你所知,在这一步之后,我们列出了本福特定律的预期百分比,然后继续进行卡方检验。
def get_expected_counts(total_count):
"""Return list of expected Benford's Law counts for total sample count."""
return [round(p * total_count / 100) for p in BENFORD]
expected_counts=get_expected_counts(total_count)def chi_square_test(data_count,expected_counts):
"""Return boolean on chi-square test (8 degrees of freedom & P-val=0.05)."""
chi_square_stat = 0 # chi square test statistic
for data, expected in zip(data_count,expected_counts):
chi_square = math.pow(data - expected, 2)
chi_square_stat += chi_square / expected
print("\nChi-squared Test Statistic = {:.3f}".format(chi_square_stat))
print("Critical value at a P-value of 0.05 is 15.51.")
return chi_square_stat < 15.51
chi_square_test(data_count,expected_counts)
我们测试的第一位候选人是唐纳德·特朗普,正如你在下图中看到的那样,通过更仔细地观察卡方检验结果,我们很遗憾地拒绝了零假设,并理解在 5%的风险下,投票似乎没有错。然后我们创建主定义为了汇总所有结果,你可以在我的GitHub-eleprocha/Ben Ford-s-Law _ python _ code中找到代码。
【2018 年俄罗斯总统选举
**数据。**我们在第二个数据集中使用相同的方法,可以在 Kaggle 上找到。首先,我们必须使用 df.head()显示数据帧的形状;输出如下所示:
**EDA。**为了探究这个数据集,我们使用了一个非常流行的 Python 库, Plotly **。**更具体地说,我们为一些参赛者的选票分布创建直方图、箱线图和散点图。
#Plot.ly
#standart plotly imports
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import iplot,init_notebook_mode
import cufflinks
cufflinks.go_offline(connected=True)
init_notebook_mode(connected=True)
df3['Grudinin Pavel Nikolaevich'].iplot(kind='hist',xTitle='Grudinin Pavel Nikolaevich ',
yTitle='count votes',title='Votes Distribution of Grudinin Pavel Nikolaevich')
df3['Putin Vladimir Vladimirovich'].iplot(kind='hist',xTitle='Putin Vladimir Vladimirovich ',yTitle='count votes',
title='Votes Distribution of Putin Vladimir Vladimirovich',colors='blue')
df3[['Baburin Sergei Nikolaevich','Grudinin Pavel Nikolaevich',
'Zhirinovskiy Vladimir Volfovich','Putin Vladimir Vladimirovich']].iplot(kind='hist',histnorm='percent',barmode='overlay',
xTitle='Votes',yTitle='(%) of candidates',title='Votes Distribution')
df3[['Baburin Sergei Nikolaevich','Grudinin Pavel Nikolaevich',
'Zhirinovskiy Vladimir Volfovich','Putin Vladimir Vladimirovich']].iplot(kind='box',yTitle='Votes',title='Boxplots')
df3[['BaburiSergeiNikolaevich','',
'Zhirinovskiy Vladimir Volfovich','Putin Vladimir Vladimirovich']].iplot(kind='scatter',yTitle='Votes',title='Boxplots')
**对本福德定律的模拟。**老实说,与美国大选的数据集相比,找到一个给出完全相反结果的数据集并不容易…但在这种情况下,我们检查了其中一名跑步者的选票,为了避免任何公开争议,我不会透露他的名字——令人惊讶的是,输出是负面的。换句话说,我发现了一个具有统计显著性的 p 值,因此拒绝了零假设——这意味着分布彼此相差如此之大,以至于存在操纵数据的巨大可能性!!!
ouput:Chi-squared Test Statistic = 9570.310
Critical value at a P-value of 0.05 is 15.51.
Out[8]: False
感谢您的宝贵时间!
机器学习的免费数据集
查找公开可用数据集的 5 大资源
Photo by William White on Unsplash
我非常喜欢通过实际应用来学习。我发现,在研究机器学习时,获得一些公开可用的数据集来应用我学到的最新技术真的很有用。或者,在处理真实数据集之前,您可能需要一个非常简单的数据集来测试解决方案或比较不同的算法。
在下面的帖子中,我将列出我发现的获得机器学习应用程序完全免费数据集的最佳资源。
UCI
UCI 机器学习库目前有 476 个公开可用的数据集,专门用于机器学习和数据分析。数据集被有用地标记了类别,例如分类、回归、推荐系统等,因此你可以轻松地搜索数据集来实践特定的机器学习技术。
几乎所有的数据集都来自真实世界(与玩具数据集相反),这意味着你将遇到与真实机器学习项目中面临的挑战类似的挑战。有非常广泛的主题可供选择,并且所有的数据集都已经过研究,这意味着它们有可能在模型中产生良好的结果。
UCI Machine Learning Repository
卡格尔
Kaggle 是机器学习数据集的另一个重要资源。目前,在这个页面上列出了 19515 个数据集。Kaggle 的一个优点是,在每个数据集的登录页面上都有数据预览。因此,您可以在下载之前快速想象您将要处理的数据类型。
使用 Kaggle 的好处是,您经常会发现许多与每个数据集相关的内核。在这些区域中,其他用户会显示处理数据的代码示例,这是一个很好的入门方式。此外,许多数据集在过去与排行榜的比赛相关联或曾经相关联。这提供了一个很好的资源来衡量你的模型相对于其他用户的表现。
sci kit-学习
Scikit-learn 拥有各种各样的玩具和现实世界的数据集。它们可以使用通用数据集 API 获得。它们非常容易获得和操作,可以准备好训练模型,并且可以是在将它们用于真实世界数据之前对解决方案进行基准测试或评估不同算法的好方法。
玩具数据集可以通过以下方式获得(以波士顿房价为例)。
from sklearn.datasets import load_boston
boston = load_boston()
下面是一个简单的例子,说明如何使用这个数据集来训练和评估一个模型。
from sklearn.linear_model import LinearRegression
from sklearn.metrics import median_absolute_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_bostonboston = load_boston()X_train, X_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=1)regr = LinearRegression()
regr.fit(X_train, y_train)
y_pred = regr.predict(X_test)
print(r2_score(y_test, y_pred))
print(median_absolute_error(y_test, y_pred))
真实世界的数据集可以被获取,如下图下面的所示。
from sklearn.datasets import fetch_20newsgroups
dataset = fetch_20newsgroups()
Drivendata.org
这个网站主办旨在解决社会问题的机器学习竞赛。每个竞赛都附有一个数据集,可以从网站上下载。它们从非常简单的(献血)到更复杂的(有故障的水泵)不等,并且可以是从各种领域和复杂程度的数据中获得实践的好方法。
五三八
以发表基于分析数据的文章而闻名的 538 已经通过 Github 公开了他们的数据集。这里有广泛的数据集,涵盖了许多不同的领域。每个数据集都有一个自述文件,其中包含一个数据字典和一些关于数据源的信息。这是一个访问一些不同寻常的数据集进行实践的好地方。
还有很多其他地方可以获得机器学习项目的数据,包括政府网站、研究中心和大学(这是一个很棒的列表)。然而,我上面列出的资源可能是获得专门为机器学习目的而整理的数据集的最佳地方。
感谢阅读!
生成机器学习中的恶魔决定论
数据科学之道
决定论,生成机器学习,以及人类(或机器)的自由意志是否可能
数据科学之道 专栏探讨了几个世纪以来哲学家们是如何攻克机器学习和数据科学的关键问题的。
Laplace provided an interesting insight into generative machine learning
拉普拉斯的恶魔
皮埃尔·西蒙·拉普拉斯认为一切都是由原子组成的,牛顿物理学支配着原子的运动。作为一个思想实验,拉普拉斯想象了一种拥有两种知识的超视力恶魔:
- 恶魔知道宇宙中所有粒子的所有位置和速度的初始条件;
- 恶魔知道所有的(牛顿)物理定律。
拉普拉斯认为,有了这种知识,恶魔可以正确地预测宇宙中所有物质身体的任何事情,包括你。它通过从初始条件开始,并使用确定性物理定律向前投射来实现这一点。
在机器学习模型中构建恶魔决定论
生成机器学习用概率对不确定性建模。回想一下落在牛顿头上的苹果,它启发了他的物理学概念。假设我们想知道那个苹果的重量。
下面是一个简单的生成式机器学习模型对苹果称重的过程,我们可以用它来估计重量:
苹果 _ 重量~正常(μ,σ)
测量~正常(苹果 _ 重量,ε)
这里的“正态”是指正态(高斯)概率分布。如果这对你来说是新的,就把它想象成一个特定味道的随机发生器。如果你不熟悉“~”符号,它表示左手边的对象“来自”右手边的概率分布。要从该模型生成,您可以通过模拟右侧的分布,为左侧的对象分配一个值。为了估计苹果的重量,你需要进行实际测量,并使用这个模型来推断苹果的重量,也许使用类似贝耶法则的东西。
把这个模型读作英语,我们用秤来测量苹果的重量。由于没有秤经过完美校准,我们区分报告的测量值和真实的苹果重量。我们对这个关于真实的苹果重量的不确定性来源(通常称为技术噪声)进行建模,给出以真实的苹果重量为中心的正态分布的测量值,并带有一些噪声参数ε。而且,我们也不确定 apple_weight 本身。所以我们用一个先验来模拟这种不确定性——一个基于所有苹果的一些平均重量和重量变化的概率分布。在这种情况下,先验是具有均值μ和标准差σ的正态分布。
这个模型违背了拉普拉斯的宇宙决定论观点。如果测量值偏离 apple_weight ,这是因为秤本身的物理特性产生了某种确定性过程。即使我们不知道这些特征是什么,我们仍然应该能够看到这种确定性机制在模型中出现。
让我们用一个简单的数学变换来改变这个模型。
#初始条件
Z1 ~正常(0,1)
Z2 ~正常(0,1)
#确定性
apple _ weight =σ* Z1+μ
measurement =ε* Z2+apple _ weight
如果您不熟悉数学,所有这些转换都是利用了数学事实,即任何正态(高斯)随机变量都只是标准化正态随机变量(Normal(0,1))的线性转换。换句话说,这个模型在数学上等同于第一个模型。然而,这在哲学上是非常不同的。这里 apple_weight 和 measurement 是一些初始条件的确定性函数,用 Z1 和 Z2 表示。我们用先验正态(0,1)表示的不确定性,只在初始条件的上下文中表达。因此,我们有决定论,但仍然承认我们不如魔鬼那样有洞察力。
事实上,这种建模方法(称为结构因果模型)允许直接在模型中构建更微妙的确定性物理。例如,也许不使用线性变换,我们可以详细描述导致测量值稍微偏离真实值的物理机制。让我们用函数 g(来表示这个。).
#初始条件
Z1 ~正常(0,1)
Z2 ~正常(0,1)
#确定性
apple_weight = σZ1 + μ
度量= g(apple_weight,Z2)
同样,如果您是一名在 Fitbit 工作的工程师,您可能知道人体解剖结构的变化导致的不确定性如何与设备中的机械和数字组件相结合,从而导致报告的步数偏离实际步数。
概括地说,这里的 g 可以将不确定的初始条件与某种确定的自然关系结合起来,例如欧姆定律(V = IR)或质能等效性(E = MC)。我们甚至可以把它扩展到抽象的“物理学”比如经济学中的供求定律,或者围棋这样的游戏规则。
自由意志呢?
许多哲学家认为决定论与自由意志不相容。如果宇宙的初始条件决定了你身体的运动,那么你是做俯卧撑,还是写一篇中等文章,还是口型说“我爱你”,怎么可能由你决定?他们的结论是,要么决定论是错误的,要么自由意志是一种幻觉。
但是量子力学呢?
许多人认为现代物理学告诉我们,量子力学的基本定律不是确定性的,而是概率性的。一些哲学家认为量子力学定律不仅解决了自由意志的问题,甚至为意识提供了基础。量子力学对机器学习和人工智能的哲学意义值得单独发表。
然而,就预测建模方法的选择而言,我相信奥卡姆剃刀适用——对你的模型来说,最好假设宇宙是确定性的,除非你明确地建模一些量子级变化很重要的现象。你当然不需要理解量子引力来模拟一个苹果的重量。
相关阅读
- 哥德尔不完全性定理及其对构建强人工智能的启示 —数据科学之道
- 概率因果模型 —斯坦福哲学百科全书
- 因果决定论 —斯坦福哲学百科全书
- 年轻的思想家现在认为自由意志是真实的——思想很重要
- 是的,决定论者,有自由意志。即使你的原子没有做出选择,你也会做出选择。 —鹦鹉螺
将数据科学家从矢量化的魔咒中解放出来
朱莉娅来救我们了。
Photo by Debby Hudson on Unsplash
现在,大多数数据科学家使用 Python 或 R 作为他们的主要编程语言。这也是我的情况,直到今年早些时候我遇到了朱莉娅。Julia 承诺了与静态类型编译语言(如 C)相当的性能,同时保持了解释语言(如 Python、R 或 Matlab)的快速开发特性。这种性能是通过实时(JIT)编译实现的。Julia 在运行时编译代码,而不是解释代码。虽然 JIT 编译已经存在一段时间了(例如, Matlab 在 2002 年引入了它),但 Julia 是为 JIT 编译的性能而设计的。类型稳定性和多分派是 Julia 中的关键设计概念,使其在竞争中脱颖而出。如果你想了解更多,加州大学数据科学倡议有一本非常好的笔记本,它解释了这些概念。
在某个时候,我们开始使用解释语言来处理大型数据集(我猜数据集变得越来越大,我们一直使用相同的工具)。我们了解到,为了提高性能,我们希望避免循环和递归。相反,我们希望使用矢量化的操作或专门的实现,将数据结构(如数组、数据帧)作为输入,并在一次调用中处理它们。我们这样做是因为在解释语言中,我们每次执行一条指令都要付出额外的开销。虽然我很喜欢用 R 编写代码,但这涉及到一套避免循环和递归的策略,而且很多时候我的努力都指向了“如何避免解释语言的陷阱?”。我开始编写 C 函数来解决 R 脚本中的瓶颈,虽然性能明显提高了,但是使用 R 的优势却消失了。那时我开始寻找替代品,我找到了朱莉娅。
在这篇文章中,我们将从解决一个简单的 R 问题开始,在这里我将试着说明用解释型语言编程时的思维模式和局限性。然后,我们将解决与 Julia 相同的问题,展示思维模式如何完全不同,以及如何实现开箱即用的类似 C 的性能。
矢量化途径
有时不清楚如何使用矢量化获得最佳性能。
让我们考虑这样一个问题:给定一个点的矢量,求所有点对组合之间的距离。为了简单起见,点是一维的,我们将使用 L1 距离。给定输入[5,3,9,1],预期输出为[2,4,4,6,2,8](由| 5–3 |,| 5–9 |,| 5–1 |,| 3–9 |,| 3–1 |和| 9–1 |产生)。
这个问题在 R 中使用stats
包的dist
函数解决了:
> as.vector(**dist(**c(5, 3, 9, 1), method=”manhattan”**)**)
[1] 2 4 4 6 2 8
r 的实现返回一个距离矩阵,我们将它转换成一个向量。
Distance matrix: gray cells are redundant
让我们假设dist
不可用。你如何用 R 来编码它?
用基于循环的方法解决这个问题很简单:我们需要一个外部循环来迭代对中的第一个元素,需要一个内部循环来迭代第二个元素。由于 L1 距离是对称的(| a-b| = |b-a| ),我们只需要对一半的组合这样做,同时避免计算点到它们自己(矩阵的对角线)的距离。R 中基于循环的实现如下所示:
如果你用 R 编程,你会说这不是合适的 R 代码…循环很慢,产生非常冗长的代码…应该有一种向量化的方法。
丢弃环路的一种方法是用所有对的组合生成向量。基本上,我们正在寻找距离矩阵的下三角形的(行,列)坐标。然后,我们可以通过一次矢量化运算来计算距离。我们知道我们付出了内存代价,但是我们希望矢量化能够有所回报。
另一种选择是使用 R 的outer
函数来生成具有两点的所有组合(包括冗余组合)之间的差异的矩阵。然后,我们只需要检索矩阵的下三角部分的绝对值。我们可能会感到不情愿,因为我们正在进行大约 2 倍多的操作(并将它们存储在内存中),但这确实会产生更干净、更可读的代码。
随着我们沿着向量化的道路前进,代码变得越来越紧凑,但是它变得更快了吗?我们通过更多的内存和更多的操作来交换紧凑性…预测这些实现中哪一个是最有效的并不容易。
当我们已经有了一个简单的基于循环的解决方案(在编译语言中很难超越)时,我们可以继续尝试找出避免 R 陷阱的最佳方法。因此,如果这个函数是性能关键的,那么用 C、CPP 或 Fortran 实现它可能是有意义的。原始实现的 CPP 翻译,通过 Rcpp 库与 R 集成,如下所示:
实验
我用 10.000 个随机数的向量运行了不同的实现 3 次(需要 49.995。000 的距离计算,否则为 100.000.000)并取 CPU 时间和内存消耗的中间值。我用的是 2017 款 MacBook Pro,2.3 GHz 英特尔酷睿 i5,16 GB 内存运行 Mac OS 10.14,R 3.6.0,Julia 1.0.3,XCode 10.1。
正如所料,R 中基于循环的实现是最慢的(在 JIT 可用的 3.4 版之前会慢得多)。通过矢量化,我们减少了计算时间,但增加了内存消耗,随着输入大小的增加,这可能会成为一个问题。即使在我们的矢量化努力之后,我们仍然远远没有达到 R 的dist
函数的性能。
Rcpp 允许减少计算时间和内存需求,优于 R 的核心实现。这并不奇怪,因为 R 的dist
函数更加灵活,增加了几个选项和输入验证。虽然我们可以将 C/CPP 代码注入到 R 脚本中是一件好事,但现在我们正在处理两种编程语言,我们已经失去了 CPP 代码的交互式编程的好处。
朱莉娅的方式
Julia 的编程思维与 R 的完全不同。最有效的解决方案是通过基于循环的方法来预分配内存。
如果你想写更少的代码,你可以牺牲计算效率。压缩代码的一种方式是通过理解。
上述理解比基于循环的实现更紧凑,同时体现了相同的逻辑。这种方法的主要缺点是输出向量不是预先分配的。由于编译器无法预测输出的大小,因此输出会根据需要动态增长。
最后,如果您喜欢矢量化方法,在 Julia 中也可以选择。基于outer
函数翻译 R 的实现如下所示:
与 R 不同,我们认为这是效率最低的方法,因为它需要更多的内存和不必要的(冗余)操作。
结果
Julia 通过提供开箱即用的类似 C 语言的性能而脱颖而出。代码紧凑性和效率之间的权衡非常明显,类似 C 的代码提供类似 C 的性能。理解是一个很好的折衷方案,因为它们更容易编码,更不容易出错,并且对于这个问题同样有效。
当使用 R 处理计算密集型任务时,我们希望找到一个专门的函数来解决我们的问题。如果一个专门的函数不可用,我们要么需要用 C/CPP 编程,要么通过矢量化途径。如果我们选择第二种,我们可能会远远达不到第一种方法的效果。
结束语
矢量化、理解、地图过滤-简化都是很好的工具,可以节省您的时间,并提供更紧凑和可读的代码。然而,程序员不应该因为编程语言的性能限制而被迫使用它们。当有一个简单而有效的实现时,您不希望花费时间尝试几种方法来实现解决方案。
Julia 允许您在代码紧凑性和计算效率之间进行选择,使得这种权衡非常明显。您可以实现类似 C 的循环、类似 R 的向量化或类似 Python 的理解。这取决于你。您可以优化解决方案编码所需的时间和解决方案运行所需的时间之间的比率。你可以实现自己的算法,而不需要依赖第二语言。
由于比 Python 和 R 年轻得多,Julia 正在数据科学社区中奋力拼搏。我喜欢 13 年前开始使用 Matlab 的时候,因为我可以与数据交互。我现在喜欢如何更快地编写更快的代码,以及如何在 Julia 中自由地实现几乎任何算法。试试吧,我相信你也会喜欢它的!
代码可在:【github.com/dcmoura/blogposts
你可以在推特、 LinkedIn 和 Vimeo 上找到我(查看我的数据 vizs!)
2018 年伦敦 Frieze 展(第三部分):计算机视觉
第 3 部分:使用计算机视觉分析 9k 社交媒体图像
介绍
在这一系列的最后一篇博文中,我应用计算机视觉技术来理解 2018 年 10 月 4 日至 7 日举行的 Frieze 伦敦艺术博览会的 9000 张图像。
Frieze 是每年十月在伦敦摄政公园举办的大型当代艺术博览会,吸引了成千上万的人。来自 20 多个国家的 150 多家画廊参加了盈利性艺术博览会。在过去的几年里,Frieze 还在公园里开创了一个雕塑展。
在本系列的第二部分和第一部分中,我展示了对 9000 篇关于展会的社交媒体帖子的自然语言处理和探索性数据分析。本文的目的是使用计算机视觉分析来理解和联系9000 张关于 2018 年伦敦奥运会的图片。
请向下滚动查看分析!
数据和方法
这一事件的官方标签是#frieze。在事件发生时,我通过 Twitter API 和 Instagram API 收集了 9000 个包含这个标签的帖子。阅读第 2 部分了解更多。
然后,使用谷歌云的视觉 API 提取每张图像的标签。Cloud Vision API 利用“谷歌庞大的机器学习专业知识网络”(g reat article 作者 Sara Robinson )来检测图像的特征和标签。总共有 1045 个不同的标签被赋予了 3300 张图片。
被称为特征提取和反向图像搜索的机器学习技术然后使用基因科岗的代码完成,以基于视觉相似性找到图像。首先,使用预训练的卷积神经网络来提取每幅图像的“特征”,然后,计算这些特征的余弦相似度,以“搜索”与查询图像相似的少量图像。
特征在计算机视觉中的主要作用是“将视觉信息转换到向量空间”。相似的图像应该产生相似的特征,我们可以利用这些特征进行信息检索。基于这些特征,我们还可以使用一种叫做 t-SNE 的方法通过相似性对图像进行聚类。
图像分析
在这一节中,我将展示我的计算机视觉分析的结果。下面,我报告以下三个指标:
- 图像的标签检测;
- 基于视觉相似性的图像搜索:
- 基于视觉相似性的图像聚类。
标签检测
每张照片的标签都是使用谷歌云视觉 API 生成的。这背后的想法是将图片分类,这样我就可以识别相似的图片。下面的条形图显示了 3,300 张图片的前 10 个标签。
我们看到,“艺术”是最常见的标签,其次是“现代”、“绘画”和“艺术品”。但是看到“树”、“草”和“天空”出现也很有趣,因为它表明许多图像是关于雕塑公园的(我们将在后面看到更多)。
然而,这些标签并没有明确描述艺术品本身——我对稍微详细一点的上下文理解感兴趣——这凸显了一些 API 标签检测技术的缺点。
图像搜索—视觉相似性
我们可以通过编程让计算机学习图像之间的视觉相似性,而不是使用标签来理解图像。一种叫做特征提取和反向图像搜索的技术就是这样做的。
使用在 TensorFlow 后端上运行的 Keras VGG16 神经网络模型,我首先为数据集中的每张图像提取了一个特征。一个特征是每个图像的 4096 元素的数字数组。我们的期望是“该特征形成图像的非常好的表示,使得相似的图像将具有相似的特征”(吉恩·科岗,2018 )。
然后使用主成分分析(PCA)降低特征的维度,以创建一个嵌入,然后计算一个图像的 PCA 嵌入到另一个图像的距离余弦距离。我终于能够向计算机发送随机查询图像,它选择并返回数据集中具有相似特征向量的五个其他图像。
以下是四个例子:
Richard Woods, ‘Holiday Home’ Alan Cristea Gallery (left) and Conrad Shawcross, ‘Optic Labyrinth (Arrangement I)’, Victoria Miro (right) at Sculpture Park
David Shrigley, Distractions (2018) and “My Artwork is Terrible and I am a Very Bad Person”, Stephen Friedman Gallery at Frieze London Art Fair 2018
当试图从一个包含许多图片的相册中找到相似的图片时,这种技术非常有用,事实上我就是这么做的!
图像聚类—相似性
既然我们在向量空间中嵌入了每个图像,我们可以使用一种流行的叫做 t-SNE 的机器学习可视化算法来聚类,然后在二维空间中可视化向量空间。
“tSNE 的目标是聚集相似数据点的小“邻域”,同时减少数据的整体维度,以便更容易可视化”(谷歌人工智能博客,2018 年)
下面我们看到基于视觉相似性的聚类形成。
在下面的图片中,我突出了一些来自博览会的艺术品——大卫·施莱格利的分心,塔蒂亚娜·特鲁夫的萨满和来自弗里兹雕塑公园的各种雕塑——以及它们的集群简介。
The clustering of images of works of art at Frieze London 2018. Source: Instagram, Twitter, Flickr
结论
所以你有它!我只是刚刚涉足计算机视觉的奇妙世界。还有很多东西需要我去学习,但这对我来说是很好的第一步。
我的发现表明,使用机器学习和计算机视觉技术来理解和联系 Frieze air fair 的图像是可能的。
对我来说,下一步显然是计算在数据集中出现了多少艺术装置,以衡量“受欢迎程度”。我将继续研究这个数据集。
结束了
这是我关于 Frieze London 2018 的博客系列的结尾!这个系列是我正在进行的关于使用数据科学来理解和衡量城市文化影响的长期讨论的一部分。
今年,我将开始新的项目,主要是 JavaScript。敬请期待!
感谢阅读!
Vishal
Vishal 是伦敦 UCLThe Bartlett的文化数据科学家和研究生。他对城市文化的经济和社会影响感兴趣。
从 0 到持续交付的机器学习
行之有效的循序渐进的方法
Photo by Raoul Croes on Unsplash
我大概是机器学习工程师。这个领域很新,所有的职位对我来说都是一个笑话。数据科学家、人工智能专家或人工智能工程师之间的界限非常模糊,你选择放在 LinkedIn 上的人实际上遵循了个人偏好或雇佣你的人的个人偏好。无论你第一次向人们介绍自己时说什么,都不会改变你在绝大多数公司的日常工作:你收集数据,训练模型,测试它们的表现,最终,如果你幸运的话——是的,不止是好——你会部署它们,可能是在云上。不过,在过去的几个月里,我越来越关注我公司的机器学习产品的技术方面,而不是它们特定任务的性能。我和我的团队已经付出了很多努力来使它们处于良好的状态,但往往没有对它们的最终用户或我们的业务产生真正的影响(至少是直接的影响)。
如果我回顾整个旅程开始的时候,考虑到我们作为一个团队在运营中的影响以及我们的产品和人员的技术成熟度,我们目前的状况确实令人印象深刻。但事情并不是这样开始的,为了达到这一点,我们经历了一个非常线性的过程,让我们获得了牵引力、支持和知识。这篇文章不会涵盖所有的初步步骤需要准备好部署的东西,我已经这样做了这里,这里和不知何故还有这里,而是会试图揭示接下来发生的事情,以及什么对我们达到我们现在高兴的阶段很好。
部署模型
尽快起步是关键。第一阶段的目标应该是允许利益相关者评估模型的影响,并且部署不需要很花哨就能实现。唯一不能忽视的是,一旦模型投入使用,收集和比较业务指标的可靠流程。如果不存在一种方法来证明它是有用的,即使是机器学习历史上最好的模型也不会在行业中取得任何成功。通常,这些指标甚至不是的技术指标*,而是更可能与团队或部门的效率相关。例如,在我们的案例中,我们允许 CS(客户解决方案)部门在一项任务上花费的时间减少了 50%,而他们的效率提高了 80%。而且那个时候的分类器 F1 还挺差的,说实话。理想情况下,我们希望在完全可控和可测量的环境中拥有一个完美部署的模型,但是这从来都不是事实,尤其是在数据团队的早期阶段。在这种讨价还价的情况下,前者比后者更好。*
理想情况下,我们希望在完全可控和可测量的环境中拥有一个完美部署的模型,但是这从来都不是事实,尤其是在数据团队的早期阶段。
您可以忽略的良好工程实践的数量很大程度上取决于您公司的工程文化。我的意思是,机器学习模型是一个 Python 函数。通过在路由器上启用端口转发,理论上您需要 30 秒的时间在本地机器上将它公开为 Flask API。幸运的是,我们的运营团队非常强大,他们做得非常好,让我们能够非常轻松地采用一些尖端的云技术。
我们的第一次部署是在 Kubernetes 上的一个单独的吊舱。pod 包含三个不同的容器:API、一个异步任务队列(Celery)和一个 Redis 数据库,以允许两者之间的通信。
预测任务中使用的模型存储在一个 Docker 图像中。我们没有任何可靠的流程来重新培训它,在这种情况下,我们需要重新构建和推动整个映像。我们没有收集任何技术指标(已执行作业的数量、预测作业延迟等),也没有在生产中直接发布任何暂存环境。我并不以此为荣。但老实说,我们从未觉得有更多的需求。如果我们试图在第一次部署之前解决所有这些可能的问题,我们可能永远不会有我们所拥有的影响,并且我们会在这个过程中失去动力和牵引力。
成为业务关键型
如果一切顺利,并且你关于已经部署了实际有用的东西的所有假设都是真的,那么很有可能你的模型(现在是产品——fancier)将成为商业关键。此外,业务关键是一个相当时髦的词。理解这种情况的最简单的方法是试着想想如果你的产品因为某些原因搞砸了会发生什么。如果情况不好,你在某种程度上是业务关键型的。当我们将我们的技术与我们的核心平台整合后,我们就跨越了那条线。如果你在平台上弄坏了什么东西,用户能感觉到。
了解你的产品是否对业务至关重要的最简单的方法是,试着想想如果它因为某种原因搞砸了会发生什么。
我们做的第一件事是开始在一个暂存环境中发布。测试机器学习产品是棘手的,在安全地发布到生产中之前,可能无法完全覆盖用例,但确保所有的技术组件和基本流程正常工作对于避免严重问题至关重要。如果什么东西坏了,没有人会注意到它。当然,听起来显而易见,确实如此,但是当我们甚至不确定我们的部署是否能撑过这个月时,设计这样的东西是没有用的。有趣的是,在过去 30 年中开发的工程最佳实践不仅完全适合这个新领域,而且我们实际上感觉到在这个过程中需要它们。我们没有雇用他们,只是因为有人要求我们这样做。
有趣的是,在过去 30 年中开发的工程最佳实践不仅完全适合这个新领域,而且我们实际上感觉到在这个过程中需要它们。
同一条线上是监控。如前所述,我们已经有了一个非常稳健的战略来评估业务相关的绩效,但我们完全不知道我们的部署状态工程方面的*。完成一项预测工作需要多长时间?我们需要向 pod 添加更多资源吗?每天执行多少个作业?预测标签的百分比是恒定的吗?对于一个经典的 API 来说,这些度量是从一开始就收集的,没有它们就发布任何东西都是非常糟糕的做法。我们感受到了过程的紧迫性,我们得到了同样的最终结果。*
One of the graphs we have created on Grafana to monitor performances.
在我们公司,我们已经在使用 Prometheus 和 Grafana 进行监控,当然,在我们的项目中也使用这些工具是有意义的。不过,这些工作的短暂性需要一点工程上的努力,必须部署并控制 Prometheus Pushgateway 来存储这些指标,并将它们暴露给共享的 Prometheus 服务器。在 QA 团队的帮助下,我们定义了警报并创建了一些漂亮的图表。为了不搞砸,我们现在采用了最好的策略,但如果真的发生了,至少我们是第一个知道的。
解耦模型
数据产品最大的资产是驱动它的模型。在几次不同的 ML 部署之后,我们意识到,除了主要与样本创建过程相关的一小部分定制代码之外,设置服务器和预测过程所需的大部分代码几乎是相同的。在另一个层面上,用 Docker 部署模型也导致了大量无用的工作,不得不构建复杂 Dockerfile 中定义的大映像,仅仅是为了改变资源的一个非常小的子集,这个子集并不严格依赖于它的实际使用方式。模型和预测逻辑可以解耦,它们的发布过程应该是不同的,而不是同步的。
模型和预测逻辑可以解耦,它们的发布过程应该是不同的,而不是同步的。
因此,我们决定将 API 和任务队列从模型和相关文件中分离出来。我们改进了代码,以便在预测过程开始时异步检索这些资源,从云对象存储(在我们的例子中是 GCS)中获取它们。当然,这种改进也需要一个新的图像来处理逻辑,但从那以后我们没有发布任何新版本。服务一个新的模型现在实际上就是将它存储在桶中,并在我们的配置存储库中提出一个 PR,使用我们在这个项目的整个发展过程中使用的相同的 GitOps 方法。
这一步使我们能够不费吹灰之力地按照自己的意愿对模型进行多次重新训练。然而,发布模型版本的任务正是这个领域中的部署与传统工程部署的不同之处。描述流程和编写测试是非常简单的(即使有些复杂和无聊)。如果一个发布候选通过了它们,那就可以开始了。对于数据产品是非常不同的。当然,检查作业调度逻辑是否如预期的那样运行是可能的,但是判断一个列表是否是一个骗局是完全不同的事情。
在这一点上,我们需要的是一种方法来确保(足够)重新训练的模型在实时数据上的表现与当前部署的一样好,甚至更好。当然,并行地为模型服务几天并监控它们的性能工作得很好,但是执行任务所需的时间和精力经常开始成为我们团队的瓶颈。在我们的大多数设置中,简单的离线性能估计不足以验证模型,因为发送用于预测的数据可能不同于几天后从我们的数据源中检索的数据。我们设计了一个特定于任务的测试框架,将重新训练的模型暴露给部署模型使用的相同数据。在定义培训日期时采用一个聪明的策略,我们可以模拟模型的发布,并在 10 秒钟内,而不是 2 天内,对重新培训版本的实际性能进行非常可靠的评估。一个非常细粒度的日志记录策略对于实现这一目标至关重要:预测过程的所有阶段和结果都被存储起来,并可以在需要时访问。
我们安排了一个两周一次的 cronjob,创建一个 pod 并重新训练模型,如果发布模拟进行得很顺利,可能会保存它,并通知团队结果。然后发布新的模型(先试运行,后生产),编辑 Kubernetes 上的配置文件。包含预测逻辑的 pod 重新启动,并从存储桶中获取重新训练的版本,完全不知道其内容。
我们当前的设置允许我们完全专注于改进实际的机器学习引擎,并有非常明确的责任分离。整个过程花费了大约 8 个月的时间,我们成功地为我们的用户提供了良好的服务,没有任何停机或延迟。所有这些有多少被他们注意到了?可能是零。机器学习工程,如果存在的话,可能是这样的:在最终用户不会注意到的数据产品上做一些事情,但这些事情让世界变得更适合居住。
机器学习工程,如果存在的话,可能是这样的:在最终用户不会注意到的数据产品上做一些事情,但这些事情让世界变得更适合居住。
没有 【德安沛 的帮助,很多事情都不可能实现。
用 R 从 0 到机器学习
R 编码,数据帧,应用模型之旅。
我最近参加了一个使用 R 的项目,我来自 Python,不得不花几天时间研究 R 文档。对于初学者来说,R 文档不像 Python 那样友好,一开始把它们放在一起可能会很痛苦。
然而,网上有很多很棒的资源:
- 文档是我最常用的网站,一旦你熟悉了语法和搜索引擎,它就是一座金矿。
- Datacamp 是从 R(甚至 Python)开始的好地方。每周都有新的内容,还有一些不错的特色,比如项目和挑战。
本文收集了从原始数据文件应用机器学习模型的所有元素和概念,其中 r。
让我们从 R 开始,选择一个数据集并开始沿着代码片段工作。
入门指南
在你的电脑上安装 R 语言。
安装一个免费完整的 IDE : RStudio 。
图书馆
R 基本安装并不附带每个库,就像 Python 中的 pip 一样,新的库是用这个命令安装的,在 R 终端中:
install.packages(tidyverse) # For installing tidyverse
安装软件包后,以下是对库的一些操作:
library(readr) # Load library# Load multiple libraries
p.names <- c(‘xgboost’, ‘caret’, ‘dplyr’, ‘e1071’)
lapply(p.names, library, character.only = TRUE) installed.packages() # List available packages
remove.packages("tidyverse") # Uninstall a package# Getting help and documentation
?functionName
help(functionName)
example(functionName)
写一些代码
变量
定义变量非常简单,我们同样使用" = “或”
# Create new variables
my_var <- 54
my.data.vector = c(34, 54, 65)# Clean a variable
my_var <- NULL
Functions
Functions in R are similar to Python functions :
- Assign the function like you would assign a variable.
- Use the 函数 关键字,参数在括号内。
- 使用 回车 作为退出点
下面这个名为 **prod_age,**的小函数以 creation_date 为参数。对于 if 语句,我们处理空情况,否则我们将值转换为 date。
prod_age <- function(creation_date) {
if (is.na(creation_date)) {return(as.numeric(-1))}
else {return(as.Date(creation_date))}
}
使用数据框架
加载数据,读取文件
readr 库中的 read_delim 函数提供了很多工具来读取大多数文件类型。
在下面的例子中,我们指定了每一列的数据类型。该文件有 56 列,我们希望所有列都作为字符读取,所以我们使用带有“c…c”的 col_types 参数,每个字符对应一列。
# Load the library
library(readr)# Create dataframe from CSV file
my_dataframe <- read_delim(“C:/path/to/file.csv”,
delim = “|”,
escape_double = FALSE,
col_types = paste(rep(“c”, 56), collapse = ‘’))
设置数据帧的子集
不仅在导入数据集时会遇到数据帧。有时函数结果是数据帧。子集的主要工具是括号操作符。
- 要访问特定的列,使用$运算符,非常方便。
y_train <- my.dataframe$label
- 为了访问特定的行,我们使用[]操作符。您可能熟悉这个语法:【行,列】
# Works with numeric indices
y_train <- my.dataframe[c(0:100), 8]# Works with negative indices to exclude
y_test <- my.dataframe[-c(0:100), 8]
- 这是另一种仍然使用括号语法的技术。和命名的运算符的用于子集化行和列。
filtered.dataframe <- my.dataframe[
which(my.dataframe$col1 == 2), # Filter rows on condition
names(my.dataframe) %in% c("col1","col2","col3")] # Subset cols
- subset 函数:第一个参数是 dataframe,然后是行的过滤条件,然后是要选择的列。
filtered.dataframe <- subset(
my.dataframe,
col1 == 2,
select = c("col1","col2","col3"))
dplyr 图书馆
plyr 是一个流行的数据操作库。由此产生了 dplyr 包,它为最常见的数据操作挑战引入了一种语法。
如果您来自 Python,您可能熟悉用点号链接命令。在这里,你可以用一个特殊的管道做同样的事情: **% > %。**以下是文档中的一些示例:
starwars %>%
filter(species == "Droid")starwars %>%
select(name, ends_with("color"))starwars %>%
mutate(name, bmi = mass / ((height / 100) ^ 2)) %>%
select(name:mass, bmi)starwars %>%
arrange(desc(mass))starwars %>%
group_by(species) %>%
summarise(
n = n(),
mass = mean(mass, na.rm = TRUE)
) %>%
filter(n > 1)
dplyr 其实对于数据的筛选和探索非常方便,语法也很直观。
修改列值
包,它为最常见的数据操作挑战引入了一种语法
修改列值
创建 dataframe 对象时,我们使用$操作符访问特定的列。
# Filtering rows based on a specific column value
my_datarame <- subset(my_dataframe, COLNAME != ‘str_value’)# Assign 0 where column values match condition
non_conformites$REGUL_DAYS[non_conformites$REGUL_DAYS_NUM < 0] <- 0# Create new column from existing columns
table$AMOUNT <- table$Q_LITIG * table$PRICE# Delete a column
my_dataframe$COLNAME <- NULL
将函数应用于列
一旦我们准备好了数据帧和函数,我们通常需要对列应用函数,以应用转换。
这里我们使用应用操作符。我们用它对结构化数据的 blob 进行操作,所以它不局限于数据帧。当然,每个点必须具有相同的类型。
# Product age function
prod_age <- function(creation_date) {
if (xxx) {return(as.numeric(-1))}
else { return(as.Date(creation_date))}
}# Apply function on column
mytable$PRODUCT_AGE <-
apply(mytable[,c(‘DATE_CREA’), drop=F], 1, function(x) prod_age(x))
使用日期
当处理日期时,第一步是从日期字符串到日期对象。为。Date 函数正是这样做的,并使用指定的格式进行解析。在本文的最后,你会发现每一种日期格式都可以用于格式的自变量。
# Convert a column into date format
sales$date_f <- as.Date(sales$date, format = ‘%d/%m/%Y’)# Create column from time difference
mytable$REGUL_DAYS = as.numeric(difftime(
strptime(mytable$closing, “%Y-%m-%d”),
strptime(mytable$opening, “%Y-%m-%d”),
unit=”days”))
导出数据框架
几个内置函数允许将数据帧作为文件写入。一种非常常见的格式是 CSV。但是,RDS 格式被优化(序列化+ Gzip 压缩)以存储任何 R 对象。
# Write to CSV
write.csv(non_conformites,
‘C:\\Users\\path\\export.csv’,
row.names = FALSE)# Write to RDS
saveRDS(
feature_importance_values,
file=”c:/path/folder/feature_importance.RDS”)
测绘
就像 Python 一样,R 附带了几个用于绘制数据的库。 plot 函数其实和 python 的 plt.plot 差不多。
RStudio 对于绘图非常方便,它有一个专用的绘图窗口,可以返回到以前的绘图。
折线图
plot(
ref_sales$Date, ref_sales$Sales,
type = ‘l’,
xlab = “Date”, ylab = “Sales”,
main = paste(‘Sales evolution over time for : ‘, article_ref)
)
各种图表
r 是统计学家的语言,它带有各种绘制数据分布的图表。
values <- c(1, 4, 8, 2, 4)
barplot(values)
hist(values)
pie(values)
boxplot(values)
机器学习:XGBoost 库
xgboost 包是一个很好的起点,因为它有很好的文档记录。它使我们能够快速了解数据集,如特征重要性,我们将在下面看到。
对于这部分,我们需要那些具体的库:
- xgboost :让我们围绕 XGB 著名算法展开工作。
- 脱字符:分类和回归训练,包括许多数据处理函数
- dplyr :一个快速、一致的工具,用于处理内存中和内存外的类似数据帧的对象。
列车测试分离
准备好数据帧后,我们使用索引(inTrain)将其分为训练集和测试集:
set.seed(1337)
inTrain <- createDataPartition(y = my.dataframe$label, p = 0.85, list = FALSE)X_train = xgb.DMatrix(as.matrix(my.dataframe[inTrain, ] %>% select(-label)))
y_train = my.dataframe[inTrain, ]$label
X_test = xgb.DMatrix(as.matrix(my.dataframe[-inTrain, ] %>% select(-label)))
y_test = my.dataframe[-inTrain, ]$label
XGBoost 的参数搜索
下面的函数做什么:
-把我们的训练/测试集作为输入。
-定义交叉验证的列车控制。
-定义参数网格。
-设置包含参数搜索的 XGB 模型。
-评估模型的准确性
-返回最佳参数集
param_search <- function(xtrain, ytrain, xtest, ytest) {# Cross validation init
xgb_trcontrol = trainControl(method = “cv”, number = 5, allowParallel = TRUE,
verboseIter = T, returnData = FALSE)# Param grid
xgbGrid <- expand.grid(nrounds = 60, #nrounds = c(10,20,30,40),
max_depth = 20, #max_depth = c(3, 5, 10, 15, 20, 30),
colsample_bytree = 0.6,#colsample_bytree = seq(0.5, 0.9, length.out = 5),
eta = 0.005, #eta = c(0.001, 0.0015, 0.005, 0.1),
gamma=0, min_child_weight = 1, subsample = 1
)# Model and parameter search
xgb_model = train(xtrain, ytrain, trControl = xgb_trcontrol,
tuneGrid = xgbGrid, method = “xgbTree”,
verbose=2,
#objective=”multi:softprob”,
eval_metric=”mlogloss”)
#num_class=3)# Evaluate du model
xgb.pred = predict(xgb_model, xtest, reshape=T)
xgb.pred = as.data.frame(xgb.pred, col.names=c(“pred”))
result = sum(xgb.pred$xgb.pred==ytest) / nrow(xgb.pred)
print(paste(“Final Accuracy =”,sprintf(“%1.2f%%”, 100*result)))return(xgb_model)
}
一旦参数搜索完成,我们可以直接使用它来定义我们的工作模型,我们用$操作符访问每个元素:
best.model <- xgboost(
data = as.matrix(my.dataframe[inTrain, ] %>% select(-IMPORTANCE)),
label = as.matrix(as.numeric(my.dataframe[inTrain,]$IMPORTANCE)-1),
nrounds = xgb_model$bestTune$nrounds,
max_depth = xgb_model$bestTune$max_depth,
eta = xgb_model$bestTune$eta,
gamma = xgb_model$bestTune$gamma,
colsample_bytree = xgb_model$bestTune$colsample_bytree,
min_child_weight = xgb_model$bestTune$min_child_weight,
subsample = xgb_model$bestTune$subsample,
objective = “multi:softprob”, num_class=3)
计算并绘制特征重要性
同样,xgboost 包中提供了许多函数。文档展示了其中的大部分。
xgb_feature_imp <- xgb.importance(
colnames(donnees[inTrain, ] %>% select(-label)),
model = best.model
)gg <- xgb.ggplot.importance(xgb_feature_imp, 40); gg
下面是一个功能重要性图的示例,如 Rstudio 中所示。用 xgboost 生成的聚类只是按照相似的分数对特性进行分组,没有其他特定的含义。
Feature importance with ggplot
进一步阅读
我希望这是对 R 的简单介绍,我相信进步是通过操作和实验取得的。这里有一些资源可以让你继续学习,自己飞翔:
- R-bloggers :关于 R 的新闻和教程,收集大量博文。
- 我总是会回到这个问题上来
- R 简介:如果你需要 R 编码的刷新者
- xgboost(R API)入门
- 数据营课程和文章
- Kaggle R 内核
感谢您的关注,感谢您的反馈,一路平安!
从 94%到 95%
我将分享各种技术;理论上,我曾经在 IMDB 数据集上将我的 NLP 情感分析从大约 94%提高到 95%。
Image source — Google
技巧— 1
- 半监督学习——有一个学习分支叫做半监督学习,它允许我们使用未标记的数据来训练我们的语言模型。fastai 提供的 IMDB 数据集在
upsup
文件夹下为我们提供了未标记的数据,我们可以使用这些数据来训练我们的模型。大多数公司花费数年时间来完全标记数据,但半监督学习允许我们在不标记完整数据的情况下训练模型。我们也可以使用未标记的数据来训练我们的语言学习者关于任何语言的细节。因此,无论何时你找到一个,也使用未标记的数据。
unsup
folder included
- 由于我们也使用了未标记的数据,我们有了更多的数据,因此也就有了更多的历元。
- 混合精度——不要使用单精度浮点数,而是使用半精度浮点数。以前,浮点运算需要 32 位,因为只有我们才能达到精度。但是,对于深度学习模型,我们需要大约。一些 GPU 支持半精度浮点。NVIDIA 的 GPU 和 Google 的 TPU 增加了支持半精度浮点的软件,并且加快了结果的速度。虽然 16 位浮点不准确,但在神经网络的某些地方,它是可行的。但是在某些领域,比如计算梯度和损耗,我们需要单精度浮点数,因为半精度浮点数的值是 0。因此,在实践中,我们使用混合精度,我们的模型根据操作类型使用单精度和半精度。那是一个艰难的选择。不过没问题。 Fastai 很幸运在内部支持这一点。但肯定的是,我们可以明确地定义它,也像下面这样。感谢 Fastai。
- drop_mult —我们用于迁移学习的语言模型使用 AWD_LSTM,这是一种递归神经网络,它定义了 5 种不同类型的辍学。宣布每一种类型的辍学并对这些价值观进行实验变得非常烦人。Fastai 已经说明了辍学的基本值,我们提供的是 drop_mul,它是内部每个辍学人数的倍数。如果模态严重过度拟合,可以增加该值,即更加正则化。我们的目标是创建更准确的语言模型,通常,我们定义较低的 dropout 值,因为较高的正则化值会导致较差的语言模型,从而导致对下一个单词的较差预测。
但这里有一个抓手
- 在 Fastiers 最近的研究中,如果我们增加正则化的值,我们会得到差的语言模型,但我们肯定会得到更准确和更好的情感分类器模型。让我们等待这项研究发表吧。通常,值在 0.1 到 1 之间。
诡计— 2
- 向后—根据最后一个单词,预测前一个单词,一些不寻常但有帮助的东西。Fastai 允许我们反向训练情态动词,这样我们的学习者也可以反向预测单词。然后,我们可以集成建立在前向学习器上的向上分类器和建立在后向学习器上的后向分类器,从而提高准确率。我们所做的是创建与实际数据相反的数据库,然后在此基础上训练语言学习者。
如果我发现更多的技巧,我会继续分享。在那之前,继续探索 fastai。
从单一决策树到随机森林
作者:罗莎丽亚·西里波和凯瑟琳·梅尔彻
决策树是一组非常流行的监督分类算法。它们之所以非常受欢迎,有几个原因:它们在分类问题上表现得相当好,决策路径相对容易解释,构建(训练)它们的算法又快又简单。
决策树还有一个集合版本:随机森林。随机森林本质上代表 N 个决策树的集合,因此增加了预测的鲁棒性。
在本文中,我们将简要概述决策树增长背后的算法、其质量度量、避免过度适应训练集的技巧以及决策树随机森林带来的改进。
什么是决策树?
决策树是一个类似流程图的结构,由节点和分支组成(图 1)。在每个节点处,基于输入要素之一对数据进行分割,生成两个或更多分支作为输出。在即将到来的节点中进行越来越多的分割,并且生成越来越多的分支来分割原始数据。这种情况一直持续到生成一个节点,其中所有或几乎所有的数据都属于同一个类,并且不再可能进行进一步的拆分或分支。
这整个过程产生了一个树状结构。第一个分割节点称为根节点。末端节点被称为叶子,并且与类别标签相关联。从根到叶的路径产生分类规则。如果只有二叉分裂是可能的,我们就说二叉树。然而,在这里,我们想要处理非二进制决策树的更一般的实例。
让我们用一个例子来形象化这一点。我们收集了一个人过去航海计划的数据,即这个人是否出去航海,基于各种外部条件——或“输入特征”——如风速(以节为单位)、最高温度、前景以及船只是否在冬季储存。输入要素通常也称为非目标属性或独立变量。我们现在想要构建一个决策树,它将预测航行结果(是或否)。航行结果特征也称为目标变量或因变量。
如果我们知道准确的分类规则,我们可以手动构建一个决策树。但这种情况很少发生。我们通常拥有的是数据:一边是输入特征,另一边是要预测的目标特征。许多自动程序可以帮助我们从数据中提取规则来构建这样的决策树,如 C4.5、ID3 或 CART 算法 (J. Ross Quinlan)。在所有这些方法中,目标都是训练一个决策树来定义预测目标变量的规则,在我们的例子中,目标变量是我们是否会在新的一天去航海。
Figure 1. Example of a decision tree (on the right) built on sailing experience data (on the left) to predict whether or not to go sailing on a new day.
构建决策树
让我们探索如何按照上面列出的算法之一自动构建决策树。
任何这些算法的目标是将训练集划分成子集,直到每个划分在目标类别方面是“纯的”或者足够小。要明确的是:
- 纯子集是只包含一类样本的子集。
- 每个分区操作都是通过一个规则来实现的,该规则根据其中一个输入要素的值来分割输入数据。
总而言之,决策树由三个不同的构件组成:节点、分支和叶子。节点识别分裂特征,并对数据的输入子集实施划分操作;分支从一个节点出发,并识别由划分操作产生的不同数据子集;路径末端的叶子标识数据的最终子集,并将类别与特定的决策路径相关联。
例如,在图 1 的树中,第一个节点中的拆分涉及“Storage”特性,并将输入子集划分为两个子集:一个是“yes ”,另一个是“no”。这里,输入数据集分为两个数据集:一个是“风”> 6 的数据集,另一个是“风”<= 6. How does the algorithm decide which feature to use at each point to split the input subset?
The goal of any of these algorithms is to recursively partition the training set into subsets until each partition is as pure as possible in terms of output class. Therefore, at each step, the algorithm uses the feature that leads to the purest output subsets.
质量度量的数据集
在每一次迭代中,为了决定哪个特征导致最纯净的子集,我们需要能够测量数据集的纯度。过去已经提出了不同的度量和指数。我们将在这里描述其中的几个,可以说是最常用的:信息增益、基尼指数和增益率。
在训练期间,为所有候选特征计算选定的质量测量,以找出哪一个将产生最佳分割。
熵
熵是一个用来衡量信息或无序的概念。当然,我们可以用它来衡量一个数据集有多纯。
如果我们将目标类视为数据集中一个点的可能状态,那么数据集的熵可以在数学上定义为所有类的概率之和乘以它的对数。因此,对于二元分类问题,熵的范围落在 0 和 1 之间。
其中 p 是整个数据集,N 是类的数量,pi 是类 I 在同一数据集中的出现频率。
为了更好地理解熵,让我们处理两个不同的数据集示例,两个数据集都有两个类,分别用蓝点和红叉表示(图 2)。在左侧的示例数据集中,我们混合了蓝点和红叉。在右边数据集的例子中,我们只有红叉。第二种情况——只有来自一个类的样本的数据集——是我们的目标:一个“纯”数据子集。
Figure 2. Two classes: red crosses and blue dots. Two different datasets. A dataset with a mix of points belonging to both classes (on the left) and a dataset with points belonging to one class only (on the right).
现在让我们计算这两个二元数据集的熵。
对于左边的例子,红叉类的概率是 7/13,蓝点类的概率是 6/13。请注意,这里一个类的数据点几乎与另一个类的数据点一样多。上面的公式导致熵值为 0.99。
在右边的例子中,红叉类的概率是 13/13 = 1.0,蓝点类的概率是 0/13 = 0.0。请注意,这里我们只有红十字点。在这种情况下,上面的公式导致熵值为 0.0。
熵可以是纯度、无序度或信息量的度量。由于混合的类,左边的数据集不太纯净并且更加混乱(更加无序,即更高的熵)。然而,更多的无序也意味着更多的信息。事实上,如果数据集只有一个类的点,那么无论您尝试多长时间,都无法从中提取多少信息。相比之下,如果数据集具有来自两个类的点,则它也具有更高的信息提取潜力。因此,左侧数据集的较高熵值也可以被视为更大量的潜在信息。
决策树中每次分裂的目标都是从一个混乱的数据集转移到两个(或更多)更纯净的子集。理想情况下,分割应该产生熵为 0.0 的子集。然而,在实践中,如果分割导致子集的总熵低于原始数据集,这就足够了。
Figure 3. A split in a node of the tree should move from a higher entropy dataset to subsets with lower total entropy.
信息增益(ID3)
为了评估一个特征对于分裂有多好,计算分裂前后的熵差。
也就是说,我们首先计算分割前数据集的熵,然后计算分割后每个子集的熵。最后,在分割之前,从数据集的熵中减去由子集的大小加权的输出熵的总和。这种差异衡量的是信息的增加或熵的减少。如果信息增益是一个正数,这意味着我们从一个混乱的数据集转移到一些更纯粹的子集。
其中“before”是拆分前的数据集,K 是拆分生成的子集数,(j,after)是拆分后的子集 j。
在每一步,我们将选择分割信息增益值最高的特征上的数据,因为这将产生最纯粹的子集。应用此度量的算法是 ID3 算法。ID3 算法的缺点是偏向于具有大量值的特征,从而生成更大的决策树。
增益比(C4.5)
C4.5 算法中使用的增益比测量引入了 SplitInfo 概念。SplitInfo 被定义为权重的和乘以权重的对数,其中权重是当前子集中的数据点数相对于父数据集中的数据点数的比率。
然后,通过将 ID3 算法的信息增益除以 SplitInfo 值来计算增益比。
其中“before”是拆分前的数据集,K 是拆分生成的子集数,(j,after)是拆分后的子集 j。
基尼指数(CART)
CART 算法使用的另一个衡量纯度——或者实际上是杂质——的指标是基尼指数。
基尼系数是根据基尼系数计算的。基尼系数定义为 1 减去数据集中类别概率的平方和。
其中 p 是整个数据集,N 是类的数量,pi 是类 I 在同一数据集中的出现频率。
然后,基尼指数被定义为分割后不同子集的基尼系数的加权和,其中每一部分由子集大小相对于父数据集大小的比率来加权。
对于有两个类的数据集,基尼系数的范围在 0 和 0.5 之间:如果数据集是纯的,则为 0;如果两个类平均分布,则为 0.5。因此,具有最低基尼指数的特征被用作下一个分裂特征。
其中 K 是由分裂产生的子集的数量,而(j,after)是分裂后的子集 j。
识别劈叉
对于名义特征,我们有两种不同的分割选项。我们可以为训练集中所选特征的每个值创建一个子节点,也可以进行二进制分割。在二进制分割的情况下,测试所有可能的特征值子集。在最后一种情况下,该过程在计算上更加昂贵,但是仍然相对简单。
在数字特征中,识别最佳分割更加复杂。所有的数值实际上都可以是分裂的候选者。但是这将使质量度量的计算成为过于昂贵的操作!因此,对于数字特征,分割总是二进制的。在训练数据中,候选分裂点取在所选数字特征的每两个连续值之间。再次,采用产生最佳质量度量的二元分裂。然后,分割点可以是该特征的两个分区之间的平均值,即较低分区的最大点或较高分区的最小点。
尺寸和过度配合
决策树像许多其他机器学习算法一样,可能会过度拟合训练数据。太深的树会导致模型太详细,不能根据新数据进行归纳。另一方面,太浅的树可能会导致过于简单的模型,不适合数据。你看,决策树的大小至关重要。
Figure 4. The size of the decision tree is important. A tree that is large and too detailed (on the right) might overfit the training data, while a tree that is too small (on the left) might be too simple to fit the data.
有两种方法可以避免过度特殊化的树:修剪和/或提前停止。
修剪
在训练阶段之后,修剪被应用于决策树。基本上,我们让树自由增长到它的设置允许的程度,而不施加任何明确的限制。最后,我们继续删除那些没有被充分填充的分支,以避免过拟合训练数据。事实上,没有被充分填充的分支可能过度集中在特殊的数据点上。这就是为什么移除它们有助于对新的未知数据进行归纳。
有许多不同的修剪技术。在这里,我们要解释两个最常用的:减少错误剪枝和最小描述长度剪枝, MDL 简称。
在减少错误修剪中,在每次迭代中,修剪低填充分支,并且再次将树应用于训练数据。如果对分支的修剪没有降低训练集的准确性,则该分支将被永久移除。
MDL 修剪使用描述长度来决定是否修剪一棵树。描述长度被定义为对树进行编码所需的位数加上对训练集的误分类数据样本进行编码所需的位数。当修剪树的分支时,计算并比较未修剪树和修剪树的描述长度。如果被修剪的树的描述长度较小,则保留修剪。
提前停止
另一个避免过度拟合的选择是根据停止标准提前停止。
一个常见的停止标准是每个节点的最小样本数。当创建的节点包含的数据样本数量少于或等于最小集合数量时,分支将停止增长。因此,这个最小值的值越大,树越浅,而值越小,树越深。
决策树的随机森林
正如我们在开始时所说的,决策树的进化提供了更健壮的性能,从而产生了随机森林。让我们看看创新的随机森林模型与原始的决策树算法相比如何。
多人胜于一人。简单地说,这就是随机森林算法背后的概念。也就是说,许多决策树可以比一个单独的决策树产生更准确的预测。事实上,随机森林算法是一种监督分类算法,它构建 N 个略有不同的训练决策树,并将它们合并在一起,以获得更准确和稳定的预测。
让我们再次强调这个概念。整个想法依赖于多个决策树,这些决策树的训练略有不同,并且在最终决策时会考虑所有这些决策树。
Figure 5. The random forest algorithm relies on multiple decision trees that are all trained slightly differently; all of them are taken into consideration for the final classification.
训练集的引导
让我们把重点放在“训练略有不同”
用于随机森林的训练算法将打包的通用技术应用于树学习者。在整个训练集上单独训练一个决策树。在随机森林中,N 个决策树中的每一个都在通过原始数据集的自举获得的原始训练集的子集上被训练,即,通过带有替换的随机采样。
此外,作为原始特征集的随机子集,输入特征也可能因树而异。通常,如果 m 是原始数据集中输入要素的数量,则在每个决策树的训练过程中,每次分割时都会考虑随机提取的[m 的平方根]个输入要素的子集。
Figure 6. The decision trees in a random forest are all slightly differently trained on a bootstrapped subset of the original dataset. The set of input features also varies for each decision tree in the random forest.
多数决原则
对于相同的输入向量,N 个稍微不同的训练树将产生 N 个稍微不同的预测。通常,多数决原则适用于做出最终决定。由 N 棵树中的大多数提供的预测被采用作为最终预测。
这种策略的优势是显而易见的。虽然来自单个树的预测对训练集中的噪声高度敏感,但是来自许多树的大多数的预测则不敏感,只要这些树不相关。自举采样是通过在不同的训练集上训练树来去相关的方法。
出袋(OOB)错误
测量随机森林预测误差的一个常用度量是袋外误差。
Out-of-bag error 是对 xᵢ的所有训练样本计算的平均预测误差,仅使用在其引导训练集中没有 xᵢ的树。袋外误差估计避免了对独立验证数据集的需要,但可能会低估实际的性能改进。
结论
在本文中,我们回顾了决策树的几个重要方面:如何训练决策树来实现分类问题,使用哪些质量度量来选择要分割的输入特征,以及避免过拟合问题的技巧。
我们还试图解释随机森林算法的策略,使决策树预测更加稳健;也就是说,限制对训练集中噪声的依赖性。事实上,通过使用一组 N 个去相关的决策树,随机森林增加了最终分类的准确性和鲁棒性。
现在,让我们使用它,看看我们明天是否会去航行!
Figure 7. The workflow implementing the training and evaluation of a decision tree and of a random forest of decision trees. This workflow can be inspected and downloaded from the KNIME Hub at https://kni.me/w/Eot69vL_DI5V79us.
参考
J.罗斯·昆兰,“C4.5:机器学习程序”,摩根·考夫曼出版公司,旧金山,加利福尼亚州,美国 1993 年
附录
你可以在 https://kni.me/w/Eot69vL_DI5V79us 的 KNIME 开源中心找到一个如何训练和评估决策树和决策树随机森林的例子。这个工作流程也显示在图 7 中。
如首次发表于data versity。
从学术界到 Kaggle:物理学家如何在数据科学中找到爱
与 Bojan Tunguz 的对话:数据科学家,Kaggle 双特级大师,理论物理学家
我没有选择卡格尔生活。Kaggle 生活选择了我:Bojan Tunguz。
从别人那里学习和获取灵感总是有帮助的。这在数据科学领域更有意义,因为每天都有新的课程、MOOCs 和推荐不断涌现。如此多的选择不仅让人不知所措,有时还令人困惑。带着这种想法,我们在 H2O.ai 上揭示了知名数据科学家和 Kaggle 大师的故事,他们与我们分享了他们的旅程、灵感和成就。这些采访旨在激励和鼓励那些想了解成为一名 Kaggle 特级大师的人。
这次我有机会与双卡格大师、物理学家 博扬·东古兹 互动。Bojan Tunguz 出生在波斯尼亚黑塞哥维那的萨拉热窝,1993 年移居美国。他拥有伊利诺伊大学的物理学博士学位和斯坦福大学的应用物理学硕士学位。他还在斯坦福大学、德堡大学、罗德学院和伊利诺伊大学等知名大学教授各种物理课程。
博扬离成为三级大师只差一枚单人金牌了,我们希望他能尽快实现这一壮举。
以下是我与 Bojan 对话的摘录:
- 你有理论物理背景。从学术界到工业界的转变是如何发生的?
Bojan: 套用海明威的话,先突然,后逐渐。学术工作很难找到,尤其是在理论物理等过饱和的领域。当你是一个移民的时候,这要困难十倍。有一次,我认为安定下来并建立一个家庭比追求难以捉摸的学术任命重要得多。所以我被迫寻找替代方案。最初,我涉足科技写作和小规模桌面制造,但一旦我发现了数据科学,我就迷上了它。数据科学提供了我一直在寻找的科学和技术之间的平衡。
- 成为双 Kaggle 宗师有多难。最初是什么吸引了你,第一次胜利是什么时候?
Bojan: 我目前是内核和讨论方面的特级大师,距离成为竞赛特级大师还有一枚单人金牌。这些类别中的每一个都需要不同的技能和敏感度。就技术技能而言,比赛是迄今为止要求最高的。对于讨论和核心,其他技能,如沟通、社交技能、写作和数据可视化是必不可少的。同样重要的是理解 Kaggle 竞赛的动态:什么时候发布什么;以及其他 Kagglers 觉得有价值/有趣/好玩的内容。
自从我决定从事数据科学,我就听说了 Kaggle。认真对待数据科学而不了解它几乎是不可能的。然而,我最初对加入犹豫不决,因为我认为这需要很高的技能水平。然而,一旦我加入了,我意识到这个平台上有很多有价值的资源。讨论,内核,过去的竞争解决方案,在线博客帖子等。可以帮助初学者快速上手。一旦我变得相当优秀,我也开始更频繁地组队,到目前为止,我从每个团队中学到了很多。
大约一年半前,我在 IEEE 相机传感器识别比赛中赢得了我的第一枚金牌。我还在一年前的家庭信用违约风险竞赛中获得了第一名。这是迄今为止对我来说最难忘和最棒的卡格尔体验。
我最初对加入犹豫不决,因为我认为这需要很高的技能水平。然而,一旦我加入,我意识到这个平台上有很多有价值的资源
- 你如何决定参加哪些比赛?
Bojan: 这很简单:我全部输入!😃不过,我一般都是一次挑一两个。在选择比赛时,我会考虑许多不同的因素。我已经有多少建模管道,需要多少努力才能获得一个好的基线,本地分数和排行榜之间的预测有多稳定,以及对我来说非常重要的是,我可以从集成中获得多大的提升。
- 你通常如何处理一个难题?你有什么喜欢的 ML 资源想分享吗?
我通常会先从小处着手,然后逐步积累。我不会试图马上得到“最好”的解决方案。
我的工具包对 Kaggle 来说是相当标准的:熊猫、 numpy 、 sklearn 、 XGBoost 、 LightGBM 、 Keras 。我在 Jupyter 笔记本工作,我是 J upyter Lab 的超级粉丝。
- 作为 H2O.ai 的数据科学家,你的角色是什么,在哪些具体领域工作?
Bojan: 大多数时候,我专注于外向角色,帮助我们的客户解决他们正在处理的数据科学和 ML 问题。我也为 无人驾驶 AI 做出贡献,在那里我专注于各种特征转换“食谱”和无监督学习。
- 如果你要和 H2O.ai 的大师们组队,他们会是谁,为什么?
Bojan: 全部!甚至在我加入 H2O 之前,我就已经能够与 Olivier Gralier 合作了,现在我参加的比赛是与 Dmitry Larko 合作。H2O.ai 的许多人都是我多年来一直敬仰的人。现在能够称他们为同事是一种难以置信的荣誉。我的梦想是和尽可能多的人合作。
- 你在 H2O.ai 的专业工作中运用到的通过 Kaggle 学到的最好的东西有哪些?
Bojan: 你从参加 Kaggle 比赛中学到的最重要的“元”技能之一就是能够快速适应和尝试许多不同的事情。此外,由于你的大多数“伟大”想法都有失败的可能性,你要学会至少有一个应急计划,通常是六个。
Bojan(2 from L) during SF Kaggle days ’19. Seen at extreme right is Dmitry Larko, another Kaggle Grandmaster associated with H2O.ai
- 数据科学领域正在快速发展。你是如何设法跟上所有最新发展的?
Bojan: 这是我一直参加 Kaggle 比赛的主要原因之一。对于每个新的竞争,我可以应用至少一个新的技术、库或框架。Kaggle 竞赛可能是保持你的应用 ML 技能敏锐和与时俱进的最佳方式。
- 你希望在 ML 的哪些特定领域或问题上运用你的专长?
Bojan: 我喜欢 NLP,希望能在这类问题上多花些时间。在某些方面,这些问题最接近“经典”人工智能应该解决的问题。
我也喜欢研究金融科技问题,但以我的经验来看,金融科技仍然比科技更好。我觉得我们仍然只是触及了 ML 在这个领域所能完成的事情的表面。
最近我有幸在 Kaggle 上做得很好的一件事是“纯”科学问题。这些问题从蛋白质分类到仅使用 ML 技术预测标量耦合常数。“纯”科学是另一个先进的人工智能技术可能产生巨大影响的领域。
- 给刚刚开始或希望开始数据科学之旅的数据科学有志者一句忠告?
Bojan: 现在是开始从事数据科学领域工作的最佳时机。在我看来,数据科学是当今最开放的专业领域。无论您是新手还是“经验丰富”的数据科学老手,都有大量资源可以帮助您踏上征程:信息丰富的教科书、博客和网络研讨会;KaggleMOOCs 在线论坛;开源软件;平易近人的从业者。熟悉所有这些资源。想出一个合理的适合你的计划。培养你的技术技能是很重要的,但是也要投入时间来培养你的“软”技能:写作、交流、网络等等。对自己有耐心,给自己时间成长和发展。不要害怕失败。强调从失败中吸取教训。最重要的是,尽可能地享受旅行的乐趣。
现在是开始在数据科学领域工作的最佳时机。在我看来,数据科学是当今最开放的专业领域。
成为一名 Kaggle 大师绝非易事,需要大量的努力、坚持和专注。话虽如此,也不可否认,没有什么是不可能的。我们只需要用正确的工具把我们的努力引向正确的方向。
阅读本系列的其他采访:
从苹果到波士顿布鲁因斯,一个数据专家如何将个人兴趣和职业兴趣结合起来
Josh Pohlkamp-Hartt 分享了他在波士顿布鲁因斯获得梦想角色的五个技巧
波士顿布鲁因斯队是全美曲棍球联合会第五大最有价值的球队,据《福布斯》杂志估计,其价值约为 1B 美元。凭借六次斯坦利杯的胜利,该队年收入超过 2 亿美元。
在这篇文章中,Josh 分享了他在职业生涯中学到的五个技巧。这包括把兴趣和技术能力结合起来,心中有目标,学会有效沟通,知道自己的问题空间,培养对学习的热爱。
#1 想学什么就学什么,但要确保你把个人兴趣和技术兴趣结合起来
哪个学位能培养出最好的数据科学家,这个问题在很大程度上与 Josh 无关。在他的职业生涯中,他遇到过各种教育背景的数据科学家。区分最好的人的东西总是他们把他们的兴趣和技术能力结合起来的能力。
对乔希来说,这就是曲棍球。在攻读博士学位期间,他有机会在金斯敦的 OHL 团队工作。它开始是为曲棍球运动员估价的独立研究收集数据的机会。过了一段时间,它变成了创建球员表现的回归模型,并向教练和管理层报告统计数据。对他来说,这是一个很好的方式,可以看到他在课堂上学到的东西转化到现实生活中。这个早期的机会也是他在波士顿布鲁因斯担任目前职务的原因。
如果你对某件事充满热情,你就已经理解了数据以及在这种情况下什么是有意义的。这为您构建模型和执行数据分析提供了优势。
#2:心中有一个目标
在研究生院的时候,乔希知道他没有兴趣成为一名学者。相反,培养解决问题的技能和学习的兴趣是他继续研究生学习的动力。
他一直知道他最终会进入工业界。这就是为什么他开始将在学校学到的东西与现实生活中的经历结合起来,比如与 OHL 团队合作。这也意味着在毕业前一年,乔希没有像同龄人一样申请博士后职位,而是开始准备行业面试。由于做了充分的准备,他得到了美国银行的一份工作。有了这份工作,他在苹果公司的面试变得容易多了,因为他知道他有一个备份。由于这种心态,他能够在毕业后在苹果公司找到一份工作。
当他在苹果工作并获得了重要的行业经验时,他总是把在曲棍球工作的梦想藏在心底。这就是为什么当波斯顿布鲁因斯联系他寻求一个职位时,乔希毫不犹豫地答应了。由于他之前在 OHL 团队工作的背景,以及他在苹果公司的专业资历,他被视为值得追求的高价值候选人。
#3:学会有效沟通
有效沟通的关键在于尽可能简洁明了。“少即是多”这句格言在大多数情况下都适用。
这也适用于模型领域,正如乔希在苹果公司的经历中所学到的。假设较少的简单模型通常在商业环境中更好,因为它们具有可解释性,尽管它们的性能可能会下降。商业利益相关者更有可能信任他们理解的模型,而不是你难以解释清楚的黑箱。
另一个重要的提示是避免以结论开始你的陈述和分析而埋没了线索。换句话说,要有一个清晰的叙述,在叙述中使用金字塔结构(即从最重要的开始,一步步往下)。
然而,同样重要的是要记住,没有尝试和错误,你就无法建立沟通技巧。这就是为什么建议你尽早开始通过博客学习写作,通过加入像演讲会或论文/研究分享小组这样的组织学习公开演讲。
#4:了解你的问题空间
为了更有效地履行你的职责,你需要深入了解你所工作的问题空间。做到这一点的最好方法是学习如何提出好的问题,并成为一个积极的倾听者。这一点尤其重要,因为人们很少能很好地记录文档。在这种情况下,你必须像侦探一样工作,找出隐藏的部落知识。
加入一家公司或过渡到一个新的角色是练习这些技能的特别重要的时间。一个很好的类比是成为一个运动队的新成员。在这种情况下,在你开始持有观点和说出你的想法之前,最好坐下来,观察和了解团队内部的动态。
对于数据科学家来说,很大一部分职责是帮助决策者做出明智的决策。因此,你需要了解他们来自哪里,他们想去哪里。有了这样的背景,你更有可能交付有影响力的结果。
了解您的问题空间的另一个重要领域是数据清理,这是您正在处理的任何问题的重要组成部分。有了领域专业知识,您将更倾向于在数据清理阶段采取某些步骤,这将增加数据集对未来工作的效用。
#5:培养对学习的热爱
数据科学是一个不断发展壮大的领域,因此培养对学习的热爱对你的成功至关重要也就不足为奇了。乔希建议从基础开始,阅读像《统计学习的 T2 元素》这样的书以及你感兴趣领域的基础论文。记住,没有人生来就知道如何阅读研究论文;这些是你通过刻意练习获得的技能。
一旦你有了一个坚实的基础,你就可以扩展到外围,深入研究最先进的技术。 Arxiv 是一个很好的地方,因为它拥有来自世界各地的学者和从业者的大量预印论文。重现这些论文也是理解和加速你学习的一个好方法。
要记住的另一个技巧是避免使用教程提供的玩具示例,而是使用您感兴趣或计划在某个时候使用的真实数据。这将使你更容易度过学习过程中的艰难阶段,并可能激励你将教程扩展到新的应用和见解。
《数据思维》是一个系列,介绍处理数据的专业人士。在这个系列中,你将了解他们的日常故事,以及给别人的建议。
之前的采访包括来自红牛、开门、 Snapchat 、网飞和 Lyft 的数据科学家。
我成为数据科学家的旅程:如何构建一条迭代的职业道路
发现我对数据的热爱
在学校的时候,我并没有打算做什么特别技术性的职业。我参加了数学 A-level 考试,很大程度上是为了摆脱历史和英国文学的论文写作,以及耗时的美术创作。我去了剑桥大学学习考古学和人类学(另一个反复的决定过程,但不是现在),然后去了牛津大学攻读考古学硕士和博士学位。
Three examples of me as an archaeologist. Left: Monte Polizzo, Sicily, 2006. Centre: Atapuerca, Spain, 2010. Right: Lakaton’i Anja, Madagascar, 2012 (right, foreground).
作为一门学术学科,考古学的一个伟大之处在于它是一个多么广阔的教堂。你可以研究任何东西,从罗马花瓶的美学到放射性同位素年代测定,但仍称自己为考古学家。我发现自己更倾向于技术层面(毕竟我非常感谢数学 A-level)。
我感兴趣的领域是人类进化和我们物种在世界各地的最早扩散。我意识到我们对这个话题的很多想法都是定性的——“这个石器看起来有点像另一个石器,所以他们可能是同一个人”。在这里,我决定,这是一个很好的机会来尝试使用,你知道,实际的定量分析,也许可以尝试得到一些实际的答案。
这就是我如何发现自己在考古统计学这个令人难以置信的利基领域的。与其说是一片田野,不如说是一小片肮脏的土地,里面住着我和另外两个考古学的书呆子。但是突然之间,通过将统计学应用到一个全新的领域,我能够发现所有我们以前无法获得的关于过去的重要信息。我的研究反驳了一些之前关于我们认知和文化进化的经典信念,以及关于我们物种首次走出非洲时发生了什么的信念。我对在考古学中严格使用统计学的好处深信不疑。我教考古学的同学统计学。我在会议上发言。我出版了一本关于这个主题的书和一堆论文。
试图找出如何拥有一份有影响力的职业
然而,尽管我热爱我的主题领域,我发现自己对缺乏真实世界的影响感到沮丧。利基研究领域(至少是那些没有明显商业或工业应用的领域)的一个问题是,大多数时候,只有少数专家真正从你的工作中受益。
我觉得(现在仍然觉得)有动力去做一些真正有益于现实世界中人们的事情,而不是在学术象牙塔里。正是这种动力让我决定离开学术界。我喜欢我工作中的分析部分,我想继续与数据打交道,但我想去一个能帮助人们解决现实世界问题的地方工作。
这就是为什么我接下来决定加入英国公务员队伍,成为一名统计学家,参加“快速流”(他们为毕业生提供的加速发展计划)——我将继续与数据打交道,但我将利用它来帮助我的国家变得更好。我的第一份工作是在卫生部,为 NHS 研究金融和经济模型。我喜欢着手解决重大的有形问题,但很快发现了其中的权衡——解决全国性的重要问题意味着要应对国家规模的官僚机构,而我发现工作节奏慢得令人沮丧。我已经设法勾掉了我的“数据和分析”和“现实世界影响”框,但还缺少一些东西。
自从搬到伦敦后,我开始发现创业公司的奇妙世界,在参加聚会和会见各种各样的了不起的人建立惊人的新事物后。我想更接近现实,所以当财政部出现一个就风险资本政策向政府提供建议的职位时,我马上就申请了。在这份工作中,我保留了所有我喜欢的关于数据分析的东西,并继续对国家政策产生影响,现在我开始对主题领域增加真正的兴趣。我还将统计和分析应用到一个新的领域,成为我的政策领域 20 年历史中的第一人(企业投资计划(EIS)对启动投资的税收减免,以及相关计划及其缩写(SEIS、VCTs、SITR 和 CITR)),对这些计划进行统计上严格的评估,部分评估结果发表在政府的患者资本审查的咨询中。
寻找合适的工作环境
我再次发现我的工作很有趣。然而,我仍然觉得这种工作文化并不适合我,而且我离行动还差得很远。我决定尝试在创业公司工作。
我加入了一家 proptech 初创公司,从定价分析师一路晋升到收入和分析主管,再到混合数据产品经理兼首席分析师。我在这里学到了这么多,它可能值得自己的博客帖子。我最自豪的一件事是从零开始建立公司的分析和报告能力,从运行一个混乱的电子表格集合和为其他目的构建的数据库的一部分,到拥有一个为公司每个人服务的报告基础架构,并帮助人们每天做出数据支持的决策。在我最近的职业生涯迭代中,我添加了几个新的复选框——在一个你可以随时尝试新想法的地方工作,这种快节奏的合作文化适合我。然而,我开始觉得我离我真正想去的地方还有一小段距离。
走向数据科学
通过与开发人员合作,并更深入地钻研技术世界,我开始发现在数据分析之外还有一个全新的世界,在那里,你可以结合使用数学和编码,通过构建更加智能的模型来解决复杂的问题。有一段时间,我一直觉得在我所处的位置(例如,我设计了一个最近邻模型来估计 Airbnb 房产的夜间价格,但我无法建立一个像我脑海中那样复杂的模型)和我可以看到其他人在做的所有很酷的事情之间存在技能差距,这是我想去的地方(例如,能够自己设计和建立一个预测 Airbnb 未来价格的模型,测试它,然后与开发人员合作将其投入生产)。我发现包含我为自己确定的技能差距的术语是“数据科学”。
我开始尝试在业余时间自学数据科学,但最终我决定参加一个数据科学训练营,让自己尽快熟悉并开始使用数据科学工具。很多人问我,为什么我决定走(更昂贵的)训练营路线,而不是自学;诚实的回答是兴奋加上不耐烦!截至撰写本文时,我正在熨斗学校参加一个全日制数据科学训练营。这是一项艰巨的工作,但我每天都学到很多东西,并且非常享受。
对我来说,我不认为数据科学是一个特定的职业决策。相反,我认为我的整个职业生涯是一个多年的数据科学之旅,我从每一个迭代步骤中学到了很多。不仅仅是关于不同领域的技术技能和知识,还有关于我如何工作以及在职业生涯中对我很重要的价值观。关于这个迭代的职业旅程,每一步都变得更小。我非常兴奋能够完成数据科学技能提升的最后一小步,并开始我作为数据科学家的未来。
从销售代表到数据科学家
我从销售专员到数据科学家的转变&最大的挑战是什么。
Photo by Brendan Church on Unsplash
寒冷呼唤恐怖
我无法用语言来表达我有多讨厌陌生来电。我不想这么做,电话那头的人也不想让我这么做。95%的时间里,电话那头都是失败和拒绝。我不是那种天生超级友好和健谈的打电话的人,所以每个电话都要我付出很多努力。但总得有人去做,我不得不继续尝试。
从事业务开发不仅仅包括电话推销,大部分是客户和关系管理。当我在销售在线营销活动时,我工作的一小部分涉及活动表现的分析和统计。令人惊讶的是,我真的很喜欢向我的客户展示和解释数据。我热爱我工作中的技术部分,尽管它并不那么重要,而且主要依赖于谷歌分析。
你不能这样做,他说
在意识到销售不适合我之后,我进入了荷兰的硕士预科。我真的不知道如果我通过了考试,我会选择什么样的硕士课程。硕士预科是一个相当全面的准备项目,可能会导致几个关于在线营销、数据新闻或奇怪的是,新的数据科学课程。由于我对这个话题了解不多,我甚至还没有考虑过数据科学方向。有一天,我的一个同学在午餐时提到他要去那条赛道。他提到硕士对我来说有多难,我有多可能会因为没有 Python 或编程经验而失败。老实说,我讨厌别人告诉我什么能做什么不能做。在我听来,这常常像是证明他们错了的黄金邀请。所以几个星期后,在对这个话题进行了详细的研究之后(事实上我很喜欢我的统计学课程),我做出了一个决定。
“数据科学,我来了”。
作为完全初学者学习编程
Photo by Hitesh Choudhary on Unsplash
从头开始学习编程不是在公园散步。它需要花费无数的时间在基本的编程练习上,面对红色的错误信息&想知道学习黑魔法是否会比学习 Python 更容易。我也开始理解程序员有时对一门语言表达的爱恨交加的关系。
回想起来,我意识到我的 Python 编程老师所说的话背后的深刻真理:“如果你练习得不够,你就会失败。”。是的,这似乎很符合逻辑,任何新技能都需要练习。他真正的意思是,编程不是你在考试前最后一刻看几行代码就能通过的科目。你需要教会自己像程序员一样思考,这需要对不同类型的练习进行数小时的练习。
我们班只有 30%的人通过了第一次 Python 考试,经过无数个小时的练习,幸运的是,我也通过了。在编程中,当你读到它时,答案似乎总是很容易。当你必须完全自己设计和编写解决方案时,那就是另一回事了。简而言之,不断练习,不要只是复制粘贴 StackOverflow 的答案,尽管这很有诱惑力。
机器学习听起来很性感
我记得从第一次听到“机器学习”的定义时,我就喜欢上了这两个词。我对这个话题感到非常兴奋,迫不及待地想了解更多。我想我可以通过告诉我的家人我在教计算机如何学习东西来给他们留下深刻印象,尽管直到今天,他们仍然对我的工作一无所知。
起初,机器学习概念并不难。然而,某些模型背后的统计数据很难留在我的脑海里。应用公式并理解它们背后的逻辑从来都不是我的强项。为什么我最后又去了数据科学?为了全面理解某些模型的内部工作原理,我经常花额外的时间研究算法是如何工作的。我并不总是需要知道细节,我只是想知道。我研究得越多,就越意识到我知道的是多么少,而这个话题是多么丰富。
当我陷入某个模型或概念时,可视化也发挥了很大的作用。例如,我强烈倾向于使用图表来了解梯度下降优化的细节,或者神经网络架构之间的差异。
利用我的背景作为优势
商业开发背景可能看起来很薄弱,因为它缺乏技术技能,并且与数据科学相关的两个最大的学科:编程和统计没有什么联系。当然,任何拥有计算机科学学位或计量经济学学位的人在高效编程或机器学习模型的统计方面显然都有某种优势。
然而,许多人似乎忘记了数据科学家的软技能是极其宝贵的。除了应用强大的机器学习模型,数据科学家还必须讲述数据隐藏的故事,没有人愿意听一个无聊的柏拉图式的故事。
令人惊讶的是,在我的硕士论文期间,我意识到我在陈述方面相当不错,我可以很容易地将我的模型转化为非数据科学家可以理解的简单概念。我会编造杂货店的故事来解释推荐系统和潜在的场景来解释我获得的测量结果。作为一名销售专员,我花了两年时间向人们展示产品,给他们讲故事,把产品放在上下文中,限制在对他们重要的内容上,使用对他们有意义的词语。解释数据科学项目的结果并没有太大的不同。
此外,经历过任何产品或项目的商业方面的事实也可以在弥合业务和技术需求之间的差距时提供很大帮助。拥有某种翻译可以防止说同一种语言,只是略有不同的人之间的混淆。
知道我的极限
当做出如此大的改变时,人们必须准备付出很多努力,并审视自己的极限。我非常在意自己的弱点,任何人都应该如此,即使是在任何人知道神经网络到底是什么之前就已经在编写神经网络程序的天才。我不擅长统计,也不擅长编写漂亮高效的代码。然而,当我看到有人拥有更好的编码技能或者在统计方面看起来非常舒服时,我知道如何抓住机会学习,向谁学习。无论一个数据科学家有多少经验,这个领域都在不断发展,没有一个数据科学家应该学习完。
数据科学的美也是组成这个领域的不同背景的美。数据有如此多的内容要讲,数据可以从如此多的不同角度进行分析和处理。尽管某些背景会让你比其他人更容易进步,但任何背景都会给这个领域带来新的东西。根据您可能处理的数据类型,这甚至会成为一种真正的优势。职业转换的成功往往只取决于一个人付出了多少努力。
成功并不总是意味着伟大。这是一致性的问题。持续的努力工作会带来成功。伟大终将到来。德伊夫·约翰逊
从商业智能到数据科学和机器学习
记录我从商业智能领域到数据科学和机器学习的转变
我是一名数据科学和机器学习经理,专门为企业的分析需求设计和构建由 DS & ML 支持的解决方案。我现在在这个领域有超过 5 年的丰富经验,和许多人一样,我的职业生涯不是从数据科学和机器学习开始的。当我决定投身数据科学时,我是一名拥有近 10 年经验的商业智能专家。我想分享一下我转行到这个领域的经历,希望能对一些想转行的人有所帮助。
It’s definitely not this hard
I’d imagine it to be something like this
对于那些不熟悉商业智能(BI)的人来说,它是一个技术分支,使组织能够收集所有可用的历史企业数据,并开始使用它们来制定战术和战略业务决策。由于数据科学和机器学习领域在本世纪初刚刚起步(多亏了在 hbr 发表的文章“数据科学家:21 世纪最性感的工作”https://HBR . org/2012/10/Data-Scientist-The-sexy-The-Job of-The-21 世纪),我感到一种强烈的冲动去驾驭这股浪潮。但后来我觉得这是一个我迟早要做的转变,因为在我看来,这是商业智能领域的逻辑延伸。虽然数据科学&机器学习领域是通过提供关于未来的可操作的见解和情报来给企业带来优势(有些人可能会认为这也是关于现在的),但商业智能领域也是如此,但使用过去的数据,通过仪表板和可视化技术使用不太复杂的技术。
Or Maybe, little harder
也就是说,我想与所有想要成为数据科学/机器学习专业人士的人分享以下几点
- 几乎每个数据科学家都是公民数据科学家
鉴于在行业人才不足的情况下,对数据科学家和机器学习专业人员的需求突然激增,大多数需求都是由从艺术巴赫、心理学等不同领域过渡到 ML & DS 的人满足的。所以永远不要觉得自己在游戏中迟到了。事实上,如果您来自 BI 领域,您可以在 DS/ML 中利用许多现有的数据技能(Pandas Dataframe 操作可以很好地在使用普通 SQL 的关系表上完成)。
显然,即使在达尔文时代,许多科学家都是出于好奇和兴趣从事科学研究的普通人,因此被称为公民科学家。因此,如果你有兴趣和动力,你也可以成为一名公民数据科学家。
2。拥有结构化的学习路径
如今 DS & ML 上的 MOOCs 很多。我选择了几门课程的认证。
Its okay to be slow, but be steady
- 华盛顿大学机器学习专业(Coursera)【https://www.coursera.org/specializations/machine-learning T2
这是 Carlos Guestrin 和 Emily Fox 的 4 门专业课,他们创建了 Turi,后来被 Amazon 收购,涵盖了机器学习的所有重要领域——使用 python 进行分类、回归和聚类,这也是我选择这个项目的原因之一
2.deep learning . ai(Coursera)【https://www.deeplearning.ai/deep-learning-specialization/ T4
这是一个深度学习的 5 部分专业,由 Andew Ng 自己提供,解释热门话题的概念——深度神经网络、CNN、序列模型等
3.深度学习专业的 Udacity 纳米学位https://in.udacity.com/course/deep-learning-nanodegree-nd 101
这是一个为期 4 个月的深度学习概念专业,使用 Pytorch,这是当今深度学习研究社区中新兴和广泛使用的 DL 框架之一。我选择这个主要是因为我想坚持使用 Python 风格的框架,以获得更好的适应性。
顺便说一句,这并不是我尝试过的课程的全部,还有很多课程我只完成了一部分,但没有在这里列出。稍后我会在一个独家故事中讲述我所有的课程经历。
3。做好动手准备
Be ready to code, regardless of your title
虽然这些课程通过一些实际操作项目帮助您获得概念基础,但为了积累专业知识,实践这些概念是很重要的。帮助我的一个活动是参加热门比赛网站的比赛,如 Kaggle,Analytics Vidhya,以了解你的学习情况。例如,我参加了 Analytics Vidhya 的竞赛“贷款预测挑战 III ”,并在总排行榜上获得了第 31 名。https://data hack . analyticsvidhya . com/contest/practice-problem-loan-prediction-iii/lb
尽管这是一场操场上的比赛,但它有助于你建立对所学技能的信心。
4。打开其他学习渠道
课程是学习的来源之一,但不能是学习的唯一来源。挖掘其他学习资源也是很重要的,这样可以拓展广阔的视野。以下是我从事的其他学习活动。
a)其他在线学习内容——订阅 Udemy 上一位新加坡国立大学研究员的“PyTorch 实用深度学习”。https://www . udemy . com/practical-deep-learning-with-py torch/learn/v4/content"
我喜欢他解释卷积滤波器概念的方式,卷积滤波器是一种在图像中寻找特定形状/模式的滤波器。这为上述课程中学习的概念提供了一个不同的视角。
b)关注该领域最有影响力的人的作品——我关注杰里米·霍华德(Jeremy Howard)的作品——我关注 fast.ai 的瑞秋·托马斯(Rachel Thomas)的作品
你可以在 twitter 上关注他们,或者阅读他们的博客,随时关注他们的作品。因为我选择了基于 python 的框架来学习,所以上面几乎所有的都使用 Pytorch 作为 ML & DS 的框架或基于 python 的库。因此,我的列表可能会有所偏差,但本质上的要点是,你需要追随那些在该领域有最大影响力的人,以便与他们正在做的事情保持一致。
c)阅读博客——关注在 ML & DS 领域做开创性工作的顶级技术公司的博客。我通过 Feedly 选择了以下公司的博客。
脸书人工智能研究(FAIR),fast.ai,谷歌人工智能博客,AWS ML 博客,开放人工智能博客。无论如何,这都不是一个详尽的列表,但我只是称之为最重要的
5。不要等着“完美”的 ML/DL 项目落地
一旦学习完成,甚至当学习开始时,通过在解决方案设计中提出 ML、DL 概念,尝试在当前项目中实施学习内容。根据我与财富 500 强客户打交道的经验,大多数客户不会特别要求 ML/DL 项目。他们的优先事项总是满足业务目标,解决方案的设计和方法完全留给我们。所以,我建议你寻找机会,把你学到的东西运用到实际中去。例如,在我的项目中,我开始使用 ML 实现文本分类任务,使用 DL 实现简单的情感分类器。
6。做自己喜欢的项目
除了为客户做项目之外,做自己喜欢的项目对你和公司来说也是一个很好的学习机会。对于 DL 来说尤其如此,因为大多数项目都是文本和图像形式的非结构化数据。因此,从事一些喜爱的项目不仅可以帮助你增长知识,还可以让你的组织注意到你带来的技能,并让你的团队迷上这些概念。
例如,我承担了构建一个原型的任务,使用对象检测技术自动检测汽车牌照。稍后会有更多的介绍,但下面是我和我的团队制作的工具的快照。
License Plate Detection
从业务需求到数据科学任务
使用数据科学解决业务问题时需要考虑的事项
Image by Gerhard Gellinger from Pixabay
W 如果我请你考虑数据科学工作,你会怎么想?笔记本、数据图表、算法和编程片段的图像很可能会突然出现在你的脑海中。当谈到这类工作时,我们经常关注对特定任务有用的工具和技术,从分类或 NLP,到酷的新 python 库和一些有效的计算技巧,再到最新的 jupyter 笔记本趋势。这幅图似乎在很大程度上遗漏了:需要解决的实际建模任务是如何形成的?
如果我们退后一步思考典型的数据科学家试图实现的高级目标,就会发现两种截然不同的工作流。
探索未知
首先是探索性数据分析。在这种情况下,重点是理解你的数据集,从中发现一些有趣和有用的模式,并以某种方式呈现它们,这将有助于做出决策。在这类工作中,数据集的“所有者”通常很少或根本不提供指导,除了一般的指导,如发现一些异常、寻找低效、重复出现的模式等。您通常会去道路指引您的地方,您的主要任务只是深入了解实际生成数据的过程。工作通常在你用完指定的时间段后就结束了。
构建预测模型
另一种类型的工作涉及创建某种预测模型,该模型将用于以前看不到的数据。如果目的只是向董事会介绍和讨论所获得的结果,这可能是一次性的事情。这也可能最终导致你的模型进入一个工作的计算系统,在那里它将长期存在并繁荣发展。不管是哪种情况,要求你做这种任务的人可能在他们的头脑中有(或多或少)特定的东西,所以即使在开始工作之前,你也需要精确地定义你实际上要做什么。
因为数据科学工作实际上可能是由一些粗略定义的业务需求产生的——我们有两个领域的冲突。前者在精确和严谨的环境中工作得最好,而后者源于经常混乱和模糊的现实世界需求。为了成功,你需要在这两者之间进行转换。
基本上,您需要用业务领域语言来制定需求,将它们转化为定义良好的分析任务,并确定可衡量的成功标准。听起来很抽象?让我们看一些例子。
定义明确的数据科学任务的三个部分
有时候,发现你真正需要做的事情很简单。如果要求您为给定的电子邮件客户端创建一个垃圾邮件过滤器插件,您可以快速地将其转换为二进制分类任务,并假设您的模型可以访问电子邮件内容和元数据。定义成功标准需要假设一些可接受的度量范围,如准确性、真阳性和假阳性等。—您可以根据当前可用解决方案的表现来评估这些。
其他时候事情会变得复杂一些。假设您正在运营一个电子商务网站,您希望在主页上包含产品推荐。这是您的业务需求,可以转化为两个建模任务:
- 创建一个协同过滤模型,为您有购买历史的登录用户生成推荐,
- 提供一个基线畅销书推荐,也为刚到你主页的全新用户提供服务。
现在我们仍然需要一个成功的标准来告诉我们我们的结果是否足够。在这种情况下,如果推荐者给我们的主页增加了一些价值,我们就想使用他们。一个简单的标准是:如果推荐者能够获得比当前为主页计算的点击率更高的点击率,就使用推荐者。所以在这种情况下,你要评估你的新方法是否改善了现有的状态。另一个角度是比较你的模型的性能,例如与只使用基线畅销书部分进行比较。无论哪种方式,你在某种意义上引导你的成功标准。
结论
在现实世界中,数据科学任务不能想当然,您需要定义它们。要创建一个有用的定义,请记住将业务语言转化为建模任务,并创建清晰且可衡量的成功标准。没有这一点,就很难决定你所创造的东西是否完整,是否真正有用。
从化学家到数据科学家
Photo by Chokniti Khongchum on Pexels
从小到大,我一直对科学感兴趣。我记得在五年级的时候,我做了一个科学项目,其中包括自制胶水。中学时,我花了一个月的时间阅读有关冰川侵蚀的书籍,并制作了一个小演示,展示给我的地球科学课。2005 年,我开始在布鲁克林的米德伍德高中上学。在我大二的时候,我选修了 AP 化学,这为我以后的学术和职业生涯奠定了基础。我对化学很着迷。化学的规则有逻辑意义,比其他科学课程需要更少的死记硬背。在我高中二年级的时候,我努力参与了学校现有的科学项目。Midwood 提供了 Medsci 和英特尔科学计划等项目,我也加入了这两个项目。Medsci 是为计划被判医学预科的学生准备的,而 Intel 是为想在研究实验室工作的学生准备的。
通过加入英特尔,我开始在长岛大学的一个有机化学研究实验室做志愿者(刘)。在那里,我研究了一种化学治疗剂 Prunustatin A 的合成,但没有成功。够搞笑的是,我看到 2015 年(6 年后)发表了一篇关于这种药物的完整合成。
My First of mostly Research Failures (Source)
2009 年,我开始在布兰代斯大学读本科,在那里我学习化学,辅修数学,并自称辅修物理。我最后写了一篇关于合成 N-杂环卡宾(NHC)用于温室气体小分子活化的毕业论文。这个想法是使用这些 NHC 过渡金属络合物来捕获天然气水合物气体,如甲烷和二氧化碳,用于清洁能源。
One of the few NHC complexes that wasn’t uncrystallizable rust (Source)
这导致了第二个作者的出版(我知道,实际上是加冕)。虽然我在大学时的重点是合成化学,但我对数学和物理产生了浓厚的兴趣,这促使我在康奈尔大学阿南思小组攻读化学物理博士学位。
在康奈尔大学时,我致力于开发用于模拟光合作用过程的数学模型。我主要是用笔和纸做数学,用 Fortran 写代码。我研究了量子力学、经典力学、量子化学、统计力学,钻了那么多抽象的数学兔子洞,这就像是美国的一个场景。
虽然我很享受在康奈尔大学的时光,但我很早就知道我想在工业界从事定量学科。我热爱我在学术界做的工作,但我根本不觉得我的工作对现实世界有任何影响。我研究的方法是利用量子玻尔兹曼分布的路径积分表示的量子动力学近似的延伸。没错。
或者更简洁地说:
世界上大约有 5 个人(包括我自己)关心上面的方程式。所以一毕业,我就知道我想要一份对现实世界有一些可实现的影响的工作。鉴于我的定量背景,我考虑了行业中的定量分析师和数据科学家的角色。
从学术界到工业界的转变过程并不容易。毕业后,我在一系列定量分析师、定量研究员和数据科学职位的面试中失败了。尽管我在研究生院学到了很多,但我没有足够的 python 和数据科学经验来在面试中表现出色。我对 Fortran 和 Feynman 路径积分的知识还不够。在工业界,Fortran 就像拉丁语,我只能用它来烦它,费曼路径积分只能和暴力相提并论。
我尽力兼顾论文写作、研究和自学数据科学。我知道数据科学和 python 的基础知识,但我没有足够的应用经验来做好面试。采访中有那么几个瞬间,我觉得自己就像《费城永远阳光灿烂》中的查理一样,在宣扬鸟类法律。
经过两三个月的失败面试,我终于在纽约的一家初创公司找到了一份数据科学的工作。虽然我找到了一份工作令人兴奋,但情况并不理想,因为我基本上是免费工作,并承诺未来的薪酬和公平。我知道从经济上来说这不是一个很好的选择,但从职业上来说,这是最好的选择。我在一家初创公司工作,开发一种工具来检测加密货币交易中的欺诈行为。这份工作节奏快,压力大,迫使我迅速学习 python 和数据科学方法。经过 6 个月的工作,我开发了一个欺诈检测系统,可以实时发出市场操纵警报。
在初创公司工作期间,我积极寻找另一份工作。在那里工作了 6 个月后,“也许有一天我会承诺可能是股票”的价值接近于零。
最终,我以前的化学顾问刘让我联系到了他以前的同事,他当时正在为另一家创业公司招聘研究人员。经过一系列面试,对我的个性、数据科学知识和 python 编程测试进行筛选后,我收到了一份工作邀请。我兴高采烈。免费工作了 6 个月之后,我觉得自己的努力工作和职业成长得到了极大的认可。我受雇于一家重视我现有技能的公司,并投资于我未来的职业发展。一年半后,我有了更多的经验。虽然我还有很多东西要学,但我非常感谢这两家初创公司在没有人愿意的时候给了我一个成长和学习的机会。事后看来,我应该在读研期间采取更多措施来发展我的 python 和数据科学技能。无论如何,我在促成这一转变的过程中感到很有成就感,并对任何经历类似过程的人深表同情。
从杯子到意识(第一部分):杯子和智力有什么关系?
cups 中的哲学,语言基础和 3D 环境的调查
在 MTank ,我们朝着两个目标努力。 **(1)在人工智能内部建模和提炼知识。(2)在创造真正智能的机器方面取得进展。**作为这些努力的一部分,MTank 团队发布了关于我们工作的片段,供人们欣赏和学习,完全免费。如果你喜欢我们的工作,那么请表明你的支持。提前感谢!
- 第一部分:杯子和智力有什么关系?
- 第二部分:从模拟到现实世界
- 第 3 部分:用 SLAM 绘制你家的地图
“意识哲学”的争论
“真正的幸福是在杯底找到的”
将 Mtank 团队聚集在一起的一个核心想法是我们对构建“有意识机器”的兴趣——这是几年前我们开始一起谈论的一个模糊说法。如果有足够的时间,我们团队中的每一组成员,无论配置如何,最终都会将他们的谈话集中在这个想法上。一个我们不会与之抗争的对话重力井。
这些对话并不是我们独有的,关于思想和意识的争论无处不在——勒内·笛卡尔’ ’ 我思故我在’,艾伦·图灵的 ’ 计算机械与智能’,约翰·塞尔的 ’ 中文房间辩论’,大卫·查默斯’ ’ 意识的难题’,等等。它们是现代和古典哲学思想的主要内容。它们也是现代媒体的主要内容,尽管最初的细微差别经常被压缩成一个通用的终结者盒子。这些想法与推特炒作和现代科技新闻对“机器意识”和“人工通用智能(AGI)”等主题的说法之间有相当大的差异。
当我们看到研究人员认为可以创造一般智力的不同方法时,情况就更是如此了——例如,看到 Yann LeCun 和 Gary Marcus 无数次地争论 AGI 需要什么,或者 苦涩的 vs 甜蜜的 vs 更好的一课 。可以说,对于机器是否会等于或超过人类能力的问题,有近无数的想法、理论、定义和假设的答案。
很难确定是什么让一个情报具有普遍性;就单一定义达成一致几乎是不可能的。智力定义不断变化的目标是这个领域本身最有趣的方面之一。哲学家们不断地争论意识是什么,声称它可能是宇宙中最神秘的概念之一,如果不是唯一的话。重力井把我们带到了它的中心。
所以所有这些关于意识的东西都非常令人兴奋,但是我们并不打算为这些最深层的问题提供任何答案。我们也无法阐明智力或意识。但是我们能做的是:
A cup in the hand is worth two in the sink, by instagram handle mizumitodepapu
教机器人以惊人的速度捡起杯子
现实世界中的。教它对杯子进行推理,用杯子来衡量它的价值,并了解杯子,以及数百个不同家庭中与杯子相关的事情。是的,甚至你的。
哲学“在每个杯子的底部”
一开始,上帝创造了天堂&地球。最后,MTank 创造了收集杯子的机器人。”
True happiness is found at the bottom of a cup, by instagram handle mizumitodepapu
对,那为什么是杯子呢?
从 cups 开始,我们可以抽象出与“意识”相关的困难,并专注于创造真正普遍智能所需的简单、实用的任务(可能是)。对我们来说,**AGI 的一个恰当而实用的定义应该是一台能够完成人类所能完成的大部分任务的机器。**这可以通过环境领域(即所有家务)或一般角色(如农业、烹饪、会计、体育指导等)来缩小。
还是那句话,为什么是杯子?
因此,正如我们指出的,意识是几个世纪以来,甚至几千年来一直困扰着人类的东西。但是杯子——我们几年前就发现的杯子。在人类发展的整个过程中,杯子一直保持着相对稳定的 T2,它是抵御变化的世界的壁垒,是在时间和地理上稳定的代表。我们喜欢人们紧握着一个不起眼的杯子沉思最大的问题;我们喜欢杯子随处可见。
尽管智力是个体的,但它也建立在社会交往的基础上。智能机器将不得不在我们的环境中管理;他们应该适应与现代世界的互动。就我们的目的而言,我们认为家庭环境,即公寓等,将成为一个有趣的落脚点。在这些地方,我们的代理可以与人们一起导航一个私密的空间,并(潜在地)在日常生活中帮助他们。
此外,最近还发布了一系列非常棒的 3D 家庭环境,我们渴望对它们进行测试!
如果意识是足够复杂的系统的一个突现属性,那么我们希望我们的代理人的意识在寻找杯子时出现。我们希望我们的小家伙思考他来回寻找杯子的过程,思考它的用处,思考它的真正价值——思考他的真正价值。
当然,这可能看起来很牵强,没有证据,说实话,有点残酷——但我们承诺随着时间的推移,调整代理任务的多样性、复杂性和难度。只是为了让这种感觉不会像现实世界中经常发生的那样,被极度的无聊所消灭。
捡杯子的原因、内容和方式
**从小做起,从简单做起。**让我们训练化身代理在现实的 3D 房屋环境中导航,同时拿起杯子,让我们随着时间的推移提高速度(显著地)。当你阅读这篇文章时,有大批博士试图编写像手一样的抓取器来抓取任意物体,还有大批工业研究人员和工程师编写机器人来完成越来越复杂的任务;我们也从这里开始。
我们打算快速迭代,完成要求代理理解自然语言指令、要求我们的代理进行交流、要求我们的代理理解的任务配置。指令、环境和新生的常识共同引导他完成根据我们最深处的欲望而定义的任务,例如“拿起杯子”。
Note: Example of task “place cup into the sink” within the AI2Thor environment (see 3D environments later on)
根据我们的定义,自然语言指导的捡杯子涉及强化学习(RL)、计算机视觉(CNN 架构)和自然语言处理(NLP)的结合,以进入语言基础领域。
你所说的神话般的语言基础是什么?嗯,根植建立了超越物体物理存在的概念,即使用抽象符号或表示,然后将它们“根植”到现实世界中表示的某种意义。自然语言本身就是这样一种符号系统。
为了说明这一点,我们可以用“狗”的概念作为例子。当你在这篇文章中读到“狗”这个词的时候,你可能会清晰地看到一种有四条腿、皮毛和其他没有提到的特征的动物。也就是说,我们对什么是狗有一个“共同点”或理解,并且可以讨论这个概念**,而不需要一直带着一个例子。**
我们把“狗”的概念建立在语言的基础上,也就是说,我们把这个词作为动物的抽象等价物来使用。但是它可以是我们同意的任何其他任意符号,不仅仅是一个单词,也不一定是字母 d-o-g 的组合。语言常常是我们理解另一个人的思维过程的方式,它也会让我们与代理人交流。
任何真正的智能(可能)都需要语言能力,无论是共享的还是内在的,以及代理在现实世界中的体现。然后,所述代理可以根据情况调整他们的内部目标和优先级。
语言指导是我们训练强化学习系统或策略来完成多项任务的方法之一。我们选择它是因为它使人机交流更加方便,同时也支持多任务学习。
最近的工作,像 Devendra Chaplot 的 ,表明语言基础在 ViZDoom 环境中已经触手可及。例如,如果你把一个代理放在一个房间里,房间里有几个随机放置的物体。根据每集开始时作为输入给出的语言指令,代理学习导航到特定对象,同时避开其他对象,例如“去绿色小火炬”。DeepMind 还通过在他们的实验室环境 中向该任务 添加关系指令,例如“旁边的物体”或“在绿色房间中”。
Note: Two successful cases of task-oriented language grounding in 3D environments. Left: DeepMind’s grounding modules in Lab. Right: Gated-Attention in ViZDoom. More complicated tasks have been thought of and performed since the work in these papers e.g. “Place the cup into the microwave and turn it on”
这涉及到多模态输入 — 视觉和语言(参见我们关于 ’ 多模态方法’ )因为当代理人在环境中观察杯子时,他必须使用自然语言符号系统来建立单词“杯子”的含义。这个“拾起”实际上定义了现实世界中的一个特定目标。
从这里,“杯子”的符号可以被映射——映射到一个主体的特定欲望,或“意义”——在他的视觉系统中寻找杯子的强烈欲望。这样的欲望只是开始。如果我们的代理人有四肢,那么他可能希望操纵杯子并使用他的触觉反馈系统。
我们的代理人将学习杯子的光滑圆形,并将“杯子”的符号与他特别喜欢的光滑圆形联系起来。他会开始明白什么是“杯状”。他会在不知不觉中让自己根植于“杯子”的意义,并开始他从杯子到意识的旅程。
机器人革命万岁,是吗?
All griefs with a cup of tea are less, by instagram handle mizumitodepapu
对于一台机器来说,要实现这个梦想,它需要一个可以玩耍的世界,也就是一个环境。迄今为止,机器人一直被困在严格控制的环境中,大多被囚禁在工厂里。
随着学习机的加速发展,即将到来的机器人革命不可避免。能够处理模糊性的机器,以及我们家所代表的需求不断变化的复杂和动态的环境。大多数人会欢迎一个机器人来把我们从像吸尘、清洁和摆桌子这样的琐碎工作中解脱出来。这样的例子不胜枚举。
那么,这一切的良好起点是什么呢?我们能最终摆脱简单的 2D 雅达利游戏作为我们最强 RL 算法的测试平台吗?简短的回答是肯定的…
在现实世界中对我们的代理人进行培训和试验将是繁琐、缓慢和困难的。然而,通过对典型房间进行足够精确和真实的模拟,我们可以同时训练数千名代理人完成与现实世界相关的任务。也有可能为我们不可能处理或重现的罕见边缘情况进行培训。所有这些都可以比实时操作快得多。
因此,我们的目标是从模拟但真实的 3D 家居环境开始,例如厨房和客厅。有了这些,我们可以创建任务来更好地代表日常问题,包括一个人最常见的请求(“给我泡茶”、“打扫厨房”、“找到我最喜欢的杯子”)。为了在我们的家中部署这些系统,我们需要将知识和技能从模拟世界转移到现实世界。
“模拟注定会成功”——罗德尼·布鲁克斯
“预测:任何你可以模拟和采样无数训练样本的人工智能问题,都可以用今天的算法来解决,如深度和强化学习。”—理查德·索赫尔
3D 环境:不仅仅是简单的游戏
各大公司和研究机构已经做出了巨大的努力来发布新的环境,以应对复杂的 3D 世界中的学习挑战。与 ImageNet 如何推动计算机视觉的进步类似,这一次我们开辟了一条通往不同的、更广泛的、潜在的多模式革命的道路。一个将带来全新的 RL 和 AI 算法,以及将多项进步结合在一起的方法,例如 近期作品 中的 变分推理 , 世界 模型 , RL
Note: Clockwise from top left: Gibson, AI2Thor, Habitat, UnrealROX, CHALET and House3D (bottom left). Shows examples of typical segmentation and depth masks, interaction, 2D maps, humanoids and other agent types.
近年来,3D 环境的发布数量激增,最终达到了与真实世界相似的规模和真实性。这些环境包括ai2,** HoME ,MINOS,ViZDoom,house 3d, 栖息地 这些环境中的许多都是建立在matter port 3D,SUNCG(45K 个不同场景)等的 3D 数据集之上的。这些环境有多种不同的方式,即可定制性、规模、操作、物理和照片真实感。**
查看下面的表格!
****
Source: Above: AI2Thor webpage. Bottom: CHALET paper
可以看出,对于 RL 算法来说,这是一个非常激动人心的时刻。我们已经到了可以在越来越多的困难环境和其中的任务上进行测试的地步。对“智能的、越来越自主的系统”的需求增加,产生了培训它们的环境供应,这在推动环境的研究人员和推动研究人员的环境之间形成了一个反馈回路。
也就是说,在 3D 环境的许多变体中,许多具有可测量指标的明确定义的任务将迫使研究人员最终开发出能够学习一些高级感知、预测、推理、自我运动、操纵、基础、启示、抽象、规划、意识的智能体,最终达到我们所谓的“真正智能”。
令人兴奋的是,但是我们从哪里开始呢?
这些环境各有利弊,所以我们从 倒推我们希望代理做的 。例如,拿起杯子,更多的物理和现实是可取的,可定制性对我们来说是非常重要的。由于我们特别关注与环境中物体的互动,我们选定互动之家** (AI2THOR)作为我们研究的基础。**
如果‘ai2 thor’不是你的茶(呵呵),我们创建了一个最热门的 RL 框架和环境的综合列表,你可以探索一下。可以在我们在 GitHub 上创建的RL-code-resources资源库中找到。如果您对选择或列表中的环境有任何问题,请随时联系我们,我们将非常乐意讨论您的想法。
Source: Taken from https://aihabitat.org/
AI2Thor
我们从 AI2Thor 开始,因为它的 API 非常简单。在你的终端上写下“pip install ai2thor ”,这几乎是设置的范围,而且环境本身的界面是用户友好的,有很多定制的可能性。
我们很快发现 AI2Thor 不仅有杯子、,还允许物体交互**,例如打开和关闭微波炉/冰箱,打开水龙头,以及将杯子和其他物体放入/放在容器上。当我们看到这个环境包含杯子并允许与所述杯子进行简单的交互时,我们就抓住了这一点,因为这是完成我们通过人机共生达到综合感知的令人难以置信的崇高目标所需要的本质。或者至少,我们预见到智能体至少能够识别杯子并向它们导航的能力是我们许多算法的良好起点。**
在 C2C #cuplife 的下期
在下一篇博客中,我们将更深入地探讨我们正在开发的界面,以使 ai2 成为一个开放的 ai 健身房环境。这样的界面将允许任务定制,我们的 repo 也包括几个最先进的算法的代码,可以在这些任务上进行训练。OpenAI 不仅将 gym 作为一套环境,而且作为一种在代码结构中定义它们的通用方法来推广;我们扩展了任务的概念以及它们与环境本身的关系(虽然是独立的概念)。
请随意喜欢我们的材料,跟随我们或和我们一起笑,因为我们开始了谦虚、雄心勃勃、积极、挑衅和轻松的尝试,讲述从杯子到意识的旅程。如果你等不及下一期,你可以关注我们回购的最新消息。
一定要给我们的回购打个星,恰如其分地命名为cups-rl(可定制的统一物理模拟(CUPS)用于强化学习算法)。否则在这里找到我们,或者在我们的 网站 找到我们。
一如既往地感谢您的阅读!
从杯子到意识(下):从模拟到真实世界
【AI2Thor 的任务接口,物理模拟和一个名为 Vector 的真实机器人
The moments of suspense as two teams of Vector robots (black vs multi-coloured) face each other before the “battle of the cup” commences. Created using the PyBullet physics simulator.
Round 1: Fight! 10 vs 10 Vectors. Cups fall mid-battle to cause carnage, hence “Cup Carnage”; a violent sport indeed. Scroll down for round 2 with 20 on each team!
在银行,我们朝着两个目标努力:
(1)在人工智能内部建模和提炼知识。
(2)朝着创造真正智能的机器前进。
作为这些努力的一部分,MTank 团队发布了关于我们工作的片段,供人们免费欣赏和学习。如果你喜欢我们的作品,那么请通过与其他也会喜欢它的人分享来表达你的支持。提前感谢!
- 第一部分:杯子和智力有什么关系?
- 第 2 部分:从模拟到现实世界
- 第 3 部分:用 SLAM 绘制你的家的地图
“如果大脑创造了一种感知无线电程序,并用它来指挥有机体的行为,那么什么是倾听呢?而不是像一些泛灵论者认为的宇宙本身,或者像二元论者声称的物理宇宙之外的某个实体,我想说的是,意识体验是我们注意力内容的一个模型:它是虚拟的,是有机体模拟自我模型的一个组成部分,并由注意力导体产生”
—巴赫的认知架构中的现象体验和知觉束缚状态
介绍
在我们的上一篇博客中,我们简要介绍了一些常见的关于意识的思想实验和争论。再一次,我们想提醒你,我们不打算为这些关于意识本质的深层问题提供答案——我们只是专注于很好地拿起杯子。世界级的世界杯选拔赛,以及它对人类的潜在意义。
也就是说,从唯物主义者的角度来看,世界仅仅是由物体及其相互作用组成的 T21。因此,让我们把“对象”放回客观状态,并让我们的代理进入各种环境,开始尝试有趣的任务。在主观世界的任何蛛丝马迹开始潜入它们的“自我模型”之前,我们萌芽中的意识——代理人——必须从某个地方开始。
在这一集里,我们深入探究了我们的特工可能生活的几个世界——我们的小家伙将迈出第一步的地方。他的奖励功能将引导他完成伟大的旅程——从他的模拟进入我们的模拟。我们将谈到我们对令人惊叹的开源 3D 照片逼真环境 AI2Thor 的功能进行扩展的工作,以及将我们的工作引入更具物理真实感的模拟(PyBullet 和 Gazebo)所采取的步骤,我们还将介绍一个名为 Vector 的简单而真实的机器人,它可以解决现实世界的导航问题。
欢呼吧,让采杯开始吧!
快速回顾一下
在 第一部分 中,我们谈到了项目目标、语言基础,并调查了一些 3D 环境。最后,我们详细讨论了名为 AI2Thor 的 真实感 Unity 环境。如果你对这些概念不熟悉,或者你想了解我们的思考,你可以在这里找到第一部分。
ai2 存储环境包装
一些人认为,你完全可以通过完成越来越困难和多样的人类任务来到达 AGI。按照这种思路,能够在模拟和现实世界中有效地指定任务,并且能够客观地衡量每个任务的性能,这一点很重要。因为我们想做很多任务,所以我们需要一个通用接口来定义一组不同的任务,并使其可定制以满足我们所有的需求。
此外,我们希望帮助研究社区的其他人在 3D 环境中训练强化学习(RL)算法,并使他们能够为他们的特定目标修改这些环境。
输入 AI2Thor 和我们的贡献:
- 我们创建了一个通用结构,用于定义 AI2Thor 环境中的环境设置和可重复实验。
- 一种在我们的环境中运行通用 RL 算法的简单方法,同时遵循 OpenAI Gym 环境接口(step()和 reset())。
- 任务界面旨在允许更快地创建不同的奖励功能和任务定义,即任务的核心和灵魂,例如“拿起杯子”。
- 基于策略和价值的算法基准示例(A3C 和 Rainbow ),带有大量注释说明,有助于用户理解算法背后的细节和数学,以及如何在我们的环境中运行它们的完整过程。请关注下一篇博客,我们将在那里对此进行更深入的探讨。
最终,我们希望能够对来自整个开源世界的不同最先进(SOTA)算法进行基准测试。我们试图尽可能多地保留原始源代码,但也对它们进行了调整和微调,以适合我们设计的任务。但是让我们利用 gif 的力量从抽象的想法走向现实。
Note: Example task of “put the cup in the microwave” which can be made within our task interface.
上面我们可以看到一个简单任务的执行,在一个模拟的厨房里, 把杯子放进微波炉 。我们看到,在 AI2Thor 中,家庭环境是复杂和现实的,加上与环境的互动是相当丰富的。在下面的图片中,我们看到一个浴室场景,一个特工在训练捡起我们用 Unity 游戏引擎放在地上的杯子。
Note: An example of an RL agent training on our “NaturalLanguagePickUpMultipleObjectTask” in one of our customised scenes (edited with Unity).
简化任务定义的包装器
我们的包装器(【https://github.com/TheMTank/cups-rl】)试图通过实现相应的 gym env 子类,使 AI2Thor 可用作 OpenAI gym 环境。我们还包括一些任务、代理培训和脚本的示例,以简化学习过程。我们正在不断改进它,以提供更好的用户体验,但这是迭代的,所以请耐心等待。
健身房环境提供了恰到好处的抽象,因此可以通过在每集开始时调用 reset 函数和 step 函数在每一步向环境提供您的操作,以通常的 RL 方式运行您的实验,如下所示:
如果你想“按原样”使用环境,这是非常强大的,但是我们发现当试图在保持这个简单界面的同时使它可定制到许多任务时,这是有问题的。遵循 gym 的建议,我们应该定义一个尽可能通用的环境类,然后从这些基类中的一个或几个继承,为特定的任务定制环境。
我们认为这个过程对于我们的用例来说可能过于复杂,因此我们决定采用一种不同的方法来使它对我们来说更加直观。我们希望对我们有意义的东西,对最终用户来说也更容易理解。我们相信,当目标是数百个任务和数不清的“任务变化”时,这是更具可伸缩性的,但仍然希望保持环境的重要、公共部分,在所有任务之间共享。
相同界面,更多控制
基本环境和该环境中的特定任务之间的自然划分将我们分为两大类:‘ai2 torenv和’ BaseTask '。这里的目标是将我们对 AI2Thor 的包装与奖励函数的细节以及为特定任务重置环境的细节分离开来。
前者包括场景的细节,将要考虑的对象,像分辨率或灰度格式这样的图像细节。后者包括该特定任务所需的初始化/重置条件,以及在每一步观察到的奖励的计算。
我们为什么要这样做?
这样,用户可以独立于环境细节定制和创建任务**。我们通过将基本任务划分为它们的目标的子类,并依靠底层环境代码来运行并在任务间保持不变来实现这一点。**
同时,我们确保用户不必为了实验定义而将他的思想分成独立地考虑环境和任务。我们通过使用单个配置文件来指定环境和任务参数来实现这一点。
作为一个例子,如果我们想要改变任务存储库上给出的示例任务来拾取杯子,而不是像在健身房环境中通常做的那样,从环境中创建一个新的子类并修改 step 和 reset 函数(可能添加大量的样板文件和意大利面条代码,可能还有一些 bug ),我们将创建一个新的任务类,如下所示:
然后轻松修改配置文件,在几秒钟内改变环境和任务条件:
Change the task to pick up (and put down) apples as fast as possible instead
任务和配置组合允许“任务变化”,例如 PickUpTask 允许您指定“苹果”或“杯子”采摘或两者兼而有之;每一项都是相同的任务,但都有特定的变化。
如果所有这些关于包装器、任务和通用代码接口的讨论让你感到兴奋,那么不要犹豫去尝试一下。请随意添加一个问题,或者您自己的拉动请求,包括新的任务,这样您就可以将您的结果与其他人进行的同类实验进行比较。您可以随时给我们发电子邮件,询问任何问题或要求澄清。
我们希望 GitHub README 能提供足够的信息,但是请随时联系我们,因为我们会很快回复。从您那里获得反馈将有助于我们使它更加强大,并可能使更多的人在方便的时候使用它进行自己的实验和环境定制。所以不要害羞!
模拟物理是通往真实世界机器人的道路
我们的现象体验对我们自己来说是非常真实的,但我们的自我却不是真实的。换句话说,当托诺尼和科赫(摘自他们 2015 年关于综合信息理论(IIT)的论文)认为只有物理有机体才能有意识体验,而模拟不能时,他们完全搞反了:物理系统不能有意识,只有模拟可以。”
巴赫的 现象体验与感性束缚状态
AI2Thor 提供了一组不同的照片真实感场景和一个简单操作的物理引擎,通过它我们可以测试我们代理的泛化能力;然而我们总是渴望对环境的每一部分有更精细的控制和物理真实感。
例如,完全指定我们代理的身体的能力:传感器、致动器、关节、链接等。此外,我们希望这些部件能够与丑陋的物理现象相互作用,这可能会导致我们的机器人摔倒,或者在非常令人沮丧的情况下,上帝保佑,甚至打破一个杯子。
希望这样,我们至少可以避免打破真实的世界杯。
这种程度的真实性和对环境的控制使我们能够更接近于最终将这些算法部署在真实的机器人中,在真实的家庭中。让我们能够以外科手术般的精度控制附属物,并随着时间的推移改善对象操作,例如,机器人手指穿过杯柄或使用勺子微妙地倒糖。
但在此之前,让我们介绍两位最新的团队成员,他们非常适合测试我们早期的假设:Vectors 00301ed1 和 00a10115。
介绍我们的第一只机器人豚鼠 Vector
他可能很小,但对于我们想要测试的许多常规任务和算法来说,他是完美的。机器人公司 Anki 从 Cozmo 开始,最近随着他们著名的 kickstarter 活动转移到 Vector。
我们必须跟上潮流,因为它有强大的 python SDK 和从您的台式机/笔记本电脑设备运行任何 python 代码的全部功能,即从 vector 接收状态信息(图像、3D 姿势、电池等),并向机器人发送适当的命令(将左轮向前移动 50 毫米,充电)。
这让我们可以在真实世界和 Vector 的世界中自由测试许多最先进的算法,例如同步定位和映射(SLAM)、主动 cup 识别、路径规划导航到 cup 或 RL 纯端到端方法等。
Note: Full specification of Vector. It’s incredible the amount of things that can be fit on such a small and inexpensive robot; truly jam-packed.
此外,我们试验了一个 ROS 包,它将允许我们管理来自传感器、致动器的独立控制,并使用强大的库来处理导航和感知问题,例如路径规划和 SLAM。
能够模拟矢量也很重要。我们发现 Anki 慷慨地分享了他们的设计文件(OBJ 和 MTL 格式)。我们还创建了相应的 URDF/SDF 文件,我们可以与你分享,这样你就可以玩向量,即使不买他!这些允许我们在模拟中模拟机器人的物理交互。
在本博客的第一部分中,我们介绍了许多不同的 3D 环境,重点是照片真实感和其他特性,但是除了 ai2 之外,很少有其他的具有广泛的物理特性。即使是阿尔托的物理学对于我们的需求来说也是有限的。了解了这一点,我们知道我们必须找到一种方法来增加我们模拟的物理真实性,例如,通过指定力、扭矩、关节、摩擦和详细对象的惯性。
好奇什么样的模拟在物理精度、控制和定制方面是绝对最好的?嗯,研究了一段时间后,我们最终选择了 PyBullet (也像 ai2thor 一样易于安装,“pip install pybullet ”)和 Gazebo (它是为用 ROS 控制的机器人设计的)。使用这些工具我们可以获得多少功率和控制的示例可以在下面的多个不同环境中的模拟矢量中看到(使用 URDF/SDF 文件):
Physics simulations can literally bring us to the moon. Try to casually handle that edge case in the real world! Created with Gazebo and ROS.
GOOOOOOOOOOAAAAAAAAL! Created with Gazebo and ROS.
And now we’ll leave you with round 2! The final round of “Cup Carnage”. 20 vs 20 Vectors. At the end, we see that one Vector got to run away with his cup into the far distance, clearly making this a win for the multi-coloured team. Created using PyBullet.
解构通往具身 AGI 的道路
老实说,我们不知道我们会在哪里结束。我们不断地重新规划、完善和重新确定我们的目标,并愿意快速转向最有前途的技术,以增加机器人在世界上捡起杯子的数量;我们真正的关键绩效指标 (KPI)。
为了最大化这个 KPI,我们不断地讨论人们可以分割 AI 问题的许多方法(“分而治之”),以及在我们的代理设计中选择哪些抽象来帮助我们向通用机器迈出微小的一步(例如,无模型与基于模型,PyTorch 与 TensorFlow)。例如,一个有趣的划分是将一个机器人(甚至一个人)的硬件分成几组传感器和致动器,两者都使软件分别执行感知和控制。以下是对此观点的一些思考,以及我们计划如何使用这些抽象:
感知
就人类的感知而言,主要的感官是视觉、触觉、听觉、嗅觉和味觉。后两个对我们的机器人来说是一个不寻常的起点,而前三个似乎是最重要的。
更具体地说,视觉可能是最有用的起点。为了在我们的代理中实现“视觉”,我们将使用我们的 计算机视觉专业知识 来部署诸如对象检测、深度估计、SLAM 和对象姿势识别等技术,以使我们的代理能够了解他所生活的世界。触觉和听觉会及时出现。也许有一天,我们的代理人会感受到一杯新茶的温暖,或者听到水壶烧开的声音。
控制
在控制端,对于取杯任务,我们将其分为导航和抓取。我们接下来的几篇博客将关注导航到特定位置和特定物体(如杯子)的艺术。在这之后,我们将抓住杯子,举起它,轻轻地把它放在新的位置。在每一种情况下,我们都有更传统的技术以及更现代的“学习”方法供我们使用。
下一期 C2C (#cuplife)
在我们的下一篇博客中,我们将讨论我们在 cups-rl 报告中的一些任务上运行的两个 SOTA RL 算法。这应该向读者展示我们打算如何使用它来对不同的算法进行基准测试,当然,还有发现、挑选和囤积许多许多杯子。无模型 RL 范式中政策和基于价值的方法之间的史诗般的战斗。
可供选择的两种算法是: A3C 和 RainbowDQN 。你会把钱押在这些硬汉中的哪一个身上?跟随我们的媒体去寻找答案吧!
*P.S. we changed priorities and decided to get our feet very wet in mapping algorithms like SLAM in part 3 of this blog. We realised that understanding where you are located and having a map is a universally useful and a fundamental pillar for many tasks for our embodied agents and for them to understand their environment and clearly AGI embodied agents will need to be able to do this. However, check out the repo for the code for these A3C and RainbowDQN RL models. What can we say, the road to AGI is long, winding and treacherous. We must be willing to adapt fast. Check out part 3 [here](https://medium.com/@TheMTank/from-cups-to-consciousness-part-3-mapping-your-home-with-slam-8a9129c2ed58)!*