TowardsDataScience 博客中文翻译 2019(八十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

线性模型中的偏差和方差

原文:https://towardsdatascience.com/bias-and-variance-in-linear-models-e772546e0c30?source=collection_archive---------7-----------------------

线性模型的偏差和方差权衡

我相信每个人过去都见过这个图表:

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

First figure in Scott Fortmann-Roe’s Understanding the Bias-Variance Tradeoff.

了解偏差-方差权衡详细介绍了权衡和误差,我强烈推荐。上图是帖子上的第一个图,显示了多个模型在不同偏差和方差误差下的预测。靶心是我们想要预测的真实值,蓝点是模型实际预测的值。在这篇文章中,我想尝试并直观地展示线性模型中偏差和方差的权衡。

为什么是线性模型?

因为它们很容易理解,并且提供了一种非常简单的方法来控制这些误差——通过正则化。众所周知,与非线性模型相比,普通最小二乘(OLS)回归可以给出方差较低的无偏结果。 (OLS 带 L2 点球)和拉索 (OLS 带 L1 点球)给出了有偏差的结果,与 OLS 相比方差低得多。惩罚程度由正则化系数λ控制。这反过来控制两个误差,我们将在下面看到。Lasso 实际上是一个特例,因为它积极地将系数估计值推至零,但有助于保持事物的前瞻性。你可以在这里阅读更多关于正规化的内容。

程序

我将坚持使用 Scott 的文章中用来从概念上描述错误的方法。我在这里任意挑选所有固定的数字。

  1. y = α+ βx + ϵ 模拟 500 个数据点,其中 ϵ ~ N(0,8),x ~ U(-2,2),α = 2β = 3。
  2. 重复第一步 1000 次,收集所有数据集。
  3. 对于每个集合,用固定的λ拟合 OLS、脊和套索模型,以预测 *x = 3 时的 y 。*预期预测应该是 2 + 3 x 3 = 11

现在我们有 3000 个(1000 个 OLS + 1000 个山脊+ 1000 个套索)预测,我们可以看看这些模型的真正“本质”。你可以在我的 GitHub 页面这里找到所有代码。

关于如何阅读情节的注释。我要你注意两件事。真实值(显示为黑色虚线)和模型的平均预测值(显示为相同颜色的虚线)之间的距离。这个距离就是模型的偏差(或偏差的平方)。与真实值(11)的大偏移是大偏差。
2。直方图的宽度是模型的方差。宽度越大,方差越大。

λ ~ 0

从一个非常小的λ值开始。这相当于没有罚分,因此我们可以预期在 OLS 对山脊和套索的结果是一样的。

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

情节没有给人惊喜。所有这三种分布都与真实值周围的平均值重叠。请注意分布是如何分散的。从 9 到 13 的预测中有很大的差异。

λ = 0.01

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

通过(非常)小的代价,很容易看到正则化的效果。分布已经向左移动(从平均值可以明显看出)。在山脊观察到一个小的偏差,在套索观察到一个相对较大的偏差。不清楚方差是否已经改变。

λ = 0.05

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

在λ = 0.05 时,Lasso 已经过于激进,偏差为 3 个单位。岭是足够接近,但看起来它有相同的方差。因此,对于这个数据来说,山脊还没有优势。

λ = 0.1

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

与上面几乎相似的结果。目前还很难注意到差异有任何变化。

λ = 0.5

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

更高的惩罚提供了一些(合理的)令人满意的线索。山脊上的偏差增加了近三个单位,但方差较小。Lasso 非常积极地推动β的零系数估计,导致结果偏差很大,但方差很小。

λ = 1 —一些好结果!

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

在这里,权衡显然已经改变了立场。以较高的偏置为代价,脊的方差较小。

λ = 5

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

为了让大家真正理解这一点,这里有一个非常大的惩罚。以更高的偏差为代价,脊上的方差很小。你可能永远不会需要这么大的罚款。但事实很清楚,较低的方差是以较高的偏差为代价的。

各种正则化值的偏差和方差

对一系列正则化值重复上述操作,可以得到清晰的图像。

  • 偏差计算为平均预测值和真实值之间的距离-真实值减去平均值(预测值)
  • 方差是平均预测值与平均值(预测值减去平均值(预测值))的平均偏差

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

这些图给出了相同的观察结果。OLS 的偏差最小,但方差最大。在λ = 0.2 左右(β变为 0,因此对于 x ) 的所有值,预测 y = α )后,山脊看起来像平滑移动,套索是恒定的。

理想分布

更好的数据选择可以给我们一个理想的预测抽样分布图。

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

由于重叠分布,山脊提供的优势在这里非常明显。岭给出一个稍有偏差的预测,但会给出一个比 OLS 更接近的预测。这才是脊的真正价值。一个小偏差,但更一致的预测。OLS 给出了一个公正的结果,但不是很一致。这很关键,OLS 给出了一个无偏的结果 平均,而不是一直 这就是线性模型中的偏差和方差权衡取

你可以在这里找到我在这篇文章中使用的所有代码。我建议您针对不同的λ值运行它,亲自查看变化。甚至可以在不同的数据集上使用它,看看是否可以看到一些重叠。如果你对这篇文章有任何建议,请随时和我打招呼。

我只想花点时间感谢让这篇文章成为可能的每一个人。一定要花点时间分享并表达你的感激之情。:)感谢阅读!

机器学习中的偏差和方差

原文:https://towardsdatascience.com/bias-and-variance-in-machine-learning-fbf17ac6f500?source=collection_archive---------22-----------------------

用简单的例子

这些概念对数据科学的理论和实践都很重要。他们也会出现在工作面试和学术考试中。

一个偏置预测器是偏心的,即它的预测始终是关闭的。不管它被训练得多好,它就是不明白。一般来说,这样的预测器对于手头的问题来说太简单了。不管数据有多丰富,它都不符合数据。

一个高方差预测器在某种意义上是相反的。当试图修正偏置和过度补偿时,通常会出现这种情况。人们已经从一个过于简单(即有偏见)的模型转向一个过于复杂(即方差很大)的模型。它过度拟合了数据。

介于这两者之间的是“最佳点”——最佳预测点。通常这不容易找到。数据科学家可以提供帮助。那是另一个故事了…

示例

输入是(比如说)华氏温度。我们希望它归类为舒适而非。训练集可以捕捉单个人或一组人的判断。

正如在别处提到的,这个问题不是线性可分的。简单地说,正确的解决方案应该表现为

Too low     -> uncomfortable    (U)
Just right  -> comfortable      (C)
Too high    -> uncomfortable    (U)

很明显,我们需要两个阈值,一个用于区分too lowjust right,一个用于区分just righttoo high

偏置

如果我们被限制只能使用一个怎么办?例如当我们的分类器只能够学习线性决策边界时。无论多么丰富的训练集都无济于事。我们就是无法得到中间预测的舒服和两个极端预测的不舒服

迈向更好的解决方案

如果我们有领域知识。也就是说,我们知道问题的特征。这里需要两个门槛。我们可以想出一个好的解决办法。

我们假设我们没有这样的领域知识。换句话说,我们需要一个通用的解决方案。

最近邻法

我们将考虑单个最近邻方法,因为它可以学习非线性决策边界,并且易于描述。我们将针对我们的问题来描述它。这有两个原因:(I)更清晰,以及(ii)便于讨论其变化。

Predict the temperature to be comfortable if at least half the people labeled it comfortable; uncomfortable if not.

现在假设算法在以下数据集上训练。每个温度都由 10 个人标注——C 或 U。

Temperature            10 … 45 50 55 60 … 80 … 100 ..
% who Labeled C         0 … 50 30 40 70 … 70 … 0

这个算法会把 45 标为 C,50 和 55 标为 U,60 标为 C,这好像不对。50 和 55 被认为不舒服。我们预计 45 也应该是。

这是怎么回事?我们只有 10 台贴标机。“他们有一半把 45 标成 C”是噪音,这是说得通的。随着更多的标记,这个分数可能会下降到 0.5 以下。

另一种看待这个问题的方式是,模型的预测具有很高的方差。这样想。想象一组不同的 10 个人来标记数据。在这套新设备上训练。45 岁时的预测不太可能是错误的。这太巧合了。也就是说,很可能在某个温度上预测是错误的。

因此,正如我们在示例中看到的,高方差预测器容易受到训练集中的噪声的影响。噪音不会重复出现。下次我们训练它时,它会在不同的输入上学习噪音。从一个用户的角度来看,他只是把它作为一个黑盒预测器,这些预测在训练运行中并不一致。

减少差异

那么我们如何从算法上解决这个问题?也就是说,不需要额外的标签(这会产生成本)。我们平滑数据,或者在预处理期间,或者作为算法的一部分。下面我们选择后者。我们用三个代替单个最近邻*。为了简单起见,忽略计算效率的考虑,我们以下面的形式描述它:*

For the input temperature T, get all the labelings of T, T-1, and T+1\. Predict T’s label to be the majority label among all these.

我们有一个更强大的分类器。每个预测将基于大小为 30 的标记样本——比我们从单个最近邻分类器获得的样本多三倍。与单阈值分类器相比,这个分类器的偏差更小。它本质上仍然能够学习非线性决策边界。

当然,与前两个分类器相比,这个新分类器的准确程度是一个经验问题。这涉及到对每个分类器的偏差和方差的综合影响的精确比较。简而言之,它需要一个合适的列车测试实证评估。那是另一个故事。

机器学习算法中的偏差

原文:https://towardsdatascience.com/bias-in-machine-learning-algorithms-f36ddc2514c0?source=collection_archive---------10-----------------------

算法何时出现偏差以及如何控制。

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

source: google

机器学习模型中的偏差

我参加了 Sharad Goyal 教授关于我们机器学习模型中各种类型的偏见的演讲,以及他最近在斯坦福计算政策实验室的一些工作的见解。这真的让我很兴奋,我做了一些研究,写了这篇关于机器学习偏见的笔记。让我们来谈谈偏见,以及为什么我们需要关心它。

机器学习中的偏差是什么?

偏见这个术语是由 Tom Mitchell 在 1980 年他的论文中首次提出的,这篇论文的标题是“学习归纳中对偏见的需要”。有偏差的想法是模型重视一些特征,以便更好地对具有各种其他属性的较大数据集进行概化。ML 中的偏差确实有助于我们更好地进行归纳,并使我们的模型对某些单个数据点不那么敏感。

对谁有影响?

但是,当我们对更一般化算法的假设产生系统性偏见的结果时,问题就出现了。很多时候,算法可能在某些特征上有偏差,即使我们忽略了我们的模型不需要加权的特征。他们通过从其他提供的特征中学习那些特征的潜在表示来做到这一点。

这是令人担忧的,因为机器学习模型已经开始在我们生活的各种关键决策中发挥更大的作用,例如;贷款申请、医疗诊断、信用卡欺诈检测、来自 CCTV 的可疑活动检测等。因此,机器学习中的偏见不仅会给出基于社会刻板印象和信仰的结果,还会在社会中放大它们。

如何识别和消除偏见?

你们中的许多人一定听说过亚马逊试图建立一个简历过滤工具,以及它最终是如何对女性产生偏见的。每个人都希望有一个能从数百份简历中筛选出五份简历的系统。当模型开始根据性别拒绝申请者时,它就出了问题,因此从未投入生产。另一个简单的例子可以在单词嵌入中看到。单词嵌入的引入对于各种自然语言理解问题来说是一场革命,因为它们能够捕捉单词之间的简单关系:

国王——男人+女人=王后

相同的词嵌入也捕捉到以下关系:

电脑程序员——男人+女人=家庭主妇

从数学上来说,这些单词嵌入可能没有错,并且正确地编码了数据,但是我们愿意在我们的机器学习算法中编码这些偏差吗?因此,我们需要消除这些偏差,使之成为我们算法中不可或缺的一部分。

对于研究机器学习各个方面的研究人员来说,这是一个非常活跃有趣的话题。我还查看了Sharad Goel教授和 James Zou 教授分别对我们的机器学习算法和在单词嵌入中的偏差进行的公平性测量。两者都试图解决同一个问题,但方法不同。詹姆斯教授最近的工作是量化和消除单词嵌入中的性别和种族偏见。在他题为《男人对于电脑程序员就像女人对于家庭主妇一样?去偏置单词嵌入”,他们与托尔加·博鲁克巴斯提出了一种方法,以几何方式修改嵌入,以消除性别刻板印象。最终的嵌入保留了女王和女性之间的关联,丢弃了接待员和女性之间的关联。鉴于 Sharad 教授最近的工作,“公平的衡量和错误衡量:公平机器学习的批判性评论”讨论了各种公平定义(如反分类、分类奇偶校验以及校准)如何受到显著的统计限制,并可能损害它们旨在保护的群体。他们还认为,基于对一个人可能产生的风险的准确估计,我们应该以同样的方式对待同样有风险的人。对机器学习中的公平和偏见的研究刚刚开始,看看它如何发展和塑造下一代的政策将是有趣的。

机器学习中的偏见:面部识别模型如何显示种族主义、性别歧视和年龄歧视的迹象

原文:https://towardsdatascience.com/bias-in-machine-learning-how-facial-recognition-models-show-signs-of-racism-sexism-and-ageism-32549e2c972d?source=collection_archive---------8-----------------------

通过年龄和性别预测的镜头检查面部识别中的偏见,以鼓励公平、负责和透明的机器学习的发展。

By: 【安珀】卡米莱里罗比·盖根雷切尔·米德塞巴斯蒂安·奥索里奥秦沛·邹********

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

Licensed from Adobe Stock

早在 2018 年,技术市场研究公司 Counterpoint 的一篇文章预测,到 2020 年,超过 亿部智能手机将配备面部识别功能。今天,苹果、三星、摩托罗拉、一加、华为和 LG 都提供具有面部识别功能的设备。

当我们把手机装进口袋,走到外面时,公共场所布满了面部识别摄像头,全球各地有数百家甚至数千家零售店使用面部识别摄像头。大多数大型零售商对他们使用面部识别来防盗守口如瓶,但像 this 这样的文章证实了像塔吉特和沃尔玛这样的大品牌已经在他们的商店里试验面部识别。

不久,这些商店和其他商店可能会推出面部识别功能,以提高商店忠诚度计划或定制服务。福布斯的一篇文章指出,忠诚度会员通常已经同意与品牌分享个人数据,因此通过面部识别增强忠诚度计划可能在不久的将来。这种趋势正在许多行业出现,从识别癌细胞到预测罪犯再次犯罪的可能性。

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

Licensed from Adobe Stock

随着它的迅速普及,我们觉得理解这项技术很重要,所以我们决定通过构建我们自己的卷积神经网络来探索图像检测和分类的内部工作方式,该网络能够从一个人的图像中预测他或她的年龄和性别。我们将使用通用行业基准的模型和数据集。然后,使用模型的预测,我们将进一步检查模型可能存在的任何偏差。尽管我们的发现可能无法完美代表当今商业部署中使用的模型,但该项目旨在揭示机器学习中的偏见,并强调公平、负责和透明的机器学习的深思熟虑的发展的重要性。

初步研究

近年来,对公平、负责和透明的机器学习领域的研究获得了极大的关注。在所有形式的机器学习中都发现了无意识的偏见,例如 Bolukbasi 等人,2016 在一种常用的文本分析技术中分析了性别偏见:在谷歌新闻文章上训练的单词嵌入。研究人员建立了一个模型来预测一个类比应该如何结束使用性别特定的词,如“男人是国王,女人是 _ _ _ _ _ _ _ _ _ _”,该模型将预测女性的对等词“女王”。在用谷歌新闻文章训练了模型之后,研究人员使用了非性别职业来观察女性。因为“男人对于电脑程序员就像女人对于 _ _ _ _ _ _ _ _ _ _”这个模型预测了“家庭主妇”。模型中其他极端的“女性”职业包括:“护士”、“接待员”、“图书管理员”和“理发师”,而极端的男性职业包括:“艺术大师”、“船长”、“哲学家”和“船长”。这些模型反映了在谷歌新闻等常用数据源中发现的社会偏见,这些数据源用于许多商业、政府和研究领域,却没有意识到或纠正性别偏见。

在许多面部分类模型中也是如此。 Buolamwini 等人,2018 分析了跨浅色和深色皮肤男性和女性的商业性别分类产品的准确性。他们的研究考虑了微软、Face++和 IBM 出售的产品,发现它们在男性和浅色皮肤的人身上表现得更好——下表显示了每个产品在从图像预测男性或女性的二元分类中的准确性。

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

鉴于政府和企业如今都在使用这些产品,这种差异令人担忧。这种偏见的证据正在许多行业中被发现,从使用 81%欧洲出生参与者数据集的基因组学医学研究( Popejoy 和 Fullerton,2016 )到刑事诉讼,这些刑事诉讼由模型告知,这些模型错误预测黑人被告重复犯罪的可能性是白人被告的两倍( Angwin 等人,2016 )。

在研究我们从图像中预测年龄和性别的具体问题时,我们发现执行这些预测的大多数模型都是在来自维基百科和 IMDB 的最受欢迎的 100,000 名男女演员上训练的。作为名人的数据集,训练数据主要是白人,男性比例更高,大多数名人看起来比同龄的非名人要年轻得多——这造成了对老年人进行分类的偏见。

我们的重点是试图量化这些偏见,并尝试纠正它们的方法。

型号选择

我们选择使用卷积神经网络(CNN)作为我们的主要模型也是基于我们最初的研究。年龄预测本质上是一个回归问题,因此使用通常使用分类损失函数训练的 CNN 不是一个明显的选择。然而,我们发现,CNN 在图像识别任务上一直表现良好,并且已经成为这类任务的行业标准。

在过去的十年中,ImageNet 大规模视觉识别竞赛已经成为 CNN 能力和准确性的试验场。他们在这些年度比赛中的出色表现使得 CNN 被大规模接受为图像分类任务的“首选”模型。ImageNet 竞赛是 1,000 个类别的分类竞赛,训练集中有超过 100 万个图像。学者和专业人士都在竞争,一路改进 CNN。2010 年至 2017 年间,竞赛中的分类误差从 28.2%降至 2.3%。

最终,我们采用了 VGG-Face 架构,一个 16 层 CNN,具有 13 个卷积层(一些具有下采样)、2 个全连接层和一个 softmax 输出。像我们这样的模型可以在这里找到。尽管分类损失函数并不理想地适合于年龄分类,但我们选择使用这种特定的模型,因为它具有出色的基准性能、丰富的文档以及我们对初始权重实施迁移学习的能力。我们最初的模式(在再培训之前)完全依赖于迁移学习,最初的来源可以在这里找到。

数据选择

模型最初训练的图像来自 IMDb 和维基百科。这些数据是利用 IMDb 10 万名最受欢迎的男女演员的名单收集的,包括他们的面部图像,并附有时间戳、出生日期和性别。在 100,000 名男演员和女演员中,20,284 人有可用数据,平均每个名人有 26 张照片,数据集中共有 523,000 张照片。

年龄标签基于 IMDb 和维基百科上记录的出生日期和图像的时间戳。这是假设出生日期在这些网站上是准确的。没有时间标记的照片被删除,因为照片中人的年龄无法确定。一些图像来自电影的剧照,并且图像的时间戳基于制作时间,但是制作时间延长的电影可能导致时间戳信息的一些不准确性。因此,图像的年龄标签可能存在一些不准确之处。

尽管维基百科和 IMDB 的数据集很大,而且标签也很好,但名人的照片可能并不能代表普通大众。为了提供我们的模型如何在公众面前表现的代表性测量,我们还采用了来自 UTKFace 数据集的图像来重新训练模型,并作为精确误差测量的测试集。UTK 的数据既有裁剪过的照片,也有未裁剪过的照片;每个数据集的示例如下所示。UTKFace 是一个大规模的人脸数据集,包含超过 20,000 张照片,并带有年龄、性别和种族的注释。

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

Examples of photos from each dataset

年龄预测

我们的模型是在来自 IMDB-Wikipedia 数据集的大约 450,000 张照片的子集上预先训练的;训练中未使用的剩余照片被指定为样本外测试集。下面显示了该测试集的平均预测值与实际年龄的对比。实际(每个注释)年龄在 x 轴上,平均预测年龄(根据我们的 CNN 模型)显示在 y 轴上。人们可能会预期,在大型数据集上训练的模型,在与训练集非常相似的图像上进行预测,会表现得很好,我们的观察结果与这一预期相符。

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

为了获得预测,我们评估了 softmax 输出的两种不同解释。CNN 的最后一层是 softmax 层,它输出给定图像属于 101 个类别中的每一个的概率,每个类别对应于一个年龄(0 到 100)。这些概率可以解释为加权平均值,即将图像属于每个类的概率乘以该类的值。或者,预测可以简单地是具有最大概率的类别的年龄。最大概率解释总是导致较高的误差,因此我们采用加权平均解释来进行预测。

我们选择关注平均绝对误差(MAE ),这是我们对误差的主要度量,因为它对异常值更稳健,并且是年龄预测问题中误差的明显行业标准度量。作为对比,本文从 2017 年开始引用了几个商用 API 预测年龄的 MAE,并将微软的 Face API 年龄预测工具的 MAE 列为 7.62 年。我们从维基百科图片预测人的年龄时的平均寿命是 5.3 年。

然而,我们知道,这种误差测量可能并不能很好地反映模型对非名人面孔年龄的预测。非名人图像通常在图像分辨率、照明和面部特征方面不同于名人照片,这应该会影响模型的预测能力。由于训练集中测试集的信息泄漏,MAE 也可能人为地低。例如,如果一个名人在数据集中有多个图像,并且一些图像最终出现在训练集和测试集中,神经网络可能只是“识别”一个熟悉的面孔并匹配 hir 或她的已知年龄,而不是“预测”他或她的年龄。因此,我们的下一步是对 UTK 数据集进行预测。

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

