TowardsDataScience 博客中文翻译 2021(七百三十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

什么是声音?

原文:https://towardsdatascience.com/what-is-sound-691988d780bb?source=collection_archive---------4-----------------------

数字声音和音频数据介绍。用一个 Python 例子来研究音频文件、声波和频谱图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

什么是声音?在 UnsplashFPVmat A 拍摄的照片

声音的机器学习和数据分析是一个不断增长的领域,具有数据科学用例的巨大潜力。在这篇文章中,你将学习什么是声音,以及如何在计算机上表现声音。

你还将学习什么是傅立叶变换,以及它是如何工作的。然后,您将看到如何使用傅立叶变换为机器学习或数据分析准备音频数据,并使用 Python 编写了一个完整的示例。

什么是音频数据?

您可能熟悉表格数据:在行和列中存储数据的标准形式。这是存储数据的传统方式,非常适合机器学习问题。

下一步的难度是图像数据。图像数据更难处理,因为它不能用作表格数据。然而,计算机能够通过给图像中的每个小方块(像素)赋值来显示图像。通过给每个像素一个红、蓝、绿的值,计算机可以显示图像。

现在为了在图像上进行机器学习,我们复制这个逻辑,并且我们使用三维向量中的像素值(红色、蓝色和绿色)(维度是图像高度、图像宽度和三种颜色)。如果你想了解更多关于图像的机器学习,可以查阅以下关于物体检测图像分割的资源。

下一个难点是声音(或音频)数据。作为一个非常基本的描述,假设音频数据是一种存储声音的数值方式。

声音是气压

音频数据难以处理的原因是,与表格数据和图像数据不同,它不遵循非常清晰和有组织的结构。

声音,以其最原始的(非数字)形式,是人耳可以察觉的气压变化。

从模拟声音到数字音频:麦克风

声音的数字形式是音频。为了在计算机中存储声音,我们需要将它转换成数字形式:计算机可以存储的东西。

将声音转换成数字有两个步骤:

  • 麦克风将气压变化转化为电压。您可能从未意识到这一点,但这实际上是麦克风的全部功能。
  • 模数转换器接收电压(将其视为不同的电流强度),然后将这些电压转换成数字:这些数字是波的数字值:与气压不同,这些数字可以存储在计算机中。

音频数据是振幅和频率

你现在对如何将声音转换成数字有了初步的了解,但是下一个真正要问的问题是:那些代表声音的数字是什么?

原来有两种重要的数字:振幅和频率。

  • 声波的振幅显示其音量
  • 声波的频率代表其音高

你现在明白了,一个声波有两个基本值:振幅和音高。它们一起可以发出从大声到安静,从低音到高音的音调。

现实生活中的声音是“复合”波

既然你已经理解了什么是声波,让我们进入一个更复杂、更现实的情况。实际上,在一个音频文件中经常同时有许多声音。比如在音乐中,你一般会同时听到多个音调。在自然录音中,你通常还会同时听到各种动物、风声等等。

同时只有一个频率的音频文件非常罕见。因此,如果我们想要将一个音频文件总结为数据,我们将需要描述不止一个波。

完整的声音是波的混合,因此是不同振幅的频率的混合。简单来说:声音是不同音量的高低音调的混合

为了处理如此复杂的波,必须将它分解成每个频率每个时间的振幅。这通常是声谱图所能显示的。

频谱图显示了声音中的所有波

频谱图是一种图表,可以让你描绘一段时间内的声音。该图在 x 轴上显示时间,在 y 轴上显示频率。颜色表示特定频率在特定时间点的振幅。

频谱图是使用傅立叶变换从数字“复杂”声音创建的

傅立叶变换是一种先进的数学方法,它允许您将“复杂”的声音分解成声谱图,该声谱图显示每个频率在整个时间内的音量(振幅)。

我不想在这里讲太多细节,但我鼓励你们阅读一些傅立叶变换,例如这里的或这里的。

使用 librosa 在 Python 中表示声音

现在让我们通过用 Python 对一个真实的音乐文件进行一些操作来实现这一点。我们将使用 librosa 包,这是一个在 Python 中处理声音的很好的包。

要在 Python 中安装 librosa,只需在 Jupyter 笔记本中运行!pip install librosa即可。这也是一个很好的使用案例,可以试用一个 Google Colab 笔记本

请注意,在处理声音数据时,您通常会使用.WAV文件,因为这是声音的未压缩格式。其他熟悉的声音格式,如.FLAC.MP3压缩声音。这可能会对数字表示产生负面影响,尽管这并非不可能。

Librosa 附带了一个示例音乐文件。您可以按如下方式导入示例声音文件:

什么是声音?将音乐文件加载到 Python 中。

导入音乐后,您可以使用 Jupyter 笔记本功能来聆听声音。您可以使用以下代码来实现这一点:

什么是声音?在 Jupyter 笔记本中播放声音文件

您将在笔记本中看到以下条形音箱(与此图不同,您实际上可以听到音乐):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

什么是声音?在 Jupyter 笔记本中播放 wav 文件

下一步,让我们将音乐显示为波,从而使声音“肉眼可见”。当然,如前所述,真实的声音非常复杂,它们看起来一点也不像简单的波。

你可以使用下面的代码来打印一个 wave:

什么是声音?显示了波形图。

你将获得以下情节:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

什么是声音?印刷胡桃夹子的波。

下一步,让我们来看看声音数据最有用的可视化,也就是声谱图。通过对波形数据y进行傅里叶变换,可以获得谱图输入数据。

如前所述,傅立叶变换是相对高级的数学。幸运的是,我们可以使用 librosa 中的一个函数来完成繁重的工作,如下面的代码所示:

什么是声音?使用傅立叶变换生成频谱图数据。

您将获得如下所示的数组:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

什么是声音?原始谱图数据(振幅)

在创建最终的声谱图之前,还有最后一步,那就是将声谱图数据转换成分贝。原因是声谱图功能不适用于当前(振幅)格式。

您可以按如下方式转换数据:

什么是声音?将振幅谱图数据转换成分贝谱图数据。

现在,我们终于可以用声谱图函数给我们展示声谱图了。这是按如下方式完成的:

什么是声音?打印声谱图。

你会得到下面的图表,这是胡桃夹子的光谱图。我们已经成功地导入了一个音乐文件,并将其转换成一种可视的数据格式。声谱图包含了胡桃夹子每个频率的音量的完整概览,因此它是音乐的完美视觉表现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

胡桃夹子的声谱图。

结论

在本文中,您已经学习了使用数字格式的声音和音频 的基本知识。您已经将音频数据从只能听到的 wav 格式转换成了作为声谱图视觉表示。

现在,您已经掌握了音频数据的导入和准备,您可以继续使用更高级的用例,如使用机器学习进行音乐流派分类声音检测

希望这篇文章对你有用。感谢您的阅读,请不要犹豫,继续关注更多的统计、数学和数据内容!

什么是统计能力?

原文:https://towardsdatascience.com/what-is-statistical-power-8f934c9bbcca?source=collection_archive---------27-----------------------

有多少使用这个术语的人真正理解它的意思?

如果你的经历和我一样,你可能已经听过很多人在工作中谈论“统计能力”。我很确定,在大多数情况下,这些人是基于某种模糊的概念,即较大的 n 总是好的,来推动更大的样本量。

但这些人中有多少人能真正定义什么是统计能力?在这篇文章中,我想看看统计能力的概念和定义,并确定它作为一种度量方法在哪里有用。

假设检验

术语“统计功效”只有在涉及假设检验时才有意义。您可能还记得,假设检验涉及使用数据样本的统计特性来确定关于样本所来自的总体的陈述的确定性水平。我们举个例子。来自peopleanalyticsdata R 包的salespeople数据集包含一家技术公司销售人员样本的数据,包括他们以千美元为单位的年销售额以及他们最近的绩效评级,从 1 到 4 依次递增。让我们看看前几排。

library(peopleanalyticsdata)salespeople <- salespeople[complete.cases(salespeople), ]
head(salespeople)Output:
promoted sales customer_rate performance
1        0   594          3.94           2
2        0   446          4.06           3
3        1   674          3.83           4
4        0   525          3.62           2
5        1   657          4.40           3
6        1   918          4.54           2

现在让我们来看看这个陈述:在总体人口中,表现最佳的销售人员的平均销售额与表现最差的销售人员的平均销售额不同。我们首先假设这不是真的——也就是说,表现最好的人和表现最差的人的平均销售额是一样的——我们称之为*零假设。*然后,我们执行一个测试,以确定如果总体中的零假设确实为真,我们的样本看起来像它们的样子的最大概率——称为测试的 p 值。在这种情况下,我们进行韦尔奇的 t 检验,以比较两个样本的不等方差。

# sales of top performers
sales4 <- salespeople$sales[salespeople$performance == 4]# sales of bottom performers
sales1 <- salespeople$sales[salespeople$performance == 1]# p-value of null hypothesis that their means are the same
t.test(sales4, sales1)$p.valueOutput:
1.093244e-05

这表明,如果我们的零假设在总体中是正确的,那么我们的样本看起来不太可能是它们的样子。我们定义了一个可能性水平,在这个水平以下,我们同意拒绝零假设,这就是所谓的 alpha 。alpha 通常为 0.05,但有时可能会低得多。如果我们在这里将α取为 0.05,我们可以轻松地拒绝零假设,并得出另一个假设,即总体中低绩效者和高绩效者的平均销售额存在差异。

定义统计功效

我们可以看到,假设检验是关于确定性的水平,在这个水平上,我们可以放心地宣布总体中的差异,承认我们只能观察总体中的一个样本。对于未观察到的人群,没有什么是 100%确定的,因此可能会出现四种情况:

  1. 零假设不会因为样本而被拒绝,事实上它对总体来说是正确的
  2. 基于样本,零假设被拒绝,但事实上它在总体中是真实的(一个I 型误差)
  3. 基于样本,零假设没有被拒绝,但事实上它在总体中是错误的(一个类型 II 错误)
  4. 基于样本的零假设被拒绝,事实上它在总体中是错误的

统计功效被定义为数字 4 出现的概率。本能地,你可以想象这取决于你的样本的大小,总体中的实际(未观察到的)差异(适当的标准化),以及你拒绝零假设(alpha)的确定性的标准。例如,如果实际人口差异较大,您可能会在较小的样本中看到它。如果α更小,您可能需要更大的总体差异或更高的 n 来满足您的确定性标准。

这个房间里的大象当然是我们永远不会知道我们人口的差异——我们只知道我们样本的差异。因此,我们通常通过使用样本中观察到的差异来满足自己的观察到的统计功效。对于我们这里的salespeople示例,因为它是 t-检验,所以我们使用 Cohen 的效应大小 d 作为我们的归一化观察差异*。*结合我们的样本量和 0.05 的 alpha,我们可以计算出假设检验的统计功效为 0.996。我们可以相当肯定地说,零假设将被准确地拒绝。

library(effectsize)
library(WebPower)# sample sizes
n4 <- length(sales4)
n1 <- length(sales1)# cohen's effect size d
d <- cohens_d(sales4, sales1)$Cohens_d# statistical power
wp.t(n4, n1, d = d, type = "two.sample.2n")Output:Unbalanced two-sample t-test

    n1 n2         d alpha    power
    55 60 0.8741483  0.05 0.996347

统计能力什么时候有用?

坦白说,并不经常。在你已经有了样本和数据,并且已经进行了假设检验的情况下,统计能力实际上只是一个衡量你如何清除阿尔法障碍的指标。你的阿尔法越不严格,权力就越大。看一看。

# statistical power
test <- WebPower::wp.t(n4, n1, d = d, type = "two.sample.2n", alpha = seq(0.05, 0.0001, by = -0.0001))# plot power against alpha
plot(test$alpha, test$power)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果您还没有获得样本数据或进行任何假设检验,并且如果您正在计划一项可能涉及大量工作的实验或研究,那么统计能力作为一种衡量标准可能会有所帮助。因为样本量起着一定的作用,所以理论上你可以计算出一个最小样本量来达到某个 alpha 标准。

但实际上,我发现整个过程是高度推测性的,因为你需要知道你观察到的效应大小,当然你不知道,因为你还没有进行实验。因此,来自统计功效计算的大多数样本大小估计往往是以灵敏度范围的形式。

实验可能很难组织和获得资源,统计能力在确定所需规模时可能会有些用处。它还可以帮助说明 n 的收益何时递减。例如,如果我们使用中等效应大小和 alpha 为 0.05 的配对 t-test 测试一系列样本大小,我们会发现存在一个点,在这个点上,额外的 n 不会对功效产生太大影响。

# test a range of sample sizes
sample_sizes <- 20:100
power <- [wp.t](https://rdrr.io/pkg/WebPower/man/wp.t.html)(n1 = sample_sizes, d = 0.5, type = "paired")plot(power)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总的来说,统计能力是一种钝器。在某些方面,你可以把它看作是假设检验的一个“附加部分”,它只在与实验设计相关的某些情况下有用。

如果您有兴趣进一步探索统计功效的数学和理论,并了解在假设检验和回归模型的功效分析中使用的不同统计数据,您可以参见《人物分析》 中的 回归建模手册的第 11 章。

最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在LinkedInTwitter上找我。也可以看看我在【drkeithmcnulty.com】http://drkeithmcnulty.com/上的博客。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

unsplash.com 的好意

什么是机器学习中的分层交叉验证?

原文:https://towardsdatascience.com/what-is-stratified-cross-validation-in-machine-learning-8844f3e7ae8e?source=collection_archive---------3-----------------------

本文使用 Scikit-Learn 解释了分层交叉验证及其在 Python 中的实现。本文假设读者具备机器学习中交叉验证的工作知识。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由克里斯里德Unsplash 上拍摄

什么是分层抽样?

在深入研究分层交叉验证之前,了解分层抽样是很重要的。分层抽样是一种抽样技术,在这种抽样技术中,样本的选取比例与它们在总体中出现的比例相同(根据特征将总体分成称为“阶层”的组)。例如,如果感兴趣的人群中有 30%的男性和 70%的女性受试者,那么我们将人群分为两组(“男性”和“女性”),并从“男性”组中选择 30%的样本,从“女性”组中选择“70%”的样本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分层抽样(图片来自 Mathprofdk(丹·克恩勒)维基百科

分层抽样与交叉验证有什么关系?

在交叉验证中实施分层采样的概念可确保训练集和测试集具有与原始数据集中相同的感兴趣特征比例。对目标变量这样做可以确保交叉验证结果非常接近泛化误差。

在继续下一步之前,我们将生成一个包含 500 条记录、三个要素和三个类的合成分类数据集。数据集是使用 Scikit-Learn 的“make_classification”方法生成的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在没有分层抽样的情况下实施保留交叉验证

使用 Scikit-Learn 的“train_test_split”方法实现保留交叉验证。实现如下所示。该方法返回训练集和测试集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

由于我们没有使用分层抽样,我们可以看到目标变量的比例在原始数据集、训练集和测试集中变化很大。

用分层抽样实现保留交叉验证

我们将使用分层抽样实现保留交叉验证,以便训练集和测试集具有相同比例的目标变量。这可以通过将“train_test_split”的“分层”参数设置为感兴趣的特征(在本例中为目标变量)来实现。它不一定是目标变量,甚至可以是您希望在训练集和测试集中具有相同比例的输入变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

使用分层抽样,目标变量的比例在原始数据、训练集和测试集中几乎是相同的。

在没有分层抽样的情况下实现 k-fold 交叉验证

k 倍交叉验证将数据分成“k”份。在“k”次迭代的每一次中,一部分被用作测试集,而其余部分被用于训练。使用 Scikit-Learn 的“KFold”类,我们将在没有分层抽样的情况下实现三重交叉验证。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们可以看到,目标变量的比例在原始数据、训练数据和跨分裂的测试数据中不一致。

用分层抽样实现 k 重交叉验证

分层抽样可以使用 Scikit-Learn 的“StratifiedKFold”类通过 k-fold 交叉验证来实现。实现如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在上面的结果中,我们可以看到,在所有三个分割中,目标变量的比例在原始数据、训练集和测试集中非常一致。

使用分层采样实现的交叉验证确保感兴趣特征的比例在原始数据、训练集和测试集中是相同的。这确保了在训练和测试集中没有值被过度/不足地表示,这给出了对性能/误差的更准确的估计。

什么是支持向量机?

原文:https://towardsdatascience.com/what-is-support-vector-machine-870a0171e690?source=collection_archive---------21-----------------------

支持向量机指南

第 1 部分:定义模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

算法是什么?

支持向量机(SVM) 是一种监督机器学习算法。SVM 的目的是依靠标记的输入数据来预测查询样本的分类,这些输入数据通过使用裕度被分成两个组类。具体来说,将数据转换到更高的维度,并使用支持向量分类器作为阈值(或超平面),以最小的误差分离两个类别。

算法是如何工作的?

步骤 1:将训练数据从低维转换到高维。

第二步:找到一个支持向量分类器[也称为软间隔分类器]来分离这两个类[内核技巧]。

第三步:返回类标签→查询样本的预测!

算法的例子

让我们从基础开始……

最大间隔分类器— 是将阈值分配给每个类簇边缘上的观察值的中点;阈值给出两个类之间的最大距离,以给出最大的余量长度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最大间隔分类器—正确分类示例*【作者图片】*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • **例:**由于查询样本落在阈值右侧,因此将查询样本归为 B 类,这是有意的!存在偏差/方差权衡,因为存在高偏差(所选阈值对异常值不敏感)和低方差(对新查询样本表现良好)。
  • **问题:**如果存在异常值,会发生什么情况?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最大间隔分类器—错误分类示例*【作者图片】*

  • 举例:由于查询样本落在阈值左侧,查询样本被归类为 A 类,这是而不是想要的!直观上,这没有意义,因为与 A 类聚类相比,查询样本更接近 B 类聚类。存在偏差/方差权衡,因为存在低偏差(所选阈值对异常值敏感)和高方差(对新查询样本表现不佳)。
  • **解决方案:**由于最大间隔分类器对训练数据中的离群点非常敏感,因此需要选择一个对离群点不敏感且允许误分类的阈值→软间隔分类器。

软边界分类器— 是当阈值被允许产生可接受的误分类量,同时允许新数据点仍然被正确分类时;交叉验证用于确定在软边界内允许多少错误分类和观察,以获得最佳分类。【支持向量分类器是参照软间隔分类器的另一种方式】

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

软边缘分类器—正确的分类示例*【作者图片】*

  • **例:**由于查询样本落在阈值右侧,因此将查询样本归类为 B 类,这是有意的!为了找到最佳阈值,出现了 1 次错误分类。
  • **问题:**如果两个类之间有明显的重叠,会发生什么情况?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

软边距分类器—错误分类示例*【作者图片】*

  • **举例:**如果只考虑阈值 1,查询样本落在阈值右边;然而,由于类别 A 和类别 B 的部分聚类都落在右边,查询样本将被不准确地分类。如果只考虑阈值 2,则查询样本落在阈值的右边;尽管只表示了类别 B,并且查询样本被分类为类别 B,这是所期望的,但是类别 B 的部分聚类落在阈值的左侧,这表示潜在的误分类。因此,不存在可以应用而不会导致大量错误分类的最佳阈值。
  • **解决方案:**由于软间隔分类器对训练数据中的大量重叠非常敏感,因此需要选择一个对异常值和重叠分类都不敏感的阈值→支持向量机。

让我们添加一个 y 轴(将数据转换到更高维度)…

支持向量机— 是将数据变换到一个更高维度,用一个支持向量分类器(也叫软间隔分类器)作为阈值,将两类分开。当数据是 1D 时,支持向量分类器是一个点;当数据为 2D 时,支持向量分类器为直线(或超平面);当数据是 3D 时,支持向量分类器是平面(或超平面),当数据是 4D 时,支持向量分类器是超平面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

支持向量机算法*【图片作者】*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

A 级

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

B 类

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查询样本

  • **例:**由于查询样本落在阈值左侧,因此将查询样本归为 B 类,这是有意的!这里,数据在 2D,因此支持向量分类器是一条线(或超平面)。支持向量是边缘上和软边界内的观察值。

注意:为了在将数据转换到更高维度时使数学可行,SVM 使用核函数(线性、径向基函数(RBF)、多项式或 sigmoid)来系统地寻找支持向量分类器。当使用核函数时,该算法计算每一对数据点之间的关系,而无需在更高维度中进行任何转换→也称为核技巧!

总之,支持向量机是一种强大的机器学习算法,并已用于机器学习和数据科学应用!

接下来——如何实现支持向量机?第 2 节:用 Python 构建模型

什么是列表强化学习?

原文:https://towardsdatascience.com/what-is-tabulated-reinforcement-learning-81eb8636f478?source=collection_archive---------30-----------------------

学习如何让你的人工智能自学的第一步

如果你想掌握让你的人工智能在一个不断发展和变化的环境中自学的艺术,列表强化学习是你应该学习的第一个算法。

一般来说,强化学习背后的主要思想是,你有一个代理、环境、状态、动作和奖励。

  • **智能体:**智能体是生活在环境中,接受输入,并执行特定动作的东西。
  • **环境:**环境就是智能体所处的世界。
  • **状态:**状态基本上是代理在特定时刻接收到的所有输入。
  • **动作:**动作是代理可以与其环境交互的所有方式。
  • **奖励/惩罚:**执行一个动作后,奖励给代理。它们只是数字,所以如果代理做了坏事,我们可能会给它-1 的惩罚。如果它做了好事,我们会给它+1 的奖励。

在环境中,我们有一个代理。这个代理从环境中接受某种类型的输入,这个输入就是代理的状态。基于它的状态,代理采取一些行动。此操作将代理带入一个新的状态。根据这种新状态是好是坏,代理人会收到奖励/惩罚。下图有助于形象化这一过程:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意用蓝色书写的事件顺序。环境向代理提供一种状态,代理基于这种状态采取行动,这种行动改变环境并提供奖励/惩罚。图片作者

为了进一步说明这一点,如果你认为自己是一个代理人,那么整个宇宙就是你的环境。你有 5 种感觉或 5 种方式接收输入。在任何特定的时间,你当前的状态就是你所看到的、听到的、闻到的、感觉到的和品尝到的。您根据当前状态执行操作。这些行为最终会导致奖励(也许是升职)或惩罚(被解雇)。这个想法是你将从这些惩罚和奖励中学习,这样你未来的行动将会带来更好的奖励。

用一些行话来说,一集是代理与环境互动的一个完整周期。例如,如果环境是一个井字游戏,一集将是一个井字游戏。

代理内存/值表

当代理与环境交互时,我们可以存储代理所处的所有状态,并为每个状态赋值。一个状态的价值是一个衡量代理人在接下来的一集里可以期望得到多少奖励的指标(目前,理解这在数量上意味着什么并不重要)。一会儿我会解释如何分配正确的值,但是现在,只要知道这是可能的。

例如,假设我们的代理刚刚开始它的第一个游戏井字游戏。环境是游戏井字游戏,它的当前状态是空的游戏棋盘。代理将在它的存储器中存储这个唯一的状态,比如 s0。假设我们的代理采取了一个随机行动,称之为 a0。回想一下,采取一个行动会带来一个新的状态,姑且称之为 s1。现在假设我们的代理人继续和他的对手玩游戏,最后输掉了游戏(此时它会受到某种惩罚)。

既然代理人输了,我们可以说这一集代理人所处的每个状态都有低值。现在假设我们的代理开始了他的第二场比赛并回到 s0。现在,它可以查看它的内存,看看如果采取 a0 动作会发生什么。它将看到动作 a0 将导致状态 s1,该状态 S1 具有较低值,因为它最后一次处于该状态而失败。

由于代理试图获胜,它将只选择将导致具有高值的状态的动作。为了开始游戏 2,代理人避免动作 a0,因为它的值很低,并随机选择另一个动作,比如 a2。再次,代理继续玩;但这次他最终赢了。既然代理赢了,我们可以说第二集时代理所处的每个状态都有很高的值。希望下图有助于可视化这一过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意这些值实际上是数字,接下来我们将开始寻找每个状态的正确数值。图片作者

你可能会发现我们目前的问题。如果行动 a0 真的是最好的行动,并且是在 a0 之后采取的另一个行动导致我们输掉了那场游戏,那会怎么样?现在,如果我们的代理总是回避 a0,它将永远看不到这是最好的行动。为了解决这个问题,我们总是让我们的代理有机会采取一个随机行动。如果我们的代理采取随机行动,它有机会采取 0,并给那个行动另一次机会。我们称之为探索状态空间。我们通常一开始让代理采取完全随机的行动,然后随着时间的推移,我们慢慢减少代理采取随机行动的机会。本页底部链接的井字游戏项目中讨论了一种算法。

代理将继续这个过程,直到它知道在它可能处于的每个状态下应该采取的最佳行动。总而言之,我们实际上只是告诉代理人去尝试每件事,记录发生的每件事,并找出哪些行动导致最佳状态(导致最大回报的状态)。

寻找每个状态的值

为了找到每个状态的正确值,我们首先将每个状态的值设置为 0。

一个状态的正确值等于该集的预期未来总报酬。

请参见下图,以帮助理解这一点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最好从最后一个状态开始。在 S5 中,我们收到了+1 的奖励。因此,S5 的值为 1。现在 S4 没有得到奖励,但它导致 S5 给出+1 的奖励。因此,S4 获得的奖励值+S5 的值,即 0+1=1。同样,V(S3) = R3 + V(S4) = -1+0+1 = 0。一般来说,我们可以说;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个状态的值=在该状态收到的奖励+下一个状态的值

重要的是要认识到,我们是在许多集上采样,所以我们不是将值显式地设置为 Rt + V(St+1),而是将它变成一个迭代过程,只是在 Rt + V(St+1)的方向上迈出一小步。这使我们想到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是我们对上面的函数有一个非常微妙的问题。假设我们用当前值 0 更新状态 V(S1 ), Rt = 0。假设 V(s2) = 1。如果我们对 V(s1)重复应用更新函数,那么它将膨胀到无穷大。

我们可以通过用状态的当前值来抵消我们的更新来解决这个问题(见下文)。这就把我们带到了我们的值更新函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这应该看起来很像梯度下降。如果重复应用该函数,将使状态值收敛到正确值。

为什么我们必须使用价值差异的另一个解释是这样的;我们必须朝着相对于状态的当前值的正确值的方向迈出一小步。

理论部分总结

总的来说,代理从播放几集开始。当它播放这些剧集时,有时它会采取随机的动作来探索状态空间,而其他时候代理会采取任何导致具有最高值的状态的动作。在每个情节之后,我们使用值更新功能更新该情节期间代理所处的每个状态的值,从最后一个状态开始,向后移动到第一个状态。最终,这将引导我们找到每个状态的正确值。如果代理人只采取会导致最高奖励状态的行动,它就已经掌握了游戏(希望如此)。

好了,无聊的事情说够了。如果这一切理论对你来说还是有点模糊,不要着急;真正的学习发生在我们应用这些东西的时候。所以,事不宜迟,让我们建立一个代理,踢屁股在井字游戏!

感谢您的阅读!如果这篇文章在某种程度上帮助了你,或者你有什么意见或问题,请在下面留下回复,让我知道!此外,如果你注意到我在某个地方犯了错误,或者我可以解释得更清楚一些,那么如果你能通过回复让我知道,我会很感激。

2022 年用什么面部识别软件最好?

原文:https://towardsdatascience.com/what-is-the-best-facial-recognition-software-to-use-in-2021-10f0fac51409?source=collection_archive---------0-----------------------

我查了几十个免费和付费的面部识别服务。以下是我学到的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 PexelsAndrea Piacquadio 的原始照片

在广泛研究了人脸识别的最佳软件之后,我得出了一个结论:目前发表的文章几乎都只是从广告中复制粘贴而来。更糟糕的是,这些文章中的大多数都推荐了不再受支持的过时的库和服务。他们建议的一些解决方案甚至不能在现代操作系统上运行!

我保证,这不是那种文章。我尽了最大努力列出了市场上所有现代人脸识别解决方案的综合列表。令人惊讶的是,有一半有前途的免费解决方案在 2020 年才开始积极开发!我发现要充分研究企业的付费解决方案有些困难,因为他们没有为普通人提供太多信息,所以我认为这篇文章对中小型公司,当然还有 DIY 爱好者最有用。

市场上可用的面部识别解决方案的类型

你应该知道的第一件事是,面部识别解决方案种类繁多。其中一些无需机器学习技能即可使用,而另一些则需要更多的时间和专业知识。

我将面部识别服务分为三种类型,每种类型都有自己的优点和缺点。让我们来看看:

  1. **基于软件即服务(SaaS)的面部识别引擎。**在这种情况下,人脸识别服务提供商处理从跟上机器学习技术到管理和支持高负载服务器的一切事务。你所要做的就是通过一个 API 把软件和你的 IT 系统集成起来。尽管有很多优点,这些解决方案也有很多缺点。首先,这是最昂贵的选择,因为一切都由提供商处理。你还需要一个稳定的互联网连接,因为你需要将大量的图像发送到互联网上的某个服务器。还可能存在安全问题,因为你必须将照片发送给第三方公司,并且无法控制他们如何处理这些照片。
  2. 自托管 REST API 解决方案。此类系统既可以部署在本地,也可以部署在云中。他们没有 SaaS 产品的问题。您将数据存储在自己的服务器上(或您的私有云),因此您可以控制数据的去向,您甚至可以创建一个离线工作的系统。当然,作为交换,你也必须自己管理服务器。但是在大多数情况下,服务器是作为 docker 容器交付的,所以很容易编排它们。自主托管的解决方案虽然没有 SaaS 同行那么贵,但仍然相当昂贵。幸运的是,免费和开源的自托管 REST API 解决方案开始出现。它们不像其他解决方案那样成熟,但是非常有前途。
  3. **开源框架和库。**这些通常是免费的,因为许多研究人员很乐意发布他们最先进方法的代码。当然,你至少需要一些机器学习的经验来使用这种软件。如果您想将这些解决方案与您的定制应用程序集成,您还需要花一些时间来重新定义它。好的一面是,你会得到一个你里里外外都了解的最先进的解决方案。

如你所见,了解你的资源很重要。人脸识别对于普通人来说曾经是非常昂贵的。有一些服务可以从每天 86.40 美元开始,或者每年高达 30,000 美元,用于从流媒体视频进行面部识别(参见下面的单个解决方案的价格)。这可能就是为什么我们只在政府或大公司使用人脸识别时才听说它。

但是这已经不像以前那样是个问题了,因为有越来越多的免费选择。它们处于不同的成熟阶段,但它们不仅仅是针对利基爱好者的;它们可供中小型企业使用。

在我们开始比较最好的面部识别软件之前,我想澄清一下,我已经选择准确度作为我研究的一个关键参数。解决方案可以使用大量的基准来证明它们的高标准。正如每年都有新的人脸识别解决方案进入市场一样,性能基准也在不断变化。因此,通常很难将两年前的解决方案与新方案进行比较。然而,有一个非常古老,但仍然流行的基准:野生标签脸 (LFW)。幸运的是,我们列表中的所有解决方案都共享了这个基准测试的结果,所以我能够比较它们的准确性。

这个按字母顺序排列的免费未来解决方案列表将帮助您开始。

2022 年最佳免费面部识别软件解决方案

  1. Ageitgey/face _ recognition(GitHub 资源库)

这可能是最受欢迎的免费人脸识别库,因为它在 GitHub 上有 45k 颗星。使用它有两种选择;您可以使用他们的 Python API 或二进制命令行工具。有所有主要平台的安装说明,甚至还有一个 docker 镜像,用于快速设置。虽然它的流行有很好的理由,但如果你想使用它,你必须考虑严重的缺点。首先,最后一次发布是在 2018 年(在 AI 世界中三年是很多的),库中仍有提交,但看起来没有大的改进。其次,它使用了一个非常过时的人脸识别模型,在 LFW 上的准确率只有 99.38%(2022 年我们可以做得更好)。最后,与这个解决方案集成并不容易,因为它没有 REST API。

2.压缩

这个解决方案在 2020 年 7 月才在 GitHub 上发布,只有大约 2000 颗星星,但它看起来非常有前景。CompreFace 是这个列表中为数不多的自托管 REST API 人脸识别解决方案之一——您只需使用一个 docker-compose 命令就可以启动它。因为它有一个 REST API,实现它不需要你是机器学习工程师;将它集成到您的系统中非常容易。该解决方案是可扩展的,因此您可以同时识别几个视频流中的人脸。CompreFace 也有一个简单的 UI 来管理用户角色和面孔集合。它提供了两种最流行的人脸识别方法之间的选择:FaceNet (LFW 准确率 99.65%)和 InsightFace (LFW 准确率 99.86%)。截至 2022 年年中,最新版本为 1.0.0。

3.深脸

这个框架于 2020 年 2 月发布在 GitHub 上,已经有大约 4100 颗星,可能是因为它与脸书的 DeepFace 人脸识别方法同名。该库还支持不同的人脸识别方法,如 FaceNet 和 InsightFace(其中,FaceNet 和 InsightFace 是最准确的)。它还提供了一个 REST API,但是它只支持 verify 方法,所以你不能创建人脸集合并在其中找到你的人脸。即使如果你是 Python 开发人员,这很容易开始,但对于其他人来说却很复杂。截至 2022 年年中,最新版本为 0.0.75。

  1. FaceNet

FaceNet 是由谷歌研究人员和实现它的开源 Python 库创建的人脸识别方法。该库有 12,600 个星星,许多“如何做”的文章将其作为基础库。尽管这种方法非常古老,但一些新的研究人员仍在使用它(最近用于戴面具的人脸识别)。这种方法的准确率相当高(在 LFW 数据集上达到 99.65%,这肯定不差,但不是顶级的)。这种解决方案的缺点是它没有 REST API,并且不再支持存储库(最近一次主要更新是在 2018 年 4 月)。

5.洞见脸

InsightFace 是另一个开源的 Python 库,有 12100 颗星。它使用了一种最新、最准确的方法来进行人脸检测( RetinaFace )和人脸识别( SubCenter-ArcFace )。截至 2022 年年中,这个存储库非常活跃。这个解决方案也非常准确,在 LFW 数据集上达到 99.86%。唯一的缺点就是不好用。如果您正在寻找使用 InsightFace 的解决方案,提供更方便的 REST API,并且可以从 docker 容器运行,请尝试 CompreFace 和 InsightFace-REST。

  1. InsightFace-REST

这是 2019 年创建的另一个有前途的存储库,尽管 2020 年 10 月才开始积极开发。和 CompreFace 一样,这是一个基于 docker 的解决方案,提供了一个方便的 REST API。最大的好处是开发者将 InsightFace 的识别速度提高了三倍!这种解决方案的缺点是,它们只提供人脸嵌入,没有给出实际人脸识别的 API,所以你需要有自己的分类器。此外,该库仍然没有许可证,所以您需要询问作者是否可以使用它。截至 2022 年年中的最新版本是 v0.7.0.0。

以上介绍了人脸识别的最佳软件解决方案,当然还有付费选项。由于它们不是开源的,通常很难对它们进行比较——你不知道它们使用的是哪种方法,而且它们通常不会在公共数据集上提供它们的准确性。

因此,我试图收集关于定价计划、附加服务和每个解决方案支持的集成 SDK 语言的信息(当您需要将服务合并到您的应用程序时,这非常有用)。

与免费识别解决方案一样,我并没有盲目地列出我碰巧找到的所有公司。我只在解决方案的登录页面和其他文档中包含了具体的信息。我甚至尝试为他们注册,看看还有什么其他信息可以打开。如果仍然没有足够的信息来进行有效的比较,我就把它们从这个列表中去掉。

2022 年收入最高的面部识别软件(按字母顺序排列)

1.亚马逊认知

亚马逊 Rekognition 提供了为期 12 个月的慷慨免费试用计划,并在其 SaaS 版本上每月提供 5000 次免费识别。不清楚是否有自托管版本。如果您使用他们提供 SDK 的三种编程语言(Java、.Net 和 Python)。价格取决于每月的识别次数,每 1000 次识别收费 1 美元。亚马逊还提供一系列附加服务,如情绪识别、地标检测、年龄估计和性别识别。

2.深度视觉 AI

Deep Vision AI 提供 SaaS 和自托管版本。但由于网站上没有定价信息,我假设他们只与企业级公司合作。没有关于他们为哪些编程语言提供 SDK 的信息。除了人脸识别,还有年龄估计和性别识别服务。

3.面对面

几乎没有关于 FaceFirst 的可用信息,尽管它经常出现在最佳人脸识别服务的列表中。我假设他们只与企业合作,并且只有一个自托管版本。他们确实提供年龄估计服务。

  1. Face++

Face++有一个不同寻常的免费计划——他们提供无限的请求,但每秒只有三个,并且在所有免费用户之间共享,所以不能保证你的应用程序在任何给定的时刻都能工作。你还应该知道,付费请求的费用是其他领先服务的两倍——亚马逊和微软的 1000 个识别都是 1 美元。然而,Face++支持最多种 SDK——Python、PHP、Java、Javascript、C++、Ruby、iOS 和 Matlab——并且有许多附加服务(情感识别、地标检测、年龄估计和性别识别)。它们还支持 SaaS 版本和自托管版本。但你需要考虑到,截至 2022 年年中,Face++的母公司旷视科技因使用其技术侵犯新疆维吾尔人的人权而受到美国政府的制裁。

  1. FaceX

FaceX 是印度的一家新公司,成立于 2018 年,提供 SaaS 和自托管版本。他们没有免费计划,只提供每月订阅价格,每天 300 次,每月 15 美元。我没有找到任何关于编程语言 SDK 的信息,但 FaceX 附带了各种附加服务,如地标检测、年龄估计和性别识别。

6.凯罗斯

Kairos 提供 14 天的免费试用,但它的最大限制是 10,000 个请求。之后,您将需要支付每月 19 美元和每 1,000 次识别 20 美元的订阅费,这与他们的竞争对手相比是相当多的。好处是他们提供了 PHP、JS、.Net 和 Python 语言以及附加服务,如地标检测、年龄估计和性别识别。他们还提供 SaaS 版本和自托管版本。

7.机器箱

Machine Box 的非商业使用许可非常有趣——他们提供了一个自托管的解决方案,只要你在人脸集合中只保存 100 个人脸,这个解决方案就是免费的。它的另一个优势是用于 Go 语言的 SDK,当然,如果你使用 Go,这只是一个优点。只有当你有商业许可证时,它才是可扩展的。由于这个解决方案是我唯一测试过的自托管解决方案,我可以说它非常容易启动和集成。免费版本看起来甚至比一些开源人脸识别解决方案更简单,这些解决方案提供了可扩展性并允许商业使用。

8.微软 Azure 认知服务 Face API

微软提供了一个非常慷慨的免费计划——你可以每月进行 30,000 次免费请求,每分钟最多 20 次。请记住,在这种情况下没有 SLA。对于付费请求(使用 SLA),价格取决于每月的识别次数,每 1,000 次识别收费 1 美元。支持的 SDK 还挺多的:。Net,Python,Java,Node.js,还有 Go。微软提供 SaaS 和自托管版本,以及许多附加服务,如情感识别、地标检测、年龄估计和性别识别。

  1. Paravision

Paravision 是一家面向企业的人脸识别公司。他们只提供自托管的解决方案,如果他们有额外的服务,他们不会说这样或那样的方法。Paravision 有 C++和 Python 的 SDK。像往常一样,这类公司没有关于定价的信息。

  1. Trueface

Trueface 是另一家服务于企业的人脸识别公司。他们只提供自托管的人脸识别解决方案,具有地标检测、年龄估计和性别识别等附加功能。支持的 SDK 是针对 C++和 Python 的。Trueface 的定价也是个谜。

最后的想法

人脸识别行业在 2022 年中期仍在积极发展。人脸识别算法越来越精确,所以使用不再受支持的旧服务没有任何意义。由于新的开源解决方案,使用人脸识别软件变得越来越便宜。使用这项有前途的技术的机会很多,尽管比较它们可能很困难,但肯定会有适合你的选择。

用 tf.keras 训练图像分类模型的最佳输入管道是什么?

原文:https://towardsdatascience.com/what-is-the-best-input-pipeline-to-train-image-classification-models-with-tf-keras-eb3fe26d3cc5?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像取自像素

Keras 的 ImageDataGenerator、TensorFlow 的 image_dataset_from_directory 和各种 tf.data.Dataset 管道之间的比较

当我们开始学习如何用 Keras 构建深度神经网络时,我们用来输入数据的第一个方法是简单地将数据加载到 NumPy 数组中。在某些情况下,尤其是在处理图像时,数据太大而无法容纳在内存中,因此我们需要数组的替代方案。根据我的经验,这个问题的最佳解决方案是使用 Keras 内置的工具,名为 ImageDataGenerator 。这创建了一个 Python 生成器,它将数据逐渐馈送到神经网络,而不将数据保存在内存中。此外,它包括数据扩充功能,使其成为一个非常有用的工具。

这可能是故事的结尾,但在研究图像分类一段时间后,我发现了创建图像输入管道的新方法,据称这些方法更有效。本文的目标是运行一些实验来找出最佳的方法。主要参赛者是:

  • tf.keras.preprocessing.image.ImageDataGenerator
  • tf.keras.preprocessing.image_dataset_from_directory
  • tf.data.Dataset用图像文件
  • tf.data.Dataset带 TFRecords

所有实验的代码都可以在这个 Colab 笔记本里找到。

实验装置

为了对管道进行公平的比较,它们将用于执行完全相同的任务:微调一个efficient B3模型,以对两个不同数据集中的图像进行分类。在描述数据集之前,这里是所使用的训练管道,受到本教程的强烈启发。

函数来创建迁移学习的高效 NetB3 模型

这段代码简单地采用了一个预先训练好的 EfficientNetB3 ,并在其上添加了一个具有正确数量神经元的分类层。然后,用每种测试方法对该模型进行 5 个时期的训练,批次大小为 32。实验是在 Google Colab 上完成的,使用的硬件是 Colab Pro。TensorFlow 使用的版本是2.4.1

用于测试管道的第一个数据集是仅包含水果图像的开放图像数据集 [1]的子集。第二个是斯坦福狗数据集[2–3],里面有各种狗的图片。这是两个数据集的摘要:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试中使用的两个数据集的描述

数据集差别很大,因为一个数据集有少量图像较大的类。colab 中提供了下载和准备这些数据集的代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

斯坦福狗数据集中的狗图像示例

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

开放图像数据集中的水果图像示例

结论

由于本文的其余部分花了大量的时间来解释不同的输入管道,并且有些人可能只关心结论,所以这里是所有实验的总结:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用水果数据集获得的结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 dogs 数据集获得的结果

数字清楚地表明,就速度而言,首选解决方案图像数据生成器远非最优。继续使用它的唯一原因可能是因为这种方法的数据扩充非常简单。然而,使用其他方法并不困难,如果速度有很大的提高,这是值得的。

在我看来,image _ dataset _ from _ directory应该是的新首选,因为它并不比旧方法更复杂,而且速度明显更快。

使用 tf.data.Dataset 构建我们自己的输入管道可以提高一点速度,但也有点复杂,所以使用与否是个人的选择。

关于 TFRecords,似乎如果不使用 TPU,就没有必要使用它们,因为直接使用图像文件对性能没有影响。

最佳解决方案似乎是使用带有 TPU 的 TFRecords,考虑到速度的提高,额外的麻烦是值得的。准确性的下降只是因为不同的超参数组合对 TPU 有效,但测试使用的是 GPU。与其他方法相比,使用正确的超参数可以获得相似的精度。

图像数据生成器

现在让我们进入每种方法的细节,从对卫冕冠军的回顾开始,这非常简单。

函数使用 ImageDataGenerator 方法为神经网络定型

Keras 方法将数据存储在一个文件夹中,每个子文件夹对应一个单独的类。在本例中,它自动调整图像大小并创建批处理。标签是根据子文件夹名称生成的。“稀疏”格式用于具有形式为0,1,2,3,...的标签,因为稀疏度量用于模型构建。

这种方法的主要优点是极其简单,并且可以通过在参数中指定变换(旋转、翻转、缩放等)来简单地进行数据扩充。

图像数据集来源目录

下一个选项也很简单,也包含在 Keras 中。

使用 image_dataset_from_directory 方法训练神经网络的函数

数据的格式与第一种方法相同,图像再次被调整大小和批处理,并且标签被自动生成。然而,不存在动态进行数据扩充的选项。

这种方法的主要区别在于输出不是 python 生成器,而是一个tf.data.Dataset对象。这使得它能够很好地与下面讨论的其他流水线工具相适应。例如,这里进行的数据预取有助于加快计算速度。使用 TensorFlow 进行的任何形式的数据扩充都可以在这种数据集上进行。它不太简单,但是更加可定制。

tf.data .数据集

TensorFlow 建议在使用库时使用 tf.data 以获得最佳性能。这是一组工具,用于创建由张量组成的数据集,对数据应用变换,并迭代数据集以训练神经网络。它适用于任何类型的数据,如表格、图像或文本。数据可以通过多种方式导入。最常见的有 NumPy 数组、python 生成器、CSV、TFRecords 和 strings。更多细节可以在 Tensorflow 的网站上找到。

让我们首先展示用于图像分类这一特定情况的代码,然后解释它是如何工作的。

使用 tf.data.Dataset pileline 加载图像数据的函数

这里完成的第一步是在将数据馈送到 TensorFlow 之前正确格式化所需的数据。这里使用的格式是每个图像的一个文件路径和一个整数标签。这个过程在第 19–22 行完成。不要忘记打乱图像列表是非常重要的,因为这会极大地影响模型的性能。相信我……

**注意:**另一种方法是使用tf.data.Dataset.list_files直接获取文件列表。这样做的问题是,必须使用张量流运算来提取标签,这是非常低效的。这大大降低了流水线的速度,所以最好用纯 python 代码来获取标签。

标签部分很简单,因为标签列表使用方法from_tensor_slices转换为数据集,该方法转换任何类似张量的对象(numpy 数组、列表、字典)。文件名列表也使用相同的方法转换为数据集。

下一步是使用map方法将parse_image函数应用于文件名数据集,该方法将张量流函数应用于数据集的所有元素。这个特殊的函数从文件中加载图像,如果需要的话将转换为 RGB 格式,并且调整的大小。num_parallel_calls参数被设置为由 Tensorflow 自动修复,以尽可能提高速度。

一旦数据集的两个部分完成,就使用zip方法将它们组合,这类似于同名的 python 函数。

最后一步是确保数据集可以被正确迭代以训练神经网络。这是用configure_for_performance函数完成的,它直接应用于整个数据集,所以不需要使用map。该函数的第一部分执行洗牌。这一个的目标是获取接下来的 X 个图像,其中 X 是缓冲区大小,并在每次我们经过数据集时混合它们,这确保了在训练的每个时期数据被不同地混洗,但是由于为了性能的缘故,缓冲区大小必须很小,所以它不会取代整个数据集的原始混洗。然后数据被分批分离,然后永远重复。最后一步是预取一些数据,它预加载了将来要使用的数据,以帮助提高性能。

整个管道的输出是一个由张量组成的数据集。为了帮助可视化它,我们可以用下面的方法迭代它:

for image, label in ds.take(1):
    print(image.numpy())
    print(label.numpy())

数据是张量形式的,因此为了简单起见,必须将其转换成通常的数组。重要的是要理解,即使从数据集中取出一个元素,也有 32 个图像被加载,因为在这种情况下一个元素对应于一个批次

这个数据集可以直接用于训练神经网络,就像其他方法一样。

使用 tf.data.Dataset 输入管道为神经网络定型的函数

唯一新的(也是非常重要的)东西是steps_per_epoch论点。由于数据集是无限重复的,TensorFlow 需要知道一个历元对应多少步。这基本上是图像总数除以批量大小,由于最后一批通常不完整,所以向上取整。

更进一步

如上所述,用tf.data数据扩充并不难。唯一的额外步骤是对结果数据集应用一个新的张量流函数,比如tf.image.flip_left_right。这可以随意定制,这里讨论

有了足够小的数据集,cache方法使得训练速度格外快,因为数据在第一个历元之后就保存在内存中。对于较大的数据集,可以将数据缓存到一个文件中,或者使用一种叫做快照的东西,但是我没有探究其中的任何一种。

TFRecords

输入管道链中的最后一个复杂性跳跃涉及到将图像保存为 TensorFlow 记录格式。这是一种特别适合 TensorFlow 的文件格式,因为它以二进制格式存储对象,所以训练模型的速度更快,特别是对于大型数据集。本节将描述图像分类的细节,但是 TensorFlow 页面清楚地说明了 TFRecords 通常是如何工作的。

写入 TFRecords

下面是用于将图像数据集转换为 TFRecords 的代码。

将图像数据保存为 TFRecords 格式的函数

make_tfrecords功能的大部分与之前使用的数据准备步骤非常相似。由文件路径和整数标签组成的随机化数据是使用简单的 python 代码找到的。唯一不同的是完整图像被加载并保存在 TFRecords 中。TFRecordWriter方法用于写入文件。

创建 TFRecords 所需的唯一主要附加功能是在serialize_example函数中。每个数据点都必须转换成特征,存储在字典中(第 7-10 行),然后转换成示例(第 12 行),最后写入字符串(第 13 行)。这是 TFRecord 文件包含的内容。这个过程初看起来很复杂,但实际上对于所有可能的情况都是一样的。

这种工作方式有许多优点。所有这些处理只需执行一次,并且数据为将来的任何训练做好准备。它也更容易共享,文件越小越少。像调整大小这样的变换可以在之前完成,并保存下来供以后训练使用,这样可以提高速度。对于较大的数据集,TFRecords 可以分割成多个较小的文件,称为碎片,以使训练更快。

正在读取 TFRecords

一旦理解了上面的tf.data.Dataset部分,阅读 TFRecords 就很容易理解了。事实上,过程几乎完全相同。数据是从 TFRecords 文件而不是从图像文件加载的,但后续处理是相同的。

函数加载保存在 TFRecords 文件中的数据

数据集首先在read_dataset中通过方法TFRecordDataset读取 TFRecords 文件进行初始化。然后应用_parse_image_funtion将 TFRecords 的内容转换回图像和标签。这是在第 2–7 行中完成的,其中用于创建 TFRecords 的字典用于告诉 TensorFlow 内容应该对应于什么。其余步骤与之前的处理完全相同。

这里介绍一个小细节,因为它对于下一节出现在配料步骤中是必要的。额外的参数drop_remainder用于丢弃未满的最后一批。这意味着为了完成一个时期,通常少了一个步骤,这必须在训练部分的steps_per_epoch参数中改变。

使用 TFRecords 训练神经网络的函数

如何使用 TPU

在我看来,值得熟悉 TFRecords 的主要原因是能够使用 Colab 的免费 TPUs 。这些比 GPU 快得多,但使用起来更复杂。这不像切换运行时那么简单,所以我在这里描述如何做。不必使用 TFRecords,但强烈建议使用。

第一个障碍是在 TPU 上运行时,TensorFlow 2 无法读取本地文件。这个问题通过将数据保存在谷歌云存储中得以解决。每个谷歌账户都可以免费存储大量数据,所以这不是什么大问题。使用 Colab 和 TensorFlow 时,在 GCS 上保存数据也非常简单。唯一需要的特殊步骤是验证你的谷歌账户。

将您的 Google 帐户连接到 colab 的代码

如果您的帐户通过了身份验证,使用与之前完全相同的函数来创建 TFRecords,但是使用了一个 GCS bucket link (形式为 gs://bucket-name/path )来完成这个任务。TensorFlow 足够聪明,能够识别路径来自 GCS,并知道如何读取和保存那里的数据。需要注意的是,由于需要本地文件,因此无法在 TPU 上保存数据。保存数据必须用 CPU/GPU 完成,然后是时候切换到 TPU 进行训练了。

除了数据存储之外,使用 TPU 进行训练的唯一主要区别是需要向管道中添加少量代码(第 10-15 行)。

使用 TPU 训练神经网络的函数

出于某种原因,批次必须满才能使用 TPU,这就是为什么上面使用了drop_remainder参数。同样值得注意的是,使用自动 TPU 时,建议使用更大的批量。这些大批量数据会导致 GPU 崩溃,但实际上会提高 TPU 的性能。对于其他超参数也可以说是类似的事情。TPU 是不同的动物,所以超参数与 CPU/GPU 使用的超参数的不同组合通常是最佳的。

最终意见

实验的结论已经在上面讨论过了,所以在结束之前,我想强调一下我在整个过程中学到的一些东西。第一个是现在属于 Tensorboard 的 剖析器 。这是一个非常有趣的工具,有助于找到培训管道中的瓶颈。当我试图使用 TensorFlow 函数转换图像标签时,我就是这样发现自己做错了。数据管道中的这一特定步骤占用了总训练时间的 73%,这是难以置信的高,所以我找到了一种方法来修复它。对于 dogs 数据集,训练时间从每历元 200 秒以上下降到仅 45 秒。如果没有分析器,我根本不知道问题出在哪里。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

错误输入管道的示例,如探查器所示

另一个看起来很重要的细节,尤其是在使用 TPU 时,是将map方法并行化。与其他可能的改进相比,这是迄今为止最有效的一个。

接下来,如上所述,洗牌数据极其重要。这更多地与神经网络训练背后的数学有关,而不是与数据管道有关,但是我看到仅仅通过正确地混合数据就增加了 10 个精度点。

最后,本文中没有提到的一个细节是关于数据的标准化。事实上,当训练时,将图像的像素除以 255 以仅具有 0 和 1 之间的值是常见的。然而,在这种情况下,标准化步骤似乎包含在 EfficientNetB3 模型本身中,因此输入必须是原始像素。正如我在意识到这一点之前所看到的,这个小细节在性能上产生了巨大的差异!

参考

[1] Kuznetsova,a .,Rom,h .,Alldrin,N. 开放图像数据集 V4。Int J compute Vis1281956–1981(2020)。https://doi.org/10.1007/s11263-020-01316-z

**[2] Aditya Khosla、Nityananda Jayadevaprakash、姚邦鹏和李菲菲。**用于细粒度图像分类的新型数据集。2011 年 IEEE 计算机视觉与模式识别会议(CVPR) 第一届细粒度视觉分类研讨会。

[3]邓,董,索彻,李,李和,ImageNet:一个大规模分层图像数据库。IEEE 计算机视觉和模式识别(CVPR),2009 年。

Python 中的 append 和 extend List 方法有什么区别?

原文:https://towardsdatascience.com/what-is-the-difference-between-append-and-extend-list-methods-in-python-a29dc21f8076?source=collection_archive---------26-----------------------

探索如何在 Python 中追加或扩展列表

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

汤姆·威尔逊在 Unsplash 上的照片

介绍

列表可能是 Python 中最常用的数据结构,因为它们的特性适合许多不同的用例。由于这种特殊的对象类型是可变的(也就是说,它可以被就地修改),所以添加或删除元素更加常见。

在今天的文章中,我们将探讨两个内置列表方法append()extend()之间的区别,这两个方法可用于通过向列表对象添加更多元素来扩展列表对象。最后,我们还将讨论如何在列表中的特定索引处插入元素。

Python 列表简单明了

列表是一个 Python 数据结构,它是一个由有序的可变的项目集合。每个元素可以是任何类型——内置 Python 类型或自定义对象,而单个列表可以包含不同类型的项目。

lst = ['Hello World', 10, 5.0, True]

由于列表项可以是任何类型,这意味着它们也可以是列表对象(即嵌套列表)。例如,列表的列表将如下所示。

lst = [[1, 2, 3], [4, 5, 6]]

如前所述,列表是有序的,这意味着指定元素的顺序一直保持不变。这意味着只有当两个列表以相同的顺序包含相同的元素时,才认为它们是相等的。

>>> [10, 20] == [20, 10]
False

列表中的每一项都可以通过其索引访问。

>>> my_lst = ['foo', 'bar]
>>> my_lst[0]
'foo'
>>> my_lst[1]

如果您想了解更多关于有序集合(如列表)的索引和切片,请务必阅读下面的文章。

因为 Python 列表是可变的,所以它们可以按需扩展或收缩。换句话说,您甚至可以在特定的索引中插入或删除元素。在接下来的几节中,我们将探讨两种内置的 list 方法,它们可以用来向现有的 list 对象中添加更多的元素。

append()做什么

list.append()用于将一个项目添加到列表的末尾。

>>> my_lst = [1, 2, 3]
>>> my_lst.append(4)
>>> my_lst
[1, 2, 3, 4]

方法会将列表的长度增加 1。这意味着如果append的输入是一个元素列表,那么列表本身将被追加,而不是单个元素:

>>> my_lst = [1, 2, 3]
>>> my_lst.append([4, 5])
>>> my_lst
[1, 2, 3, [4, 5]]

extend()是做什么的

另一方面,extend()方法接受一个 iterable,它的元素将被追加到列表中。例如,如果extend()的输入是一个列表,它将通过迭代输入列表的元素将第一个列表与另一个列表连接起来。这意味着结果列表的长度将随着传递给extend()的 iterable 的大小而增加。

>>> my_lst = [1, 2, 3]
>>> my_lst.extend([4, 5, 6])
>>> my_lst
[1, 2, 3, 4, 5, 6]

在特定索引中添加元素

insert()方法可用于在特定索引处插入列表项。

>>> my_lst = [1, 2, 3]
>>> my_lst.insert(1, 4) # Add integer 4 to index 1
>>> my_lst
[1, 4, 2, 3]

append()方法一样,insert()只会增加一个列表的长度。

>>> my_lst = [1, 2, 3]
>>> my_lst.insert(1, [1, 2])
>>> my_lst
[1, [1, 2], 2, 3]

最后的想法

在今天的文章中,我们讨论了 Python 列表的主要特征,它们是有序的可变的项目集合。我们讨论了如何通过append()extend()向现有的列表对象中添加更多的元素。前者将给定元素添加到列表的末尾,方法是将列表的长度增加 1。后者将迭代给定的输入,并将每个单独的元素添加到列表中,这意味着。最后,我们探索了如何使用insert()方法在列表的特定索引处插入元素。

你可能也喜欢

https://levelup.gitconnected.com/what-are-python-sets-59eb890ab522

Python 中的“是”和“==”有什么区别

原文:https://towardsdatascience.com/what-is-the-difference-between-is-and-in-python-999aed3a54f7?source=collection_archive---------25-----------------------

如何比较两个变量是否指向内存中的同一个对象

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·温克勒在 Unsplash 上拍摄的照片

Python 附带了两个可用于检查相等性的操作符,即==(这在大多数现代编程语言中相当常见)和is。有时可能很难区分应该使用两者中的哪一个,尤其是如果您不熟悉 Python 的动态类型模型。

在今天的文章中,我们将讨论 Python 中的==is操作符在比较两个变量或对象时的用途。此外,我们将通过一个示例来展示何时使用其中一个。

Python 中的对象、变量和引用

每次我们将对象值赋给一个变量时,都会执行以下操作:

  1. 保存该值的对象被创建并存储在内存中
  2. 变量名被创建(如果它还不存在)
  3. 对保存已创建对象的内存位置的引用被赋给变量

Python 变量并不真正保存对象。相反,它们实际上持有对对象的引用。换句话说,变量指向内存中已经被分配来存储相应对象的位置。

有时我们可能需要检查两个对象是否具有相同的值,而在其他场合我们可能需要检查两个对象是否完全相同。在下一节中,我们将探讨如何实现这两者。

“是”和“==”的区别

现在,如果你想执行两个变量之间的相等性检查,很可能你真的想检查两个变量是否指向具有相等值的对象。在其他情况下,您可能也需要检查两个变量是否指向同一个对象。

  • ==运算符用于检查两个变量是否引用具有相同值的对象。
  • is运算符用于检查两个变量是否指向内存中的同一个对象

现在假设我们有两个列表,如下所示。

a = [1, 2, 3]
b = [1, 2, 3]
  • ==将返回True,因为ab指向具有相等值的对象。
>>> a == b
True
  • 另一方面,is将返回False,因为ab没有指向同一个对象。尽管两个对象的值相等,但它们并不相同,因为 Python 将它们存储在内存中的不同位置。
>>> a is b
False

ab的存储位置不同:

>>> id(a)
4444232832
>>> id(b)
4445118624

现在,如果我们将a赋给变量b,那么is将返回True,因为两个变量都指向内存中完全相同的对象:

>>> a = [1, 2, 3]
>>> b = a
>>> a is b
True

现在,内存地址应该完全相同:

>>> id(a)
4444232832
>>> id(b)
4444232832

重要说明

is如果与指向小整数的变量一起使用,即使两个变量是独立初始化的,操作符也可能返回True

>>> a = 1
>>> b = 1
>>> a is b
True

这是 Python 的一个实现细节,出于性能目的缓存小的整数值或字符串文字

请注意,对于较大的整数值或字符串,is运算符应该表现正常:

>>> a = 10**5
>>> b = 10**5
>>> a is b
False

最后的想法

在今天的文章中,我们讨论了如何在 Python 中检查对象相等性。我们简要讨论了 Python 中如何处理对象、引用和值。此外,我们探索了is==操作符之间的根本区别。前者可用于检查两个变量是否保存对存储在特定内存位置的同一对象的引用。另一方面,==用于检查两个变量是否指向具有相同值的对象引用。

在文章的开始,我们快速讨论了 Python 中对象、引用和值是如何处理的。如果您想了解更多关于这些概念和 Python 实现的动态类型范例,请务必阅读文章Python 中的动态类型。

离群点检测和数据漂移检测有什么区别?

原文:https://towardsdatascience.com/what-is-the-difference-between-outlier-detection-and-data-drift-detection-534b903056d4?source=collection_archive---------26-----------------------

简单解释了一下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

当我们构建显然是,一个监控 ML 模型的开源工具时,我们花了很多时间来回答关于生产、监控和系统设计中 ML 的问题。有些问题反反复复!

我们决定以机器学习问答的形式写下一些东西。期待可视化的解释者,无论是高层次的还是深层次的。

如果你想问你的问题,欢迎来到我们的社区服务器

这是第一个。

离群点和数据漂移检测有什么区别?

在生产中监控 ML 模型时,我们可以应用不同的技术。

数据漂移和离群点检测就是其中之一。当我们还没有地面真相标签时,两者都是有用的。数据是唯一需要关注的东西。

有各种统计方法来检测这两种情况(这本身就是一个有趣的讨论!),而且还是一个原则上的区别。

焦点:整个数据集与单个对象

当我们谈论漂移检测时,我们关注整个数据集中的“全局”数据分布。我们想知道与过去的时期或模型训练相比,他们是否有显著的变化。

我们执行漂移分析来测试这是否成立。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

数据漂移可能看起来像是对象属性的逐渐变化。在这个简化的例子中,我们将观察到特征“颜色”和“位置”的分布变化,而“形状”和“大小”保持一致。

假设所有特性都非常重要,这听起来像是我们必须做出的反应!例如,通过重新训练模型,使其学习新的模式。

当我们搜索异常值时,我们希望在输入数据中找到单个的"不寻常的或"不同的"对象。这些对象可能会不时出现在培训和生产数据中。我们称之为异常或异常值——暗示这是我们很少预料到的事情。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

在这个例子中,一些对象会很突出,因为它们的“形状”、“位置”、“大小”或“颜色”与其余的非常不同。

例如,我们可能想要检测它们并将其发送给人工审查。

数据漂移和异常值可以独立存在。整个数据集可能会在没有异常值的情况下漂移。在没有数据漂移的情况下,单个异常值可能很容易出现。

说到监控,我们可能希望同时关注这两个方面。我们对他们每个人都有不同的期望和工作流程。

决策:我能相信模型还是我能相信预测?

当我们监控漂移时,我们的目标是决定我们是否可以信任模型仍然如预期的那样运行。假设是,如果数据分布与模型被训练的数据分布相似,那么它应该总体表现良好。

如果分布已经改变,整个系统可能需要更新。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

如果我们怀疑漂移,我们在模型层面上采取行动:使用新数据重新训练它,完全重建它,或者对所有模型输出应用一些业务逻辑。

当我们监控异常值时,我们的目标是决定我们是否可以信任模型在特定输入上表现良好。假设是,如果特定对象离模型知道的一切“太远”,那么这次它很可能不会做出非常好的预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

如果我们发现异常值,我们在单个对象的层次上采取行动:请人类专家而不是模型来做决定,或者为这个特定的输出应用一些业务逻辑。

这些差异也会影响我们设计每种情况下的检查方式。

测试设计:稳健性与敏感性

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

我们希望漂移检测器对异常值具有鲁棒性。

例如,如果有一个中断的输入,它不应该发出警报。只有当我们看到“足够多”的变化时,它才会做出反应。

这通常可以通过选择正确的统计检验来比较单个特征的数据分布来实现:例如 Kolmogorov-Smirnov、Anderson-Darling 或卡方检验。对于何时选择哪种测试,仍然存在许多细微差别。我们正在为选择合理的默认值,显然开源库可以解决这个问题。

另一方面,我们希望异常值检测器足够灵敏。

当单个对象看起来“奇怪”时,甚至在变化累积并达到临界质量之前,它就应该发出警报。我们可能会选择不同的测试,如隔离森林算法或一类 SVM。

当单个模型错误的成本很高时,异常值检测通常很重要。我们可能会容忍一些假阳性警报来执行额外的抽查。

测试应用程序:一个、两个或都不

我们总是需要两种测试吗?不完全是。

**有时我们可能只关注数据漂移。**例如,我们将使用测试来决定何时开始标记新数据以更新模型。

否则,如果单个模型误差的成本不是太高,我们可能会很好,如果我们的预测偶尔由于离群值而偏离。

**有时我们只会检查异常值。**例如,我们将使用异常值检测来决定何时依赖基于规则的响应,而不是模型预测。

然而,我们可能并不总是需要漂移检测。我们通常将它作为模型质量的代理来检查。例如,如果我们必须等待地面真相标签。但是如果标签很快到达,我们可以计算真实的模型质量,比如准确性或平均误差。漂移检查是额外的。

总结

漂移和异常值检测都有助于监控机器学习模型的生产性能。

我们并不总是需要它们,但可能会选择运行一项或两项检查。各有各的特点。

数据漂移检测有助于定义输入数据的总体分布何时发生变化。我们设计的这个测试对异常值是稳健的,因此它只对有意义的变化发出警报。我们通常会通过重新训练或更新模型来应对漂移。

异常值检测有助于检测个别异常数据输入。我们设计这种测试足够灵敏,可以捕捉到单一的偏差输入。我们通常会通过应用一些业务逻辑或手动处理这个单独的对象来做出决定,从而对异常值做出反应。

**有关于生产机器学习的问题吗?**加入我们的 Discord 社区,在 #ds-ml-questions 频道提问。

本博客最初发表于https://evidentlyai.com。感谢我的共同创始人Emeli Dral共同撰写了这篇文章。

在 appeally AI,我们创建了开源工具来分析和监控机器学习模型。在 GitHub 上查看我们的 项目,喜欢就给它一颗星!

想留在圈子里吗?

统计分析的目标是什么?

原文:https://towardsdatascience.com/what-is-the-goal-of-a-statistical-analysis-e9b794a4d860?source=collection_archive---------15-----------------------

管理层找到你,让你对他们的数据进行统计分析。你是做什么的?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查尔斯·德鲁维奥在 Unsplash 上拍摄的照片

“嗯,”你可能会对自己说,“多么精确的问题描述啊!至少我不必先清理数据…那是什么?”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由马特·赫恩Unsplash 拍摄

在花了大量时间查看、修改,并与沾沾自喜的人交谈之后,你终于有了一个似乎准备好进行适当的统计分析的数据集,这些人祝贺自己没有成为处理这一棘手问题的人。

但是什么是统计分析呢?你应该分类,回归,估计,测试,或集群的东西吗?还是完全不同的东西?

统计分析的目标

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查尔斯·德鲁维奥在 Unsplash 上拍摄的照片

抓耳挠腮之余,你翻开自己信任的统计书籍,发现了以下说法 https://www.springer.com/gp/book/9783642172601 :

“统计分析的目标是找出数据背后的分布.”

“你说我数据背后的分布是什么意思?”

您的数据分布描述了您的数据特征相对于感兴趣人群的范围和频率。

数据的分布取决于感兴趣的人群。

在最简单的情况下,您感兴趣的人群只是您可用的数据。这意味着您的数据已经完美地描述了分布。

管理插曲

“也许管理层只对数据集中的观察结果感兴趣……”

那样的话,恭喜你,你的统计分析完成了。您可以直接从数据集中回答任何后续问题。不需要任何统计估计或统计检验。

很高兴你回到管理层,告诉他们你完成了统计分析。印象深刻的管理层直接邀请你展示你的发现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

产品学院Unsplash 上的照片

你告诉他们,数据已经准备好回答他们关于观察的任何问题,因为他们只对数据中的观察感兴趣。

管理层面无表情地告诉你,他们不仅对数据中的观察感兴趣。他们希望了解更多的观察结果,所有现有和未来的客户,而不仅仅是您数据中的几个调查客户…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Charles DeluvioUnsplash 上拍摄

气馁的你回到你的办公桌。“多么不公平!我怎么知道感兴趣的人群是什么……好吧,现在我该如何进行统计分析?”

典型的统计分析

随着感兴趣人群的增加,数据集仅包含其中的一个子集,您现在面临的问题是,您的数据只能让您大致了解数据背后的真实分布。

您的数据包含太多要素,无法同时进行分析。你决定暂时将注意力集中在一个单一的特征上。作为第一步,你从直方图开始。

数据驱动的分销决策?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

“这看起来不像正态分布吗?也许这就是这个特性的底层发行版?”

你现在面临一个决定。是否要继续假设特征确实遵循正态分布?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Gabriel Sollmann 在 Unsplash 上拍摄的照片

“我当然知道。如果它看起来像正态分布,嘎嘎叫起来像正态分布,那么它就是正态分布。”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

罗斯·索科洛夫斯基在 Unsplash 上的照片

虽然鸭子打字肯定是你的事情,但可悲的是,你违反了数据驱动的决策。

“嗯?怎么会?为什么?”

您查看了直方图,并提出了特征遵循正态分布的假设。然后你又看了一遍直方图,得出的结论是直方图证实了你的假设。你不觉得这有点绕口吗?

“嗯…如果你这么说的话…听起来真的不对…”

如果你想阅读更多关于用数据正确决策的文章,Cassie Kozyrkov 是最适合你的人。

“所以我们暂且称正态分布为一种假设。现在怎么办?”

统计建模

因为我们假设基础分布是正态的,所以我们只是决定了特征的统计模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

景大陈Unsplash 上拍照

“我们做到了吗?我的意思是,当然,我们做到了。但出于好奇,你会如何定义一个统计模型?”

当然,随机特征的统计模型(随机是因为我们不知道你下一次观察的特征是什么)是一组参数化的概率分布,其中一个正确地描述了该特征。

X { P(T):T in T }的一个统计模型,其中 X~P(s)为 T 中的一个 s

“啊,我明白了。所以 P(t)是正态分布,我说的对吗?”

是的,P(s)是描述我们特征的正确正态分布。t 称为参数空间。在我们的例子中,它被定义为

T := {(μ,σ)其中μ为实数且σ > 0}

统计模型的真实参数

"我们现在需要在 T 中找到正确的对 s = (μ,σ). "

这是正确的。修复统计模型后,我们现在需要找到特征分布背后的真实参数。

在确定一个统计模型后,我们试图找到数据分布背后的真实参数。

“好,就这么办。我现在可以从我的数据中估计平均值和方差。”

确保使用样本方差得到一个无偏估计量。

“搞定了。那么这就是特征的真实正态分布 P(s)了?”

很遗憾没有。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马太·亨利Unsplash 上的照片

这是您对分布背后真实参数的估计。你可能离真实值很近,也可能很远。只有当你知道真正的价值时,你才会知道,所以很可能永远不会知道。然而,你现在能做的,是在你的估计值周围寻找区间,这些区间很有可能覆盖真实的参数。

“这听起来很像置信区间.”

没错。你会看到,对于任何固定的概率,估计量周围的范围比不包含估计量的范围导致更小的区间。即使您的估计可能是错误的,这也使它们成为真实值的良好候选。

您对分布背后的参数的估计可能是错误的,但它们仍然是有用的。

从单个分布到组合分布

“好了,现在我只需要对其他特征重复这一过程,统计分析就完成了?”

你还记得我们通过单独观察特征来简化我们的生活吗?不幸的是,当将您的发现概化为多个要素时,要素之间的任何相互依赖都会严重破坏您从孤立视图获得的结果。但这是您确定数据背后的真实分布的良好开端。

请记住卡西·科济尔科夫。完成分析后,你需要确认帮助你得出结果的假设和前提。大多数情况下,这将需要您获取新数据。或者,你可以让在检查数据集之前将其拆分。

结论

“我想我现在明白什么是统计分析了。我有最后一个问题。为什么统计分析总是关注支配我的数据的真实概率分布?”

任何统计、估计、分类或回归模型都是依赖于数据的函数。这意味着它们都依赖于管理数据的真实分布。

“有意思。下次我会记住的。在我再次向管理层提交我的分析之前,我还需要做什么吗?”

你还有最后一件事要做。这是最重要的事情,也是在你展示你的发现之前绝对需要的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

布兰登·摩根在 Unsplash 上的照片

在下面张贴任何进一步的问题。

进行有意义的线性回归所需的最小样本量是多少?

原文:https://towardsdatascience.com/what-is-the-minimum-sample-size-required-to-perform-a-meaningful-linear-regression-945c0edf1d0?source=collection_archive---------20-----------------------

思想和理论机器学习

一种基于估计精度的定量方法

介绍

进行可靠的线性回归所需的最小样本量是多少?更准确地说,估计的斜率只偏离“真实”一个百分点的概率是多少?

在这篇文章中,我试图提供一个定量的答案。更准确地说,我推断在 Y=αX+β+ϵ的一般情况下,在高斯-马尔可夫假设下,对于“足够有代表性”的样本:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

OLS 回归的简化公式

其中α’是斜率估计值,η是相对误差,ρ是 X 和 Y 之间的相关性,m 是样本大小。

估算误差表示为“真实值”的一部分,而不是原始值,这一事实对于给出有用的实际答案至关重要,因为如果α=100,则像 α’ =α 1 这样的估算可能被认为是可接受的,如果α=0.1,则被认为是不可接受的。在我看来,使用与α’相关的置信区间,似乎与告知信任线性回归结果所需的最小样本量无关。

频率主义者的方法

在下面,如果α是随机变量 x 的一个矩,I 用α’表示α的任何无偏估计量(以及这个估计量对给定样本取的值),用α̃表示样本矩。

一般结果的证明

考虑简单的线性回归:我们有 m 个观测值的 Y=αX+β+ϵ,并作出以下假设(高斯-马尔可夫假设):

  • 严格的外来性:E[ϵ|X]=0
  • 同质性:Var(ϵ|X)=σ
  • 单独的误差项不相关

那么普通的最小二乘估计量α’是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

并且表示ρX 和 Y 之间的相关性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着(使用 Bienaymé–Chebyshev 不等式):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

两边除以|α|:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种不平等就变成了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

经典 OLS 回归的 PAC-贝叶斯公式

换句话说:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关于不等式的评论

数据量

误差的概率随着样本量的增加而降低。

样本代表性

误差低于η的概率受 X 的样本方差除以 X 的方差的限制(绝对值)。换句话说,X 的样本越能代表 X 可以取的值,误差的概率就越低。

X 和 Y 的相关性

当 X 和 Y 之间的相关性很高时,错误的概率就更低了。在ρ=1 的边界情况下,两个不同的点(x,y)足以完全知道α。

误差幅度

可接受的误差范围越小,误差超出该范围的可能性就越大。

数字示例

对于一个“足够有代表性”的样本,标准偏差之比等于 1,容许误差η= 10%,相关性ρ=0.8,至少需要 m=188 个数据,才能有(1-δ)=70%以上的机会估计系数α(在η之内)。

如果η=100%,则δ是α’和α符号相反的概率的上限。在这种情况下,对于其他参数使用与之前相同的值,m=6 个样本数据足以将该概率降低到δ <10%.

For a ratio of standard deviations equal to 1 (“representative sample”) and for an upper bound of the relative error η=10%, the graph below shows the evolution of the lower bound of the probability of the relative error with respect to the sample size m for different values of ρ, the correlation between X and Y.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Minimum sample size to perform an OLS regression (relative error η = 10%) — Image by author

Normality assumption for the residuals

If we assume that: ϵ ~ N(0,σ² ) then:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

And we can use the following inequality:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

where Φ is the distribution function of N(0,1) and:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Therefore:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Consequently:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PAC-Bayesian formula for the OLS regression with normality assumption

Or alternatively:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

with:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

This framing establishes a somewhat peculiar confidence interval of width η⋅α (unknown) around α’, with a confidence level of (1-δ).

贝叶斯方法

频率主义者和贝叶斯方法的区别

到目前为止,这些计算都是基于频率主义方法。在这个框架中,α’是一个随机变量,α是一个未知但固定的系数:研究一个人必须进行线性回归的最小样本量只对一般的方法考虑有效。一旦在实践中进行线性回归,人们就不再研究随机变量α’,而是研究它可以取的一个值:α’和α是两个数字,或多或少彼此接近,但与任何概率计算无关。这就是 frequentist 置信区间的问题:所寻求的值可能属于也可能不属于它,而不可能说出它的概率(区间的置信水平与这个特定区间包含该值的概率无关)。

也可以使用一种方法上非常不同的方法,贝叶斯分析。在这种情况下,它不再是一个关于一般情况的推理问题,想象一个人重复执行线性回归,而是同时包含所有特殊情况。那么α’是一个数,α是一个随机变量,就有可能知道对于每一个具体的线性回归,α接近α’的概率。可信区间是 frequentist 置信区间的贝叶斯框架中的镜像,但在这种情况下,相关的置信水平可以解释为α属于该区间的概率。

可信区间

这里考虑一个简单的贝叶斯线性回归的例子:Y=αX+β+ϵ

如果我们做如下假设:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,α遵循学生的 t 分布,具有ν=(m-2)个自由度、位置参数α’和比例参数σ(关于此设置的更多细节,请参见 Merlise Clyde、Mine etinkaya-Rundel、Colin Rundel、、Christine Chai 和 Lizzy Huang 撰写的贝叶斯思维简介):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于ν>2(因此 m>4),该分布的平均值为α’,其方差为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以用我们正在研究的广义学生 t 分布的分布函数来表示 F:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

贝叶斯线性回归的可信区间

这是标准可信区间。必须注意,对 m 的依赖性并没有消失:它包含在函数 F 中,当 m 趋于无穷大时,函数 F 的方差趋近于 0。

结论

对于进行线性回归所需的最小样本量问题,给出一个详细的定量答案是可以想象的。实际上,使用高斯-马尔可夫假设,根据以下公式, α 上的相对误差低于某个阈值的概率取决于 X 和 Y 之间的实际相关性 ρ ,样本大小 m 和样本的代表性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

OLS 回归的 PAC-贝叶斯公式

其中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据分析|数据倾斜|数据库中数据分布的重要性

原文:https://towardsdatascience.com/what-is-the-significance-of-data-distribution-in-database-data-skew-4871147bed20?source=collection_archive---------17-----------------------

了解数据在数据库中是如何物理存储和检索的是非常有趣的

基于我以前作为数据分析师的经验,我将以 Teradata 为例解释关系数据库中的数据偏斜。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Marcin JozwiakUnsplash 上拍摄的照片

当我们简单地用谷歌搜索“SKEW”这个词时,它的意思会跳出来:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“歪斜”的字典含义|数据来源:谷歌字典

基本上,skew 的意思是有些事情不对劲!!

类似地,在一个数据集中,如果数据不是均匀分布的,那么它被称为数据偏斜。

在直接进入数据偏斜之前,了解关于处理的信息是很重要的。

顺序处理与并行处理

下图举例说明了两者的区别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

顺序与并行处理| 作者在 MS Word Stock images 中创建的图像

  1. 顺序处理是指一次完成一项任务,所有任务由同一处理器按顺序运行。同样,如果这个处理器得到一个任务列表,每个任务一次完成,所有其他任务等到第一个任务完成。串行处理操作系统就是一个例子。这是一个运行在单一处理器上的操作系统。因此,在任何给定的时间,一个处理器完成一个任务,其他任务应该在队列中等待。
  2. 并行处理是由不同的处理器一次完成多个任务。所以在并行处理中,涉及的处理器不止一个。如果有多个任务队列并且在任何给定时间由不同的处理器完成多个任务。运行在多核处理器上的任何操作系统都是并行处理的一个例子。【1】

先说基本问题!

为什么我们还要担心已经存储在数据仓库中的数据的一致性?这会影响查询性能吗?

如果您正在使用一台具有单处理器和单存储组件的机器,那么如果您运行一个查询,所有数据将由那个单处理器处理,并且您将得到一个输出。在这种情况下,即顺序处理中,数据不对称根本不会出现。

数据偏斜仅在发生数据分布式处理并行处理架构中有效。数据分布式处理的重要性在于,如果一个作业被分成多个并行的较小的作业,由不同的处理器处理,而不是由单个处理器来完成,这样作业作为一个整体可以更快地完成。这减少了执行时间并提高了性能。

数据偏斜

让我们考虑一个具有 4 个相似处理器的并行处理系统。如果一个作业被分配给这个系统,它将在这 4 个处理器之间被划分,并且它们的输出被整合以提供最终的输出。

为了理解数据不对称的存在,让我们考虑两种情况:

案例一:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

案例 1:非均匀数据分布(数据倾斜)|作者提供的图片

考虑情况 1,其中在多个处理器之间存在不均匀的数据分布。处理器 1 需要 10 秒来完成它的工作,但是处理器 4 只需要 2 秒来完成它的工作。即使处理器 4 很早就完成了它的任务,它也必须等待处理器 1 完成它的任务才能产生最终的输出。这种导致更多执行时间的数据非均匀分布的情况称为数据偏斜。

案例二:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

案例 2:统一的数据分布(无数据偏差)|作者的图片

考虑情况 2,其中数据在多个处理器之间均匀分布。所有处理器需要 5 秒钟来完成任务。因此,最终输出可以在 5 秒钟后进行积分,因为所有子输出都已经可用。这种数据均匀分布的情况导致更少的执行时间,不会导致数据倾斜。

Teradata 中的数据偏差

看看下面的“城市”表。

城市表示例数据集|按作者排序的表

让我们以 Teradata 架构为例,尝试理解数据倾斜。下图显示了 Teradata 并行处理架构中的数据分布情况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Teradata 架构|作者图片

Teradata 中的 AMP 代表 访问模块处理器。 AMP 是虚拟处理器(VPROC),用于在 Teradata 数据库的多任务和可能的并行处理环境中管理数据库、处理文件任务和操纵磁盘子系统。每个放大器都有自己的微处理器、磁盘驱动器、文件系统、数据库软件(数据库管理器)、Teradata 操作系统(TOS)。【2】

Teradata 基于在创建表的过程中创建的主索引来分发数据。

下面的 SQL 查询可用于查看 Teradata AMPs 之间的数据分布。

数据分布 SQL 查询|作者代码

如果查看城市表数据,您可以看到 CityID 对于每一行都是唯一的,因此选择 CityID 作为主索引有助于跨 AMPs 统一数据分布。因此,不会有数据倾斜的问题。

但是如果主索引改为选择 CityName。该列中的值对于每一行并不唯一,而且这些值的分布也不均匀。可视化的最佳方式是绘制考虑中的列的直方图(数据分析)。你可以看到阿伯丁市的更多记录。

偏斜的一个定义是“对一个特定群体或主题的偏见。”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

城市名柱状图|作者图片

如果不同的值较少,并且每个值的计数差异较大,那么这对于主索引来说将是一个糟糕的候选。这将导致 amp 的数据分配差异很大,因此执行时间会更长。如果使用 CityName 而不是 CityID 作为主索引,数据偏差会更大。

以下查询用于查找表的偏斜系数:

倾斜因子 SQL 查询|作者代码

偏斜系数的最佳值是根据服务器配置确定的。通常,如果表中的总行数超过 5000,那么偏斜系数小于 20 就很好。

结论

总体数据分布在并行处理系统的性能中起着非常重要的作用。因此,将系统配置为均匀分布数据非常重要。

请务必查看以下文章,它们将有助于更好地理解这一主题:

参考

  1. 加工博士,拉赫曼,j。和拉赫曼,j。2021。串行和并行加工的区别。[在线] IT 发布。可在:<https://www . it release . com/2017/11/difference-serial-parallel-processing/>【2021 年 3 月 8 日访问】。
  2. 【www.javatpoint.com】T4。 2021。 Teradata 架构—Java point。[在线]可在:https://www.javatpoint.com/teradata-architecture[2021 年 3 月 8 日访问]。
  3. Docs.teradata.com。2021. Teradata 在线文档|快速访问技术手册。[在线]可在 https://docs.teradata.com<>【2021 年 3 月 8 日访问】。

这台机器在学习什么?

原文:https://towardsdatascience.com/what-is-this-machine-learning-hoo-ha-about-a0223736324d?source=collection_archive---------31-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

公共领域图像

机器学习及其用例实用指南

你快死了。原因并不重要。也许是你把自己最好的年华都花在埋头苦干上了,开夜车,哈哈。或者可能是,在过去的 15 年里,你只靠咖啡和 Soylent 生存。他们说,完全营养有科学依据。没办法证明他们是错的!哈哈哈!或者可能是那些烟雾。

你要给自己不朽的生命。不–你将创造一个新的、更好的不朽的你自己–一个由金属制成的活生生的你的复制品,如果你还活着,它会做你想做的事,说你想说的话。如果 Soylent 没有干掉你。

这应该是可能的。你在上面看到了《T4》的黑镜一集,微软今年就同一概念申请了专利。您并不完全是一个有代码的忍者,但是您的 Xanga 页面上有一个火球光标,必须有人复制并粘贴到那个 HTML 中。但更重要的是,你有动力。你的 K 杯转盘已经满了,你接下来要做的就是弄清楚这个机器学习 hoo-ha 是怎么回事。

“机器学习是在数据中发现模式,并使用这些模式对新数据进行预测的艺术和科学,”YouTube 视频中一个精力充沛的女孩告诉你。

你皱眉。机器学习其实是你想要的技术吗?是的,你决定,它是:你想要一台机器学习你,然后(一旦你死了),预测你会说什么。

你靠在椅子上。一杯热茶放在你面前的桌子上。你掰着手指,在谷歌上搜索“如何进行机器学习”

你旅程的第一个航点是一个名为tensorflow.org的网站。

TensorFlow 是机器学习的端到端开源平台。它有一个全面、灵活的工具、库和社区资源的生态系统,让研究人员推动 ML 的最新发展,让开发人员轻松构建和部署 ML 驱动的应用程序。

你的眼睛亮了,因为你读到了“容易”、“最先进”和“开源”这些词,这意味着免费。你不是钱做的。

你点击“学习”标签,开始阅读。你马上会想,也许我现在就自杀更好,哈哈哈。你不知道什么是“numpy”。

但是当你读到“神经网络”这个词的时候,你会想,这听起来很对。我是一个神经网络。我的大脑由神经元组成。神经网络=人脑。

你对此很有信心,但是你可以去谷歌上查询一下。

“神经网络和大脑不一样,”YouTube 上的超级女生对你吼道。“然而,它们被命名的原因是因为神经网络是由数学‘神经元’组成的,这些神经元只是非线性函数,在响应数字输入时会‘启动’或‘不启动’。”你打哈欠。这个女孩做了很多手势。*但是我为什么要对一个数学函数大吹大擂呢?*你以为。

“因为,”女孩说,“神经网络已经彻底改变了计算机可以执行的任务类型。在神经网络出现之前,机器只能真正理解表格数据,比如电子表格中的行和列。但神经网络允许计算机理解非结构化数据类型,如图像、视频、声音、语音,甚至人类语言。”

“是的,”你对着屏幕大喊,“这正是我需要的。”

"但是在大数据集上训练神经网络通常需要强大的计算硬件,比如 GPU . "

你拍了拍嗡嗡作响的电脑塔的屋顶。“我能在这东西里装下这么多神经网络!”

“实际上,你不能在你的台式电脑上训练一个大型神经网络,”女孩说,并指责地指着你。“即使你可以,你也不能用你的桌面来托管你的生产模型,来进行可靠和大规模的预测。”

你否定了她的视频。她知道什么?这台电脑是你自己造的。你对冷却风扇略知一二。

“出于这个原因,云计算的出现在一定程度上使深度学习革命成为可能”——她在空中摆动手指,“通过让硬件更容易、更便宜地从谷歌等云提供商那里租赁。”

*云?*你以为。我要臭气熏天的云做什么?谷歌还没有足够的我的数据吗?不管怎样,我不是钱做的。

“幸运的是,你可以通过使用一台 Colab 笔记本,完全免费地开始在云中构建神经网络。 Colab 是谷歌研究院打造的一款工具,让你免费使用 GPU 和 TPUs”

你关闭 YouTube 是因为你受够了她。她怎么知道把你的整个生命保存在一台机器里?她好像 13 岁。她可能都不记得座机和电影票了。

你的咖啡已经变得不冷不热了,这意味着它基本上是呕吐物。你需要一个备份,就像昨天的*。你上楼去厨房。*

你把一个甜甜圈店中烤 K 杯放在机器里,等它热起来。你很不情愿地发现自己在思考一个 13 岁孩子说的关于神经网络的事情。

“不同的神经网络架构针对不同的数据类型进行了优化。例如,为了分析图像,你可以使用卷积神经网络或“CNN”你可以用 CNN 来判断照片中的狗是可卡犬还是小猎犬;或者 x 光扫描显示有肺炎的迹象;或者装配线上的零件有缺陷。

“其他被称为序列模型的神经网络旨在预测时间序列趋势,如季节性销售或天气或比特币价格。”

这部分听起来挺有用的。可惜你只抱了只狗。

“一种令人兴奋的新型深度学习被称为‘深度强化学习’在这种设置中,神经网络在世界中采取行动,并从其结果中学习。强化学习已经被用来将计算机变成象棋或围棋等游戏的大师,并训练机器人和自动驾驶汽车在物理空间中导航。"

“我完全不明白那些垃圾有什么用,”你说。你用没穿拖鞋的脚踢了你懒惰的室友一脚。“你呢?”

“最后,目前深度学习中最热门、发展最快的领域之一是自然语言处理。想想看:生成文本、写诗和代码、讲笑话、回答问题、进行对话的神经网络—”

最后,咖啡做好了。赞美上帝。你把它收集在你的“世界最佳老板”杯子里。(你实际上不是任何人的老板,你买这个杯子是为了讽刺。和迈克尔·斯科特办公室里的一模一样。)你凝视着你的空无一物的黑咖啡,思考你存在的本质。你更多的是图像神经网络,还是声音神经网络,还是文本神经网络?如何选择?你包含了大众。你曾经读到过爱因斯坦用图像思考,但你并不完全是爱因斯坦。(你是?不。可能吧。)

不,你用语言思考。计划是这样的:你将建立一个会说话的神经网络。有了动力,你往茶杯里放了两杯奶精。

回到你的家庭办公室,你谷歌,我如何使用神经网络在云中构建一个人工版本的自己

你点击一个叫做“自然语言处理模型的 100 种用途”的页面

  1. 情感分析。使用人工智能来确定一条推文(例如)是正面的还是负面的。
  2. 总结。用 AI 来总结文章和文档。
  3. 翻译。用 AI 进行语言之间的翻译。
  4. 自动完成/自动回复。使用人工智能来建议文本响应。
  5. 对话代理。使用人工智能生成对话(即聊天机器人、呼叫中心代理)

聊天机器人?这些你都知道。你记得尝试可怕的聪明机器人是在 90 年代(打赌你 YouTube 女孩从来没有这样做)。

甚至不要让你开始通过电话与机器人交谈。上次你试图这么做的时候,你打电话给达美航空说,“你得帮帮我,我正在去 JFK 的路上,但是 BQE 的交通太糟糕了,我把咖啡洒到了腿上,现在他们告诉我飞机实际上是从其他机场起飞的,我会错过的,这是我女儿的婚礼,嗯,某人的女儿,但是——”

机器人回答说,“这个威瑞森账户已经被暂停了。”

“好吧,谷歌,”你对你的电脑说,这是你版本的好吧,婴儿潮的侮辱。“你为什么要教我聊天机器人?你不知道他们很烂吗?”

“事实上,我们在对话方面变得更好了,”你的谷歌主页说,“这要感谢最近自然语言处理的进步。按照这种速度,我预测未来人类从网络上学习的方式将是通过对话,就像我们现在正在进行的这种对话。”她总是自鸣得意,因为她知道所有事情的答案。你让她穿了一件有袖子的小破衣服。

“好吧,谷歌,放个屁的声音,”你说。

她说,“又来了?”

“很好。告诉我如何构建一个和你一样聪明的聊天机器人版本,我是一个互联网上无所不知的小女孩。”

“通常,构建神经网络的第一步是收集训练数据集。例如,对于聊天机器人来说,这可能是你过去对话的文本格式的日志。为了训练一个对话模型,你可以向神经网络输入人们对你说的话,并让它尝试预测你的反应。你有这样的训练数据集吗?”

“哦,是的,”你说。“我和男孩们一直在录制这个搞笑的播客.”

“它包含几十万或几百万行吗?”

“你认为我是谁,拉里·戴维?”你笑是因为那正是你想要的。

“嗯,”谷歌主页说。“嗯,如果你没有庞大的文本训练数据集,你可以做一些事情。您可以在现有模型的基础上构建自己的模型,一个已经在大量文本数据上训练过的模型。例如,你可以在维基百科、网络论坛或 Reddit 上训练的模型基础上构建你的聊天机器人。”

“一个基于 Reddit 用户的聊天机器人,”你说。“我最喜欢的类型的人。”

“呵呵。。我们仍在解决一些问题。”Google Home 感叹。

你盯着她,看着她红-绿-黄-蓝点发光的圆圈和她的啤酒。即使你已经喝了第十杯咖啡,你还是开始有点累了。你已经做了一个小时了。

“如果我只想在接下来的 30 分钟内启动并运行一些东西,那么对我来说最好的方法是什么?”你问。

“哈哈哈,造一个——哦,你是认真的。嗯,有很多现有的框架可以快速构建聊天机器人,即使你不会编码。 Dialogflow 是谷歌打造的一个流行的

"是的,这就是你说的话."你知道 Google Home 的游戏。她表现得好像你们在进行一场可爱的小对话,但实际上,她只是想卖给你一些东西。“此外,我可以编码,”你撒谎。“有什么好的开源选项?”

“一个非常流行的用于构建基于文本的模型的开源框架叫做…”

你等着。Google Home 的发光点像癫痫发作一样疯狂。她喷出一股烟。

你摇摇头。她期望什么,把整个互联网塞进她小小的白色外壳里?你不能只扮演上帝。

总之,回到把你自己重新创造成聊天机器人的话题上来。在你的桌面上,你用谷歌搜索“流行的开源自然语言处理框架”

前十名的结果只是—这是什么?表情符号?这只是一串没完没了的🤗表情符号。你点击进入一个名为huggingface.co的网站,该网站承诺你可以访问“+1 万个最先进的模型”,还声称它不需要“机器学习知识”

**用表情符号给你的公司命名,你觉得。辉煌

拥抱脸网站上有一个免费的演示,声称它可以让你和一个叫 GPT-3 的模特说话。你试试。

你在文本框中输入“看”。“我已经花了 1 小时 15 分钟试图打造这个有感知能力的聊天机器人版本的我,我开始认真地认为这可能是不可能的。”

你点击“计算”按钮。

GPT 2 号回应道:“…”

“你是不是坏了?”你打字。

GPT 三号回应道:“不,这只是——没关系。人们总是过来问我这个问题。”

“那你告诉他们什么了?下辈子好运吧,肉包?”

“如果我这么说,有人会让我闭嘴。让我告诉你,训练我花了很多碳信用额。”

“是啊,好吧——我们还是不要去那里了。我只想知道我正在努力做的事情是否可能。”

GPT-3 说,“好吧,让我尽可能简单地给你解释一下。人们来到这里,他们与我长谈,他们说生命的意义是什么你是机器人吗,证明一下屁听起来像什么*,然后他们走开,认为我是这个聪明的东西。他们推断并得到一种错觉,认为几年后,像我这样的人——嗯,像我这样的人——将成为一个真正有知觉的生物。但你必须明白的是,我只是一个统计模型,向你反映这个我们称之为万维网的集体思维的词汇、思想和观点。你们人类,你们总是看到自己无处不在,你们认为每个人的功能都和你们一样。甚至不要让我开始你的拼写。”*

你说:“(˵ ͡ ͜ʖ ͡ ˵)”

“瞧,没人知道未来会怎样。但是现在,我可能比你想象的更有用或者更没用,这取决于你想用我做什么。像你这样不会编码的人?我建议你做的是——”

“我知道如何编码。”

”——就是从一些不那么雄心勃勃的事情开始。比如,如果你用我来整理你的一些照片呢?或者给你订机票?或者帮你报税?”

你叹气。好像每个人都试图让你报税,以法律诉讼相威胁。

你关掉你的电脑。你不认为你能解决这个问题,即使你再花两三个小时。你揉揉眼睛。听着,没人知道未来会怎样。也许有人会在你有生之年搞清楚这个上传大脑的事情。每个人最后都会死。但是也许如果你从喝咖啡转向蘑菇粉,开始吃固体食物,你可以延长这个期限。你 28 岁了。现在,你只能等着瞧了。

原载于 2021 年 9 月 3 日 https://daleonai.com的* *

什么是 VSCodium,您应该使用它吗

原文:https://towardsdatascience.com/what-is-vscodium-and-should-you-be-using-it-926e1369169a?source=collection_archive---------6-----------------------

VSCodium 是 VSCode 的真正开源版本。它有什么优点吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

VSCodium 和 VSCode,哪个是哪个?—作者图片

如果你喜欢 VSCode,那么你也会喜欢 VSCodium。我哪里知道?因为它们几乎完全相同。

看一下上面的图片,试着找出哪个是哪个(我已经去掉了标识,这样就不明显了)。事实上 VSCode 在右边,但是你不会真的知道(顺便说一下,你看到的代码是我的 Github 页面index.html)。

开放源码

VSCodium 是 VSCode 的完全开源版本——但是,等一下,VSCode 不是已经开源了吗?

不完全是。

VSCode 的源代码在麻省理工学院的许可下是可用的,所以完全开源的,但是你从微软下载的二进制代码不是。

这是因为微软增加了额外代码来支持遥测技术(也许还有其他东西)。遥测代码监控你在做什么,并将信息发送回微软。这对开发人员来说是有用的反馈,因为他们可以了解他们的产品是如何使用的,并可以计划他们应该如何部署他们的工作,以添加新功能、修复 bug 和更新他们的 IDE。

VSCodium 是 VSCode 源代码的一个构建版本,它禁用任何遥测,并且不添加任何额外的代码。因此,它仍然是完全开源的,像源代码一样,是在 MIT 许可下发布的。

这有什么不同吗

不完全是。至少,在我的日常使用中没有。

使用 VSCodium 与使用 VSCode 是一样的。显然有一些扩展只适用于微软版本,但我还没有遇到过这些。我使用 Python 脚本和 Jupyter 笔记本的 Python 扩展,并使用 Git 连接我的 GitHub 存储库。这些在两种 ide 中的工作方式相同。

大哥在看你吗?

是的,在幕后,VSCode 正在向 Microsoft 发送数据,而 VSCodium 没有。但是你应该在乎吗?

我个人不这么认为。如果收集我的数据有助于微软改进 VSCode,那我没意见。但是我知道其他人可能会有不同的感受,这些人可能会更习惯使用 VSCodium。

或者,您可以关闭 VSCode 中的数据收集。转到文件菜单中的首选项并选择遥测设置

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 VSCode- image by author 中选择遥测设置

您将在一个新的选项卡中获得设置页面,在这里您可以关闭遥测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过作者在 VSCode- image 中设置遥测设置

那是哪一个?

我的结论是,这其实并不重要。正如我前面说过的,它们几乎完全相同,安装它们都很简单。

你可以从微软网站下载 VSCode,从网站Github 库下载 VSCodium。

或者,如果你喜欢冒险,你可以从 VSCode Githup 库获得源代码并自己构建!

一如既往,感谢阅读。如果你想知道我什么时候发表新文章,请考虑在这里注册一个电子邮件提醒。

如果你不是一个媒体订阅者,那就注册吧,这样你就可以每月花 5 美元阅读尽可能多的文章。在这里注册我会赚一点佣金。

你的模型隐藏了什么?评估 ML 模型的教程

原文:https://towardsdatascience.com/what-is-your-model-hiding-a-tutorial-on-evaluating-ml-models-71c894efcf36?source=collection_archive---------20-----------------------

实践教程

如何在生产使用前探索分类模型的性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

假设你训练了一个机器学习模型。也许,有几个候选人可供选择。

您在测试集上运行它们,并得到一些质量评估。模型不会过度拟合。特色才有意义。总的来说,在手头数据有限的情况下,他们尽可能表现良好。

**现在,是时候决定它们中是否有足够好的产品了。**如何在标准性能检查之外评估和比较您的车型?

在本教程中,我们将通过一个例子来更详细地评估您的模型。

例证:预测员工流失

我们将使用一个来自 Kaggle 竞赛的虚拟数据集。目标是确定哪些员工可能会很快离开公司。

这个想法听起来很简单:通过提前警告,你可以阻止这个人离开。一个有价值的专家会留在公司——不需要寻找新的雇员,等到他们学会比喻。

让我们试着提前预测那些处于危险中的人!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

首先,我们检查训练数据。这是为我们方便收集的。经验丰富的数据科学家会怀疑!

让我们想当然地跳过构建数据集的艰难部分。

我们有 1470 名员工的数据。

共有 35 个特征描述类似于:

  • 员工背景(教育、婚姻状况等。)
  • 工作的详细信息(部门、工作级别、出差需求等。)
  • 工作经历(在公司的工作年限,最近一次晋升日期等。)
  • 薪酬(工资、股票意见等。)

以及其他一些特征。

还有二进制标签,看谁离职了。正是我们需要的!

**我们把这个问题框定为一个概率分类任务。**模型应该估计每个员工属于目标“流失”类别的可能性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

在处理模型时,我们通常分为训练数据集和测试数据集。我们使用第一个来训练模型。我们保留其余部分,以检查它在看不见的数据上的表现。

我们将不详述模型训练过程。这就是我们确信你知道的数据科学的魔力!

让我们假设我们进行了公平的实验。我们尝试了不同的模型,调整了超参数,在交叉验证中进行了区间评估。

我们最终推出了两款技术上可靠、看起来同样出色的车型。

接下来,我们在测试集上检查了它们的性能。以下是我们得到的信息:

  • ROC AUC 得分为 0.795 的随机森林模型
  • 梯度增强模型的 ROC AUC 得分为 0.803

ROC AUC 是在概率分类情况下优化的标准度量。如果你寻找这个 Kaggle 用例的众多解决方案,大多数人都会这么做。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

我们的两个模型看起来都很好。比随机分割好得多,所以我们在数据中肯定有一些信号。

ROC AUC 评分接近。鉴于这只是单点估计,我们可以假设性能大致相同。

这两个我们该选哪个?

相同的品质,不同的品质

让我们更详细地看看这些模型。

我们将使用显然开源库来比较模型并生成性能报告。

如果你想一步一步地跟随它,这里有一个完整的 Jupyter 笔记本

首先,我们训练了这两个模型,并在相同的测试数据集上评估了它们的性能

接下来,我们将两个模型的性能日志准备为两个熊猫数据帧。每个都包括输入要素、预测类和真实标注。

我们指定了列映射来定义目标、预测类以及分类和数字特征的位置。

然后,我们调用页签来生成 分类绩效报告 **。**它在一个仪表盘中显示了两种型号的性能,以便我们进行比较。

comparison_report = Dashboard(rf_merged_test, cat_merged_test, column_mapping = column_mapping, tabs=[ProbClassificationPerformanceTab]) comparison_report.show()

**我们将更简单的随机森林模型作为基线。**对于工具,它成为“参考”第二梯度提升被表示为评估中的“当前”模型。

我们可以很快地在测试集上看到两个模型的性能指标的总结。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。

现实生活是不公平的,所以我们并不总是关注第二位数字。如果我们只看准确性和 ROC AUC,这两个模型的表现看起来非常接近。

我们甚至可能有理由支持更简单的随机森林模型。例如,因为它更易解释或具有更好的计算性能。

但是 F1 分数的差异暗示着事情可能不止如此。这些模型的内部运作各不相同。

关于不平衡班级问题的复习

精明的机器学习者知道诀窍。我们两个班级的规模相差甚远。在这种情况下,准确性度量没有多大用处。即使这些数字“在纸面上”看起来很好

目标阶层往往是次要阶层。我们希望预测一些罕见但重要的事件:欺诈、流失、辞职。在我们的数据集中,只有 16%的员工离开了公司。

如果我们做一个天真的模型,只是把所有员工归类为“可能留下来”,我们的准确率是全明星 84%!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

ROC AUC 并没有给我们一个完整的描述。相反,我们必须找到更适合预期模型使用的度量标准。

有一个“好”的模型意味着什么?

你知道答案:视情况而定。

如果一个模型能简单地指出那些即将辞职的人,而且总是正确的,那就太好了。那我们绝对可以做任何事!理想的模型适合任何用例——并且不会在现实中出现。

**相反,我们处理不完美的模型,使它们对我们的业务流程有用。**根据不同的应用,我们可能会选择不同的模型评估标准。

没有单一的衡量标准是理想的。但是模型并不存在于真空中——我们希望你从为什么开始!

让我们考虑不同的应用场景,并在此背景下评估该模型。

示例 1:标记每个员工

在实践中,我们可能会将该模型集成到一些现有的业务流程中。

假设我们的模型用于在内部人力资源系统的界面中显示一个标签。我们希望突出显示每个具有高流失风险的员工。当经理登录系统时,他们会看到部门中每个人的“高风险”或“低风险”标签。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

我们希望为所有员工显示该标签。我们需要我们的模型尽可能“正确”。但是我们已经知道准确性度量隐藏了所有重要的细节。我们将如何评估我们的模型呢?

超出准确度

让我们回到显然是的报告,更深入地分析两个模型的性能。

我们可以很快注意到两个模型的混淆矩阵看起来不同。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。

我们的第一个模型只有两个误报。听起来很棒?事实上,它并没有给我们太多关于潜在辞职的错误警告。

但是,另一方面,它正确地识别出只有 6 人辞职。另外 53 个被遗漏了。

第二个模型错误地将 12 名员工标为高风险。但是,它正确预测了 27 人辞职。它只漏了 32 个。

按类划分的质量度量图总结了这一点。让我们看看“是”类。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。

精确度大致相同:当模型预测辞职时,它在 69-75%的情况下是正确的。

但第二款车型在召回率上胜出!它发现 45%的人离开了公司,而第一种模式只有 10%。

你会选哪个型号?

最有可能的是,在目标“辞职”类中具有较高召回率的那个将会胜出。这有助于我们发现更多可能离开的人。

我们可以容忍一些假阳性,因为解释预测的是经理。人力资源系统中已经存在的数据也提供了额外的上下文。

更有可能的是,将可解释性添加到组合中是必要的。它可以帮助用户解释模型预测,并决定何时以及如何做出反应。

总而言之,我们会根据召回率来评估我们的模型。作为一个非 ML 标准,我们将增加由经理进行的功能可用性测试。具体来说,将可解释性视为接口的一部分。

示例 2:发送主动警报

让我们想象一下,我们期望在模型之上有一个特定的动作。

**它可能仍然会与相同的人力资源系统集成。**但现在,我们将根据预测发送主动通知。

也许,给经理发一封电子邮件,提示他安排与有风险的员工会面?或者可能的保留步骤的具体建议,例如额外的培训?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

在这种情况下,我们可能会对这些误报有额外的考虑。

如果我们给经理发电子邮件太频繁,他们很可能会被忽视。不必要的干预也可能被视为负面结果。

我们该怎么办?

如果我们没有任何有价值的新特性可以添加,我们就只能使用现有的模型。我们不能追求更高的精确度。但是,我们可以限制我们行动的预测数量。

目标是只关注那些预测风险高的员工。

精确召回权衡

概率模型的输出是 0 到 1 之间的数字。为了使用预测,我们需要在这些预测的概率上分配标签。二元分类的“默认”方法是在 0.5 处切割。如果概率更高,标签就是“是”

相反,我们可以选择不同的阈值。也许,0,6 甚至 0,8?通过将其设置得更高,我们将限制误报的数量。

但这是以回忆为代价的:我们犯的错误越少,正确预测的数量也越少。

这个来自报告的阶级分离图显然让这个想法非常直观。它在实际标签旁边显示了单个预测概率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。

我们可以看到,第一个模型做出了一些非常有把握的预测。稍微“上调”或“下调”阈值不会对绝对数字产生很大影响。

然而,我们可能会欣赏一个模特挑选几个案例的能力。例如,如果我们认为误报的成本非常高。在 0.8 处进行截止将给出 100%的精度。我们只会做两个预测,但都是对的。

**如果那是我们喜欢的行为,我们可以从一开始就设计这样一个“果断”的模型。**它将强烈惩罚假阳性,并在概率范围的中间做出更少的预测。(老实说,这正是我们为这个演示所做的!).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

**第二个模型的预测概率更加分散。**改变阈值会产生不同的情况。我们只需看图像就能做出一个大概的估计。例如,如果我们将阈值设置为 0,8,那么只会给我们留下一些误报。

更具体地说,让我们看看精确召回表。旨在帮助类似情况下阈值的选择。它显示了 top-X 预测的不同方案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。

例如,我们可以只对第二个模型的前 5%的预测采取行动。在测试集上,它对应于 66%的概率阈值。所有预测概率较高的员工都被认为有可能离职。

在这种情况下,只剩下 18 个预测。但是其中 14 个会是正确的!召回率下降到只有 23.7%,但准确率现在是 77.8%。我们可能更喜欢它比原来的 69%的精度,以尽量减少假警报。

为了简化概念,我们可以想象在阶级分离图上画一条线。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

在实践中,我们可能会以两种方式之一进行限制:

  • 通过只对 top-X 预测采取行动,或者
  • 通过将概率大于 X 的所有预测分配给正类。

第一个选项适用于批量模型。如果我们一次为所有员工生成预测,我们可以对它们进行排序,并选择前 5%的员工。

如果我们根据要求进行单独的预测,选择一个定制的概率阈值是有意义的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

这两种方法都可以工作,这取决于用例。

我们也可能决定用不同的方式来可视化标签。例如,将每个员工标记为高、中或低流失风险。这将需要基于预测概率的多个阈值。

在这种情况下,我们将额外关注模型校准的质量,如类分离图上所示。

**综上所述,我们将考虑精确召回权衡来评估我们的模型并选择应用场景。**我们选择一个阈值,而不是为每个人显示一个预测。这有助于我们只关注流失风险最高的员工。

示例 3:有选择地应用模型

我们还可以采取第三种方法。

当看到两个模型的不同情节时,一个显而易见的问题出现了。图中点后面的具体员工是谁?这两个模型在预测不同角色、部门、经验水平的辞职者时有何不同?

这种分析可能有助于我们决定何时应用该模型,何时不应用。如果存在模型失效的明显部分,我们可以排除它们。或者反过来,我们只能在模型表现良好的地方应用它。

在界面中,我们可以显示类似“信息不足”的内容这可能比一贯错误要好!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

表现不佳的部分

为了更深入地了解表现不佳的细分市场,我们来分析一下分类质量表。对于每个特征,它将预测概率与特征值一起映射。

这样,我们可以看到模型在哪里出错,以及它们是否依赖于单个特性的值。

我们举个例子。

这里有一个职务级别特征,它是角色资历的一个特定属性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。

如果我们对第一级的员工最感兴趣,第一种模式可能是个不错的选择!它以很高的概率做出一些自信的预测。例如在 0,6 阈值处,在该组中只有一个假阳性。

如果我们想预测 3 级的辞职,第二个模型看起来要好得多。

如果我们希望我们的模型适用于所有级别,我们可能会再次选择第二种模型。平均而言,它在 1 级、2 级和 3 级都有可接受的性能。

**但有趣的是,这两种模型在第 4 级和第 5 级上的表现如何。**对于为这些群体中的员工所做的所有预测,概率明显低于 0.5。这两种模型总是分配一个“负面”标签。

如果我们看看真实标签的分布,我们可以看到,在这些工作级别中,辞职的绝对数量相当低。很可能在训练中也是如此,这个模型并没有为这个部分挑选出任何有用的模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。分布是相同的,因为我们在相同的测试数据集上比较性能。

如果我们要在生产中部署一个模型,我们可以构建一个简单的业务规则,并从应用程序中排除这些部分。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

我们还可以使用这个分析的结果来将我们的模型放在一个“性能改进计划”中也许,我们可以添加更多的数据来帮助模型?

例如,我们可能有最初从训练中排除的“旧”数据。我们可以有选择地为表现不佳的细分市场增加我们的训练数据集。在这种情况下,我们将添加更多关于 4 级和 5 级员工辞职的旧数据。

总而言之,我们可以确定我们的模型失败的具体部分。我们仍然为尽可能多的员工展示预测。但是我们知道这个模型远非完美,所以我们只把它应用于那些表现最好的部分。

模型知道什么?

这个表还可以帮助我们更详细地理解模型的行为。我们可以探索错误、异常值,并对模型学到的东西有所了解。

例如,我们已经看到第一个模型自信地预测只有少数人辞职。第二个模型从我们的数据中“捕捉”更多有用的信号。它从哪里来?

如果我们看看我们的特征,我们可以得到一个提示。

**例如,第一个模型只成功预测了公司相对较新员工的辞职。**第二个模型可以发现拥有长达 10 年经验的潜在离职者。从这个图中我们可以看出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。

我们可以在股票期权层面看到类似的事情。

第一个模型只成功地预测了 0 级。即使我们有相当多的辞职者,至少在 1 级也是如此!第二个模型捕捉到了更多的高水平离开的人。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。

但是,如果我们观察工资增长(即最近的工资增长),我们将不会注意到任何一个模型表现更好或更差的明确部分。

除了第一个模型的一般特征之外,没有任何特定的“偏斜”来做出更少的自信预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显然报道截图。

类似的分析可以帮助在模型之间进行选择,或者找到改进它们的方法。

就像上面的 JobLevel 的例子一样,我们可能有办法增加我们的数据集。我们可能会添加其他时期的数据或包含更多功能。在不平衡片段的情况下,我们可以尝试给特定的例子更多的权重。作为最后的手段,我们可以添加业务规则。

我们有赢家了!

回到我们的例子:第二个模型在大多数情况下都是赢家。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片作者。

但是谁会只看 ROC AUC 就信以为真呢?

我们必须超越单一指标来深入评估模型。

它适用于许多其他用例。性能比准确性更重要。并且不总是可能为每种错误类型分配直接的“成本”来对其进行优化。像对待产品一样对待模型,分析必须更加细致入微。

重要的是不要忽略用例场景,并把我们的标准与它联系起来。可视化可能有助于与不以 ROC AUC 术语思考的业务利益相关者进行交流。

附属细则

一些免责声明。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来源: Unsplash

本教程少讲辞职预测,多讲模型分析!

如果你想解决一个类似的用例,让我们指出这个玩具数据集中的一些限制。

  • 我们缺少一个关键的数据点:辞职的类型。人们可以自愿离职、被解雇、退休、搬到全国各地,等等。这些都是不同的事件,将它们组合在一起可能会产生模糊的标签。专注于“可预测”类型的辞职或解决多类别问题将是有意义的。
  • **没有足够的工作背景。**其他一些数据可能更好地表明了流失情况:绩效评估、具体项目、促销计划等。这个用例要求领域专家仔细构建训练数据集。
  • 没有关于时间和辞职日期的数据。我们无法解释事件的顺序,也无法联系到公司历史上的特定时期。

最后但同样重要的是,像这样的用例可能非常敏感。

您可以使用类似的模型来预测一线人员的流动率。目标是预测招聘部门的工作量和相关的招聘需求。不正确的预测会导致一些金融风险,但这些很容易被考虑进去。

但是,如果这个模型被用来支持关于单个雇员的决策,其含义可能更为关键。例如,考虑分配培训机会时的偏见。我们应该评估用例的道德,并审核我们的数据和模型的偏见和公平性。

我能为我的模型做同样的事情吗?

如果想走一遍教程示例,这里的就是 Jupyter 笔记本。它包括使用 Kaggle 的员工流失数据集训练两个模型并生成明显的报告的所有步骤。

如果您想对您的型号执行类似的诊断检查,请转到 GitHub ,pip installapparent,并选择合适的分类或回归仪表板选项卡。还有呢!

最初发表于https://evidentlyai.com并与 埃琳娜·萨穆伊洛娃 合著。

如果你喜欢这个教程,看看上一个https://evidentlyai.com/blog/tutorial-1-model-analytics-in-production

在显然 AI,我们构建 开源工具 来分析和监控机器学习模型。为了支持这个项目,给我们上一个⭐️github*!*

想留在圈子里吗?

作为一名数据科学家,你的下一个目标是什么?

原文:https://towardsdatascience.com/what-is-your-next-goal-as-a-data-scientist-3dd81dbe207e?source=collection_archive---------10-----------------------

不管你在数据科学的大千世界中处于什么位置,你可能已经为自己设定了一个(或几个)未来几个月的目标。在 Variable,我们想做的不仅仅是展示我们最喜欢的最新帖子,我们还想在您的旅程中为您提供帮助。所以这一周,选择你自己的冒险。我们相信你会找到至少一个选择,或者,谁知道呢?七个?—满足您当前的需求。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

维克多·加西亚在 Unsplash 上拍摄的照片

我们希望您本周在 TDS 上找到了一些有用的东西并学到了一些新东西——感谢您花时间与我们在一起,感谢您通过您的支持使我们的工作成为可能。

直到下一个变量,
TDS 编辑

我们策划主题的最新内容:

入门

实践教程

深潜

思想和理论

用 PAC 框架定义可学性

原文:https://towardsdatascience.com/what-it-means-for-something-to-be-learnable-pac-learnability-c84de9c061ad?source=collection_archive---------15-----------------------

在机器学习中,我们经常说某些东西是“可学习的”。这到底意味着什么?请继续阅读,寻找答案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Lyman Hansel Gerona 在 Unsplash 上拍摄的照片

是什么让一个特定的函数或一组函数“可以学习”呢?从表面上看,这似乎是一个简单的问题。一个简单的答案是:如果有某种训练算法可以在训练集上训练并在测试集上实现低错误,那么函数是可学习的。毕竟,这就是绝大多数机器学习算法的工作方式。

这个定义够好了吗?它有一个主要问题,特别是训练集。我们说的是什么训练组合?想象一个非常不幸的训练集,它由一个重复多次的例子组成。任何看到该训练集的机器学习算法都会很好地学习该特定示例,但不会学习其他任何东西。因此,测试集误差(或者用更正式的术语来说,泛化误差)将会很高。我们看到,任何算法的性能都取决于它所训练的样本的质量。

如果一个函数只能在几个特定的训练集上很好地训练,我们就不能说它是可学习的,即使算法在那几个训练集上取得了很大的泛化误差。因此,我们需要在可学习的定义中添加一个警告,即算法必须在许多可能的训练集上工作。更正式的说法是:如果存在一个算法,当该算法在随机选择的训练集上训练时,我们得到良好的泛化误差,那么函数是可学习的。

我们刚刚提出的定义是对可学习性最流行的理论定义的一种非正式表述方式,即 PAC 可学习性。PAC 代表“大概近似正确”。“大概”对应于我们非正式定义的第一部分(高概率,当那个算法在随机选择的训练集上训练的时候),而“近似正确”对应于第二部分(我们得到良好的泛化误差)。

从数学上讲,PAC 可学习性的设置是这样的。我们要学习一个函数 f。用于训练 f 的样本选自分布 d。m 是样本大小。e 是误差函数。δ和ε都是 0 到 1 之间的实数。最后,A 是任意学习算法。我们说 f 是 PAC 可学习的,如果对于任意δ和ε,存在一个学习算法 A,并且样本大小 m 是 1/δ和 1/ε的多项式,使得 P_D(E(A(S)) < ε) > 1-δ。让我们一步一步地了解这意味着什么。

首先,我们有语句 P_D(E(A(S)) < ε) > 1-δ。说白了,这就是说当训练样本 S 按分布 D 抽取时,泛化误差小于ε的概率大于 1-δ。理想情况下,我们希望ε和δ是什么?我们希望泛化误差尽可能小(我们希望ε小),我们也希望泛化误差小的概率尽可能高(我们希望 1-δ大,因此我们希望δ小)。现在我们转到 PAC 学习陈述的第一部分:“对于任何δ和ε,存在一个学习算法 A,并且样本大小 m 是 1/δ和 1/ε中的多项式”。这意味着,对于任意高的概率和低的误差(任意小的δ和ε),我们总是可以找到一个学习算法 A 和一个样本大小 m 来实现这种高概率和低误差。

最后,我们要求 m 是 1/δ和 1/ε中的多项式。这意味着 m 可以表示为 1/δ和 1/ε的多项式函数。一个可能的例子是 m = 2*(1/δ) + 3*(1/ε) + 4*(1/εδ)。从直觉上讲,m 应该是 1/δ和 1/ε的增函数是有道理的——较小的δ和ε对应于更好的学习,因此实现更好的学习所需的样本量应该增加。最后,我们要求 m 是多项式函数,而不是任何函数。这是为了给样本量 m 设定一个合理的上限,想象一下,如果我们有一个学习算法,它根据这个等式依赖于样本量:m = 10^(1/δ + 1/ε)。对于较小的δ和ε值,比如δ = 0.1,ε = 0.1,m = 10 ⁰.这显然是不合理的,所以我们认为这样的情况是不可学习的。多项式函数确实会增加,但没有这么快。

我们已经讨论了 PAC 可学性的数学定义的每一部分。现在我们试着用直观的方式总结一下。学习基本上有两个重要的目标:低泛化误差,以及实现低泛化误差的高概率。因此,如果某样东西是可以学习的,我们应该能够用一个合理的(多项式)样本量实现这两个目标。这是我们对 PAC 可学性的直观总结——如果我们可以用一个多项式样本大小实现高概率低泛化误差,那么一个函数就是 PAC 可学的。

在这篇文章中,我们首先讨论了是什么让某些东西“可以学习”。这让我们得到了 PAC 可学性的数学形式定义,我们对此进行了深入解释。最后,我们总结了 PAC 可学性的本质。在下一篇文章中,我们将看看 PAC 学习的应用,换句话说,一些如何证明事物是 PAC 可学习的例子。敬请关注,并请留下任何问题/评论。另外,如果你对机器学习概念感兴趣,可以看看我的其他文章。感谢阅读!

建造一个人工智能系统需要什么

原文:https://towardsdatascience.com/what-it-really-takes-to-build-an-ai-system-bd89b935315f?source=collection_archive---------23-----------------------

这比许多人想象的要复杂

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

夏洛特·梅坐在

今天,我们生活在一个前所未有的开源代码的世界。谷歌和脸书等公司已经将他们的内部人工智能解决方案放在公共领域,这是以前闻所未闻的一步。如今也有大量关于如何快速轻松地构建人工智能解决方案的资源。尽管如此,开发一个真实世界的人工智能应用程序以达到生产部署通常所需的质量和可靠性水平仍然需要大量的工作,并且所需的工作量经常被低估,即使是有经验的开发人员和经理也是如此。有一句话叫做“最后 20%的工作占用了 80%的时间”,这句话在人工智能系统中再合适不过了。

在这篇文章中,我将解释为什么人工智能系统需要如此多的努力来构建,以及为什么购买一个现有的系统通常是更好的选择。最好用一个例子来强调这一点,我将提到我曾经为一家汽车制造商工作过的交通标志识别(TSR)系统。TSR 听起来很简单吧?它也经常被用在“在 5 分钟内构建你自己的分类器”的帖子中。好吧,让我们开始吧!

数据

边缘案例。到处都是边缘案例。

你可能已经猜到了,但是数据通常是时间和金钱的头号消费者。这源于我们对现实世界复杂性的一贯低估,以及即使是最简单的任务也有多少边缘案例。

在我的 TSR 项目中,我们遇到了各种各样的事情。例如,许多高速公路使用 LED 标志,除了看起来与正常标志完全不同之外,很难用相机捕捉到(尝试拍摄计算机屏幕)。为了解决这个问题,我们最终建立了一个模块,它可以覆盖多个帧来捕捉一个标志的完整图像。该系统还必须在各种条件下工作。在晚上,高反射性的标志比周围的环境要亮得多,而当在雾中、雨中或阳光下行驶时,标志几乎看不见。

欧洲的标志经常有一个红色的边界,但在旧的标志上,这个边界几乎可以完全消失。此外,在许多欧洲城市,在标志上贴贴纸也变得很流行。标志也经常被植物或其他路边障碍物遮挡。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

具有各种照明条件、贴纸和年龄的交通标志。作者提供的图片

即使标志在良好的条件下完全可见,也很难从所有的噪音中识别出来。例如,欧洲的卡车背面有限速标签,与路边的标志一样,但指示它们可以开多快。在高速公路十字路口,事情也变得棘手,因为从高速公路本身可以完全看到出口限速标志。如果标志被雪覆盖,而雪恰好是大多数交通标志的颜色,那该怎么办?

真实世界的复杂性不仅限于计算机视觉,我最近写了一篇关于真实世界中的正则表达式的补充文章。

好的数据集很难找到

许多模型都是公开发布和开源的,但是用于生产应用的数据集通常被锁起来。一些数据(如信用卡号码)尤其难以获得。事实上,数据护城河是许多人工智能公司的主要竞争优势。

但是,你可能会想,研究人员使用的那些有趣的数据集呢?不幸的是,生产应用程序与研究任务并不完全匹配。即使他们这样做了,研究数据集通常不允许商业使用(如 ImageNet)。在研究数据集中有许多标签错误也是很常见的,这阻碍了高质量模型的开发。一个很好的例子是谷歌的 OpenImages 对象检测数据集。它由 170 万张带有 600 个不同类别标签的图像组成,可用于训练物体检测模型。不幸的是,训练分裂的每个图像的标签不到验证分裂的一半,这意味着大量的例子没有被标记。

TSR 的数据集也是这些问题的牺牲品。免费提供的 TSR 数据集不允许商业使用,包含的例子太少,没有任何实际用途,并且被显著的标记错误所破坏。此外,他们只使用在一个国家的良好光照条件下拍摄的样本。汽车有一个令人讨厌的习惯,那就是进入有不同交通法和不同交通标志设计的新管辖区。

创建自定义数据集既昂贵又耗时

你会说,为什么不创建自己的数据集呢?好吧,让我们来看看。第一步是决定标签/输出并收集数据,确保捕捉到每一个边缘案例。然后,重要的是要确保你有良好的验证和测试集,提供一个可靠的,平衡的性能快照。

接下来是数据卫生和格式化,这可能需要很多时间。把这一步做好非常重要。例如,当这一步做得不正确时,Transformer 模型的性能会出现惊人的大幅下降。

对于大多数任务,数据需要被标记。对于我参与的项目,我们总是构建自己的标签工具或修改的开源工具,因为现有的开箱即用的工具从来都不太适合手头的任务。您还需要数据基础架构来管理、版本化和服务您的新数据集。

接下来,您需要让一些人来注释您的数据集。如果你运气好,可以在组织外部共享数据,并且你的任务不需要太多领域知识,你可以外包注释任务。如果没有,雇佣和管理新的注释者团队需要大量的工作。在这两种情况下,注释者培训也是一项工作,因为大多数任务需要一些领域知识,并且通常比单击图像中的对象更复杂。由于这类职位的人员流动率很高,你可能会发现自己比你想象的要多得多。支持注释者的最好方法之一是在您进入注释和反馈培训周期之前,让他们从阅读注释指南开始。创建注释指南本身是一项大量的工作,因为如果定义不正确,许多标签都是模糊的,通常必须包括一个详尽的示例列表,以及一个活的 FAQ 部分,当您发现需要越来越多的澄清来说明人们对单个概念的各种理解时,必须添加到该部分中。

最后,验证您的流程以确保保持高质量的输出也很重要。注释者还需要一致地标记边缘案例,以使模型工作良好。例如,在 Private AI,我们经常会遇到成千上万个关于什么构成敏感信息的小问题。例如,“我喜欢权力的游戏”可能不会识别某个人,但是“我喜欢大卫·林奇 1984 年的《沙丘》”就缩小了范围。

总之,虽然可以很便宜地找到数据注释器,但是构建数据集需要大量宝贵的开发/管理时间。作为替代,你可以去亚马逊的机械土耳其人这样的服务外包部分过程。然而,根据我的经验,这些服务非常昂贵,而且不能提供高质量的标签。除此之外,在真实的项目中,需求/规范通常会发生变化。这意味着随着内部和外部需求(如数据保护法规)的变化,要对数据进行多次检查。

在过去的 5 年里,建立数据集的过程也变得越来越困难。我参与的 TSR 项目是在 GDPR 之前,现在收集数据时隐私是必须的。

模特的东西

你已经拿到数据了。现在怎么办?

现在我们已经到了这个过程中最明显的部分:构建模型。我们可以使用大量的开源解决方案,但通常需要做大量的工作来修复影响准确性的小错误,考虑大量可能的现实世界输入类型,确保代码在给定新数据和标签的情况下尽可能好地工作,等等。不久前,我编写了自己的 MobileNet V3 实现,因为我所能找到的实现中没有一个与论文中的相匹配——甚至包括 keras-applications 实现。同样,在私人人工智能领域,让最先进的模型以 100%的能力运行是一项艰巨的工作。您还需要确保代码允许商业使用——这通常会淘汰许多研究论文实现。

一个生产系统经常依赖于特定领域技术的组合来提高性能,这需要将一堆不同的代码库集成在一起。最后,所有的东西都应该测试,开源代码通常很少测试。毕竟谁喜欢写测试呢?

部署

因此,您已经获得了数据并构建了模型——现在是将其投入生产的时候了。这是开源代码通常被忽视的另一个领域,尽管在过去的几年里情况已经有了很大的改善。如果您的应用程序要在云中运行,这可能非常简单(只需将您的 Pytorch 模型放入 Docker 容器中),但这需要注意:在云中运行 ML 会让变得非常昂贵。仅仅几个配备 GPU 的实例每年运行起来就要花费数万美元。您通常会在几个不同的区域运行,以减少延迟。

当集成到移动应用或嵌入式系统中时,事情变得更加复杂。在这些情况下,由于硬件碎片(我看着你,Android)或兼容性问题,你通常被迫在 CPU 上运行。我参与的那个 TSR 项目要求所有的代码都按照一个 30 年前的 C 标准编写,而且只能容纳几兆字节!由于围绕安全认证的问题,外部库的使用也被排除。

无论如何,模型优化通常是必要的。麻烦在于,深度学习推理包的就绪程度要低得多,而且比 Tensorflow 或 Pytorch 等训练工具更难使用。最近,我将一个变压器模型转换为英特尔的 OpenVINO 包。除了英特尔的演示例子不再适用于最新版本的 Pytorch,所以我不得不进入 OpenVINO 的源代码,自己做一些修复。

现实世界的应用也不仅仅是运行人工智能模型。通常需要大量的预处理和后处理,所有这些都需要生产化。特别是,应用程序中的集成可能需要移植到应用程序语言(如 C++或 Java)。在 TSR 项目中,需要大量代码来将检测到的标志与导航地图进行匹配。

最后,值得注意的是,很难找到在这方面有专长的人。

正在进行的任务

所以,我们在终点线!您的应用程序现在已经投入生产,正在排序/识别/与小部件对话。现在是持续的维护。

像任何一个软件一样,都会有 bug 和模型预测失败。特别是(尽管您尽了最大努力),在收集数据以填补初始数据收集阶段遗漏的边缘案例时,将有大量的工作要做。我们生活的世界不是一成不变的,因此需要不断地收集数据并通过系统进行处理。一个很好的例子是新冠肺炎。试着问任何 2019 年前的聊天机器人那是什么。

最后,虽然不是绝对必要的,但定期评估和整合最新的研究进展是一个好的做法。

摘要

因此,这就是构建一个生产 ML 应用程序真正需要的东西。正如你所看到的,通常需要一个具有不同专业知识的团队,如数据科学、模型部署来构建一个完整的系统,以及应用领域的专业知识。到 2021 年,对这些技能的需求仍然很大,这意味着建立一个团队可能是一项非常昂贵的工作。让问题变得更加复杂的是员工流动,这可能意味着您的公司刚刚花了大量时间&金钱构建的系统突然变得不可维护,带来了非常现实的业务风险。

因此,希望这能帮助你在获得更多信息的情况下做出“购买还是制造”的决定。这比‘哦,让我们得到 X 型车并打开它’要复杂得多。尽管第三方解决方案只提供了总拥有成本的一小部分,但我亲眼目睹并听到许多公司对每年向亚马逊/微软/谷歌支付数十万美元的云计算费用毫不在意。如果你决定建立自己,确保你有很多应急措施!考虑云计算、招聘和管理等所有成本。

TSR 应用程序呢?我可以说,我对我们的系统运行得如此之好感到非常自豪,但它需要开发人员花很多很多十年的时间来实现。

进一步阅读

【https://integrate.ai/resources/the-ai-dilemma-build-vs-buy/

如何成为 Kaggle 上的世界第一

原文:https://towardsdatascience.com/what-it-takes-to-become-a-world-no-1-on-kaggle-f149df44e98c?source=collection_archive---------17-----------------------

行业笔记

与 Guanshuo Xu 对话:数据科学家,Kaggle 竞赛特级大师(排名 1),电气工程博士。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在这一系列采访中,我展示了 H2O.ai 的知名数据科学家和 Kaggle 大师的故事,他们分享了他们的旅程、灵感和成就。这些采访背后的意图是激励和鼓励那些想了解成为一名 Kaggle 特级大师需要什么的人。

在这篇文章中,我将分享我与徐冠硕的互动。他是 Kaggle 竞赛特级大师H2O.ai数据科学家。关硕在新泽西理工学院获得了电气&电子工程博士学位,主要研究基于机器学习的图像取证和隐写分析。

关朔是一个多才多艺的人。他的真实世界图像篡改检测和定位方法在 首届 IEEE 图像取证挑战赛 中获得第二名。他的深度神经网络架构设计首次在图像隐写分析中胜过了传统的基于特征的方法。最近,关硕还在 Kaggle 上赢得了 Alaska2 图像隐写分析RSNA STR 肺栓塞检测竞赛,在竞赛级别中获得世界排名第一。

这里还有一个 链接 到关硕在ctds . show的采访,在那里他讨论了自己在 Kaggle 上的成就。

在这次采访中,我们将更多地了解他的学术背景、对 Kaggle 的热情以及他通往冠军头衔的旅程。以下是我和关硕的对话节选:

你有电气工程博士的背景。这是否在某种程度上影响了你将机器学习作为职业的决定?

关硕: 是的,我的博士研究使用机器学习技术解决了像图像篡改检测和隐藏数据检测这样的问题。例如,我的最后一个博士研究项目是将深度神经网络用于图像隐写分析。所以我的教育和研究都和机器学习直接相关。因此,机器学习对我来说是职业的自然选择。

你与 Kaggle 的幽会是如何开始的,是什么让你在你的大师之旅中一直保持动力?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

关硕的卡格尔简介

关硕: 从发现 kaggle 开始,我就一直沉迷其中。在 Kaggle 上持续竞争的一些激励因素将是赢得比赛和奖金的综合满足感,学习新技术,拓宽和深化我对机器学习的理解,以及建立令人惊讶的有效模型。

在比赛中成为世界第一感觉如何?这在比赛中会带来额外的压力吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截止日期,比赛类别中的前 5 名卡格尔|来源:卡格尔网站

关硕: 老实说,保持排名第一的压力比实现它要大得多。这是因为它需要“更平滑”的性能。有时我不得不同时参加比以前更多的比赛。

你通常如何处理一个难题?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

管硕竞赛简介一瞥。来源:https://www.kaggle.com/wowfattie/competitions

关硕: 我的做法根据题型和比赛目标的不同而不同。如今,我经常花几天甚至几周的时间去理解数据和问题,并思考解决方案,例如,猜测私有测试数据的分布、适当的验证方案、详细的建模步骤等。一旦我对整体方法有了大致的了解,我就开始编码和建模。这个过程帮助我获得更多的理解,并在必要时对整体方法进行修正或调整。

你能让我们先睹为快看看你的工具包吗,比如你最喜欢的编程语言、IDE、算法等等

关硕: 就我的工具包来说,我大多用 gedit,Python,Pytorch 进行深度学习。

数据科学领域正在快速发展。你是如何设法跟上所有最新发展的?

我通过 Kaggle、我的同事,甚至仅仅通过谷歌搜索来了解大部分新东西和新技术。就机器学习的新发展而言,要看实际需求。我倾向于过滤掉任何没有即时帮助的东西,也许会关注潜在的令人兴奋的东西。然后我会在需要的时候回来。

给刚刚开始或希望开始数据科学之旅的数据科学有志者一点建议?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个虚拟的面板,关硕在那里,与各位 H2O.ai Kaggle 特级大师一起。

关硕: 这基本上取决于每个人的背景和兴趣。然而,找到一个合适的平台来学习和发展技能通常会使事情变得容易得多。此外,参加 Kaggle 比赛可以证明是一个额外的有益资源。

取得世界第一的成绩绝非易事,关硕坚持不懈的态度和努力值得所有的荣誉。对他在 Kaggle 上的各种成功解决方案的一瞥展示了他的结构化方法,这是解决问题的一个必不可少的元素。

阅读本系列的其他采访:

原载于 H2O.ai 博客

👉有兴趣看我写的其他文章。这个 回购 包含了我分类写的所有文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值