我们从预测 UTK 的一组裁剪照片的年龄开始。在没有仔细查看来自 UTK 和维基百科-IMDB 数据集的照片示例的情况下,我们假设裁剪后的照片与 CNN 最初训练的数据最相似。尽管我们预计该模型在本次实验中表现不佳,但我们仍然对该模型未能准确预测年龄的程度感到惊讶,特别是在老年人中。然而,经过进一步的研究,我们发现从 UTK 数据集裁剪的图像比从维基百科-IMDB 集中裁剪的图像更接近。这导致头发、耳朵和其他面部特征经常从图像中被裁剪掉。如果我们想要匹配模型最初被训练的照片的格式,我们最好使用未剪辑的照片。

然而,在重新运行该模型之前,我们还从未裁剪的 UTK 数据集中移除了标注年龄低于 16 岁的照片。我们删除这一年龄组的理由基于两个关键论点:首先,原始数据和 UTK 数据集对于 16 岁以下的人来说都是稀疏的。第二,我们的用例通常与非常年轻的人不太相关。

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

由此得出的预测大约有 10 年的平均误差。这代表了对裁剪数据集预测的显著改进,证实了我们的直觉,即测试集中的照片在裁剪、分辨率、光照等方面与原始训练数据中的照片非常相似是很重要的。

下一个明确的步骤是,通过重新训练神经网络的最后两个完全连接的层和 softmax 输出,尝试提高模型对非名人面孔的预测能力。我们保留了最初的 14 层及其权重不变,以保留神经网络的特征提取部分,这将需要大量的数据来重新训练,但允许我们微调生成预测的神经网络部分。

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

Retraining fully-connected layers

最初,我们使用 Adam 优化对 UTK 未裁剪数据的子集进行了 250 个时期的再训练。可视化显示了前 100 个时期,并在大约 30 个时期内实现了最低的验证损失。蓝线代表验证失败,橙色代表训练失败。我们为验证损失最低的模型保存了权重,以避免过度拟合。作为这个再训练过程的结果,我们在 UTK 非裁剪测试集上的预测有了实质性的提高。

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

再培训将我们的测试平均寿命从 10 年减少到大约 8.4 年。基于与测试集中的照片更相似的照片来调整完全连接的层的权重产生了明显的差异。UTK 的数据通常具有较低分辨率的照片,较差的照明,以及化妆较少的女性,因此原始模型的一些糟糕表现可以归因于图像中的这些审美差异。

除了这一改进之外,该模型在预测老年人的年龄方面仍然表现不佳。检查 UTK 数据集,我们观察到,像模型最初训练的维基百科数据集一样,绝大多数图像是 20 至 35 岁之间的人。我们推测,缺乏老年人的数据可能是导致该数据区域表现不佳的原因。

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

Proportion of Data in UTK Dataset By Gender & Age

不考虑重新训练整个神经网络的选项,有两种常用策略可用于尝试提高模型性能:调整损失函数以进一步惩罚该组的不良预测,或者复制训练数据的不良表现区域的每个数据点以有效地实现同样的效果。我们开始复制所有 60 岁以上的人的照片,然后试着把它们增加三倍。

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

通过创建超过 60 岁的人的多个图像,该模型因错误标注他们的年龄而进一步受到惩罚。大部分改进是通过复制照片获得的,将 MAE 从 8.4 提高到 7.9。通过将图像增加三倍,实现了 0.1 年 MAE 的微小增量改善。

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

除了简单地改进 CNN 的权重,我们还对检验模型预测的偏差感兴趣。我们按照人口统计学将我们的最佳模型(用三份 60 岁以上的图像重新训练)的预测分开,以检查模型性能的离散性。当按性别区分预测时,预测中的偏差似乎是相似的。总的来说,该模型一贯高估年轻女性的年龄,其程度超过男性,但低估老年女性的年龄可能没有男性严重。随着年龄的增长,两性之间的差异也在增加。对于老年人来说,这种差异的增加和准确性的下降可能是由于该地区的数据相对稀少。

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

另一个显著的对比可以通过按种族划分预测来进行。未裁剪的 UTK 数据集主要是高加索人的照片,因此毫不奇怪,该模型对高加索人的表现与它对整个数据集的表现相当。请注意,与测试数据中对亚洲人的截然不同的预测相比,对高加索人的预测是多么相似。亚洲人在照片中占少数,对于该种族的老年人来说,预测不太准确,而且非常不稳定。正如我们所料,正如这两个例子所证明的那样,对于拥有大量数据的人群,预测通常更准确,而对于在数据集中代表性较低的人群,预测则不太准确。

校正模型

为了进一步完善神经网络做出的预测,我们创建了一个二级模型,用于校正基于年龄、性别和种族的系统性低估或高估。通过这个模型的生成,我们对与人口统计组相关的不同程度的偏差有了更好的理解。

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

校正模型中使用的特征包括:卷积神经网络的预测年龄、人的性别(男性或女性)和人的种族(白人、黑人、亚洲人、印度人和其他人)。我们测试和调整了几个模型,以便选择最合适的校正模型,下表显示了每种类型中性能最好的模型。

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

我们尝试的模型没有一个能改进原始模型的输出。我们认为这是由于一套简单的特征,只考虑了一个人的预测年龄、种族和性别。考虑到人们在较高年龄时一贯的预测不足,这是令人惊讶的。作为第二个解决方案,我们测试了一些简单的试探法,看看它们是否能改善我们的预测。为了做到这一点,我们采用了不同年龄段、性别和种族的预测年龄和实际年龄之间的平均差异。结果如下表所示:

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

Average Difference Between Predicted and Actual Age, Grouped by Predicted Age, Race and Gender

性别预测

除了年龄预测,我们还建立了一个卷积神经网络来预测同一组图像的性别。性别分类是二元的,只考虑在各自数据集中确定的男性或女性。预训练的神经网络在 IMDB 和维基百科的名人数据集上表现非常准确,并以 99%的准确率预测了正确的性别。使用混合种族和非名人的 UTK 人脸数据集返回了低得多的 78%的整体准确率。准确率因种族和性别而有很大差异:从印度和白人男性的 98%的准确率到黑人女性的 46%的准确率。

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

Accuracy for Gender Prediction Model

结果显示了在研究中发现的类似的性别偏见,即该模型在女性图像上的表现始终低于男性照片。当比较所有类别时,该模型对黑人女性的照片表现最差。差异之大令人惊讶。所有种族的男性都被正确分类,准确率为 96%,而表现最好的女性种族只有 63%的准确率。如下图所示,女性的年龄进一步放大了这种不准确性。

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

Accuracy of Gender Predictions for Females Only

与我们在预测年龄时看到的类似,在测试数据中,年龄最大的受试者的性别预测表现最差。我们也看到了对黑人女性的偏见,这种偏见导致了所有年龄段的预测都不准确。

这些结果反映了训练数据集中的问题。训练数据中男性人数比女性多两到三倍,少数民族人数不足。最令人惊讶的是,鉴于训练数据集主要是白人,所有种族的男性结果都是如此——这表明种族并没有显著影响男性的性别预测。对于女性来说,种族扮演着重要的角色,这可以从所有年龄组的种族的不同准确性中看出。此外,该数据表明,对女性性别预测的最大偏差是年龄。

测试我们的模型

作为最后的测试(也是为了我们自己的享受),我们将模型指向我们自己和朋友。为此,我们收集了 51 张人们的脸部照片,其中包括他们在脸书的个人资料照片和亲自拍摄的照片。我们的目标是表明,我们重新训练的模型在预测年龄和性别方面比根据名人图片训练的原始模型更准确。

重新训练的模型在拍摄真人照片时表现优于原始模型,而原始模型在精心挑选和光线充足的脸书个人资料照片上表现更好。

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

我们认为,性能的差异与训练数据集的差异一致,在训练数据集中,人们策划的高质量脸书个人资料照片更接近地反映了名人形象,而真人照片更接近地反映了我们重新训练模型中使用的普通人。总体而言,重新训练的模型表现最佳,准确率提高了 10–20%。

结论

作为在不平衡数据集上训练的结果,我们 CNN 的预测尖锐地展示了其预测中的种族、性别和年龄偏见。通过重新训练和重新平衡数据,我们能够在减少偏倚方面取得增量改进,将年龄的初始 MAE 提高 24%。然而,这些改进只是渐进的变化。需要对更好地代表少数民族的平衡数据集进行深思熟虑的监管,以适当消除这些偏见。鉴于机器学习模型在企业和政府中的普遍存在,这一点尤为重要,这些模型是根据这些数据集进行训练的。有大量证据表明有偏见的模型对少数群体产生了影响,但由于知识差距、数据收集的成本以及部署这些模型时有限的制衡,变化是缓慢的。透明度和意识是重要的第一步,但要真正确保机器学习对每个人都是公平和负责的,还有更多工作要做。

GITHUB 资源库

****【https://github.com/rmmeade/APM_Faces_Proj/settings ****

资源

特别感谢奥斯汀德克萨斯大学的 Joydeep Ghosh、Shubham Sharma & Disha Makhija 博士的慷慨指导和建议。

年龄和性别预测 CNN 发自 Sefik Ilkin Serengil

UTK 人脸数据集

IMD b-维基百科数据集

性别差异:商业性别分类的交叉准确性差异

男人对于电脑程序员就像女人对于家庭主妇一样?去偏置词嵌入

基因组学在多样性上失败了

朱莉娅·安格温、杰夫·拉森、苏亚·马特和劳伦·基什内尔的《机器偏见》,ProPublica

人脸识别、卷积神经网络和子空间学习

预测模型中的偏差—第 1/2 部分

原文:https://towardsdatascience.com/bias-in-predictive-models-part-1-2-ebba5c9ab94b?source=collection_archive---------27-----------------------

对抗偏见的第一步是定义它。

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

摘要

人工智能已经在我们的生活中发挥了重要作用,很快它将做出越来越多改变生活的决定。人工智能的公平和偏见问题正在吸引越来越多的研究和立法者的关注。关于什么是偏倚以及如何测量偏倚,有几种可能的定义,每一种都有自己的优点,但也有适用性的限制。

使用哪一种是一个重要的(也不是很简单的)选择,公司,可能还有监管者都需要做出这个选择。

介绍

还记得最近关于亚马逊人工智能招聘工具对女性产生偏见的故事吗?幸运的是,他们的团队能够在模型投入生产之前发现问题。人工智能已经在我们的生活中发挥了重要作用,很快它将做出越来越多改变生活的决定。你会得到那份工作吗?贷款被批准了吗?你的产品会被推荐吗?你的社交媒体账户会被屏蔽吗?你的孩子会被那所大学录取吗?你会被“随机”选择进行深入的税务审计吗?甚至,你会提前出狱吗?并不是这个列表上的所有决定都已经被人工智能完成了,但是很多已经完成了,而且这个列表每年都在增长。

这个关于布劳沃德县累犯率的 ProPublica 分析中,显示(见下表)没有再犯的非裔美国人被(错误地)标记为高风险的可能性几乎是白人的两倍。

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

大多数类型的人工智能,如果任其自生自灭,将会延续它们被训练的历史数据中存在的任何趋势(包括偏见)。如果女性以前是劳动力的一小部分,这就是人工智能要学习的(就像亚马逊招聘工具的故事一样)。

有了这么多的利害关系,难怪这个话题越来越受到关注,无论是来自研究人员的还是现在来自立法者的

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

数字摘自本文

这个问题提出了两个高层次的问题:

  1. 什么是偏差,如何衡量偏差?
  2. 如果存在偏见,又能做些什么呢?

这两个问题都不容易回答。在这篇文章中,我们集中讨论偏见的定义和衡量方法。解决这个问题的方法将在后续讨论。

偏见的定义

在一个理想的世界里,每个人都希望他们的模型是“公平的”,没有人希望他们是“有偏见的”,但是这到底意味着什么呢?不幸的是,关于偏见或公平,似乎没有一个普遍认可的定义。

在这篇关于衡量模型公平性的不同方法的伟大文章中,谷歌 People + AI Research (PAIR)的常驻作家大卫·温伯格(David Weinberger)提出了不少于五个(!)定义什么是公平的方法各不相同,各有利弊。

有趣的是,一些更直观的方法,如“群体无意识”或“人口统计均等”有时并不适合现实生活中的问题。

**【群体无意识】**方法规定,如果完全忽略受保护的班级信息(如性别),结果将反映申请人的客观优点,这是公平的。如果结果是某个性别的代表比例失调,这就是“数据所显示的”。然而,在现实生活中,事情往往更复杂。性别信息可能隐藏在一些其他变量(代理)中,而源于过去可能存在的歧视的女性比例较低将会悄悄进入我们的新模型(就像亚马逊案例或这个谷歌翻译示例中发生的那样)。有些问题,比如医学诊断,可能直接取决于性别。在其他问题中,一些参数的意义可能间接取决于性别。例如,在简历分析中,女性就业中的某些差距可能表示产假,与一个人不能或不愿找到工作时的就业差距相比,产假具有不同的含义。总的来说,有时引用受保护的变量是可以的,甚至是可取的,不引用它们并不能保证不会有偏差。

另一种常见的方法,**“人口统计均等”**有效地假设了结果的均等。根据这一假设,如果有 30%的橙色申请人,我们希望看到 30%的橙色批准。“人口均等”的概念与“不同影响”标准非常相似,后者用于美国反歧视法律框架,监管信贷、教育、就业等领域。然而,这种方法的应用远非显而易见。这些橙色的申请者和蓝色的一样合格吗?什么应该算 100%?**一些缩小差距的方法可能导致相似的人受到不同的待遇,这本身就可以被视为歧视。**一个这样的案件甚至到达了最高法院,而一般的话题是法律讨论的主题,这超出了本概述的范围。

这种同等结果的假设在某些情况下可能是正确的,但它总是正确的吗?有时,由于与偏差无关的原因,受保护变量与输出相关。例如,某些疾病的发生率在不同性别或种族之间可能有很大差异。

最近,英特尔宣布他们实现了“全性别代表”,只有大约 27%的女性员工。“人口均等”的天真应用当然会失败,因为 27%远低于女性在总人口中的比例。英特尔可以这样说,因为他们只使用相关大学学位的毕业生作为参考,因为根据英特尔的说法,只有她们才是合格的女性候选人。

在统计学中,估计量的偏差定义为估计量的期望值与被估计参数的真值之间的差值。然而,在现实生活中,往往很难知道这个“真实价值”是什么。如果被拒绝的借款人获得了贷款批准,他们真的会偿还贷款吗?

有时我们有机会知道所有候选人的实际结果,包括被拒绝的候选人。例如,在这种情况下,该模型预测现有罪犯未来犯罪的可能性,在他们被释放几年后,我们可以知道谁实际上犯了另一个罪行,谁没有。在贷款案例中,被特定银行拒绝贷款的人可能仍然能够在其他地方获得贷款,并且信用局可能有关于他们随后付款的信息。对于这种情况,在已知实际结果的情况下,由谷歌大脑团队和加州大学伯克利分校“机器学习的公平性”教师 Moritz Hardt 提出的以下标准似乎是适用的:

应该调整系统,使两个类别的批准和拒绝总数中出错的百分比相同

**换句话说,我们将对不良申请人的批准对优秀申请人的拒绝因不同阶层(如性别)**差异太大的情况定义为有偏见(并希望避免)。注意,我们不需要假设任何关于正确批准或拒绝的比率。尽管很吸引人,但这一指标有些不太直观,当然,只有在实际结果已知时才适用,例如在对历史数据进行回溯测试时。

总之,有多种方法来定义和衡量偏见,这可能或多或少适合你的特殊问题。使用哪一种是一个重要的(也不是很简单的)选择,公司,可能还有监管者都需要做出这个选择。

在选择了某种检测偏差的方法后,下一个挑战是减轻偏差。一些减轻偏见的方法,包括现有的和新的,将在下一篇文章中讨论。

人工智能法庭决策中的偏见——在对抗之前发现它

原文:https://towardsdatascience.com/bias-in-the-ai-court-decision-making-spot-it-before-you-fight-it-52acf8903b11?source=collection_archive---------12-----------------------

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

Image by TPHeinz from Pixabay

法院判决中的机器学习

在不同的决策过程中,包括在司法实践中,机器学习的使用越来越频繁。由于法院判决对个人的个人和职业生活以及整个社会都有很大的影响,因此能够识别并理想地纠正人工智能(AI)系统中的偏见以避免该模型做出不公平或不准确的决定,从而潜在地放大我们社会中现有的不平等是很重要的。

优势

在法庭决策中使用机器学习的目标应该是使决策和决策过程更好,即更准确、公正、更快和成本更低。或许令人惊讶的是,AI 模型实际上可以帮助法官发现并打击自己的偏见。该系统可以根据历史统计数据,在法官的语言中检测到他或她注意力不集中、即将做出仓促决定或缺乏同情心时,向法官发出警告。该模型可以通过加权外部因素来实现这一点,这些因素可能会影响决策,如一天中的时间、温度甚至选举期即将到来的事实。正如丹尼尔·卡内曼在他的《思考,快与慢》中所描述的那样,在对以色列假释法官的研究中,这些外部因素对法官决策的影响已经显现出来。被观察的法官将遭受所谓的葡萄糖耗竭,这导致他们更倾向于在用餐休息后批准假释,每次用餐后批准率达到 65 %,而平均只有 35 %的假释请求获得批准。

现状

显然,在目前的技术阶段,只有某些法院判决或部分法院判决可以由算法做出。人工智能已被用于所谓的预测性警务,在这种情况下,基于可用的数据,算法可以帮助警方或法院就案件的特定方面做出决定。例如,这可以是批准假释、决定保释和确定适当的刑期。例如,法院可以使用这种软件来评估被告在假释期间再次犯罪的风险,如果获准保释,他是否会出庭,或者是否应该考虑缓刑。此外,机器学习也被用于判决的实际渲染。这些案件通常涉及小的民事法律纠纷,包括推翻或决定停车罚款。爱沙尼亚最近推出了试点机器人法官,将裁决涉及小额索赔的纠纷。

人工智能法院判决中的偏见

尽管优势很多,并且随着技术的进步,可能是无限的,但在法庭决策中部署人工智能的风险规避方法是至关重要的。在启动任何算法来代替人类法官做出裁决之前,我们必须确保它做出的决定至少与人类法官一样公正合理。欧盟委员会人工智能高级专家组认为,当一个人工智能系统合法、符合道德规范且强健时,它就是值得信赖的。

当谈论道德人工智能时,需要考虑的最大问题是算法本身或数据中是否存在偏差,无论是有意识的还是无意识的,因为它会影响和扭曲计算和预测过程。

  • **偏差可能是采样和测量中的错误造成的,导致数据不完整,基于太少的数据或仅仅是错误的。**这是一种由于数据收集或生产过程的疏忽而导致使用错误数据的情况。这种偏差在理论上可以通过重新操作数据收集和生产系统并包括丢失的数据或替换坏的数据来纠正。然而,如果数据丢失是因为它根本就不存在,那么纠正偏差将是一项更加困难的任务。例如,当某些类型的犯罪实际上没有受到调查,因而一群罪犯由于警察的偏见做法而没有受到起诉时,就会发生这种情况。
  • 这些数据本身也可能带有反映社会不平等的偏见。目前最基本的偏见涉及种族和性别不平等,以及与个人的社会背景和性取向有关的不平等。这可以反映在内容本身以及数据的语言中,但不必明确提及。例如,案件事实和情况或被告行为的描述方式可能带有被告种族或社会阶层的信息偏见。根据种族不容忍程度较高的地区的历史数据预测与某一被告行为相关的风险的算法,可能反映出执法部门不成比例地针对非裔美国人,导致在收集数据的最终民意调查中这种数据的比例过高。
  • 此外,当数据反映了欺诈性信息、伪造的文件、伪造的证据或其他被操纵或非法的事实或受其影响时,不干净的数据(与干净的高质量数据相反)也可能导致偏差。这种偏见,如果被发现,会将整个人工智能系统的使用转移到一个潜在的非法领域,并增加开发者和用户的责任风险。

对抗偏见

一个建立在并使用坏的或肮脏的数据之上的模型有可能通过增加其工作产出(决策)与社会价值(平等待遇、公正程序等)之间的脱节,在社会中进一步传播歧视和不平等。),最终做出不公正或不准确的决定。因此,在人工智能系统部署之前或在更糟的情况下部署之后,发现并消除不公平的偏见(与故意引入的偏见相反)至关重要。

由于包括法院在内的公共领域使用的人工智能系统主要是由私营公司开发的,除非以这种方式明确编程,否则它们并不带有保护司法或人权的内在承诺。换句话说,这个系统是不道德的,除非它是如此。

AI 模型尽职调查

理想的情况是,由于人工智能对我们的生活和我们的基本人权具有巨大的潜在影响,人工智能将受到与其他重要部门类似(如果不是更严格的话)的监管,例如空中交通、卫生系统或法律实践。目前,在国家、欧洲和国际层面上有许多倡议正在进行,以界定人工智能监管的关键原则(见经合组织人工智能原则)。然而,目前任何定义明确的监管制度与其说是短期内可以实现的,不如说是乌托邦。与此同时,为了确保现在部署的人工智能系统能够尽可能公正和准确地做出决定,软件必须接受 T2 持续的审计。

无论它在首次部署时看起来有多准确,使用它的法院都必须持续确保它始终如一地执行,并做出公平的裁决,将质量与人类法官的裁决进行比较。虽然引入一种纠正措施来消除已识别的偏差在理论上是可行的,但的实践表明通过允许人为引入一些变量来使人工智能系统合乎伦理是非常困难的。

个案尽职调查

在对人工智能模型本身进行审核之后,整个人工智能法院决策模型的第二层是确保它从各个相关方的角度来看是可验证的。我们不应该忘记,人工智能系统没有感觉或关心,因此,如果它做出不公正的决定,它不会意识到这一点。此外,它也没有说明为什么会有这样或那样的裁决。因此,从本质上来说,它缺乏在案件当事人眼中值得信赖的核心价值——可解释性。

AI 可解释性或可解释性指的是一个尽职调查过程,该过程使有关各方能够要求对机器学习决策背后有法律或其他重大影响的解释,并可能对其提出质疑。尽管这是一般审计义务的一部分,但这一措施也要求各方有权在可能和合理的范围内访问人工智能模型使用的数据和生成的信息。

在实践中,揭示人工智能模型做出的决策的推理过程可能并不总是容易,甚至是不可能的。通常,可解释性最高级别的预测模型,如决策树和分类规则,缺乏预测准确性,反之亦然-神经网络通常非常准确,但对于它们如何进行计算却非常不透明。然而,即使在使用深度学习时,对 AI 模型的整体审计以及确保尽可能高的决策过程可追溯性将提供某种程度的透明度,从而具有可解释性。

人工智能培训

用于法院决策的人工智能系统通常不是由法院自己开发或实现的,而是由外包开发商或供应商开发或实现的。因此,决策者和相关方往往不了解和不理解系统是如何工作的,以及它是根据什么标准做出决策的。此外,人工智能系统可能不会完全取代人类法官和律师,而只是对他们进行补充。

在这两种情况下,如果法官和律师对所使用的人工智能模型、输入变量和预测方法有很好的理解,或者至少有一些理解,这将是有益的。现在用神经网络训练所有的律师和法官既不可行,也没有必要。然而,作为第一步,我们可以集中精力进行培训,以发现常规决策中的偏见和肮脏数据,从而使法律专业人员对歧视性语言或欺诈性数据的使用更加警觉。更高的偏见意识,结合对机器学习过程及其优势和局限性的基本理解,可以帮助相关各方对通过尽职调查提供的信息有所了解,并改善迄今为止不完善的人工智能模型在决策中的使用。

系统性变化

即使在软件部署之前和使用期间进行深入的尽职调查,以发现和修复任何潜在的偏差,也不足以做出完美、准确和公正的决策。收集到的数据中的偏差很有可能反映出社会中现存的不公正和不平等。除非在创建数据集时特别关注这种文化和社会规范和陈规定型观念,或者错误和不道德的执法做法和政策,除非有目的地纠正这些做法和政策,否则我们只会面临进一步扩大其偏见的风险。

只有在数据收集、制作和标记过程以及算法的使用有明确的规则、得到理解和监督的情况下,才能确保参与决策的所有行为者,无论是法官、律师、书记员还是执法当局,都努力确保最高水平的准确性和公正性。

如果我们无法部署一个无偏见的系统,或者一个让各方有足够理由相信它达成了公平决定的系统,一个中间解决方案可能是使用人工智能系统来补充人类决策。这样,我们可以加快司法程序,更深入地分析案件事实,或者在保护司法的同时节省费用。仅仅因为一项技术是可用的,并不意味着它应该取代现有的政策。

偏差、方差和正则化

原文:https://towardsdatascience.com/bias-variance-and-regularization-f3a0eefe99af?source=collection_archive---------23-----------------------

数据科学中的三个基本概念

每一个初露头角的数据科学家都面临着一个困境,那就是接受诸如过拟合、欠拟合、偏差、方差以及最后但并非最不重要的正则化等词汇。

我的一个有趣的同事会对所有数据科学问题给出相同的答案。“它必须被正规化”,然后笑着说。有趣的是,他会侥幸逃脱,因为大多数时候他是对的。

让我们看看这些术语,并把它们一个一个地铭刻在我们的记忆中。这是我对每个术语的理解,如果你觉得我错了,请随时纠正我。保留下图作为参考来理解这些概念。

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

source: https://towardsdatascience.com/understanding-the-bias-variance-tradeoff-165e6942b229

  • **偏差:**假设你的机器学习模型在一组数据上表现非常糟糕,因为它没有推广到你所有的数据点。这是当你说你的模型有很高的偏见。当模型不合适时,会出现这种现象。
  • **方差:**假设你的机器学习模型试图成功地解释一个数据集中的所有或大部分所有点。如果它在其他测试数据集上运行时表现不佳,则称之为高方差。因此,当模型过拟合时,就会出现偏差。
  • **正则化:**用于处理高方差的回归方法称为正则化。正则化对过度拟合模型的作用是,通过惩罚回归系数,消除或最小化具有较大异常值的预测器列的影响。结果是一个更平滑的模型,可以很好地工作在具有类似数据的其他测试数据集上。

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

Source: https://en.wikipedia.org/wiki/Regularization_(mathematics)#/media/File:Regularization.svg

附加信息:

我通过 sklearn 使用了两种主要类型的正则化子。

  1. 这个正则化器基本上试图同时惩罚所有的系数。
  2. Lasso: Lasso 选择性地仅惩罚具有高异常值的预测值,并从模型中忽略这些预测值。因此,其结果是一个能很好地概括新数据的模型。

线性回归中的偏差、方差和正则化:套索、脊和弹性网——差异和用途

原文:https://towardsdatascience.com/bias-variance-and-regularization-in-linear-regression-lasso-ridge-and-elastic-net-8bf81991d0c5?source=collection_archive---------6-----------------------

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

Photo by pan xiaozhen on Unsplash

回归是一种非常流行和常见的机器学习技术。往往是学习机器学习的起点,线性回归对于容易理解的问题是一种直观的算法。它通常可以在你试图预测一个连续变量(一个可以取某个数值范围内的任何值的变量)时使用,线性回归和它的亲属通常是强有力的选择,并且几乎总是最好的起点。

线性回归

这个博客假设了普通最小二乘(OLS)线性回归的功能知识。你可以在这里这里或者这里阅读更多关于 OLS 线性回归

偏差-方差权衡

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

From Seema Singh

在机器学习中建立最佳模型的很大一部分是处理偏差-方差权衡。偏差是指模型的正确(或不正确)程度。一个非常简单的模型,犯了很多错误,据说有很高的偏差。一个在训练数据上表现良好的非常复杂的模型被称为具有低偏差。与偏差负相关的是模型的方差,它描述了如果一个预测因子发生轻微变化,预测可能会发生多大的变化。在上面提到的简单模型中,模型的简单性使得其预测值随预测值变化缓慢,因此方差较低。另一方面,我们复杂的低偏差模型可能非常适合训练数据,因此预测值会随着预测值的轻微变化而大幅变化。这意味着这个模型有很高的方差,它不能很好地推广到新的/看不见的数据。

低偏差/高方差模型表现出所谓的过度拟合,即模型有太多的术语,并在总体趋势之上解释数据中的随机噪声。这导致它对模型以前没有见过的数据表现不佳。高偏差/低方差模型表现出所谓的拟合不足,即模型过于简单/术语太少,无法正确描述数据中的趋势。同样,该模型将在新数据上苦苦挣扎。这两种模型类型都不理想,我们希望达到某种中间状态,在这种状态下,我们有适当数量的项来描述趋势,而不适合噪声。因此,我们需要某种特征选择,其中与因变量没有关系的预测因子在最终模型中没有影响。

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

Image from Sydney Firmin

偏差-方差权衡如上图所示。模型的总误差由三项组成:偏差、方差和不可约误差项。正如我们在图中看到的,我们的总误差最小化的最优解是在某个中等模型复杂度,偏差和方差都不高。

OLS 线性回归的弱点

线性回归找出使 R 最大 RSS 最小的系数值。但是这可能不是最好的模型,并且将为提供的每个预测值给出一个系数。这包括几乎没有预测能力的术语。这导致了一个高方差、低偏差的模型。因此,我们有潜力改进我们的模型,通过用偏差交换一些方差来减少我们的总体误差。这种交易以正则化的形式出现,其中我们修改我们的成本函数来限制我们的系数的值。这使得我们可以用过度的方差来换取一些偏差,从而潜在地减少我们的总体误差。

套索

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

The Lasso cost function, from Wikipedia

Lasso(有时风格化为 lasso 或 LASSO)在成本函数中添加了一个附加项,将系数值之和(L-1 范数)乘以一个常数λ。这个额外的项对模型不利,因为它的系数不能解释数据中足够的变化量。它还倾向于将上述不良预测器的系数设置为 0。这使得套索在特征选择中很有用。

然而,Lasso 对某些类型的数据感到困惑。如果预测值的数量§大于观测值的数量(n),Lasso 将最多选取 n 个预测值作为非零值,即使所有预测值都相关。Lasso 还将与共线要素(它们是相关的/强相关的)进行斗争,在这种情况下,它将只选择一个预测值来表示相关预测值的完整套件。这种选择也将以随机的方式进行,这不利于再现性和解释。

重要的是要注意,如果λ= 0,我们实际上没有正则化,我们将得到 OLS 解。当λ趋于无穷大时,系数将趋于 0,模型将只是一个常数函数。

里脊回归

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

Thanks to Kyoosik Kim

岭回归还在成本函数中增加了一个附加项,但取而代之的是对系数值的平方(L-2 范数)求和,并将其乘以某个常数λ。与 Lasso 相比,这个正则化项将减少系数的值,但不能强制系数正好为 0。这使得岭回归的使用在特征选择方面受到限制。然而,当 p > n 时,与 Lasso 不同,如果需要,它能够选择 n 个以上的相关预测因子。它还会选择共线特征组,发明者称之为“分组效应”

与 Lasso 非常相似,我们可以改变λ来获得具有不同正则化级别的模型,其中λ= 0 对应于 OLS,λ接近无穷大对应于常数函数。

有趣的是,对套索和岭回归的分析表明,这两种技术并不总是比另一种更好;人们必须尝试这两种方法来决定使用哪一种方法。

弹性网

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

Thanks to Wikipedia

弹性网包括 L-1 和 L-2 范数正则项。这给了我们套索和岭回归的好处。已经发现它具有比 Lasso 更好的预测能力,同时仍然执行特征选择。因此,我们可以两全其美,用山脊的特征组选择来执行 Lasso 的特征选择。

弹性网络带来了确定最优解的两个λ值的额外开销。

快速示例

使用 sklearn 中可用的波士顿住房数据集,我们将检查我们所有 4 个算法的结果。在这些数据的基础上,我对数据进行了缩放,并创建了 5 个额外的随机噪声“特征”,以测试每个算法过滤掉无关信息的能力。我不会做任何参数调整;我将实现这些现成的算法。你可以在 sklearn 的文档中看到默认参数。(线性回归套索山脊弹力网)。)我的代码很大程度上是从 Jayesh Bapu Ahire 的这篇文章中采用的。我的代码可以在我的 github 这里找到。

系数

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

Linear Regression Coefficients

我们可以看到,线性回归为我们的所有 5 个噪声特征分配了非零值,尽管它们都没有任何预测能力。有趣的是,这些噪声要素的系数大小与数据集中的一些真实要素相似。

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

Lasso Coefficients

正如我们所希望的,Lasso 做得很好,将我们的所有 5 个噪声特征减少到 0,以及数据集中的许多真实特征。这确实是一个比线性回归简单得多的模型

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

Ridge Regression Coefficients

岭回归犯了一个类似的错误,即非正则化线性回归,将系数值分配给我们的噪声特征。我们也看到一些特征具有非常小的系数。

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

Elastic Net Coefficients

很像套索,弹性网使几个特征的系数为 0。然而,它不像 Lasso 那样产生很多系数 0。

模型性能

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

Mean Squared Error of the different models

对于所提供的示例,根据 MSE,岭回归是最佳模型。这可能看起来违背直觉,但重要的是要记住岭回归模型用一些方差来换取偏差,最终导致总体误差更小。套索和弹性网模型用大量的方差换取了偏差,我们发现我们的误差增加了。

有趣的是,套索和弹性网比线性回归有更高的 MSE。但这是否意味着这些模型毫无疑问更糟糕呢?我认为不是,因为套索和弹性网模型也执行特征选择,这给了我们模型更好的可解释性。系数被解释为因变量的变化,预测值增加一个单位, *所有其他预测值保持不变。*在复杂模型的情况下,不能合理地满足保持所有其他预测因子不变的假设。

最终,使用哪种模型最终取决于开始分析的目标。我们在寻找最好的预测吗?那么岭回归似乎是最好的。我们是否在寻找可解释性,寻找对底层数据的更好理解?那么弹性网可能是一条路要走。请记住,我没有参数调整。这些算法都有许多相关的参数,可以根据分析的目标调整这些参数来改进模型。作为数据科学从业者,我们的工作是定义这些期望(在分析开始之前),以帮助指导我们找到最佳解决方案。

结论

  1. 偏差-方差权衡是复杂模型和简单模型之间的权衡,其中中等复杂度可能是最好的。
  2. Lasso、Ridge Regression 和 Elastic Net 是普通最小二乘线性回归的修改,它们在成本函数中使用额外的惩罚项来保持较小的系数值并简化模型。
  3. 当数据集包含预测能力较差的要素时,Lasso 对于要素选择非常有用。
  4. 岭回归对于分组效果很有用,可以一起选择共线特征。
  5. 弹性网结合了套索和岭回归,有可能产生一个既简单又有预测性的模型。

机器学习中的人类偏见

原文:https://towardsdatascience.com/bias-what-it-means-in-the-big-data-world-6e64893e92a1?source=collection_archive---------20-----------------------

这对我们现代大数据世界意味着什么

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

偏见是人性不可避免的一部分。之前的研究表明,当人们分心时,认知偏差会优化大脑功能。偏见受到你的环境、经历的影响,并且很难消除。最小化偏见影响的一个方法是意识到你可能会遇到的偏见。

在这篇文章中,我将描述不同类型的偏见在机器学习项目中可能造成的一些影响。举例说明由这些偏见引起的问题的根源以及为什么偏见是有用的。

由于人类固有的偏见,偏见会反映在世界上存在的所有数据中。随着机器学习和大数据的日益普及和普及;世界上存在着难以想象的数据深度和可用工具。有了这些数据,偏见会影响数据和我们的推论。

偏差不仅仅存在于数据中,科学家在进行研究、实验或实现算法时也可能存在不可知的偏差。简单的步骤,例如在测试时不考虑某些参数或特性,可能会导致真正的后果。

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

Source

影响机器学习算法的偏差的术语是机器偏差。它与所用数据的偏差或研究者的偏差如何影响最终结果有关。机器偏差对现实世界有影响,会带来危险并强化系统偏差。

示例 1:图像识别中的采样偏差

对于自动驾驶汽车中的行人检测,有色人种更难分类。

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

Note: This was research from a scientific paper, which does not reflect commercial self-driving systems

这个具体问题是由采样偏差引起的,这是一种来自不平衡训练数据的偏差,它不能代表模型将在其中运行的环境。例如,只在美国农村的行人照片上训练的行人识别模型在多元文化的城市中不会很好地运行,因为来自两个人口的行人不会有相似的外观。

这个例子是在现实生活中实现的,因为社会正在向更多的自动驾驶汽车发展。这个问题很可能是由于在训练 CNN 算法时,训练数据中缺少来自代表性不足的背景的个体而引起的。这也可能是由于深色皮肤或深色衣服与背景之间的对比度较低的自然困难造成的。

示例 2:情感分析中的偏见

偏见偏见当算法接受来自数据源的细微偏见时,即使它被完美地采样。

用来描述这种偏见的经典例子是一个机器学习模型,它旨在区分照片中的男性和女性。训练数据包含厨房中女性的图片比厨房中男性的图片多,或者男性编码的图片比女性多,则算法被训练为由于数据中表示的真实世界中发生的偏见而对从事这些活动的人的性别做出不正确的推断。

情感分析是使用机器学习算法来检测文本主体的情感或主观情感。目前,这些算法通过利用预构建的单词嵌入来运行,单词嵌入是一种预设计的模型系统,用于产生从文本主体构建语言上下文的向量,以分析文本的情感。然而,几乎所有流行的单词嵌入都是在人类数据上训练的,如新闻文章( word2vec )或网页(手套)以及受到现实世界中偏见影响的

下面是使用手套嵌入和线性分类器构建的简单情感分析模型的输出示例。这个简单的情感分析模型的例子并没有反映消费者层面的系统。

text_to_sentiment("this example is pretty cool")
3.8899689260
text_to_sentiment("this example is ok")
2.7997773492
text_to_sentiment("meh, this example sucks")
-1.1774475917

这就是该系统的预期工作方式,即“相当酷”与其他积极的词相关,这给了它比“糟透了”更高的分数。

text_to_sentiment("Let's go get Italian food")
2.0429166109
text_to_sentiment("Let's go get Chinese food")
1.4094033658
text_to_sentiment("Let's go get Mexican food")
0.3880198556

偏见的影响出现了,因为带有单词“墨西哥”和“中国”的负面网页比带有单词“意大利”的负面网页多,所以带有“意大利”的情绪得分比其它单词更积极。

text_to_sentiment("My name is Emily")
2.2286179365
text_to_sentiment("My name is Heather")
1.3976291151
text_to_sentiment("My name is Yvette")
0.9846380213
text_to_sentiment("My name is Shaniqua")
-0.4704813178

这个例子与上一个类似,与不太常见的名字相比,更常见的名字往往出现在更积极的网页中,这提高了积极的情绪。

简单地说,种族偏见存在于情感分析系统中,因为种族偏见也出现在训练它的数据中。当单词的情感被网页训练时,在 GloVe 的情况下,种族单词或名字可能具有较低的情感,因为包含那些单词或名字的正面 web 评论和页面的数量较少。这在我们的模型中产生了种族偏见,因为给出的数据只会强化现实世界中存在的系统性偏见。

偏见以多种形式存在,例如刑事司法系统中带有预测模型的种族偏见并且很难纠正,因为它来自于现实世界中存在的偏见的反映。了解您正在处理的数据的领域知识,并意识到其中存在的复杂性,这一点很重要。

例子 3:算法偏差,策划“年度最佳播放”

有时候,这真的只是算法的问题。算法偏差是当算法,由于它是如何设计的,将有偏见内置。Spotify 每年都会根据你前一年听的歌曲创建一个播放列表。由于算法的设计,你两年前听的歌曲存在算法偏差。因为算法考虑了你听了多少前一个播放列表中的歌曲,它为那些歌曲建立了一个偏好。

但这并不是一件坏事

人类通常不会经历音乐偏好的剧烈变化。你前几年喜欢的歌曲在今年会变得更加有趣。偏差不是固有的负值,虽然算法中存在偏差,但算法在 Sporify 平台中是有效的。有偏差的训练数据是一种预处理数据。意识到这种偏见很重要,但这不一定是件坏事。

比如 LinkedIn 有一个 messenger 系统,有很棒的回复建议系统。这是因为 LinkedIn 训练其模型的信息更偏向于商务正式信息。有偏差的训练数据可以使基于使用它们的上下文的模型受益。LinkedIn 的回复推荐系统如果用于非正式的短信,效果不会很好,但对于基于职业生涯的专业网站中的商业信息来说是完美的。

重要的是要意识到在分析过程的每一步中可能出现的偏差。意识到偏见以及它们如何通过上下文影响我们的模型是很重要的,因为它可能是致命的缺陷,也可能是惊人的好处。随着世界上收集和分析的数据越来越多,了解数据的所有细节和复杂性非常重要。

理解机器学习算法就是算法很重要。在统计和编程的下面是简单地试图最大化或最小化一个等式的数学等式。说到底,大家都明白“垃圾进就是垃圾出”。

注意:因为我想把重点放在可能来自数据或模型实现的偏差形式上,所以我选择谈一点关于统计和机器学习偏差的技术定义。

参考

[1] S. Plous,《偏见、定型和歧视的心理学:概述》 (2003 年),理解偏见和歧视(第 3-48 页)。美国纽约州纽约市:麦格劳-希尔公司。

[2] S. Lee 和 S. Lebowitz, 20 种让你的决定变得一团糟的认知偏见 (2015),商业内幕

[3] B. Wilson,J. Hoffman 和 J.Morgenstern,物体检测中的预测不平等 (2019),arXiv

[4] A. Caliskan,J. J Bryson 和 A. Narayanan,从包含类人偏见的语言语料库中自动导出的语义 (2017),科学356 (6334),183–186。https://doi.org/10.1126/science.aal4230

[5] R. Speer,如何在不真正尝试的情况下制造一个种族主义的人工智能 (2017),ConceptNet 博客

[6] J. Angwin,J. Larson,S. Mattu 和 L. Kirchner,机器偏差 (2016),Propublica

大数据分析:Spark 和 Hadoop

原文:https://towardsdatascience.com/big-data-analysis-spark-and-hadoop-a11ba591c057?source=collection_archive---------8-----------------------

介绍大数据和用于处理大数据的不同技术,如 MapReduce、Apache Spark 和 Hadoop。

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

(Source: https://images.xenonstack.com/blog/10-vs-of-big-data.png)

大数据

据《福布斯》报道,每天产生大约 2.5 万亿字节的数据。尽管如此,这个数字预计在接下来的几年里会不断增加(90%的现有存储数据是在过去两年内产生的)[1]。

大数据不同于存储在关系数据库中的任何其他大量数据的地方在于它的异构性。这些数据来自不同的来源,并且是用不同的格式记录的。

通常采用三种不同的数据格式化方式:

  • 非结构化 =无组织的数据(如视频)。
  • 半结构化 =数据以不固定的格式组织(如 JSON)。
  • 结构化 =数据以结构化格式存储(如 RDBMS)。

大数据由三个属性定义:

  1. =由于数据量大,在单台机器上存储数据是不可能的。我们如何在多台机器上处理数据以确保容错?
  2. 多样化=我们如何处理来自不同来源、使用不同模式格式化的数据?
  3. 速度 =如何快速存储和处理新数据?

可以使用两种不同的处理技术来分析大数据:

  • 批处理 =通常在我们关心数据的数量和种类时使用。我们首先存储所有需要的数据,然后一次性处理这些数据(这会导致高延迟)。一个常见的应用示例是计算每月工资总额。
  • 流处理 =如果我们对快速响应时间感兴趣,通常会采用。我们一收到数据就进行处理(低延迟)。一个应用示例可以是确定银行交易是否是欺诈性的。

大数据可以使用不同的工具进行处理,如 MapReduce、Spark、Hadoop、Pig、Hive、Cassandra 和 Kafka。每一种不同的工具都有其优势和劣势,这决定了公司可能决定如何使用它们[2]。

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

Figure 1: Big Data Tools [2]

现在,许多公司普遍使用大数据分析来预测市场趋势、个性化客户体验、加快公司工作流程等

MapReduce

当处理大量数据并且资源耗尽时,有两种可能的解决方案:水平扩展或垂直扩展。

在水平扩展中,我们通过添加更多相同容量的机器和分配工作负载来解决这个问题。如果使用垂直扩展,我们可以通过增加机器的计算能力(如 CPU、RAM)来进行扩展。

垂直缩放比水平缩放更容易管理和控制,并且在处理相对较小的问题时被证明是有效的。尽管如此,在处理大型问题时,水平缩放通常比垂直缩放更便宜、更快。

MapReduce 基于水平缩放。在 MapReduce 中,计算机集群用于并行化,从而更容易处理大数据。

在 MapReduce 中,我们将输入数据分成许多部分。然后,每个零件被发送到不同的机器进行处理,最后根据指定的 groupby 函数进行汇总。

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

Figure 2: MapReduce in action [3]

阿帕奇火花

Apache Spark 框架是作为 MapReduce 的改进而开发的。让 Spark 从竞争对手中脱颖而出的是它的执行速度,比 MapReduce 快 100 倍左右(中间结果不存储,一切都在内存中执行)。

Apache Spark 通常用于:

  1. 读取存储和实时数据。
  2. 预处理大量数据(SQL)。
  3. 使用机器学习和流程图网络分析数据。

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

Figure 3: Apache Spark Libraries [4]

Apache Spark 可以配合 Python、R、Scala 等编程语言使用。为了运行 Spark,通常使用基于云的应用;如亚马逊网络服务、微软 Azure 和 Databricks(提供免费社区版)。

使用 Spark 时,我们的大数据通过弹性分布式数据集(rdd)实现并行化。rdd 是 Apache Spark 最基本的抽象,它获取我们的原始数据并将其划分到不同的集群(workers)中。RRD 是容错的,这意味着它们能够在任何一个工人失败的情况下恢复丢失的数据。

rdd 可用于在 Spark 中执行两种类型的操作:转换和操作(图 4)。

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

Figure 4: Apache Spark Workflow [5]

转换从 RDD 创建新的数据集,并返回结果 RDD(例如,通过关键操作进行映射、过滤和归约)。所有的转换都是惰性的,它们只在一个动作被调用时执行一次(它们被放在一个执行图中,然后在一个动作被调用时执行)。

取而代之的是使用动作从 Apache Spark 中获取我们的分析结果,并将一个值返回给我们的 Python/R 应用程序(例如收集和获取操作)。

为了在 Spark 中存储键/值对,使用对 rdd。rdd 对由存储在元组中的两个 RRD 组成。第一个元组元素用于存储键值,第二个元组元素用于存储值元素(key,value)。

Hadoop

Hadoop 是一组用 Java 编写的开源程序,可用于对大量数据执行操作。Hadoop 是一个可扩展、分布式和容错的生态系统。Hadoop 的主要组件有[6]:

  • Hadoop YARN =管理和调度系统资源,将工作负载划分到一个机器集群上。
  • Hadoop 分布式文件系统(HDFS) =是一个集群文件存储系统,旨在提供容错、高吞吐量和高带宽。它还能够以任何可能的格式存储任何类型的数据。
  • Hadoop MapReduce =用于从数据库中加载数据,对其进行格式化并对其进行定量分析。

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

Figure 5: Hadoop Ecosystem [7]

Hadoop 的一些应用示例有:搜索(如雅虎)、日志处理/数据仓库(如脸书)和视频/图像分析(如纽约时报)。

Hadoop 传统上是第一个大规模使用 MapReduce 的系统,尽管 Apache Spark 由于其更快的执行速度而成为许多公司的首选框架。

结论

大数据一词最初被用来描述一个问题:我们产生的数据超过了我们实际处理的能力。经过多年的研究和技术进步,大数据现在被视为一个机遇。由于大数据,人工智能和深度学习的最新进展已经成为可能,使机器能够执行几年前似乎不可能执行的任务。

联系人

如果你想了解我最新的文章和项目,请通过媒体关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:

文献学

[1]什么是大数据?—大数据世界入门指南。阿努什里·苏布拉马年,爱德华卡!。访问地点:https://www.edureka.co/blog/what-is-big-data/

[2]查看一些最著名的大数据工具及其优缺点,以分析您的数据。机器人之家。访问:https://www . houseofbots . com/news-detail/12023-1-see-some-best-known-big-data-tools-there-advantage-and-missives-to-analyze-your-data

[3]什么是 MapReduce?。莎娜.珀尔曼塔伦德。访问地点:【https://www.talend.com/resources/what-is-mapreduce/

[4] Apache Spark 文档。访问地点:【https://spark.apache.org/

[5]Apache Spark 的转换和操作是如何工作的…亚历克斯·安东尼,中号。访问:https://medium . com/@ aristo _ Alex/how-Apache-sparks-transformations-and-action-works-CEB 0d 03 b 00d 0

[6] Apache Hadoop 用 5 分钟或更短时间解释。什拉万蒂·登特姆达斯·克雷德拉。访问地址:https://www . credera . com/blog/technology-insights/open-source-technology-insights/Apache-Hadoop-explained-5-minutes-less/

[7] Hadoop 生态系统及其组件—完整教程。数据天赋。访问地址:https://data-flair . training/blogs/Hadoop-ecosystem-components/

大数据分析:用 PySpark 预测客户流失

原文:https://towardsdatascience.com/big-data-analytics-predicting-customer-churn-with-pyspark-19cd764f14d1?source=collection_archive---------10-----------------------

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

Photo by Leio McLaren (@leiomclaren) on Unsplash

对于任何基于订阅的商业模式来说,一个更紧迫的问题是什么让人们订阅,更重要的是退订。带上你的 Spotify-s、Pandora-s 或网飞-es。这些公司的核心收入来源于用户订阅费。因此,如何留住这些客户对他们的生存至关重要。

了解客户流失

在客户群的背景下,good ol’ Wikipedia 将流失率定义为“在给定时间段内离开供应商的合同客户或订户的比例”。换句话说,有多少人在弃船(或大锅)?他们可能会订阅竞争对手的业务,或者完全放弃这项服务。

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

Design by Artpunk101

如果你错过了,大锅是服务的隐喻,泄漏是流失的隐喻。

更确切地说,如果我们的大锅漏得比灌得快,那么它将不可避免地干涸。这是我们当前项目的主要问题:预测哪些用户可能会取消在线音乐流媒体服务的订阅,更重要的是,为什么

让我们从检查我们拥有的数据集开始。

完整的数据集是一个非常细粒度的用户日志,存储在 AWS 上的 12 GB json 文件中——在这样的大小下,只有 Spark 这样的大数据框架才是可行的。为了理解可用的特性并构建我们的模型,我们将从使用一小部分数据开始(大约 128 MB)。该示例将在单台计算机上用于探索性数据分析。

第一步是加载我们的数据,如下所示:

让我们通过打印模式来享受丰富的数据:

root
 |-- artist: string (nullable = true)
 |-- auth: string (nullable = true)
 |-- firstName: string (nullable = true)
 |-- gender: string (nullable = true)
 |-- itemInSession: long (nullable = true)
 |-- lastName: string (nullable = true)
 |-- length: double (nullable = true)
 |-- level: string (nullable = true)
 |-- location: string (nullable = true)
 |-- method: string (nullable = true)
 |-- page: string (nullable = true)
 |-- registration: long (nullable = true)
 |-- sessionId: long (nullable = true)
 |-- song: string (nullable = true)
 |-- status: long (nullable = true)
 |-- ts: long (nullable = true)
 |-- userAgent: string (nullable = true)
 |-- userId: string (nullable = true)

探索性分析

粗略地看了一下数据,我们注意到有些行中缺少了用户 Id。经过进一步调查,似乎只有以下页面没有 userId :

+ — — — — — — — — — -+
|                page|
+ — — — — — — — — — -+
|                Home|
|               About|
| Submit Registration|
|               Login|
|            Register|
|                Help|
|               Error|
+ — — — — — — — — — -+

这让我们相信这些没有 ID 的页面点击来自那些没有注册、没有登录或者没有播放音乐的人。所有这些页面最终都会导致播放音乐。然而,由于这些行包含的大部分都是空值,所以在开始分析之前,我们将删除它们。

仅从上一节的特性名称列表中,我们就可以知道数据有多丰富。可以肯定地说,用户与应用程序的每一次交互都会被记录下来。

在不深入数据的情况下,我们首先需要定义变动。对于我们的项目来说,一个不安的用户就是访问了“取消确认”页面的人。这是用户确认取消请求的地方。此后,任何访问过该页面的用户都将被归类为“搅动者”,否则他们将被视为“非搅动者”。

对我们来说幸运的是,打印出页面特性中的类别表明它就有这样一个值。

+-------------------------+
|page                     |
+-------------------------+
|About                    |
|Add Friend               |
|Add to Playlist          |
|Cancel                   |
|***Cancellation Confirmation***|
|Downgrade                |
|Error                    |
|Help                     |
|Home                     |
|Login                    |
|Logout                   |
|NextSong                 |
|Register                 |
|Roll Advert              |
|Save Settings            |
|Settings                 |
|Submit Downgrade         |
|Submit Registration      |
|Submit Upgrade           |
|Thumbs Down              |
|Thumbs Up                |
|Upgrade                  |
+-------------------------+

通过查看随机用户活动的一些选定列,我们可以获得更好的洞察力。

+--------------------+-------------+---------+-----+---------+
|              artist|itemInSession|   length|level|     page|
+--------------------+-------------+---------+-----+---------+
|         Cat Stevens|            0|183.19628| paid| NextSong|
|        Simon Harris|            1|195.83955| paid| NextSong|
|         Tenacious D|            2|165.95546| paid| NextSong|
|          STEVE CAMP|            3|201.82159| paid| NextSong|
|             DJ Koze|            4|208.74404| paid| NextSong|
|           Lifehouse|            5|249.18159| paid| NextSong|
|Usher Featuring L...|            6|250.38322| paid| NextSong|
|                null|            7|     null| paid|Thumbs Up|
|            Harmonia|            8|655.77751| paid| NextSong|
|           Goldfrapp|            9|251.14077| paid| NextSong|
+--------------------+-------------+---------+-----+---------+

或者我们可以观察一天中什么时候歌曲播放最多。结果是在中午或午餐时间。

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

xkcd-like scatter plot

特色工程

既然我们已经清楚地确定了流失的用户,那么是时候戴上数据科学的帽子,尝试确定流失率的影响因素了。如果一个人对服务不满意,他会怎么做? 我将尝试用以下 6 个工程特性来回答这个问题:

  1. 用户播放歌曲的平均小时数

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

也许没有享受这项服务的人倾向于在每天不同的时间播放音乐。很明显,这两组之间的差异可以忽略不计。搅动和非搅动用户之间的实际值分别为 11.74 和 11.71。只差了 1 分 48 秒。然而,我们将把它保留在我们的模型中,因为一旦我们把它与我们将要创建的其他特性结合起来,它可能会被证明是有用的。

2。性别

我们的音乐流媒体服务可能对某一性别更有吸引力。值得调查的是,某一性别是否在被搅动的用户中被过度代表。我们将为性别创建一个虚拟变量,男性的值为 1,女性的值为 0。

通过按性别和流失率对用户进行分组,我们可以清楚地看到,在流失率较高的群体中,男性的比例过高。62%的呕吐过的用户是男性,而非呕吐过的用户中只有 51%是男性。所以男性更有可能取消订阅。

+-----+------------------+
|churn|   avg(gender_dum)|
+-----+------------------+
|    1|0.6153846153846154|
|    0|0.5144508670520231|
+-----+------------------+

3。活动天数

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

刚刚注册这项服务的人可能还没有对这项服务形成真正的看法。首先,他们没有足够的时间尝试所有不同的功能。人们也需要时间来适应任何新软件。这在理论上应该会让那些订阅时间不长的新用户更有可能取消订阅或流失。

事实证明,我们的理论是准确的,新用户比老用户更有可能取消。

4。会话数量

更频繁登录的用户享受这项服务是有道理的,因为他们使用它的频率更高了。有人登录的次数越多,就越有可能继续使用我们的服务。

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

事实证明这是准确的。类似于日活动功能,新用户或不经常使用该服务的人更有可能取消。

5。每期平均歌曲数量

重要的不仅仅是会议的数量,还有质量。即使对于偶尔播放音乐的用户来说,他们仍然可以每次持续收听大量歌曲。表明体验良好,尽管他们使用的次数很少。

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

虽然差别很小,但肯定是看得见的。这种影响可能不如前两个计算的特征那么显著,但它足够明显,可以保留在我们的分析中,并找出它的相关性。

6。遇到的错误数量

我们能收到的最烦人的消息之一是错误消息。尤其是干扰我们全神贯注的东西,如流媒体电影或音乐。平均而言,经历更多错误的用户应该更有可能取消他们的服务,因为他们有过更糟糕的经历。我们来看看判决结果。

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

事实证明,兴奋的用户经历的错误更少。这可能是因为非搅动用户活跃的时间范围更长。因此,我们使用这项服务的时间越长,就越有可能出错。从各方面考虑,错误率很低。

构建我们的模型

随着我们的功能得到适当的设计,我们将训练三个模型,并选择最好的一个:

  1. 逻辑回归
  2. 随机森林
  3. 梯度增强树

在我们构建模块化代码的尝试中,我们编写了一个函数,为每个模型构建一个管道并运行它。如果我们想要在具有不同超参数的数据上训练我们的模型,也需要参数网格。

在从超参数的组合中找到最佳拟合模型后,它由我们的函数返回。然后,我们可以将每个模型应用于我们的测试数据,并通过使用标准的评估度量来计算它的准确性。在这种情况下,我们将使用 F1 的分数。

F1 分数是精确度和召回率的加权平均值。这是一个很好的衡量一般问题的方法,因为它不会仅仅因为假阳性或假阴性而严重扭曲。当我们的阶级分布不均匀时,这一点特别有用,这正是我们现在的情况。

最终结果是:

The F1 score for the logistic regression model is: 0.825968664977952
The F1 score for the random forest model is: 0.8823529411764707
The F1 score for the gradient-boosted tree is: 0.8298039215686274

通过使用相同的指标,我们可以很容易地比较所有 4 个模型,并得出结论,在这个“较小”的数据集中,预测用户流失最准确的模型是随机森林分类器。

全数据集训练

下一步是获取我们的功能代码,并在 AWS 上的集群上运行它。我们在尝试对整个数据集进行分析时遇到了几个问题。虽然这些问题看起来很小,但考虑到 Spark 集群处理数据所花费的时间,解决它们需要很长时间。

首先,集群上的熊猫版本已经过时。我们通过简单地将有问题的方法从“toPandas()”改为“show()”来解决这个问题。虽然输出看起来不那么吸引人,但它达到了目的。

其次,Spark 在一定时间后超时,这使得超时前的结果无用。我能找到的唯一可行的解决方案是增加集群大小,以缩短处理代码所需的时间。

这是一个令人惊讶的问题,因为 Spark 是一个大数据框架,所以预计会有很长的处理时间。

第三,鉴于超时问题以及处理一个模型上的数据需要多少时间,对超参数执行网格搜索被证明是特别具有挑战性的。所以为了我们自己的理智,我们使用默认参数作为我们选择的分类器。

最后,最大的问题发生在模型评估阶段。即使模型被训练得没有任何明显的问题,我仍然得到下面的错误消息,并且找不到解决方法。

Exception in thread cell_monitor-17:
Traceback (most recent call last):
  File "/opt/conda/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/opt/conda/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/opt/conda/lib/python3.6/site-packages/awseditorssparkmonitoringwidget-1.0-py3.6.egg/awseditorssparkmonitoringwidget/cellmonitor.py", line 178, in cell_monitor
    job_binned_stages[job_id][stage_id] = all_stages[stage_id]
KeyError: 1256

我无法正确地衡量准确性或找到随机森林分类器的混淆矩阵。不幸的是,我们只能假设,当使用 AWS 上的集群训练完整数据集时,该模型的性能会更好。

特征重要性

从商业角度来看,模型的准确性并不是决策者唯一感兴趣的事情。他们还想知道到底是什么促使人们取消或退订他们的服务。下图显示了每个特性在决策中的确切作用。

+--------------+----------+
|feature       |importance|
+--------------+----------+
|days_active   |0.4959    |
|n_sessions    |0.2146    |
|avg_play_hour |0.1355    |
|avg_sess_songs|0.1009    |
|n_errors      |0.0386    |
|gender_dum    |0.0145    |
+--------------+----------+

事实证明,在预测用户流失时,活跃天数和流媒体音乐的会话数是最重要的特征。

结论

概括地说,我们利用 PySpark,或者 Python 的 Spark。有了这个框架,我们构建了一个端到端的机器学习工作流。该工作流可以通过分析每个用户与所述服务的交互来识别音乐流服务的潜在客户。

数据探索这一步非常有趣,因为我们可以从用户的习惯中清楚地看到他们的行为。至少可以说,看看一些会议持续了多长时间,持续到多晚,以及音乐类型在一天的不同时间是如何变化的,是很有趣的。

工程特征集中于各种行为。它们包括与服务的互动,或者注重时间和个性而不是音乐品味的聆听习惯。这些行为还包括对服务满意度的测量,例如用户遇到的错误总数。在训练我们的模型之前,所选择的特征被缩放到范围[0,1],以便较大的值不会扭曲模型。最后,我们发现我们组中最好的模型是随机森林分类器。我们试图在完整的数据集上训练它,以获得更好的结果。

大数据分析有其独特的挑战。调试如此漫长的过程被证明是非常耗时的。但最后,这是一个非常有趣的练习,结果更有趣。

未来的改进

尽管有些模型表现得出人意料地好,我还是很想看看对最成功的模型进行交叉验证的结果。微调超参数可能会产生模型的优化版本,该版本可能足够健壮以用于生产。但是为了达到这个结果,我们要么需要更多的电脑,要么需要更多的咖啡。

大数据与海洋运输的环境影响。

原文:https://towardsdatascience.com/big-data-and-environmental-impact-of-the-maritime-transportation-299030dbb929?source=collection_archive---------27-----------------------

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

我们如何利用机器学习和大数据来拯救地球。

封面照片是住在港口附近的人都知道的一个例子。平均而言,每一艘停泊在欧洲港口的船只,都有另一艘在外面等待,等待的环境影响与停泊在港口内的环境影响相比较。我们发现这种影响可以减少 80%。

在我们之前的文章【1】中,我们提到我们发现了奇怪船只行为的数字痕迹。船只花费大量时间在港口和锚地附近停泊或移动。
这些等待时间以及港口内的等待时间对当前和未来船舶的燃料消耗以及温室气体、颗粒物、NOₓ和 SOₓ的排放造成了重大影响,增加了港口运营对当地环境的影响。
欧盟( EU Regulation 2015/757 )要求自 2018 年 1 月 1 日起,所有船只在欧盟区域内从事进出欧盟区域的航运活动时,必须申报 CO₂。这些数据包括在港口停泊期间的 CO₂排放量,但不包括在港口外等待期间的排放量。

我们对这些等待时间和相关排放的估计感兴趣,因为它们不会带来任何价值,并且是由港口拥挤或船长或货船基于经济的决策造成的。

文章由四部分组成:

  • 数据预处理,我们给出等待轨迹的细节。
  • CO₂排放的可用数据,其中我们概述了不同制度下不同船舶的 CO₂排放数据的估算算法。
  • CO₂的总排放量,我们比较港口和国家的综合排放量。
  • 呼吁采取行动,我们提出了减少海岸线附近 CO₂排放量的两种方法,并量化了这些方法的可能结果。

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

Trajectories of the vessels waiting to enter Le Havre port.

数据预处理。

Mariquant 从 2016 年初到 2018 年年中,从一家 AIS 数据提供商获得散货船和油轮的每小时数据。该数据包含来自约 19 000 艘有记录的独特船只的信息,作为未压缩的拼花文件大约占用 100 Gb。

我们有一个多边形库,有大约 8 000 个港口和 20 000 个锚地和等候区。大多数时候,锚泊多边形位于端口多边形之外,我们使用图形算法来确定哪个锚泊属于哪个端口。

我们使用随机森林分类器[2]来寻找船只轨迹上的等待点。您可以在之前的文章“从 AIS 数据的海洋中创建海上航线”【1】中找到我们方法的详细信息。

除了用于路线准备的保守检查外,我们还增加了额外的入口-出口检查。如果 80%的轨迹段之间的角度小于 15 度,则我们排除所有的开始和结束轨迹段。

在这种方法中,上图中那些看似直的短直线实际上是“卷曲的”,如下图所示。

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

关于 CO₂排放量的现有数据。

大多数船只不使用测量排放的仪器方法;而且,相当比例的船舶甚至没有燃油流量计。因此,可用的报告(如[3]和[5])是从理论估计构建的。一些初创企业/扩大规模的企业对这个问题有部分解决方案,但没有一个被业界接受。
此外,测量结果总有可能被船员轻易篡改(就像传感器周围的过滤器)。

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

This photo presumably shows a smoke trail of the Russian aircraft carrier; however, this is a photoshopped image of the Mount Etna eruption. Original image: Istituto Nazionale di Geofisica e Vulcanologia, Sezione di Catania.

令人失望的是,留给我们的要么是技术效率的理论估计,要么是船东/管理公司提供的数据。我们决定使用来自 EU-MRV 系统的报告数据,因为它被认为是由独立评估人验证并被欧盟委员会接受的。

对于每艘船(IMO ),该数据包含:

  • 总燃料消耗量[百万吨]*
  • CO₂总排放量[百万吨]
  • MS 管辖范围内港口间所有航程的 CO₂排放量[m 吨]
  • 从 MS 管辖的港口出发的所有航程的 CO₂排放量[m 吨]
  • MS 管辖范围内港口所有航次的 CO₂排放量[m 吨]
  • 在 MS 管辖范围内的港口泊位发生的 CO₂排放量[m 吨]
  • 每公里年平均 CO₂排放量[千克 CO₂ /英里]
  • 在海上度过的总时间[小时]

-此处的“m 吨”是公吨

根据现有数据,无法直接计算油耗和 CO₂排放量。燃料消耗与船速呈非线性(立方)关系。它还取决于浪高、海流和风速、螺旋桨类型,甚至取决于船体的状况(藤壶会增加燃料消耗)。考虑到这些限制,我们知道我们可以获得 CO₂排放量的高水平估计。

在锚泊过程中,船舶可能不使用主发动机,而是使用所谓的辅助发动机来提供电力、热量、动力泵等。另一个限制是对这些发动机排放的估计,因为它不依赖于主发动机的性能。一些研究[4]估计,辅助发动机产生大约 30%的总排放量。考虑到这些因素,我们决定用 CO₂/seconds 在港外航行时的音调来估算排放量。

co2_table['em/s'] = (co2_table['Between'] + co2_table['Depart'] + co2_table['Arrive'])/(co2_table['Time'] * 3600)

有趣的是(因为原始数据需要验证),有一些极端的异常值,我们决定忽略:

输入缺失数据

EU-MRV 系统拥有 2018 年进入欧盟港口的船只数据,这只是我们数据库中的一部分船只。因此,我们需要找到一种方法来估计这些不存在的船只的排放量。

根据现有数据计算排放量的可能性

船舶发动机排放可能与船舶特征、其宽度、LoA(总长度)和 DWT(载重量)相关。为了验证我们的假设,我们可以运行主成分分析 (PCA)并可视化相关性。

from sklearn.preprocessing import StandardScaler
data = train[['beam','loa','dwt', 'em/s']].values
scaler = StandardScaler()
scaler.fit(data)
strain = scaler.transform(data)from sklearn.decomposition import PCA
pca = PCA(n_components=3)
pca.fit(strain[:,0:3], strain[:,3])  
print(pca.explained_variance_ratio_)
ps_train = pca.fit_transform(strain[:,0:3])pres_df = pd.DataFrame(data=ps_train, columns=["pca-one", "pca-two", "pca-three"]).assign(y=strain[:,3])import seaborn as sos
g = sns.PairGrid(pres_df, vars=["pca-one", "pca-two", "pca-three"], height=5, palette="rocket",
                 hue="y")
g = g.map_diag(plt.hist, edgecolor="w")
g = g.map_offdiag(plt.scatter, edgecolor="w", s=40)

可以清楚地看到数据中有一些聚类。

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

Pair grid of the PCA dimension scatter plots and emission levels (as hue)

t-SNE 分析是另一种通常对数据可视化非常有用的方法,但在这种情况下,它不能提供清晰的图像。

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

Results of the T-SNE analysis

回归模型的选择

发动机排放回归模型的结果高度依赖于训练集的选择。因此,我们需要使用交叉验证来选择可能的回归变量。我们使用 Scikit-learn[2]实现各种回归变量。

from sklearn.linear_model import BayesianRidge
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.linear_model import Lasso
from sklearn.model_selection import cross_val_score
from sklearn.gaussian_process.kernels import DotProduct, WhiteKernel
from sklearn.ensemble import GradientBoostingRegressorN_SPLITS = 12

estimators = [
    BayesianRidge(),
    DecisionTreeRegressor(max_features='sqrt', random_state=0),
    ExtraTreesRegressor(n_estimators=80, random_state=0),
    KNeighborsRegressor(n_neighbors=15),
    RandomForestRegressor(random_state=0, n_estimators=80, n_jobs=-2),
    Lasso(alpha=0.1),
    GaussianProcessRegressor(kernel = DotProduct() + WhiteKernel(), normalize_y = True),
    GradientBoostingRegressor(n_estimators = 500, max_depth = 4,    min_samples_split = 2, learning_rate = 0.01, loss = 'ls', max_features = 'sqrt')
]scores = pd.DataFrame()
for estimator in estimators:scores[estimator.__class__.__name__] = \
        np.sqrt(np.abs(cross_val_score(
            estimator, ps_train, train['em/s'].values, scoring='neg_mean_squared_error',
            cv=N_SPLITS
        )))

我们得到了以下结果:

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

Average value and standard deviation of the RMSE for various regressors.

有趣的是,K-neighbors 回归给出了平均误差和标准偏差的最佳或次佳结果。它的性能与梯度提升一样好,并且优于随机森林。由于 K 近邻和梯度推进是完全不同的方法,我们可以尝试使用它们的集合。由于所有可用数据的限制,我们做这个练习纯粹是为了练习本身

我们使用来自 Scikit-learn[2]的投票回归器作为集合的基础,并且我们对 N_fold 运行的结果进行平均。

from sklearn.ensemble import VotingRegressordef predict_voting_fold(ereg, X_full, y_full, N_Fold, X_test, y_pred):
    mask = np.random.choice([True, False], len(X_full), p=[0.75, 0.25])
    ereg.fit(X_full[mask,:], y_full[mask])

    if y_pred is None:
        y_pred = np.reshape(ereg.predict(X_test), (-1, 1))
    else:
        for regressor in regressors:
            y_pred = np.concatenate((y_pred, np.reshape(ereg.predict(X_test), (-1, 1))), axis=1)
    if y_pred.shape[1] == N_Fold:
        return y_pred
    else:
        y_pred = predict_voting_fold(ereg, X_full, y_full, N_Fold, X_test, y_pred)
        return y_predregressors = [kn, gb]
estimators=[(regressor.__class__.__name__, regressor) for regressor in regressors]
ereg = VotingRegressor(estimators=estimators, n_jobs=-1)

对于训练集和测试集,结果如下:

Train 0.00033457086294885844
Test 0.0003675358631052121

这比测试样本的简单平均要好得多:

Train 0.0003324765794757066
Test  0.0003685629826696926

现在,我们可以计算剩余船只的排放水平,并计算欧洲海岸附近海事部门的温室气体排放量。

CO₂排放总量

我们发现港口外的排放量至少与泊位处的排放量相当:

  • 2016 年港口外的排放量为 2 86 万公吨 co₂(2018 年泊位排放量的 88 %)
  • 2017 年,他们贡献了至少 3 32 万公吨的 co₂(2018 年泊位排放量的 102 %)
  • 2018 年前六个月,它们是 1 588 000 公吨。

这一排放水平相当于丹麦、瑞典或葡萄牙等国家年排放量的大约 8%(根据“全球碳地图集】)。

2017

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

由于大量的港口停靠,瓦莱塔、鹿特丹、直布罗陀、汉堡和安特卫普是 CO₂生产的前五名。安特卫普每次停靠港口的排放量最小,瓦莱塔最大。前 50 名中每次停靠港口排放量最大的港口是——斯海弗宁根(鹿特丹和安特卫普附近的锚地)、南沃尔德转运区(英国东南海岸附近的地区)、福斯港、布林迪西和康斯坦察港。

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

排放量最大的国家是联合王国,尽管主要原因是直布罗陀。接下来的两年,马耳他、罗马尼亚、波兰、挪威和荷兰(2016 年为丹麦)的港口碳排放量值得关注。

CO2 emissions by vessels and by capital city

马耳他(全国)、荷兰、法国、挪威(因为奥斯陆的排放量最低)和比利时的船舶排放量占首都排放量的比例最大。我们使用的是来自欧洲绿色城市指数—西门子全球碳地图集和其他来源的 CO₂排放数据。

2018

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

2018 年上半年,鹿特丹成为最大的排放源,其次是瓦莱塔、直布罗陀和汉堡。伦敦港取代安特卫普成为 CO₂五大生产商之一。前 50 名中每次停靠港口排放量最高的港口是奥克尼港、米尔福德港、瓦莱塔、阿姆斯特丹和格丁尼亚。

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

2018 年,英国仍是最大的 CO₂生产国。worths 的每停靠港口排放量是在马耳他、挪威、斯洛文尼亚、荷兰和罗马尼亚。

CO2 emissions by vessels and by capital city (percentage is projected)

与 2017 年一样,马耳他、荷兰、法国、挪威和比利时的船舶排放量与首都城市排放量之比最大。

呼吁采取行动

我们认为,至少有两种方法可以减少近海海域的碳足迹:

  1. 港口优化——从“先来先服务”转向“及时”服务模式。
  2. 由于经济决策而减少等待时间。

量化这些可能性的结果可以如下进行:

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

Port of Valetta waiting times. Yellow - outliers, green — opportunity for optimisation.

  1. 我们可以将等待时间建模为两个因素:
  • 常规端口入口-出口,其中入口-出口时间近似为高斯(可能是偏斜的)分布。
  • 经济决策导致的异常等待时间,例如,将船舶转到浮动仓库、港口在周末不运营等。我们通过稳健 Z-score 方法选择它们作为极端异常值。

2.政治决策可以减少由异常等待时间造成的大部分排放。

3.定期的港口进出时间可以最小化到至少中间时间。港口作业优化可以实现这种减少。

根据对 2018 年上半年全欧洲可能减少的估计,通过政策变化,我们可以实现 357,000 m 吨,通过港口运营优化,我们可以实现 878,000 m 吨。这些减少构成了总体温室气体排放减少 77%。

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

当查看不同国家的减排机会时,可以看到联合王国和比利时的港口优化机会的减排量大于排名第二的国家(相应地为意大利和希腊)的当前总排放量。
港口优化可实现的减排比例最大的前 5 个国家是阿尔巴尼亚(80%)、挪威(77%)、芬兰、爱沙尼亚(各 69%)和克罗地亚(64%)。
总的来说,与港口优化相比,由于实施新政策导致的减少量较小。由于新政策,降幅最大的前五个国家是斯洛文尼亚(37%)、马耳他(36%)、罗马尼亚、瑞典和保加利亚(各 30%)。

Heatmap with emissions around the ports aggregated by week 2016–2018

关于 Mariquant

Mariquant 是一家专注于分析工具开发的公司。我们相信,在海事行业持续广泛地采用数据驱动的分析方法将会产生巨大的价值。然而,较差的数据质量、覆盖范围和庞大的数据量对许多人来说是一个障碍,导致他们经常走上自上而下的分析之路,其中涉及大量的手动工作。

在 Marquant,我们通过采用亚马逊(Amazon)和谷歌(Google)等公司开发的尖端技术来挑战这些障碍,但同时保持对海事行业需求的高度关注。引入全自动、数据驱动的分析允许扩展到海事中发现的单个案例的数量级,从而允许及时、准确和慎重的商业决策。

参考

  1. 阿列克谢·诺维科夫,“从 AIS 数据的海洋中创建海上航线”,(https://towards data science . com/creating-sea-routes-from-the-sea-of-ais-data-30 BC 68d 8530 e)
  2. 佩德雷戈萨sci kit-learn:Python 中的机器学习,JMLR 12,第 2825–2830 页,2011 年。
  3. Lasse Johansson,Jukka-Pekka Jalkanen,Jaakko Kukkonen,“2015 年全球航运排放高时空分辨率评估”,《大气环境》,第 167 卷,2017 年,第 403–415 页,
    ISSN 1352–2310,https://doi.org/10.1016/j.atmosenv.2017.08.042
    (http://www . science direct . com/science/article/pii/s 1352231017305563)
  4. 海事工作组,“波罗的海海洋环境保护委员会,2017 年波罗的海航运排放”,德国汉堡,2018 年 9 月 25 日至 27 日,(https://portal . helcom . fi/meetings/MARITIME % 2018-2018-503/meeting documents/4-3% 20 排放% 20from %波罗的海% 20Sea %航运%20in%202017.pdf
  5. 《2013-2015 年全球航运的温室气体排放》国际清洁交通理事会(2017):1–38。

数据处理和数据访问中的大数据架构

原文:https://towardsdatascience.com/big-data-architecture-in-data-processing-and-data-access-d03cff195e21?source=collection_archive---------2-----------------------

早在 1998 年,我就开始了作为 Oracle 数据库开发人员和管理员的职业生涯。在过去的 20 多年里,令人惊讶的是,它是如何通过包括关系型 OLTP(在线事务处理)数据库、数据仓库、ETL(提取、转换和加载)和 OLAP(在线分析处理)报告、大数据以及现在的人工智能、云和物联网在内的技术来处理不断增长的数据量的。所有这些技术都得益于计算能力的快速增长,特别是在处理器、内存、存储和网络速度方面。本文的目的是总结,首先是如何处理大量数据的基本原则,其次是一个思考过程,我希望它可以帮助您更深入地了解数据领域的任何新兴技术,并在当前和未来的技术浪潮中提出正确的架构。

在数据管道中,数据通常经过两个阶段:数据处理和数据访问。对于任何类型的数据,当它进入一个组织(在大多数情况下有多个数据源)时,它很可能不是干净的,或者不是可以由组织内外的最终业务用户直接报告或分析的格式。因此,首先需要数据处理,这通常包括数据清理、标准化、转换和汇总。最终的数据随后呈现在数据访问层,准备好进行报告并用于各方面的分析。数据处理有时也被称为数据准备、数据集成或 ETL 其中,ETL 可能是最受欢迎的名字。

数据处理和数据访问有不同的目标,因此通过不同的技术实现。大数据的数据处理从一开始就强调“扩展”,这意味着只要数据量增加,处理时间仍应在给定可用硬件的预期范围内。总的数据处理时间从几分钟到几小时到几天不等,这取决于数据量和处理中逻辑的复杂程度。另一方面,数据访问强调秒级的“快速”响应时间。在高层次上,数据处理的可扩展性主要是通过并行处理来实现的,而快速数据访问是通过基于访问模式的数据结构优化以及服务器上可用内存量的增加来实现的。

数据处理

为了清理、标准化和转换来自不同来源的数据,数据处理需要触及即将到来的数据中的每一条记录。一旦记录干净并最终确定,工作就完成了。这从根本上不同于数据访问—后者导致不同用户和/或应用程序对相同信息的重复检索和访问。当数据量很小时,与数据访问相比,数据处理的速度不是一个大问题,因此通常发生在最终数据所在的同一个数据库中。随着数据量的增长,人们发现数据处理必须在数据库之外进行,以绕过数据库系统造成的所有开销和限制,而数据库系统显然不是为大数据处理而设计的。这是 ETL 和 Hadoop 分别开始在数据仓库和大数据时代发挥关键作用的时候。

大数据处理的挑战在于,要处理的数据量始终处于硬盘能够容纳的水平,但远远超过给定时间可用的计算内存量。高效数据处理的基本方法是将数据分成更小的部分,然后并行处理它们。换句话说,通过首先在编程中启用并行处理来实现可伸缩性,使得当数据量增加时,并行进程的数量将增加,同时每个进程继续处理与以前相似的数据量;第二,随着并行进程数量的增加,添加更多具有更多处理器、内存和磁盘的服务器。

大数据的并行处理首先是通过数据库系统中的数据划分技术和 ETL 工具实现的。对数据集进行逻辑分区后,可以并行处理每个分区。Hadoop HDFS(高度分布式文件系统)以最具可扩展性的方式采用了相同的原则。HDFS 所做的是将数据划分为数据块,每个数据块的大小不变。然后,这些块被分发到不同的服务器节点,并由元数据存储记录在所谓的 Names 节点中。当数据进程开始时,进程的数量由每个服务器节点上的数据块和可用资源(例如,处理器和存储器)的数量来确定。这意味着 HDFS 支持大规模并行处理,只要你有足够的处理器和多台服务器的内存。

目前 Spark 已经成为内存中最流行的大规模数据处理快速引擎之一。有意义吗?虽然内存确实变得更便宜了,但它仍然比硬盘更贵。在大数据领域,要处理的大数据量总是远大于可用的内存量。那么 Spark 是怎么解决的呢?首先,Spark 利用了具有多个数据节点的分布式环境中的内存总量。然而,内存量仍然不够,如果任何组织试图将大数据放入 Spark 集群,成本可能会很高。让我们考虑一下 Spark 适合什么类型的处理。数据处理总是从将数据从磁盘读取到内存开始,最后将结果写入磁盘。如果每个记录在写入磁盘之前只需要处理一次,这是典型的批处理情况,那么 Spark 与 Hadoop 相比不会有优势。另一方面,Spark 可以在数据转换的多个步骤中将数据保存在内存中,而 Hadoop 不能。这意味着 Spark 在多次迭代处理同一数据时具有优势,这正是分析和机器学习所需要的。现在考虑以下问题:由于可能有数十或数百个这样的分析过程同时运行,如何以一种经济高效的方式扩大您的处理规模?显然,单纯依靠内存中的处理并不能完全解决问题,大数据的分布式存储,如 Hadoop,仍然是补充 Spark 计算的大数据解决方案中不可或缺的一部分。

数据处理领域的另一个热门话题是流处理。它在降低处理速度方面提供了很大的优势,因为在给定的时间点,每当数据到达时,它只需要处理少量的数据。但是,它在两个方面不如批处理灵活:第一个方面是输入数据需要以“流”模式进入,第二个方面是某些需要跨时间段聚合的处理逻辑仍然需要在之后进行批处理。

最后,云解决方案提供了基于数据量(即并行进程的数量)以更动态的方式扩展分布式处理系统的机会。这在企业内部很难实现,因为需要规划、预算和购买新的服务器。如果容量规划不当,大数据处理可能会受到硬件数量的限制,或者额外购买导致资源浪费而未被使用。云上的处理获得了基础设施弹性的巨大优势,这可以为以更具成本效益的方式实现最佳规模提供更多保证。

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

A brief history of techologies for data processing

数据访问

与数据处理相比,数据访问具有非常不同的特征,包括:

  1. 数据结构在很大程度上取决于应用程序或用户需要如何检索数据
  2. 需要很好地理解数据检索模式,因为大量用户或应用程序可能会重复检索一些数据。
  3. 每次检索的数据量应该是有目标的,因此应该只包含可用数据的一小部分。

根据上述原则,在过去 20 年中出现了几个里程碑,反映了如何访问不断增长的数据量,同时仍能在几秒钟内返回所请求的数据:

  1. 数据仓库:避免了当数据量很大时代价很高的表连接。这里出现了“事实表”的概念,其中所有的列都放在一起,而不像关系数据库那样遵循数据库规范化原则。
  2. 列存储:每一列都被存储和索引,因此可以单独访问。当一行有许多列,而查询一次只检索几列时,这比传统关系数据库的基于行的访问提供了更快的响应时间。
  3. NoSQL 数据库:完全消除了连接和关系结构,以更具体的方式适应快速数据检索。
  4. 内存数据库:通过将整个数据库或整个表保存在内存中来提供快速性能。

下表给出了每种数据库类型的一些流行示例,但并不打算给出一个完整的列表。请注意,一个数据库可以结合一种以上的技术。例如,Redis 是 NoSQL 数据库,也是内存数据库。此外,从数据仓库和列存储中检索数据会利用并行过程在任何适用的时候检索数据。因为根据用户和/或应用程序的数据内容、数据结构和检索模式,可能有许多不同类型数据库的选择,所以数据访问是一个组织需要快速和不断发展的领域。出于不同的目的,同时拥有不同类型的数据库或工具也应该是常见的。

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

总结

正如我们所看到的,数据处理和数据访问之间的一个重要区别是,数据访问最终来自客户和企业的需求,选择正确的技术可以推动未来的新产品开发并增强用户体验。另一方面,数据处理是公司的核心资产,大规模处理和产生高质量的数据是公司与数据一起成长的基本推动因素。当数据量增长时,许多公司经历了其数据处理系统的停滞,并且从头开始重建数据处理平台是昂贵的。并行数据处理的原理和可伸缩性需要从一开始就仔细考虑和设计。数据处理还与数据管理和数据集成密切相关,这三者对于任何数据密集型组织的成功都至关重要。此外,每个组织现在都面临着来自开源社区和第三方供应商的大数据解决方案的许多选择。清楚地了解数据处理和数据访问之间的差异,不仅可以让 it 和业务领导构建可靠的数据架构,还可以做出正确的决策,稳步扩展和更新 IT。

大数据架构—处理大数据的艺术

原文:https://towardsdatascience.com/big-data-architecture-the-art-of-handling-big-data-bc565c3a7295?source=collection_archive---------6-----------------------

利用大数据的最佳方式

介绍

因此,到目前为止,我们已经了解了公司如何根据从大数据分析中获得的洞察力来执行他们的计划。但是你听说过制定一个关于如何进行大数据分析的计划吗?不完全是。那是什么?满足您的好奇心,当一家公司考虑在其业务中应用大数据和分析时,这是最重要的部分。
一家公司想到在业务中应用大数据分析,他们只是随意地这么做了。似乎毫不费力,不是吗?

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

B UT,在任何业务中应用大数据分析都绝非易事。这并不像看起来那么容易。它需要强大的大数据架构来从大数据和分析中获得最佳结果。这是大数据分析的基础。它可以被认为是企业实现目标的最终途径。大数据架构师开始设计路径时,首先要了解目标和目的,即需要到达的最终目的地,并说明不同路径的优缺点。
这是一项痛苦的任务,但通过正确的规划和适当的工具是可以实现的。

迈出进入大数据世界的第一步

设计大数据架构的传统流程是这样的-
架构师与利益相关者会面,了解公司的目标,然后用适当的硬件和软件系统规划处理框架。提前规划这个系统对成功至关重要。

我何时需要大数据架构?

F 利用大数据需要大数据架构,但不是每个人都需要。数百 GB 数量级的数据不需要任何类型的架构。除非人们无法一致地处理数 TB 或数 Pb 级的数据,并且未来可能需要扩展,否则他们不需要大数据架构。此外,当您想要投资大数据项目并拥有多个大数据来源时,您可以使用大数据架构。

大数据架构

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

Big Data Architecture

  • 源层 大数据源是管理大数据架构的数据源。架构的设计在很大程度上依赖于数据源。这些数据来自许多来源,格式也各不相同。其中包括关系数据库、公司服务器和物联网设备等传感器、第三方数据提供商等。该数据可以是批量数据,也可以是实时数据。这些来源很快就堆积了大量的数据。大数据架构的设计使得它能够处理这些数据。
  • 数据接收 这是第一层,来自众多来源的大数据从这里开始。这一层负责对数据进行分类,以便数据平稳地流入体系结构的下一层。这一层的主要目标是将数据无故障地传输到数据架构的其他层。通常,Kafka 流或 REST APIs 用于摄取。

你应该转行大数据的 8 个理由

  • 存储层这一层是大数据的接收端。它从各种数据源接收数据,并以最合适的方式存储数据。这一层甚至可以根据系统的要求改变数据的格式。例如,批处理数据通常存储在分布式文件存储系统中,例如 HDFS,其能够以不同的格式存储大量数据。另一方面,结构化数据只能用 RDBMS 存储。这完全取决于数据的格式和我们需要它的目的。
  • 分析层 公司采用大数据的唯一目标是从中获得洞察,从而做出数据驱动的决策。为了让用户能够分析大数据,大数据架构中最重要的一层是分析层。该分析层与存储层交互,以获得有价值的见解。该架构需要多种工具来分析大数据。结构化数据易于处理,而分析非结构化数据则需要一些高级工具。
  1. 批处理 由于数据规模如此庞大,该架构需要一个批处理系统来过滤、聚合和处理数据,以便进行高级分析。这些是长时间运行的批处理作业。这包括从存储层读取数据,处理数据,最后将输出写入新文件。 Hadoop 是 it 最常用的解决方案。
  2. 实时处理 实时处理到达的数据是大数据世界最热门的趋势。因此,大数据架构必须包括一个捕获和存储实时数据的系统。这可以通过简单地将实时数据接收到数据存储中进行处理来实现。该架构需要一个健壮的系统来处理实时数据。
  • BI 层 该层接收最终的分析输出,并将其复制到适当的输出系统。不同类型的输出是针对人类查看者、应用程序和业务流程的。获得大数据解决方案的整个过程包括从多个来源获取数据、重复数据处理操作以及将结果绘制到报告或仪表板中。这些报告随后被公司用于制定数据驱动的决策。

挑战

H 掌握大数据并不是一件容易的事情。获得大数据解决方案是一项极其复杂的任务,因为它需要大量组件来管理来自多个数据源的数据接收。构建、测试和排查大数据流程是一项极具挑战性的任务。为了优化性能,各种组件之间需要适当的同步。

大数据技术仍在不断发展。大数据技术正在带来新的变化,有助于构建优化的系统。虽然 Hive 和 Pig 等Hadoop技术已经稳定下来,但 Spark 等新兴技术仍在每个新版本中不断引入广泛的变化和增强。根据您的业务需求选择正确的技术是大数据架构的关键。

实施大数据架构会带来很多安全挑战。洞察依赖于集中存储的静态数据。但是访问这些数据是一项具有挑战性的任务,因为这些数据可能被多个应用程序和平台接收和使用。在数据泄露司空见惯的时代,实施强大的安全系统成为保护数据免遭各种盗窃的必要条件。一开始就必须与服务提供商签署服务级别协议,以确保您的数据安全。

坚持住!!!
大数据如何为 Flipkart 争光

从 B 到 A 的大数据:Hadoop 分布式文件系统— HDFS

原文:https://towardsdatascience.com/big-data-from-b-to-a-the-hadoop-distributed-filesystem-hdfs-992612cbf8aa?source=collection_archive---------28-----------------------

HDFS 概念理解指南

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

Photo by imgix on Unsplash

随着数据的显著增长,在机器网络上存储大量信息变得非常必要。因此,需要一个可靠的系统,称为分布式文件系统,来控制数据的存储和检索。然而,随着这种基础设施的实现,出现了许多挑战,例如,在不丢失数据的情况下处理硬件故障。

在本文中,我们将关注 Hadoop 的分布式文件系统——HDFS,它的设计、架构和数据流。

HDFS 的设计

Hadoop 分布式文件系统(HDFS)是一个分布式文件系统,旨在:

在商用硬件上运行。

Hadoop 旨在运行于多家供应商提供的价格合理的设备上。硬件的性质在集群中提供了极大的可扩展性;坏的单元可以容易地被替换,而不需要昂贵的成本。尽管在大型集群中,硬件故障的概率变得更高,但 HDFS 将继续工作,不会有明显的变化。

高度容错

HDFS 是为处理大文件而设计的,它将大文件分成块,复制大文件,并将其存储在不同的集群节点中。因此,它具有高度容错和可靠的能力。

处理非常大的数据集

HDFS 旨在存储千兆字节或兆兆字节甚至千兆字节范围内的大型数据集。

流式传输数据并提供高吞吐量

假设数据在写入后永不更改的一次写入模式简化了复制。由于这种模式和独立的并行处理,数据吞吐量加快。

HDFS 的建筑

HDFS 有一个主/从架构。它包括:

  • NameNode*:*称为主节点。它管理文件系统名称空间,并执行打开、关闭和重命名文件和目录等操作。它维护文件系统树和元数据(数据块数 ***** 、副本等)。)用于树中的所有文件和目录。NameNode 还维护和管理从属节点。

与元数据相关联的文件有:

  • FsImage:文件系统元数据的持久检查点。
  • EditLogs:它包含相对于最新的 FsImage 对文件系统所做的所有修改。
  • DataNode*:*称为从节点。它根据客户端或 namenode 的请求执行读写操作,并定期向 NameNode 报告它正在存储的数据块列表。
  • 次 NameNode : 通常运行在单独的物理机上。它的作用是定期合并来自 NameNode 的 FsImage 和 EditLogs。这可以防止编辑日志变得太大。Is 还将合并的 FsImage 的副本存储到持久存储中,这可以在 NameNode 失败的情况下使用。

从 Hadoop 版本 0.21.0 开始,引入了一种新类型的 namenode,称为 备份节点 ,通过接收来自 namenode 的编辑来维护名称空间的最新状态,此外还有一个 检查点节点 ,它创建了一个名称空间的检查点来替换第二个 namenode。

*Block: 一个磁盘有一个块大小,是它能读写的最小数据量。HDFS 的文件被分成块大小的块,作为独立的单元存储。在 HDFS 中,块的默认大小是 128 MB (Hadoop 2.x)和 64 MB (Hadoop 1.x)。

数据流

阅读文件

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

A client reading data from HDFS from Hadoop The definitive guide

要从 HDFS 读取文件,客户端打开它希望读取的文件,分布式文件系统与 NameNode 通信以获取元数据。NameNode 用块的数量、它们的位置和它们的细节来响应。然后,客户端对分布式文件系统返回的流调用 read(),并连接到文件中第一个块的第一个(最近的)datanode。当一个块结束时,DFSInputStream 将关闭到 datanode 的连接,然后为下一个块寻找最佳的 datanode。这对于客户端来说是透明的,从客户端的角度来看,它只是在读取一个连续的流。当客户端完成读取时,它调用 FSDataInputStream 上的 close()。

写文件

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

A client writing data to HDFS Hadoop The definitive guide

当客户端想要将文件写入 HDFS 时,它调用 DistributedFileSystem 上的 create(),distributed file system 与 namenode 通信以在文件系统的命名空间中创建一个新文件,其中没有与之相关联的块。如果文件不存在,并且客户机有适当的权限,NameNode 创建文件;否则,文件创建会失败,并且客户端会抛出 IOException。DistributedFileSystem 返回一个 FSDataOutputStream,供客户端开始向其写入数据。当客户端写入数据时,DFSOutputStream 会将其拆分为数据包,然后写入一个内部队列,称为数据队列。数据队列由数据流处理器使用,它的职责是通过挑选合适的 datanodes 列表来存储副本,从而要求 namenode 分配新的块。datanodes 的列表形成了一个管道。数据流处理器将数据包传输到管道中的第一个 datanode,后者存储数据包并将其转发到管道中的第二个 datanode,依此类推。DFSOutputStream 还维护一个等待 datanodes 确认的内部数据包队列,称为 ack 队列。只有当数据包被管道中的所有 datanodes 确认时,才会从 ack 队列中删除该数据包。当客户端完成数据写入时,它在流上调用 close()。此操作将所有剩余的数据包刷新到 datanode 管道,并在联系 namenode 以发出文件完成的信号之前等待确认。namenode 已经知道文件是由哪些块组成的(通过请求块分配的数据流),因此它只需等待块被最小化复制,然后就可以成功返回。

总之,HDFS 是一个可靠的分布式文件系统,可以跨大数据集群存储大文件。它被设计成可伸缩、高度可用和容错的。它的体系结构有助于管理机器网络中的分布式存储,并在硬件出现故障时维护副本。

“从 B 到 A 的大数据”系列文章涵盖了所有大数据概念:业务概念、工具、框架等。

更多类似的文章,请确保关注以获取最新的更新。

你也可以在我的社交媒体简介 Linkedin Twitter上加入我。

电子商务个性化中的大数据,解释

原文:https://towardsdatascience.com/big-data-in-ecommerce-personalization-explained-580efa0dec50?source=collection_archive---------27-----------------------

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

大数据无处不在。你曾经在网上提供的所有信息,你浏览器中保存的所有 cookies,你曾经使用过的所有网上银行应用程序——所有这些都存储了你的大量详细信息。这就是为什么当你在网上搜索某样东西时,你会发现无论你走到哪里,都有相同产品的广告跟着你。

不一定是坏事。虽然有些人反对收集大数据,但仍然有足够的空间将大数据理论化并用于商业目的。这方面最有前景的领域之一是营销,因为用户数据是健康营销组合的主要成分。在这里,个性化成为大数据应用中最常被利用的用例之一,并被证明具有高投资回报率。

背后的原因很简单。营销和销售都是为了了解客户的痛点和欲望。过去需要数年的市场研究,现在只需要几天甚至几个小时就可以从网上购物者的个人资料中收集数据,并通过电子商务开发进行操作。

让我们仔细看看大数据在营销方面的几个突出应用,特别是它在哪些方面推动了产品和服务的个性化。

创建建议

这可能是电子商务中最常见的大数据应用之一。我们在访问在线商店时,会根据之前的购买情况不断处理个性化推荐。

大数据有助于发现产品依赖关系,这些依赖关系不容易用肉眼发现。当应用于潜在客户——未知用户或以前没有购买过的访问者时,推荐尤其闪亮。

通过实时分析他们的行为,企业可以根据已经看过的产品更新“推荐”商品,从而促使他们购买。

利用客户关怀

提供高水平的客户支持是利用大数据和提高品牌忠诚度的另一个很好的方式,尽管这一点被忽视了。

为了在客户服务中成功利用大数据,您需要实现数据访问的民主化。您的所有支持代表都应该能够访问客户信息、他们的购买历史和高级分析能力,这些数据集通常是销售、营销和首席管理人员的特权。

这些大数据层必须以易于理解的格式呈现,因为客户服务代表处理客户问题的时间有限。

例如,客户服务代理可以通过以下方式个性化客户体验:

  • 利用客户的购买历史提供相关的折扣和促销。
  • 使用同一人群中其他客户的购买来追加销售相关产品。
  • 分析购买行为,挑出出现问题最多的产品或客户类别。这一情报将有助于先发制人地解决此类客户的担忧。

树立忠诚度

你如何和某人成为朋友?你创造了一种关系。他们对你有所了解。你对他们有所了解。

客户忠诚度也差不多。与你的电子商务客户的友好关系很重要。新客户意味着业务增长,但忠诚的客户是企业生存的基础。大数据有助于为您的每一位客户建立丰富的档案,然后利用它来发展与他们的关系。

您可以通过分析客户购买的产品类型来个性化促销,包括基于他们购买的产品的大小、颜色和类型的特殊促销。

例如,如果一个人买了一件特定尺寸和类型的蓝色 t 恤(比如说 V 领),那么考虑到他们在你的商店购买这些商品的常见频率,你可以为他们提供这种特定类型服装的即时折扣。这样的推荐给人一种你了解客户的感觉,只要你提供了他们真正感兴趣的东西,他们就更有可能购买。

建立忠诚度的另一个好方法是使用客户的账单或送货地址提供本地化的折扣或促销。这种本地化可以是任何东西,从基于他们当地假日度假的促销到围绕他们的所在地建立的特殊送货折扣。

深入非结构化数据

结构化数据按类别存储在数据库中,包括企业运营所需的所有客户信息。非结构化数据不能以同样的方式进行分类。您在数据库中找不到包含该信息的特定行或列。

通常,当我们谈论非结构化数据时,我们谈论的是存储在您站点外部的信息。关于你的品牌的社交媒体出版物是非结构化数据的一个例子。

但是,您可以使用监控工具收集这些信息。例如,某些数字服务可以收集你的品牌在网络上的提及率。这些数据可以帮助你分析围绕你的品牌名称的情绪,暗示人们在试图与你互动时在寻找什么,甚至指出他们可能感兴趣的产品。您可以使用这些数据围绕特定产品和客户需求构建内容。

充分利用时间

一些大数据计划必须围绕及时执行来构建。购物者的注意力持续时间很短。这就是为什么通过提供他们目前需要的产品来尽快抓住他们的注意力是至关重要的。

利用大数据,这种实时个性化是可能的。这里的原则保持不变——利用你拥有的关于用户的所有信息,建立个性化的购物体验。

这些努力必须与先进的分析框架交织在一起,例如建立在数据科学和机器学习基础上的分析框架。这些技术可以帮助您在旅途中调整策略,并在单个用户会话中产生影响。

有许多服务,如 Evergage、Marketo 或 PureClarity,可以根据访问者的位置实时个性化推荐产品。例如,这些服务可以看到来自特定位置的人倾向于购买特定的产品。然后,他们在推荐中显示这些产品,或者触发连接的网络商店为这些产品提供特殊折扣。

最后的话

除了谷歌和其他知名商业智能提供商提供的常规分析之外,即使是最小的电子商务公司也拥有大量数据。如果你不根据已经掌握的数据采取行动,你可能会与已经在利用这些数据的竞争对手打一场硬仗。

开始为客户打造个性化体验并不难。从丰富他们的个人资料开始。然后尝试使用这些信息来提供个性化的推荐。一旦你看到投资回报率在增长,就转而收集非结构化数据,并应用人工智能服务来筛选有价值的见解。

Apache NiFi 和 Kafka Docker 示例

原文:https://towardsdatascience.com/big-data-managing-the-flow-of-data-with-apache-nifi-and-apache-kafka-af674cd8f926?source=collection_archive---------2-----------------------

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

在 Hadoop 生态系统中,Apache NiFi 通常用于摄取阶段。Apache NiFi 提供了一种可伸缩的方式来管理系统之间的数据流。当你试图从 A 点到 B 点获取信息时,会出现许多问题。例如,网络可能出现故障,软件崩溃,人们犯错误,数据可能太大、太快或格式错误。NiFi 将在幕后处理这些问题,以便开发人员可以专注于应用程序本身。

NiFi 的一些特性包括:

保证交货

NiFi 保证数据的传递。这是通过有效使用专门构建的持久预写日志和内容存储库来实现的。

数据缓冲/压力释放

当给定的数据源超过处理或交付链的某个部分时,Nifi 可以缓冲数据。NiFi 还支持在指定时间过后删除排队数据的能力。

优先排队

NiFi 允许为如何从队列中检索数据设置一个或多个优先级方案。默认情况下是最早的优先,但有时应该先提取最新的数据、先提取最大的数据或其他自定义方案。

服务质量

有些时候,数据必须在几秒钟内处理和交付才能有价值。NiFi 使管理员能够将延迟优先于吞吐量或容忍度等。

术语

Apache NiFi 围绕着处理器的思想。处理器是图中工作的节点。这通常包括对数据执行某种操作、将数据加载到 NiFi 或将数据发送到某个外部系统。处理器一些例子是:

  • GetFile:加载文件的内容
  • UpdateAttribute:更新流文件属性(即 schema.name ),然后其他处理器可以访问这些属性
  • PublishKafka:将流文件的内容作为消息发送给 Apache Kafka

另一方面,进程组是处理器及其连接的集合。控制器服务可用于创建它们的进程组中的所有处理器。

控制器服务的一些示例包括:

  • AvroSchemaRegistry:在注册表中存储 Avro 模式,然后其他控制器服务可以检索这些模式
  • AvroRecordSetWriter:以 Avro 格式编写和编码数据

NiFi 中的另一个关键概念是流文件。流文件是图形中给定位置的数据和一些附加元数据。我们可以通过点击一个连接的 【列表队列】 下拉菜单选项来查看流文件。

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

例如,以下流文件具有唯一的 id 和文件名。

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

通过点击视图,我们可以看到实际数据从一个处理器转移到另一个处理器。

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

体系结构

NiFi 在主机操作系统上的 JVM 中执行。

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

网络服务器

与大多数软件不同,Apache NiFi 的管理是通过用户界面完成的。

流量控制器

处理与处理器相关的所有逻辑。

流文件存储库

流文件存储库是 NiFi 存储流中当前活动的流文件的元数据的地方。

内容存储库

内容存储库是给定流文件的实际内容所在的地方。可以指定多个文件系统存储位置,以减少争用。

出处储存库

出处储存库是存储所有出处事件数据的地方。本质上,起源事件数据告诉你什么时候发生了什么。

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

NiFi 还能够在集群中运行,使其能够无限扩展。

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

NiFi 集群中的每个节点对数据执行相同的任务,但是每个节点对不同的数据集进行操作。Apache ZooKeeper 用于选举集群协调器并自动处理故障转移。管理员可以通过任何节点的用户界面与 NiFi 集群进行交互,任何更改都会复制到集群中的所有节点。

密码

在本例中,我们将获取一个 CSV 文件并将其发布到 Kafka。我们将使用 docker 来设置我们的环境。将以下内容复制到docker-compose.yml并运行docker-compose up -d

接下来,在你的主机上打开浏览器,进入localhost:8080/nifi

在左上方的配置中,将一个处理器拖到主面板上。选择并配置 GenerateFlowFile 处理器每 60 秒运行一次,这样我们就不会不断地生成数据。

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

我们将使用一个简单的数据集,其中包含 30 个人的工作经验和薪水。

YearsExperience,Salary
1.1,39343.00
1.3,46205.00
1.5,37731.00
2.0,43525.00
2.2,39891.00
2.9,56642.00
3.0,60150.00
3.2,54445.00
3.2,64445.00
3.7,57189.00
3.9,63218.00
4.0,55794.00
4.0,56957.00
4.1,57081.00
4.5,61111.00
4.9,67938.00
5.1,66029.00
5.3,83088.00
5.9,81363.00
6.0,93940.00
6.8,91738.00
7.1,98273.00
7.9,101302.00
8.2,113812.00
8.7,109431.00
9.0,105582.00
9.5,116969.00
9.6,112635.00
10.3,122391.00
10.5,121872.00

同样,通过将数据粘贴到自定义文本属性来配置 GenerateFlowFile

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

注意:任何粗体属性为必填,其余为可选。

将处理器拖到主面板上,并选择更新属性。对于 UpdateAttribute 处理器,在 properties 下,单击右上角的加号。然后,创建一个值为 test.schemaschema.name 属性。

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

现在,我们将创建控制器服务。右击主面板,选择配置

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

在这里,我们可以为我们的处理器组创建所有的控制器服务。

点击右上角的加号,选择 AvroSchemaRegistry 。在 properties 选项卡下,创建一个名为 test-schema 的新属性,并将下面的模式粘贴到 value 字段中。

{
   "type" : "record",
   "namespace" : "Test",
   "name" : "Employee",
   "fields" : [
      { "name" : "YearsExperience" , "type" : "float" },
      { "name" : "Salary" , "type" : "float" }
   ]
}

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

我们还需要 CSVReader。在 properties 选项卡下,将其配置为使用 schema name 属性,即 AvroSchemaRegistry ,并将第一行视为列标题。

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

最后,创建一个 AvroRecordSetWriter ,并将其配置为使用 AvroSchemaRegistry

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

在继续之前,请确保通过单击最右侧的闪电图标来启用所有控制器服务。

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

现在我们已经完成了控制器服务的设置,我们将通过运行以下命令来创建一个 Kafka 主题。

docker-compose exec kafka  \
kafka-topics --create --topic test --partitions 1 --replication-factor 1 --if-not-exists --zookeeper zookeeper:2181

验证它是否正常工作。

docker-compose exec kafka  \
kafka-topics --describe --topic test --zookeeper zookeeper:2181

创建 PublishKafkaRecord ,并对其进行如下配置。

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

请务必检查自动终止关系,因为这是我们图表中的最后一个处理器。

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

要创建处理器连接,请在它们之间拖动箭头。

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

最后,要开始流程,右键单击每个处理器并选择 start 。如果一切都按预期运行,那么每个原始行都应该被写回。

docker-compose exec kafka  \
  kafka-console-consumer --bootstrap-server localhost:29092 --topic test --from-beginning --max-messages 30

大数据同步:确保大数据准确性的 5 种方法

原文:https://towardsdatascience.com/big-data-synchronization-5-ways-to-ensure-big-data-accuracy-4c4801b021ad?source=collection_archive---------13-----------------------

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

Source

如果你拥有一家电子商务商店,或者甚至去过电子商务商店,你一定经历过“缺货”或“断货”的问题。然而,上周我有一次非常奇怪的经历。我在网上搜索我最喜欢的运动鞋,发现它们有现货。所以,我去商店买了一个,但是你猜怎么着,他们没有。他们两天前就没货了,但他们仍然在网站上显示有货。

缺货是很常见的事情,没什么好奇怪的。然而,这个问题已经恶化,因为许多这些公司正在努力同步来自他们运行的不同系统的数据,包括存储大数据的系统。当从这些系统流入的数据与现实世界中发生的事情不充分同步时,客户可能会失望。

大数据同步是一个关键问题。这是因为数据资源正在以极快的速度提取数据,将它们同步成单一版本的事实有点困难。

例如,如果你销售智能手机,你可能会有采购和库存系统,存储和报告零件。生产系统报告成品制造中消耗了多少零件,销售系统报告可供销售的产品,工程系统报告产品的最新版本级别,并提供安全的 CAD 大数据。

无论如何,如果所有系统不能同步反映你所销售的智能手机的最新精度,那么肯定会出现故障,这可能会让消费者和销售人员失望。此外,它还会导致根据不准确的数据做出糟糕的管理决策。

如果组织想要利用大数据的力量,保持其准确性和同步性是当务之急。这里有五种方法可以确保任何规模的系统实现大数据同步!

1。规划您的数据更新流程

如果没有适当的规划,采用大数据项目注定会失败。组织可能会在他们甚至不知道如何使用的东西上浪费大量的时间和资源。他们经常雇佣开发人员来构建他们没有足够知识的系统。无论您计划开发应用程序还是修改现有应用程序和/或将新的大数据源纳入您的 it 系统,需求规划都应包括您将如何同步所有传入数据。因此,数据可以尽可能的新鲜和准确。

数据更新流程的规划应包括数据更新和与主数据集同步的频率。同时,应将这一频率传达给最终用户,以便他们提前了解数据限制是什么。

2。开发数据同步方法

数据同步是在源数据存储和目标数据存储之间建立一致性的过程,反之亦然。谈电子商务网站,主要目标是数据的适当同步。已经有许多网站制定了数据同步政策和更新程序,用于同步其任务关键型交易数据。然而,它们不一定解决了大数据问题。

大数据有大量的数据源和极高的数据交付速度。但是,数据的时间戳和数据来自的时区的信息需要同步,才能知道最新的数据在哪里。必须面对数据更新过程的现实。并非所有数据都可以实时更新,因此必须决定何时将数据与主数据同步,以及是在夜间进行批量数据同步,还是全天以预定的批量突发模式进行同步。

简而言之,此类流程应记录在 IT 运营指南中,并且每次您向流程中添加新的大数据信息源时,都应更新这些流程。

3。获取用于同步的商业工具

为了在多个设备之间保持信息备份和更新,有一些商业工具提供了一种方便的同步方式,可以帮助数据同步。

这些工具可以帮助您完成大数据同步工作,并自动执行部分数据同步操作。

这里有几个重要的同步商业工具,可以帮助您进行大数据同步工作。此外,它们还可以自动执行部分数据同步操作。

这是一个备份和文件同步程序。GoodSync 工具用于同步两个目录之间的文件,例如在一台计算机上或在一台计算机和另一台存储设备之间,例如,另一台计算机、可移动磁盘、闪存驱动器或智能手机,或者在一台计算机和远程计算机或服务器之间。

GoodSync for business 为任何其他数据源、目的地或系统提供完整的企业数据备份和同步解决方案。GoodSync 控制中心提供 GoodSync 工作站和服务器的文件同步、备份和发布活动的集中管理和报告。GoodSync 工具的特点是实时同步、备份和恢复以及审计跟踪。

Mozy Sync 是一款基于网络的文件同步应用,适用于 Windows 和 Mac,它可以复制文件夹的数据,并在紧急情况下重建数据。这是一个为小型办公室提供云备份的经济高效的工具。Mozy Sync 是一款易于操作的工具,包含备份和恢复以及同步计划等功能。

这是一个易于使用的云备份和存储程序,可以根据用户的需求进行定制,如指定每台机器上应该备份哪些文件夹和文件,每天/晚上搜索备份更新的数量和时间,以及如何/谁可以访问存储的数据。这个数据同步工具是各种规模企业的满意解决方案。

用于 Windows、Linux 或 Mac 的文件同步工具,可分析文件夹数据,分离常用文件并创建其备份副本。这是一个开源工具,可用于独立审计。FreeFileSync 定期更新,开发得非常好。

它提供了许多选项,包括您希望使用哪种比较方法来比较文件,以及您更喜欢哪种类型的同步,例如镜像、复制或仅更新。作为用户,您可以选择在系统启动时实时同步文件夹。

4。考虑移动设备和下载的限制

每个人都使用移动设备。然而,每个人的互联网都有互联网带宽限制,这些设备无法快速处理大量的数据下载,这些设备上的常驻销售和库存数据可能并不总是与主数据库中的真实数据同步。作为最终用户沟通过程的一部分,它必须让用户了解这些潜在的数据准确性限制。

5。搜索可以协助数据同步的服务提供商

大数据云处理器之一 Amazon Web Services EMR 认识到了数据同步问题。它有数据同步方法,使他们能够为您执行同步。如果您对云中的数据处理感到兴奋,您可以询问您的云供应商它可以提供什么服务来确保您的大数据的最新和最高质量的表示。

是否相信大数据是否会改变世界的炒作。除此之外,大数据的准确性至关重要。上述方法确保了从访问大数据和交易数据的应用程序提供的数据是准确的。

评论

我希望你们喜欢阅读这篇启发性的文章。请在下面评论您用于同步大数据的策略,或者您如何应对大数据准确性问题。

大数据:正在彻底改变世界的艺术和科学

原文:https://towardsdatascience.com/big-data-the-art-science-that-is-revolutionizing-the-world-a2a596122c55?source=collection_archive---------29-----------------------

深入研究将极大改善我们生活方方面面的技术

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

Picture from Unsplash

大数据:原因、方式和内容

近年来,信息技术经历了迅猛发展:

  • 传感器现在便宜得离谱。
  • 计算能力有了巨大的增长。
  • 到处都有连接互联网的设备(智能手机、活动支架、智能手表、电视、汽车……现在甚至连热拌食品都有 wifi 了!)

这些因素和其他因素导致可用数据急剧增加。今天,我们能够产生、存储和发送比历史上任何时候都多的数据。

以至于在 2015 年,据估计 90%的可用数据都是在两年前创建的。从那以后,数据生成的速度只增不减。

事实上,据估计,目前每天会产生 2.5 万亿次数据。这是第一代 Iphone 的 2.5 倍 1⁰ ⁷字节,相当于 1 亿倍的存储容量。

所有这些数据就是俗称的大数据。要被认为是大数据,它必须符合以下特征,即所谓的 3 Vs 规则:

  • 必须是高变化的数据。
  • 那就是增加的音量。
  • 并以巨大的速度。

大数据带来的数据科学的繁荣

然而,这些海量的数据导致了一个新的问题:

我们用它做什么?

可用的数据如此之多,以至于人类不可能从中研究和提取有价值的信息。从这些数据中分析和发现模式和见解需要几代人的时间。

幸运的是,电脑可以帮助我们。此外,在过去的几年里,机器学习算法的发展取得了巨大的进步。这些算法,加上我们以如此低的成本拥有的几乎无限的计算能力,导致了我们目前正在试验的数据科学的急剧扩展。

数据是提高业务成效的增长最快的驱动力。为了创造竞争优势,越来越多的组织使用他们的数据来提高效率、销售和营销效果。但是,现在大部分的数据仍然没有连接和充分利用。这就是数据科学在解决这个问题上发挥作用的地方。

目前使用的主要数据科学是:

数据工程

数据工程的重点是建立适当的基础设施,以促进组织内部的数据流动,并使这些数据准备成为有用的格式。

数据分析

数据分析侧重于从数据中发现有用的信息。数据科学的这一分支涉及对数据的描述和诊断分析,解释发生了什么以及为什么会发生。它还涉及数据可视化方面(这是一个完全独立的领域)

机器学习

机器学习是专注于让计算机从数据中学习的科学(和艺术)。他们通过学习导致特定结果的过去数据的特定特征之间的相关性来做到这一点,因此当向他们提供新数据时,他们可以做出准确的预测。

深度学习

深度学习是机器学习的一个子领域,专注于复制智能生物用于学习的学习机制。他们通过用简单的概念解构复杂的概念来做到这一点,因此,以一种分层的方式学习。使用人工神经网络来实现这一点。

数据科学的目标和路径

如前所述,如今数据严重脱节和利用不足,这门科学的最终目标是能够从原始数据(没有价值)到智慧,这最终将有助于决策,因为它将由客观信息驱动。

下图很好地传达了这一概念:

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

Figure by Author

总之,数据科学是一套从数据中自动提取知识的基本原则、流程和技术。最终目标是改进决策,所有任务都应服从于这一目标。

数据科学之路,从容易和不太有价值到困难和最有价值,如下所示:

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

Figure by Author

处理大数据的技术

后一种数据科学是围绕大量数据开发的,但是,当数据量如此之大,以至于单台计算机无法对其进行分析并提取有意义的见解时,并行分析(和大数据技术)就开始发挥作用了。

以下是一个典型的大数据基础架构示例。用于形成和使用大数据生态系统的一些技术包括:

  • 批量:Hadoop,Hive,Apache Spark
  • 溪流:阿帕奇卡夫卡
  • 基础设施:Cloudera、Hortonworks、Mapr
  • 自动化:Ansible,Chef,Jenkins,Airflow,Luigi
  • 容器和集群管理:Docker、Mesos、DC/OS、Kubernetes、Marathon
  • 语言:Scala,Java,Python
  • 数据库:SQL(是的,你需要非常擅长 SQL 😃),NoSql 数据库,时间系列数据库
  • 索引:弹性搜索
  • 可视化:基巴纳,格拉法纳

在接下来的系列文章中,我们将重点关注大数据架构的数据分析和机器学习方面,具体来说,我们将使用 Apache Spark 及其 Python 实现:PySpark。

因此,如果您想了解更多关于这一令人惊叹的技术以及如何执行一些现实世界的项目,请继续关注下一篇文章!

Apache Hadoop —什么是 YARN | HDFS | MapReduce

原文:https://towardsdatascience.com/big-data-what-is-apache-hadoop-3dafda16c98e?source=collection_archive---------20-----------------------

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

目前,围绕大数据有很多炒作。在接下来的文章中,我将试图澄清人们所说的大数据和提供了一种称为 Hadoop 的核心技术的高级概述,该技术在工业中用于存储和处理大量数据。

大数据中的 是指数据量。随着电子商务、社交媒体和物联网设备等技术的出现,自 21 世纪初以来,整个社会产生的数据量一直在呈指数级增长。据估计,到 2025 年,全球数据圈将从 2018 年的 33 吉字节(1 吉字节相当于 1 万亿吉字节)增长到 175 ZB。

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

许多组织正在转向 Apache Hadoop 和其他大数据技术,利用这些大量数据的价值来推动业务决策。

数据越多,处理数据所需的计算能力就越强。谈到计算能力,您有两种选择:

  • 垂直扩展(即更多 RAM、内核和硬盘)
  • 水平扩展(即分布式计算)

纵向扩展的问题之一是,由于各种限制,在可预见的未来,处理器速度将徘徊在 4 GHz 左右。此外,较高等级组件的成本不是线性的。换句话说,两个系统比一个规格两倍的系统花费更少。

因此,公司主要使用分布式计算进行数据处理(即商业分析、训练机器学习模型)。分布式计算听起来很简单,但在实践中,需要考虑很多因素。例如,不同的系统如何共享信息,我们如何将问题分解,以便每个系统都可以同时处理它,如果一个或多个节点出现故障,我们该怎么办。

根据官方文档,Apache Hadoop 是一个开源框架,允许跨计算机集群分布式处理大型数据集。Apache Hadoop 项目分为 HDFS、YARN 和 MapReduce。

HDFS (Hadoop 分布式文件系统)

假设您在某个初创公司担任数据工程师,负责建立存储面向客户的应用程序产生的所有数据的基础设施。您决定使用硬盘驱动器作为主要的非易失性存储介质,因为固态驱动器太贵,而磁带对于任何类型的处理都太慢。传统上,您会将存储(存放数据的地方)和计算(处理数据的地方)分开。在这类系统中,数据将通过一个非常快速的网络传输到计算机,然后由计算机进行处理。事实证明,从时间的角度来看,在网络上移动数据是非常昂贵的。或者,我们可以在存储数据的地方处理数据。数据局部性是从分离存储和计算的彻底转变,分离存储和计算曾经是处理大规模数据系统的流行方式。Hadoop 是最先采用这种方法的技术之一。由于显而易见的原因,通过网络传输 mapReduce 代码比试图将数 Pb 的数据发送到程序所在的地方要快得多。数据局部性从根本上消除了网络瓶颈,从而实现了线性可伸缩性。

现在,问题来了,我们如何无缝地访问存储在不同节点上的数据。显然,我们不希望每次需要访问硬盘上的文件时都必须远程访问计算机。Hadoop 分布式文件系统为我们解决了这个问题。HDFS 实现为主从架构,由一个 NameNode(主节点)和一个或多个 DataNodes(从节点)组成。NameNode 负责告诉客户端将数据发送到哪个节点,或者在检索的情况下,哪个节点包含它们正在寻找的数据。然后,客户端可以连接到 DataNode 并开始传输数据,而不再需要 NameNode 的参与。前面的过程使 Hadoop 能够有效地水平扩展。

默认情况下,HDFS 会在集群中存储您文件的三个副本。在这种情况下,发生了一些故障,暂时只有两个副本,你永远不会知道,因为这都是由 NameNode 在幕后处理的。

存储在 HDFS 的文件是只读的。一旦你写了一个文件,它将会有那个内容,直到它被删除。这个实现细节意味着 HDFS 不需要进行同步的改变,而同步的改变会在分布式系统中引起多个问题。

YARN(又一个资源谈判者)

除了用于管理计算资源之外,关于 YARN 没有太多可说的。在 YARN 之前,大多数资源协商都是在操作系统级别处理的。后者会导致多重低效。因此,社区发明了 YARN 来更智能地在集群上分配工作负载,并告诉每台计算机应该运行什么以及应该给它多少资源。

MapReduce

在编程中,map 通常意味着将一些函数应用于列表中的每个元素,并将每个操作的结果作为列表返回。需要注意的是,地图函数的应用顺序并不重要。假设您想将一个映射函数应用于一个包含一万亿个整数的列表。当由单台计算机顺序执行时,需要一段时间。因此,我们可以将负载分布在集群内部的许多节点上,以便并发处理。换句话说,每个节点将在列表的子集上执行 map 函数。考虑到应用映射函数的顺序并不重要,我们避免了分布式系统中最大的挑战之一,即让不同的计算机就完成事情的顺序达成一致。

传统的 reduce 操作将函数和列表作为参数,将函数应用于列表的前两个元素,获取结果,然后将函数重新应用于结果和下一个元素,继续这个过程,直到到达列表的末尾。在 Hadoop 中,reduce 从 map 阶段获取结果,按键将它们分组,并执行聚合操作,如求和、计数和平均。

使用 Hadoop 的主要好处之一是它抽象出了在分布式系统上运行代码的所有复杂性。完全相同的 MapReduce 代码可以在 10,000 个节点的集群或单台笔记本电脑上运行。因此,开发变得更容易,出错的机会也更少。

最后的想法

Hadoop 简化了集群内不同节点之间的数据存储和处理。Hadoop 利用数据局部性来处理大量数据,而无需通过网络发送。HDFS 负责处理分布式系统中的许多复杂问题,比如当一个节点不可避免地出现故障时如何处理。使用 MapReduce,我们可以分解一个工作负载,并将其分布在多台计算机上并发执行,然后在 Reduce 阶段之后可以获得聚合结果。

具有弹性搜索的大型快速人在回路 NLP

原文:https://towardsdatascience.com/big-fast-nlp-with-elasticsearch-72ffd7ef8f2e?source=collection_archive---------2-----------------------

第一部分:关键词工厂TL;dr:如果你 1)在 Elasticsearch 中存储你的数据 2)使用[clio-lite](https://github.com/nestauk/clio-lite#keywords-getting-under-the-hood)包中的clio_keywords函数,指向你的 Elasticsearch 端点 3)在 Flask 应用中托管它,比如这个

第二部分:上下文搜索引擎TL;dr:如果你 1)将你的数据存储在 Elasticsearch 中 2)使用[*clio-lite*](https://github.com/nestauk/clio-lite)托管一个 lambda API 网关 3)用你自己的前端询问它,或者使用像 searchkit 这样的开箱即用的东西,你可以使成为其中之一

许多 NLP 数据科学家目前的日常工作范式是打开笔记本电脑,启动 Python 或 R,制作一些模型,总结一些结论。这对于探索性分析来说非常有效,但是如果你需要把一个人(比如一个专家,你的老板,甚至你自己)放入循环中,这可能会变得非常慢。在这篇由两部分组成的博客中,我将试图让你相信有更大、更快的方法来实现 NLP。

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

Big fast human-in-the-loop NLP (Photo by Stephen Hateley on Unsplash)

人在回路 NLP 和我

在我Nesta的日常工作中,我开发工具和基础设施,让人们能够做出更好的决策,让人们能够利用最新的数据做出这些决策。我们为地方、国家和国际决策者和资助者提供工具,他们依赖于与科学、技术和社会的最新创新保持同步。由于这些人对他们的决定负责,这通常排除了采用黑盒程序的工具。“人在回路中的自然语言处理”是我们解决这些需求的方式,尤其是因为非结构化文本数据是最丰富、最可用和最新的数据形式之一。

弹性搜索

数据工程师、数据库管理员和 devops 工程师都应该熟悉“elastic stack”(elastic search 是其核心),它是存储和分析日志文件或构建搜索引擎的首选技术,尽管他们中的许多人可能不太了解数据科学研究的巨大潜力。与此同时,许多数据科学家充其量对作为数据存储技术的 Elasticsearch 有一个基本的了解。

简而言之 : Elasticsearch 是一个搜索引擎的数据库,因为 数据的存储方式 而能够进行闪电般的搜索。

在 Elasticsearch 中,文档被存储为词频向量(一个被称为“倒排索引”的过程),并且文档频率是为每个词预先计算的。这意味着几件事:

  1. 一个术语接一个术语的同现以令人难以置信的速度快速从中提取*。*
  2. 重要术语可通过标准数据科学‘TF-IDF’程序即时识别*。*

从数据科学家的角度来看,Elasticsearch 数据库是一个非常基本(但功能强大)的预训练模型,用于提取关键字、同义词、相似文档和离群值。在这个由两部分组成的博客中,我将使用开箱即用的功能来触及所有这些内容(尽管当然也可以采用更复杂的方法)。

第一部分:关键词工厂

最简单的情况:允许非专家识别他们自己的关键字和同义词

生成关键字(或同义词)列表是数据科学家的一项常见 NLP 任务。它可以有从维度减少到主题建模的应用,并且还可以通过向人类分析师提供可以用于更费力的任务的一组数据驱动的术语来用于人在回路中的分析。

许多数据科学家会使用适当的 python(或 R)包来处理这个问题,以便产生相当静态的输出,这对于报告或论文来说是很好的。大多数时候,我们都希望我们的结果能够被非专家访问,但是实际上,人们最终得到的是他们所得到的:静态输出。我们有哪些可供非专家使用的可扩展且灵活的工具?

Python(或 R)包:错误工作的正确工具

有大量基于 python 的方法可以解决这个问题,如主题建模(如潜在的狄利克雷分配或相关性解释)、单词向量聚类(如单词嵌入或香草计数向量)或使用共现矩阵或网络。

所有这些方法都可以给出非常合理的结果,老实说,我并不想在感知准确性上击败这些方法。如果我的任务是进行一次性的特别分析,我可以考虑以上任何一种方法。

然而,我喜欢可扩展、可共享和灵活的问题解决方案:

  • 可伸缩性:我建议的所有 python 解决方案都要求数据和模型驻留在内存中。对于大量的文档或大量的词汇,内存消耗会很大。对此的一个解决方案是以牺牲模型的“深度”为代价对数据进行采样。
  • 可共享性:如果你没有在非专家的笔记本电脑上安装 python 包,同时又希望你的设置与他们的笔记本电脑兼容,你如何与他们共享结果?两种可能是在远程服务器上托管你的机器学习模型(可以是从集群模型到共生矩阵的任何东西)(但是要小心那巨大的内存开销!),或者您可以预先生成静态的关键字集(这非常简单)。
  • ***灵活性:*想象一下,你想用多一个文档来更新你的模型,或者决定就地过滤你的数据——用常规的机器学习模型来做这件事并不简单。您的最佳方法可能是为每个预定义的过滤器预生成一个模型,这在计算上是昂贵的。

弹性搜索:适合工作的合适工具

请记住,Elasticsearch 实际上是一个预先训练好的词共现模型,可以根据词的重要性进行过滤,这就很清楚为什么它可以动态地生成关键字列表。此外,我们应用于 Elasticsearch 的任何方法都具有内在的可扩展性、可共享性和灵活性:

  • 可伸缩性 : Elasticsearch 的性能高达 Pb 级。
  • 可共享性 : Elasticsearch 通过一个简单的 REST API 公开数据上的方法。要完成复杂的任务,您可以简单地将一些托管在远程服务器上的轻量级 python 代码串在一起。
  • 灵活性:更新您的“模型”就像向服务器添加新文档一样简单。按任何字段过滤数据都是一项基本操作。

“重要文本”集合

原则上,我们可以从零开始实现我们自己的提取关键词的程序,但是有一些快捷方式,你可以通过使用 Elasticsearch 的开箱即用功能来使用。

下面的 python 代码包装了一个对 Elasticsearch API 的查询(用您自己的端点替换URL,用您想要查询的数据库中的字段名称替换FIELD_NAME):

*import requests
import json

def make_query(url, q, alg, field, shard_size=1000, size=25):
    """See [this gist](https://gist.github.com/jaklinger/6a644956f32e3e8b0d5e41c543ee49e1) for docs"""
    query = {"query" : { "match" : {field : q } },
             "size": 0,
             "aggregations" : {
                 "my_sample" : {
                     "sampler" : {"shard_size" : shard_size},
                     "aggregations": {
                        "keywords" : {
                            "significant_text" : {
                                "size": size,
                                "field" : field,
                                alg:{}
                             }
                        }
                    }
                }
            }
        }
    return [row['key'] 
            for row in requests.post(f'{url}/_search',
                                     data=json.dumps(query),
                                     headers={'Content-Type':'application/json'}).json()['aggregations']['my_sample']['keywords']['buckets']]*

在幕后,该查询执行以下操作:

  1. 在字段field中查找包含文本query的所有文档。
  2. field中提取size最高有效项,根据jlh算法计算。

最重要的是,增加shard_size的大小将增加你的“模型”的稳定性(和深度),代价是计算性能。实际上,您只会期望您的模型在极少数情况下变得不太稳定——在这种情况下,您可以构建一个解决方法。

tweeks 之前的性能:arXiv 数据

我的 Elasticsearch 数据库中有 arXiv 的所有科学出版物,下面是它对以下查询的抽象文本的表现:

*python pandas['pandas', 'numpy', 'package', 'scipy', 'scikit', 'library', 'pypi', 'cython', 'github']-----------------------------elasticsearch['kibana', 'lucene', 'hadoop', 'retrieving', 'apache', 'engine', 'textual', 'documents', 'ranking']-----------------------------machine learning['learning', 'training', 'algorithms', 'neural', 'supervised', 'automl', 'intelligence', 'deep', 'tasks']----------------------------------------------------------drones and robots['robot', 'drones', 'robotics', 'robotic', 'humanoid', "robot's", 'drone', 'autonomous', 'mobile']-----------------------------*

…这是开箱即用的功能!一些简单的批评是:

  1. 无论是在查询中还是在结果中,n 元语法都没有被利用。例如,machine learning被视为{machine, learning},而不是{machine learning, machine, learning}
  2. 搜索结果中出现停用词并非不可能。
  3. 样本外的拼写错误根本不会被处理。
  4. 名词的复数和所有格形式以及所有动词的变化都单独列出。

我不打算在这里解决后两点,但是处理它们是相当琐碎的。例如,拼写错误至少可以用两种方式处理,例如使用:

为了处理 n-gram 查询(比如machine learning)我在我的 Elasticsearch 数据库中创建了一个包含预标记摘要的字段,在其中我已经识别了 n-gram。请注意,该字段的“模式”可在此处找到。如果你想知道,我通过使用基于 wiki tionaryn-grams 的查找表来处理我的 n-grams(但是更数据驱动的方法也可以)。

虽然我自己没有实现这一点,但是可以对复数/所有格/变形进行类似的预处理,有效地将所有非简单形式的术语替换为它们的简单形式。

最后,为了避免返回停用词的潜在尴尬,我使用我的make_query函数从数据中生成它们:

*and of but yes with however[‘however’, ‘but’, ‘not’, ‘answer’, ‘with’, ‘the’, ‘is’, ‘of’, ‘to’, ‘a’, ‘in’, ‘and’, ‘that’, ‘no’, ‘this’, ‘we’, ‘only’, ‘for’, ‘are’, ‘be’, ‘it’, ‘can’, ‘by’, ‘on’, ‘an’, ‘question’, ‘also’, ‘have’, ‘has’, ‘which’, ‘there’, ‘as’, ‘or’, ‘such’, ‘if’, ‘whether’, ‘does’, ‘more’, ‘from’, ‘one’, ‘been’, ‘these’, ‘show’, ‘at’, ‘do’]*

我只是将这些从返回的结果中排除。

把所有的放在一起

在 arXlive 网站上查看正在运行的关键字工厂,其特色是 n-grams 和停用词移除。你可以使用[clio-lite](https://github.com/nestauk/clio-lite#keywords-getting-under-the-hood)包中的clio_keywords函数制作自己的 Flask 应用程序。玩得开心!

第二部分:上下文搜索引擎

考虑一个技术性很强的数据集,比如来自全球最大的物理、定量和计算科学预印本库 arXiv 的数据集。假设您不是博学的学者,您会采取什么策略来查找与 大数据和安全 相关的 arXiv 最新研究?如果你在 arXiv 上进行精确的搜索,你会发现自己有一组不错的结果,但问题是,当你搜索 大数据 时,你可能没有意识到你还想在查询中包括一些不太相关的术语,如 {hadoop、spark、云计算} 。如果在 云计算和安全 领域有一些你一直错过的重大突破,会怎么样?(TL;博士 这是相同的搜索与一个‘上下文’搜索引擎 )

我将把这个问题分成两部分,通过使用 Python 中的一些 Elasticsearch 功能来解决它:

  • 首先,你如何在不是天才的情况下做出一个像样的搜索查询?
  • 其次,如何定义新奇?

做一个像样的查询,而不是一个天才

回到制作一个像样的搜索查询的问题。天才可能会采取哪些方法?嗯,他们可以沿着’关键词扩展的路线走下去,例如通过考虑所有的 {hadoop、spark、云计算} 以及 大数据 ,以及所有的{攻击、加密、认证}* 以及 安全 *。这可能是一条很有前途的道路,我们已经在之前的博客中编写了工具来帮助实现这一点。然而,“关键字扩展”方法的主要问题是它缺少 上下文 。对此的一个自然扩展是’文档扩展’,谢天谢地,Elasticsearch 内置了这个特性。

更像这样

好吧,老实说,Elasticsearch 的 更像是——这个 查询实际上是‘关键词扩展*++**’,而不是‘文档扩展’,就像你在向量空间中想象的那样。在引擎盖下,从您想要“扩展”的输入文档中选择有代表性的术语(根据高度可配置的过程)。与纯粹的“关键词扩展”方法相比,这样做的优点在于,与所有输入项共现的项被认为比那些仅与输入项的子集共现的项更重要。结果是,可以假设用于播种“文档扩展”的扩展的关键字集具有高度的上下文相关性。*

所以我的策略是:

  • 对 Elasticsearch 进行常规查询,检索 10-25 个最相关的文档。这些将是我们的“种子”文档。
  • 使用种子文档,用一个 more-like-this 查询跟进。

这种策略看起来有点像这样(实际上代码要多一点,所以实际上看起来像这个):

***# Make the initial vanilla query** r = simple_query(url, old_query, event, fields)
data, docs = extract_docs(r)**# Formulate the MLT query** total = data['hits']['total']
max_doc_freq = int(max_doc_frac*total)
min_doc_freq = int(min_doc_freq*total)
mlt_query = {"query":
             {"more_like_this":
              {"fields": fields,  **# the fields to consider**
               "like": docs,  **# the seed docs**
               "min_term_freq": min_term_freq,
               "max_query_terms": max_query_terms,
               "min_doc_freq": min_doc_freq,
               "max_doc_freq": max_doc_freq,
               "boost_terms": 1.,
               "minimum_should_match": minimum_should_match,
               "include": True  **# include the seed docs**
              }
             }
            }**# Make the MLT query** query = json.dumps(dict(**query, **mlt_query))
params = {"search_type":"dfs_query_then_fetch"}
r_mlt = requests.post(url, data=query,
                      headers=headers,
                      params=params)**# Extract the results** _data, docs = extract_docs(r_mlt)*

注意,我通过 AWS API Gateway 在 Lambda 函数中提供此功能。部署上述功能的代码也可以在同一个 repo 中找到。

定义新颖性

新奇没有特别狭窄的定义,我承认我对这个博客的定义会相当狭窄…

新奇通常可以被定义为任何(或更多)的{新的、原创的、不寻常的},我的定义将跨越{原创的、不寻常的}概念。更正式一点(但不是很正式)我是问 Elasticsearch 里每个文档的以下问题:

你和你最近的邻居有多大的不同?

只是为了理清这里的逻辑:如果文档的总样本是不平衡的,那么一个属于小众话题的文档会和一般的文档有很大的不同。我们可以通过比较最近的邻居来避免这种情况。还有什么比再次使用more-like-this*(完整代码在此)更好的获取最近邻居的方法呢:*

*mlt_query = {
    "query": {
        "more_like_this": {
            "fields": fields,  **# field you want to query**
            "like": [{'_id':doc_id,     **# the doc we're analysing**
                      '_index':index}], 
            "min_term_freq": 1,
            "max_query_terms": max_query_terms, 
            "min_doc_freq": 1,
            "max_doc_freq": max_doc_freq, 
            "boost_terms": 1., 
            "minimum_should_match": minimum_should_match,
            "include": True
        }
    },
    "size":1000,  **# the number of nearest neighbours**
    "_source":["_score"]
}**# Make the search and normalise the scores** r = es.search(index=index, body=mlt_query)
scores = [h['_score']/r['hits']['max_score'] 
          for h in r['hits']['hits']]**# Calculate novelty as the distance to a low percentile** delta = np.percentile(scores, similar_perc)
return 1 - delta*

自然,任何包含“不寻常”概念的像样的新颖性定义都应该包含坏数据,因为人们希望这些数据是不寻常的。我发现,通过对 arXiv 数据应用上面的新颖性评分器,我能够找出一大堆糟糕的数据,比如抄袭的和“评论的文章。我继续给这些标上 0 的新奇度,但是我相信你可以找到自己的方法!

这种新颖性评分方法的一个缺点是实现起来相对较慢(它必须在逐个文档的基础上计算),因此我对我的 Elasticsearch 数据库中的所有文档进行了预处理。

把所有的放在一起

因此,通过过度使用 Elasticsearch 的 more-like-this 查询,我们能够进行广泛的搜索,同时衍生出一种非常轻量级的新奇度。查看[clio-lite](https://github.com/nestauk/clio-lite)以更好地理解代码,并且如果您想看到这在行动中,请查看 arXiv 数据的hierar xy搜索引擎。请注意,我还使用了与第一部分中描述的相同的预处理,以及本博客中描述的数据清理。感谢阅读!

大 O——危险的实用介绍

原文:https://towardsdatascience.com/big-o-a-perilously-practical-introduction-d476d597c942?source=collection_archive---------32-----------------------

什么是大 O,我们为什么要关心它?

大 O 符号是我们可以表达不同算法的性能的一种方式,更重要的是,它们如何相对于输入的大小增长。在这里,我将尝试用一些简单的实例来说明我们为什么应该关注它。快结束的时候,我把这些数据用可视化的方式呈现出来,帮你带走。大 O 是一个巨大的主题,我会愚蠢地试图在这篇文章中涵盖所有相关的内容,所以我也建议查看进一步阅读/查看中列出的其他来源!

想象你在一家不可靠的公司工作,开发可以分析 Instagram 数据的软件。软件设计的一个主要因素可能是它处理规模的能力。

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

Source: Geralt, via Pixabay

当你想对你的 100 个 Instagram 粉丝进行一些超级有意义的分析时,使用一个好的算法可能并不那么重要。你可以在几毫秒内计算出你想要的任何东西,不管你选择如何进行。但是当涉及到科勒·卡戴珊和她的 1 亿追随者时,使用一个扩展性差的算法可能会相当昂贵。你的老板可能希望你想出一个能在几秒钟内返回相关数据的函数。如果你做错了一点点,也许你会花上几年的时间!

一般来说,大 O 假设一个算法的上限,这或多或少代表了最坏情况的行为。这很好,因为当你把事情弄糟时,事情不会变得更糟。衡量最佳情况的场景没有那么有用。例如,如果您想使用特定的排序算法对您的关注者进行排序,但他们已经排序了,那么这并不能真正告诉我该算法的性能。

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

It’s not hard to be faster than Hide The Pain Harold

此外,当我们想要以一种独立于机器的方式比较算法时,大 O 是有用的。很有可能你的 2019 年 MacBook Pro 升级了所有规格,运行任何算法的速度都比这家伙 2001 年的笔记本电脑快。此外,与这些怪物相比,你的笔记本电脑可能很糟糕。因此,在比较算法时,我们不希望这影响我们的发现。

因为我想展示规模对算法的影响,所以我将在同一台机器上运行所有的基准测试。更重要的是随着规模的增加所用时间的趋势,而不是实际所用时间本身。我可能会提醒你这一点,因为这很重要。

模特:(字面意思?)

为了展示不同算法复杂度的伸缩性,我选择在 ruby 中将 7 个不同的 Instagram 账户建模为 7 个独立的数组。为了简单起见,每个数组都包含唯一的整数来代表每个唯一的 Instagram 关注者。每个后续账户都被建模为比前一个账户多 10 倍的关注者。稍后你会看到这是如何让我们发现一些趋势的。

以下是幸运选中的 Instagram 账户:

  • 我的金鱼: 10 个追随者(我和我的家人)
  • 我: 100 个追随者(只有 8 个实际的追随者,占我自己创建的 92 个账户)
  • 我爸爸: 1000 个粉丝(他有好看的鸟照片)
  • **我的狗:**一万关注者(狗很可爱)
  • 我想象中的女朋友: 10 万粉丝
  • 詹妮弗·安妮斯顿:100 万粉丝(她仅用了 5 小时 16 分钟就达到了 100 万——这是更重要的吉尼斯世界纪录之一)
  • 剑桥公爵夫妇:1000 万粉丝
  • 科勒·卡戴珊: 1 亿粉丝(大家的最爱!)

流程:

为了有条理地展示这些例子,我进行了以下步骤。

首先,我使用 Ruby 和一个名为 Benchmark 的模块来编写脚本并处理计算。基本上,Benchmark 允许我测量执行某些代码段所需的时间。

在运行的时候,我确保将我对每个账户的追随者应用每个算法所花的时间记录到一个文件中。

然后,对于日志,我随后使用 Python 处理数据,并将其转换成一个与 Plotly 非常互动的图形,其结果你可以在这篇博文的结尾预览。

不同的时间复杂性:

这是文章的要点。下面的每一小节都将描述算法,以及它们在处理 10 个追随者和 1 亿追随者时的表现。再一次,试着去掉趋势,而不是实际花费的时间!

O(1):常数

当所需的运算次数相同时,不管输入的大小如何,算法都是 O(1)。

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

在这个例子中,我只是返回每个 follower 数组中的第一个 follower。不管数组中有 100 万还是 1000 万个追随者,都需要相同数量的步骤来获得最终结果,因此理论速度是相同的。

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

我们最感兴趣的数字是最右边下方表格中的真实值。这些都是以秒来衡量的。它们是超级小的数字,但是不要担心,随着我们的进行,你将获得更好的数量感。为了减少混乱,在随后的部分中,我将只发布下面的表。

顺便说一下,如果你对如何理解这个输出感兴趣,可以看看这个博客中的**‘入门’‘基准# bmbm’**部分。此外,如果您想找到代码或日志的副本,或者如果您想在自己的设备上运行它,请在页面底部找到我的 GitHub 链接。

O(n):线性

当性能与输入数据集的大小成正比增长时,算法是线性的。

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

在这里,我只是返回一个更近的 Instagram follower(一个位于数组中 90%的位置,由**‘target’**标记)。我使用的是 Ruby 内置的可枚举#find,它从数组的开头开始,按顺序检查数组中的每一项,直到找到匹配项。

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

如你所见,每个后续账户的处理时间大约要长 10 倍,这是我们对线性复杂度的预期,因为每个账户都有 10 倍多的关注者。

O(log n):对数

在这里,我试图执行与上面完全相同的任务。这里的不同之处在于,我使用的是 Ruby 的内置方法 Array#bsearch ,它的工作方式是不断将数组一分为二,直到找到目标。你已经通过一步完成了数据集的一半。

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

请注意,为了使用 Array#bsearch,数组必须已经排序。

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

正如你所看到的,用这个二分搜索法处理粉丝每增加 10 倍所花费的时间几乎可以忽略不计。为了进行比较,在这种情况下,用这种算法从 1 亿人中找到一个特定的追随者似乎是有效的,然后在上面的线性搜索中从 100 人中找到一个。这个实现的伸缩性非常好。哇!

此外,如果将此与 O(1)进行比较,您可能会注意到它并没有太大的不同。

O(n log n):线性算法

这是执行对数运算 n 次的结果。一些流行的排序算法,比如合并排序、快速排序和堆排序,平均花费 n log n 时间。

在这个例子中,我随机打乱了所有关注者的顺序。从这里,我开始了基准测试,并记录了将它们重新排序所需的时间。我从这里借用了一个合并排序的实现。

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

如果进行比较,它似乎比上面的线性算法扩展性差得多。花了大约 8 分钟的时间将科勒·卡戴珊的粉丝重新排序。事情不会变得更糟了…是吗?

O(n):二次

二次算法通常是指运算次数是输入次数的平方。

嵌套 for 循环是一个常见的例子。

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

在这里,我模拟了 Instagram 账户的每个关注者向同一账户的每个其他关注者介绍自己的互动。是的,听起来很奇怪。

想象你和 10 个人坐在一个房间里。你是第一个向房间里的其他人介绍自己的人——一次一个人。一旦你完成了,你看着其他人也做同样的事情。这需要一些时间。现在想象一下,在一场音乐会上与 10,000 名其他人做同样的事情,你可能会在那里呆上几个月,甚至更久。你几乎不可能在同一个地方理解科勒·卡戴珊的其他 1 亿名追随者。你永远也完成不了。世界以这种方式终结。

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

如果您查看基准测试结果,关注者每增加 10 倍,就需要大约 100 倍的时间,因此需要 100 倍的运算量。处理 10 万个 Instagram 粉丝用了将近 10 分钟。

请注意,我甚至连 100 万以上的粉丝都没有。让我解释一下为什么——这不是因为我懒。如果我试图等待 100 万美元,需要 15 个小时(好吧,我想我可以在一夜之间完成)。处理公爵的 1000 万需要 64 天,处理科勒·卡戴珊的 1 亿粉丝需要将近 18 年。哎呀!

我想你现在明白了。二次比线性差得多。每当您需要处理大规模数据时,请远离它。

超越二次…

是的,存在诸如指数、阶乘和更高次多项式的算法。在许多情况下,它们是不切实际的,所以我想我就此打住。我们不想在这个危险的公司丢掉工作!

将所有这些放在一起:

这是我们绘制在图表上的所有数据点。请注意,我们图上的两个轴都使用对数刻度。轴上的每个刻度值代表大小增加 10 倍,而不是线性缩放。这是为了让我们可以正确地可视化我们的数据,因为它覆盖了一个巨大的规模(相信我,它看起来很可怕的法线)。

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

图中线条上升得越平缓,算法就越能有效地随大小缩放。如果我包括指数和阶乘,他们会直线上升!

我本来想写一个很酷的总结,但我觉得这个人已经写得很好了:

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

如果你想下载并自己玩这个,我已经把它放在我的 GitHub 页面这里

所有的代码,以及这篇文章,都是在一天的时间里完全从头开始写的。随着时间的推移,我会尽量更新它。利用一些好的算法,做事情比我做省力 10 倍好 100 倍!

谢谢!

进一步阅读/查看:

这一页,https://www.bigocheatsheet.com,很好地总结了这里所涵盖的内容。我肯定会花时间尽可能多的去理解。

这一页,https://discrete.gr/complexity,更详细地介绍了这个主题,并且有大量的练习题供你不及格(无论如何,这是第一次)。

如果你更喜欢视频,CS Dojo 在这里也很好地解释了这个主题的介绍。他在 YouTube 上有超过 100 万的用户是有原因的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值