TowardsDataScience-博客中文翻译-2020-七十一-

TowardsDataScience 博客中文翻译 2020(七十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

关于分类器组合的见解

原文:https://towardsdatascience.com/insights-on-classifier-combination-da56f764fcfa?source=collection_archive---------55-----------------------

随着分类算法库的急剧增加,使用几个分类器,然后组合它们的决策以获得准确性并避免选择正确的一个的负担变得越来越有吸引力。注意,分类器的组合本身仍然是一个分类器,没有免费的午餐定理也适用于它。普遍最优的分类器是没有希望的,但是我们可以实现其他形式的鲁棒性,我们将在后面讨论。最简单的融合方法之一是对每个分类器提供的预测类别集执行多数投票。

在这篇文章中,我提出了一些在组合量词时要记住的一般性原则。具体来说,我研究了关于组合信息的性质、组合规则、单个分类器的类型和组合结构的融合方案的分类。然后,我们讨论了多样性在多分类器系统中的重要性。

https://pix abay . com/插图/交通信号灯-交通信号灯-相位-2147790/

1)分类器组合的说明

四个问题有助于确定我们解决组合问题的角度:

Q1:输出什么性质的信息要组合?

Q2:什么类型的分类器要组合起来

Q3:用什么组合规则来组合决策?

Q4:这个组合的结构是怎样的?

  1. 分类器输出性质的相关分类( Q1 )在文献中给出:基本输出(分类器的输出是单个标签)、分级输出(分类器的输出是从最可能到最不可能分级的标签列表)和评分输出(分类器给每个类别标签分配置信度)。
  2. 基于来自相同分类算法的分类器的融合方法被称为同质组合方法(例如,随机森林使用决策树)或集成方法。这一类别中的标准方法是由 Breiman 首次引入并随后开发的 bagging(引导聚合)。另一种非常流行的集成方法是 boosting,其最广泛使用的实现是 AdaBoost。在过去的二十年里,机器学习社区对打包和提升进行了很好的探索和研究。最近,一种新的升压设计利用了线性规划支持向量机(LPSVM)。如果融合面板包含不同的分类器,那么我们讨论异构组合方法,即组合神经网络和决策树。这两种类型的面板(同质和异质)是源于( Q2 )的多分类器系统的主要类别。
  3. 更不用说组合分类器的类型,组合方法也根据允许决策融合的规则来分类。两个主要类别是确定性方法和概率性方法,这是对( Q3 )的两种可能的回答。通过概率方法,我们意味着分类函数依赖于类别概率分布的最大化。分类器组合也可以在其他不确定性框架内执行,这些框架可以是诸如模糊逻辑之类的概率论的替代方案,或者与诸如信任函数框架之类的概率论相关。在 Dempster 的原始论文中,通过用多值映射插入概率测度来获得信任函数。其他作者主张该理论是独立的,不需要建立在概率对象上。
  4. 关于组合架构( Q4 ),我们指的是分类器如何组织成一个网络并连接到融合过程。有三种主要的拓扑类型:并行、顺序或混合组合。在并行融合中,基本分类器独立工作,它们可以用不同特征空间中的输入进行训练,并且特征向量可以或可以不从相同的原始训练样本中导出。然而,给定分类器的输出不能作为另一个分类器的输入。在顺序(串行)融合中,基本分类器以顺序方式堆叠,一个分类器的决策取决于先前的决策。一些类别标签在每个分类步骤中被去除,直到剩下一个类别。混合分层融合是并行和顺序架构的混合。

该图与( Q4 )相关,展示了三种不同的分类器组合方案。这个数字摘自我自己的博士报告。

作者图片

2)多样性问题

设计多分类器系统(MCS)需要在选择单个分类器时特别小心,以便实现更高的分类精度或获得更鲁棒的算法。例如,在同一数据集上训练的一组线性分类器肯定会收敛到非常接近的分离超平面,并且组合非常相似的决策规则注定会获得平均结果。因此,多样性是设计有效的多分类器系统的指导原则。

应对措施需要多样化

多样性和独立性的概念是密切相关的,但两者之间的分界线仍然不清楚。然而,我们可能不期望高度依赖的分类器池输出非常不同的响应,因为依赖的分类器肯定会产生相关的响应。在这一节中,我们讨论测量多样性的方法以及在分类器响应中诱导多样性的方法。

Brow 等人主张可以通过两种方式在分类器集成中引入多样性。第一种方式是显式的,它基于对分类器池的多样性度量的优化。第二种是隐式的,它包括使用不同的机制生成分类器,并希望在它们的响应中具有显著的独立性。这通常通过在不同的学习数据样本或特征空间的不同区域上训练它们来完成。

隐式分集诱导方案

第二类多样性归纳涉及基于输入数据、输出决策或分类器类型的操纵的一些隐含方法。

在他们的调查中,沃兹尼亚克等人为数据操作制定了以下分类法:

分割数据点:这允许在不同的训练集上训练单个分类器。尽管学习样本在某种程度上是相关的,但我们使用不同的训练数据在分类器响应中保持一定程度的多样性,这些数据可能是通过对学习样本进行拆分或随机采样(如 Bagging)而获得的。

选择特征子集:同样,基本分类器因此在不同的数据集上被训练,在某种意义上,它们可以访问每个训练示例的不同信息。因此,决策函数有不同的领域,如果特征是弱相关的,那么我们实现多样性。在这种情况下,一种流行的策略是随机选择那些被选择来训练每个基本分类器的特征的子集。这种策略被称为随机子空间方法。另一种策略包括为特征空间中的每个分区选择具有最佳性能的分类器。

  • 修改分类器输出 : MCS 可以通过要求每个分类器只区分类的子集来享受另一种形式的多样性。为了恢复整个类别集的决策粒度,需要设计特定的信息融合策略。这一类别中一个著名的方法是一对一分类器,在这种情况下,多类分类问题被分解为二类分类问题。分类器将在给定标签和剩余标签之间进行选择。纠错输出码方法也属于这一类方法。在这种设置中,每个标签都有一个码字(二进制值序列),然后构建二进制分类器,为每个测试样本产生一个码字。所选择的标签是与测试样本码字具有最接近汉明距离的标签。

结论

在这个故事中,我谈了一些关于分类器组合的见解,以及应该如何看待这个问题。

在我未来的故事中,我将讲述经典的分类器组合方法,如投票、Borda 计数。我还将讨论在不确定性框架内组合分类器决策,如概率和可能性理论。

使用新标签对新冠肺炎疫情建模的见解

原文:https://towardsdatascience.com/insights-to-modeling-covid-19-epidemic-using-new-labels-4dee6d493e29?source=collection_archive---------57-----------------------

爵士和 SEIR 模型中缺少了什么?

流行病学中的建模是使用给所有人分配标签的分室模型来执行的。这些标签可以被认为是状态机中的状态,并且整个群体被分配不同的类别。用于模拟新冠肺炎的一个普遍的房室模型是 SIR 模型(易感-感染-康复)。SIR 模型使用一组方程(ODEs)来计算在给定时间易感、感染和康复的人。SIR 模型是有界的,因为它认为所有感染的人都会立即被感染(或出现症状)。这与冠状病毒疾病的情况不同,在冠状病毒疾病中,不同的个体在不同的时间开始出现症状。SEIR(易感-暴露-感染-康复)模型是 SIR 的变体,也不能用于准确模拟新冠肺炎,因为它是基于每个感染个体都被报告的假设。有多种原因可以解释为什么会有感染者没有被报告,比如缺乏检测设备,不知道等等。

本文将解释 SIRU(易感-感染-报告-未报告)模型,该模型通过在新冠肺炎疫情中的应用,克服了 SIR 和 SEIR 模型的缺点。此外,本文重点分析了公共卫生组织的干预措施,如隔离和封锁,以及在不同国家的积极测试的效果。我的文章是受[1]和[2]中的工作的启发,其中 SIRU 模型已经被提出用于流行病建模以及逼近其参数的方法。

SIRU(易感-感染-报告-未报告)

它是流行病学中使用的分室模型,专门用于将未报告的感染个体病例纳入建模,从而捕捉公共测试的影响。社会距离的影响也可以被这个模型所容纳。

图 1: SIRU 流程图

该模型由以下常微分方程系统组成:

参数

  • t ≥ t₀ 为天数, t₀ 为疫情开始, t=0 对应 2019 年 12 月 31 日
  • τ :传染率
  • S(t) = S :在时间 t 易受感染的个体数量
  • I(t) = I :时间 t 无症状感染个体数
  • R(t) = R :在 t 时间报告的有症状的感染个体数
  • U(t) = U :在时间 t 未报告的有症状的感染个体数
  • 无症状个体变成有症状个体的速度
  • ƞ: 已报告/未报告症状的个体恢复的速度

假设

  • 与个体的一生相比,感染的过程是短暂的,并且疾病不是致命的,因此出生和死亡可以被忽略。
  • 人口保持不变,没有移民。
  • 所报告的有症状的个体被立即报告和隔离,并且不会引起进一步的感染。
  • 所有感染都是从传染性无症状个体( I )或未报告的传染性个体( U )获得的。
  • 从感染中康复的个体获得了对病原体的完全免疫力。
  • 无症状感染个体( I )在平均 1/ ѵ 天的时间内(潜伏期)具有传染性。
  • 已报告的症状( R )和未报告的症状( U )个体在平均 1/ ƞ 天的时间内(恢复期)具有传染性。
  • f :无症状感染个体( I )成为报告症状个体( R )的比例。
  • (1 — f) :无症状感染个体( I )变成未报告的有症状个体( U )的比例。
  • ν₁ = ѵ * f :无症状传染个体( I )成为报告症状个体( R )的比率。
  • ν₂ = ѵ * (1 — f) :无症状传染个体( I )变成未报告症状个体( U )的比率。

初始条件

估计参数

我们利用确诊病例数据来确定参数 τ,ν,ν₁,ν₂,η 的值,以及初始条件s(t₀】i(t₀】u(t₀)

我们假设在时间 tCR(t) 累计报告的有症状的感染病例,由到时间 t 为止的有症状的感染病例总数的恒定部分组成。由于 ν₁ 是报告的有症状的感染个体的去除率, CR(t) 表示为:

假设在疫情初期,累计报告的有症状传染病病例呈指数增长

通过将该曲线与报道的病例数据进行拟合,我们得到了χ₁、χ₂ 和χ₃的值。

实验

我们使用 Kaggle 上提供的数据集(小说电晕病毒 2019 数据集)。以西班牙为例,我们设定 S₀ 的数值为西班牙总人口,s₀= 4690 万。然后我们根据最初的发现确定 ν,η,fѵ=1/7η=1/7f = 0.8。图 2 显示了前 45 天冠状病毒病例的拟合曲线。

图 2:显示西班牙冠状病毒病例前 45 天拟合曲线的图

拟合曲线为我们提供了χ1、χ2 和-χ3,分别为 0.01920、0.29338 和-36.47589。这条曲线帮助我们:

  1. 获得疫情开始的时间,t₀
  2. 获得 I₀无症状感染者的初始人数
  3. 获得 U₀未报告症状个体的初始数量
  4. 获得传输速率τ

详细推导请参考最后的附录。

使用上述计算值,从方程(3)中绘制 CR(t) ,从方程(1c)中绘制 R(t) ,从方程(1d)中绘制 U(t) ,如图 3 所示(左图)。

由于传播率( τ 因封锁而降低,社会距离和报告的感染个体比例( f 随着攻击性检测而增加,将参数 τf 视为时间变量系数 τ(t)f(t) 在解释公共卫生措施的效果时非常有用。

假设 τt=N₁ 被国家严格封锁时变为 0。

此外,假设在 t= N₂ 的状态下采用积极测试后,f 增加到 0.9。

在西班牙的情况下,我们采用 N₁=N₂= 76 天(封锁从 3 月 14 日开始,因此假设传输速率从 3 月 16 日开始变为 0)。在图-3(右)中绘制来自(3)的 CR(t) 、来自(1c)的 R(t) 和来自(1d)的 U(t)

图 3:西班牙实验

西班牙的公共卫生措施从 3 月 14 日开始在全国范围内实行封锁,但对控制疫情没有太大效果。转折点,即 R(t)达到最大值的时间,还没有从 66 天下来。该国报告了世界上第二高的病例数。[3]

现在,我们来考虑对比一下各个国家的场景。

以下实验的假设:在宣布封锁两天后,传播率变为 0。随着测试增加的 f 的值也假定在锁定两天后从 0.8 变为 0.9。在南韩,政府宣布了“红色级别”警报,但没有封锁,假设在“红色级别”警报宣布两天后,传输率和 f 发生类似变化。

图 4:韩国实验

韩国遏制病毒传播的措施包括积极的检测策略和严重依赖移动应用程序,这些应用程序通过帮助人们避免接触阳性病例来帮助减少感染的传播。在 2015 年面临类似危机(中东呼吸综合征)后,在政府于 2 月 23 日宣布“红色级别”警报后,人们在采取预防措施方面保持警惕。这帮助韩国将转折点提前了 14 天。

图 5:德国实验

德国从 3 月 22 日开始的大规模测试和全国宵禁虽然降低了疫情的规模,但并没有带来其转折点的改变。

图 6:意大利实验

意大利政府采取的公共卫生措施将转折点提前了 20 天,并降低了疫情规模。

图 7:湖北实验

由于有效的公共卫生措施,如从 1 月 23 日起严格封锁和增加检测,转折点已从 138 天下降到 28 天,新冠肺炎疫情在中国湖北省的规模大幅缩小。

结论

通过 SIRU 模型,我试图比较公共卫生措施在世界不同地区遏制冠状病毒传播的效果。此外,我还通过当局积极的病毒检测纳入了报告病例的增加,从而发现了未报告的病例。这种措施的效果并没有反映在其他车厢模型中,如 SIR 及其不同的变体。

参考文献

[1] Z. Liu,P. Magal,O. Seydi,G. Webb,了解中国武汉新冠肺炎疫情暴发中未报告的病例,以及重大公共卫生干预的重要性生物* 2020, 9 ,50。*

[2] R.M. Cotta,C.P. Naveira-Cotta,P. Magal,模拟巴西的新冠肺炎流行病:参数识别和公共卫生措施的影响,medRxiv 2020 . 03 . 31 . 30303030331

[3]世界计量仪,https://www.worldometers.info/coronavirus/

附录

在我的 Github 上可以找到本分析中使用的代码。

充分解释了统计显著性——为什么不应高估 p 值

原文:https://towardsdatascience.com/insignificance-of-statistical-significance-why-the-p-value-should-not-be-overrated-da5711b7960d?source=collection_archive---------39-----------------------

传统统计学中最著名也最令人困惑的概念指南:零假设显著性检验(NHST)。

马克斯·麦金农在 Unsplash 上的照片

你有没有听过有人说一项研究揭示了【重大成果】?这到底是什么意思?让我给你介绍一个科学界的实践,这是一个被深入争论并且仍然被用来回答研究问题的实践。简单地说,大致是这样的:如果你运行一个模型,而你的计算机给出的 p 值小于 0.05,那么你的结果已经达到了具有统计学意义的圣杯,因此更有可能被发表。另一方面,如果 p 大于 0.05,你的观察结果似乎不会偏离已知的结果。然而,这可能是一种从数据中得出结论的危险方式,并且会引起几乎机械地使用这一工具的诱惑。这种做法受到了热烈的讨论,美国统计协会(ASA)发表了一份关于 p 值的声明,以阐明这一问题(瓦瑟斯坦&耶戈,2016)。一些专家甚至认为 p 值是大多数研究结果错误的原因(Ioannidis,2018),并认为其滥用导致了研究中的可重复性危机(彭,2015)。围绕这一概念有一个完整的误解指南,因为 p 值远非直观、简单明了(Greenland 等人,2016 年)-对于业余爱好者和研究人员来说都是如此。因此,掌握基本概念是值得的。因此,我想给你一个温和而基本的介绍,介绍统计学中最著名但也最令人困惑的概念:零假设显著性检验。

为什么这很重要?

如今,我们身边有大量随时可用的数据。《福布斯》杂志在 2018 年的一篇文章中提出,仅互联网就创造了 2.5 万亿(!!!)仅链接一项,过去两年领先的每日字节数就占了世界数据的 90%。这句话绝对值得再读一遍。你可能也已经意识到,数据科学家的数量正在增长,尽管他们分析这些数据的努力无法弥补这些巨大的数量。此外,科学界有一个悠久的传统,即使用一种叫做零假设显著性检验(NHST)的方法来回答他们的研究问题。因此,鉴于我们有机会分析数据来满足我们的好奇心并为我们的决策提供信息,我们应该知道使用关键的统计概念来得出不太不可靠的结论。看下面的问题:

  • 特朗普总统任期如何改变了国际关系?
  • 间歇性禁食有长期的健康益处吗?
  • 这种新药 X 如何改善疾病 Y 的症状?
  • 社交媒体是增强了还是降低了青少年对连通性的感知?
  • 人工智能如何帮助残障人士?
  • 学生在同性教室里学得更好吗?
  • 随着年龄的增长,我们能控制记忆力的衰退吗?

这些只是我们问自己的问题的一小部分,因为一个答案可能会影响我们塑造生活、教育孩子或开发新技术的方式——正如我所说的,这只是其中的几个例子。所有这些都只能用数据做出超出你自己的鼻子的推论来可靠地回答。作为一名心理学毕业生,我了解到,大多数人讨厌一切与统计数字接近的东西,一提到数学公式,就会让人产生相当大的焦虑感。为了让你放心,我不想在这里包括任何数学。我保证,最终一切都是值得的。

因此,我试图解释统计推断是什么,以及为什么它不那么简单——为此,我想邀请你来一次太空之旅。你想加入吗?

照片由 SpaceXUnsplash 上拍摄

一个假想的案例研究——研究太空中的外星生命

想象一下,你是一个研究小组的成员,在植物 X 上发现了非人类的智慧,似乎对人类没有危险。你渴望更多地了解这一物种,于是指示你的同事收集关于它们的一些主要特征的数据。除了细胞样本和行为观察,你还会派一群太空机器人去收集他们的身高数据,因为他们的身高和人类差不多。它们光滑的皮肤纹理让你在实验室里给它们取名为glibglobs——就像你最喜欢的卡通系列里的一些生物叫瑞克和莫蒂一样。现在你的同事已经注意到 glibglobs 有不同的性别——其中一个比另一个高一点。由于地球上女性的身高通常比男性低,你开始想知道:这种性别差异可能是我们宇宙中的一种普遍模式吗?好吧——这是一个大问题,所以让我们把它变得更具体些:油腔滑调的人比他们的小吗?或者这只是你的一个同事的随机观察?

当你收集了每种性别的 100 个身高样本后,你开始直观地研究这一现象,并问自己,油嘴滑舌和珠珠之间是否真的有根本的区别。看着这些图,你可以看到 globs 平均比 glibs 高,但是也有很多变化。在某些情况下,glibglob 甚至比 glob 还高,所以如果你有资源来测量整个 x 星球上的每一个 glibglob,性别之间甚至可能没有差异。你如何判断你的数据假设甚至根本没有身高差异的可能性有多大?

glibglob 身高数据的密度图(用 R 模拟),每种性别都有颜色(红色= glibs,蓝色= globs)

在你检查了数据是否适合你想要用来回答这个问题的测试之后,你运行一个计算机程序来比较两性的平均值。有两种可能的情况:

1.真正的身高差异在人群中等于 0。

2.真正的身高差异在人群中不等于 0。

你可以把第一个假设(称为“零假设”)想象成一种在显著性检验中的默认假设——这可能是乍一看最令人困惑的事情,因为你实际上对第二个假设感兴趣。现在想象你的计算机程序的一部分是一个重要的陪练,这表明没有区别。尽管这很合理,但它表明机会是独自运作的。尽管如此,你仍然假设可能有一些不同的事情正在发生,用一些真实的 glibglob 数据来支持,并提出你对此观点的替代方案。来辩论吧!为了更接近答案,计算机为你进行了一些计算。它现在“假装”一遍又一遍地运行同一个实验,从而产生了许许多多虚构的油嘴滑舌的数据的模拟样本。这些假样本代表了如果 glibs 和 globs 实际上具有相同的高度,允许一些随机变化,那么高度差异会是什么样子。现在,计算机为 a)您的观察样本数据以及 b)每个模拟样本(假数据)生成一个汇总统计数据(例如,t-统计数据)。

经验表明,只要我们有很多观测值,自然界中的很多现象都近似成一个钟形分布,叫做正态分布。这也适用于理论上可能的 glibglob 身高差异的假数据:如果你从假数据中随机抽取一个样本,你将更有可能观察到零附近的身高差异,允许一点随机变化。另一方面,它不太可能观察到偶然发生的极端差异。仍然不确定是否存在身高差异的假设,您的计算机最终会将观察到的汇总统计数据与之前生成的假样本汇总统计数据进行比较,并告诉您您的数据在完全随机的假样本分布中的位置。给你一个 p 值< 0.01,计算机必须承认你的样本使他的默认状态(“glibglob 身高没有差别!)看起来有点不寻常。为什么?因为在假设机会独自运行时,似乎不可能观察到这种甚至更极端的数据。

p 值估计观察到这种或更极端数据的概率,假设实际上在自然界中没有任何影响——假设您的模型符合数据,并且您坚持自己的初衷。

那么,这个 p 值能告诉我什么呢?什么不是?

恭喜你走到这一步。看看那个冗长的定义。p 值现在能回答你原来的问题吗?

  1. 鉴于你观察到的这些数据,你能否告诉你的同事,glibglobs 之间很可能存在真正的身高差异?

没有。很困惑,对吧?虽然这实际上是我们感兴趣的问题,但这个问题只能使用贝叶斯统计来回答,贝叶斯统计包含了一种完全不同的思维方式和数学方法(Dienes & Mclatchie,2018;Kruschke & Liddell,2018a,2018bVandekerckhove、Rouder 和 Kruschke,2018 年)。如果使用传统显著性检验的人声称他们的假设是真的,因为零假设被拒绝,这应该给你一些危险信号。就其本身而言,一个小的 p 值确实表明,就目前而言,这些数据似乎与实际上没有任何影响的情景不相容。但是它不能告诉你你提出的替代方案(如)是否存在性别相关的 glibglob 身高差异大于零。")很可能是真的,因为它没有结合任何先前的知识(例如,首先这种替代的可能性有多大?)—这可能是由我们最新的 glibglob 数据更新的备选方案的后验概率,但这超出了当前文章的范围。

2.你能告诉你的同事,考虑到 glibglobs 中没有真正的身高差异的说法,这些数据似乎有点有趣吗?

是的,你可以。如果您已经检查了模型所需的前提条件,并且在实验过程中严格保持您的采样意图不变(例如,不管实验结果如何,在收集到预定义的样本量后停止测量),这种高度现象可能值得进一步研究。鉴于之前没有人测量过这些生物,因此你的实验具有探索性,这一结果为正在进行的该主题的研究提供了初步的起点。

3.你能告诉你的同事这些结果有实际意义吗?

没有。你不知道 glibglobs 之间的身高差异是否对他们在 X 行星上的生活有任何作用,甚至不能仅仅根据 p 值来判断这种差异是否和在人类中观察到的一样大。同样,你也不知道你是否问对了问题。也许 glibglobs 有一些你目前还没有考虑到的更有趣的特性?

现在你可能会感到有点失望。你已经走了这么长的路来到行星 X,测量了一群 glibglobs,但对它们仍然知之甚少——这似乎只是各种研究团队近距离观察这种外来物种的更漫长旅程的开始。知道你是研究 glibglobs 的第一个研究团队的一部分,你仍然在黑暗中敲击,即使你有一个指向特定方向的微小信号。

好吧——这个故事可能看起来有点牵强,过于简单。尽管如此,它还是以简明易懂的方式阐明了对待统计重要性的传统方法。如果你还在挣扎,不要担心:即使是科学家或健康专家通常也很难解释 p 值(Gigerenzer,2004;吉杰伦泽、盖斯迈尔、库尔茨-米尔克、施瓦茨和沃洛欣,2007 年;Gigerenzer 和 Marewski,2015 年)。所以,如果你还停留在你的头脑中,这并不奇怪。

乔尔·菲利普在 Unsplash 上的照片

那又怎样?

基本上,我们可以告别快速、轻松、精确地回答自然问题的想法。因此,要做到以下几点可能需要很大的毅力和忍耐力:a)接受这个事实;b)能够忍受自己的好奇心;c)忘记拥有一个适用于所有问题的神奇通用统计工具的梦想。为了对复杂现象做出有意义的结论,每次我们解决一个新问题时,我们需要有目的地从整个统计工具箱中挑选。分析师需要接受大量的培训,不仅要能够进行分析,还要在第一时间提出正确的问题,选择合适的方法进行测试,并最终解释研究结果。当涉及到人类行为时,应该变得更加明显的是,要对其进行可靠的测量,并对多种个体的总和做出一般性的推断,需要花费大量的时间。这就是为什么专家建议总是明确传达伴随研究发现的不确定性,提供关于导致结果的每一个步骤的详细文件,并与研究界共享数据。这使得科学推理更具可追溯性,证明了一种效应是否适用于不同的实验室,并为未来的研究人员共同回答关键问题铺平了道路。通过整合与感兴趣的现象有关的证据,我们能够描绘出一幅更大的图景,可能更精确地代表其本质(Hunter & Schmidt,2004;温伯格,2001)。

p 值被批评为将研究结果分为重要和不重要,因此可悲且错误地被认为不值得在许多研究期刊上发表。因为对于被认为具有统计显著性的结果,p 值有明确的临界值(通常为 p < .05 or p < .01), it supports a black-or-white style of thinking. Moreover, significance testing is only the end result of a long chain of other decisions the researcher makes beforehand (e.g. the research design, sampling method, model selection etc.) which determine the quality of the research but this simply cannot get expressed into a single value. However, the p-value taken by itself is a useful tool to indicate non-random patterns in the data and — if used thoughtfully — allows statistical inference to become fast and scalable.

I would never claim that science is nonsense because of this practice — the p-value just needs to be used and interpreted as one of many tools and not put as a mindless decision-making cut-off. This is exactly what the inventor of p-value, Sir Ronald Fisher, aimed for — it should be taken as a hint that indicates whether your observations are worth a closer look. Nevertheless, the p-value is not a fool-proof concept, seems to be quite a bit counterintuitive and therefore does require in-depth training of the analyst to interpret the results with the right amount of scepticism. Fisher (1956) even writes: ),没有一个科学工作者每年都有固定的显著性水平,在任何情况下,他都拒绝假设;他更愿意根据他的证据和想法来考虑每一个具体的案例。'【T1]因此,这不是 p 值故障,因为它只是做了它应该做的事情。我们只是不应该对它期望过高,也不应该屈服于关闭我们思维的诱惑。

参考文献

[1] R. L. Wasserstein & N. A .耶戈,美国儿科学会关于 p 值的声明:背景、过程和目的 (2016),美国统计学家70 (2),129–133。

[2] J. P. A .约安尼迪斯(J. P. A. Ioannidis),为什么大多数发表的研究结果是假的 (2018),变好:生物医学科学中的研究诚信2 (8),2–8。

[3] R .彭,科学中的再现性危机:一次统计学反击 (2015),显著性12 (3),30–32。

[4] S. Greenland,S. J. Senn,K. J. Rothman,J. B. Carlin,C. Poole,S. N. Goodman & D. G. Altman,统计检验,P 值,置信区间和功效:误解指南 (2016),《欧洲流行病学杂志》31 (4),337–350。

[5] Z. Dienes & N. Mclatchie,比显著性检验更喜欢贝叶斯分析的四个理由 (2018),心理经济学通报和评论25 (1),207–218。

[6] J. K. Kruschke & T. M. Liddell,新人贝叶斯数据分析 (2018a),心理计量学通报与评论25 (1),155–177。

[7] J. K. Kruschke & T. M. Liddell,贝叶斯新统计:从贝叶斯角度进行假设检验、估计、元分析和功效分析 (2018b),心理经济学通报和评论25 (1),178–206。

[8] J. Vandekerckhove,J. N. Rouder & J. K. Kruschke,社论:推进心理科学的贝叶斯方法 (2018),心理计量学通报与评论25 (1),1–4。

[9] G .吉杰伦泽,无脑统计学 (2004),社会经济学杂志33 (5),587–606。

[10] G .吉杰伦泽、w .盖斯迈尔、e .库尔茨-米尔克、L. M .施瓦茨和 s .沃洛申,帮助医生和病人理解健康统计 (2007),公众利益中的心理科学,补编8 (2),53–96。

[11] G. Gigerenzer,代理科学:科学推理的普遍方法的偶像 (2015),管理杂志41 (2),421–440。

[12] J. E. Hunter & F. L. Schmidt,荟萃分析方法:纠正研究结果中的错误和偏差 (2004),Sage。

[13] C. R. Weinberg,是时候恢复 P 值了 (2001),流行病学,12(3),288–290。

[14] R. A .费希尔,《统计方法与科学推断》 (1956),爱丁堡:奥利弗和博伊德。

鼓励女性参与数据科学或技术领域。

原文:https://towardsdatascience.com/inspire-women-participation-in-data-science-or-technical-positions-769830fe27be?source=collection_archive---------49-----------------------

数据驱动的职位是另一个技术领域,所以我不认为我们需要为它强制实施更高的女性“配额”或“斗争”。或许,“获得一技之长,技能提升,在赛场上贡献出技术,而感到荣幸”。

技术领域的世界为男人和女人提供了各种各样的可能性。数据科学和分析领域在过去十年中经历了巨大的发展。研究表明,尽管数据科学在今天和不久的将来都是一个令人兴奋的职业方向,但女性在该领域的代表性仍然严重不足。数据驱动领域的男女差距仍然惊人。各种因素,如组织文化、信任程度、缺乏兴趣和隐含的偏见都促成了这一点。在过去二十年中,技术和数据科学领域的性别差距急剧扩大,引起了全球对信息和技术行业开放程度的关注。然而,《O ' Reilly ' s Women in Data》(https://www . oreilly . com/library/view/Women-in-Data/9781492048237/)这本书采访了当今计算和技术科学领域最具影响力的女性,该书表示,随着意识的提高,越来越多的女性被带入该领域。

数据驱动的工作领域继续呈指数级增长,各种规模的公司都需要能够解释和处理数据、了解相关技术能力并有创新和研究能力的人。2017 年(https://www . kdnugges . com/2017/01/glass door-data-scientist-best-job-America . html),数据科学家成为美国顶尖的工作,然而,招聘有价值的申请人对组织来说仍然很困难。数据科学的职位包括计算机专业知识、算法、统计以及更多需要花费大量时间才能获得的技能。数据科学家中,70%是男性。尽管如此,随着该行业合格申请人的短缺,这对女性来说是一个探索、提高技能和变得有竞争力的绝佳机会。正如在“编码的女孩们将如何改变世界”(https://www . Inc . com/James-Kerr/How-the-Girls-Who-Code-movement-can-Change-the-World . html)活动中提到的那样,美国劳工部估计,到 2020 年将有 140 万个计算机专家职位可供选择。

现有的研究将有助于解释媒体报道的假设和文化态度是如何影响女性对自己的数学能力失去信心,以及她们追求的低愿望阻碍就业的。数据研究还描述了女性是如何被教育环境排除在数学、科学和技术相关领域之外的。我并不否认这样一个事实,即事情正在发生变化,女性对技术领域的看法正在蓬勃发展。

除此之外,多样化的劳动力在社会所有部门都变得极其重要,这一点尤其重要,因为在许多行业,特别是在技术和研究领域仍然存在差距。性别包容来自不同的背景,你获得了创造不同世界观的技能、才能和经验。人口普查显示,47.4%的美国劳动力是女性,但只有 27%的工作由女性担任(https://www.builtbyme.com/statistics-facts-women-in-stem/)。

数据科学和分析行业已经出现能力不足,估计申请人短缺。但很明显,需要填补的职位比工人多得多,这导致市场和单个公司陷入困境,未来可能会进一步失败。从真正务实的角度来看,通过在各个大学班级招募更多的人,更有意识地努力实现更大的性别平等,将会有更好的劳动力数据可以雇佣。在更多的工作竞争中,申请人的效率必然会提高,从而为大多数数据驱动型公司带来新的发展和创造力。在一个仍在争夺合适候选人的就业领域,让 50%的劳动力退出几乎没有意义,因为美国劳工统计局估计,未来八年,拥有数据处理能力的专家市场将增长 24%(https://www.bls.gov/news.release/pdf/ecopro.pdf)。

数据科学及其相关领域仍处于形成阶段,仅在过去 10 年才在组织中成功实施。这表明,现有的男性/女性差异不应该隐含在职业中,就像在零售、政治和技术行业中一样。首先,在脸书的所有员工中,只有 36%是女性(https://www . statista . com/statistics/311827/Facebook-employee-gender-global/),而加拿大最大的资产银行加拿大皇家银行的女性董事比例高达 42.9%。其次是加拿大丰业银行,该行 13 名高管中有 5 名女性,比例为 38.5%(https://thepayers . com/payments-general/canadas-top-banks-lead-the world-in-executive-gender-diversity-global data-study-finds-1240754)。通过确保数据驱动的部门和组织在就业增长的早期阶段可以获得公平的资源,该部门应该能够围绕健康和多样化的劳动力而不是给许多更传统的企业带来重大问题的传统男性主导文化繁荣和扩张。

Craigslist 的创始人 Craig Newmark(https://www . vox . com/2016/6/2/11834380/Craig-Newmark-Women-Tech-funding-gender-gap-diversity)在他的帖子《让我们认真对待支持科技领域的女性》中报道说,女性领导的科技公司比男性领导的公司平均高出 35%的资本回报率。他还引用了一项研究,该研究显示,拥有女性创始人的科技公司比那些创始团队全部由男性组成的公司表现好 63%。

在建设性、包容性的氛围中,我们应该通过促进从事数据科学、机器学习、人工智能、行业技术使用案例讨论论坛的性别少数群体个人的谈话,以及组织技术会议和网络活动,为参与者提供参与科学和教育讨论的论坛。我们尊重所有加入我们事业的人,无论其社会取向或职业背景如何。任务是纠正数据科学和技术的性别差距。创新改变了我们的生活方式,女性在设计软件、塑造科学目标以及创建数据技术和基于人工智能的应用程序方面必须是公平的合作者。我们应该鼓励刊登广告的文章,宣传真正的活动、大数据文化中女性的工作机会,以及免费或打折获取各种学习资源以提高技能。

但是,解决技术领域的性别差距不应该仅仅是满足行业内一定的男女比例。虽然招聘仍然是一个令人关切的问题,但重点应放在支持已经在该领域工作的妇女,庆祝她们的成就,以及提醒对该领域感兴趣或加入该领域的女孩和妇女,技能不分性别。在技术和数据科学领域,女性仍然处于劣势,获得更多的参与并不是一件容易的事情。提高对当前形势认识的运动应突出现有的发展前景,并揭示性别多样性的优势。女性一如既往地为科技行业增添了很多东西。但是,获得鼓励和对他们所带来的东西的欣赏将会以缓慢而稳定的速度缩小性别差距。

女性劳动力证明了她们富有创造力、适应性强、工作精明,并有能力承担责任。他们有能力在数据科学或技术领域出类拔萃。到 2020 年,超过 100 万个数据科学职位空缺(https://www . Inc . com/James-Kerr/how-the-girls-who-code-movement-can-change-the-world . html),公司转变员工队伍、接纳女性的机会可能终于到来了。在努力消除性别差异和填补空缺职位的同时,让女性展示她们的才华。多元化创造了一个理想的环境,员工可以在其中相互学习和了解。

让我们为彼此加油,看着彼此成长!

训练文本中的不稳定性——甘

原文:https://towardsdatascience.com/instability-in-training-text-gan-20273d6a859a?source=collection_archive---------47-----------------------

大量的暗箱操作

照片由詹姆斯·庞德Unsplash 拍摄

介绍

在文本生成中,传统上,最大似然估计用于训练模型以一次一个标记地生成文本。每个生成的令牌都将与真实数据进行比较。如果任何令牌与实际令牌不同,该信息将用于更新模型。然而,这样的训练可能导致生成是通用的或重复的。

生成对抗网络(GAN)通过引入两个模型——生成器和鉴别器来解决这个问题。鉴别器的目标是确定一个句子 x 是真的还是假的(假的是指由模型生成的),而生成器试图生成一个可以欺骗鉴别器的句子。这两个模型相互竞争,这导致了两个网络的改进,直到生成器可以产生类似人类的句子。

尽管我们可能会在计算机视觉和文本生成社区中看到一些有希望的结果,但实际操作这种类型的建模是困难的。

GANS 的问题

  1. 模式崩溃(缺乏多样性)这是 GAN 训练的通病。当模型不关心输入的随机噪声时,就会发生模式崩溃,不管输入是什么,它都会不断地生成同一个句子。从这个意义上来说,模型现在试图欺骗鉴别器,找到一个单点就足够了。
  2. 不稳定训练。最重要的问题是保证发生器和鉴别器并驾齐驱。如果任何一个胜过对方,整个训练就会变得不稳定,学不到任何有用的信息。例如,当发电机的损耗缓慢降低时,这意味着发电机开始寻找方法来欺骗鉴别器,即使该代仍然不成熟。另一方面,当鉴别器为 OP 时,没有新的信息供生成器学习。每一代都会被评价为假的;因此,生成器将不得不依靠随机改变单词来搜索可能欺骗 d 的句子。
  3. 直觉不够。有时,您的预期建模是正确的,但它可能不会像您希望的那样工作。它可能需要更多的工作。通常,您需要通过调整学习率、尝试不同的损失函数、使用批量范数或尝试不同的激活函数来进行超参数调整。
  4. 大量的训练时间。一些工作报道了高达 400 个纪元的训练。如果我们与 Seq2Seq 相比,这是巨大的,seq 2 seq 可能只需要大约 50 个代来获得结构良好的一代。导致它缓慢的原因是一代人的探索。g 没有接收到哪个令牌是坏的任何明确信号。相反,它是为整个一代人而接受的。为了能够生成一个自然的句子,G 需要探索各种单词组合才能到达那里。你觉得 G 有多经常会不小心凭空产生< eos >?如果我们使用 MLE,信号非常清楚,应该有< eos >和紧随其后的< pad >。

潜在的解决方案

已经尝试了许多方法来处理这种类型的训练。

  1. 使用亚当优化器。有人建议使用 ADAM 作为发生器,SGD 作为鉴别器。但最重要的是,一些论文开始调整亚当的测试版。贝塔系数=(0.5,0.999)
  2. 瓦塞尔斯坦甘。一些使用 WGAN 的工作报告可以极大地稳定训练。然而,从我们的实验来看,WGAN 甚至达不到常规 GAN 的质量。也许我们遗漏了什么。(看到了吗?挺难的)
  3. GAN 变异。有人建议尝试吉隆坡或 VAE 甘。这些可以使模型更容易训练。
  4. 鉴频器的输入噪声。为了使鉴频器的学习与发生器的学习不相上下,发生器的学习通常比鉴频鉴相器更困难,我们在输入的同时输入一些噪声,并使用压差使事情变得更容易。
  5. DCGAN(深度卷积 GAN) 。这只适用于计算机视觉任务。然而,这种模型可以避免不稳定的训练。这个模型的关键是不使用 ReLU,使用 BatchNorm,使用步长卷积。
  6. 鉴频器组合。不是只有一个鉴别器,而是用不同的批次训练多个鉴别器,以捕捉不同方面的尊重。因此,生成器不能只欺骗单个 D,而是要更一般化,以便它可以欺骗所有的 D。这也和中途辍学的甘(很多 D,训练时辍学一些)有关。
  7. 参数调谐。学习率、辍学率、批量等等。很难确定一个模型比另一个模型好多少。因此,有些人会测试多个参数,看看哪个效果最好。一个瓶颈是没有针对 GAN 的评估指标,这导致需要大量手动检查来确定质量。
  8. 调度 G 和 D 。据报道,在许多工作中,试图学习 G 5 次然后学习 D 1 次是没有用的。如果你想尝试计划,做一些更有意义的事情。
while generator_loss > 0.5:
    train_G()while discriminator_loss > 0.5:
    train_D()

结论

基于对抗的文本生成为如何训练模型开辟了新的途径。不是依赖于 MLE,而是使用鉴别器来指示生成是否正确。然而,这种训练也有不好的一面,那就是很难训练。许多研究提出了一些如何避免上述问题的建议;但是,您需要尝试各种设置(或参数),以确保您的创成式模型能够正确学习。

进一步阅读

[## 如何识别和诊断 GAN 故障模式—机器学习掌握

如何在训练生成对抗网络时识别不稳定模型?甘很难训练。原因是…

machinelearningmastery.com](https://machinelearningmastery.com/practical-guide-to-gan-failure-modes/) [## 从 GAN 到 WGAN

这篇文章解释了生成性对抗网络(GAN)模型背后的数学原理,以及为什么它很难被训练…

lilianweng.github.io](https://lilianweng.github.io/lil-log/2017/08/20/from-GAN-to-WGAN.html) [## soumith/ganhacks

(该列表不再保留,我不确定它在 2020 年的相关性如何),而生殖研究…

github.com](https://github.com/soumith/ganhacks) [## 甘——为什么生成性对抗网络这么难训练!

认出莫奈的画比画一幅容易。生成模型(创建数据)被认为是非常…

medium.com](https://medium.com/@jonathan_hui/gan-why-it-is-so-hard-to-train-generative-advisory-networks-819a86b3750b)

Instacart 探索性分析

原文:https://towardsdatascience.com/instacart-exploratory-analysis-fdd5e3f9bf60?source=collection_archive---------16-----------------------

在没有领域专家或业务涉众的情况下,制定可能的业务问题陈述。

介绍

Instacart 是一项当天送货和提货服务,允许消费者通过该公司的移动应用程序或网站从选定的杂货店购物,如 Trader Joe's、Costco 和 Fairway。该公司有专门的员工从选定的商店购买食品并送货上门。该公司产生收入的方式是通过增加特定商店的价格、送货和会员费。因此,该组织的主要业务目标是,不仅增加客户会员的数量,而且改善回头客和订单。预测消费者对产品和杂货店的参与度和行为对 Instacart 的成功有着巨大的影响。

此分析的主要目的是执行探索性分析,并阐明增量业务问题以增加收入。为此,我们将依赖 Instacart 提供的历史数据。关于这个公开发布的数据集的更多信息可以在这里找到:https://www.instacart.com/datasets/grocery-shopping-2017

关于数据

该数据集由 Instacart 为 Kaggle 竞赛提供,是一组描述客户订单的关系文件。该数据集是匿名的,包含来自 20 多万 Instacart 用户的 300 多万份杂货订单样本。对于每个用户,数据集提供他们的 4 到 100 个订单,以及每个订单中购买的产品序列。该数据集还提供了下订单的星期和小时以及订单之间的相对时间度量。

每个变量的描述如下:

订单数据集: order_id:订单标识符,user_id:客户标识符,eval_set:此订单属于哪个评估集(参见下面描述的训练和先前数据集),order_number:此用户的订单序列号(1 =第一个,n =第 n 个),order_dow:订单是在一周中的哪一天下的,order_hour_of_day:订单是在一天中的哪一个小时下的,days_since_prior:自上一次订单以来的天数,上限为 30(order _ number 的 NAs = 1

产品数据集: 产品标识:产品标识,产品名称:产品名称,过道标识:外键,部门标识:外键

过道数据集: 过道 id:过道标识符,过道:过道名称

部门数据集: 部门标识:部门标识,部门:部门名称

order_products_prior 和 train 数据集: order_id:外键,product_id:外键,add_to_cart_order:每个产品被添加到购物车的顺序,重新排序:1,如果该产品在过去已经被该用户订购,0,否则,“prior”:在该用户最近的订单之前的订单,“train”:提供给竞赛参与者的训练数据,“test”:为机器学习竞赛保留的测试数据

数据收集和清理

理想情况下,在数据收集阶段之前,我们希望根据问题陈述定义数据需求,以便收集所需的数据。然而,在这种情况下,我们执行不同的方法,我们真的不知道 instacart 业务有什么问题,我们希望用可用数据来描述问题。这与数据科学项目流程观点完全不同,在数据科学项目流程观点中,我们通常希望首先与领域专家和利益相关者一起概述业务理解,并进一步定义收集方法、数据收集、清理和探索性分析。让我们从导入我们的包开始,加载每个数据集并简要地看一下它们。

instacart 订单数据集汇总

instacart 订单缺少值

查看来自客户的所有订单,我们总共有超过 300 万个订单,数字和字符串数据类型都符合预期,不需要我们更新。自从上一个订单以来,我们有超过 200,000 个丢失的值。然而,正如在变量描述中所解释的,NA 表示特定客户的 order_number 1。

instacart 产品概述

instacart 产品数据集摘要

instacart 产品缺少值

我们大约有 50,000 种产品带有产品 id、名称、通道 id 和部门 id。所有数据类型都符合预期,我们没有任何缺失值。

instacart 通道信息

instacart 通道数据汇总和缺失值

有 134 个通道具有通道 id 和通道名称。数据类型和预期的一样,我们没有任何缺失值。正如您可能注意到的,过道 id 变量是产品数据框架的常用变量。我们可以合并这两个数据框架,看看哪些产品属于哪个通道。

instacart 产品数据集

instacart 部门数据集

instacard 部门汇总

总共有 21 个部门有部门名称和 id。数据类型和预期的一样,我们没有任何缺失值。对于产品数据框架,我们有另一个公共变量“department_id”。我们可以合并部门数据框架,以查看什么产品属于哪个部门。

正如变量描述中所解释的,order products prior 数据集让我们了解在用户最近订单之前订购的订单。我们有超过 300 万的订单。数据类型正确,没有缺失值。我们还有 product_id 公共变量,我们可以将这个数据集与产品合并,以查看什么产品映射到什么订单。

我们在产品和订单数据集之间还有另一个公共变量 order_id。我们可以合并这两个数据框架,以帮助进一步收集产品和订单之间的信息。

instacart 最终产品和订单数据集

我们已经获得了超过 130 万个训练数据,数据类型正确,没有缺失值。在这一点上,instacart 提供的数据集似乎非常干净,除了合并过道、部门、产品和订单数据集,我们不需要做太多的数据争论。

数据探索

在这个阶段,我们将单独查看数据集的更新版本,并收集见解以开始创建可能的业务问题。

instacart 客户订单数量

我们在这里看到的是,23986 名客户只下了 4 份订单,19590 名客户只下了 5 份订单,依此类推……随着客户下订单数量的增加,下订单的客户数量会减少。大多数客户会下 4 到 12 份订单。如果一家企业找到了增加回头客订单数量的方法,它就能增加收入。

instacart 客户本周采购

大多数购买发生在周一和周二,其次是周日。消费者可能会在一周的第一天和第二天进行每周一次的杂货店购物。一周的其他日子之间也没有太大的差距。例如,周三和周二之间的差异并不显著。

instacart 客户购买时间

大多数购买发生在上午 10 点到下午 4 点之间。

instacart 客户购买频率

大多数顾客每周或每月都购物。考虑到大多数客户也在每周的周一或周二下订单,下订单可能需要计划工作。这可能是由于非无缝订购流程造成的。

Instacart 篮子大小分析

我们可以看到,根据购物篮的大小分布,大多数客户在每个订单中购买了 5 到 6 件产品。考虑到回头客的订单量较低,每个客户的产品量较低可能会给企业带来巨大的收入问题。

Instacart 热门产品分析

Instacart 顶级产品

前十个重新排序的项目与通常排序的前十个项目完全匹配。此外,十大购买商品中的大部分都在新鲜水果区。

Instacart 顶级部门

顶部通道是新鲜水果、新鲜蔬菜、包装蔬菜和水果,其次是酸奶和包装奶酪。

Instacart 客户购买日

正如我们前面指出的,订单百分比最高和篮子容量最大的时间是星期一和星期二。

Instacart 产品百分比日分布

正如我们之前发现的,订购量最高的产品是香蕉、有机香蕉袋、有机菠菜和有机草莓。有趣的是,在前四种产品中,香蕉在每天的订单中所占比例最大,但其他四种产品对周三、周四、周五、周六和周日的订单比例没有任何贡献。这是否与物料库存问题相关?

Instacart 部门分布

最高的部门是农产品,其次是奶制品、鸡蛋和小吃。除了一般的个人偏好和需求,消费者不从其他部门购买可能还有其他原因。例如,如果 instacart 对罐装商品具有最大的加价,但 instacart 网站或应用程序内的用户体验并不能吸引消费者购买罐装商品,则无论消费者的需求如何,罐装商品的订单金额都会很低。

数据集相当大,有许多变量可供我们分析。与我们在之前的学习关联文章中所做的类似,我们可以进一步查看产品之间的详细关联规则(尽管将现有的大型数据集拆分并转换为交易数据集具有挑战性),从天数和小时数、再订购率与订单小时数等方面调查消费者的再订购模式…

结论

查看各种数据科学流程和方法,您会发现几乎所有的流程和方法都有类似的方法,即从业务理解开始,概述要验证和解决的业务问题陈述。然而,我们可能会遇到这样的情况,领域专家、品牌所有者、业务单位或利益相关者可能不一定知道或没有时间找出业务问题是什么。在大多数情况下,他们会通过产品经理来识别、阐述业务问题,并提供切实可行的建议来解决这些问题。

在我们的 instacart 分析中,我们可以总结出可能影响收入的业务问题有:

  • 客户订单的频率较低,从 4 到 12 不等。企业可以采取什么措施来提高客户订单的频率?
  • 大多数客户计划每周和每月购买一次。企业可以采取什么措施来改善一周和一月中任何一天的采购?举个例子;亚马逊把他们的整个订购产品和过程做得天衣无缝,以至于我个人不会广泛地计划我的杂货购买。如果我需要亚马逊的产品,我会在当天订购。
  • 除了香蕉,顶级商品大多在周一和周二出售。这是否与零售商的商品库存问题有关?比如说;有没有可能 Trader Joe's 的有机草莓在周三就卖完了,instacart 的员工会根据顾客的要求用普通草莓代替订单?
  • 除了一般的消费者和市场需求,某些部门的销售额比其他部门低还有什么原因吗?(如 instacart 网站或手机 app 可用性问题)

阐明和定义业务问题陈述对于为业务目标找到正确的解决方案极其重要。在我之前关于线性回归的文章中,我提到了一些统计学家在没有创建问题陈述的情况下就开始数据分析是多么有问题,然而,在许多情况下,利益相关者期望数据驱动和制定这些问题陈述。

Instacart 用户细分和购物篮分析

原文:https://towardsdatascience.com/instacart-users-segmentation-and-market-basket-analysis-d88378f75f73?source=collection_archive---------49-----------------------

了解客户在 Instacart 上的购物行为,并做出有效的推荐

编剧:颖园(瓦莱丽)张雨桐(璇)朱、【德克兰】向、辛雨

新冠肺炎在 2020 年已经是一个世界传播的疫情。因此,纽约人遵循隔离政策,彼此保持社交距离。众所周知,在纽约最受欢迎的交通方式是地铁。然而,地铁是传播新冠肺炎最危险的交通工具之一,这可能会增加地铁乘客感染新冠肺炎的风险。因此,外出获取日常所需成了纽约人头疼的问题。杂货店里的人保持社交距离是不实际的。在新冠肺炎疫情爆发期间,纽约市发布了“呆在家里”的命令,这增加了对网上购物的需求。Instacart 是一个杂货交付平台,在新冠肺炎危机期间经历了快速增长。现在,用户获得了呆在家里的价值,以使曲线变平,并降低他们自己感染病毒的风险。

主要研究目标是基于时间间隔进行用户细分,并基于用户的产品选择建立推荐系统。本研究期望在不违反社会距离规则的前提下,优化供应方的库存分配,增加顾客获得必需品的概率。

首先,我们来探究一下数据!

主要数据来源于 Instacart 的 2017 年匿名化客户随时间的订单(Stanley,2017)。它包含订单文件、产品文件、订单和产品文件、过道文件和部门文件。数据集中的每个实体都有一个关联的唯一 id。

在订单数据集中,它包含用户 id、订单 id、订单购买日期(order_dow)、订单购买时间(order_hour_of_the_day)、自上次购买以来的天数(day_since_prior)以及订单所属的指示符(eval_set)。如果是第一次购买,则自上次购买后的天数为 NaN。在部门数据集中,它包含唯一的部门 id 和关联的部门名称。在过道数据集中,它有过道 id 和过道名称。在产品数据集中,它包含产品 id、产品名称、过道 id 和部门 id。

为了制定用户订单的时间间隔,我们首先以天为单位划分用户订单。我们这里使用的数据是 order.csv,列名为“dow”。从图 1 来看,用户订单最多的日子是第 0 天和第 1 天。查看数据说明后,我们没有找到第 0 天到第 6 天的定义。我们认为 0 和 1 这两个繁忙的日子应该是周日和周一。

图 1(作者图片)

有了更详细的视图,我们选择小时作为单位来绘制订单频率条形图。两条尾巴表明 Instacart 在早上和傍晚时间没有太多的交付。大多数订单是在时间间隔小时[9,16]下的,平均每小时约有 25000 个订单。

图 2(作者图片)

结合上面的两个数字,我们决定使用热图来检查最受欢迎的订单时间。y 轴是按天计数的订单,x 轴是按小时计数的订单。从图 3 来看,较暗的部分意味着用户订单密度较高的时间段,大约是第 0 天和第 1 天的上午 9 点到下午 4 点。

图 3(作者图片)

图 4 显示了下降趋势。大部分用户在频率区间[0,40]下单。少数用户订单在 60 以上。超过 100 的唯一订单被计为一组。x 轴限制了将所有计数订单放在一个图表上。

图 4(作者图片)

一个有趣的发现是,从图 5 中,我们发现超过 400,000 个用户可能会将香蕉添加到他们的订单中。名单上大部分产品都是有机蔬菜和水果!

图 5(作者图片)

机器学习建模:

K-表示:

基于 EDA 的结果,很可能得出这样的结论:消费者更有可能在上午 10 点到下午 4 点之间购买。此外,如图所示,在第 0 天和第 1 天,Instacart 的交易量与其他日期相比相对较高。为了进一步了解消费者的购买行为并进行具体的消费者细分,我们使用了 k-means 聚类。不仅基于在星期几、星期几购买的订单,还基于自上次购买以来的天数和添加到购物车订单,来计算每个用户使用 Instacart 的频率和每个订单购买的商品的中位数。

首先,利用轮廓得分选择 k-means 中的最佳聚类数。

由于处理量大,我们对 5%的数据集(超过 10,000 条用户记录)进行了五次采样,以生成训练数据集的准确轮廓分数。正如它所建议的,我们在 k-means 算法中设置了 3 个聚类。在应用 PCA 降低维度之后,我们能够绘制每个聚类(图 6)。

图 6(作者图片)

随机森林:

在进行 k-means 聚类和标记数据后,我们使用聚类 0,1,2 来训练我们的第一个 K-means 模型。我们希望将我们的模型从无监督学习转移到有监督学习。因此,我们将数据集分为训练样本和测试样本。通过使用 GridSearchCV,我们发现应该使用 21 作为我们的估计量,使用 97 作为我们的最大叶节点。在训练我们的模型并拟合测试集之后,我们计算了多类别 ROC AUC 得分,该得分为 0.999,这意味着我们的随机森林模型很好地分离了三个类别。

特征重要性(作者图片)

推荐系统

在我们的推荐系统模型中,输出是大多数其他客户会购买但输入客户不经常购买的部门和通道。由于输出不仅基于大多数训练数据,而且基于输入客户购买历史的皮尔逊相似性,我们的模型考虑了不同组的客户偏好。

出于节省时间和计算的原因,我们使用来自前 10,000 个用户的数据来训练我们的模型。通过从每个集群中随机抽取 5 个用户作为输入,结果证明了我们的假设。对于每个集群中的 5 个用户和 5 个推荐的部门和通道,我们在 25 个值中寻找共享最多的前 3 个常用名称。

推荐部门:

  • 第 0 类:酒精、散装、婴儿
  • 第 1 类:酒、干粮和散装面食
  • 第 2 组:酒类、散装、肉类和海鲜

推荐过道:

  • 第 0 类:面部护理、皮肤护理、头发护理
  • 集群 1:散装谷物大米干货,面部护理,皮肤护理
  • 第二组:护肤、烈酒、面部护理

从该表中,我们可以看出,集群 0 和集群 1 中的客户(占总用户的 64.6%)是 Instacart 的忠实用户,他们可能有很高的需求,并在新冠肺炎期间给 Instacart 的运营带来巨大压力。

用人工神经网络预测限量版运动鞋转售价格的 Instagram 分析

原文:https://towardsdatascience.com/instagram-analysis-to-predict-limited-edition-sneakers-resale-price-with-ann-5838cbecfab3?source=collection_archive---------68-----------------------

“我喜欢运动鞋。我想我可以称自己为收藏家”——麦克·信田

用神经网络从大量运动鞋中寻找独角兽运动鞋

来自https://unsplash.com/photos/5d4EhqeV0Og的免版税图片

做球鞋头本身就是一种文化,有自己的行业。每个月,最大的品牌都会推出一些精选的限量版运动鞋,根据名为“抽奖”的抽奖系统在市场上销售。这创造了一个自己的新市场,在这个市场中,能够从彩票系统中赢得运动鞋的人希望以更高的价格卖给那些更想要这双鞋的人。你可以找到许多网站,像 stockx.com 的、goat.com 的,来转售未接触过的限量版运动鞋。

但转售运动鞋的问题是,每一款限量版运动鞋都不成功,也不能获得高额利润。人们必须研究“炒作”,“流行度”,这种模型是一个热门话题,比其他模型讨论得更多,如果人们能够发现这一点,甚至可以获得高达 300%的利润。

我发现了一种方法,可以通过 Instagram 分析发现某些型号的“炒作”或受欢迎程度,并研究与运动鞋相关的标签,找出哪只运动鞋是独角兽。

准备数据

Instagram Api 不允许您研究其他个人资料上的喜欢和评论,所以我们不使用 Instagram Api,而是需要像这样使用哈希查询

url='https://www.instagram.com/graphql/query/?query_hash=c769cb6c71b24c8a86590b22402fda50&variables=%7B%22tag_name%22%3A%22**azareth**%22%2C%22first%22%3A2%2C%22after%22%3A%22QVFCVDVxVUdMLWlnTlBaQjNtcUktUkR4M2dSUS1lSzkzdGVkSkUyMFB1aXRadkE1RzFINHdzTmprY1Yxd0ZnemZQSFJ5Q1hXMm9KZGdLeXJuLWRScXlqMA%3D%3D%22%7D' 

如你所见,关键字 azareth,是我的标签。您可以简单地将关键字更改为您想要从中获取数据的任何标签。

让我们为 Air Jordan 1“无畏”球鞋选择一些标签# airjordanfearless,# fearless,# jordanbluefearless,#fearlessjordan,# aj1fearless,# ajonefearless,# airjordanonefearless

有了数据框架后,就该看看我们可以用 Instagram 散列查询做些什么了。我们可以找到与某个标签相关的总点赞数、总评论数、总发帖数,这些参数可以帮助我们预测运动鞋的“炒作”和“受欢迎程度”。

我们将需要 urlib 和请求库来打开 URL,并检索我们需要的某些值,如总喜欢,总评论,甚至图像本身。

为了创建训练数据,我制作了一些精选运动鞋的类似数据框——yee zy 700 Azareth、Nike X Sacai Blazar、Puma 拉尔夫·桑普森 OG、Nike SB Dunk X Civilist、Nike Space 嬉皮士系列。

我取了每双运动鞋的所有标签的总点赞、评论和帖子的平均值来创建训练数据。以下运动鞋的最高转售价格来自 goat.com。

数据训练和人工神经网络模型构建

数据训练

1-哈希查询为某些标签提供来自 Instagram 的最新照片,因此它减少了将任何旧型号运动鞋照片纳入数据的可能性,这验证了,因为某一运动鞋的“炒作”或“受欢迎程度”可能是根据最新照片估计的,因此我们可以知道哪些运动鞋现在正在谈论和热门,并具有更多转售价值。

2-对于照片上标签重叠的任何可能性,(这是很有可能的),我说的是总喜欢/评论和帖子的计数,以训练数据和预测转售价格。

3-为了验证模型,而不是分割数据来训练或测试,我们可以简单地将标签放入最近发布的运动鞋的 x_test 中,并将我们的预测与实际的持续转售价格进行比较。

人工神经网络

对于 X,我使用了变量“likes”、“comment”、“post”、“releaseprice”,对于 Y/Labels,我使用了“maxretailprices”,以便让模型通过从 X 变量获取数据来学习如何在神经元中放置不同的权重,并达到“maxretailprices”/Y 数据,并找到 Instagram 上的赞数和评论数与最大零售价格之间的模式。

原因是,Instagram 上与特定运动鞋相关的更多喜欢、评论和帖子将反映其炒作,在 Instagram 用户中的受欢迎程度,模型可以找到准确的权重来确定两者之间的关系

模式调谐

学习率 —我选择了 0.001 的低学习率,以便让模型找到权重并制作梯度,而不会超过最小值。

损失方法 -我选择 MSE 作为损失方法,因为我试图找到变量之间的关系,所以它是一种回归

激活方法 -Relu 是最佳选择,因为它会将所有负值变为 Instagram 显示-1 值为 0 ),如果大于 0,则放置精确值)

层和神经元 -我用神经元和层来寻找梯度不会爆炸的最佳组合,并最大限度地减少损失,并且能够在 50 个时期内找到更好的模式和权重。

结果

我没有创建足够大的训练数据来在训练和测试之间分割数据。因此,为了验证结果,我简单地创建了一些最近发布的 x_test 数据框架,就像我向您展示的那样,并将我的模型预测与 goat.com.Here 的转售价格进行了比较,例如耐克 dunk LOW sb Black 在 goat.com 的转售价格为 326 欧元

因此,通过简单的神经网络,该算法能够将运动鞋的受欢迎程度与运动鞋在市场上的估计转售价值联系起来,因此经销商和收藏家可以轻松预测哪些运动鞋是独角兽,哪些运动鞋与商店中的其他运动鞋一样。

对于完整的 jupyter 笔记本和代码,您可以通过github.comhttps://github . com/Alexa Mann/insta gram-analysis-to-predict-Sneaker-retail-prices-with-ANN查看我的知识库

在 Windows 10 中安装和配置 OpenCV-4 . 2 . 0—Python

原文:https://towardsdatascience.com/install-and-configure-opencv-4-2-0-in-windows-10-python-7a7386ae024?source=collection_archive---------20-----------------------

在 Windows 10 中安装 OpenCV-4.2.0 的完整指南

这篇文章将指导您在 Windows 10 (64 位)中安装和配置 OpenCV-4.2.0 的所有步骤,以便在 Anaconda 环境中使用 python。

  • OpenCV 和 Anaconda,用于 Python 3.6.0+开发

我将在这里重点介绍 OpenCV for python 3.6.0+,我之前关于 VC++集成的帖子可以在这里找到。

注意:为了跟随教程,我假设你已经安装了 AnacondaPython 3.6.0 。如果没有,请在继续阅读之前安装这些工具。

用于 Python 的 OpenCV-4.2.0

通过 Anaconda 安装 OpenCV 的步骤非常简单直接。不要忘记将 Anaconda 添加到您的路径中,这样您可以很容易地从提示符下访问conda 命令。

步骤 1:为 OpenCV 创建一个 conda 虚拟环境

  • conda create --name opencv-env python=3.6

opencv-env 是指虚拟环境的名字,你可以随意命名,但记得要挑一个有意义的名字。

  • 为项目创建一个文件夹,用于存放 python 脚本。
  • 通过命令行cd C:\Users\<username>\my_folder进入您的文件夹,使用以下命令激活您刚刚创建的虚拟环境:
  • conda activate opencv-env

注意:如果您在 windows 中使用 bash 作为默认终端,*conda activate opencv-env*可能不会像预期的那样工作。这是因为默认情况下,bash 没有正确配置为运行 anaconda 脚本,所以您可以为它提供一个解决方法:

  1. 编辑您的。bashrc 文件c:\Users\<username>\.bash_profile添加下面一行代码:

Visual Studio 代码编辑

2.每当您想要午餐您的 bash 终端时,添加下面的参数:--login -i,因此您将午餐您的定制 bash 概要文件,它已经被授权访问 conda 脚本。

现在,您的 conda 环境已经激活,并且完全可用。

步骤 2:安装 OpenCV 和所需的包

要使用 OpenCV,你必须安装一些重要的软件包:

pip install numpy scipy matplotlib scikit-learn

pip install opencv-contrib-python

pip install dlib

步骤 3:测试您的安装

您应该可以在 python repo 中获得最新的 OpenCV 版本。

就这些了,好好享受 OpenCV 吧。

更多安装信息,请访问 OpenCV 官方指南

在 Windows 10 中安装和配置 OpenCV-4 . 2 . 0—v c++

原文:https://towardsdatascience.com/install-and-configure-opencv-4-2-0-in-windows-10-vc-d132c52063a1?source=collection_archive---------1-----------------------

在 Windows 10 中安装 OpenCV-4.2.0 的完整指南

这篇文章将指导你在两种不同的环境下在 Windows 10 (64 位)中安装和配置 OpenCV-4.2.0 的所有步骤:

  • OpenCV 与 Visual Studio 2019,用于 C++开发
  • OpenCV 和 Anaconda,用于 Python 3.6.0+开发

我将在这里重点介绍 OpenCV for Visual Studio with C++,python 和 Anaconda 的其他教程部分可以在 这里 找到。

注意:为了跟随教程,我假设你已经安装了 Visual Studio 2019 。如果没有,请在继续阅读之前安装这些工具。

适用于 Visual Studio 2019 的 OpenCV-4.2.0

为 Visual C++开发设置 OpenCV 的所有必要步骤。

步骤 1:安装 C++桌面开发工作负载

打开 Visual Studio 安装工具,将 C++ for desktop development 作为工作负载添加到当前的 Visual Studio IDE 版本中。这一步是必不可少的,因为如果没有所有 C++所需的库,就不能在 VS 中使用 OpenCV。

Visual Studio 安装程序向导

步骤 2:下载并安装 OpenCV-4.2.0

下载适用于 Windows 平台的 OpenCV 4.2.0 最新稳定版(opencv-4.2.0-vc14_vc15.exe)。进入 OpenCV 官方网站:https://opencv.org/->-资源->-发布点击 Windows 平台。你将被重定向到 SourceForge,下载将自动开始。

OpenCV-4.2.0 版本:https://opencv.org/releases/

在运行下载之前。exe 文件,转到 C:\文件夹并添加一个名为 opencv-4.2.0 的新文件夹。运行安装程序并将 zip 文件解压到新创建的 opencv-4.2.0 文件夹中。

将包含 OpenCV 编译版本的 zip 文件解压到您的文件夹中

步骤 3:将 OpenCV 二进制文件添加到您的系统路径中

一旦 OpenCV 正确地安装在您的文件夹中,您现在必须将二进制文件C:\OpenCV-4.2.0\opencv\build\x64\vc15\bin添加到您的系统路径中,这样您就可以通过命令行轻松地访问 OpenCV 可执行文件。

编辑系统路径

步骤 4:配置 Visual Studio 项目以运行 OpenCV

打开 Visual Studio 2019,选择创建一个新项目,然后转到 C++控制台应用程序模板。

创建一个新项目,并选择控制台应用程序 C++模板

创建项目后,您应该有一个布局,其右侧有一个解决方案资源管理器,其中有一个源文件,并且在窗口上方的功能区中,您应该看到针对x86平台的Debug,这意味着该项目将针对 x86 windows 体系结构以调试模式构建和运行。

  • 首先,您应该将解决方案平台从x86更改为x64
  • 其次,您必须更改项目属性来添加 OpenCV 库

更改目标解决方案平台,并转到项目属性

在能够执行任何代码之前,有许多属性需要编辑:

  1. 转到配置属性/VC++目录为 OpenCV 添加包含和库目录。

编辑包含目录和库目录

单击蓝色条目旁边的右箭头

包括内部系统路径

对于包含目录,您必须添加以下路径:C:\OpenCV-4.2.0\opencv\build\include.库目录做同样的操作,添加这个内部路径:C:\OpenCV-4.2.0\opencv\build\x64\vc15\lib.

Include 和 Lib 目录都添加到项目中

2.用opencv_world420d.lib OpenCV 动态库编辑 VC++项目链接器。你会在这里找到DLL(DdynamicLinkLibrary):C:\OpenCV-4.2.0\opencv\build\x64\vc15\lib复制文件名opencv_world420d.lib粘贴到依赖框中。

完成后,单击“确定”按钮

最后一步:测试一些代码

最后,您可以在 visual studio IDE 中运行这个演示代码,看看它是否工作正常。

生成的图像

就这样,您现在可以轻松地使用 OpenCV 了。😉

更多安装信息,请访问 OpenCV 官方指南

在 Linux 和 MacOS 上安装和运行多个 Java 版本

原文:https://towardsdatascience.com/install-and-run-multiple-java-versions-on-linux-using-sdkman-858571bce6cf?source=collection_archive---------4-----------------------

在任何基于 UNIX 的系统上安装并行 Java 版本的分步指南

图片由来自 Pixabay巴克提·伊亚塔提供

如果您是 Java 开发人员,您可能需要在您的机器上安装多个 Java 版本。您可以在项目中使用 Java8 或 Java11,但希望学习更新版本的 Java。或者也许你正在做两个不同的项目,其中使用了两个不同版本的 Java。

实现这一点的一种方法是安装多个 Java 版本,并手动配置不同的 Java 版本。在这种情况下,当您需要切换 Java 版本时,您必须修改一些环境变量。另一种优雅便捷的方式是使用 SDKMAN

SDKMAN 是一个软件开发工具包管理器,用于管理大多数基于 Unix 的系统上的多个软件开发工具包的并行版本。它允许我们安装、移除、切换和列出不同 SDK 的候选版本,包括 Java (例如,JDK、Ant、Dotty、Gradle、Scala 等等)。

在这里,我将展示如何使用 SDKMAN 在基于 UNIX 机器上管理多个 Java 版本。通过阅读本文,您将了解以下内容:

  • 安装 SDKMAN
  • 使用 SDKMAN 列出候选人 JDK
  • 使用 SDKMAN 安装多个候选 JDK
  • 使用 SDKMAN 切换候选 JDK
  • 使用 SDKMAN 删除/卸载 JDK

这些指令对大多数基于 UNIX 的操作系统有效,包括 MacOS、任何 Linux OS (Ubuntu、Debian、MINT、Manjaro、OpenSUSE)、FreeBSD、Solaris、Cygwin

步骤 1:安装 SDKMAN

打开一个新的终端并输入

**curl -s “https://get.sdkman.io" | bash**

现在,在终端中复制并粘贴以下内容,然后输入

**source "$HOME/.sdkman/bin/sdkman-init.sh"**

它会在你的机器上安装 SDKMAN。然后,您可以检查 SDKMAN 的版本

**sdk version**

步骤 2:列出可用的 JDK

通过给出以下命令,查看 SDKMAN 提供的可用 Java 版本

**sdk list java**

它将显示来自不同供应商的所有可用 JDK 及其支持的版本。

步骤 3:安装并行 JDK

安装特定的 JDK,例如 BellSoft 的 JDK 15 Liberica

**sdk install java 15.0.0-librca**
Installing: java 15.0.0-librca
Done installing!Do you want java 15.0.0-librca to be set as default? (Y/n):

现在,您可以使用以下命令检查安装的 Java 版本

**java -version** openjdk version "15" 2020-09-15
OpenJDK Runtime Environment (build 15+36)
OpenJDK 64-Bit Server VM (build 15+36, mixed mode, sharing)

您现在可以安装另一个 JDK,例如 BellSoft 的 JDK 8 Liberica

**sdk install java 8.0.265-librca**
Installing: java 8.0.265-librca
Done installing!Do you want java 15.0.0-librca to be set as default? (Y/n):

步骤 4:在 JDK 之间切换

如果您现在列出可用的 JDK,您将看到已安装的 JDK 标记为 installed,如下所示。

**sdk list java**

然后,您可以使用以下命令更改 JDK

**sdk use java 8.0.265-librca** Using java version 8.0.265-librca in this shell.

您可以按如下方式检查已安装的 JDK

**jdk -version**
openjdk version "1.8.0_265"
OpenJDK Runtime Environment (build 1.8.0_265-b01)
OpenJDK 64-Bit Server VM (build 25.265-b01, mixed mode)

步骤 5:卸载 JDK

您可以使用以下命令卸载 JDK

**sdk uninstall java 15.0.0-librca**
Uninstalling java 15.0.0-librca…

结论

在本文中,我展示了如何使用 SDKMAN 在基于 UNIX 操作系统中轻松优雅地管理多个 Java 版本。我使用 NVM 来管理本地机器上的多个 Node.js 版本,我认为 SDKMAN 在有用性和开发人员友好性方面与 NVM 不相上下。事实上,SDKMAN 支持安装其他 JVM 工具和 SDK,如 Groovy、Scala、Kotlin、Ceylon。蚂蚁,格雷尔,格雷尔斯,梅文,SBT,火花,Spring Boot,Vert.x 。如果你使用 Java 和 JVM,你应该试试 SDKMAN。管理多个 Java 和其他基于 JVM 的 SDK 版本将使您的生活更加轻松。

类似文章:

[## 每个 Java 开发人员都应该知道的 10 大库

Java 和 JVM 软件开发中基本 Java 库的精选列表

towardsdatascience.com](/top-10-libraries-every-java-developer-should-know-37dd136dff54) [## 10 个优秀的 GitHub 库,适合每一个 Java 开发者

面向 Java 开发人员的基本 GitHub 库的精选列表

towardsdatascience.com](/10-excellent-github-repositories-for-every-java-developer-41084a91ade9) [## 您应该尝试的 25 个鲜为人知的 Java 库

对 Java 和 JVM 软件开发有很大帮助的库

towardsdatascience.com](/25-lesser-known-java-libraries-you-should-try-ff8abd354a94)

在你的 Ubuntu 上安装我的面部解锁

原文:https://towardsdatascience.com/install-my-face-unlock-on-your-ubuntu-b27d73fcf54b?source=collection_archive---------52-----------------------

是福斯…!

TL;速度三角形定位法(dead reckoning)

在你的 Ubuntu 上安装我的软件Facerec-Linux face unlock。它是高度优化的,并有一个用户友好的 CLI 来操作它。你可以用*apt install*像安装其他 ubuntu 软件一样安装它。 查看安装指南 此处

照片由凯特琳·贝克Unsplash 上拍摄

故事

大约一年前,作为我在大学的学术项目,我第一次开发了这个软件。我决定它的名字是 Facerec 。最后我把它推到 GitHub 上,并附上了一套安装说明。最初,我没想到会有很多人使用它。它没有友好的安装/使用指南。当人们通过电子邮件和 LinkedIn 联系我,告诉我他们面临的问题时,我感到惊喜。所以我决定花更多的时间让它变得更好和用户友好。

所以我又花了几个星期在这个项目上。这一次,我想我让它变得非常神奇。我几乎重写了整个代码库,现在我正式以facerec v1.1的名字发布它,这一切都是值得的。响应时间减少 70%,现在超级安全。此外,我已经为它创建了一个 PPA(个人包档案)。所以,现在你可以像其他 Ubuntu 软件一样安装它,用apt install

怎么样

  • 整个模型已经更新,以获得更好的性能。
  • 提高安全性。
  • 严重的错误修正,如软件中心冻结问题等。
  • 一个有更多功能的更好的 CLI。
  • CLI 的自动完成。这是我特别引以为豪的小功能之一😂
  • 一个 deb 包,PPA,和一个 docker 镜像用于测试。

欢迎投稿

  • 错误报告,功能请求和 PRs 将被高度赞赏。
  • 测试环境的 Dockerfile 可以在这里找到。(即将上传图片到 docker hub)
  • 目前只有 Ubuntu 支持 facerec。平我,如果你想为其他发行。

安装

1。更新来源

sudo apt update

2。将 PPA 添加到您的机器中

sudo add-apt-repository ppa:rushabh-v/facerec

3。安装 Facerec

sudo apt install facerec

4。来源 bashrc

source ~/.bashrc

命令行界面

截图来自自述

仔细讨论

点击查看。如果你用 Ubuntu,可以考虑试一试,对于其他发行版,可以查看 howdy 。你可以在这里阅读更多关于我如何构建这个项目的信息。

回购的链接

[## rushabh-v/linux_face_unlock

Facerec 是一个面向 Ubuntu Linux 的人脸认证系统,可以在登录、运行“sudo”命令等时工作

github.com](https://github.com/rushabh-v/linux_face_unlock/)

安装 Pyspark 并在 macOS 和 Linux 上使用 GraphFrames

原文:https://towardsdatascience.com/install-pyspark-and-use-graphframes-on-macos-and-linux-f2fe62fc3c2d?source=collection_archive---------17-----------------------

关于如何在不同操作系统上安装 Pyspark 和使用 Spark GraphFrames 的详细指南

image_credit —数据块(https://databricks.com/spark/about)

Linux(Ubuntu)

以下所有操作都应在终端下完成。

  1. 下载 Spark
wget [http://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz](http://d3kbcqa49mib13.cloudfront.net/spark-2.2.0-bin-hadoop2.7.tgz)

2.解压缩文件

tar xf spark-2.2.0-bin-hadoop2.7.tgz

3.如有必要,安装 Java8

sudo add-apt-repository ppa:openjdk-r/ppasudo apt-get updatesudo apt-get install openjdk-8-jdk

您可以通过“java -version”来检查您的安装。如果不是“1.8.xxx”,您需要按照步骤 5–6 选择正确的 java 版本供 spark 使用。

sudo update-java-alternatives — set java-1.8.0-openjdk-amd64

重启你的终端。

4.(可选)如果你想更熟练地使用 Spark,你最好熟悉基本的 Linux 命令和基本的 Bash 操作。可以参考下面这本书【http://linux-training.be/linuxfun.pdf

mac 操作系统

  1. 安装自制软件:

/usr/bin/ruby-e " $(curl-fsSLhttps://raw . githubusercontent . com/home brew/install/master/install)"

2.安装 Scala:

brew install scala

3.安装 Spark:

brew install apache-spark

4.启动 spark python shell(在 spark 目录中):

pyspark

Jupyter 安装(Linux & Mac OS)

Jupyter 笔记本徽标

  1. 安装 Anaconda。

Linux:

wget [https://repo.continuum.io/archive/Anaconda2-4.3.0-Linux-x86_64.sh](https://repo.continuum.io/archive/Anaconda2-4.3.0-Linux-x86_64.sh)

Mac OS:

wget [https://repo.anaconda.com/archive/Anaconda2-2019.07-MacOSX-x86_64.sh](https://repo.anaconda.com/archive/Anaconda2-2019.07-MacOSX-x86_64.sh)

安装:

bash anaconda 2–4 . 3 . 0-Linux-x86 _ 64 . sh(使用相应的文件)

更新$PATH 变量

Linux:源码~/。bashrc

Mac OS: source ~/。bash_profile

修改 pyspark 驱动程序

导出 PYSPARK_DRIVER_PYTHON="jupyter "

导出 py spark _ DRIVER _ PYTHON _ OPTS = " notebook "

启动 spark python shell(在 spark 目录中):

。/bin/pyspark

注意事项:

  1. 可以执行“unset py spark _ DRIVER _ PYTHON py spark _ DRIVER _ PYTHON _ OPTS”来运行普通的 pyspark shell
  2. 如果你发现这个错误“我找不到匹配 PySpark 的内核。请选择一个内核:“你从讲义上传笔记本后,你只要选择已经支持 pyspark 内核的 Python2 内核即可。
  3. 完成这些步骤后,创建一个新的笔记本,键入“sc”并运行它。如果在输出中看到“pyspark.context.SparkContext ”,安装应该成功。

图表框架:

对于预装 Spark 版本的 ubuntu,要使用 GraphFrames:

获取 jar 文件:

wgethttp://dl . bin tray . com/spark-packages/maven/graph frames/graph frames/0 . 7 . 0-spark 2.4-s _ 2.11/graph frames-0 . 7 . 0-spark 2.4-s _ 2.11 . jar

在 Jupyter 笔记本
sc . addpyfile(' path _ to _ the _ jar _ file ')中加载 jar 文件

将 pyspark shell 直接用于 GraphFrames:

。/bin/pyspark —包 graph frames:graph frames:0 . 7 . 0-spark 2.4-s _ 2.11

本地使用 Jupyter:

设置环境变量:
export SPARK _ OPTS = "—packages graph frames:graph frames:0 . 7 . 0-SPARK 2.4-s _ 2.11 "

获取 jar 文件:
wgethttp://dl . bin tray . com/spark-packages/maven/graph frames/graph frames/0 . 7 . 0-spark 2.4-s _ 2.11/graph frames-0 . 7 . 0-spark 2.4-s _ 2.11 . jar

在 Jupyter 笔记本
sc . addpyfile(' path _ to _ the _ jar _ file ')中加载 jar 文件

在 Azure Databricks 服务中:

启动集群

搜索“graphframes”并安装库

弗洛里安·奥利沃在 Unsplash 上拍摄的照片

感谢您的阅读,我期待听到您的问题和想法。如果你想了解更多关于数据科学和云计算的知识,可以在Linkedin上找我。

在 SageMaker 上安装持久化的 Julia 环境

原文:https://towardsdatascience.com/installing-a-persistent-julia-environment-on-sagemaker-c67acdde9d4b?source=collection_archive---------47-----------------------

通过跨重启持久化 Anaconda 环境,充分利用 SageMaker

照片由爱丽丝·多诺万·劳斯Unsplash

SageMaker 是一个很好的环境,让数据科学家探索新的语言和方法,而不必太担心底层基础设施。只要您不需要定制现有的环境,一切看起来都很棒,而且运行正常。然而,一旦你想冒险离开人迹罕至的道路,你就会遇到一些意想不到的挑战。

我们的数据科学家通常有成本意识,当他们不使用 SageMaker 实例时,会很高兴地停止它们。不幸的是,SageMaker 不会持久保存任何写在~/SageMaker目录之外的数据。这意味着对 Anaconda 环境的更改不会在笔记本重启后持续。这非常令人沮丧。为了解决这个问题,我们需要在~/SageMaker文件夹中创建一个持久的 Anaconda 环境,并告诉 Julia 把它的包也放在那里。我们开始吧!

登录到您的 SageMaker 环境并打开一个新的终端会话。让我们创建一个新的空的 Anaconda 环境,位于~/SageMaker目录中。

conda create --yes --prefix ~/SageMaker/envs/julia

下载并解压 Julia 的最新版本

curl --silent [https://julialang-s3.julialang.org/bin/linux/x64/1.5/julia-1.5.0-linux-x86_64.tar.gz](https://julialang-s3.julialang.org/bin/linux/x64/1.4/julia-1.4.2-linux-x86_64.tar.gz) | tar xzf -
cp -R julia-1.5.0/* ~/SageMaker/envs/julia/

在我们开始为 Julia 安装软件包之前,我们需要确保 Julia 正在从正确的目录加载它的软件包。这也确保了您通过笔记本或终端安装的包也将存储在 SageMaker 实例的持久空间中。

mkdir -p ~/SageMaker/envs/julia/etc/conda/activate.decho 'export JULIA_DEPOT_PATH=~/SageMaker/envs/julia/depot' >> ~/SageMaker/envs/julia/etc/conda/activate.d/env.shecho -e 'empty!(DEPOT_PATH)\npush!(DEPOT_PATH,raw"/home/ec2-user/SageMaker/envs/julia/depot")' >> ~/SageMaker/envs/julia/etc/julia/startup.jl

我们现在可以激活环境并开始安装我们的依赖项,包括 IJulia。启动茱莉亚·REPL,安装并激活伊茱莉亚。

juliausing Pkg
Pkg.add("IJulia")
using IJulia

退出 REPL (Ctrl + D)并打开 Jupyter 或 JupyterLabs。新的 Julia 1.5.0 内核现在应该是可见的,您已经准备好了。

重启 SageMaker 实例后,您会注意到 Julia 内核已经消失了。要恢复内核,只需执行

conda run --prefix ~/SageMaker/envs/julia/ julia --eval 'using IJulia; IJulia.installkernel("Julia")'

您可以随心所欲地将这个脚本注册为笔记本生命周期配置,每当 SageMaker 实例启动时就会自动执行。你可以在 https://docs . AWS . Amazon . com/sage maker/latest/DG/notebook-life cycle-config . html 找到更多关于如何设置的详细信息。

在 Windows 10 上安装 Apache Hive 3.1.2

原文:https://towardsdatascience.com/installing-apache-hive-3-1-2-on-windows-10-70669ce79c79?source=collection_archive---------2-----------------------

在 Windows 10 操作系统上安装 Apache Hive 3.1.2 的分步指南

在进行一个项目时,我们被要求在 Windows 10 操作系统上安装 Apache Hive。网上找到了许多指南,但不幸的是,它们不起作用。为此,我决定写一个循序渐进的指南来帮助别人。

本指南的起点是我在 Youtube 上找到的一个很棒的视频,它提供了 Hive 2.x 的一个工作场景,没有太多细节。

本文是我们在 TowardsDataScience.com 上发布的系列文章的一部分,旨在说明如何在 Windows 操作系统上安装大数据技术。

本系列其他发表文章:

1.先决条件

1.1.7zip

为了提取 tar.gz 档案,你应该安装7 压缩工具

1.2.安装 Hadoop

要安装 Apache Hive,必须安装并运行 Hadoop 集群:可以参考我们之前发布的分步指南,在 Windows 10 上安装 Hadoop 3.2.1。

1.3.阿帕奇德比

此外,Apache Hive 需要一个关系数据库来创建它的 Metastore(所有元数据都将存储在这里)。在本指南中,我们将使用 Apache Derby 数据库 4。

既然我们已经安装了 Java 8,我们必须安装 Apache Derby 10.14.2.0 版本(查看下载页面),可以从下面的链接下载。

下载后,我们必须解压两次(使用 7zip:第一次解压. tar.gz 文件,第二次解压。tar file) 将 db-derby-10.14.2.0-bin.tar.gz 的内容归档到所需的安装目录下。由于在上一个指南中,我们已经在“E:\hadoop-env\hadoop-3.2.1”目录中安装了 Hadoop,因此我们将 Derby 提取到“E:\ Hadoop-env \ d b-Derby-10 . 14 . 2 . 0”目录中。

1.4.Cygwin

因为有一些 Hive 3.1.2 工具与 Windows 不兼容(比如 schematool)。我们将需要 Cygwin 工具来运行一些 Linux 命令。

2.下载 Apache Hive 二进制文件

为了下载 Apache Hive 二进制文件,你应该去下面的网站:【https://downloads.apache.org/hive/hive-3.1.2/】T2。然后,下载 apache-hive-3.1.2。-bin.tar.gz 文件。

图 1—apache-hive.3.1.2-bin.tar.gz 文件

文件下载完成后,我们应该将两次(如上所述)apache-hive.3.1.2-bin.tar.gz 归档文件解压到“E:\hadoop-env\ Apache-hive-3 . 1 . 2”目录中(因为我们决定使用 E:\ Hadoop-env \ "作为上一指南中使用的所有技术的安装目录。

3.设置环境变量

提取 Derby 和 Hive 档案后,我们应该进入控制面板>系统和安全>系统。然后点击“高级系统设置”。

图 2-高级系统设置

在高级系统设置对话框中,点击“环境变量”按钮。

图 3 —打开环境变量编辑器

现在我们应该添加以下用户变量:

图 4 —添加用户变量

  • HIVE _ HOME:" E:\ Hadoop-env \ Apache-HIVE-3 . 1 . 2 \ "
  • DERBY _ HOME:" E:\ Hadoop-env \ d b-DERBY-10 . 14 . 2 . 0 \ "
  • HIVE_LIB: "%HIVE_HOME%\lib "
  • HIVE_BIN: "%HIVE_HOME%\bin "
  • HADOOP _ USER _ class path _ FIRST:" true "

图 5 —添加 HIVE_HOME 用户变量

此外,我们应该添加以下系统变量:

  • HADOOP _ USER _ class path _ FIRST:" true "

现在,我们应该编辑 Path 用户变量以添加以下路径:

  • %HIVE_BIN%
  • %DERBY_HOME%\bin

图 6 —编辑路径环境变量

4.正在配置配置单元

4.1.复制 Derby 库

现在,我们应该转到 Derby 库目录(E:\ Hadoop-env \ d b-Derby-10 . 14 . 2 . 0 \ lib)并复制所有*。jar 文件。

图 7 —复制 Derby 库

然后,我们应该将它们粘贴到配置单元库目录中(E:\ Hadoop-env \ Apache-Hive-3 . 1 . 2 \ lib)。

图 8 —在配置单元库目录中粘贴 Derby 库

4.2.配置 hive-site.xml

现在,我们应该转到 Apache Hive 配置目录(E:\ Hadoop-env \ Apache-Hive-3 . 1 . 2 \ conf)创建一个新文件“hive-site.xml”。我们应该将以下 XML 代码粘贴到该文件中:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration><property> <name>javax.jdo.option.ConnectionURL</name> 
<value>jdbc:derby://localhost:1527/metastore_db;create=true</value> 
<description>JDBC connect string for a JDBC metastore</description>
</property><property> 
<name>javax.jdo.option.ConnectionDriverName</name> 
<value>org.apache.derby.jdbc.ClientDriver</value> 
<description>Driver class name for a JDBC metastore</description>
</property>
<property> 
<name>hive.server2.enable.doAs</name> 
<description>Enable user impersonation for HiveServer2</description>
<value>true</value>
</property>
<property>
<name>hive.server2.authentication</name> 
<value>NONE</value>
<description> Client authentication types. NONE: no authentication check LDAP: LDAP/AD based authentication KERBEROS: Kerberos/GSSAPI authentication CUSTOM: Custom authentication provider (Use with property hive.server2.custom.authentication.class) </description>
</property>
<property>
<name>datanucleus.autoCreateTables</name>
<value>True</value>
</property>
</configuration>

5.启动服务

5.1.Hadoop 服务

要启动 Apache Hive,请以管理员身份打开命令提示符实用程序。然后,使用 start-dfs 和 start-yarn 命令启动 Hadoop 服务(如 Hadoop 安装指南中所示)。

5.2.Derby 网络服务器

然后,我们应该使用以下命令在本地主机上启动 Derby 网络服务器:

E:\hadoop-env\db-derby-10.14.2.0\bin\StartNetworkServer -h 0.0.0.0

6.正在启动 Apache Hive

现在,让我们尝试打开一个命令提示工具,转到配置单元二进制文件目录(E:\ Hadoop-env \ Apache-Hive-3 . 1 . 2 \ bin)并执行以下命令:

hive

我们将收到以下错误:

'hive' is not recognized as an internal or external command, operable program or batch file.

由于 Hive 3.x 版本不是为 Windows 构建的(仅在某些 Hive 2.x 版本中),因此会引发此错误。为了让事情顺利进行,我们应该下载必要的*。来自以下链接的 cmd 文件:https://SVN . Apache . org/repos/ASF/hive/trunk/bin/。请注意,您应该保留文件夹层次结构(bin\ext\util)。

您可以下载所有*。来自以下 GitHub 存储库的 cmd 文件

现在,如果我们尝试执行“hive”命令,我们将收到以下错误:

Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1357)
at org.apache.hadoop.conf.Configuration.set(Configuration.java:1338)
at org.apache.hadoop.mapred.JobConf.setJar(JobConf.java:518)
at org.apache.hadoop.mapred.JobConf.setJarByClass(JobConf.java:536)
at org.apache.hadoop.mapred.JobConf.<init>(JobConf.java:430)
at org.apache.hadoop.hive.conf.HiveConf.initialize(HiveConf.java:5141)
at org.apache.hadoop.hive.conf.HiveConf.<init>(HiveConf.java:5104)
at org.apache.hive.beeline.HiveSchemaTool.<init>(HiveSchemaTool.java:96)
at org.apache.hive.beeline.HiveSchemaTool.main(HiveSchemaTool.java:1473)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:318)
at org.apache.hadoop.util.RunJar.main(RunJar.java:232)

这个错误是由于下面的 Hive 问题链接中提到的一个错误引起的: HIVE-22718

评论中提到,这个问题可以通过将“E:\ hadoop-env \ Apache-hive-3 . 1 . 2 \ lib”中存储的 guava-19.0.jar 替换为“E:\ Hadoop-env \ Hadoop-3 . 2 . 1 \ share \ Hadoop \ HDFS \ lib”中找到的 Hadoop 的 guava-27.0-jre.jar 来解决。

注意:这个文件也被上传到上面提到的 GitHub 存储库中。

现在,如果我们再次运行 hive 命令,那么 Apache Hive 将成功启动。

图 9 —启动 Apache Hive

7.正在初始化配置单元

在确保 Apache Hive 成功启动后。我们可能无法运行任何 HiveQL 命令。这是因为 Metastore 尚未初始化。此外,HiveServer2 服务必须正在运行。

要初始化 Metastore,我们需要使用与 windows 不兼容的 schematool 实用程序。为了解决这个问题,我们将使用 Cygwin 实用程序,它允许从 windows 执行 Linux 命令。

7.1.创建符号链接

首先,我们需要创建以下目录:

  • E:\cygdrive
  • C:\cygdrive

现在,以管理员身份打开命令提示符并执行以下命令:

mklink /J  E:\cygdrive\e\ E:\
mklink /J  C:\cygdrive\c\ C:\

这些符号链接是正确使用 Cygwin 实用程序所必需的,因为 Java 可能会导致一些问题。

7.2.正在初始化配置单元 Metastore

打开 Cygwin 实用程序并执行以下命令来定义环境变量:

export HADOOP_HOME='/cygdrive/e/hadoop-env/hadoop-3.2.1'
export PATH=$PATH:$HADOOP_HOME/bin
export HIVE_HOME='/cygdrive/e/hadoop-env/apache-hive-3.1.2'
export PATH=$PATH:$HIVE_HOME/bin
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HIVE_HOME/lib/*.jar

我们可以将这些行添加到“~/”中。bashrc”文件,这样你就不需要每次打开 Cygwin 时都写它们。

现在,我们应该使用 schematool 实用程序来初始化 Metastore:

$HIVE_HOME/bin/schematool -dbType derby -initSchema

7.3.正在启动 HiveServer2 服务

现在,打开命令提示符并运行以下命令:

hive --service hiveserver2 start

我们应该让这个命令提示符处于打开状态,并打开一个新的命令提示符,我们应该使用下面的命令启动 Apache Hive:

hive

7.4.启动 WebHCat 服务(可选)

在我们正在进行的项目中,我们需要从 SQL Server Integration Services 执行 HiveQL 语句,该语句可以从 WebHCat 服务器访问 Hive。

要启动 WebHCat 服务器,我们应该打开 Cygwin 实用程序并执行以下命令:

$HIVE_HOME/hcatalog/sbin/webhcat_server.sh start

8.参考

  1. Stackoverflow.com 问答网站
  2. 阿帕奇蜂巢官网
  3. YouTube:WINDOWS 上的简易 HIVE 安装
  4. kon text . tech:Windows 10 上 Apache Hive 3.0.0 安装分步指南

在 Windows 10 上安装 Apache Pig 0.17.0

原文:https://towardsdatascience.com/installing-apache-pig-0-17-0-on-windows-10-7b19ce61900d?source=collection_archive---------11-----------------------

本文是我们在 TowardsDataScience.com 上发布的系列文章的一部分,旨在说明如何在 Windows 操作系统上安装大数据技术。

之前发布:

在本文中,我们将提供在 Windows 10 上安装 Apache Pig 0.17.0 的分步指南。

1.先决条件

1.1.Hadoop 集群安装

Apache Pig 是基于 Hadoop 构建的平台。可以参考我们之前发表的文章,在 Windows 10 上安装 Hadoop 单节点集群。

注意 Apache Pig 最新版本 0.17.0 支持 Hadoop 2.x 版本仍然面临一些与 Hadoop 3.x 的兼容性问题。在本文中,我们将只说明安装,因为我们使用的是 Hadoop 3.2.1

1.2.7zip

7 需要 zip 来解压缩我们将在本指南中下载的. tar.gz 归档文件。

2.下载阿帕奇猪

要下载 Apache Pig,您应该访问以下链接:

图 1 — Apache Pig 发布目录

如果你正在寻找最新版本,导航到“最新”目录,然后下载 pig-x.xx.x.tar.gz 文件。

图 2 —下载 Apache Pig 二进制文件

文件下载后,我们应该用 7zip 解压两次(用 7zip:第一次解压. tar.gz 文件,第二次解压。tar 文件)。我们将把 Pig 文件夹提取到“E:\hadoop-env”目录中,就像在以前的文章中使用的那样。

3.设置环境变量

提取 Derby 和 Hive 档案后,我们应该进入控制面板>系统和安全>系统。然后点击“高级系统设置”。

图 3-高级系统设置

在高级系统设置对话框中,点击“环境变量”按钮。

图 4 —打开环境变量编辑器

现在我们应该添加以下用户变量:

图 5 —添加用户变量

  • PIG _ HOME:" E:\ Hadoop-env \ PIG-0 . 17 . 0 "

图 6 —添加 PIG_HOME 变量

现在,我们应该编辑 Path 用户变量以添加以下路径:

  • %PIG_HOME%\bin

图 7 —编辑路径变量

4.启动阿帕奇猪

设置完环境变量后,我们来试着运行 Apache Pig。

注意 : Hadoop 服务必须正在运行

以管理员身份打开命令提示符,并执行以下命令

pig -version

您将收到以下异常:

'E:\hadoop-env\hadoop-3.2.1\bin\hadoop-config.cmd' is not recognized as an internal or external command,
operable program or batch file.
'-Xmx1000M' is not recognized as an internal or external command,
operable program or batch file.

图 8-清管器异常

要修复此错误,我们应该编辑位于“pig-0.17.0\bin”目录中的 pig.cmd 文件,方法是将 HADOOP_BIN_PATH 值从“%HADOOP_HOME%\bin”更改为“%HADOOP_HOME%\libexec”。

现在,让我们再次尝试运行“pig -version”命令:

图 9-清管器安装已验证

编写 PigLatin 语句最简单的方法是使用 Grunt shell,这是一个交互式工具,我们可以在其中编写语句并获得所需的输出。有两种模式涉及 Grunt Shell:

  1. 本地:所有脚本都在一台机器上执行,不需要 Hadoop。(命令:pig -x local)
  2. MapReduce:在 Hadoop 集群上执行脚本(命令:pig -x MapReduce)

由于我们安装了与 Pig 0.17.0 不兼容的 Apache Hadoop 3.2.1,我们将尝试使用本地模式运行 Pig。

图 10 —在本地模式下启动 Grunt Shell

5.参考

  1. Stackoverflow.com 问答网站
  2. 阿帕奇猪官网
  3. 解决方案 Mandi: 在 Windows 10 上安装 Pig

10 分钟在谷歌云平台上安装 CUDA

原文:https://towardsdatascience.com/installing-cuda-on-google-cloud-platform-in-10-minutes-9525d874c8c1?source=collection_archive---------16-----------------------

剥离支持 GPU 的实例的 4 步指南

最近,我花了相当多的时间在谷歌云平台(GCP)上建立我的 CUDA 实例。在大量的错误和文章之后,我发现如果我第一次就发现了正确的设置过程的话,这本来可以很快完成的!

所以我决定写这篇文章来让你的 CUDA 实例在几分钟内运行起来。到这篇文章结束时,你将在 GCP 上安装 CUDA 10.0、cuDNN 7.6.5 和 Ubuntu 16.04。

第 0 步:在谷歌云平台(GCP)上创建一个免费账户

在谷歌云平台上创建一个免费账户。输入您的信用卡详细信息并验证。你将获得 300 美元的信用。

要使用 GPU,您需要将升级到付费账户,并增加您的 GPU 配额。如果您还没有经过验证的升级帐户,这一步可能需要一些时间(通常为 1-2 天)。

步骤 1:在 GCP 上设置一个虚拟机实例

选择一个项目。我选择了“我的第一个项目”

在您的项目中创建一个 VM 实例。点击“创建”。

选择您需要的 CPU 内核数量,以及您想要的 GPU。我选择了‘n1-standard-8’CPU 和一个‘P100 GPU’。

设置 CPU 和 GPU 类型和数量

选择 OS 为 Ubuntu 16.04 和引导盘大小。200 GB 是推荐的大小。

设置操作系统类型和引导磁盘大小

勾选防火墙规则,然后点击“管理、安全、磁盘、网络、单独租赁”。

更改防火墙设置

禁用“磁盘”下的引导磁盘删除选项

取消启动磁盘删除检查

点击最后的 create ,你的实例就准备好了!

点击 SSH 打开一个终端。您的实例应该正在运行。

单击 SSH 以连接到终端

不要关闭终端。您将在这个终端中安装 CUDA 和 cuDNN,而不是在您的本地桌面终端中。

警惕!!您的实例现在已经启动并运行。你被起诉了。如果你的使用超过 300 美元信用,你将不得不支付余额。不要忘记在不使用时停止实例。

第二步:安装 CUDA

我给 Ubuntu1604 装了 CUDA 10.0。你也可以安装其他的 CUDA 版本并相应地编辑下面的代码。

Ubuntu 16.04 上的 CUDA 10.0

你可能会得到 libcudnn.so 此时不是符号链接错误。查看这篇文章底部的解决方案

第三步:安装T5 cud nn

你需要在 Nvidia 上免费创建一个开发者账户。

Ubuntu 16.04 上的 CuDNN 7.6.5

要验证 CUDA 10.0 安装,请运行以下命令。它应该打印安装的 CUDA 版本。

nvcc -V 

恭喜你!您成功安装了 CUDA 10.0

完整的代码便于参考。

第四步:安装 Tensorflow 等软件包

可以安装 Tensorflow 和基本的 python 包,比如 ipythonpip

安装 tensorflow 和 python 包

警惕!!不要忘记停止实例!

注意:

sudo ldconfig上,您可能会得到以下错误:

/usr/local/cuda/lib64/libcudnn.so.7 is not a symbolic link

这是因为 libcudnn.so.5 和 libcudnn.so 不是符号链接。你可以在这里阅读详情

要解决该错误,请执行以下步骤:

libcudnn.so 符号链接错误

我们关于在 Google 云平台上设置支持 CUDA 的 VM 实例的快速帖子到此结束。

我希望你喜欢这个技术性更强的帖子!

在 Windows 10 的 Visual Studio 代码中安装 GitHub

原文:https://towardsdatascience.com/installing-github-in-visual-studio-code-for-windows-10-6abd3325ab1?source=collection_archive---------4-----------------------

VS 代码/ GitHub

将 GitHub 与 VS 代码集成的分步安装指南。

照片由 iambipin 拍摄

isual Studio Code 已经成为全球大多数开发人员的首选代码编辑器。它的受欢迎程度每时每刻都在飙升。这要归功于它吸引人的一系列特性,如智能感知,这些特性使它成为开发人员不可或缺的工具。

和 VS 代码一样,GitHub 对于开发者社区也是必不可少的。因此,知道如何在 Visual Studio 代码中安装 GitHub 是非常重要的。对于外行来说,GitHub 是一个基于 Git 版本控制系统的基于 web 的托管服务。

在安装之前,检查 Git 是否安装在 Windows 上是必不可少的。要进行验证,请通过按 windows 键和 r 键打开 Windows 的命令提示符。

在命令提示符中,键入 git-version 以了解安装的 Git 版本。如果没有安装 Git,命令提示符将返回一条消息,如下图所示。

现在打开 VS 代码,进入它的活动栏的源代码控制。在没有 Git 的系统中,将显示“没有注册源代码管理提供程序”消息。

Windows 安装

让我们从 https://git-scm.com/downloads下载 git。

运行。从 Git 网站下载的. exe 文件。按照下面给出的镜像顺序在 Windows 10 中安装 Git。

现在已经安装了 Git,让我们通过打开 Git Bash 来验证这一点。

使用 VS 代码从 GitHub 克隆一个 repo

第一步:在 GitHub 中选择一个库,点击右上角的绿色按钮克隆或下载。复制出现在下拉栏上的链接。

步骤 2: 打开 VS 代码,转到文件- >将文件夹添加到工作区…

添加新创建的文件夹。

VS 代码界面将类似于下图:

第三步:打开终端。

步骤 4: 要链接您的 GitHub 帐户,请键入git config-global user . name<GitHub 用户 ID >

步骤 5: 键入 git 克隆< url 在步骤 1 > 中从 GitHub 复制一个 repo 使用 VS 代码。

安装完成后,VS 代码用户界面将如下图所示。

转到活动栏的源代码控制,验证 Git 是否已经正确安装。如果安装正确,UI 将类似于下图(源代码控制:GIT 可以在底层图像的左上角看到)。

附加注释

要从当前工作目录(CWD)打开 VS 代码,有下面提到的两种方法:

方法一:打开命令提示符(Windows 键+ R >键入 cmd)。然后通过 cd <路径转到所需目录>

然后键入 代码。 在命令提示符下打开 VS 代码。

您可以通过打开终端并检查 Windows Powershell 来验证这一点。

方法二 : 文件>打开文件夹……

选择所需的文件夹。

那么当前工作目录将是所选的文件夹。

我希望这些信息对你们有所帮助。编码快乐!!!

在 Windows 10 上安装 Hadoop 3.2.1 单节点集群

原文:https://towardsdatascience.com/installing-hadoop-3-2-1-single-node-cluster-on-windows-10-ac258dd48aef?source=collection_archive---------0-----------------------

两年前在做一个项目的时候,我写了一个在 Ubuntu 16.04 操作系统上安装 Hadoop 3.1.0 的分步指南。由于我们目前正在进行一个新项目,需要在 Windows 10 上安装 Hadoop 集群,我决定为这个过程编写一个指南。

本文是我们在 TowardsDataScience.com 上发布的系列文章的一部分,旨在说明如何在 Windows 操作系统上安装大数据技术。

本系列其他发表文章:

1.先决条件

首先,我们需要确保安装了以下先决条件:

1.Java 8 运行时环境(JRE): Hadoop 3 需要安装 Java 8。我更喜欢使用离线安装程序。

  1. Java 8 开发套件(JDK)

3.为了解压下载的 Hadoop 二进制文件,我们应该安装 7zip

4.我将在本地机器上创建一个文件夹“E:\hadoop-env”来存储下载的文件。

2.下载 Hadoop 二进制文件

第一步,从官网下载 Hadoop 二进制。二进制包的大小约为 342 MB。

图 1 — Hadoop 二进制文件下载链接

完成文件下载后,我们应该使用 7zip int 分两步解压软件包。首先,我们应该提取 hadoop-3.2.1.tar.gz 库,然后,我们应该解压缩提取的 tar 文件:

图 2 —使用 7zip 提取 hadoop-3.2.1.tar.gz 包

图 3 —提取的 hadoop-3.2.1.tar 文件

图 4 —提取 hadoop-3.2.1.tar 文件

tar 文件提取可能需要几分钟才能完成。最后,您可能会看到一些关于符号链接创建的警告。请忽略这些警告,因为它们与 windows 无关。

图 5-符号链接警告

解包后,我们要添加 Hadoop 原生 IO 库,可以在下面的 GitHub 库找到:https://github.com/cdarlint/winutils

由于我们正在安装 Hadoop 3.2.1,我们应该下载位于https://github . com/cdarlint/winutils/tree/master/Hadoop-3 . 2 . 1/bin中的文件,并将其复制到“hadoop-3.2.1\bin”目录中。

3.设置环境变量

安装 Hadoop 及其先决条件后,我们应该配置环境变量来定义 Hadoop 和 Java 默认路径。

要编辑环境变量,请转到控制面板>系统和安全>系统(或右键单击>我的电脑上的属性图标),然后单击“高级系统设置”链接。

图 6 —打开高级系统设置

当“高级系统设置”对话框出现时,转到“高级”选项卡并单击位于对话框底部的“环境变量”按钮。

图 7 —高级系统设置对话框

在“环境变量”对话框中,按“新建”按钮添加一个新变量。

注意:在本指南中,我们将添加用户变量,因为我们是为单个用户配置 Hadoop。如果您希望为多个用户配置 Hadoop,您可以改为定义系统变量。

有两个变量需要定义:

1.JAVA_HOME: JDK 安装文件夹路径

2.HADOOP_HOME: Hadoop 安装文件夹路径

图 8 —添加 JAVA_HOME 变量

图 9 —添加 HADOOP_HOME 变量

现在,我们应该编辑 PATH 变量来添加 Java 和 Hadoop 二进制文件路径,如下图所示。

图 10 —编辑路径变量

图 11 —编辑路径变量

图 12—向 PATH 变量添加新路径

3.1.JAVA_HOME 设置错误

现在,让我们打开 PowerShell 并尝试运行以下命令:

hadoop -version

在本例中,由于 JAVA_HOME 路径包含空格,我收到了以下错误:

JAVA_HOME is incorrectly set

图 13 — JAVA_HOME 错误

要解决这个问题,我们应该改用 windows 8.3 路径。举个例子:

  • 使用“Progra~1”而不是“程序文件”
  • 使用“Progra~2”而不是“程序文件(x86)”

在将“程序文件”替换为“Progra~1”之后,我们关闭并重新打开 PowerShell,并尝试了相同的命令。如下图所示,它运行时没有错误。

图 14 — hadoop 版本命令成功执行

4.配置 Hadoop 集群

为了配置 Hadoop 集群,我们应该更改四个文件:

  1. % HADOOP _ HOME % \ etc \ HADOOP \ HDFS-site . XML
  2. % HADOOP _ HOME % \ etc \ HADOOP \ core-site . XML
  3. % HADOOP _ HOME % \ etc \ HADOOP \ map red-site . XML
  4. % HADOOP _ HOME % \ etc \ HADOOP \ yarn-site . XML

4.1.HDFS 站点配置

众所周知,Hadoop 是使用主从模式构建的。在修改 HDFS 配置文件之前,我们应该创建一个目录来存储所有主节点(名称节点)数据,并创建另一个目录来存储数据(数据节点)。在本例中,我们创建了以下目录:

  • e:\ Hadoop-env \ Hadoop-3 . 2 . 1 \ data \ DFS \ NameNode
  • e:\ Hadoop-env \ Hadoop-3 . 2 . 1 \ data \ DFS \ datanode

现在,让我们打开位于“%HADOOP_HOME%\etc\hadoop”目录中的“hdfs-site.xml”文件,我们应该在 元素中添加以下属性:

<property><name>dfs.replication</name><value>1</value></property><property><name>dfs.namenode.name.dir</name><value>file:///E:/hadoop-env/hadoop-3.2.1/data/dfs/namenode</value></property><property><name>dfs.datanode.data.dir</name><value>file:///E:/hadoop-env/hadoop-3.2.1/data/dfs/datanode</value></property>

请注意,我们已经将复制因子设置为 1,因为我们正在创建单节点集群。

4.2.核心站点配置

现在,我们应该配置名称节点 URL,将以下 XML 代码添加到“core-site.xml”内的 元素中:

<property><name>fs.default.name</name><value>hdfs://localhost:9820</value></property>

4.3.地图简化站点配置

现在,我们应该将下面的 XML 代码添加到“mapred-site.xml”中的 元素中:

<property><name>mapreduce.framework.name</name><value>yarn</value><description>MapReduce framework name</description></property>

4.4.纱线位置配置

现在,我们应该将下面的 XML 代码添加到“yarn-site.xml”中的 元素中:

<property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value><description>Yarn Node Manager Aux Service</description></property>

5.格式化名称节点

完成配置后,让我们尝试使用以下命令格式化名称节点:

hdfs namenode -format

由于 Hadoop 3.2.1 版本中的错误,您将收到以下错误:

2020–04–17 22:04:01,503 ERROR namenode.NameNode: Failed to start namenode.java.lang.UnsupportedOperationExceptionat java.nio.file.Files.setPosixFilePermissions(Files.java:2044)at org.apache.hadoop.hdfs.server.common.Storage$StorageDirectory.clearDirectory(Storage.java:452)at org.apache.hadoop.hdfs.server.namenode.NNStorage.format(NNStorage.java:591)at org.apache.hadoop.hdfs.server.namenode.NNStorage.format(NNStorage.java:613)at org.apache.hadoop.hdfs.server.namenode.FSImage.format(FSImage.java:188)at org.apache.hadoop.hdfs.server.namenode.NameNode.format(NameNode.java:1206)at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1649)at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1759)2020–04–17 22:04:01,511 INFO util.ExitUtil: Exiting with status 1: java.lang.UnsupportedOperationException2020–04–17 22:04:01,518 INFO namenode.NameNode: SHUTDOWN_MSG:

这个问题将在下一个版本中解决。目前,您可以使用以下步骤暂时修复它(参考):

  1. 下面的链接下载 hadoop-hdfs-3.2.1.jar 文件。
  2. 将文件夹% HADOOP _ HOME % \ share \ HADOOP \ HDFS 中的文件名 hadoop-hdfs-3.2.1.jar 重命名为 hadoop-hdfs-3.2.1.bak
  3. 将下载的 hadoop-hdfs-3.2.1.jar 复制到文件夹% HADOOP _ HOME % \ share \ HADOOP \ HDFS

现在,如果我们尝试重新执行 format 命令(以管理员身份运行命令提示符或 PowerShell),您需要批准文件系统格式。

图 15 —文件系统格式批准

并且命令成功执行:

图 16 —成功执行的命令

6.启动 Hadoop 服务

现在,我们将打开 PowerShell,并导航到“%HADOOP_HOME%\sbin”目录。然后,我们将运行以下命令来启动 Hadoop 节点:

.\start-dfs.cmd

图 17 —启动 Hadoop 节点

将打开两个命令提示符窗口(一个用于名称节点,一个用于数据节点),如下所示:

图 18 — Hadoop 节点命令提示符窗口

接下来,我们必须使用以下命令启动 Hadoop Yarn 服务:

./start-yarn.cmd

图 19 —启动 Hadoop 纱线服务

将打开两个命令提示符窗口(一个用于资源管理器,一个用于节点管理器),如下所示:

图 20—节点管理器和资源管理器命令提示符窗口

为了确保所有服务都成功启动,我们可以运行以下命令:

jps

它应该显示以下服务:

14560 DataNode
4960 ResourceManager
5936 NameNode
768 NodeManager
14636 Jps

图 21 —执行 jps 命令

7.Hadoop Web 用户界面

有三种网络用户界面可供使用:

图 22 —名称节点网页

图 23 —数据节点网页

图 24 —纱线网页

8.参考

  1. Hadi Fadlallah,在 Ubuntu 16.04 上逐步安装 Hadoop 3.1.0 多节点集群,TowardsDataScience.com
  2. Jozef Jarosciak如何在 Windows 10 上安装 Hadoop 单节点集群
  3. Raymond Tang,在 Windows 10 上安装 Hadoop 3.2.1 分步指南,kontext.tech
  4. 栈溢出问答网站

在 Mac 上安装 Hadoop

原文:https://towardsdatascience.com/installing-hadoop-on-a-mac-ec01c67b003c?source=collection_archive---------2-----------------------

你需要的唯一向导!

马库斯·斯皮斯克在 Unsplash 上的照片

难道是你和 Hadoop 之间唯一的障碍,只是想知道如何在 Mac 上安装它吗?一个快速的互联网搜索会告诉你缺乏关于这个相当简单的过程的信息。在这个简短的教程中,我将向您展示如何在伪分布式模式下使用单节点集群的终端在一个 macOS Mojave (版本 10.14.6 )上非常容易地安装 Hadoop 3.2.1

首先,您需要安装几个需要放在适当目录中的包。 家酿网站让这个任务变得非常简单,自动确定你的机器上需要什么,安装正确的目录并把它们的文件符号链接到/user/local。其他文档也可以在他们的网站上找到。

安装自制软件

复制页面顶部的命令并粘贴到新的终端窗口中。将会通知您将要安装的内容。按回车键启动该过程:

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

确认您的机器上有正确的 java 版本(版本 8)。如果它返回的不是 1.8。,请确保安装正确的版本。

$ java -version$ brew cask install homebrew/cask-versions/adoptopenjdk8

安装 Hadoop

接下来,您将在以下路径安装最新版本的 Hadoop:/usr/local/Cellar/Hadoop。在撰写本文时,这恰好是 3.2.1:

$ brew install hadoop

配置 Hadoop

配置 Hadoop 需要几个步骤。关于设置单节点集群的更详细版本可以在 Apache Hadoop 文档 中找到。(确保遵循机器上安装的正确版本。)

  1. 更新环境变量设置
  2. core -、 hdfs -、 mapred -和 yarn -site.xml 文件进行更改
  3. 取消密码要求(如有必要)
  4. 格式命名节点

打开包含环境变量设置的文档:

$ cd /usr/local/cellar/hadoop/3.2.1/libexec/etc/hadoop
$ open hadoop-env.sh

对文档进行以下更改,保存并关闭。

添加导出 JAVA_HOME 的位置

export JAVA _ HOME = "/Library/JAVA/JAVA virtual machines/adopt open JDK-8 . JDK/Contents/HOME "

您可以通过在终端窗口中使用以下代码来找到此路径:

$ /usr/libexec/java_home

替换导出 HADOOP_OPTS 的信息

更改导出 HADOOP _ OPTS = "-DJ ava . net . preferipv 4 stack = true "

要导出 HADOOP _ OPTS = "-djava . net . preferipv 4 stack = true-djava . security . krb5 . realm =-djava . security . krb5 . KDC = "

对核心文件进行更改

$ open core-site.xml<configuration>
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
  </property>
</configuration>

对 hdfs 文件进行更改

$ open hdfs-site.xml<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>
</configuration>

对映射的文件进行更改

$ open mapred-site.xml<configuration>
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
  <property>
    <name>mapreduce.application.classpath</name>   <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
  </property>
</configuration>

对纱线文件进行更改

$ open yarn-site.xml

<属性>
<名称>YARN . nodemanager . aux-services</名称>
<值>MapReduce _ shuffle</值>
</属性>
<属性>
<名称>YARN . nodemanager . env-whitelist</名称>

值【JAVA _ JAVA

删除密码要求

在进入下一步之前,检查您是否能够在没有密码的情况下进行 ssh,以防止格式化 NameNode 时出现意外结果。

$ ssh localhost

如果这没有返回上次登录时间,请使用以下命令来消除插入密码的需要。

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys

格式化 NameNode

$ cd /usr/local/cellar/hadoop/3.2.1/libexec/bin
$ hdfs namenode -format

一条警告将告诉您正在创建日志目录。系统将提示您重新格式化存储目录根目录中的文件系统。说出 Y 并按下返回

运行 Hadoop

$ cd /usr/local/cellar/hadoop/3.2.1/libexec/sbin
$ ./start-all.sh
$ jps

运行 jps 后,您应该确认 Hadoop 的所有部分都已安装并运行。您应该会看到类似这样的内容:

66896 ResourceManager
66692 SecondaryNameNode
66535 DataNode
67350 Jps
66422 NameNode67005 NodeManager

打开 web 浏览器查看当前会话的配置。

http://localhost:9870

关于您当前 Hadoop 会话的信息。

关闭 Hadoop

全部完成后关闭 Hadoop。

$ ./stop-all.sh

我希望这篇短文已经帮助你克服了在 macOS 机器上安装 Hadoop 的障碍!

请在 LinkedIn 上联系我!

如何在有 GPU 支持的 Ubuntu 18.04 LTS 上安装 tensor flow 2.1:Nvidia 驱动,CUDA 10,cuDNN

原文:https://towardsdatascience.com/installing-nvidia-drivers-cuda-10-cudnn-for-tensorflow-2-1-on-ubuntu-18-04-lts-f1db8bff9ea?source=collection_archive---------6-----------------------

为深度学习系列提升您的 PC——第 4 部分

介绍

在本系列的第 1 部分中,我讨论了如何升级你的电脑硬件来整合 CUDA Toolkit 兼容图形处理卡,我安装了一个 Nvidia GTX 1060 6GB。本系列的第 2 部分讲述了在 Windows 10 上安装 CUDA、cuDNN 和 Tensorflow。在第 3 部分中,我从我的电脑上删除了 Windows 10,并从一张可启动的 DVD 上安装了 Ubuntu 18.04 LTS。

在本系列的第 4 部分,我正在为 Nvidia GPU 安装驱动程序,这些驱动程序与我希望安装在 Ubuntu 18.04 上的 CUDA Toolkit、cuDNN 和 Tensorflow 版本兼容,即 tensor flow 2.1——这需要 CUDA 10.1 或更高版本。在这样做的时候,在我的情况下,这也涉及到处理我的当前安装的 Nvidia 驱动程序、CUDA、cuDNN 和 Tensorflow(细节在步骤 1 中列出)。

步骤 1:检查要安装的驱动程序和软件版本是否与 Tensorflow 2.1 兼容

您选择的 Tensorflow 版本将决定 CUDA、cuDNN、编译器、工具链的兼容版本以及要安装的 Nvidia 驱动程序版本。因此,在安装 Nvidia 驱动程序、CUDA、cuDNN 以及 Tensorflow 2.1 之前,我会"先想好最终目标",首先检查与我的 Tensorflow 目标版本兼容的正确软件版本。

根据 Tensorflow 网站CUDA 安装指南:

  • NVIDIA GPU 驱动程序— CUDA 10.1 要求 418.x 或更高版本。
  • CUDA 工具包 — TensorFlow 支持 CUDA 10.1 (TensorFlow > = 2.1.0)。Tensorflow 1.13 及以上需要 CUDA 10。我希望能够在 1.13-2.1 之间安装各种版本的 Tensorflow(带 GPU 支持),因此 CUDA 10.1 是绝对需要的
  • CUPTI (附带 CUDA 工具包)
  • g++编译器和工具链
  • cuDNN SDK ( > = 7.6)
  • (可选) TensorRT 6.0 提高某些模型上推理的延迟和吞吐量。

当我之前在这台 Ubuntu 18.04 机器上安装 Tensorflow 时,只有 Tensorflow 1.12/CUDA 9 可用,CUDA 10 还不兼容 Tensorflow。因此,在完成下面的新步骤之前,我已经在该计算机上安装了以下内容:

  • Tensorflow 版本 1.12
  • CUDA 工具包版本 9.0
  • 7.2 版 cuDNN,Tensorflow 版需要
  • gcc 和 g++编译器和工具链
  • NVIDIA GPU 驱动程序 390.132 (CUDA 9.0 需要 384.x 或更高版本)

步骤 2:CUDA 安装前:检查现有安装

在开始 CUDA 下载和安装之前,请在 Nvidia CUDA 网站上进行建议的检查此处:

  • 验证系统是否具有支持 CUDA 的 GPU
  • 验证系统运行的是支持的 Linux 版本。
  • 验证系统是否安装了 gcc。
  • 验证系统是否安装了正确的内核头文件和开发包。

步骤 2.1:检查系统是否有支持 CUDA 的 GPU

在 Ubuntu 终端中运行以下命令来检查您的图形卡(GPU):

lspci | grep -i nvidia

图 2.1:检查安装的图形卡(GPU)版本

如果您的显卡来自 NVIDIA,并且在此处列出,则您的 GPU 支持 CUDA。

步骤 2.2:检查您即将安装的 CUDA 是否支持您的 linux 版本

使用以下命令检查您的系统版本:

uname -m && cat /etc/*release

图 2.2:使用终端检查系统版本

当您获得与您系统版本相关的结果时,您可以查看 CUDA 在线文档以确保该版本受支持。

步骤 2.3:检查 gcc 安装

gcc --version

图 2.3:检查 gcc 安装(CUDA 所需)

步骤 2.4:检查 Ubuntu 系统是否有正确的内核头文件,开发包是否已安装

您的系统正在运行的内核版本可以通过运行以下命令找到:

uname -r

图 2.4:检查系统的内核头

对于 Ubuntu,当前运行的内核的内核头文件和开发包可以安装在:

# my current kernel header is 4.15.0-99-generic, yours may differ
uname_r =”4.15.0-99-generic” 
sudo apt-get install linux-headers-${uname_r}

图 2.5:为当前运行的内核安装内核头文件和开发包

步骤 2.5:检查任何当前的 Nvidia 驱动程序

您还可以通过运行“nvidia-smi”命令来检查您当前使用的 Nvidia GPU 驱动程序(如果有),您可以看到,最初,我使用的是 Nvidia 驱动程序 390.132:

图 2.6:开始升级前运行命令检查当前 GPU 驱动程序

步骤 3:下载 NVIDIA 软件包仓库

接下来,下载 Nvidia 软件包库。这些命令基于来自 Tensorflow 网站的添加 Nvidia 包存储库的指令。从下载 CUDA 10.1 开始。deb 文件,方法是在 Ubuntu 18.04 机器上的 bash 终端中键入以下内容:

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.1.243-1_amd64.deb

图 3.1:下载 CUDA 10.1。deb 文件

接下来,拿钥匙:

sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub

图 3.2:从 Nvidia 网站获取密钥

然后安装 CUDA 10.1。64 位 Ubuntu 18.04 的 deb 文件:

sudo dpkg -i cuda-repo-ubuntu1804_10.1.243-1_amd64.deb 

图 3.3:安装 CUDA 10.1 deb 文件

运行更新软件包命令下载各种软件包的更新版本:

sudo apt-get update

图 3.4:更新软件包命令以获得最新版本

获取更多适用于 CUDA 10.1 的 Nvidia 软件包库(根据 Tensorflow 网站上的命令):

wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb

图 3.5:获取更多的 Nvidia 软件包库

一旦下载了 Nvidia 软件包库,安装 Nvidia。带权限的 deb 包(sudo):

sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb

图 3.6:安装。带权限的 deb 包

并再次更新软件包:

sudo apt-get update

图 3.7:再次更新软件包

步骤 4:安装 NVIDIA 驱动程序版本 430

我已经安装了 NVIDIA 驱动程序版本 390;安装 nvidia 驱动程序版本 430。

sudo apt-get install --no-install-recommends nvidia-driver-430

图 4.1:首次尝试安装 nvidia 驱动程序 430

我得到消息说我的系统有未满足的依赖项,因此我通过使用以下命令删除 PPA 来解决这个问题(注意:-r 表示删除):

sudo apt-add-repository -r ppa:graphics-drivers/ppa 

图 4.2:删除 PPA 的命令

确保包列表是最新的:

sudo apt update

删除所有现有的 nvidia 驱动程序:

sudo apt-get remove --purge '^nvidia-.*'

图 4.3:删除现有的 nvidia 驱动程序

然后尝试重新安装 Nvidia 驱动程序版本 430:

sudo apt-get install --no-install-recommends nvidia-driver-430

全新的 Nvidia 版本 430 驱动程序安装给出了下面的输出,并成功完成。

图 4.4:NVIDIA 驱动程序版本 430 的全新安装

一旦你安装了 nvidia 驱动 430,关闭并重启你的电脑。

步骤 5:检查新的 Nvidia GPU 驱动程序安装

在 bash 终端中使用以下命令检查新的 GPU 驱动程序是否可见:

nvidia-smi

该命令的输出如下所示,将确认新的 Nvidia 驱动程序版本是 430.50。请注意,CUDA 版本现在是 10.1(如上所述):

图 5.1:检查 Nvidia 驱动程序 430.50 是否已成功安装

步骤 6:安装 CUDA 10.1 和 CuDNN 开发和运行时库

为了安装 CUDA 和 cuDNN 开发和运行时库,Tensorflow 安装页面建议使用以下命令:

第一,安装 CUDA 10.1 运行时,下载、解压缩和安装大约需要 20-30 分钟:

# Install development and runtime libraries (~4GB)
sudo apt-get install --no-install-recommends cuda-10-1 

图 6.1:安装 CUDA 10.1(显示终端输出的第一部分)

请注意,在终端打印输出中,有一个“重新启动计算机并验证 NVIDIA 图形驱动程序是否可以加载”的指令(图 6.2)。

图 6.2:重新启动计算机并验证 NVIDIA 图形驱动程序的说明

安装信息如下所示(图 6.3)

图 6.3:完成 CUDA 10.1 的安装

第 7 步:重新启动计算机(按照上述说明)并检查驱动程序版本

重启计算机(按照图 6.2 中的说明)。重新启动后,运行以下命令再次检查驱动程序的安装:

nvidia-smi

图 7.1:安装/更新驱动程序后检查已安装的 Nvidia 驱动程序

请注意,重启后,NVIDIA 驱动程序(意外地)升级到版本 440.64.00,CUDA 版本从版本 10.1 升级到版本 10.2,,如图 7.1 所示。因此,我为 CUDA 10.2 选择了合适的 cuDNN 用于下面的说明。

步骤 8:为 Ubuntu 18.04 下载 CuDNN

你可以从这里下载 cuDNN。以下是我下载 cuDNN 文件的步骤。

图 8.1:可以下载 cuDNN 的 Nvidia 网站截图

您必须注册才能下载 cuDNN(免费),登录截图如图 8.2 所示:

图 8.2:截图来自 Nvidia 网站:下载 cuDNN 必须登录

登录后,您将进入 cuDNN 下载页面:

图 8.3:登录 Nvidia cuDNN 网站时可用的 cuDNN 下载选项

要获得 v.7.6.4 或任何其他稍旧的 cuDNN 版本,请单击图 8.3 所示的“存档的 cuDNN 版本”。由于我的机器上似乎安装了 CUDA 10.2(而不是 CUDA 10.1),所以我为 CUDA 10.2 选择了合适的 cuDNN 库。这是 cuDNN 版本 7.6.5:

图 8.4:Nvidia cud nn 网站截图——下载 cuDNN 7.6.5 时不同操作系统的选项

从图 8.4 中,从列表中选择以下三项:

  • Ubuntu 18.04 的 cuDNN 运行时库(Deb)
  • 适用于 Ubuntu 18.04 的 cuDNN 开发人员库(Deb)
  • 适用于 Ubuntu 18.04 (Deb)的 cuDNN 代码示例和用户指南—可选

这给出了以下内容。要下载的 deb 包:

图 8.5:Ubuntu 的 cuDNN 运行时库。deb 包

图 8.6:Ubuntu 18.04 的 cuDNN 开发者库。deb 下载

图 8.7:Ubuntu 18.04 的 cuDNN 代码样本和用户指南。deb 下载

步骤 9:为 Ubuntu 18.04 安装 CuDNN

为了安装 cuDNN,说明可从 tensorflow 网站获得一些说明,更详细的 cuDNN 库命令见 cuDNN 安装指南。下面是一个截图:

图 9.1:Nvidia 网站上 cuDNN 安装指南的截图

# change directory to where the cuDNN runtime library is downloaded 
cd ~/Downloads# Install cuDNN runtime library
sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.2_amd64.deb# Install cuDNN developer library
sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.2_amd64.deb# (optional) install code samples and the cuDNN library documentation
sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.2_amd64.deb

图 9.2:安装 cuDNN 运行时库

图 9.3:安装 cuDNN 开发人员库

图 9.4:安装代码示例和 cuDNN 库文档

步骤 10:测试 cuDNN 安装

在第 9 步下载了与 cuDNN 相关的内容之后,第 10 步将测试新的 cuDNN 安装。测试 cuDNN 安装的命令包含在 cuDNN 安装指南中:

图 10.1:验证 cuDNN 安装的步骤截图,在这里找到了

应用 cuDNN 安装指南中的,通过编译位于/usr/scr/cudnn_samples_v7 中的 mnistCUDNN 示例(由 Debian 安装)来验证 cuDNN 是否已正确安装和运行。deb)文件。

当您安装了。deb 文件,您可以通过转到/usr/src 文件夹找到下面的示例,在那里您可以看到“cudnn_samples_v7”(图 10.1):

图 10.2:将目录更改为“/usr/src/”,其中可以找到 cudnn_samples_v7

然后将 cudnn_samples_v7 文件夹复制到 home,如图 10.1 所示:

图 10.3:将 cuDNN v7 示例从那里复制到主文件夹

将 samples 文件夹复制到主文件夹(您可以在那里运行它们)后,将目录切换到 mnistCUDNN 文件夹,并运行以下代码来编译 mnistCUDNN 示例:

make clean && make

该命令的输出如图 9.8 所示:

图 10.4:编译 mnistCUDNN 示例后的输出

然后使用以下命令在 mnishCUDNN 文件夹中运行 mnistCUDNN 示例:

./mnistCUDNN

图 10.5:运行 mnistCUDNN 示例后的输出——“测试通过!”

当您运行 mnistCUDNN 示例时,成功的运行应该以“Test passed!”连同分类结果,如图 10.4 所示。

步骤 11:下载 Tensorflow RT

作为软件需求的一部分列出的最后一个包是 可选的 Tensorflow RT,可以下载并安装该包,“以提高某些模型上推理的延迟和吞吐量”。

Tensorflow RT 的安装说明在 Tensorflow 自己的网站这里有概述,但是关于不同操作系统的 tensorflow RT 安装的更详细的说明和更清晰的信息,包括我正在使用的 Linux Debian,可以在这里找到

图 11.1:从深度学习 sdk 文档安装 TensorRT 的说明

点击图 11.1 中的“下载”将带您进入图 11.2 所示的屏幕截图页面(注意,您必须免费注册 cuDNN,并使用您在上面 cuDNN 中使用的 Nvidia 开发人员凭据再次登录,以便下载 TensorRT):

图 11.2:登录并下载 TensorRT

这将带您进入下一页(图 11.3),其中显示了可用的 TensorRT 版本。按照步骤 1 中 Tensorflow 的建议,我选择下载 TensorRT 6。

图 11.3:选择要下载的 tensort 版本(我选择了 TensorRT 6)

选择 TensorRT 6.0 后,这提供了更多下载选择,如图 11.4 所示:

图 11.4:各种 Ubuntu 和 CUDA 版本的 TensorRT 选择

我将为 Ubuntu 1804 和 CUDA 10.2 选择 TensorRT 6.0.1.8 GA。deb 本地回购包(在上面的步骤中,我的系统从 10.1 升级到了 CUDA 10.2)。

图 11.5:为 Ubuntu 1804 和 CUDA 10.2 下载坦索特 6.0.1.8 GA。债券本地回购包

您可以检查已安装的 CUDA 版本,如下所示:

图 11.6:检查已安装的 CUDA 版本

图 11.6 显示我有 CUDA 9.0,CUDA 10.1,CUDA 10.2 (CUDA 10.2 是最后安装的)。基于这篇名为 MultiCUDA : 一机多版本 CUDA的优秀文章,多个版本的 CUDA 可以并存。它说“安装多个版本不会导致任何以前的版本被覆盖,所以没有必要担心。您安装的每个版本都将覆盖导致操作系统使用某个版本的配置,但是默认情况下,它们都按照版本号安装在/usr/local 下的单独目录中。

因此,我保留了 CUDA 的所有三个版本——首先将使用 CUDA 10.2。

步骤 12:安装 Tensorflow RT

安装 Tensorflow RT 的注意事项在 Nvidia 网站这里

图 12.1:为 Debian 安装 TensorRT 指令(。deb 文件)——在这里找到了

我正在安装。Tensorflow RT 的 deb 版本,如上图 12.1 所示,自动安装依赖项。安装 Tensorflow RT 的版本独立说明如下:

os=”ubuntu1x04”
tag=”cudax.x-trt7.x.x.x-ea-yyyymmdd”
sudo dpkg -i nv-tensorrt-repo-${os}-${tag}_1-1_amd64.deb
sudo apt-key add /var/nv-tensorrt-repo-${tag}/7fa2af80.pub

sudo apt-get update
sudo apt-get install tensorrt

的。我下载的 TensorRT 的 deb 文件是“NV-tensor rt-repo-Ubuntu 1804-cuda 10.2-TRT 6 . 0 . 1 . 8-ga-2019 11 08 _ 1–1 _ amd64 . deb”,我已经下载到“下载”中。

对于我的操作系统和 CUDA“标签”,这些安装说明变成:

# change directory to where you have downloaded the .deb file 
# (in my case, downloads)
cd ~/Downloads# specific instructions for nv-tensorrt-repo-ubuntu1804-cuda10.2-trt6.0.1.8-ga-20191108_1–1_amd64.deb os=”ubuntu1804”
tag=”cuda10.2-trt6.0.1.8-ga-20191108”
sudo dpkg -i nv-tensorrt-repo-${os}-${tag}_1-1_amd64.debsudo apt-key add /var/nv-tensorrt-repo-${tag}/7fa2af80.pub

转到下载文件夹并安装 TensorflowRT。deb 文件显示在图 12.2 的终端中。

图 12.2:运行 TensorRT 包

图 12.3:为 TensorRT 安装添加密钥

添加 TensorRT 安装的密钥后,最后,更新软件包,并安装 Tensor RT。这将需要几分钟时间。在 tensor RT 安装过程中,系统会提示您输入“y/n”答案,您可以通过在安装命令中添加一个“-y”标志来预先设置。

sudo apt-get update#install tensor rt - optionally add a '-y' flag at the end of the command below to pre-empt the prompt sudo apt-get install tensorrt -y

图 12.4:安装 TensorRT

根据此处的指令,使用以下命令:

sudo apt-get install python3-libnvinfer-dev

图 12.5:安装 python3-libnvinfer-dev 包(TensorRT 的一部分)

如果您计划将 TensorRT 与 TensorFlow 一起使用,请运行以下命令:

sudo apt-get install uff-converter-tf

图 12.6:运行命令以使用 Tensorflow 启用 TensorRT

使用以下命令验证 TensorRT 安装

dpkg -l | grep TensorRT

图 12.7:检查 TensorRT 安装

步骤 13:安装 Tensorflow(推荐:在虚拟环境中安装)

到目前为止,我执行的每一个安装步骤(如上所述)都是系统范围的安装。您 可以 在类似的系统范围基础上安装 Tensorflow,但更可取的是 将其安装在虚拟环境 中,这样它会在无意中安装/卸载(或通常干扰)其他包时停止您的 Tensorflow 安装。

这一步使用命令行和 Pycharm IDE 在新的虚拟环境中进行安装,但是您可以使用自己喜欢的方法创建一个虚拟环境。在虚拟环境中安装 Tensorflow 2 的命令是这里是。从 Tensorflow 版本[X]开始,CPU 和 GPU 支持的版本没有单独的安装命令。

步骤 13.1:用虚拟环境建立一个新的 Pycharm 项目

我在 Pycharm 中创建了一个说明性的项目来展示虚拟环境的最初创建。Pycharm 的版本是社区版 2020.1.1。

首先在 Pycharm 中创建一个新的(演示)项目,使用 File -> New Project,如图 13.1 所示

图 13.1:在 Pycharm 中创建新项目

这将产生一个在虚拟环境中创建项目的窗口,如图 13.2 所示

图 13.2:使用 Pycharm 在虚拟环境中创建新项目

图 13.2 中的窗口给出了命名新项目的选项。如果您单击“项目解释器”左侧的箭头,它会提供如图 13.3 所示的选项。

图 13.3:在 pycharm 中设置新的环境设置

在位置框中将项目命名为“example_tf_2”会对窗口进行更改,如图 13.4 所示

图 13.4:创建一个名为 example _ TF _ 2(tensor flow 2 的缩写)的新项目

当您单击“创建”来创建新项目时,会出现图 13.5 所示的窗口:

图 13.5:显示新项目的选项

我选择“attach ”,将这个新项目添加到我已经打开的 Pycharm 中其他项目的下拉列表中。这将创建一个名为“example_tf_2”的新项目文件夹;请注意,它有一个“venv”文件夹。

图 13.6:py charm 中的新项目结构,包括 venv 文件夹

在 Pycharm 查看器(终端)的底部窗口中,将目录更改为相关目录(在本例中,新的项目目录是“example_tf_2”)。)

图 pycharm 中的终端显示了到新 example_tf_2 项目的路径

在命令行中使用以下命令激活新的虚拟环境(称为“venv”):

source venv/bin/activate 

如果你把你的虚拟环境叫做别的东西,比如‘myvenv’,那么相应的命令将改为:

source myvenv/bin/activate

当您运行激活命令时,命令行开始显示“(venv)”,这意味着虚拟环境已经被激活。

图 13.8:在 Pycharm 上激活终端内的虚拟环境

步骤 13.2:在虚拟环境中安装 Tensorflow 2

要在此虚拟环境中安装 Tensorflow,请在命令行窗口中运行以下 pip 命令(在 Pycharm 或您自己的终端中):

# choosing 'tensorflow' without specifying the version installs the # latest stable version of tensorflow (here, version 2.1.0)
# the command prompt should read something like:
# (venv) /your/particular/path$
# installs latest stable version of tensorflow, with GPU or CPU supportpip install tensorflow

图 13.9:使用 Pycharm 中的终端在新的虚拟环境中安装 Tensorflow 2.1

在虚拟环境中完成 Tensorflow 2.1.0 的安装后,终端将返回到命令提示符“$”:

图 13.10:在虚拟环境中安装 Tensorflow 2.1 后,终端返回到命令提示符$处

步骤 14:检查 Tensorflow 和 GPU 支持的安装是否正确

要测试您的 Tensorflow 安装对 CUDA 的支持,以及 Tensorflow 是否找到了您的 GPU 设备,首先在命令行中键入“python”从终端调用 Python:

python

通过在虚拟环境的命令行中键入“python”来调用由“> > >”表示的 python 命令提示符

命令提示符应该从“$”更改为“> >”。然后导入 Tensorflow,之后您可以在 shell 中运行构建测试:

# import tensorflow package 
import tensorflow as tf# test that tensorflow has been built with cuda
tf.test.is_built_with_cuda()

这将返回输出“True”。

为了检查 Tensorflow 找到的 GPU,您可以使用以下命令列出这些 GPU:

tf.config.list_physical_devices(‘GPU’)

Tensorflow 应该输出类似上面示例的内容—名称和设备类型。

最后,您可以使用 Tensorflow 网站上显示的命令来验证安装(从标准命令提示符“$”)。注意:如果您有 python 命令提示符("> > >"),并且希望返回到标准 shell 命令提示符(" $ "),请按 CTRL+ Z。

以下命令导入 Tensorflow 并执行计算,例如:

python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

这将输出关于您的 GPU 和已安装的软件包的信息,以及测试函数的输出。

关于 Keras 和张量流的结论和注记

本文列出了我用来安装新的 Nvidia 驱动程序 CUDA、cuDNN 和 TensorRT(可选)的过程,所有这些都是在我的 Ubuntu 18.04 机器上使用 Tensorflow 2 和 GPU 支持的前兆。

以前我一直使用独立 Keras 和 Tensorflow 后端。现在有了 Tensorflow 2.0 及以上版本,keras 被包含在“tf.keras”形式中,所以不再需要单独安装 Keras(虽然我假设你仍然可以)。

Tensorflow Keras (tf.keras)似乎有许多与独立 Keras 相同的功能,tf.keras 的指南可以在这里找到。

该指南声明[tf.keras](https://www.tensorflow.org/api_docs/python/tf/keras)可以运行任何 Keras 兼容的代码,但是请注意:

  • 最新 TensorFlow 版本中的[tf.keras](https://www.tensorflow.org/api_docs/python/tf/keras)版本可能与 PyPI 的最新keras版本不同。检查[tf.keras.**version**](https://www.tensorflow.org/api_docs/python/tf/keras#__version__)
  • 保存模型的权重时,[tf.keras](https://www.tensorflow.org/api_docs/python/tf/keras)默认为检查点格式。传递save_format='h5'以使用 HDF5(或者传递一个以.h5结尾的文件名)。

这篇文章也发表在https://schoolforengineering.com上,可以在这里找到。

安装 TensorFlow

原文:https://towardsdatascience.com/installing-tensorflow-bcbe6ef21213?source=collection_archive---------34-----------------------

这并不像你可能听说的那样困难

朋友不让朋友从源头建 TF。来源

我看到越来越多的文章认为安装 TensorFlow 很困难。从源代码构建 TensorFlow 肯定不适合胆小的人,但是安装 TensorFlow 用于您的下一个 GPU 加速的数据科学项目可以在一行中完成(如果您使用正确的工具)。

一条线的解决方案

使用 Conda (+pip),您可以在一行中安装支持 GPU 的最新版本 TensorFlow。

conda create --name tensorflow-22 \
    tensorflow-gpu=2.2 \
    cudatoolkit=10.1 \
    cudnn=7.6 \
    python=3.8 \
    pip=20.0

如果你以前从未使用过 Conda (+pip),我推荐你看看《Conda 入门》。

我的首选解决方案

如果您只想快速启动并运行 TensorFlow 2.2 的一些新功能,上面的一行解决方案非常有用,如果您正在使用 TensorFlow 2.2 启动一个新项目,那么我建议您为您的项目创建一个environment.yml文件,然后将 Conda 环境作为子目录安装在项目目录中。

在项目目录中创建一个 environment.yml 文件

name: nullchannels:
  - conda-forge
  - defaultsdependencies:
  - cudatoolkit=10.1
  - cudnn=7.6
  - nccl=2.4
  - pip=20.0
  - python=3.8
  - tensorflow-gpu=2.2

在您的项目目录中安装 Conda 环境

conda env create --prefix ./env --file environment.yml --force

要了解更多 Conda“最佳实践”,我建议查看使用 Conda 管理您的数据科学项目环境的

使用 Conda (+pip)的好处

使用 Conda (+pip)安装 TensorFlow 有很多好处。最重要的是,不需要手动安装英伟达 CUDA 工具包,cuDNN,或英伟达集体通信库(NCCL)。将 TensorFlow 安装到虚拟 Conda 环境中,而不是在系统范围内安装,可以避免接触系统 Python,并允许您在机器上安装多个版本的 TensorFlow(如果需要)。最后,如果你选择使用我的首选方法,你也将拥有一个environment.yml,你的同事和同行可以使用它在他们的机器上重建你的 Conda 环境,或者你可以使用它在公共云上重建你的 Conda 环境,比如 AWS、GCP、微软 Azure。

在 Ubuntu 20.04 中安装 TensorFlow GPU

原文:https://towardsdatascience.com/installing-tensorflow-gpu-in-ubuntu-20-04-4ee3ca4cb75d?source=collection_archive---------0-----------------------

安装 TensorFlow GPU 及其必备包的简短指南

同时发布在https://afagarap . works/2020/07/26/installing-TF-GPU-Ubuntu 2004 . html

当 Ubuntu 发布长期支持(LTS)版本时,我通常会等待一段时间再升级,主要是因为我在等待 CUDA 和 cuDNN 对新版本的支持。这一次,我只用了三个月就从 Ubuntu 18.04 迁移到了 Ubuntu 20.04——嗯,技术上来说是基于 Ubuntu 的发行版,也就是 Regolith Linux 。我这样做的决定只是因为我将我的 SSD 从 120GB 升级到 1TB,所以我也迁移到了一个不同的操作系统——尽管只是一个 Ubuntu 的衍生物

照片来自 Pixabaygeordie_strike

正如我预料的那样,我花了一段时间来适应我的新系统。幸运的是,我在网上看到了一些有用的答案,现在我在他们的答案上增加了一些解释。所以,这个帖子实际上是基于 meetnicksingrium这个相关问题中给出的答案。

Ubuntu 20.04 中 TensorFlow GPU 的安装可以总结为以下几点,

  • 通过安装nvidia-cuda-toolkit来安装 CUDA 10.1。
  • 安装与 CUDA 10.1 兼容的 cuDNN 版本。
  • 导出 CUDA 环境变量。
  • 安装带 GPU 支持的 TensorFlow 2.0。

安装 CUDA 10.1

首先,通过转到“附加驱动程序”,确保您使用的是 NVIDIA 专有驱动程序,然后选择合适的驱动程序,即对于 CUDA 10.1,所需的驱动程序版本是≥ 418.39 。我们使用专有版本而不是开源版本,因为 CUDA 只能使用专有驱动

我们正在安装 CUDA 10.1,因为它是与 TensorFlow GPU 兼容的版本。

图片由作者提供。为 CUDA 10.1 选择合适的专有驱动程序版本,即≥ 418.39。

在撰写本文时,还没有适用于 Ubuntu 20.04 的 CUDA 10.1,但正如 meetnick 在引用的 Ask Ubuntu 帖子中指出的那样,安装nvidia-cuda-toolkit也会安装 CUDA 10.1。

图片由作者提供。 CUDA 工具包存档

为了啰嗦起见,Ubuntu 20.04 不要尝试使用 18.10 或 18.04 CUDA 10.1。我是吃了苦头才知道的,哈哈!

所以,你可以在 Ubuntu 20.04 中安装 CUDA 10.1,

$ sudo apt install nvidia-cuda-toolkit

安装 CUDA 10.1 后,运行nvcc -V。然后,您将得到与下面类似的输出,以验证您是否成功安装,

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Sun_Jul_28_19:07:16_PDT_2019
Cuda compilation tools, release 10.1, V10.1.243

与 Ubuntu 18.04(我来自的地方)不同,CUDA 在 20.04 中安装在不同的路径中,即/usr/lib/cuda——你可以通过运行,

$ whereis cuda
cuda: /usr/lib/cuda /usr/include/cuda.h

在 Ubuntu 18.04 中,你可能知道,CUDA 安装在/usr/local/cuda或者/usr/local/cuda-10.1中。

安装 cuDNN

安装 CUDA 10.1 后,现在可以从这个链接下载安装 cuDNN 7.6.5。然后,选择“下载 cuDNN”,你会被要求登录或创建一个 NVIDIA 帐户。登录并接受 cuDNN 软件许可协议的条款后,您将看到可用 cuDNN 软件的列表。

点击“CUDA 10.1 下载 cud nn v 7 . 6 . 5(2019 . 11 . 5)”,然后选择“cuDNN Library for Linux”下载 cuDNN 7.6.5 for CUDA 10.1。下载 cuDNN 后,通过运行,

$ tar -xvzf cudnn-10.1-linux-x64-v7.6.5.32.tgz

接下来,将提取的文件复制到 CUDA 安装文件夹中,

$ sudo cp cuda/include/cudnn.h /usr/lib/cuda/include/
$ sudo cp cuda/lib64/libcudnn* /usr/lib/cuda/lib64/

设置 cuDNN 的文件权限,

$ sudo chmod a+r /usr/lib/cuda/include/cudnn.h /usr/lib/cuda/lib64/libcudnn*

导出 CUDA 环境变量

TensorFlow 需要 CUDA 环境变量来支持 GPU。要设置它们,我们需要通过运行,

$ echo 'export LD_LIBRARY_PATH=/usr/lib/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
$ echo 'export LD_LIBRARY_PATH=/usr/lib/cuda/include:$LD_LIBRARY_PATH' >> ~/.bashrc

通过运行以下命令加载导出的环境变量:

$ source ~/.bashrc

安装 TensorFlow 2.0

安装好必备包后,最后就可以安装 TensorFlow 2.0 了,

$ pip install tensorflow==2.2.0

默认情况下,tensorflow包现在包含了 GPU 支持,而过去我们需要专门安装tensorflow-gpu

通过运行以下命令验证 TensorFlow 可以检测到您的 GPU,

>>> import tensorflow as tf
>>> tf.config.list_physical_devices("GPU")
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

如果事情进展顺利,应该会有类似的输出。

您现在可以享受使用 TensorFlow 进行深度学习项目了!万岁!

如果你正在寻找一个 TensorFlow 项目,也许你会发现我的博客在 TensorFlow 2.0 中实现自动编码器很有趣!

另外,如果你喜欢这篇文章,也许你也会喜欢我的其他博客!

[## 我怎么能相信你?

关于信任分数的直觉和指南

medium.com](https://medium.com/@afagarap/how-can-i-trust-you-fb433a06256c) [## 使用梯度噪声添加避免消失梯度问题

添加梯度噪声改善了深度神经网络的学习。

towardsdatascience.com](/avoiding-the-vanishing-gradients-problem-96183fd03343) [## 在 PyTorch 中实现自动编码器

构建用于重建的自动编码器模型

medium.com](https://medium.com/pytorch/implementing-an-autoencoder-in-pytorch-19baa22647d1)

实例硬度阈值:一种解决不平衡分类问题的欠采样方法

原文:https://towardsdatascience.com/instance-hardness-threshold-an-undersampling-method-to-tackle-imbalanced-classification-problems-6d80f91f0581?source=collection_archive---------35-----------------------

从多数类中移除“困难”样本

卡洛斯·埃斯特韦斯在 Unsplash 上拍摄的照片|钻石是坚硬的——样品也可能是坚硬的

如果你认真看过吴恩达在 Coursera 上的深度学习课程,你可能就知道错误分析需要什么了。Andrew 提倡在确定需要改进的地方并相应地修改系统之前,快速构建第一个工作系统。找出分类系统改进领域的一种方法是通过对错误分类样本的研究。对于 Andrew 作为例子使用的猫图像分类器,大型猫的图像可能经常被错误分类。在这方面,大猫样本是硬的。

对于机器学习从业者来说,‘硬’这个术语太模糊,无法描述单个样本(即实例)。迈克尔·史密斯、托尼·马丁内斯和克里斯托夫·吉罗德·卡里尔肯定也遇到了这个问题,他们写了一篇名为 数据复杂性的实例级分析 的研究文章。在这篇文章中,他们基于一组选定的学习算法的分类行为,提出了实例难度的经验定义。

为什么要有一套学习算法?作者解释说,样本的错误分类取决于所使用的学习算法以及样本与其对应样本之间的关系。实例硬度的概念是相对的;将在同一实例上应用一组不同且实用的学习算法的结果聚集在一起具有泛化效果。

实例硬度的定义(IH)

史密斯、马丁内兹和吉罗-卡里尔在他们的文章中对 IH 给出了严格的表述。强烈鼓励那些不回避数学符号的人看一看它。

粗略地说,作者事先选择了一组选定的 n 学习算法,并在训练集上逐一应用它们。这样, n 个量词就产生了。对于单个实例(即样本),可以使用指示函数和分类器分数来估计分类器 i 向其分配正确标签的概率pi(I 的范围从 1 到 n) 。取 n 个估计量的 P_i 的平均值,我们得到了正确分类这种情况的可能性。IH,错误分类实例的可能性,因此将是 1 减去这个平均值。

为什么硬实例很难分类

在论文中,作者还继续研究了为什么硬实例很难分类。他们对 19 万个样本的实验结果显示,类别重叠对 IH 的影响最大。

下图举例说明了类别重叠的含义:

左:没有类重叠问题;右图:出现班级重叠(这两张图片是我自己的)

当样本空间中的一个区域包含来自另一个类别的样本时,就会发生类别重叠。重叠样品具有高的实例硬度。当数据集中同时出现类别不平衡和类别重叠时,分类问题变得更加困难。

一举两得——IHT

实例硬度阈值(IHT)是一种欠采样方法,用于通过移除硬样本来缓解类别不平衡。在此基础上,本文提出了一个非均衡学习图书馆 IHT 的实现方案。分类概率低的样本将从数据集中删除。之后,将在欠采样数据的基础上建立模型。

让我们检查一下 imblearn.under_sampling 的关键参数。InstanceHardnessThreshold:

  • 估计器:估计样本 IH 的学习算法。只需要一个估计器,默认算法是随机森林。
  • sampling_strategy :用户并没有真正指定实例硬度的阈值。相反,这里的采样策略更注重结果。当提供浮点数时,它将是 IHT 算法输出的少数类样本与多数类样本的比率。如果提供了一个字符串,相应的类将成为欠采样的目标。用户甚至可以输入一个字典来指定每个类输出的样本数。
  • cv :评估样品实例硬度时使用的交叉验证折叠数。

在现实生活中的一个问题上尝试 IHT:欺诈检测

类似于我之前关于处理不平衡数据集的文章,我将使用来自 kaggle 的信用卡交易数据集来演示使用 IHT 的代码。数据集极度不平衡;在 284,807 笔交易中,只有 492 笔欺诈。80%的事务将从决策树分类器(max_depth=5)中学习,20%的事务将形成测试集。

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(max_depth=5,random_state=42)
dt.fit(X_train, y_train)

决策树应用于测试集时的分类结果

接下来,我们使用分类器 dt 作为估计器来估计样本的 IH。对于使用 IHT 方法进行欠采样,直到多数类与少数类的比率为 0.0019,并计算该变换前后训练集的形状:

from imblearn.under_sampling import InstanceHardnessThreshold
from collections import Counterprint('Original test dataset shape %s' % Counter(y_train))
iht = InstanceHardnessThreshold(estimator=dt, sampling_strategy='majority', random_state=42)
X_train_res, y_train_res = iht.fit_resample(X_train, y_train)
print('Resampled dataset shape %s' % Counter(y_train_res))

类别分布

如上面的输出所示,从多数类中移除了 2328 个样本。少数类样本保持不变。

接下来,将 max_depth 为 5 的决策树拟合到重新采样的数据集:

dt_new = DecisionTreeClassifier(max_depth=5,random_state=42)
dt_new.fit(X_train_res, y_train_res)

分类结果是:

当新的决策树分类器被应用于测试数据集时

新的决策树分类器在分类少数类样本方面具有与旧的相似的能力。然而,更多的正常交易被归类为欺诈,这导致精确度下降。由 IHT 去除的样本可能携带有帮助分类器识别正常交易更好者的信息。

虽然 IHT 对于这个特殊的问题不是很有效,但是希望通过代码片段,那些不熟悉这种欠采样方法的人可以很容易地掌握它。

结论

实例硬度阈值(IHT)是一种相当特殊的欠采样方法,其方法是移除与少数类样本空间重叠的多数类样本。这篇文章介绍了 IHT 的基础知识,并展示了如何实现它来解决不平衡的类问题。

谢谢你读了这个故事!

参考文献

  1. 数据复杂性的实例级分析。马赫学 95,225–256(2014)。https://doi.org/10.1007/s10994-013-5422-z
  2. 不平衡学习库中 InstanceHardnessThreshold 的文档:https://不平衡学习. readthedocs . io/en/stable/generated/imb learn . under _ sampling。instance hardness threshold . html # r 2 bfe 4 eaac 981-1

实例级识别

原文:https://towardsdatascience.com/instance-level-recognition-6afa229e2151?source=collection_archive---------40-----------------------

实例级识别的简介、挑战和最新获奖解决方案。

实例级识别,按作者分类的图像

在这篇博客中,我将介绍实例级识别、用例、挑战、当前可用的数据集,以及这些挑战/数据集的最新成果(最近的获奖解决方案)。

介绍

IinstanceLlevelRecognition(ILR),是一个视觉识别任务,用来识别一个对象的特定实例,而不仅仅是对象类。

例如,如上图所示,painting 是一个对象类,达芬奇的“蒙娜丽莎”是该绘画的一个实例。同样,印度的泰姬陵也是物体类建筑的一个实例。

用例

  • 地标识别:识别图像中的地标。
  • 地标检索:从大规模数据库中检索相关地标图像。
  • 艺术品识别:识别图像中的艺术品。
  • 产品检索:从大规模数据库中检索相关产品图片。

挑战

  • 大规模:识别任务的大多数当前技术水平的结果是在非常有限的类别上测量的,例如 ImageNet 中的大约 1000 个图像类别, COCO 中的大约 80 个类别。但像地标检索和识别这样的用例有 20 万多个类别,例如在谷歌地标数据集 V2 (GLDv2) 中,亚马逊上有 10 万多个产品类别。
  • 长尾 : 很少热门的地方有超过 1000+的图片但是很多不太知名的地方在 GLDv2 中图片少于 5 张。

谷歌地标数据集 v2【gld v2】类别分布,图片来自https://arxiv.org/pdf/2004.01804.pdf

  • 类内可变性:地标大多分布在广阔的区域内,并且具有非常高的类内可变性,如下图所示。

图片来自谷歌地标数据集 v2 (GLDv2)

  • 嘈杂的标签:机器学习模型的成功依赖于高质量的带标签训练数据,因为标签错误的存在会大大降低模型的性能。这些噪声标签如下图所示,不幸的是,噪声标签是大型训练集的一部分,需要额外的学习步骤。

来自 AliProducts 的嘈杂标签。图片来自https://arxiv.org/pdf/2008.11586.pdf

数据集

  • 谷歌地标数据集 V2 (GLDV2) : 谷歌地标数据集 v2 是人工和自然地标领域大规模、细粒度实例识别和图像检索的新基准。下图显示了地标数据集的所有细节

图片来自https://arxiv.org/pdf/2004.01804.pdf

图片来自https://retail vision workshop . github . io/recognition _ challenge _ 2020/

  • 亚马逊产品挑战赛 : 亚马逊产品数据集在 ILR ECCVW 2020 workshop 公布,将于 2021 Q1 发布。由于产品目录图像是由专业人员拍摄的,而查询图像通常是由手机摄像头拍摄的,并且光照条件差,背景杂乱,因此数据集中的图像存在域不匹配。

图片来自https://drive . Google . com/file/d/1 sgsvnvxlhkehajdlmlqbwmwic 9 hll 0 dn/view

结果

下面我将讨论地标识别和产品识别的最新获奖解决方案。

谷歌地标识别

地标识别挑战赛中,任务是从图像中预测地标标签,自 2018 年起每年都进行。下图显示了本次比赛的全球平均精度的进度。

作者图片

2020 年解决方案

建筑

一个集合了 7 个全局描述符的模型( SeResNext101EfficientNet-B3ResNet152 ,Res2Net101)。下图显示了 SeResNext101 主干的设置,对于其他主干,我们也遵循类似的架构。每个主干网络使用广义平均(GeM)池聚合,然后是线性颈(Linear neck)【512, BatchNorm1DPReLU ,最后馈入弧形边缘头

SEResNext101 backbone 的设置,图片来自https://www . ka ggle . com/c/landmark-recognition-2020/discussion/187821

ResNet 变体 (152 & 101)都依赖于识别跳过一层或多层的快捷连接来解决渐变消失的问题。SeResNeXt是 ResNeXt 的变种,是一个初始网的快捷连接, Se 是指 ResNeXt 中增加的挤压和激励模块。Se 网络通过自适应调整特征图的权重来改善信道相关性。 EfficientNet 是一种先进的图像分类网络,它依靠自动机器学习来找出最佳的基础网络和高效的复合缩放,以根据可用的计算资源来实现改进的结果。

颈网络中的广义均值池( GeM ) 计算张量中每个通道的广义均值。如果 p𝑘 → ∞,GeM 表现为最大池,p𝑘 → 1,表现为平均池。随着 p𝑘的增加,汇集的特征地图的对比度增加并聚焦于图像的显著特征。

广义平均池方程。图片来自https://arxiv.org/pdf/1711.02512.pdf

PReLU : PReLU 是 leaky ReLU 的推广,用于解决当数据没有归一化或网络权重没有正确初始化时出现的神经元死亡问题。

ReLU(左)和 PReLU(右)。对于 PReLU,自适应地学习负部分的系数。图片来自https://arxiv.org/pdf/1502.01852v1.pdf

Arc margin 对 softmax loss 进行了改进,通过在半径为 s 的超球面上分布学习嵌入,加强了类内变化的相似性和类间的多样性。下面是 MxNet 上 ArcFace loss 的伪代码。

图片来自 https://arxiv.org/pdf/1801.07698.pdf

培养

重新排名

作为后处理步骤,进行重新排序以惩罚非界标图像,从而改善间隙度量

  • 测试:排行榜测试集。
  • 训练:确定标签和置信度候选图像。
  • 非界标:来自 GLDv2 测试集的无界标图像。

重新排序步骤:

  1. 计算测试图像和训练图像之间的余弦相似度 (A)
  2. 计算训练和非标志图像之间的平均(前 5 或前 10)余弦相似性。 (B)
  3. 计算 Ai,j — Bj
  4. 对同一标签的置信度求和,选取最高的。

后处理重新排序。图片来自https://www . ka ggle . com/c/landmark-recognition-2020/discussion/187821

上述解决方案最重要的一点是使用 2019 年的竞赛测试集作为推理后处理重新排名的验证,并导致排行榜最高得分 0.6598 ,比 2019 年的结果好~ 1.75 倍

CVPR 2020 阿里产品挑战赛

赢家方案

体系结构

骨干网( EfficientNet-B3EfficientNet-B 4、 ResNet50SeResNext50SeResNext101 )用破坏与构造学习(DCL)查看对象(LIO) 方法进行微调。模型平均用于集成所有微调模型,实现 6.27% 的前 1 位错误率。

如下图所示的 DCL 通过洗牌局部区域来学习局部区别区域和特征,从而增强细粒度识别。为了防止网络学习有噪声的模式,提出了一个对抗性的对等体来拒绝区域混淆机制(RCM)引起的不相关的模式。更多详情请查看文件

DCL 网络,图片来自https://trax-geometry . S3 . amazonaws . com/cvpr _ challenge/retail vision _ challenge talk 1 . MP4

LIO 如下图所示,模型结构采用自监督学习。对象范围学习帮助主干网络区分前景和背景。使用自我监督的空间上下文学习加强了主干网络的结构信息。更多细节请查看论文

探究对象(LIO)框架。图片来自https://arxiv.org/pdf/2003.14142.pdf

预处理

所有图像的大小都调整为 256x256,然后随机裁剪为 224x224 用于训练,中间裁剪为 224x224 用于测试。使用以下工具扩充训练数据

培训

所有模型都由一个 SGD 优化器训练,该优化器具有手动学习率衰减功能。

  1. 所有经过基本培训的骨干网络都达到了20–25%的最高错误率。
  2. 所有的主干网络都通过平衡训练进行了微调,实现了9–12%的顶级错误率。如果一个类别中的图像数量少于 30,则平衡训练集也包括来自验证的所有图像。
  3. 在更高分辨率的图像(448x448)上使用 DCL 进一步微调所有主干,进一步将错误率降低1–2%
  4. 如下图所示,使用精度损失对所有网络进行了进一步微调,针对前 1 位错误率进行了优化,将错误率降低了~ 0.2–0.5%

精度损失,图片来自https://trax-geometry . S3 . Amazon AWS . com/cvpr _ Challenge/recognition _ Challenge _ technical _ reports/1st _ _ Winner+Solution+for+AliProducts+Challenge+大规模+Product+Recognition.pdf

def **acc_loss**(y_true, y_pred):
    tp = (y_pred, y_true).sum(1)
    fp = ((1-y_true)*y_pred).sum(1)
    acc = tp/(tp+fp)
    return 1 - acc.mean()

低于 11 个模型用于计算最终概率

  • 平衡微调 resnet50、seresnext50、seresnext101、efficientnet-b3、efficientnet-b4
  • DCL 微调 resnet50,seresnext50
  • 精确损耗微调 resnet50、seresnext50、efficientnet-b3
  • LIO 微调 resnet50

结论

实例级识别将揭示深度学习技术在电子商务、旅游、媒体和娱乐、农业等领域的语义图像分类/检索的真正潜力。高效的实例级解决方案的一些主要构件是

  • 主干网络选择(剩余、挤压和激励、高效网络)
  • 数据扩充(缓冲、自动扩充、剪切等)。
  • 损失函数(ArcFace,AccuracyLoss)。
  • 多尺度处理。
  • 微调和后期处理。

感谢您阅读这篇文章,我希望这对您有所帮助。如果你有,请在你最喜欢的社交媒体上分享,这样其他人也可以找到它。此外,如果有不清楚或不正确的地方,请在评论区告诉我。

参考

  1. https://ilr-workshop.github.io/ECCVW2020/
  2. https://ai . Google blog . com/2020/09/advancing-instance-level-recognition . html
  3. https://drive . Google . com/file/d/1 F9 vzw 1 gtx aohl _ ApA-qdzkaklab 5 cz 6t/view
  4. https://www . ka ggle . com/c/landmark-recognition-2020/discussion/187821
  5. https://trax-geometry . S3 . Amazon AWS . com/cvpr _ Challenge/recognition _ Challenge _ technical _ reports/1st _ _ Winner+Solution+for+AliProducts+Challenge+Large-scale+Product+recognition . pdf

实例分段 Web 应用程序

原文:https://towardsdatascience.com/instance-segmentation-web-app-63016b8ed4ae?source=collection_archive---------25-----------------------

使用 Docker、Flask 和 Detectron2 构建用于实例分割的 Web 应用程序

Detectron2 提供最先进的实例分割模型。训练非常快,而且效果非常好。

模型训练相当简单。那里有很多教程可以帮你。将模型部署到 web 应用程序是另一回事。当我尝试这样做的时候,我没有在网上找到很多帮助。

因此,在这篇文章中,我们将为 detectron2 的实例分段创建一个 web 应用程序。

后端

首先,我们将创建机器学习后端。这将使用基本的烧瓶。我们将从一些相当标准的样板代码开始

这个应用程序将简单地呈现模板index.html。我已经手动指定了端口。

接下来,我们将添加函数来获取图像。我们希望能够上传图像到网站。我们也希望能够提供一个网址和图像将自动下载的网站。我已经创建了如下代码。

这段代码允许我们将图像上传到后端(POST 请求)。或者我们可以提供一个 url 的后端,它会自动下载图像(获取请求)。该代码还将图像转换成一个jpg。我无法用探测器 2 对png图像进行推断。所以我们必须转换成一个jpg

如果代码因为某种原因不能下载图像,它将返回failure.html模板。这基本上只是一个简单的html页面,说明在检索图像时出现了错误。

另外,我指定了一个不同的@app.route。这需要反映在index.html文件中。

前端

现在我将创建前端html代码。这个接口允许用户上传图片或者指定图片的 url。

没什么大不了的。我们创建一个简单的表单,并告诉它链接到@app.route('/detect') flask 代码。我们还需要指定方法。如果用户上传的是图片,那就是 POST。如果用户给我们一个图片的 url,那就是 GET。

failure.html模板甚至更简单。

现在我们可以进入实际的深度学习部分。

在这一部分,我们将得到一个 detectron2 预训练模型来对图像进行推理。然后我们将它链接到我们现有的后端。

这部分稍微复杂一点。我们将创建一个名为Detector的新类。因为我们将创建探测器 2 所需的cfg。然后,我们将创建另一个函数来对图像进行推理。

我将使用在 COCO 数据集上训练的 mask rcnn 预训练模型。它将使用一个 ResNet + FPN 主干。据说这款机型获得了最好的速度/精度权衡

这段代码基本上完成了我们推理所需的一切。我们只需要指定我们下载的预训练模型的路径。

它从模型动物园中自动获取对应于我们的预训练模型的配置。它还应该从模型动物园获得预训练模型。但是我发现这在 docker 中并不奏效——至少对我来说是这样。

下一步是将这个Detector类集成到我们现有的脚本中。

在这段代码中,我添加了我们之前创建的Detector类。我还创建了一个名为run_inference的函数。这是后端将在图像上运行 detectron2 模型的地方。它将接受一个图像路径,并通过我们之前创建的Detector类调用 detectron2 模型。

一旦实例分割完成,run_inference函数将返回一个图像。我不得不对run_inference函数的结果做一些不寻常的事情来让它工作。result_img被粘贴到文件对象中,该文件对象作为 png 返回。不过,可能有更好的方法来做到这一点。

最后一步是为我们的代码创建 docker 容器。然后我们将在本地部署 docker 容器。

谢天谢地,detectron2 已经为我们创建了一个 dockerfile

我基本上使用了 detectron2 的 github repo 中提供的 dockerfile。但是我做了一些改变。

我添加了一个[requirements.txt](https://github.com/spiyer99/detectron2_web_app/blob/master/requirements.txt)文件。我在需求文件中做了一个pip install。安装了一些我们需要的库。我还修改了命令来启动我们之前创建的app.py脚本。这将启动 flask 应用程序并呈现index.html模板。

现在我们可以启动 docker 容器了。我们可以通过以下方式实现这一点:

docker build . -f Dockerfile -t detectron2 &&\
docker run -d -p 8080:8080 detectron2

这将在当前工作目录中构建当前 dockerfile。然后它将在端口 8080 上运行该映像。这是我之前指定的端口。

但问题是,如果你一直运行这些命令,你的电脑上会有太多的 docker 镜像和容器。这会在你的电脑上占据大量的空间。

Jim Hoskins 对此有一个非常优雅的解决方案,我根据自己的目的进行了修改。

我创建了一个不错的 shell 脚本:

  • 停止所有容器
  • 移除未标记的容器
  • 生成新的容器
  • 在端口 8080 上运行容器
  • 显示容器的尾部日志

这个脚本非常有用。

从终端运行这个脚本。它将构建并运行 detectron2 web 应用程序。网络应用应该会出现在你浏览器的localhost:8080上。

作者图片

纳比尔·赛义德Unsplash 上拍摄的源图像

有用!

这方面的代码可以在 github 上找到。

原载于 2020 年 7 月 19 日https://spiyer 99 . github . io

基于掩模 R-CNN 的实例分割

原文:https://towardsdatascience.com/instance-segmentation-with-mask-r-cnn-6e5c4132030b?source=collection_archive---------28-----------------------

使用在 MS COCO 数据集上训练的 Mask R-CNN 的简要指南

对象检测和实例分割—输入图像源共享空间

诸如 YOLO、R-CNN 的目标检测模型帮助我们画出围绕目标的边界框,并且实例分割为我们提供了图像中每个目标的像素级掩模。一个问题可能会出现,为什么我们需要逐像素定位?

如果我们只是在自动驾驶汽车中使用对象检测,那么有可能多辆汽车的边界框重叠,自动驾驶汽车在这种情况下会变得混乱。实例分割可以避免这个缺陷。损伤检测和医学诊断是我想到的一些其他应用,因为知道损伤的程度或脑瘤的大小可能比仅仅检测存在更重要。

相交边界框和非重叠遮罩

在上面的图像中,我们可以看到汽车的边界框是相交的,而类名为“汽车”的蒙版没有相交/重叠。

因此,我们将介绍如何使用掩模 R-CNN(掩模区域 CNN)进行实例分割,然后使用掩模 R-CNN,我们可以获得图像中每个对象的逐个像素位置和边界框坐标。

面具 R-CNN

屏蔽 R-CNN 结合了更快的 R-CNN 和 FCN(全连接网络)以获得除类和盒输出之外的额外屏蔽输出。也就是说,Mask R-CNN 采用相同的两阶段过程,具有相同的第一阶段(即 RPN:区域提议网络)。第二阶段使用 RoIPool 从每个候选框中提取特征,并执行分类和包围盒回归。阅读本文以获得关于 R-CNN 面具的更详细的想法

屏蔽 R-CNN 模型— 来源

我使用了基于 FPN 和 matterport 的 ResNet101 构建的 Mask R-CNN 进行实例分割。该模型在 MS COCO 上进行预训练,这是一个具有 80 个对象类的大规模对象检测、分割和字幕数据集。

在浏览代码之前,确保安装所有需要的包并屏蔽 R-CNN。

安装 Keras 和其他依赖项:

$ pip install numpy scipy keras h5py tensorflow
$ pip install pillow scikit-image matplotlib imutils
$ pip install "IPython[all]"

克隆 GitHub 存储库并安装 Mask R-CNN 的 matterplot 实现

$git clone [https://github.com/matterport/Mask_RCNN.git](https://github.com/matterport/Mask_RCNN.git)
$cd Mask_RCNN
$python setup.py install

注意:如果您已经安装或使用了 tensorflow v2.0 ,那么您在执行脚本时可能会遇到一些回溯错误,因为 Mask R-CNN 使用的是 tensorflow v1.3.0

为了避免这种情况,您可以降级 tensorflow 版本,或者在安装 Mask R-CNN 之前,通过替换以下函数来编辑文件 Mask_RCNN/rcnn/model.py:

  • tf.log()->-tf.math.log()
  • tf.sets.set_intersection()->-
  • tf.sparse_tensor_to_dense()->-tf.sparse.to_dense()
  • tf.to_float()->-

现在,我们开始执行脚本:

第一步:导入所需的包

from mrcnn.config import Config
from mrcnn import model as modellib
from mrcnn import visualize
import cv2
import colorsys
import argparse
import imutils
import random
import os
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

第二步:为每个类标签生成随机颜色。

现在我们创建一个配置,它定义了将在下一步中加载的模型的一些属性。

如果您的 GPU 可以处理变量 IMAGES_PER_GPU,您可以随意增加它的值,否则(在 CPU 的情况下)保持它为 1。

class SimpleConfig(Config):
    # give the configuration a recognizable name
    NAME = "coco_inference"
    # set the number of GPUs to use along with the number of images
    # per GPU
    GPU_COUNT = 1
    IMAGES_PER_GPU = 1
    # number of classes on COCO dataset
    NUM_CLASSES = 81

第四步:创建一个配置类对象,加载模型权重。

您可以从这里下载重量。

config = SimpleConfig()
config.display()
model = modellib.MaskRCNN(mode="inference", config=config, model_dir=os.getcwd())
model.load_weights("mask_rcnn_coco.h5", by_name=True)

步骤五:对任意图像进行正向传递,得到分割输出。

在这一步中,我们通过加载的模型传递一个图像,以便获得带有类标签、边界框坐标和遮罩的输出变量。

image = cv2.imread("<image_path&name>")
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = imutils.resize(image, width=512)
# perform a forward pass of the network to obtain the results
print("[INFO] making predictions with Mask R-CNN...")
result = model.detect([image], verbose=1

步骤六:可视化输出

r1 = result[0]
visualize.display_instances(image, r1['rois'], r1['masks'],   r1['class_ids'], CLASS_NAMES, r1['scores'])

样本输出:

在 COCO 上训练的 Mask R-CNN 模型创建了我同学的像素地图。

面具 R-CNN 视角下的印度拥挤街道

总结这篇文章,我会说实例分割是对象检测的一个进一步的步骤,因为它产生了图像的像素掩码。更快的 R-CNN 计算量很大,我们在 Mask R-CNN 的基础上引入了实例分割。因此,掩模 R-CNN 在计算上变得更加昂贵。这使得 Mask R-CNN 很难在 CPU 上实时运行。

参考文献

明凯·何乔治亚·格基奥萨里彼得·多尔拉罗斯·吉尔希克、马斯克 R-CNN、来源

工具变量:一个实用的解释

原文:https://towardsdatascience.com/instrumental-variables-a-practical-explanation-1a583408a5b9?source=collection_archive---------8-----------------------

简介

在统计分析中,我们很容易忽略预测变量带来的某些问题。也就是说,我们的自变量通常具有直接影响模型结果有效性的潜在属性。

在回归分析中,我们的任务是估计自变量和因变量之间的因果关系。我们假设这种因果关系在整个实验中是一致的。然而,当我们认为这一假设被违反时,我们将使用工具变量(IV)来正确预测给定自变量的“治疗”效果。因此,工具变量被用来提供真实的效果,而不是有偏见的效果。

在这篇博客中,我将通过一个教育回报的例子来说明为什么 IV 估计为统计框架提供了价值。同样重要的是要注意,使用 IVs 并不总是必需的,但是这个博客将会告诉你什么时候是合适的。

为什么使用静脉注射?

有时在回归分析中,我们会忽略一些与相关自变量有内在联系的因素。回归分析的目的是找出自变量对因变量的因果效应,其他条件不变。然而,在现实中,通常情况是,通过增加所述自变量,我们观察到与我们的模型所预测的不同的变化。

约书亚·安格里斯特(Joshua Angrist)在估算基于越南军事参与的工资回报方面的开创性工作显示了一些启发性的结果,即在引擎盖下,像军事参与这样的独立变量是如何不完全提供信息的。安格里斯特发现,虽然许多人是自愿的,但也有许多男性被征召入伍,这对工资回报产生了不同的影响。

因此,安格里斯特将征兵作为一个工具变量,我们期望它与军事参与相关,但与我们的误差项无关,因此与工资无关。通过这种方法,获得了不同的估计数,这些估计数更好地反映了军事参与的真实效果。

解读 OLS 系数

假设我们观察到使用普通最小二乘法(OLS)获得的以下回归:

y = α + βX + ε

在模型预测中,如果我们将 X 增加一个单位,我们将推断出对 y 的以下影响:

δy =β×1

当上述情况不是对 X 增加的真实估计时,就需要使用工具变量。本质上,我试图传达一个信息,独立变量可能与误差项ε相关。

X 与误差项相关时 y 的变化:

δy =β×1+δε

在无偏 OLS 估计中,解释变量不能与误差项相关。解释变量被说成是与误差项相关的外生,不应该能够解释误差。因此,上述独立变量可能与误差相关的情况违反了 OLS 假设,必须以某种方式加以考虑。以这种方式表现的变量被称为内生变量。

你好工具变量

四假设和方法

在解释了为什么我们可能想要使用工具变量之后,我们需要一个工具, Z ,以满足以下假设:

  • 相关性 : Z 可以预测δX 即 cov(Z,X) ≠0
  • 外生性 : Z 与误差项不相关,即 cov(Z,ε) = 0

相关性很重要,因为它本质上说明了我们选择的工具与我们选择的自变量相关

外生性很重要,因为它表明我们的工具与误差项不相关

换句话说,这些假设意味着仪器必须仅通过 X 影响 y ,并且它必须对 X 有一些影响。

图 1:IV 是如何工作的

四申请:返校

在试图确定学校教育的回报时,我们可能会遇到以下回归:

log(工资)= α + βEdu + ε

  • 其中 log(工资)是我们试图预测的结果变量
  • α是某个常数
  • Edu 是一个自变量,它将受教育年限作为一个连续变量
  • ε是误差

我们可以相信 Edu 和我们的误差项有一定的关联。出现此问题可能有几个原因:

  • 家庭背景可能会影响受教育年限
  • 能力可以用智商来衡量,可能会影响受教育的年限

现在,我们可以用其中的一个来控制我们的自变量。我们必须确保它们满足我们的两个假设:相关性和外生性。它必须能够预测 Edu ,并且与误差项不相关。

下一步:2SLS

我们使用两阶段最小二乘法来估计一个新的 Edu 参数,然后将它代入我们的初始回归线。

图 2:两阶段最小二乘法

首先,我们使用家庭背景的工具变量来计算教育的估计值

第二步是将这一估计值代入我们对工资估计值的初始回归中

结果

现在,我们有希望获得一个关于学校教育对工资影响的无偏估计。如果我们相信我们的预测违反了外生性的性质,那么 IV 估计据说比 OLS 估计更有效

结论

我希望这篇博文已经告诉了你在统计框架中使用工具变量背后的直觉。虽然这是一个相当简单的例子,但通常有机会使用几个工具变量来控制估计量。此外,用户一定会感到厌倦,因为工具变量并不总是能够提高模型的有效性或稳健性。

参考

约书亚·d·安格里斯特,终生收入和越战时期的征兵彩票:来自社会保障行政记录的证据,1990 年 6 月(【https://www.jstor.org/stable/2006669?seq=1】T2)

保险风险定价——特威迪方法

原文:https://towardsdatascience.com/insurance-risk-pricing-tweedie-approach-1d71207268fc?source=collection_archive---------6-----------------------

在 GLMs 和机器学习中使用 Tweedie 模型估计纯保费的说明性指南

背景

保险业是一个独特的行业,可能是为数不多的不知道销售产品实际成本的行业之一,他们处理不可预见事件的风险。因此,在过去的几个世纪里,该行业一直依靠数学来理解其客户和前景的风险行为,以估计预期损失成本。当然,方法已经从帕斯卡三角、概率应用、最小偏差程序发展到广义线性模型,以及现在的机器学习。

目标

我们已经在之前的文章中详细讨论了计数模型(用于索赔频率)和伽玛模型(用于索赔严重度)。纯保费,也称为“损失成本”,只是两个模型估计的产品。

索赔频率=索赔次数/风险

索赔严重程度=索赔成本/索赔次数

损失成本=索赔频率 x 索赔严重程度

在当前的文章中,我们将讨论一种非常重要和有趣的分布,称为 Tweedie,这种分布很有趣,因为它通过改变单个参数,提供了从高斯到逆高斯的许多其他分布。

这种分布将有助于我们直接建模纯保费,而不需要两个不同的模型。

特威迪分布

Tweedie 分布是指数分散模型的一种特殊情况,通常用作广义线性模型的分布。它可以有一组为零的数据项,这种特殊的属性使它在保险业的索赔建模中非常有用。该模型还可以应用于其他行业的用例,在这些用例中,您会发现零和非负连续数据点的混合。

如果你看到下图中峰值为零的直方图,它可能适合 Tweedie 模型。

这一系列分布具有以下特征

平均值,E(Y)= 1

方差,Var(Y)= ϕ ᵖ

我们用这个表达式“Y ~ Twₚ( ,ϕ”来理解吧,其中 y 表示响应变量,Twₚ( ,ϕ)表示一个 Tweedie 随机变量,具有均值和方差ϕ ᵖ和ϕ>0,p ∈ (-∞,0]∩[1,∞)。

方差函数中的 p 是分布的附加形状参数。

需要注意的重要一点是,这种分布不是针对 0 到 1 之间的 p 值定义的。

  • 如果 1 < p <2, the distribution are continuous for Y> 0,正质量为 Y=0
  • 如果 p > 2,对于 Y > 0,分布是连续的

让我们看看 Tweedie 分布族的一些常用成员及其指数参数(p)、方差函数(V())和离差( ф )

指数离差模型

一个分布能够拟合许多其他分布。设置 p = 0 表示正态分布,p = 1 表示泊松分布,p = 2 表示伽马分布,p = 3 表示逆高斯分布。

参数从一种形式转换到另一种形式。

我们知道 Tweedie 是一种复合泊松-伽马分布,其中 N ~泊松(λ)为计数,Z ~伽马(α,θ)为连续数,在这种情况下,参数可以很容易地转换为 Tweedie 参数,如下所示:

泊松-伽马到特威迪

方差也可以平移— Var[Y] = ϕ ᵖ =λ⋅θ ⋅α (α+1)

类似地,Tweedie 参数也可以转换为泊松和伽马参数,如下所示:

特威迪呼叫波松伽玛

现在,我们对这种有趣的分布及其与近亲如泊松和伽马的关系有了一些了解。

接下来,我们将使用一个数据集并检查该分布的适用性。

回想一下我们在以前的文章中使用的保险数据集。我们希望 Tweedie 分布是该数据集的理想候选,让我们研究该数据以证实我们的假设。

这个数据集(dataCar)可以从一个名为“insuranceData”的 R 包中下载。

library(insuranceData)
data(dataCar)

数据集的简要概述

该数据集基于 2004 年或 2005 年购买的一年期车辆保险。共有 67,856 份保单,其中 4,624 份(6.8%的通知索赔)提出了索赔。

数据快照

只有 7%的观察值具有响应变量的正值,其余的值为零。让我们独立地看一下索赔计数和成本的分布。

正如我们在上面看到的

  • 损失成本=索赔频率 x 索赔严重程度

让我们用原始变量来重写

  • 损失成本=索赔成本/风险

响应变量 —我们将使用“索赔成本”作为响应变量,将“风险敞口”作为补偿,这是一种建议的费率和平均值建模方法。

我们来看看这个变量的分布。

我们可以看到这个数据不能符合正态分布,泊松也可以被丢弃,因为这不是一个计数数据。另一个选择是伽玛,但是这个分布不取零值。因此,最后,我们只剩下特威迪分布,它可能最适合这个数据。

现在,看看独立变量。对于这些变量的详细探索性分析和转换,您可以参考与本文一起分享的源代码。

独立变量 —我们将使用车身、车龄、驾驶员年龄类别、性别、面积和车辆价值作为预测变量。索赔发生指标和索赔数量不能使用,因为它们与因变量有关,只能在事件发生后才知道。

衍生变量和转换——可以对低频率的车身类型进行分组,也为车辆价值创建了一个替代分类变量,可以对其进行显著性测试。

为 Tweedie 模型选择最佳“p”

基于这种探索性分析,我们可以确定 Tweedie 分布是拟合模型的理想候选,但我们尚未找到“p”的最佳值,我们知道该值在 1 到 2 之间变化。

方法 1 —手动选择方差幂。

  • 通过运行迭代模型来测试 1 到 2 之间的“p”序列。
  • 对数似然显示出一个倒“U”形。
  • 选择对应于“最大”对数似然值的“p”。
  • 使用该“p”值拟合最终模型。

方法 2——使用统计包自动选择方差功率

统计软件包(宏)在各种软件中可用,如 R、SAS、Python 和徽(行业专用软件),用于计算一系列“p”值的最大似然估计。这些是对方法 1 的一种改进,增加了许多其他特性,如可视化。我们可以看到下面的示例输出,它是使用“Tweedie”包从 R 生成的图形。

#Maximum likelihood estimation of the Tweedie index parameter pest_p <-tweedie.profile(claimcst0 ~ veh_value+veh_body+veh_age+ gender+area+agecat,data=training,link.power = 0,do.smooth = TRUE, do.plot = TRUE)#Note
**link.power** - Index of power link function, link.power=0 produces a log-link
**do.smooth** - logical flag. If TRUE (the default), a spline is fitted to the data to smooth the profile likelihood plot. If FALSE, no smoothing is used (and the function is quicker)
**do.plot** - logical flag. If TRUE, a plot of the profile likelihood is produce. If FALSE (the default), no plot is produced

该图显示最佳“p”值位于 1.5 和 1.6 之间。我们可以使用建议值来拟合 Tweedie 模型。

在 Python 中,statsmodels 有一个名为 estimate_tweedie_power 的函数,用于获得一个最优值。

现在,让我们训练模型

我们使用 R 和 Python 来拟合广义线性模型。r 在统计模型方面已经相当成熟,python 也在追赶它的 statsmodels 包。我觉得缺少关于 statsmodels 的适当例子和文档是唯一的缺点。

在机器学习模型中,Tweedie 损失函数可用于许多算法,如 GBM、LightGBM、XGBOOST 等。在这里,我将带您了解 XGBOOST 的实现。

R 和 Python 中的广义线性模型

R 中的实现

library(tweedie)
library(statmod)#Model
tweedie_model <- glm(claimcst0 ~ veh_value+veh_body+veh_age+gender+ area+agecat,data=training, family = tweedie(var.power=1.6, link. power=0),offset=log(exposure))#Note
var.power -index of power variance function, for Tweedie it ranges between 1 to 2, here we are using 1.6.
link.power -index of power link function, link.power=0 produces a log-link

Python 中的实现,Statsmodels

import pandas as pd
import numpy as np
from patsy import dmatrices
import statsmodels.api as sm# Training and test splitmask = np.random.rand(len(df3)) < 0.8
df_train = df3[mask]
df_test = df3[~mask]
print('Training data set length='+str(len(df_train)))
print('Testing data set length='+str(len(df_test)))# Model expression
expr = """claimcst0 ~ veh_value_cat+veh_age+gender+area+agecat"""# Converting data into dmatrices
y_train, X_train = dmatrices(expr,df_train,return_type='dataframe')
y_test, X_test = dmatrices(expr, df_test, return_type='dataframe')# Training modeltweedie_model = sm.GLM(y_train, X_train,exposure=df_train.exposure, family=sm.families.Tweedie(link=None,var_power= 1.6,eql=True))tweedie_result = tweedie_model.fit()#Note
**link -** The default link for the Tweedie family is the log link. Available links are log and Power
**var_power -** The variance power. The default is 1
**eql -** If True, the Extended Quasi-Likelihood is used, else the likelihood is used (however the latter is not implemented). If eql is True, var_power must be between 1 and 2.

GLMs 中的模型验证和拟合优度

抽样输出

我们可以像任何其他回归一样,通过查看结果摘要来分析结果。

  • 如果 p 值小于或等于显著性水平,则可以断定该变量是显著的
  • 其他指标,如 AIC、偏差和对数似然,对于比较相关模型也很有用。AIC 和偏差越低,模型越好,而似然值越高越好。

Python 中的实现,XGBOOST

import xgboost as xgb
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split#Segregating response and predictor variables in different data frameX, y = data.iloc[:,:-1],data.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split (X,y,test_size =.2, random_state=123)#Creating DMatrix as required for this algorithmdtrain = xgb.DMatrix(data=X_train.iloc[:,1:28],label=y_train)
dtest = xgb.DMatrix(data=X_test.iloc[:,1:28],label=y_test)#Applying offsetdtrain.set_base_margin(np.log(X_train['exposure']))
dtest.set_base_margin(np.log(X_test['exposure']))#Setting Parametersparams = 
{"objective":"reg:tweedie",'colsample_bytree': 1.0, 'learning_rate': 0.01,'gamma':1.5,'max_depth': 2, 'subsample':0.6, 'reg_alpha': 0,'reg_lambda':1,'min_child_weight':5, 'n_estimators':2000,
'tweedie_variance_power':1.6}xg_reg = xgb.train(params=params, dtrain=dtrain, num_boost_round=1000)#Note
**reg:tweedie** - Tweedie regression with log-link
**tweedie_variance_power -** default=1.5, range: (1,2)

XGBOOST 中的模型验证

均方根误差(rmse)、平均绝对误差(mae)和 k 倍交叉验证技术等评估指标是验证和比较模型的一些方法。

preds = xg_reg.predict(dtest)
rmse = np.sqrt(mean_squared_error(y_test, preds))
print("RMSE: %f" % (rmse))

请随时访问我的要点路径完整的代码。

摘要

我们已经讨论了保险行业中最常用的分布之一 Tweedie 分布,以及它与其他指数分布模型(如泊松分布和伽马分布)的关系。我们还学会了估计 Tweedie 方差幂,这是拟合精确模型所需的最重要的参数。

尽管我们在一些流行的开源包中讨论了 Tweedie 实现的例子,但是很少有其他软件有这样的实现,比如 H2O、SAS 和徽。

感谢您的阅读,希望您发现这篇文章内容丰富。如有任何疑问或建议,请随时联系我。

参考

[1]Tweedie,M. C. K .,“区分一些重要指数族的指数”,《统计学:应用和新方向》,印度统计金禧国际会议记录,J. K. Ghosh 和 J. Roy(编辑。),印度统计研究所,1984 年,579–604 页

[## [2]XGBoost 参数—XGBoost 1 . 1 . 0—快照文档

max_delta_step [default=0]我们允许每个叶片输出的最大 delta 步长为。如果该值设置为 0,则表示存在…

xgboost.readthedocs.io](https://xgboost.readthedocs.io/en/latest/parameter.html) [## 3 tweedie . profile

Tweedie 分布:Tweedie 指数参数(p)的极大似然估计。用法…

www.rdocumentation.org](https://www.rdocumentation.org/packages/tweedie/versions/2.3.2/topics/tweedie.profile) [## [4]特威迪

Tweedie 广义线性模型产生一个广义线性模型家庭对象与任何权力方差函数…

www.rdocumentation.org](https://www.rdocumentation.org/packages/statmod/versions/1.4.33/topics/tweedie) [## [5]简介—统计模型

statsmodels 是一个 Python 模块,它为许多不同的统计数据的估计提供了类和函数

www.statsmodels.org](https://www.statsmodels.org/stable/index.html)

将 JupyterLab 与 Google Drive 集成

原文:https://towardsdatascience.com/integrate-jupyterlab-with-google-drive-98d13e340c63?source=collection_archive---------5-----------------------

自动将您的笔记本同步到云

我们的工作机器内存有限。不仅如此,它们还可能发生一些事情——磁盘故障或其他灾难性问题,导致无法访问您的数据。

作为一名数据科学家,你的工作、见解和结论至关重要,无论它们是与工作相关,还是只是你一直在兼职做的事情。当然,你可以随身携带一个闪存盘,但这也是一个不方便的选择,不用说,闪存盘很容易丢失。

这就是云存储的用武之地。这个想法很简单,把所有对你重要的东西都存储在某个你可以从任何地方访问的“安全”的远程位置。这些文件不会存储在你的电脑上,因此不太可能丢失——前提是你没有忘记密码和电子邮件。

说到云存储选项,有太多可供选择的了——对于普通人来说,有 Google DriveOneDriveDropbox ,如果你想要更安全的东西,还有 TresoritPCloud 。我不太喜欢这些,主要是因为我想知道我的数据在哪里,而“坐在某个偏远的地方”这个答案并不令人满意。这就是我更喜欢家庭云解决方案的原因,比如来自 WD 的解决方案。

但是我跑题了。

在结束这篇冗长的介绍性文章之前,我只想说,今天我们将看看如何用 JupyterLab 设置 Google Drive,这样你就可以一劳永逸地抛弃那个烦人的 flask drive 了。

我们开始吧。

安装延伸部分

第一部分,你已经猜到了,在你的电脑上安装 Google Drive 扩展。我假设您已经运行了 Python 和 JupyterLab。

启动命令提示符或终端,输入以下命令:

jupyter labextension install @jupyterlab/google-drive

如果你得到一些错误,确保你已经安装了节点和

大约一分钟后,扩展将被安装,现在您可以启动 JupyterLab 了。侧边栏现在看起来有点不同:

这意味着扩展已经成功安装,可以使用了。嗯,不完全是,但一会儿会更详细。现在,当你打开 Google Drive 时,你只能看到它的标志:

这并不好——因为你没有用你的谷歌账户登录。这个过程可能相当繁琐,但是在下一节中,我会尽量让它变得简单。

一点配置

首先,你需要打开谷歌开发者控制台,创建一个新的项目:

下面是我如何配置我的:

一旦完成,按下创建。此外,确保在顶部栏上选择了项目:

现在转到 OAuth 同意屏幕 —选择外部创建。然后给应用命名,滚动到底部,点击保存:

现在在凭证选项卡下选择下的 OAuth 客户端 ID 创建凭证:

在下一个屏幕上,在应用程序类型下选择 Web 应用程序,在授权的 JavaScript 源下给它一个名称和 URL。默认情况下,URL 应该是 http://localhost:8888 ,至少我的 JuypterLab 运行在那里。如果您没有进行一些手动配置,情况也是如此:

现在转到下:

并启用以下 API:

  • Google Drive API
  • 谷歌选择器 API
  • 谷歌实时应用编程接口

这就是谷歌开发者控制台,现在你可以返回到 JupyterLab。选择设置高级设置编辑器:

然后在 Google Drive 下输入分配给您的 ClientID :

现在,您将最终看到登录选项:

一旦你这样做了,接受了一切,你就准备好了!

让我们测试一下

为了测试一切是否正常,我制作了一个虚拟笔记本,并将其命名为 TestNotebook 。几乎立刻就被保存到了谷歌硬盘上:

现在你知道了。你的工作被同步到云端,这使得它的存储更加安全。

整个过程有点乏味,但我希望你已经设法完成了。如有任何问题,请随时联系我。

感谢阅读。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

将文本特征并入分类项目

原文:https://towardsdatascience.com/integrate-text-content-into-classification-project-eddd8e18a7e9?source=collection_archive---------41-----------------------

比较了波特、斯诺鲍和兰开斯特·斯特默斯。将评论整合到客户数据中,以提高模型的性能。

图像来源

内容表

项目摘要

该项目旨在研究非结构化文本数据如何为机器学习分类项目增加价值。

我有来自一家公司的两个数据集。其中一个包含了所有客户的基本信息。customer 数据集也有 target 列,它指示客户是持有成员资格还是已经取消了成员资格。另一个数据集包含客户留给公司的评论。我的任务是将顾客的评论与顾客现有的信息结合起来,预测他们是否会取消或保留会员资格。

在这个项目中,我研究了如何使用自然语言工具包(NLTK)将文本挖掘技术整合到机器学习模型中,以提高二元分类的性能。

我在这个项目中使用了 Porter stemmer、Snowball stemmer、Lancaster stemmer、word_tokenize、CountVectorizer、TfidfTransformer、LabelEncoder、XGBClassifier 和 CatBoostClassifier。我选择 ROC 分数作为主要的评估标准。

点击此处返回顶部

数据

客户数据集有 2070 条记录和 17 个变量,包括每个客户的 ID。评论数据集包含公司从每个客户那里收集的信息。

图 1 显示了目标列的频率。其中 1266 人是该公司的会员,804 人已经取消了会员资格。我认为这是非常平衡的数据,所以我没有应用过采样技术。

图 1 —目标的频率

因为我要计算 ROC 得分,所以我将目标值转换为二进制变量。代码如下:

# Encoding the Targetle = LabelEncoder()label = le.fit(customer["TARGET"]).transform(customer["TARGET"])

点击此处返回页首

文本挖掘

首先,我必须标记注释。原始评论可能包含错别字、无关内容、冗余信息等,这些会增加计算负担并降低模型的效率。利用分词器将这些句子分解成单个的单词使我能够提取评论的核心信息。图 2 比较了原始注释和标记化注释。

# First, tokenize the comments
comment["TokenizedComments"]
        =comment["Comments"].apply(word_tokenize)comment.head()

图 2 —标记化的注释

为了减少高维度,我应用了三种不同的词干分析器:Porter、Snowball (Porter 2)和 Lancaster。图 3 显示了不同算法的输出。每一种都有利弊。我们可以看看这里:

图 3 —不同词干分析器的输出

1.看起来 Porter 倾向于保存原始内容的大写或小写

2.兰卡斯特非常好斗。例如,对于 ID 3034,当其他两个保留单词“nee”时,Lancaster 将其转换为“nee”

3.波特也很难识别简单的单词。例如,在大多数情况下,波特不知何故将“his”转换成了“hi”

4.因此,我选择了 Snowball stemmer 来完成项目的剩余部分

词干化之后,我构建了术语-文档矩阵并删除了停用词。术语文档矩阵的维数是 2070×354。它可以告诉我们一个特定的单词是否存在于一个特定的文档中。

# Contruct term-document matrix
count_vect = CountVectorizer(stop_words='english',lowercase=False)TD_counts = count_vect.fit_transform(newTextData["Snow"])DF_TD_Counts=pd.DataFrame(TD_counts.toarray())DF_TD_Counts.columns = count_vect.get_feature_names()

图 4 —术语文档矩阵

然后,我从术语文档矩阵中构造了 TF-IDF 矩阵。有许多方法可以量化文档集合中的文本内容,比如可读性分数。在我之前的一篇博客中,我也写过关于计算样板分数的内容,这也是一种量化文本内容的方法。TF-IDF 是最常见的量化方法之一,用于评估一个单词与文档集合中的一个文档的相关程度。图 5 是 TF-IDF 矩阵的一部分。

#Compute TF-IDF Matrix
tfidf_transformer = TfidfTransformer()tfidf = tfidf_transformer.fit_transform(TD_counts)DF_TF_IDF=pd.DataFrame(tfidf.toarray())DF_TF_IDF.columns=count_vect.get_feature_names()

图 5 — TFIDF 矩阵

在构建了 TF-IDF 矩阵之后,我将该矩阵与原始客户数据集相结合。组合数据集有 2070 条记录和 387 列。

点击此处返回页首

建模

为了验证我构建的模型,比较原始数据和组合数据,并避免过度拟合,我将两个数据集分别以 4:1 的比例分为训练数据集和测试数据集。

# split data at 80% 20% for orginal data and combined datadata_train, data_test, label_train, label_test = 
     train_test_split (pd.get_dummies(data.drop(["ID"],axis=1), 
                       test_size = 0.2, random_state = 42)X_train, X_test, y_train, y_test = train_test_split(EncodeData.drop(["ID"],axis=1), label, 
                 test_size = 0.2, random_state = 42)

首先,我对没有 TF-IDF 矩阵的数据应用了 CatBoost 和 XGBoost。输出如图 6 和图 7 所示。

cat=CatBoostClassifier()
cat.fit(data_train,label_train)
cat_predictions = cat.predict_proba(data_test)

图 CatBoostClassifier 的分类报告

xgb = XGBClassifier()
xgb.fit(data_train,label_train)
xgb_predictions = xgb.predict_proba(data_test)

图 XGBClassifier 的分类报告

然后,我把同样的模型应用到综合数据中。CatBoost 和 XGBoost 的 ROC 得分分别为 0.9171730.911844 。图 8 显示了 CatBoost 模型的对数损失如何随着学习轮次的增加而变化。

图 8-CatBoostClassifier 学习曲线

图 9 是 CatBoostClassifier 结合数据的分类报告,这也是我在这个项目中得到的最好的结果。

图 9-包含组合数据的 catboost 分类器的分类报告

点击此处返回顶部

结论

我比较了三种不同的词干法:波特、雪球和兰卡斯特。兰开斯特比另外两个梗工更有侵略性。波特倾向于保留更多的信息,并且很难识别最基本的单词,比如“他的”斯诺鲍似乎落在了另外两个词干作者之间:不像兰开斯特那样咄咄逼人,但保持了基本的词。

量化文本特征并将其添加到机器学习模型中有助于捕捉原始数据中不会发现的信息。此外,TF-IDF 并不是唯一有帮助的方法。通过改变量化文本内容的方式,可以进一步改进模型。

你可以在这里找到代码和数据。

点击此处返回页首

以前的文章:

简单加权平均集成|机器学习

使用 R 计算用于会计分析的样板文件

将亚马逊 SageMaker 机器学习模型与 QuickSight 集成。

原文:https://towardsdatascience.com/integrating-aws-sagemaker-models-with-quicksight-acfe9e5e9cf1?source=collection_archive---------32-----------------------

使用 Amazon SageMaker 和 QuickSight 构建的增强机器学习模型概述。

您是否想过如何以更简单的方式将 ML 预测添加到您的 BI 平台中,并与商业客户分享?放心吧!AWS ML Insights 的一个用 SageMaker 增强的 QuickSight 已经覆盖了你!

假设您已经构建了一个优化的模型,并获得了 x%的精度。但是在实时场景中,将模型引入生产并分享商业见解是很重要的。

将 SageMaker 模型与 QuickSight 集成(使用 app.diagrams.net 设计)

将 ML 预测添加到 BI 的典型步骤需要开发人员参与更新结果。传统上,将来自训练模型的预测输入到 BI 工具中需要相当大的工作量。您必须编写代码将数据 ETL 到亚马逊简单存储服务(亚马逊 S3),调用推理 API 来获得预测,将来自亚马逊 S3 的模型输出 ETL 到可查询的源,每当新数据可用时编排该过程,并为每个模型重复该工作流。推理端点使得模型的使用更加容易,但是代价是在不使用时可能会产生费用。最后,您使用像 Excel 这样的第三方工具来执行分析和报告预测,这使得向大量用户更新和共享结果变得困难。从模型中获取价值的端到端过程是无差别的,在模型的预测到达业务决策者手中之前,可能需要几天或几周的时间。

来源:AWS re:Invent 2019。

将 QuickSight 与 SageMaker 集成在一起,可以更轻松地添加预测、分享见解,同时减少开发人员的参与。QuickSight 中的 SageMaker 推理消除了管理数据移动和编写代码的需要。QuickSight 负责繁重的工作:从数据源中提取数据,对数据进行分块,通过 SageMaker 批处理转换作业运行数据,并清理和存储推理结果以进行可视化和报告。您只需将 QuickSight 指向您的数据和 SageMaker 模型,它就会管理端到端流程。QuickSight 还负责编排,因此您可以安排它在午夜有新数据时运行,或者以编程方式触发新的推理。

来源:AWS re:Invent 2019。

  1. 您可以根据需要选择数据源。
  2. ML 模型可以从 AWS MarketPlace、SageMaker Autopilot(它自动为输入数据创建模型)或您的自定义模型中使用。

在这里,我将解释用 QuickSight 增强定制的虹膜分类模型。在扩充之前,确保 QuickSight 管理员授予进行 Sagemaker API 调用的权限。

向 QuickSIght 添加 SageMaker 权限。

涉及的步骤:

1 .连接到数据或上传数据

数据源

注意:您的数据必须只包含输入列,使用 SageMaker 增加的模型预测并追加输出列。

2.单击编辑设置和预览数据

3.点击用 SageMaker 增强

4。选择您的型号

5.上传模式( JSON 格式)文件

注意:允许的数据类型有整数(整数值)、小数(浮点值)、字符串(日期、分类变量等)..)

6.映射输入和输出数据字段。

7.单击下一步,保存并可视化

注意:至少需要 4 分钟来执行批量转换作业,并将预测的输出附加到给定的测试数据集。

预测结果作为列追加。

关于构建定制模型、定义模式文件、添加 SageMaker 的详细说明可以在这里找到。

结论:

将 Amazon QuickSight 与 Amazon SageMaker 模型结合使用可以节省您管理数据移动和编写代码的时间。结果对于评估模型非常有用,当您对结果满意时,还可以与决策者分享。您可以在模型构建完成后立即开始。这样做可以展现数据科学家的预建模型,并使您能够将数据科学应用于数据集。然后,您可以在预测仪表板中分享这些见解。使用 Amazon QuickSight 无服务器方法,该过程可以无缝扩展,因此您不需要担心推理或查询能力。

最后的想法..

我将在试验其他 ML 见解时回复你,例如预测时间序列和异常检测。

取得联系

希望你觉得它很有见地。我很乐意听到你的反馈,以即兴发挥,使之更好!。如果你想联系,LinkedIn上联系我。感谢阅读!

为每日报告整合气流和松弛度

原文:https://towardsdatascience.com/integrating-docker-airflow-with-slack-to-get-daily-reporting-c462e7c8828a?source=collection_archive---------14-----------------------

使用 Airflow + Docker 向 Slack 发布天气预报的分步指南

Unsplash 上由 Austin Distel 拍摄的照片

技术栈: Python 3.7,Airflow (1.10.10),Docker

GitHub 链接:所有的代码都可以在这里找到。

气流+松弛

Slack 是一款越来越受欢迎的工作场所聊天应用。Apache Airflow 是一个用于编排工作流的开源平台。使用气流的最大优势之一是其挂钩操作器的多功能性。钩子是外部平台、数据库的接口,也是操作符的基本构件。

松紧网钩操作器可用于整合气流和松紧。该操作符通常用于报告和警报目的,在满足某些触发条件时将传入消息调度到空闲通道。

我将向您展示如何利用这些工具在您的空闲工作空间中执行一些非常简单的报告:向频道发送每日天气预报。

这些基础可以扩展,以创建更复杂的气流+松弛集成。我们开始吧!

如果您有兴趣了解更多关于数据工程基础的知识,这里有一门课程可以帮助您入门。

[## 数据工程基础

为数据工程职业打下基础。开发 Python、SQL 和关系型数据库的实践经验…

click.linksynergy.com](https://click.linksynergy.com/link?id=J2RDo*Rlzkk&offerid=759505.18321546102&type=2&murl=https%3A%2F%2Fwww.coursera.org%2Fspecializations%2Fdata-engineering-foundations)

设置宽松的工作空间

注意:如果你已经熟悉在 Slack 上设置应用程序和 Slack webhook,请跳到“air flow+Docker”

工作区是一个共享的渠道中心,队友和协作者可以在这里一起交流。我创建了一个名为天气爱好者的工作空间。

在我们的工作区,我们需要:

  • 接受这些信息的渠道
  • webhook url

让气流发布到一个名为#每日天气信息的公共频道。如果消息内容敏感,请考虑将其更改为私人频道。

接下来,我们想为工作区创建一个 Airflow 应用程序。前往 https://api.slack.com/apps点击Create New App

这将引导您进入一个可以设置应用程序名称的模式。Airflow 会以您选择的名称发布消息。为了简单起见,我将我的应用程序命名为airflow

退出模式后会出现一个页面,你可以在其中添加“传入网页挂钩”作为应用程序功能。

确保传入的网络钩子打开

滚动到页面底部,点击“添加新的 Webhook 到工作区”。

这将生成一个 WebHook URL,可用于对 Airflow 进行身份验证。

WebHook URL 还允许您以编程方式向 Slack 发送消息。这里有一个非常简单的 POST 请求,您可以在终端中尝试。别忘了用你的网址替换我的。

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hi, this is an automated message!"}' https://hooks.slack.com/services/XXXX

请检查您的频道以查看自动消息。

如果你有兴趣学习更多关于在软件工程环境中使用 API 和 Python 的知识,这是一个非常适合初学者的 Coursera 专业。

[## 面向所有人的 Python

由密歇根大学提供。这种专业化建立在 Python 面向所有人课程的成功基础上,并且…

click.linksynergy.com](https://click.linksynergy.com/fs-bin/click?id=J2RDo*Rlzkk&offerid=759505.31&type=3&subid=0)

气流+ Docker

我将向您展示如何使用 Docker 设置气流,以适当地容器化您的应用程序。我使用了 puckel/docker-airflow 的部分设置。

Airflow 附带了许多设置复杂的配置。使用 Docker 可以更容易地获得可重现的结果。

Docker 是什么? Docker 是一种独立于您的本地设置打包单个应用程序的方法。每个应用程序都在自己的 Docker 容器中。这里有一些关于 Docker 的有用资源,包括我写的一个关于 Docker 命令的资源。

[## 面向初学者的 Docker 教程

学习使用 Docker 轻松构建和部署您的分布式应用程序到云中,Docker 由…

docker-curriculum.com](https://docker-curriculum.com/) [## 码头工人的 1–2–3

我(几乎)每天使用的 6 个 docker 命令。

towardsdatascience.com](/the-1-2-3s-of-docker-ea123d7c5f91)

对于带有 AWS 服务的更高级 Docker 应用程序:

[## 在 AWS 上构建容器化应用程序

由亚马逊网络服务提供。本课程向您介绍容器技术,以及如何将它们用于…

click.linksynergy.com](https://click.linksynergy.com/link?id=J2RDo*Rlzkk&offerid=759505.16005422530&type=2&murl=https%3A%2F%2Fwww.coursera.org%2Flearn%2Fcontainerized-apps-on-aws)

气流

整个 Airflow 平台可以分为四个部分:调度器、执行器、元数据数据库和 web 服务器。

  • 调度程序决定运行哪些作业以及在什么时间/以什么顺序运行
  • 执行者执行每个作业的指令
  • 数据库存储气流状态(这项工作是成功还是失败?跑了多长时间?)
  • 网络服务器是用户界面,使其更容易与气流接口;网络服务器是一个隐蔽的烧瓶应用程序

这是 web 服务器的样子(摘自 Apache Airflow 的文档)

有向无环图

Dag 是气流中一个非常重要的概念。每个 DAG 都是相似任务的集合,这些任务以反映其依赖性和关系的方式进行组织。这些图不能有有向循环,换句话说,不能有相互依赖的作业。

Dag 是在 Python 脚本中定义的,它们帮助调度程序确定要运行哪些作业。在所有上游作业成功完成之前,下游作业无法运行。

箭头代表依赖关系;run_after_loop 仅在 runme_0、runme_1、runme_2 成功完成时运行

设置气流

为您的 Airflow 服务器创建存储库。我会给我的取名slack-airflow。我的存储库又一次被托管在这里。这些是目录中的组件:

  • requirements.txt
  • Dockerfile 文件
  • 用于管理配置的气流子目录
  • docker-compose.yml
  • 启动气流的外壳脚本
  • 一个 DAG 文件(我们将在后面得到更多)

requirements.txt

这是为了安装所需的气流库(以及任何其他所需的库)。

apache-airflow[crypto,celery,postgres,jdbc,ssh,statsd,slack]==1.10.10

air flow/config/air flow . CFG

气流配置文件通常作为气流安装的一部分下载(使用 Docker 的额外好处是:您不需要完成安装过程)。默认配置本身很好,但是可以针对您的特定用例调整设置。

下面是一个综合列表,说明每个字段对应的内容:https://air flow . Apache . org/docs/stable/configuration s-ref . html

这是气流目录中唯一需要的文件。

Dockerfile

这包含了你的 Docker 镜像的说明。我们为运行pip install指定了一些环境变量、更多的依赖项和指令,并用我们的entrypoint.sh shell 脚本定义了图像入口点。最后一行还启动 web 服务器。

我还使用 Dockerfile 将秘密存储到 Slack 和 Open Weather API。理想情况下,秘密应该存储在它们自己的环境文件中,并在构建时放入 Docker 容器中。环境文件应该添加到.gitignore中,这样它就不会出现在代码库中。

冒着使这个设置过于复杂的风险,我们将把秘密留在 over 文件中。

请将你的秘密填入这两行。在共享您的代码时请记住,这些是敏感的凭证!weather_api_key用于获取每日天气预报——下一节将介绍如何获取这个令牌。现在,你可以空着它。

ENV weather_api_key=
ENV slack_webhook_url=

docker-compose.yml

docker-compose 是一种处理 docker 设置的有组织的方式。如果您正在处理多个相互依赖的容器,这将特别有帮助。

第一个服务postgres创建负责存储气流状态的 Postgres 数据库。凭证在 docker 文件中设置,可用于连接到本地网络上的数据库。

这是完整的数据库 URL。凭证组件分散在 Dockerfile 文件和启动脚本中。您可以使用此 URL 从本地网络连接并查询气流数据库。

postgresql+psycopg2://airflow:airflow@postgres:5432/airflow

要了解关于如何连接到 DBAPI 的更多信息,请查看我关于 Postgres DBs 的另一篇文章。

[## 成为全栈数据科学家:设置并连接到 Postgres 数据库

全栈数据科学家是所有数据角色梦寐以求的海报儿童雇员。这位顶级数据科学家是…

towardsdatascience.com](/becoming-the-full-stack-data-scientist-part-1-e0d933280b)

对于那些想要更详细地探索 Pythonic 与数据库的联系的人来说,这里有一个有用的 Coursera 课程:

[## 通过 Python 使用数据库

由密歇根大学提供。本课程将向学生介绍结构化查询语言的基础…

click.linksynergy.com](https://click.linksynergy.com/link?id=J2RDo*Rlzkk&offerid=759505.1560524593&type=2&murl=https%3A%2F%2Fwww.coursera.org%2Flearn%2Fpython-databases)

第二部分定义了 web 服务器,它将被托管在本地网络的 8080 端口上。

开放天气 API

照片由 Gavin AllanwoodUnsplash 上拍摄

我们可以利用开放天气 API 获取每日天气预报。创建一个帐户并为您的帐户生成一个 API 令牌。

回到 token 文件,用您的令牌设置这个环境变量:

ENV weather_api_key=

天气日报

这是我的天气 DAG 的链接。我把它放在一个叫做dags的文件夹里。

步骤 1: 加载依赖项

步骤 2: 指定默认参数

我将自己添加为这条 DAG 的所有者。这是每个 DAG 的必需参数。如果depends_on_past设置为真,则后续任务将不会运行,除非之前的运行成功。从过去挑一个start_date。我选择了昨天的日期。retries设置为 0 意味着气流不会尝试重新运行失败的任务。

步骤 3: 获取每日预测的简单类

我们向 Open Weather 发送 GET 请求,以获取多伦多的天气详情。有效负载被解析,描述字段用于描述预测。

API 键是从 docker 文件中实例化的环境变量中获取的。

步骤 4: DAG 定义

我们在 DAG 中使用SlackWebhookOperator。您可以随意命名http_conn_id,但是需要在 Airflow 服务器上设置相同的连接(这将在“在 Airflow 上设置您的 Slack 连接”一节中介绍)。从环境变量中获取 webhook 令牌。

除了预定间隔和catchup=False(这防止气流运行回填)之外,这里还引用了默认参数。

schedule_interval是一个 cron 语法,它决定了运行 DAG 的节奏。参数对应于(按顺序):分钟、小时、日、月和星期几。

我通常用这个网站来破译 Cron 语法:https://crontab.guru/

启动 Docker 容器

在根目录下运行这两个命令。

这将构建图像并将其标记为airflow。重要的是不要改变标记名,因为它在启动脚本中被引用。

docker build . -t airflow

这将根据 docker-compose 中的指令启动相关的 Docker 容器。

docker-compose -f docker-compose.yml up -d

第一次运行这些步骤需要几分钟时间。完成后,web 服务器将暴露于您的本地 8080 端口。

您可以通过本地网络localhost:8080访问它。这是我的样子。

在气流上设置松弛连接

我们差不多完成了。

我们需要做的最后一件事是在 Airflow 中设置slack_connection(这个名称需要与 DAG 文件中指定的http_conn_id相匹配)。

步骤 1:进入管理>连接

转到localhost:8080访问网络服务器并点击管理>连接。

步骤 2:创建新连接

点击Create并相应地填写字段。对于松弛连接,您只需要Conn idHost

  • conn _ id = slack _ 连接
  • host =您的 webhook URL

测试 DAG

如果您不想等待预定的时间间隔来观察结果,可通过点击Trigger DAG按钮手动触发 DAG 运行。

任务成功运行后,此消息将出现在“时差”中。今天的天气预报是晴,听起来差不多是☀️

厉害!向天气网络说再见,向程序化预报问好😃

要获得每天的天气预报,让气流服务器运行。

我希望这篇文章对你有所帮助。对于额外的气流资源,查看官方文件,这是一个非常全面的指南。

[## Apache 气流文档-气流文档

Airflow 是一个以编程方式创作、调度和监控工作流的平台。使用 Airflow 将工作流程创作为…

airflow.readthedocs.io](https://airflow.readthedocs.io/)

感谢您的阅读!

请通过 Medium 关注我的最新消息。😃

作为一个业余爱好项目,我还在www.dscrashcourse.com建立了一套全面的免费数据科学课程和练习题。

再次感谢您的阅读!📕

集成图像和表格数据用于深度学习

原文:https://towardsdatascience.com/integrating-image-and-tabular-data-for-deep-learning-9281397c7318?source=collection_archive---------15-----------------------

使用 fastai 和 image_tabular 整合用于深度学习的图像和表格数据,并使用整合的数据训练联合模型

凯文·Ku 在 Unsplash 上拍摄的照片。由设计的图标被美化

我最近在 Kaggle 上参加了 SIIM-ISIC 黑色素瘤分类竞赛。在这场比赛中,参与者被要求识别皮肤病变图像中的黑色素瘤。有趣的是,除了图像之外,它们还提供关于患者和解剖位置的元数据。本质上,对于每个示例,我们都有图像和结构化或表格数据。对于图像,我们可以使用基于 CNN 的模型,对于表格数据,我们可以使用嵌入和完全连接的层,正如我在以前关于 UFC 和英雄联盟预测的文章中所探讨的。很容易为每个数据形态建立两个独立的模型。但是,如果我们想建立一个联合模型,同时训练两种数据形态呢?比赛论坛里有鼓舞人心的讨论包括这个的帖子。在这篇文章中,我将演示如何集成这两种数据模式,并使用 fastai 和我专门为这些任务创建的 image_tabular 库来训练一个联合深度学习模型。

SIIM-国际标准行业分类数据集

SIIM-ISIC 黑色素瘤分类数据集可以在这里下载。训练集由 32542 幅良性图像和 584 幅恶性黑色素瘤图像组成。请注意,这个数据集极度不平衡。下图显示了每个班级的一个例子。恶性病变似乎比良性病变更大、更弥散。

良性对恶性

如上所述,除了图像之外,还有如下所示的元数据:

作为熊猫数据框架的元数据

我们可以执行一些基本分析来调查这些特征中的一些是否与目标相关联。有趣的是,男性比女性更容易患恶性黑色素瘤,年龄似乎也是患恶性黑色素瘤的一个风险因素,如下图所示。此外,恶性黑色素瘤的频率在成像部位的位置之间不同,其中头/颈显示最高的恶性率。因此,这些特征包含有用的信息,将它们与图像结合可以帮助我们的模型做出更好的预测。这是有意义的,因为医生可能不仅会检查皮肤病变的图像,还会考虑其他因素以做出诊断。

元数据特征与目标相关联

方法

我们整合图像和表格数据的方法与 ISIC 2019 皮肤病变分类挑战赛获胜者采用的方法非常相似,正如他们在论文中所述,如下图所示。基本上,我们首先加载每个样本的图像和表格数据,分别输入 CNN 模型和完全连接的神经网络。随后,这两个网络的输出将被连接起来,并输入到另一个完全连接的神经网络中,以生成最终预测。

名词(noun 的缩写)Gessert,M. Nielsen 和 M. Shaikh 等人/ MethodsX 7 (2020) 100864

用 image_tabular 库实现

为了实现这个想法,我们将使用 Pytorch 和 fastai 。更具体地说,我们将使用 fastai 加载图像和表格数据,并将它们打包到 fastai LabelLists 中。

接下来,我们将使用 image_tabular 库集成这两种数据形态,可以通过运行以下命令来安装:

pip install image_tabular

我们将使用来自 image_tabularget_imagetabdatasets函数来集成图像和表格标签。

databunch 包含图像和表格数据,可用于训练和预测。

一旦数据准备就绪,我们就可以继续构建模型了。首先,我们需要创建一个 CNN 模型,在本例中是 resnet50,并使用 fastai 创建一个表格模型。我们将性别和解剖位置视为分类特征,并在表格模型中使用嵌入来表示它们。

我们现在准备构建一个联合模型,再次使用 image_tabular 库。我们可以通过指定 layers 参数来自定义完全连接的层。

最后,我们可以把所有东西打包成一个 fastai 学习器,训练联合模型。

整个工作流程都详细记录在这个 Jupyter 笔记本里。

结果

在训练 15 个时期后,该模型在验证集上获得了约 0.87 的 ROC AUC 分数。我随后将训练好的模型在测试集上做出的预测提交给 Kaggle,得到了 0.864 的公开分数。肯定有很大的提升空间。

Kaggle 公共评分

摘要

在本文中,我们使用 fastai 和 image_tabular 来集成图像和表格数据,并构建了一个同时在两种数据模式上训练的联合模型。如上所述,有许多进一步改进的机会。比如可以尝试更高级的 CNN 架构比如 ResNeXt。另一个问题是,在连接之前,我们应该为图像和表格数据分配多少神经元,换句话说,我们应该如何决定这两种数据形式的相对重要性或权重?我希望这可以作为进一步试验和改进的框架。

源代码

SIIM-ISIC 黑色素瘤分类竞赛的 image_tabular 和 jupyter 笔记本的源代码可以在这里找到。

感谢

image_tabular 库依赖于神奇的 fastai 库,并受到 John F. Wu 的代码的启发。

我是一名具有生物信息学和编程技能的免疫学家。我对数据分析、机器学习和深度学习感兴趣。

网址: www.ytian.me
博客:https://medium.com/@yuan_tian领英:https://www.linkedin.com/in/ytianimmune/推特:https://twitter.com/ytian

将机器学习模型与 Tableau 集成

原文:https://towardsdatascience.com/integrating-machine-learning-models-with-tableau-b484c0e099c5?source=collection_archive---------12-----------------------

使用 TabPy 库将 Python 中训练好的机器学习模型直接部署到 tableau 中

粘土银行Unsplash 拍摄的照片

Tableau 是快速创建交互式数据可视化的非常有效的工具,也是数据科学社区中的顶级工具。所有使用过 tableau 的数据科学家都知道 Tableau 对于数据可视化来说是多么强大和简单。

大多数数据科学家/分析师使用 tableau 来创建令人惊叹的可视化效果,并将可用数据用于演示。然而,对于任何数据科学家来说,以吸引人的方式向最终用户展示经过训练的机器模型与展示探索性数据分析一样重要。假设有一种方法可以直接在 Tableau 中可视化训练过的机器模型,使这个过程更加舒适。从 Jupyter 笔记本到 Tableau 部署训练有素的机器学习比你想象的要容易。这就是 TabPy 有用的地方。本文讨论了使用 Jupyter notebookTabPy 部署机器学习模型的过程

数据

这个项目的数据集由 Fernando Silva 通过 Mendeley 数据仓库使用 Creative Commons 4.0 许可证透明地维护。该数据集由 DataCo Global 公司三年来使用的供应链的大约 18 万笔交易组成。数据集可以在这里下载,因为这是一家供应链公司。确保订单按时交付并防止欺诈至关重要。

我们在这里的目标是建立一个交互式仪表板,用最佳变量来预测欺诈和延迟交付发生的概率,以防止它们发生。

最终仪表板集成了 ML 模型。

数据清理和建模

数据集由 52 个变量组成。所有不需要的变量都将被删除,大纲视图也将被移除。在剩余的 40 个变量中,使用前向选择来选择预测欺诈和延迟交付的最佳变量。预测延迟交货的最佳变量是订单国家和为订单安排的装运日期。对于预测欺诈,最佳变量是运送订单所用的实际天数以及订单国家安排的运送天数。为了便于构建仪表板,选择了常见的优化变量。

我用了一个简单的随机森林模型来预测。除了随机森林,可以使用任何机器学习模型,包括复杂的神经网络模型。

将模型部署到场景中

Python 3 和 Anaconda 应该安装在设备上。如果你没有安装,你可以直接从他们的网站 AnacondaPython 免费安装。要将 python 环境与 Tableau 连接起来,有一个非常优秀的库叫做 Tabpy,我们需要先安装它。TabPy 运行在 anaconda 环境中,非常容易安装。要安装 TabPy,打开命令提示符并运行下面的命令pip install tabpy

一旦安装了 tabpy。我们还需要一个名为 tabpy _ client 的额外库,将 Jupyter 笔记本环境连接到 tableau,并直接部署机器学习模型。甚至这个库也可以使用下面的命令pip install tabpy_client安装

一旦成功安装了 tabby,您就可以通过运行tabpy来启动 tabby 环境

运行此程序后,您应该会看到一条消息,说明 tabpy 服务器成功启动,并且端口被设置为“9004 ”,类似于下图所示。

如果您在安装 tabby 时遇到任何问题,可以在tabby GitHub页面上找到更多信息。

将 TabPy 服务器连接到 Tableau

成功安装 tabpy 库后,您可以在 Tableau 桌面中的 Tableau 应用程序设置帮助>设置和性能>管理分析扩展连接中轻松地将 TabPy 服务器连接到 Tableau。在服务器中选择本地主机,并输入端口号。

单击“测试连接”查看您的服务器连接是否成功。如果连接成功。然后你就可以开始把你的机器学习模型直接部署到 Tableau 上了。

  1. 要将模型部署到 tableau 中,首先要使用 tabpy_client 将笔记本连接到 Tableau 服务器。
  2. 单个函数应该以适合 Tableau 的格式定义。新变量 as _arg1,_arg2 是相对于已训练的机器学习模型中的变量计数来声明的。
  3. 假设我们在仪表板中使用的任何变量都在字符串中。它们应该被转换成数字格式。

如果您在部署模型时遇到任何错误,请检查是否所有的库都是最新的。在 deploy 语句中使用“override = True”将会用一个新模型覆盖已经训练好的模型。如果您希望使用新数据再次训练现有模型,这可能会很有帮助。

一旦模型部署成功,就可以在 Tableau 中访问经过训练的模型。

  1. 通过导入 CSV 文件将数据加载到 Tableau 中。
  2. 接下来,应该使用模型部署代码中使用的相同名称来创建新参数。参数可以是字符串或数字格式,具体取决于您的模型。如果使用字符串,请确保编写了将字符串转换为数字格式的代码。
  3. 最后,使用以下脚本创建一个新的计算字段,并传递参数以连接到 TabPy 服务器。

欺诈预测的 Tableau 脚本

延迟交货预测的 Tableau 脚本

根据输出选择 SCRIPT_REAL 或 SCRIPT_STR。一旦你输入脚本,如果你看到“计算是有效的”点击应用,它就完成了。机器学习模型已经准备就绪,现在您可以使用我们创建的参数和计算字段轻松创建交互式可视化。

数据和代码可以在我的 Github 库中找到。

希望那有用!非常感谢你读到这里。你真棒!如果你对这篇文章有任何问题,或者想要联系和交谈,请随时在 LinkedIn 上给我发信息。我将非常乐意与您联系,并尽我所能提供帮助。

错误修复

有些人在 Linkedin 上联系我,说他们有时会得到“runtime error:Load failed:' Load failed:unsupported pickle protocol:5 '。我猜如果你尝试两次部署同一个 ML 模型,就会发生这种情况,解决这个错误的快速方法是从你的 pc 上删除已经保存的 pickle 模型,或者在 Jupyter notebook 和 Tableau 中用新的名称重新部署这个模型。

集成 Python 和 MySQL

原文:https://towardsdatascience.com/integrating-python-with-mysql-4575248d5929?source=collection_archive---------24-----------------------

汉斯-彼得·高斯特在 Unsplash 上拍摄的照片

如何将数据动态加载到数据库中

数据分析师或数据科学家有很多机会使用 Python 和 SQL。Python 及其庞大的库支持为数据分析师提供了一根魔棒来操纵和可视化数据。同样,SQL 帮助我们存储数百万条记录,并与其他表建立关系,以实现最佳的数据管理。有些场景需要 Python 程序将数据直接加载到后端数据库中。例如,如果定期或随机动态修改数据帧,则将每次数据更新的 csv 文件上传到数据库是不可行的。在本帖中,我们将介绍如何将 Python 程序与 MySQL 数据库集成。

首先,我用 Python 创建了一个小数据集。它有两列,第一列存储索引,第二列存储时间戳。

from datetime import datetime # Current date time in local system 
col_1 = col_1+1 
col_2 = datetime.now()
print('ID:',col_1)
print('Timestamp:',col_2)

在 MySQL 中创建表格

同时,我们可以在 MySQL db 中创建一个表,用于存储我们在第一步中生成的数据。也可以在 MySQL 中从 python 本身创建一个表。因为这是一个一次性的过程,所以直接在数据库中创建表会更容易。

#Create table called details.
create table `details`(
Id int(20)  not null,
Time datetime null 
);

连接 Python 和 MySQL

首先,我们需要导入 mysql.connector 包,如果它不可用,那么我们需要使用下面的代码安装它

pip install mysql.connector
#or
!pip install mysql.connector

我们需要从 mysql.connector 导入错误代码。这将有助于在插入数据库时识别问题(如果有的话)。可能遇到的一些错误是主键空错误和重复条目(如果表设置了主键)。

我们需要在代码中指定我们的 MySQL 凭证。我们首先打开一个到 MySQL 服务器的连接,并将变量 connection 对象存储在变量 cnct 中。然后,我们使用连接的 cursor()方法创建一个新的游标。

我们将 insert 语句存储在变量 sql_query 中,变量 info 中的数据用于替换查询中的%s 标记。

execute 语句将执行存储在变量 sql_query 中的查询

一旦执行了上面的代码,让我们检查一下数据库,看看数据是否是动态加载的。

精彩!!数据已经加载。

现在让我们看看如果我运行代码 5 次,数据是如何加载到数据库中的。

每次运行代码或作业时,都会动态加载和刷新数据库。

结论

同样,我们可以从 Python 接口本身执行任何操作,如创建数据库或表、插入、更新、删除和选择操作,这将反映在 MySQL 数据库中。

事实证明,这种集成对于涉及不断变化的数据的场景非常有用。例如,经常从网站上搜集的数据,或者从 Twitter 或脸书 feeds 上获取的实时数据。

Jupyter 笔记本在 Github 上有售。

参考:

[1]https://dev . MySQL . com/doc/connector-python/en/connector-python-example-cursor-select . html

集成 Tableau 和 R 进行回归分析

原文:https://towardsdatascience.com/integrating-tableau-and-r-for-regression-analyses-c3cac7e199cf?source=collection_archive---------34-----------------------

为什么这些工具结合在一起会更好

Tableau 在数据可视化领域掀起了风暴,这是有充分理由的。在其用户友好的界面中,可以快速创建漂亮而复杂的可视化效果、仪表板和报告,而无需任何编码经验。Tableau 对于交互式可视化的创建特别有用,因为只需几次点击就可以将过滤器添加到单个可视化或完整的仪表板中。然而,Tableau 的分析能力有限。计算字段功能允许计算简单的度量值,如平均值、总和以及日期差异,Tableau 具有一些用于添加回归线或识别聚类的内置功能。然而,对于任何类型的高级分析,Tableau 都有所欠缺。

另一方面,r 是由统计学家创造的,因此具有非凡的分析能力。从分析的角度来看,在 R 的内置函数和似乎无穷无尽的可用包列表中包含的函数之间,没有什么是不能做的。然而,R 中的可视化提出了更多的挑战。像 ggplot2 和 plotly 这样的包的开发已经显著地提高了 R 的数据可视化能力,但是这些包仍然没有 Tableau 的界面那么容易使用。在 R 中构建一个设计良好的交互式仪表板或可视化需要相当多的编码能力。即使对于那些具有编码专业知识的人来说,编写 R 代码来使仪表板中的一个图充当其他图的过滤器、添加说明性文本、为特定的可视化重构数据(在 Tableau 中通常甚至是不必要的)、调整仪表板中的图形大小、应用颜色或完成任何数量的其他任务(这些任务可以在 Tableau 的拖放环境中快速完成)也要花费更多的时间。

幸运的是,Tableau 能够连接到 R,使用户能够同时获得这两种工具的好处。为了演示这个过程及其有用性,我将通过一个使用 R 代码和 Tableau 可视化进行的样本回归分析。

步骤 1:在 Tableau 和 R 之间建立连接

为了让 R 和 Tableau 一起使用,必须使用“Rserve”包建立连接。

首先,在 R 中安装“ Rserve ”包,第一个代码选项只是从 CRAN 安装 R 包的标准代码。我还包含了从 RForge 安装“Rserve”包的代码,因为 CRAN install 经常出错。

install.packages('Rserve')ORinstall.packages('Rserve',, "[http://rforge.net/](http://rforge.net/)", type = "source")

接下来,只需加载新安装的“Rserve”包:

library(Rserve)

在 R 中需要采取的另一个步骤是运行下面的命令,该命令设置一个套接字服务器并允许请求发送到 R:

Rserve(args = "--no-save")

Rserve 现在应该可以工作了,所以让我们切换到 Tableau。

在“帮助”下,单击“设置和性能”,然后单击“管理分析扩展连接”:

下面的“分析扩展连接”窗口应该会打开。选择“Rserve”作为分析扩展,选择“localhost”作为服务器,选择“6311”作为端口。输入完毕后,单击窗口左下角的“测试连接”按钮:

单击“测试连接”按钮后,您应该会收到以下消息,表明您的连接已成功建立:

如果你收到这条信息,那么你就可以走了。在本教程的剩余部分,我们将呆在 Tableau 中,尽管我们需要保持 R 运行以维持连接。

步骤 2:运行回归分析

我将在本教程中使用的数据来自 NYC OpenData,代表纽约市在押的囚犯。包括的变量表示属性,例如精神健康指定、种族、性别、年龄、监护级别、法律状态、密封状态、安全风险组成员资格、最高费用和违规标志。这些数据是公开的,可以在这里下载。

我很好奇监管级别(最低、中等或最高)是否能预测一个人是否有精神健康标志,并将创建一个逻辑回归模型,以精神健康标志作为我的结果,监管级别作为我的预测因素。在建立到 Tableau 的连接之前,我使用下面的 R 代码来准备这些数据,并编写一个包含已清理数据的 csv 文件:

library(tidyverse)data = read.csv("./Daily_Inmates_In_Custody.csv") %>% 
  mutate(
    bradh_numeric = ifelse(BRADH == "Y", "1", 
                           ifelse(BRADH == "N", "0", BRADH)),
    bradh_numeric = as.numeric(bradh_numeric),
    custody_numeric = ifelse(CUSTODY_LEVEL == "MIN", "0",
                             ifelse(CUSTODY_LEVEL == "MED", "1",
                             ifelse(CUSTODY_LEVEL == "MAX", "2", CUSTODY_LEVEL))
  ),
    custody_numeric = as.numeric(custody_numeric)) %>% 
  filter(
    custody_numeric == 0 | custody_numeric == 1 | custody_numeric == 2
  )write_csv(data, "./daily_inmates.csv")

一旦此文件连接到 Tableau(在 Tableau 中,单击“连接到数据”,选择“文本文件”,并导航到您的 csv),我们将使用计算字段来创建我们的回归模型。从数据面板的下拉菜单中选择“创建计算字段”:

我将我的计算字段命名为“回归”在 SCRIPT_REAL()计算函数中,您可以在 R 中输入用于分析的代码。如果您熟悉在 R 中使用逻辑回归模型,那么下面的代码看起来会非常熟悉。在 Tableau 中要习惯的一个重要区别是,它不是将变量名直接输入到 glm()函数中。arg”占位符,变量在 glm()代码下指定(参见 Bradh Numeric 和保管数字)。一开始适应起来有点不直观,所以我建议在 R 中运行您的分析,这样您可以检查您的工作。

如果你的计算可以完成,你会看到“计算是有效的。“在左下角。如果你收到这条信息,请点击绿色的“确定”按钮。

现在,您将在屏幕的左侧看到您的计算字段(由#前的等号表示),以及您的数值表元素。

步骤 3:可视化并探索您的回归结果

首先,让我们通过将“保管级别”药丸拖到列中,将“回归”药丸拖到行中,来可视化我们分析中包括的三个保管级别的拟合值。我还在颜色下添加了“保管级别”:

这些拟合值徘徊在 0.5 左右,表明监护水平不是一个人心理健康状况的重要预测指标。但这是 Tableau 真正闪光的地方。假设我们想看看这种关系在种族和性别上有什么不同。在 R 中,回答这个问题需要将种族和性别添加到我们的回归模型中,并根据得到的系数计算出特定人群的合适值。然而,在 Tableau 中,我们可以简单地将这些变量作为过滤器添加到我们的可视化中,并与产品进行交互,以查看哪里的关系更有趣。

将“种族”和“性别”药丸拖到过滤器框中,如下所示:

为了与这些过滤器互动,右击过滤器药丸并选择“显示过滤器”您会看到过滤器出现在屏幕上:

选中所有复选框后,回归拟合值保持不变,因为整个样本仍包含在分析中。然而,通过选择某些方框,很容易看到黑人女性的监护水平和精神健康状况之间的关系:

或者白人女性:

或者亚洲男人:

这些过滤器很容易看出,某些亚人群确实在监护水平和精神健康指定之间存在有意义的关系,并且这些关系在不同的种族和性别群体中非常不同。

*注:该数据集的数据字典不提供所包括的种族群体的描述。因此,我假设单字母的名称代表什么。也不清楚性别指标是否真正代表了性别,或者它是否真的捕捉到了性。

其他应用

在这个例子中,我们使用逻辑回归分析来回答一个解释性问题(精神健康的定义如何因监护级别、种族和性别而不同?),可视化服务于探索这种关系的主要目的。其他分析技术也可以采用类似的方法,如 k-means 聚类,因为 Tableau 的可视化功能提供了一种有用的方法来探索您的聚类在不同的数据子集内如何变化。

然而,Tableau 和 R 的集成具有超越简单探索的巨大潜力。例如,这些工具的集成对于地理空间分析特别有用,因为 Tableau 确实擅长制作地图,但缺乏这种高级的分析能力。此外,这些工具可以结合使用,以更好地可视化预测分析,如线性回归或时间序列分析。需要任何种类的高级分析,以及复杂的交互式可视化和仪表板的项目,可能会从 Tableau 和 r 的组合功能中受益。

Tableau 和 R 的优势可以很好地互补,学习如何一起使用它们可以最大化您的效率,同时增强您的数据可视化产品。

整合 Tensorflow 和 Qiskit 用于量子机器学习

原文:https://towardsdatascience.com/integrating-tensorflow-and-qiskit-for-quantum-machine-learning-7fa6b14d5294?source=collection_archive---------31-----------------------

来源: Pixabay

概观

在标准深度学习库中存在两种流行的量子计算包集成:

  1. 张量流和 Cirq 为张量流量子
  2. Pytorch 和 Qiskit

在本文中,我们将讨论在自定义 Keras 层中集成 Qiskit。

介绍

量子机器学习有一个有趣的应用,即使用量子层来帮助经典神经网络,这些量子层涉及经典无法实现的计算。学术界最近的工作强调了量子辅助深度学习的应用,它可以具有复杂的激活、更好的表示和其他在经典网络中无法实现的显著特征。

对于实现方面,这意味着找到一种在正常的深度神经网络中集成量子处理的方法。有几种方法可以实现这一点。在这里,我们讨论集成 Qiskit 作为 Keras 层的子类。让我们开始吧。

定义量子层

这显然取决于具体的应用。需要记住的是,这一层的输入和输出要保持一致。Tensorflow 2.x 中默认使用eager_execution,因此很自然地会使用numpy数组作为所有量子层的默认输入和输出。

样品量子层

这是一个任意的量子层,接收四个输入,输出一个长度为 4 的 numpy 数组。我们计算标准泡利算符的期望,创建一个列表,并返回它。这一层将根据底层应用程序的具体情况而变化。

与量子层相互作用

现在我们需要创建一个Keras层来整合我们之前定义的量子层。为此,我们需要扩展允许为 Keras 模型编写定制层的tensorflow.keras.Layer类。

子类层

该层根据训练的batch_size接收输入。因此,我们需要确保每个训练示例都通过量子层来创建输出,因此需要循环。

tf.executing_eagerly()很重要,因为它允许我们通过inputs.numpy()将默认输入Tensor转换成一个numpy数组。如果应用程序依赖于 Tensorflow 1.x,则可能会调用tf.enable_eager_execution()来启用急切执行。直观地说,急切执行允许我们在张量的值可用时访问它们。如果它被禁用,我们需要引入 tensorflow 的会话和执行图的复杂性。

构建模型

构建模型很简单。我们可以建立一个功能模型或顺序模型供我们使用。

模型工作流

run_eagerly编译模型很重要。我观察到一些保存的模型在加载后不能像预期的那样工作,如果它们不是在run_eagerly设置为True的情况下编译的话。

保存和加载模型

保存照常进行。然而,加载要求您为我们创建的自定义层定义自定义类。

保存和加载模型

custom_objects允许您定义自定义对象。它需要一个字典,其中的keys对应于您拥有的定制层,它们的values对应于您希望定制层与之相关联的定制类。这有一个微妙的警告:在一些模型的不同训练会话之间,可以改变这些层的实现。如果你有一个在本文前面给出的量子层上训练的模型,可以加载这样一个模型,并在其他一些量子逻辑上重新训练它。

结论

这篇文章是使用 Qiskit 和 Tensorflow 建立一个工作的量子辅助深度学习架构的基本框架。有些事情需要注意:

  1. 计算期望值是一个主要的瓶颈。对于大批量,可能会经历巨大的减速,因为我们已经完全放弃了经典深度学习中矩阵乘法的优势。
  2. 期望值可能真的很小。可以使用适当的标量乘数来放大它们。

希望这将帮助您开始在 Tensorflow 网络中使用 Qiskit powered 层。祝您愉快:)

AI 技术融入课堂:塞翁失马焉知非福?

原文:https://towardsdatascience.com/integration-of-ai-technology-in-classroom-a-blessing-in-disguise-bfb4dce59071?source=collection_archive---------83-----------------------

意见

伦理辩论

斯蒂芬·道森在 Unsplash 上拍摄的照片

想象一下一个未来主义的教室,在那里你作为一名学生不必挣扎着每一秒都集中注意力。您可以获得定制的学习体验,因为该技术可以识别您的个人需求并相应地满足您的需求。你对某个主题缺乏理解的情况会被实时识别出来,你的讲座会被调整以适应你的学习曲线。

另一方面,想象一下在教室或演讲厅里,你的一举一动都被监视着。从你踏进这里的那一刻起。传感器和摄像机会跟踪你的每一个动作,并记录下来作为“数据参考”。您的隐私是毫无疑问的,您的实时敏感数据会受到损害,从而影响教学服务质量的提高。

最终你倾向于哪一方?

这两种情况就像一枚硬币的两面:整合和交错。人工智能又名人工智能技术已经成为改善和升级现有教育系统的焦点。它的主要目标是改善大多数学生当前的学习体验。这项技术的范围和能力是无限的,并且发展势头稳定。各种组织开展了一些研究,以了解人工智能技术对评估他们的能力、风险以及回答某些道德问题的影响。教室中人工智能的当前技术主要是数据敏感、模式识别和通过软件算法进行处理。这些数据可以很容易地整合到机器学习中,以建立一个更强大的平台。

Alex Kotliarskyi 在 Unsplash 上的照片

AI 技术在课堂上我们还有多远?

我们大多数人都没有意识到,我们已经在我们目前的教育系统中集成了人工智能技术的微妙痕迹。例如,预装在 blackboard(在线提交 平台)中的语法检查或抄袭软件就是人工智能的完美例子。这些软件可以很容易地检测出作业是否直接引用了他人的作品,而没有经过他们适当的引用或认可。很快,这种类似的软件就可以升级,以包括检测对等提交之间的转述作业的功能。他们甚至可能使用机器学习(ML)来识别同行之间的常见做法。

已经在许多国家使用的其他基于人工智能的教育模型项目包括:基于人工智能的教学模型,该模型包括实时监控和分析教师和学生在课堂上的表现。然而,在西方世界采用这种模式会引起争议和对隐私问题的担忧。此外,大多数学生可能不适应在教室环境中学习,而更喜欢按照自己的节奏学习。学生也可能有不同的学习风格,并可能不太适应特定讲座中提供的当前教学方法,因为它是实时发生的。因此,通过监控和分析实时表现来定量测量课堂表现可能不是一种合适的方法。

某些 K-12 教室已经在他们的教室中纳入了基于人工智能的项目。它为这些参与的学生提供了发展批判性思维能力的空间。正是这种批判性思维能力最终将发展成为一种高科技编程技能。学生和教育工作者都认为这种方法是积极的,并允许在课堂环境中进行更多的合作互动。

人工智能的未来在我们的教室里会是什么样子?

亚历山大·奈特Unsplash 上拍照

教育机构正在考虑使用这项新技术来监控和收集学生的表现。它最终将允许量化单个学生的学习轨迹。定量研究将允许提前警告班上不及格的学生。人们可以很容易地争辩说,这些方法已经由真诚的教师亲自采用。然而,对于已经全神贯注于他们研究和课程教学职责的教师来说,这样的任务通常是耗时的。其次,当老师接近学生时,这也可能会侵犯学生的自尊。相反,让人工智能技术执行这样的任务可以允许早期检测(通过分析来自人工心理学的模式),并且得出的结论可以通过更高的准确性(忽略人类偏差的影响)来超越。这些信息可以通过应用程序直接传递给学生,以便他们可以调整自己或采取必要的行动。

人工智能技术还可以通过分析之前课程学分和成绩的数据,为个别学生确定选修课程的最佳选择提供空间。这些可以很容易地辅以工业前景,最终最大限度地发挥学生的潜力。人工智能肯定可以补充顾问的角色,并且随着教室中学生人数的增长,人工智能将大有裨益。

将人工智能融入课堂的最大问题和挑战都与网络安全和信息隐私有关。因此,给学生个人选择这种技术应用的自由裁量权可以停止侵犯他们的隐私问题。人工智能的未来充满希望,技术进步的加速将确保我们最终都成为智能城市的一部分。

然而,你的看法是什么?请随意分享你的想法。

免责声明:本文中表达的观点是作者的唯一看法,并不反映出版物的意见或观点。

集成降维方法和神经网络的图像分类

原文:https://towardsdatascience.com/integration-of-dimension-reduction-methods-and-neural-network-for-image-classification-96281963fe24?source=collection_archive---------33-----------------------

莫里茨·金德勒在 Unsplash 上拍摄的照片

使用原始数字图像构建深度网络需要学习许多参数,这可能会降低准确率。可以通过使用降维方法来压缩图像,并且可以将提取的降维特征馈送到深度网络中用于分类。因此,在网络的训练阶段,参数的数量将会减少。主成分分析是一种众所周知的降维技术,它利用原始数据的正交线性变换。在本文中,我们展示了一个基于神经网络的框架,名为 Fusion-Net,它在图像数据集(CIFAR-10)上实现 PCA,然后神经网络应用于提取主成分。我们还在缩减的数据集上实现了逻辑回归。最后,我们比较了使用原始特征和精简特征的结果。实验结果表明,融合网络优于其他方法。

在本文中,我们应用一个名为融合网络的神经网络框架进行图像分类。实施遵循两个步骤:

  1. 我们对原始数据集实施降维技术(PCA)以提取主成分
  2. 提取的成分然后被用作 ML 分类器的输入,如神经网络、逻辑回归等。

数据集规范

我们在一个名为 CIFAR 的图像数据集上进行了实验。CIFAR 数据集是由 Alex Krizhevsky、Vinod Nair 和 Geoffrey Hinton [1]收集的 10 类图像的多类分类的著名图像数据。数据集中的图像有 10 类不同的对象:飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车

图 1 示出了带有图像类别标签的一些样本图像。在本文中,我们使用由 60,000 张图像组成的 CIFAR-10 数据集,它是 8,000 万个微小图像数据集(CIFAR)的子集。数据集中的每个图像都是具有维度的彩色图像(包含 3 个通道)。CIFAR-10 数据集是一个平衡数据,其中每个类包含 6,000 幅图像。我们将数据集分成 50,000 个训练图像和 10,000 个测试图像,保持类别的比例。

图 1: CIFAR-10 数据集

方法

融合网络包括两个主要部分:降维和神经网络。图 2 示出了融合网络的架构,其中神经网络包含四层:输入层、两个隐藏层和输出层。输入层包含由 PCA 提取的特征数量的神经元。第一和第二隐藏层分别包含 128 和 64 个神经元,并且输出层包括 10 个神经元,因为问题是 10 类分类。我们使用类别交叉熵作为损失函数,使用自适应矩估计(Adam)优化器来计算误差和更新参数。

图 2:融合网络的体系结构

我们提出了三种不同版本的融合方法,其中简化的特征分别保留了第一、第二和第三版本的 99%、95%和 90%的数据变化。

降维

我们将每一幅三维彩色图像转换到一维空间,以便应用主成分分析。转换后,每个观察值由 32×32×3=3072 个特征组成,因此对转换后的数据集实施 PCA。图 3 显示了由特征数量解释的变化。原始数据变异的 99%、95%和 90%可以分别由前 658、217 和 99 个主成分解释。仅使用前 21 个分量就可以提取 80%的数据变化。

图 3:由主成分解释的变化

我们在原始数据集上实现了具有相同架构的逻辑回归和神经网络

在 CIFAR-10 原始数据集上的性能评估:我们使用早期停止训练神经网络 100 个时期,并且逻辑回归也应用于原始数据集。通过在测试数据上实现训练好的模型来测量模型性能。表 I 展示了这两个模型在这个数据集上的实验结果。

表 1:不同分类器在 CIFAR-10 原始数据集上的实验结果

神经网络优于 LR 方法,并获得 0.46 的最高准确度分数,而 LR 获得 0.3954 的准确度分数。

在 CIFAR-10 缩减数据集上的性能评估:我们在原始数据集上实施 PCA,并缩减数据集,提取包含 658、217 和 99 个特征的三个不同数据集,它们分别解释了原始数据的 99%、95%和 90%的变化。

我们将具有相同架构的神经网络应用于缩减的数据集。逻辑回归也适用于简化的数据集。表 II 示出了模型在数据集上的实验结果。融合网络优于(PCA+LR)方法,并在三种不同情况下获得了最高的准确率。通过 99 个主成分,融合网络达到了 53.41%的最高准确率。用 217 个特征获得了 0.5307 的几乎相似的精度。Fusion-Net 使用 658 个主成分实现了 0.5194 的精度。对于三个简化的数据集,逻辑回归达到了几乎相似的准确度。

表二:不同分类器在 CIFAR-10 精简数据集上的实验结果

讨论

表 III 显示了 Fusion-Net 针对不同数量的特征尺寸学习的参数数量。随着特征数量的减少,参数的总数呈指数减少。由于训练参数的数量随着特征的减少而减少,训练的计算成本也将随着数据集的减少而减少。

表 III:不同数量特征尺寸的神经网络中的总参数

神经网络使用缩减的数据集比原始数据集产生了更好的结果。通过减少特征,网络学习更少的权重,这可能是产生更好结果的原因,因为我们用 100 个时期训练模型。具有许多时期的微调神经网络模型可能优于融合网络。

图 4 显示了用于构建神经网络的代码。

图 4:神经网络的代码

总之,降维技术可应用于图像数据集,以减少特征的数量,同时保留原始数据集的模式和趋势。深度学习网络可以在减少的数据集而不是原始数据上训练,从而减少训练参数的数量。我们在数据集(原始数据集和精简数据集)上进行了所有实验来评估融合网络。我们通过与融合 LR (PCA+LR)方法的性能进行比较来评估融合网络的性能。实验结果表明,融合网络优于其他方法。

阅读默罕默德·马苏姆博士(以及媒体上成千上万的其他作家)的每一个故事。

你的会员费将直接支持和激励穆罕默德·马苏曼德和你所阅读的成千上万的其他作家。你还可以在媒体上看到所有的故事—【https://masum-math8065.medium.com/membership】

快乐阅读!

商业模式中生成性对抗网络的整合

原文:https://towardsdatascience.com/integration-of-generative-adversarial-networks-in-business-models-47e60263aec4?source=collection_archive---------23-----------------------

由于生成性对抗网络,大公司如何试图创造新的商业模式和改善内部流程

迪米塔尔·贝尔切夫在 Unsplash 上拍摄的照片

对于总是在寻找新的竞争优势的公司来说,生成性对抗网络(GANs)正在成为一个战略话题。事实上,科技公司和消费品牌已经在尝试使用 GANs。

在本文中,我将分享我作为人工智能顾问参与开发基于 GANs 的几个 POC 时学到的东西,帮助您更好地理解它们的技术限制,以及它们从战略业务角度的重要性。

事实上,我的主要任务是找出 GANs 如何改变我们的商业模式,预测它们对我们内部流程的影响,并确定使用 GANs 进行可能合作的有前途的初创公司。

生成性对抗网络?

简而言之,生成对抗网络(GANs)是一类机器学习框架,通过使两个神经网络相互对抗来运行。

GAN 架构首先在 2014 年由 Ian Goodfellow 等人题为“生成对抗网络的论文中描述这是一个在生产、评估和再加工一个创造方面有效率的系统,这就是为什么它被称为人工智能的创造性方面。

这种神经网络架构与之前的生成方法相比,表现出了令人印象深刻的改进,例如变分自动编码器或受限玻尔兹曼机器。

在不涉及太多细节的情况下,一个被称为生成器的神经网络生成新数据。同时,另一个神经网络,称为鉴别器,评估它们的真实性。鉴别器决定它检查的每个数据实例是否属于实际的训练数据集。

发生器输出连接到鉴频器输入。通过使用反向传播,鉴别器的分类提供了生成器用来更新其权重的信号。两者之间的反馈回路可以提高彼此的性能。

在大多数情况下,可以在使用生成模型和技术(如变分自动编码器和像素神经网络)的地方使用 GANs。大多数 GANs 项目依赖于图像数据,并使用卷积神经网络作为生成器和鉴别器模型。使用 GANs 的优势在于,与波尔兹曼机器等传统方法相比,它们更快、更容易训练。

大多数应用程序似乎都与图像/内容生成相关,但可能性非常多。

有条件地产生产出的可能性使得公司对 GANs 非常感兴趣。

GAN 架构

GAN 模型可以以来自领域的示例(例如图像)为条件的事实是一个游戏改变者。事实上,这允许以下应用:

  • 文本到图像的翻译
  • 图像到图像的翻译

从顾问的角度来看,我更倾向于把 GANs 看作一种新的表述问题的方式,而不仅仅是一种特定的算法。事实上,它们可以用来以新的方式重新制定和解决几个现存的商业和 ML 问题。

ML 项目的数据生成

我们想到的 GANs 的第一个直接应用与我们内部项目的数据生成有关。事实上,所有数据科学家都同意的一点是,我们总是需要更多相关数据。

根据使用案例,我们认为 GANs 可以用于在“数据有限的情况下”产生新数据。尽管如此,我们仍然可以依靠数据扩充技术或合成数据,GANs 代表了一个有趣的选择。

此外,GANs 可以发现数据中的结构,从而生成真实的数据。如果我们自己看不到那个结构或者不能依靠其他现有的方法,这可能是战略性的。

GANs 已经被用于数据扩充,例如,为分类生成新的训练图像,改进[合成图像、](http://I expect to see more startups developing offers related to data creating using GANs in the near future. Tailored-made data creation using GANs can become a new business model for startups.)等。这里的关键思想是利用 GANs 生成新的样本来改进其他模型。由于我们已经能够在内部项目中利用 GAN 生成的合成图像进行数据增强,因此结果非常有希望。

一个很好的例子就是医学图像。事实上,收集它们既费钱又费时。我的公司生产许多医疗设备。因此,我们也对应用于医学成像领域的氮化镓感兴趣。

来源

预测#1: 我希望看到更多的创业公司开发与使用 GANs 创建数据相关的服务。使用 GANs 定制的数据创建可以成为创业公司的一种新的商业模式。他们可以根据项目的性质或时间投资将创建的数据货币化。

创造力

GANs 将影响的主要领域之一是创造力。今天,我们已经在考虑为我们的产品启动几个与图像生成相关的概念验证。我相信“ CycleGAN”可能会成为第一个广泛应用于企业的解决方案。

CycleGAN 使用周期一致性损失来实现训练,而无需配对数据。换句话说,它可以从一个域转换到另一个域,而不需要源域和目标域之间的一对一映射。

来源

我们打算使用 GANs 来帮助我们设计未来的产品(照片增强、图像彩色化、风格转换等)。事实上,通过基于机器学习、设计师和 GANs 的专用于情绪分析(社交媒体数据)的工具,我们可以获得新的想法,探索新的未知趋势,并快速确定我们的目标是否会喜欢它们。

预测#2: 我希望看到一些初创公司凭借数据和 GANs,变得专门帮助品牌增强创意流程。创意总监的角色可能会“扩大”。

或许,在不久的将来,无代码人工智能平台将开发一种产品,专门用于根据用户提供的数据集来创造新的设计。这种商业模式可能会引起设计品牌的高度兴趣。GANs 的业务成果可以独立销售,也可以作为订阅模式的一部分。

营销

总的来说,GANs 将对营销职能产生重大影响。我们的目标是使用 GANs 快速增强我们的营销部门。下面,我只提到了我们正在研究的一些内容。

产品描述的改进 在这篇论文的基础上,我们还相信 GAN 模型可以从成功的产品列表或描述中复制文本模式,就我们在电子商务网站上的情况而言。

事实上,即使是最伟大的产品也会因为营销不善而失败。我们的想法是利用 GANs 作为一种测试营销的形式来预测和改善消费者对新产品的反应。

或多或少地使用迪尔-马丁内斯-卡马卢(DMK) 损失函数作为一类新的函数,迫使模型生成的输出包括一组用户定义的关键字,我们相信这将使 GAN 能够推荐一种重新措辞产品描述(在网站或包装上)的方法。

预测#3: 我相信 Airbnb 的经验将激励新的创业公司开发与营销文本样本创建相关的工具。根据产品的不同,初创公司可以收取不同的价格,以帮助小公司改善他们的营销活动。

GAN 生成的内容将变得越来越难以与真实内容区分开来。

跟进这一想法,改进与电子商务相关的流程。营销人员知道,由于冗长的照片,制作模特的视觉效果可能成本很高。GANs 已经被用来创造“人造”模型,比如 Lil Miquela。这种依靠 GANs 来创建与我们的目标受众完全相似的模型的想法可以帮助我们减少营销预算并改善我们的品牌形象…如果这种方法被证明是可扩展的。

预测#4:专门从事 GANs 的初创公司将开发一种利用社交媒体为小品牌创建“人工模型”的服务。他们可能会“出售”它们,或者通过与品牌合作来管理它们。创造这些模式的初创公司也可以采用与传统动画工作室相同的商业模式。我们可能还会看到新的工具,使营销专业人员能够通过订阅模式使用无代码平台创建自己的“人工模型”。

无需创建“人工模型”,我们也在探索姿势引导的人物生成网络。这个研究项目的目的是将图像中的一个对象变换成不同的姿势。这样做的价值在于,我们的产品摄影师可以专注于拍摄一张参考照片,并让 GAN 生成所有其他产品角度。可以想象,这也将转化为电子商务企业的大量时间和成本节约。

来源

预测 5:主要的在线市场或大型科技公司可以开发一个功能,使卖家能够自动生成给定产品的图片,这要归功于 GANs。初创公司也可以通过在线销售产品的甘来专门制作视觉效果(例如 标识 视频 )。

显然,你们中的一些人可能想知道所有的模特和摄影师会发生什么。我相信“真实”内容总会有市场,也许一些客户会更喜欢在社交媒体上推广“真实内容”。然而,对获取高质量培训数据的需求将会增加。

在未来十年,GANs 将加强生殖媒体行业。我可以想象在电影行业的应用(例如:许可一个演员的脸),虚拟现实,设计,艺术等。可以肯定的是,像 Adobe 这样的计算机软件公司将对 GANs 进行大量投资。

我们的客户细分和推荐系统也将受到 GANs 发展的影响。事实上,亚马逊印度机器学习公司的一些研究人员训练电子商务机器人(ecGAN)来达到这个结果。具体来说,ecGAN 探索客户可能做出的所有订单的空间,并找出客户实际上会做出哪些订单。

生成器创建可能的订单组合,而鉴别器决定该订单是否现实。另一个非常有趣的元素是,GANs 的原始训练数据集也可以更新,以包括新的趋势,允许 GANs 推荐当前和未来客户实际上想要一起购买的产品。我们相信这种新模式将提高网站上产品推荐的准确性。

亚马逊印度机器学习的研究人员开发了电子商务条件 GAN (ec2GAN)来预测客户的人口统计数据、销售价格和销售的一般日期。ec2GAN 能够使用其生成的与真实世界数据相似的场景进行准确预测。当跨客户人口统计、价格和季节使用时,ec2GAN 可以为零售商提供宝贵的信息。

我们正在考虑的另一个关键项目是语音营销、AIoT 和 GANs 的结合。

事实上,我们的目标是通过增加一项功能来增强我们的产品,例如,当用户查看产品时,可以使用智能设备提出以下问题:

“你能告诉我,如果我上次去法国南部旅行时买了这件夹克,我会是什么样子吗?”

语音营销:用于通过由人工智能助手(如 Alexa、谷歌助手和苹果 Siri)支持的语音设备接触目标受众的战略和战术。

当谈到营销体验和数据收集时,能够利用生成模型获得非常具体的输出(如上所述)的想法可能会改变游戏规则。

预测#6: 相信 GANs 会成为所有智能设备的嵌入式,会给用户更个性化的体验。大型科技公司可能会使用 GANs 或零射击学习快速开发新功能,并与品牌合作,使用户能够在购物体验中创建独特的内容。

最后,我们也对文本到图像的合成非常感兴趣。想象一下,有一种工具,你可以通过给出描述来创造新的视觉效果。除了为我们的产品创建视觉效果,我们还可以使用这个工具从文本中创建信息图表,或者生成网站设计。

来源

gan 面临的挑战

尽管有这些有前途的应用,但 GAN 在这些配方中的哪一种上比目前的 ML 溶液具有更好的性能仍有待观察。此外,答案可能取决于数据是图像、文本还是两者的组合。

从战略角度来看,GANs 将进一步增加公司对专有数据的需求。这将成为公司之间更大的区分因素。

从技术的角度来看,我们面临着几个与内部 POC 相关的问题。最重要的是可伸缩性。除了部署问题之外,像 GAN 这样的计算密集型神经网络可能很难管理,通常需要几天时间来训练它们。

我还可以提一下,GAN 模型对超参数选择非常敏感,由于发生器和鉴别器之间的不平衡,很容易出现过拟合,发生器往往会崩溃,结果产生的样本种类有限,或者鉴别器可能过于成功,以至于发生器梯度什么也学不到。

有关 GANs 的更多信息,我推荐以下链接:

数据科学家的知识产权

原文:https://towardsdatascience.com/intellectual-property-rights-for-data-scientists-edf987d7ee8f?source=collection_archive---------16-----------------------

可以说是知识产权法 101

卢克·迈克尔在 Unsplash 上的照片

D 数据科学家几乎总是使用他们没有编写的软件和他们不拥有的数据。正是由于开源,他们才能使用 Python 和 R 这样的编程语言,或者 Scikit-Learn 和 TensorFlow 这样的库,或者 SQLite 和 MongoDB 这样的数据库。这不应该被认为是理所当然的。事实上,考虑到知识产权在数据科学领域的重要性和无处不在性,我认为对它的讨论还不够。这就是我写这篇博文的原因。

我将尝试回答以下问题:

  • 哪些知识产权适用于数据科学?
  • 可以随机复制公开的 GitHub 代码吗,别人可以用你的吗?
  • 谁拥有数据和存储数据的数据库?
  • 为什么没有人给神经网络申请专利?

让我们从一个不同的问题开始,为什么知识产权会存在?这不是没有争议的。事实上,对于它们是否应该在如此大的范围内存在,存在着争论。

保护知识产权的主要社会目的是鼓励和奖励创造性工作。人们认为,知识产权刺激投资(时间和金钱)并导致创新。

知识产权的三个主要概念是版权商标专利

版权授予原创作品的作者对(商业和非商业)发行的所有权和专有权。这项权利从产生之时起就存在,这意味着它不需要登记,尽管它可以登记。然而,作品必须固定在有形的介质中(例如在纸上或作为计算机上的比特),所以你头脑中的想法不受保护。显然,除了书籍、绘画和音乐之外,计算机软件也受版权保护。当涉及到数据时,事情变得更加复杂(稍后会有更多的介绍)。然而,重要的是,只有表达本身受到保护,而不是其背后的想法。版权在作者死后至少 50 年内有效。

商标是一个公司(或其商品)区别于其他公司的标志。一个组织的 logo 是受商标保护的,但也可以是像耐克的 Just Do It 这样的一句话。商标不需要注册,而且可以无限期使用。然而,它与数据科学没有太大的关联。

专利相比之下,并不是自动存在的。它们需要应用程序。与版权和商标不同,专利保护的是思想和发明,而不是表达形式。哪些发明获得了专利,哪些不是,一般来说艺术多于科学。专利授予所有者对发明进行商业开发的专有权,期限通常为 20 年。一个著名的专利是 Swiffer 的湿地板片(见专利申请这里)。给软件申请专利也是可能的,但是以后会更多。

除了这三种,商业秘密也经常被认为是知识产权保护的一种方法,尽管不是一种正式的方法。未公开的代码或数据可能被视为商业秘密。

开源许可

知识产权不仅可以通过销售其保护的产品来商业化,还可以通过许可协议来放弃权利本身。换句话说,知识产权的所有者可以将他们的权利授予另一方,通常以版税作为交换(有时甚至是免费的)。这种协议可以专门授予另一方或多方(非排他性许可)。

在数据科学领域,许可非常重要,几乎无处不在。请记住,每一个软件都受版权保护。这意味着,原则上只有他们各自的作者才可以使用 Python、R、Scikit-Learn、TensorFlow 或任何其他软件。令人欣慰的是,开源许可在今天非常普遍。关于开源的确切定义,请参见这里的。大致说来,它的三大支柱是

  • 源代码是公开可访问的
  • 该软件可以免费使用(没有版税)
  • 可以用它制作衍生作品

虽然每个人都可以简单地为一个软件编写自己的开源许可证,但是有许多标准许可证被广泛使用。好处是对于它们包括哪些权利没有(或更少)混淆。根据作者授予的权限程度,开源许可证通常分为三类:

  • 公有土地
  • 许可许可证
  • 版权所有许可证

公共领域(许可)

当一部作品的版权到期时,它就进入了公共领域,这意味着它不再有所有者。任何人都可以随心所欲地使用它。如果作者愿意,现有的版权是否可以转移到公共领域还存在争议。大多数人说不。因此,所谓的公共领域等效许可证被设计成授予与公共领域同等程度的权利。这些都是最不屑一顾的许可证,你可以想象。他们放弃尽可能多的权利;例如,他们通常甚至不要求你注明作者。最常见的公共领域等效许可证是 UnilicenseZero Clause BSD LicenseCreative Commons Zero License(CC0)和Do the Fuck You Want To Public License(WTFPL)。后者很好地概括了这一切。有了这样的许可证,你唯一不能做的事情就是声称作品是你的,因为它属于公共领域。公共领域的现代软件的一个例子是 SQLite。

以下是 CC0 许可证文本的示例。

CC0 许可

无版权
在法律允许的范围内,将作品与本契约相关联的人通过放弃其在全球范围内对该作品的所有权利,包括所有相关和邻接权,将该作品奉献给公共领域。

您可以复制、修改、分发和执行作品,即使是出于商业目的,都无需征得许可。

许可软件许可

仅包含最小限制(如归属条款)的许可证被称为许可软件许可证。在属于这一类别的各种许可证之间,有一些微妙的(和一些显著的)差异。但粗略的说,他们都允许你自由使用和再分发软件,只要你在任何衍生作品中注明原作者的归属(归属条款)。然而,许可许可证的一个主要限制是,它们不保证软件的未来版本仍然可以公开获得,即软件可以在以后由作者拥有。最常见的许可软件许可证是麻省理工学院许可证。同样很常见的还有 BSD 许可证Apache 2.0 许可证

数据科学家使用的许多软件都有某种许可的开源许可证,包括 Python、Julia、PyTorch 等等。Apache 软件基金会维护的项目值得特别关注,因为它们包括 TensorFlow、Hadoop 和 Spark。这里有一个例子。

麻省理工学院许可证

版权所有 2020 Andreas stffelbauer

特此免费授予获得本软件和相关文档文件(“软件”)副本的任何人不受限制地经营本软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售本软件副本的权利,并允许接受本软件的人按照下列条件这样做:上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。

本软件按“原样”提供,不提供任何形式的担保[…]

版权所有许可

与许可软件许可证相反,所谓的左版权许可证是互惠的,因为它们要求任何衍生作品具有相同的许可证条款,即具有完全相同的版权许可证。一个主要的动机可能是确保软件保持自由,这在许可许可证下是没有保证的。GNU 通用公共许可证 (GPT)和 AGPL 是最常见的左版权许可证。受版权保护的最著名的软件是 Linux。

数据科学家和软件许可

您可能已经意识到,您不能简单地复制和使用您在 GitHub 上找到的任何代码。如果存储库中包含许可证,请检查允许您对代码做什么。但是如果没有许可证,代码仍然受到版权法的保护,不允许你复制它——代码是公开的这一事实没有任何区别。然而,话虽如此,你并没有因为一段无关紧要且显而易见的代码而侵犯版权;说一个简单的 for 循环;通常只有一种显而易见的编码方式。另外,记住受版权保护的只是代码,而不是背后的想法。因此,举例来说,只要你按照自己的方式去做,就没有什么可以阻止你构建一个新的张量流(就像 PyTorch 所做的那样)。

通常,当涉及到常见的数据科学工具时,数据科学家不必过于小心。只要他们有某种开源许可(他们通常都有),你就可以开始了。当然,也有专有的数据科学软件如 MATLAB、SAS、Tableau,但你无论如何都不会在 GitHub 上找到那些。专有软件的许可通常更加个性化。

如何开源自己的代码?要开源您自己的库或项目,您首先必须考虑哪种许可证适合您的需求。GitHub 有一个专门的帮助页面(见这里)。主要步骤非常简单:您需要做的就是将您的条款和条件作为许可文件包含在您的存储库中。同样,GitHub 让您只需点击几下鼠标就可以添加最常用的许可证。这就是为什么你会在很多 GitHub 仓库中找到 license.mdlicense.txt 文件。

照片由马库斯·温克勒Unsplash 拍摄

数据科学家的软件专利

如前所述,版权只保护计算机程序的文字表达,而不保护其背后的思想,后者通常更有价值。因此,许多公司想要开源的反面,即保护他们的代码。专利将是合理的解决方案。然而,给软件申请专利相对来说并不常见。首先,想想这样一个事实,专利要求完全公开源代码,这将允许其他人对其进行逆向工程。相比之下,简单地将代码保密(商业秘密)在许多情况下可能比专利更有效。

神经网络等算法呢?专利算法是一个更加微妙的问题,随着人工智能的进步,它将变得更加重要。这不仅是一个法律问题,尤其是一个道德问题。

原则上,事实是不可专利的,因为像神经网络这样的机器学习算法基本上是数学方法,所以它们不受保护。但是,应用到某个问题上,算法可能会成为专利的一部分。所以,是的,如果以正确的方式设计,为算法申请专利是可能的。例如,生成某种音频的深度学习算法可能是合格的。但这并不妨碍该网络应用于任何其他问题。

此外,我认为软件专利的执行非常困难,机器学习领域发展太快,许多专利不值得冗长的申请。或许一旦更强大的人工智能算法出现,专利将发挥更大的作用。但是,这也有伦理问题。

知识产权和数据

对于数据科学家来说,数据所有权显然是一个重要的话题,但它并没有被真正地讨论过很多。一般来说,版权适用于数据。然而,数据不同于软件或其他创造性的表达方式,因此值得仔细研究。

首先,任何受版权保护的东西都必须是创造性的。这排除了仅仅代表事实的数据,如天气、体育赛事或股票价格的数据——也许大多数存在的数据由于这个原因而免于保护。

版权保护除了创意,总是需要固定在某种有形的媒介上。就数据而言,这自然意味着数据集数据库发挥着核心作用。事实上,数据库的版权必须与其内容(即数据)的版权区分开来。完全可以想象(甚至常见)的是,在数据库中组合数据的创造性方式享有版权保护,而数据本身却没有。例如,著名的 MNIST 数据集有版权(但作者将其公之于众)。

然而,就像软件一样,保护数据知识产权的最有效方法可能就是保密。不管有没有版权,这意味着其他人不能使用它。道德问题再次出现,尤其是涉及到个人数据的时候。

简而言之,虽然大多数数据不受版权保护,但数据的组织方式有时却受版权保护。然而,就数据而言,商业秘密可能比版权起着更重要的作用。

结论

虽然我很想为数据科学家写更多关于知识产权的东西,但这是一个很大的话题,这篇博文只是一个介绍。特别是关于软件专利和数据所有权的部分需要更多的解释。事实上,例如,关于知识产权如何与机器学习和人工智能相关联,还有很多要说的。此外,我没有谈到版权和专利是否超越国界适用。我只涉及了一些伦理问题。这些只是我想更多了解自己的一些话题。

带有随机森林和开放街道地图的智能建筑简介

原文:https://towardsdatascience.com/intelligent-architectural-briefs-with-random-forest-and-openstreetmaps-d577fc01f3ce?source=collection_archive---------37-----------------------

如何开始

我们能否根据位置数据创建一个建筑物预测系统?图片作者。

鲁特维克·德什潘德和塞杰尔·维贾伊·帕特尔

智能建筑简报

每一个建筑设计都是建筑师对客户简报的回应,这是一份包含项目所有要求的文件。它的工作是解释所有的设计约束和目标,并涵盖诸如建筑面积,潜在租户和建筑类型等主题[1]。要写一份好的简报,客户必须考虑各种因素,包括城市分区、现金流预测、土地价值以及隐性商业知识。甚至在画出一条线之前,一份好的简报就能影响财务可行性、可持续性,甚至建筑设计的质量。

在这篇文章中,我们将探讨如何应用机器学习(ML)来增强简报过程。目前,任何人都可以访问描述建筑类型、租户、财产价值和位置能源使用的免费数据宝库。使用 ML 可以识别这些数据集之间的隐藏关系,从而预测特定位置新建筑的需求。

在下一节中,我们将解释如何做到这一点。我们展示了如何用 Python 建立一个项目,从一个免费的数据源中学习,为一个假想的苏黎世开发项目做出基于位置的预测。

我们将展示如何用 Python 建立一个项目,从一个免费数据源中学习,为苏黎世的一个假想开发项目做出基于位置的预测。

入门指南

为了简单起见,下面的示例主要基于从上下文数据中提取的属性来预测建筑类型。要完成本教程,您需要注册 Jupyter Notebook,这是一个 web 应用程序,允许您创建和共享包含实时代码、等式、可视化和叙述性文本的文档。

为了帮助你,我们在 GitHub 资源库 这里 共享了这个项目的所有代码。

公式化问题

ML 开发流程概述。图片作者。

第一步是想出一个你试图回答的好问题。这将需要一些数据科学的技术知识以及你给定主题的领域知识。一个正在进行的建筑辩论是是否采取“突出”或“适应”的位置。对于这个项目,我们采取了“合群”的方式。基于这种方法,我们需要考虑我们有什么可用的数据,以及 ML 模型可以提供什么类型的答案。

一个正在进行的建筑辩论是是否采取“突出”或“适应”的位置

数据收集

第二步是收集用于训练模型的数据。对于这个例子,我们使用 OpenStreetMaps(OSM);一个协作性的免费全球制图 API,以 JSON 文件格式提供关于不同城市的 2D 和 3D 地理数据。OSM 是一个“结构化数据集”,这意味着坐标、街道名称、邮政编码、建筑物几何图形和建筑物属性等文本和数字元素都以表格格式组织。结构化数据使得训练机器学习模型变得更加容易。

OpenStreetMaps 搜索苏黎世,显示 2D 和 3D 上下文信息。图片作者。

由于我们的代码是用 Python 编写的,而 OpenStreetMap 的数据是以 JSON 格式存储的,所以第一步是将其转换成一种叫做“Pandas DataFrame”的 Python 数据结构。

# Inspect the OSM Datawith open(‘Desktop\osm-Zurich.json’, ‘r’) as f:# Loading the json datadata = json.load(f)# normalizing it and converting to pandas data framedata = pd.json_normalize(data)print(data.columns)# Columns> [‘highway’, ‘route’, ‘oneway’, ‘crossing’, ‘sidewalk’, ‘building’,‘building_3d’, ‘building_3d_random’, ‘craft’, ‘geological’,‘topography’, ‘contours’, ‘waterway’, ‘leisure’, ‘amenity’, ‘emergency’,‘cycleway’, ‘busway’, ‘bicycle_road’, ‘driving_side’, ‘embedded_rails’,‘historic’, ‘landuse’, ‘man_made’, ‘military’, ‘natural’, ‘office’,‘power’, ‘public_transport’, ‘railway’, ‘bridge’, ‘shop’, ‘sport’,‘tourism’, ‘telecom’, ‘place’]

预处理

第三步是处理我们的输入数据。我们必须清理数据,这意味着我们只使用与我们的设计问题相关的数据点。这个过程被称为特征工程[3]。OSM 数据包含各种各样的要素,找到正确且有用的要素是一项艰巨的任务。正如人们所说的“垃圾进来,垃圾出去”;因此,拥有正确的数据作为机器学习模型的输入是必要的一步。

目标变量是我们将使用数据中的其他输入要素进行预测的要素或变量。对于这个示例项目,我们关注的目标变量是建筑属性类型(即。建筑使用)。为了训练我们的机器学习模型,我们将使用 OpenStreetMap 数据的以下特征来预测新开发站点的目标变量。

  1. 建筑周长
  2. 相邻建筑的数量
  3. 邮递区号
  4. 行号代名
  5. 发射阵地地域
  6. 现场周界
  7. 半径为 50 米、100 米和 200 米的建筑物数量

我们将把点(建筑物的坐标)转换成的几何图形。Shapely 是一个 Python 包,用于平面数据的空间分析以及处理计算几何。

*# Converting the points into shapely geometriesdf[‘geometry’] = df[‘points’].apply(lambda x : (Polygon(x)))# Extracting various features using “geometry”df[‘centroid’] = df[‘geometry’].apply(lambda x : x.centroid)df[‘perimeter’] = df[‘geometry’].apply(lambda x : x.length)df[‘Site’] = df[‘geometry’].apply(lambda x : x.minimum_rotated_rectangle)df[‘Site_Perimeter’] = df[‘Site’].apply(lambda x : x.length)df[‘Site_Area’] = df[‘Site’].apply(lambda x : x.area)df[‘area’] = df[‘geometry’].apply(lambda x : x.area)# Finding the number of neighbors at different distances using pySAL libraryrW = Rook.from_dataframe(df)df[‘neighbors’] = rW.cardinalities.values()dis_band = DistanceBand.from_dataframe(df, threshold = 200)df[‘neighbors_in_200’] = dis_band.cardinalities.values()dis_band1 = DistanceBand.from_dataframe(df, threshold = 100)df[‘neighbors_in_100’] = dis_band1.cardinalities.values()dis_band2 = DistanceBand.from_dataframe(df, threshold = 50)df[‘neighbors_in_50’] = dis_band2.cardinalities.values()*

预处理后,数据被分成训练集和测试集,这两个集的每一个又被分成标签和特征。

*# Divide the data into features and labels(Building Programs)y = df1[‘attributes.type’]df1.drop([‘attributes.type’],axis = 1, inplace = True)# Divide the dataset into training and testing data; X_train — training features, X_test — testing features, y_train — training labels, y_test — testing featuresX_train, X_test, y_train, y_test = train_test_split(df1, y, test_size=0.2)*

培养

在这个例子中,我们开发了一个 ML 模型,根据位置和周围的上下文信息来预测建筑物的属性。图片作者。

第四步,训练我们的机器学习模型。机器学习模型是一个经过训练的文件,可以识别数据集中要素之间的隐藏关系。训练是模型使用特殊算法分析部分数据集的过程。在这一步,输入特征(预测变量)被映射到我们预测的变量(目标变量)。然后将这些学习到的模式应用于测试数据的输入特征,以预测所需的结果,即标签。

我们使用“随机森林分类器”来分类(预测)一组离散值,在这种情况下,是特定位置的建筑物属性。虽然这里可以使用其他分类算法,但我们选择随机森林,因为它相对容易实现。随机森林的工作原理是基于训练数据的随机片段构建一组决策树。最终输出是每个单独决策树输出的平均值[4]。

*# Fit the modelclf = RandomForestClassifier(random_state=0)param_grid = {‘n_estimators’: np.arange(50, 200)}grid_search = GridSearchCV(clf, param_grid=param_grid, cv=10, verbose=3, return_train_score=True)# Hyperparameter tuning using Grid Searchgrid_search.fit(X_train, y_train);*

这里我们使用交叉验证和超参数调节梯度搜索的方法来确定模型训练的最佳参数。

*# We want optimal number of estimators for the model, so this would be the parameter for Grid # Searchparam_grid = {'n_estimators': np.arange(50, 200)}grid_search = GridSearchCV(clf, param_grid=param_grid, cv = 5, verbose=3, return_train_score=True)# Hyperparameter tuning using Grid Searchgrid_search.fit(X_train, y_train);*

模型评估

一旦我们在训练数据上训练了 ML 模型,我们需要使用测试数据集来评估它。

在本例中,我们使用测试数据(X_test)的输入特征/变量来预测建筑物属性,即我们的目标变量(y_test)。该模型将从训练数据中学到的模式应用于测试数据。

*# Predict the building programs for test data sety_pre = grid_search.predict(X_test)*

最后一步是评估模型,以计算其准确性,这样我们就可以了解我们对预测结果的信心程度。

*# Get the Accuracy Scoreprint(‘Accuracy: %.4f’ % accuracy_score(y_test, y_pred))*

在这种情况下,预测准确率为 61.1 %。准确性是一种衡量标准,用于评估我们的机器学习算法基于输出所取得的成功。在这个示例中,准确性很低,因为我们在训练数据中仅使用了 100 个数据点。

最终想法

这篇文章概述了一个初步的想法和一个例子来强调 ML 和开放数据可以在架构师-客户简报过程中使用。虽然我们已经提供了一个相对简单的例子,这里描述的方法可以进一步改进,并应用于预测设计概要的更具体和有用的方面。这可以扩展到建筑规模、理想租户和能源使用,形成简报推荐系统的基础。

N O T E S

  1. 詹森,我叫安克尔。"包容性简报和用户参与:丹麦媒体中心案例研究."建筑工程与设计管理 7.1(2011):38–49。网络。
  2. 关于融入与突出环境的更多信息,请参见“清晰的城市:让杰出的建筑融入日常环境”
  3. 参见'特征工程'<https://en . Wikipedia . org/wiki/Feature _ Engineering #:~:text = Feature % 20 Engineering % 20 is % 20 过程,as % 20 applied % 20 machine % 20 learning % 20 本身。>
  4. https:见“随机森林分类”</https:>

关于作者

鲁特维克·德什潘德Digital Blue Foam 的机器学习和数据科学研究实习生,也是 @NITRR 的建筑学学生。他对 AEC 行业的数据科学、机器学习和人工智能感兴趣。他还是一名计算设计、城市分析爱好者,也是一名卡格勒。

Sayjel Vijay PatelDigital Blue Foam 的联合创始人兼首席技术官,也是迪拜设计与创新学院的创始助理教授。他毕业于麻省理工学院建筑与规划学院。Sayjel 因其为 3D 打印行业开发概念设计软件的研究获得了广受好评的红点设计奖

智能自动化 RPA 和数据科学之间的共生关系

原文:https://towardsdatascience.com/intelligent-automation-a-symbiotic-relationship-between-rpa-and-data-science-632af34555e3?source=collection_archive---------35-----------------------

组织应该如何建立他们的自动化和分析任务组,同时避免“孤岛化”陷阱?

列宁·艾斯特拉达在 Unsplash 上的照片

在这篇文章中,第一部分是我试图澄清 RPA 和 AI 之间的误解。然后,我介绍了一个组织的技术采用图,这些组织正在开始这个“智能自动化”之旅。第 3 部分是我为 RPA 和数据科学这两个部门提出的合作框架。最后,第 4 部分通过提供协作用例来结束本文,在这些用例中,双方都可以发挥他们的真正潜力。

目录

1。从 RPA 到数据科学(?)
2。RPA &数据科学采用图
3。4.0 时代的设计
4。协作用例

1.从 RPA 到数据科学(?)

对于那些不知道什么是机器人过程自动化(RPA)的人来说,这里有一个来自 KPMG 的 3 分钟的简短介绍

RPA:它是如何工作的?来源:毕马威 Youtube 频道

总而言之,RPA 是可以轻松编程的软件,可以像人类工人一样跨应用程序执行基本任务。RPA 软件旨在减轻员工重复、简单任务的负担。

来源:Investopedia

RPA 和机器学习程序如何以不同的方式处理这些问题,如下所示:

图一。机器人流程自动化 vs 机器学习工作流程

RPA 可以被认为是“基于规则”的软件机器人,需要从开发人员那里获得手动指令,而机器学习程序可以“学习变得更聪明”版本的自己。

任何精通 RPA 的人在其职业生涯中都至少见过一次下图 3 中的图表。这是一个渐进的图表,讲述了基于规则的软件机器人进化成为自主生物的故事,假设组织遵循正确的道路。虽然这对大众来说很容易理解,但我认为这不应该被用作“智能自动化”的标准蓝图。

图二。从流程驱动到数据驱动。由 CFB 机器人T5【机器人过程自动化与人工智能的区别】

原因如下:

  1. 图表中“机器学习”(ML)和“人工智能”(AI)的定义具有误导性。我们大多数业内人士都会同意一个更“清晰”的版本,如下图 3 所示。简而言之,RPA 应该已经被归类为人工智能,或者更具体地说是“低级人工智能”。因此图 2 中的线性关系不正确。

图 3。深度学习如何是机器学习的子集,机器学习如何是人工智能(AI)的子集。照片由avimanyu 786/CC BY-SA

2.这并不意味着你的公司必须先有 RPA,然后再向“ML & AI”前进。许多组织已经开始同时投资这两个领域。然而,在大多数情况下,负责这两个工具包的部门并没有紧密合作。

“智能模块”有一个价格标签:它们通常是“黑匣子”,成本很高!

3.许多 RPA 提供商现在已经将 ML“模块”注入到他们的工具中,以便客户可以体验“智能自动化”。对于希望部署智能 RPA 机器人而无需在数据科学能力上投入大量资金的客户来说,这是一个很好的方法。然而,常见的情况是,这些模块通常以“黑盒”的形式出现——这意味着客户端的定制程度很低,必须依赖于提供者。因此,从长远来看,这可能会导致成本增加和失控。

RPA 开发人员不是被雇佣来构建机器学习代码的(或者至少…现在还不是)

4.这扩展了上面的原因(3):大多数时候,RPA 提供商免费创建智能模块,并允许客户定制它们(例如, UiPath Marketplace ,在那里人们可以共享和重用智能活动)。虽然组织可以培训已经熟悉标准化流程的员工(或雇用外部人员)成为 RPA 开发人员,但对于这些人来说,调试或从头构建定制智能模块以完成预测任务是一项挑战— 您需要数据分析师/科学家来完成这项任务

在进入下一部分之前,我强烈推荐大家阅读CFB 机器人的《机器人过程自动化和人工智能的区别》,他们从不同的角度解释了图 1

RPA 和数据科学采用图

图 5。 RPA &数据科学采用图

我在上面创建了一个简单的地图,旨在可视化组织在通往真正智能自动化的道路上的旅程:

低 RPA —低 ML

  • 这个方框代表仍然对这两个工具包持怀疑态度的组织。也许他们没有看到他们的行业对技术的需求,或者他们只是喜欢等待其他结果。
  • 此处列出了针对 RPA 和数据科学开展试点案例的组织。许多项目处于酝酿阶段,还没有向整个组织发布。
  • 此时,根据“创新扩散”理论,它们可以被归类为“后多数”或“落后者”。

高 RPA —低 ML

  • 这一部分的公司通常是保守的,喜欢走稳定的道路。他们已经成功地让员工加入 RPA-train(以及法律和合规部门),并拥有合适的基础设施和专家。
  • RPA 是一种简单明了的技术,可以很容易地向人们解释,而数据科学(尤其是“机器学习和深度学习”)听起来仍然“神秘”和“难以”理解。RPA 可以通过可衡量的 KPI(ROI)快速产生结果
  • 于是,这就是中短期内容易捕捉且性价比极高的“低挂果实”。

RPA 可以通过可衡量的 KPI(如 ROI) 快速产生结果

低 RPA —高 ML

  • 这是一个有趣的盒子:属于这里的组织不一定忽视RPA 的存在。他们中的许多人被组织的文化或法律(例如法律、工会、合规……)所禁止。
  • 如上所述,RPA 是一种简单明了的技术,这也意味着每个人都可以理解它的工作原理。工人们害怕被取代,这已经在许多地方发生了。因此,如果这个机构没有一个关于如何获得每个人支持的可接受的计划,这可能是一个的艰难旅程
  • 另一方面,这些机构的高级分析能力已经建立起来,因为它们是从通信、营销和销售等其他部门发展而来的。该组织中的数据科学家/分析师/工程师可能会专注于描述性和预测性任务,但会留在各自的部门中支持高级决策流程。

作为许多行业中数据科学项目的本质,在大多数情况下,结果需要很长时间来通过活动和反馈进行验证(细分或预测的情况)。

高 RPA —高 ML

  • 截至 2020 年,我相信有一些公司已经达到了这个黄金标准。他们已经成功建立了高级分析和自动化任务组。
  • 数据科学部门帮助开发认知模块,而 RPA 部门推出机器人进行测试,并将结果反馈到循环中,以更智能地训练 ML 模块。
  • 这需要两个部门之间的紧密合作:可以建立不同的敏捷团队(任务组),共同关注和处理来自内部客户的一些特定请求。或者构建一个中央 RPA 中心,让一些专门的数据科学家/分析师坐在同一个地方。

4.0 时代的设计支柱

那么,我们如何确保这两个部门之间以及他们与客户之间的合作呢?下面的信息图展示了工业化 4.0 时代的四大设计支柱。遵循这些支柱不仅可以帮助 RPA 和数据科学这两个部门使用共同语言,还可以建设性地向业务客户展示他们的项目。

4.0 时代的设计支柱

协作用例

在这一部分,我解释了两个用例,它们代表了这两个部门如何和谐地一起工作。

每周预测报告

发送每周预测报告

在这个假设的用例中,业务客户希望每周将所有的销售预测报告发送给他们输入包含历史数据、沟通材料(新闻稿、财务报表等)。),以及内部数据(CRM)。

  • RPA 部门创建机器人将数据收集到一个合并的地方→ 将数据转发到财务部手动执行预测 离线通过电子邮件将预测结果自动发送给客户将输入内容反馈到* 仪表板。*

财务部门手动离线准备预测报告可以由 RPA 部门在数据科学团队的帮助下构建的预测模块取代

  • 数据科学部门也可以自己搭建数据采集模块。然而,他们往往没有正确的权限访问所有的原始数据(由于敏感性或隐私问题)。RPA 团队(已经获得法律部门的许可)可以从程序接口获取数据(从邮箱读取电子邮件、从 SAP 系统下载文件等)。)因此,轻松构建提取脚本。
  • 预测结果最终确定时,RPA 团队可以创建机器人每周将这些报告直接发送给客户。在一些迭代之后,真实数据被再次反馈到 ML 模块以重新训练算法。因此,这是一个循环,一旦它完成,维护将是最低限度的优化成本。

总结和报告

对文件进行汇总和分类,然后向客户发送反馈和报告

此用例扩展了上面的用例,其中业务客户希望汇总分析的所有沟通材料,并将其放入各自的模板(例如,财务报告、时事通讯、特定主题格式……等。)和用于 KPI 查看的仪表板。

在这里,RPA 部门将负责输入和输出流,而数据科学部门构建 *natural language processing scripts*来处理需求。

在测试了针对*sentiment analysis**text classification* 的解决方案后,数据科学团队可以将其 ML 模块集成到 RPA 工作流中。RPA 团队只需自定义模块的输入和输出即可正常工作。

最后,当计算结果时,RPA 机器人可以将它们放入模板中,并自动向相应的客户端发送电子邮件。还可能为他们提供一个交互式反馈链接,将数据反馈给工作流。

关闭

组织可以通过多种方式开始他们的数字化之旅,其中之一就是建立数据科学和流程自动化部门。然而,为了确保两个部门之间的合作,机构需要定义明确的职责,让合适的人参与进来,并实施共同的工作框架。

感谢阅读!如果你能留下回复,我会很高兴,我们可以进一步讨论这个话题。

放弃

本文中表达的所有观点都是我个人的观点,不代表我曾经、现在或将来隶属的任何实体的观点。

注释者间协议(IAA)

原文:https://towardsdatascience.com/inter-annotator-agreement-2f46c6d37bf3?source=collection_archive---------4-----------------------

作者图片

分类标注的成对 Cohen kappa 和群 fleiss kappa(𝜅)系数

在这个故事中,我们将探索注释者间协议(IAA ),这是对多个注释者为某个类别做出相同的注释决定的一种度量。受监督的自然语言处理算法使用带标签的数据集,该数据集通常由人来注释。一个例子是我硕士论文的注释方案,其中推文被标记为辱骂性的或非辱骂性的。**

IAA 向您展示了您的注释准则有多清晰,您的注释者对它的理解有多一致,以及注释任务的可重复性有多高。这是分类结果的验证和重现性的重要部分。

准确性F1 得分没有考虑到人们注释实例时很可能出现的期望机会一致。考虑预期机会协议的措施:

  • 科恩的𝜅:两个注释者用一个类别注释每个实例
  • 弗莱斯的《𝜅:》每一个例子都用一个类别进行了注释《𝑛时报》

这个故事涵盖了注释的最佳实践,并探索了定性注释的两个 IAA 度量标准:Cohen 和 Fleiss 的 kappa。Cohen kappa 是在一对注释者之间计算的,而 Fleiss 的 kappa 是在一组多个注释者之间计算的。

Kappa 统计定义

注释设置

监督学习是基于示例输入-输出对学习将输入映射到输出的函数的机器学习任务。它从由一组训练样本组成的带标签的训练数据中推断出该函数。

在注释数据时,最好让多个注释者注释同一个训练实例来验证标签。当多个注释者注释数据的相同部分时,我们能够计算观察者之间的一致或 IAA。

为了我的硕士论文,我和 44 个本科生一起工作,分成 11 组。每个人都标注了 100 条独特的推文和 50 条重叠的推文,其他三个小组成员也标注了这些推文。这导致四个不同的注释者发布了 50 条带注释的 tweet,一个注释者发布了 400 条 tweet。

科恩卡帕

Cohen 的 kappa 系数( κ )是一个统计量,用于度量标注者之间对于定性(分类)项目的可靠性。这是一个比简单的百分比协议计算更稳健的衡量标准,因为 κ 考虑了协议偶然发生的可能性。它是两个标注器之间成对的可靠性度量。

科恩的卡帕统计量是两个评价人之间的一致,其中 Po 是评价人之间相对观察到的一致(等同于准确度),而 Pe 是机会一致的假设概率。下面是该评估指标的编程实现。

****注意注释列表必须按照相同的索引排序。ann1[0]ann2[0]应该代表同一个带注释的实例(tweet)。

弗莱斯卡帕

Fleiss' kappa 是一种统计方法,用于在给几个项目分配分类评级或对项目进行分类时,评估固定数量的评价人之间的一致性的可靠性。它是 Scott 的 pi (𝜋)评估度量的一种推广,将两个标注器扩展到多个标注器。斯科特的 pi 和科恩的 kappa 只适用于两位评分者,而弗莱斯的 kappa 适用于任何数量的评分者,他们对固定数量的项目进行分类评分。除此之外,并不是所有的评定者都需要对所有项目进行注释。

感谢 Skylander86 对用 Python 实现 Fleiss kappa 的贡献。我只是复制了他的代码,并添加了注释来解释发生了什么。

Kappa 统计解释

如果评定者完全同意,那么 κ = 1 。如果评定者之间没有达成一致(除了偶然预期的情况),那么 κ ≤ 0

卡帕诠释,来源

摘要

  • Cohen kappa 只有两个注释器,每个注释器注释每个项目。
  • 由于机会协议的计算方式,科恩的𝜅比斯科特的𝜋信息量更大:后者对每个评分者使用一种分布,而前者使用不同的分布。
  • 弗莱斯的卡帕是斯科特的𝜋对两位编码员的延伸(不是科恩的𝜅).
  • Fleiss 的 kappa 可以有任意数量的注释器,每个项目不一定都由每个注释器进行注释!

在下面的包中也有 Cohen 和 Fleiss 的 kappa 统计的实现,所以您不必为它们编写单独的函数(尽管这是一个很好的实践!).

**import sklearn
from sklearn.metrics import cohen_kappa_scoreimport statsmodels
from statsmodels.stats.inter_rater import fleiss_kappa**

希望这个故事向您展示了如何计算 IAA 来验证您的结果并提高您的实验的可重复性!完整的脚本可以在这里找到。

干扰分析——对控制变量进行适当调整(第 4 部分)

原文:https://towardsdatascience.com/interaction-analyses-appropriately-adjusting-for-control-variables-d34dfbdd781a?source=collection_archive---------48-----------------------

交互分析中夸大的假阳性,以及如何消除它们。

[这最初发布在我的博客

在本系列的前几篇文章中,我谈到了交互分析的计算能力(第 1 部分),解释交互效应大小(第 2 部分),以及交互需要多大的样本量(第 3 部分)。在这里,我要谈谈一个我非常关心的问题——控制变量!

“什么?”你问,“交互控制变量不是和其他回归一样吗?”答案很简单……不会!

假设你有一个回归— Y ~ X + C 。这是我的“控制”变量——这些变量代表了我们想要考虑的潜在影响。如果我们想要测试一个交互,也就是“适度”,我们的回归可能看起来像这样— Y ~ XM + X + M + C* 。x * M’是我们感兴趣测试的交互作用。但是我们还没完!我们还没有对控制变量的所有可能影响进行调整。直觉上,由于我们的假设是相互作用,我们需要控制潜在的替代相互作用。我们最终的回归方程应该是这样的——Y ~ X * M+X+M+C * X+C * M+C

我第一次意识到这个问题是因为 Matthew Keller 博士的一篇关于 x 基因环境分析的统计控制的优秀文章。他引用了 1992 年由赫尔、泰德里和赫恩撰写的一篇文章,该文章指出了这个问题(这是我所知道的关于这个问题的最古老的文章)。还有一篇由 Yzerbyt、Muller 和 Judd 于 2004 年撰写的优秀论文,在我看来,这篇论文对驱动这些额外控制的必要性的潜在因素给出了最好的解释。

真的,你应该去看看 Yzerbyt、Muller 和 Judd 的论文。简而言之,在两种情况下,不包含而不包含协变量 x 预测因子交互项的回归模型将具有增加的假阳性 : (1)当协变量和预测因子相关时,以及(2)当协变量 x 预测因子交互本身与因变量 y 相关时。这里我复制了它们的图 1 ,显示了这些影响:

模拟数据,所有变量都是连续的,正态的。模拟样本量 N=200,X 和 M 的主效应 r=0.2,X 和 M 不相关,X*M 交互效应 r=0。c 具有 r=0 的主效应,并且与 M (r=0)不相关。每个点代表 10,000 次模拟中假阳性的比例,总共 190 万次模拟。代码在这里可用。

该图清楚地表明了假阳性(I 型错误;当真实效应为 0 时,检测到显著效应)随着协变量和预测因子之间的相关性增加,以及随着协变量 x 预测因子交互作用的影响增加而增加。这是个问题吗?我真的觉得是。即使是 6%的假阳性率对任何个人发现来说都是一个巨大的问题,并且在一个领域或知识体的水平上,可能导致高度偏见的文献。(注意这不是特定领域的,这适用于任何交互分析,所以我在这里不只是谈论心理学或神经科学)。我没有关于这个问题有多大的可靠数据,但是我已经阅读和评论了很多不包括这些额外协变量的论文。

最简单的解决方法是在你的模型中包含所有的预测协变量交互作用!当然,这种解决方案的一个不利方面是,这将使模型中的协变量数量增加两倍——如果你有 5 个协变量,现在你将有 15 个!如果你的自由度很少,这可能是一个问题,尽管老实说,如果你的 df 很少,额外的 10 个变量会产生很大的差异,你可能一开始就不应该测试交互。您可能会想,如果您要测试每个协变量的潜在偏差源,并且只包含重要的附加项,会怎么样?很清楚为什么这不会起作用,因为(1)首先你必须对每个统计测试进行校正(例如在我的 5 个初始协变量的例子中的 20 个,C 和 X/M 之间的相关性,加上 CX 和 CM 相互作用的影响),在这一点上(2)图 2 清楚地表明,你很可能没有能力检测仍然会使你的结果产生偏差的影响( Yzerbyt、Muller 和 Judd 所以不能保证你能只包括潜在的偏见来源。唯一的解决方法是包含所有的交互协变量。

现在,如何为您的分析生成协变量?据我所知,像 SPSS 和 GraphPad 这样的即插即用的统计软件并没有提供一种简单的方法来动态地生成这些变量,尽管你当然可以手动地一个接一个地生成它们(或者如果你知道如何在 SPSS 中编写脚本,它应该也很快)。然而,我开始真正欣赏 R 的一点是,这些交互协变量可以直接在你的回归模型中指定。例如,代替:

lm(Y~ X:M + X + M + C)

你会写:

lm(Y~ X:M + X + M + C + C:(X+M))

真的就这么简单!

多元回归中的交互效应

原文:https://towardsdatascience.com/interaction-effect-in-multiple-regression-3091a5d0fadd?source=collection_archive---------8-----------------------

了解交互效应以及如何使用 Python sklearn 库在数据集中识别交互效应。

图片来源:www.pixabay.com

什么是互动效应?

互动效应不仅存在于统计学中,也存在于市场营销中。在市场营销中,这个相同的概念被称为协同效应。交互效应是指两个或更多的特征/变量组合在一起,与单独的单个变量的总和相比,对一个特征具有明显更大的影响。当我们试图研究几个变量对单个响应变量的影响时,在回归中理解这种影响是很重要的。

线性回归方程可以表示如下:

这里,我们试图找到自变量(X₁和 X₂)与响应变量 y 和ε之间的线性关系是不可约误差。为了检查预测变量和反应变量之间是否有任何显著的统计关系,我们进行了假设检验。如果我们对预测变量 X₁进行测试,我们将有两个假设:

零假设(h₀):x₁和 y 之间没有关系(β₁ = 0)

另类假设(h₁):x₁and y(β₁≠0)之间有关系

然后,我们根据 p 值决定是否拒绝零假设。假设零假设为真,p 值是测试结果的概率。

例如,如果我们在测试结果中得到非零值的β₁,这表明 X₁和 y 之间存在关系。但如果 p 值很大,这表明即使零假设实际上为真,我们也很有可能得到非零值的β₁。在这种情况下,我们无法拒绝零假设,并得出结论,预测和反应变量之间没有关系。但是,如果 p 值很低(通常 p 值截止值被认为是 0.05),那么即使β₁的非零值很小,也表明预测值和响应变量之间存在显著关系。

如果我们得出 X₁和 y 之间有关系的结论,我们认为 X₁每增加一个单位,y 就增加/减少β₁个单位。在上面的线性方程中,我们假设 X₁对 y 的影响与 X₂.无关这也称为线性回归中的加法假设

但是如果 X₁对 y 的影响也依赖于 X₂呢?我们可以在许多商业问题中看到这种关系。例如,我们想找出两种不同投资类型的投资回报率。本例的线性回归方程为:

在这个例子中,如果我们部分投资于这两种类型的投资,而不是完全投资于其中一种,可能会有更大的利润。例如,如果我们有 1000 单位的资金进行投资,将 500 单位的资金同时投资于这两种投资,与将 1000 单位的资金全部投资于其中一种投资相比,可以获得更大的利润。在这种情况下,投资 1 与投资回报的关系将取决于投资 2。这种关系可以包含在我们的等式中,如下所示:

在上面的等式中,我们包括了投资 1 和投资 2 之间的“相互作用”,用于预测总投资回报。对于任何线性回归方程,我们都可以包括这样的相互作用

上述等式可以改写为:

这里,β₃是相互作用项的系数。同样,为了验证回归中交互作用的存在,我们进行假设检验并检查我们系数的 p 值(在这种情况下是β₃).

使用 sklearn 在数据集中查找交互术语

现在让我们看看如何验证数据集中交互作用的存在。我们将使用自动数据集作为我们的例子。数据集可以从这里下载。让我们看一下数据集

import pandas as pd
data = pd.read_csv('data/auto-mpg.csv')

将数据集转换为数字并填充缺失的值

#removing irrelevant 'car name' column
data.drop('car name',axis=1,inplace=True)
#converting all columns to numeric
for col in data.columns:
    data[col] = pd.to_numeric(data[col], errors ='coerce')
#replacing missing values in horsepower with its median
horse_med = data['horsepower'].median()
data['horsepower'] = data['horsepower'].fillna(horse_med)

让我们在这个数据集上拟合一个 OLS(普通最小二乘法)模型。该模型存在于 statsmodels 库中。

from statsmodels.regression import linear_model
X = data.drop('mpg', axis=1)
y = data['mpg']
model = linear_model.OLS(y, X).fit()

从这个模型中,我们可以得到系数值,以及它们是否在统计上有意义,以包括在模型中。

model.summary()

下面是模型摘要的快照。

在上面的模型总结中,我们可以看到除了加速度、之外,其他所有特征的 p 值都小于 0.05,具有统计学意义。即使加速度独立对 mpg 的预测没有帮助,我们也有兴趣找出加速度在与其他变量相互作用后是否对 mpg 有影响。此外,我们有兴趣了解所有重要交互术语的存在。

我们首先需要创建所有可能的交互项。通过使用 sklearn 库中的多项式特性,这在 python 中是可能的

from sklearn.preprocessing import PolynomialFeatures#generating interaction terms
x_interaction = PolynomialFeatures(2, interaction_only=True, include_bias=False).fit_transform(X)#creating a new dataframe with the interaction terms included
interaction_df = pd.DataFrame(x_interaction, columns = ['cylinders','displacement','horsepower','weight','acceleration','year','origin',
                                                       'cylinders:displacement','cylinders:horsepower','cylinders:weight','cylinders:acceleration',
                                                       'cylinders:year','cylinders:origin','displacement:horsepower','displacement:weight',
                                                       'displacement:acceleration','displacement:year','displacement:origin','horsepower:weight',
                                                       'horsepower:acceleration','horsepower:year','horsepower:origin','weight:acceleration',
                                                       'weight:year','weight:origin','acceleration:year','acceleration:origin','year:origin'])

当创建了包括交互项的新数据框架时,我们可以为其拟合新的模型,并查看哪些交互项是重要的。

interaction_model = linear_model.OLS(y, interaction_df).fit()

现在我们只需要那些统计上有意义的相互作用项(p 值小于 0.05)

interaction_model.pvalues[interaction_model.pvalues < 0.05]

正如我们所看到的,存在交互项。另外,加速度本身并不重要,但是它与马力年份的相互作用被证明对于 mpg 的预测非常重要。

值得注意的是,在上面的例子中,加速度的 p 值很高,但它包含在交互项中。在这种情况下,我们必须将加速度主效应包括在模型中,即加速度的系数,即使由于等级原则它在统计上不显著。等级原则规定,如果在交互项中有两个特征 X₁和 X₂,我们必须在模型中包括它们的 coefficients(β₁和β₂,即使与它们相关的 p 值非常高。

带有散景的交互式条形图

原文:https://towardsdatascience.com/interactive-bar-charts-with-bokeh-7230e5653ba3?source=collection_archive---------20-----------------------

照片由戴恩·托普金Unsplash 上拍摄

和其他视觉增强技术

介绍

这篇文章是我的散景爱情故事的第二部分。完整的故事(包括 Jupyter 笔记本和所有文件)在我的 Github 上。故事的第一部分在媒体文章“使用散景的简单数据可视化技术”中有所描述。

马里奥·高Unsplash 上的照片

条形图

没有可视化,你的数据故事是不可能完整的,条形图可以说是最受欢迎的分类数据表示类型之一。这种类似乐高积木的图形有无数种类型、调色板和风格,这就是为什么我决定为它们写一篇单独的文章。

让我们从简单的垂直和水平条形图开始。我们马上会谈到更复杂的问题。

用散景绘制条形图非常简单。像往常一样,我们需要指定一种图表类型(或者选择一种字形)并将数据传递给绘图函数。让我们使用相同的联合国世界卫生保健指标数据库创建一个垂直条形图,显示 2000-2015 年间美国麻疹发病率的变化。

# Creating a list of categories
years = data[data['country']=='United States of America']['year']#Creating the list of values
values = data[data['country']=='United States of America']['measles']# Initializing the plot
p = figure( plot_height=300, 
           title="Measles in the USA 2000-2015",
          tools=TOOLS)#Plotting
p.vbar(years,                            #categories
      top = values,                      #bar heights
       width = .9,
       fill_alpha = .5,
       fill_color = 'salmon',
       line_alpha = .5,
       line_color='green',
       line_dash='dashed'

  )#Signing the axis
p.xaxis.axis_label="Years"
p.yaxis.axis_label="Measles stats"show(p)

瞧啊。

完全以同样的方式,我们可以创建水平条形图。让我们以阿根廷 2000-2015 年报告的脊髓灰质炎发病率为例进行说明。

# Creating a list of categories
years = data[data['country']=='Argentina']['year']#Creating the list of values
values = data[data['country']=='Argentina']['polio'].values# Initializing the plot
p = figure( plot_height=300, 
           title="Polio in the Argentina 2000-2015")#Plotting
p.hbar(years,
       left = 0,
       right = values,
       height = .9,
       fill_color = 'azure',
       line_color='green',
       line_alpha=.5

  )p.xaxis.axis_label="Years"
p.yaxis.axis_label="Polio stats"show(p)

代码超级直观;我们只需要记住我们是在练习单杠。

我们的条形图以一种非常简单的方式呈现,它们肯定可以从一些附加的构成中受益。

条形图样式

有关一些可用调色板的列表,请访问散景调色板文档。为了配合散景使用它们,我们需要专门导入它们。

让我们来看看 2015 年一些国家的麻疹数据——我们将使用预设调色板和随机选择的颜色来绘制两个图表,并且我们将使用gridplot技术。

调色板和网格图

#Importing a pallettefrom bokeh.palettes import Spectral5, Viridis256, Colorblind, Magma256, Turbo256# Creating a list of categorical values values = data[(data['year']==2015)&(data['country'].isin(countries))]['measles']# Set the x_range to the list of categories abovep1 = figure(x_range=countries,
           plot_height=250, 
           title="Measles in the world in 2015 (pre-set pallette)")# Categorical values can also be used as coordinatesp1.vbar(x=countries, top=values, width=0.9,
      color = Spectral5, fill_alpha=.75)# Set some properties to make the plot look betterp1.yaxis.axis_label="Measles stats"
p1.xgrid.grid_line_color='gray'
p1.xgrid.grid_line_alpha=.75
p1.xgrid.grid_line_dash = 'dashed'
p1.ygrid.grid_line_color='blue'
p1.ygrid.grid_line_alpha = .55
p1.ygrid.grid_line_dash = 'dotted'p2 = figure(x_range=countries,
           plot_height=250, 
           title="Measles in the world in 2015 (randomly selected colors from a pallette)")# Categorical values can also be used as coordinatesp2.vbar(x=countries, top=values, width=0.9,
      color = random.sample(Viridis256,5), fill_alpha=.75)# Set some properties to make the plot look betterp2.yaxis.axis_label="Measles stats"
p2.xgrid.grid_line_color='gray'
p2.xgrid.grid_line_alpha=.75
p2.xgrid.grid_line_dash = 'dashed'
p2.ygrid.grid_line_color='blue'
p2.ygrid.grid_line_alpha = .55
p2.ygrid.grid_line_dash = 'dotted'p = gridplot([[p1,None],[p2,None]], toolbar_location='right')
show(p)

这是结果:

这个情节看起来比我们开始时的要友好得多。对颜色和调色板的实验永无止境。

分组条形图

有时我们需要绘制分组条形图。例如,我们可能需要对一些国家的健康指标进行分组。为此,我们需要从 bokeh.models 模块导入一个特殊的过程— FactorRange。让我们看看 2014 年国家名单中麻疹、脊髓灰质炎和艾滋病毒/艾滋病*1000 的数据。

from bokeh.models import FactorRange#List of used statisticsstats = ['measles','polio','hiv/aids*1000']#Creating a dictionary of our datamdata = {'countries' : countries,
        'measles'   : data[data['year']==2014][data['country'].isin(countries)]['measles'],
        'polio'   : data[data['year']==2014][data['country'].isin(countries)]['polio'],
        'hiv/aids*1000'   : data[data['year']==2014][data['country'].isin(countries)]['hiv/aids']*1000}# Creating tuples for individual bars [ ("France", "measles"), ("France", "polio"), ("France", "hiv/aids*1000"), ("Canada", "measles"), ... ]x = [ (country, stat) for country in countries for stat in stats ]
counts = sum(zip(mdata['measles'], mdata['polio'], mdata['hiv/aids*1000']), ())#Creating a column data source - Bokeh's own data type with the fields (Country,[stats],[values],[colors]) source = ColumnDataSource(data=dict(x=x, counts=counts, color=random.sample(Turbo256,15)))#Initializing our plotp = figure(x_range=FactorRange(*x), plot_height=350, title="Health Stats by Country")#Plotting our vertical bar chartp.vbar(x='x', top='counts', width=0.9  ,fill_color='color',  source=source)#Enhancing our graphp.y_range.start = 0
p.x_range.range_padding = 0.1
p.xaxis.major_label_orientation = .9
p.xgrid.grid_line_color = Noneshow(p)

情节是这样的:

我们也可以使用无数种可能的内置方法来根据我们的喜好调整视觉效果。

颜色转换

我们经常对预设或随机的调色板不满意,我们需要使用一些额外的色彩映射。我们用 bokeh.transform 模块导入的 factor_cmap 函数就是这种情况。我们来看看加拿大分别在 2000 年、2005 年、2010 年和 2015 年的麻疹、脊髓灰质炎和艾滋病*1000 的数据。

from bokeh.transform import factor_cmap#List of used statisticsstats = ['measles','polio','hiv/aids*1000']
years = ['2000','2005','2010','2015']#Creating a dictionary of our datamdata = {'years' : years,
        'measles'   : data[data['country']=="Canada"][data['year'].isin(years)]['measles'],
        'polio'   : data[data['country']=="Canada"][data['year'].isin(years)]['polio'],
        'hiv/aids*1000'   : data[data['country']=="Canada"][data['year'].isin(years)]['hiv/aids']*1000}# Creating tuples for individual bars x = [ (year, stat) for year in years for stat in stats ]
counts = sum(zip(mdata['measles'], mdata['polio'], mdata['hiv/aids*1000']), ())#Creating a column data source source = ColumnDataSource(data=dict(x=x, counts=counts, color=random.sample(Turbo256,12)))#Initializing our plot with random colorsp1 = figure(x_range=FactorRange(*x), plot_height=350, title="Health Stats in Canada 2000-2015")#Plotting our vertical bar chartp1.vbar(x='x', top='counts', width=0.9  ,fill_color='color',  source=source)#Enhancing our graphp1.y_range.start = 0
p1.x_range.range_padding = 0.1
p1.xaxis.major_label_orientation = .9
p1.xgrid.grid_line_color = None#Creating a new column data source without set colors 

source1 = ColumnDataSource(data=dict(x=x, counts=counts))#Initializing our plot with synchronized fill colors with factor_cmapp2 = figure(x_range=FactorRange(*x), plot_height=350,
            title="Health Stats in Canada 2000-2015, color mapped"
           )p2.vbar(x='x', top='counts', width=0.9,
        source=source1,
       fill_color=factor_cmap('x', palette=['salmon', 'green', 'navy'], 
factors=stats, start=1, end=2))p2.xaxis.major_label_orientation = .7
p=gridplot([[p1,None],[p2,None]], toolbar_location='right')show(p)

我们在这里——第一个图表有一些随机的颜色,第二个是颜色因素:

尽管第一个看起来更怪异,但第二个在色彩映射统计时有更清晰的信息。

向视觉效果添加标签

在散景中绘制单个标签非常简单,不需要任何特殊的技巧。我们只需要从 bokeh.models.annotations 模块导入 Label 类,它的语法非常简单。人们只需要知道散景使用一个单独的图层来绘图,另一个图层来标记,等等。我们将使用 add_layer()方法来组装我们的视觉效果。让我们看一个例子,并创建一个 2000-2015 年西班牙麻疹的图表。

from bokeh.models.annotations import Label#Initializing our plotp = figure(x_range=(2000,2015), title='Measles in Spain 2000-2015')#Plotting a linep.line(data[data['country']=='Spain']['year'],
      data[data['country']=='Spain']['measles'],
       line_color='navy',
      line_width=3)#Plotting data points as cirlesp.circle(data[data['country']=='Spain']['year'],
      data[data['country']=='Spain']['measles'],
        radius=.2,
        fill_color='yellow',
        line_color='salmon')#Instance of Label class as our 2011 Measles Outbreak labellabel = Label(x=2011, 
              y=max(data[data['country']=='Spain']['measles']),
              x_offset=10, 
              text="2011 Outbreak",
              text_baseline="top")#Adding a layout with our label to the graphp.add_layout(label)#Styling the graphp.xaxis.axis_label = 'Year'
p.yaxis.axis_label = 'Measles stats'
p.xgrid.grid_line_dash = 'dashed'
p.xgrid.grid_line_color ='gray'
p.ygrid.grid_line_dash ='dotted'
p.ygrid.grid_line_color = 'gray'
p.background_fill_color='green'
p.background_fill_alpha=.05show(p)

瞧啊。

添加一个“自定义”标签真的很简单。散景的美妙之处在于,添加一整套标签并没有多一点困难。让我们看看 2000-2015 年印度的脊髓灰质炎的例子,并尝试给每个数据点添加值。我们只需要使用 ColumnDataSource 类的一个实例,并从 bokeh.models 模块导入 LabelSet 类。

from bokeh.models import LabelSet#Instance of ColumnDataSourcesource = ColumnDataSource(data=dict(
    x=data[data['country']=='India']['year'],
    y=data[data['country']=='India']['polio'],
    labels=data[data['country']=='India']['polio'].values))#Initializing our plotp = figure(x_range=(1999,2016),
           y_range=(50,90),
           title='Polio in India 2000-2015')#Plotting data points as vertical barsp.vbar(x = 'x',
         top = 'y',
       width = .8,
        fill_color='azure', fill_alpha = 1,
        line_color='navy', line_alpha=.25,
         line_width=2, line_dash='dotted',
        source=source)#Plotting a linep.line(x = 'x',
       y = 'y',
       line_color='red',line_width=4,
       line_alpha=.5,
      source=source)#Plotting data points as circlesp.circle(x='x',y='y', 
         radius=.2, 
         fill_color='yellow', line_color='red', line_width=2,
         source=source)#Instance of the LabelSet classlabels = LabelSet(x='x',            #positions of labeled datapoints
                  y='y', 
                  text='labels',          #labels' text
                  level='glyph',          #labeling level
                 x_offset=-10, y_offset=15, #move from datapoints
                  source=source, 
                  render_mode='canvas',
                 text_baseline='bottom'   #relative position to datapoints
                 )p.add_layout(labels)p.xaxis.axis_label = 'Year'
p.yaxis.axis_label = 'Measles stats'
p.xgrid.grid_line_dash = 'dashed'
p.xgrid.grid_line_color ='gray'
p.ygrid.grid_line_dash ='dotted'
p.ygrid.grid_line_color = 'gray'
p.background_fill_color='salmon'
p.background_fill_alpha=.05show(p)

就是这样:

其他互动技术

有相当多的其他互动技术可以真正重塑你的形象,给你的数据驱动的故事一个全新的维度。仅举几个例子——与平移链接、与刷动链接、悬停等。其中一些在 Github 上相应的项目的笔记本中有说明。

散景确实是灵感的无尽源泉。我对它的简单性、流畅的学习曲线和精彩的互动视觉效果赞不绝口。!

用 Plotly 实现交互式篮球数据可视化

原文:https://towardsdatascience.com/interactive-basketball-data-visualizations-with-plotly-8c6916aaa59e?source=collection_archive---------12-----------------------

使用 hexbin shot 图表分析体育数据,使用 Plotly 和 Plotly Express 分析气泡图(源代码&我的 GitLab repo 中包含的所有 30 支球队的数据)

Izuddin Helmi AdnanUnsplash 上拍摄的原始照片

这篇文章主要是关于观想的。它只会包括非常粗略的篮球信息——基本上,如果你知道它是什么,你会没事的。

我最近一直在摆弄篮球数据分析和可视化,用 matplotlib 绘图。它很强大,但 Plotly 是我通常选择的可视化软件包。

在我看来,Plotly 实现了功能和可定制性的正确平衡,以合理、直观的语法编写,具有很高的文档和开发速度。

所以我最近把我的篮球可视化脚本移植到了 Plotly,取得了很好的效果。在这篇文章中,我想分享一些,包括使用 Plotly 和 Plotly Express 的例子。

我在我的git lab repo here(basketball _ plots目录)中包含了这方面的代码,所以请随意下载并使用它/改进它。

在开始之前

数据

由于这篇文章主要是关于可视化,我将在我的 repo 中包括所有 30 支球队和联盟平均水平的预处理数据输出。

包装

我假设您熟悉 python。即使你相对较新,这个教程也不应该太难。

你需要用一个简单的pip install plotly来安装它(在你的虚拟环境中)。

气泡图一闪而过—使用 Plotly Express

NBA 职业篮球运动员从篮筐右侧投篮,越过离篮筐约 24 英尺的三分线。我想了解距离如何影响投篮的准确性,以及球员从每个距离投篮的频率,并看看是否有一种模式。

这是一个相对简单的练习,所以我们使用 Plotly Express。Plotly Express 是一个相当新的包,它是关于更快更有效地制作图表,所以你可以专注于数据探索。(你可以在这里了解更多信息)

我有一个整个赛季(2018-2019 赛季)所有拍摄地点的数据库,大约有 220,000 张照片。该数据库包括每个镜头的位置,以及它是否成功。

利用这些数据,我制作了一个摘要(league_shots_by_dist.csv),其中包括在 1 英尺(最长 32 英尺)的箱子中按距离分组的镜头,以及shots_madeshots_countsshots_accavg_dist列。

让我们来研究一下这些数据,只需加载以下数据:

import pandas as pd
grouped_shots_df = pd.read_csv('srcdata/league_shots_by_dist.csv')

然后在导入包之后,运行下面的两行代码就会在浏览器上神奇地打开一个交互式散点图。

import plotly.express as px
fig = px.scatter(grouped_shots_df, x="avg_dist", y="shots_accuracy")
fig.show()

简单的散点图,只有两行代码

要查看玩家从每个距离射击的频率,让我们添加频率数据:只需将shots_counts值传递给‘size'参数,并指定最大气泡大小。

fig = px.scatter(grouped_shots_df, x="avg_dist", y="shots_accuracy", size="shots_counts", size_max=25)
fig.show()

简单的气泡图,仍然只有两行代码

这很有趣。频率(气泡大小)降低,然后再次回升。这是为什么呢?嗯,我们知道,随着我们走得更远,有些是两分球,有些是三分球,有些是两者的混合。所以让我们试着用镜头类型来给变量着色。

fig = px.scatter(grouped_shots_df, x="avg_dist", y="shots_accuracy", size="shots_counts", color='shot_type', size_max=25)
fig.show()

气泡图,仅仅两行代码就包含了类别—

啊,在那儿。看起来随着球员试图利用三分线,投篮频率增加了。

编辑:这里有一个现场演示

试着将你的鼠标移动到每一个点上——你会愉快地得到一个文本工具提示!你甚至不需要设置任何东西。

详细信息的默认鼠标悬停工具提示

移动你的光标,观察各个点,数据告诉我们,在距离篮筐 5 到 10 英尺的范围内,投篮的准确性没有太大的变化。通过投三分球,球员们用大约 15%的命中率下降来换取 50%以上的三分球奖励。三分球比这些‘中端’两分球更受欢迎是有道理的。

这不完全是一个突破性的结论,但它仍然能够让我们自己看到它。

但更重要的是,这不是简单得让人抓狂吗?我们只用两行代码就创建了最后一个图表!

只要你有一个经过预处理的“整洁”的日期框架,Plotly Express 就可以像这样快速地进行可视化,你可以从中工作。这是一个很棒的数据探索工具。

Hexbin 图,带 Plotly

让我们来看另一个图表,叫做赫克斯宾图表。我在其他地方讨论过,但是 hexbin 图表允许基于区域的数据可视化,通过将整个区域划分为六边形大小的网格,并按颜色(有时也按大小)显示数据,就像这样。

选举报道中的 hexbins(信息是美丽的 / fivethirtyeight)

虽然 Plotly 本身没有提供从基于坐标的数据点编译 hexbin 数据的函数,但这对我们来说并不重要,因为 a) matplotlib确实(在这里[matplotlib](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hexbin.html)读取由 [*Polycollection*](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.hexbin.html) 返回的数据,如果你感兴趣的话),b)我将提供数据集供这里使用。

好了,让我们直接进入六邻体蛋白数据的可视化:

我们的第一张拍摄图表

我已经把数据保存成字典格式了。只需加载以下数据:

import pickle
with open('srcdata/league_hexbin_stats.pickle', 'rb') as f:
    league_hexbin_stats = pickle.load(f)

字典包含这些键(自己用print(league_hexbin_stats.keys())查看:

['xlocs', 'ylocs', 'shots_by_hex', 'freq_by_hex', 'accs_by_hex', 'shot_ev_by_hex', 'gridsize', 'n_shots']

重要的有:x & y 位置数据xlocsylocs、频率数据freq_by_hex和精度数据accs_by_hex。其中每一个都包括来自每个六边形的数据,除了准确性数据,我已经平均到“区域”中以消除局部变化。你看了剧情就知道我的意思了。

注意:X/Y 数据是最初根据标准坐标系捕获的。我以此为基础。基本上,边缘的中心在(0,0),X & Y 坐标中的 1 看起来是 1/10 英尺。

让我们把它们画出来。这次我们将使用plotly.graph_objects,因为它给了我们额外的灵活性。这会导致编写稍微长一点的代码,但是不要担心——它仍然不是很长,而且完全值得。

让我们过一遍。前几行很明显——我只是给了几个值新的名称,这样我可以更容易地重用绘图代码。go.Figure()创建并返回一个新图形,我们将其分配给fig

然后我们添加一个新的散点图,使用markers模式(即没有线条),我们为这些标记指定参数,包括传递数组/列表作为我们的大小和颜色。

sizeref参数给出了一个参考尺寸来缩放其余的尺寸——我基本上只是用它来得到正确的尺寸,而sizemode指的是尺寸如何工作——尺寸是否应该根据面积或直径而变化。

惯例是应该使用“面积”,因为根据变量改变直径会使面积改变该值的平方,并且会夸大差异。

我们还将标记符号指定为一个hexagon(毕竟这是一个 hexbin 图),并在六边形的外部添加一个line以产生视觉效果。

我们第一张精心拍摄的图表(或者抽象艺术,我不确定)

看起来…几乎像一张射击图(或者来自我们外星领主的信息),尽管很明显有问题。法院在哪里,为什么比搞笑?不可能知道这些颜色意味着什么。鼠标悬停工具提示只显示 X-Y 坐标,这不是很有帮助。

让我们来解决这些问题:

给我画一幅画

幸运的是,Plotly 提供了一组方便的命令来绘制你想要的任何东西。通过使用方法fig.update_figure,并向shapes参数传递一个列表,可以很容易地画出您想要的任何东西。

我根据这张方便的维基百科图设计了球场的尺寸,球场是由矩形、圆形和线条混合而成的。我不会讲述这些平凡的细节,但这里有几件事你可能会感兴趣:

  • 有一件事我很难解决,那就是绘制 SVG 弧线,但是 plotly 论坛上的这篇文章帮助了我。原来 plotly.js 本身并不支持 arcs!
  • Plotly 允许我固定 x 和 y 的比例——我在这里禁用了缩放,但如果没有,您可以使用yaxis=dict(scaleanchor=”x”, scaleratio=1)将 y 轴固定到 x 轴。

draw_plotly_court 函数

运行与上面相同的命令,但是简单地在fig = go.Figure(),fig.add_trace(...之间插入draw_plotly_court(fig),我们得到:

draw _ plotly _ 法庭在行动

将手指放在秤上

虽然有了很大的改进,但我们不能充分利用这些数据。颜色比例和尺寸比例都不太好。

为了解决这些问题,我们将:

  • 通过手动将值限制为我的max_freq值,用列表理解来“剪辑”频率值。
  • 引入不同的色标。我想使用“连续”标度,因为它显示变化的正值。本页显示了 Plotly 附带的所有标准调色板。我选择了“YlOrRd”。

YlOrRd 色阶

  • 指定颜色的最大/最小值,以及
  • 在图上添加图例。我选择只指定顶部/底部刻度值,并添加字符+-来表示它们被裁剪。

运行下面的代码,你应该能够生成这个图表。

我们的拍摄图表,带有图例,和更好看的六边形。

工具提示

如果你将鼠标移到图表上,即使在我的 hexbin 数据中频率值为零的区域,你也会得到提示(见右下图)。此外,工具提示数据目前不是很有用——它只是 X&Y 坐标。我们能做什么?

无用的工具提示

首先,让我们在频率为零的地方不要有任何值。

我写了一个简单的函数filt_hexbins来过滤 hexbin 数据,这样如果频率数据为零,它就从所有相同长度的数组中删除那些值。

对于工具提示,我们简单地将一个文本列表传递给参数text。同样将hoverinfo参数值更改为text,您就可以开始了!文本字符串可以包含基本的 HTML,如<i><b><br>标签,所以也要尝试一下。

把它们放在一起,我们得到了这个代码,这个图表,带有改进的、信息丰富的工具提示。这意味着您可以将鼠标移动到任何值(或散点图)上,并获得任何数量的不同信息!漂亮。

比较数据集+将位图添加到图形中

为了完整起见,让我们看最后一个例子,我们将一个球队的数据与联盟平均数据进行比较。这个例子也能让我们看到不同的色阶,这非常方便。

我们还将在图中添加一个团队徽标的位图来完成外观。

加载数据,就像我们以前做的那样,但是这次加载 Hoston 火箭的文件。

teamname = 'HOU'
with open('srcdata/hou_hexbin_stats.pickle', 'rb') as f:
    team_hexbin_stats = pickle.load(f)

对于这个图,我们将保留原始的团队数据,除了射击精度。我们将把投篮命中率数据转换为相对数据,这意味着我们将把它与联盟平均水平进行比较。

为此,我们使用:

from copy import deepcopy
rel_hexbin_stats = deepcopy(team_hexbin_stats)
base_hexbin_stats = deepcopy(league_hexbin_stats)
rel_hexbin_stats['accs_by_hex'] = rel_hexbin_stats['accs_by_hex'] - base_hexbin_stats['accs_by_hex']

你可能想知道为什么我要用deepcopy。原因是由于 python 的工作方式,如果我只是简单地将team_hexbin_stats复制到rel_hexbin_stats,那么对rel_hexbin_stats 中的值的任何修改也会应用到原始字典中(在这里阅读更多信息)。

我本可以修改team_hexbin_stats,因为我们不会在本教程中再次使用它,但这只是一个糟糕的做法,会导致混乱。

使用修改后的rel_hexbin_stats,我们可以继续进行剩余的处理——现在您已经知道该流程了。唯一的变化是颜色图,一个发散图RdYlBu_r(反过来,因为我想红色是“好的”),并改变比例从-10%到 10%,因为我们显示相对百分比。

RdYlBu 颜色图

最后,让我们添加团队标志。Basketball-reference 有一个方便的、标准化的 URI 结构用于球队标志,所以我只引用那些带有“teamname”变量的标志。然后,用.add_layout_image方法添加你想要的图像,指定它的大小、位置和图层顺序,这是一件简单的事情。

该版本的全部代码如下所示:

看看这些拍摄图表——太棒了!我不能在这里嵌入一个互动版本,但我对他们的结果很满意。

(编辑:这里有一个现场演示(针对 TOR)——也针对 GSWHOUSASNYK )

去年 NBA 总决赛两队的投篮得分表。

如您所见,使用 Plotly 绘制空间数据非常简单。此外,在 Plotly Express 和 Plotly 之间,您有一系列选项可以满足您的需求,无论是快速和肮脏的数据探索,还是为您的客户定制的深度可视化。

你自己试试吧,我已经标出了决赛的队伍,但是你可以在回购中看看你自己的队伍。我把所有团队的数据都放在里面了。我想你会对 Plotly 如此简单地实现可视化印象深刻,同时又非常强大和灵活。

以上是我的全部内容——我希望你会觉得有用,如果你有任何问题或意见,请打电话给我!

我不确定为这样的教程构建 python 文件的最佳方式是什么,但是我已经将所有内容都写在了一个文件中,所以您可以根据自己的喜好添加注释/取消注释,然后继续学习。

如果你喜欢这个,比如说👋/在 twitter 上关注,或关注更新。我上周还写了关于用 Plotly 制作交互式地图的文章。

[## Python、pandas 和 Plotly 的交互式地图:跟随博主穿越悉尼

在这篇文章和其他几篇文章中,我将探索 Python 和 Plotly,把一些不同的看起来很棒的…

towardsdatascience.com](/interactive-maps-with-python-pandas-and-plotly-following-bloggers-through-sydney-c24d6f30867e)

用 Python & Plotly 实现交互式气候数据可视化

原文:https://towardsdatascience.com/interactive-climate-data-visualizations-with-python-plotly-de0472490b09?source=collection_archive---------15-----------------------

使用 plotly 可视化时间序列数据,包括条形图(柱形图)和子图(源代码和数据在我的 GitLab repo 中)

肯里克·米尔斯在 Unsplash 上拍摄的原始照片

条形图(确切地说是柱形图)是非常非常有效的数据可视化形式。它们在感觉上很棒,通常不需要像一些不寻常的情节那样多的解释。支线剧情并不经常被提及,但是它们会非常强大和有效。以某种方式使用,它们可以让我们在 4 维中展示数据,因为二维图表可以是二维网格。有时,它们只是允许我们在一个图形中很好地展示多个图形。

我最近一直在看澳大利亚气象局的气温数据。美国气象局提供了大量高质量的数据,许多气象站的温度观测可以追溯到 1910 年。

在这里,我将分享如何使用 Python 和 Plotly / Plotly Express 创建这样的图,使用这个温度数据集。

和往常一样,我在我的git lab repo here(climate _ data目录)中包含了这方面的代码,所以请随意下载并使用/改进它。

在开始之前

数据

原始数据来自 BOM 的 ACORN-SAT 数据集。这是一个高质量的数据集,我根本不用做太多的预处理。尽管如此,该数据集相对较大,包含一百年来来自一百多个站点的每日观察结果——所以我在 git repo 中提供了一个经过处理的数据集文件。

包装

我假设您熟悉 python。但是,即使你相对较新,这个教程不应该太棘手。如果你有什么不确定的,可以随时在推特上或这里联系。

你需要用一个简单的pip install [PACKAGE NAME]plotlypandas.安装到你的虚拟环境中。

Plotly Express 条形图

数据

数据集包括来自多个气象观测站的数据。为了对数据有所了解,让我们加载它,快速浏览一下,然后绘制一个站的数据。

像往常一样,用以下内容加载数据:

import pandas as pd
flat_avg_df = pd.read_csv('climate_data/srcdata/flat_avg_data.csv', index_col=0)

index_col参数向pandas指定哪一列将被用作索引。

不使用该参数加载 CSV 文件会导致索引列重复,从而产生如下输出。注意重复的索引列,其中索引列已经保存为‘Unnamed: 0’

请注意重复的索引列

除此之外,列应该是直截了当的。avg_temp_C显示的是年平均温度,rel_avg_temp_C是一个相对的数字,是该站点的中值,我还包括了站点名称字符串、年份和数据类型。datatypetmaxtmin,表示是否与日最高或最低温度有关。

简单条形图

现在,让我们只绘制一个站点的tmax数据。我们将根据站点名称(到simple_df)过滤数据帧,并将其传递给 Plotly Express。

import plotly.express as px
simple_df = flat_avg_df[(flat_avg_df.site_name == 'ALBANY AIRPORT') & (flat_avg_df.datatype == 'tmax')]
fig = px.bar(simple_df, x='year', y='rel_avg_temp_C', color='rel_avg_temp_C')
fig.show()

就像那样,我们可以看到奥尔巴尼机场测量的年相对温度。

自 1910 年开始测量以来,这一数字呈上升趋势。但是这种情况是否到处都存在呢?如果我们选择多个地点呢?看起来怎么样?

支线剧情

用 Plotly Express

支线剧情允许你在一个图形中包含多个情节。Plotly 允许创建支线剧情,无论是快速版还是经典版。

正如你所料,Plotly Express 更快更容易使用,尽管控制更少。让我们开始吧。

“情节表达”子情节功能基于其facet_rowfacet_col参数,允许使用这些分类变量创建子情节。让我们将来自不同站点的数据放在行上,将 tmin / tmax 值放在列上。

运行len(flat_avg_df.site_name.unique()),它告诉我们有 112 个唯一的名字——现在可能有太多的行需要查看。我将只选择前 5 个名字,并像这样绘制数据:

site_names = flat_avg_df.site_name.unique()
short_df = flat_avg_df[flat_avg_df.site_name.isin(site_names[:5])]
fig = px.bar(short_df, x='year', y='rel_avg_temp_C', color='rel_avg_temp_C', facet_row='site_name', facet_col='datatype')
fig.show()

这难道不是非常高效吗!

x 轴是共享的,并且很好地对齐,这使我们可以快速看到哪些数据点丢失了。例如,右下角的数据(来自 Scone 机场)可能只是从 1963 年开始的。我们的 Y 轴刻度和彩色轮廓刻度也是统一的,便于比较。

当然,这在视觉上有点混乱——但是记住,我们只用了 4 行代码就创建了它。我们可以清理它,但我们现在不会这样做。我想强调我们可以多快地可视化,比较数据集以及数据本身的质量和属性。

这种方法的一个限制是子情节行和列需要与特定的分类变量相关联。为了使用 Plotly Express 绘制来自 10 个不同站点的数据,我可以创建一个新列,比如说叫做subplot_cols,根据要放入列中的图分配值(比如12,并传递参数facet_col=’subplot_cols'。我也必须对行做同样的事情。

这很好,但这实际上是一种变通方法,而不是按照预期使用该特性。毕竟,Plotly Express 是用于探索性分析和组织良好的数据。它不是最灵活的工具。

所以,接下来让我们看看如何用常规情节来生成支线剧情,这会给我们更多的灵活性。

与(经典)情节地

在 Plotly 中创建支线剧情的最基本语法如下:

fig = make_subplots(rows=n_rows, cols=n_rows)  # Create subplot grid
# Add subplot trace & assign to each grid
fig.add_trace(
    go.Bar(
        x=[X_DATA],
        y=[X_DATA],
    ),
    row=[SUBPLOT_ROW], col=[SUBPLOT_ROW],
)

你会看到add_trace功能需要为每个使用的支线剧情重复。优选地,使用循环而不是手动添加轨迹。尤其是随着支线剧情数量的增长。

让我们从小处着手。我们将创建一个 2 乘 2 的子绘图网格,并绘制来自前四个站点(按站点名称)的数据,仅绘制‘tmax’值。

我们之前看到,并不是某些台站明显缺少某些年份的数据。这在上面并不重要,因为 Plotly Express 通过省略来处理丢失的数据,但在这里我们不能这样做。我们将传递一个列表或者一个数组作为 Y 值,跳过这些值将会导致数据错位。

当我们处理相对值时,让我们用零填充缺失的数据。(这是否是最好的做法还有待商榷,但我们可以改天再讨论。)当我们将数据传递给绘图时,我们必须记住这样做。

因此,让我们对每个子图进行循环,每个循环 a)收集要绘制的年份的 Y 数据(温度),并将该数据从循环内部传递到 plottly。这相对来说很简单,请看下面的代码片段:

在这里,我创建了一个名字列表(site_names ) &一个年份列表(year_list)。我对年份列表进行排序,然后循环遍历子情节的数量(4),用一个内部循环遍历这一年,当没有这一年的数据时,我简单地指定一个零值。

最后,我使用数据添加一个简单的轨迹到我们的图中,使用.add_trace方法。我已经参数化了第&行的列号(末尾的+1 确保数字从 1 和 1 开始,而不是从 0 和 0 开始)。

不幸的是,作品越多,支线剧情越好。

所以,不幸的是,我得说这看起来更糟。我们以相同的格式绘制了相同的数据,但是颜色现在没有意义,轨迹名称也消失了,我们使用了大约 25 行代码。哦。

但是让我们继续前进——它会变得更好,我保证。

简单地添加支线剧情标题、标记说明、添加公共 y 轴参数和更新布局以隐藏无意义的图例会产生奇迹:

fig = make_subplots(
    rows=2, cols=2,
    subplot_titles=site_names
)
go.Bar(
    ...
    marker=dict(color=temp_vals, colorscale='RdYlBu_r'),
),
fig.update_yaxes(tickvals=[-2, 0, 2], range=[-2.5, 2.5], fixedrange=True)
fig.update_layout(showlegend=False)

看看这有多好!

接下来,让我们扩展这个概念,建立我们的下一个图表,尽可能多的支线剧情。

这些修改看起来很冗长,但实际上并不冗长。我所做的是:

  • 在我们的子情节中参数化行数和列数(subplot_rows = …)
  • 参数化图形的高度和宽度(height=120 * subplot_rows, width=230 * subplot_cols),以保持子图大小一致,而不是随着行数或列数的变化而缩小或放大。
  • 根据观察次数对站点名称(names_by_obs = …)进行排序,这样我们可以优先绘制数据最多的站点
  • 减少支线剧情之间的间距(horizontal_spacing=…),以及
  • 缩小字体大小(font=dict(...)。

性感支线剧情!

编辑:这篇文章的早期版本使用了下面的代码来设置标题——因为我不知道有一种方法可以访问这些代码:

for i in fig['layout']['annotations']:
    i['font'] = dict(size=10, color='#404040')

相反,您可以这样使用:

fig.update_annotations(patch=dict(font=dict(size=10, color='#404040')))

但是,如果您确实需要手动访问这些属性中的任何一个,那么fig对象允许您非常容易地做到这一点,这很好。

Plotly Express 的堆积条形图

这会让你大吃一惊的。我假设您仍然将主数据帧加载到内存中。好吧。准备好了吗?只需运行这段代码:

fig = px.bar(flat_avg_df, x='year', y='rel_avg_temp_C', color='rel_avg_temp_C')
fig.show()

当我看到这个情节时,我只是头晕。是的,它并不完美。但是在仅仅两行代码中,我就能可视化整个年度数据集,显示 112 个站的温度变化的年度总趋势。

只是为了比较,我用常规 Plotly 重新创建了这个,用了大约 30-40 行代码,主要是在数据和格式上。(我这里没收录。)

在这个图中,我叠加了 tmax 和 tmin 值,这并不理想。让我们把他们分开。此外,由于我们正在绘制温度,让我们坚持红色=热,蓝色=冷的惯例,确保色标的中点在零。(你会注意到上面的零与刻度的中点不太一致)

现在有了美味的支线剧情!

老实说,我对这个样子非常满意。但是有几个大问题——我将温度叠加到没有任何意义的数字上,虽然 Plotly Express 处理缺失的数据,但其中一些堆栈由比其他更多的观察值组成,这扭曲了输出。

数据可视化不仅仅是制作漂亮的图片,它是向读者传达信息。我们可以做得更好;让我们将温度归一化,以表示一个合理的值,比如每年气象观测站的冷热变化之和。

我在数据框中创建了一个新列,其中温度值除以当年的样本数:

一旦完成,我们可以像以前一样简单地绘制它,唯一的变化是y=’norm_rel_avg_temp_C’

您可以看到,图像左侧的数字(更远的过去)已被放大,以说明样本较少的事实。

作为最后一步,我们包括格式元素——图形标题、轴标题、图例标题和注释。图例的大小会随边框一起调整,并按比例缩小。这是结果:

很好,不是吗?我对结果很满意。这里是互动版

条形图是数据可视化工具箱中非常重要的工具。条形图允许对值进行简单的比较,在需要时将值组合在一起,并且易于理解。

支线剧情没有那么关键,但是有很高的实用性。任何看过 pairplots 的人都可以证明这一点。我个人也发现,我经常有最好的可视化数据分割,并经常想使用支线剧情。“Plotly Express”功能允许通过功能生成子图,节省了大量时间,因为它减少了可视化某些分类变量的效果所需的工作。

常规 Plotly 的支线剧情功能更强大,但也更冗长。它允许像用 Plotly 的支线剧情操纵网格大小这样的事情,所以如果你对进一步定制支线剧情布局感兴趣,你可能希望探索那个选项。

我希望以上内容对你展示使用 Plotly / Plotly Express 可以轻松创建的好看的可视化效果是有用的。尝试使用参数——列数、行数、色彩映射表、字体大小等等。我发现我通过这种方式学到了很多东西。

如往常一样,如果你有任何问题或意见,打电话给我。

如果你喜欢这个,比如说👋/关注 twitter ,或关注更新。我还写了一些关于用 Plotly 制作交互式地图和可视化篮球数据的文章。

[## 用 Plotly 实现交互式篮球数据可视化

用 hexbin shot 图表分析体育数据,用 Plotly 和 Plotly Express 分析气泡图(源代码&我自己的数据…

towardsdatascience.com](/interactive-basketball-data-visualizations-with-plotly-8c6916aaa59e) [## Python、pandas 和 Plotly 的交互式地图:跟随博主穿越悉尼

在这篇文章和其他几篇文章中,我将探索 Python 和 Plotly,把一些不同的看起来很棒的…

towardsdatascience.com](/interactive-maps-with-python-pandas-and-plotly-following-bloggers-through-sydney-c24d6f30867e)

交互式新冠肺炎可视化使用 Plotly 与 4 行代码

原文:https://towardsdatascience.com/interactive-covid-19-visualizations-using-plotly-with-4-lines-of-code-fa33b334ab84?source=collection_archive---------32-----------------------

用数据做很酷的事情!

简介

在这个技术时代,数据是新的石油。世界各地的组织都在转变他们的环境、流程和基础架构,变得更加以数据为导向。一个主要原因是,数据分析和机器学习让组织了解如何更好地运营业务。通过新冠肺炎推动远程工作将加速这种技术和数据化的趋势。

分析的很大一部分是将数据以有意义的形式呈现给相关决策者,以便他们可以轻松理解这个故事。传统上,组织使用像 Tableau 这样的软件来展示很酷的交互式仪表盘。在这篇博客中,我们展示了像 Plotly Express 这样的开源库可以用来做同样的事情,只需要几行代码。我们也在散景中编码了这一切,但是发现代码相当复杂。另一方面,Plotly 有内置的功能,允许用参数改变许多事情。

我们已经使用了疾病控制中心关于冠状病毒的数据来生成交互式图表。请参见以下各国冠状病毒病例每日变化图。这是一个非常有趣的图表,显示了哪些国家已经达到峰值,而每日病例数开始减少。完整代码可在 Github 上获得。我希望你拉它,给它一个镜头。

深度学习分析,我们非常热衷于使用数据科学和机器学习来解决问题。如果您是一家医疗服务公司,并且正在寻找数据科学帮助来应对这场危机,请通过此处的联系我们

通过这个博客创造的日常案例中的新冠肺炎变化

可视化您的数据

数据可视化是以有趣、准确和易于理解的方式呈现数据的“艺术”。有许多类型的可视化应用于所有行业;最常见的有条形图、饼图、线图和直方图。但是在许多情况下,这些基本的可视化并不足以有效地呈现数据。所以越来越多的分析师倾向于可视化,如柱状图、时间序列图、热图、径向树、单词云等。

在这篇博客中,我们将探索一种称为 choropleths 的特定类型的可视化,并展示如何用 python 创建这些可视化,只需几行代码。

Choropleths

地图是专题地图,其中不同的区域在地图上用阴影表示,以显示不同的统计数据。下面是截止到 2011 年,一部分澳大利亚人被认为是英国圣公会教徒的 choropleth 地图。此图来自 维基百科页面

澳洲圣公会人口分布图—https://en.wikipedia.org/wiki/Choropleth_map

Choropleths 可以是任何粒度:小到一个街区,大到整个世界,这取决于需要投影的内容。

在这篇博客中,我们将探索如何使用 Plotly Express 库在 python 中创建 choropleth。我们将对世界各国的案例进行可视化处理,然后深入研究美国的案例。所以让我们开始吧!

代码走查

首先,我们将安装运行这段代码所需的依赖项:pandas 和 plotly

pip install pandaspip install plotly

下载新冠肺炎数据

一旦我们下载了这些库,我们将下载并加载数据。这篇博客中使用的数据来自名为ourworldindata.org的网站。这里提供的数据每天都在更新。您可以使用 wget 下载数据,如下所示:

!wget [https://covid.ourworldindata.org/data/owid-covid-data.csv](https://covid.ourworldindata.org/data/owid-covid-data.csv)

请跟随我的 Github 链接中的代码

上述代码的输出是数据的前 5 行,如下所示:

新冠肺炎数据

该数据集包含国家代码、位置、日期、总病例数、新病例数、总死亡数、新死亡数和每百万病例数等信息。

我们希望删除对应于国家“World”的条目,它是所有国家的总和,并按日期对数据进行排序。

df = pd.read_csv('owid-covid-data.csv')
## Drop rows corresponding to the World
df = df[df.location != 'World']
## Sort df by date
df = df.sort_values(by=['date'])

使用 Plotly Express 绘制 Chloropeths 图

制作 choropleth 地图需要两种主要的输入:

  1. 通过 GeoJson 文件提供的几何信息,该文件包含您正在打印的州、地区、国家的坐标
  2. 包含几何值的数据框

Plotly 已经为世界和美国地图建立了几何图形,我们将在这里使用它们。

要创建每日新新冠肺炎确诊病例的交互式文字地图,命令为:

fig = px.choropleth(df, locations="iso_code",
                    color="new_cases",
                    hover_name="location",
                    animation_frame="date",
                    title = "Daily new COVID cases",
                   color_continuous_scale=px.colors.sequential.PuRd)fig["layout"].pop("updatemenus")
fig.show()

这里:

  • df-包含 COVID 数据的数据框
  • 位置—国家通过其 iso 代码来识别。Plotly 能够使用 iso 代码获取地理数据
  • 颜色—我们要绘制的列。这里有新病例
  • animation_frame:要运行动画的列。在我们的情况下,这是日期
  • color _ continuous _ scale 允许 plotly 在滑块移动时连续改变轴和颜色
  • 图[“布局”]。pop("updatemenus") —这将创建一个可以手动切换的日期滑块。如果该行被注释掉,则该图有一个视频类型的开始、停止按钮

在世界地图上显示新冠肺炎新病例和总病例

下图显示了 2020 年 3 月 2 日的产量。这是一个触发点,中国的新病例增长率正在放缓,但伊朗、意大利和韩国的新病例增长率却在上升。

从 Plotly express 输出

在笔记本中,我还添加了一个到第的总累积病例图。为此,我们添加了另一行代码来添加熊猫的周数

df['new_date'] = pd.to_datetime(df['date'])
df['Year-Week'] = df['new_date'].dt.strftime('%Y-%U')

4 月初按国家分列的病例总数

看看这个,很难相信美国一个月前只有大约 10 万个病例!。

按县和州可视化美国案例

要为我们添加数据,我们需要两样东西— 1。具有美国州和县级数据的数据源和 2。州和县的地理制图

美国新冠肺炎的数据来自新冠肺炎纽约时报-数据。感谢《纽约时报》将其公之于众,供分析师使用。您可以使用下载数据

!git clone [https://github.com/nytimes/covid-19-data.git](https://github.com/nytimes/covid-19-data.git)

我们可以使用下面的脚本获取各县的地理数据。该数据包含美国所有县的多边形坐标。

from urllib.request import urlopen
import json
with urlopen('[https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json'](https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json')) as response:
    counties = json.load(response)

我们可以使用下面的命令来绘制所有的案例。与我们以前的图的主要区别是,我们使用不同的县 FIPS 代码,而不是像以前一样使用 iso 国家代码。

df_us_week = df_us_week.sort_values(by=['Year-Week'])
fig = px.choropleth(df_us_week, 
                       geojson=counties, 
                      locations='fips', 
                      color='cases',
                     color_continuous_scale="Viridis",
                     title = "Total Weekly Cases by Counties",
                     scope="usa",
                     animation_frame="Year-Week",
                          )
fig["layout"].pop("updatemenus")
fig.show()

输出如下。它显示了严重的影响局限于几个县。

美国各县每周病例总数

Github 链接也有关于创建州级可视化的细节。

结论

令人惊讶的是,使用 Plotly Express 可以轻松地绘制地图。如果您有自定义地图,也可以使用 geojson 数据在其上进行绘制。这个在这里解释。

我希望您尝试一下代码,并创建更多有趣的可视化效果。

深度学习分析,我们非常热衷于使用机器学习来解决现实世界的问题。我们已经帮助许多企业部署了创新的基于人工智能的解决方案。如果您看到合作的机会,请通过我们的网站这里联系我们。这篇博客是由 Priya Dwivedi 和 Faizan Khan 写的。

参考

交互式新冠肺炎报告,包含 RMarkdown、Plotly、传单和 Shiny

原文:https://towardsdatascience.com/interactive-covid19-report-with-rmarkdown-plotly-leaflet-and-shiny-c6a716af7d9b?source=collection_archive---------20-----------------------

了解如何制作适用于新冠肺炎及其他地区的交互式报告!

本帖是 第三部分 一系列 第四部分 。请参考 第 1 部分 了解系列概述, 第 2 部分 了解数据源和次要数据清理, 第 3 部分 了解可视化的创建、报告的构建以及将文档部署到 ShinyApps.io 和 【项目回购】

该系列的每篇文章都是独立的,也就是说你不需要阅读整个系列来充分利用它。

目录

目标
要求
数据输入
地块
树状图
折线图
地图图
够了!
制作闪亮的报告
撰写报告
上传你的文档到云端
发布你的 app
结论

目标

在本教程中,我们将学习如何制作 7 种图表来说明 COVID19 在各国的进展。然后,我们会将这些整合到一个 RMarkdown 文档中,并免费发布一个交互式副本!—使用 RStudio 场所。

要求

使用Rdplyrggplot的经验是有用的,但不是必需的。在我所有的写作/编码过程中,我试图让脚本尽可能的易读。

数据输入

首先,今天我们将使用两个数据集:

  • 每日按国家统计的确诊 COVID 病例和 COVID 死亡人数(从现在开始我们称之为 COVID 事件)。要了解这个数据集的样子,请查找下面的截断表:

10 月 25 日欧洲 COVID19 事件每日统计

  • 累计按国家统计的确诊 COVID 病例和 COVID 死亡数。再次找到下表的删节版本:

截至 10 月 25 日,欧洲 COVID19 事件的累计计数

注: 以上表格出于可视化目的被截断,实际表格包含从 2019 年 12 月 31 日起以及全球大多数国家/地区的数据。

情节

我将带您浏览我们将要制作的 7 张图表。每个地块的过程都是一样的:

  1. 检查绘图功能的输入格式
  2. 操作输入数据以获得正确的格式
  3. 设计情节

不同地块之间的数据可能会有一些重叠,但这没关系。我在这里的目的是展示每个情节是如何独立完成的。

树形图

树形图非常适合表示层次结构和“父”中每个“子”元素的大小。在这里,我们按国家绘制 COVID 事件,这些事件可以进一步按洲分组,而洲又可以按世界的一部分分组。下面我们来看看如何用 Plotly 做出下面的剧情。

10 月 30 日 COVID 死亡的树形图示例

在我们的树形图中,每个方框的大小将与每个国家最近日期的事件数量成比例,因此我们将使用累积表。

在仔细阅读了 Plotly R Treemap 文档之后,两件事情变得很清楚。首先,我们需要树形图中的所有元素(国家、大洲、世界)都有相应的值,目前我们只有国家级的汇总数据,我们需要汇总每个大洲的数据,并在全球范围内进行汇总。其次,我们需要一个新列来指示每个元素的父元素:例如,西班牙、欧洲;对欧洲,对世界,对世界,什么都不是。另外,我们将把每个元素称为标签,因为国家、大陆和“世界”都需要在同一列中。**

下面是注释脚本,用于将数据转换为正确的规格:

现在我们有了正确格式的数据,绘制图表就非常容易了:

hoverinfo参数负责当鼠标悬停在任何特定元素上时显示的数据。这里的规范是说:

  • value显示特定元素的值(即死亡人数/病例数)。
  • percent parent:显示当前子值占父值的百分比(如西班牙死亡人数/欧洲死亡人数)。
  • percent root:显示当前子值占根值的百分比(如西班牙死亡人数/世界死亡人数)。

你可以在文档部分阅读更多关于悬停选项的信息。

最后,我们希望实际上将这些图存储为 RDS 对象,以便在我们闪亮的应用程序加载时加载它们,而不是在运行时计算它们。为此,我们使用以下代码:

注意: 你可能会发现简单地保存plot_ly(...)函数的输出就成功了。当我第一次开始做这个项目时,我发现它不起作用。对我来说,使用plotly_build()功能修复它。

折线图

在这里,我们将制作经典的线形图,描述一段时间内各个国家或大洲的事件数量。在这种情况下,我们不会直接制作plotly图。相反,我们将使用ggplot2ggplotly函数来将它们转换成交互式图形。我们将制作如下图:

是的,这很荒谬,截至 2020 年 11 月,大洋洲大约有 3 万例确诊病例

首先,让我们用累积表制作我们的ggplot:

如果你不熟悉ggplot2,一个情节的所有这些台词可能看起来很多。虽然看起来是这样,但我相信这有助于构建情节,并使代码可读性更高。此外,group美学(在aes()功能内)在初学者ggplot教程中不常介绍。在我们的特殊情况下,这是非常重要的。如果我们不指定它,* ggplot 会认为我们线状图的分组变量是 *continent* ,会做出一个非常混乱的图,比较见下图:*

**

左:使用群组美学修正剧情右:绘图不正确,未使用* 分组,ggplot2 认为分组变量是洲***

好了,现在我们已经做好了ggplot,我们可以用ggplotly()把它变成一行plotly图。此外,假设我们已经将ggplot存储为变量,我们可以进一步修改它,例如以 log10 标度显示 y 轴。最后,我们将通过plotly_build()函数传递新的情节,以便能够存储它。

我从这个项目的 GitHub 库中可以看到的累积数据集制作了另外 6 个线图(包括按洲划分的事件曲线,有和没有 log10 标度)。所有这些图的代码遵循相同的结构。

再次遵循相同的原则和几乎相同的代码,我从每日数据集中制作了另外 6 幅图,如下图所示。仓库中也有相关的代码。

看到这里,我们可以清楚地看到为什么新闻媒体使用均线!此外,欧洲表现糟糕。

地图图表

信不信由你,我不会在这里使用plotly地图功能。我以前用它们创建过地图,但是我不推荐使用它们。我偶然发现了几个 bug(【1】【2】)而 plotly 社区一直很没反应。因此这里我们将使用 传单 。与 Plotly 不同,fleet 只关注地图,因此他们是制作地图的更好的工具。

由 RStudio 团队自己构建的 R 传单包有 R 的感觉,更特别的是有dplyrggplot的感觉,地图可以通过图层构建。让我们跳到代码。我将介绍如何制作一个简单的静态地图。制作一个有时间表的要复杂得多,因此我将在以后的独立文章中专门讨论这个问题。

首先,我们需要一个带有国家边界的 GeoJSON 文件。GeoJSON 文件是一种用于存储地理边界的标准(尽管还有更多,如 shapefiles)。我从 datahub.io 下载了国家 GeoJSON 文件。幸运的是,现在国家的边界没有太大的变化,因此我们只需要下载并处理这个文件一次。对于我们的使用来说,这是一个相当大的文件(23MB),因此我们将使用一个小技巧来减小它的大小。这将大大改善我们闪亮文档的加载时间(我们很聪明,我们提前考虑)。由于边界中的所有细节(例如海岸线的分辨率),文件的大小非常大。我们可以使用[rmapshaper](https://cran.r-project.org/web/packages/rmapshaper/vignettes/rmapshaper.html) 和更广泛的mapshaper工具来使我们的地图更粗糙,文件更小。下面的是在 r 内部完成所有这些工作的脚本。**

world_geojson对象包含两个感兴趣的主要元素:数据多边形。在这个阶段,数据元素只包含两列,ISO 代码和相应的地区名称。polygons 元素包含为每个区域绘制多边形所需的信息。我们将首先合并数据元素和累积数据集。接下来,我们将手动移除累积数据集中没有可用数据的多边形。这最后一步是必要的,因为数据和多边形是通过位置而不是某种标识符匹配的,如果我们不执行这最后一步,美国将出现在欧洲,法国将出现在非洲或亚洲,等等。

将地理文件与普通数据框合并

注意:我们只绘制了每个地区的最新可用数据(第 6-9 行)

现在,我们要做的就是使用leaflet绘图。正如我之前所说,R 中的传单支持分层构建,使用magrittr管道操作符(%>%)。首先,我们要定义一个合适的调色板,我选择了蓝色,它用白色代表低值,随着值的增加使用越来越浓的蓝色。然后,我们将使用leaflet()初始化主地图,就像我们经常使用ggplot()一样,并添加图块,这是地图格式的传单行话(海洋和陆地的颜色……—在本演示中探索不同的图块)。

初始化传单地图并绘制图块

现在,我们终于要看看地图上方的数据了。我们将添加多边形,并根据截至 10 月底每个国家的病例数按比例给它们上色。

向传单地图添加多边形

注意,我已经按照它们的对数 10 的情况按比例给这些区域着色,否则,差异是如此之大,以至于色标是没有用的。我们还使用了[ezplot](https://github.com/wkostelecki/ezplot) 中的ez_labels()函数,该函数将大数转换成可读格式(例如 86453625 到 86.4M)。

最后,我们将在地图上添加一个图例并保存文件,以便以后加载。

添加图例并将地图另存为 HTML 微件

在这之后,我们的地图看起来如下。它也是交互式的,你可以通过悬停在地图上获得更多的细节(虽然这在 Medium 中不起作用,但当我们在 Shiny 服务器上发布文档时它会起作用)。

传单地图

够了阴谋!

绘图是伟大的,但也是无止境的,而且非常依赖于上下文。上面我已经展示了如何绘制常见和不常见的图来说明 COVID 事件随时间的变化,但是您可以想象出更多的方法来做到这一点!

做一份精彩的报告

RMarkdown 文档(.Rmd)是超级通用的文件,允许你在一个地方编写直观的 Markdown 文本和可执行的 R 代码块。它们类似于 Jupyter 笔记本,但存储为纯文本文档,而不是 JSON 语法。RMarkdown 文档支持一系列输出格式,包括 PDF、HTML、Word 和 beamer 幻灯片。它们还支持 Latex 和 HTML,后者由文档编译器 pandoc 提供支持。所有 RMarkdown 文档都以这样的标题开始:

**---
title: "Title of my document"
author: "<Name-of-Author"
date: "<Today's date>"
output: html_document
---**

如果您使用 RStudio,您可以通过文件>新建文件> RMarkdown…** 创建 RMarkdown 模板**

RStudio 中的默认 RMarkdown 模板

您可以通过点击编织选项来可视化呈现的文档,此外,您还可以为单个.Rmd文档设置多种输出格式(如html_documentpdf_documentword_document)。我喜欢的输出格式是html_document,它允许与 Plotly 和传单对象以及可搜索的表格进行交互。HTML 不支持的一点是实际的用户界面,用户在前端修改一些东西,这会触发后端的变化,并导致前端的更新。

在现代网络中,JavaScript 支持这一点,但是作为一名 R 程序员,你可能不想或者没有时间去学习它,这就是为什么我们要使用 Shiny!这篇文章不是初学 Shiny 的教程,但希望它能激励你认真学习 Shiny。你可以在 RStudio 的网站找到初学者资料。

Shiny 结合 RMarkdown 的神奇之处在于,您只需将这一行添加到 RMarkdown 标题中,您的文档就会像一个闪亮的 UI 一样工作:

**runtime: shiny**

就是这样!现在让我们写我们的文档。

写报告

我们将首先加载我们以前制作的所有情节,然后设计非常基本的用户界面。

既然我们已经加载了绘图,我们只需要设计闪亮的 UI,它由输入元素和对输入变化做出反应的呈现函数组成。

输入块看起来像这样:

闪亮输入功能示例

第一个参数是输入 ID, Shiny 将用它来引用这个输入处理程序。接下来是这个输入句柄的标签(label),它将出现在文档中句柄的正上方,然后是可能的选择(choices),最后是默认选择(selected)。还有其他输入处理功能,如:fileInput()dateInput()sliderInput()checkboxInput()等。

一旦我们准备好了输入处理函数,我们只需要一个处理输入的render*()函数,比如renderPlotly()renderImage()renderText()或者其他。如下图所示,布局和逻辑非常简单直观:

Shiny 中的渲染函数示例

我可以就此打住,但我将给出最后一个例子来说明如何用几行代码轻松处理更复杂的逻辑。如果您不感兴趣,请跳到最后一节,我们将把闪亮的文档部署到云中。

我们之前制作的线图为构建更复杂的逻辑提供了一个很好的例子。我们可以处理图的模式(每日/累积),另一个用于地理(国家/大陆),另一个用于事件类型(死亡/病例),最后一个用于在选择大陆地理时启用 log10 比例:

处理多种情况的逻辑稍微复杂一些

在这里,我们将利用我们的图形名称是标准化的这一事实,使逻辑更加简洁(见下文)。

表格显示了我们的线图名称是如何标准化的

根据输入,我们将使用ifelse()函数构建一个对应于其中一个图名的字符串。地理位置选择的逻辑更加特殊,因为如果选择了“大陆”,我们将创建一个复选框来启用 log10 比例。为了做到这一点,我们使用了所谓的条件面板,如下一个代码块中所示,此外,我们将把所有的输入处理程序包装在一个inputPanel()中,这将使它们看起来非常整洁:

只有在选择了洲视图的情况下,才会显示条件面板

这产生了如下所示整齐的面板:

****

请注意,log10 比例复选框仅在地理位置设置为“大陆”时才可用

下面是根据用户选择的输入获取正确图形的逻辑:

我再次邀请您访问云中的 live 文档,因为这将是了解 UI 体验的最佳方式。你也可以在 GitHub 中找到[.Rmd](https://github.com/lc5415/COVID19/blob/master/COVIDEDA.Rmd)文档的源代码。

将您的文档上传到云端

设置 shinyapps.io 账户

如果您已经做到了这一步,我希望您已经从这篇文章中获得了一些有用的知识。剩下要做的就是将我们的文档上传到 RStudio 服务器。如果是第一次这样做,您需要先创建一个帐户

设置完成后,您需要将闪亮的证书添加到 RStudio 或 R 会话中。您可以通过 RStudio 或终端来完成此操作:

通过 RStudio 连接到 Shiny

  • 打开顶部边栏上的 RStudio >偏好设置。
  • 转到发布,面板应该如下图所示

  • 然后点击连接…** 并点击 ShinyApps.io 。RStudio 将从那里指导您。您基本上需要从您的帐户中检索一个令牌,并将其粘贴到 RStudio 中。**

****通过端子连接到闪亮

  • 登录 shinyapps.io
  • 点击工具条上的账户>代币****
  • 点击+添加令牌,然后显示****
  • 最后,复制 shinyapps.io 页面显示的代码块,看起来应该是这样的:
**rsconnect::setAccountInfo(name=<user-name>,
			  token=<token>,
			  secret=<SECRET>)**

发布您的应用

来自 RStudio

****

1 —单击蓝色的发布按钮,如图所示。

像这样的一个窗口应该会打开,你可以给你的 ShinyApp 取任何你想要的名字,这里是 COVIDEDA 。在左侧,您可以看到将要上传到服务器的文件和目录。

3 —点击发布****

来自端子

您也可以使用以下命令从 R 控制台上传应用程序:

从你的文档(或应用程序)首次发布的那一刻起,一个名为rsconnect/的文件夹将在你的项目目录中创建。每次您再次遵循这些步骤,您将能够更新您的文档!你可以点击这个链接访问我的报道:【https://lucha6.shinyapps.io/COVIDEDA/

结论

在本文中,我展示了如何创建一个交互式报告来研究 COVID19 数据。我们用ggplotplotlyleaflet制作了一些很酷的剧情。我们还学习了如何在 RMarkdown 和 Shiny 的帮助下部署 100%交互式文档。下一篇文章将介绍如何自动更新数据集、绘图和部署文档,而无需我们打开电脑!😮🙃

探索冠状病毒传播的交互式数据可视化

原文:https://towardsdatascience.com/interactive-data-visualization-for-exploring-coronavirus-spreads-f33cabc64043?source=collection_archive---------28-----------------------

使用 Altair 创建不到 30 行代码的交互式复合图表

一个简单的例子

在我们进入细节之前,我想向您展示一个不到 30 行代码的交互式复合图表,用于探索冠状病毒的传播。

  • 最上面的一个显示的是每日新病例
  • 底部显示的是选择区域新增病例总数

利用牛郎星探索冠状病毒传播的交互式数据可视化

这个图表是用 Python 数据可视化库 Altair 创建的。Altair 是 Python 的声明式统计可视化库,基于 VegaVega-Lite 。Altair 提供了强大而简洁的可视化语法,使您能够快速构建各种各样的统计可视化。

下面是文章大纲:

  • 安装和基本指南
  • 牛郎星的时间和日期
  • 逐步构建探索冠状病毒传播的交互式图表

安装和基本指南

关于 Altair 安装的细节和基本概念,可以看看:

[## 用 Altair 实现 Python 交互式数据可视化

用不到 20 行代码创建交互式图表。

towardsdatascience.com](/python-interactive-data-visualization-with-altair-b4c4664308f8)

以下是以上介绍的要点:

  1. Altair 有很多依赖项,我强烈建议创建一个新的虚拟环境。
  2. 激活您的虚拟环境,并运行pip install altair vega_datasets来安装 Altair 以及 vega_datasets 中的示例数据集。
  3. Altair 创建图表只需要三个主要概念:数据标记编码。牛郎星中的数据是围绕熊猫数据框架建立的。标记是点、线、面积、散点图、直方图、地图等各种图表。编码是数据到视觉属性的映射,如轴、标记颜色、标记形状等。

对于创建虚拟环境的教程,你可以看看:

[## 使用“virtualenv”创建虚拟环境,并将其添加到 Jupyter 笔记本中

你是机器学习工程师,正在使用 Python 和 Jupyter Notebook 吗?在这篇文章中,你会看到为什么…

towardsdatascience.com](/create-virtual-environment-using-virtualenv-and-add-it-to-jupyter-notebook-6e1bf4e03415) [## 使用“conda”创建虚拟环境,并将其添加到 Jupyter 笔记本中

你正在使用 anaconda 和使用 Jupyter Notebook 和 Python 吗?在这篇文章中,你将看到如何创建虚拟的…

medium.com](https://medium.com/analytics-vidhya/create-virtual-environment-using-conda-and-add-it-to-jupyter-notebook-d319a81dfd1)

牛郎星的时间和日期

在我们开始用 Altair 制作交互式时间序列图之前,最好先了解一下 Altair 是如何处理时间和日期的。

处理时间和日期通常是数据分析和可视化的挑战之一。了解以下基本用法,应该足以让你用 Altair 创建一个时序图。

时间和日期的数据类型

牵牛星的设计是为了更好地与熊猫系列配合使用。当您将数据指定为 pandas 数据帧时,数据类型由 Altair 自动确定。

例如,下面是一个包含西雅图每小时测量温度的数据集:

import altair as alt
from vega_datasets import data**source = data.seattle_temps()
source.head()**

西雅图测得的每小时温度示例

下面是一个创建简单折线图的示例

alt.Chart(source).mark_line().encode(
    **x='date'**,
    **y='temp'**
)

通过执行上面的代码,它应该会给你一个如下的图表。

您会注意到 Altair 已经自动为您确定了数据类型。由于在短时间内压缩了大量的数据点,情节过于繁忙;我们可以通过使用时间单位转换让它变得更清楚一点。

Altair 支持的基本数据类型如下:

  • quantitative:简写码 Q ,连续实数值。
  • nominal:简写代码 O ,离散订购数量。
  • ordinal:简写代码 N ,离散订购数量。
  • temporal:速记代码 T ,一个时间或日期值。

因此,如果您手动为每个列指定数据类型,则等效于:

alt.Chart(source).mark_line().encode(
    **x='date:T'**,
    **y='temp:Q'**
)

时间单位转换

随着对数据类型的理解。让我们转到时间单位转换,它可以用来离散化 Altair 中的日期和时间。

让我们通过离散化使西雅图温度图更清晰一点,例如,按月(在日期上应用时间单位转换函数month())并仅绘制月平均温度:

alt.Chart(temps).mark_line().encode(
    x='**month(date):T**',
    y='**mean(temp):Q**'
)

多个时间单位可以组合在一个图中,以生成有趣的数据视图;例如,这里我们使用时间单位转换函数date()month()提取月份和日期,给出西雅图全年的温度概况:

alt.Chart(source).mark_rect().encode(
    x = **alt.X('date(date):O', title='day')**,
    y = **alt.Y('month(date):O', title='month')**,
    color='max(temp):Q'
).properties(
    title="2010 Daily High Temperatures in Seattle (F)"
)

西雅图温度时间单位转换示例

逐步构建探索冠状病毒传播的交互式图表

利用 Altair 的基本知识以及它如何处理时间和日期,让我们制作一个交互式图表来探索冠状病毒的传播。

数据

用于这种数据可视化的数据是由约翰·霍普金斯大学系统科学与工程中心(JHU·CSSE)提供的,他们在公共 Github 页面上分享了他们的数据。约翰霍普金斯 CSSE 汇总了主要来源的数据,如世界卫生组织、国家和地区公共卫生机构。这些数据免费提供,并且每天更新。

对于本教程,我已经完成了数据处理,它运行以下步骤:

  1. 将原始确认、死亡和恢复的 CSV 数据合并到一个数据框架中。
  2. 由于 ships 中缺少值、错误的数据类型和案例,执行数据清理。
  3. 增加一个名为 活动 的活动案例列,由active_case = confirmed — deaths — recovered计算。
  4. 将数据聚集到Country/Region wise 中,并按DateCountry/Region分组。
  5. 添加当日明智 新增病例新增死亡病例新增痊愈病例 扣除前一日相应的累计数据。

而这里是数据处理后的样子(可以从我的 Github Gist 下载)。

数据处理后的covid _ 19 _ clean _ complete . CSV

注意 确认死亡痊愈活跃 都是累计数据。 新增病例新增死亡病例新增痊愈病例 均为日明智数据。该数据帧按 日期国家/地区 分组。

构建交互式图表

首先,让我们导入库并加载数据,

import pandas as pd
import altair as altfull_clean_data = pd.read_csv('covid_19_clean_complete.csv', **parse_dates=['Date']**)

有将近 200 个国家/地区,如果我们把它们都显示出来,图表会很忙。所以让我们列一个我们想去探索的国家的清单。

countries = ['US', 'Italy', 'China', 'Spain', 'France', 'Iran', 'United Kingdom', 'Switzerland']selected_data = full_clean_data[full_clean_data['Country/Region']**.isin(countries)**]

从 covid_19_clean_complete.csv 中选择的国家

让我们创建一个圆形图表来显示当天的 新增案例

alt.Chart(selected_data).**mark_circle()**.encode(
    **x='Date',**
    **y='Country/Region',
    color='Country/Region',
    size='New cases:Q'**
).properties(
    width=1000,
    height=300,
)

上面的结果应该是一个图表,让您可以看到每天的新情况。

基本圆图

由于默认的圆形大小刻度,图表并不突出;我们可以用alt.Size()把它放大一点。

alt.Chart(selected_data).mark_circle().encode(
    x='monthdate(Date):O',
    y='Country/Region',
    color='Country/Region',
    **size=alt.Size('New cases:Q',
        scale=alt.Scale(range=[0, 3000]),
        legend=alt.Legend(title='Daily new cases')**
    ) 
)

这是结果

具有自定义圆形大小的基本圆形图

接下来,我们将使用[**selection_interval()**](https://altair-viz.github.io/user_guide/generated/api/altair.selection_interval.html#altair.selection_interval)函数创建一个区间选择:

interval = alt.selection_interval()

我们现在可以通过设置selection属性将这个间隔绑定到我们的图表上:

alt.Chart(selected_data).mark_circle().encode(
    x='monthdate(Date):O',
    y='Country/Region',
    color='Country/Region',
    size=alt.Size('New cases:Q',
        scale=alt.Scale(range=[0, 3000]),
        legend=alt.Legend(title='Daily new cases')
    ) 
).properties(
    width=1000,
    height=300,
    **selection=interval**
)

上面的结果是一个图表,它允许您单击并拖动来创建一个选择区域,并在创建区域后移动该区域。这很整洁,但是选择实际上还没有做任何事情。

要使用这个选项,我们需要在图表中以某种方式引用它。这里,我们将使用[**condition()**](https://altair-viz.github.io/user_guide/generated/api/altair.condition.html#altair.condition)函数来创建一个条件颜色编码:我们将把颜色绑定到选择中的数据的"Country/Region"列,并将选择之外的数据的颜色设置为"lightgray":

alt.Chart(selected_data).mark_circle().encode(
    x='monthdate(Date):O',
    y='Country/Region',
    **color=alt.condition(interval, 'Country/Region', alt.value('lightgray')),**
    size=alt.Size('New cases:Q',
        scale=alt.Scale(range=[0, 3000]),
        legend=alt.Legend(title='Daily new cases')
    ) 
).properties(
    width=1000,
    height=300,
    selection=interval
)

接下来,我们创建一个mark_bar()图表来显示新案例的总和:

alt.Chart(selected_data).mark_bar().encode(
    y='Country/Region',
    color='Country/Region',
    x='sum(New cases):Q'
).properties(
    width=1000,
)

显示新案例总数的条形图

为了将条形图与之前的散点图关联起来,我们需要使用transform_filter()并传递同一个interval。此外,为了合成多选图表,我们还需要为它们分别创建变量,并使用合成多选&

interval = alt.selection_interval()**circle** = alt.Chart(selected_day_wise).mark_circle().encode(
    x='monthdate(Date):O',
    y='Country/Region',
    color=alt.condition(interval, 'Country/Region', alt.value('lightgray')),
    size=alt.Size('New cases:Q',
        scale=alt.Scale(range=[0, 3000]),
        legend=alt.Legend(title='Daily new cases')
    ) 
).properties(
    width=1000,
    height=300,
    selection=interval
)**bars** = alt.Chart(selected_day_wise).mark_bar().encode(
    y='Country/Region',
    color='Country/Region',
    x='sum(New cases):Q'
).properties(
    width=1000
)**.transform_filter(
    interval
)****circle & bars**

而且,就是这样。这是输出

探索冠状病毒传播的交互式数据可视化

这是完整的代码:

尽情享受吧!

仅此而已。感谢阅读。

关于使用 Altair 创建交互式数据可视化的介绍,您可以看看

[## 用 Altair 实现 Python 交互式数据可视化

用不到 20 行代码创建交互式图表。

towardsdatascience.com](/python-interactive-data-visualization-with-altair-b4c4664308f8)

对于新冠肺炎数据处理

[## 新冠肺炎数据处理

下载、加载、合并、清理和聚合新冠肺炎时间序列数据的分步指南

towardsdatascience.com](/covid-19-data-processing-58aaa3663f6)

用 Pygal 实现 Python 中的交互式数据可视化

原文:https://towardsdatascience.com/interactive-data-visualization-in-python-with-pygal-4696fccc8c96?source=collection_archive---------11-----------------------

用数据讲故事

一步一步的教程,创造惊人的可视化

作者提供的图片(使用 Canva 制作)

我们需要处理、分析和探索的数据量;随着我们周围技术的进步,这个数字只会越来越大。现在,想象一下,必须盯着电子表格中的数千行数据,试图找到隐藏的模式并跟踪数字的变化,这对您的分析后解释可能是有用的。

听起来不好玩,是吧?

这就是数据可视化的用武之地。拥有信息的可视化摘要比浏览电子表格的行更容易识别模式和趋势。人类是视觉动物,我们对视觉刺激的互动和反应更好,可视化数据是让我们更容易更好地理解我们的数据的一种方式。由于数据分析的目的是获得洞察力和发现模式,可视化数据将使其更有价值和易于探索。即使一个数据科学家可以在没有可视化的情况下从数据中获得洞察力,但在没有可视化的情况下向他人传达它的意义将更具挑战性。不同类型的图表和图形使交流数据结果更快、更有效。

可视化数据的重要性不仅仅在于简化数据的解释。可视化数据有很多好处,例如:

  1. 显示数据随时间的变化。
  2. 确定相关事件的频率。
  3. 指出不同事件之间的相关性。
  4. 分析不同机会的价值和风险。

在本文中,我将讨论一个 Python 库,它可以帮助我们创建引人注目、令人惊叹的交互式可视化效果。图书馆是 Pygal。

事不宜迟,让我们开始吧…

臀的

当谈到用 Python 可视化数据时,大多数数据科学家都选择臭名昭著的 Matplotlib、Seaborn 或 Bokeh。然而,经常被忽略的一个库是 Pygal。Pygal 允许用户使用 Flask 或 Django 创建漂亮的交互式图形,这些图形可以转换成具有最佳分辨率的 SVG,以便打印或显示在网页上。

熟悉 Pygal

Pygal 提供了各种各样的图表,我们可以用来可视化数据,准确地说,Pygal 中有 14 种图表类别,如直方图、条形图、饼图、树形图、量表等等。

要使用 Pygal 的魔法,我们首先需要安装 Pygal。

$ pip install pygal

让我们绘制第一张图表。我们将从最简单的图表开始,一个条形图。要使用 Pygal 绘制条形图,我们需要创建一个 chart 对象,然后向其中添加一些值。

bar_chart = pygal.Bar()

我们将画出从 0 到 5 的阶乘。这里我定义了一个简单的函数来计算一个数的阶乘,然后用它来生成一个从 0 到 5 的阶乘列表。

def factorial(n):
    if n == 1 or n == 0:
        return 1
    else:
        return n * factorial(n-1)
fact_list = [factorial(i) for i in range(11)]

现在,我们可以用这个来创造我们的情节

bar_chart = pygal.Bar(height=400)
bar_chart.add('Factorial', fact_list)
display(HTML(base_html.format(rendered_chart=bar_chart.render(is_unicode=True))))

这将产生一个美丽的,互动的情节

如果我们想要绘制不同种类的图表,我们将遵循相同的步骤。您可能已经注意到,将数据链接到图表的主要方法是add方法。

现在,让我们开始建立一些基于现实生活中的数据。

应用

这篇文章的剩余部分,我将使用美国新冠肺炎案例的数据集来解释 Pygal 库的不同方面。

首先,为了确保一切顺利进行,我们需要确保两件事:

  • 我们已经安装了熊猫和 Pygal。
  • 在 Jupyter Notebook 中,我们需要启用 IPython 显示和 HTML 选项。
from IPython.display import display, HTMLbase_html = """
<!DOCTYPE html>
<html>
  <head>
  <script type="text/javascript" src="[http://kozea.github.com/pygal.js/javascripts/svg.jquery.js](http://kozea.github.com/pygal.js/javascripts/svg.jquery.js)"></script>
  <script type="text/javascript" src="[https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js](https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js)""></script>
  </head>
  <body>
    <figure>
      {rendered_chart}
    </figure>
  </body>
</html>
"""

现在我们都设置好了,我们可以开始用 Pandas 探索我们的数据,然后使用不同种类的图表操作和准备它。

import pygal
import pandas as pd
data = pd.read_csv("[https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv](https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv)")

该数据集包含关于新冠肺炎病例、基于日期、县和州的死亡的信息。我们可以看到,使用data.column来了解数据的形状。执行该命令将返回:

Index(['date', 'county', 'state', 'fips', 'cases', 'deaths'], dtype='object')

我们可以得到一个 10 行的样本,看看我们的数据框是什么样的。

data.sample(10)

数据集的前十行

条形图

让我们首先绘制一个条形图,显示每个州的案件数量的平均值。为此,我们需要执行以下步骤:

  • 将我们的数据按州分组,提取每个州的案例号,然后计算每个州的平均值。
mean_per_state = data.groupby('state')['cases'].mean()
  • 开始构建数据并将其添加到条形图中。
barChart = pygal.Bar(height=400)
[barChart.add(x[0], x[1]) for x in mean_per_state.items()]
display(HTML(base_html.format(rendered_chart=barChart.render(is_unicode=True))))

瞧,我们有一个条形图。我们可以通过从图例列表中取消选择来删除数据,也可以通过再次重新选择来重新添加数据。

条形图的完整代码

树形图

条形图有助于显示整体数据,但如果我们想得到更具体的数据,我们可以选择不同类型的图表,即树形图。树状图对于显示数据中的类别很有用。例如,在我们的数据集中,我们有基于每个州每个县的案例数。条形图能够显示每个州的平均值,但我们无法看到每个州每个县的病例分布。一种方法是使用树形图。

假设我们想要查看案例数量最多的 10 个州的详细案例分布。然后,我们需要在绘制数据之前先处理数据。

  • 我们需要根据案例对数据进行排序,然后按州对它们进行分组。
sort_by_cases = data.sort_values(by=['cases'],ascending=False).groupby(['state'])['cases'].apply(list)
  • 使用排序列表获得案例数量最多的前 10 个州。
top_10_states = sort_by_cases[:10]
  • 使用这个子列表来创建我们的树形图。
treemap = pygal.Treemap(height=400)
[treemap.add(x[0], x[1][:10]) for x in top_10_states.items()]
display(HTML(base_html.format(rendered_chart=treemap.render(is_unicode=True))))

然而,这个树状图没有被标记,所以当我们悬停在块上时,我们看不到县名。我们会在这个州的所有县区看到这个州的名字。为了避免这种情况,并将县名添加到我们的树形图中,我们需要标记我们提供给图表的数据。

无标签树形图

在此之前,我们的数据每天都会更新。因此,每个县将有几次重复。因为我们关心每个县的病例总数,所以在将数据添加到树形图之前,我们需要清理数据。

#Get the cases by county for all states
cases_by_county = data.sort_values(by=['cases'],ascending=False).groupby(['state'], axis=0).apply(
    lambda x : [{"value" : l, "label" : c } for l, c in zip(x['cases'], x['county'])])
cases_by_county= cases_by_county[:10]
#Create a new dictionary that contains the cleaned up version of the dataclean_dict = {}
start_dict= cases_by_county.to_dict()
for key in start_dict.keys():
    values = []
    labels = []
    county = []
    for item in start_dict[key]:
        if item['label'] not in labels:
            labels.append(item['label'])
            values.append(item['value'])
        else:
            i = labels.index(item['label'])
            values[i] += item['value']

    for l,v in zip(labels, values):
        county.append({'value':v, 'label':l})
    clean_dict[key] = county
#Convert the data to Pandas series to add it to the treemapnew_series = pd.Series(clean_dict)

然后我们可以将这个系列添加到树形图中,并绘制一个带标签的版本。

treemap = pygal.Treemap(height=200)
[treemap.add(x[0], x[1][:10]) for x in new_series.iteritems()]
display(HTML(base_html.format(rendered_chart=treemap.render(is_unicode=True))))

厉害!现在我们的树形图被标记了。如果我们现在将鼠标悬停在街区上,我们可以看到县、州的名称以及该县的病例数。

标签树形图

树形图的完整代码

圆形分格统计图表

我们可以呈现此信息的另一种形式是使用饼图来显示病例数最多的 10 个州。使用饼图,我们可以看到一个州相对于其他州的病例数的百分比。

由于我们已经完成了所有的数据框操作,我们可以使用它来立即创建饼图。

first10 = list(sort_by_cases.items())[:10]
[pi_chart.add(x[0], x[1]) for x in first10]
display(HTML(base_html.format(rendered_chart=pi_chart.render(is_unicode=True))))

饼状图的完整代码

仪表图

我们要讨论的最后一种图表是仪表图。仪表图看起来像甜甜圈,对于比较少量变量之间的值很有用。因此,我们将比较数据集中的前 5 个州。

仪表图有两种形状,圆环形状或 Pygal 中的SolidGauge,以及指针形状或Gauge

甜甜圈形状

gauge = pygal.SolidGauge(inner_radius=0.70)
[gauge.add(x[0], [{"value" : x[1] * 100}] ) for x in mean_per_state.head().iteritems()]
display(HTML(base_html.format(rendered_chart=gauge.render(is_unicode=True))))

针形

gauge = pygal.Gauge(human_readable=**True**)
[gauge.add(x[0], [{"value" : x[1] * 100}] ) **for** x **in** mean_per_state.head().iteritems()]
display(HTML(base_html.format(rendered_chart=gauge.render(is_unicode=**True**))))

仪表图的完整代码

式样

Pygal 也让我们有机会玩图表的颜色;库中已定义的样式有:

要使用内置样式,您需要导入您想要的样式,或者您可以全部导入。

from pygal.style import *

下面是一些不同内置风格的例子。

不同的内置样式(从左上开始:TurquoiseStyle、LightSolarizedStyle、NeonStyle、DarkStyle)

除了这些样式,您还可以通过设置 style 对象的参数来定义自定义样式。可以编辑的一些属性有代表系列颜色的colorbackground和分别代表图表背景和前景颜色的foreground 。您还可以编辑图表的opacityfont 属性。

这是我的自定义样式的样式对象😄

from pygal.style import Style
custom_style = Style(
  background='transparent',
  plot_background='transparent',
  font_family = 'googlefont:Bad Script',
  colors=('#05668D', '#028090', '#00A896', '#02C39A', '#F0F3BD'))

注意:如果您直接包含 SVG,font-family 属性将不起作用,您必须嵌入它,因为 google 样式表被添加到 XML 处理指令中。

我的定制风格

唷…

有很多图表和颜色…

Pygal 库提供了如此多的选项,更多的图形类型,以及更多的选项来在不同的网站上嵌入结果图形的 SVG。我非常喜欢使用 Pygal 的原因之一是,它允许用户释放他们的创造力,创建交互式的、清晰的、多彩的迷人图形。

参考

[1] Pygal 文档http://www.pygal.org/en/stable/index.html

使用 Plotly 和 Python 的交互式数据可视化

原文:https://towardsdatascience.com/interactive-data-visualization-using-plotly-and-python-4846dd510678?source=collection_archive---------54-----------------------

使用 Plotly 在 Jupyter 笔记本中构建交互式数据可视化

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

Python 非常适合数据探索和数据分析,这都要归功于像 numpy、pandas、matplotlib 和许多其他库的支持。在我们的数据探索和数据分析阶段,理解我们正在处理的数据是非常重要的,为此,我们的数据的可视化表示可能是极其重要的。

对于我们来说,使用 Jupyter 笔记本进行这些项目是很常见的,因为它们非常棒、快速、简单,并且允许我们与数据进行交互和处理。然而,我们所能做的有一些限制,通常当我们处理图表时,我们使用像 matplotlib 或 seaborn 这样的库,但是这些库呈现我们的图表和图形的静态图像。但是很多东西在细节中丢失了,因此我们需要微调我们的图表来探索我们数据的各个部分。如果我们可以通过放大来与我们的图表进行交互,向我们的数据点添加上下文信息,比如悬停交互,这不是很好吗?这就是 Plotly 可以帮助我们的地方。

Plotly 是一个 python 库,可以制作交互式的、出版物质量的图形,如折线图、散点图、面积图、条形图、误差线、箱线图、直方图、热图、支线图等等。

但是我们已经谈得够多了,让我们开始制作一些图表吧…

安装依赖项

在我们构建任何东西之前,让我们安装依赖项。我喜欢使用pipenv,但这同样适用于 anaconda 或其他包管理器。

这是我们需要的依赖项列表

  • jupyter:一个 Web 应用程序,允许你创建和共享包含实时代码、公式等的文档。你知道的!
  • pandas:非常强大的数据分析库,我们将在项目中使用它来处理我们的数据
  • numpy:Python 的科学计算,在我们的数学和生成随机数项目中使用
  • seaborn:基于 matplotlib 的统计数据可视化,我们将使用它来加载库中的一些样本数据
  • 袖扣:允许 plotly 和熊猫一起工作
  • plotly:交互式图表库

以下是安装它们的命令:

pipenv install jupyter
pipenv install plotly cufflinks pandas seaborn numpy

入门指南

首先,我们需要启动 jupyter 笔记本并创建一个新文档:

pipenv run jupyter notebook

一旦我们到了那里,我们就可以开始添加一些代码。因为这篇文章不是关于 Jupyter 笔记本的教程,所以我只关注代码,而不是如何使用文档。

让我们开始导入库:

import pandas as pd
import numpy as np
import seaborn as sns
import cufflinks as cf

在其他库的帮助下,Plotly 可以在不同的上下文中渲染图,例如在 jupyter 笔记本上,在线在 plotly 仪表板上,等等。默认情况下,库以离线模式工作,这正是我们想要的。然而,我们还需要告诉袖扣,我们将对图表使用离线模式。通过将以下单元格添加到我们的笔记本中,可以以编程方式完成此设置:

cf.go_offline()

现在我们准备好获取一些数据并开始绘图。

生成随机数据

我不想过多地关注如何加载或检索数据,因此,我们将简单地为图表生成随机数据,在一个新的单元格中,我们可以使用 pandas 和 numpy 来构建一个 3d 矩阵:

df = pd.DataFrame(np.random.randn(300, 3), columns = ["X", "Y", "Z"])
df.head()

太棒了,使用 numpy 我们可以生成我们的随机数,我们可以将它们加载到一个熊猫数据帧对象中。让我们看看我们的数据是什么样的:

df.head()

我们得到了:

 X              Y             Z
0      0.176117      1.221648      1.201206
1      1.931615      -2.303667     1.914741
2      1.213322      -0.434855     -0.639277
3      0.763220      0.118211      -0.838034
4      0.245442      0.697897      1.169540

太好了!是时候绘制一些图表了。

我们的第一个地块

绘制数据帧的一种简便方法是使用袖扣提供的系列和数据帧上可用的方法iplot。让我们从所有的默认值开始:

df.iplot()

乍一看,它看起来像任何其他图表,但如果你将鼠标悬停在图表上,你会开始看到一些神奇的东西。一个工具栏出现在屏幕右上角的 hover 上,允许你缩放、平移和其他操作。该图表还允许您通过在图表上绘制一个区域来放大,或者简单地查看每个数据点上的工具提示以及值等附加信息。

我们上面的图表当然比静态图表好,但是仍然不够好。让我们尝试使用散点图来呈现相同的图表。

df.iplot(mode = “markers”)

不可怕,但不伟大,点太大,让我们调整它们的大小:

df.iplot(mode = “markers”, size = 5)

好多了!接下来,让我们尝试一些不同的东西。

条形图

让我们暂时忘记我们随机生成的数据集,让我们从 seaborn 库中加载一个流行的数据集来呈现一些其他图表类型。

titanic = sns.load_dataset("titanic")
titanic.head()

我们将要处理的数据集名为“泰坦尼克号”,包含了关于泰坦尼克号上的乘客在悲惨的一天发生了什么的信息。

该数据集中的一个特殊变量是幸存变量,它包含布尔信息,0 表示死亡的人,1 表示事故中幸存的人。让我们制作一个柱状图来看看男人和女人是如何幸存下来的:

titanic.iplot(kind = “bar”, x = “sex”, y = “survived”)

趋势显而易见,但是,如果你只是分享这张图表,就不可能知道我们在谈论什么,因为它没有图例,也没有标题。让我们来解决这个问题:

titanic.iplot(kind = “bar”, x = “sex”, y = “survived”, title = “Survivors”, xTitle = “Sex”, yTitle = “Number of survived”)

现在好多了!

但是如果我们想画一个单杠图呢?很简单:

titanic.iplot(kind = “barh”, x = “sex”, y = “survived”)

太好了!让我们探索更多的功能

主题

到目前为止,我们的图表看起来很棒,但也许我们想为我们的图表使用不同的颜色模式。幸运的是,我们有一组主题可以用来渲染我们的情节。我们把它们列出来,换一个。

列出主题:

cf.getThemes()

它应该输出如下内容:

[‘ggplot’, ‘pearl’, ‘solar’, ‘space’, ‘white’, ‘polar’, ‘henanigans’]

我们可以通过简单地添加以下内容来切换所有未来图表的主题:

cf.set_config_file(theme=”solar”)

现在,如果我们再次渲染我们的条形图,我们会得到这样的结果:

titanic.iplot(kind = “bar”, x = “sex”, y = “survived”)

黑暗模式,我的最爱之一,但请检查他们,让我知道哪一个是你的最爱。

曲面图

到目前为止,我们渲染了令人惊叹的 2d 图表,但 plotly 也支持 3d 图表。让我们构建一些 3d 图表来找乐子。

下一个图,我们将使其成为 3D 表面图,为此,我们需要使用 pandas 创建一些数据,如下所示:

df = pd.DataFrame({“A”: [100, 200, 300, 200, 100], “B”: [100, 200, 300, 200, 100], “C”: [100, 200, 300, 200, 100]})
df.head()

您应该会看到这样的内容:

 A        B        C
0      100      100      100
1      200      200      200
2      300      300      300
3      200      200      200
4      100      100      100 

现在让我们使用“表面”类型将它放在 3d 图表上。

df.iplot(kind = “surface”)

看起来太棒了!和彩色,让我们改变色阶,使其更具视觉吸引力:

df.iplot(kind = “surface”, colorscale = “rdylbu”)

漂亮!但不是这个,你试过和笔记本里的图表互动吗?你甚至可以旋转它!

结论

Plotly 是您数据探索和分析的一个很好的图表选择。正如所见,它提供了交互式仪表板,可以帮助您更好地识别异常值,并通过导航更好地了解您的数据。

我可能不会对每个数据集都使用 plotly,但它是一个非常有趣的库,我们应该了解它。

感谢阅读!

volcano3D 交互式差异表达分析

原文:https://towardsdatascience.com/interactive-differential-expression-analysis-with-volcano3d-cf6c37b5aa6a?source=collection_archive---------40-----------------------

我很高兴向大家介绍 volcano3D,一个 R 套装,现在已经在 CRAN 上发售!volcano3D 软件包能够探测三组之间差异表达的探针。其主要目的是在三维火山图中可视化差异表达的基因。使用 plotly 可以将这些图转换为交互式可视化:

在这里,我将探讨一个来自 PEAC 类风湿性关节炎试验的案例研究(早期关节炎队列的病理生物学)。该方法已在 Lewis,Myles J .等人发表。早期类风湿性关节炎的分子画像确定了临床和治疗反应表型。细胞报告 28.9(2019):2455–2470。(DOI:10.1016/j . cel rep . 2019 . 07 . 091)附带互动网站https://peac . HPC . qmul . AC . uk:

PEAC RNAseq 网站托管使用 R 闪亮和特色火山三维绘图

该工具作为一个可搜索的界面,用于检查个体滑膜和血液基因转录水平与组织学、临床和影像学参数之间的关系,以及 6 个月时的临床反应。交互式界面允许探索基因模块分析模块和临床参数之间的关系。PEAC 互动网络工具被创建为一个闪亮的应用程序,并通过服务器部署到网络上。

入门指南

先决条件

从起重机安装

install.packages("volcano3D")
library(volcano3D)

从 Github 安装

library(devtools)
install_github("KatrionaGoldmann/volcano3D")
library(volcano3D)

火山 3D 数据

样本数据也可以从安装或使用:

install_github("KatrionaGoldmann/volcano3Ddata")
[library](https://rdrr.io/r/base/library.html)(volcano3Ddata)
[data](https://rdrr.io/r/utils/data.html)("syn_data")

该群组中的样本分为三个病理类型组:

[table](https://rdrr.io/r/base/table.html)(syn_metadata$Pathotype)╔═══════════╦═══════╗
║ Pathotype ║ Count ║ 
╠═══════════╬═══════╣
║ Fibroid   ║ 16    ║
║ Lymphoid  ║ 45    ║
║ Myeloid   ║ 20    ║
╚═══════════╩═══════╝

在这个例子中,我们感兴趣的是每一组之间差异表达的基因。

首先,我们将使用 polar_coords 函数将表达式数据映射到笛卡尔坐标。这从每个组的平均缩放 Z 分数 Z 计算出 xy :

然后通过以下方式转换为极坐标:

该功能使用输入:

有关如何创建这些 p 值数据框的更多信息,请参见p 值生成器插图。polar_coords 函数通过以下方式实现:

syn_polar <- [polar_coords](https://katrionagoldmann.github.io/volcano3D/reference/polar_coords.html)(sampledata = syn_metadata,
                          contrast = "Pathotype",
                          pvalues = syn_pvalues,
                          expression = syn_rld,
                          p_col_suffix = "pvalue",
                          padj_col_suffix = "padj",
                          fc_col_suffix = "log2FoldChange",
                          multi_group_prefix = "LRT",
                          non_sig_name = "Not Significant",
                          significance_cutoff = 0.01,
                          label_column = NULL,
                          fc_cutoff = 0.1)

并输出具有以下槽的 S4 极坐标类对象:样本数据、对比度、pvalues、多组测试、表达式、极坐标和非符号名称。pvalues 槽应有一个数据框,其中每个比较至少有两个统计数据(p 值和调整后的 p 值)和一个可选的对数倍数变化统计数据。

如果之前提供了折叠变化列,我们现在可以使用 volcano_trio 函数研究病理类型之间的比较。这产生了三个 ggplot 输出:

syn_plots <- 
     [volcano_trio](https://katrionagoldmann.github.io/volcano3D/reference/volcano_trio.html)(
                  polar = syn_polar,
                  sig_names = [c](https://rdrr.io/r/base/c.html)("not significant","significant",
                                "not significant","significant"),
                  colours = [rep](https://rdrr.io/r/base/rep.html)([c](https://rdrr.io/r/base/c.html)("grey60",  "slateblue1"), 2),
                  text_size = 9,
                  marker_size=1,
                  shared_legend_size = 0.9,
                  label_rows = [c](https://rdrr.io/r/base/c.html)("SLAMF6", "PARP16", "ITM2C"),
                  fc_line = FALSE,
                  share_axes = FALSE) syn_plots$All

显示每个比较的差异表达的火山图

径向图

现在可以使用 radial_plotly 在交互式雷达图上显示微分表达式。labelRows变量允许标记任何感兴趣的标记。

[radial_plotly](https://katrionagoldmann.github.io/volcano3D/reference/radial_plotly.html)(polar = syn_polar,
              label_rows = [c](https://rdrr.io/r/base/c.html)("SLAMF6", "PARP16", "ITM2C"))

显示所有三组之间探针差异表达的交互式放射状图。

通过悬停在某些点上,您还可以确定基因,以备将来询问。

同样,我们可以使用 radial_ggplot 创建静态 ggplot 图像:

[radial_ggplot](https://katrionagoldmann.github.io/volcano3D/reference/radial_ggplot.html)(polar = syn_polar,
              label_rows = [c](https://rdrr.io/r/base/c.html)("SLAMF6", "FMOD"),
              marker_size = 2.3,
              legend_size = 10) +
  theme(legend.position = "right")

使用 ggplot2 进行静态径向绘图

箱线图

然后我们可以询问任何一个特定的变量作为箱线图,来研究这些差异。这是使用 ggplot2 或 plotly 构建的,因此用户可以轻松编辑以添加功能。

plot1 <- [boxplot_trio](https://katrionagoldmann.github.io/volcano3D/reference/boxplot_trio.html)(syn_polar,
                      value = "FAM92B",
                      text_size = 7,
                      test = "polar_padj",
                      levels_order = [c](https://rdrr.io/r/base/c.html)("Lymphoid", "Myeloid", "Fibroid"),
                      box_colours = [c](https://rdrr.io/r/base/c.html)("blue", "red", "green3"),
                      step_increase = 0.1)

plot2 <- [boxplot_trio](https://katrionagoldmann.github.io/volcano3D/reference/boxplot_trio.html)(syn_polar,
                      value = "SLAMF6",
                      text_size = 7,
                      test = "polar_multi_padj",
                      levels_order = [c](https://rdrr.io/r/base/c.html)("Lymphoid", "Myeloid", "Fibroid"),
                      box_colours = [c](https://rdrr.io/r/base/c.html)("blue", "red", "green3"))

plot3 <- [boxplot_trio](https://katrionagoldmann.github.io/volcano3D/reference/boxplot_trio.html)(syn_polar,
                      value = "PARP16",
                      text_size = 7,
                      stat_size=2.5,
                      test = "t.test",
                      levels_order = [c](https://rdrr.io/r/base/c.html)("Myeloid", "Fibroid"),
                      box_colours = [c](https://rdrr.io/r/base/c.html)("pink", "gold"))

ggarrange(plot1, plot2, plot3, ncol=3)

显示特定探针或基因的差异表达的箱线图

三维火山图

最后我们可以看到的是 3D 火山图,它将不同的基因表达投射到圆柱坐标上。

p <- [volcano3D](https://katrionagoldmann.github.io/volcano3D/reference/volcano3D.html)(syn_polar,
               label_rows = [c](https://rdrr.io/r/base/c.html)("SLAMF6", "PARP16", "ITM2C"),
               label_size = 10,
               colour_code_labels = F,
               label_colour = "black",
               xy_aspectratio = 1,
               z_aspectratio = 0.9,
               plot_height = 800)p

交互式 volcano3D 显示了点与点之间的差异表达

此外,还有补充说明,提供以下方面的更多信息:

参考

如果您使用此包,请注明:

citation("volcano3D")## 
## To cite package 'volcano3D' in publications use:
## 
##   Katriona Goldmann and Myles Lewis (2020). volcano3D: Interactive
##   Plotting of Three-Way Differential Expression Analysis.
##   https://katrionagoldmann.github.io/volcano3D/index.html,
##   https://github.com/KatrionaGoldmann/volcano3D.
## 
## A BibTeX entry for LaTeX users is
## 
##   @Manual{,
##     title = {volcano3D: Interactive Plotting of Three-Way Differential Expression
## Analysis},
##     author = {Katriona Goldmann and Myles Lewis},
##     year = {2020},
##     note = {https://katrionagoldmann.github.io/volcano3D/index.html,
## https://github.com/KatrionaGoldmann/volcano3D},
##   }

或者:

Lewis,Myles J .等早期类风湿性关节炎的分子画像确定了临床和治疗反应表型。细胞报告 28.9(2019):2455–2470。

链接

💻源代码可以在:KatrionaGoldmann/volcano 3d找到

🐛要报告错误或提出建议,请访问: volcano3D/issues

⬇️下载自克兰

📖类似的 R 帖子请访问 r 博客

开发商

volcano3D 由伦敦玛丽皇后大学实验医学&风湿病学系转化生物信息学中心的生物信息学团队开发;

感谢阅读,希望你喜欢!🌋

使用 Plotly 的交互式分布图

原文:https://towardsdatascience.com/interactive-distribution-plots-with-plotly-ea58efc78885?source=collection_archive---------37-----------------------

如何创建信息分布图

照片由金莎·艾利斯Unsplash 上拍摄

Plotly Python (plotly.py)是一个基于 plotly javascript (plotly.js)构建的开源绘图库。 Plotly express 是 plotly.py 的一个高级接口,它允许我们创建许多交互式和信息可视化。

在本帖中,我们将使用 plotly express 创建不同类型的分布图。分布图是非常有用的工具,广泛用于统计分析以及数据科学项目的探索性数据分析。顾名思义,分布图显示值的分布,并概述更有可能观察到的值、值分布的程度、值更密集的范围等。

我们将首先使用一个数据集,其中包括 Coursera 上课程的基本信息。数据集可在 Kaggle 上的这里获得。让我们从将数据读入熊猫数据帧开始。

import numpy as np
import pandas as pdcoursera = pd.read_csv("coursera_data.csv")
print(coursera.shape)
coursera.head()

我们需要做一些数据清理和操作。“未命名:0”列只是一个 ID,因此我们可以删除它。

coursera.drop('Unnamed: 0', axis=1, inplace=True)

“课程 _ 学生 _ 注册”列的数字格式不正确。比如 5.3k 应该是 5300 等等。有不同的方法来完成这项任务。我们要做的是分离最后的字符,并将其转换为数值(k 代表千,m 代表百万)。然后乘以这些值,得到实际的注册人数。

coursera['unit'] = [x.strip()[-1] for x in coursera['course_students_enrolled']]unit_values = {'k':1000, 'm':1000000}
coursera.unit.replace(unit_values, inplace=True)

我们还需要从 course_students_enrolled 列中删除字母“k”和“m ”,这可以通过分割字符串以排除最后一个字符来完成。

coursera['course_students_enrolled'] = coursera['course_students_enrolled'].str.slice(0, -1)

然后我们可以将这两列相乘,创建一个“注册”列。为了能够多重化,两个列都必须具有数字数据类型。

coursera['course_students_enrolled'] = coursera['course_students_enrolled'].astype("float")coursera['enrollment'] = coursera['course_students_enrolled'] * coursera['unit']coursera.drop(['course_students_enrolled','unit'], axis=1, inplace=True)coursera.head()

让我们首先在注册栏上创建一个基本直方图。为了让图看起来更好,我删除了登记值超过 500k 的离群值。

df = coursera[coursera.enrollment < 500000]fig = px.histogram(df, x="enrollment")
fig.show()

大多数课程的注册人数不到 10 万。我们还可以检查课程难度对注册是否有任何影响。

fig = px.histogram(df, x="enrollment", color="course_difficulty", 
                   facet_col="course_difficulty",
                   title="Course Enrollment Numbers")
fig.show()

初级课程的报名人数最多,随着难度的增加,报名人数会减少。然而,在每个难度级别内,有一个相似的分布趋势。

我们可以创建一个类似的图来可视化课程评级。这一次,我们还将 y 轴用于不同的目的。通过将 enrollment 列传递给 y 参数,我们可以看到注册的总人数以及课程评级的分布情况。

fig = px.histogram(df, x="course_rating", y="enrollment",
                   color="course_difficulty", 
                   facet_col="course_difficulty",
                   title="Course Ratings")
fig.show()

我们可以使用 plotly 的图形工厂在一个图形上有多个分布。Numpy 可用于创建具有不同分布类型的合成变量。

x1 = np.random.normal(3, size=500)
x2 = np.random.normal(5, size=500)

让我们把这些变量放在图上:

variables = [x1, x2]labels = ['Normal', 'Random']fig = ff.create_distplot(variables, labels, show_hist=False)
fig.show()

我们有两个均值不同的正态分布变量。底部的图被称为“地毯”图,这是表示分布的另一种方式。在人口更稠密的地区,垂直线更密集。我们可以通过将 show_rug 参数设置为 false 来消除地毯图部分。

另一种表示分布的方式是箱线图。让我们回到 Coursera 数据集,使用箱线图来可视化注册人数。

fig = px.box(df, y="enrollment", 
             color="course_difficulty", 
             title="Course Enrollment Numbers")
fig.show()

Boxplot 给出了一个关于这些值如何分布的概念,同时也指出了异常值。当我们将鼠标悬停在箱线图上时,我们会看到箱线图的临界值,即最小值、第一个四分位数、中值、第三个四分位数、上围栏和最大值。如果没有异常值,那么上栏就是最大值。我们还能够看到异常值。

我们已经用 plotly 介绍了基本分布图。当然,这只是这个神奇的图书馆的一小部分功能。我们可以使用 plotly 动态创建许多其他绘图类型。它的语法也很容易理解。在接下来的帖子中,我会尝试涵盖更复杂的情节。你也可以查看 plotly 文档,我认为它有很多不同的例子。就像任何其他主题一样,熟悉 plotly 的最好方法就是实践。因此,我建议创造大量的情节来提高你的技能。

感谢您的阅读。如果您有任何反馈,请告诉我。

使用 Python 中的 Geoviews 进行交互式地理空间数据可视化

原文:https://towardsdatascience.com/interactive-geospatial-data-visualization-with-geoviews-in-python-7d5335c8efd1?source=collection_archive---------5-----------------------

如何开始使用 Geoviews 的初学者指南。

互动地图

交互式数据可视化已经成为数据科学过程中不可或缺的一部分,以便试验和执行数据科学中的第一个探索过程。在 Python 生态系统中,很少有交互可视化地理数据的选项,但是,我认为 Geoviews 提供了易于使用的高级 API 和广泛的灵活性。

G eoViews 是一个 Python 库,它使得探索和可视化地理、气象和海洋数据集变得容易,例如那些用于天气、气候和遥感研究的数据集。

在本教程中,我们将介绍使用 Geoviews 进行交互式地理数据可视化的基本组件。

首先,让我们导入本教程使用的库。

import pandas as pd
import geopandas as gpdimport geoviews as gv
import geoviews.feature as gffrom geoviews import opts
from cartopy import crs 
import geoviews.tile_sources as gtsgv.extension(‘bokeh’, ‘matplotlib’)

接下来,我们从一个简单的示例开始,展示如何使用 Geoviews 库绘制坐标。

点地图

让我们为这四个城市创建一个元组,保存城市的坐标和名称。

stockholm = ( 18.070625,59.320462, “Stockholm”)
london = ( -0.135593, 51.507020, “London”)
istanbul = ( 28.981856, 41.008327, “Istanbul”)
mogadishu = ( 45.299626, 2.042388, “Mogadishu”)

我们可以使用 Geoviews 功能创建简单的点。我们也可以用熊猫,但也没必要那样。一旦你创建了一个 Geoviews 特征,你可以通过dframe()来创建一个数据框,如下所示。

cities = gv.Points([stockholm, london, istanbul, mogadishu], vdims=”City”)
cities.dframe()

城市积分

现在,我们准备好了我们的第一张地图。你可以简单地调用这些特性,它会绘制点。然而,在这种情况下,我们使用opts 选项设置一些属性,如颜色和大小。

cities.opts(opts.Points(global_extent=True, width=500, height=475, size=12, color=’black’))

下面显示的是点的地图。这是一个简单的情节,以后会修改。然而,我们的点是用它们的纬度和经度绘制的。

带地理视图的简单地图

然而,这些点缺乏背景,而这正是我们需要底图的地方。在下一节中,我们将看到如何在绘图中包含底图。

底图

Geoviews 提供了一些简洁的底图。让我们看看有什么可用的。

gv.Layout([ts.relabel(name) for name, ts in gts.tile_sources.items()]).opts(
 ‘WMTS’, xaxis=None, yaxis=None, width=225, height=225).cols(6)

Geoviews 中可用的底图

到目前为止,有 19 种不同的底图可以在 Geoviews 中使用,所以让我们尝试其中的一些。

gv.tile_sources.OSM.opts( width=800, height=600)

OpenStreetMap 底图

上图显示了全世界的 OpenStreetMap(OSM)底图。虽然它现在是空的,但它是一个交互式地图。

接下来,我们叠加基础地图和我们上面创建的城市点。

(gv.tile_sources.CartoDark * cities).opts(opts.Points(global_extent=True, width=800, height=600, size=8, color=’red’))

在 Geoviews 中,这与使用*叠加任意两个(或更多)要素一样简单。在我们的例子中,我们覆盖了底图和城市点。

Geoviews 中带有底图的城市点

如上图所示,我们可以看到城市点在底图的帮助下处于正确的位置。在下一节中,我们将介绍地理数据科学中一个非常重要的组成部分——投影。

预测

当我们在地图制作中将地球变平时,我们会引入一些扭曲。有不同的预测,有些熟悉,有些不熟悉。让我们看看投影是如何扭曲地图的。

projections = [crs.RotatedPole, crs.LambertCylindrical, crs.Geostationary, 
 crs.AzimuthalEquidistant, crs.OSGB, crs.EuroPP, crs.Gnomonic,
 crs.Mollweide, crs.OSNI, crs.Miller, crs.InterruptedGoodeHomolosine,
 crs.SouthPolarStereo, crs.Orthographic, crs.NorthPolarStereo, crs.Robinson,
 crs.LambertConformal, crs.AlbersEqualArea]proj_layout = gv.Layout([gf.coastline.relabel(group=p.__name__).opts(projection=p(), backend=’matplotlib’)
 for p in projections])gv.output(proj_layout, backend=’matplotlib’)

下图显示了一些可用的不同投影。

地理预测

我们选择正交(M)投影来可视化失真。但是首先,我们用 Geopandas 读取世界各国的数据。Reviews 与 Geopandas 库很好地集成在一起,可以随时使用。

world = gpd.read_file(gpd.datasets.get_path(‘naturalearth_lowres’))
world.head()

世界数据包含国家的多边形和一些其他特征,如 pop_estimate、洲等..

世界人口地理数据框架

要绘制多边形数据,我们只需调用gv.Polygon()并传递 Geopandas GeodataFrame。

world_poly = gv.Polygons(world).opts(color=”gray”, line_color=”white” ) 

我们也创建城市点,但是这次做了一些调整。我们将点的大小减少到 8,并给它一个红色。

cities_points = gv.Points(cities).opts(opts.Points(global_extent=True, width=800, height=600, size=8, color=’red’, tools=[‘hover’]))

现在,我们可以叠加点和多边形。此外,我们提供了我们希望在opts参数中使用的投影。

(world_poly * gf.ocean * cities_points).opts(projection=crs.Orthographic(central_longitude=0.1, central_latitude=22), global_extent=True, width=600, tools=[‘hover’])

下图描绘了以非洲为中心的正投影。

带有城市点的正投影

接下来,我们学习如何用 Geoivews 绘制 Choropoleth 地图

等值区域图

您已经看到了如何绘制多边形,我们只添加一个组件来绘制 choropleth 地图。我们只提供希望用于 choropleth 的列的名称。

gv.Polygons(world, vdims=[‘name’, ‘pop_est’, ‘gdp_md_est’], label=”World Population”).opts(color=’pop_est’,cmap=’blues’, colorbar=True, xaxis=None, yaxis=None,toolbar=’above’, width=1000, height=700, tools=[‘hover’])

下面显示的 choropleth 地图使用蓝色对每个国家的世界人口进行分类。

等值区域图

最后,我们将介绍 Geoviews 的一些简洁功能,即交互式小部件。

交互式小工具

交互式小部件提供了一些灵活的方法来可视化数据。多亏了 Geoviews,你现在可以用大量复杂的代码创建微件。在本例中,我们学习了如何对数据进行分组并只显示一个组。让我们说,我们想要显示我们想要可视化的大陆。

首先,我们按大陆分组,与gv.Polygon()一起策划。

coountries_grouped = gv.Polygons(world, vdims=[‘name’, ‘continent’],label=”Continent”).groupby(“continent”) 

接下来,我们绘图并提供绘图的宽度和高度选项。

continents = coountries_grouped.opts(width=600, height=400, tools=[‘hover’], infer_projection=True)
continents

下面的 GIF 展示了只用上面两行代码创建的小部件。图中只显示选定的洲。

带有地理视图的 GIF 下拉微件

结论

在本教程中,我们已经了解了如何使用 Geoviews 交互式打印地理空间数据。本教程涵盖了一些展示 Geoviews 基础知识的示例。你可能会从官方地理视图图库中找到一些有趣的教程,所以试试吧。

要安装 Geoviews,只需使用 Conda:

conda install -c pyviz geoviews

Python 中的交互式图形

原文:https://towardsdatascience.com/interactive-graphs-in-python-830b1e6c197f?source=collection_archive---------20-----------------------

Matplotlib 的一个非常快速简单的扩展

Python 是我最喜欢的编程语言,取代了包括 Java 和 C++在内的低级语言以及 Matlab 和 r 等高级语言。除了大量的库及其易于实现之外,主要原因之一是其数据可视化。使用 Matplotlib 和相关的库绘制东西非常直观和容易。在本文中,我想介绍 ipywidgets,它是一个库,可以通过实时更新向您的图形添加一个交互式滑块(如上面的标题图所示)。您将需要安装以下库来阅读本文:

  • 笔记本 —在网络浏览器中显示我们的交互式图表
  • ipywidgets — 向我们的图表添加一个交互式滑块
  • numpy — 为我们的图表生成点
  • matplotlib——生成我们的图表

首先,让我们创建一个我们想要交互的图表。我将绘制一个正弦波,并添加一个滑块来改变函数的输入。为了创建图表,我将继续使用 linspace 函数在单位圆周围生成点,创建 x 值(输入)和 y 值(输出)。

现在我们已经有效地创建了我们的点集,我们可以使用 Matplotlib 来绘制它们。

显示该图(使用 plt.show() )将产生以下图形…

这是一个相当不错的正弦波!但是正如这篇文章的标题所暗示的,我们想让这个互动…

您会注意到我们的原始代码有一些细微的变化。我们包含了 ipywidgets 库中的@interact,并返回我们在正弦波函数中创建的图形。此外,我们还添加了一个新参数 c,默认值为 1。这是将被赋予一个滑块并允许用户与图形交互的值。在这种情况下,我们将正弦波函数的输入乘以 c,允许用户确定所绘制的正弦波的频率。

用 Python 创建交互式图形就是这么简单!您甚至可以通过在图形函数中包含更多参数来改变多个参数,将为每个参数创建一个滑块!当试图在二维空间中可视化多元方程时,这真的很方便。

🤖交互式机器学习实验

原文:https://towardsdatascience.com/interactive-machine-learning-experiments-e9b29b0cb7b9?source=collection_archive---------28-----------------------

TL;速度三角形定位法(dead reckoning)

嘿读者们!

我已经开源了新的🤖GitHub 上的交互式机器学习实验项目。每个实验包括🏋️ Jupyter/Colab 笔记本(看一个模特是如何被训练的)和🎨演示页面(在您的浏览器中查看模型运行情况)。

尽管模型可能有点笨(记住,这些只是实验,而不是生产就绪代码),但它们会尽力:

  • 🖌可以识别您在浏览器中绘制的数字或草图
  • 📸检测并识别您要在相机上展示的对象
  • 🌅对您上传的图像进行分类
  • 📝和你一起写一首莎士比亚的诗
  • ✊🖐✌️和你一起玩石头剪刀布游戏
  • 等等。

我已经使用 TensorFlow 2Keras 支持在 Python 上训练了模型,然后使用 ReactJavaScript 版本的 Tensorflow 在浏览器中使用它们进行演示。

模型性能

⚠️首先,让我们设定我们的期望。️该库包含机器学习实验,而不是生产就绪,可重复使用,优化和微调的代码和模型。这更像是一个学习和尝试不同机器学习方法、算法和数据集的沙箱或游乐场。模型可能表现不佳,存在过度拟合/欠拟合的情况。

因此,有时您可能会看到这样的情况:

但是要有耐心,有时候模型可能会变得更聪明🤓给你这个:

背景

我是一名软件工程师,在过去的几年里,我主要从事前端和后端编程。在我的业余时间,作为一种爱好,我决定挖掘机器学习的话题,让它对我自己来说不那么像魔法的和更像数学

  1. 🗓因为 Python 可能是开始尝试机器学习的好选择,所以我决定先学习它的基本语法。结果一个🐍学习 Python 的操场和 cheat sheet项目出来了。这只是为了练习 Python,同时在我需要的时候有一个基本语法的备忘单(比如dict_via_comprehension = {x: x**2 for x in (2, 4, 6)}等)。).
  2. 🗓学了一点 Python 之后,我想深入研究机器学习背后的基本数学。所以在通过了由吴恩达在 Coursera上开设的一门很棒的机器学习课程后🤖自制机器学习项目出来了。这一次,它是关于创建一个基本的机器学习数学算法的备忘单,如线性回归,逻辑回归,k-means,多层感知器等。
  3. 🗓下一个尝试玩基本机器学习数学的是🤖纳米神经元。它是关于 7 个简单的 JavaScript 函数,应该给你一种机器如何真正“学习”的感觉。
  4. 🗓在 Coursera 上完成了 Andrew Ng 的另一个令人敬畏的深度学习专业后,我决定用多层感知器、卷积和递归神经网络(CNN 和 RNNs)多练习一点。这一次,我决定开始使用一些机器学习框架,而不是从头开始实现一切。我最后用 TensorFlow 2 搭配 Keras 使用。我也不想太专注于数学(让框架为我做这件事),相反,我想做一些更实际、更适用的东西,一些我可以尝试在我的浏览器上玩的东西。结果新的🤖交互式机器学习实验出来了,我想在这里多描述一点。

技术堆栈

模特培训

  • 🏋🏻‍我用 Keras 里面的 TensorFlow 2 进行建模和训练。由于我对机器学习框架毫无经验,我需要从一些东西开始。TensorFlow 的一个卖点是它既有 Python 的风格,又有类似 API 的 JavaScript 风格。所以最终我用 Python 版本做培训,用 JavaScript 版本做演示。
  • 🏋🏻‍:我在本地使用 Jupyter 笔记本电脑在 Python 上训练 TensorFlow 模型,有时使用 Colab 让训练在 GPU 上更快。
  • 💻大多数模型都是在旧 MacBook 的 Pro CPU(2.9 GHz 双核英特尔酷睿 i5)上训练的。
  • 🔢当然,你不可能为了矩阵/张量运算而逃离数字

模型演示

  • 🏋🏻‍:我用 TensorFlow.js 对之前训练过的模型进行预测。
  • ♻️将 Keras HDF5 模型转换为 TensorFlow.js 图层格式,我使用了 TensorFlow.js 转换器。将整个模型(数兆字节的数据)传输到浏览器,而不是通过 HTTP 请求进行预测,这可能是低效的,但是请再次记住,这些只是实验,而不是生产就绪的代码和架构。我想避免使用专用的后端服务来简化架构。
  • 👨🏻‍🎨使用create-React-appstarter 在 React 上创建了演示应用程序,并使用默认风味进行类型检查。
  • 💅🏻为了造型,我用了材质 UI 。正如他们所说,这是“一箭双雕”,尝试一种新的风格框架(抱歉, Bootstrap 🤷🏻‍).

实验

简而言之,您可以通过以下链接访问演示页面和 Jupyter 笔记本:

多层感知器实验(MLP)

【MLP】多层感知器是一类前馈人工神经网络(ANN)。多层感知器有时被称为“香草”神经网络(由多层感知器组成),尤其是当它们只有一个隐藏层时。**

手写数字识别

你画一个数字,模型试图识别它。

手写草图识别

你画了一张草图,模特试图识别它。

卷积神经网络(CNN)实验

一种 卷积神经网络(CNN,或 ConvNet) 是一类深度神经网络,最常用于分析视觉图像(照片、视频)。它们被用于检测和分类照片和视频上的物体,风格转换,人脸识别,姿态估计等。

手写数字识别(CNN)

你画一个数字,模型试图识别它。这个实验类似于 MLP 的实验,但是它使用了 CNN。

手写草图识别(CNN)

你画了一张草图,模特试图识别它。这个实验类似于 MLP 的实验,但是它使用了 CNN。

石头剪刀布(CNN)

你和模特玩石头剪子布游戏。这个实验使用的是从零开始训练的 CNN。

石头剪刀布(MobilenetV2)

你和模特玩石头剪子布游戏。该模型使用迁移学习,基于 MobilenetV2

对象检测(MobileNetV2)

你通过你的相机向模型展示你的环境,它会试图检测和识别物体。这个模型使用迁移学习,基于 MobilenetV2

图像分类(MobileNetV2)

你上传一张图片,模型试图根据它在图片上“看到”的东西对它进行分类。这个模型使用迁移学习,基于 MobilenetV2

递归神经网络实验(RNN)

A 递归神经网络(RNN) 是一类深度神经网络,最常用于基于序列的数据,如语音、声音、文本或音乐。它们用于机器翻译、语音识别、语音合成等。

数字求和

你输入一个求和表达式(即17+38),模型预测结果(即55)。这里有趣的部分是,该模型将输入视为一个序列,这意味着它知道当你键入一个序列11717+17+317+38时,它会将其“翻译”到另一个序列55。你可以把它想象成把西班牙语Hola序列翻译成英语Hello

莎士比亚文本生成

你开始像莎士比亚一样键入一首诗,模型会像莎士比亚一样继续它。至少它会尝试这样做😀。

维基百科文本生成

你开始键入一篇维基文章,模型试图继续下去。

未来计划

正如我上面提到的,的主要目的是更像一个学习的游乐场,而不是生产就绪模型。因此,主要计划是继续学习和试验深度学习挑战和方法。下一个有趣的挑战可能是:

  • 情绪检测
  • 风格转移
  • 语言翻译
  • 生成图像(即手写数字)
  • 等等。

另一个有趣的机会是调整现有的模型,使它们更有性能。我相信它可能会更好地理解如何克服过度拟合和欠拟合,以及如果模型只是停留在训练集和验证集的60%精度水平上,而不想再改进的话,该如何处理模型🤔。

不管怎样,我希望你能从资源库中找到一些对模型训练有用的见解,或者至少能从演示中获得一些乐趣!

快乐学习!🤖

Python、Pandas 和 Plotly 的交互式地图

原文:https://towardsdatascience.com/interactive-maps-with-python-pandas-and-plotly-following-bloggers-through-sydney-c24d6f30867e?source=collection_archive---------12-----------------------

跟随博主在悉尼的足迹

在这篇文章和其他几篇文章中,我将探索 Python 和 Plotly,把一些不同的看起来很棒的图表放在一起。Plotly.js 是一个基于 Javascript 的可视化库,由一家名为 Plotly 的公司构建,他们也为各种语言提供了包装器,包括一个名为… plotly 的 python 包装器。

尽管它们的命名模式不尽如人意,但它们确实构建了一个非常强大、但仍非常可定制的库,我很想探索它能做什么。

你可以跟随我使用的源代码和数据,从这个 GitLab 库

位置,位置,位置

经常看文章,像美食博客,或者旅游博客,想:这些地方到底在哪里

在去年的圣诞假期,我有机会和我的伴侣一起回到悉尼,她从未去过澳大利亚,更不用说悉尼了。我来自悉尼,我想帮助她看到悉尼的“最好”,并像我们许多人一样欣赏它。

所以我读了一些旅游博客,看看第一次来的游客喜欢悉尼的什么。我突然意识到这样做会让游客很容易搞不清东西在哪里,哪些景点值得一看。计划每一天的日程将是一件痛苦的事,因为永远不清楚一个地方与另一个地方相比有多远。

我的解决方案是绘制一张地图,心中有三个目标:

  • 第一,建立一个互动地图,包括每一个标记的位置。
  • 第二,地图会有不同的标记来表示位置的类型。无论它是一个地标,一个位置(像一个郊区),还是一个交通枢纽。
  • 第三,显示有多少博客提到了这个位置,这样我们就可以筛选出更“重要”的。

Plotly 有我定制的可视化库。我已经看到它包含了一个惊人的地图框集成,这是我以前没有尝试过的。所以我想我会一石二鸟。

在开始之前

我假设您熟悉 python。即使你相对较新,这个教程也不应该太难。

你需要用一个简单的pip install [PACKAGE_NAME]pandasplotly安装到你的虚拟环境中。

如果你没有地图框令牌,给他们设置一个——我们会需要它。他们提供了一个非常自由的帐户,有非常合理的访问限制。

我将密钥保存在一个文件中,并使用以下命令加载它:

with open('mapbox_tkn.txt', 'r') as f: 
    mapbox_key = f.read().strip()

地图很有趣

介绍

尽管使用了 NLP 工具,整理这些信息还是有点困难,因为人们坚持在博客上拼错名字,或者只是用不同的名字称呼事物。(‘海港大桥’还是‘悉尼港湾大桥’?维多利亚女王大厦还是 QVB?)

本教程侧重于情节,而不是刮,所以我会提供loc_data.csv(所有数据和脚本可在我的 repo 这里)。该文件包含我们要查看的所有独特位置的数据。每个博客的数据都包含在名为blog_file[N].csvdata_csvs子目录中。

将 csv 文件加载到数据帧中,并查看其内容:

loc_df = pd.read_csv('mapping_blogs/loc_data.csv', index_col=0) print(loc_df.head())

您将看到有五列:索引、位置、纬度、经度和类型。

它们是索引号、位置名称字符串、以小数表示的纬度和经度以及位置类型。

数据清理

第一次检查时,“类型”列看起来是绝对的。一列中的所有唯一值都可以通过loc_df.type.unique()进行整理。它显示的是['Area', nan, 'Food/Drinks', 'Transport', 'Lodging']。的确如此!我记得 NaN 值是那些我无法归类的值。先给它们起个名字,Misc为杂。

最简单的方法是使用 pandas 的.fillna方法和inplace参数。loc_df.type.fillna('Misc', inplace=True)将完成此操作,并填入任何 NaN 值。

我们的第一张地图

到这个阶段,我们实际上已经有足够的信息来设计一些东西了!通过 plotly 的魔力,我们只需要为我们的第一张地图添加以下代码行:

import plotly.express as px 
fig = px.scatter_mapbox(loc_df, lat="lat", lon="lon", color="type")
fig.update_layout(mapbox_style="open-street-map") 
fig.show()

我们的第一张地图!

类似这样的东西应该已经在你的浏览器上(或者在你的 Jupyter 笔记本上)打开了。是不是很酷?仅仅用了三行代码就画出了这个。Plotly Express 可以更快地创建情节。地图是交互式的,因此可以通过单击图例来缩放、平移、查看标记和隔离每个地块。

我们在这里做的是将整个数据帧传递给.scatter_mapbox函数,并指定数据所在的列。然后我们使用update_layout指定open-street-map样式(本指南中的列出了可用的样式)。

如果您想知道我们是如何将之前加载的mapbox_key变量传递给 Plotly 的,答案是我们没有。使用open-street-map风格意味着不需要地图框键,开放街道地图是一个免费的合作项目。

现在我们知道了如何制作一个基本的地图,让我们进入杂草中,仔细观察数据,并添加一些附加功能。

严肃的映射

鼠标悬停

在玩地图的时候,你可能注意到了鼠标悬停工具提示。它们很棒,但不是特别有用。所以让我们解决这个问题。我们想看看这个地方的名字,不太在乎确切的坐标。让我们指定参数hover_name='location',而不是hover_data=['type']

我还认为彩色地图有点分散了叠加的注意力,所以我把地图框样式改成了light,现在我们需要提供地图框键。最后,当我对悉尼市区最感兴趣的时候,我认为地图一开始就太高了。因此,让我们通过指定zoom参数来更改默认的映射区域。代码和生成的地图如下:

fig = px.scatter_mapbox(loc_df, lat="lat", lon="lon", color="type", hover_name='location', hover_data=['type'], zoom=12) 
# Now using Mapbox 
fig.update_layout(mapbox_style="light", mapbox_accesstoken=mapbox_key) 
fig.show()

鼠标悬停弹出窗口很棒,但是(还)不太能提供信息

好吧,这是一个巨大的进步。现在我们已经实现了三个目标中的两个。对于最后一个,我们将不得不编译位置的计数。所以,回到数据框架。

寻找最受欢迎的目的地

我想看看哪些目的地或地点最受博客作者的欢迎。因此,在本节中,我们将统计每个位置被包含的次数。

第一步是统计主列表中的哪些位置在每个博客中,并对结果数据帧进行排序:

data_dir = 'data_csvs' 
data_files = [i for i in os.listdir(data_dir) if i.endswith('.csv')] for csv_file in data_files: 
    with open(os.path.join(data_dir, csv_file), 'r') as f: 
        locs_txt = f.read() 
    temp_locs = locs_txt.split('\n') 
    locs_bool = [loc_in_list(i, temp_locs) for i in list(loc_df['location'])] 
    loc_df = loc_df.assign(**{csv_file: locs_bool}) loc_df = loc_df.assign(counts=loc_df[data_files].sum(axis=1))
loc_df.sort_values(by='counts', inplace=True, ascending=False)

loc_in_list函数是我写的用来比较位置名称和列表的东西,考虑了包括/省略单词‘the’和各种撇号/引号的各种组合。

def loc_in_list(loc, loc_list): loc_list = list(set([i.strip().lower() for i in loc_list if len(i.strip().lower()) > 0])) 
loc_list += ['the ' + i for i in loc_list if i[:4] != 'the '] 
loc_list += [i[4:] for i in loc_list if i[:4] == 'the '] for t_char in ["'", "-"]: 
    loc_list += [i.replace(t_char, "") for i in loc_list if t_char in i] 
    loc_list += [i.replace(t_char, " ") for i in loc_list if t_char in i] loc = loc.replace("'", "'") 
loc = loc.strip().lower() loc_in_list_bool = (loc in loc_list) or (loc.replace("'", "") in loc_list) return loc_in_list_boolprint(loc_df.head())

再次查看数据帧,看起来我们得到了一个按出现次数排序的数据帧。《海港大桥》在每个榜单上都出现了 6 个!

我们可以添加一个sizing参数(和max_size来控制符号大小),并再次绘制地图:

fig = px.scatter_mapbox( loc_df, lat="lat", lon="lon", color="type", size="counts", hover_name='location', hover_data=['type'], zoom=12, size_max=15) 
fig.update_layout(mapbox_style="light", mapbox_accesstoken=mapbox_key) 
fig.show()

重叠位置

你们当中眼尖的人可能已经注意到了这些重叠的位置。

对于像这样的地方,我将查看重叠的位置,只查看计数较高的名称的位置。

我简单地遍历每一行,寻找距离小于阈值的行:

loc_df = loc_df.assign(dup_row=0) 
loc_thresh = 0.0001 for i in range(len(loc_df)): 
    src_ind = loc_df.iloc[i].name 
    for j in range(i+1, len(loc_df)): 
        tgt_ind = loc_df.iloc[j].name 
        lat_dist = loc_df.loc[src_ind]['lat'] - loc_df.loc[tgt_ind]['lat'] 
        lon_dist = loc_df.loc[src_ind]['lon'] - loc_df.loc[tgt_ind]['lon'] 
        tot_dist = (lat_dist ** 2 + lon_dist ** 2) ** 0.5 
        if tot_dist < loc_thresh: 
            print(f'Found duplicate item "{loc_df.loc[tgt_ind]["location"]}", index {tgt_ind}') 
            for csv_file in data_files: 
                if loc_df.loc[tgt_ind, csv_file]: 
                    loc_df.loc[src_ind, csv_file] = True 
                if loc_df.loc[tgt_ind, 'location'] not in loc_df.loc[src_ind, 'location']: 
                    loc_df.loc[src_ind, 'location'] = loc_df.loc[src_ind, 'location'] + ' | ' + loc_df.loc[tgt_ind, 'location'] 
                    loc_df.loc[tgt_ind, 'dup_row'] = 1 loc_df = loc_df[loc_df.dup_row == 0] 
loc_df = loc_df.assign(counts=loc_df[data_files].sum(axis=1))
loc_df.sort_values(by='counts', inplace=True, ascending=False)

现在可以绘制数据了!我还关闭了显示栏和禁用编辑,这是我在所有绘图中使用的。

fig = px.scatter_mapbox(loc_df, lat="lat", lon="lon", color="type", size="counts", hover_name='location', hover_data=['type'], zoom=12, size_max=15) 
fig.update_layout(mapbox_style="light", mapbox_accesstoken=mapbox_key) 
fig.show( config={ 'displayModeBar': False, 'editable': False, }, )

看那个——桥上的点已经被连接起来,名字彼此相加,计数增加了!

因此,我们有一个交互式的,可按类别过滤的工具提示!

这就完成了这篇关于在地图上绘制散点图的文章。希望你对此感兴趣。

如果你喜欢这个,比如说👋/在 twitter 上关注,或关注更新。

Jupyter 笔记本中的交互式数据透视表

原文:https://towardsdatascience.com/interactive-pivot-tables-in-jupyter-notebook-fc74bad8aa67?source=collection_archive---------11-----------------------

使用 PivotTable.js 创建交互式数据透视表

图片由 PixabayMudassar Iqbal 提供

Python 在很短的时间内获得了普及,但在某些情况下,它与数据的交互还不够,这正是 excel 领先的地方。对于模型的开发,最初的步骤是数据理解和探索性数据分析(EDA)。

对于 EDA,你需要灵活处理数据的能力。在创建数据透视表的情况下,Python 在与数据交互方面有所欠缺。在创建数据透视表方面,Excel 处于领先地位,因为它提出了表格的交互式和动态开发。

在 pandas 中创建数据透视表是一个燃烧过程。数据透视表的结构需要提前决定,相应地,脚本需要开发。要在数据透视表中进行一些操作,需要再次更改代码并运行脚本。这是一个燃烧过程,以产生洞察力,从而继续进行模型构建。

**pd.pivot_table(df, 
               values='Survived',
               index=['Pclass'],
               columns=['Sex'],
               aggfunc='sum'
              )**

**pd.pivot_table(df, 
               values='Survived',
               index=['Pclass','Embarked'],
               columns=['Sex'],
               aggfunc='sum'
              )**

数据透视表用于在 EDA 过程中获得关于数据的见解,要在 pandas 中生成数据透视表,需要为每个表操作代码,这使它有点燃烧。

在这里,PivotTable.js 发挥了作用,它有助于创建交互式数据透视表。

数据透视表. js:

PivotTable.js 是一个开源的 Javascript 数据透视表(又名数据透视网格、数据透视图表、交叉选项卡)实现,具有拖放功能。

安装:

**pip install pivottablejs**

用法:

(作者代码)

(图片由作者提供),泰坦尼克号数据集的初始交互界面

现在尝试生成与本文前面使用 pandas 开发的相同的数据透视表。

(图片由作者提供),

特点:

  • PivotTable.js 提供了从下拉列表中选择聚合函数的权限。
  • 数据透视表和热图的不同表示。
  • 几种类型的图,包括条形图、堆积条形图、折线图、面积图、散点图、树状图等。

(图片由作者提供)

使用结果:

(来源)

结论:

在工作流中包含 PivotTable.js 使我们能够轻松地生成关于数据的见解。这个库提供了从数据透视表实时生成几个图的特性,这使我们能够在数据争论期间加快工作速度。

你可以在这里找到 PivotTable.js 的 GitHub 库。

参考资料:

[1] PivotTable.js 示例:【https://pivottable.js.org/examples/ T2

感谢您的阅读

交互式 Power BI 定制视觉效果,带 R

原文:https://towardsdatascience.com/interactive-power-bi-custom-visuals-with-r-a6a4ac998710?source=collection_archive---------10-----------------------

使用 ggplot、plotly 和 Power BI CLI 实现交互式视觉效果

有时候,正确的权力 BI 视觉就是不存在。最近,在尝试创建项目管理数据的执行摘要时,我碰到了这堵墙。

这个想法是一个报告页面,它将成为用户的首页——在他们进入其他报告页面的细节之前的一个快速路标,并且可以很容易地转换成演示文稿中的幻灯片。精简甘特图的尝试都是混乱而笨拙的。

2003 年 SARS 爆发的一个很好的例子,因果联系的信息可能是强大的,但项目管理数据经常会使计算机屏幕超载。引起严重急性呼吸综合征的新型冠状病毒的分子流行病学(The Lancet)

Power BI R 脚本可视化

经过一番深思熟虑(玩),一个基本的水平时间线似乎工作得很好。它将关注项目里程碑,使用颜色来描述项目状态,并尽最大努力使项目相关文本尽可能易读。

R script 可视化,开发快速,可定制(有时令人恼火)

微软的 AppSource 中似乎没有现成的可视化工具可以做到这一点,所以转向了 R Script 可视化工具。有了一点 R 知识,这些可以快速开发,并允许使用无限定制的 ggplot 来得到你想要的样子(注意,其他 R 绘图包是可用的)。

事情是这样结束的。项目数据已经被英国首相取代,项目状态颜色现在告诉我们他们属于哪个政党。这在你下一次变焦测验中可能会很有用。代码在这里。感谢 Ben Alex Keen,他有一篇关于在 r 中构建这种时间线的精彩文章。

正如预期的那样,R 视觉进入了报告。从直接在 R 中访问 JSON 数据转移到处理来自 Power BI R Script Visual 的数据需要一些变量重命名和格式化。视觉系统的 Power BI 友好代码在这里

这些 R 图唯一缺少的是一点交互性。你可以使用 Power BI 的切片器和过滤器来限制数据进入,但你不能悬停在上面并获得工具提示,或者放大感兴趣的部分。

Plotly

多亏了 plotly 包,我们可以将我们的 ggplot 对象转换成一些 html,并至少增加一些交互性。

g = ggplotly(p, tooltip = 'text') %>%
  layout(legend = list(
    orientation = 'h',
    y = 1.1,
    x = 0.1
  ));

Plotly 也会托管这些图表,你可以从 r 内部把它们推上来。

Sys.setenv(plotly_username = 'xxx')
Sys.setenv(plotly_api_key = 'xxxxxxxxxxx')api_create(g)

[## 辉格党,保守党,保守党,贵族党,自由党,工党,辉格党,保守党,贵族党,自由党…

弗雷德·塔斯克的互动图表和数据“辉格党,保守党,保守党,贵族党,自由党,工党,辉格党,保守党…

chart-studio.plotly.com](https://chart-studio.plotly.com/~fred_tasker/7.embed)

工具提示

和许多其他的剧情特色一样,我们现在有了一个悬停工具提示。在这个相当紧凑的图表中提供更多信息非常有用。这是在 geom_text 调用中使用虚拟美学定义的,名为“text”(gg plot 忽略此美学)。

#Tooltip for plotly
prime_ministers[,text:=paste0(
  name, ', ',  party, '<br>'
  ,format(start_date,'%d %b %Y'),' to ',format(end_date,'%d %b %Y')
)]# Show project text
p <- p +  geom_text(aes(label = name,
                        **text=text**,x=decade
                         ,y = text_position,colour=party), 
                     size = 3, family = 'sans',show.legend = F, fontface='bold')

在对 geom_text 的最终调用中,使用虚拟“文本”美学将自定义工具提示从 ggplot 传递到 plotly 对象

古怪的行为

关于使用 ggplotly 完成这项任务的快速补充说明。

geom_label: 在我们使用 ggplotly 从 ggploty 到 plotly 的转换中,geom_label 不受支持,因此每个文本标签后面的透明矩形已被替换为字体颜色。

传说的命名也有一些奇怪的行为,比如“辉格党”变成了“辉格党,1”等等。这是由于 ggplot 对象同时具有颜色比例(用于文本和点)和填充比例(未使用,因为没有 geom_label)。手动填充比例被删除,但如果需要填充比例,这将是令人讨厌的。唯一的解决方案似乎是手动调整 plotly 对象 json。

将 R 代码打包到 Power BI 自定义可视化中

最后一步是让这个 plotly 对象进入 Power BI。

我们不能把我们的 R 代码直接粘贴到 R 脚本中。ggplotly 函数输出一个 HTML 对象,Power BI 需要一个 R plot 对象。

事实证明,不需要太多的工作,我们就可以创建我们自己的自定义视觉效果来导入到 Power BI 中。这里有一个快速的步骤。

1 - 安装 node.js

2 -用 Powershell 安装 powerbi-visuals-tools 包

*npm install -g powerbi-visuals-tools*

3 -创建一个 rhtml 模板

pbiviz new fredTimelineVis -t rhtml

4 -查找该命令创建的文件夹和文件(这取决于您的 Powershell 的工作目录)。然后找到 script.r 文件,用您自己的代码替换 ggplot 代码

在我的电脑上,rhtml 文件输出到 C:/Users/Fred tasker/fredTimelineVis。剧本。r 有一个示例 ggplot 块和一个 ggplotly 行,我用上面的替换了它们。

包装总理们。替换脚本的 ggplot / ggplotly 位。powerbi-visuals-tools 创建的 r 文件。

几个注意事项:

  • 确保在脚本的顶部有正确的库声明。记住 R 包需要存在于 Power BI online 中,如果你打算在那里使用它的话
  • 来自 Power BI 的数据在 r 中被称为 Values 对象。

这是的剧本。本例中使用的 R 文件。

5 - 向 pbiviz.json 添加作者、描述和支持 URL

这很重要,因为如果不这样做,包编译将会失败。pbviz.json 将与您的脚本在同一个目录中。r 文件。

...
"description":***"Horizontal timeline visual build using ggplot and plotly in R"***,
"supportUrl":***"***[**https://medium.com/@fredtasker/interactive-power-bi-custom-visuals-with-r-a6a4ac998710**](https://medium.com/@fredtasker/interactive-power-bi-custom-visuals-with-r-a6a4ac998710)***"***,
"gitHubUrl":**"**[**https://github.com/fredwise/PM_timeline**](https://github.com/fredwise/PM_timeline)**"**},
...
"author":{"name":***"Fred Tasker"*,**"email":***"xxxx.com"***}
...

6——回到 PowerShell,导航到您的 script.r 目录并打包,准备好供 Power BI 使用。

就我而言:

cd C:\Users\FredTasker\fred_timeline_vispbiviz package

成功!

如果你遇到问题,这里有 R HTML 的微软帮助页面。

导入到 Power BI

既然定制的可视化已经打包,我们只需要将它导入到 Power BI 中,并将我们的数据字段放到可视化中。

从编译包的 dist 目录中导入 pbiz vis 文件

这一切都非常令人兴奋。在 Power BI 中构建交互式自定义视觉效果的快速方法。

看看 Power BI 服务上的结果仪表板,您会看到 Power BI 的发布到 Web 目前不支持静态 R visual。要查看 PBIX 文件中的静态图和这里提到的所有其他脚本,请访问 GitHub。

我们做的不仅仅是首相!随时联系我们聊天https://www.wisetechltd.com/

Jupyter 笔记本中的交互式报告

原文:https://towardsdatascience.com/interactive-reporting-in-jupyter-notebook-92a4fa90c09a?source=collection_archive---------3-----------------------

从新的角度看《纽约时报》的报道

Jupyter 笔记本是数据科学家箭囊中的重要一箭。这个开源应用程序是灵活,最重要的是交互。这是一个基本数据科学任务所需的工具,如数据清理、构建可视化、创建机器学习模型等。您可以在这里编写 Python 或 R 代码(取决于您使用的内核),将代码执行的结果保存在单元格中,并与其他人共享。

我无法想象没有 Jupyter 笔记本的工作。它们可以共享,设置快速,使用简单,即使您刚刚开始进入数据分析领域或学习 Python。

用 Python 分析数据

如果您经常使用 Python 处理数据,您可能会经常看到以汇总形式出现的数据。在 Python 中,你可以使用 pandas 库中的内置函数分组透视你的数据

一种经典的旋转方式是使用古老的pivot _ table方法。至于大多数 Python 方法,其语法简单易懂。

然而,数据透视表布局的逻辑越复杂,编写代码所需的时间就越多。此外,由此产生的透视表始终是静态的而不是交互式的。每次需要在透视网格上排列数据以便从不同的角度查看时,都需要重写代码。是的,这可能不涉及太多的变化,但是相反,你可以花时间关注你的数据,并对其有更好的理解。

今天,我将向您展示另一种在 Jupyter 笔记本中透视数据的方法。掌握这种方法后,您将很快轻松地生成交互式报告。

如何使 Python 中的透视数据具有交互性

我将要展示的方法最棒的一点是,您可以将生成的带有交互式数据可视化组件的笔记本保存到 HTML 中,并将其发送给您的朋友和队友。他们可以在浏览器中打开它,玩数据透视表和数据透视图,获得他们个人的见解,保存他们配置的报告并重新发送给您。这可能会使整个数据分析体验更有成效

我们将在 JupyterLab 工作,因为在那里运行笔记本电脑非常舒适。JupyterLab 只是 Jupyter 笔记本的一个用户界面。你在古典笔记本中使用的所有东西都在这里:笔记本、文件浏览器。但是 JupyterLab 提供了更多的扩展功能:你可以安装扩展,展开和折叠单元格,拖放它们——这是 Jupyter 可能缺少的功能。此外,文本编辑器提供了制表符自动完成功能。

在 JupyterLab 中构建报表

所以,运行你的 JupyterLab,让我们开始吧!

首先,让我们导入我们需要的 Python 库。其中包括 pandas、json 和 IPython 的显示模块。所有这些库都是 Anaconda 发行版附带的,但是如果您不使用它,您可能需要在全局范围内或者在您的虚拟环境中安装这些库。

  • pandas 是用 Python 处理数据结构的必备库。
  • IPython 是 Python 中用于交互式并行计算的 API。 display 是它的模块,为 IPython 中的显示工具呈现 API。
  • json 库提供了 json 编码和解码的 API。如果你曾经使用过“marshal”或“pickle”模块,你应该对它的 API 很熟悉。

对于数据可视化,我们将使用 Flexmonster 数据透视表&图表 ,这是一个 JavaScript 库。

数据呢?出于演示的目的,我选择了一个来自 T21 Kaggle 的‘牛油果价格’数据集。它是轻量级的,包含合理数量的字段。相反,你可以选择任何你喜欢的数据集。

加载你的数据。使用 pandas,将 CSV 数据读入 dataframe。删除列“未命名:0”—读取 CSV 文件时经常出现的索引列。

调用 dataframe 上的to_json()方法,将其转换为 JSON 字符串,并保存到json_data变量中。

'orient' '参数定义了预期的 JSON 字符串格式。这里我们将其设置为“记录”值。该值将对象转换为类似列表的结构,即[{column - > value},…,{column - > value}]。这正是 Flexmonster 使用的格式。

现在让我们使用嵌套字典创建 Flexmonster 的实例。在这里,我们指定所有必要的初始化参数,并将解码后的数据传递给组件。对于解码 JSON,我们使用json.loads()的方法。

如你所见,我们一次设置切片选项格式。我们可以跳过这一步,然后数据透视表将显示默认切片,但我认为最好从一开始就学习如何做。

现在我们使用json.dumps()将 Python 对象编码成 JSON :

下一步是定义一个函数,该函数将数据透视表直接呈现在单元格中。为此,我们将定义一个多行字符串,并将其传递给导入的 HTML 函数:

最后,我们可以将 JSON 传递给这个渲染函数,并调用它:

瞧吧!你看到的是页面上的交互透视表。数据集已准备就绪:您可以重新排列网格上的字段,更改聚合,设置筛选和排序,设置值的格式,并做一切事情来创建您独特的报表。此外,如果您错过了记录在数据框中显示的方式,您可以从透视模式切换到平面视图。通过这种方式,您将看到来自数据源的数据,但具有交互功能。

下面是数据透视表现在的样子:

此外,您可以尝试应用条件格式来关注最重要的值。

在 Jupyter 笔记本中制作仪表板

现在,让我们通过向笔记本添加更多元素来使我们的逻辑变得复杂一点。两个数据透视图将使我们的数据可视化更加通用。为此,我们将定义一个额外的函数,该函数接受多个 JSON 组件并将它们呈现在页面上。其逻辑与单个数据透视表相同。数据透视表组件的定义方式与数据透视表相同。

在数据透视表的报表切片中,我们可以设置 Top X filters ,它可以方便地限制数据透视表上显示的类别数量。这使得它们更加整洁和紧凑。

万岁!现在你可以在你的 Jupyter 笔记本中享受一个交互式仪表盘!不要犹豫,生成一份关于你的数据分析报告,并与他人分享。

最后的想法

今天我们尝试了一种在 Jupyter 笔记本中操作和呈现数据的新方法,使用 Python 和 JavaScript 数据可视化库。如您所见,设置一切并不需要太多的代码和时间。

一旦你这样做了,你就可以在你已经习惯的工作空间中探索你的数据。

这种方法使您不必在每次需要以不同的方式查看数据时重写代码。与 Jupyter 笔记本的中心思想 齐头并进,使数据可视化和数据分析互动灵活。

你可以在 GitHub 上找到完整代码。👈

高级选项

为了满足您对仪表板中还可以增强哪些功能的好奇心,这里有一个主要功能的简要列表,您可以使用这些功能来改善您的报告:

  • 映射

很多时候,真实世界的数据既不整洁也不一致。字段可以用不同的大小写来命名,它们也可能包含不明显的缩写,等等。为了美化它,我们可以使用 映射——设置应用于数据源的视图配置的报表属性。其格式化功能带来的另一个好处是数据类型的显式设置。通过设置类型,您可以告诉组件按照您想要的方式处理字段,例如字符串、数字或日期。这将影响对字段层次结构可用的聚合的选择。

在 GitHub 示例中,您可以看到如何定义一个映射对象并将其设置到数据透视表。

  • 出口

数据透视表带有 JavaScript API 方法和事件。您可以使用[exportTo](https://www.flexmonster.com/api/exportto/?r=td2)方法在本地配置不同格式的保存报告或将报告保存到远程目的地,如服务器。

  • 计算值

要在报告中引入新的公式,您可以添加计算值

与 Plotly 交互的三元图

原文:https://towardsdatascience.com/interactive-ternary-plots-with-plotly-2af21e22e716?source=collection_archive---------43-----------------------

你知道多少种不同的颜色?

里卡多·雷森德在 Unsplash 上拍摄的照片

Plotly Python (plotly.py)是基于 plotly javascript (plotly.js)构建的开源绘图库。我喜欢 plotly.py 的一点是,它提供了一个高级 API ( plotly express )和一个低级 API ( graph objects )来创建可视化。使用 plotly express,我们可以用很少的代码行创建一个动态的、信息丰富的图。另一方面,我们需要用图形对象编写更多的代码,但是对我们创建的内容有更多的控制权。

在本帖中,我们将使用 plotly express 创建三元图。三元图通过将数据点相应地放置在三角形中来描绘三个变量的比率。它给了我们一个观察值是否倾向于某个变量的概览。三角形的每个角都标有一个变量。因此,我们只能比较三个变量。

假设我们正在对三个汽车品牌进行大量测量。每个品牌在每个测量上都有一个等级。通过在三元图上绘制这些测量值,我们可以了解一个品牌是否比其他品牌更占优势。例如,一个品牌在安全相关措施方面可能很突出。

我找不到以多种不同方式比较汽车品牌的数据集,但我找到了一个有趣的数据集,它是一个具有 RGB 颜色值的数据集。每种颜色都由红、绿、蓝(RGB)组合而成。颜色根据这三种主色的比例而变化。

在 data.world 网站上的这里可以获得的数据集包括 746 种不同颜色的 RGB 值。我甚至不知道这些颜色是否存在。还有一些怪异的颜色名称,如“茜素深红”、“芭莎”、“木炭”。我们将使用三元图来了解这一大系列颜色的 RGB 成分。

让我们首先将数据集读入一个熊猫数据帧并查看它。

import numpy as np
import pandas as pddf = pd.read_csv("/content/colorhexa_com.csv")
print(df.shape)
df.head()

现在,我只对颜色和 RGB 组件的名称感兴趣,所以我将只获取那些列并更改颜色的名称。

new_cols = {'Red (8 bit)':'Red', 'Green (8 bit)':'Green', 
'Blue (8 bit)':'Blue'}df.rename(columns=new_cols, inplace=True)
df = df[['Name', 'Red', 'Green', 'Blue']]df.head()

我还想为每个颜色名称添加一个标记,指示贡献最大的 RGB 颜色。我将使用嵌套循环,但也可以尝试自己的方式。

winners = []for i in range(len(df)):
  if df.iloc[i,1] > df.iloc[i,2] and df.iloc[i,1] > df.iloc[i,3]:
    winner = "Red"
  elif df.iloc[i,2] > df.iloc[i,3]:
    winner = "Green"
  else:
    winner = "Blue"
  winners.append(winner)df['winner'] = winners
df.head()

让我们首先创建一个简单的三元图,根据 RGB 分量值定位每种颜色。我们将使用 plotly express,它是 plotly python 的高级 API。

import plotly.express as pxfig = px.scatter_ternary(
df, a="Red", b="Green", c="Blue", hover_name="Name"
)fig.show()

大多数颜色都在三角形的中心附近,但有一点倾向于红色。我们也有位于三角形边缘的颜色。这些颜色只包括三种 RGB 颜色中的两种。毫不奇怪,角上的颜色只包含一种成分。例如,海军蓝只有蓝色成分。

我们传递“名称”列 hover_name 参数,该参数允许在悬停在某个点上时查看颜色的名称。

我们可以通过使用颜色参数来使绘图看起来更好。有个头衔也不错。

fig = px.scatter_ternary(df, a="Red", b="Green", c="Blue", 
hover_name="Name",
color="winner", 
color_discrete_map = {"Blue": "blue", "Green": "green", "Red":"red"},
title="RGB Distribution of Colors")fig.show()

代表数据点(数据帧中的行)的点具有相同的大小,但 plotly 也允许为点的大小增加信息能力。让我们使用一个内置数据集来展示如何使用大小参数。

df_election = px.data.election()
print(df_election.shape)
df_election.head()

这个选举数据集包含 58 个地区的三位候选人获得的票数。“总数”一栏包括该区的总票数,我认为与该区的人口成比例。我们可以将“total”列传递给 size 参数,并看到某个特定的候选人赢得了更多的大选区。

fig = px.scatter_ternary(df_election, a="Joly", b="Coderre", c="Bergeron",
hover_name="district",
color="winner", size="total", size_max=15,
title="District Election Results")fig.show()

“Coderre”遥遥领先。“乔利”赢得的选区面积相对较小。我意识到的一件有趣的事情是,Coderre 赢得的选区更倾向于乔利,而不是 Bergeron。当我们停留在数据点上时,我们看到乔利通常是第二个候选人。因此,乔利可能会得到更多的选票,尽管乔利赢得的选区似乎更小。让我们通过计算每位候选人的总票数来核实一下。

print("Total number of votes for Coderre is {}".format(df_election.Coderre.sum()))print("Total number of votes for Bergeron is {}".format(df_election.Bergeron.sum()))print("Total number of votes for Joly is {}".format(df_election.Joly.sum()))

是啊!乔利的票数比贝杰龙多。

除了大小,我们还可以使用数据点的形状来传递信息。例如,“结果”列有两个值:

我们可以将该列作为参数传递给符号参数。

fig = px.scatter_ternary(df_election, a="Joly", b="Coderre", c="Bergeron",
hover_name="district",
color="winner", size="total", size_max=15,
title="District Election Results", 
symbol="result")fig.show()

我们知道某个候选人是以多数还是多数获胜。

我们已经用 plotly 覆盖了三元图。当然,这只是这个神奇的图书馆的一小部分功能。我们可以使用 plotly 动态创建许多其他绘图类型。它的语法也很容易理解。在接下来的帖子中,我会尝试涵盖更复杂的情节。你也可以查看 plotly 文档,我认为它有很多不同的例子。就像任何其他主题一样,熟悉 plotly 的最好方法就是实践。因此,我建议创造大量的情节来提高你的技能。

感谢您的阅读。如果您有任何反馈,请告诉我。

任何二元分类器结果的交互式可视化——用 5 行 Python 代码

原文:https://towardsdatascience.com/interactive-visualization-of-binary-classification-in-5-lines-of-python-9c1f627ded8?source=collection_archive---------31-----------------------

用“混淆 _viz”制作一个有影响力的模型结果图

[图片由作者提供]

TL;博士

给匆匆忙忙的人的 5 行代码:

片段:混淆的用法

简介

二进制分类是机器学习中最常见的任务。它也很通用,因为 n 类问题和回归问题都可以简化为二元情况(当然会丢失一些信息)。

假设您已经收集了数据,清理了数据并安装了分类器。可惜,工作结束的时候,工作才刚刚开始!事实上,你仍然需要处理很多东西:真阳性、假阳性、假阴性、准确度、精确度、召回率……而且,所有这些都要乘以可能的阈值数(很容易有数千个)。

这就是为什么我开始寻找一个单一的(可能是图形化的和交互式的)表示,包含关于二进制分类任务的所有相关信息。鉴于这种可视化是建立在混淆矩阵之上的,我把它叫做“混淆 _viz ”。

来自混乱的知识(矩阵)

用来评估分类优劣的最初级工具(可能是机器学习模型,也可能是确定性规则)叫做混淆矩阵。这是一个表格,显示了每个班级有多少人被正确或错误地分类。

例如,让我们对一些模拟数据做一个简单的分类问题:

片段:生成数据、拟合分类器和打印混淆矩阵。

这是混淆矩阵:

二元分类器的混淆矩阵。[图片由作者提供]

数字是“原始的”这一事实构成了混淆矩阵的优点和缺点。

  • 优势:因为——与更具体的度量标准(如精确度、召回率或提升率)相比——混淆矩阵的含义是任何人都能立即理解的,包括非技术利益相关者
  • 缺点:因为原始数字不那么容易解读

因此,可以采用几个选项来使混淆矩阵更具“表现力”。例如:

  1. 热图
  2. 按列规范化
  3. 按行规范化
  4. 总计标准化

混淆矩阵“操作”的一些简单例子。[图片由作者提供]

混淆矩阵的图形可视化

这些操作给出了模特表演的多面肖像。然而,问题是人类并不擅长存储大量的信息。这就是为什么我开始想知道如何得到一个有效的混乱矩阵的可视化,它可以“一目了然”地显示所有相关信息。

这种可视化的要求是:

  • 情节应该是二维的(当然),
  • 涉及真阳性、假阳性、真阴性和假阴性的绘图区域应该与它们的数量成比例。

经过一些尝试后,我开始定义一个对我的目标来说足够直观的可视化。根据它,上面的混淆矩阵应该是这样的:

混乱矩阵的静态图。[图片由作者提供]

带有粉红色边框的正方形代表阳性总数(即真阳性+假阴性)。这就像仪表板的靶心:我们希望我们的模型能够在这里投出大部分飞镖。

带黑边的正方形准确地代表了模型的猜测:这些都是被标记为阳性的个体。因此,粉边方块和黑边方块之间的公共区域用绿色填充,代表真正的阳性。剩下的部分是由假阳性构成的,并被涂上红色。

一个问题,多个矩阵

但是事情要比这复杂一些。事实上,对于每个模型,我们并不只有一个混淆矩阵。其实我们有很多。这怎么可能呢?对于非技术涉众来说,这通常难以理解。

这完全取决于“概率阈值”这个概念。大多数分类算法的输出实际上不是每个个体的 0/1,而是一个介于 0 和 1 之间的数字,表示该个体成为阳性的可能性,我们称之为“概率”。

因此,最终的分类 0/1 不是自动的,而是从(商业)决策中派生出来的。决策在于确定概率阈值,高于该阈值的个体应被分类为 1。

让我们更清楚地说明这一点:

一个模型输出,许多混淆矩阵。[图片由作者提供]

每一个可能的决策都与一个 0/1 的数组相关联。反过来,每个数组与不同的混淆矩阵相关联。这就是为什么,对于一个单一的模型,我们可能有数千(甚至数百万!)的可能混淆矩阵:每个阈值一个。

因此,问题变成:我们能在一个单独的图中表示不同的混淆矩阵(或者至少它们的一个代表子集)吗?

通过使用 Plotly ,它可以通过一个滑块来完成:这就是交互图帮助我们的地方。这个想法是,当我们从左向右移动滑块时,相关的阈值增加,因此选择变得越来越“限制性”,也就是说,我们归类为阳性的观察数量越来越少。

许多混淆矩阵的交互图(每个概率阈值一个)。注意:由于从 html 到 gif 的转换,一些颜色可能会改变。[图片由作者提供]

滑块指示什么是当前概率阈值(“P ≥阈值”)。

如果你留意精度和回忆,你会注意到它们有相反的行为:当滑块向右移动时,回忆减少,而精度提高。这很有意义:如果你只选择最危险的个体,你可能会更精确,但代价是识别出更小部分的阳性(即更小的回忆)。

一般来说,图形的交互特性允许您选择一个适合您的特定用例的阈值。

我可以用我自己的数据做这个吗?

其实很简单!

你所要做的就是在你的环境中 pip-安装包混淆 _ 即

片段:安装混淆 _viz。

这个包包含一个名为 ConfusionViz 的类,所以您只需在 Python 代码中导入它。下一个片段展示了如何使用 ConfusionViz:在笔记本模式下显示交互情节(命令)。show() )或将其导出为 html 文件(命令)。to_html() ),然后可以用任何浏览器打开。

片段:混淆的用法。

你只需要把 y_testprobas_test 换成你自己的数据,游戏就做好了!

感谢您的阅读!我希望这篇文章对你有用。

我感谢反馈和建设性的批评。如果你想谈论这篇文章或其他相关话题,你可以发短信给我我的 Linkedin 联系人

使用 Plotly 进行交互式可视化

原文:https://towardsdatascience.com/interactive-visualizations-with-plotly-ea3f8feb87d1?source=collection_archive---------43-----------------------

plotly.py 库简介

照片由金莎·艾利斯Unsplash 上拍摄

Plotly Python (plotly.py)是一个基于 plotly javascript (plotly.js)构建的开源绘图库。它允许创建可以在 Jupyter 笔记本上显示的交互式可视化。可以使用 pip 或 conda 进行安装:

$ pip install plotly==4.8.0$ conda install -c plotly plotly=4.8.0

使用 plotly.py 创建图形基本上有两种方法:

  • 数字作为字典
  • 作为图形对象的图形

在本帖中,我们将介绍如何使用图形对象创建许多不同种类的绘图。安装后,我们可以导入图形对象:

import plotly.graph_objects as go

创建图形对象图形有不同的方法。一种方法是使用图形对象的图形构造器。让我们创建一个简单的散点图:

import numpy as npa=np.random.random(10)
b=np.random.randint(10, size=10)fig = go.Figure(data=go.Scatter(x=a, y=b, mode='markers'))fig.show()

我们还可以使用 add_trace 在同一个图形上添加额外的轨迹:

fig = go.Figure(data=go.Scatter(x=np.arange(9), y=10*np.random.randn(10),mode='markers', name='markers'))fig.add_trace(go.Scatter(x=np.arange(9), y=np.random.randn(10),
mode='lines+markers', name='lines+markers'))fig.show()

另一种创建图形的方法是 plotly express ,它是一个高级 API,用于生成图形对象图形。我们可以用下面的代码行导入它:

import plotly.express as px

让我们创建一个示例数据帧:

import pandas as pddf = pd.DataFrame({
'col_a':np.random.random(10)*5,
'col_b':np.random.randint(10, size=10),
'col_c':[4.5, 4.7, 4.8, 3.4, 3.7, 4., 5.1, 3.2, 4.4, 3.3],
'col_d':['a','a','b','a','a','b','b','c','c','c']
})df

我们可以在一个散点图上了解整个数据框架:

fig = px.scatter(df, x="col_a", y="col_b", color="col_d", size='col_c')fig.show()

x 轴代表“col_a”,y 轴代表“col_b”。标记的大小给出了关于“col_c”的概念,而标记的颜色表示“col_d”中的信息。因此,一个散点图能够告诉我们关于数据集的很多信息。每个点(或标记)代表数据帧中的一行,我们可以将鼠标悬停在各个数据点上,以查看所有列的值。这是一个简单随机的数据集。当我们处理真实数据集时,图形交互可视化的特性变得更加有用。

Plotly 包含著名的虹膜数据集,我们可以通过一行代码访问它:

df_iris = px.data.iris()fig = px.scatter(
df_iris, x="sepal_width", y="sepal_length", color="species",
size='petal_length', hover_data=['petal_width']
)fig.show()

上面的散点图告诉我们不同的物种是如何聚集在一起的,以及物种之间的差异。

也有可能在单独的支线剧情中表现不同的物种。我们需要做的就是添加 facet_colfacet_row 参数。顾名思义,facet_col 将支线剧情创建为列,而 facet_row 将支线剧情创建为行。

fig = px.scatter(
df_iris, x="sepal_width", y="sepal_length", color="species", facet_col="species", title="Species Subplots"
)fig.show()

fig = px.scatter(
df_iris, x="sepal_width", y="sepal_length", color="species", facet_row="species", title="Species Subplots"
)fig.show()

在一个图形被渲染之后,我们可以使用 update_layout() 来更新布局。请考虑下图:

我们可以用下面的代码更新标题的字体大小:

fig.update_layout(title_text="Sample Dataset - Updated",
                  title_font_size=20)

另一种创建支线剧情的方法是使用make _ 支线剧情:

from plotly.subplots import make_subplotsfig = make_subplots(rows=1, cols=2)fig.add_scatter(y=np.random.random(10), mode="markers",
                marker=dict(size=15, color="Blue"),
                name="A", row=1, col=1)fig.add_bar(y=np.random.randint(10, size=10),
            marker=dict(color="LightBlue"),
            name="B", row=1, col=2)fig.show()

我们使用参数指定了支线剧情的数量和它们的位置。然后,我们添加定义地块并指定位置。我们还可以通过将字典传递给标记参数来指定标记的大小和颜色。用上面的代码段生成的图形是:

我们已经介绍了 plotly.py 库的一些基本组件。当然,这只是用 plotly 可以做到的一点点。我们可以使用 plotly 动态创建许多其他绘图类型。它的语法也很容易理解。在接下来的帖子中,我会尝试涵盖更复杂的情节。你也可以查看 plotly 文档,我认为它有很多不同的例子。就像任何其他主题一样,熟悉 plotly 的最好方法就是实践。因此,我建议创造大量的情节来提高你的技能。

感谢您的阅读。如果您有任何反馈,请告诉我。

互动:可视化咖啡因和就寝时间

原文:https://towardsdatascience.com/interactive-visualizing-caffeine-bedtime-4c256d562193?source=collection_archive---------6-----------------------

咖啡因会在你体内停留多久?早上喝咖啡影响晚上睡眠吗?

大脑喜欢咖啡。(图片来自作者+ VectorStock )

我睡眠有问题。医生经常警告我,咖啡因可能是罪魁祸首。有一次,2015 年,我甚至还听了他们的话。我戒了大约 3 周的咖啡。后来我意识到,不喝咖啡的时候,我是一个非常令人讨厌的人。所以我又回到了酱汁。

我没有完全戒掉咖啡,而是定下了一个折中的规则:
下午 3 点以后不喝咖啡

采用这个规则并没有明显地帮助我的睡眠,但至少它给了我一个对医生有效的反驳。更好的是:我不需要改变任何行为来适应这个规则。

大多数日子,早上晚些时候,我会走到咖啡店,点一杯我能拿的最大杯的冰咖啡。然后,我会走回我的办公桌,等待液体“焦点”发挥作用。偶尔,当会议礼仪要求时,我也会喝一杯下午茶。

这个惯例完全符合下午 3 点的规则。

Covid…

然后 Covid 发生了。显然 Covid 是可怕的,但对我来说,一线希望是打乱了我的咖啡日常生活。

当纽约关闭时,我的鱼缸大小的咖啡就不容易买到了。如果没有步行去咖啡店或与同谋喝咖啡的习惯,吸引力就丧失了。所以我换成了茶,在早上早些时候。

进入疫情大约一个月后,我注意到我睡得更好了!

这又持续了几个星期,直到我们发现了终极懒人咖啡:威格曼的辉煌预制壶。

突然我又睡不着了。肯定不是因为咖啡吧?下午 3 点的规则有问题吗?

咖啡因会一直伴随着你。

我明白,至少在理智上,咖啡因的半衰期意味着一天中的晚些时候,一些咖啡因可能仍会在我的大脑中浮动,但直到 Covid 中断之前,我从未多想它。

当不眠之夜回来时,我开始怀疑。我在 Observable 上画了一个粗略的半衰期模型,调整了参数,加入了我平时喝咖啡的习惯……很明显,我的下午 3 点规则完全是垃圾。

显然,喝一杯热浴缸大小的咖啡感觉很棒,至少现在是这样。但是早上的咖啡因仍然会干扰你晚上的睡眠。直到我亲眼看到它的表演,它才真正被理解。

为了让咖啡因的动力学更深入人心(这样你就不必等到下一个疫情来学习我学到的课程),我制作了一个模拟器,模拟咖啡因在你体内停留多长时间,以及它如何影响预计的“就寝时间”

自己试试这里:咖啡因模拟器

让我们看几个熟悉的场景…

上午 10 点喝下 20 盎司咖啡后,全天的咖啡因水平。在这种情况下,到凌晨 2 点,咖啡因含量才会降到 50 毫克以下。(这里可以试试这个。)

上面的图表近似于我以前喝咖啡的习惯。上午 10 点,我会喝一大杯 20 盎司的冰咖啡。这在接下来的一个小时里会大大增加咖啡因的含量,并持续一整天(直到晚上)。相比之下,20 盎司相当于一杯星巴克“大杯”,其中含有高达 410 毫克的咖啡因。(顺便说一句,这超过了美国食品和药物管理局推荐的每日限量 10 毫克。)

表情符号的蓝线表示咖啡因含量低于 50 毫克。这是一个宽松的估计,当你的身体已经“清除”了足够的物质,可以不受干扰地睡觉。(更多关于这个 50 毫克的“睡眠阈值”在下面。)

我从未充分体会到的是:半衰期为 5 小时,在10am (400mg caffeine, assuming Starbucks equivalent)喝 20 盎司的咖啡就像在3pm (200mg caffeine)喝 10 盎司的咖啡。这就像在8pm (100mg caffeine)喝一杯 5oz 的咖啡。也就是说,你的身体需要 5 个小时来过滤掉最初一半的咖啡因,然后再用 5 个小时来清除下一个季度,再用 5 个小时来清除下一个八分之一,以此类推。

在早上 8 点、10 点和 12 点喝下 3 杯 8 盎司的咖啡后,全天的咖啡因水平。在这种情况下,到凌晨 3 点,咖啡因含量才会降到 50 毫克以下。(这里可以试试。)

这不一定是超大号杯子的问题。在上面的场景中,不是一次喝完所有的咖啡,而是在上午 8 点、10 点和中午将大致相同量的咖啡因分散到 3 个较小的 8 盎司的杯子中。结果是一样的,因为每杯咖啡都增加了你体内已经存在的咖啡因。在上面的场景中,咖啡因(400 毫克)的峰值出现在下午 1 点左右,所以在你清除足够的咖啡因进入良好睡眠之前,已经是凌晨 3 点了。

在早上 8 点、10 点和下午 4 点喝下 3 杯 8 盎司的咖啡后,全天的咖啡因水平。在这种情况下,到早上 5 点,咖啡因水平才降到 50 毫克以下。(你可以试试这里。)

然后是死亡之吻:下午茶。假设你早上很自律,限制自己在早上 8 点和 10 点只喝两杯。但是你会在下午 4 点和一个朋友一起喝咖啡。即使是一小杯咖啡,你现在也要看到凌晨 5 点,直到咖啡因含量回落到 50 毫克以下。

咖啡因的最佳含量是多少?

为了赢得咖啡因游戏,你想让你的水平在白天“足够高”,然后在睡觉前“足够低”。这取决于几个因素:

  • 什么叫“够高?”你到底需要多少咖啡因?
  • 你的半衰期是多少?你代谢咖啡因的速度有多快?
  • 什么叫“够低?”你对咖啡因的睡眠阈值是多少?

250 毫克的好消息。

一项研究( src )比较了服用 250 毫克和 500 毫克咖啡因的效果。据作者称:

“较低剂量的咖啡因比较高剂量产生更有利的主观效果(兴奋、平静、愉快),而 500 毫克剂量后的不愉快效果(紧张、紧张、焦虑、兴奋、易怒、恶心、心悸、不安)超过了 250 毫克剂量。与安慰剂相比,较低剂量的咖啡因提高了数字符号替代测试和敲击速度测试的表现;高剂量的咖啡因产生的效果不如低剂量的好。”

因此,250 毫克似乎是一个很好的时间,500 毫克不太多。

如何达到 250 毫克?下面是一些通用的经验法则。(选择这些例子是因为在我的脑海中,我仍然是 14 岁,试图整夜保持清醒来玩 Everquest)。

棘手的是:这些报道的数字并不十分可靠:

  • 例如,5 小时能量似乎特别含糊不清:“常规强度的 5 小时能量饮料含有大约 8 盎司顶级咖啡的咖啡因。”当你考虑到“顶级咖啡”中咖啡因的易变性时,这是令人担忧的…
  • 你可能会从星巴克更确定的答案(16 盎司= 310 毫克)中得到安慰,但你会失望的。2003 年,佛罗里达大学的一组研究人员连续 6 天去同一家星巴克,他们每次都点了同样的 16 盎司星巴克混合早餐,然后测量咖啡的咖啡因含量。在这 6 个样品中,咖啡因含量从 259 毫克到 564 毫克不等。所以这有点像赌博:一大杯混合早餐会带来“兴奋、平静、愉快”还是“烦躁、恶心、心悸”?
  • 这两家公司都比麦当劳好,麦当劳只会做出如下承诺:“我们目前不会报告我们咖啡中的咖啡因含量——但我们可以向你保证一杯明亮而平衡的咖啡。” ( src )

所以,如果你想要更稳定的咖啡因剂量,为什么不从一罐冰镇的 Surge 开始你的一天呢?

代谢咖啡因。

如前所述,你的身体代谢咖啡因的半衰期是一个时间表。虽然咖啡因的典型半衰期是 5 个小时,但这可能因人而异,在 1.5 到 9.5 小时之间。

为了更好地感受这种分布,我们将查看两项不同研究的半衰期测量结果( srcsrc ),探索咖啡因对 41 人的影响,这些人被分为吸烟者、非吸烟者和服用口服避孕药的人群。在这两项研究中,研究人员给受试者一剂咖啡因,做一些科学研究来确定一段时间后还有多少咖啡因,然后报告半衰期。

srcsrc 测得的半衰期直方图。

41 名参与者的平均半衰期约为 5.5 小时。正如你在上面看到的,测量的半衰期在实验组内部和实验组之间是不同的。在两组之间,我们可以看到吸烟者代谢咖啡因最快(2 至 6 小时),而采取避孕措施的人代谢最慢(7 至 9 小时)。

如果你既不吸烟也不避孕(或者,如果你是吸烟者和避孕者),以上并没有给你太多的指导。但如果你怀疑自己对咖啡因特别敏感,你可能会代谢得更慢,这意味着半衰期更长(反之亦然)。

咖啡因的睡眠阈值

许多研究(和讨厌的医生)表明咖啡因会对你的睡眠有害。但是,我们到底能承受多少,同时还能睡个好觉呢?我们需要保持的咖啡因阈值是多少?我们已经从 3 篇论文和 FDA 的一般建议中获得了一些不同的数据点,可以用来对这个数字进行三角测量。

第一项研究( src )让受试者在典型的就寝时间前 0、3 和 6 小时服用 400 毫克咖啡因,然后观察他们的睡眠。他们发现,即使在就寝前 6 小时,咖啡因也“相对于安慰剂对睡眠障碍有显著影响”例如,受试者需要两倍的时间才能入睡,每晚平均少睡 41 分钟。

  • 鉴于咖啡因的半衰期为 5 小时,睡前 6 小时摄入 400 毫克咖啡因意味着受试者在就寝时体内仍有约 217 毫克咖啡因。所以我们想在睡觉前体重至少低于 217 毫克。

第二项研究( src )让受试者在睡前 3 小时服用 100 毫克,然后在睡前 1 小时再服用 100 毫克。这个“睡眠潜伏期延长,睡眠效率降低,睡眠持续时间减少。”

  • 同样,假设咖啡因的半衰期为 5 小时,睡前 3 小时摄入 100 毫克咖啡因就意味着还剩 75 毫克。睡前 1 小时再摄入 100 毫克咖啡因是 94 毫克。所以在就寝时,这些受试者体内仍有 72 毫克+94 毫克= 166 毫克的咖啡因。所以我们想在 166mg 以下。

第三项研究( src )在就寝前 16 小时给受试者服用 200 毫克咖啡因,而仍然报告“睡眠效率和总睡眠时间明显减少”vs .安慰剂。

  • 假设半衰期为 5 小时,200 毫克咖啡因在 16 小时后还剩 24 毫克。因此,为了避免这项研究中提到的睡眠影响,我们希望我们体内剩余的咖啡因低于 24 毫克。

后一项研究大致符合 FDA 的指导方针( src )。"晚餐时喝杯咖啡可能会让你在就寝时保持清醒."在美国食品和药物管理局的奇妙世界里,“一杯咖啡”不是星巴克的庞然大物,它是一杯 8 盎司的咖啡,含有 90 毫克咖啡因。如果我们假设晚餐时间是下午 6 点,就寝时间是晚上 11 点,那么 5 小时后 90 毫克的咖啡在就寝时间仍有 49 毫克的咖啡因在你的体内。(因此模拟器的默认“睡眠阈值”参数为 50 毫克)。

你对咖啡因的耐受力可能会有所不同,但根据上述研究,我们可以看到,即使只有 24 毫克的咖啡因残留也会影响你的睡眠。

那么,什么对你最合适呢?

自己去发现吧!现在你知道了参数,你可以使用模拟器来尝试不同的咖啡摄入场景,看看这对你的预期就寝时间意味着什么。

自己试试这里:咖啡因模拟器

我是谁?不,不,你是谁?!

嗨!我是伊莱·霍德。我帮助客户设计和开发忙碌的人和他们杂乱的数据之间的有效接口。如果你是一名创始人、创客、讲故事者、非营利行善者或商业领袖,正在思考数据、设计和用户心理的交集,我很乐意联系并聆听你的故事。

你可以给我发电子邮件到 eli@3isapattern.com T21,或者在推特上关注我。

互动:可视化新冠肺炎测试的准确性

原文:https://towardsdatascience.com/interactive-visualizing-covid-19-test-accuracy-4a24b4e1ffbf?source=collection_archive---------23-----------------------

最常见的新冠肺炎测试有多准确?“准确”到底是什么意思?

(图片鸣谢:作者+ ProPublica 可爱的 Wee People 项目)

不久前我和我爸爸聊天。他听说了一些关于新冠肺炎测试准确性的古怪事情:它们是如此不准确,以至于“你还不如抛硬币”

这听起来不对,但我意识到我自己对测试准确性的理解有点模糊。

因此,为了澄清,让我们了解一下新冠肺炎测试,它们是如何测量的,以及这对检测人群中的感染意味着什么。

在这里自己试试:新冠肺炎测试模拟器

1000 人

为了了解测试准确性的影响,我们将在一小部分人群中进行一些实验。以上是 1000 人。

1000 人,其中 2%有新冠肺炎(橙色)。

为了便于统计,我们假设 2%的人口患有新冠肺炎。这是这种疾病的“患病率”你可以看到上面这组中大约有 2%的人被感染了(橙色)。

(注:2%偏高。相比之下,北达科他州是“热点地区”,虽然我们不知道该州目前的实际流行情况,但在过去 10 天里,北达科他州的 762,062 名公民(或人口的 0.7%)有 5,793 例新病例。

为了了解最常见的新冠肺炎测试之间的准确性差异,我们将模拟如果我们测试我们人口中的所有 1,000 人,这些测试可能会如何执行。我们来看看 5 种不同的测试:

  • RT-PCR:“金标准”
  • 快速抗原:快速,但不稳定
  • 快速分子:快速但可靠(也许)
  • 抗体:用于几周后检测 Covid
  • 抛硬币:如果我们只是抛硬币呢?

测试准确度

在我们进入测试本身之前,让我们了解一下检测感染的“准确性”意味着什么。测试的准确性由两部分组成:敏感性和特异性。

  • 敏感度衡量的是实际患有该疾病的人检测报告为“阳性”的频率。
  • 特异性衡量没有患病的人检测报告为“阴性”的频率。

为了理解这些指标,我们将把我们的人口分为实际上健康的人和实际上感染的人(注:这在现实生活中显然是不可能的,因此首先需要进行测试)。

上面是所有 980 名健康人。再说一遍,黑色是健康的。

这里有 20 名感染者。橙色表示受感染。

特征

特异性衡量测试对未感染的人(即健康人)的诊断准确度。换句话说:特异性衡量一项测试区分“真阴性”和“假阳性”的能力。

要理解“特异性”,我们只需要看看我们的健康人群。下面我们将看到一个 95%特异性的假设测试是如何将我们的 980 名健康人分开的。

931 真阴性。这些是被正确诊断为阴性的健康人。

给定一个 95%特异性的测试,我们的 980 个健康人中的 931 个(95%)将被正确诊断为阴性(如上)。这些是“真正的否定”

49 次误报。这些是被错误诊断为阳性的健康人。

不幸的是,在 95%的特异性测试中,我们的 980 名健康人中有 49 人(5%)会被错误地诊断为阳性。这些是“误报”

假阳性是坏消息,因为这些人会被不必要地隔离,并可能从实际患病的患者那里夺走大量医疗资源。

灵敏度

敏感度衡量的是一项测试对 T4 实际上被感染的人的诊断有多准确。换句话说:敏感度衡量的是一项测试区分“真阳性”和“假阴性”的能力。

要理解“敏感”,我们只需要看看我们的感染者。下面我们将看到一个 80%灵敏度的假设测试如何将我们的 20 名感染者分开。

16 个真阳性。这些是被正确诊断为阳性的感染者。

给定一个 80%敏感的测试,我们的 20 个感染者中的 16 个(80%)将被正确诊断为阳性(如上)。这些是“真正的积极因素”

4 假阴性。这些感染者被错误地诊断为阴性。

不幸的是,在 80%的敏感性测试中,20 名感染者中有 4 人(20%)会被错误地诊断为阴性。这些是“假阴性”

假阴性很麻烦,因为如果有人认为他们实际上被感染时是健康的,他们可能会放松警惕,不知不觉地感染周围的人。

分析与临床表现

最后要考虑的是测量是指测试的“分析”还是“临床”表现。

  • “分析”性能是测试在理想条件下的表现。
  • “临床”表现是测试在实践中的表现。

临床表现取决于许多因素,例如样本的采集方式。例如,当 PCR 测试基于鼻咽拭子(用棉签穿过你的鼻子戳你的大脑)时,它们的灵敏度较低(73%的灵敏度),而基于唾液样本的聚合酶链式反应测试(咳痰)则更灵敏(97.2%的灵敏度)( src )。

下面,我尽可能报告分析和临床测量。但是为了我们的实验,我们将使用“分析”性能,因为该度量更容易获得。

实际结果可能有所不同…

当测试一个 1000 人的实际样本时,结果会有很大差异。比如说…

我们对 1000 人进行假设性测试(80%灵敏度,95%特异性)的测试结果示例。最上面一组测试为阴性(包括真阴性和假阴性)。底部组测试为阳性(包括真阳性和假阳性)。

上面你可以看到我们的 1,000 人除以他们的测试结果(对于我们的假设测试)。测试结果呈阴性的人在第一组。测试呈阳性的人在最底层。

你会注意到在最上面的一组中有几个受感染的(橙色)人。这些是假阴性。这是测试灵敏度不理想的结果。当一项检测的灵敏度较低时,更多实际被感染的人会得到不正确的阴性结果。

你还会注意到底层群体中有一些健康的(黑人)人;这些都是假阳性,这是测试特异性不完善的结果。当一项检测的特异性较低时,更多未被感染的人会得到不正确的阳性结果。

测试测试

现在我们已经了解了测试准确性的不同度量标准(特异性和敏感性),让我们来看看真实测试的一些测量方法,看看它们在我们的人群中表现如何。

诊断测试(针对当前感染)

诊断测试告诉你在测试时疾病是否存在。

示例测试结果,在我们 1000 人的人口中模拟 RT-聚合酶链式反应测试(w/ 99%灵敏度,99%特异性)。最上面一组测试为阴性(包括真阴性和假阴性)。底部组测试为阳性(包括真阳性和假阳性)。

RT-PCR ( “逆转录聚合酶链反应”)

PCR 测试是最常见的测试类型。尽管 CDC 在这些方面的第一次尝试是错误的( src ),PCR 测试被认为是“黄金标准”和最准确的。缺点:它们需要训练有素的人员、昂贵的设备和几个小时才能完成( src )。

  • 准确性:分析性能接近 100%的灵敏度、100%的特异性( srcsrc ),而临床灵敏度的范围可以是 66% - 97% ( srcsrc ),这取决于样本的采集方式和采集时间。
  • 费用 : $60 - $300,无保险( src )
  • 时机:在夏季,这些可能需要几个星期才能收回。最近,如果你去纽约的紧急护理中心,你可以在 3 - 4 天内得到结果
  • 工作原理:PCR 测试是一种“分子”测试。它们与新冠肺炎的 DNA 序列相匹配。
  • 示例系统: BD Max雅培 m2000赛默飞世尔 TaqPath罗氏科巴斯

示例测试结果,模拟对我们 1000 人的人口进行的快速抗原测试(灵敏度为 56%,特异性为 99%)。最上面一组测试为阴性(包括真阴性和假阴性)。底部组测试为阳性(包括真阳性和假阳性)。

快速抗原检测

从 5 月份开始,快速抗原检测在最近变得可行。它们在现场更容易操作,并且可以在大约 15 分钟内返回结果( src ),但是它们通常不太准确。这些测试的部分假设是它们可以更频繁地执行;即使他们不太敏感,更频繁的测试从长远来看也是有效的( src )。

  • 准确性:荟萃分析显示平均分析性能为 56.2%的敏感性和 99.5%的特异性( src )。在另一项关于临床表现的研究中,敏感度下降至 30.2% ( src )。
  • 费用:25-100 美元,不含保险
  • 计时:大约 15 分钟
  • 工作原理:抗原测试寻找新冠肺炎蛋白。
  • 示例系统: BD 验证器Abbott BinaxNow

示例测试结果,模拟对我们 1000 人的人口进行的快速分子测试(灵敏度为 95%,特异性为 99%)。最上面一组测试为阴性(包括真阴性和假阴性)。底部组测试为阳性(包括真阳性和假阳性)。

快速分子检测

FDA 早在三月份就批准了 Abbot ID NOW 测试。这是他们在白宫用的测试( src )。(我们都知道结果如何。)与其他快速测试一样,这些测试在现场进行,可在 5-13 分钟内返回结果。他们也应该比抗原测试更准确,但一些研究表明,它并不像广告宣传的那样准确。

  • 准确性:荟萃分析显示典型的分析性能为 95.2%的敏感性和 98.9%的特异性( src )。NYU 的一项实验显示,灵敏度可以低至 52% ( srcsrc )。
  • 时间:5 - 13 分钟
  • 工作原理:像 PCR 测试一样,快速分子测试与新冠肺炎 DNA 序列相匹配。
  • 示例系统:方丈 ID 现

抗体测试(针对既往感染)

抗体测试确定病人是否在过去某个时候被感染。

示例测试结果,模拟对我们 1000 人的人口进行的抗体测试(灵敏度为 93%,特异性为 95%)。最上面一组测试为阴性(包括真阴性和假阴性)。底部组测试为阳性(包括真阳性和假阳性)。

血清学/抗体/血液测试

血清测试在初次感染后 1 至 3 周检测疾病( src )。它们通常是准确的,您将在 3 到 7 天内得到结果。

  • 准确性:对于血清学/抗体测试(ELISA),一项研究显示敏感性在 86% - 100%之间,特异性在 89% - 100%之间( src )。
  • 费用:50-135 美元,不含保险
  • 时间:3 - 7 天
  • 工作原理:抗体测试检测你身体用来对抗新冠肺炎病毒的抗体。

抛硬币测试

显然抛硬币不是探测新冠肺炎的有效方法(爸爸!),但是让我们看看那看起来像什么:

示例测试结果,模拟对我们 1000 人的人口进行硬币翻转测试(50%灵敏度,50%特异性)。最上面一组测试为阴性(包括真阴性和假阴性)。底部组测试为阳性(包括真阳性和假阳性)。

正如所料,您可以看到大约相同数量的人测试为阳性和测试为阴性,受感染的人(橙色)均匀地混合在两组中。

“抛硬币”

这种“抛硬币”的想法从何而来?如果你用谷歌搜索“covid 测试抛硬币”,你会看到几个可信的 来源使用这个类比。

例如,这位科学美国人解说写道:

“如果有一个灵敏度和特异性都达到 99%的近乎完美的测试会怎么样?看起来很棒,不是吗?如果在一个患病率为 1%的国家使用这种测试,那么阳性测试的预测值将只有 50%——扔硬币决定!”

提交:

“但即使是这些测试的准确性也取决于人口中实际接触过病毒的人的百分比。例如,在感染率为 5%的人群中,一项特异性为 95%、灵敏度为 95%的测试将返回与真阳性相同数量的假阳性,这使得任何单个结果都不会比掷硬币更有用。”

这些例子是真实的,但有点令人困惑。重要的是要看看他们如何限定“抛硬币”的说法。在这两个例子中,他们指的是测试的阳性预测值,即“如果我得到阳性测试结果,我实际上有 covid 的概率是多少?”

这不同于说“测试提供的信息并不比医生向空中扔硬币多”,但它确实提出了一个关于测试在实践中如何使用的重要问题。

在现实生活中,仅凭测试结果不足以诊断一个人。您还必须考虑他们的背景和此人先前感染的可能性(例如,患者是否有可能已经被感染?他们是否接触过其他确诊患者?他们有症状吗?).

例如,假设事先不知道患者接触情况的阳性结果有 50%的机会是真阳性,但如果你知道那个人以前接触过,阳性测试结果更有可能是真的。或者,在一个低患病率的人群中,如果一个以前没有接触过的患者得到了阳性结果,你可能会有点怀疑这是假阳性。

这也解释了为什么你可能会看到疾病控制中心改变他们的筛选标准;随着 Covid 患病率的上升和下降,我们之前的暴露概率和检测策略也会随之改变。

外卖食品

  • 评估测试准确性需要考虑两个方面:敏感性和特异性。
  • 每种测试都有不同的权衡,但即使是最不敏感的测试(快速抗原测试)也比掷硬币好得多。
  • 为了真正理解检测的有效性,你必须考虑它在临床实践和人群先前感染概率中的准确性。

我是谁?不,不,你是谁?!

嗨!我是伊莱·霍德。我帮助客户设计和开发忙碌的人和他们杂乱的数据之间的有效接口。如果你是一名创始人、创客、讲故事者、非营利行善者或商业领袖,正在思考数据、设计和用户心理的交集,我很乐意联系并聆听你的故事。

你可以发电子邮件到 eli@3isapattern.com 给我,或者在推特上关注我。

特别感谢 Laura Gast 的流行病学观点和患者反馈!

用 IGViz 交互式绘制图形网络

原文:https://towardsdatascience.com/interactively-plot-graph-networks-with-igviz-c75da26858ec?source=collection_archive---------44-----------------------

使用 Plotly 轻松查看图形网络

来自 @jusspreme 的 Justin Jairam 拍摄的照片

在过去的几个月里,我开始探索使用图形网络来检测网络安全中的恶意和非恶意行为。我发现处理图形的一个主要难点是以简洁、视觉上吸引人的方式可视化网络、节点属性和边。默认的绘图选项建立在 Matplotlib 上,这对于这种类型的可视化来说是次优的。

使用 Matplotlib 的默认图形绘制

我不想摆弄 Matplotlib axes API,手动定制图表或创建一次性函数,而是想要一些更健壮、开箱即用、视觉上更吸引人和简洁的东西,同时最大限度地增加图表上可以显示的信息量。

进来的是我最喜欢的可视化库 Plotly。Plotly 已经有了一些关于如何可视化图形的文档,但这仍然是一个相当漫长的过程,并且只针对非定向图形。目标是找到(或创建)一个遵循.plot标准的统一 API,并对图形进行一些定制。因此,我做了这个叫做交互式图形可视化(igviz) 的包。

注意:目前仅支持 Networkx,但下一步将扩展到 Apache 的Graphx

要查看任何情节的交互性,您可以在这里查看

使用

安装运行pip install igviz

import networkx as nx
import igviz as ig

出于演示目的,创建一个随机图,为每个节点分配一个名为prop的属性,并将值设为 12。

G = nx.random_geometric_graph(200, 0.125)
nx.set_node_attributes(G, 12, "prop")

默认情况下,节点的大小和颜色由其自身的度数决定。节点的度就是它拥有的边(连接两个节点的线)的数量。悬停在节点上可以看到节点的度数!

注意:这也适用于有向图和多重图。有向图将显示从节点到节点的箭头。

fig = ig.plot(G)
fig.show()# ig.plot(G) also works.

使用 IGViz 的默认图形绘制

提示:谈到可定制性,您可以将节点的大小(size_method)更改为静态的,基于节点的属性或您自己的定制大小方法。

提示:颜色可以改变(color_method)为静态颜色(十六进制、纯文本等)。),基于节点的属性或您自己的自定义颜色方法。

还有更多的选项,还会有更多的选项,但这些选项会极大地影响图表的可视化和信息。

自定义图形外观

这里所有的节点都被设置为相同的大小,颜色被设置为浅红色,同时在悬停时显示prop属性。

提示:要在悬停时显示节点的属性,请为您想要显示的节点属性的node_text参数指定一个列表。默认情况下,仅显示度数。

fig = ig.plot(
    G, # Your graph
    title="My Graph",
    size_method="static", # Makes node sizes the same
    color_method="#ffcccb", # Makes all the node colours black,
    node_text=["prop"], # Adds the 'prop' property to the hover text of the node
    annotation_text="Visualization made by <a href='https://github.com/Ashton-Sidhu/plotly-graph'>igviz</a> & plotly.", # Adds a text annotation to the graph
)

fig.show()

提示:如果你想在一条边上悬停时显示边属性,调用ig.plot时添加show_edgetext=True

这里,调整大小和颜色的方法基于每个节点的prop属性,我们在悬停时显示prop属性。

fig = ig.plot(
    G,
    title="My Graph",
    size_method="prop", # Makes node sizes the size of the "prop" property
    color_method="prop", # Colors the nodes based off the "prop" property and a color scale,
    node_text=["prop"], # Adds the 'prop' property to the hover text of the node
)

fig.show()

要添加您自己的大小和颜色方法,请将与图中每个节点相关的颜色或大小列表传递给size_methodcolor_method参数。

提示:要改变色阶,改变colorscale参数!

color_list = []
sizing_list = []for node in G.nodes():
    size_and_color = G.degree(node) * 3 color_list.append(size_and_color)
    sizing_list.append(size_and_color)fig = ig.plot(
    G,
    title="My Graph",
    size_method=sizing_list, # Makes node sizes the size of the "prop" property
    color_method=color_list, # Colors the nodes based off the "prop" property and a color scale
    node_text=["prop"], # Adds the 'prop' property to the hover text of the node
)fig.show()

布局

您可以通过指定布局类型来更改图表的组织和布局方式。Networkx 附带了可以使用的预定义布局,我们可以通过layout应用它们。

默认情况下,igviz 寻找pos节点属性,如果它不存在,它将默认为随机布局。

支持的布局有:

  • 随机(默认):在单位正方形内随机均匀放置节点。对于每个节点,通过在区间[0.0,1.0]上均匀随机地选择每个 dim 坐标来生成位置。
  • 圆形:在一个圆上定位节点。
  • kamada :使用 Kamada-Kawai 路径长度成本函数定位节点。
  • 平面:如果可能的话(如果图形是平面的),定位没有边相交的节点。
  • spring :使用 Fruchterman-Reingold 力定向算法定位节点。
  • :使用图拉普拉斯的特征向量定位节点。
  • 螺旋:在螺旋布局中定位节点。
fig = ig.plot(
    G,
    title="My Graph",
    layout="kamada"
)

fig.show()

要添加您自己的pos属性,您可以通过nx.set_node_attributes功能进行设置。

pos_dict = {
    0: [1, 2], # X, Y coordinates for Node 0
    1: [1.5, 3], # X, Y coordinates for Node 1
    ...
}

nx.set_node_attributes(G, pos_dict, "pos")

fig = ig.plot(G)

fig.show()

反馈

我鼓励所有关于这个帖子或 Igviz 的反馈。你可以给我发电子邮件到 sidhuashton@gmail.com 或者在帖子上留言。

如果你喜欢这个项目,请给它一个以及关注我在推特上的更多更新!

任何错误或功能请求,请在 Github repo 上创建一个问题。我欢迎所有功能请求和任何贡献。如果你想为一个开源项目做贡献,这个项目是一个很好的开端——如果你需要帮助,可以随时给我发消息。

我本周(4 月 11 日)看到的有趣的 AI/ML 相关文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-i-came-across-this-week-18a1cde18629?source=collection_archive---------35-----------------------

由于我们大多数人都有更多的空闲时间,高亮显示的文章对那些想学习新东西或只想寻找分散注意力的内容的人来说是有用的

包括文章的封面图片

与 2020 年的其他任何一周相比,我在媒体上花了更多的时间,对于许多读者来说也是如此。

我们中的许多人目前都处于禁闭状态,正在寻找打发时间的方法。我们中的一些人在寻找关于正在进行的疫情的可靠信息和建议,而我们中的大多数人宁愿分心。

下面是我在 Medium 上看到的一些文章,它们符合我上面提到的标准。我建议在这篇文章中找到一两篇适合你的文章,并探究它们的内容。

所选文章写得很好,结构清晰,包含不同类型的机器学习爱好者感兴趣的内容。

享受吧。

14 天隔离期间要做的 14 个数据科学项目

随着全球主要国家和城市实施封锁,这一时期是数据科学家和机器学习从业者提高现有技能和研究投资组合的绝佳机会。

这就是为什么 Terence Shin 的文章是一篇适时的文章。特伦斯为读者提供了 14 个项目,他们可以在这个不确定的时期着手处理。

特伦斯在文章的开头表达了对全球成千上万正在抗击疫情冠状病毒的医疗专业人员的感谢。

本文中的项目分为三个部分,即:可视化、探索性数据分析和预测建模。每个项目的难度也有记录。初学者可以完成至少七个标有“简单”的项目。

文章中的项目主题的变化非常相关,准备探索冠状病毒和基于全球气候的数据集。

我将把这篇特别的文章推荐给数据科学领域的初学者,或者任何想在他们的投资组合中增加一些项目的人。

[## 14 天隔离期间要做的 14 个数据科学项目

2020 年发展新技能和强化你的投资组合的终极项目清单

towardsdatascience.com](/14-data-science-projects-to-do-during-your-14-day-quarantine-8bd60d1e55e1)

冠状病毒:我们的立场和我们下一步该做什么 Lex Fridman

Lex Fridman 是一个许多机器学习实践者可能已经熟悉的人。

他最近写了一篇文章,提供了关于冠状病毒疫情的重要统计信息。书面材料中的统计数据主要集中在美国,包括疫情对美国经济影响的信息。它还强调了美国医疗机构面临的困难。

在他的最新文章中,Lex 提供了宝贵的信息和建议,告诉我们作为个人,如何在帮助整个人类度过疫情方面发挥作用。阅读这篇文章,显而易见,我们都有一个角色要扮演,每个人都间接对周围人的健康和安全负责。

文章中提供的信息附有大量可信的资源。这些资源为读者提供了关于持续使用口罩及其有效性的问题的深入细节。他甚至包括视频,提供更多关于口罩使用和有效性的信息。

我强烈推荐这篇文章被阅读和分享;所提供的知识可以在这个前所未有的时代保护你和你的家人的安全。

[## 冠状病毒:我们的立场和下一步该做什么

一些观点基于现有的最佳科学和数据,关于我们的立场和我们下一步应该做什么。

medium.com](https://medium.com/@lexfridman/coronavirus-where-we-stand-and-what-we-should-do-next-2da929dbdab4)

关于人工智能和大数据的前 20 部电影

许多媒体作家已经意识到,人们现在在封锁期间有更多的空闲时间。

Benedict Neo 就是其中之一,他写了一篇有趣的文章,列出了面向人工智能和数据科学的电影。

我自己看了列表,我已经看了 90%的电影,我很感激《黑客帝国》被包括在内(额外鼓掌!)。

《星球大战》、《机械战警》和《终结者》等经典作品都包括在内,还有《查皮》、《星际穿越》和《她》等更现代的杰作。

对于每一部呈现的电影,本尼迪克特都写了一个总结,没有任何剧透。此外,每个摘要中都包含一个声明,说明每部电影探索了人工智能和数据科学的哪个方面;有些是基于人工智能的社会影响和其他焦点技术的影响。

我有点震惊的是 改碳 竟然没有列入名单。然而,这是一本好书。

[## 关于人工智能和大数据的 20 大电影。

这里有一些人工智能和大数据电影,你应该在新冠肺炎封锁期间在家观看。

towardsdatascience.com](/top-20-movies-about-machine-learning-ai-and-data-science-8382d408c8c3)

脸书开源架构的个性化神经推荐系统

这篇文章是面向更专业的读者的。

Jesus Rodriguez 对脸书用于个性化推荐系统的深度神经网络(DNN)架构进行了深入的总结和评估。

这篇文章提到了这样一点,当谈到个性化推荐系统的实现时,没有一种标准化的方法可以利用。

Jesus 提到脸书发布了他们的 DNN 推荐系统架构:RMC1、RMC2 和 RMC3 对于任何着手实现推荐系统的人来说都是合适的可配置蓝图。

我觉得这篇特别的文章很有见地,因为它包括了视觉插图,突出了脸书的三个 DNN 主题架构之间的差异,并提供了关键差异的文本解释。

[## 个性化神经推荐系统的脸书开源架构

一份新的研究报告和参考架构总结了评估用于个性化服务的 DNN 系统的经验

towardsdatascience.com](/facebook-open-sources-architecture-for-personalized-neural-recommendation-systems-4f3668876660)

本周(8 月 15 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-aug-15-a050217b1c42?source=collection_archive---------34-----------------------

安全性、数据隐私和对象检测只是本周有趣的 AI/ML 相关文章中涵盖的几个主题,您不应错过。

随着直观的、新的和侵入性的技术的出现,安全和隐私将永远是人们讨论的话题,这些技术模糊了隐私的界限。

安全是国家一级的优先事项,隐私被视为个人的基本人权。

尽管数据科学家和机器学习工程师可能不是强制实施安全措施的必要倡导者,但我们确实应该对这一主题有一个高层次的认识。

关于这一点,本周的文章涉及以下内容:

  • 数据隐私的大网及其失手

  • 详细探索解决物体检测的流行深度学习方法

  • 一个机器学习工程师历程的回顾。从学习者到教育者。

提到的有趣文章的封面图片

阿伦·卡彭特的数据收集伦理

了解数据隐私法不断变化的面貌,以及普遍存在的漏洞。

阿伦·卡彭特揭示了数据隐私监管中适应性的重要性,他展示了监管机构在处理个人和私人数据方面众所周知的失误。

阿伦的文章深入研究了数据隐私法从 HIPAA (1996 年)综合最终规则(2013 年)到更现代的 GDPR 的演变。

阿伦发表声明,暗示模糊的界限和模糊的隐私法导致的模糊性,使一个组织难以跨越患者隐私的界限。

尽管如此,本文的第一部分阐述了政府和监管机构为与技术进步和信息收集同步更新数据隐私法所做的努力。

本文的第二部分揭示了最初提出的数据隐私法的明显不适应性,这些法律对卫生组织持有的数据施加了限制。

阿伦讨论了过时的数据隐私法的失败,因为这些法律没有考虑到几十年后将出现的社交媒体网络和组织,这些网络和组织将聚合这些平台用户的健康数据和信息。

阿伦在文章的最后提到了不可避免的即将到来的数据隐私疏忽,这主要源于技术的不断发展,而不是管理机构的疏忽。

这篇文章向读者传达的最后一个信息是,数据保护的责任从管理机构转移到了个人身上。Aren 提供了一套指导方针,数据科学家和个人可以利用这套指导方针来培养对道德来源数据标准的认识。

非常适合阅读:

  • 对数据隐私感兴趣的个人
  • 数据科学家/数据分析师

** [## 数据收集的伦理

您的数据来源是否符合道德规范?

towardsdatascience.com](/the-ethics-of-data-collection-9573dc0ae240)**

我们在黑帽 2020 上看到的最可怕的事情

一篇文章形式的展览,介绍了读者和安全专家在今年的 BlackHat 活动中应该了解的有价值的演讲、工具和技术。

安全和隐私始终是一个随着更先进的技术和工具的发展而变化的话题。

在 2020 年,我们观察到了基于国家安全和数据隐私问题对大量使用的移动应用程序的审查。

由于新冠肺炎的限制和安全措施,一年一度的黑帽安全会议在网上广泛举行。 PCMag 撰写了一篇文章,简要介绍了在此次活动中脱颖而出的演讲、技术和工具。

准备阅读一些工具的汇编,这些工具颠倒了被跟踪者和跟踪者之间的角色;或者探索卫星无线网络安全漏洞的工具。

PCMag 汇编文章还包括安全专家的一系列演讲,传达他们在国家层面的安全担忧和经验。其中一些会谈包括探讨美利坚合众国选举期间与安全有关的话题。

在 PCMag 的编辑列表中,最让我印象深刻的是类似间谍的设备的亮相,这些设备采用日常用品的形状,如灯。

非常适合阅读:

  • 安全爱好者
  • 安全专家

** [## 我们在黑帽 2020 看到的最恐怖的事情

每年,黑客和研究人员都聚集到拉斯维加斯参加黑帽安全会议(有些人留下来参加…

medium.com](https://medium.com/pcmag-access/the-scariest-things-we-saw-at-black-hat-2020-7406f8f1d19a)**

你应该阅读的 12 篇论文,以了解深度学习时代的对象检测,作者:伊森·颜佳·李

解决物体检测的流行深度学习方法的详细探索

对象检测是基于计算机视觉的重要任务之一,研究人员和学者已经设计了算法和基于启发式的方法。

最近,用于解决对象检测的大多数解决方案都植根于深度学习技术和方法的利用。

伊森·颜佳·李撰写了一篇文章,探讨了过去十年来解决物体检测的深度学习方法的发展。

Ethan 的文章首先简要解释了对象检测问题;还包括正确理解文章内容所需的必备知识。

每个包含的深度学习方法都配备了以下内容:它被引入的年份;该技术的相应研究论文的链接,更重要的是对该方法如何工作和实现的详细解释。

Ethan 能够压缩与所展示的技术相关的重要信息,而不会创建让大多数普通读者感到厌烦的冗长的技术分析,这给我留下了非常深刻的印象。

每一种介绍的方法都用图像来补充,说明一种技术的对象检测方法或算法过程。

本文中包含的对象检测技术的示例有 Yolo、RCNN、Overfeat 和 RetinaNet。

为了结束这篇写得很好的文章,Ethan 包括了一些值得注意的深度学习方法,这些方法补充了前面提到的技术,或者提供了对对象检测问题的进一步见解,并提出了解决方案。

非常适合阅读:

  • 数据科学家
  • 深度学习从业者

** [## 你应该阅读的 12 篇论文,以了解深度学习时代的对象检测

快速浏览十年来最好的物体检测论文,帮助你学习更高级的计算机视觉

towardsdatascience.com](/12-papers-you-should-read-to-understand-object-detection-in-the-deep-learning-era-3390d4a28891)**

我将如何重新开始学习机器学习(3 年内)作者丹尼尔·伯克

回顾机器学习工程师从学习者到教育者的历程。

丹尼尔·伯克在在线机器学习社区中迅速成为一个熟悉的名字。多年来,丹尼尔发布了许多文章、视频、课程和材料,为机器学习学生和从业者提供了对机器学习行业不同方面的见解。

丹尼尔已经经历了三年多事的机器学习之旅,他写了一篇文章,回顾性地分析了他的旅程和经历中的关键事件。

本文的前半部分是以讲故事的方式讲述的,普通读者会喜欢。丹尼尔提到了他旅程的开始,从他卑微的学识到他的职业经历。

Daniel 讨论了想要转移到下一个闪亮框架、构建更多工具以及进行研究的感觉。他还包括一个关于积累机器学习相关证书问题的论述。

文章的后半部分是 Daniel 将如何处理他在机器学习相关主题中学习和获取知识的整个经历的蓝图。

这个蓝图对于那些可能被互联网上的大量可用资源淹没的初学者来说是一个有用的资源。充斥着资源链接,后半部分侧重于用时间测量指标来指导读者如何进行机器学习研究,他提到,应该用个人项目来补充。

非常适合阅读:

  • 数据科学家
  • 机器学习工程师

** [## 本周(8 月 9 日)你应该阅读的有趣的人工智能/人工智能文章

本周值得一读的文章汇编

towardsdatascience.com](/interesting-ai-ml-articles-you-should-read-this-week-aug-9-dddbb25bb69c)**

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟着我上
  3. 通过 LinkedIn 联系我

本周(8 月 22 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-aug-22-f62a7b7a48b7?source=collection_archive---------28-----------------------

封面图片本周封面文章

分析和意见

学机器学习还是深度学习?看看这篇文章,它可以指导你的学习之旅

大约一年前,我的机器学习和计算机视觉理学硕士学位接近尾声。

虽然我获得了一些有用的理论知识,但我的实践经验仍然不足。

所以我做了你们大多数人会做的事,我在 PyTorch 和 TensorFlow 上买书,看视频和阅读大量媒体文章。

本周的一堆文章献给那些在机器学习行业起步并寻求方向、建议或简单学习材料的人。

以下是所涵盖文章的概述:

  • py torch 中的递归神经网络简介
  • 免费大学十五章讲授深度学习话题
  • 讲述一名医学专业人士成为数据科学家的历程
  • 超分辨率简介

我如何在 COVID(作为一名医生)期间成为一名数据科学家

“你只和你的前三个项目一样优秀”——克里斯·洛夫乔伊

Chris Lovejoy 写了从医疗领域的职业过渡到机器学习相关职业的经验。

克里斯给那些想从非技术行业转行的人的第一个建议是去社交网络。

本文指出了早期开发人员容易陷入的常见陷阱。这些陷阱可以通过向经验丰富的开发人员寻求帮助来避免。据 Chris 称,他通过在技术活动、聚会上与个人会面,以及通过 LinkedIn 联系,找到了技术指导。

拥有一流的投资组合是科技行业的古老建议。尽管如此,Chris 还是提供了可操作的步骤,可以用来为投资组合积累一系列项目。从参加基于项目的课程到黑客马拉松,Chris 似乎已经利用了所有为他的项目获取想法的可能性。

训练营已经迅速成为来自非传统背景的个人获得必要技能以在技术型职位中生存的快速途径。这篇文章包括克里斯在训练营的经历的简短个人描述,并包含了关于训练营和价格的细节。

机器学习相关专业有一个持续的学习过程。理想情况下,成功的关键是理解基本面,这是克里斯向读者传递的信息。

Chris 提供了几个指向数学学习资源的链接,并总结了有抱负的数据科学家应该具备的专业知识。

获得理学硕士学位是获取专业领域知识的传统方法。根据 Chris 的说法,如果不打算攻读数据科学的理学硕士学位,就很难受到重视。

有很多文章都是针对有技术背景的人过渡到机器学习相关角色的。Chris account 与众不同,吸引的是非技术背景的个人。

推荐用于:

  • 考虑转行到 ML 相关职位的个人
  • 机器学习学生

[## 我是如何在 COVID(作为医生)期间成为数据科学家的

非传统职业转型的 5 点启示

towardsdatascience.com](/first-data-science-job-coronavirus-doctor-b8cf074bae96)

超级分辨率及其在深度学习方面的最新进展——第一部分,作者希瓦尼·拉波尔

超分辨率及其应用简介。

Shivani Rapole 通过使用相关的用例以及描述良好的场景来证明技术方法的合理性,为大多数人可能会感到畏惧的主题提供了简单的解释。这个题目超解析。

超分辨率(SR)是一种应用于大量行业和应用的技术。Shivani 通过提供关于如何在各种用例中利用软件无线电的简要细节,向读者介绍了软件无线电的一些典型应用。

这篇文章并不是 SR 内部工作的全面背景,这就是为什么我推荐这篇文章作为信息源或复习文章。

读者需要用外部资源补充从本文中获得的知识。

也就是说,Shivani 提供了超分辨率的概述,而没有包含算法或复杂的图像,这使得这篇文章成为机器学习学生的绝佳资源。

[## 深度学习中的超分辨率及其最新进展(一)

在本文中,我将简要介绍超分辨率的概念及其在各种图像处理中令人困惑的应用

medium.com](https://medium.com/analytics-vidhya/super-resolution-and-its-recent-advances-in-deep-learning-part-1-c6d927914d32)

非常适合阅读:

  • 计算机视觉/深度学习从业者

关于深度学习你想知道的一切

机器学习爱好者和学生关于深度学习主题的视频内容的宝贵资源

Andreas Maier 是德国FAU大学的教授,并撰写了一篇通过博客和视频展示的深度学习主题的汇编文章。

读者可以将这篇文章视为各种深度学习主题的内容页,如神经网络、强化学习、对象检测等。

共有 15 章,每一章都配有描述课程内容的图片。章节被分成几个部分,这些部分补充了指向视频内容和课堂讲稿的资源链接。

对于机器学习的学生和读者来说,这是一个完全免费接受大学水平教育的机会。

非常适合阅读:

  • 机器学习学生

[## Fau 课堂笔记——走向数据科学

阅读《走向数据科学》中关于 Fau 的讲稿。共享概念、想法和代码的媒体出版物。

towardsdatascience.com](https://towardsdatascience.com/tagged/fau-lecture-notes) [## 关于深度学习你想知道的

在综合视频和博客文章中

towardsdatascience.com](/all-you-want-to-know-about-deep-learning-8d68dcffc258)

让我们建立一个 RNN,Pytorch 风格!由 Nishil Madhani

用 PyTorch 实现递归神经网络

Nishil Madhani 写了一个简短但有用的指南来理解 PyTorch 中递归神经网络的实现。

在现实世界中,数据有各种形式和大小。接收各种输入的应用程序的输出在大小上也有可变性。考虑到这一点,我们要求神经网络可以处理和产生的数据类型具有灵活性。递归神经网络(RNN)满足这一要求。

Nishil 提供了一个典型的 RNN 建筑的描述性概述,并辅以图解示意图。

这篇初学者友好的文章解释了用于实现和训练 RNN 的技术术语和库。了解文章的内容需要一些先决条件,但快速的谷歌搜索应该能为读者提供所需的知识。

本文探讨了以下主题、工具和主题领域:Python、PyTorch、深度学习、时间序列预测、递归神经网络、Numpy 等。

推荐用于:

  • 机器学习从业者

[## 建立一个 RNN,Pytorch 风格!

你有没有想过深度学习是如何试图模仿人脑的记忆概念的?我猜答案是肯定的…

medium.com。](https://medium.com/@nishilmadhani/lets-build-a-rnn-pytorch-style-c960207f1fb3)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上中型
  3. 通过 LinkedIn 联系我

本周(8 月 31 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-aug-31-d65d79b172de?source=collection_archive---------78-----------------------

分析和意见

不要错过这些关于人工智能和机器学习主题的写得很好、内容丰富的文章。

来自美国亚利桑那州皮奥里亚的 Gage Skidmore 查德维克·博斯曼,CC BY-SA 2.0,https://commons.wikimedia.org/w/index.php?curid=67164061

2020 年 8 月 28 日,世界失去了一位英雄,查德威克·亚伦·博斯曼。

他在银幕上扮演“黑豹”,是一个英雄,但他最非凡的英雄壮举却是在银幕之外。

他激励了一代又一代的黑人,包括我自己,深入内心,寻找力量,在逆境中坚持下去,并向世界展示他们的才华。

他通过塑造几个非虚构和虚构的人物来达到这一目的,如詹姆斯·布朗、杰基·罗宾森、黑豹等。

尽管如此,他塑造的最伟大的英雄还是他自己,查德维克·博斯曼。

这里是我本周在 Medium 上偶然发现的基于人工智能和机器学习的文章,应该会给你提供一些价值。

在我的推荐文章列表中,您会找到提供以下内容的文章:

  • 解释广泛使用的卷积神经网络架构中的整体组件
  • 理性看待艾对人类生存威胁的可信尝试。
  • 有色人种试图创造真正财富道路上的算法路障
  • 在一个我们已经看到面部识别技术大清洗的世界里,一些部分开始大规模采用。

左上:图片由安德烈叶拍摄。右上:照片说明。来源:SOPA 图片/盖蒂图片。左下:照片:10000 小时/Getty Images。右下:Maximalfocus 在 Unsplash 上拍摄的照片

谷歌盗梦空间背后的聪明绝招:安德烈·叶的 1×1 卷积

对广泛使用的卷积神经网络架构中的整体组件的解释。

Andre Ye 写了 Google 的 Inception 架构以及它在图像分类和检测方面成功的原因。

Andre 在这篇文章中解释说,Inception 架构的成功主要是由于通过合并 1x1 卷积有效地利用了神经网络架构计算资源。

这篇文章深入探究了为什么 1x1 卷积是 Inception CNN 架构不可或缺的组成部分。

通过包含详细的描述和创造性的插图,Andre 能够指出卷积如何对不同格式的图像(灰度和 RGB)进行操作。

在解释 1x1 卷积的好处的同时,Andre 还包括一些常见深度学习术语的定义和解释,如卷积、过滤器、步幅、通道等。

深度学习实践者不仅要理解常见的 CNN 架构,还要掌握研究人员选择特定架构设计的判断背后的原因,这一点至关重要。

非常适合阅读:

  • 深度学习从业者

[## 谷歌盗梦空间背后的聪明绝招:1×1 卷积

一个 1×1 的 conv 到底能做什么?

towardsdatascience.com](/the-clever-trick-behind-googles-inception-the-1-1-convolution-58815b20113)

人工智能会统治世界,奴役人类吗?由凯南·科尔迪

理性地对待艾对人类的生存威胁的可信尝试

Kenan Kolday 在这篇文章的开头指出,人类对人工智能的恐惧根植于好莱坞电影对人工智能能够做到的“邪恶”的描述。

凯南的文章试图通过清晰地描述各种形式的人工智能及其对生存威胁的潜在性,来重新梳理读者可能持有的对人工智能的无知看法。

这篇文章以分层的方式介绍了人工智能的各种形式;人工狭义人工智能(ANI)、人工通用智能(AGI)和人工超级智能(ASI)。

在文章的前面,凯南举例说明了人工智能可以应用的场景,这些场景是可行的,甚至是目前正在使用的;在文章的最后,我们正在探索具有意识并渴望成为神的人工智能的形式。

我推荐这篇文章,因为它包括了对我们目前拥有的和尚未创造的各种形式的人工智能的简短但信息丰富的描述和应用。

非常适合阅读:

  • 未来学家/技术专家

[## 人工智能会统治世界,奴役人类吗?

人们认为 AI 是威胁,其实真的不是。危险在别的地方。

medium.com](https://medium.com/the-innovation/will-artificial-intelligence-rule-the-world-and-enslave-humans-96c78d2a8588)

凯西·马修斯说,一个算法的一些改变可以让贷款少很多种族歧视

有色人种试图创造真正财富的道路上的算法路障

Kasey Matthews 的文章为金融建模算法提供了丰富的信息,金融贷方使用这些算法来确定是否应该根据种族批准向个人发放贷款。

通过使用个人轶事和基于研究的研究,Kassey 提供了一个很好的例子来描述为什么像 BISG(一种广泛使用的种族建模算法)这样的技术并不像它们看起来那样健壮或可靠。

改进建模技术和算法的一个更好的方法是包含更多的数据点,这就是 Race Predictor 所做的。

根据 Kassey 文章中的信息,种族预测器是对 BISG 的改进,包括更多相关的非种族数据点来预测种族。

Race Predictor 是使用机器学习方法构建和训练的,与它的前辈相比,它显示出更有前途的结果。

这篇文章非常适合阅读:

  • 金融领域的机器学习从业者

[## 一个算法中的一些变化可以让贷款少很多种族歧视

美国信贷经济的软件中有一个缺陷,这个缺陷可能会阻碍有色人种…

momentum.medium.com](https://momentum.medium.com/a-few-changes-in-one-algorithm-can-make-lending-a-lot-less-racist-4afaafba2b01)

4 亿印度人可能很快需要使用面部识别来访问他们的银行账户戴夫·格什戈尔

在一个我们已经看到面部识别技术大清洗的世界里,一些部分开始大规模采用。

2020 年,我看到的关于放弃面部识别设备和技术的文章比过去几年都多。

但是,Dave Gershgorn 的文章指向了印度,印度政府正在寻求将面部识别摄像头应用到金融系统中。

根据 Dave 的文章,印度国家政府正在试验利用虹膜和面部识别来获得财政资源。

这种从获取金融资源的最初生物特征数据到面部特征的转变是由于冠状病毒疫情。

冠状病毒只是迫使印度变得更加依赖基于人工智能的技术吗?

嗯,看起来是这样的,正如戴夫所说的,目前有四家银行正在实施这个得到大型全国性组织支持的项目。

这篇文章非常适合阅读:

  • 对人工智能应用感兴趣的技术专家
  • 计算机视觉从业者

[## 4 亿印度人可能很快需要使用面部识别来访问他们的银行账户

四家银行目前正在测试面部识别系统,为期两周

onezero.medium.com](https://onezero.medium.com/access-to-welfare-programs-in-india-could-soon-depend-on-facial-recognition-scans-a09d21a96b1d)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上中型
  3. 通过 LinkedIn 联系我

本周(8 月 9 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-aug-9-dddbb25bb69c?source=collection_archive---------43-----------------------

安娜·奥扎在 Unsplash 上的照片

分析和意见

本周值得一读的文章汇编

我想以声援受到本周悲剧事件影响的贝鲁特和喀拉拉邦的公民开始我的每周 AI/ML 文章汇编清单。

我向受害者的家人和朋友表示慰问。

本周的文章涵盖了另一批精心呈现且详细的媒体文章,包括以下内容:

  • 如何利用人工智能创造一个安全的工作环境?
  • 带深度学习的手语翻译。
  • 笔记本电脑实现人脸解锁功能。
  • 能让你躲过监控摄像头的时尚。

人工智能将为安全返回工作场所提供动力。下面是甘尼斯·凯萨里的介绍

在疫情冠状病毒期间和之后保护工作场所和员工的基于人工智能的解决方案

Ganes Kesari 介绍了雇主可以用来为重返工作场所的员工创造安全环境的方法。

Ganes 在他的文章中提出的方法和技术利用人工智能创建了一种以数据为中心和基于机器学习的方法来实施程序和安排,以确保创建一个无 Covid 的工作场所环境是可能的。

Ganes 的文章首先包括了一个人工智能劳动力调度系统的软件蓝图。

Ganes 对系统的描述听起来很简单,但是很明显,后勤和技术上的努力可能会使这个项目持续 3-6 个月。尽管如此,劳动力环境已经改变,所以这可能是一个值得追求的项目。

最近几个月,不同的团体开发了基于计算机视觉的应用程序,用于监控行人之间的社交距离。Ganes 在他的文章中包含了一幅描绘 Landing AI 构建的社交距离检测器的图像,以向读者展示社交距离系统如何在工作场所中实施。

在非公共环境中存在隐私和摄像头问题。然而,工作场所内的人工智能社交距离工具可以用于工作场所周围的公共区域和公共区域。

本文涵盖了一些可以在工作环境中应用的人工智能解决方案的直观方法。显而易见,对于精通技术的雇主来说,这是一本好书。这篇文章不包括普通数字本地人不熟悉的技术术语,Ganes 的描述性文字清楚地说明了 covid 安全策略的开始。

非常适合阅读:

  • 雇主
  • 普通观众

[## 人工智能将为安全返回工作场所提供动力。以下是方法

疫情还没有结束。如何安全地迎接员工重返职场?

towardsdatascience.com](/ai-will-power-a-safe-return-to-the-workplace-heres-how-4968785c8e65)

使用深度学习的手语识别何塞·赫拉索

对人工智能如何帮助手语翻译的端到端描述

使用双摄像头系统和深度学习技术, José Herazo 展示了一个基于视觉的手语翻译系统的原型。

在这篇文章中,José分解了开发由深度学习技术创建的手语翻译系统所涉及的过程。

本文分为三个部分,提供了开发该系统的主要工作和方法的细节。

第一部分详细介绍了 José在这个项目中的直觉,包括说明系统中涉及的摄像机位置和硬件组件的图像。

第二部分是用于训练所实现的卷积神经网络的数据集合。本节包括用于调整训练数据数量的数据源和数据扩充技术。

本文的最后一节描述了在符号翻译系统中使用的实际卷积神经网络。训练模型的评估结果遵循 CNN 架构的描述。

阅读这篇文章,了解 José project 的最终表现,以及该项目的未来发展计划。

适合阅读:

  • 数据科学家
  • 机器学习从业者
  • 机器学习爱好者

[## 使用深度学习的手语识别

双摄像头第一人称视觉翻译系统

towardsdatascience.com](/sign-language-recognition-using-deep-learning-6549268c60bd)

使用人脸通过计算机视觉自动锁定和解锁 Ubuntu!!!巴拉·文卡特什

如何在笔记本电脑中实现面部解锁功能的逐步过程

Bala Venkatesh 最新文章是一篇关于如何在笔记本电脑设备上实现计算机视觉人脸解锁功能的简单分步指导文章。

该项目本身使用了关键的数据科学和计算机视觉库和工具,如 OpenCV、NumPy 和 Python。

这篇简短但详细的文章包含了执行项目各个阶段的代码片段。本文中解释的关键步骤是数据聚合、模型训练和测试。

Bala 还包括一个 YouTube 视频短片,展示了该系统的运行情况。对于更多好奇的读者来说,GitHub 资源库链接包含了对源代码的探索。

非常适合阅读:

  • 计算机视觉工程师
  • 数据科学家

[## 使用人脸通过计算机视觉自动锁定和解锁 Ubuntu!!!

我用 OpenCV 和人脸识别库实现了一个自动人脸解锁技术。

towardsdatascience.com](/automatically-locking-unlocking-ubuntu-with-computer-vision-using-a-human-face-db35cbe312f7)

这些帽衫让你对一些监控算法“隐形”

做一个时尚的声明,同时愚弄人工智能监视系统。

Dave Gershgorn 的文章探索了将时尚与人工智能相结合的研究。

该研究的基础是围绕着利用对抗性攻击技术来创造服装,以避免通过配备人工智能检测技术的监视系统检测到人。

戴夫的文章简要描述了用于开发印在衣服上的图案以欺骗这些人工智能监控系统的过程。

该文章包括服装和技术项目的限制,即缺乏对配备面部识别的监控摄像头的躲避。

衣服实际上可以在文章中提供的链接中购买。

所以,如果你想做一个相当直观的时尚宣言,并逃避“一些”监控摄像头的检测,那么这些服装可能就是你的风格!

适合阅读:

  • 技术专家
  • 普通观众

[## 这些帽衫让你对一些监控算法“隐形”

它们是由脸书和马里兰大学的研究人员创造的

onezero.medium.com](https://onezero.medium.com/these-hoodies-make-you-invisible-to-some-surveillance-algorithms-8d791339fb87)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮箱列表 获取每周简讯
  2. 跟我上
  3. 通过 LinkedIn 联系我

本周(7 月 11 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-july-11-bac8f2a65819?source=collection_archive---------28-----------------------

分析和意见

发现提供在数据科学和机器学习领域导航成功职业生涯的建议和提示的文章。

我喜欢 Ganes Kesari 用来描述数据科学家的斗争的类比,我的意思是,将与项目经理的互动比作拔牙是滑稽的(也是准确的?).

我看到许多人问“我怎样才能成为一名数据科学家??"或者"我需要学习哪些编程语言?"。这些问题以及许多类似的问题都在本周你应该阅读的人工智能/人工智能有趣文章中得到了解答。

本周的版本对于开始从事数据科学的个人,或者正在寻求成功的机器学习职业生涯的个人非常重要。

  • 从 Miguel Pinto 如何成为 Kaggle 竞赛大师的旅程中寻找建议。
  • 或者你可以从 Ganes Kesari 那里获得一些超能力来帮助你的数据科学事业。
  • 关于您的数据科学角色的安全性,您是否感到害怕。弗雷德里克·布斯勒写得很好的文章中。
  • 以及 Caleb Kaiser 对机器学习工程角色的解释。

包括文章的封面图片

我的三年历程:从零 Python 到深度学习竞赛大师作者 Miguel Pinto

Miguel Pinto 为他的读者展示了他成为 Kaggle 竞赛大师的道路。他的路径详细描述了他两年的旅程,在此期间,他学习了 Python、深度学习和许多其他相关的学科领域。

Miguel 写这篇文章是为了激励个人接受数据科学及其所有相关方面。Miguel 的故事是激励人心的,因为它展示了个人从一个领域中很少或基本的知识进步到获得行业认可的成就的能力。

这篇文章的引言首先提到了人工智能越来越受欢迎的原因。Miguel 通过展示一系列受益于基于人工智能的解决方案的行业,展示了获得人工智能技能的多功能性和可转移性。但米格尔并不回避陈述滥用人工智能可能带来的负面影响。

对他的旅程的回忆从他如何开始学习 Python 以及他所面临的困难开始。

我喜欢他为读者提供可行建议的严肃而直接的方式。他甚至用粗体突出了他的最高提示,所以你不会错过任何提示。

对于包括米盖尔在内的大多数机器学习学生来说,选修吴恩达的课程几乎是必经之路。米格尔还提到了哪些深度学习课程证明对他最有效。

他还讲述了回想起来他会如何进行深度学习研究,读者现在可以采用这些研究,并可能在更短的时间内达到深度学习的熟练程度。

Miguel 文章中的“在 Kaggle 中竞争”部分可能是大多数人会阅读该文章的原因。这一部分包含了米格尔对他在卡格尔队伍中快速前进的回忆,以及他在学习时所面临的挣扎。同样,米格尔用粗体突出了关键点和提示,这些提示是职业生涯的定义。

这篇文章最后提到了在深度学习中获得知识的好处,即使你不选择它作为职业选择。

这篇文章非常适合:

  • 深度学习的学生
  • Kaggle 平台用户

[## 我的 3 年历程:从零 Python 到深度学习竞赛高手

自从 2017 年开始学习 Python 以来,我一直遵循的道路是成为一名独自参加 Kaggle 比赛的大师…

towardsdatascience.com](/my-3-year-journey-from-zero-python-to-deep-learning-competition-master-6605c188eec7)

让你在数据科学职业生涯中不可或缺的 4 种超能力 Ganes Kesari

您已经阅读了 Miguel 的文章和上面的故事,并且您已经准备好从事数据科学方面的职业(或者至少对某个领域感到好奇)。你应该给自己配备超能力。

Ganes Kesari 的文章介绍非常生动,写得很有创意。我喜欢 Ganes 用来描述数据科学家的斗争的比喻。将与项目经理打交道和互动比作拔牙是很滑稽的。

Ganes 不得不描绘一个数据科学家的可怕工作生活,以展示你在面对邪恶的逆境时需要保持的四种超能力(我保持了超能力的主题)。

但严肃地说,Ganes 提出了数据科学家普遍面临的四个挑战领域,并提供了帮助您在数据科学职业生涯中导航的提示和建议。

Ganes 包括如何处理杂乱数据的技巧和掌握的重要性。但是引起我共鸣的一个关键点是强调关注技术而不是工具和应用的重要性。我将保持简单,工具和应用程序来来去去,但技术保持不变。

最重要的是,数据科学家能够理解技术的基本原理,而不是几年后就会过时的应用程序的利用。

Ganes 为读者提供的所有超能力都是适用的,不管你在做什么项目。

如果你目前工作停滞不前,需要一些建议,不妨看看这篇文章。

这篇文章非常适合阅读

  • 数据科学从业者

[## 让你在数据科学职业生涯中不可或缺的 4 种超能力

了解数据科学行业的这些最大挑战,以避免职业生涯停滞不前

towardsdatascience.com](/4-superpowers-that-will-make-you-indispensable-in-a-data-science-career-6571e8e7d504)

AutoML 会是数据科学家的末日吗?弗雷德里克·布斯勒

所以 Ganes 给你配备了一些超能力,但是等着吧,你可能连使用它们的机会都没有!

几年来,AutoML 一直是机器学习行业的热门话题。如果你不熟悉 AutoML,也不用担心。 Frederik Bussler 撰写了一篇文章,介绍了 AutoML 以及在机器学习过程中利用自动化方法的公司、初创公司和组织的前景。

弗雷德里克写道,AutoML 越来越受欢迎,它被亚马逊和脸书等大型科技巨头以及其他几家初创公司采用。

采用 AutoML 作为业务的公司列表表明,这种自动化方法只会在机器学习领域变得更加突出。

Frederik 继续指出了 AutoML 和无代码 AI 之间的区别。简单地说,无代码人工智能是对大量编码的 AutoML 解决方案所带来的复杂性的抽象。

本文的其余部分包括 AutoML 的优点和缺点。

读者的文章中更令人兴奋的部分将是关注 AutoML 缺点的部分(剧透警告 : 数据科学家仍将有工作)。缺点是在缺乏可解释性和无偏见的数据收集的情况下,缺乏人类的直觉和能力。

这篇文章非常适合:

  • 数据科学家
  • 机器学习工程师

[## AutoML 会是数据科学家的末日吗?

AutoML 越来越受欢迎。这就是事情的变化。

towardsdatascience.com](/will-automl-be-the-end-of-data-scientists-9af3e63990e0)

从数据科学转向机器学习工程 Caleb Kaiser

Frederik 的文章可能吓了你一跳,现在你渴望更深入地探索人工智能的世界,成为一名成熟的机器学习工程师。

Caleb Kaiser 的文章首先指出了机器学习实践者实现的模型已经取得的成就;人类文本生成、对象检测和文本语音模型等成就。Caleb 认识到数据科学家和机器学习工程师角色的结合使许多机器学习成就成为可能。

尽管如此,Caleb 还是试图在 ML 工程师和数据科学家之间建立一种区别,他明确指出:ML 工程师的角色与如何实现机器学习来解决实际问题相关联。

为了建立更清晰的区分,Caleb 包括了四个机器学习应用程序,以及 ML 工程师和数据科学家的角色发挥作用的地方。如果要进行职业转型,这些清晰的区别将有助于数据科学家了解潜在的责任。

我不得不承认,数据科学家和机器学习工程师之间的界限有时很模糊,主要是因为他们有共同的责任,而且与角色相关的职责因公司而异也于事无补。

文章的很大一部分集中在确保读者清楚这两个角色之间的区别;一旦做到了这一点,Caleb 就进入了文章的主体部分。

文章的主体集中在机器学习角色需要什么,Calebs 使用了几个应用示例来说明 ML 工程角色的简单性和复杂性。

文章的后半部分指出了将软件工程的原理应用到机器学习过程中。

这篇文章非常适合:

  • 希望从高层次了解 ML 工程角色需要什么的数据科学家
  • 希望了解如何改进现有流程的机器学习工程师

[## 从数据科学转向机器学习工程

机器学习和软件的世界正在发生变化

towardsdatascience.com](/moving-from-data-science-to-machine-learning-engineering-68916173eaf3)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 YouTube 频道 视频内容即将上线 这里
  2. 跟着我上
  3. 通过 LinkedIn 联系我

本周(7 月 18 日)你应该阅读的有趣的 AI/ML 文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-july-18-5326e7aec179?source=collection_archive---------34-----------------------

分析和意见

发现一些文章,这些文章提供了关于如何撰写数据科学博客以及身份盗窃如何使用基于人工智能的技术发展的信息

人工智能技术和系统发展迅速,每周都有新的发明和技术出现。然而,人们仍然不满意我们目前拥有的人工智能水平。

了解为什么人工智能没有达到我们的预期,以及身份盗窃如何演变为利用 deepfakes 和面部识别数据。

本周的封面文章介绍了:

  • 关于如何在媒体上撰写专注于数据科学的文章的技巧和建议
  • 身份盗窃在中国变得多么创新和廉价。
  • 缺乏对当前人工智能水平的欣赏
  • 一种你可能没听说过的神经网络架构

包括文章的封面图片

我如何写一个数据科学博客

如果你正在读这篇文章,那么你对 Medium 并不陌生,你也很有可能,是一个对 AI 感兴趣或者从事 AI 相关工作的人。可能在某个时候,你想在媒体上写文章。

丽贝卡·维克里写了一篇文章,详细介绍了她写文章的过程。

你为什么要接受丽贝卡在文章中分享的建议和提示呢?Rebecca 已经在 Medium 上写了两年了,并且每周都会发表一到两篇文章。如果这还不够,她目前还被认为是教育、技术和人工智能领域的顶级作家。

那么丽贝卡是如何写数据科学文章的呢?

据丽贝卡说,她倾向于将她的写作生涯与目标和目的联系起来。也就是说,Rebecca 的目的是向他人传授数据科学知识,同时巩固自己的知识。这是任何人都可以采用的目的,因为机器学习是一个不断增长的领域,每天都有新的技术和工具出现。

撰写数据科学文章可能会很乏味,需要一个稳健的过程,那么 Rebecca 如何保持动力呢?

她在文章中指出,她不是受金钱激励或社会认可的驱使。根据丽贝卡的说法,不要把经济或社会认可作为动力的来源,你可以拥有成功而长久的写作生涯。

在写作过程中,金钱和社会的验证不会很快到来。因此,你需要一些能激励你坚持写作多年的东西。

我从丽贝卡的文章中得到的最好的建议是她的文章提炼技巧和过程。丽贝卡没有坐下来,炮制出值得策展的文章。她对一篇文章反复推敲。每一次迭代都从一系列想法到围绕这些想法的解释…再到一篇完整的文章。

迭代技术的关键是丽贝卡可以随时随地进行写作。

如果你想从这篇文章中得到灵感,开始在媒体上写作,请读一读这篇文章。也许很快,我会读到你的一篇文章。

这篇文章非常适合:

  • 数据科学博主
  • 数据科学从业者

[## 我如何写数据科学博客

撰写数据科学(或任何其他主题)的顶级技巧

towardsdatascience.co](/how-i-write-a-data-science-blog-62e4108fe478)

你可以在中国的黑市上以 0.07 美元的价格买到戴夫·格什戈恩(Dave Gershgorn)的随机面部识别照片。

我似乎每周都会阅读一两篇戴夫·格什根的文章,我认为人工智能行业的每个人都应该这样做。戴夫涵盖了人工智能和技术相关的相关和当前的主题;这是一剂有益的当代信息,可以平衡你可能每周阅读的所有研究和技术媒体文章。

未来十年,身份盗窃会是什么样子?

好吧,戴夫的文章涵盖了中国对先进人工智能技术的众多滥用之一的最新发展。戴夫写道,中国黑市上正在出现包含人脸图像和附带个人数据的数字包销售。

这些出售的软件包是在中国许多广泛使用的金融、商业和生活应用中绕过许多面部认证系统的所有要求。

从戴夫文章的标题,你可以看到获取数据是多么可笑的便宜。

Dave 写了一个高级包,让整个故事更加离奇。只要支付几美元,你就可以得到一个“deepfake like”软件,它可以移动静止图像的内容来模仿微妙的头部运动。

几年前,戴夫在他的文章中所涵盖的一切,将会出现在一部以 2079 年为背景的电影剧本中,讲述一个先进的犯罪集团。但是我们看到这将在 2020 年实时展开。

Dave 还提到,这种身份盗窃方法可能不太容易适用于美国境内的系统。他还表示,IPhones 拥有先进的面部识别过程,可以测量面部特征的深度。

但有人以低于 1 美元的价格成为数字版的你只是时间问题吗?

这篇文章非常适合:

  • 未来学家和技术专家:简要了解非法活动和犯罪是如何随着先进的技术和人工智能而发展的。
  • 机器学习实践者 :了解世界上一些最聪明的人开发的工具和应用程序的误用是如何导致严重问题的。

* [## 你可以在中国的黑市上花 0.07 美元买到一张随机的面部识别照片

卖家提供多达 20,000 张人脸图像的套装

onezero.medium.com](https://onezero.medium.com/you-can-buy-facial-random-recognition-photos-on-chinas-black-market-c54ab219580f)*

AI 革命来了。这与我们对托比亚·图迪诺的预期不同

我们想要会飞的汽车,他们却给了我们假的。

Tobia Tudino 的最新文章是基于没有意识到人工智能目前的状态是多么具有革命性。这种缺乏欣赏是由于科幻小说中人工智能的呈现导致的高期望的结果。

Tobia 指出,我们在科幻电影和动作中观察到的人工智能可以采取的几种形式的未来主义描述,遮蔽了我们的视线,使我们无法认识到我们期待已久的人工智能革命就在这里,就在我们面前。

但是我没有看到会飞的汽车;没有传送…我们确实有一些很酷的 飞船

Tobia 开始用 Micheal I. Jordan 的扩展声明来解释为什么 AI 没有满足我们对电影的期望(人工智能——革命尚未发生】)。该语句传递 AI 是通配符术语的消息。术语“AI”用于描述任何消除或模拟人类干预或参与的技术进步。

基于对人工智能的描述,可以有把握地说,我们周围到处都有人工智能。

我得到的印象是,Tobia 希望我们读者欣赏我们现在拥有的人工智能水平。Tobia 提到了医疗保健、商业、咨询和时尚行业在决策和数据收集方面的进步。

也许人们担心对当前人工智能的欣赏可能会导致内容。或者,人们尚未接受我们已经实现了值得骄傲的“人工智能”这一事实,这也许不是一件坏事,因为这可以推动研究人员、工程师和创新者发明和创造更好的人工智能系统和技术。

这篇文章令人兴奋,因为:

  • 机器学习从业者 :这篇文章将鼓励你去欣赏你投入到这个世界中的工作,即使这个世界不一定会表现出欣赏。

* [## AI 革命来了。只是和我们预想的不一样。

仅仅因为人工智能还不足以成为科幻小说,并不意味着它已经不是革命性的了

towardsdatascience.com](/the-ai-revolution-is-here-its-just-different-than-we-expected-5022c23aaeee)*

有人称之为天才,有人称之为愚蠢:安德烈·叶创造的最有争议的神经网络

我从来没有遇到过“极限学习机(ELM)”这个话题,所以安德烈·叶的文章对我来说既有教育意义又有启发性。

你们中的一些人可能也没有听说过 ELM,Andre 在他的文章中给出了原因。主要原因是机器学习社区没有采用它,深度学习专家批评和质疑它的性能。

Andre 的文章非常有教育意义,因为它在初级水平上介绍了 ELM,所以任何具有机器学习基本背景的人都可以理解 ELM 的描述和好处。

Andre 通过陈述 ELM 的内部组件对其进行了介绍;如何训练神经网络结构以及其他更具体的特征和属性。

我从这篇文章中得到的总体想法是,榆树是有效的,因为它的随机性。如 Andre 所述,ELMs 由两个律师组成,其中第一层被随机初始化,而权重参数是固定的。

在神经网络架构中融入随机性元素是我们在各种深度学习神经网络架构中看到的;权重可以被随机初始化,并且之后的丢弃也为架构提供了随机性特征。

Andre 还介绍了 elm 被机器学习社区中有声望的个人抛弃的主要原因。Andre 还提供了一些关于 elm 所面临的限制的信息,以及为什么它们没有被广泛采用或利用的原因。

这篇文章非常适合:

  • 机器学习从业者

* [## 有人称之为天才,有人称之为愚蠢:有史以来最有争议的神经网络

极限学习机

towardsdatascience.com](/some-call-it-genius-others-call-it-stupid-the-most-controversial-neural-network-ever-created-2224ed22795a)*

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 YouTube 频道 即将上线的视频内容 这里
  2. 跟我上
  3. 通过 LinkedIn 联系我

本周(7 月 4 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-july-4-cad0d162e108?source=collection_archive---------32-----------------------

找出为什么你应该换工作,成为一名哲学家

本周,我看到了几篇文章,挑战基于人工智能的系统在几个领域的开发和利用。

作为一名机器学习从业者,我从来没有真正反思过我所做贡献的哲学和法律方面,但在阅读了一些有趣的文章后,这种情况发生了变化,这些文章展示了人工智能进步现在正在发生的后果,以及那些尚未发生的后果。

我们今天的生活明天可能会完全不同。

本周我感兴趣的文章涵盖了以下主题:

  • 为什么哲学家会是最后站着的人
  • 法律聚光灯下的面部识别
  • 如何开发有效的数据科学产品组合
  • 物体检测算法之间的较量

包括文章的封面图片

一家面部识别巨头拒绝分享其算法数据集的细节

你会让一个失败率 98%、误报率 81%的机器学习模型投入生产吗?

嗯,这些声称的性能数据来自一个面部识别系统,该系统被南威尔士和英国其他地区的警察部队使用。

Dave Gershgorn 的文章以一个类似于反乌托邦未来的场景开始,在这个场景中,一个监管系统监控着所有人;歇斯底里地预示着可预见的未来。

南威尔士警方自 2017 年以来一直在使用面部识别系统,并在公众面前毫不隐瞒地做到了这一点。他们通过面部识别系统逮捕了一些人。

从表面上看,利用该技术打击犯罪和帮助有效维持治安并没有敲响任何警钟,但这些用于实施逮捕的系统的准确性指标和性能审计结果描绘了一幅更令人吃惊的画面。

Dave 的文章包含了一项针对使用面部识别软件的管理机构的诉讼信息。这起诉讼是由于面部识别系统固有的算法种族偏见和无效性——这是最近成为头条新闻的一个主题。

但是,Dave 对该事件的报道的要点是揭示 NEC technology(面部识别工具的提供商)不愿意透露他们数据集的细节。

甚至使用该工具的警察也不知道该系统是如何被训练的。在我看来,公开用于训练对公众有直接/间接影响的系统的数据是有意义的,特别是在公共警务方面。

戴夫的文章提到了英国对欧洲其他国家和世界的影响。它指出,他们对面部识别的行动和观点可以为欧洲其他国家如何采用和利用面部识别技术开创先例。

Dave 文章的后半部分简要介绍了解决自动驾驶汽车中复杂问题的文章。

阅读这篇文章,了解针对开发用于公共场合的人工智能系统的公司所采取的法律后果和行动。

这篇文章非常适合:

  • 机器学习从业者
  • 技术专家

[## 一家面部识别巨头拒绝分享其算法数据集的细节

NEC 声称其系统没有偏见——但拒绝透明的呼吁

onezero.medium.com](https://onezero.medium.com/a-facial-recognition-giant-refuses-to-share-details-about-its-algorithm-dataset-df27a208683d)

忘掉编码吧,未来的工作是哲学,作者卢卡·罗西

本周我读过的最有趣的文章之一。卢卡·罗西写了一篇文章,会让大多数读者走上自我和环境意识的道路。

读完这篇文章后,我发现自己在质疑我的行为和贡献的影响,这些行为和贡献会导致这篇文章中所创造的想象世界。

Luca 的文章首先陈述了农业、工业和技术革命等全球性革命周期性发生所造成的失业影响。

然后,随着自动化使传统的手工劳动过时,他描绘了引入新的角色和工作的一线希望。但这一丝希望被他的个人意见挡住了。

卢卡在他的文章中指出,自动化和人工智能不会导致大量失业,这并不能保证或确保未来所有人都有大量工作。卢卡还表达了他对未来的担忧,在未来,自动化将主宰生活的方方面面,让我们变得一无是处;他表达了对人类幸福和满足感的关注。

Luca 列出了一些最终将被淘汰的职业,当我往下读列表时,我很欣慰没有看到任何机器学习的角色。卢卡明确指出,由于机器和自动化,没有提到的职位仍然是即将到来的就业市场末日的受害者,这种宽慰很快就消失了。他甚至提供了一个人工智能通过艺术模仿人类创造力的例子来进一步支持他的观点。

没有人是真正安全的。除了哲学家

卢卡认为人工智能不能取代哲学家,因为哲学是人类对存在和生命的本质的模糊性的表达,这与“纯智能”无关。这是一个我不完全赞同的观点。在这个问题上,我可能会和卢卡好好辩论一番。

不管我对卢卡观点的反对意见,我仍然欣赏他对四个越来越相关的哲学主题的结构化方法:道德、意识、生命的意义和对齐问题。

卢卡将每个提出的哲学主题与当前技术(如自动驾驶汽车)和假设的未来技术(如心灵传输和心灵传输)的发生结合起来。

通过创建基于简单和复杂事件的场景,Luca 展示了人类可能做出的选择之间的差异,并展示了人工智能系统做出相同决定的可能性。

Luca 的文章可能不同于许多机器学习从业者习惯阅读的更具技术性和更直接的文章。但是我推荐定期阅读探索技术进步的哲学方面的文章。我知道的一本很好的书是尼克·博斯特罗姆的超级智慧:路径、危险、策略

在结束一篇有趣的文章时,卢卡大胆地指出,世界的命运掌握在哲学家手中,这一观点令我着迷。

这篇文章很有意思,适合:

  • 技术专家
  • 对与人工智能交织在一起的哲学话题感兴趣的人

[## 忘掉编码吧,未来的工作是哲学

人工智能在不久的将来会带来四大问题。只有哲学可以拯救我们。

medium.com](https://medium.com/predict/forget-about-coding-the-job-of-the-future-is-philosophy-33acadcee05a)

如何建立有效的数据科学投资组合 Harshit Tyagi

想要一份让你从其他求职者中脱颖而出的“一流”投资组合,那么 Harshit Tyagi 的文章可以被视为建立投资组合以实现这一目标的蓝图。

我将诚实地声明,在面试阶段,我没有任何作品集可以展示给我现在的雇主,但是正如 Harshit 非常正确地指出的,拥有高学历会给你带来优势。所以 Harshit 的文章非常适合没有理学硕士或博士学位的数据科学家。

文章中提出的第一个建议是自我认同。哈什特建议求职者了解自己目前的技能和自身的局限性。通过这种了解,他们会更清楚自己最适合做什么工作。

没有项目目录的数据科学家组合是不完整的。在这篇文章中,有一些特定形式的项目,希望从人群中脱颖而出的读者应该渴望完成。Harshit 对求职者可以探索的各种项目给出了近乎完美的解释,甚至包括几个投资组合的例子。

后面的步骤探讨了在线展示的重要性,以帮助提升数据科学家的声誉。Harshit's 推荐了 GitHub、LinkedIn、Medium 和 Twitter 等平台,以及他如何利用这些平台的一些个人轶事。

这篇文章最后提供了一些关于简历中关键内容的信息。老实说,这篇文章充满了很棒的技巧和信息,如果你是一个视觉学习者,你也可以查看他的 YouTube 频道,了解更多很棒的内容。

这篇文章非常适合:

  • 数据科学学生
  • 数据科学求职者

[## 如何构建有效的数据科学产品组合

创建一流投资组合的全面指南

towardsdatascience.com](/how-to-build-an-effective-data-science-portfolio-56d19b885aa8)

YOLOv5 与更快的 RCNN 相比。谁赢了?由 Priya Dwivedi

如果你是一个非常视觉化的学习者,你会喜欢由 Priya Dwivedi 撰写的文章,该文章探索了与两种广为人知的对象检测算法的性能比较:YOLOv5 和更快的 RCNN。

这不是一篇关于每种算法如何处理目标检测的分解文章,所以一些读者可能会失望地发现,没有解释所包含的算法如何工作。也就是说,Priya 提供了大量的资源链接,这些资源提供了算法内部工作的信息。

Priya 用来衡量每个算法性能的比较场景是真实的。本文以视频的形式呈现了三种场景:汽车视频、篮球比赛和拥挤的公共场景。

在这篇文章中,Priya 提供了对对象检测算法结果的并排视频评估,然后附有对每个算法进行评估的性能和精度标准表。

我不会透露哪种对象检测算法是最好的,请阅读文章了解一下。

这篇文章的视觉本质使得它对于所有水平的深度学习实践者来说都是容易阅读的。

这篇文章非常适合:

  • 深度学习从业者
  • 机器学习从业者

[## YOLOv5 与更快的 RCNN 相比。谁赢了?

用数据做很酷的事情!

towardsdatascience.com](/yolov5-compared-to-faster-rcnn-who-wins-a771cd6c9fb4)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 YouTube 频道 即将上线的视频内容 这里
  2. 跟我上
  3. 通过 LinkedIn 联系我

本周(6 月 20 日)你应该阅读的有趣的 AI/ML 文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-june-20-dccdf630d623?source=collection_archive---------49-----------------------

意见

这四篇文章涵盖了我本周感兴趣的机器学习主题…包括许多数据科学家可能会感到沮丧的原因

有趣文章的封面图片

又是一周,又一批有趣的媒体文章要通过了。

媒体文章的质量变得越来越令人兴奋和迷人。这周我读了一些围绕学习主题的文章。学习可能是人工智能的中心主题,这应该是相当明显的,因为它是人工智能(机器学习、深度学习、强化学习)大多数领域的最终结论。

学习不仅仅是为我们构建的人工智能系统保留的;我们机器学习实践者必须不断地用正确的工具来装备自己,以加快我们自己的学习。我提到的一些文章为你提供了促进学习游戏的方法和心态。

本周我感兴趣的文章涵盖了以下主题:

  • 免费在线资源,来自以学术成就闻名全球的机构
  • 对下周备受期待的苹果开发者大会的预测
  • 为什么许多数据科学家感到沮丧
  • 人脑与人工智能的持续战斗

丽贝卡·维克里从顶尖大学免费学习数据科学

免费的教育资源是互联网的礼物, Rebecca Vickery 为有抱负的数据科学家或任何对机器学习领域感兴趣的人打包了一个学习资源包。

丽贝卡通过参考一本名为《超学习》的书开始了这篇文章。加速你的职业生涯并提到了作者能够“超学习”的关键因素,即免费在线课程的可用性。

这就引出了丽贝卡写这篇文章的主要原因,那就是揭示学术机构如麻省理工学院和斯坦福大学所提供的精心设计的课程的存在。

本文的主体包括一系列基于课程的机器学习相关主题的学习资源,供喜欢结构化学习方法和知识积累的学习者使用。

读者不仅仅是提供这些免费资源的链接,丽贝卡提供的是已识别资源的背景,使读者能够了解资源提供者的起源、作者和使命。

我向数据科学和机器学习的新老学生推荐这篇文章。

丽贝卡为读者提供了超过 11 种免费的在线资源,将它们加入书签可以在未来为你节省一笔昂贵的学费。

这篇文章是优秀的:

  • 数据科学/机器学习学生

* [## 免费从顶尖大学学习数据科学

在哪里可以找到麻省理工学院、斯坦福大学和哈佛大学的免费讲座、研讨会和完整课程

towardsdatascience.com](/learn-data-science-from-top-universities-for-free-ee3387ad88ac)*

一位资深 iOS 开发者对 WWDC 220 的预测由 Anupam Chugh

距离 WWDC 2020 只有几天了;这是最令人期待的苹果开发者大会之一。它持续了将近一周,尤其是今年,它从 6 月 20 日开始,到 6 月 26 日结束。

Anupam 已经写了一篇文章,其中包含了他对苹果在 2020 年 WWDC事件中的预期的结构化收集。

你可以告诉 Anupam Chugh 非常激动地见证了这次大会和重要的进展,因为他提到了 2019 年 WWDC 大会上介绍和改进的苹果开发生态系统。

本文的主要内容包括 Anupam 对苹果生态系统中现有应用和平台的见解和功能要求,如 CoreMLCreateMLRealityKitSwiftUI

文章的上半部分专注于围绕苹果生态系统内机器学习相关应用的预测,而后半部分则更倾向于苹果开发者生态系统的实用和设计部分。

如果你等不及下周即将发生的激动人心的事情,请快速阅读这篇文章。

这篇文章是优秀的:

  • Swift 开发人员
  • CoreML 开发者
  • 应用程序开发人员/软件工程师

* [## 一位资深 iOS 开发者对 WWDC 2020 的预测

我认为在不久的将来,苹果公司将会推出

medium.com](https://medium.com/better-programming/a-senior-ios-developers-predictions-for-wwdc-2020-fb727a4b45e6)*

当你试图成为一名数据科学家时感到沮丧的原因

Kurtis Pyke 的文章旨在揭示定义最成功的数据科学家的实际个性特征。通过识别这些特征,任何人都可以成为成功的数据科学家

Kurtis 在他的文章中提出了一个很好的观点,即满足该领域的学术要求是很重要的,但这并不能定义该领域的成功。

我从这篇文章中得到的一个信息是,成功不是通过学习的内容来实现的,而是学习如何不断地学习新的内容。

根据我的个人经验,我发现理解学习的过程很重要,因为在一个内容和方法都在不断变化的领域,唯一不变的是学习的方法,不管内容如何。

学习如何学习是我每周从 Medium 上的各种作者那里听到的信息,Kurtis 以数据科学家可以理解的方式定制了一般信息,主要包括他的个人经历和机器学习领域内受人尊敬的人物的片段。

这篇文章是优秀的:

  • 所有级别的数据科学家

* [## 当你试图成为一名数据科学家时感到沮丧的原因

将最优秀的人与众不同的隐藏技能

towardsdatascience.com](/the-reason-youre-frustrated-when-trying-to-become-a-data-scientist-2d2b8b402811)*

元学习告诉我们,大脑比人工智能有独特的学习优势

文章的开头是承认人工智能在许多任务上开始超过人类的表现。尽管如此,Jesus Rodriguez 承认需要大量的训练数据和计算资源来实现人工智能系统的卓越性能。

这篇文章的主要内容是围绕人脑和人工智能之间的对比展开的。更具体地说,是大脑调节化学物质以实现身体功能的独特能力。这篇文章引用了 Deepminds 的关于一种促进人脑学习过程的神经递质的研究论文。

Jesus 很好地解释了这篇文章和参考资料研究集中的神经递质,他甚至使用金·卡戴珊来确保读者得到这种特殊神经递质的作用的说明。

这篇文章本身是对 DeepMind 研究的一个非常简短的总结,涵盖了研究中进行的实验的方法和结果。

这篇文章是优秀的:

  • 强化学习爱好者
  • 机器学习工程师(对人脑功能和神经科学感兴趣)

* [## 元学习告诉我们,大脑比人工智能有独特的学习优势:它必须…

没有一个星期我们不在这里谈论人工智能取得的另一个令人印象深刻的里程碑…

medium.com](https://medium.com/dataseries/meta-learning-teaches-us-that-the-brain-has-a-unique-learning-advantage-over-ai-and-it-has-to-do-f6bed5a825f6)*

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 YouTube 频道 即将发布的视频内容 这里
  2. 跟着我上
  3. 通过 LinkedIn 联系我

本周(6 月 28 日)你应该阅读的有趣的 AI/ML 文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-june-28-65ff4d8a05f5?source=collection_archive---------56-----------------------

四篇文章涵盖了我本周感兴趣的机器学习主题…其中一篇文章涵盖了你可能不喜欢的未来

再过一周,又一批媒体文章要通过了。

我这周读的文章很吸引人,因为许多作家都表达了他们对我们未来的看法。

除了我在 Medium 上遇到的常见技术文章,我觉得探索未来可能会发生什么很重要,特别是像 AI 这样的快节奏领域可能会产生的影响。

我们今天的生活明天可能会完全不同。

本周我感兴趣的文章涵盖了以下主题:

  • 新兴技术带来的未来会是什么样子
  • 如何让你的机器学习模型退出开发
  • 如何度过 10,000 小时的数据科学家指南
  • 人工智能及其对医疗保健的影响

包括文章的封面图片

9 项可怕的技术将塑造你的未来

生命、死亡、艺术、激情、性、选择、心智、人工智能和完美的孩子,这些仅仅是 Luca Rossi 在他写得非常好的关于技术的文章中提到的一半话题,这些技术将很快控制我们生活的许多方面。

首先,卢卡提供了一个免责声明和警告读者,因为文章的内容围绕伦理和道德的细线跳舞。卢卡敦促读者在消化文章中呈现的内容时要有开放的心态。但读完之后,我会说,你不一定需要一个开放的心灵才能理解卢卡所展示的技术的现实。

Luca 将遥不可及的未来假设与我们可用的当今技术之间的相似之处联系起来,这种方式让我认为,是的,所有这些未来技术都只需要几代人的时间。

如果你想知道为什么将来只有穷人会死,或者为什么未来的社会会充满“完美”的人类,那么这篇文章是一个很好的读物。

Luca 讨论了与提到的未来技术相关的恐惧。每一部分还包括一个片段,合理化了人类对即将到来的不可预防的未来的恐惧。

这篇文章充满了提供组织证据的资源,暗示了创造提到的未来技术的途径。因此,对于那些怀疑的读者来说,他们觉得我们离提到的一些未来技术可能还有数百年的时间,卢卡的文章可能会改变你的想法。

这篇文章非常适合

  • 对未来技术感兴趣的个人
  • 技术专家

[## 9 项可怕的技术将塑造你的未来

在接下来的几十年里,我们将见证新的不可思议的可怕技术的出现。多么害怕…

medium.com](https://medium.com/predict/9-terrifying-technologies-that-will-shape-your-future-befa688d247)

10 分钟在谷歌云平台上部署深度学习模型 Binh Phan

Binh Phan 提供了关于机器学习实践者如何在线扩展他们的机器学习模型的信息,相对来说没有任何成本。这是通过利用全球最大的云服务提供商之一的计算资源实现的。

这篇文章包含了清晰简洁的一步一步的说明,使得最终目标非常容易实现;这与许多过时的文章形成对比,这不是作者的错,因为这仅仅是技术快速发展的结果。

Binh 推出了 Docker 和 GCP 等行业标准工具。

本文中的说明的最终结果是一个外部链接,用于访问经过训练的机器学习模型的公开功能。

这篇文章非常适合

  • 数据科学家
  • 学生
  • 机器学习工程师

[## 10 分钟在谷歌云平台上部署深度学习模型

如何在 GCP 部署深度学习模型,完全免费,永远免费

towardsdatascience.com](/10-minutes-to-deploying-a-deep-learning-model-on-google-cloud-platform-13fa56a266ee)

10.000 小时的数据科学|通过 Richard Michael 获得熟练程度

假设你有 10,000 个小时致力于成为你能成为的最好的数据科学家,那么理查德·迈克尔的文章本质上将是你如何度过每个小时的蓝图。

Richard 总结了一种结构化的方法,通过提供涵盖统计学和数学基础的资源,从操作系统和编程语言的选择,一个完全的初学者如何成为一名熟练的数据科学家。

每个确定的主题领域都被分配了成为专家数据科学家所需的 10,000 小时中的一部分时间;所以你可以粗略估计完成每个主题领域需要多长时间。

Richard 文章的后半部分剖析了机器学习领域中的工作角色。

许多人会发现,机器学习中的大多数角色在其指定的职责和责任方面往往是重叠的。然而,了解你学习的最终目标是什么总是好的,因为这可以让你的学习道路更加透明。

这篇文章很适合:

  • 数据科学学生

[## 10.000 小时的数据科学|熟练掌握

从数据新手到专业人士的路。

towardsdatascience.com](/10-000-hours-in-data-science-gaining-proficiency-440387e723c1)

人工智能、深度学习和医学医学博士亚当·塔布里兹

Adam Tabriz,MD 文章结合了人工智能和医疗保健的世界,描述了人工智能将如何影响各种医疗保健实践提供的日常角色和服务。

这篇文章的非技术方法使它成为所有读者的好读物。

Adam 首先对术语深度学习及其内涵进行了深入探讨。文章的早期内容可以看作是对人工智能相关的常见术语和短语的非技术性解释。

亚当又一次以非技术的方式进一步解释了人工智能是如何在工业中应用的。虽然人工智能在各种行业中被用于不同的任务,但亚当的文章解释说,每个人工智能系统的过程在各个行业中都是相同的。

我不会对 Adam 的文章进行任何剧透,但 Adam 提供了一个惊人的声明,总结了机器学习领域的首要目标。

当我们接近文章的主体时,Adam 开始以更快的节奏写作。本节中的文章内容开始更多地关注医疗保健行业中的人工智能。

Adam 介绍了几个有趣的想法和技术,例如,将人工智能与人类思维相结合,以及在医疗保健中利用人工智能进行诊断。

亚当文章的主要内容充满了人工智能在医疗保健行业的巨大潜力。这篇文章对于医疗保健行业中那些好奇他们的工作和实践在未来几年将如何开始改变的个人来说是一篇很好的读物。

Adam 文章的后半部分采取了与前一部分相反的观点,因为 Adam 介绍了人工智能对社会、个人和日常生活的负面影响。

主题包括隐私、工作保留、武器、算法偏见等等。亚当把引入人工智能应用和解决方案的负面、黑暗的一面包括进来,这是公平的。

Adam 通过关注医疗保健专业人员和他们拥抱人工智能和基于人工智能的解决方案的方法来结束他的文章。

我从文章的结论部分获得的一般信息是,医疗保健专业人员需要了解人工智能工具在医疗保健中的引入,并知道如何与人工智能结合,为患者和客户提供最佳服务。

这篇文章非常适合:

  • 技术专家
  • 医护专业人员

[## 人工智能、深度学习和医学

积极的医生姿态将拯救医学艺术

medium.com](https://medium.com/datadriveninvestor/artificial-intelligence-deep-learning-and-medicine-ae0cdb7cb20)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 YouTube 频道 视频内容即将上线 这里
  2. 跟着我上
  3. 通过 LinkedIn 联系我

本周(10 月 11 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-oct-11-3fbff46589a0?source=collection_archive---------34-----------------------

强烈推荐的文章,对人工智能和机器学习感兴趣的个人应该读一读。

又是一周,又一批有意思的文章要过了。

有时候,我不得不后退一步,欣赏像 Medium 这样内容丰富的平台,它们提供关于传统主题(如人工智能)的易于消费的知识。

关于这一点,以下是我本周在 Medium 上看到的四篇文章,每篇文章在内容和提供的信息方面都很突出。

  • 读完 妮可·珍妮薇·比尔兹 的文章后,做好停止使用“人工智能”这个术语的准备。
  • Waymo 刚刚宣布了他们在追求完全自动驾驶交通未来方面的一次重大飞跃,而 戴夫·格什高恩 写了一篇文章,涵盖了关于该事件的所有重要信息。
  • 亚历山大·科姆斯特朗 写一篇文章,涵盖一个可以告诉你你有多有魅力的网站。
  • Wael Jabir采访了在人工智能领域颇具影响力的人物 Micheal Kanaan。

七射手Unsplash 上拍照

如果你在 Medium 上写 AI/ML 文章,你希望我阅读你的文章,并将其纳入我的每周/每月文章报道中,请随时在你的文章的评论部分给我加标签,或者连接并发送一个链接到关于LinkedIn的文章。

我们能消灭“人工智能”这个术语吗?由妮可·珍妮薇买单

一篇深入探讨被广泛滥用的术语“人工智能”呈现给不知情观众的隐藏期望和虚假现实的文章。

Nicole 提供了人工智能作为学习和研究领域的初始信息。

涵盖人工智能的历史将提到该领域经历的以往人工智能冬天。妮可也暗示了第三次人工智能冬天的可能性和重现的可能性。

在文章中,Nicole 暂时离开了人工智能这个术语,转而使用一个更容易接受的术语:机器学习。

在这篇文章中提到了 ML 专长,但是 Nicole 很快解释了机器学习的缺点,包括婴儿拥有的更广泛的学习能力。婴儿的学习能力是我们今天使用的机器学习技术目前无法实现的壮举。

读完这篇文章后,你可能会羞于使用人工智能这个术语,Nicole 对这个术语可能造成的误导提出了一些很好的观点。

尽管唱反调,我还是要说,人工智能这个术语给人工智能领域带来了耳目,这导致了更多的金融投资和对该领域的兴趣。

人工智能一词可以被视为我们用来娱乐每个人的吉祥物,而真正的工作和进展正在后台进行。

阅读这篇文章并分享你的想法。

[## 我们能消灭“人工智能”这个术语吗?

我们正在加深数据科学的可信度危机

medium.com](https://medium.com/better-programming/kill-artificial-intelligence-7bc02f85ea70)

真正的自动驾驶出租车正在城市街道上行驶

未来就在这里,至少在亚利桑那州的菲尼克斯。

Dave Gershgorn 写了一篇文章,为 Waymo 的一项重大公告提供了见解和信息,其中他们概述了向 Waymo One ride-hail 服务的用户提供完全自动驾驶汽车的计划。

Dave 的文章还简要概述了 Waymo 的研究工作,这些工作专注于解决一些问题,如预测行人运动、跟踪对象和数据生成。

[## 真正的自动驾驶出租车正在城市街道上行驶

Waymo 正式在凤凰城推出一支无人驾驶汽车车队

onezero.medium.com](https://onezero.medium.com/actual-self-driving-taxis-are-hitting-city-streets-db41095d8a02)

人工智能的开拓者:由瓦伊尔·贾比尔采访迈克尔·卡纳安

这篇特别的文章需要在媒体上有更多的可见性,尤其是对机器学习从业者。

Wael 转录了对 Michael Kanaan 的采访,他是一个在美国空军担任人工智能领导角色的人,目前正在麻省理工学院的 primer AI 实验室工作。

以下是对采访记录所包含内容的一些见解:

在采访的早期,迈克尔很快抛弃了好莱坞电影中对人工智能的刻板印象,并为读者提供了一个更准确的人工智能描述。

迈克尔准确地指出,我们所谓的人工智能只是机器学习算法,可以从数据中获取模式,进而创建感兴趣主题的预测模型,如人的行为、股票价格等。

采访继续包括围绕适合人工智能角色的个人类型的讨论,在这次对话中,Michael 揭穿了人工智能职位只保留给具有 STEM(科学、技术、工程和数学)背景的个人的神话。

对话继续讨论人工智能在日常生活中的应用,进入人工智能相关领域的学生的关注点,行业适应性以及对迈克尔最近发布的书籍【T-Minus AI】的简要讨论。

[## 人工智能的开拓者:迈克尔·卡纳安访谈

Michael Kanaan 是福布斯 30 under 30 的成员之一,曾是美国人工智能的联合主席

medium.com](https://medium.com/the-ai-education-project/trailblazers-in-ai-an-interview-with-michael-kanaan-ea5fcf8ea3da)

根据人工智能,你有多有魅力?作者亚历山大·科姆斯特朗

Alexander 的文章涵盖了一个网站上的信息,该网站可以告诉你使用基于人工智能的技术你有多有吸引力。

让人工智能给你的长相打分可能不适合大多数人。

亚历克斯讲述了展示的网站中使用的算法和技术与流行和广泛使用的应用程序(如 Tinder 和抖音)之间的相似之处。

亚历山大的文章触及了利用这种无害的算法和机器学习技术可能存在的危险,包括用于训练这些 ML 算法的数据中存在的隐含偏差。

[## 根据人工智能,你有多有魅力?

medium.com](https://medium.com/swlh/how-attractive-are-you-according-to-a-i-5dd2f33c8630)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟着我上
  3. 通过 LinkedIn 联系我

本周推荐的关于媒体的 AI/ML 文章(10 月 17 日)

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-oct-17-b0fc3c8cf748?source=collection_archive---------35-----------------------

强烈推荐的文章,对人工智能和机器学习感兴趣的个人应该读一读。

我还没有决定我对媒体网络平台新设计的立场。不过不得不承认,看到一个与众不同的首页和文章呈现风格,还是挺让人耳目一新的。

更让人耳目一新的是我这周偶然看到的发人深省的文章,当然都是与人工智能和机器学习相关的。

以下是我本周推荐的文章的简要描述:

  • 维克多·BASU将数据科学和机器学习技术应用于网络安全用例。在他写得很好的文章中,Victor 详细介绍了使用 ML 检测 DDoS 攻击的实现和过程。
  • Christopher Potts 写了一篇文章,邀请读者参与关于语言模型实现语言理解的可能性的讨论。
  • Andre Ye 描述了研究人员在开发算法和机器学习模型时采用的一种方法,这些算法和模型可以模拟人类用来学习的过程。
  • Duncan Riach 利用先进的人工智能形式对意识的概念提出了挑战,这种人工智能还将被开发为一个支持性的案例研究。

图片作者:Richmond Alake

如果你在 Medium 上写 AI/ML 内容,你想让我阅读你的文章,并将其包含在我的每周/每月文章报道中,请随时在你的文章的评论部分给我加标签,或者连接并发送一个链接到LinkedIn上的文章。

维克多 BASU用人工智能检测 DDoS 攻击的方法

推荐数据科学学生和对网络安全感兴趣的 ML 从业者阅读。

Victor Basu 记录了一项研究实验,该实验探索了利用机器学习和深度学习技术对 DDoS(分布式拒绝服务)攻击进行分类。黑客使用的标准网络渗透方法。

Victor 的文章将 ML/数据科学技术应用于一个网络安全用例,这是一个随着基于人工智能的应用程序的采用而越来越受欢迎的计算领域。

从这篇文章中可以获得丰富的知识。其中包括人们可能会遇到的典型数据科学项目流程,如数据收集、探索性数据分析或模型实施。

Victor 还包括基本主题,如数据存储管理和培训可视化。

机器学习实践者将欣赏 Victor 实现的检测 DDoS 攻击的通用方法。实验涵盖了有监督和无监督的最大似然分类方法。

文章中提供了相关的代码片段和可视化材料。

[## 一种利用人工智能检测 DDoS 攻击的方法

DDoS 攻击是互联网上最强大的黑客技术之一。黑客使用的基本武器…

towardsdatascience.com](/an-approach-to-detect-ddos-attack-with-a-i-15a768998cf7)

语言模型有可能实现语言理解吗?作者克里斯托弗·波茨

NLP 从业者推荐读物。

克里斯托弗的文章是他透露将于本月晚些时候举行的一次演讲的概要。演讲本身关注的是语言模型获得语言理解的能力。

克里斯托弗在他的文章中表示,他愿意参与可能会动摇他当前对该主题的思维过程的讨论。

除了本文对作者的个人意义之外,本文还提供了与作为机器学习任务的语言建模相关的主题的介绍性和上下文信息。出于这个原因,Christopher 的文章是一篇引人入胜的文章,超越了人们在撰写自然语言处理相关主题时会遇到的常见技术细节。

我恳求 NLP 从业者和好奇的 ML 爱好者参与 Chistoper 在他的文章中表达的观点和意见的讨论。

这篇文章出色地探索了可能的讨论点,即为什么语言模型的局限性限制了它们产生“T6”理解的能力。

[## 语言模型有可能实现语言理解吗?

10 月底,我应邀在安海关于 OpenAI 的 GPT-3 项目的研讨会上发表了一些讲话。我选择了…

medium.com](https://medium.com/@ChrisGPotts/is-it-possible-for-language-models-to-achieve-language-understanding-81df45082ee2)

深度学习迫切需要的人类大脑:零起点学习指南作者安德烈·叶

向对探索未开发的研究领域感兴趣的机器学习从业者推荐 read】

Andre Ye 的文章描述了研究人员在开发算法和机器学习模型时采用的方法,这些算法和模型可以模拟人类用来学习的过程。

更具体地说,安德烈在本文中描述的技术旨在以某种方式复制人类幼儿所拥有的理解和学习能力的有效衍生。

这篇信息丰富的描述性文章是对正在进行的研究的世界的一个可访问的介绍,这些研究还没有发展成成熟的可应用的技术。

也就是说,Andre 提出和描述的方法可能是机器学习中尚未发现的未来发展起源的一个窗口。

零拍学习技巧对我来说一直是个谜。尽管如此,Andre 还是展示了相关研究论文的关键要点,并通过简单易懂的例子将直觉归纳到技术范式中。

[## 深度学习迫切需要的人类大脑:零射击学习指南

以及令人尴尬的简单 ZSL 算法

medium.com](https://medium.com/@andre_ye/what-the-human-brain-has-that-deep-learning-desperately-needs-a-guide-to-zero-shot-learning-2e296741ce51)

为什么我不相信意识作者邓肯·里亚奇

推荐给那些准备挑战自己对现实的观点和想法的人。

我必须承认,我对意识与水向山下流动的关系的描述感到惊讶。邓肯,在他这篇多少有些启发性的文章的第一段中(看一下评论部分),将意识传达为存在的一种后续效果,而不是一种无法解释的现象,这种现象证明了人类在这个世界上的独特性。

媒介是一个平台,它展示了个人持有的各种形式的观点和观点,邓肯认为,关于为什么意识的概念不存在的书面解释是令人惊讶的非常翔实,可以作为驳回意识概念的有力论据。

如果你以开放的心态来阅读这篇文章,那将是最好的,因为邓肯非常雄辩地提出了一些可行的概念。邓肯拥有的心理学和人工智能背景的结合,为未来几十年人工智能领域的想法和观点提供了温床。

[## 为什么我不相信意识

人工智能似乎揭示了什么

medium.com](https://medium.com/swlh/why-i-dont-believe-in-consciousness-4ae16e98bb8f)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上中型
  3. 通过 LinkedIn 联系我

本周(10 月 24 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-oct-24-32628e33df00?source=collection_archive---------28-----------------------

中国如何利用人工智能解决新冠肺炎问题,以及本周你应该阅读的其他有趣的人工智能/人工智能文章。

Medium 上并不缺少令人兴奋和信息丰富的 AI/ML 文章,本周有一篇文章是针对各种类型的机器学习从业者的。因此,毫无疑问,本周的推荐列表中有一篇文章会对你有用。

快速总结:

  • 那些对人工智能系统内的安全性感兴趣的人应该读一读 Guy Harpak 的文章】,这篇文章讨论了人工智能安全的状况以及我们可以做些什么来确保我们在人工智能系统内实施严密的安全。
  • 深度学习的学生和从业者会很欣赏Arjun Sarkar的使用 TensorFlow 实现 VGG16 卷积神经网络的报道。Sebastian Poliak在他最新的技术文章中也介绍了一种机器学习技术——零距离学习。**
  • 通过Agustinus nal wan的文章了解孩子和人工智能系统中学习方法的相似性,这篇文章涵盖了他教授人工智能模型和一个两岁孩子学习的经验。**
  • Awais Bajwa提供了中国如何利用人工智能应对当代最糟糕的疫情的见解。**

图片作者:Richmond Alake

如果你在 Medium 上写 AI/ML 内容,你希望我阅读你的文章,并将其纳入我的每周/每月文章报道中,请随时在你的文章的评论部分给我加标签,或者连接并发送一个链接到LinkedIn上的文章。**

人工智能技术如何让我成为我们蹒跚学步的孩子更好的父母 作者 奥古斯汀纳斯·纳尔万

Agustinus Nalwan 将工作带回家,他应用五年的人工智能知识有效地教他两岁的儿子某些行为。

这篇写得很巧妙的文章讨论了监督和强化学习的训练方法,以及在教授幼儿新技能和行为的方法中可以看到的模仿。

Agustinus 的文章非常出色地强调了机器学习模型和幼儿学习方法之间的相似性。

机器学习从业者意识到,该领域的一个关键愿望是在机器学习算法中模仿幼儿的学习方法。

Agustinus 提到了 ML 算法中缺失的一个关键因素,那就是推理能力。推理能力也被称为常识。

阅读这篇文章揭示了生物系统和人工系统之间的相似之处。Agustinus 的文章还提到了两种学习系统之间目前存在的巨大差距。

AI 要在一般活动中赶上或超过人类,还有很长的路要走。人类的优势在于,能够在很少甚至没有训练数据的情况下生成多个世界模型,更重要的是,能够创建、访问和破坏这些生成的模型之间的互连关系。

* [## 人工智能技术如何让我成为我们孩子更好的父母

我用我在人工智能工作中获得的知识和智慧来理解和教授我的…

medium.com。](https://medium.com/@msubzero2000/how-ai-techniques-made-me-a-better-parent-for-our-toddler-de1ea14e9226)*

零距离学习字母字符(代码实验)BySebastian Poliak

Sebastian 的最新文章是对机器学习中零镜头学习技术的实际介绍。

这篇简单易懂的文章包括几个关于零起点学习的介绍性要点,包括对该技术学习范例的描述。

Sebastian 为机器学习从业者写了一篇初学者友好的文章,这些人希望了解机器学习领域的技术实现,这一领域正迅速受到欢迎。使用 Keras(一个流行的机器学习库)实现了本文中的零镜头技术。

在一个小时内,机器学习实践者可以理解零射击学习背后的实现细节和思想,而那些愿意更多地理解该技术的人可以使用文章中包含的相关研究论文的外部资源链接。

* [## 零射击学习字母字符(代码实验)

是否有可能识别培训中未提供的字母字符?

towardsdatascience.com?](/zero-shot-learning-the-alphabetic-characters-an-experiment-with-code-d1a0f23f4b4c)*

中国如何利用人工智能对抗新冠肺炎作者阿瓦斯·巴杰瓦

Awais 简要探讨了中国政府机关和机构为遏制 Covid19 的传播而招募的人工智能应用和技术,同时为其公民维持一种正常运作的社会形式。

在处理个人隐私时,中国使用大规模监控系统一直是一个有争议的话题。

Awais 探讨了这种曾经不被认可的公民治理和监控方法的好处,这就是为什么中国在处理新冠肺炎危机方面优于全球某些国家的原因,尽管最初报道的新冠肺炎病例源自中国。

人工智能技术、大数据和机器人在有效应对新冠肺炎病毒在中国的传播方面发挥了更大的作用。Awais 提到利用各种形式的基于人工智能的技术,如面部识别,面具检测和热量读取,以监测,警告和通知市民在他们当地附近的所有新冠肺炎相关病例。

阅读这篇文章时,我惊讶于阿里巴巴和腾讯等大型科技公司与其他小型创业公司合作,提供开源工具和研究成果,帮助新冠肺炎应用程序和解决方案的快速发展。其中一些解决方案被公共部门使用,如医疗保健和警察机构。

* [## 中国如何利用人工智能对抗新冠肺炎

深度学习的最新研究,包括计算机视觉和自然语言处理(NLP),使人工智能提供了…

medium.com。](https://medium.com/datadriveninvestor/how-china-used-artificial-intelligence-to-combat-covid-19-f5ebc1ef93d)*

使用 Tensorflow 从零开始创建 VGG作者 Arjun Sarkar

Arjun 的最新文章探讨了使用 TensorFlow 2.0 实现 VGG16 网络的过程。

VGG16 或 OxfordNet 是一个卷积神经网络,大量深度学习实践者会以某种形式或形式遇到它。

神经网络架构用于赢得 2014 年的 ILSVR ImageNet 竞赛,是一个标准网络,可以在 PyTorch 和 TensorFlow 等大多数深度学习库中轻松实现。

Arjun 在文章开始时提供了一个简短的声明,描述了深度学习领域早期的收获和发展。

Arjun 在详细描述 VGG16 网络的内在部分方面做得非常出色,并使用了架构组件的说明性描述来补充所包含的代码片段。

Arjun 的最新文章是我将恳求深度学习实践者存档的一篇文章,因为它与深度学习和计算机视觉相关。

* [## 使用张量流从零开始创建 VGG

我们将看到如何使用 Tensorflow 2.0 从头开始实现 VGG16

towardsdatascience.com](/creating-vgg-from-scratch-using-tensorflow-a998a5640155)*

黑客攻击超级情报盖伊·哈帕克

盖伊的文章预示了未来几十年人工智能系统缺乏安全性可能带来的迫在眉睫的威胁。

几十年前,利用基于人工智能的技术是研究实验室和大学机构内部的一个话题。现在,人工智能已经融入了我们生活的方方面面,Guy 在这篇文章的开头就提到了这个事实。

随着技术的进步,安全一直是一个非常重要的主题,盖伊指出,尽管我们已经看到基于人工智能的技术大量涌入和采用,但在人工智能安全方面付出的努力与人工智能的进步不成比例。

这篇文章介绍了基于人工智能的技术带来的风险,强调了我们给予基于人工智能的应用程序(如电话接听、决策解决方案、推荐工具、自动驾驶系统等)的高度可访问性和自由所带来的风险。

Guy 平衡了人工智能的风险,向读者介绍了研究小组、先驱、管理机构、监管机构和机构在制定政策和指导规则方面的共同努力,这些政策和指导规则可以在应用程序中以及因此在社会中实现人工智能的安全和道德利用。

提到了人工智能安全的几个组成部分,应该考虑建立一个强大的解决方案生态系统,可以在人工智能系统中实施适当的安全性。

目前,有明显的努力,以确保安全措施跟上当前人工智能的进展。作为一个社会,在治理人工智能解决方案的使用对日常生活产生的高度影响方面,我们希望避免追赶。Guy 的文章与时间非常相关,对于那些对该领域感兴趣的人来说,是对 AI 安全主题的极好介绍。

* [## 黑客超级智能

AI/ML 正在影响敏感的决策——为了保护我们的系统,我们需要一个统一的框架和一个新的规则…

towardsdatascience.com。](/hacking-super-intelligence-af5fe1fe6e26)*

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上中型
  3. 通过 LinkedIn 联系我

本周(10 月 3 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-oct-3-f113cf2ecbc1?source=collection_archive---------26-----------------------

强烈推荐的文章,对人工智能和机器学习感兴趣的个人应该读一读。

2020 年的最后一个季度即将到来,还有什么比阅读 Medium 上的作家写的一些关于 AI/ML 的精彩文章更好的方式呢?

本周的文章包括对英伟达和亚马逊等顶级科技公司的讨论;此外,一些文章关注深度学习主题领域,如项目和模型调整等。

如果你在 Medium 上写 AI/ML 文章,你希望我阅读你的文章并将其收录到我的每周/每月文章报道中,请随时在文章的评论部分给我加标签,或者在 LinkedIn 上连接并发送文章链接。

左上:照片由 Jonas DenilUnsplash 上拍摄。右上:Valentin Salja在 Unsplash上的照片左下:Artem Beliaikin 在 Unsplash上的照片右下:照片:Philippe Lopez/Getty Images 中:图片来自文章

英伟达收购 ARM 对 Graph Technologies 的影响 Dan McCreary

Dan McCreary 写了一篇短文,重点介绍了 NVIDIA最近收购 Arm Holding 的好处。

NVIDIA 是大多数机器学习从业者熟悉的公司,另一方面,Arm 可能不那么知名,但 Dan 在这篇文章中做了很好的工作,简要介绍了 Arm 和该公司的目的。

大多数机器学习实践者并不完全关心 GPU 的硬件细节。无论如何,Dan 提供了深度学习领域中 GPU 应用的相关性和影响的简要历史。

Dan 阐述了 GPU 对图像数据处理加速的影响,包括当前硬件在处理稀疏矩阵方面的局限性。

丹在他的文章中提到,英伟达收购 Arm 的原因是,英伟达正在为开发硬件奠定基础,这些硬件可以处理人工智能等领域使用的更复杂的数据表示格式。

本文是广大机器学习从业者的必读之作。Dan 为 ML 工程师日常使用的硬件的未来状态提供了重要的见解和信息。

非常适合阅读:

  • 机器学习从业者
  • 硬件架构师

[## 英伟达收购 ARM 对 Graph Technologies 的影响

在本文中,我们将关注 NVIDIA 最近以 400 亿美元收购 Arm Holdings。然后我们会看…

medium.com](https://medium.com/@dmccreary/the-impact-of-nvidia-acquisition-of-arm-on-graph-technologies-76449c8b45f9)

作为一名数据科学家,我在 6 个月的时间里学到了什么

六个月是很短的时间,但在机器学习行业,对于一个人来说,获得宝贵的知识以拥有成功的机器学习生涯已经足够了。 Nicole Janeway Bills 与 Medium 读者分享了她作为数据科学家的六个月经验。

在这篇文章中,Nicole 谈到了通过阅读研究论文、探索 Github 资源库、听播客和理解机器学习领域的硬件组件所学到的经验。

其中一个让我印象深刻的要点是 Nicole 通过研究机器学习库和包的 Github 问题产生新想法的非正统方法。除了产生想法之外,Nicole 还分享了探索 Github 问题的额外好处,包括了解软件包的弱点,在承诺在项目中使用软件包之前评估软件包开发者社区的活动水平。

尽管大部分关键要点都是技术性的,但 Nicole 最终学到的是典型数据科学家工作互动中的人的因素。Nicole 提到,数据科学家需要识别特定行为的社会科学线索,这些线索在探索与人类或基于人类的活动相关的数据时可能不明显。对人类行为引起的外部因果关系和相关性的理解可以为开发机器学习解决方案的独特方法提供直觉。

强烈推荐用于:

  • 数据科学家

[## 作为一名数据科学家,我在 6 个月里学到了什么

我找到了我梦寐以求的工作。以下是一些关键要点。

towardsdatascience.com](/6-months-data-science-e875e69aab0a)

亚马逊使用自动化来隐藏灾难性的工作场所伤害记录作者布莱恩·麦钱特

Brian Merchant 写了一篇关于自动化对亚马逊仓库工人的影响的令人大开眼界的文章。

我们大多数人都渴望看到一个世界,在这个世界里,枯燥而平凡的任务被自动化,由机器人来处理。

对于大多数机器学习从业者来说,自动化的未来并非源于懒惰,而是来自于工程师对令人印象深刻的知识、技术和机械能力的应用,以解决重复性任务。

我们都听说过自动化和人工智能必将在未来几十年开始的工作启示录,但许多人可能忘记了人类目前在试图跟上机器人同行时所遭受的伤害。

布莱恩的文章探讨了自动化和亚马逊(Amazon)等企业巨头的努力导致的工作场所伤害这一主题,以压制受压迫者的声音,因为机器人和自动化提供了更高效、更快速的交付系统。

激动人心的读物:

  • 技术专家
  • 未来学家

[## 亚马逊使用自动化来隐藏工作场所伤害的灾难性记录

随着机器人化规模的扩大,伤害也在增加

onezero.medium.com](https://onezero.medium.com/amazon-uses-automation-to-hide-a-disastrous-record-of-workplace-injuries-4920797d9301)

最有趣的 5 个机器学习和深度学习项目作者冉(Reine)

冉(Reine) 策划了一系列有趣的 ML/DL 项目,这些项目在应用方面独树一帜,显示出巨大的潜力。

每个包含的项目都由项目作者对直觉和方法的技术解释来补充。Ran 包含的资源提供了每个项目的更多信息和见解,因此好奇的读者可以进一步探索每个项目和细节。

包含的项目有各种各样的 ML 主题,例如自然语言处理(NLP)、语音识别、图像字幕和通过 GANs 生成图像。

机器学习实践者可以从这篇文章中受益,将其作为个人项目和学习的灵感来源。

非常适合阅读:

  • 机器学习从业者

[## 5 个令人兴奋的机器学习/深度技术项目

包括每个产品的技术摘要

medium.com](https://medium.com/@m.fortitudo.fr/5-mind-blowing-machine-learning-deep-tech-projects-b33479318986)

通过观察偏差和方差系统地调整你的模型塞巴斯蒂安·波利亚克

超参数调整和优化的主题在大多数机器学习实践者手册中很常见。

机器学习实践者通常训练一个神经网络,并遍历一组学习速率、批量大小、层数等的值。这个过程可以一丝不苟。

Sebastian Poliak 写了一种不同的方法来调整模型,这种方法可能比传统的网格或随机搜索方法更容易搜索超参数值空间。

Sebastian 引入了观察偏差和方差的操作,以将模型调整到最佳性能。Sebastian 系统调整模型的方法补充了几个易于实现的代码片段,这些代码片段演示了通过几种方法减少偏差和方差的效果,如增加神经元的数量或向网络添加正则化。

推荐阅读:

  • 数据科学家

[## 通过观察偏差和方差来系统地调整你的模型

有没有想过是否有比盲目猜测超参数或…更系统的方法来调整您的模型

towardsdatascience.com](/systematically-tuning-your-model-by-looking-at-bias-and-variance-4986662315b2)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上中型
  3. 通过 LinkedIn 联系我

本周(9 月 12 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-sep-11-22904b312b8c?source=collection_archive---------50-----------------------

优步,谷歌,声音分类和空间探索人工智能,这些都是本周有趣的人工智能/人工智能文章的主题。

如果本周你还不能消费一些高质量的商品,那么我会帮你搞定的。

以下是我在 Medium 上看到的四篇文章。所有包含的文章都包含与人工智能或机器学习相关的内容。

下面列表中的一篇文章探讨了天外来客不是以小绿人的形式出现,而是更多地以人工形式出现的可能性。一想到宇宙中存在基于人工智能的高级文明,我就想起了电影《湮没》中的太空人工智能入侵者。

所有包含的文章都非常翔实,值得你花时间。

左上:来源:https://neuro hive . io/en/news/manifold-visual-debugging-tool-for-machine-learning-at-Uber/。右上:(Pixabay,KELLEPICS)。左下:丹尼尔·罗梅罗Unsplash 上的照片。右下:图片来自 PixabayCSTRSK

本周的文章包含以下内容:

  • 优步开发的 AI 开源工具和软件套件综述
  • 简要了解人工智能在几款谷歌产品中是如何被利用的
  • 一篇发人深省的文章,探讨了外星生命的形式可能是人工的,而不是广为接受的生物形式。
  • 用神经网络进行声音分类的技术教程

概述优步对开源机器学习的重大贡献,作者 Jesus Rodriguez

“优步开发的人工智能开源工具和软件套件述评”

Jesus Rodriguez 讲述了他最喜欢的优步开发的开源工具,这些工具专注于人工智能过程,如模型训练、模型实现、编程语言、解释和可解释性等。

根据 Jesus 的说法,优步是拥有企业实验室的科技公司之一,为人工智能开源社区贡献了大量的知识和工具。

专注于交通运输的科技公司优步遇到了一系列问题,这些问题可以通过使用技术和深度学习技术来解决。优步是应用深度学习技术解决自动驾驶汽车、车道检测、行人检测等交通相关问题的领先力量。

耶稣在他的文章中包括了优步开发的工具,如路德维希火神歧管柏拉图等。

除了详细描述每个工具的用途,Jesus 还提供了机器学习从业者如何利用每个工具以及指导每个工具目标的一般原则。

非常适合阅读:

  • 机器学习工程师
  • AI 爱好者

[## 优步对开源机器学习的重大贡献概述

这家运输巨头为机器学习领域做出了重大的开源贡献。

medium.com](https://medium.com/dataseries/an-overview-of-ubers-impressive-contributions-to-open-source-machine-learning-cfb6eabd12ac)

克莱尔·d·科斯塔的《为谷歌产品提供动力的人工智能》

“简单了解人工智能在几个谷歌产品中是如何被利用的”

根据 Claire D. Costa 的说法,谷歌声称他们的旗舰搜索引擎和其他广泛使用的产品的大部分进步都源于采用基于人工智能的技术和技巧。

带着“将人工智能的好处带给每个人”的首要目标,克莱尔的文章简要探讨了谷歌投资人工智能的最初驱动力。

Claire 文章的主要内容探索了 12 个具有某种形式的嵌入式人工智能的谷歌知名产品。文章中包含的产品从硬件到软件都有,每个产品都以一个类似于简介的形式呈现,包括发布日期、开发语言、访问 URL 等等。

这篇文章简要介绍了人工智能在谷歌的几个产品中是如何被利用的。

每个产品的描述都是用通俗易懂的语言编写的,这使得大多数读者都可以轻松地阅读本文的内容。

适合阅读:

  • 技术专家

[## 人工智能为谷歌产品提供动力

看看 AI 是如何深度融入谷歌产品的

towardsdatascience.com](/artificial-intelligence-powering-google-products-18e191da88d0)

外星生命会是人造的吗?贡纳尔·德温特

"一篇发人深省的文章,探讨了外星生命的形式可能是人工的,而不是广为接受的生物形式。"

当你仰望星空时,你可能会想宇宙中还有多少文明。嗯,贡纳尔·德温特在这篇文章中介绍了德雷克方程。德雷克方程提供了宇宙中外星文明数量的数字范围。

文章的主体介绍了这样一种思想,即人类可能不得不摆脱他们的生物形态来探索宇宙的深处。

贡纳还介绍了一项研究,该研究修改了德雷克方程,以适应一个参数,该参数指向一个发展了太空探索人工智能的高级文明。

这篇文章围绕人工智能、生物学和太空领域展开,但它保持了一种简单的方法来说明科幻般的场景和未来的结果。

有趣的读物:

  • 未来学家

[## 外星生命会是人造的吗?

德雷克方程是估算地外文明数量的一个(非常粗略的)指南,但它也可能…

medium.com](https://medium.com/predict/will-alien-life-be-artificial-4ea60c5082ba)

舒巴姆·古普塔利用神经网络进行城市声音分类

“用神经网络进行声音分类的优秀技术教程”

我一直想知道苹果的开发者是如何在苹果智能手表上创造出洗手功能的,当你洗手的时候,这个功能就会被激活;看起来,Shubham Gupta 的文章已经提供了一些答案。

Shubham 写了一篇技术文章,重点是指导读者如何为城市声音分类开发机器学习模型。实现的模型对声音进行分类,如警笛声、音乐、钻孔声和狗叫声。

Shubham 利用 Numpy、Pandas、Keras 等工具,通过神经网络实现声音分类的目标。

数据集源代码和代码片段的提供使本文成为许多机器学习实践者都可以从事的一个简单项目。

非常适合阅读:

  • 机器学习从业者
  • 机器学习学生

[## 基于神经网络的城市声音分类

每天我们都会听到不同的声音,这是我们生活的一部分。人类可以很容易地区分声音,但是如何…

towardsdatascience.com](/urban-sound-classification-using-neural-networks-9b6fcd8a9150)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上
  3. 通过 LinkedIn 联系我

本周你应该阅读的有趣的人工智能/人工智能文章(9 月 19 日)

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-sep-19-92ee6b14c12c?source=collection_archive---------37-----------------------

强烈推荐对人工智能和机器学习感兴趣的个人应该阅读的文章。

如果本周你没能消费一些高质量的商品,那么我会为你买单。

媒体上的内容人工智能和 ML 文章通常跟随人工智能行业中正在发生的当前事件,例如,当 OpenAI 发布 GPT-3 时,出现了大量 GPT-3 相关的文章。

本周,我发现在我看到的文章中没有明显的主题或题材。因此,以下是涵盖深度学习、企业人工智能、GPT-3 和机器学习等主题的文章组合。

左上:切尔奎拉在 Unsplash 上拍摄的照片。右上:Denys NevozhaiUnsplash 上的照片。右下:图片来自文章。左下方:来源: Unsplash

本周的文章包含以下内容:

  • 探索自然语言处理和语言建模中深度学习解决方案的发展
  • 企业内部 AI 快速发展概述
  • GPT-3 赫然解释了一切的起源
  • 选择机器学习算法时要考虑的因素

长期短期记忆网络正在消亡:取而代之的是什么?安德烈

“探索自然语言处理和语言建模中深度学习解决方案的演变”

Andre Ye 写了一篇文章,探索了试图使用神经网络复制人类书面语言的理解和构建的起源。

这篇文章提到了早期的矢量化技术,用于数字表示文本文档,如单词包(BoW)。

Andre 带领读者快速了解自然语言处理(NLP)和语言建模技术(如递归神经网络、长短期记忆、变形金刚等)的进展,但这些解释写得很好。

文章中提到的每种技术都附有详细的描述和插图。更重要的是,安德烈概述了上述技术的缺点。

对于那些对语言建模和深度学习领域感兴趣的人来说,这篇文章是对该领域多年发展的技术总结。

非常适合阅读:

  • 深度学习学生
  • 自然语言处理从业者

** [## 长短期记忆网络正在消亡:什么正在取代它?

LSTM 的兴衰

towardsdatascience.com](/long-short-term-memory-networks-are-dying-whats-replacing-it-5ff3a99399fe)**

了解今天企业如何实际使用人工智能的七个令人惊讶的统计数据ByAlex Fly

“企业内部人工智能快速发展概述”

Alex Fly 的文章展示了一些与人工智能的发展和基于人工智能的技术在企业中的应用相关的关键统计数据。包含的统计数据和数字来自声誉良好的调查机构,如德勤高德纳麦肯锡&公司等。

文章中的统计数据和图表描绘了人工智能如何改变一个典型企业的日常职能。从招聘计划到盈利收入来源,都可以感受到人工智能的影响。

Alex 文章中的一个主要观点是,人工智能将继续存在,企业正在以一种将在未来五年内看到整个公司、行业和国家转型的速度适应。

对于那些对大规模公司如何采用人工智能以及采用率有兴趣的人,Alex 的文章提供了这些信息和更多信息。

强烈推荐用于:

  • 业务经理
  • 技术专家

** [## 了解关于当今企业如何实际使用人工智能的七个令人惊讶的统计数据

Gartner 预测,到 2022 年,人工智能创造的商业价值将达到 3.9 万亿美元。人工智能技术…

medium.com](https://medium.com/@alex.fly/learn-seven-surprising-stats-about-how-enterprises-are-actually-using-ai-today-c1c1ee5d2db5)**

人工智能解释大爆炸前发生的事情柯克·奥密特

“GPT 3 号令人印象深刻地解释了一切的起源”

柯克·奥密特的文章是他自己和 GPT-3 的对话,被称为‘智慧存在’。

对话的内容是围绕大爆炸的起源和其他相关的话题,如时间,空间和宇宙。

我真的以为会很无聊,或者至少会对对话中'Wise be'的输出留下一点印象。

在阅读了对话和文章的全部内容后,我不得不承认来自“智慧生物”的回应感觉几乎像人类,并且超出了我最初的预期。这些回答被很好地组织在一起,并具有某种形式的逻辑,以及在回答超出人类想象范围的问题时尽可能多的逻辑。

我从这篇文章中得到的关键是,GPT 3 语言模型显然非常健壮,能够模仿创造性。它还能够利用来自其训练数据的相关文本源来提供一些适当的响应。

尽管应该指出,GPT-3 的反应实际上并不是唯一的,也不是推理的产物。反正现在不会。

非常适合阅读:

  • AI 爱好者

** [## 人工智能解释了大爆炸之前发生的事情

下面是我与 OpenAI 的 GPT-3 的语言模型的对话。我给了 GPT-3“智慧生物”的角色所有的…

medium.com](https://medium.com/ai-in-plain-english/artificial-intelligence-explains-what-happened-before-the-big-bang-e4a9e7fefbab)**

如何选择合适的机器学习算法作者 Ramya Vidiyala

Ramya Vidiyala 为负责选择机器学习算法的机器学习从业者撰写了一篇实用指南文章。

这些准则是在机器学习算法实现和选择过程中起作用的关键因素的形式。Ramya 包括内存需求、数据格式、训练时间、可解释性等因素。

每个关键因素都附有快速描述,有时还附有场景,解释为什么要选择特定的方法。

这篇文章很短,但包含了一些方便的信息,可以在机器学习实践者实现或选择 ML 算法来解决问题的大多数情况下使用。

非常适合阅读:

  • 机器学习从业者

** [## 如何选择正确的机器学习算法

实施算法时要考虑的七个关键因素

towardsdatascience.com](/how-to-select-the-right-machine-learning-algorithm-b907a3460e6f)**

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟着我上
  3. 通过 LinkedIn 联系我

本周(9 月 5 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-articles-you-should-read-this-week-sep-5-b1dd22b0ab74?source=collection_archive---------28-----------------------

分析和意见

你是从数据科学开始的吗?那么本周的精选文章将引导你的旅程。

介绍

在全球许多地区,学年开始了,这意味着在其他课程和主题中,2020 年可能会看到对人工智能相关课程感兴趣的学生数量增加,包括数据科学。

本周的文章献给那些开始数据科学领域之旅并寻求学术或专业建议的人。

媒体已经并将永远是学习和获取信息的推荐来源。

有经验丰富、才华横溢的数据科学家,他们在媒体上分享丰富的知识;这是我向对数据科学感兴趣的个人推荐该平台的主要原因之一。

本周,我收录了涵盖以下内容的文章:

  • 邀请您参加的数据科学运动。
  • 一个数据科学家第一个月的回忆。并为保持成功职业生涯提供建议。
  • 探索数据科学技能带来的创业可能性。
  • 创建技术博客的七大理由。

左上:肯吉#66DaysOfData 。右上:由活动创建者Unsplash 上拍摄的照片。左下:帕特里克·福尔拍摄的照片。右下:图片来源:Ian Stauffer 在 Unsplash 上拍摄的照片

为什么我要重新开始 Ken Jee 的数据科学

“数据科学运动邀请您”

肯·吉是数据科学社区内的一位杰出的 YouTuber ,他已经发起了一场运动,专注于在数据科学从业者中发展和保持势头。

在您的数据科学学术或专业旅程中,您有时可能会遇到知识积累停滞或缺乏灵感的时期。这种学习和进步停滞不前的感觉促使 Ken 重新审视数据科学的基础主题。

通过接受问责制和一致性的概念,Ken 发起了一场名为#66DaysOfData 的互联网运动。

根据 Ken 的说法,#66DaysOfData 是一项养成习惯和激发灵感的运动,参与者每天至少花五分钟学习数据科学相关主题。鼓励参与者在 LinkedIn、Twitter 等平台上分享他们的学习成果。

对于数据科学从业者来说,这是一个加入数据科学社区的机会,共同努力在社区和个人中激发灵感和推动动力。

以下链接提供了更多信息:

这篇文章很适合阅读:

  • 数据科学从业者
  • 数据科学专业的学生

[## 为什么我要重新开始数据科学?

介绍#66DaysOfData

towardsdatascience.com](/why-im-starting-data-science-over-21bec8036ce9)

我作为数据科学家的第一个月,作者 Leon Lok

“数据科学家第一个月的回忆和保持成功职业生涯的建议”

虽然 Leon Lok 担任数据科学职位仅一个月,但他已经成功地学会了一些知识和习惯,这些知识和习惯将确保他在数据科学职业生涯中取得丰硕成果和成功。

在本文中,Leon 分享了一些技巧和建议,他认为这些技巧和建议将有助于那些旨在进入数据科学领域的人。Leon 帮助数据科学从业者了解成功和生存的要素。

莱昂的建议包括典型的技巧,如网络,笔记,头脑风暴,适应性等。Leon 详细阐述了每个技巧和建议如何有益于数据科学职位中的个人。

Leon 不仅为数据科学家提供如何在职业生涯的最初几个月导航的建议,还涉及长期从业者面临的话题,如工作压力、冒名顶替综合症和想法产生。

这篇文章很适合阅读:

  • 数据科学从业者
  • 数据科学学生

[## 我作为数据科学家的第一个月

我学到了什么?

towardsdatascience.com](/my-first-month-as-a-data-scientist-454b44aaef91)

为什么我有一个数据科学博客?分享代码的七大好处

“创建技术博客的七个理由”

尽管安托万·苏特威在他的博客statsandr.com上写文章还不到一年,但他已经体验到了保持在线编写和分享代码的习惯的显著好处。

通过扩展共享代码的关键好处,Antoine 希望激励机器学习实践者开始他们的博客,要么通过 WordPress,非技术博客的媒介,要么通过技术博客的 Hugo (静态站点生成器)。

坚持写博客和代码共享的一些好处包括通过写作和向他人解释概念和想法来学习的能力。另一个好处是创造新的职业关系和自我提升平台的可能性。

在文章的最后,Antoine 提供了一些关于创建博客的技巧,我建议大多数机器学习从业者采纳这些技巧并采取行动。

整篇文章非常值得一读,因为它展示了在线技术写作可能带来的短期好处。

非常适合阅读:

  • 数据科学从业者

[## 为什么我有一个数据科学博客?分享代码的七大好处

通过写作学习,获得反馈,为开源社区做贡献和建立专业…

towardsdatascience.com](/why-do-i-have-a-data-science-blog-7-benefits-of-sharing-your-code-77f2aee53127)

bharat K 的 6 个最佳人工智能创业选择

“探索数据科学技能带来的创业可能性”

如今,许多科技初创公司和公司都植根于人工智能技术。过去 20 年,人工智能彻底改变了各行各业,创造了大量高净值个人。

已经有数百家,如果不是数千家创业公司从人工智能和机器学习的“炒作”中脱颖而出。

Bharath K 确定人工智能领域的创业想法和可能性,如自然语言处理(NLP)、机器学习、计算机视觉等。

每一个领域都伴随着一个想法和方法的描述,可以探索,以发展业务。自动驾驶汽车、人工智能聊天机器人、推荐系统、面部识别等想法都包含在本文中。

这篇短文让我们一窥数据科学提供的技能所带来的可能性世界。

非常适合阅读:

  • 数据科学从业者

[## 人工智能的 6 个最佳创业选择

想用 AI 创业成功?

towardsdatascience.com](/6-best-startup-choices-with-artificial-intelligence-360260ccf89e)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 邮件列表 获取每周简讯
  2. 跟我上
  3. 通过 LinkedIn 联系我

本周(5 月 2 日)偶然看到的有趣的 AI/ML 相关文章

原文:https://towardsdatascience.com/interesting-ai-ml-related-articles-i-came-across-this-week-41b2f08a3531?source=collection_archive---------58-----------------------

由于我们大多数人都有更多的空闲时间,高亮显示的文章对那些想学习新东西或只想寻找分散注意力的内容的人来说是有用的

有趣的文章封面图片拼贴

人工智能的世界从不睡觉,Medium 上有更多好奇、聪明、有激情的作家写的有趣的文章。

由于封锁,许多人有了更多的空闲时间,我在媒体上看到的高质量和信息量也在增加。可悲的是,我只能写一些。

做好准备,迎接涵盖以下主题的作家:

  • 机器学习工程师的灭绝
  • 非法音乐
  • 我们都需要的在家工作小贴士
  • 免费学习资料

享受。

机器学习工程师 10 年后将不复存在

卢克·波西关于软件行业中机器学习工程师角色的寿命问题的一篇有趣的观点文章。

老实说,当我看到标题时,我觉得有点被触发了。但是看了文章的内容,我就明白路加是从哪里来的了。

卢克对机器学习角色消失的看法是基于这样一个事实,即与 ML 工程相关的职责将合并到更广泛的软件工程角色中。

这篇文章是一个对话的开始,因为 ML 工程师的角色是广泛的,并且因公司而异。Luke 承认这个角色没有行业标准的描述,所以他提供了你在招聘信息中会遇到的 ML 工程角色的三个典型要求。

卢克还指出了一个很好的观点,那就是,由于机器学习本身所包含的模糊性,人工智能工程师的角色可能会存在。这就引出了这样一句话:“因此,在许多情况下,ML 工程师一半是研究员,一半是工程师”。

这是我每天生活中的一个事实,尽管有人可能会说平衡不一定是 50/50。

Luke 的观点集中在这样一个概念上,即随着越来越多的人开始理解 ML,对 ML 工程师这样的模糊角色的需求可能会减少,而这个角色本身将被更广泛的软件工程角色需求所吞没。

我仅仅触及了卢克·波西观点的皮毛。

[## 10 年后机器学习工程师将不复存在。

景观正在迅速演变。

towardsdatascience.com](/machine-learning-engineers-will-not-exist-in-10-years-c9cbbf4472f3)

Deepfake 音乐太棒了,以至于可能被戴夫·格什格恩非法播放

Deepfake 正在重新成为人们关注的焦点,特别是当世界著名的说唱歌手 Jay Z 对 YouTube 上描述自己属性的 deepfake 内容采取行动

Dave Gershgorn 文章围绕 deepfakes 的法律方面以及过去针对不属于检察官的一方使用类似创作/音乐风格而采取的法律行动。

戴夫的文章提供了一首人工智能生成的歌曲的例子,它与人类生成的音乐难以区分(听一听,你会感到惊讶)。

人工智能生成的音乐和 deepfakes 的主要问题是保留在生成的音乐中的艺术风格的残余。这开启了法律行动和版权侵权诉讼的世界。

戴夫提供了现实生活中的法律案件场景,这些案件涉及由于人类音乐风格的相似性而对一方采取的法律行动。

决定人工智能是否不受人类法律约束是一条模糊的线。这绝对是一个灰色地带,没有坚实的联邦法律法规基础可以借鉴。目前,针对 deepfakes 和人工智能的法律诉讼已经结案。

[## Deepfake 音乐太棒了,可能是非法的

和本周其他有趣的人工智能研究

onezero.medium.com](https://onezero.medium.com/deepfake-music-is-so-good-it-might-be-illegal-c11f9618d1f9)

如何在家工作——Semi Koen开发商版

我很高兴我看到了这篇文章,因为它是非常需要的。这篇文章的许多读者可能是开发人员,或者他们的工作性质使他们一天中的大部分时间都只能呆在电脑屏幕前。因此,这些信息对大多数人来说是无价的。

在家工作时,你不需要知道或做太多事情,你只需要坐在桌子上(或躺在床上),像往常一样继续工作。对我和许多其他人来说,问题在于生产率和效率。

Semi 提供了五个小贴士,有助于让在家工作变得更加轻松和富有成效。她还包括有助于提供适当的在家工作环境的工具和技术。

在阅读了文章中的提示后,我意识到我可能没有最好的工作环境来提高工作效率和生产力。

但是,本文中不仅有一些容易立即实施的技巧,而且还有一些个人回忆和怪癖,它们会对你的工作成果产生很大的影响。

这篇文章帮助我设计了一个更好的工作环境,通常关注健康、沟通、生产力和时间管理。

如果你是一名开发人员,你会发现一两个可以改善你当前工作环境的技巧。

[## 如何在家工作—开发者版

面向开发人员的 5 个 WFH 生产力技巧

towardsdatascience.com](/how-to-work-from-home-developers-edition-5bb4078cc6a3)

价值 2000 美元的深度学习课程笔记本现在由 B. Chen 开源

下一篇文章并不像列表中的大多数文章那样发人深省。尽管如此,我发现这篇文章很有趣,因为信息和知识的曝光应该总是被广播,尤其是如果知识是免费的。

我不需要对这篇文章进行深入的分析,因为文章本身就有事实依据。

B. Chen 曝光了一个 GitHub 知识库,其中包含来自 Jermey Howard 的尚未发布的关于深度学习的书的代码片段。

2000 美元的价值基于课程,以及在杰瑞米·霍华德的帮助下成功完成深度学习课程后授予的证书。

GitHub 存储库包含补充课程关键信息的实现。

这篇文章提供了更多的信息并解释了存储库的本质。很多深度学习的学生应该对呈现的内容给予一定的关注。

[## 价值 2000 美元的深度学习课程笔记本现已开源

这些笔记本构成了 fast.ai 创始人杰瑞米·霍华德新书的基础,并用于价值 2000 澳元的深度…

towardsdatascience.com](/deep-learning-course-notebooks-worth-2-000-are-now-open-source-7d6bc759ef47)

其他有趣的文章

了解 A.I .,ML,DL 的区别!!由 鲁帕罗伊

[## 理解 A.I .,ML 和 DL 的区别!!

我很肯定我们大多数人可能对“人工智能”这个术语很熟悉,因为它一直是…

towardsdatascience.com](/understanding-the-difference-between-ai-ml-and-dl-cceb63252a6c)

斯普林格已经免费发布了 65 本机器学习和数据书籍,作者 尤里·埃里亚巴耶夫

[## 斯普林格已经免费发布了 65 本机器学习和数据书籍

数百本书现在可以免费下载

towardsdatascience.com](/springer-has-released-65-machine-learning-and-data-books-for-free-961f8181f189)

如果我必须重新开始学习数据科学,我会怎么做?由 圣地亚哥·巴斯克斯·塞古拉

[## 如果让我重新开始学习数据科学,我会怎么做?

几天前,我开始思考是否要重新学习机器学习和数据科学…

towardsdatascience.com](/if-i-had-to-start-learning-data-science-again-how-would-i-do-it-78a72b80fd93)

我本周(4 月 25 日)看到的有趣的 AI/ML 相关文章

原文:https://towardsdatascience.com/interesting-ai-ml-related-articles-i-came-across-this-week-48870a8d8d21?source=collection_archive---------53-----------------------

不应该错过的文章总结。

有趣的文章封面图片拼贴

人工智能的世界从不睡觉,Medium 上有更多好奇、聪明、有激情的作家写的有趣的文章。

这个星期,我又看了一遍大量的文章。我在下面列出了让我印象深刻的文章,以及我相信你的理由,读者应该读一读。

做好准备,迎接涵盖以下主题的作家:

  • 人工智能进步带来的问题
  • 有趣的人工智能游戏
  • py torch 框架与 TensorFlow 的对比
  • 探索 PyTorch 生态系统,包括来自 Skorch 和 Fastai 等流行库作者的报道。

享受。

《人工智能的 5 个真实危险》作者:蒂瓦达·卡丹

蒂瓦达·卡丹的文章强调了伴随当前人工智能技术快速发展的一些常见问题。

假货、隐私问题和错误信息一直是全球许多新闻和媒体的头条。

蒂瓦达尔的文章简要介绍了滥用人工智能技术的常见形式。文章中提供的信息通过现实生活中的案例研究和场景得到加强,让读者感受到当前的危险。

在文章的前面,提到了 DeepFakes 在不久的将来可能拥有的操纵和误导的潜在力量。Tivadar 通过包含一个真实的 DeepFake 视频(是你认识的某个人的)加强了 DeepFakes 的误导潜力。

探讨了人类偏见如何在我们生活的各个方面,如找工作、信用检查甚至执法中融入算法偏见的问题。

蒂瓦达尔强调的危险之一就在我们的口袋里。智能手机的面部识别功能增加了大规模监控的危险。

我觉得 Tivadar 的文章很有意义,有两个原因。

首先是在新冠肺炎疫情期间,减少感染传播的有效方法之一是放弃一方面的隐私。许多国家采用的接触追踪方法已被证明非常有效,但也可被视为对大众实施不必要的监视的手段的开端。

第二个原因是需要提高对研究人员和工程师开发的算法和技术的危险的认识,这篇文章就是这么做的。

[## 人工智能的 5 个真正危险

造假、算法偏差和其他问题会对我们的日常生活产生多大影响

towardsdatascience.com](/5-real-dangers-of-ai-1f94b4f0151d)

谷歌有趣的人工智能实验,你现在应该去看看了

这篇文章与我所看到的通常的机器学习代码演练类型的文章非常不同。我觉得这篇文章读起来很有趣,我在文章和包含的游戏链接之间来回浏览。

这篇文章揭示了一些由谷歌开发的,由人工智能驱动的创造性和直观的游戏。

除了介绍如何玩游戏,这篇文章还提供了游戏背后的人工智能如何工作的信息。

向读者解释了机器学习技术的简单说明。这篇文章省略了复杂的技术术语,这使得这篇文章对于所有层次的 AI 爱好者来说都是一篇有趣的文章。

这些游戏包括物体识别、姿势估计、语音识别等技术。

本文介绍了几个机器学习实践者如何利用人工智能的力量进行创新的例子。

[## 有趣的谷歌人工智能实验,你现在应该检查

玩人工智能

medium.com](https://medium.com/the-research-nest/interesting-ai-experiments-with-google-that-you-should-checkout-now-1c0e2982cbb0)

深度学习不再只是谷歌的专利凯勒·凯瑟

Caleb Kaiser 从他自己的角度写道,人工智能行业内的技术资源是如何被民主化的。

他的文章谈到了深度学习模型的资源现在如何在整个行业中容易获得。现在,小型企业,如创业公司,可以利用这些资源来推进他们的产品供应。

Caleb 包括这样一个事实,即拥有一个专门的研究团队来利用深度学习技术是一个要求,随着在通用机器学习库和框架中包含最先进的模型和数据集,这个要求已经被消除。

Caleb 给出了许多关于如何利用最新模型的例子,包括代码片段。

我钦佩 Calebs 对这篇文章的写作方法;他创造了一个大卫对抗歌利亚的形象,将大众可用的资源和科技巨头谷歌扣留的大量资源进行了对比。

阅读这篇文章让任何人都能感受到一个公平的竞争环境,用人工智能创造出令人惊叹的产品。Caleb 通过列举新兴的人工智能初创公司来支持这篇文章,这些公司的产品几乎可以与顶级工业竞争对手相媲美。

[## 深度学习不再只是谷歌的专利

生产深度学习现在可以用于创业公司

towardsdatascience.com](/deep-learning-isnt-just-for-google-anymore-c79f07f16993)

8 创作者和核心贡献者谈论他们来自 PyTorch 生态系统的模型训练库 Jakub Czakon

我很惊讶这篇文章没有更多的掌声。这可能是我本周遇到的最长的一篇文章,但无疑是信息量最大的一篇。

Jakub Czakon 探索了六个为 PyTorch 机器学习库增加了抽象层次的库。简单地说,这些库降低了 PyTorch 给模型实现和训练带来的复杂性。

Jakub 文章中提供的信息令人印象深刻地补充了库作者自己的更多见解。探索的一些库包括 Fast.aiPyTorch LightingSkorch 等。

每个包含的库的作者都经历了 Jakub 提出的一系列主题领域。一些领域包括项目的理念、易学性和受欢迎程度。

Jakub 在文章的结尾给出了他对提到的每一个库的看法。

我已经把这篇文章保存到我的阅读清单中,因为这是永恒的信息和知识。

[## 8 位创作者和核心贡献者谈论他们来自 PyTorch 生态系统的模型训练库

我在 2018 年初使用 py torch 0 . 3 . 1 版本开始训练我的模型。我被蟒蛇皮的感觉迷住了…

towardsdatascience.com](/8-creators-and-core-contributors-talk-about-their-model-training-libraries-from-pytorch-ecosystem-deccc3bfca49)

TensorFlow 还是 PyTorch?乔迪·托雷斯。艾

乔迪·托雷斯。AI 召唤出两个可怕的敌人之间的古老战争,TensorFlow 和 PyTorch。

机器学习从业者提出了 Jordi 的文章正在解决的问题。答案以结构化的方式呈现,这也是 Jordi 的文章适合初学者和好奇的学习者阅读的原因

Jordi 在文章的开头就回答了这个问题。

我不会在这里包括任何剧透。但是本文探讨了在选择合适的框架时需要考虑的各种重要因素。

对典型的机器学习项目任务(如模型实现、数据处理和模型评估)的实现过程进行了并排比较,指出了两种框架的相似性。

Jordi 还提到了这一点,即两个框架的相似之处似乎越来越多。

他提到了 TensorFlow 最近发布的一项功能,该功能与 PyTorch 库中的方法具有相似的功能。Jordi 谈到了相似性的原因以及这两个框架的未来前景。

虽然这篇文章强调了关键的相似之处,但 Jordi 提到了机器学习实践者在进行选择时应该知道的一个关键区别。

文章最后陈述了理解深度学习概念的重要性,而不是专注于选择哪个框架。

请记住,框架来来去去,意识形态和概念会一直存在。

[## TensorFlow 还是 PyTorch?

深度学习网络编程的最佳框架是什么?

towardsdatascience.com](/tensorflow-or-pytorch-146f5397278a)

这就是本周来自的全部内容,祝你度过一个安全愉快的周末

本周(5 月 16 日)偶然看到的有趣的 AI/ML 相关文章

原文:https://towardsdatascience.com/interesting-ai-ml-related-articles-i-came-across-this-week-9a4bb2c8d973?source=collection_archive---------39-----------------------

意见

四篇文章涵盖了我本周感兴趣的机器学习主题…包括人工智能生成的性爱诗歌

从封面文章中收集封面图片

我仍然处于相对的封锁措施之下(正在慢慢放松),所以我在媒体上消费的内容量仍然处于历史最高水平。

本周,我遇到了许多有创意的文章,展示了数据科学家和机器学习工程师的技能,以及该领域呈现的可能性。

我设法写了几篇有趣的文章,是我一个多星期来偶然发现的。

本周,我发现了许多有趣的文章,其中包括性爱诗歌、艺术技巧的解释和职业建议。我要感谢 Medium 上的这些作者,他们制作了高质量的内容,激发了灵感和指导……以及急需的分心。

我让人工智能给我写性爱诗,作者是本杰明·戴维斯

有人用 AI 生成性爱诗只是时间问题;我唯一惊讶的是,有人没有更早这样做。本杰明·戴维斯在很少有人涉足的地方冒险。虽然 AI 产生诗意或小说般的内容也不是闻所未闻

本杰明已经挖掘了之前被认为太强大而无法发布 GPT2 AI 模型的力量。

通过向网站 TalkToTransformer 中呈现的界面输入短语,本杰明生成了一系列完全由人工智能创作的诗歌和创造性写作。

通过向人工智能系统输入遵循“性别是 __”模式的短语,本杰明发现系统的反馈有时令人瞠目结舌。它回避了一个问题:什么训练数据被用来训练这个人工智能系统,《五十度灰》?

向人工智能提供挑衅性的短语,从而产生一系列有趣的富有想象力的、小说般的和诗意的结构,这些结构似乎散发出人类直觉和创造力的某些方面。多么奇怪。

如果你想从教程和研究论文中解脱出来,那么这篇文章是打发时间的绝佳读物,也许还能学到一两件关于创造性写作的事情。

[## 我让一个人工智能给我写性爱诗

这些阴暗、肮脏、又出奇温柔的性爱诗,完全是安艾写的。

psiloveyou.xyz](https://psiloveyou.xyz/i-made-an-ai-write-me-sex-poems-7b124654e494)

学习数据科学的阶段 Ken Jee

肯吉强调了学习时可以经历的五个阶段。通过他结构良好的书面文章,他设法将每个阶段与数据科学家可能经历的事情联系起来。

任何试图学习特定专业领域的思想和概念的人都会意识到学习者经历的困难和轻松的循环。Ken 的文章详细阐述了学习过程中的这些循环。

五个学习阶段中的四个阶段侧重于学习者的能力水平,并在相当罕见的“精通”水平结束。

我很高兴 Ken 打开了这篇文章,谈到新学习者的天真和无知,他们认为整个数据科学可以塞进一两门课程,viola 你是一名数据科学家!

认为数据科学或任何机器学习领域都是可以匆忙进行的想法是许多人的受害者,包括我在内。

通过在每个学习阶段加入自己的经验,Ken 补充了每个阶段的技巧和建议,以便在困难时刻保持并进入下一个阶段。

本文提出的建议包括建议学习者记住他们的学习目的;保持一致性,专注于基本技能。这个建议是相关的,甚至对于有经验的数据科学家也是如此。

这篇文章适合所有级别的数据科学家阅读。如果你是一个喜欢 YouTube 视频的视觉型人士,那么这里有一个涵盖本文内容的链接

[## 学习数据科学的阶段

如何在关键学习点“摆脱困境”

towardsdatascience.com](/the-stages-of-learning-data-science-3cc8be181f54)

YOLOv4 作者乔纳森·许

Jonathan Hui 是人工智能和深度学习领域的知名作家。他的最新文章基于最近发布的 YOLOv4,这是一种最先进的对象检测方法。

对于那些可能不知道的人来说,对象检测是一项常见的计算机视觉任务,涉及到开发一个可以识别图像或一系列图像中的内容(如猫、狗、汽车)的系统。

Jonathan 的文章对 YoloV4 对象检测技术中的思想和技术进行了分析。他触及了神经网络架构的基本组成,同时在必要的地方提供了解释。这篇文章有丰富的图像和图表,有助于说明神经网络架构设计。

这是一篇文章,提供了深度学习术语和概念的信息和一些基本定义,您一定会在其他艺术技术中遇到,如密集块、空间金字塔池层、正则化技术等。

对于一般的深度学习实践者来说,这篇文章可能需要一段时间才能看完,但它是一篇值得重温并保存到您的阅读列表中的文章。

[## YOLOv4

虽然对象检测在过去几年中逐渐成熟,但竞争仍然激烈。如下图,YOLOv4 声称…

medium.com](https://medium.com/@jonathan_hui/yolov4-c9901eaa8e61)

马丁·安德松·阿伯格用 7 个数据点编制成功媒体作家的神奇公式

有什么比使用 Medium writers 作为案例研究更好的方式来展示您的数据科学和分析技能呢?

马丁·安德松·阿伯格通过巧妙利用特定媒体作者的统计数据和指标,成功吸引了媒体数据科学和写作社区的关注。

马丁提出了一个有数据支持的公式,根据从一些受欢迎的媒体作家那里收集和分析的数据点,在媒体上创作成功的文章,这些作家包括祖列·雷恩蒂姆·丹宁香农·阿什利

配备了 Python 和一些可视化工具,Martin 专注于数据点,如作者的兴趣、标题字数、帖子阅读时间和发布频率。所有这些数据点为每个作家的理想文章提供了一个个人的“神奇公式”。

也许 Martin 可以创建一个 web 界面,提供对其程序功能的简单访问。

这篇文章发表在《更好的营销》杂志上。尽管如此,我还是忍不住认为,通过接触本文中数据分析方法的代码实现,它会在《走向数据科学》出版物中找到自己的位置。我确信数据科学界将会被这种展示个人技能的创造性方法所鼓舞。

这篇文章不是机器学习或数据科学文章,但马丁程序的壮举足以激励数据科学家探索更具创造性的数据分析方法。

[## 7 个数据点编译成功媒体作家的神奇公式

用数据分析为什么三位顶级作家如此成功

medium.com](https://medium.com/better-marketing/7-ways-you-can-find-the-magic-formula-of-great-successful-writers-d32001d6ac4e)

希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 YouTube 频道 即将上线的视频内容 这里
  2. 跟我上
  3. 通过 LinkedIn 联系我

本周(4 月 18 日)我看到的有趣的 AI/ML 相关文章

原文:https://towardsdatascience.com/interesting-ai-ml-related-articles-i-came-across-this-week-a5e8ce2c171c?source=collection_archive---------45-----------------------

由于我们大多数人都有更多的空闲时间,高亮显示的文章对那些想学习新东西或只想寻找分散注意力的内容的人来说是有用的

包括文章的封面图片

媒体上的内容数量有了明显的增长,这应该是由于作家们现在有了更多的空闲时间。

我读过大量围绕机器学习或数据科学相关主题的精彩内容。我选择了五篇文章,我认为它们在许多方面对不同水平的机器学习读者都有好处。我建议你在下面找到一两篇适合你的文章,并探究它们的内容。

所选文章写得很好,包含不同类型的机器学习爱好者感兴趣的内容。

享受吧。

教程和在线课程的陷阱

Sukanta Roy 的文章触及了一个很多机器学习从业者都会涉及的话题,教程陷阱。

教程陷阱本质上是一个人承担一系列关于特定主题的教程,而忽略了对实际实践知识的需求的过程。

他不仅解释了什么是“教程陷阱”和它所创造的“能力幻觉”;他还为我们提供了四个指路明灯,我们可以坚持下去,以防止我们作为学习者反复陷入教程陷阱。

提到的一个指导信标是学习任何与机器学习相关的东西的圣杯,那就是完成一个个人项目

Sukanta 的文章是任何通过在线课程开始获取机器学习知识之旅的人的必读之作。

[## 教程和在线课程的陷阱

教程和在线课程如何制造一种能力的假象,以及如何不落入这个陷阱

towardsdatascience.com](/the-trap-of-tutorials-and-online-courses-2b0c22e0388)

一个决策科学家给新冠肺炎的 10 条禁忌

在网上不可能避免任何关于新冠肺炎的文章。但是 Cassie Kozyrkov 的文章为目前正在进行的新冠肺炎对话添加了一个完全不同的视角。

她提出了个人在网上消费新冠肺炎相关信息时需要考虑的 20 条准则。

是的,目前的疫情上有很多信息超载,我认为这是非常需要的。但是,对于一个人来说,能够从有用的信息中分离出噪音也是至关重要的,而凯西的指导方针恰恰做到了这一点。

提出的指导方针分为两组,做和不做,每个指导方针都补充了一篇文章的链接,进一步扩展了这个主题。

我对作者之前所写的大量信息印象深刻。有些文章的日期是几个月或几年前,但它们在几年后证明是相关的。

[## 一位决策科学家给新冠肺炎的十大禁忌

在疫情期间,照顾好你的大脑,聪明对待数据,做出更明智的决定

towardsdatascience.com](/a-decision-scientists-10-dos-don-ts-for-covid-19-805577bccd67)

梅根·迪布尔向一个五岁的孩子解释机器学习模型

我喜欢解释文章,更喜欢简单的解释文章。梅根·迪布尔写了一篇有趣的文章,用最简单的方式解释了机器学习中的一些关键话题和概念。

虽然这篇文章是针对初学者的,但我确实相信,在机器学习中,不同水平的每个人都可以找到一些价值。

对于那些有点害怕机器学习中的数学的人,Megan 避免了包含方程或数学,而是用一些简单明了的图表来补充每个解释。

她提出了标准的监督和非监督机器学习模型,如 k-means,支持向量机和线性回归。

我仍然怀疑一个五岁的孩子会理解这篇文章的内容,也许是一个天才。

然而,尽管如此,这篇文章是对你必然会不断遇到的标准机器学习术语的简单介绍。

[## 向一个五岁的孩子解释机器学习模型

尽可能简单地解释 ML 模型是如何工作的

towardsdatascience.com](/machine-learning-models-explained-to-a-five-year-old-f2f540d9dcea)

Edouard Harris 数据科学就业市场在过去的一个月里发生了什么

四月已经过了一半,世界仍然被当前的疫情所控制。

我们都知道全球医疗体系面临的压力,以及疫情对全球经济的影响。

Edouard Harris 的文章写道,当前的经济和就业市场状况如何影响工作中的数据科学家或求职者。

Edouard 的文章非常有见地,内容丰富,他提供了受裁员或撤回安置影响的数据科学家数量的统计数据。

虽然这篇文章可能看起来有点黯淡,但爱德华对本月(4 月)和 3 月的比较几乎描绘了一幅充满希望的画面。

这篇文章以轻松的语气结束,强调了公司工作方式即将发生的巨大变化。

[## 过去一个月数据科学就业市场发生了什么

我在一家免费指导数据科学家的公司工作,直到他们被聘用。因为只有当我们的数据…

towardsdatascience.com](/whats-happened-to-the-data-science-job-market-in-the-past-month-88c748a4cd25)

凯尔·加拉丁努力寻找我作为数据科学家的第一份工作

失败的文章是非常谦虚和有趣的,因为从其他人的经验中可以发现丰富的知识。

Kyle 关于他在获得第一份工作之前所面临的困难的文章包含了传统数据科学工作角色所需的面试流程的详细信息。

这篇文章提供了凯尔的缺点和失败的信息,我们都可以从中学习。

在分享他在面试过程中的经历以及他如何最终获得一个角色的同时,他也为读者提供了一些如何接近和准备面试的技巧。

我不会破坏主要的提示是什么,但它们涉及如何处理焦虑,缺乏准备和更多的提示。

这篇文章适合求职者,但如果你只是想打发时间,从编码中休息一下,也是一篇有趣的读物。

[## 寻找我作为数据科学家的第一份工作的努力

在我选择撰写的这个古怪的个人专栏的最新部分,我分享了我兴趣的起源…

towardsdatascience.com](/the-struggle-to-find-my-first-job-as-a-data-scientist-64594c88b67e)

本周(6 月 13 日)你应该阅读的有趣的人工智能/人工智能文章

原文:https://towardsdatascience.com/interesting-ai-ml-you-should-read-this-week-june-13-fe8bcd901763?source=collection_archive---------29-----------------------

意见

这四篇文章涵盖了我本周感兴趣的机器学习主题…包括为什么数据科学可能正在失去魅力

让我从我在 2020 年观察到的一些事情开始这篇文章。

我们几乎每天都被男女同胞之间的抽象隔阂所提醒,无论是宗教、种族、文化观点等等。

但在 2020 年,我观察到了一场全球范围内前所未有的整合。

我们齐心协力应对这场我们许多人都曾目睹过的最严重的流行病之一。然而,我们再次联合起来,打击世界各地持续存在的对黑人的种族歧视。

尽管 2020 年可能不是最受欢迎的一年,但它已经展示了当地和全球社区的力量。

该材料中包含的文章的校对封面图像

又是一周,又一批媒体文章要通过了。

媒体文章的质量变得越来越令人兴奋和迷人。我读过详细描述个人经历的文章,这些文章让我产生共鸣,也读过为复杂的技术系统或技术提供简单解释的文章。

本周我感兴趣的文章涵盖了以下主题:

  • 科技巨头将面部识别技术从商业用途中收回。
  • TensorFlow 认证指南
  • 从技术角度理解为什么抖音如此令人上瘾
  • 数据科学失去吸引力的原因

为什么数据科学正在失去魅力?由 Harshit Ahuja

数据科学正在失去魅力吗?

嗯, Harshit Ahuja 在他的文章中似乎是这样认为的,这篇文章描述了曾经有利于数据科学工作角色的趋势变化。

尽管他承认围绕数据科学的宣传已经存在,但 Harshit 似乎并不认为每个人都有适合的工作角色。这与机器学习行业内的流行言论形成了鲜明对比,后者声称没有足够的供应来满足行业的需求。

通过阅读这篇文章,Harshit 展示的数据科学的魅力似乎是一个具有大量工作岗位的高要求行业的承诺。

但是,加上行业内工作需求减少和技能缺乏的现实,Harshit 提出了四个论点,说明为什么数据科学正在失去魅力。

Harshit 认为,数据科学失去魅力的主要原因如下:

  • 行业的高期望与涌入的新人才的技能和要求不匹配。
  • 人们对行业内工作角色和职责的误解。
  • 缺乏商业环境中实际数据的经验导致个人认为数据科学很简单。
  • 自动化给数据科学工作角色的寿命带来的威胁。

这些论点令人信服,在我看来,我认为这篇文章从本地的角度强调数据科学行业的问题可能是正确的,但不是从全球的角度。

然而,我确实同意 Harshit 提出的一些观点,尤其是机器学习行业的高期望值。

这篇文章是优秀的:

  • 数据科学爱好者
  • 数据科学学生

[## 为什么数据科学正在失去魅力?

数据科学曾经是最受欢迎的职业选择,但趋势正在发生变化。

towardsdatascience.com](/why-is-data-science-losing-its-charm-3f7780b443f5)

我是如何通过 TensorFlow 开发者认证考试的 Daniel Bourke

Daniel Bourke 详细介绍了他获得 TensorFlow 开发者证书的旅程和学习路径,旨在为读者提供一步一步的指导,告诉他们如何才能实现与他相同的壮举。

这主要是我喜欢在媒体上阅读的文章类型。文章不仅提供知识和信息,而且提供实现成就的明确途径。

Daniels 的文章鼓舞人心,激励人心,因为我从详细的学习资源和勇气中获得了一种指导感,其中包括 Daniel 对自己学习的奉献精神的个人描述。

TensorFlow 是机器学习使用最多的工具之一,获得一个认可的证书无疑可以为你提供职业利益。

丹尼尔在他的文章中强调了获得认证的一些好处。

对于读者来说,这篇文章有两个主要的收获:丹尼尔斯的经验和相关的课程,它们设定了一个明确的学习路径。这篇文章充斥着在线资源和书籍参考。所有包含的资源都有时间和成本指标,供读者衡量获得认证的金钱和时间支出。

即使你不打算获得认证,阅读丹尼尔的旅程和道路也足以让你深入了解专业机器学习研究中的严格学习和丰富资源。

这篇文章非常适合:

  • TensorFlow 开发者
  • 狂热的学习者
  • 计算机视觉和深度学习从业者

[## 我如何通过 TensorFlow 开发人员认证考试

你也可以

towardsdatascience.com](/how-i-passed-the-tensorflow-developer-certification-exam-f5672a1eb641)

一篇 2018 年的研究论文如何导致亚马逊、微软和 IBM 遏制他们的面部识别计划

通过参考以前的研究工作、抗议、意识和国会层面的讨论,戴夫·格什高恩创造了一个当前事件发生的背景故事,在这个故事中,我们看到科技巨头们审查、限制和取消对他们面部识别系统的访问。

文章首先引用了两位研究人员及其发表的研究,该研究揭示了科技公司面部识别系统在识别肤色较深的个人和女性时的缺点。

随后发表的研究是国会对论文中提出的问题的认识,以及最初研究人员的后续论文。

这篇文章提到了所有围绕面部识别不足的活动,作为最近刚刚发生的当前事件的铺垫。

你可能听说过,几家科技公司正在收回他们的面部识别系统,有些拒绝向警方提供面部识别,直到法规到位。

这篇文章是一篇很好的阅读,因为它列出了几年前个人的行动和工作,这导致了当前事件的发生。

这对我个人来说意义重大,因为它表明即使变化不会在一夜之间发生,我们也应该尽可能地保持一致性并坚持不懈。

这篇文章以语言结束,为未来与面部识别系统及其用途的不足进行的斗争奠定了基础。

戴夫揭示了一些公司利用法律优势来使用他们的技术,以及科技巨头在提供人工智能技术方面的军事联系。

当我读到这篇文章的结尾时,我感觉虽然已经做了一些改变,但是仍然有大量的工作要做。

这篇文章非常适合:

  • 寻求灵感的读者。
  • 希望了解最新时事的读者。

[## 2018 年的一篇研究论文如何导致亚马逊、微软和 IBM 遏制他们的面部识别计划

但这只是面部识别行业冰山一角

onezero.medium.com](https://onezero.medium.com/how-a-2018-research-paper-led-to-amazon-and-ibm-curbing-their-facial-recognition-programs-db9d6cb8a420)

为什么抖音让它的用户如此痴迷?让你着迷的人工智能算法凯瑟琳·王

抖音仍然没有在我的智能手机上找到家,因为我甚至不能理解它周围的宣传。

我可能不是“时髦”,但是 Catherine Wang 已经开始从技术角度解释为什么抖音受欢迎。她的文章包括一些抖音成功秘诀的高层次概述,它的推荐算法。

抖音已经被下载了 20 亿次,根据 Catherine 的说法,机器学习可能是这款令人上瘾的移动应用背后的主要驱动力。

抖音是一个我还不了解的平台。据我所知,你随着流行音乐起舞,然后,你就像病毒一样传播开来。

但是似乎还有更多。 Catherine Wang 从以数据为中心的角度简要介绍了抖音。通过强调平台的月用户数量和标签的病毒式传播,我感觉到这个应用程序是多么令人印象深刻地受欢迎,更令人惊讶的是它是如何在短时间内积累了如此大的人气。

Catherine 解释说,抖音成功的秘诀在于它的推荐引擎为其内容提要提供动力。

本文的大多数读者都熟悉某种形式的推荐系统,如果您不熟悉的话,Catherine 用了文章的很大一部分来介绍基本推荐系统的描述和架构。

在这篇文章中,Catherine 从高层次的概述和深入的技术分析两方面深入剖析了抖音推荐算法的内部工作原理。

抖音推荐系统的技术分析由 Catherine 以结构化的形式呈现,Catherine 识别与输入到更广泛的推荐系统的内容和数据相关联的数据和特征组件。

这篇文章充满了恰当的解释和丰富的知识。如果你是推荐系统或机器学习的新手,你一定会从这篇文章中学到一些东西。

这篇文章非常适合:

  • 读者了解推荐系统

[## 为什么抖音让它的用户如此痴迷?让你上瘾的人工智能算法。

Tick Tok 正在席卷全球。短视频 app 被下载了 20 亿次,那么背后的魔力是什么…

towardsdatascience.com](/why-tiktok-made-its-user-so-obsessive-the-ai-algorithm-that-got-you-hooked-7895bb1ab423)

我希望这篇文章对你有用。

要联系我或找到更多类似本文的内容,请执行以下操作:

  1. 订阅我的 YouTube 频道 即将上线的视频内容 这里
  2. 跟我上
  3. 通过 LinkedIn 联系我

我从 ICML 2020 中读到的有趣的论文

原文:https://towardsdatascience.com/interesting-papers-i-read-from-icml-2020-part-1-df61ac397b94?source=collection_archive---------38-----------------------

这是我从未去过的维也纳(图片由亚采克·迪拉格Unsplash 上拍摄)

今年的机器学习国际会议(ICML)将在网上虚拟举行,这是一个很好的机会,让人们不用花太多钱就能参加,这对于不一定在 ML 的研究人员来说很好。所有的论文演示都是预先录制的,并且还提供了两个实时放大的问答部分。

到第三天,我已经从各种论文、教程、小组讨论和指导会议中学到了很多。在这个系列中,我决定分享一些我觉得有趣的论文的笔记。这份名单绝不是在穷尽所有1086 篇被录取论文后的公正选择。论文是随机排序的,当然偏向于我感兴趣的话题。所以我们开始吧:

1.通过超球面上的几何理解对比表征学习

[ 论文 ][ 演示文稿 ][ 代码

对比表征学习是我最近最感兴趣的话题之一。我对对比损失进行了实验(见这里的和这里的),发现它对于在没有监督的情况下学习其他任务的有用表征非常有效。

在本文中,作者为对比目标提供了优雅的几何解释。他们将对比损失目标分解为两个量,用于评估学习表征空间的几何形状:

  1. 对齐(紧密度):来自正配对的嵌入彼此紧密吗?
  2. 均匀性:投射到嵌入空间的样本是否均匀分散?

作者发现,与使用监督目标学习的表征相比,通过优化对比目标学习的表征确实具有这两种性质。这两个量也可以用作神经网络的损失函数来进行显式优化,这与使用对比损失达到了类似的效果。他们还表明,对于学习监督任务的良好表示,对齐和一致性都是必需的。

2.连续图神经网络

[ 论文[简报

本文作者提出了一种方法来解决离散图神经网络(GNNs)在执行多个传播层的前向传递时性能下降的问题。众所周知,当 GNN 层数过多时,广义神经网络会出现过度平滑的问题。这是因为拉普拉斯平滑具有使来自具有相同程度的节点的传播信息彼此更加相似的趋势,从而掩盖了来自单个节点的独特特征。

作者设计了他们的方法连续 GNN (CGNN),该方法受神经节点的启发,在节点表示上模拟连续动力学。他们的实证结果显示,CGNN 在标准基准(Cora、Citeseer、PubMed 等)上击败了图卷积网络(GCN)和图注意力网络(GAT) 。)用于半监督节点分类任务。

虽然作者如何发明 CGNN 的推导细节很难理解,但我确实发现这篇论文是 GNNs 的一个重要进步,因为它能够开发具有多个消息传递层的“更深层次”GNNs,而不会损失性能和图上节点之间的长期依赖性。更多关于 GCN 的信息,请阅读我之前的文章。

3.无监督文本可控表征的变分学习

[ 论文 ][ 演示文稿

为什么不能对文本进行风格转换?

在这篇文章中,作者解释了为什么变分自动编码器(VAE)不能通过潜在空间操作进行文本生成。利用拓扑分析,他们发现 VAE 在文本数据上学习的潜在空间( z )比在图像数据上学习的潜在空间有更多的“漏洞”。

为了减轻这种影响,他们开发了 CP-VAE(约束后验概率),在 VAE 损失上增加了两项,以 1)鼓励学习的潜在空间具有正交基(我猜这是受 PCA 的启发?);以及 2)用类似于对比损失的结构重建损失来“填充”潜在空间。通过在损失函数中加入这些额外的术语,作者证明了合作原则-VAE 的潜在空间得到了更充分的“填充”,可以在语篇中进行“风格转移”。虽然,我认为作者提供的例子也稍微改变了输入句子的内容。

4.CURL:用于强化学习的对比无监督表示学习

[ 论文 ][ 简报 ][ 代号

对比学习的观察表征对学习有帮助吗?

答案是肯定的。在本文中,作者试图弥合 RL 代理与代理之间的差距,RL 代理可以访问底层状态,而代理只能在 DeepMind 控制环境(如 Walker)上通过像素看到观察结果。受对比表征学习最新进展的启发,作者开发了 CURL,它使用观察轨迹的重放缓冲区合并了对比表征学习,作者表明 RL 代理能够从像素观察的学习表征中注意相关区域,这有助于代理更快地学习。然而,这一结果的实现离不开三个绝妙的技巧:

  1. 跨观测轨迹应用一致随机裁剪以保留时间结构
  2. 使用双线性内积代替余弦相似性作为编码观察序列的相似性度量
  3. 使用指数移动平均(EMA)对观察值序列进行编码,以保留一些短期记忆

CURL 显著提高了基线 RL 算法的数据效率,在某些任务上达到最佳策略的速度提高了 5 倍。但是在 RL 代理访问真实状态方面仍然存在一些差距。作者也承认 CURL 在一些复杂动态的环境中失败了。这可能是由于来自像素的观察可能无法捕捉完整的状态信息,例如速度和接触力。

5.感知生成自动编码器

[ 论文 ][ 简报 ][ 代号

这是在我们最喜欢的 VAE 以及深度生成模型的基础上开发的又一个杰出作品。作者认为,现代深度生成模型(GANs、基于流的模型和 VAE)的不完善源于未能解释数据的内在维度和环境维度之间的差异。为了解决这个问题,作者提出了感知生成自动编码器(PGA ),它可以最小化除数据重建误差之外的潜在重建误差。

从概念上讲,这就像为潜在空间和数据空间绑定了自动编码器。使用常规符号,让我们用 x 来表示一个高维数据点, z 是它的潜在向量。我们有 encoder \ hat {z} =f(x)和 docoder \ hat {x} =g(z)。 x 的自动编码器将是\ hat {x} =g(f(x)。从 z 的角度看,编码器 f (。)实际上是解码器为 z 而解码器为 g (。)是编码器 zz 的自动编码器将是\ hat {z} =f(g(z)。PGA 以这种方式看待自动编码器,并在来自数据空间的重建误差之上添加了两个潜在的重建损失项,这两个项都最小化了zf(g(z)之间的 L2 距离。这里的 z 可以从预先定义的高斯先验或者后验q(z|x)中进行采样。

接下来,作者展示了添加 PGA 损失项的 VAE 显著提高了通过 FID 分数测量的生成数据的质量,从而解决了 VAE 的样本模糊问题。

6.NGBoost:用于概率预测的自然梯度推进

[ 论文 ][ 演示 ][ 代码

大多数监督 ML 回归模型仅给出给定特征向量的数据点的点估计。对于某些回归问题,预测的置信区间也是至关重要的。

在这篇论文中,作者提出了一个模块算法来进行概率预测。该算法由以下部分组成:

  • 基础学员( f )
  • 目标 P_theta(Y|X=x)的参数化概率分布,可以是正态泊松分布
  • 评分规则 S (\theta,y),可以是均方误差

作者发现,对于普通梯度,即 S w.r.t .参数\theta 的梯度,该算法不起作用,因为梯度对于参数\theta 不是不变的。换句话说,通过遵循普通梯度来更新\theta 就像朝着移动目标进行优化。为了克服这个问题,作者对自然梯度进行了梯度下降,它位于分布空间而不是参数空间。自然梯度定义为黎曼空间中的最陡上升,它是\theta 的不变量。自然梯度也可以通过用 Reimannian 度量转换普通梯度来计算,这取决于评分规则的参数形式。

通过使用自然梯度的梯度增强,NGBoost 算法能够正确地估计预测的均值和方差。作者还表明,在许多回归任务上,它与现有的更复杂的算法表现相当好。

我也会给 scikit-learn 兼容 API 加分。

7.从不规则采样的时间序列中学习:一个缺失数据的视角

[ 论文 ][ 演示文稿

临床时间序列数据通常是不规则采样的:变量既不是以均匀的间隔测量的,也不是完全随机的。本文作者通过将不规则采样时间序列视为缺失数据问题,设计了一种生成过程。具体来说,他们使用了一个编解码器框架,该框架可以是 VAE 或双向 GAN(甘比),以显式地对数据【x】及其索引 t 进行建模。这个框架直接作用于离散时间序列。

作者设计了一个有趣的实验,他们从 MNIST 和西里巴等数据集掩盖了大部分图像,以模拟不规则采样的离散时间序列。并且任务是让模型在给定可用像素( x )及其索引( t )的情况下,填充图像的缺失部分。他们的模型取得了相当好的性能。

为了将这个框架扩展到具有缺失数据的连续时间序列,作者在解码器上覆盖了一个内核平滑器,在编码器上覆盖了一个卷积层。这里的巧妙之处在于利用互相关将不规则采样的数据点转换为均匀间隔的信号。作者接下来表明,该框架还能够从 MIMIC-III 数据集中学习连续时间序列的有用表示,以帮助患者生理轨迹的下游分类任务(预测死亡率)。

8.使用疾病进展的深度预测聚类进行时间表型分析

[ 论文 ][ 简报 ][ 代号 ]

沿着临床时间序列建模的思路,本研究旨在对时间序列数据进行监督聚类,以反映未来的标签。在我看来,这篇论文的问题表述非常不寻常:作者试图在给定时间点 t 分类轨迹的同时学习分类表示。作者表示,这是一个具有挑战性的问题,因为它是 NP 难的,并且在选择聚类成员时涉及采样过程。

提出的算法 actor-critic 时序表型聚类(AC-TPC)由三个神经网络组成:

  • 编码器:z _ t=f(x _ { 1:t })
  • 选择器:提供集群分配s _ t=h(z _ tT7)
  • 预测器:根据编码 z_t 或嵌入进行预测

由于该算法旨在同时对数据进行聚类和分类,AC-TPC 的损失函数需要最小化真实标签和聚类分配之间的差异,同时确保每个轨迹仅分配给一个主导聚类,并防止聚类内的样本相互重叠。

他们在时态医学数据集上的实验表明,AC-TPC 具有更好的预测性能,并且比基线算法产生更好的聚类质量。通过诸如纯度、调整随机指数(ARI)和归一化互信息(NMI)的聚类度量来测量聚类质量。作者还表明,AC-TPC 允许聚类分配随着新的观察结果添加到轨迹中而改变,反映了患者表型可能因后续干预而改变的真实世界场景。

干扰:A/B 测试的棘手陷阱

原文:https://towardsdatascience.com/interference-a-tricky-pitfall-of-a-b-testing-f940464cb5a0?source=collection_archive---------34-----------------------

来源:pixabay

虽然进行 A/B 测试来测试产品功能或营销活动的变化令人兴奋,但数据科学家应该知道 A/B 测试的常见陷阱,如干扰、内生性问题和对统计结果的误解。我对干扰特别感兴趣,因为它总是以一种非常微妙的方式出现,即使是一个有经验的数据科学家也可能无法识别这个陷阱。在这篇文章中,我想简单地谈谈这个问题,包括一个具体的干涉例子。我还将讨论在设计实验时如何识别这个问题,以及一些常见的干扰解决方案。

共享资源引起的干扰:拼车市场实例

徐战旗的功劳

假设一家虚构的拼车公司 Lyber 希望通过改变移动应用程序的用户界面来简化搭载乘客的步骤。衡量这一改变成功与否的标准是司机在一段时间内的乘车次数。数据科学团队将纽约的司机随机分配到治疗组(新 UI)和对照组(原始 UI),并运行为期 2 周的 A/B 测试。团队记录关键指标,并对其执行双样本 t 测试。在检查了统计结果后,该团队得出结论,p 值非常重要,声称新的用户界面有助于司机搭载更多的乘客,赚更多的钱。作为一名经理,你刚刚结束了与 DS 团队的会议,你必须决定产品团队是否应该根据这个实验的结果来实现新的 UI。

事实上,这个例子只不过是一个常见的 A/B 测试面试问题:我们无法从这个实验中得出任何结论,因为由于两组司机都在同一个地方(纽约),他们共同构成了市场的供应方,共同分享需求。如果接受治疗的司机利用新的用户界面,他们将影响市场的共享需求。结果,控制组的司机会比平时少坐几个人,坐几趟车。简而言之,观察到的治疗效果是对真实治疗效果的夸大。我们不知道真正的治疗效果是否有统计学意义。

干涉的想法

希望上面的例子能给你一个干扰的基本概念。背后的想法非常简单:给定多个治疗组,一个组的行为会影响其他组的行为。这正是上面案例中发生的情况:一组中去找司机的乘客越多,另一组中可供司机使用的乘客就越少。

干扰类型

一般来说,干扰可能以两种方式发生:间接连接和直接连接。

间接连接当两个单元因为潜在变量或共享资源而连接时发生。上面的 Lyber 案例是一个间接联系的完美例子,从这个意义上说,治疗组和对照组共享客户池。子用户实验单元的设计也可能导致间接连接(Kohavi et al .,2020):假设对 web UI 的新想法进行实验,并且实验单元在页面视图级别而不是在用户级别。在这种情况下,“用户”是连接治疗组和对照组的潜在变量。结果,两个版本的 web UI 都可能暴露给同一个用户,使得实验结果不可靠。

另一方面,直接连接发生在两个单元或者在同一个社交网络中或者有物理接触的时候。这可能是 LinkedIn 的工程团队将干扰视为‘网络效应’的原因。这里我想引用圣雅克(2019)提供的一个直接连接的例子:

“想象一下:我的朋友是一项实验的目标,该实验为她提供了更好的消息传递体验。我不是目标,我的消息传递体验没有改变。然而,她更好的信息体验使她花更多的时间在网站上,发送更多的信息,包括一些给我的信息。然后我回复她,并在网站上花更多的时间。这里发生了什么?我的朋友收到了一个新功能,这个事实对我产生了影响,尽管我没有参与实验。有干扰。”

在这个虚构的实验中,尽管作者没有接受治疗,但他与消息应用的互动受到了治疗组中一位朋友的影响。

设计实验时识别干扰

干扰给假设检验带来了偏倚误差,使得整个实验不可靠。为了避免干扰问题,考虑一个极端的情况:如果改变真的有效,并使治疗组的关键指标增加了 10 倍,这会影响对照组的关键指标吗?如果答案是肯定的。然后,您可能想要浏览我在下面讨论的一些解决方案:)

干扰的可能解决方案(在你意识到它之后!)

一个可能的解决方案是改变随机化单元。

如果干扰归因于单元的地理接近度,我们可以在区域级别随机化单元。Vaver 和 Koehler (2011)设计了一个实验,将感兴趣的地理区域(如国家)划分为一组区域。然后将每个区域随机分配给治疗组或对照组。作者还建议平衡其他混杂变量的治疗和对照区域(即分组随机化)以减少方差。

类似地,在社交网络的背景下,我们可以基于“它们干扰的可能性”构建网络节点的集群(Kohavi 等人,2020)。集群可以作为实验单元。

或者,我们也可以使用时间间隔作为随机化水平。别忘了考虑时间因素(工作日/周末;一天中的小时)。配对 t 检验是减少方差的好方法。(科哈维等人,2020 年)

请记住,当改变实验单位时,偏差-方差权衡仍然存在:由于干扰效应,更具体的级别(如用户)会导致较小的方差和较大的偏差。另一方面,更一般的水平,如时间间隔或区域,由于组内方差,导致更小的偏差但更大的方差。Chamandy 的文章(2016)对这种权衡给出了明确的解释。

最后但并不是最不重要的

这篇文章背后的动机是帮助人们获得干扰的基本概念。我还鼓励您阅读下面的参考列表,因为它们提供了技术行业最聪明的数据科学家如何解决干扰问题的大致情况。我也要感谢徐占奇根据和 Lyft 的标志为本文中虚构的公司 Lyber 设计了一个非常时尚的标志。我希望这不会是你对这篇文章的唯一记忆:)

参考

n . chamandy(2016 年 9 月 2 日)。拼车市场的实验。检索自https://eng . lyft . com/experimentation-in-a-ride sharing-market place-b 39 db 027 a 66 e

柯哈维,r .,唐,d .,,徐,Y. (2020)。可信的在线控制实验:A/B 测试实用指南。剑桥大学出版社。

圣雅克,G. (2019,6 月 5 日)。检测干扰:A/B 测试的 A/B 测试。2020 年 5 月 22 日检索,来自https://engineering . LinkedIn . com/blog/2019/06/detecting-interference-an-a-b-test-of-a-b-tests

Vaver,j .,& Koehler,J. (2011 年)。使用地理实验测量广告效果。

中级 Python: NumPy

原文:https://towardsdatascience.com/intermediate-python-numpy-cec1c192b8e6?source=collection_archive---------19-----------------------

通过探索数字 Python 库 NumPy,让您的 Python 技能更上一层楼。

如果您最近完成了一门关于 Python 基础的课程或一本书,现在想知道下一步去哪里,探索不同的 Python 包将是一个自然的下一步。NumPy 包(数字 Python 的缩写)非常简单,但也非常有用,尤其是对于科学计算、数据科学和机器学习应用程序。

许多数据分析和机器学习 Python 库都是建立在 NumPy 之上的,因此掌握这些基础知识对于成功利用这些库至关重要。本文并不打算作为 NumPy 的全面或深入的资源。更确切地说,这更多的是对这个包的介绍,对于那些可能想探索科学或数据科学应用程序的 Python 新手来说,这是一种正确方向的推动。

先决条件

要理解本文中的代码片段,显然需要在机器上安装 Python 和 NumPy 包。命令pip install numpy应该可以解决问题,但是如果你有任何问题, NumPy 站点可以在入门部分帮助你设置。

此外,我建议使用 Jupyter 笔记本或 Spyder 中的 IPython 控制台来跟进,但 IDLE 也可以。Jupyter 和 Spyder 附带了 Anaconda,你可以在这里下载,这个包应该已经安装了 NumPy。

为什么是 NumPy?

使用 NumPy 包的最大优点之一是 ndarray (n 维数组)数据结构。NumPy ndarray 比 python list强大得多,并且提供了比 python array更多种类的操作和功能。为了理解这些优势,我们首先需要深入了解 Python 的基本数据类型。

Python 是一种动态类型的语言,这是它易于使用的特性之一。Python 允许我们给一个变量赋一个整数值,然后将同一个变量重新赋给不同的类型(比如字符串):

然而,在像 C++这样的静态类型语言中,要给一个变量赋值,我们首先必须给这个变量分配一个类型。在变量被声明后,我们不能将它的值重新赋值给不同类型的值:

这种动态类型功能非常方便,但也有代价。Python 是用 C 实现的,Python 中的基本数据类型实际上不是原始数据类型,而是指向包含许多不同值的 C 结构的指针。存储在像integer这样的 Python 数据类型中的额外信息是允许动态类型化的,但是会带来很大的开销,当处理非常大量的数据时,性能成本会变得很明显。

高灵活性和高性能成本同样适用于 Python lists。因为lists可以是异构的(在同一个列表中包含不同的数据类型),所以list中的每个元素都包含自己的类型和引用信息,就像 Python 对象一样。异构列表将从这种结构中受益,但是当列表中的所有元素都是相同的基本类型时,存储的类型信息变成了多余的,浪费了宝贵的内存。

Python arrays在存储统一数据类型方面比lists高效得多,但是 NumPy ndarray提供了arrays没有的功能(例如矩阵和向量运算)。

数组创建

首先,检查您是否安装了 NumPy 导入并检查您的版本至少是 1.8。

注意:你可以直接*import numpy*而不是导入为*np*,但是对于教程的其余部分,无论你在哪里看到*np*,都用*numpy*代替就可以了(例如*np.array()**numpy.array()*)。此外,当使用术语“数组”或“ndarray”时,我可能会有点不一致,所以请记住这些术语指的是同一个东西。

现在让我们看看如何用 NumPy 创建多维数组(ndarrays)。既然我们将 ndarrays 与 Python 列表进行了比较,那么首先让我们看看 NumPy 如何让我们从列表中创建一个数组:

从 Python 列表创建数组

将 Python 列表[1,1,2,3,5,8,13]传递给np.array()会创建一个 32 位整数值的 ndarray。ndarrays 中保存的值将始终属于同一类型。对于所有 ndar array,.dtype属性将返回数组保存的值的数据类型。** 关于数据类型的 Numpy 文档

如果我们将包含不同类型值的list传递给np.array(),NumPy 将向上转换这些值,这样它们就可以是相同的类型:

传递给 array()方法的列表包含整数和浮点数。从此列表创建的数组将整数转换为浮点数,以便所有值都是同一类型。

  • *注意:请确保当您调用array()时,您提供了一个数字列表作为单个参数:np.array( [1,2,3] ),而不仅仅是数字作为多个参数:np.array( 1,2,3 );这是一个非常常见的错误。

NumPy 还允许您在使用dtype参数创建数组时显式指定数组的数据类型:

数组中的值最初是作为整数输入的,但是通过将数据类型指定为 float ( dtype = float ),Numpy 将所有值都转换为 float(例如 1 → 1.0).

创建时知道数组的大小,但不知道数组的内容是很常见的。在这种情况下,NumPy 允许创建具有占位符值的指定大小的数组:

np.zeros( ) 将所有值初始化为 0 的 3x3 数组。

np.ones()np.empty()也可以分别用于返回全 1 或不初始化条目的数组。如果您想指定一个值作为占位符,请使用np.full(size, **placeholder**):

数组也可以用随机值初始化。使用np.random.random(s)你可以创建一个大小为s的数组,用 0 到 1 之间的随机值填充。传递一个整数值将产生一个该长度的一维数组:

长度为 5 的一维数组。

您可以传递更高维数组的维度:

传递(3,3)会产生一个二维的 3x3 数组,而传递(2,2,2)会产生一个三维的 2x2x2 数组。

如果你想要一个随机整数值的数组,使用np.random.randint(min, max, size)。指定min的最小值、max的最大值,当然还有size的数组大小,就像我们对np.random.random()所做的那样。

In[32] :二维 3x3 数组的取值范围在 0 到 25 之间。 In[33] :一维 10x1 数组的范围在-50 到 50 之间。

还有许多其他非常有用的创建 ndarrays 的方法,包括:

  • 在给定范围内用等间距值填充
  • 在一个正态分布上用随机数填充一个数组
  • 创建一个身份矩阵

如果您感兴趣,请查看数组创建文档,探索这些数组创建例程以及许多其他例程。

数组操作

创建数组很好,但是 NumPy 真正出色的地方是使用数组进行操作和计算的方法。这些方法不仅简单易用,而且当涉及到基于元素的操作(尤其是在大型数组上)时,这些方法具有非常出色的性能——比遍历每个元素的性能好得多,就像通常不使用 NumPy 时所做的那样。

ndarray对象允许我们对两个相同大小的数组执行算术运算:

a 中对应的元素中减去 b 中的每个元素。同样,请注意,结果数组中的所有值都是浮点型的,因为正如我们在数组创建示例中看到的那样,整数被转换为浮点型。

在两个 ndarrays 上使用 + 运算符产生元素相加。

请记住,在两个lists之间使用+操作符不会将它们按元素相加。这实际上导致了两个lists的串联。此外,如果我们试图在两个lists之间使用-操作符,Python 将返回一个错误,因为lists在没有使用 for 循环显式声明的情况下,自然不允许元素操作。

语句 list_a + list_b 连接两个列表,而 list_a -list_b 返回一个错误。

元素方式与矩阵乘法

如果你以前用过 MATLAB,你就会知道使用 n 维数组和矩阵是多么容易。NumPy 在提供一些方便的功能方面做得很好,并且对于 MATLAB 用户来说,可能比使用基本的 Python 更加熟悉。

MATLAB 中的矩阵乘法就像在两个矩阵上使用*运算符一样简单(例如a * b)。使用 NumPy,*操作符将实际返回元素级乘法。

对于矩阵乘法,@运算符用于arrays:

而在矩阵乘法这个话题上,NumPy 也有一个*matrix*类,实际上是*array*的子类。*array*类用于一般用途,而*matrix*类用于线性代数计算。文档建议在大多数情况下,您应该使用*array*类,除非您专门从事线性代数计算。如果您想要处理更高维的数组(例如 3-D),那么*array*类支持这一点,而*matrix*类总是处理 2 维数组。

使用 ndarray 类表示的三维数组。

此外,*matrix*类不像*array*那样使用相同的操作。因此对于本文,我们将重点关注*array*类。

就像两个数组相乘一样,我们可以将一个数组的所有元素都乘以一个数字。NumPy 还使得获取数组的属性变得非常方便,比如数组(ndim)的 summin / maxdimensions 、以及arraysize (总元素数)。

您还可以访问阵列的基本统计值:

该数组的均值、标准差和方差很容易计算。

根据条件获取元素

一个非常酷的numpy类方法是numpy.where()。这允许您从数组中返回满足指定条件的元素。例如,如果您有一个从 0 到 50 的 5x5 整数数组,并且您想知道大于 25 的值在哪里,您可以执行以下操作:

np.where( ) 对于保存大于 25 的值的索引返回 1,对于小于等于 25 的值返回 0。这里的 r 是原数组

如果你想找到低值(例如< 15) and replace them with a -1:

All values less than 15 have been replace with -1. Here arr 是原始数组 in Out[71]

你可以用这个方法做很多事情,特别是用一点创造性的思维,但是只要记住它是如何工作的:np.where(cond[, x, y])——如果cond条件满足,返回x,否则返回y

索引、切片和整形

步进的工作原理与lists相同:

这里我们创建一个填充了 0 的三维数组,然后将索引 arr_3d[0][0][1] 的值重新赋值为 20。

要检查数组中是否有值,可以像使用lists一样使用in关键字:

切片与arrays一起工作,就像它与lists一样,并且arrays可以在多个维度上切片:

In[8] :每行前 3 列。【9】:每列前 3 行。 In[10] :第 2 列所有项目。

在转换方面,NumPy 有很多功能。例如,如果您有一个 3x5 的数组,并且想要调整为 5x3:

若要调整数组的形状,请将所需的维度传递给 shape()方法。

您也可以使用array.T转置 arrays:

数组 r 是 12x1 数组 p 的整形,为 3x4 数组。数组 q 是 r 的转置,通过使用**r.T**

Arrays也可以使用np.transpose(a)进行转置,其中a是您想要转置的数组。

我们只是触及了 NumPy 库的皮毛,如果你想知道你还能做什么,官方文档有一个很棒的入门指南,当然,你可以在那里探索库的其余部分。如果您想使用 Python 进行科学计算、机器学习或数据科学,NumPy 是您应该真正熟悉的库之一。

下面是我推荐的其他几个相关的 Python 库,它们被认为是这个领域的核心:

最后,我将为您提供一些资源,让您继续掌握用于数据科学和科学应用的 Python。

Jake VanderPlas 著《Python 数据科学手册》 —这是一本真正优秀的数据科学入门入门读物。他还从一开始就介绍了 NumPy,但比本文详细得多。

用 Scikit-Learn、Keras&tensor flow byaurélien géRon——如果你真的对机器学习和深度学习感兴趣,这本书可能是入门最常推荐的书。

走向数据科学 —数据科学、机器学习、AI、通用编程。这是关于媒体的最好的出版物之一,并且是关于数据科学的大量主题的极好资源。

斯坦福大学与吴恩达 联合开设的机器学习课程——不完全是专门针对 Python 的,但如果你想真正进入机器学习,并在动手实践的同时钻研一些理论,如果你有时间致力于这门课程,这是一个绝佳的起点。吴恩达很聪明。

感谢阅读!

具有深度更新过程的间歇需求预测

原文:https://towardsdatascience.com/intermittent-demand-forecasting-with-deep-renewal-processes-f152d3f59f35?source=collection_archive---------51-----------------------

让我们面对现实吧。任何在零售、物流、电子商务等领域从事时间序列预测工作的人。肯定会诅咒那条从不表现的长尾巴。可怕的间歇时间序列使预测者的工作变得困难。这种麻烦使大多数标准预测技术变得不切实际,提出了关于度量标准、模型选择、模型集成等等的问题。更糟糕的是,可能会有这样的情况(比如在备件行业,出现间歇性模式的是流动缓慢但非常关键或高价值的项目。

注释

Y - i 时间序列的第元素

n -时间序列的索引

i -非零需求指数

Qi -需求间隔,即两个非零需求之间的差距。

Mi-非零需求点的需求规模。

传统方法

传统上,有一类算法采用稍微不同的路径来预测间歇时间序列。这组算法将间歇性需求分为两部分——需求规模和需求间隔——并分别建模。

克罗斯顿

克罗斯顿提议对 MQ 分别应用单一指数平滑,如下所示:

得到这些估计后,最终预测,

这是一个单步提前预测,如果我们必须扩展到多个时间步,我们将得到一个具有相同值的平面预测。

克罗斯顿

Syntetos 和 Boylan,2005 年指出,Croston 预测对间歇性需求有偏见,并提出用需求区间估计的β进行修正。

克罗斯顿(SBJ)

Shale、Boylan 和 Johnston (2006)得出了到达遵循泊松过程时的预期偏差。

作为更新流程的克罗斯顿预测

更新过程是一个到达过程,其中到达间隔是正的、独立的和同分布的(IID)随机变量。这个公式概括了任意长时间的中毒过程。通常,在泊松过程中,需求区间是指数分布的。但是更新过程的内部需求时间是有限的。

Turkmen 等人 2019 年将 Croston 及其变体铸造到更新过程模具中。定义在正整数上的随机变量 MQ 完全定义了 Yn

深度更新过程

一旦克罗斯顿预测被视为一个更新过程,土库曼等人提出,估计他们使用一个单独的 RNN 为每个“需求规模”和“需求间隔”。

在哪里

这意味着我们有一个单一的 RNN,它接受输入的是 M和 Q并把这些信息编码到一个编码器中( h )。然后,我们在这个隐藏层的顶部放置两个独立的 NN 层,以估计 MQ 的概率分布。对于 MQ 而言,负二项分布是本文建议的选择。**

负二项分布

负二项分布是一种离散的概率分布,通常用于对计数数据进行建模。例如,售出的 SKU 数量、访问网站的人数或呼叫中心接到的服务电话数量。

该分布源自一系列的伯努利试验,即每个试验只有两种结果。一个经典的例子是掷硬币,可以是正面也可以是反面。所以成功的概率是 p 失败的概率是 1-p (在公平的抛硬币中,这是各 0.5)。所以现在如果我们继续进行这个实验,直到我们看到 r 成功,我们看到的失败次数将会是负二项分布。

当我们应用这一点时,成功和失败的语义不一定成立,但重要的是只有两种结果。

网络体系结构

作者图片

我们的贡献

本文只讨论了提前一步的预测,这也是你会在很多间歇性需求预测文献中发现的。但在现实世界中,我们需要比这更长的时间来进行适当的规划。无论是 Croston 还是深度更新流程,我们生成 n 步提前预测的方式都是一样的,即需求规模(M)/需求间隔时间(Q)的平面预测。

除了现有的 Flat 方法之外,我们还引入了两种新的输出解码方法——精确解码和混合解码。假设我们用预测长度 5 来训练模型。

该模式的原始输出将是:

在平面解码下,我们将只选取第一组输出(M=22 和 Q=2 ),并生成一个单步超前预测,并对所有 5 个时间步长扩展相同的预测。

确切的说

精确解码是一种更有把握的解码方式。在这里,我们预测需求规模为 M 的需求,每个内部需求时间为 Q,并使预测的其余部分为零。

杂交

在混合解码中,我们将这两者结合起来生成预测,该预测还考虑了模型预期的长期变化。我们使用 M/Q 值进行预测,但我们会根据后续步骤更新 M/Q 值。例如,在我们的例子中,我们将预测前两个时间步的 11(22/3 ),然后预测下一个时间步的 33(33/1 ),依此类推。

履行

我已经使用 GluonTS 实现了该算法,Glu onts 是一个基于 MXNet 的神经时间序列预测框架。AWS 实验室是开源项目的幕后支持者,亚马逊内部使用 DeepAR 等一些算法来进行预测。

实施的模型

本文讨论了该模型的两个变体——离散时间 DRP(深度更新过程)和连续时间 DRP。在这个库中,我们只实现了离散时间 DRP,因为它是更流行的用例。

如何安装?

该软件包上传到 pypi 上,可以通过以下方式安装:

pip install deeprenewal

推荐 Python 版本:3.6

https://github.com/manujosephv/deeprenewalprocess】源代码:

如果你运行的是 Windows,需要使用你的 GPU(我推荐),你需要先安装支持 GPU 的 MXNet==1.6.0 版本 MXNet 官方安装页面

如果你在安装 GPU 版本时遇到困难,你可以试试(取决于你的 CUDA 版本)

pip install mxnet-cu101==1.6.0 -f [https://dist.mxnet.io/python/all](https://dist.mxnet.io/python/all)

相关 Github 问题

使用

examples 文件夹中还有一个笔记本,展示了如何使用该模型。相关摘录如下:

论文的实验和结果

本文在两个数据集——零件数据集和 UCI 零售数据集上对模型进行了评估。对于概率预测的评估,他们使用分位数损失。

作者使用具有 10 个隐藏单元的单个隐藏层,并使用 softplus 激活将 LSTM 嵌入映射到分布参数。他们使用了全局 RNN,即所有时间序列共享 LSTM 参数。他们评估了提前一步的预测。

我们的实验和贡献

实验设置

我们没有重建实验,而是扩大了范围。我们选择的数据集是 UCI 零售数据集,而不是提前一步预测,而是提前 39 天预测。这更符合现实世界的应用,在现实世界中,您需要不止一步的提前预测来进行计划。除了与 Croston 及其变体进行比较,我们还与 ARIMA、ETS、NPTS 和 Deep AR 进行了比较(这是本文中提到的后续步骤)。

资料组

UCI 零售数据集是一个交易数据集,包含一家总部位于英国的注册无店铺在线零售商在 2010 年 1 月 12 日至 2011 年 9 月 12 日之间发生的所有交易。该公司主要销售独特的适合各种场合的礼品。这家公司的许多客户都是批发商。

栏目:

  • 发票号:发票号。名义上,分配给每笔交易的 6 位整数。如果此代码以字母“c”开头,则表示取消。
  • 库存代码:产品(物品)代码。名义上,一个 5 位数的整数,唯一分配给每个不同的产品。
  • 描述:产品(物品)名称。名义上。
  • 数量:每笔交易每种产品(物品)的数量。数字。
  • 发票日期:发票日期和时间。数字,每笔交易生成的日期和时间。
  • 单价:单价。数字,单位为英镑的产品价格。
  • CustomerID :客户编号。名义上,一个唯一分配给每个客户的 5 位整数。
  • 国家:国家名称。名义上,每个客户居住的国家的名称。

预处理:

  • 分组依据为库存代码国家发票日期 - >数量之和单价的平均值
  • 用零填充以使时间序列连续
  • 将数量的下限值裁剪为 0(去除负值)
  • 仅采用长度超过 52 天的时间序列。
  • 列车测试拆分日期:2011–11–01

统计:

  • 时间序列数:3828。过滤后:3671
  • 数量:平均值= 3.76,最大值= 12540,最小值= 0,中值= 0

时间序列分割

使用我们之前讨论过的相同的分割——间歇的、不规则的、平滑的和不稳定的——我将数据集分成四份。

作者图片

作者图片

我们可以看到,数据集中几乎 98%的时间序列是间歇的或不规则的,这对于我们的用例来说是完美的。

结果

基线比较

我们选择的基线是克罗斯顿预测。我们还对克罗斯顿做了轻微的修改,即 SBA 和 SBJ。因此,让我们首先针对这些基线进行比较,包括一步预测和 n 步预测。我们也将评估点预测(使用 MSE、MAPE 和 MAAPE)和概率预测(使用分位数损失)

1 步超前点估计值(中值)

领先一步概率预测

我们可以看到,DRP 模型在点预测和概率预测方面都大大优于基线方法。

现在让我们来看一下 n 步提前预测。

n 步超前点估计值(中值)

超前 n 步概率预测

在这里,我们看到了一个不同的画面。在预测点上,克罗斯顿在 MSE 上做得更好。DRP 在 MAPE 做得很好,但是我们知道 MAPE 倾向于预测不足,并且当我们观察间歇性需求模式时,它不太可靠。因此,从预测的角度来看,我不会说 DRPs 的长期预测优于 Croston。我们注意到的是,在 DRPs 中,混合解码在 MAPE 和 MSE 方面都比平面解码好得多。

扩展比较

为了进一步比较这些结果,让我们也包括来自其他流行预测技术的结果。我们在点估计稳定中加入了 ETS 和 ARIMA,在概率预测稳定中加入了 DeepAR 和 NPTS。

1 步超前点估计值(中值)

领先一步概率预测

在 MSE 上,ETS 占据了头把交椅,尽管在 MAPE 和 MAAPE 上,DRP 保住了他们的位置。在概率预测方面,DeepAR 有非常高的分位数损失,但当我们看加权分位数损失(按量加权)时,我们看到它出现在顶部位置。这可能是因为 DeepAR 在大部分时间预测为零(或接近零),并且只预测大批量 SKU 中的良好数字。在所有三个分位数的损失中,NPTS 似乎以微弱优势胜过 DRPs。

n 步超前点估计值(中值)

超前 n 步概率预测

当我们看长期预测时,我们看到 ARIMA 和 ETS 在点估计(MSE)方面做得相当好。在概率方面,Deep AR 扭转了这一局面,并成功成为最佳概率模型。

几个预测的例子

间歇

作者图片

作者图片

作者图片

作者图片

作者图片

作者图片

稳定(较少间歇)

作者图片

作者图片

作者图片

作者图片

参考

  1. 阿里·卡内尔·土库曼,王渔洋,蒂姆·贾努斯考斯基。“具有深度更新过程的间歇性需求预测”。arXiv:1911.10416 [cs。LG] (2019)
  2. 斯蒂芬妮格伦 。《负二项实验/分布:定义,例子》摘自StatisticsHowTo.com:对我们其他人来说的基本统计!https://www . statistics show to . com/negative-binomial-experiment/

原载于 2020 年 10 月 13 日【http://deep-and-shallow.com】

尼日利亚西北部和中北部的境内流离失所者

原文:https://towardsdatascience.com/internal-displacement-in-north-west-north-central-nigeria-b313c939b3b5?source=collection_archive---------33-----------------------

我们能从数字中学到什么?

图片来自难民署 KORA

近年来,尼日利亚境内流离失所者人数激增,特别是在该国北部。虽然受影响的人口有一个共同点——在国内流离失所和易受伤害,但他们在人口和地理分布以及安置原因方面可能有不同的特点。我认为,对所有参与向国内流离失所者提供人道主义服务的利益攸关方,最重要的是,对国家各级政府,更好地理解这些是必要的。

设定了这个论述的大背景,具体的背景是尼日尼亚西北中北部区。我的目标是通过询问一些具体问题,并使用下述数据集寻求答案,收集关于这两个地区的境内流离失所者的一些信息:

数据集:

尼日利亚位移数据—中北部&西北区—位置评估。 发布者 :国际移民组织

数据集涵盖 2019 年 9 月 4 日至 10 月 16 日期间,包括受流离失所影响最严重的州,包括: 贝努埃、纳萨拉瓦和中北部高原;西北部的卡杜纳、卡诺、卡齐纳、索科托和赞法拉 如下图:

尼日利亚地图。每个州的数字代表该州使用的当地语言的数量。FCT 和贡贝州的语言计数不可用。

问题 1:

a .报告的国内流离失所者有多少人口?

b .各区之间的人口规模有显著差异吗?

据报告,这两个地区共有 445,901 名境内流离失所者。这个数字相当于瓦里和阿萨巴(两个城市都在尼日利亚南部)人口的总和,从国际角度来看,甚至超过了德国苏黎世的人口。

图 A:国内流离失所者的区域分布。

大约 53%的国内流离失所者在中北部地区,47%在西北部地区。这两个地区的国内流离失所者人数只有 6%的差异。一般来说,这对于行政和服务交付来说可以认为是无关紧要的。

虽然这两个地区的国内流离失所者人数没有很大差别,但如果从州一级往下看,情况就不一样了。

图 B:国内流离失所者在各州的分布情况。

我们可以看到,国内流离失所者人数最多的两个州(贝努埃和高原)属于中北部。贝努埃和普拉托加起来约占整个中北部和西北地区境内流离失所者总数的 47%。同样位于中北部的纳萨拉瓦州的国内流离失所者人数最少,在这两个地区的国内流离失所者总人数中几乎微不足道。我们可以得出结论,中北部地区报告的各州显示了国内流离失所者人口的最高范围。

国内流离失所者是社会中的弱势群体,他们需要政府的干预以及人道主义组织和社会普通成员的援助才能生存。当国内流离失所者聚集在一起时,集中提供社会服务的办法可能效果最好。然而,当他们在地理上分散时,那么应用分布式解决方案交付可能比传统的集中式方法更好。为了获得这方面的一些见解,我问道:

问题 2:

国内流离失所者地点在各州各地方政府辖区的分布情况如何?

图 C:收容国内流离失所者的地方政府机构占每个州地方政府机构总数的比例。

以下是观察到的情况:

  1. 数据显示,境内流离失所者站点遍布东道州的大部分地方政府。
  2. 更准确地说,每个州 60%以上的地方政府所在地都有境内流离失所者。
  3. 值得注意的是,在高原州、赞法拉州和纳萨拉瓦州,所有地方政府辖区都有境内流离失所者。
  4. 卡诺州和卡齐纳州是仅有的拥有 30 多个地方政府所在地的州。此外,这两个州的 30 多个地方政府所在地有境内流离失所者。

问题 3:

各州境内流离失所者的性别分布情况如何?

图 D:各州女性与男性国内流离失所者比例图表。

数据显示,在这两个地区的所有州中,女性境内流离失所者人数更多。这种差距在贝努埃州最为突出。

如下图所示,进一步观察发现,在这两个地区的所有州,女性境内流离失所者平均多 9%(性传播疾病多 2.6%)。

图 E:各州女性与男性境内流离失所者的比例。

一个后续问题是:这一趋势(更多女性境内流离失所者)在地方政府一级是否保持?

图 f。

上文图 F 显示,这一趋势确实存在,因为 93%的地方政府中女性境内流离失所者多于男性。在这 93%中,约 21%的女性对男性的比例超过 16%,超过了州一级的最大百分比差异。

问题 4:

各州可以关注什么来阻止或减少人们流离失所的机会?

为了解决这个问题,首先,我们需要知道为什么大多数国内流离失所者流离失所。数据集中提供的一个数据点是大多数人流离失所的原因。这样,我们可以从解决上述问题 4 的角度收集一些见解。

在数据集中,部族冲突、叛乱、绑架、武装抢劫和自然灾害被列为大多数境内流离失所者流离失所的原因。每种原因下的人口比例如下:

在这两个地区(中北部和西北部),约 66%的境内流离失所者因社区冲突而流离失所。

这表明,解决现有的社区冲突和预防未来的事件将在所有国家减少 66%的国内流离失所者。

我们将进一步观察这些原因是否以及如何在各州报告中有所不同。

图 G:

在贝努埃、普拉托、纳萨拉瓦和卡杜纳等州,部族冲突仍然是境内流离失所的主要原因。非常值得注意的是,贝努埃省 100%的境内流离失所者和高原省 91%的境内流离失所者将部族冲突作为他们流离失所的主要原因。

图 H

索科托和赞法拉讲述了一个不同的故事。在这里,大多数国内流离失所者——索科托的 94%和赞法拉的大约 65%——称武装抢劫是他们流离失所的主要原因。

从所提供的数据来看,卡诺仍然是叛乱成为境内流离失所主要原因的唯一一个州。在卡齐纳州,社区冲突和自然灾害是流离失所的主要原因。事实上,卡诺和卡齐纳是仅有的两个报告自然灾害对国内流离失所有重大影响的州。

推论和建议:

  1. 一个国家的境内流离失所者往往分散在地方政府所在地,因此政府和非政府组织需要采取分布式服务提供方法,以更好地帮助境内流离失所者。
  2. 妇女往往占国内流离失所者人口的大多数。因此,在规划时,政府和非政府组织需要多分配一点资源来满足妇女的具体需求和/或服务。
  3. 虽然社区冲突是这两个地区和一些州流离失所的主要原因,但州行政人员需要分配更多资源,解决各自州流离失所的主要原因。

总之,必须指出,所提供的数据并没有告诉我们一个国家内的国内流离失所者是否来自同一个国家。由于出于这样或那样的原因在一个国家流离失所的人可以在该国境内或境外寻求庇护,这意味着流离失所的重要原因不一定发生在庇护国。因此,可以得出这样的结论:流离失所的原因很少归因于国家。

感谢阅读,请注意,此练习的源代码可在 Github 上的 此处 获得。

可解释与可解释的机器学习

原文:https://towardsdatascience.com/interperable-vs-explainable-machine-learning-1fa525e12f48?source=collection_archive---------6-----------------------

可解释的模型和可解释的模型之间的区别以及它为什么重要

从医疗诊断到信贷承保,机器学习模型正被用于做出越来越重要的决策。为了信任由这些模型驱动的系统,我们需要知道它们是如何做出预测的。这就是为什么可解释的模型和可解释的模型之间的区别如此重要。我们理解模型的方式以及我们能够真正理解的程度取决于它们是可解释的还是可解释的。

简而言之,一个可解释的模型可以被人类理解,而无需任何其他的帮助/技术。我们只看模型概要/参数就能理解这些模型是如何做出预测的。我们也可以说一个可解释的模型提供了它自己的解释。相比之下,一个可解释的模型不会提供自己的解释。就其本身而言,这些模型过于复杂,人类无法理解,它们需要额外的技术来理解它们如何做出预测。

在本文的其余部分,我们将:

  • 使用示例,深入探究我们如何将模型分类为可解释的或可解释的
  • 触及我们可以用来理解一个可解释的模型如何工作的技术
  • 讨论可解释性的概念以及它与可解释和可解释模型的关系

可解释的机器学习

我们说,如果一件事能够被理解,它就是可解释的。考虑到这一点,我们说如果一个模型能够被人类自己理解,那么它就是可解释的。我们可以查看模型参数或模型摘要,并准确理解它为什么做出某个预测/决策。我们下面讨论的可解释模型的例子包括决策树和线性回归。

在图 1 中,我们有一个决策树,它被训练来预测某人是否会拖欠汽车贷款。假设一个月收入 3000 美元的 29 岁的人提出申请。然后,基于这种模式,一个自动承保系统给了她一笔贷款。我们可以很容易地遍历树的节点,看看为什么做出这个决定。这个人超过 25 岁,所以我们在第一个节点向右走。那么她有一个大于 2000 的收入,所以我们又回到了无叶节点。换句话说,模型预测学生不会拖欠贷款。

图 1:默认预测的决策树(来源:作者)

从这个例子继续,假设我们想要一个模型,使用一个人的年龄和收入来预测给予一个人(Y)的最大贷款规模。我们使用线性回归,得出以下等式:

Y = 100 *年龄+10 *收入+ 200

我们看到,一个人每衰老一年,他们预测的最大贷款额就会增加 100 美元。同样,贷款规模随着收入的增加而增加。对于这个人(26 岁,收入 3000 美元),最大贷款额预计为 32800 美元。

所以就像决策树一样,我们可以查看这个模型的参数,并准确理解为什么它会做出这样的预测。这是因为这些模型相当简单。决策树只有几个节点,线性回归模型只有 3 个参数。随着模型变得越来越复杂,我们不能再以这种方式理解它们。

可解释的机器学习

你可以把 ML 模型想象成一个函数。模型特征是输入,预测是输出。一个可解释的模型是一个复杂到人类无法理解的函数。另一个名称是黑盒模型。我们需要一种额外的方法/技术来窥视黑盒并理解模型是如何工作的。

这种模型的一个例子是随机森林。简而言之,随机森林由许多决策树组成,在进行最终预测时,所有单个树的预测都会被考虑在内。为了理解一个随机的森林是如何工作的,我们必须同时理解所有的树木是如何工作的。即使有少量的树,这也是不可能的。

AlexNet 的架构(来源:Satya Mallick&Sunita Nayak

当我们开始考虑像神经网络这样的算法时,事情变得更加复杂。为了便于理解, AlexNet ,一个用于图像识别的卷积神经网络,有 62,378,344 个参数。相比之下,我们上面的简单回归模型只有 3 个参数。对于人类来说,仅仅通过查看参数权重来理解像 AlexNet 这样的模型是如何工作的是不可能的。

用于理解可解释模型的技术

我们需要一些额外的技术来理解像上面讨论的算法是如何进行预测的。这些可能包括像特征重要性评分这样的技术。这些技术试图确定每个单独的特征能够多好地预测目标变量。分数越高,特征对模型越重要,换句话说,特征对模型预测的影响越大。

来源: flaticon

还有一大堆试图分解单个预测的技术。因此,与着眼于整体预测的特征重要性不同,这些技术将解释每个特征如何对一个特定的预测做出贡献。这包括模型不可知的方法,如石灰SHAP 。这意味着它们可以用来解释任何 ML 模型的预测。它们还包括为特定模型创建的方法,例如用于解释神经网络预测的 DeepLIFT

当使用这些技术做出任何结论时,都应该小心谨慎。这是因为这些技术只能提供模型实际预测的近似值。为了验证任何结论,可以结合使用多种技术,或者使用数据可视化来验证这些技术。领域知识也是一个重要的工具。任何与以前的经验/知识相反的结果都应进行更详细的分析。

可解释性

到目前为止,我们已经讨论了可解释或可解释的模型,但是应用这种二元标志可能没有意义。这是因为一个模型的可解释性是在一个范围内的,在这个范围内,一些模型比另一些模型更具可解释性。换句话说,可解释性是一个模型能够被人类理解的程度。如果一个模型比另一个模型更容易让人理解它是如何做出预测的,那么这个模型就比另一个模型更容易解释。

在图 2 中,我们可以看到可解释性谱的含义。卷积神经网络比随机森林更难解释,而随机森林比决策树更难解释。大多数模型通常可以分为可解释的或可解释的,其中可解释的模型在光谱的右边,可解释的模型在光谱的左边。然而,有一个灰色地带,在那里你会发现人们对分类有不同意见。

图 2:可解释性谱

例如,像上面讨论的线性回归模型,可以容易地被人理解,并被归类为可解释的模型。在这种情况下,我们只有两个特征(年龄和收入),但如果我们添加更多的特征,模型将变得更加复杂,更难解释。然而,还不清楚回归模型在什么时候变得可以解释。

可解释性-准确性权衡

从上面我们可以看到,一般来说,越不复杂的模型越容易解释。因此,为了更高的可解释性,可能会有较低准确性的折衷。这是因为,在某些情况下,简单的模型可以做出不太准确的预测,但这实际上取决于你试图解决的问题。例如,使用可解释的模型(如逻辑回归)来进行图像识别,结果会很差。即便如此,对于许多问题,一个可解释的模型和一个可解释的模型表现一样好。

在下面的文章中,我们比较了一个可解释的模型,逻辑回归,和一个可解释的模型,神经网络。我们表明,通过对我们的问题进行一些思考,并从我们的数据集创建新的特征,我们可以通过一个可解释的模型实现类似的准确性。它很好地实践了我们在本文中讨论的一些概念。

[## 特征工程的力量

为什么您可能只应该使用逻辑回归来建模非线性决策边界(使用 Python 代码)

towardsdatascience.com](/the-power-of-feature-engineering-b6f3bb7de39c)

成为推荐会员

如果你觉得这篇文章很有帮助并且想看更多,你可以成为我的 推荐会员 来支持我

图像来源

图片为本人或从 www.flaticon.com 的获得。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。

参考

[1] C. Rudin,停止解释高风险决策的黑盒机器学习模型,转而使用可解释的模型(2019),https://www.nature.com/articles/s42256-019-0048-x

[2] R. Gall,机器学习可解释性 vs .可解释性:两个可以帮助恢复对 AI 信任的概念(2018),https://www . kdnugges . com/2018/12/Machine-Learning-explability-interprebility-AI . html

[3] S. Mallick & S. Nayak,卷积神经网络中的参数数量和张量大小(CNN) (2018 年),https://www . learnopencv . com/Number-of-Parameters-and-Tensor-Sizes-in-convolutionary-Neural-Network/

在 10 分钟内解释线性回归(非技术性)

原文:https://towardsdatascience.com/interpret-linear-regression-in-10-mins-non-technical-3f78f1f1dbd1?source=collection_archive---------19-----------------------

简·kopřiva 在 Unsplash 上的照片

当有那么多伟大的文章和对最常见算法的解释时,为什么还要花力气写这个呢?一个高管或非技术人员如何解读线性回归?所有的文章都很注重技术细节。

我喜欢理解事物减去额外努力后的样子。

线性回归是最基本的算法。尽管浏览线性回归教程可以让一个高中生在大约五分钟内理解并实现一个 Python 模型,但在生产环境中应用机器学习算法时还有更多细微差别。

这个博客和即将到来的系列文章的目的是用通俗的语言来捕捉和解释线性回归的微妙之处。你可以关注我这里了解更多。

线性回归模型是什么意思?

你记得我们在学校学过的直线方程吗?数学上,直线的表示表示为
y = MX + b。

直线方程(来源)

**y = mx + b**Where, if you were to imagine a straight line (as shown above),**m**: The slope of the line (The angle at which the line is turned)**b**: The intercept (On the Y-Axis, how much higher or lower is the line)**y**: The dependent/ target variable (The value we want to predict)**x**: The independent/ predictor variable (The variable that we use to make the prediction)

萨曼莎·加德斯Unsplash 上拍摄的照片

线性模型的真实解释:

让我们从一个管理者的角度来看模型,而不是一个精通技术的人。

机器学习模型只是一种能够表示或猜测接下来会发生什么的方法,某些东西属于哪里,或者什么样的特征组合将最适合知道接下来会发生什么。

一个机器学习模型是不是魔法。它只是数据的数学最佳表示。

直线模型中的直线代表直线。数据必须是这样的,即数据中有一个线性趋势,以便能够使用线性回归。让我们来看一个线性模型的经典例子——牛顿第一运动定律。

Force = Mass x Acceleration ( F = m x a )

现在让我们来解释一下。如果物体的质量不变,那么,当我们增加物体的加速度时,所施加的力也会增加。

为了与前面的公式进行比较,

y = mx + bFor this case, 
y = mxand, there is no intercept: '**b'** here. This means that the graph will pass through the origin. (when x = 0, y = 0)

现在让我们看看什么是线性回归中的回归。在机器学习中,

  • 因变量表示为“y”
  • 将要使用的独立变量表示为“X”

回归只是在自变量和因变量之间建立一种关系。线性回归是在特征和因变量之间建立一种关系,这种关系最好用直线来表示

线性回归有两种类型:简单线性回归和多元线性回归。

  • 简单线性回归:用一个自变量预测一个因变量
  • 多元线性回归:用多个自变量预测一个因变量

所以,如果你有一个数据科学家说:

我将对独立特征和预测值运行多元线性回归模型,理解他将尝试通过数据制作一条直线,该直线尽可能接近输入数据点。

可以用各种方法在数据中画一条线。

问:您认为最佳拟合线意味着什么?
答:在这里,你会听到数据科学家说,他们正试图最小化成本函数

问:成本函数/误差函数是什么意思?
A .汇总误差的函数。作为一个用户,你会想要一个最优成本函数,因为这将意味着你有最少的可能误差。

最佳拟合线将具有倾斜和截距,以使其通过或尽可能接近数据点。

萨法尔·萨法罗夫Unsplash 上拍摄的照片

代码?

为了能够解释模型的简单性和执行,您必须深入理解实现。在我的 Github 上,你可以随意使用同样的工具。如果您在机器学习笔记本的流程中遇到任何问题,请在那里提出问题或在下面发表评论。我强烈建议你在 MediumLinkedIn 上关注我,以便最大限度地接触科技前沿。

如果你想在旧的硬件上运行最新的模型,你可以参考这里的链接在云上免费运行它。

https://towards data science . com/running-jupyter-notebook-on-the-cloud-in-15-mins-azure-79b 7797 e4ef 6

评估:

作为一个被动的观察者,看着数据科学家向你展示的各种模型,你必须能够判断一个模型是否适合你的需求。请注意,我非常小心地避免在这里使用“好的 T4”或“坏的 T6”这个词。这是一个有意识的决定,因为它因情况而异。

然而,关于这一点,我已经听了太多遍了,我决心为您提供用例和直觉,以便您可以评估该模型是否适合您。在这里,我将强调指出,主管级别的人员可以查看数据科学 Jupyter 笔记本(代码)或提出问题,如下所述。

我将解释问题,但不解释答案,因为这是数据科学家的职责。

如果数据科学家无法回答,数据科学家需要进一步的培训,然后你才能决定相信结果。

卡洛斯·穆扎在 Unsplash 上的照片

  • 清理数据了吗?你采取了什么步骤,为什么?受影响的列有哪些?
  • 按行和列,丢失值 /损坏数据的百分比是多少?你如何处理丢失的数据?
  • 您是否对数据执行了异常值分析?你能给我看一下箱线图并向我解释它们以及你为什么决定保留异常值(或移除它们)的理由吗?
  • 给我看一下单变量图并详细解释给我听。请确保明确记录并提及有趣的趋势。
  • 给我看一下二元图并解释因变量的有趣趋势。确保你谈论的是与商业背景相关的最重要的变量。(索要热图)

凯文·Ku 在 Unsplash 上的照片

  • 对数据进行了特征工程吗?有哪些衍生/新功能?

  • 什么是测试列车拆分?为什么?火车测试数据中有溢出吗?

  • 是如何处理****分类变量并生成粘性变量的?有没有考虑过 哑变量陷阱

  • 在绘制模型时,变量应逐个删除,变量应在每个变量删除后进行统计和 VIF 分数分析。有人跟踪了吗?

  • 是否考虑过统计模型的 F 统计量p 值(一般小于 0.05)?

  • 有没有考虑过多重共线性的可能性?你能给我看看 VIF T21(可变通货膨胀系数)吗?(VIF > 10 可能表示多重共线性)

  • 你对测试数据的结果进行验证了吗?R 平方值是多少?(越接近 1 越好)

  • 什么是调整后的 R 平方值?这可用于比较具有不同数量特征的模型(越接近 1 越好)

如果你已经到了这种地步,那是令人钦佩的。这意味着你有真正的兴趣,你应该理解建模的细微差别。假设我们处理的是基本干净的数据,问上述问题将有助于我们解释线性回归模型。要进一步了解如何评估一个线性回归模型,你可以参考这里的链接。

结论:

虽然上述问题可能有助于您理解数据科学家所做的工作,但诠释数据科学的最佳方式就是亲自动手!无论是代码还是对代码的解释,获得理解的最佳方式是亲自动手,在 KaggleProjectPro 上查看一些行业标准实现。

[## Anish Mahapatra -数据科学家-穆适马公司| LinkedIn

我正在努力理解数学、商业和技术如何帮助我们在未来做出更好的决策…

www.linkedin.com](https://www.linkedin.com/in/anishmahapatra/)

我花了很多时间研究,并且非常喜欢写这篇文章。如果这对你有帮助,给我点爱!😄我也写关于千禧一代的生活方式咨询聊天机器人金融!如果您对此有任何问题或建议,请随时通过 LinkedIn联系我或关注我这里,我很想听听您的想法!

解释主成分分析(PCA)

原文:https://towardsdatascience.com/interpret-principal-component-analysis-pca-b8b4a4f22ece?source=collection_archive---------10-----------------------

故事。若昂·布兰科在 Unsplash 上的照片

数据可以告诉我们故事。反正我是这么听说的。作为一名为财富 300 强客户工作的数据科学家,我每天都要处理大量的数据,我可以告诉你,数据 可以 告诉我们故事。您可以对数据应用回归、分类或聚类算法,但特征选择和工程可能是一项艰巨的任务。很多时候,我看到数据科学家采用自动方法进行特征选择,如递归特征消除(RFE)或使用随机森林或 XGBoost 利用特征重要性算法。所有这些都是很好的方法,但可能不是获取所有数据“精华”的最佳方法。

理解 PCA 的细微差别

主成分分析的直觉

如果我们有两列代表 X 和 Y 列,你可以用 2D 轴来表示。假设我们添加了另一个维度,即 Z 轴,现在我们有了一个称为超平面的东西来表示这个 3D 空间中的空间。
现在,包含 n 维的数据集也无法可视化。

重新对齐轴以捕捉数据中的最大差异

PCA 的思想是在 n 维空间中重新排列轴,这样我们可以捕获数据中的大部分差异。在行业中,没有太大差异的特征被丢弃,因为它们对任何机器学习模型没有太大贡献。这些代表数据中大部分方差的新轴被称为主成分。

层次。Alexander Schimmeck 在 Unsplash 上拍摄的照片

使用主成分的原因是为了处理相关的预测值(多重共线性)以及在二维空间中可视化数据。

PCA 是一种统计过程,用于将可能相关的特征的观察结果转换成主成分,使得:

  • 它们彼此不相关
  • 它们是原始变量的线性组合
  • 它们有助于获取数据集中的最大信息

PCA 是数据中基础的变化。

主成分分析的方差

如果一个列的方差越小,它包含的信息就越少。PCA 以这样的方式改变基,使得新的基向量捕获最大方差或信息。这些新的基向量被称为主分量。

乔恩·泰森在 Unsplash 上的照片

主成分分析作为一种降维技术

想象一下很多数据科学家面临的情况。您已经收到数据,执行了数据清理、缺失值分析和数据插补。现在,您继续进一步分析数据,注意分类列,并通过创建虚拟变量对数据执行一次性编码。现在,我们进行特征工程,制造更多的特征。我有过这样的经历,这导致了超过 500 个,有时是 1000 个特性。

[## 在 15 分钟内在云上运行 Jupyter 笔记本电脑#Azure

文章做到了标题所说的。在 Azure 笔记本电脑(免费或付费)上运行 Jupyter Notebook,其成本仅为……

towardsdatascience.com](/running-jupyter-notebook-on-the-cloud-in-15-mins-azure-79b7797e4ef6)

我应该如何将如此多的特征输入到一个模型中,或者我应该如何知道重要的特征?如果我们继续使用递归特征消除或特征重要性,我将能够选择对预期输出贡献最大的列。然而,如果我们错过了一个对模型有更大贡献的特性呢?模型迭代的过程容易出错且繁琐。PCA 是我们可以利用的一种替代方法。

主成分分析是一种经典的降维技术,用于捕捉数据的本质。它可以用来捕捉超过 90%的数据方差。

:方差不表示列间关系或变量间的相关性。我们对协方差矩阵进行对角化,以获得如下基向量:

  • 无关联的
  • 线性相关
  • 解释最大方差的方向

PCA 的算法寻求找到对角化协方差矩阵的新的基向量。这是使用特征分解完成的。

照片由路易斯·费利佩Unsplash 上拍摄

主成分分析算法

  1. 将数据集中的所有信息表示为协方差矩阵。
  2. 对协方差矩阵执行特征分解。
  3. 新的基础是在步骤 I 中获得的协方差矩阵的特征向量
  4. 在新的基础上表示数据。新的基也被称为主成分。

我在 draw.io 中制作的 PCA 流

密码

现在,我在这里写的文章如果没有实际的编码经验是写不出来的。我相信你的代码应该在它该在的地方,不是在介质上,而是在 GitHub 上。

[## anishmahapatra 01/masters-机器学习-1

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/anishmahapatra01/masters-machine-learning-1/tree/master/04DimensionalityReduction-pca/pca-help-assignment/Anish-PCA-and-Clustering-Assignment)

我已经列出了注释代码和一个使用 PCA 的样本聚类问题,以及帮助您入门的必要步骤。

逻辑步骤详述如下:

  • 缺失值和异常值分析完成后,标准化/规范化数据以帮助模型更好地收敛
  • 我们使用 sklearn 的 PCA 包对数字和虚拟特征进行 PCA
  • 使用 pca.components_ 查看生成的 pca 成分
  • 使用 PCA.explained_variance_ratio_ 了解数据解释的差异百分比
  • Scree 图用于了解需要使用多少个主成分来获取数据中的期望方差
  • 运行机器学习模型以获得期望的结果

乔丹·怀特菲尔德Unsplash 上的照片

[## 在 10 分钟内解释线性回归(非技术性)

当有那么多伟大的文章和对最常见算法的解释时,为什么还要花力气…

towardsdatascience.com](/interpret-linear-regression-in-10-mins-non-technical-3f78f1f1dbd1)

结论:

恭喜你!如果你已经设法达到文章的这个阶段,你是令人敬畏的。起初,主成分分析似乎令人望而生畏,但是,随着你学会将它应用于更多的模型,你将能够更好地理解它。

所以,关于我的一点点。我是一家顶级数据科学公司的数据科学家,目前正在攻读数据科学硕士学位。我花了很多时间研究,并且非常喜欢写这篇文章。如果这对你有帮助,给我点爱!😄我也写关于千禧一代的生活方式咨询聊天机器人财经!如果您对此有任何问题或建议,请随时在 LinkedIn 上联系我或关注我这里,我很想听听您的想法!

[## Anish Mahapatra -数据科学家-穆适马公司| LinkedIn

我正在努力理解数学、商业和技术如何帮助我们在未来做出更好的决策…

www.linkedin.com](https://www.linkedin.com/in/anishmahapatra/)

解释你的回归

原文:https://towardsdatascience.com/interpret-your-regression-d5f93908327b?source=collection_archive---------50-----------------------

逐步实现逻辑回归

如果你手头有一个分类任务,你的 go-to 算法是什么?如果不是逻辑回归或者即使是,你有没有发现线性回归和逻辑回归之间的相似之处?如果是,那是因为逻辑回归本身就是一个线性模型。但是不要担心,在这篇文章中,你将通过解释一个逻辑回归和它的参数,你将得到为什么这个算法被认为是线性的答案。

使用的数据集是 UCI 机器学习库中可用的宫颈癌(风险因素)数据集。你可以在这里从那里得到干净的版本。

目标变量为‘活检’,存储布尔值 0,代表癌症阴性病例,1,代表癌症阳性病例。

预测器或特征是-

  • 荷尔蒙避孕药——(对/错)
  • 抽烟——(对/错)
  • 怀孕数量
  • 性病:诊断数量
  • 宫内节育器——(对/错)

数据集的清理和预处理、分类变量的虚拟编码和分割以通常的方式完成。接下来的步骤可以参考这里的

微软研究院的 InterpretML python 包已经用于该数据集的探索。

这篇文章遵循类似于解释你的回归——线性回归的结构,并处理逻辑回归的可解释性。

从目标变量的可视化开始探索性数据分析,观察到 2 个类别非常不平衡,因此,这是不平衡分类的情况。所有的分类变量本身也是不平衡的。

连续特征“怀孕次数”是高度正偏的,即右尾巴比左尾巴更长。这种分布预计会减少怀孕次数,如 1 次、2 次等。更加普遍。

逻辑回归方法用于分类任务,假设二项式分布产生了目标变量,我们需要为一组给定预测值的成功概率建模“p”。这里的‘p’是女性患宫颈癌的概率。

由于逻辑回归被认为是线性模型,为了简单起见,首先考虑一个简单的线性方程

记住标准 8 课,函数是在数学中首次引入的,考虑这样一个函数,logit 函数,给出如下

logit 函数的值域为[0,1],值域范围为∞到∞。

现在,考虑这个函数的逆函数,

这是 逻辑函数 ,其范围在∞~之间,域在 0 ~ 1 之间。

逻辑曲线

现在让我们来看最有趣的部分。考虑一个介于 0 和 1 之间的值“p”。所以, f(p) = log { p/(1-p) } 。如果假设“p”是女性患宫颈癌的概率,那么 p/(1-p) 是女性可能患宫颈癌的“几率”,其中“几率”只是定义事件概率的另一种方式。因此, f(p) 可以被认为是女性可能患有癌症的对数几率。

现在,f(p)的范围位于∞和∞之间,可以有把握地假设:

另一种写法是

这个公式用于解释模型,因为 logit 可以解释为成功几率的对数

对于将线性模型与结果参数联系起来的任意函数 g(p) = y,该模型被称为 广义线性模型 。所以,当你在线性回归模型上使用逻辑斯蒂函数时,你会得到逻辑斯蒂回归的算法。

现在剩下的唯一工作是将概率值分类,这是使用一个简单的条件完成的。如果' p' > 0.5,则类为 1,否则为 0。

在宫颈癌数据集上训练逻辑回归给出了93%的准确度,这看起来相当高,但是由于这是一个不平衡的分类,因此需要进一步分析。

逻辑回归的权重被解释为特征 x 的一个单位的变化改变了𝛽单位的成功几率的对数,就像简单线性回归的情况一样。但是为了简单起见,解释是根据比值比进行的,比值比只不过是对数比值的指数。

在所有其他特征保持不变的情况下,怀孕数量的增加改变或增加了癌症与非癌症的几率 1.07 倍。

对于使用宫内节育器(IUD)的女性,在所有其他特征保持不变的情况下,与未使用 IUD 的女性相比,患癌与未患癌的几率低 0.58 倍。

这些解释总是附带一个注释,即“所有其他特征保持不变”,以避免变量之间的相互作用。

为了进一步分析分类模型的准确性,绘制了精度-召回曲线,因为这是不平衡分类的情况。

“然而,如果类分布中有很大的偏差,ROC 曲线可能会对算法的性能表现出过于乐观的看法。[……]在信息检索中经常使用的精确回忆(PR)曲线,已经被引用作为 ROC 曲线的替代,用于类别分布中具有大偏斜的任务。”

——杰西·戴维斯和马克·戈德里奇,
(引自戴维斯,j .和戈德里奇,M. 2006,

精确回忆和 ROC 曲线的关系,ICML 06:第 23 届机器学习国际会议论文集)

精确回忆曲线提醒人们注意这一点:对于大多数阈值来说,模型只是稍微高于无技能线。无技能线是一条平行于 x 轴的线,其值为数据集中阳性病例的比率,在本例中为 0.06。但这与 93%的高准确率相矛盾。

对混乱矩阵的研究将澄清这种情况。

观察到该分类器已经不能正确地分类任何阳性类别(类别 1)。大多数情况属于 0 类,并且所有预测都属于 0 类,这一事实导致分类器的高准确度。因此,这种类的不平衡需要通过对数据集中的类 1 进行过采样或对类 0 进行欠采样来补偿,目前这已经超出了本文的范围。

这就是逻辑回归如何发挥作用的,人们希望这种算法被认为是线性的背后的逻辑,以及对权重的解释现在已经很清楚了。逻辑回归仍然是机器学习世界中最强大的算法之一,由于其简单性,在不久的将来不会对其地位和重要性构成威胁。

本文基于 Christoph Molnar 的《可解释的机器学习》一书的探索,第 4.2 节你可以在这里找到 Github repo

解释你的回归

原文:https://towardsdatascience.com/interpret-your-regressions-1-cae5c2f4c0f9?source=collection_archive---------37-----------------------

线性回归演练

“如果你把数据折磨够了,自然总会招供的。”
——罗纳德·科斯
(引自科斯,R. H. 1982。经济学家应该如何选择?
美国企业研究所,华盛顿特区)

你有多少次冒险越过。fit()和。你做的无数机器学习模型的 predict()方法?想知道术语“权重”实际上代表什么,以及它在不同算法中的不同解释吗?在梯度推进中,预测是由先前的树模型做出的预测的加权和,因此,权重指的是模型中每个变量的相对重要性。另一方面,在广义线性模型中,权重意味着目标变量随着相应特征的单位变化而变化。

在本文中,您将了解机器学习世界中最广泛使用的算法之一——线性回归,并且在文章结束时,您将揭示这个看似简单的算法所包含的许多秘密。

这里使用的数据集是 UCI 机器学习库中可用的自行车共享数据集。你可以从这里得到清理后的版本。

目标变量,也称为回归变量,是某一天借出的自行车总数。

使用的预测器或回归器是-

  • 季节:季节(1:冬季,2:春季,3:夏季,4:秋季)
  • 节假日:当天是否为节假日
  • 工作日:如果该日既不是周末也不是节假日,则为 1,否则为 0。
  • 天气状况:

- 1:晴,少云,部分多云,部分多云

- 2:薄雾+多云,薄雾+碎云,薄雾+少云,薄雾

- 3:小雪、小雨+雷雨+散云、小雨+散云

- 4:暴雨+冰托盘+雷雨+雾、雪+雾

  • temp :归一化温度,单位为摄氏度。
  • 嗡嗡声:归一化湿度。
  • 风速:归一化风速。
  • 自 2011 年起天数:自 2011 年 1 月 1 日起的天数。

数据集的初始预处理、虚拟编码和分割是以通常的方式完成的。接下来的步骤可以参考这里的

InterpretML python 包 已用于该数据集的探索。InterpretML 是一个开源的 python 包,用于训练可解释的机器学习模型和解释黑盒系统。

从目标变量的可视化开始探索性数据分析,可以假设它遵循正态分布,因为它似乎是近似对称的。

接下来,我们观察到,所有类别的分布都呈现出明显的不平衡,回归方程与“temp”和“days_since_2011”的正相关值分别为 0.63。这两个特征预计将在模型中占有很高的权重。

相关矩阵

另一个要观察的点是‘天气坐 _ 1’和‘天气坐 _ 2’之间的相关值为-0.94。这让我们想到了线性回归的假设之一,不存在多重共线性。多重共线性意味着回归模型中的部分或全部解释变量之间存在某种关系。比如,在家庭用电量对其收入和房屋面积的回归中,有一个约束条件,即收入较高的家庭通常拥有较大的房屋。因此,不可能分别测量两个预测因素对目标的影响。在给定的数据集中,“weathersit_1”和“weathersit_2”都是指晴空和有雾(不清晰)的天空,它们是互补事件,因此,它们之间存在高度负相关。这两个变量都保存在数据集中,不会被删除,但是它们对自行车数量的影响无法以通常的方式确定。

训练一个简单的线性回归模型,假设目标变量与特征共享一个线性关系,给我们一个 79%的相关值。因此,可以说该模型能够解释目标变量中存在的全部变化的 79%。

查看残差的直方图显示,分布是负偏斜的,即左尾部比右尾部相对更长。这就违背了homoscedastacy的假设,即误差分布的方差应该是常数,或者在一个模型中,

从图中可以清楚地看出,残差不遵循这样的分布,因此可以说是异方差的。因此,在这种情况下,不能使用普通的最小二乘法(这是执行线性回归最常用的方法),而需要使用加权最小二乘法。

然而,既然模型已经建立和拟合,让我们继续解释模型的权重。

x 轴代表分配给相应预测变量的权重的数值。

在连续特征中,“温度”的权重最高。这与我们的观察结果一致,即“温度”与自行车数量之间存在有效的相关性。在所有其他特征保持不变的情况下,气温每升高 1 摄氏度,自行车的预期数量就会增加 5282 辆。

“weathersit_1”表示晴朗的天气条件,并在分类特征中获得最大权重。在这样的日子里,预计会有更多的人去骑自行车,这是正常的如果所有其他特征保持不变,与其他天气条件相比,自行车的数量估计会多 1730 辆。

这些解释总是带有“假设所有其他特征保持不变”的条款,因为即使一个特征值发生变化,也会在模型中产生交互作用,从而影响目标变量。

需要注意的一点是,“days_since_2011”在模型中似乎没有任何重要性,尽管它与目标变量存在相关性。为了进一步研究这个问题,我们来看一下个体预测是如何进行的。

x 轴代表各自权重和特征值的乘积。

与整个数据集相比,某些要素对预测自行车数量的贡献非常小或非常大。与平均值和特征“days_since_2011”相比,温度(0.48 度)对预测值的贡献非常小,因为此实例来自 2012 年末(703 天)。

数据集中引入了“days_since_2011”特征,以说明自行车租赁服务随着时间的推移变得越来越受欢迎的趋势。这导致将自相关引入到模型中。比如说,在消费支出对收入的时间序列回归中,往往会发现,当期的消费支出,除了当期的收入之外,还取决于上一期的消费支出。如果你的收入是卢比。每月 10000,在三月,你花了卢比。9000,你在 4 月这个月花的少是很自然的。像这样的回归被称为自回归,因为其中一个解释变量是因变量的滞后值。在该数据集中,可能是第 7 天下了大雨,因此,接下来的几天自行车数量比平时有所减少。因此,这种自回归需要通过变量的变换来调整。

既然你已经读完了这篇文章,我们假设你已经了解了“简单”线性回归的广阔世界。希望这篇文章能帮助你更好地理解算法,建立更有效的模型。

本文基于克里斯托夫·莫尔纳尔的《可解释的机器学习》一书的探索,第 4.1 节你可以在这里找到 Github repo

可解释性和 TCAV

原文:https://towardsdatascience.com/interpretability-and-tcav-1a08e0a6cf63?source=collection_archive---------37-----------------------

确保专家知识反映在你的深度学习模型中

当我在写硕士论文并试图获得研究成果时,我暂停了一分钟,想真正欣赏机器学习领域的突破性发现。这些想法只是基于一些常识和简单的数学。

我目前正在研究一个模型预测的可解释性。我想分享我对什么是可解释性的理解,并进一步解释概念激活向量及其重要性。一如既往,我会尽可能用简单的语言来解释。这里有几个概念可以帮助你。

照片由像素上的 Pixabay 拍摄

可解释性/解释:假设,有一个模型被训练来将一组图像分类为猫或者不是猫。可解释性是解释为什么一个特定的图片被归类为猫。这对于确认领域专业知识是否已经反映在 NN 模型中是很重要的。此外,它有助于用户建立信任,这是使用模型所必需的。

局部解释:如果我们考虑一个单一的数据点/一只猫的单一图像,并解释为什么它被这样分类,那么它将是一个局部解释。假设,它可能是那只猫的脸和身体的像素。

图片:Hjvannes/ 维基共享资源

全局解释:将解释在这种情况下,在模型中产生分类的特定特征或概念。在将图像分类为猫或不是猫的例子中,全局解释可能是猫的胡须或耳朵。你可以看到我强调了模型这个词,因为这些特性有助于理解模型的整体行为,而不仅仅是一个单独的图像。

好了,我想你现在已经掌握了基本知识。

现在让我们讨论一种局部解释方法,即 s aliency maps 。对于那些不太了解显著图的人来说,它指定了每个输入特征对于预测的重要性。也就是说,类别概率对每个像素的导数,即像素的微小变化会改变特定类别的概率吗?如果是,那么增加多少?

显著图的问题是确认偏差,我们只看到我们认为真实的东西。因此,现在代替人类的主观判断,如果我们有一个定量的判断来理解哪个概念更重要,这将是一个更好的质量测量。此外,由于人类不考虑像素,我们应该考虑人类可以理解的高级概念。此外,理解一个模型为什么起作用是相当重要的,而不是局部的解释。所以我们想集中在一个全球性的解释上。这些欲望导致了和的关系,激发了的创造力。

TCAV 提供了一个定量的解释,说明我们在为预测进行训练后得出的概念有多重要。但是,你如何表达一个概念呢?我们用一个向量来做,即ConceptAactivationVector(CAV)。

(a)概念和随机对象的图像(b)类别图像(c)从图像的模型中收集激活(d)线性分类器和与决策边界正交的 CAV)使用概念中 w.r.t .变化的导数的 TCAV 分数。来源: TCAV 论文 [1]

对于 CAV,我们拍摄概念的图像和一些其他随机图像,然后我们拍摄我们正在研究的网络的激活。现在,因为我们有激活和概念,我们训练一个线性分类器来从随机图像中分离概念。与决策边界正交的向量给出了 CAV,它是一个向概念图像移动并远离随机图像的向量。

现在对于 TCAV 分数,我们做一些类似于我们在显著图中做的事情。TCAV 分数告诉我们每个概念对预测有多重要。这意味着类别概率对每个概念的导数,即概念的微小变化会改变特定类别的概率。

论文中,TCAV 被应用于预测糖尿病视网膜病变(DR)这一影响眼睛的糖尿病并发症的现实世界问题。该模型被训练为使用基于复杂标准的 5 分分级来预测 DR 水平,其中 0 级对应于没有 DR,4 级对应于增生性 DR。医生根据诊断概念诊断 DR,例如微动脉瘤(MA)或泛视网膜激光疤痕(PRP),不同的概念在不同的 DR 水平上更突出。 1

4 级和 1 级 DR 的 TCAV 结果。相关的概念用绿色表示,不相关的用红色表示。来源: TCAV 论文

使用 TCAV 测试了这些概念对模型的重要性分数。对于某些 DR 级别,TCAV 认为正确的诊断概念非常重要。然而,该模型经常将 1 级(轻度)过度预测为 2 级(中度)。考虑到这一点,医生说她想告诉模型不要强调 HMA 对于 1 级的重要性。因此,当专家不同意模型预测时,TCAV 可能有助于帮助他们解释和修复模型错误。因此,确保领域专业知识在模型中得到反映。[ 1

这很棒,但是这个工具需要人类收集相关的概念。有进一步的研究讨论了如何在没有人类监督的情况下做到这一点。

参考文献

[1]https://arxiv.org/pdf/1711.11279.pdf 论文:TCAV

W & B——CAM 和 GradCAM 深度学习的可解释性

原文:https://towardsdatascience.com/interpretability-in-deep-learning-with-w-b-cam-and-gradcam-45ba5296a58a?source=collection_archive---------26-----------------------

生产中的机器学习

这份报告将回顾 Grad-CAM 如何反驳神经网络不可解释的常见批评。

点击查看互动报道。所有的代码都可以在这里找到。

训练一个分类模型很有趣,但是你有没有想过你的模型是如何进行预测的?你的模型是不是真的看了图像中的狗,才以 98%的准确率将其归类为狗?很有趣,不是吗。在今天的报告中,我们将探讨为什么深度学习模型需要可解释,以及一些有趣的方法来窥视深度学习模型的内幕。深度学习的可解释性是一个非常令人兴奋的研究领域,在这个方向上已经取得了很多进展。

那么,为什么要关心可解释性呢?毕竟,企业或项目的成功主要是由模型的准确性来判断的。但是为了在现实世界中部署我们的模型,我们还需要考虑其他因素。例如,有种族偏见?或者,如果它对人类的分类准确率为 97%,但对男性的分类准确率为 99%,而对女性的分类准确率仅为 95%,那该怎么办?

了解模型如何做出预测也可以帮助我们调试您的网络。[查看这篇关于使用 PyTorch 和 W & B 使用渐变和可视化调试神经网络的博文,了解其他一些有帮助的技术]。

在这一点上,我们都熟悉这样一个概念,即深度学习模型根据用其他更简单的表示形式表达的学习表示进行预测。也就是说,深度学习允许我们从更简单的概念中构建复杂的概念。这里有一篇惊人的distilt Pub帖子,可以帮助你更好地理解这个概念。我们还知道,在一些监督学习任务(如图像分类)的情况下,这些表示是在我们用输入数据和标签训练模型时学习的。对这种方法的批评之一是神经网络中学习到的特征是不可解释的。

今天,我们将着眼于解决这一批评的两种技术,并揭示神经网络学习的“黑盒”性质。

  • 类别激活图(CAM)
  • 梯度凸轮

类别激活映射

已经观察到,卷积神经网络的各层的卷积单元充当对象检测器,即使在为分类任务训练网络时没有提供关于对象位置的这种先验。尽管卷积具有这种显著的性质,但是当我们使用完全连接的层来执行分类任务时,它就失去了作用。为了避免使用完全连接的网络,一些架构,如网络中的网络(T2)和谷歌网络(T4)都是完全卷积的神经网络。

全局平均池(GAP)是这种架构中非常常用的层。它主要用作调整剂,以防止训练时过度拟合。学习区分性定位的深度特征的作者发现,通过调整这样的架构,他们可以扩展 GAP 的优势,并可以保留其定位能力,直到最后一层。让我们试着快速理解使用 GAP 生成 CAM 的过程。

类别激活图简单地指示图像中的区别区域,CNN 使用该区域将该图像分类到特定类别中。对于这种技术,网络由 ConvNet 和 Softmax 层(用于多类分类)组成,在卷积特征图上执行全局平均池。该图层的输出用作全连接图层的要素,该图层可生成所需的分类输出。给定这个简单的连通性结构,我们可以通过将输出层的权重投射回卷积特征图上来识别图像区域的重要性。

图 CAM 的理想网络架构( 来源 )

让我们尝试实现这一点。😄

步骤 1:修改你的模型

假设您已经用 Conv 块和几个完全连接的层构建了深度分类器。我们将不得不修改这个架构,这样就没有任何完全连接的层。我们将在输出层(softmax/sigmoid)和最后一个卷积块之间使用GlobalAveragePooling2D层。

CAMmodel对我们的猫狗分类器进行了必要的修改。这里我用预先训练好的 **VGG16** 模型来模拟我已经训练好的猫狗分类器。

def CAMmodel():
     ## Simulating my pretrained dog and cat classifier. 
     vgg = VGG16(include_top=False, weights='imagenet')
     vgg.trainable = False
     ## Flatten the layer so that it's not nested in the sequential model.
     vgg_flat = flatten_model(vgg)
     ## Insert GAP
     vgg_flat.append(keras.layers.GlobalAveragePooling2D())
     vgg_flat.append(keras.layers.Dense(1, activation='sigmoid'))

     model = keras.models.Sequential(vgg_flat)
     return model

一个简单的实用程序flatten_model返回我的预训练模型中的图层列表。这样做是为了在使用Sequential模型修改时各层不会嵌套,并且可以访问最后一个卷积层并将其用作输出。我在从flatten_model返回的数组中追加了GlobalAveragePooling2DDense。最后,返回顺序模型。

def flatten_model(model_nested):
    '''
    Utility to flatten pretrained model
    '''
    layers_flat = []
    for layer in model_nested.layers:
       try:
          layers_flat.extend(layer.layers)
       except AttributeError:
          layers_flat.append(layer)

    return layers_flat

接下来,我们用适当的模型输入形状调用model.build()

keras.backend.clear_session()
model = CAMmodel()
model.build((None, None, None, 3)) # Note
model.summary()

第二步:用CAMLogger回调重新训练你的模型

由于引入了新的层,我们必须重新训练模型。但是我们不需要重新训练整个模型。我们可以通过使用vgg.trainable=False来冻结卷积块。

图 2:再训练模型后的度量图。

观察:

  • 就训练和验证准确性而言,模型性能有所下降。我达到的最佳训练和验证精度分别是99.01%95.67%
  • 因此,为了实施 CAM,我们必须修改我们的架构,从而降低模型性能。

步骤 3:使用CAMLogger查看类激活图

CAM类的__init__中,我们初始化cammodel。注意这个cammodel有两个输出:

  • 最后一个卷积层的输出(此处为block5_conv3
  • 模型预测(softmax/sigmoid)。
class CAM:
  def __init__(self, model, layerName):
    self.model = model
    self.layerName = layerName
    ## Prepare cammodel
    last_conv_layer = self.model.get_layer(self.layerName).output
    self.cammodel = keras.models.Model(inputs=self.model.input,
                                       outputs=[last_conv_layer, self.model.output])

  def compute_heatmap(self, image, classIdx):
    ## Get the output of last conv layer and model prediction
    [conv_outputs, predictions] = self.cammodel.predict(image)
    conv_outputs = conv_outputs[0, :, :, :]
    conv_outputs = np.rollaxis(conv_outputs, 2)
    ## Get class weights between 
    class_weights = self.model.layers[-1].get_weights()[0]
    ## Create the class activation map.
    caml = np.zeros(shape = conv_outputs.shape[1:3], dtype=np.float32)
    for i, w in enumerate(class_weights[:]):
      caml += w * conv_outputs[i, :, :] caml /= np.max(caml)
    caml = cv2.resize(caml, (image.shape[1], image.shape[2]))
    ## Prepare heat map
    heatmap = cv2.applyColorMap(np.uint8(255*caml), cv2.COLORMAP_JET)
    heatmap[np.where(caml < 0.2)] = 0 return heatmap
  def overlay_heatmap(self, heatmap, image):
    img = heatmap*0.5 + image
    img = img*255
    img = img.astype('uint8')
    return (heatmap, img)

compute_heatmap方法负责生成热图,这是 CNN 用来识别类别(图像类别)的区分区域。

  • 输入图像上的cammodel.predict()将给出形状(1,7,7,512)的最后一个卷积层的特征图。
  • 我们还提取形状(512,1)的输出层的权重。
  • 最后,计算从最终层提取的权重和特征图的点积,以产生类别激活图。

现在我们把所有东西都包装在回调中。CamLogger回调集成了wandb.log()方法,将生成的激活图记录到 W & B 运行页面上。通过调用overlay_heatmap()方法,从 CAM 返回的热图最终叠加在原始图像上。

步骤 4:从 CAM 中得出结论

从下图中我们可以得出很多结论。👇注意examples图表包含验证图像及其预测分数。如果预测得分大于 0.5,则网络将图像分类为狗,否则分类为猫。而CAM图表有其对应的类激活图。让我们回顾一些观察结果:

  • 该模型通过查看图像中的面部区域将图像分类为狗。对于一些图像,它能够看到整个身体,除了爪子。
  • 该模型通过观察耳朵、爪子和胡须将这些图像归类为猫。

图 3:看着狗的脸和猫的胡须,爪子和耳朵。

  • 对于错误分类的图像,模型没有看到它应该看到的地方。因此,通过使用 CAM,我们能够解释这种错误分类背后的原因,这真的很酷。

图 4: CNN 在看别的东西。

这是为什么呢?即使耳朵、爪子和胡须出现在图像中,为什么它会看着别的东西呢?我能想到的一个原因是,由于我们没有在我们的猫狗数据集上微调我们的预训练VGG16,作为特征提取器的 CNN 并不完全熟悉我们数据集中出现的模式(分布)。

  • 当同一类的多个实例出现在图像中时,模型只查看其中的一个。但这没关系,因为我们不关心物体检测。请注意,由于这个原因,可信度很低。

图 5:只查看一个事件。

其他用例:

CAM 可用于弱监督的目标定位任务。链接论文的作者在 ILSVRC 2014 基准数据集上测试了 CAM 执行本地化任务的能力。该技术能够在该数据集上实现 37.1%的目标定位前 5 名误差,这接近于由完全监督的 CNN 方法实现的 34.2%的前 5 名误差。

图 6:更多的例子。点击此处查看更多此类示例。

梯度加权类激活图

尽管 CAM 很棒,但它也有一些局限性:

  • 为了使用 CAM,需要修改模型。
  • 修改后的模型需要重新训练,这在计算上是昂贵的。
  • 因为完全连接的致密层被移除。模型性能肯定会受到影响。这意味着预测分数没有给出模型能力的实际情况。
  • 用例受到架构约束的限制,即在输出层之前执行卷积映射间隙的架构。

什么是好的视觉解释?:

  • 当然,该技术应该将图像中的类本地化。我们在 CAM 中看到了这一点,而且效果非常好。
  • 应该捕获更精细的细节,即激活图应该是高分辨率的。

因此 Grad-CAM:通过基于梯度的定位从深度网络进行视觉解释,这是一篇非常惊人的论文,作者提出了对 CAM 和以前方法的修改。他们的方法使用流入最终卷积层的任何目标预测的梯度来产生粗略的定位图,该定位图突出显示图像中的重要区域,用于预测图像的类别。

因此 Grad-CAM 是 CAM 的严格推广。除了克服 CAM 的局限性,它还适用于涉及 CNN 的不同深度学习任务。它适用于:

  • 具有全连接层(例如 VGG)的 CNN,无需对网络进行任何修改。
  • CNN 用于结构化输出,如图像字幕。
  • CNN 用于具有多模态输入的任务,如视觉问答或强化学习,无需架构改变或重新训练。

图 7: Grad-CAM 概述( 来源 )

让我们实现它😄

第一步:你的深度学习任务

我们将关注图像分类任务。与 CAM 不同,我们不必为此任务修改模型并重新训练它。

我使用了一个在ImageNet上预先训练的VGG16模型作为我的基础模型,我用它来模拟迁移学习。

通过使用vgg.trainable = False,基线模型的层变成不可训练的。请注意我是如何在模型中使用完全连接的层的。

def catdogmodel():
  inp = keras.layers.Input(shape=(224,224,3))
  vgg = tf.keras.applications.VGG16(include_top=False, weights='imagenet', input_tensor=inp,
                                            input_shape=(224,224,3))
  vgg.trainable = False

  x = vgg.get_layer('block5_pool').output
  x = tf.keras.layers.GlobalAveragePooling2D()(x)
  x = keras.layers.Dense(64, activation='relu')(x)
  output = keras.layers.Dense(1, activation='sigmoid')(x) model = tf.keras.models.Model(inputs = inp, outputs=output)

  return model

你会在链接的笔记本中找到班级GradCAM。这是一个来自 Grad-CAM 的修改实现:用 Keras、TensorFlow 和 Deep Learning 可视化类激活图,这是一篇令人惊叹的博文,作者是 PyImageSearch.com 的 Adrian Rosebrook。我强烈建议查看那篇博文中的GradCAM类的逐步实现。

我对它做了两处修改:

  • 在进行迁移学习时,即如果你的目标(最后一层)卷积层不可训练,tape.gradient(loss, convOutputs)会返回None。这是因为tape.gradient()默认不跟踪不可训练的变量/层。因此,要使用该层来计算你的渐变,你需要通过在目标层输出(张量)上调用tape.watch()来允许GradientTapewatch。因此发生了变化,
with tf.GradientTape() as tape:
      tape.watch(self.gradModel.get_layer(self.layerName).output)
      inputs = tf.cast(image, tf.float32)
      (convOutputs, predictions) = self.gradModel(inputs)
  • 最初的实现没有考虑二进制分类。最初的作者也谈到了输出的软最大化。所以为了训练一个简单的猫狗分类器,我做了一个小小的修改。因此发生了变化,
if len(predictions)==1:
      # Binary Classification
      loss = predictions[0]
    else:
      loss = predictions[:, classIdx]

GRADCAM类可以在模型训练后使用,也可以作为回调使用。这是他博客文章的一小段摘录。

第三点激励我从事这个项目。我围绕这个GRADCAM实现构建了一个定制回调,并使用wandb.log()来记录激活映射。因此,通过使用这个回调,您可以在训练时使用 GradCAM。

第三步:使用GRADCamLogger并训练

鉴于我们正在处理一个简单的数据集,我只训练了几个时期,这个模型似乎工作得很好。

下面是 GradCAM 自定义回调。

class GRADCamLogger(tf.keras.callbacks.Callback):
    def __init__(self, validation_data, layer_name):
      super(GRADCamLogger, self).__init__()
      self.validation_data = validation_data
      self.layer_name = layer_name def on_epoch_end(self, logs, epoch):
      images = []
      grad_cam = [] ## Initialize GRADCam Class
      cam = GradCAM(model, self.layer_name) for image in self.validation_data:
        image = np.expand_dims(image, 0)
        pred = model.predict(image)
        classIDx = np.argmax(pred[0])

        ## Compute Heatmap
        heatmap = cam.compute_heatmap(image, classIDx)

        image = image.reshape(image.shape[1:])
        image = image*255
        image = image.astype(np.uint8) ## Overlay heatmap on original image
        heatmap = cv2.resize(heatmap, (image.shape[0],image.shape[1]))
        (heatmap, output) = cam.overlay_heatmap(heatmap, image, alpha=0.5) images.append(image)
        grad_cam.append(output) wandb.log({"images": [wandb.Image(image)
                            for image in images]})
      wandb.log({"gradcam": [wandb.Image(cam)
                            for cam in grad_cam]})

图 8:培训后的指标。

步骤 4:从 GradCAM 中得出结论

GradCAM 是 CAM 的严格概括,应优先于 CAM。为了理解这项技术的理论基础,我推荐阅读 Divyanshu Mishra 的使用 GradCam 揭开卷积神经网络的神秘面纱,或者只是阅读链接的论文。我们可以得出一些有趣的结论,包括:

  • 模型看着狗的脸来正确分类,而我不确定猫。

图 8:看狗狗的脸。

  • 该模型能够在图像中定位该类的多个实例,即预测分数考虑了图像中的多个狗和猫。

图 9:查看多次出现。

图 10:更多的例子。点击此处查看更多此类示例。

结论

类激活图Grad-CAMs 是将一些可解释性/可解释性引入深度学习模型的几种方法,并且被相当广泛地使用。这些技术最吸引人的是执行目标定位任务的能力,即使没有事先训练模型的位置。GradCAM 在用于图像字幕时,可以帮助我们理解图像中的哪个区域用于生成某个单词。当用于视觉 Q & A 任务时,它可以帮助我们理解为什么模型会得出特定的答案。尽管 Grad-CAM 具有类别区分能力,并能定位相关图像区域,但它无法像像素空间梯度可视化方法(如引导反向传播和去卷积)那样突出精细细节。因此,作者将 Grad-CAM 与引导反向传播相结合。

感谢阅读这篇报道直到最后。我希望你发现这里介绍的回调对你的深度学习魔法有帮助。请随时在 Twitter( @ayushthakur0 )上与我联系,获取对本报告的任何反馈。谢谢你。

机器学习中的可解释性

原文:https://towardsdatascience.com/interpretability-in-machine-learning-ab0cf2e66e1?source=collection_archive---------14-----------------------

为什么我们需要理解我们的模型如何做出预测

我们应该永远相信一个表现良好的模型吗?一个模特可能会拒绝你的抵押贷款申请或者诊断出你患有癌症。这些决定的后果是严重的,即使它们是正确的,我们也希望得到解释。一个人可以告诉你,你的收入太低,还不上抵押贷款,或者某个特定的细胞群可能是恶性的。一个提供类似解释的模型会比一个只提供预测的模型更有用。

来源: flaticon

通过获得这些解释,我们说我们正在解释一个机器学习模型。在本文的其余部分,我们将更详细地解释可解释性的含义。然后,我们将继续讨论能够解释您的模型的重要性和好处。然而,仍然有一些不利因素。最后,我们将讨论这些问题,以及为什么在某些情况下,你可能更喜欢一个不太容易解释的模型。

我们所说的可解释性是什么意思?

在之前的一篇文章中,我讨论了模型可解释性的概念,以及它与可解释的机器学习的关系。总而言之,可解释性是模型能够被人类理解的程度。如果人类更容易理解模型 A 如何做出预测,那么模型 A 比模型 B 更容易解释。例如,卷积神经网络比随机森林更难解释,而随机森林比决策树更难解释。

记住这一点,我们说一个模型是一个可解释的模型,如果它可以在没有任何其他帮助/技术的情况下被理解。可解释的模型是高度可解释的。相比之下,如果没有额外技术的帮助,可解释的模型太复杂而难以理解。我们说这些模型可解释性低。我们可以在图 1 中看到这些概念是如何关联的。一般来说,模型可以分为可解释的或可解释的,但人们会有不同意的灰色区域。

图 1:可解释性谱(来源:作者)

为什么可解释性很重要?

如前所述,我们需要额外的技术,如特征重要性时间,来理解可解释模型是如何工作的。实现这些技术可能需要大量的工作,而且重要的是,它们仅仅提供了一个模型如何工作的近似值。所以,我们不能完全确定我们理解了一个可解释的模型。在比较可解释的模型时,我们可能会遇到类似的情况。

来源: flaticon

例如,逻辑回归和决策树。这些都不需要额外的技术,但逻辑回归可能仍然需要更多的努力来解释。我们需要了解 sigmoid 函数以及系数与赔率/概率的关系。这种复杂性也可能导致我们解释上的错误。一般来说,模型的可解释性越强;越容易理解,我们就越能确定我们的理解是正确的。可解释性很重要,因为从中可以获得很多好处。

更容易解释

我们的第一个好处是,可解释的模型更容易向其他人解释。对于任何话题,我们理解得越好,就越容易解释。我们还应该能够用简单的术语解释它(即不提及技术细节)。在工业界,有许多人可能希望对你的模型如何工作有简单的解释。这些人不一定有机器学习的技术背景或经验。

例如,假设我们创建了一个模型来预测某人是否会提出人寿保险索赔。我们希望使用这种模式来实现公司人寿保险核保的自动化。为了在模型上签字,我们的老板会要求详细解释它是如何工作的。一个不满的顾客可能会要求解释为什么他们没有被批准投保人寿保险。监管者甚至可以要求法律做出这样的解释。

来源: flaticon

试图向这些人解释神经网络如何进行预测可能会引起很多混乱。由于不确定性,他们甚至可能不接受解释。相比之下,像逻辑回归这样的可解释模型可以用人类的术语来理解。这意味着它们可以用人类的术语来解释。例如,我们可以准确地解释顾客的吸烟习惯在多大程度上增加了他们的死亡概率。

更容易检测、检查和修复错误

上述关系是因果关系(即吸烟导致癌症/死亡)。一般来说,机器学习模型只关心联想。例如,模型可以使用某人的原籍国来预测他们是否患有皮肤癌。然而,就像吸烟一样,我们能说某人的国家导致癌症吗?这是因为皮肤癌是由阳光引起的,而一些国家只是比其他国家更阳光。所以只能说皮肤癌和某些国家有关。

图 2:狼对哈士奇的实验(来源: M .图里奥·里贝罗,s .辛格& C .盖斯特林

华盛顿大学的研究人员做了一个实验,这是一个很好的例子,说明了联想可能出错的地方。研究人员训练了一个图像识别模型,将动物分类为哈士奇或狼。利用莱姆,他们试图理解他们的模型是如何做出预测的。在图 2 中,我们可以看到该模型基于图像背景进行预测。如果背景有雪,动物总是被归类为狼。他们基本上建立了一个探测雪的模型。

问题是狼与雪联系在一起。狼通常会出现在雪地上,而哈士奇则不会。这个例子告诉我们,模型不仅可以做出不正确的预测,还可以以错误的方式做出正确的预测。作为数据科学家,我们需要对我们的模型进行感官检查,以确保它们不会以这种方式做出预测。你的模型越容易解释,这就越容易做到。

来源: flaticon

更容易确定未来的绩效

随着时间的推移,模型的预测能力可能会下降。这是因为模型特征和目标变量之间的关系可能会改变。例如,由于工资差距,收入目前可能是性别的良好预测因素。随着社会变得更加平等,收入将失去其预测力。我们需要意识到这些潜在的变化及其对我们模型的影响。对于可解释的模型来说,这更难做到。由于不太清楚特性是如何被使用的,即使我们知道对单个特性的影响,我们也不一定能说出对模型整体的影响。

更容易从模型中学习

试图在未知中寻找意义是人类的天性。机器学习可以帮助我们发现数据中我们不知道存在的模式。然而,我们不能仅仅通过观察模型的预测来识别这些模式。如果我们不能解释我们的模型,任何教训都会丢失。最终,一个模型越难解释,就越难从中学习。

来源: flaticon

算法公平性

重要的是,你的模型要做出公正的决定,这样它们就不会延续任何历史上的不公正。确定偏见的来源可能很困难。它通常来自模型特征和受保护变量(例如种族或性别)之间的关联。例如,由于南非强制隔离的历史,种族与某人的地理位置\邻里关系密切相关。位置可以作为种族的代表。使用位置的模型可能会偏向某个种族。

使用一个可解释的模型并不一定意味着你会有一个无偏的模型。这也不意味着更容易确定模型是否公平。这是因为大多数公平性度量(例如,假阳性率、不同影响)是模型不可知的。对于任何模型来说,它们都很容易计算。使用一个可解释的模型所做的是更容易识别和纠正偏差的来源。我们知道使用了哪些特性,并且可以检查哪些特性与受保护的变量相关联。

来源: flaticon

可解释性的缺点

好的,我们明白了…可解释的模型很棒。它们更容易理解、解释和学习。它们还允许我们更好地检测当前绩效、未来绩效和模型公平性。然而,可解释性也有不好的一面,在某些情况下,我们更喜欢一个可解释的模型。

易受操纵

基于 ML 的系统容易受到操纵或欺诈。例如,假设我们有一个自动发放汽车贷款的系统。一个重要的特征可能是信用卡的数量。顾客的卡越多,她就越危险。如果客户知道这一点,他们可以暂时取消所有的卡,获得汽车贷款,然后重新申请所有的信用卡。

来源: flaticon

当客户取消信用卡时,她偿还贷款的概率不会改变。客户操纵模型做出了不正确的预测。模型的可解释性越强,操作起来就越透明和容易。即使模型的内部工作是保密的,情况也是如此。特征和目标变量之间的关系通常更简单,更容易猜测。

要学的更少

我们提到过,可解释的模型更容易学习。另一方面,他们不太可能教给我们新的东西。像神经网络这样的可解释模型可以自动对数据中的交互和非线性关系进行建模。通过解释这些模型,我们可以发现这些我们从来不知道存在的关系。

相比之下,像线性回归这样的算法只能模拟线性关系。为了对非线性关系建模,我们必须使用特征工程将任何相关变量包含在我们的数据集中。这将需要预先了解这些关系,这违背了解释模型的目的。

领域知识/专业技能要求

构建可解释的模型可能需要大量的领域知识和专业技能。通常,可解释的模型,如回归,只能对数据中的线性关系进行建模。为了模拟非线性关系,我们必须执行特征工程。例如,对于医疗诊断模型,我们可能希望使用身高和体重来计算身体质量指数。了解哪些特征是可预测的,以及要创建哪些特征需要特定领域的领域知识。

你的团队可能没有这方面的知识。或者,您可以使用一个可解释的模型,该模型将自动对数据中的非线性关系进行建模。这消除了创建任何新特征的需要;基本上把思考留给了计算机。不利的一面是,正如我们在上面已经彻底讨论过的,对如何使用特征进行预测的理解较差。

复杂性-准确性权衡

从上面我们可以看到,一般来说,越不复杂的模型越容易解释。因此,为了更高的可解释性,可能会有较低准确性的折衷。这是因为,在某些情况下,更简单的模型可能做出不太准确的预测。这真的取决于你要解决的问题。例如,使用逻辑回归进行图像识别会得到很差的结果。

对于许多问题来说,一个可解释的模型和一个可解释的模型表现得一样好。在下面的文章中,我们比较了一个可解释的模型,逻辑回归,和一个可解释的模型,神经网络。我们表明,通过对我们的问题进行一些思考并创建新的特征,我们可以用一个可解释的模型实现类似的准确性。它很好地实践了我们在本文中讨论的一些概念。

[## 特征工程的力量

为什么您可能只应该使用逻辑回归来建模非线性决策边界(使用 Python 代码)

towardsdatascience.com](/the-power-of-feature-engineering-b6f3bb7de39c)

图像来源

所有图片都是我自己的或从www.flaticon.com获得的。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。

参考

[1] C .莫尔纳尔,可解释机器学习(2020)【https://christophm.github.io/interpretable-ml-book/

[2] C. Rudin,停止解释高风险决策的黑盒机器学习模型,转而使用可解释的模型(2019),https://www.nature.com/articles/s42256-019-0048-x

[3] M .图里奥·里贝罗,s .辛格和 c .盖斯特林,“我为什么要相信你?”:解释任何分类器的预测(2016)【https://arxiv.org/abs/1602.04938 T2

可解释聚类

原文:https://towardsdatascience.com/interpretable-clustering-39b120f95a45?source=collection_archive---------36-----------------------

如何使用 CART 来消除描述集群时的猜测

聚类算法如 K-Means、凝聚聚类和 DBSCAN 是强大的无监督机器学习技术。然而,总结每个集群的关键特征需要相当定性的方法,成为需要领域专业知识的冗长且不严格的过程。

一项经常被忽视的技术可能是数据科学家武器库中的王牌:使用决策树来定量评估每个集群的特征。具体来说,在对未标记的数据进行聚类之后,我们可以将相应的聚类作为标签分配给每个样本。然后,我们可以使用标签作为目标变量来训练一个购物车模型,然后检查生成的决策树来突出显示集群的特征。

数据聚类

在对数据进行相应的处理后,我们可以选择我们喜欢的聚类算法。通常,选项有:

  • k 均值
  • 凝聚聚类
  • 基于密度的噪声应用空间聚类

k 均值

K-Means 是最常见的无监督学习技术,主要是由于它的简单性和有效性。这是一种快速算法,可以在数百万次观察中运行,但它也有缺点。首先,它不能很好地处理非球形的数据结构。当点的密度不均匀时,也就是说在分布的某些区域中密度比其他区域中的密度高,它的表现也不好。最后,还必须选择聚类数 K,这需要做出某种程度上的定性决定。

虽然对于前两个问题,除了选择另一种算法之外没有补救方法,但是可以以相对严格的方式选择聚类的数量 K。我们可以迭代地运行 K-Means 算法,增加 K 的数量,直到一个稍大的数字(例如 50)。然后,我们可以在图表上为 K 的每个值绘制一个性能度量。通过检查图表,我们可以找到“肘部”,即性能达到峰值的地方,然后在较高的 K 值下产生边际回报。我们可以选择的 K 值正好是性能增益相对于 K 的增加处于边际的时候。在许多性能测量中,最常用的通常是轮廓系数、失真和差距统计。

凝聚聚类

凝聚聚类是一种分层聚类,它迭代地将样本分组在一起,从每个样本的一个聚类开始,到整体的单个聚类。这是执行聚类时的首选方法之一,因为它允许快速选择 k 的最佳值。事实上,我们可以绘制树状图,这是一种在 x 轴上显示样本分组的树结构,而在 y 轴上显示来自其他分组的信息增益。

类似于肘分析,我们可以简单地选择从进一步分裂中获得的信息略微增加的聚类数,因此不值得额外的复杂性。

基于密度的噪声应用空间聚类

最后,作为参考,DBSCAN 是另一种广泛用于聚类分析的技术。它的工作原理是检查附近样本的密度,如果密度足够高,就将样本分配给聚类。然而,由于凝聚聚类已经是一种成功的技术,DBSCAN 在实践中不太常见。

解释集群

现在我们已经对未标记的数据进行了聚类,我们可以提取聚类信息并将其作为标签分配给每个样本。

例如,使用凝聚聚类,我们可以首先选择我们选择的聚类数 K...

cut = scipy.cluster.hierarchy.cut_tree(Z, n_clusters=K)

...然后提取标签,将它们分配给数据:

labels = list([i[0] for i in cut])
labeled_data = pd.DataFrame(data, columns=data_columns)
labeled_data['label'] = labels

最后,我们可以继续使用标记数据集作为训练来训练决策树。为了避免一棵巨大的树,我建议把它构造成一个二元分类问题,如果一个点在所选的聚类中,y 等于 1,否则 y 等于 0。这将为每个集群重复,给你不同的更简单的决策树,更容易理解,并在以后提出。具体来说,我们可以绘制决策树,使用:

fig, axes = mp.subplots(nrows = 1, 
                        ncols = 1, 
                        figsize = (4,4), 
                        dpi=300)sklearn.tree.plot_tree(model,
                       feature_names = X.columns,
                       filled = True,
                       class_names=True);

通过检查决策树,我们可以突出相应聚类的特征。例如,我们可能会看到,只有在某些条件下,观测值才会被分配到这样的集群中。

摘要

我们可以通过结合无监督和有监督的学习技术来阐明聚类。具体来说,我们可以:

  • 首先,使用 K-Means、凝聚聚类或 DBSCAN 对未标记的数据进行聚类
  • 然后,我们可以选择要使用的聚类数 K
  • 我们给每个样本分配标签,使其成为一个监督学习任务
  • 我们训练一个决策树模型
  • 最后,我们检查决策树的输出,以定量地突出集群的特征

参考

麻省理工学院的一些同事最近完成了一项有趣的工作,利用优化使聚类变得可解释。你可以在这里阅读更多相关信息

要阅读更多类似的文章,请关注我的TwitterLinkedIn或我的* 网站 *

可解释的机器学习模型

原文:https://towardsdatascience.com/interpretable-machine-learning-models-aef0c7be3fd9?source=collection_archive---------16-----------------------

对逻辑回归模型和决策树解释的全面介绍。

Unsplash 上由 Fabrice Villard 拍摄的照片

亚马逊的一个机器学习模型从一堆简历中只选择了男性。根据该模型,另一个模型解雇了表现不佳的教师。这种模式是歧视性的,可能对社会有害。他们会做出错误的决定,并以负面的方式影响人们的生活。要解决这个问题,您可以开始解释您的模型。可解释性意味着人类可以理解决策的原因。

对于机器学习模型的可解释性已经做了很多研究。有不同的方式来解释你的机器学习模型。最容易的划分是在可解释模型和模型不可知方法之间。可解释的模型是解释它们自己的模型,例如从决策树中你可以很容易地提取决策规则。模型不可知方法是可以用于任何机器学习模型的方法,从支持向量机到神经网络。在本文中,重点将放在可解释的模型上,如线性回归、逻辑回归和决策树。这是另一篇关于模型无关方法的文章。

资料组

您可以使用模型可解释性的一个领域是医疗保健。为了了解模型如何决定一个人是否患有心脏病,我们使用了克利夫兰数据库中具有以下特征的数据集:

我们将尝试使用逻辑回归和决策树来预测目标,并解释我们建立的模型。你可以在 Kaggle 上找到心脏病 UCI 数据集。

密码

这篇关于可解释模型的文章(以及关于模型不可知方法的文章)的代码可以在 GitHub 上找到。

可解释的模型

您可以解释的模型包括线性回归模型、逻辑回归模型和决策树。因此,在这些情况下,不需要模型不可知的方法,尽管您也可以使用它们来获得更多的见解。在简单介绍线性回归之后,我们将在数据集上构建一个逻辑回归模型和决策树,看看我们如何解释结果。

线性回归

在线性回归中,您可以使用权重(或系数)来找出哪些特征是最重要的,这些特征具有最高的权重。对于一条记录,如果在保持其他记录不变的情况下将其中一条记录添加到某个特征值中,则预测值将根据该要素的权重而增加。

逻辑回归

对于逻辑回归,解释的方式有点不同,因为一个系数是比值比的自然对数。要解释这些系数,您需要进行从系数到比值比的转换。我们可以使用下面的函数:

根据前两个等式,我们可以用 ln( a )代替 b ,得到 a 。所以如果我们把 e 提高到比值比的自然对数的幂(等于我们从逻辑回归模型得到的系数),我们就得到比值比。

太好了!经过这种变换后,它有点像线性回归,但是当你改变一个特征值时,它不是增加,而是改变一个因子。值在 1 左右的比值比影响最小,而更高或更低的比值比影响更大。

因此,让我们在心脏病数据集上建立一个逻辑回归模型,以了解发生了什么。我们为每个特性获得了以下系数,我们可以对它们进行变换( e 的系数幂)以获得比值比。您可以在下表中看到这些值,这些值按降序排列:

现在我们可以开始解释这个模型了:

  • 胸痛型影响高。当这个值增加 1 时,患心脏病的概率增加 120.1%。
  • 如果斜率变量增加 1,概率增加 94.2%。
  • 空腹血糖是一个二元变量。如果该值为 1(真),患心脏病的几率比该值等于 0(假)时高 13.9%。
  • 在底部我们看到性别变量。这个赔率在 1 以下,1/4 左右。这意味着女性患心脏病的可能性几乎是男性的四倍!

当这样的结果看起来很奇怪时,最好的办法就是调查你的数据。你可能想知道为什么年龄和胆固醇水平的影响很小。这个模型告诉我们,高胆固醇水平比低胆固醇水平好一点。这是事实吗?男性和女性的巨大差异也引发了质疑!为了研究这一点,我们可以使用一个目标图,你可以在 GitHub 上的笔记本中找到一个关于性别特征的图。

决策树

让我们看看决策树向我们展示了什么!决策树就像一个规则系统,从根节点开始,然后沿着记录的路径到叶节点,在那里可以看到预测。当你的树有更高的深度时,很难解释,但是仍然可行。

下面你可以看到一个决策树的图像,建立在心脏病数据集上。

在每个决策节点上,您会看到四行文本。第一行代表决策规则。如果记录的条件为真,则沿着左边的分支,如果为假,则沿着右边的分支。第二行上的基尼系数是基尼系数的值,这个值越低,split⁴.越好第三行和第四行显示当前节点中有多少来自训练集的样本,以及它们是如何划分的。你可能想知道这些颜色意味着什么。如果一个节点是橙色或蓝色,这意味着对于该节点中样本的最大部分,目标变量(患有心脏病)分别等于 0 或 1。颜色越深,节点越均匀。

因此,让我们从测试集中提取一条记录,并跟踪树的节点,看看最终的预测会是什么。这是新的记录:

让我们从决策树的根节点开始。判定规则是:特征 X₂ (cp,胸痛型)小于或等于 0.5。对于我们的新记录,值是 0,所以小于 0.5。这种说法是正确的,我们沿着左边的分支。下面的特征是 X₁₁ (ca,透视着色的主要血管数),这个值大于 0.5,所以该陈述是假的,我们继续看 X₃ (trestbps,静息血压)是否小于或等于 109。事实并非如此,因为它等于 150。又这么假。下一个节点检查 X₁(性别)是否小于 0.5。不,这个记录是 1,他是男性。现在我们找到了该记录的叶节点,预测值为 0。这个预测是正确的!所以对于这个记录,模型只用了四个特征,cp,ca,trestbps 和 sex。

新记录从根节点到叶节点的路径

好的,这是一种找出为什么一个记录有某种预测的方法。只有树的图像,很难看出哪些特征对模型是重要的。我们可以用不同的方法提取树的特征重要性。最简单的方法是使用 scikit-learn 的特性重要性。特征的重要性被计算为由该特征带来的标准的(标准化的)总缩减。它也被称为基尼系数

您应该相信这些特性的重要性吗?你可以说,像 cp、ca、chol 和年龄这样的特征在预测心脏病方面非常重要。这是可能的,但首先要测试你的模型!请记住,这些特性的重要性仅基于训练集和当前树。scikit-learn 中计算特性重要性的方法不是最好的。最好使用一种与模型无关的方法,比如置换特征重要性。好奇?在下一篇关于模型不可知方法的文章中阅读它!

[1] J. Dastin,亚马逊废除了对女性有偏见的秘密人工智能招聘工具 (2018),路透社

[2]c·奥尼尔,数学毁灭的武器 (2016),新冠

[3] 我如何解释逻辑回归中的优势比?、UCLA:统计咨询集团

线性回归的解释

原文:https://towardsdatascience.com/interpretation-of-linear-regression-dba45306e525?source=collection_archive---------4-----------------------

线性回归是从事 ML 和统计分析的人谈论最多的术语。顾名思义,线性回归就是对数据拟合一条线,在目标“y”变量和解释“x”变量之间建立关系。它可以用下面的等式来表征:

让我们来看一个样本数据集,它是我从 Coursera 上一门名为“商业统计线性回归”的课程中获得的。

数据集看起来像:

图一

第一行的解释是,第一次行程花费了 489.4 分钟,通过一辆使用了 3 年的卡车将 42 个包裹运送到区域 b。在这里,花费的时间是我们的目标变量,而“区域 A”、“卡车运输”和“包裹”是我们的解释变量。因为列“Region”是一个分类变量,所以应该用一个数值对它进行编码。

如果我们的分类变量中有“n”个标签,那么就增加“n-1”个额外的列来唯一地表示或编码分类变量。这里,区域 A 中的 1 表示行程是到区域 A,而 0 表示行程是到区域 b。

图二

以上是在数据集中进行的线性回归的总结。因此,根据上述结果,我们的线性方程为:

分钟数=-33.1286+10.0171 包裹量+ 3.21卡车运输量+106.84 * A 区

释义:

b=10.0171: 这意味着在其他变量保持不变的情况下,如果包裹数量增加 1,则需要多花 10.0171 分钟才能送达。

b=3.21: 这意味着如果车龄增加 1 个单位,交货时间将增加 3.21 分钟,其他变量保持不变。

b=106.84: 这意味着在其他变量保持不变的情况下,与 b 区域相比,a 区域的交货时间将多花 106.84 分钟。当解释一个分类变量的系数时,总有一个参考变量要比较,这里参考的是区域 B,因为我们给区域 B 赋值 0。

b=-33.1286 : 它在数学上是指一辆车龄为 0 的卡车将 0 个包裹运送到 b 地区所花费的时间,从商业角度来看这没有任何意义。有时截距可能会提供一些有意义的见解,有时它只是为了拟合数据。

但是,我们必须检查这是否定义了 x 变量和 y 变量之间的关系。我们得到的拟合只是对样本数据的估计,还不能得出结论说这种相同的关系可能存在于真实数据中。我们必须检查我们得到的参数在统计上是否有意义,或者只是为了使数据符合模型。因此,我们检查拟合优度和 x 变量的显著性是极其重要的。

假设检验

图 3,来源:流明学习

假设检验可以通过多种方式进行,如 t 统计检验、置信区间检验和 p 值检验。这里,我们将检查对应于每个系数的 p 值。

对于每个假设检验,我们定义一个置信区间,即(1-α),这样这个区域被称为接受区域,其余两侧面积为α/2 的区域(在双尾检验中)是拒绝区域。为了进行假设检验,我们必须假设一个无效假设和一个替代假设。

零假设:这个 x 变量对 y 变量没有影响,即 H: b=0

替代假设:这个 X 变量对 Y 变量有影响,即

h:b0

图 4

只有当 p 值大于α/2 时,零假设才被接受。从上表可以看出,所有的 p 值都小于 0.05/2(如果我们取 95%的置信区间)。这意味着 p 值位于拒绝区域的某处,因此,我们可以拒绝零假设。因此,我们所有的 x 变量在定义 y 变量时都很重要。并且,x 变量的系数在统计上是显著的,并且不仅仅是将数据拟合到模型中。

我们自己的假设检验

上面的假设是 statsmodel 自己做的默认假设。让我们假设,我们有一个普遍的信念,即在保持所有其他变量不变的情况下,随着车龄的增加,交付时间增加 5 分钟。现在我们可以测试这个信念在我们的模型中是否仍然成立。

零假设 H₀ : b₂=5

备选假设 H₁ : b₂ ≠5

OLS 回归结果表明,货车运输系数的取值范围为:【1.293,5.132】。对于这些系数值,该变量被认为具有统计显著性。区间的中点【1.293,5.132】就是我们由模型给出的估计系数。因为我们的检验统计量是 5 分钟,并且它在【1.293,5.132】,范围内,所以我们不能忽略零假设。因此,我们不能忽视这样一个普遍的观点,即通过一辆一年的旧卡车需要额外的 5 分钟时间。最后,b₂取 3.2123,只是假设提供了足够的证据,证明我们估计的 b₂是一个好的估计。然而,5 分钟也可以是对 b₂.的可能的良好估计

测量拟合优度

R 平方值用作拟合优度的度量。值 0.958 表示 Y 变量中 95.8%的变化可以用 X 变量来解释。Y 的其余变化无法解释。

总 SS=回归 SS +剩余 SS

R 平方=回归 SS/总 SS

图 5,作者图

R 平方的最小值可以是 0,最大值可以是 1。较低的 R 平方值表明拟合度较差,并表明您可能遗漏了一些重要的解释变量。R 平方的值随着 X 变量的增加而增加,而不管增加的 X 变量是否重要。因此,为了对此进行调整,有一个调整后的 R 平方值,该值仅在额外的 X 变量对模型的改善超过偶然预期时增加,而在额外的变量对模型的改善小于偶然预期时减少。

残差图

在进行线性回归之前,对这种随机误差有一些假设。

  1. 随机误差的平均值为 0。
  2. 随机误差具有恒定的方差。
  3. 误差呈正态分布。
  4. 错误实例是相互独立的

图 6

图 7

图 8

在上面的图中,残差与 X 变量图显示了我们的模型假设是否被违反。在图 6 中,残差与地块图似乎是分散的。残差围绕零随机分布,并且似乎具有恒定的方差。其他 x 变量的残差图也是如此。因此,关于随机误差的初始假设仍然成立。如果残差中存在任何曲率/趋势,或者方差似乎随着 x 变量(或任何其他维度)而变化,那么这可能意味着我们的线性模型存在巨大的问题,因为初始假设被违反了。在这种情况下,应执行 box cox 方法。这是一个过程,其中有问题的 x 变量经受像对数或平方根这样的变换,以便残差具有恒定的方差。x 变量的这种转换就像是一种试凑法。

多重共线性

多重共线性发生在多元回归模型中的独立变量之间存在高度相关性时,尽管独立变量被单独测试为重要,但这可能导致不显著的 p 值。

让我们考虑一下数据集:

数据集来自商业统计线性回归-Coursera

用 MPG 作为我们的响应变量,位移作为 X 变量来拟合数据。

将 MPG 作为我们的响应变量,将气缸作为 X 变量来拟合数据。

将 MPG 作为响应变量,将气缸和排量作为 X 变量来拟合数据。

从上述结果中,我们看到位移和圆柱体似乎是统计上重要的变量,因为在进行单变量线性回归的前两个结果中,它们的 p 值小于 alpha/2。

当进行多元线性回归时,两个 x 变量被证明是不重要的,因为它们的 p 值大于α/2。然而,根据前面的两个简单回归,这两个变量都很重要。这可能是由于数据集中的多重共线性造成的。

我们可以看到,排量和气缸之间有很强的相关性,相关系数为 0.94。因此,为了处理这样的问题,在线性回归中应该避免高度相关的变量之一。

整体代码可以在这里找到。

感谢阅读!

学习的诠释

原文:https://towardsdatascience.com/interpretations-in-learning-part-1-4342c5741a71?source=collection_archive---------46-----------------------

深度学习的不确定性

为什么我们应该关注深度学习中的不确定性

作者:萨穆尔·麦克唐纳,大学机器学习研究员马克斯·凯尔森

介绍

由于深度学习在图像分类 等非常具体的任务中的优势,人工智能(AI)在科学和工业领域都变得无处不在。虽然深度学习的成功值得庆祝,但我们必须意识到并协调以下两个事实:

  1. 科学旨在解释现实,而
  2. 深度学习努力解释自己

考虑到这种并列关系,我们可以相信深度学习是一种解释现实的科学工具,并反过来在工业中利用这些发现吗?可以说不是,因为我们被深度学习无法提供的隐藏风险和解释蒙蔽了双眼,尤其是在做出超出训练样本的预测时。

能够解释一个预测,然后解释问题,对于人工智能的一般性能来说是基本的,对于安全性、可靠性和公平性来说绝对是至关重要的。因此,为了推进人工智能,我们也必须推进对学习的解释。

在这篇博客中,我提供了关于深度学习的直观入门,并提出不确定性是我们在推理重要性和因果关系之前应该解决的第一级可解释性(图 1)。

图 1:定量解释的规范结构。所有的模型都具备预测能力,这是不确定性的基础,而不确定性反过来又告知重要性和因果关系。有了因果关系,也许是终极的解释能力,我们可以回答反事实的“如果”和“为什么”类型的问题,并开始远离训练示例进行推理(一些统计和机器学习迄今无法做到的事情) 。(作者图)

深度学习和不确定性入门

最简单的说,深度神经网络是灵活的函数, f 映射一些高维输入, x 到一些目标 y=f(x)。这种从 xy 的映射通常被称为任务,例如,读取基因组签名( x )并预测患者是否患有癌症(y= 1)(y= 0)。神经网络几乎自动地从经验(即数据)中学习任务,因此深度学习模型变得如此广泛。

传统神经网络(NNs)的可解释性的一个限制是它们通常是确定性的。这意味着给定单个输入 x ,确定性 NN 将预测每次重复正向传播的相同输出y=f(x)(见下图 2)。输出没有变化,这限制了网络模拟现实固有随机性的能力。此外,与概率性替代方法相比,确定性神经网络对不确定性的估计过于自信。因此,为了解释的安全性、稳健性和可靠性,我们必须采用一些概率方法;即贝叶斯神经网络

图 2:一个前馈神经网络。每个黑点代表一个参数向量(或神经元)。一层神经元将转换数据(从左侧输入)并将激活向前传播到下一层。最终输出层产生预测。(图由作者提供)

贝叶斯神经网络可以通过随机化模型的参数来扩展传统的神经网络。【 注: 证明贝叶斯神经网络是有特定的理论动机的,源于贝叶斯法则,但这对于大多数对统计学不感兴趣的人来说是深奥的,也是不必要的。我们现在可以忽略这一点,只需要理解为什么我们应该关心深度学习中的不确定性。 ]

每次 BNN 正向传播输入 x ,随机参数的不同实现将转换信息,以在每次重复时产生不同的输出 f ( x)。这个过程重复足够多的次数,这样我们就可以得到预测值的分布**p(f(x)(图 3)。**

图 3:产生一个输出分布p(f(x)带有蒙特卡洛漏失* 。每个模拟都有不同的权重配置,黑色节点表示活跃的神经元,灰色节点表示“退出”的神经元。退出的神经元中的参数都被设置为零。其思想是,多次向前传递,每次具有不同的重量配置,产生输出 p ( f ( x)的分布。这反过来提供了一种检查模型不确定性(即方差或熵)的机制。(图由作者提供)*****

p(f(x))分布的方差定义了关于神经网络的模型不确定性的概念。模型不确定性是 BNN 提供的不确定性的两个不同组成部分之一,如果我们有更多的训练示例或更合适的模型架构,模型不确定性就会减少。****

我们可以建模的不确定性的另一个组成部分是数据不确定性,它表明数据本身固有的随机性。(关于模型和数据不确定性之间差异的图示示例,请参见下面的图 4a 和 4b。)**

这些不确定性为我们提供了必要的先决条件,以增加对重要性和因果关系进行推理的解释能力(回想上面的图 1)。此外,不确定性本身使得与可靠性、预测性能、优化、可解释性和风险管理相关的有用解释成为可能。

图 4a:对一些数据示例(洋红色点)进行训练时,数据不确定性为粉红色,模型不确定性为绿色。(图由作者提供)

图 4b:对许多数据示例(洋红色点)进行训练时,数据不确定性为粉红色,模型不确定性为绿色。(图由作者提供)

上面的图 4a 和 4b 说明了当 BNN 被给予更多的训练样本时,不确定性是如何降低的。这些数字还涉及到我将在本系列的下一篇博客文章中详述的内容。也就是说,使用 BNNs,总的不确定性可以分解为两个部分:数据不确定性(风险)和模型不确定性。

风险管理:不确定性的应用

当我们对不确定性(包括模型和数据)有了很好的估计时,许多应用程序就变得可用了。在这里,我将介绍一个这样的应用程序,它应该足以让您入门。本博客系列的第 2 部分将对不同种类的不确定性提供更加全面和技术性的解释,此外还有执行下面演示内容的示例代码。

许多任务涉及大量需要管理的风险,无论是为了安全、科学诚信还是经济利益。为了说明这一点,考虑下面图 5 中描述的案例研究。

如果无人驾驶车辆对图像进行推断(图 5a)以预测该图像的不同部分属于什么对象,并错误地预测部分路径属于道路(图 5c),则汽车可能驶离道路并危及安全。通过拒绝不确定性高于某个合适阈值的预测,可以避免这种行为(图 5e)。因此,模型不确定性可以提高 AI 在生产中的预测性能和安全性。

图 5:图像分割的不确定性。我们看到,认知(模型)的不确定性在道路附近的人行道周围更大,这表明该模型可以通过在更多的例子上进行训练而受益,这些例子在阴天街道中承载与道路相邻的混凝土路径。图自肯达尔和加尔(2017)

那么,我们如何决定不确定性的阈值呢?一种方法是使用以下程序进行风险规避。首先,我们可以从最不确定到最不确定对预测进行排序。整套装置的误差率可能是,比方说 1/100(即 99%的精确度),但是这可能不够精确,不能在工业中安全地实施。如果我们“放弃”(即丢弃),比方说前 5%最不确定的预测(忽略该预测是否正确),我们会期望发出一些错误的预测,因为错误的预测通常与大量的不确定性一致。因此,剩余的一组现在可以具有改进的误差率,比如 1/1000,这可以改进足以商业化的可靠性(图 6)。**

图 6:使用 GTEX v8 数据预测组织类型任务的风险规避。这里的任务是在给定一些基因组信息的情况下,预测 45 种组织类型中的一种。细节不重要,任务也不是特别难。该图表明,通过去掉前 5%最不确定的预测,可以获得 100%的准确性。(图由作者提供)

应该注意的是,非贝叶斯模型可以执行类似的风险规避过程,但是这些不确定性的质量较差 。因此,与贝叶斯替代方法相比,非贝叶斯神经网络在风险管理中的效率较低,并且需要您放弃更多的示例来获得期望的可靠性增益(即预测性能)(我们将在本博客系列的后续部分进一步详细探讨这一概念)。

结论和未来工作

为深度学习配备改进的不确定性估计,允许新的应用程序提高我们提供的人工智能解决方案的准确性、公平性、科学完整性、可靠性和安全性。

这个博客系列的目的是展示可解释人工智能在实践中的价值。因此,在本博客系列的未来部分,我将:

  • 提供深度学习中不确定性的综合教程(包括风险管理的例子);
  • 给出关于确定性过度自信的细节(即我们为什么要关心 BNNs);
  • 展示我们对非分布数据稳健的方法;
  • 基准最先进的 BNNs
  • 提供不确定性的高级应用实例;和
  • 说明重要性和因果关系

承认

我要感谢来自昆士兰大学的 Fred Roosta ,他在过去的一年里慷慨地为我提供了指导和监督,帮助我努力理解深度学习中的不确定性。感谢 Helena Foley 和 Maciej Trzaskowski 对本文的帮助。

参考

  1. https://www.springboard.com/blog/narrow-vs-general-ai/
  2. 梅赫拉比,n .,莫尔斯塔特,f .,萨克塞纳,n .,勒曼,k .,高尔斯蒂安,a .,2019。机器学习中的偏见和公平问题综述。arXiv 预印本 arXiv:1908.09635
  3. 珍珠杂志,1995 年。实证研究的因果图。Biometrika,82(4),第 669–688 页
  4. 伊恩·古德菲勒、约舒阿·本吉奥和亚伦·库维尔。深度学习。麻省理工出版社,2016
  5. 尼尔,R.M .,2012。神经网络的贝叶斯学习(卷 118)。施普林格科学&商业媒体
  6. https://www . cs . ox . AC . uk/people/yarin . gal/website/blog _ 3d 801 aa 532 C1 ce . html
  7. 肯德尔,a .和 Gal,Y. 2017。计算机视觉的贝叶斯深度学习需要哪些不确定性?《神经信息处理系统进展》,第 5574–5584 页
  8. 奥瓦迪亚,k .等人 2019。你能相信你的模型的不确定性吗?数据集转移下的预测不确定性评估。NeurIPS 大会 2019。

使用 LIME 解释黑盒 ML 模型

原文:https://towardsdatascience.com/interpreting-black-box-ml-models-using-lime-4fa439be9885?source=collection_archive---------24-----------------------

模型可解释性

通过乳腺癌数据建模直观地理解石灰

国立癌症研究所Unsplash 上拍摄的照片

对于任何人来说,在医学领域支持机器学习的潜力几乎是老生常谈。有很多例子可以支持这种说法——其中一个例子是微软利用医学成像数据帮助临床医生和放射科医生做出准确的癌症诊断。同时,复杂的人工智能算法的发展极大地提高了这种诊断的准确性。毫无疑问,医学数据的应用如此惊人,人们有充分的理由对其好处感到兴奋。

然而,这种尖端算法是黑盒,可能很难解释。黑盒模型的一个例子是深度神经网络,在输入数据通过网络中的数百万个神经元后做出单个决策。这种黑盒模型不允许临床医生用他们先前的知识和经验来验证模型的诊断,使得基于模型的诊断不太可信。

事实上,最近对欧洲放射科医生的调查描绘了一幅在放射学中使用黑盒模型的现实画面。调查显示 只有 55.4%的临床医生 认为患者不会接受没有医师监督的纯人工智能应用。 [1]

在接受调查的 635 名医生中,超过一半的人认为患者还没有准备好接受仅由 AI 生成的报告。图片作者。

下一个问题是:如果人工智能不能完全取代医生的角色,那么人工智能如何帮助医生提供准确的诊断?

这促使我探索有助于解释机器学习模型的现有解决方案。一般来说,机器学习模型可以分为可解释的模型和不可解释的模型。不严格地说,可解释的模型提供与每个输入特征的重要性相关的输出。此类模型的示例包括线性回归、逻辑回归、决策树和决策规则等。另一方面,神经网络形成了大量无法解释的模型。

有许多解决方案可以帮助解释黑箱模型。这些解决方案包括 Shapley 值、部分依赖图和局部可解释模型不可知解释(LIME ),这些在机器学习实践者中很流行。今天,我将集中讨论石灰。

根据 Ribeiro 等人[2] 的 LIME 论文,LIME 的目标是“在对分类器局部忠实的可解释表示上识别一个可解释模型”换句话说,石灰能够解释某个特定点的分类结果。 LIME 也适用于所有类型的模型,使其与模型无关。

E

这听起来很难理解。让我们一步一步地分解它。想象我们有下面的玩具数据集,有两个特征。每个数据点都与一个基本事实标签(正或负)相关联。

作者图片

从数据点可以看出,线性分类器将不能识别分隔阳性和阴性标记的边界。因此,我们可以训练一个非线性模型,比如神经网络,来对这些点进行分类。如果模型训练有素,它能够预测落在深灰色区域的新数据点为正,而落在浅灰色区域的另一个新数据点为负。

作者图片

现在,我们对模型在特定数据点(紫色)上做出的决定感到好奇。我们问自己,为什么这个特定的点会被神经网络预测为负值?

作者图片

我们可以用石灰来回答这个问题。LIME 首先从原始数据集中识别随机点,并根据它们到感兴趣的紫色点的距离为每个数据点分配权重。采样数据点离感兴趣的点越近,时间就越重要。(在图中,较大的点表示分配给数据点的权重较大。)

图片作者。

利用这些不同权重的点,LIME 提出了一个具有最高可解释性和局部保真度的解释。

图片作者。

使用这组标准,LIME 将紫色线确定为兴趣点的学习解释。我们看到,紫色线能够解释神经网络在感兴趣的数据点附近的决策边界,但无法解释其更远的决策边界。换句话说,学习的解释具有高的局部保真度,但是低的全局保真度。

让我们看看 LIME 的作用:现在,我将重点关注 LIME 在解释使用威斯康星州乳腺癌数据训练的机器学习模型中的使用。

威斯康星乳腺癌数据集:了解癌细胞的预测因子

UCI 在 1992 年发表的威斯康星州乳腺癌数据集【3】,包含 699 个数据点。每个数据点代表恶性或良性的细胞样本。对于以下特征,每个样品还被赋予 1 到 10 的数字。

  • 团块厚度
  • 细胞大小的均匀性
  • 细胞形状的均匀性
  • 单一上皮细胞大小
  • 有丝分裂
  • 正常核仁
  • 平淡的染色质
  • 裸核
  • 边缘粘连

让我们试着去理解这些特征的意义。下图使用数据集的特征显示了良性和恶性细胞之间的差异。

感谢我医学院的朋友岳婷对这些特性的解释。图片作者。

从该图中,我们看到每个特征的值越高,细胞越有可能是恶性的。

预测细胞是恶性的还是良性的

既然我们理解了数据的含义,让我们开始编码吧!我们首先读取数据,并通过删除不完整的数据点和重新格式化 class 列来清理数据。

数据导入、清理和浏览

**#Data Importing and Cleaning** import pandas as pddf = pd.read_csv("/BreastCancerWisconsin.csv", 
                 dtype = 'float', header = 0)
df = df.dropna() #All rows with missing values are removed.*# The original data set labels benign and malignant cell using a value of 2 and 4 in the Class column. This code block formats it such that a benign cell is of class 0 and a malignant cell is of class 1.*def reformat(value):
    if value == 2: 
        return 0 #benign
    elif value == 4:
        return 1 #malignantdf['Class'] = df.apply(lambda row: reformat(row['Class']), axis = 'columns')

去掉不完整的数据后,我们简单的探究一下数据。通过绘制细胞样品类别(恶性或良性)的分布图,我们发现良性(0 类)细胞样品比良性(1 类)细胞样品多。

import seaborn as sns
sns.countplot(y='Class', data=df)

通过可视化每个特征的直方图,我们发现大多数特征具有 1 或 2 的模式,除了团块厚度和空白染色质,它们的分布从 1 到 10 更均匀地展开。这表明团块厚度和空白染色质可能是该类别的较弱预测因子。

from matplotlib import pyplot as plt
fig, axes = plt.subplots(4,3, figsize=(20,15))
for i in range(0,4):
    for j in range(0,3):
        axes[i,j].hist(df.iloc[:,1+i+j])
        axes[i,j].set_title(df.iloc[:,1+i+j].name)

模型训练和测试

然后,将数据集以 80%-10%-10%的比例分成典型的训练-验证-测试集,并使用 Sklearn 建立 K-最近邻模型。经过一些超参数调整(未显示),发现 k=10 的模型在评估阶段表现良好,其 F1 值为 0.9655。代码块如下所示。

from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold **# Train-test split**
X_traincv, X_test, y_traincv, y_test = train_test_split(data, target, test_size=0.1, random_state=42) **# K-Fold Validation** kf = KFold(n_splits=5, random_state=42, shuffle=True)for train_index, test_index in kf.split(X_traincv):
    X_train, X_cv = X_traincv.iloc[train_index], X_traincv.iloc[test_index]
    y_train, y_cv = y_traincv.iloc[train_index], y_traincv.iloc[test_index]from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import f1_score,**# Train KNN Model** KNN = KNeighborsClassifier(k=10)
KNN.fit(X_train, y_train)**# Evaluate the KNN model** score =  f1_score(y_testset, y_pred, average="binary", pos_label = 4)
print ("{} => F1-Score is {}" .format(text, round(score,4)))

使用石灰的模型解释

一个 Kaggle 鉴赏家可能会说,这个结果很好,我们可以在这里结束这个项目。然而,人们应该对模型的决策持怀疑态度,即使模型在评估中表现良好。因此,我们用石灰来解释 KNN 模型对这个数据集做出的决定。这通过检查所做的决定是否符合我们的直觉来验证模型的有效性。

import lime
import lime.lime_tabular**# Preparation for LIME**
predict_fn_rf = lambda x: KNN.predict_proba(x).astype(float)**# Create a LIME Explainer**
X = X_test.values
explainer = lime.lime_tabular.LimeTabularExplainer(X,feature_names =X_test.columns, class_names = ['benign','malignant'], kernel_width = 5)**# Choose the data point to be explained**
chosen_index = X_test.index[j]
chosen_instance = X_test.loc[chosen_index].values**# Use the LIME explainer to explain the data point**
exp = explainer.explain_instance(chosen_instance, predict_fn_rf, num_features = 10)exp.show_in_notebook(show_all=False)

在这里,我挑选了三点来说明如何使用石灰。

解释样本被预测为恶性的原因

在这里,我们有一个数据点,实际上是恶性的,并预测是恶性的。在左图中,我们看到 KNN 模型预测该点有接近 100%的概率是恶性的。在中间,我们观察到 LIME 能够按照重要性的顺序,使用感兴趣的数据点的每个特征来解释这个预测。根据莱姆的说法,

  1. 事实上,样本的裸细胞核值大于 6.0,这使其更有可能是恶性的。
  2. 由于样本具有较高的边缘粘连,它更可能是恶性的而不是良性的。
  3. 由于样本的凝块厚度大于 4,它更有可能是恶性的。
  4. 另一方面,样本的有丝分裂值≤1.00 的事实使其更有可能是良性的。

总的来说,考虑到样本的所有特征(在右图中),该样本被预测为恶性的。

这四个观察结果符合我们的直觉和我们对癌细胞的了解。了解了这一点,我们更加确信模型根据我们的直觉做出了正确的预测。让我们看另一个例子。

解释为什么样本被预测为良性

这里,我们有一个细胞样本,预测是良性的,实际上是良性的。LIME 通过引用(以及其他原因)解释了为什么会出现这种情况

  1. 该样品的裸核值≤ 1
  2. 该样品的正常核仁值≤ 1
  3. 它还具有≤1 的簇厚度
  4. 细胞形状的均匀性也≤ 1

同样,这些符合我们对为什么细胞是良性的直觉。

解释样本预测不明确的原因

在最后一个例子中,我们看到该模型不能以很高的可信度预测细胞是良性的还是恶性的。使用 LIME 的解释,你能看出为什么会这样吗?

结论

LIME 的用途不仅限于表格数据,还包括文本和图像,这使得它的用途非常广泛。然而,仍有工作要做。例如,这篇论文的作者认为,当前的算法应用于图像时太慢,没有用。尽管如此,LIME 在弥合黑盒模型的有用性和难处理性之间的差距方面仍然非常有用。如果你想开始使用 LIME,一个很好的起点是 LIME 的 Github 页面

如果你对机器学习的可解释性感兴趣,一定要看看我的文章,这篇文章着重于使用部分依赖图来解释黑盒模型。

如果有任何反馈,请随时通过 LinkedIn 联系我。感谢您的宝贵时间!

[## 特拉维斯唐| LinkedIn

Gojek 的数据分析师](https://www.linkedin.com/in/voon-hao-tang/)

参考

[1] Codari,m .,Melazzini,l .,Morozov,S.P. 等人人工智能对放射学的影响:欧洲放射学学会成员的 EuroAIM 调查 (2019),成像洞察

[2] M. Ribeiro,S. Singh 和 C. Guestrin,‘我为什么要相信你?’解释任何分类者的预测 (2016),KDD

[3]威廉·h·沃尔伯格博士,威斯康星乳腺癌数据库 (1991),威斯康星大学医院,麦迪逊

通过数据科学解读气候变化

原文:https://towardsdatascience.com/interpreting-climate-change-through-data-science-321de6161baf?source=collection_archive---------48-----------------------

用 FB Prophet 预测未来 CO₂水平

图片由来自 Pixabay 的 Gerd Altmann 提供

被困在付费墙后面?点击这里使用我的朋友链接阅读完整的故事!

在过去的几十年里,全球年平均气温的记录稳步上升。温度每增加一分,大气中积累的热量就会呈指数增加,从而导致局部和全球天气模式的变化。因此,在此期间,我们目睹了与天气相关的灾害稳步增加,如长期干旱、更严重的降水和洪水、严重的热带气旋,以及最近加州野火突然激增。气候变化的长期影响包括变化的天气模式、海岸侵蚀和海平面上升。

二氧化碳(CO₂)是一种重要的吸热(温室)气体,它是通过人类活动和燃烧化石燃料释放的。根据联合国政府间气候变化专门委员会(IPCC)的报告,自工业革命开始以来,截至 2018 年 1 月,CO₂浓度已从 280 ppm(百万分之一)上升至 407 ppm。在同一时期,全球平均气温比工业化前的基线上升了大约 1⁰C。 换句话说,进入地球大气层的额外 125 ppm 的 CO₂相当于全球气温上升了大约 1⁰C.

任何与气候变化有关的事情都会引起激烈的争论,CO₂的变暖效应也不例外。与 CO₂推动全球气温上升的普遍观点相反,一些人认为气温的变化导致了大气 CO₂的变化——而不是相反。在使用冰芯研究过去的气候变化时,科学家观察到 CO₂滞后于温度。这使得一些人认为 CO₂滞后否定了 CO₂.的变暖效应事实上,争论的双方都站得住脚,因为 CO₂和全球气温之间存在正反馈循环。换句话说,变暖导致更多的 CO₂,更多的 CO₂导致变暖。这种正反馈循环进一步加剧了全球变暖的影响。

夏威夷莫纳罗亚天文台:

夏威夷莫纳罗亚岛大气二氧化碳(ppm)

夏威夷莫纳罗亚天文台,是最古老的连续 CO₂监测站,由于其远离任何大陆的位置,已经成为 CO₂水平的全球标准。上图显示了在莫纳罗亚天文台测得的每月大气 CO₂水平。 x 轴代表时间, y 轴代表以百万分率(ppm)测量的每月 CO₂水平。随着时间的推移,CO₂浓度稳步上升,目前的浓度比几百万年来都要高。

预测未来 CO₂水平:

为了将全球变暖限制在 1.5 ⁰摄氏度,到 2030 年,全球碳排放量需要在 2010 年的水平上惊人地下降 45%(IPCC,联合国)

在这项研究中,让我们利用数据驱动建模的进步来预测未来的 CO₂水平。一旦建模,预测的未来 CO₂水平可以用来评估我们在实现 IPCC 排放目标方面还有多远,以及这对全球气温上升意味着什么。时间序列预测问题是一种困难的预测建模问题。与回归预测建模不同,时间序列还增加了输入变量之间序列相关性的复杂性。

co₂时间序列的分解:

从莫纳罗亚火山观测大气 CO₂时间序列,我们可以看到有一个强季节性的上升趋势。CO₂的年度高峰出现在春季(5 月),此时融化的积雪暴露了土壤微生物,释放出大量的 CO₂.秋季(9 月)CO₂水平通常较低,因为大气中的 CO₂被大量夏季植物吸走。时间序列分解技术允许我们将一个时间序列分解成单独的组成部分。分解技术背后的思想是,任何序列都可以表示为其组成部分的和(或积): a)水平,b)趋势,c)季节性,和 d)残差。为了执行这个数据分解,我们将使用 statsmodel 包中的季节性分解函数,如下所示:

时间序列分解—可加模型:y(t) =趋势(t)+季节性(t)+残差(t)

上图显示了时间序列的各个组成部分。由于季节变化在时间上是相同的量级,我们选择的加性模型分解是好的。

趋势:是指一个时间序列在一段较长的时间内自然地向相对较高或较低的值发展。从 CO₂的数据来看,我们看到了上升趋势。

季节性:固定时间段内重复的模式。季节性可以是每周、每月或每年。

残差:表示与其余数据不一致的随机和不规则(异常值和缺失值)影响。

建立预测模型:

有几种时间序列预测方法和软件包可用,但脸书的预言家是一种快速可靠的方法,可以在建模/预测时间序列数据的最初阶段获得非常好的结果。Prophet 是一个加法回归模型,通过将时间序列分解为趋势、季节性和残差分量来拟合非线性趋势。关于先知背后的数学细节,请阅读这篇论文

从莫纳罗亚天文台,我们有从 1958 年 3 月到 2020 年 1 月近 62 年的月度数据。1958 年 3 月至 2013 年 10 月之间的月度数据用于“训练”模型,剩余的数据集(2013 年 11 月-2020 年 1 月)用于“验证”模型。一旦通过验证,该模型可用于预测未来 50 年的 CO₂水平。

CO₂对 2070 年前未来 50 年的预测

上图显示了 CO₂的观测值、估计值和预测值,以及 95%的置信区间。总的来说,FB Prophet 模型在捕捉长期趋势和季节性方面非常稳健。2015 年巴黎协定是最新的国际气候条约,旨在将本世纪全球气温上升幅度控制在 2 摄氏度以下,并有望限制在 1.5 度,低于工业化前的水平。

按照 CO₂目前的增长速度,50 年内污染水平将达到百万分之 530,使我们的气温上升幅度可能超过 3 摄氏度。

与 RCP 通路的关系:

为了使气候研究和政策制定标准化,政府间气候变化专门委员会(IPCC)提出了四种预示不同气候未来的情景。四个代表性的浓度路径(RCP)通常被称为 RCP2.6、RCP4.5、RCP6.0 和 RCP 8.5。RCP 的数值(2.6、4.5、6.0 和 8.5)指的是 2100 年的目标辐射强迫(以瓦特/平方米测量)。这些情景旨在涵盖从非常高(RCP8.5)到非常低(RCP2.6)的未来温室气体浓度。通过预测未来的 CO₂水平,我们可以估计相应的地表温度变化和单位面积的能量变化率。这些相互关联的度量有助于定义不同的 RCP 场景并对其进行基准测试。

收尾思路:

显然,世界各国在实现气候变化目标方面做得还不够,一切照旧。随着气温上升,我们可以预计,与极端天气相关的灾害的频率和严重程度将会增加,冰川融化和沿海洪水导致大规模迁移,干旱和火灾破坏雨林和全球食品供应链。应对气候变化和建设低碳未来需要做更多的工作。人们普遍认为,低碳未来意味着失去传统工作和更强劲的经济。与普遍的看法相反,像特斯拉这样的公司站在对抗碳排放的最前沿,并展示了实现这一目标的方法。

如果你喜欢这篇文章,这里还有一些你可能喜欢的文章:

[## 使用深度学习的飓风路径预测

每年 6 月 1 日到 11 月 30 日之间的时间窗标志着北大西洋飓风季节。在此期间…

medium.com](https://medium.com/@kap923/hurricane-path-prediction-using-deep-learning-2f9fbb390f18) [## 使用生成对抗网络的随机天气生成器

使用 GANs 对多元分布建模

towardsdatascience.com](/stochastic-weather-generator-using-generative-adversarial-networks-a9856b0f83ef)

解释线性和逻辑回归中的系数

原文:https://towardsdatascience.com/interpreting-coefficients-in-linear-and-logistic-regression-6ddf1295f6f1?source=collection_archive---------7-----------------------

如何解释你的系数,让每个人都能理解

虽然我在下面简要总结了线性回归和逻辑回归,但这篇文章更关注模型的系数。有关线性和逻辑回归模型的更多信息,请点击 此处 此处

我过去在一家餐馆工作时,每次换班开始时,员工们都会进行同样的谈话:我们会有多忙,为什么。是假日周末吗?天气怎么样?安排了哪些大型体育赛事?

尽管我们以行为经济学家的权威身份发言,但我们的预测更多地是基于轶事证据和直觉,而不是数据。但是我们有所发现。当然,许多因素(例如天气)和我们将会有多忙是有关系的。我们以自己的方式进行了一点民间回归分析。

回归分析

回归分析试图定义因变量(y)和任意数量的自变量(X)之间的关系。

来源:https://imgflip.com/memetemplate/151224298/

在线性回归中,y 变量是连续的(即有无限的可能性)。在逻辑回归中,y 变量是分类的(通常是二进制的),但是使用 logit 函数可以将 y 变量视为连续的(了解更多关于此处的信息)。

在线性或逻辑回归中,每个 X 变量对 y 变量的影响用 X 变量的系数表示。虽然两个模型的系数看起来相似,但它们需要以非常不同的方式来解释,本文的其余部分将解释如何解释它们。

对于数学人来说

(我将为这两个模型使用 sklearn 内置的“load_boston”房屋数据集。对于线性回归,目标变量是给定社区中自有住房的中值(以 10,000 美元计);对于逻辑回归,我将 y 变量分为两类,超过 21k 美元的中值标为“1”,低于 21k 美元的中值标为“0”。)

线性回归系数

首先,让我们看看更直接的系数:线性回归。在实例化和拟合模型之后,使用.coef_属性查看系数。

linreg = LinearRegression()
linreg.fit(X, y)
linreg.coef_

我喜欢创建一个熊猫数据框架,清楚地显示每个独立变量及其系数:

pd.DataFrame(linreg.coef_, 
             X.columns, 
             columns=['coef'])\
            .sort_values(by='coef', ascending=False)

如我所说,解释线性回归系数相当简单,您可以像这样口头描述这些系数:

“当所有其他变量保持不变时,[X 变量]每增加一个单位,[y 变量]就增加[系数]。”

因此,对于可变 RM(每所房子的平均房间数),这意味着当平均房间数增加一个单位(想想“5”到“6”)时,在所有其他因素都不变的情况下,该社区房屋的中值增加了约 6960 美元。另一方面,随着一氧化氮浓度增加一个单位(以每 1000 万分之一计算),房屋的中值将减少约 10,510 美元。

逻辑回归系数

逻辑回归模型以同样的方式进行实例化和拟合,.coef_属性也用于查看模型的系数。(注意:您需要使用.coef_[0]进行逻辑回归,将其放入数据框架中。)

logreg = LogisticRegression()
logreg.fit(X, y)
log_odds = logreg.coef_[0]pd.DataFrame(log_odds, 
             X.columns, 
             columns=['coef'])\
            .sort_values(by='coef', ascending=False)

对数赔率

然而,逻辑回归系数并不容易解释。这是因为逻辑回归使用 logit link 函数来“弯曲”我们的最佳拟合线,并将我们的分类问题转换为回归问题。(再次,了解更多这里。)

由于使用了 logit 函数,逻辑回归系数表示给定 X 变量的值时,观察值在目标类(“1”)中的对数概率。因此,需要将这些对数奇系数转换为常规奇系数,以便理解它们。幸运的是,这可以通过简单地对对数概率系数求幂来实现,你可以用np.exp()来实现:

odds = np.exp(logreg.coef_[0])
pd.DataFrame(odds, 
             X.columns, 
             columns=['coef'])\
            .sort_values(by='coef', ascending=False)

可能性

现在这些系数开始变得更有意义了,你可以这样口头描述几率系数:

“当所有其他变量保持不变时,【X 变量】每增加一个单位,观察值在(y 类)的几率是观察值不在(y 类)的几率的【系数】倍。”

因此,随着变量 RM(同样,房间的平均数量)增加一个单位,观察中表示的房屋在目标类(“1”)中的几率是它们不在目标类中的几率的 6 倍以上。另一方面,当一氧化氮浓度增加一个单位时,房屋处于目标类别的几率仅为 0.15。对于小于 1 的赔率(我们的负系数),我们可以取 1/赔率来更好地理解它们。所以一氧化氮增加 1,房子不在目标类的几率是 1/0.15 或者 6.66x(不祥!)和它在目标类中的几率一样大。

结束了

够简单!但是,当我第一次学习如何使用线性和逻辑回归对数据建模时,模型系数的这种差异对我来说并不清楚,我也不太确定如何口头解释逻辑回归模型的系数。我希望这能帮助刚接触这些概念的学生理解如何解释线性和逻辑回归中的系数。

通过减少训练期间的非线性来解释神经网络

原文:https://towardsdatascience.com/interpreting-neural-networks-by-reducing-nonlinearities-during-training-eca0fa7cbbf0?source=collection_archive---------61-----------------------

作者图片

机器学习和神经网络被越来越广泛地使用,尽管事实上它们大多是作为黑盒运行的,我们对它们如何产生输出几乎没有什么洞察力。这使得使用这些系统做出的决策很难仔细检查和说明。

在这篇笔记中,我描述了一个简单的解决方案,它使得从一个采用参数校正线性单元(PReLUs)的神经网络中提取规则成为可能。这是通过引入一个与反向传播平行施加的力来实现的,该力旨在将前序简化为单位函数,然后使神经网络折叠成一个更小的线性函数和不等式系统,适合人类决策者审查或使用。

由于这种力量降低了神经网络的能力,预计它也有助于避免过度拟合。

简介

机器学习解决方案,更具体地说,神经网络,被用于我们生活中越来越多的领域。同时,由于很难在任何层面上掌握它们是如何运作的,因此它们可以被视为黑箱,对于需要对业务和/或法律原因负责的公司来说,不太愿意采用它们。这一事实也会影响这类系统中公共场所的信任度。

正因为如此,提供能够帮助我们理解这些模型如何得出某个决定的工具是一个活跃的研究领域。这些工具包括可视化工具、识别最重要输入的工具、允许对输入数据进行实验以了解模型对不同信号的相对重要性的工具,以及本笔记的重点,显著降低神经网络的复杂性,使其能够从中提取决策“规则”,然后供人类决策者审查甚至使用。

这些规则可以采取的一种形式是封闭的、相对简单的代数表达式(例如,线性函数),其行为对于人类来说比由涉及数百万范围内的参数和非线性函数的神经网络实现的完整功能更可预测。

在这篇笔记中,我描述了一种在训练过程中降低神经网络复杂性的方法,这种方法允许将其输出描述为一个简单的线性函数系统,该系统限于由线性不等式定义的区域。特别地,考虑前馈神经网络,其中所有非线性是参数校正线性单元(PReLUs ),定义为

f ( x ) = max(0, x ) + a min(0, x ),

其中 0 ≤ a ≤ 1。

设网络的输入为向量(或张量,我们将其展平) I = ( i [1】, i [2],。。。, i [ n ]),输出为向量(或张量) O = (o[1],o[1],。。。,o[ m ])。

作为线性函数组合的神经网络

很容易看出,这样一个网络的输出 O 可以表示为一组 i [ x ]的线性组合,每个组合都被一组关于 i x 的线性不等式限制在输入值的特定区域内。

直觉上,这是正确的,因为只要(也就是说,在可能的输入向量的区域内)PReLUs 的输入没有从负到正的交叉,输出就是输入的线性函数,反之亦然;并且因为这些区域的边界也是线性的。

更正式地说,我们可以通过为任何给定的神经网络构建一个合适的线性组合和不等式系统来证明这种说法是正确的。对于网络中的所有预试,让我们决定它们的输入是负的还是非负的。如果前奏的数量是δ,这意味着 2**δ个可能的场景。在每种情况下,神经网络都变得完全线性,输出是输入的线性函数,事实上,网络内部的所有部分结果也是输入的线性函数。这需要 PReLUs 的输入也是输入 I 的线性函数,产生δ线性不等式(条件),其标出了该场景适用的输入空间的区域。

自然地,产生输出的 2δ线性组合的这个系统,每个由δ条件控制,很可能是多余的,因为条件可能不是独立的,或者可能是矛盾的,在这种情况下,输入空间的一些 2δ区域将是空的。但是该系统将是神经网络输出的精确描述。

虽然对于我们人类来说,线性函数似乎很容易解释和预测,但很明显,如果δ在大多数现代神经网络中处于数千或数百万的范围内,2**δ函数就不是这样了。因此,我们需要构建我们的神经网络的输出的近似,其在输入空间的大得多的区域中是线性的,并且具有小得多的不同区域。这相当于试图找到另一个很好地逼近我们网络的神经网络,但只包含少量的预序。

将预序简化为线性

这可以通过继续训练原始神经网络,同时在它的每个前序上施加力,使它的参数 a 向 1 移动来实现。

注意,如果 a = 1,那么 PReLU 退化为恒等函数 f ( x ) = x ,不再是非线性。在某种意义上,它消失了,并且神经网络围绕着它“崩溃”,因为在退化的预露之前的线性映射和在它之后的线性映射现在可以合并成单个线性映射。

因此,这种力量在逼近训练数据和减少预试次数之间找到了平衡,从而产生了一种神经网络,这种神经网络可以表达为一组线性函数和人类消耗的不等式。通过消除非线性,这种力也降低了神经网络的能力,因此可以预期它有助于避免过拟合。

我选择了一个独立于 a 的力,并在每个反向传播步骤后施加,以调整率η移动参数,但不会超过 1:

a[t+1]= max(0,min(1,a[t]+ηSGN(1a[t))。

在我的研究中,我认为任何前提都是完全线性的,如果

一> 0.9995。

η还依赖于网络表现出的当前误差,以允许网络最初无干扰地训练,然后越来越积极地将 PReLU 参数拉到 1。特别是,

η = η[0] 0.01 最大值(0,log(err)-2)

其中η[0] = 0.01 是整个模型的学习率,log()是 10 的底,而 err 是训练误差。这意味着当训练误差下降到 0.01 以下时,η将开始变得非零,并且可以随着训练误差下降而无限增长(尽管 a 参数无论如何都会被限幅)。

例子

演示上述内容的示例代码可在https://github.com/csirmaz/trained-linearization获得。该代码实现用 PReLU 参数上的力来训练小型神经网络,并且包含从模型的权重和其他参数中提取线性不等式和组合的系统的逻辑。

神经网络本身有 4 个输入节点、3 个输出节点和 4 个隐藏层,每层有 5 个节点。这些层由可训练的完全连接层链接,随后是 PReLU 激活,最后一个完全连接层除外,它只是提供输出。

期望网络学习以下关系:

out[1]= in[1]xor in[2]
out[2]= in[3]xor in[4]
out[3]= in[1]in[2]

其中所有的输入和输出都是 0 或 1,一些额外的噪声被添加到输入中。对于输入的 0 和 1 的所有 2**4 种可能组合,代码根据上述表达式生成训练数据。为每批训练数据生成新的噪声。

下图显示了一个经过训练的模型。两个非线性足以解决这个问题,实际上训练确定了一个解决方案,其中只有两个预实验是非线性的。

作者图片

(有 4 个输入节点(顶部)和 3 个输出节点(底部)。红线表示正重量,蓝线表示负重量。从右边引出的线表示偏差值。绿色方框标记被认为是线性的预课,而红色方框标记非线性预课。)

虽然在视觉化中,输入和输出之间的关系还很不清楚,但是一旦其他的前奏被认为是线性的,所有的权重都被压缩成非常简单的表达式。下面是代码的输出,列出了两个非线性初值产生的两种情况的表达式。这些完全对应于训练数据中的关系。

IF +0.00*in1 +0.00*in2 -1.00*in3 -1.00*in4 +1.00 < 0
  (PReLU #3 on level 1 is neg. ln(1-weight)=-2.58)
IF +1.00*in1 +1.00*in2 -0.00*in3 -0.00*in4 -1.00 < 0
  (PReLU #1 on level 4 is neg. ln(1-weight)=-2.60)
THEN
  out1 = +1.01*in1 +1.01*in2 -0.00*in3 -0.00*in4 +0.00
  out2 = -0.00*in1 -0.00*in2 -1.03*in3 -1.03*in4 +2.04
  out3 = -0.00*in1 -0.00*in2 +0.00*in3 +0.00*in4 -0.00IF +0.00*in1 +0.00*in2 -1.00*in3 -1.00*in4 +1.00 < 0
  (PReLU #3 on level 1 is neg. ln(1-weight)=-2.58)
IF +1.00*in1 +1.00*in2 -0.00*in3 -0.00*in4 -1.00 > 0
  (PReLU #1 on level 4 is pos. ln(1-weight)=-2.60) 
THEN 
  out1 = -1.01*in1 -1.01*in2 +0.00*in3 +0.00*in4 +2.02 
  out2 = -0.00*in1 -0.00*in2 -1.03*in3 -1.03*in4 +2.04 
  out3 = +1.00*in1 +1.00*in2 +0.00*in3 +0.00*in4 -1.01 IF +0.00*in1 +0.00*in2 -1.00*in3 -1.00*in4 +1.00 > 0
  (PReLU #3 on level 1 is pos. ln(1-weight)=-2.58) 
IF +1.00*in1 +1.00*in2 +0.00*in3 +0.00*in4 -1.00 < 0
  (PReLU #1 on level 4 is neg. ln(1-weight)=-2.60) 
THEN 
  out1 = +1.01*in1 +1.01*in2 +0.00*in3 +0.00*in4 +0.00 
  out2 = -0.00*in1 -0.00*in2 +1.00*in3 +1.00*in4 +0.01 
  out3 = -0.00*in1 -0.00*in2 -0.00*in3 -0.00*in4 +0.00 IF +0.00*in1 +0.00*in2 -1.00*in3 -1.00*in4 +1.00 > 0 
  (PReLU #3 on level 1 is pos. ln(1-weight)=-2.58) 
IF +1.00*in1 +1.00*in2 +0.00*in3 +0.00*in4 -1.00 > 0 
  (PReLU #1 on level 4 is pos. ln(1-weight)=-2.60) 
THEN 
  out1 = -1.01*in1 -1.01*in2 -0.00*in3 -0.00*in4 +2.02 
  out2 = -0.00*in1 -0.00*in2 +1.00*in3 +1.00*in4 +0.01 
  out3 = +1.00*in1 +1.00*in2 -0.00*in3 -0.00*in4 -1.01

参考文献

[1]何、、任、,“深入研究整流器:在 ImageNet 分类上超越人类水平的性能”,微软研究院,2015 年 2 月 6 日。http://arxiv.org/abs/1502.01852

https://epcsirmaz.blogspot.com】最初发表于

解释基于文本的机器学习模型

原文:https://towardsdatascience.com/interpreting-text-based-machine-learning-models-aa37218195c9?source=collection_archive---------19-----------------------

本·怀特在 Unsplash 上的照片

可解释文本预测的工具和技术

就像任何其他机器学习任务一样,重要的是要有工具来解释基于文本的机器学习模型如何得出它们的预测。

能够理解和解释机器学习模型如何得出预测是非常重要的。对模型如何得出结论的准确理解将使您能够构建更好、更准确的模型,并确保这些模型不会传播数据集中可能存在的偏差。

在这篇文章中,我想分享一些解释基于语言的机器学习的工具和技术。

用黄砖想象

为机器学习准备文本数据的一个常见步骤是对单词进行标记。这一步将语言片段分解成它们的组成部分,通常是单词。在建立模型之前,了解您正在处理的数据的大致模式会很有用。这可以为您使用的处理技术提供信息,甚至在您建立模型之前,就有可能揭示偏差的趋势。

Yellowbrick 是一个基于 scikit-learn 构建的机器学习模型可视化库。在其他可视化中,它包含了一些有用的可视化文本标记的方法。

为了说明其中的一些技术,我将使用当前 Kaggle 竞赛中的一个数据集,它可以在这里下载。这个数据集包含许多推文和一个目标标签,它告诉我们一条推文是否是关于一场真正的灾难。

在使用这个数据集之前,我已经执行了一些基本的文本清理任务。其中包括删除标点符号、特殊字符和停用词。

下面的代码读入数据并执行这些任务。

import pandas as pd
pd.set_option('display.max_colwidth', -1)
import re
import nltk.corpus
nltk.download('stopwords')
from nltk.corpus import stopwords
stop = stopwords.words('english')# Reads in the data
train_data = pd.read_csv('train.csv')# Drops all columns text and target
cols_to_drop = ['id', 'keyword', 'location']
train_data = train_data.drop(cols_to_drop, axis=1)# Removes punctuation and special characters
def  clean_text(df, text_field, new_text_field_name):
    df[new_text_field_name] = df[text_field].str.lower()
    df[new_text_field_name] = df[new_text_field_name].apply(lambda elem: re.sub(r"(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)|^rt|http.+?", "", elem))  
    # remove numbers
    df[new_text_field_name] = df[new_text_field_name].apply(lambda elem: re.sub(r"\d+", "", elem))

    return dfdata_clean = clean_text(train_data, 'text', 'text')# Removes stop words 
data_clean['text'] = data_clean['text'].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))

干净数据集的前几行如下所示。

接下来,我们将使用 yellowbrick 库来标记文本并检查频繁出现的单词。

import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.feature_extraction.text import CountVectorizer
from yellowbrick.text import FreqDistVisualizervectorizer = CountVectorizer()
docs       = vectorizer.fit_transform(data_clean['text'])
features   = vectorizer.get_feature_names()visualizer = FreqDistVisualizer(features=features, orient='v')
visualizer.fit(docs)
visualizer.show()

一个有用的练习可能是将这两个目标标签的数据分别可视化,以理解模型可以用来进行预测的数据中的模式。

灾难推文的代码和输出如下所示。

disaster_tweets = data_clean[data_clean['target'] == 1]
vectorizer = CountVectorizer()
docs       = vectorizer.fit_transform(disaster_tweets['text'])
features_disaster   = vectorizer.get_feature_names()visualizer_disaster = FreqDistVisualizer(features=features_disaster, orient='v')
visualizer_disaster.fit(docs)
visualizer_disaster.show()

接下来,我们对非灾难性的推文重复这个过程。

non_disaster_tweets = data_clean[data_clean['target'] == 0]vectorizer = CountVectorizer()
docs       = vectorizer.fit_transform(non_disaster_tweets['text'])
features_non_disaster   = vectorizer.get_feature_names()visualizer_non_disaster = FreqDistVisualizer(features=features_non_disaster, orient='v')
visualizer_non_disaster.fit(docs)
visualizer_non_disaster.show()

从这个分析中我们可以看到,有很多表示灾难的词,如火灾新闻灾难在灾难微博中出现得非常频繁,但在非灾难微博中出现得很少。

用 Shap 解释模型

Shap(SHapley Additive explaints)是一个 python 库,它使用博弈论的方法来为从机器学习模型中得出的预测提供解释。它包括解释基于文本的模型的功能,并与包括 scikit-learn 在内的各种机器学习和深度学习库一起工作。

在我们使用这个库来解释一个模型之前,我们首先需要建立一个模型。下面的代码将我们的数据分成训练集和测试集,并训练一个简单的基于逻辑回归的分类模型。

from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
import sklearn X_train, X_test, y_train, y_test = train_test_split(data_clean['text'],data_clean['target'],random_state = 0)vectorizer = TfidfVectorizer(min_df=10)
X_train = vectorizer.fit_transform(X_train)
X_test = vectorizer.transform(X_test)model = sklearn.linear_model.LogisticRegression(penalty="l1", C=0.1)
model.fit(X_train, y_train)

接下来,我们将导入 shap 并使用summary_plot函数来探索模型中使用的特性重要性。

import shap
shap.initjs()explainer = shap.LinearExplainer(model, X_train, feature_dependence="independent")
shap_values = explainer.shap_values(X_test)
X_test_array = X_test.toarray()shap.summary_plot(shap_values, X_test_array, feature_names=vectorizer.get_feature_names())

我们可以看到,我们用 yellowbrick 探索的灾难推文中频繁出现的许多词具有很高的特征值。

我们也可以用 shap 来解释个别预测。

ind = 0
shap.force_plot(
    explainer.expected_value, shap_values[ind,:], X_test_array[ind,:],
    feature_names=vectorizer.get_feature_names()
)

用 ELI5 进行解释

ELI5 是另一个 python 库,它同样为预测提供解释。它有一些非常好的渲染,特别是对基于文本的模型的解释。

它支持大多数常用的机器学习库,包括 scikit-learn、XGBoost 和 Keras。它还可以很好地与 scikit-learn 管道一起工作。

与 shap 类似,ELI5 提供了特征重要性的权重,这有助于在全局范围内为模型提供解释。

使用我们上面训练的模型,并提供用于预处理文本的矢量器,我们可以产生如下所示的可视化效果。默认情况下,对于二元分类,ELI5 将显示阳性类的要素权重。

import eli5eli5.show_weights(model, vec=vectorizer, top=10)

这个库中我最喜欢的功能是一个工具,它可以在原始文本上叠加对单个预测的解释。第一条推文的例子如下所示。我们可以看到,该模型预测这是一条灾难性的推文,并且该模型使用了突出显示的单词来进行预测。

eli5.show_prediction(model, data_clean['text'].iloc[0], vec=vectorizer)

原始数据集中的行显示这是正确预测的,是一条灾难性的推文。

print(data_clean.iloc[0])

让我们看一个非灾难推文的例子。

eli5.show_prediction(model, data_clean['text'].iloc[57], vec=vectorizer)print(data_clean.iloc[57])

这让我们了解了模型是如何进行预测的,并可能揭示模型中的任何偏见或道德问题。

本文简要概述了解释和调试基于文本的机器学习模型的技术。所有这些工具都有更多的功能,可以让您更深入地了解模型是如何执行的。值得看一看每一项的文档,并探索其他可用的特性。

如果您想探索自然语言处理中的更多概念,我最近写了两篇文章,在本文中使用了相同的数据集。它们包括:

构建机器学习模型参加 Kaggle 比赛的指南

自然语言处理的文本清理方法指南

感谢阅读!

用数据解读 2020 年波多黎各地震群

原文:https://towardsdatascience.com/interpreting-the-2020-puerto-rico-earthquakes-with-data-e241cdb2a14e?source=collection_archive---------19-----------------------

使用可视化,地图,时间序列和谷歌趋势数据来描述这一事件

波多黎各的圣胡安。照片由 me 拍摄。

自 2019 年 12 月下旬至 2020 年 1 月初,波多黎各岛的西南部地区经历了一系列地震,在波多黎各人中留下了一系列破坏和不确定性。根据美国地质调查局(USGS)的说法,导致这些地震的原因是北美和加勒比板块的汇聚。位于波多黎各北部的北美板块正在与加勒比板块汇合,而在南部,加勒比板块在 Muertos 海槽处隐没在波多黎各之下(来源)。

在本文中,我们将使用统计、可视化、时间序列分析来探索这些地震的几个属性,此外,查看谷歌搜索“波多黎各”和地震震级之间的相关性。

数据

这份报告的数据集由 USGS 报告的 2019 年 12 月 20 日至 2020 年 1 月 19 日半径 50 公里范围内的地震组成。从纬度 19.949 和经度-66.851。它有 2041 条记录,每条记录代表一次单独的地震,有 22 列记录了事件的属性。然而,根据这些特征,我们将只使用坐标、时间和事件的大小。

这是用于获取数据的查询。
https://earthquake.usgs.gov/fdsnws/event/1/query?format=csv&start time = 2019-12-20&end time = 2020-01-19&纬度=17.949 &经度=-66.851 & maxradiuskm=50

在数据集中,我过滤掉那些报告的震级低于 0 的条目(根据 USGS 文档,较低值可以是-1.0)。您可以在本文的代码库中找到数据集的副本。

除了这个主数据集之外,在这个项目中,我还使用了第二个数据集,由 Google Trends 从 2019 年 12 月 19 日到 2020 年 1 月 17 日的查询词“波多黎各”的数据组成。

工具

数据分析和大多数可视化都是在 r 中完成的。库 ggmap 用于生成地震位置的图形,时间序列分析是使用 Python 中的库 Prophet 完成的。趋势数据来自谷歌趋势。

了解地震

在 2019 年 12 月 20 日至 2020 年 1 月 19 日期间,总共报告了 2041 起事件,平均每天 66 。其中,2019 年 12 月 31 日是最活跃的一天,发生了 220 次地震,平均震级为 1.966 。总体而言,最强烈的地震发生在当地时间 2020 年 1 月 7 日 04:24:26,震级为 6.40 ,而平均震级为 2.467 ,标准差为 0.687 ,中位数为 2.390 。下面的直方图显示了震级得分的分布。

如果不是直方图最右侧的异常值点,这个分布将是一个正常分布,其中大多数值都接近平均值(黑线)。在下面的箱线图中,我们可以更好地看到异常值。

这个箱线图是一个偏右箱线图的例子,在这个例子中,盒子和变量值都在刻度的低端。在这里,我们可以看到第一个四分位数(方框底部)、第三个四分位数(方框顶部)和中间值(粗体线)之间的对称性,中间值代表直方图中的峰值。然后,方框上方是异常点,包括最强的 6.4 级地震。

我想展示的下一个图像是一个散点图,显示了地震发生当天的震级。该图还包括一条平滑线,指出属性的演变。

在图表中,我们可以看到虫群是如何在 2019 年的最后几天开始的。然后,在 1 月 2 日左右,活动稍微停止,直到 1 月 6 日和 7 日,当强大的一个到达时,在前一个是 5.80 小时后。在接下来的日子里,几次强烈的余震袭击了这个岛屿,包括 1 月 11 日的 5.90 级余震。回到图表的开头,你会发现一些震级值在 2 左右的地震。这些对应于波多黎各经常发生的“正常”但微弱的地震(大多数地震一般感觉不到)。

地点

正如引言中所述,蜂群出现在波多黎各的西南部地区,靠近 Muertos 海槽。更准确地说,受影响的地区位于纬度(17.8,18.0)和经度(-67.2,-66.6),该地区包括或靠近瓜尼卡、瓜亚尼亚、庞塞和亚乌科等城镇,这些地方遭受了严重的损失。在接下来的可视化中,我们将看到该地区的地图,其中显示了发生地震的震中位置。

平均地震发生在纬度 17.92564,经度-66.83728。

Muertos 槽,来源:https://ocean explorer . NOAA . gov/oke anos/explorations/ex 1502/background/geology/welcome . html

趋势和每日季节性

从上面呈现的散点图的平滑线,你可以了解自震群开始以来地震的强度是如何变化的。这条线虽然有用,但并不代表这个变量的最终趋势。

为了阐明这个问题,并更好地了解地震的震级是如何发展的,我使用时间序列工具 Prophet 计算了总体趋势和每日季节性。下面你会发现趋势。

这条线描述了自 2019 年 12 月 19 日以来震级的演变。在那一周,趋势线处于低位,与上面解释的“正常”行为相对应。然后,一旦地震开始,因为有很多低震级的地震,平均值就会下降。然而,紧接着,我们有大地震及其余震,随后又是一次下降。在写这篇文章的时候,地震活动仍然活跃,这解释了为什么这条线一直在增长。

为了澄清任何可能的混淆,我想快速解释一下你在图的 y 轴上看到的数字背后的含义。这些值不是实际的大小。相反,我们可以将它们解释为趋势部分当天的增量效应。例如,在图表的第一天,y 值为 2.0,这意味着这一天对 y 的影响为+2.0。

这一部分的第二张图是每小时的季节性。根据我的知识(如果我错了,请有人纠正我),地震是不遵循任何模式的随机事件。尽管如此,即使知道这一点,我还是想计算一下每小时的季节性,因为我得到的印象是(请注意,我不在波多黎各,所以我的“印象”是指我在新闻和社交媒体上看到的),大多数地震都发生在夜间。下图显示了数据。

首先映入眼帘的是凌晨 4 点后的全球最大值,也就是大地震发生的时间。然后,就在它之后,曲线下降,直到下午 4 点,然后再次上升(也许这就是为什么我认为它们发生在晚上),最后一次下降,直到凌晨 1 点左右达到最低位置。

谷歌趋势

通常,当像这样的自然事件发生时,相关国家会受到世界的关注。你会在新闻、当地报纸、社交媒体等等中看到提及。为了验证这个想法,我使用 Google Trends 的每日趋势分数作为搜索查询“波多黎各”,并将其与当天的最大震级值相关联。我认为地震越剧烈,关于波多黎各的谷歌搜索就越多。这个假设成立吗?下面你会找到数据。

这个可视化用红色(顶线)表示 Google Trends 的“趋势”值,用蓝色(底线)表示最大值。在 x 轴上,您将找到日期,在 y 轴上,您将找到值。请注意,y 轴使用对数刻度。关于相关性,两条线似乎遵循类似的模式,包括 28 日和 29 日左右的一个小高峰,随后在 1 月 7 日下降和再次上升。为了将这种关联转换并总结为一个数字,我计算了两个变量之间的皮尔逊相关,得到了 0.7186471 的值,这意味着中高正相关(1 是完全正相关)。所以,从某种意义上说,我的假设是正确的。

然而,尽管联系似乎很好,但我们不能盲目地确认或说这纯粹是由“人们因为地震而谷歌波多黎各”引起的。虽然这看起来确实是正确的,但我们必须记住,这种联系背后可能有其他原因。尽管如此,我个人的观点是这是。

概述

目前,波多黎各岛正在经历几十年来最严重的地震群。在本文中,我们使用美国地质调查局获得的数据分析了这些地震的几个属性,以更好地了解这一事件的行为和模式。通过数据,我们发现了事件的几个统计特性,如平均值和异常值,并发现我们的平均震级为 2.467,最活跃的一天是 2019 年 12 月 31 日。然后,我们进行了时间序列分析,以找出总体趋势和每小时的季节性,并发现一些最强烈的地震发生在夜间。最后,我们用谷歌趋势数据计算了最大震级之间的相关性,并确定了这两者之间可能的联系。

想了解更多关于地震的信息,我推荐美国地质勘探局的这份报告。此外,对于显示震级的互动图,请查看波多黎各大学 Humberto Ortiz-Zuazaga 教授创建的这个网络应用

感谢阅读。

您可以在下面的资源库中找到这个分析中使用的代码:【https://github.com/juandes/pr-earthquakes-analysis

[## 胡安·德迪奥斯·桑托斯

胡安·德迪奥斯·桑托斯的最新推文(@ jdiossantos)。我喜欢数据,也喜欢写数据。口袋妖怪大师,还有…

twitter.com](https://twitter.com/jdiossantos)

解释模型是人类的事,不是计算机的事

原文:https://towardsdatascience.com/interpreting-the-model-is-for-humans-not-for-computers-9a857011ff3?source=collection_archive---------55-----------------------

这是关于翻译,而不是重新措辞。

克鲁兹𝒥𝓊𝓁𝒾𝒶𝓃瓦莱里娅丰塞卡迪亚兹

纯粹解释批判

科学方法作为一种工具,帮助我们找到关于事物如何运作和做出决策的解释,也给我们带来了最大的挑战,这种挑战直到 2020 年我们可能仍未克服:给数字提供有用的叙述。又称“解读”。

作为一个澄清的问题,科学方法是寻找证据来证明或否定假说的管道。从自然科学到经济科学,科学和事物如何运作就是一切。但最令人高兴的是,通过证据,不仅我们的意思,但人类理解“数据”。数据不能少于数字。

留有一般性的空间,解释的问题沿着科学方法管道内的统计分析的道路特别有趣。这意味着找到用数学语言编写的模型,并在提供数据的上下文中找到对它们的解释。

解释一个模型有两个重要的含义,这是许多科学家或科学技术人员长期以来忽略的(希望不要忘记)。第一个依赖于这样一个事实,即如果有一个模型来解释现在的,那么在之前一定有一个研究问题环境中提出来,并提供数据来建立这样一个模型。第二个是,我们需要为我们的模型创建的叙述可以通过在研究问题的背景下表达关于一个数字的想法来做得更多,而不是纯粹在模型内部。毕竟,直到 2020 年,决策是由人类根据这些数字的含义做出的,而不是真正由计算机做出的。最后这句话很重要,因为在 21 世纪,我们可能真的会到达这样一个点,计算机在许多任务中接管我们,它们可能最终会为我们做决定。为此,他们需要在他们的网络中交流这些决定。就在那时,人类的叙述将不算数,因为计算机只理解数字。**

作为统计学家,我们一直采用这样的做法:寻找要解决的问题,寻找要回答的问题,并用可用数据解释答案。这种心态让我们在一个无意义的叙述和解释的循环中运行,因为 问题没有被发现或寻找 。不同现象的所有持续互动和反应都会产生问题。这一事实意味着统计模型和/或其他分析方法是用于核心中心问题的工具,而不是支柱。

这种对一些数据进行线性回归拟合并说“当 x 增加一个单位时,β系数是 y 增加的单位数”的丑陋艺术,或者计算平均值并说“这是我们可以找到大多数数据点的值”的艺术,是我们统计学家向科学方法提供的无情产品。

泡沫的解释

统计学教学让我们清楚地知道,人们可以完全理解模型的工作方式,以及如何训练他们来得到数字。然而,我们仍然没有消化的事实是,在训练模型时产生的所有数字中,大多数对于非统计人员来说只是不可传达的。让我们展示一些沟通不畅的数字:

——p 值是一个特殊的概念,事实上它本身可能值得写一整篇文章。例如,在社交媒体上,我们经常看到人们询问对 p 值的解释,马上就有一场统计学家给出他们自己的解释的风暴。

——这场辩论中的胜率明星。在这个领域工作了 10 年之后,我们必须承认,向另一个领域的专家解释如何考虑比值比从来都是不可能的。甚至维基百科也尝试过,在我们看来,不仅仅是失败了。

- 逻辑回归中虚拟变量的*β系数是同类的。我们感觉它们是类别相对于基线类别的比值比。但是,我们如何使它在实践中可以理解和操作呢?这一点我们根本不知道。*

这个问题是科学和统计界的核心问题。由于缺乏解释,我们训练的模型失去了价值。

几年来,我们一直在和同事们讨论这个问题,并寻找一个合适的框架来解决口译的问题,在此之后,我们得出了一个显而易见的结论:口译过程是存在的,而且只能在特定的语境中发生。争取模型内部的解释过程是没有意义的。模型的内部过程都是数字的,这些结果只能由数字统计人员交流和理解。在模型内部对数字做出解释是换句话说的泡沫。为了解释模型的结果,使它们成为采取行动的工具,必须牢记数据来源和研究问题提出的背景。

我们最喜欢的一个清晰描述解释之争的例子是,当解释模型时,当试图解决分类问题时,普遍倾向于逻辑回归而不是神经网络。众所周知,社区说,并发表论文说,当我们需要解释参数时,逻辑回归是好的,如果我们的目的只是预测,神经网络做这项工作。宣称我们更喜欢逻辑回归沉入比值比的湖泊?但这正是想要解释模型中的数字的效果。如果我们的问题包括解决一个分类问题,并且我们想要了解控制变量的影响,那么为这些控制变量设置假设场景并检查结果是或否的决定怎么样呢?我们认为,收入管理公司甚至会为这些假设情景支付比 PowerPoint 幻灯片更多的钱,幻灯片上说贝塔是我们二元问题的赔率。同样,巨大的知识可以从医学和生物学中的假设场景中茁壮成长,而优势比永远不会带给我们。

解释的过程

泡沫破裂

建立使解释成为可能的框架需要精确定义哪些条件涉及到模型中,哪些条件涉及到上下文中。**

在模型建立阶段,我们使用的知识是数字的、统计的和技术的。我们的核心概念和关注点是关于我们用来建立模型的方法的准确性和稳健性。量、参数、数学公式、算法是这个世界的主要组成部分。因此,主要研究人员不需要完全理解这个过程中的每一个组件,因为大多数组件只是保持大型机器运行所需的组件。

另一方面,上下文基本上充满了非统计的技术知识。这个世界的概念被改变了。例如,代表数据的数字被转换为计量单位的。我们不把数据作为数学或计算的表示,我们用米、公斤、秒、人、家等来谈论这个数字。对这些概念的理解是首席研究员的主要能力。就像以前一样,技术统计师可能对上下文中的所有概念都没有深刻的理解,但他们理解赋予两个世界意义的问题的大图景是至关重要的。

也就是说,解释过程就是将模型中的数字与上下文中的概念联系起来。这关系到泡沫的破灭。

如果我们从语言学的角度来考虑这个过程,在语义学中有单义(一个意思)和多义词(多个意思)。还有外延意义(字典的意思)和内涵意义(上下文中的意思)。因此,在语义词中,传统的统计解释过程是关于给一个数字只有一个意义,如统计学教科书中所呈现的那样,这是一种单素的外延方式。我们认为,在不同的语境下赋予一个数字多种含义,即以一种多义的隐含方式,是对非统计人员统计理解的一种提高。

让我们来看看其他大大小小的例子。在财务分析中,一项资产收益的标准差被称为波动率。术语波动率是金融领域的一个概念,这个数字和概念之间的联系在这个领域之外没有任何意义。电影摄影也是如此,电影标点符号的标准偏差被称为争议。在质量控制和过程改进方面,六适马标准的目标是一百万个产品中有 3.4 个错误。我们发现更多这样的例子,比如经济学中的弹性,市场营销中的满意度,毒理学中的致死剂量等等。正如我们所看到的,这个连接正是一个翻译。这种翻译使得以有意义的方式读取数字成为可能。

我们甚至不需要将这场辩论缩小到统计和研究界。截至 2020 年,每一个接入互联网的公民都可能在新冠肺炎疫情期间遇到过著名的“曲线”。所有的媒体都在谈论“曲线变平”的目标。嗯,这个“拉平曲线”可能是将模型转换到上下文中最令人愉快的例子。“曲线”正是我们这里所说的“模型”。对此没什么好说的了。这个模型有一个非常具体的数学公式,它将感染病例的数量、有感染风险的病例等联系起来。,随着时间的推移。现在,这个模型中非常具体的数字定义了人口在死亡前承受疾病的能力。不需要花费精力去寻找数字与上下文的联系,因为模型是为这个上下文而创建的。虽然随着更多数据的到来和模型的重新估计,这些数字在负责的统计学家手中发生了变化,但专家们等待着被告知曲线是否变平的那一刻,以便他们向我们传达我们作为公民能做什么和不能做什么。

在这场辩论中,我们可以更接近统计界更熟悉的东西:解释 PCA(主成分分析)。这是以多种不同方式处理数据的方法之一。我们使用 PCA 进行可视化、数据清洗、降维等。这也是学术界和工业界无数研究领域中使用的方法之一。然而,我们问,我们在多大程度上真正利用了这种类型的统计工具的潜力?。让我们考虑社会科学中的一个典型案例,其中研究人员有人口统计和社会变量,为了“理解数据和变量之间的关系”,实施了 PCA。请注意,这里已经有一个框架缺陷,因为“理解数据和变量之间的关系”不是一个研究问题或目标。但是好吧。计算完 PCA 数后,我们要做的事情之一是构建一个分数图,表明每个轴保留的方差百分比。那么,这个方差百分比是什么意思呢?如果说第一个分量保留了数据中 30%的可变性,我们真正得到了什么?实际上没什么。然而,想象我们的变量是薪水爱好数量,研究者假设了一个快乐潜在特质。告诉研究人员这些变量的多少信息同时解释了假设的特征怎么样?那将是 30%,所以有 70%的工资爱好数量说明了一些其他潜在的特质。除此之外,大多数双标图、特征值等在这种情况下可能意义不大。

从计算机语言到人类叙事

突发后的重建

我们对这一框架的考察使我们得出了一些我们认为是正确的说法。

第一个。不是每个数字都有从模型到上下文的翻译,因为不一定存在一个概念来连接每个数字。例如,这发生在神经网络中,其输出具有容易的解释,但是大多数情况下内层权重没有直接的解释。

第二个。数字和概念之间的联系并不总是很明显。有些数字能比其他数字更直接地找到它们的概念。在经济学中, GDP (特定时期内生产的所有最终商品和服务的市场价值)的概念,根据定义,与一个数字相关联。因此,当从模型(即抽样和估计)计算数字时,这种联系是瞬时的、明显的和尖锐的。另一方面,同样在经济学中,不平等(人口群体之间经济福祉的差异)的概念是一个完全抽象的概念。这里,它在模型中作为 GINI 系数(即洛伦兹曲线上方的区域)的表现并不明显。在第一个例子中,这个概念是一个有单位的数,这个数是对它的估计。在第二个例子中,概念是一个抽象的概念,数字是两条曲线之间的区域。

第三个。解释的目标是了解问题背景的人和将模型作为解决方案的人之间的交流,这种想法也不是很明显。这最后一句话非常有力。最初,你可以认为这个想法没有改变什么,但它确实改变了。解释是不同世界之间的交流行为,这一概念以前从未被最深刻地使用过。我们必须承认,传统的解释范围在于重新表述模型中的数字,用统计术语、数学公式和毫不留情的交流来谈论这些数字。

现在发生了什么

我们承认这种解释方法具有挑战性,但我们希望明确可以采取的行动。

在统计模型作为工具的一些研究领域,定义和构建解释框架是一个基本步骤。发现不同领域中最常用模型的意义不仅可以为非统计研究人员和用户提供更好的可用性,增强他们的分析体验,而且还可以建立和传播更好的统计文化。

为开发这一框架进行研究,以便对模型进行良好的解释实践,这是新兴的培训。一些语义学概念的引入使我们认为有大量的理论有待发展。统计解释是一个语言科学尚未涉及的交流过程。

在学院内外传播消息。讲座,研讨会,会议等需要在统计学院举行。我们需要创造一个环境来提出这个讨论和它的含义。统计学和语言学的学生都必须参与进来,以形成一种准确的统计学交流方法。

SVM 和 XGBoost 模型分析

原文:https://towardsdatascience.com/interpretml-analysis-of-svm-and-xgboost-models-e68062f7299f?source=collection_archive---------46-----------------------

使用微软的 MimicExplainer 进行回归建模

来源:图片由 geraltPixabay 拍摄

微软的 InterpretML 旨在扩展机器学习模型的可解释性。换句话说,让那些模型更容易理解,最终便于人类解释。

微软的 Interpret-Community 是这个知识库的扩展,它包含了额外的可解释性技术。

特别是,一个有用的特性是所谓的 MimicExplainer。这是一种全局代理模型,允许任何黑盒模型的可解释性。

背景

在本例中,MimicExplainer 用于解释使用 SVM(支持向量机)和 XGBRegressor (XGBoost 用于回归问题)构建的回归模型。

具体来说,这两个模型的用法如下:

  1. SVM 用于预测使用特定特征的客户的平均日费率,例如他们的原产国、细分市场等。原始调查结果见此处。
  2. XGBRegressor 用作时间序列回归模型,通过将滞后序列与实际序列进行回归来预测每周取消的数量,即序列滞后高达 t-5 的 5 个滞后序列用作模型中的特征,以预测时间 t 的取消值。原始发现可在此获得。

原始数据来自 Antonio、Almeida 和 Nunes (2019):酒店预订需求数据集

为了演示 MimicExplainer 如何工作,我们展示了原始模型和结果,并提供了关于 MimicExplainer 如何使这些结果更具可解释性的更多信息。

SVM

为了预测酒店预订的平均每日价格(或客户平均每日支付的价格),构建了一个具有以下特征的 SVM 模型:

  • 取消(无论客户是否取消预订)
  • 原产国
  • 细分市场
  • 存款类型
  • 客户类型
  • 所需的停车位
  • 抵达周

该模型被训练如下:

>>> from sklearn.svm import LinearSVR
>>> svm_reg = LinearSVR(epsilon=1.5)
>>> svm_reg.fit(X_train, y_train)LinearSVR(C=1.0, dual=True, epsilon=1.5, fit_intercept=True,
intercept_scaling=1.0, loss='epsilon_insensitive', max_iter=1000, random_state=None, tol=0.0001, verbose=0)>>> predictions = svm_reg.predict(X_val)
>>> predictionsarray([100.75090575, 109.08222631,  79.81544167, ...,  94.50700112,
        55.65495607,  65.5248653 ])

当根据测试集验证该模型时,获得了 44.6 的 RMSE(均方根误差),以及 29.5 的 MAE(平均绝对误差)。平均 ADR 为 105,该模型在估计客户 ADR 值时显示了一定程度的预测能力。

下面是我们如何使用 MimicExplainer 来进一步解释这些结果。

from interpret.ext.blackbox import MimicExplainerfrom interpret.ext.glassbox import LinearExplainableModelexplainer = MimicExplainer(svm_reg, 
                           X_train, 
                           LinearExplainableModel)

MimicExplainer 是黑盒模型,而 LinearExplainableModel 被用作这个黑盒模型的全局代理。

请注意,在运行模型时,如果处理高维数据,即列数超过行数的情况,可以设置 augment_data = True 。这允许对初始化样本进行过采样。

但是,假设情况并非如此,即数据集的行数比列数(要素)多得多,则不会调用此功能。

接下来,打印出一个全局解释,其中包括前 K 个特性及其重要性值:

global_explanation = explainer.explain_global(X_val)sorted_global_importance_values = global_explanation.get_ranked_global_values()sorted_global_importance_names = global_explanation.get_ranked_global_names()
dict(zip(sorted_global_importance_names, sorted_global_importance_values))global_explanation.get_feature_importance_dict()

以下是输出:

{3: 8.81513709127725,
 7: 4.9616362270740995,
 1: 4.959263897550327,
 6: 2.593931464493208,
 2: 0.9707145503848649,
 5: 0.8455564214901589,
 4: 0.505321879369921,
 0: 0.0}

从上面可以看出,特征号 3 (细分市场) 7 (抵达周)和 1 (预订取消)是影响客户 ADR 的最重要特征。

也就是说,如果我们希望在验证数据中分离出某些观察结果呢?例如,假设我们只想确定选定的几个客户的特征重要性?

这里有一个例子。

根据验证集,为订购 10 到 15 的客户确定重要特性及其值。

local_explanation = explainer.explain_local(X_val[10:15])sorted_local_importance_names = local_explanation.get_ranked_local_names()sorted_local_importance_values = local_explanation.get_ranked_local_values()

以下是已确定的重要特性及其价值:

>>> sorted_local_importance_names[[1, 3, 2, 6,  5, 4, 0, 7], [7, 3, 2, 6, 5, 4, 1, 0], [6, 5, 4, 1, 0, 2, 7, 3], [6, 3,  5, 4, 1, 0, 2, 7], [3, 7, 6, 5, 4, 1, 0, 2]]>>> sorted_local_importance_values[[17.833762274315003,  9.1394041860457, 1.1694515257954607, 0.0, -0.0, -0.0, 0.0,  -1.707920714865971], [9.955928069584559, 9.1394041860457,  1.1694515257954607, 0.0, -0.0, -0.0, 0.0, 0.0], [0.0, -0.0, -0.0, 0.0,  0.0, -0.5708037209239748, -11.288939359236048, -13.709106279068548],  [19.017733248096473, 9.1394041860457, -0.0, -0.0, 0.0, 0.0,  -0.7448292455959183, -5.040448938994693], [9.1394041860457,  6.623399845455836, 0.0, -0.0, -0.0, 0.0, 0.0, -0.9884649801366393]]

这允许客户隔离特性的重要性。例如,功能 1(预订取消)是对客户 10 影响最大的因素,而功能 7(抵达周)是对客户 11 影响最大的因素。

XGBRegressor

如上所述,最初使用 XGBRegressor 模型是为了预测有问题的酒店的每周取消数量。

该模型定义如下:

from xgboost import XGBRegressormodel = XGBRegressor(objective='reg:squarederror', n_estimators=1000)
model.fit(X_train, Y_train)

以下是定义的模型参数:

来源:Jupyter 笔记本输出

从上面我们可以看到,在训练 XGBRegressor 时,有许多模型参数可以修改。但是,在这种情况下,n_estimators 被设置为 1000。这定义了 XGBoost 模型中树的数量。目标设置为‘reg:squarederror’,即平方损失回归,对极值误差的惩罚更重。

验证集的 RMSE 为 50.14,平均相对误差为 38.63,低于验证集的平均值 109。

使用 MimicExplainer,模型结果的可解释性现在可以以与上一个示例类似的方式生成:

from interpret.ext.blackbox import MimicExplainerfrom interpret.ext.glassbox import LinearExplainableModelexplainer = MimicExplainer(model, 
                           X_train, 
                           LinearExplainableModel)

为此,我们可以确定在时间 t 确定每周酒店取消价值时最重要的特征。然而,假设这是一个时间序列,该模型有效地指示了哪个滞后值在预测特定周的取消时最具信息性,例如,在影响时间 t 的取消时,最重要的是 1 周滞后还是 3 周滞后?

global_explanation = explainer.explain_global(X_val)sorted_global_importance_values = global_explanation.get_ranked_global_values()sorted_global_importance_names = global_explanation.get_ranked_global_names()dict(zip(sorted_global_importance_names, sorted_global_importance_values))global_explanation.get_feature_importance_dict()

结果如下:

{3: 10.580821439553645,
 2: 7.795196757642633,
 1: 4.973377270096975,
 4: 2.329894438847138,
 0: 1.382442979985477}

从上面可以看出,当预测时间 t 的每周酒店取消时,特征 3 (t-4)的滞后是最重要的。

但是,如果我们希望隔离某些周,该怎么办呢?

采用验证集,让我们将观察值 813 中的周分离出来(对应于 2017 年,第 13 到 18 周)。

local_explanation = explainer.explain_local(X_val[8:13])sorted_local_importance_names = local_explanation.get_ranked_local_names()sorted_local_importance_values = local_explanation.get_ranked_local_values()

以下是研究结果:

>>> sorted_local_importance_names
[[4, 0, 2, 1, 3], [3, 4, 1, 0, 2], [3, 4, 1, 2, 0], [3, 2, 0, 4, 1], [2, 3, 4, 0, 1]]>>> sorted_local_importance_values
[[1.2079747395122986, 0.655418467841234, -2.068988871651338,  -5.677678197831921, -16.414222669030814], [5.880283637250306,  1.524120206263528, 1.157876862894971, -1.807324914948728,  -11.282397723111108], [7.472748373413244, 7.056665874410039,  6.562734352772048, 3.8926286204696896, 0.353858053622055],  [35.340881256264645, 4.976559073582604, 2.0627004008640695,  1.1289383728244913, -2.3393838658490202], [23.945342003058602,  5.4821674532095725, 1.287011106200106, -0.7518634651816014,  -2.975249452893382]]

以这种方式识别跨时间序列的重要性特征可以潜在地产生关于滞后值在预测跨不同周的取消中的重要性的有用见解。例如,我们可以看到,在预测第 13 周的取消时,t-5 的滞后(特征 4)被确定为最重要的特征。

然而,当预测第 18 周的取消时,t-3 的滞后(特征 2)被认为是最重要的。

与使用一刀切的预测模型相反,可解释性可以为特定时间点确定合适的预测方法,反过来又允许在不同时期定制时间序列预测方法。

结论

在这个例子中,我们看到了可解释性如何在分析机器学习输出时产生有价值的见解——当简单地使用黑盒 ML 模型时,这将更加困难。

具体来说,我们已经看到:

  • 如何将 MimicExplainer 用作全局代理模型,以允许任何黑盒模型的可解释性
  • 在回归问题中使用 MimicExplainer
  • 如何解释 MimicExplainer 的结果并衡量特征重要性

非常感谢您的宝贵时间,非常感谢您的任何问题或反馈。以上例子的相关 Jupyter 笔记本可以在这里找到。

免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应被解释为任何形式的专业建议。调查结果是作者的,与上述任何第三方无关。

用于评估图像分割模型的交集(IoU)计算

原文:https://towardsdatascience.com/intersection-over-union-iou-calculation-for-evaluating-an-image-segmentation-model-8b22e2e84686?source=collection_archive---------6-----------------------

一个计算 IoU 度量的实际例子,它允许我们评估一个预测的边界框与地面真实框有多相似

在最简单的情况下,分割是将数字图像分成几个片段的过程。使用遮罩 R-CNN 进行实例分割的结果是应用于所需对象的遮罩和围绕该对象的边界框。

在我解决的一个实际任务中,有必要确定谷歌地球照片中的建筑物。这项任务成功地完成了使用掩模 R-CNN 的实例分割。在训练模型之后,有必要评估它的质量以预测建筑物周围的包围盒。我想让读者熟悉我用来评估预测边界框坐标的质量的方法(用代码)。

并集上的交集 (IoU)被认为是测量两个边界框或遮罩之间重叠的良好度量。

图片由 Oleksii Sheremet 用微软 Visio 创建

如果预测完全正确,IoU = 1。IoU 越低,预测结果越差。

图片由 Oleksii Sheremet 使用 Microsoft Visio 创建

所有代码都是在 Google Colab 中实现的。让我们仔细看看。导入库并加载源图像:

import cv2import numpyimport matplotlib.pyplot as pltimg = cv2.imread(“./some_image.jpg”)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

图像由 Oleksii Sheremet 使用 matplotlib 模块创建

导入库并加载源图像:

# An example of first bounding boxfirst_bb_points = [[250, 210], [440, 210], [440, 390], [250, 390]]stencil = numpy.zeros(img.shape).astype(img.dtype)contours = [numpy.array(first_bb_points)]color = [255, 255, 255]cv2.fillPoly(stencil, contours, color)result1 = cv2.bitwise_and(img, stencil)result1 = cv2.cvtColor(result1, cv2.COLOR_BGR2RGB)plt.imshow(result1)

让我们设置原始边界框的坐标,并用黑色填充边界框外照片的全部内容:

图像由 Oleksii Sheremet 使用 matplotlib 模块创建

作为预测的结果,获得第二边界框的坐标:

# An example of second bounding boxsecond_bb_points = [[280, 190], [438, 190], [438, 390], [280, 390]]stencil = numpy.zeros(img.shape).astype(img.dtype)contours = [numpy.array(second_bb_points)]color = [255, 255, 255]cv2.fillPoly(stencil, contours, color)result2 = cv2.bitwise_and(img, stencil)result2 = cv2.cvtColor(result2, cv2.COLOR_BGR2RGB)plt.imshow(result2)

像上一个例子一样,用黑色填充边界框外的所有内容:

图像由 Oleksii Sheremet 使用 matplotlib 模块创建

通过在边界框外用黑色填充图像,感兴趣区域外的像素不会影响 IoU 计算:

# IoU calculationintersection = numpy.logical_and(result1, result2)union = numpy.logical_or(result1, result2)iou_score = numpy.sum(intersection) / numpy.sum(union)print(‘IoU is %s’ % iou_score)

因此,我们得到以下结果:

IoU is 0.7625239952938262

结论

所提出的方法在实践中运行良好。可以定义图像区域之间的重叠,不一定是矩形的。例如,您可以使用 OpenCV 计算被遮罩对象周围轮廓的坐标。然后,利用这些点和上述方法,可以计算两个掩膜之间的 IoU。

参考文献

让我获得第一份数据科学工作的面试策略

原文:https://towardsdatascience.com/interview-strategy-that-landed-me-my-first-data-science-job-bdd5e77bfb49?source=collection_archive---------6-----------------------

我是如何展示自己得到这份工作的

照片由德鲁·海斯Unsplash 上拍摄

技术面试的想法让我害怕。一直都是。当我决定将职业从神经科学转向数据科学时,面试是我最害怕的部分。

通过观看我男朋友面试几家科技公司,我对这个过程有了一些了解。所以我知道一点该期待什么,但不确定对数据科学家来说是否会有所不同。

主要是我害怕让自己出丑。尤其是在我尊敬的面试官面前。然而,这种担心被我远程采访的事实稍微减轻了。不知何故,压力似乎稍微小了一些。如果我不得不快速逃离面试,我所要做的就是关上我的笔记本电脑😜

在这个故事中,我将详细介绍我在硅谷面试数据科学职位时使用的策略。我住在澳大利亚阿德莱德的时候接受了这些采访。这个策略是基于我在科技行业认识的人、数据科学家和我作为博士后的经验提出的建议。

最终,我成功地找到了一份我喜欢的工作。如果你打算申请数据科学的工作,我的一些策略也可能对你有用。

我的战略要素:

  • 给了自己一个的期限去准备
  • 在我认为自己准备好之前,我提前面试了
  • 有针对性的工作,我以前的工作经历给了我优势
  • 精心挑选我申请的公司
  • 通过做调查,我对这些公司了如指掌
  • 我试图在面试中表现得风度翩翩,并与面试官建立私人关系
  • 在面试中,我尽力表现出一个自信的人。假装直到我成功了!
  • 对我的优点和缺点是否诚实坦率
  • 尽可能寻求反馈来继续提高我的面试技巧

限期

我给自己 6 个月的时间重新培训成为一名数据科学家。那样的话,如果数据科学不适合我,那我只是浪费了 6 个月的时间。我对浪费 6 个月的时间去找一份技术工作的想法感到很舒服。

有时间限制意味着我不能困在我的舒适区。我知道我必须快速行动,才能在短短 6 个月内找到一份数据科学的工作。所以没有时间自我破坏或拖延。我不得不陷入其中,忽略恐惧。

早点开始

因为我给了自己 6 个月的时间限制,我知道我需要早点开始面试。甚至在我以为我准备好了之前。这对我有一种解脱的效果。

我知道自己会发展得很快,所以我没有选择,直到我对自己的新技能感到满意,才开始申请工作。它给了我前进的动力。我不想妨碍自己。

女性通常会等到具备她们认为需要的所有素质后再去申请工作。我们等到可以勾掉工作添加中描述的每一项。我知道我当然倾向于那样。我给自己的时间限制至少部分是为了确保我不会落入那个陷阱。

所以当我仍然觉得自己是个骗子时,我开始申请数据科学的工作。

我申请的前 10 份工作,我得到的都是没有人情味的拒绝信。这很令人沮丧,但我已经预料到了。然后,我收到了几封为我量身定做的更令人鼓舞的拒绝信。

为收到一封“好”的拒绝信而高兴是一种如此怪异的体验。得到一个有效的理由,至少我知道他们已经足够重视,知道我不太适合他们的职位空缺。

又过了一会儿,我得到了真正的采访。我原以为要花将近整整 6 个月的时间才能得到面试机会,但实际上我只花了 3 个月就得到几份最早的面试机会。在那个阶段,我还在努力完成我最初的一些课程,所以表现不是特别好。

然而,我认为让我为被录用的面试做好准备的部分原因是在不成功的面试中的所有练习。回顾我参加的第一批数据科学面试,我犯了一些非常愚蠢的错误。

例如,在我最早的一些面试中,我犯了一些初学编程的错误,这表明我是多么的不成熟。我还曲解了我第一次带回家的编程作业中的一些数据。好的一面是,我从他们身上学到了东西,并意识到我没有尽可能好地回答问题。如果没有犯那些早期的错误,我可能不会想出正确的方法来处理带回家的作业和数据问题。

所以我认为尽早开始练习是有好处的。这样,当合适的工作来临时,你就可以准备好尽你最大的努力去完成面试。

成为目标

让我很早就成功获得面试机会的部分原因是我在找工作时非常有针对性。我几乎只关注健康科学领域的公司。

我在健康研究领域的专业知识对这类公司来说是一个有价值的补充。我猜教一个神经科学家编码比教一个程序员做脑外科手术更容易😉

我想我以前在神经科学方面的经验让我的申请受到了招聘经理的注意。这可能会让我从竞争相同数据科学职位的其他候选人中脱颖而出。任何能让你在找工作时占得先机的东西都值得利用。

令人欣慰的是,湾区有高度集中的生物技术和医疗保健初创公司。所以我仍然有很多公司可以选择。

寻找合适工作的最有用的工具之一是岩石健康工作委员会。Rock Health 是一家投资数字健康公司的风险投资基金。我会仔细检查他们投资的每一家公司,查看旧金山湾区的职位空缺。

我确信这种策略也适用于其他领域的专业知识。有很多风险基金和天使投资者喜欢投资他们熟悉的领域。这是一个找到已经通过别人尽职调查的公司的好方法。你也知道他们有足够的钱让灯亮着。

有选择性

我创建了一份名单,列出了我能找到的所有正在寻找数据科学家的医疗保健初创公司。我需要缩小我的名单并申请。

我根据我最想为之工作的公司缩小了名单。对我来说,最重要的标准是公司的使命与我的价值观产生共鸣,并且是他们业务的核心。此外,我想和有趣的人一起解决有趣的问题。

这些是我优先考虑的事情。通过寻找让我兴奋的工作,我可以通过求职信和面试向招聘经理表达我的兴奋。如果你真的很热情,听起来会更容易。不需要过度表演。

我更感兴趣的是找到一份让我充满激情的工作,而不是一份尽可能赚钱的工作。

获得信息

在申请这个职位之前,我尽可能彻底地研究了每家公司。

大多数创业公司的网站上都有描述其使命和目标的页面。我认为这是你在决定该公司是否值得申请之前应该考虑的最低要求。即使你不知道他们业务的每一件事,你至少应该知道它的核心是什么。不值得浪费你或招聘委员会的时间去处理大量不明确的电子邮件申请。质量重于数量。

我在 Linkedin 上研究创业公司。我想看看有没有员工是朋友的朋友,因为有时候认识一个人可以帮你打开大门。

对于每一份申请,我都写了量身定制的求职信。没有什么比收到一封普通的拒绝信更糟糕的了。我想对于那些收到大量普通求职信的招聘经理来说也是如此。

在求职信中,我详细说明了我为什么想在那家公司工作。你可能认为你想在那里工作的原因是显而易见的。把事情说清楚总是一个好主意,这样你就不会被误解。

风度翩翩

这可能不言而喻,但我总是试图在求职面试中讨人喜欢。不是因为我想和面试官调情。而是因为让你在面试中遇到的人愿意和你一起出去是个好主意。

每个人一天中的大部分时间都是和同事在一起。在同一个团队工作的人更是如此。所以很明显,你希望面试你的人能接受将来花更多时间和你在一起的想法。他们不想在工作时和混蛋们混在一起。所以我总是努力让自己明白,我是一个很好相处的人。

它也是双向的。我知道我会花很多时间在办公室。所以我想选择一家公司,和我喜欢相处的人在一起。

如果你能在个人层面上与一些面试你的人建立联系,那就更好了。然后希望你会给他们留下深刻的印象,你会留在他们的脑海中。

例如,在一次采访中,我采访了一位曾经做过研究科学家的数据科学家。我们在对研究和可转移到数据科学的技能的感受中找到了共同点。

表现出自信

即使我在面试中并不总是感到自信,我也会努力表现出自信。我不是说我表现得好像对工作的每个方面都有信心,而是说我有自信。自信和自负是有区别的。我试着选择前者。

当你感到紧张时,人们可以看出来,这有时会让他们感到不舒服。面试中我最不想做的事情就是让面试官感到不舒服,哪怕只是出于同情。

通常在技术面试中,通过让候选人在白板上写代码或伪代码来测试编程能力。这是在面试小组面前完成的。我个人很讨厌这种做法,认为这完全是浪费时间。作为一名数据科学家,我从未在白板上当着人们的面编写代码,这是我工作的一部分。如果这不是工作的一部分,你为什么要让人们在面试中去做呢?

因为我是远程面试,所以公司要求我做白板代码测试实际上是不可能的。知道没有白登考的机会,让我多了一点自信。相反,一些公司让我在谷歌文档中进行结对编程,与他们讨论问题,或者完成带回家的编码任务。

我试图描绘自信气氛的另一种方式是问一些聪明的问题。我总是确保通读带回家的编码作业。然后我会提出一系列问题来确保我理解正确。在我看来,问几个问题要比羞于提问然后错误地处理问题好得多。对于面试官来说,像这样的误解可能是一个危险信号,表明你是否适合他们的团队。

诚实

每个人都有局限性。我没有什么不同。所以当我面试的时候,我确保对他们非常诚实。我认为如果你不粉饰你所说的一切,人们会对你的回答更有信心。如果你对自己和技能的描述更加平衡,那么面试官会更倾向于相信你。

例如,我知道我最近才获得数据科学技能。所以如果我被录用,我会成为一名初级数据科学家。我想让我面试的每一家公司都清楚这一点。我喜欢低估和夸大。

我告诉他们,我不一定能立即投入工作,也不一定一开始就富有成效。相反,我是一个非常快的学习者,所以我不会花太多时间来达到速度。在我的几次面试中,这似乎给我留下了很好的印象,招聘经理对我的诚实做出了积极的回应。

寻求反馈

几乎每次面试后,我都会询问对自己表现的反馈。尤其是当面试官给我的带回家作业打分的时候。

当我知道自己在上一次面试中做错了什么时,下次面试就容易得多。我很惊讶每个人都很乐于助人,他们愿意在繁忙的日子里抽出时间给我工作上的反馈。

大多数时候,我已经知道他们要说什么,但确认我的直觉是正确的感觉很好。这样,我知道我正朝着正确的方向前进。

结论

正如我在整个故事中所说的,这些是我在面试我的第一个数据科学职位时想到的策略。我确信还有许多其他的好方法可以提高面试技巧,但这些只是我用过的方法。

显然,它们并不是每次都管用,因为在我最终得到这份工作之前,我至少经历了 4 次不成功的面试。然而,我觉得我从最初的面试中得到了很多重要的知识。这些知识最终帮助我找到了作为数据科学家的第一份工作。

除了数据,我的另一个爱好是绘画。你可以在 www.katemarielewis.com 找到我的野生动物艺术

如果您想了解更多关于我如何或为什么接受再培训成为数据科学家的信息,您可能会喜欢我的一些其他故事:

[## 我如何在 6 个月内从零编码技能成为数据科学家

我用来自学数据科学的 4 个工具没有花一美元

towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3) [## 愤怒退出癌症研究

为什么我从神经科学家变成了数据科学家

towardsdatascience.com](/rage-quitting-cancer-research-5e79cb04801)

面试官最喜欢的问题-你会如何“扩展你的 ML 模型?”

原文:https://towardsdatascience.com/interviewers-favorite-question-how-would-you-scale-your-ml-model-56e4fa40071b?source=collection_archive---------24-----------------------

您正在构建一个生产就绪的 ML 模型吗?

来源:作者在 Imgflip 上创建的图片

如果你和我一样,已经疯狂地看完了《鲨鱼池》的所有剧集,那么首先,你好,新的最好的朋友:)其次,更重要的是,你已经知道如何回答这个(棘手的)面试问题了!

凯文·奥利里向任何新企业家提出的最著名的问题之一是——你将如何扩展你的业务?比方说,你被邀请去 Shark Tank(你这只幸运的鸭子)推销你的新餐厅创意,这个问题出现了,他们想知道的是——你有什么计划让这个创意成为功能创意?所以你应该这样解释:

  • 当我的餐馆越来越受欢迎时会发生什么?
  • 我如何跟上厨房基础设施的发展?
  • 我应该找一个杂货批发供应商,还是坚持现在的零售方式?
  • 空间呢?我应该继续租赁还是购买房产?
  • 我应该招聘更多员工吗?我有预算吗?
  • 您需要升级到重型机械来满足批量订单吗?

当凯文向你抛出这个问题时,你应该思考这些问题。

为什么面试官都爱问这个问题?

使用一个类似于鲨鱼池的类比,当面试官问你关于 ML 模型的缩放计划时,他们想知道的是:

当你的 ML 模型大规模投入生产时,你有多擅长认真考虑它?

请注意,从技术公司的角度来看,这非常重要!这是因为在 Jupyter 笔记本上为预测模型编写 Python 代码是一回事,但将它们部署到日常实际应用中则完全是另一回事。让我们看看如何...

作为一名数据科学家,我该如何回答这个问题?

有几个方面是可以关注的。这些在某种程度上与模型建立过程中涉及的三个主要阶段有关,即训练数据的收集、拟合模型和进行预测。

缩放 w.r.t .培训数据

正如一句著名的谚语所说:你的模型的好坏取决于它被训练的基础数据的好坏,通常都是这样。因此,当潜在的数据假设发生变化时,重新训练你的模型是绝对必要的。例如,根据 80 年代的数据训练的招聘模式不会有很多女性担任高级管理职位,因此,这种模式在 21 世纪已经过时(往好里说),而且会对推荐女性担任高级职位产生偏见(往坏里说)。

扩展 w.r.t .数据洪流

不可避免的是,随着业务的增长,您将拥有比开始时多得多的数据。有了这么多数据,您可能需要考虑 并行计算批处理 (比如使用 SGD 优化)和 并行处理,如交叉验证和超参数调整,以便显著提升性能并有效利用您的计算资源。简而言之,寻找算法的分布式版本!

在重新训练 序列化/酸洗模型使用检查点也是谨慎的。这将为您节省大量重新训练模型的时间(最初构建时有 100 万行),因为您不必仅仅因为收到了额外的 10k 行就从头开始重新构建它。系统能从你上次离开的地方赶上来。

趣闻: H2o 支持检查点创建 针对 GBM、DRF、XGBoost、深度学习等多个模型。

缩放 w.r.t 框架

当谈到为您的 ML 和深度学习解决方案选择框架时,有几个选项(例如 SkLearn、Pytorch、Keras、Tensorflow、H2o、Theano ),重要的是,您要做出一个从长远来看对您有益的选择。选择可以基于几个因素。

例如,你想要的抽象层次是什么?您希望编写更少的代码行(用于训练、优化和评估)吗?或者您是否愿意编写带有 CUDA 扩展的 C 代码,以便对编码实现有更多的控制?您也可以根据社区支持的好坏、允许第三方集成的难易程度以及是否支持分布式 ML** (即是否允许计算并行化)来比较这些框架。**

归根结底,这是个人的选择,归结为你要创造的解决方案的新颖性。

有趣的事实:尽管 scikit-learn 中的算法非常流行且易于实现,但它们并不是分布式的,但是您仍然可以使用 Spark 和 databrick**来利用 分布式计算来完成某些 ML 任务。

当我们谈到分布式 ML 的主题时,我们必须仔细考虑为我们的 ML 需求选择正确的处理器(CPU、GPU、TPU)。如果您正在处理深度学习,这一点尤其重要,因为它涉及一些重型矩阵乘法。

缩放瓦特功能

随着时间的推移,新的预测因素浮出水面,这是合理的,这些预测因素以前被忽视或认为不重要。(例如,最近人们发现血型可以作为你对冠状病毒免疫水平的有用指标)。当这种情况发生时,确保这些特性的添加不会导致模型过度拟合,并且您也能够见证验证集的改进。

甚至更好的是,实现正则化技术(例如,对回归模型使用 Lasso 或 Ridge,对神经网络使用 Dropouts 和 Batch Normalization)来额外确保你的系数不会取极值,并且模型不会太复杂。

在这一点上,我也会停下来想一想,这 0.0001%的精度提升(来自这些新特性的添加)是否是我所关心的事情。这是因为在某个阶段之后,准确性并不是唯一重要的事情,知道何时停止训练你的模型也很重要。精确度的提高必须证明增加的维护和培训成本是合理的。

缩放实际预测值

随着您的模型变得(或预计会变得)越来越受欢迎,即预测请求的数量不断涌入,是时候考虑您的模型是否能够足够快地生成预测了。也就是说,当心像 SVM、KNN 或 NN(神经网络)这样的缓慢模型,尤其是没有 GPU 支持的模型

最后,你如何在现实世界中部署你的模型,让每个人都可以使用它,这也取决于几个因素,如批量预测与实时预测,模型的可移植性,有时还有隐私——我相信一个在国防安全领域工作的数据科学家不会对在 Kaggle 上分享他的恐怖分子检测代码(以及权重矩阵)感到太兴奋。

因此,您可以选择将您的模型集成为现有软件的一部分,创建用于部署模型的容器,或者使用像 Kubernets 这样的编排工具来帮助管理容器和集群。

趣闻:查看 牛逼文章学习两种独特的模型部署方式。

结论

总而言之,重点关注:

  • 扩展到新数据、新功能
  • 序列化和创建检查点
  • 选择合适的框架和处理器
  • 并行计算—分布式 ML
  • 使用后端 API 进行部署,或者在网络上以硬件加速模型的形式发布

下次当你被问及与模型缩放相关的问题时,我希望你能与面试官讨论一些有趣的问题。这还不是一个详尽的列表,可能还有其他与可伸缩性相关的要点。一如既往,我很好奇你是否能想到其中的一些。

直到下次:)

这是我最近开始的 面试问题 系列的第一部分。在 第二部分 中,我们将讨论如何有条理地向面试官解释你的 ML 项目。敬请期待...

[## 在数据科学面试中解释你的 ML 项目的逐步指南。

在结尾有一个额外的样本脚本,让你谨慎地展示你的技术技能!

medium.com](https://medium.com/@vishi2020/step-by-step-guide-to-explaining-your-ml-project-during-a-data-science-interview-81dfaaa408bf)

数据科学实习面试。如何准备。

原文:https://towardsdatascience.com/interviewing-for-data-science-internship-how-to-prepare-f6b9c2c7fa97?source=collection_archive---------40-----------------------

第一步:做好基础工作

UnsplashKeagan Henman 拍摄的照片

不幸的是,这一次,你的申请没有成功,我们已经任命了一名申请人…

听起来很熟悉,对吧?在我花了这么多时间准备面试后,拒绝接踵而至。虽然我通过了最初的几个面试阶段,但在面对面的阶段,我并不顺利。“我是多么失败啊”,我想。

我开始寻找改进的方法。我已经确定了一些通常被忽视但可能对面试结果产生巨大影响的领域。这反过来又帮助我提高并得到了一份我想要的工作!

掌握基本知识

照片由粘土堤Unsplash 上拍摄

DS 实习通常竞争激烈,招聘人员的任何危险信号都可能决定你是否会被直接拒绝。其中一个危险信号是你的基础是否足够好。数据科学是一个需要你有很好的数学和编程知识的领域。

怎么才能提高?对于数据科学理论,我建议对最常见的算法有很好的数学理解。我平时推荐的书有两本: 模式识别与机器学习 和机器学习 第一课 。它们都包含对机器学习算法的深入数学解释,这些解释将帮助您将 DS 面试问题粉碎!

根据公司的不同,你可能还会被问到编程方面的问题。它们通常没有那么难,但是考虑到压力和时间限制,你真的需要掌握它们。你应该预料到从排序、递归到数据结构的所有问题。尽早开始练习这些题是有好处的。为了更好地理解如何处理编码问题,我推荐阅读《破解编码面试 的书 。要获得更多实践经验,请访问 黑客排行榜 ,或 LeetCode

玻璃门是你最好的朋友

你也可以从 Glassdoor 的评论中感受到这家公司的文化和氛围。这可以给你一个很好的提示,说明这家公司是否适合你。举例来说,如果一家公司的氛围看起来真的很糟糕,那么撤回申请,花更多时间准备其他公司的面试可能会更好?去那些你并不真正想去的公司面试有什么意义呢?

你也可以找到一些关于面试结构或者他们问的问题类型的有用信息。有些公司每次都在问相同的系列问题!我不知道他们为什么这样做,但是在这种情况下,你应该注意到这些问题在 Glassdoor 评论中被重复了。你可以利用这一点,把它们背下来。

简单的面试问题并不容易

Jules Bss 在 Unsplash 上拍摄的照片

想象一种情况,当面试官问:线性回归是什么?

你可以回答:

它是一种线性方法,对因变量和自变量之间的数据关系进行建模。

或者:

它是一种线性方法,对因变量和自变量之间的数据关系进行建模。该模型的参数可以使用普通的最小二乘法导出,并且通用方程适用于多维数据。这是一种简单、快速且可解释的算法。但是,它有某些警告,例如…

你明白我的意思吗?通过问一个看起来简单的问题,面试官可以测试两件事。首先,如果你有一个基本的知识(显而易见)。其次,它测试你的理解深度和你在研究某个话题时的好奇心。这种能力在数据科学家的技能组合中至关重要,因为您将经常需要使用新工具和阅读研究论文。如果你没有彻底分析这个主题,没有理解它的局限性和能力,这是一条通向失败项目的直路。

展示项目。质量还是数量?

TLDR;质量!

好的高质量的展示项目能给你的面试官留下深刻印象。【来源】

令人痛苦的事实是,没有人关心你为 100 多个迷你项目创建的无尽的 Jupyter 笔记本。不要误解我的意思:这仍然是试验新模型和数据的好方法。但是,最有可能的是,它不会给面试官留下深刻印象。

数据科学不仅仅是在一个文件中创建几十个未经测试的机器学习模型。在现实场景中,代码需要使用内部服务器或云服务进行测试、打包、记录和部署。

我的建议?追求质量并致力于创造 3 个更大的项目,给面试官留下深刻印象。这里有一些你可以遵循的建议:

  • 找到一个需要大量预处理和 EDA 的真实数据集
  • 使您的代码模块化:为模型、数据预处理和端到端管道创建单独的类
  • 在开发打包代码时,使用测试驱动开发(TDD)
  • 使用 Git 和持续集成服务,如 CircleCI
  • 向用户公开模型的 API,例如 Python 的 Flask
  • 使用 Sphinx 记录代码,并遵循代码样式指南(例如 PEP-8 用于 Python)

Udemy 的 Babylon HealthTrain In Data 的数据科学家创建了一个非常好的 ML 模型部署课程。你可以在这里找到它。

奖励:简历模板

我非常喜欢数据科学实习的单页简历。它帮助我保持简单明了,没有多余的信息。我以前有一个 Word 模板,但是我花了很多时间去修改它。当我删除或添加一些信息的时候,格式立刻被吹走了,让我的简历看起来像一个谜😆

无论如何,我找到了一个好看的背页简历模板,我一直在用。它简单、清晰,最重要的是,它是用模块化的 Latex 代码呈现的,这使得格式化成为一项轻松的任务。简历模板的链接在这里

关于我

我是阿姆斯特丹大学的人工智能硕士学生。在我的业余时间,你可以发现我摆弄数据或者调试我的深度学习模型(我发誓这很有效!).我也喜欢徒步旅行:)

如果你想了解我的最新文章和其他有用的内容,以下是我的社交媒体资料:

OpenAI 采访 1.5 亿 GPT-2 模型

原文:https://towardsdatascience.com/interviewing-the-1-5b-gpt-2-model-by-openai-b7f30fbbb8a6?source=collection_archive---------20-----------------------

GPT 新协议对数据科学有什么看法?

https://medium . com/synced review/open ai-releases-1-50 亿-parameter-GPT-2-model-c 34 e 97 da 56 c 0

人类书写的内容

使用 1558MB 版本的 OpenAI 的 GPT-2 模型(最大版本)和 Max Woolf 在 github 上的 gpt2-simple package ,由 Google colaboratory 提供支持,我生成了以下文本,其中包含数据科学方面的提示。这个项目的 github repo 位于这里。所有用粗体表示的文字都是人类书写的。向下滚动,查看关于这项技术含义的元分析,以及更多关于我如何创建这项技术的内容。

GPT 新协议生成的内容

数据科学是一套对大型数据集进行复杂多维分析的技术。数据科学是一个广阔的领域,包括从数学和统计学到计算机科学和机器学习的各种学科。

在不久的将来,人工智能将会变得非常强大,它将能够在几乎任何任务上超越人类,这将对社会产生深远的影响。但是影响不会好。这将意味着人类对自己生活的控制越来越少。

机器学习是训练计算机理解和预测数据的过程。流行的 Python 编程语言的最新版本现在包括一个可用于训练神经网络的库。该技术可用于训练神经网络,根据输入数据预测一个人的性别。

学习如何编码是学习写软件的一个很好的方法。然而,有很多人不会编码,或者不擅长编码。我认为人们不学习如何编码的最大原因是他们认为他们不会。我听到很多人说,他们不认为他们可以学习编码,因为他们没有计算机科学学位。这只是一个巨大的误解。

神经网络能够从它们的经验中学习,并从中归纳,以改进它们之前的行为。然而,神经网络的问题是,它们不太适合需要持续学习的任务。问题是,神经网络无法从它们的经验中学习,并从中归纳以改进它们以前的行为。这是因为神经网络不能够记住过去。

谷歌的安卓软件,驱动着全球超过三分之一的智能手机,也是这个星球上最受欢迎的操作系统,在全球拥有超过 7 亿用户。该报告发现,全球大多数 Android 用户都是通过智能手机访问该软件的,其中 80%的用户是通过智能手机访问该软件的。在欧洲,Android 是最受欢迎的操作系统,超过三分之一的欧洲智能手机用户通过智能手机访问该软件。

OpenAI 最初的目标是开发一种通用的人工智能,可以解决自动驾驶汽车、机器人和医疗保健领域的问题。该公司的目标已经演变成一个更普遍的目标:让人们更容易构建人工智能系统。

谷歌旗下 DeepMind 人工智能项目背后的公司 OpenAI 发布了一份白皮书,概述了其对人工智能未来的愿景。这篇题为“人工智能未来的初级读本”的论文由蒙特利尔大学教授 Yann LeCun 和该公司人工智能实验室的研究员 Shane Legg 共同撰写。

深度学习 (ML)是机器学习极其重要的工具。它是算法背后的技术,允许我们识别和理解图像、视频和文本。这个世界充满了数据,这些数据以一种易于识别模式的方式进行组织。该数据可以是任意大小。最常见的例子是文本,一个句子可能是这样构成的:“我看见一条蛇”

人类书写的内容

生成文本分析和模型训练

1558MB 版本的 GPT-2 能够为各种提示生成连贯的文本。有趣的是,它能够相当准确地描述神经网络、深度学习、机器学习和数据科学。然而,这些语言模型仍然缺乏世界的内在模型。例如,它生成(ML)作为深度学习的不正确缩写;它认为 OpenAI 创立了 DeepMind,尽管也称其为“谷歌所有”;目前还没有题为“人工智能未来入门”的论文,Yann Lecun 是 NYU 大学的教授,不是蒙特利尔大学的教授。显然,GPT-2 能够学习短语之间的频繁配对,但实际上并没有一个清晰的世界关系模型。

通过人工审查来检测合成生成的文本是非常耗时的。拥抱脸,一个 NLP 研究初创公司,已经开源了一个 GPT-2 输出检测器,它在上面生成的文本上表现非常好,以超过 99%的置信度将上面生成的文本分类为“假”GPT-2 生成的文本。有趣的是,即使有人对文本进行轻微的修饰,检测器也相当不错,这表明这种检测器甚至可以检测出“编辑过的”虚假文本。这种“深度造假检测器”的开发为抵御虚假书面文献的潜在泛滥提供了一个小小的壁垒,尽管人们可以想象已经有研究人员在开发更难以检测的生成模型。

当我第一次着手这个项目时,我实际上试图首先在一个具有数据科学相关标签的中型文章数据集上微调 355MB GPT-2 模型,但事实证明,微调后的 355MB 模型实际上比未微调的 1558MB 模型表现更差(你可以在这里找到我的 github repo)。这可能是由于对更大模型的更好的语言理解以及它合成长期连贯文本的能力。不幸的是,由于 RAM 的限制,在单个 GPU 上微调 1558MB 的模型是不可行的,尽管一些有趣的未来工作可以微调大型模型的蒸馏版本,这些模型可以适合单个 GPU[ arxivmedium postgithub ]。令人惊讶的是,1558MB 版本仍然相当“了解”数据科学和机器学习,没有对特定领域的数据集进行微调。

含义

Max Woolf 的 gpt2-simple github 包允许用户旋转单个谷歌合作实验室笔记本,加载各种大小的 GPT-2 模型,在谷歌合作实验室提供的免费 GPU 上对其进行微调,并生成合成文本段落,只需几行简短的代码。这种高级软件的存在和任何用户都可以轻松使用的事实是由于深度学习中两个强大趋势的融合:轻松、廉价地访问专门的硬件和高级抽象编程范式。

谷歌联合实验室为谷歌联合实验室笔记本的任何实例提供免费的 NVIDIA T40 或 K80 GPU。谷歌这样做的财务动机是鼓励用户采用自己专有的谷歌合作笔记本,而不是开源软件 jupyter notebook。由于云计算的可扩展性(以及谷歌的雄厚财力),提供如此多硬件的低成本是可能的。因此,任何有互联网连接的人现在都可以使用基于服务器的高端 GPU,并通过谷歌联合实验室获得相当大的计算能力。这种免费提供的计算机使任何个人都能够训练和利用非常大和强大的深度学习模型。

除了廉价计算,深度学习创新的另一个核心驱动因素是引入高级编程范式和用于创建深度学习模型的包。例如, keras 是一个高级包,它是用于较低级别的神经网络实现包(如 Tensorflow 和 Pytorch)的 API。使用 keras,任何人都可以轻松地用几行代码创建简单的神经网络。这种软件降低了任何人使用这种工具的门槛,有助于加速研究和创新。类似地,gpt2-simple 通过使用标准化的 NLP 微调过程抽象掉了所有的模型训练,并为生成文本提供了良好的包装函数。

这两种趋势的融合,以及最近 NLP 架构和性能的惊人改进,现在允许任何人合成类似人类的文本。OpenAI[ 123 已经讨论了这种模型架构的含义。

人们可以很容易地想象,像 GPT-2 这样的文本生成模型有一天将能够编写关于数据科学、编程、机器学习等的全媒体文章。到那时,我们将不得不面对一些棘手的问题。比如谁有署名权?实现和运行代码的程序员?创建模型的作者是谁?微调语料库中文本的集体作者?

随着诸如 GPT-2 这样的现实文本生成模型变得越来越普遍(特别是随着高级软件实现的进展),我们将会看到越来越多的在特定领域数据集上训练的微调 NLP 模型的例子。尽管较大的、未微调的 1558MB GPT-2 版本比较小的、微调的 355MB GPT-2 版本性能更好,但人们可以想象具有更具体的文本的域,并且不同于 GPT-2 在其上训练的大型语料库,例如化学科学文摘

我的外卖

对我来说,我在寒假期间开始了这个项目,以了解更多关于被称为 NLP 年的这些令人兴奋的突破,以及熟悉 NLP 模型的软件环境,最著名的是拥抱脸的变形金刚包。我有一些在我创建的文本语料库上微调 GPT-2 的实践经验,在单个 GPU 上处理 RAM 问题,并探索知识提炼方法。如果你想自己尝试一下,可以看看我的回购或者马克斯·伍尔夫的伟大的入门博客。一如既往,负责任地使用和分享。

我最近开始了一个关于机器学习和人工智能在科学领域和工程问题中的应用的免费通讯(ml4sci)。你可以在 ml4sci.substack.com 的上找到。请随意发表建议的文章或主题,如果你真的喜欢你所看到的,请订阅!

采访中型数据科学团队

原文:https://towardsdatascience.com/interviewing-the-medium-data-science-team-3fdf13de51d9?source=collection_archive---------45-----------------------

苹果 | 谷歌 | SPOTIFY | 其他 | 剪辑

媒体数据科学团队在 TDS 播客

编者按:迈向数据科学播客的“攀登数据科学阶梯”系列由 Jeremie Harris 主持。Jeremie 帮助运营一家名为sharpes minds的数据科学导师初创公司。可以听下面的播客:

收入意外下降,管理层将数据科学团队拉到一个房间。这个团队被下达了行军命令:“你的工作,”他们被告知,“就是找出我们的采购订单到底是怎么回事。”

当然,这是一个非常开放的问题,因为收入和注册人数可能会因为任何原因而下降。价格可能已经上涨。新的用户界面可能会让潜在客户感到困惑。可能必须考虑季节性影响。问题的根源可能是,嗯,任何东西。

这通常是数据科学家们发现自己所处的位置:他们不是有一个清晰的 A/B 测试来分析,而是经常梳理用户漏斗,以确保每个阶段都按预期工作。

需要一个非常注重细节和商业头脑的团队来完成范围如此广泛的调查,但这正是 Medium 所拥有的:一群专注于产品的数据科学家,他们致力于调查异常情况,并识别隐藏在大量用户数据中的增长机会。他们很友好地和我聊天,并在本期“走向数据科学”播客中讨论了数据科学是如何传播的。

以下是我最喜欢的对话内容:

  • 数据科学家和分析师需要深入了解他们工作的业务,以及他们服务的用户。如果你深刻理解用户如何与你的产品互动,你可以分解他们的使用模式,以确定你应该跟踪的关键指标,以提高公司的底线(例如,“读者通常会通过谷歌找到他们的第一篇媒体文章,但平均来说,他们会在最终决定创建帐户之前阅读 3 篇……”)。没有深入的用户同理心,你基本上是盲目的,猜测你应该测量和改进什么来移动指针。
  • Medium 的分析团队主要使用逻辑回归模型来分析用户行为。他们更喜欢远离花哨的神经网络和堆叠集成模型,因为可解释性非常重要:他们不仅需要了解他们的模型预测用户会做什么,还要了解他们为什么做出这些预测。产品和业务改进的想法隐藏在“为什么”中。
  • 理解你的商业模式和用户需求绝对是至关重要的。如果你只在用户做 X 的时候赚钱,而你不了解你的用户在做 X 的过程中面临的障碍(例如,被注册表格弄糊涂,被高价拒之门外,没有找到足够多他们觉得有吸引力的文章),你就没有办法对业务或产品改进提出可行的建议。
  • 这样做的一个重要后果是,如果你想找一份数据科学家的工作,你需要向雇主证明,你有能力理解商业模式,并对现实世界的数据进行调查,这些调查可能会带来可操作的见解。因此,不要只是从 Kaggle 竞赛中抓取一些开源数据集或数据:收集你自己的数据,并围绕从中得出有趣的见解来构建你的项目。

关注拉奎尔( TwitterLinkedIn )、阿什克里斯汀,或者在 Twitter 这里关注我。

夹子

我们正在寻找能与我们的观众分享有价值的东西的客人。如果你碰巧知道谁是合适的人选,请在这里告诉我们:publication@towardsdatascience.com

一种使用数据分析法对 NBA 球员进行分类的新方法

原文:https://towardsdatascience.com/into-a-new-way-to-classify-nba-players-using-analytics-44e292526e47?source=collection_archive---------42-----------------------

因为 5 个传统职位已经不够了

来源:https://unsplash.com/photos/UegcSdRtmlg

大约 5 个月前,我在网上偶然发现了这篇的文章。总结:传统的 5 个位置已经不足以描述 NBA 球员了。游戏毕竟变了。作者提出了一种方法,根据玩家玩游戏的方式将他们分为 9 类。

在这篇文章中,我将根据球员在球场上的表现,对他们进行分类。但是,我将使用数据科学,更准确地说是 K-Means 聚类来做这件事。

我还将深入探讨是什么造就了一支胜利的球队,也就是说,什么类型的球员应该被组合在一起才能成为一支成功的球队。

我们开始吧!

准备数据

我从直接从 NBA.com 获取数据开始。总之,我收集了 2019-2020 年联盟中所有 529 名球员的 28 项统计数据。

以及传统的统计数据(场均得分、助攻、篮板等。),我还收集了描述投篮位置,进攻类型(驱动,iso 等)的统计数据。)防守效率和使用率。

然后,我决定淘汰每场比赛上场时间少于 12 分钟的球员,因为我觉得根据他们几乎不上场时的表现来对球员进行分类不会提供准确的结果。

**#Remove players with at less than 12min per game** df=df[df.MINUTES > 12]
df = df.reset_index(drop=True)

我们总共有 412 名玩家。

特征创建

我决定创造 3 个新的变量,描述一个球员的投篮命中率来自于球场的哪个位置(内线、中距离或三分线)。

**#Get total FG attempts** shot_attempts=df.filter(regex='FGA').sum(axis=1)**#Get new variables** df['CLOSE']=df['PAINT_FGA']/shot_attempts
df['MID_RANGE']=df['MR_FGA']/shot_attempts
df['PERIMETER']=shots_perimeter/shot_attempts

这里是最终使用的数据帧的快照,总共包含 31 列和 412 行。

df.head()

玩家聚类

让我们从缩放数据开始。缩放意味着在不改变分布的情况下改变值的范围。这很有用,因为当要素处于相同比例时,机器学习算法会工作得更好。

以下是如何缩放数据。

data = df.iloc[:,5:34]
scaled_data = StandardScaler().fit_transform(data)

然后,是时候找出最佳的聚类数了。为了做到这一点,我将使用轮廓得分,这是可用的使用scikit-learn

轮廓分数是一种度量聚类质量的指标。它的范围在 1 到-1 之间,分数为 1 意味着集群彼此相距很远,并且明显不同(这正是我们想要的)。

简而言之,我们想要最高的侧影分数。

以下循环计算 6 到 12 之间每个 k 的轮廓分数。我在 6 点开始循环,因为在 5 点,它基本上按位置分类球员。

**#Find best number of clusters** sil = []
kmax = 12
my_range=range(5,kmax+1)for i in my_range:
    kmeans = KMeans(n_clusters = i).fit(scaled_data)
    labels = kmeans.labels_
    sil.append(silhouette_score(scaled_data, labels, metric =  
    'correlation'))

这是分数图。

**#Plot it** plt.plot(my_range, sil, 'bx-')
plt.xlabel('k')
plt.ylabel('Silhouette Score')
plt.title('Silhouette Score by K')
plt.show()

作者图片

我们看到,我们应该使用总共 7 个集群来根据 NBA 球员打球的方式对他们进行分类。

让我们看看那些集群。

看到这里,我想到了下面的集群名称。

  • 拉伸选手。优秀的球员,主要是为了拓展球场。高效的三分射手。像丹尼·格伦、豪斯、雷迪克这样的球员。
  • 高使用率 bigs 。大个子球员,伟大的篮板手,从低位得分。像武切维奇,约基奇,恩比德这样的球员。
  • 使用率低的 Bigs 。通常大中心通常不会开始。没有真正参与进攻。像祖巴克,比永博,麦基这样的球员。
  • 球优势得分手。投篮次数多的球员可以从任何地方得分。优秀的组织者和控球者。主要明星。像哈登、米切尔、勒布朗(又名山羊)这样的球员。
  • 全能轮换球员。高效但使用率低的播放器,通常较小。像卡鲁索,德拉维多瓦,康诺顿这样的球员。
  • 优质投稿人。优秀的球员,二级控球手。典型的三分射手,全能球员。像托拜厄斯·哈里斯,米德尔顿,布莱索这样的人。
  • 竞技前锋。喜欢突破或者低位进攻的球员,不是优秀的射手。像阿隆·戈登、德里克·琼斯、贾巴里·帕克这样的球员。

那么好的团队是由什么组成的呢?

记住所有这些,看看今年好的队伍是如何组成的会很有趣。

对于这个练习,我认为好的球队是今年季后赛的最后 8 支球队。下面的代码使用 Plotly 将团队分开并创建一个雷达图。

作者图片

这张雷达图显示了一些有趣的事情。首先,我们看到糟糕的球队在“运动前锋”群体中有更多的球员(每队 3.1 比 1.9)。这种类型的球员似乎不能帮助创造一个竞争者。

好的球队也倾向于有更多的 strech 球员(每队 3 对 2.1)。这并不奇怪。拥有属于“球优势得分手”群体的球员是等式的一部分(这显然非常重要)。在他们周围安排优秀的射手来扩展防守也是至关重要的。

结论

在 NBA 赢的方法不止一种。然而,在你的明星球员周围放置合适的棋子是至关重要的一部分。希望这篇文章能让你对此有所了解。

非常感谢你的阅读!

有趣的智商测试来测量人工智能的智力

原文:https://towardsdatascience.com/intriguing-iq-tests-to-measure-the-intelligence-of-your-ai-75b861a118ca?source=collection_archive---------55-----------------------

衡量人类理解任何智力任务的能力。

图片由 2081671 来自 Pixabay

人工智能的长期目标之一是开发抽象推理能力等同于或优于人类的机器。虽然在神经网络的推理和学习方面也取得了实质性的进展,但这些模型在多大程度上表现出类似于一般抽象推理的能力仍是许多争论的主题。

神经网络完善了识别图像中的猫并将其从一种语言翻译成另一种语言的技术。那是智力还是他们只是擅长记忆?我们如何衡量神经网络的智能?

一些研究人员一直在开发评估神经网络智能的方法。它没有使用均方误差或熵损失。但是他们给神经网络一个智商测试,高中数学问题,和理解问题。

模式匹配

一个人的抽象推理能力可以通过心理学家约翰·瑞文在 1936 年开发的视觉智商测试来评估:T4 瑞文渐进矩阵(RPMs)。RPMs 背后的前提很简单:人们必须对感知上明显的视觉特征(如形状位置或线条颜色)之间的关系进行推理,并选择一幅图像来完成矩阵。

瑞文渐进矩阵测试中的智商测试项目。给定八种模式,受试者必须识别缺失的第九种模式。【来源:维基百科

由于人工智能的目标之一是开发与人类具有类似抽象推理能力的机器,Deepmind 的研究人员提出了一种针对人工智能的智商测试,旨在探索他们的抽象视觉推理能力。为了在这个挑战中取得成功,模型必须能够很好地概括每个问题。

2 个关于 1)等差数列和 2)异或关系的瑞文式渐进矩阵问题。“A”是两者的正确选择。【来源论文

在这项研究中,他们比较了几种标准深度神经网络的性能,并提出了两种模型,其中包括专门为抽象推理设计的模块:

  • 标准 CNN-MLP:(带批量归一化和 ReLU 的四层卷积神经网络)
  • ResNet-50:如何等(2016) 所述
  • LSTM: 4 层 CNN 其次是 LSTM
  • 野生关系网络(WReN):使用为关系推理设计的关系网络来选择和评估答案
  • wild-ResNet:ResNet 的变体,旨在为每个答案提供分数
  • 上下文无关 ResNet: ResNet-50 模型,具有八个多项选择面板作为输入,不考虑上下文

智商测试题挑战性不够;因此,他们添加了各种形状、不同粗细的线条和颜色,以分散注意力。

各种形状、线条粗细和颜色增加了令人分心的东西。【来源论文

表现最好的型号是鹪鹩型号!这是因为关系网络模块是为推理对象之间的关系而专门设计的。排除干扰后,鹪鹩模型的表现明显更好,为 78.3%,而有干扰时为 62.6%。

左:所有型号的性能。右图:WReN 模型在不同泛化机制下的泛化性能。【来源论文

数学推理

数学推理是人类智能的核心能力之一。数学提出了一些独特的挑战,因为人类主要不是基于经验理解和解决数学问题。数学推理也基于推断、学习和遵循符号操作规则的能力。

研究人员 Deepmind 发布了一个由 200 万道数学问题组成的数据集。这些问题是为测量数学推理的神经网络设计的。每个问题的长度不超过 160 个字符,回答不超过 30 个字符。这些主题包括:

  • 代数(线性方程、多项式根、序列)
  • 算术(成对运算和混合表达式,surds)
  • 微积分(微分)
  • 比较(最接近的数字、成对比较、排序)
  • 测量(转换,使用时间)
  • 数字(基数转换、余数、公约数和倍数、素性、位值、舍入数字)
  • 多项式(加法、简化、合成、求值、扩展)
  • 概率(无替换抽样)

数据集中的示例问题。【来源论文

数据集带有两组测试:

  • 插值(正常难度):一组多样化的题型
  • 外推(疯狂模式):难度超过训练数据集时看到的难度,问题涉及更大的数字、更多的数字、更多的成分和更大的样本

在他们的研究中,他们调查了一个简单的 LSTM 模型、注意力 LSTM 和变压器。注意力 LSTM 和变压器架构用编码器解析问题,解码器将一次一个字符地产生预测的答案。

注意力 LSTM 和变压器架构用编码器解析问题,解码器将一次一个字符地产生预测的答案。【来源论文

他们还用关系内存核心取代了 LSTM,关系内存核心由多个通过注意力交互的内存插槽组成。理论上,这些内存插槽似乎对数学推理很有用,因为模型可以学习使用插槽来存储数学实体。

模型预测正确答案的准确性。【来源论文

这是他们的发现:

  • 关系内存核心对性能没有帮助。他们推断,也许学习使用插槽来操作数学实体是有挑战性的。
  • 单纯 LSTM 和注意力 LSTM 都有相似的表现。也许注意力模块没有学会从算法上分析问题。
  • Transformer 优于其他模型,因为它可能更类似于人类解决数学问题的顺序推理。

语言理解

近年来,许多自然语言处理方法都取得了显著进展,如 ELMoOpenAI GPTBERT

研究人员在 2019 年推出了通用语言理解评估(GLUE) 基准,旨在评估模型在九项英语句子理解任务中的表现,如问答、情感分析和文本蕴涵。这些问题涵盖了广泛的领域(类型)和困难。

任务的描述和统计。【来源论文

在人类表现为 1.0 的情况下,这些是每个语言模型的粘合分数。就在胶水问世的同一年,研究人员开发出了超越人类表现的方法。对于神经网络来说,胶水似乎太容易了;因此,这个基准不再适用。

粘合各种型号的基准性能。【来源论文

强力胶作为一种新的基准被引入,旨在提出一种更严格的语言理解测试。SuperGLUE 的动机和 GLUE 一样,都是为了提供一种难以用游戏来衡量的英语通用语言理解技术的进步。

强力胶任务的问题。【来源论文

研究人员评估了基于 BERT 的模型,发现它们仍然落后人类近 20 个百分点。鉴于强力胶的困难,在多任务、转移和无监督/自我监督学习技术方面的进一步进展将是必要的,以在基准上接近人类水平的性能。

让我们看看机器学习模型再次超越人类能力需要多长时间,这样就必须开发新的测试。

机器学习 AWS 简介

原文:https://towardsdatascience.com/intro-to-aws-for-machine-learning-3c73afc0214f?source=collection_archive---------76-----------------------

使用 AWS 机器学习工作台加速 Jupyter 笔记本和 Gridsearches。

机器学习工作台—网络立方体

使用 scikit-learn 和 tensor-flow 创建强大的算法并不容易,然而,适当地调整它们需要时间;几乎所有的模型都有数千种不同的参数组合。此外,改进模型的一个好的经验法则是增加用于训练的数据量-预测值或观察值。因此,即使你有最新的 MacBook Pro,你也会很快发现自己在查看参数化网格搜索,这可能需要几个小时,甚至几天。幸运的是,将所有的处理外包给俄亥俄州某处 AWS 仓库的计算机是很简单的!

开始使用 AWS

第一步是建立一个 AWS 帐户,并将您的密钥文件下载到您计算机上的一个安全位置。建立一个 AWS 账户很简单,然而,如果你遇到困难,这里有一个很好的设置视频。请记住,即使您注册了 12 个月的免费试用,您也需要提供信用卡的详细信息,因为并非所有信息都包含在试用中。

成本:在我最近的项目中,我使用了一个中等规模的实例进行了多天的处理,总费用大约为 4 美元。您可以在不使用实例时将其关闭,每小时的成本非常低。成本完全取决于您租用的实例的能力,从 2 核 2gb 内存的实例每小时约 5 美分到 96 核 768gb 内存的巨型超级计算机每小时约 30 美元不等。如果你想估算成本,只需去机器学习工作台页面的底部。

图片由 Elias Sch 提供。来自 Pixabay

打开机器学习工作台

一旦您的 AWS 帐户启动并运行,您就可以开始使用了。机器学习工作台只是一个 EC2 实例,已经配置了 Jupyter、Jupyter Notebooks、Scikit-learn、Tensorflow 和许多标准 python 包,如 pandas 和 matplotlib。为了设置好它,请按照这个机器学习工作簿链接

在那里,按照步骤继续订阅,接受条款,继续配置,然后继续启动。它为您提供了支付一年订阅费的选项,但是您现在可以忽略这一点,如果您坚持下去,它将允许您简单地按小时租用实例。一旦进入“启动该软件”屏幕,我发现通过 EC2 设置实例更简单,所以选择下面的选项。

从这里开始,您可以选择您需要的计算能力。在此阶段,您可以选择许多其他配置,但最简单的是直接单击右下角的“查看并启动”,然后再次单击“启动”。此时,它会询问您希望使用哪个密钥对来设置这个实例。为了能够从命令行远程访问 EC2 实例,这是必需的。如果您已经有一个用于 AWS 的密钥对,请使用它,否则创建一个新的密钥对。

一旦您下载了新的密钥对,它将允许您单击“启动实例”。您现在已经创建了 EC2 机器学习实例,它将开始在后台配置自己!

跟踪实例设置的最简单方法是直接单击实例 id。然而,如果您导航离开该页面,您总是可以通过返回到您的 EC2 实例屏幕来返回到该页面。如果您在启动 EC2 实例后返回到 EC2 实例,并且在那里没有看到您的实例,请仔细检查您是否在正确的区域,您可能在不同的区域设置了您的工作台。您可以在 EC2 屏幕的右上角找到所有区域。

一旦实例在实例状态中亮起绿灯,就可以打开实例了。最简单的方法是直接从浏览器。为此,在新的浏览器选项卡中,只需键入' https://IPv4 Public IP '并按 enter 键,其中 IPv4 Public IP 是下面带下划线的公共 IP 号。如果你停留在数字的右边,你可以点击图标进行复制。一旦你导航到这个 IP 地址,你可能会从你的浏览器得到一个警告,让你知道这个连接不是私人的。根据您使用的浏览器,按照高级选项忽略错误并继续您的实例。如果您很难通过,请尝试其他浏览器,因为它们可能有不同的安全设置。

一旦你完成,它应该带你到这个登录屏幕。登录密码是上面突出显示的实例 ID。你可以直接连接到虚拟桌面或直接进入 Jupyter 笔记本开始训练你的模型。第一次登录应该需要一分钟左右的时间,但是之后你就可以开始 jupyter 笔记本会话了!

常见问题—安全组

如果你没有任何问题,跳过这一点!但是,如果您正在努力连接到 IP 地址,并且它一直超时,很可能是 EC2 实例的安全组没有自动正确设置。这很容易解决,只需遵循以下步骤。

  • 回到主 EC2 实例屏幕,在那里你可以看到你的实例滚动,直到你看到列标题“安全组”。单击已分配给实例的任何安全组的链接。
  • 这将把您带到一个允许您编辑安全设置的页面。为了实现这一点,您需要编辑您的入站规则,以包括 HTTPS,并为源是 0.0.0.0/0(这意味着任何 IP 地址)。参见下面的例子。
  • 更改后,您可以返回到浏览器中的 IP 地址,它应该会停止超时。如果您遇到任何与此相关的问题,请随时评论或让我知道。

加载数据和笔记本

将数据加载到实例中最简单的方法是使用方便的 upload 按钮,如下所示。这允许您快速、轻松地将数据从笔记本电脑直接上传到远程实例。一旦你的数据和笔记本上传,打开笔记本,开始运行代码!

但是应该注意的是,如果你需要上传非常大的文件,这种上传方式会很昂贵并且很慢。或者文件可能不在你的电脑上,而是安全地存储在 S3 桶里。不用担心,也可以直接从 S3 存储桶中加载文件。如果你以前没有遇到过这种情况,S3 水桶只是一个数据和文件的存储盒,安全,易于从任何地方访问。本教程不包括设置 S3 桶,但这很容易做到,网上已经有很多这方面的指导。

如果您想直接从机器学习工作台中的 jupyter 笔记本访问 S3 存储桶,您首先需要授予对此实例的访问权限,以访问您的 S3 存储桶。最简单的方法是使用命令行从本地计算机直接登录到实例。为此,返回到 EC2 实例屏幕,选择您的实例并按下 connect。这将打开下面的屏幕。复制下面突出显示的示例(您的示例会有所不同)。将该命令复制到命令行中,确保将第三项替换为密钥文件的完整文件路径,并将单词“root”替换为“ubuntu”。按 enter 键,您应该直接登录到您的实例。如果它询问您是否要继续,请键入“是”。

如果您得到一个错误,提示您的私钥文件未受保护,请通过运行下面的命令行命令来保护该文件,然后重试
chmod 400 New_Key_Pair.pem
用您的私钥文件的完整文件路径替换命令中的最后一项。

一旦你在你的命令行应该看起来如上。从这里—要授权您的 S3 存储桶,请运行以下命令行命令:

aws configure

然后你所需要做的就是输入密钥 ID 和秘密密钥,你就可以开始工作了!这意味着您将能够直接从 S3 向您的实例中导入文件。关于如何在 AWS 上做到这一点,有更多的参考资料,但是下面是从 EC2 实例使用 S3 的一些常用命令:

列出你的 AWS 桶:
aws s3 ls

移动文件(或整个文件夹!)入斗:
aws s3 cp /Documents/data.csv s3://bucket/folder_name

您可以通过
aws s3 cp s3://bucket/file_to_copy file_to_copy反过来复制文件

如果你想给出一个完整的路径名,看起来像:
aws s3 cp s3://bucket/file_to_copy ~/folder/subfolder/.

一旦在命令行中配置完实例,只需在命令行中键入 exit,它就会关闭连接。

核心和处理

我见过的一个常见错误是,当人们为了加快处理速度而将笔记本电脑转移到 AWS 时,他们会忘记修改代码,以便在新电脑上使用。他们将笔记本电脑复制到一台更强大的 8 核计算机上,然后惊讶地发现网格搜索用了同样长的时间…

例如,sklearn 的大多数模型函数中都有一个名为 n_jobs 的参数,它允许您指定要使用多少个内核来训练模型。默认值为 None,这意味着它将只使用一个内核。如果您不更改此默认设置,迁移到具有更多内核的计算机将不会有任何影响。您可以手动将其设置为想要使用的内核数量,或者简单地输入-1,这将使用所有可用的内核。

要知道 n_jobs 可能不是唯一的限制因素。有些解算器不支持多重处理,因此会忽略您的 n_jobs 输入(例如,带有 sklearn LogisticRegression 的 Sag 解算器)。

在后台运行脚本

因此,您已经将数据放在工作台上,准备开始训练您的模型,但是如果,即使有额外的 AWS 计算能力,看起来您的 gridsearch 还需要几天时间呢?登录机器学习工作台 jupyter 笔记本的缺点是,如果你退出笔记本,它不会继续在后台运行。如果你关闭 jupyter 笔记本,它将中断这个过程,你将不得不从头开始。你有三个真正的选择。

  1. 咖啡因:第一种也是最简单的一种,要求你的电脑一直开着,所以这并不理想,但我会提到它,因为它更简单!基本上,选择一是让你的 jupyter 笔记本运行,并确保你的电脑不会进入睡眠状态。为了做到这一点,为你的电脑安装一个类似咖啡因或安非他命的应用程序,以便在实例运行时让它保持清醒。如果你需要合上笔记本电脑,情况会变得稍微复杂一些,因为 Macbooks 不允许你在电脑合上时保持清醒。有办法解决这个问题——显然,即使你关闭屏幕,一款名为 InsomniaX 的应用程序也会让你的 Macbook 继续运行。
  2. 不挂断:第二种选择更稳健。对于此选项,您将需要在命令行上登录到实例并运行脚本,让实例知道即使您从实例断开连接,您也希望脚本继续运行。为了连接到实例,请回顾上一节中的步骤(加载数据和笔记本)。一旦您登录并导入了想要运行的脚本,您可以使用下面的命令行命令在后台运行它:
    nohup python script.py &
    这将强制实例在后台运行程序,并且在您断开连接时不会“挂断”,并且会为您提供一个进程 ID。为了做到这一点,你必须将你的笔记本转换成 python。py)文件,并确保脚本运行的任何结果都被保存下来。一些有助于确保脚本正在运行的附加命令是:
    检查所有 python 正在运行的进程
    ps aux | grep python 终止特定进程
    kill -9 [insert process number]
  3. 终端多路复用器:您的第三个选择——可能也是最可靠的——是设置一个终端多路复用器。终端多路复用器允许您通过客户端窗口连接到实例或服务器。它允许您确保即使客户端断开连接,实例也将继续运行。您可以关闭计算机,只要在启动备份时重新连接到客户端,实例就会继续运行。把它想象成一个虚拟终端。因此,您仍然需要运行脚本,而不是直接使用 jupyter 笔记本。一种常用的终端多路复用器被称为 tmux,您可以在这里访问关于如何设置的简单指南

关闭实例

记得这样做!如果你忘记了,你很容易就有一大笔账单,所以在关闭你的实例之前不要去度假。这里有两种选择,停止实例和终止它。

在这两种情况下,实例将被关闭,您的虚拟机将被永久删除,您将不再因实例使用而付费。在这两种情况下,您都会丢失保存在实例的临时存储上的任何数据。停止和终止实例的主要区别在于,当您停止时,附加的可引导 EBS 卷不会被删除。这意味着该实例将仍然存在于 EC2 实例窗口中,并且您可以随时使用与以前相同的设置和设置再次启动它。但是请注意,如果您再次启动它,连接的连接路径和 IP 地址将会改变。还要注意,将 EBS 卷保持在停止状态可能会有费用(虽然费用很少,而且在免费试用期间,很多费用都是免费的),但是请记住,如果您打算让它长时间停止,那么终止实例会更好。

这就对了。将 AWS 计算能力用于机器学习任务的基础知识——这是加速任何数据科学项目的一个好方法。

BigQuery 及其免费数据集简介

原文:https://towardsdatascience.com/intro-to-bigquery-and-its-free-data-sets-3cdc5cee4dbd?source=collection_archive---------75-----------------------

快速介绍如何使用免费的公共数据集访问和查询 Google 的 BigQuery。

来自 Pixabay 的图片

查找和访问数据很难做到——尤其是免费数据。然而,谷歌的 BigQuery 有一个巨大的免费数据库,访问起来再简单不过了。访问数据库的查询是在 SQL 中进行的,但是,界面非常用户友好,您只需要基本的理解就可以开始访问数据。

公共数据集

目前,BigQuery 上有近 200 个公共数据集,并且一直在增加新的数据集。大多数数据库都保持完全更新,每天都有新的数据。例如,在过去的 3 个月里,新冠肺炎增加了 22 个新的数据集,这些数据集每天更新,以帮助提高数据的可用性和辅助研究。要细读这些数据集,只需前往谷歌市场的数据集。数据范围巨大,从诺亚极端天气数据到历史加密货币交易量和价格。数据集已经分类,以便于根据您感兴趣的数据类型进行筛选。

云控制台

一旦你决定了一个数据集,点击它,然后点击查看数据集——这将把你直接带到谷歌云控制台。请注意,您需要使用 google 帐户登录或设置一个帐户才能访问控制台。如果这是你的第一次,你将获得一年的免费试用,价值 300 美元(或等值的本国货币)的免费数据访问信用。在这里,你应该在屏幕的左上方建立一个新的项目。这允许您跟踪您的数据集和查询,允许您保存查询并查看您过去的所有作业。

点击进入新项目界面,用你喜欢的名字设置项目——你会得到一个警告,让你知道你的免费账户上还有多少项目。一旦你设置好了,你就可以开始了!

探索数据集

在控制台中,您可以更详细地浏览数据集。导航数据集的主要部分位于控制台左下角的 resources 选项卡中。这允许您浏览大量公共数据集,添加额外的公共数据集,甚至链接外部数据源。

在“添加数据”屏幕中,您可以搜索市场中的所有相同数据集,并将其添加到此资源选项卡中的固定数据集。对于任何给定的项目,将所有数据集放在一个地方都很简单。

除此之外,BigQuery 还为所有数据表提供了简洁明了的汇总屏幕。为了访问它,浏览数据库中的资源,只需选择您感兴趣的数据表,查看更多详细信息。

第一个数据屏幕是 Schema 屏幕,它提供了关于表中每个字段的字段名称和数据类型的更多信息。有些数据集甚至详细描述了字段名的含义或代表的内容。策略标签允许数据库所有者设置特定字段的权限(例如,敏感数据),然而,这并不用于大多数公共数据集中,因为它们是公共的。

第二个选项卡是 Details 选项卡,它提供了表的概要信息。即数据集的大小和长度(维基百科 2020 年页面浏览量表有 250 亿行数据!),还包括数据有多旧,以及更新的频率。此外,一些公共数据集只在一定时期内发布,您可以看到表何时到期(尽管这种情况非常罕见)。

如果前两个还不够,甚至还有一个预览选项卡,它将允许您查看前几行数据,因此您可以看到数据格式的示例。这使得描绘你的数据库,查看它是如何组合在一起的,以及决定你到底想要查询哪些信息变得非常容易!

查询数据集

一旦您准备好开始访问数据,BigQuery 还使构建查询和修改查询变得非常简单。显然,如果您是一个 SQL 奇才,您可以在查询框中开始编写查询,但即使这样,使用 BigQuery 快捷方式开始也要快得多。选择您想要查询的表,然后简单地点击右下角的查询表按钮。

这将用一个几乎完整构建的查询自动填充您的查询。您最初会看到一个语法错误,这是因为它不会自动填充要查询的字段。为了进行选择,您可以简单地从 Schema 菜单中单击字段名称,它将为您填充查询(当然,如果您想要所有字段,您可以简单地在 SELECT 之后键入一个' * '来选择所有字段)。

请注意,它们会自动在查询中填充一个限制。除非你 100%确定你在做什么,否则不要删除它。这不仅是一个好的实践,也意味着您不会因为试图在一个简单的打字错误后返回 1tb 的数据而意外地使用了所有的免费使用限制。这些数据集大部分都很庞大,因此很容易出错。一旦您准备好您的查询,您将得到一个绿色的复选标记,告诉您该查询是有效的,并且您还可以在查询屏幕的右下角得到关于搜索大小的信息,作为一个额外的完整性检查。这是一个较高的估计,大多数情况下,如果你有一个限制,实际的过程会少得多。

从这里,您可以轻松地构建多个查询,并在实际运行之前保存它们。组织查询再简单不过了。完成后,只需单击保存查询。然后,可以从左侧的菜单中再次访问保存的查询。您甚至可以计划在特定时间运行查询!

这不是一篇关于 SQL 的文章,但是包含了一些简单的附加命令,在构建查询时可能会有用:

从字段
SELECT DISTINCT field1 FROM table
中选择唯一值按某个字段分组并聚合其他字段
SELECT field1, sum(field2) FROM table GROUPBY field1
将表连接在一起(可以是左、右、内或外)
SELECT f1 FROM table INNER JOIN table2 ON table.f1 = table2.f1 用条件选择
SELECT f1 FROM table WHERE f1 = "legend" or f1 LIKE "%leg%"
对输出排序
SELECT f1 FROM table ORDER BY f1 DESC
选择日期部分并重命名字段
SELECT date_part('year', my_date) AS year FROM table

这只是皮毛,但有了它,你可以走得更远!

如果您对查询感到满意,请按“运行”按钮,查询将运行,然后用结果填充底部菜单。还要注意的是,一旦运行,查询结果就会出现在左边的查询历史菜单中,没有必要重新运行。

您可以在适当的地方看到表格格式的结果(尽管您一次最多可以看到 100 行),甚至可以直接使用 data studio 来浏览数据。如果你点击探索数据按钮,它会自动链接到一个数据工作室表,所以你可以玩可视化和 EDA。几秒钟内你就可以看到有用的数据摘要。

Google 的 DataStudio 的更好的工作方式是另外一个故事,但一般来说,它非常用户友好,可以帮助快速分析查询,以确保它们正确运行或数据有意义,这样你就可以根据需要定制你的查询。

保存或提取数据

对查询满意后,您可能希望提取数据以进行进一步的分析或建模。这里有相当多的选项,如果您单击“保存结果”按钮,它将为您提供所有选项的详细描述以及限制。

简单地说,如果你把结果保存在 google drive 上,你可以节省 1gb,但是如果你想把它保存在你的电脑上,下载限制是 16k 行。将文件保存到 google drive 意味着你可以保存更大的查询,从 google drive 可以很容易地从 google colab 访问 csv,从 jupyter 笔记本访问,你只需要设置一个 API 键。

现在,您可以免费访问数百 TB 的,非常适合您的下一个数据科学项目!

面向数据科学家的数据工程介绍

原文:https://towardsdatascience.com/intro-to-data-engineering-for-data-scientists-fa6c864a3ecc?source=collection_archive---------39-----------------------

马库斯·斯皮斯克在 Unsplash 上的照片

数据基础架构概述,这是采访中经常被问到的问题

在我过去几年为我的雇主进行面试的过程中,我发现应届数据科学毕业生通常不太了解数据工程领域。他们通常在机器学习算法的海洋中游泳,很少关注他们上游和下游的工作。然而,许多公司都非常重视与数据工程师合作的经历,因为这对于平稳高效地部署数据科学模型至关重要。理解大局很重要。它有助于你了解一家公司解决业务问题所需的所有要素,以及你和你的工作在公司中所扮演的角色。

本文将帮助您掌握数据基础设施的各种元素,并熟悉每个步骤中使用的一些常用工具和软件。

让我们开始吧。

基本概念

这里有一些你会经常听到数据工程师提到的基本术语。让我们先理清这些概念:

  • 服务器:把服务器想象成“远程计算机”,可以通过 API 从本地计算机(称为客户端)访问它们。
  • API:把它看作一个 URL 或者一个库,你可以在那里访问或者执行它,运行一个软件或者一个模型。
  • 微服务:公司正在搭建的端系统。工程师不是构建复杂的整体应用程序来满足多种业务需求,而是将软件功能隔离到多个独立的模块中,这些模块分别负责执行独立的任务。这些模块通过通用的 API 相互通信。更详细的解释,请看这个链接

单一应用程序:开发团队在同一软件的不同功能上工作

微服务:将每个功能构建为独立的应用程序,并通过 API 相互访问

  • Docker 容器可以理解为存储库和打包运行代码所需的应用程序的地方。在维护软件包版本的一致性和消除在不同的计算机和服务器上运行时重新安装软件包的麻烦方面,它非常方便。Docker 容器是使用 docker 映像构建的—如果您将 docker 容器视为一个操作系统(就像您的 windows 系统、IOS 系统或虚拟机),docker 映像就是该系统在某个时间点的快照。当您刚启动 docker 容器时,您有一个 docker 映像,并且您可以创建附加的 docker 映像来存储您的工作。当你与他人共享 docker 映像时,他们将能够像你一样运行一切。关于 docker 如何工作的更多细节,请查看这个链接

数据基础设施概述

一个数据基础设施是一个促进数据共享和消费的数字框架。简而言之,它意味着数据需要在组织中流动并被不同部门使用的元素的组合。典型的数据基础设施如下所示:

让我们一步一步地浏览这个图表:

  • 原始数据可以是结构化的,也可以是非结构化的,通常在第一次流入时存储在数据库中。常用的关系数据库包括 MySQL、Postgres、Redshift、Vertica、Snowflake 等。
  • 很多时候,原始数据还不能被数据科学算法或商业智能引擎直接使用。可能是因为太乱了,也可能是因为数据格式不理想。因此,通常需要数据预处理步骤(也称为 ETL)来标准化传入的数据。ETL 是提取、转换和加载的缩写。这三个数据库功能被组合到一个工具中,从一个数据库中提取数据,将其转换成所需的格式,然后放入另一个数据库中。有时 ETL 作业被安排在特定的时间间隔运行。其他时候,当新的原始数据通过使用类似于 Apache Kafka 的工具进入时,它们会被自动触发。

一个简单的工作流,使用 Kafka 在新数据进入时加速模型训练和部署。这个图中没有显示 ETL 过程。

  • 处理后的数据将被运行在云服务上的数据科学算法使用。由于这一步可能涉及到许多工具,我将在后面深入讨论这一部分。
  • 当在云上运行作业时,组织需要监控它们的使用情况和错误。这就是管理工具发挥作用的地方。常见的监控服务包括 Kubernetes (分组和管理 docker 容器) Datadog (管理日志、安全、用户等。)、 Grafana (管理内存、服务器请求、页面加载等等)等。

Grafana 仪表板的屏幕截图

  • 最后,算法输出被保存回数据库或网络存储器,如 AWS S3

在云上运行 DS 算法

有许多方法可以在云上部署数据科学算法。人们可以通过使用 Flask 这样的包来创建端点 API,并在 AWS Elastic Beanstalk 这样的 web 服务上托管这样的 API。或者他们可以直接在云服务上运行脚本,如 AWS Lambda、AWS EC2 实例或 AWS Sagemaker。

在 AWS Lambda 上,可以编写在特定条件下触发的函数,比如当一个新文件进入链接的 AWS S3 数据存储桶时。缺点是 AWS Lambda 函数通常是简单快捷的函数,并且在它们可以执行的操作类型方面受到限制。但是,它会自动处理缩放和大小决定,因此不需要担心调整实例和内存的数量等问题。当交通流量增加时。这也是 AWS Lambda 被称为无服务器计算的部分原因——用于运行应用程序代码的服务器基础设施环境隐藏在后台,这样你就不必考虑服务器了。

简单的 AWS Lambda 工作流

另一方面,AWS EC2 允许用户调整和缩放服务器实例。因为用户可以完全控制服务器和代码运行环境,所以用户可以部署更复杂的脚本。运行在 EC2 上的应用程序需要打包到 Docker 容器中。

AWS Sagemaker 是建立在 AWS EC2 之上的云服务。它带有预构建的容器,专为数据科学家训练和部署机器学习模型而设计。它看起来像一个 Jupyter 笔记本,但在云服务上。您还可以通过 AWS APIs 访问它,并在本地机器上编写代码。

如果您有多个脚本需要按照一定的顺序运行,那么您将需要 Apache Airflow。Airflow 是一种管理工具,可以帮助云服务按照设计在工作流(称为 DAG)中运行代码,它有一个日志系统,可以在 DAG 中断时显示故障组件。

Airflow 可用于云服务上的 ETL 过程和模型训练/部署过程。

就是这样!为了更容易理解,我简化了许多概念。希望这篇文章能帮助您对数据工程概念有一个基本的了解,从而促进将来更好的合作。有关问题和评论,让我们连线 LinkedinTwitter

Python 动态可视化简介-动画和交互式绘图

原文:https://towardsdatascience.com/intro-to-dynamic-visualization-with-python-animations-and-interactive-plots-f72a7fb69245?source=collection_archive---------3-----------------------

Python 科学绘图

用 Python 制作基本动画和交互式绘图

照片由卡蒂亚·奥斯丁Unsplash 拍摄

有时,您可能希望创建一个像视频一样随时间变化的动态图形,或者根据交互式用户输入进行调整。这些可视化做了大量的工作,真实地展示了输出如何随着输入而变化。在本文中,我将把相同的数据呈现为静态图、动画和交互式图。为了与我以前文章的物理科学主题保持一致,我绘制的数据将来自固态物理学中最广泛使用的方程之一:费米-狄拉克分布,它描述了电子在固体中的占有率。等式如下所示,它将占据能量 E 的态的分数作为费米能量和温度的函数。

费米-狄拉克分布

静态图

我们的第一个图将是一个静态图,其中将有不同温度下的 f(E) 曲线。首先,我们导入所需的包:

# Import packages
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

由于我们要多次计算费米-狄拉克分布,我们应该写一个函数来为我们做这个计算:

# Fermi-Dirac Distribution
def fermi(E: float, E_f: float, T: float) -> float:
    k_b = 8.617 * (10**-5) # eV/K
    return 1/(np.exp((E - E_f)/(k_b * T)) + 1)

现在我们可以开始绘制数据了!首先,我将编辑一些常规的绘图参数:

# General plot parameters
mpl.rcParams['font.family'] = 'Avenir'
mpl.rcParams['font.size'] = 18mpl.rcParams['axes.linewidth'] = 2
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.right'] = Falsempl.rcParams['xtick.major.size'] = 10
mpl.rcParams['xtick.major.width'] = 2
mpl.rcParams['ytick.major.size'] = 10
mpl.rcParams['ytick.major.width'] = 2

我们创建我们的图形,并向其添加轴对象:

# Create figure and add axes
fig = plt.figure(figsize=(6, 4))
ax = fig.add_subplot(111)

为了向我们的费米-狄拉克函数提供变化的温度数据,我们使用numpy.linspace生成 100 K 到 1000 K 之间的一组值:

# Temperature values
T = np.linspace(100, 1000, 10)

对于这些温度值中的每一个,我们需要将不同的颜色映射到其结果曲线上。我们将从coolwarm色图中生成颜色,因为我们实际上是在处理不断变化的温度。由于我们已经在上面生成了 10 个温度值,我们将从coolwarm色图中提取 10 种颜色。

# Get colors from coolwarm colormap
colors = plt.get_cmap('coolwarm', 10)

绘制数据的最简单方法是循环遍历所有温度值,并每次绘制相应的曲线。为了生成 x 轴值,我们再次使用numpy.linspace来创建一个由 0 到 1 之间的 100 个等距值组成的数组。此外,我们在所有计算中使用 0.5 eV 的固定费米能量值。

# Plot F-D data
for i in range(len(T)):
    x = np.linspace(0, 1, 100)
    y = fermi(x, 0.5, T[i])
    ax.plot(x, y, color=colors(i), linewidth=2.5)

我们的图需要的最后一个元素是一种区分不同颜色温度曲线的方法。为此,我们将创建一个图例,首先创建一个标签列表,然后将它们传递给axes.legend方法。

# Add legendlabels = ['100 K', '200 K', '300 K', '400 K', '500 K', '600 K', 
          '700 K', '800 K', '900 K', '1000 K']ax.legend(labels, bbox_to_anchor=(1.05, -0.1), loc='lower left', 
          frameon=False, labelspacing=0.2)

labelspacing —图例条目之间的垂直间距(默认为0.5)

最后,在添加轴标签后,我们将看到以下图形:

费米能级为 0.5 eV 时费米-狄拉克分布的温度依赖性

动画剧情

现在,假设我们想要呈现与上面相同的数据,但是作为一个视频,我们该怎么做呢?原来我们用matplotlib就可以很轻松的做到这一点!我们必须导入以下内容才能使用该功能:

# Import animation package
from matplotlib.animation import FuncAnimation

如果我们使用的是 Jupyter 笔记本,我们也应该改变matplotlib用来渲染其数字的后端,以便允许交互式绘图。

# Change matplotlib backend
%matplotlib notebook

对于我们的动画,我们需要做以下工作:

(1)将对绘制曲线的引用存储为变量

(2)使用带有该变量的函数调用来不断更新绘图数据

我们将首先绘制空数组,并将该图存储为一个名为f_d的变量。此外,我们将添加一个显示当前绘图温度的文本注释,因此我们也将存储一个对此的变量引用。我们将文本注释的右上角与 axes 对象的右上角对齐。

# Create variable reference to plot
f_d, = ax.plot([], [], linewidth=2.5)# Add text annotation and create variable reference
temp = ax.text(1, 1, '', ha='right', va='top', fontsize=24)

现在来看看我们动画的核心——动画功能。该函数将接受索引i的输入,并在每次调用时更新绘图。它还会用当前温度和(只是为了好玩!)根据coolwarm色图中的相同颜色改变绘图和文本的颜色。

# Animation function
def animate(i):
    x = np.linspace(0, 1, 100)
    y = fermi(x, 0.5, T[i])
    f_d.set_data(x, y)
    f_d.set_color(colors(i))
    temp.set_text(str(int(T[i])) + ' K')
    temp.set_color(colors(i))

set_data(x, y) —为绘图设置新的xy数据

现在,为了让奇迹发生,我们使用下面一行代码:

# Create animation
ani = FuncAnimation(fig=fig, func=animate, frames=range(len(T)), interval=500, repeat=True)

fig —传递给动画功能的图形

func —剧情的动画功能

frames —一个数组,从 0 开始,代表动画的帧。在这种情况下,我们传递一个长度等于我们正在制作动画的温度数的值(这也是传递给func的索引i)。

interval —帧之间的延迟,单位为毫秒

repeat —是否在动画结束时重复播放

费米能量值为 0.5 eV 时费米-狄拉克分布的温度依赖性的动画图

在那里!现在,如果您的轴标签或部分绘图被截断,您可以尝试添加以下代码行,以确保所有元素都在图形的视图中。

# Ensure the entire plot is visible
fig.tight_layout()

现在,为了保存我们的动画,我们使用如下:

# Save and show animation
ani.save('AnimatedPlot.gif', writer='imagemagick', fps=2)

为了生成.gif文件,我使用了 ImageMagick

fps —动画的每秒帧数(因为我们只有 10 帧,所以我使用 fps 值 2 来模拟之前 500 毫秒的间隔延迟)

互动剧情

最后,如果我们想让用户摆弄输入参数,观察它们在输出上的变化,我们可以制作一个交互式的图形。我们从导入所需的包开始。

# Import slider package
from matplotlib.widgets import Slider

我们再次开始创建一个图形和轴对象来保存我们的绘图。然而,这一次,我们调整了绘图的大小,以便为将要添加的滑块腾出空间。

# Create main axis
ax = fig.add_subplot(111)
fig.subplots_adjust(bottom=0.2, top=0.75)

figure.subplots_adjust()接受topbottomleftright的输入,指示在何处绘制轴边界框的四个角。在这种情况下,我们确保顶部不超过 0.75,这样我们就可以将滑块放在图的顶部。

滑块开始就像任何其他轴对象。在这里,我们将两者都加在图上(一个用来改变费米能,一个用来改变温度)。此外,由于我们更改了全局绘图设置,删除了右侧和顶部脊线,因此我们将它们添加回滑块。

# Create axes for sliders
ax_Ef = fig.add_axes([0.3, 0.85, 0.4, 0.05])
ax_Ef.spines['top'].set_visible(True)
ax_Ef.spines['right'].set_visible(True)ax_T = fig.add_axes([0.3, 0.92, 0.4, 0.05])
ax_T.spines['top'].set_visible(True)
ax_T.spines['right'].set_visible(True)

现在,我们必须将这些轴对象转换成滑块:

# Create sliderss_Ef = Slider(ax=ax_Ef, label='Fermi Energy ', valmin=0, valmax=1.0,
              valfmt=' %1.1f eV', facecolor='#cc7000')s_T = Slider(ax=ax_T, 'Temperature ', valmin=100, valmax=1000, 
             valinit=100, valfmt='%i K', facecolor='#cc7000')

ax —要转换为滑块的轴对象

label —位于滑块左侧的滑块标签

valmin —滑块的最小值

valmax —滑块的最大值

valfmt —显示为滑块值的字符串,位于右侧。%1.1f是一个带 1 个小数点的浮点数,%i是一个整数

facecolor —填充滑块的颜色

现在我们已经创建了滑块,让我们绘制“默认”数据集,它将显示图形首次加载的时间(费米能量为 0.5 eV,温度为 300 K):

# Plot default data
x = np.linspace(-0, 1, 100)
Ef_0 = 0.5
T_0 = 100
y = fermi(x, Ef_0, T_0)
f_d, = ax.plot(x, y, linewidth=2.5)

就像在动画情节中一样,我们现在将定义update函数,它将随着滑块的更新而改变数据。此update函数获取滑块的当前值,更改绘图中的数据,并重新绘制图形。

# Update values
def update(val):
    Ef = s_Ef.val
    T = s_T.val
    f_d.set_data(x, fermi(x, Ef, T))
    fig.canvas.draw_idle()s_Ef.on_changed(update)
s_T.on_changed(update)

当滑块值改变时,Slider.on_changed(func)调用更新func。最后,当我们展示我们的阴谋,我们得到这个很酷的互动图!

费米-狄拉克分布温度依赖性的交互图

结论

我希望这篇文章展示了如何通过动画和交互式滑块使数据可视化变得动态。感谢您的阅读——我感谢任何评论和反馈。本文中展示的所有例子都可以在这个 Github 资源库中找到。你可以在 Twitter 上关注我,或者在 LinkedIn 上联系我,获取更多文章和更新。

FastAI 简介:安装和构建我们的第一个分类器

原文:https://towardsdatascience.com/intro-to-fastai-installation-and-building-our-first-classifier-938e95fd97d3?source=collection_archive---------7-----------------------

提示:仅用 5 行代码就能在 MNIST 上达到 98%的准确率!

FastAI 是一个简化神经网络训练的库。它基于深度学习最佳实践的研究。开箱即用支持:

  • 视力
  • 文本
  • 表列数据
  • 协同过滤

让·格柏在 Unsplash 上的照片

在接下来的文章中会有更多的介绍。现在,我只想说我是而不是这个库的所有者,我只是一个用户,我不打算以任何方式、形状或形式推销这个产品。你在这里读到的一切都是基于个人经验。现在回到文章。

对每一个深度学习库的介绍都是从它处理 MNIST 数据集的能力开始的,这是一个包含手写数字的 28x28 像素照片的标准数据集。我以前在 Tensorflow 和 Keras 中训练过这个模型,虽然这几乎是一件微不足道的事情(只要你对神经网络有基本的了解),但它不可能与 FastAI 竞争,至少在实现速度方面。

以下是如何使用 ResNet18 (预训练卷积神经网络)对 MNIST 数据集样本进行训练:

path = untar_data(URLs.MNIST_SAMPLE)
data = ImageDataBunch.from_folder(path)
learn = cnn_learner(data, models.resnet18, metrics=accuracy)
learn.fit(1)

是的,那只有 4 行代码(好吧,我们没有计算一行用于导入),但是只有这样才能给你 97%的准确率。但是我想得太多了。在我们实际训练模型并做出预测之前,我们需要正确地设置这个该死的东西,所以下一节将会介绍这个过程。

安装选项

FastAI 库的所有者建议您拥有一台带 GPU 的计算机。如果你没有,这并不是世界末日,因为有很多可行的选择。

以下是您拥有的选项:

由于我的笔记本电脑上的 GPU 相当不错,我将深入讨论第一个选项。其他选项在提供的链接中有很好的介绍。

FastAI 本地安装

以下是我的机器的一些细节:

  • Windows 10 x64
  • 英伟达 GeForce GTX 1650
  • 16GB 内存

首先你需要下载 Visual Studio、 Nvidia CUDA ToolkitcuDNN 。幸运的是,我已经就此写了一篇文章:

[## 在 Windows 10 上安装 Tensorflow-GPU 2.0 的简单指南

根据你的网速,不会超过 15 分钟。

towardsdatascience.com](/an-utterly-simple-guide-on-installing-tensorflow-gpu-2-0-on-windows-10-198368dc07a1)

不要因为它说 Tensorflow 而感到困惑,你只需要设置上面提到的 3 件事,然后你就可以回到这篇文章。

好的,进展顺利吗? 我们继续吧。

开始时,你需要 PyTorch,因为 FastAI 是基于它的。因为我运行的是没有 Anaconda 的 Windows 机器,并且安装了 CUDA 版本 10.1 或更高版本,所以我必须在命令提示符下执行:

pip install torch===1.4.0 torchvision===0.5.0 -f [https://download.pytorch.org/whl/torch_stable.html](https://download.pytorch.org/whl/torch_stable.html)

然而,你的可能会不同。您可以在这里找到它,只需确保点击与您的配置相关的内容:

对我来说,下载大约需要 750MB,所以可能需要一段时间,这取决于你的网速。一旦完成,我们可以继续进行。在安装 FastAI 本身之前,唯一需要的是 Jupyter 笔记本扩展(如果你正在使用 Jupyter,确保不要跳过这些)。之后,我们可以安装 FastAI:

pip install jupyter_contrib_nbextensions
pip install fastai

太好了,我们现在已经在支持 GPU 的机器上安装了 FastAI。让我们看看如何使用它,真的很快。

示例—包含 5 行代码的 MNIST 分类器

提示—包括导入。现在,我们将探索只用 5 行代码训练一个简单的图像(数字)分类器有多容易。

首先,建议做一件让我有点焦虑的事情,那就是从一个库中导入 star (*)。基本上,这意味着我们将能够使用库提供的函数,而无需在每次调用前提供库名或前缀。这看起来是个好主意,但是一旦你的代码库变大,就很难确定这个函数是来自纯 Python,还是来自你的一些函数,或者其他什么地方。

尽管如此,这种约定是作者推荐的,所以我将在这里使用它,但是在你的项目中,想想这是否是你想要遵循的。让我们从导入开始:

如果我们没有任何图像,那么制作图像分类器就毫无意义。
幸运的是,FastAI 提供了untar_data()函数,如果 URL 不存在的话,它会将 URL 下载到目的地。现在,只需要第一个参数,因为我们可以将数据集下载到默认位置。

对于 URL,我们也可以从 FastAI 的URLs中受益——它有指向数据集的 web 位置的预定义变量。为了让这种简单的第一次动手体验变得更快,我们可以使用MNIST_SAMPLE数据集,它只包含数字 3 和 7 的图像。

这可能看起来像一个小数据集,但本文只是为了证明一点。数据集的路径将被存储到一个名为path的变量中,这样我们就可以看到数据集存储在哪里:

现在,当这些完成后,我们需要加载下载的数据。我们可以在一个ImageDataBunch类的帮助下做到这一点,并调用一个方法from_folder,顾名思义,该方法将从指定的文件夹中加载图像。

path变量可以作为参数传入,以指示图像存储的位置:

终于到了训练我们模特的时候了!

FastAI 再次让这个过程变得非常简单,因为它只基于一个函数调用。我们将使用期望三个参数的函数cnn_learner():

  • data —您的图像
  • base_arch —基础模型架构,这里我们将使用 ResNet18
  • metrics —您想要用来评估模型的指标(为了简单起见,我在这里使用精确度)

代码实现:

现在我们准备好训练了!函数拟合将为我们的模型训练所需数量的时期,我将该参数设置为 3 :

仅经过三个时期,模型就达到了令人印象深刻的 98.8%的准确率。现在让我们探索一下输入图像看起来是什么样子,以及模型在哪里做了错误的分类。

模型评估

函数show_batch()可用于显示模型中的数据。代码实现非常简单,无需进一步解释:

这里我还想介绍另外两件事,第一件是如何绘制混乱矩阵。为此,我们需要从 CNN 学习者那里创建一个ClassificationInterpretation对象。

代码显示如下:

从这里我们可以使用plot_confusion_matrix()函数来可视化模型错误分类的内容:

从对角线上可以看出,大多数分类是正确的。我们对一些图片进行了错误的分类,但是这没什么大不了的,对于 5 行代码来说仍然令人印象深刻。

FastAI 可以做的另一件方便的事情是向您实际显示模型错误分类的图像。我们可以通过使用plot_top_loses()功能来实现。

我决定展示前 12 个错误分类:

第一个值表示模型预测的值,第二个值表示实际值。

对于一些例子,我们不能真的责怪模型,因为图像是如此相似。

在你走之前

最后,这篇文章比我希望的要长一些,但我想做一个实际的演示,而不仅仅是谈论理论。

如果你对 FastAI 库感兴趣,请继续关注的数据科学和我的个人资料,因为还会有更多类似的文章。

感谢阅读。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

Google Colab 数据分析简介

原文:https://towardsdatascience.com/intro-to-google-colab-for-data-analytics-da5e3a37af8a?source=collection_archive---------34-----------------------

我对有抱负的数据科学家的建议

面向数据科学家的终极云交互式笔记本电脑

来源( Unsplash )

我的笔记本电脑中安装了太多 Python!我很困惑。

设置 Tensorflow 太费时间了!

发送 Jupyter 笔记本版本是浪费时间!

您是否曾经希望有一个现成的启动环境,可以直接启动您的分析,而无需安装库和依赖项?

在本教程中,我想与你分享我日常工作中经常使用的神奇产品——Google Colab。

Google Colab (Colaboratory)是一个数据分析工具,它将代码、输出和描述性文本合并到一个文档中— 来源

本质上,您可以获得 TPU 和 GPU 处理,它们已经针对云中的数据分析管道进行了优化。

这使得你可以使用流行的库,如 Theano,Tensorflow 和 Keras,直接运行深度学习。类似地,您可以生成图形并共享分析输出,就像文档和工作表一样。

感兴趣吗?我们开始吧!!

Google Colab 是什么?

Google Colab 是 Jupyter 笔记本+云+ Google Drive

Colaboratory 是一个数据分析工具,它将代码、输出和描述性文本合并到一个文档中(交互式笔记本)。

Colab 提供 GPU,完全免费。通过使用 Google Colab,您可以:

  • 在标准化环境中快速构建您的分析产品。
  • 促进流行的 DL 库,如 PyTorch 和 TensorFlow
  • 在您的 Google Drive 中共享代码和结果
  • 保存副本并创建知识共享的游乐场模式
  • Colab 可以在云上运行,也可以在带有 Jupyter 的本地服务器上运行

colab 的免费版本没有保证和限制;使用限制经常波动,这是 Colab 免费提供这些资源所必需的。

好消息是,你可以订阅 Colab Pro 或者用谷歌云产品运行专用服务器。这两个选项都很简单,部署只需 20 分钟。

如果您想跟随下面的教程,请随意使用这个 Colab 文件。运行它,了解 Colab 如何简化您作为数据分析师/科学家的工作。

[## Colab 简介

合作笔记本

drive.google.com](https://drive.google.com/file/d/1rNTb53vFFlZnMRunCfShrc8_6Vg14ttb/view?usp=sharing)

准备好使用 Google Colab

有了 Colab,你可以在 Google Drive 中编写一个可共享的 Python 交互式笔记本。在本教程中,我们将进行 6 个简单的实践来使用 Google Colab。

打开 Google Colab

查找 Google Colab

  1. 打开你的 google drive
  2. 右键单击并打开 Google Colab
  3. 重命名您的笔记本
  4. 搞定了。好好享受你的笔记本。

安装库

令人欣慰的是,Colab 已经在每个运行时提供了大量的 python 库。

有时,您可能会遇到对附加库的需求。在这种情况下,您应该使用 Colab 中的 pip 或 apt 包管理器 bash 命令下载它们。

您需要做的就是用!启动 bash 命令,这告诉 Colab 这个笔记本单元不是 python 代码,而是命令行脚本。

要运行 bash 命令,应该在代码行之前添加!。例如!pip freeze!pip install <DL Library>

Google 协作运行时的免费版本不是持久的,因为它会为每个终止的会话跳转。这意味着每次连接到 Colab 笔记本电脑时,您都需要重新安装库。

要获得已经可用的库,你可以使用!pip freeze

注意,包括 Keras、Tensorflow、Theano 在内的顶级深度学习库已经存在,随时可以使用。

所有这些都不需要一次又一次地安装一个库。

运行代码和可视化

像往常一样在 python 笔记本中运行它们。导入库并立即使用它。您不需要添加%matplotlib inline 来显示 Colab 中的可视化。

这些已经在 Colab 运行时中进行了配置。

Colab 运行时的可视化

快捷指令

快捷键类似于 Jupyter Notebook,只是在 Jupyter Notebook 的快捷键前加了一个前缀CTRL/CMD + M

查看快捷列表 CTRL/Command + M + H

创建和运行新单元

  • CTRL/CMD M + A →在选择上方创建单元格
  • CTRL/CMD M + B →在所选内容下方创建单元格
  • CTLR/CMD M +M →切换到降价模式
  • CTRL/CMD M + Y →切换到代码编辑模式。
  • CTRL/CMD M + D→删除单元格

运行电池也有类似的快捷方式

  • SHIFT + ENTER →运行并移动到下面的单元格/如果不存在则添加
  • ALT+ ENTER →运行并在下面添加单元格
  • CTRL + ENTER →运行并停留在选定的单元格处

魔法

ColabIPython 都有“魔力”,可以让你把 Python 和其他语言(比如 shell 或者 Dremel SQL)混合使用。

这些是我经常用来提高效率的一些魔术。

一个重要的警告:单元格魔术(以%%开头的魔术)必须是单元格中第非注释行。这意味着你不能在单个细胞中导入和使用细胞魔法。

% %外壳

Shell magic 有助于查看当前的服务器环境规格。为了改进当前的服务器规格,您需要启动 Google 云平台(GCP)虚拟机(VM)并将连接重定向到 Colab 运行时(端口转发)。

%%HTML

在 Colab 中构建 HTML 命令可以方便地运行 Python 库中没有的可视化。它还允许我们很好地适应 HTML 和 CSS 中的 web 平台。在这种情况下,我们使用 SVG 来绘制可伸缩的矢量图。

% %时间

我们总是需要从小样本开始探索。

在将它扩展到我们的生产量之前,测量算法运行的时间是有意义的。我们需要进行优化,然后对其进行扩展,以便对大型生产数据集进行更快的分析。

而且还有更有

构建交互式表单

交互式表单为您的客户增强了演示/用户可视化。您应该使用表单为您的客户提供与数据交互的方法。

为此,您需要从以下语法开始

----Form starter---
#@title <title of the form> {<attribute>}
----Form Item ---
variable = <value> #@param {<attribute>} 

form starter 将在 Google Colab 中呈现交互表单。

form items 是直观的。只需在属性中添加#@param,就可以控制交互。Google Colab 会将值注入到变量中,然后在每次更改值时运行单元格。

多功能且易于构建的交互式表单

存储/下载/插入到 Github

在 Colab 之外,您可以进行 3 种导出:

  1. 下载到。ipynb,。py,甚至。超文本标记语言
  2. 存储在 Google Drive 中并提取共享链接
  3. 直接把它连接到你的 Github 库:这是一个开发你的作品集的简单方法。它将笔记本上传到你的 Github 库。

非常方便地开发您的数据科学家组合

Github 链接已创建

最后的想法

来源: Unsplash

我相信这些代码很容易在您的第一次 Colab 探索中直接实现。

一如既往,如有任何问题,请通过 Linkedin 联系我。如果时间允许,我很乐意回答你的问题。

索利·德奥·格洛丽亚

关于作者

文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。

除了在谷歌的工作,Vincent 还是《走向数据科学媒体》的特约撰稿人,为全球 50 万以上的观众提供有抱负的 ML 和数据从业者的指导。

在空闲时间,文森特在佐治亚理工学院攻读硕士学位,并为铁人三项/自行车旅行进行训练。

最后,请通过LinkedInMedium或** Youtube 频道 联系文森特**

马尔可夫链蒙特卡罗简介

原文:https://towardsdatascience.com/intro-to-markov-chain-monte-carlo-c6f217e00345?source=collection_archive---------19-----------------------

MCMC 解释并应用于逻辑回归

在之前的一篇文章中,我对贝叶斯统计做了一个简短的介绍,并告诉你贝叶斯分析如何结合你先前的信念和数据来找到感兴趣的参数的后验分布。我在文章中使用的问题是因为它很容易通过分析找到后验分布。通常情况并非如此,这个问题需要一个数值解。马尔可夫链蒙特卡罗(MCMC)算法就是这样一种模拟某些参数后验分布的方法。

在进一步阅读之前,你对贝叶斯统计有基本的了解吗?如果是,请继续阅读。如果没有,请在继续之前查看这篇文章。它涵盖了学习马尔可夫链蒙特卡罗(MCMC)之前需要知道的一切。

大都会-黑斯廷斯算法

Metropolis-Hastings 算法是对 MCMC 采样的一个很好的介绍。有 5 个步骤。在深入研究之前,让我们先定义一些参数和函数。

现在我们已经定义了参数、变量和函数,我们可以继续进行 Metropolis-Hastings 算法的 5 个步骤。

一旦你知道它是如何工作的,就没那么可怕了,对吗?

通常使用正态分布作为跳跃分布,因为以 0 为中心的正态分布可以产生小于或大于前一个建议的建议。跳跃分布的标准偏差是一个重要的调整参数。如果你的先验远离数字线上后验的密集部分,并且你的跳跃分布的标准偏差很小,那么在你开始从数字线的正确部分生成建议之前,将需要很长时间。如果您的跳跃分布的标准差相对于参数的真实分布太大,您的模拟后验概率将会有很多缺口,因为在这些位置没有生成建议。幸运的是,MCMC 的最佳软件包对它们的跳跃分布有自适应的标准偏差,所以在实践中你不必太担心这个参数。

一旦你生成了模拟的后验,标准的做法是“烧掉”一部分。这是因为该算法可能需要多次迭代来搜索参数空间中可能的值。要使用 10%老化,只需丢弃前 10%的模拟值。在去除“老化”之后,我们有了可以用于贝叶斯推断的模拟后验概率,例如构建可信区间。

应用改进的 Metropolis-Hastings 法进行逻辑回归

现在我们了解了 Metropolis-Hastings,我们可以对其进行修改,以适应逻辑回归模型中的系数。被估计的参数是 𝛽𝑗𝑗=1,2,…𝑘 的,其中 𝑘 是模型中系数的数量。主要区别在于将有多个参数需要估计,而不是一个。我通过为每一轮的每一个 𝛽𝑗 生成提议来处理这个问题,但是每一轮都将𝛽𝑗的顺序随机化。

为了构建适合逻辑回归模型的 MCMC 算法,我需要定义 4 个函数。这将允许我们在 MCMC 算法的每一步计算我们的后验概率与建议的 𝛽𝑗 的比率。

功能 1

第一个是 inv_logit ,撤销一个 logit 转换。logit 变换将概率转换为对数概率。

对数优势公式

逻辑回归的输出是对数优势格式。给定我们的数据,在计算我们的 𝛽 向量的对数似然时,我们需要这个函数来将预测的对数几率转换成概率。

逻辑回归的逆 Logit 方程

功能 2

第二个是 normal_log_prior ,它计算我们的 𝛽 向量的先验对数,给出我们关于个体 𝛽𝑗 的均值和标准差的先验信念。它是多元正态分布密度的自然对数,其中每个元素是 **𝑁∼( 先验均值 j先验标准差。戴夫。j* )** 在 𝛽 处。我们使用自然对数来防止下溢。*

功能 3

第三个是 log_likelihood ,它在给定数据的情况下计算我们的 𝛽 向量的似然对数。当我们用我们的逻辑回归对一个 2 类问题建模时,单个观察值具有伯努利概率质量函数( PMF )。

伯努利·PMF

给定数据,我们的 𝛽 向量的可能性是单个 PMF 的乘积。

给定数据,我们的 𝛽 向量的可能性

对数似然率为:

我们使用自然对数来防止下溢。

功能 4

最后, log_posterior 根据给定的数据和我们的先验信念计算出 𝛽 向量的后验概率。 𝑝𝑜𝑠𝑡𝑒𝑟𝑖𝑜𝑟 ∝ 𝑝𝑟𝑖𝑜𝑟∗𝑙𝑖𝑘𝑒𝑙𝑖ℎ𝑜𝑜𝑑,所以𝑙𝑛(𝑝𝑜𝑠𝑡𝑒𝑟𝑖𝑜𝑟)∝𝑙𝑛(𝑝𝑟𝑖𝑜𝑟)+𝑙𝑛(𝑙𝑖𝑘𝑒𝑙𝑖ℎ𝑜𝑜𝑑)

有了这些定义,我就能够实现一个修改过的 Metropolis-Hastings。我还添加了一些功能来消除“老化”,计算可信区间,并进行预测。为了进行预测,用户需要指定他们是否想要使用每个 𝛽𝑗 的模拟后验概率的中值、平均值或模式作为 𝛽 的估计中的系数。

定义好类后,我们可以在真实数据上测试它。

MCMC 逻辑回归在实际数据中的应用

为了测试 MCMC 逻辑回归模型,我使用了这个包含 86 种糖果数据的数据集。我选择了一个简单的模型,包含截距和“pricepercent”(相对于集合中其他部分的单位价格百分比)。)来预测糖果是巧克力的概率。

模型是:

**

如你所见, 𝛽0𝛽1 的模拟联合分布正在形成一个椭圆区域(就像广义线性模型中的联合分布一样)。在包含预烧回合的联合分布图中,系数从原点“行走”,在一个圆中走了一段,然后到达椭圆区域。这是从先验到我们可以认为是“真实的”模拟联合分布的区域的系数。

𝛽0 的 95%可信区间为[-3.67,-1.32],𝛽1的 95%可信区间为[2.50,6.72]。𝛽0 的模拟中值为-2.44,𝛽1的模拟中值为 4.48。价格越贵,糖果成为巧克力的可能性就越大。

查看价格百分位数与巧克力概率的关系图,我们可以看到我们的模型有一个很好的 S 曲线形状,如逻辑回归教科书中所示。它似乎在将糖果归类为巧克力方面做得不太好(与真阳性相比有很多假阴性),所以可能需要一个更复杂的模型。*

*当然,在构建真正的预测模型时,您应该使用验证和测试数据集来评估模型的性能。训练、验证、测试过程不是本文的主题;应用 MCMC 是。

与用 MLE 估计的逻辑回归相比

现在,我们已经用修改的 Metropolis-Hastings 算法拟合了逻辑回归,让我们将结果与标准的最大似然估计进行比较。结果很像!

极大似然逻辑回归模型综述

如果我做对了,你知道理解 MCMC 背后的想法,特别是 Metropolis-Hastings,并且理解它们如何应用于实际问题,例如拟合逻辑回归模型。

感谢阅读!如果你对 MCMC 和贝叶斯统计建模和机器学习感兴趣,请查看 pymc3

在这里找到我的项目库。

ML 操作简介:Tensorflow Extended (TFX)

原文:https://towardsdatascience.com/intro-to-ml-ops-tensorflow-extended-tfx-39b6ab1c7dd7?source=collection_archive---------23-----------------------

我对 ML 工程师和数据科学家的建议

Google、AirBnB 和 Twitter 如何可靠地部署他们的 ML 系统。

来源 Unsplash

为什么技术债务会让你做噩梦?

我们中的许多人在没有适当的开发和技术债务管理的情况下就投入了 ML/AI 的炒作。这和用牙签造机器人是一样的。 —文森特·塔坦 上 MLOps,技术债

在过去的博客中,我谈到了 MLOps 和技术债务,它们将你的 ML 系统变成了一个巨大的噩梦,带来了大量的金钱损失。

开发 ML 系统就像经营一家酒店;如果不加以处理,问题就会出现,害虫滋生,服务变得不稳定。这个错误导致亚马逊损失了数百万美元,因为他们的“ ML 定价推荐器”在黄金时段出了问题。

[## MLOps 简介:ML 技术债务

为什么 ML 会成为你最大的噩梦

towardsdatascience.com](/intro-to-mlops-ml-technical-debt-9d3d6107cd95)

在本文中,我们将讨论补救措施:谷歌 TFX (Tensorflow Extended)。一个很棒的 MLOps 工具,可以与 flow pipeline 一起构建一个健壮、透明的 ML 系统。如果使用得当,它可以让您更轻松地保持最先进的 ML 性能,同时减缓 ML Ops 技术债务。

免责声明:文中表达的观点、想法和意见仅属于作者,不一定属于作者的雇主、组织、委员会或其他团体或个人所有信息纯粹是为了我自己的学习目的,是从公开的 TFX 文档中总结出来的,加上我自己在谷歌与 TFX 共事的亲身经历。我写作纯粹是为了我自己的副业,绝不是出于任何隐藏的目的。

如何处理 ML 技术债?

根据我的经验,要可靠地部署您的 ML 系统,有 3 个最重要的考虑因素。

ML 模型组件的精心编排

假设你是一名新的 ML 工程师,正在开发一个系统来生产一个可靠的模型。

你如何管理和跟踪你的模型组件和版本?

每个 ML 操作阶段(取样、培训、评估和服务)都需要很好的理解。当数据分布和最佳拟合 ML 模型随时间变化时,这变得具有挑战性。几个月之后,您将不得不储备 ML 模型版本,并且可能会因为没有维护好的模型清洁度而停机。

我认识一个朋友,他用定制脚本和粘合代码解决了 ML 中断问题。虽然这在短期内行得通,但这会导致脆弱的代码、多余的翻译工作以及让他们困惑的大量技术债务。它变得如此荒谬,以至于可能需要一年多的时间才能在系统中引入一个小的政策变化。不用说,这家初创公司正在努力实现商业价值。

为了确保正确的版本控制和维护,我们需要一个透明可靠地跟踪 ML Ops 组件的系统。没有适当的跟踪和回滚系统的 ML 工程师团队将无法成功部署可靠的 ML 模型。

ML 操作需要清晰和一致。新的 ML 工程师需要了解 ML 培训和服务流程,以管理他们的版本和解决中断。

简化快速可控的变更,以满足业务需求

我们如何可靠地培训和服务不同的模型?

ML 工程工作对业务至关重要。想象一下亚马逊上一个定价推荐的例子。这个 ML 系统将总是需要保持不断变化的业务变化。想象一下促销力度、价格下限/上限,甚至竞争对手的公平数据政策。不同的外部因素会对 ML 推荐系统堆积复杂的更新。这将导致可能导致奇怪结果的错误(还记得亚马逊 Prime Day 丑闻)。

模型和系统的每一个变化都需要透明。每个模型和数据验证都被正确地标记和版本化。跟踪所有修复。

对业务和生产指标的一致评估

如何确保我们的模型不会失控并给我们带来巨大损失?

当您部署一个模型时,您将需要一个适当的仪表板来展示您的模型在现实生活数据中是否表现良好。集成测试是这里的关键。在谷歌,我们总是有实验、调试和生产模型。

每个 ML 模型都需要经过每个宇宙。它需要通过模拟测试在实验层面进行培训和验证。一旦我们准备好将它发布到真实的数据中,我们就将它推向调试,以控制有限的流量和沙箱。在我们调整调试阈值和微调模型之后,我们将把它投入实际生产。我们需要遵循数据清洁度(分布、偏斜度)、业务需求(精度、召回、货币结果)和生产指标(延迟、规模和可靠性)。

测试和影响评估对于确保可靠和高质量的 ML 生产系统至关重要

输入谷歌 TFX (Tensorflow 扩展版)

谷歌 TFX(公共来源

TFX 是一个基于 Tensorflow 的平台,用于托管端到端的机器学习管道。使用 TFX 配置框架,您将准备管道来清理数据、训练和服务于生产就绪的机器学习系统。TFX 在谷歌非常受欢迎,我们几乎在每部 ML 作品中都使用 TFX。

TFX 允许您创建一个强大的 ML 生产管道。TFX 提供模块化、灵活、协作、可访问和易于使用的 ML Ops 平台。每个 TFX 组件都允许对 ML 模型进行适当的存储、配置和编排。

从本质上来说,TFX 是研究人员和工程师之间快速安全采用 ML 的伟大联姻。TFX 的特点是公平、稀有条件、数据生命周期管理和软件开发生命周期问题(SDLC)。

TFX 管弦乐团

Orchestrators 自动执行任务并监控 TF 组件。最大的 TFX 管弦乐队之一是阿帕奇梁。Apache Beam 是统一的批处理和流分布式 API,它充当运行在分布式处理框架之上的抽象层。这允许您在不同的后端上工作,例如 Apache Spark、Local、Dataflow 等。

元数据存储

元数据是一个开源框架,用于在通用数据库中存储 ML 元数据,该通用数据库可由基于 SQL 的语言访问。此元数据保存所有组件记录,并允许我们将结果与以前的模型进行比较,并从模型中继承。它审计并优化了管道,将重点放在数据缓存上,并允许我们向前跟踪,从我们停止的地方开始。

在 TFX 的生产部署中,您使用 ML 元数据(MLMD) API 访问元数据,该 API 将属性存储在 MySQL 数据库或持久存储中。

TFX 组件

我起草并试验的样本流

TFX 使用 Flow/DAG 来模块化 ML 管道的组件。这里是一些初学者的入门组件。

  1. ExampleGen 将样本数据接收到基目录中。示例生成格式转换、连接等。您可以使用CsvExampleGen从 csv 或 n 张量生成原始数据。
  2. StatisticsGen 计算统计数据,如数据分布和异常检测。您可以使用StatisticsGen 来计算描述性统计数据,以进行数据完整性检查。
  3. SchemaGen 使用 TF 数据验证库来定义预期的界限、类型和属性,以确保数据的有效性和整洁性。想象一下,如果我们有性别特征,而系统在没有准备好的情况下开始输入“躁郁症、LGBT 等”,未知标签会使系统崩溃。
  4. 示例验证器使用 TF 数据验证库来检测数据中的异常。默认情况下,它根据模式验证统计数据,以检测分布异常。这是识别不可靠数据的金丝雀过程。
  5. Transform (TF Transform) 生成 tf.transform 图和transformed_example作为培训和服务的特征工程师输出。它提供了运行作业、创建转换图和运送到训练器组件的实用函数。tf.transform graph 既指向包含预处理数据模式的transformed_metadata ,又指向包含实际预处理图的transform_fn
  6. 训练师:实现 TF 模式。我们通过 tf 进行集成。学习对决策树/定制评估器建模。教练有缓存,允许我们在中断后继续。培训师培训两种服务模式:生产和评估。
  7. 调谐器:进行超参数调谐。在谷歌,我们使用众所周知的维齐尔
  8. 评估器:评估模型性能指标,验证新训练的模型是否优于之前的模型。它为频繁的 ML 模型训练和服务运行自动健全检查。
  9. Pusher :将经过充分验证的模型推送到可配置的目标,例如用于移动设备的 TF Lite 和用于服务器群的 TF Serving。推送器还管理_serving_model_dir 和回滚。
  10. 模型验证器:根据规定的基线对候选模型进行质量验证。模型验证器比较并决定最后一次验证,以推动所服务的当前模型。
  11. InfraValidator :执行服务基础设施验证以确保模型服务。
  12. 其他组件:标签根、取样器、标签杆

文件和规范的参考

如果你想了解更多,请随时从 TFX 文档Colab 获取全部细节。就我个人而言,我充分利用了这些资源,并在工作中贯彻了这些理念。

结论

通过在您的 ML 管道中实施 TFX 及其工作流程。您将获得以下好处:

  1. ML 模型组件的精心编排。您可以跟踪 DAG 管道中的组件。您可以快速理解一个新的 ML 项目,并了解每个组件如何协同工作以产生健壮的 ML 生产模型。
  2. 简化快速可控的变更,以满足业务需求。您可以快速分离和编辑相关组件,以满足业务需求。例如,如果您需要更多地惩罚 FN,您可以在使用相同的缓存样本时替换模型版本。
  3. 对业务和生产指标的一致评估。验证器和评估器组件确保您的新模型比之前的模型更加健壮可靠,即使在自动推送过程中也是如此。

我希望这是一本很好的读物,也是你发展和创新的灵感来源。

请在下面的评论提出建议和反馈。和你一样,我也在学习如何成为一名更好的数据科学家和工程师。请帮助我改进,这样我可以在下一篇文章中更好地帮助你。

索利·德奥·格洛丽亚

关于作者

Vincent Tatan 是一名数据和技术爱好者,拥有在 Google LLC、Visa Inc .和 Lazada 开展微服务架构、商业智能和分析管道项目的相关工作经验

Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。

他一直积极咨询 SMU BI & Analytics Club,指导有抱负的数据科学家和工程师,并为企业开发产品开放他的专业知识。

最后,请通过LinkedInMedium Youtube 频道 联系文森特

MLOps 简介:ML 技术债务

原文:https://towardsdatascience.com/intro-to-mlops-ml-technical-debt-9d3d6107cd95?source=collection_archive---------13-----------------------

我对 ML 工程师和数据科学家的建议

为什么 ML 会成为你最大的噩梦

来源: Unsplash

你最大的噩梦

(凌晨 3 点)快来!我们的定价全搞砸了!我们以 100 美元的价格出售 13,000 美元的相机! 亚马逊最佳黄金日 期间 ML 出错

假设你是亚马逊 ML 工程师之一,你的团队刚刚发布了一个新的 RNN 定价模型,根据购买趋势自动设置价格,你已经煞费苦心地回测和调整了无数次。你 2 年的努力终于有了成果,预计每年将产生 100 万英镑的额外收入。

你太高兴了,所以你订了一个昂贵的假期来庆祝。你在去巴哈马的路上,直到你收到…坏消息。

你的 ML 模型出了问题,错误地给所有商品定价。您疯狂地打开集成管理器进行回滚。但为时已晚,系统已经交货了;你的“尖端 ML 模型”让你的公司损失了 300 万美元。

第二天,您决定调试您的模型。你测试了模型。它看起来很好。价格分布有变化吗?资料准备有没有耍流氓?还是近期下游变化的质量数据?你疯狂地绞尽脑汁,但还是一无所知。因此,您决定用虚拟机和不同的配置文件隔离每个下游数据,从头开始重建模型,并再次逐个测试它们。你失去了对每个版本更新的跟踪,直到花了几个不眠之夜来修复问题。

在数据或集成变更期间,您最先进的 ML 模型变成了您最大的噩梦

输入技术债务

来源去飞溅

技术债务是在代码实施过程中所做的权宜决策的持续成本。它是由为了更早的软件发布和更快的上市时间的短期利益而采取的捷径造成的。技术债务倾向于复合。推迟工作以获得回报会导致成本增加、系统脆弱和创新率降低。

1992 年,沃德·坎宁安创造了这个术语来解释产品利益相关者对重构的需求。对于那些还不明白的人。技术债务是玛丽·近藤的反义词,说“让我们把脏衣服扫到床底下,问题就解决了”

来源( giphy )

同样,在人工智能和机器学习中,我们都倾向于增加技术债。我们喜欢做“忍者修复”,走捷径,比如硬编码功能、臭代码和不负责任的复制粘贴。如果您赶时间或交付概念证明(POC ),这些都是非常好且必要的。但是如果不付钱的话,这是非常危险的。

不是所有的债务都是坏的,但是未偿还的债务是复合的——

D·斯卡利,在机器学习系统中的隐藏债务

我们的 AI 和 ML 是靠数据运行的。垃圾进垃圾出。您使用的功能越多,它就变得越不稳定,尤其是当这些功能依赖于系统的许多部分时。

你脆弱的军情系统

想象一下使用 CRM(客户关系管理)系统建立价格歧视的定价系统(类似于飞机票)。定价系统的质量将高度依赖于来自 CRM 的数据,缺失的功能将破坏 ML 中的所有结果。

现在,想象它通过更加互联的 ML 和其他系统连接到来自更多上游的特征。你的 ML 模型往好里说是脆弱的,往坏里说是破碎的,会影响到它的下游。

在一个快节奏的基于人工智能的创业公司中,这已经成为常态,因为他们疯狂地赶时间线,以实现他们的产品,并将其呈现给他们的利益相关者。我和一个在人工智能初创公司的朋友聊过,他提到他们从来没有使用适当的版本控制(Git)、问题跟踪(吉拉)或任何开发运营管理工具来开发他们的 ML 系统。令人震惊的是,许多其他人在没有适当的 DevOps 和技术债务管理的情况下跳入 ML/AI 炒作。这和用牙签造机器人是一样的。

对于软件工程来说,DevOps 很重要。但是对于 ML Productions 来说,MLOps 是不可分割的

4 大 ML 管道事故

来源: Unsplash

1)纠缠

ML 系统是有数据的机器。通常很难做出孤立的改变(改变任何事情,改变一切——CACE)。这适用于特征工程、最大似然调整、正则化、数据采样等。

比方说,你的定价模型在除吸尘器之外的所有产品上都非常有效(因为它很烂:)。您通过提高清洁产品定价的敏感度来固定吸尘器的定价,但您发现您导致了定价分配与洗碗机不匹配。吸尘器的价格分布不适用于洗碗机的价格分布,洗碗机的价格分布更窄。您现在需要创建一个可能影响其他产品的不同规则。

你会意识到数据和见解是纠缠在一起的。不同的调优和模型公式将导致难以隔离的一般洞察力变化。

纠缠在一起的数据和系统会给隔离和调试问题带来困难

2) 复杂管道(管道丛林)

人工智能和人工智能系统由许多不同的工作流管道组成,这些管道按顺序负责复杂的工作。您的 ML 系统将由许多工程师构建,并与许多不同的系统和数据源互连。

在一个适当的 ML 管道中,你将需要设计许多工作,包括抓取、生成数据、ETL、验证数据清洁度、交叉验证、监控性能和部署。很快你的模型就会变得非常复杂。如果没有合适的工具和标准的操作,在使用不同语言的多个系统和遗留系统之间进行简单的更改将需要几个小时。

复杂的管道导致您的工程工作缓慢且漏洞百出。如果治疗不好,你可能需要几个小时来做简单的改变。

3) 隐藏的反馈回路

现实世界的系统最终影响了我们的数据。假设您的销售代表发布了一项营销活动,旨在接触儿童,并积极地将他们纳入您的定价模型所使用的 CRM 系统中。

ML 模型会感知到大部分顾客购买玩具。因此,ML 模型提高了玩具价格,并过度打折昂贵的产品。然而,监控你的价格飙升,你的竞争对手的定价模型也自动填充了玩具过高的价格市场。你的系统也会这样做,恶性循环就出现了。

隐藏的反馈循环给你的 ML 系统带来了麻烦,同时由于 ML 系统之外的相互关联的数据依赖,使得调试更加困难

4)脆弱的数据依赖

想象一下,你的定价模型依赖于你的客户的性别。如果一个男生浏览化妆品,很可能他会买给妻子/女朋友作为礼物,所以支付意愿更高。你的机器学习已经准备好根据性别来决定定价了。

但是,您的业务代表在上游 CRM 中的“性别”功能之外添加了一个标签。如果你的 ML 系统看到的不是男性或女性的值,它会崩溃吗?现在模特会如何给化妆品定价?与代码依赖相比,这是非常脆弱的,因为这意味着无论何时上游系统被更新,您的模型都可能被破坏,并给出未被怀疑的特性。

在特征工程和标记过程中,由于语义不匹配,数据依赖性导致逻辑错误和质量下降。

支付你的 ML 技术债务

资料来源:Unsplash

技术债是一种痛苦。作为 Visa 的前数据工程师和谷歌的数据科学家,我必须确保一个适当可靠的渠道保持透明和负责。我需要一个标准的操作来管理机器学习的技术和数据方面,并确保质量不会随着时间的推移而下降。

有三个小技巧可以帮助您最大限度地减少 MLOps 技术债务。

1)测试你的代码和数据

测试是技术领域最重要但不性感的角色之一。考虑测试以限制技术债务并确保 ML 生产质量仍然非常重要。在 DevOps 中,我们学习了两种类型的测试:单元测试(测试单一功能)集成测试(测试集成功能)。然而,在 MLOps 中,我们需要建立一个 canary 流程,在投入生产之前测试 ML 管道质量。这包括测试数据依赖预分析能力以识别看不见的数据(想象一下男性/女性性别的例子)。

2)测试训练和服务值的一致性

训练模型时,您使用的是日志数据(预先记录/观察到的日志)。然而,在生产中,您将需要处理实时数据,由于时区(时间序列)、相机(图像)质量、语言等许多问题,这些数据可能会给出不同的值。跟踪记录的和实时的数据以确保质量一致性是非常重要的。

3)保守评分

对你的 ML 模型的每个测试阶段进行评分。在四个不同部门应用管道健康评分:

  • ML 基础设施:测试下游和上游数据流质量。
  • ML 模型开发:测试模型不包含任何被人工确定为不适合使用的特征。
  • 特性和采样:测试每个特性的分布是否符合您的预期。
  • 运行 ML 系统:在训练和服务中测试所有创建输入特性的代码和数据质量。

所有这些阶段对于部署和维护模型都很重要。将每个阶段的最低得分作为整个系统的最终得分。在投入生产之前,确保您可以最大限度地提高最低评分,以建立正确的健康标准。

简单地说,对抗技术债务就是在你的 ML 管道生命周期中的任何时候清楚地了解它。这包括数据样本、模型生成、测试以及最终的部署。

如果做得正确,您将能够:快速开发,可预测地运行您的模型,并可靠地向您的客户交付价值。

下一步是什么…

关于本文的参考资料,请参考 D.Sculley 和谷歌团队的这篇论文。

我还将谈到 Tensorflow Extended (TFX)作为一个开源工具来启动和维护您的 ML 模型。这一框架已被许多大型科技公司广泛使用,如谷歌、Twitter 和 AirBnb。希望你能和我的媒体频道保持同步。

我相信了解这一点是将你的 ML 努力转化为强大而有效的 ML 系统的第一步。

最后…

我真的希望这是一本很棒的读物,是你发展和创新的灵感来源。

在下面评论提出建议和反馈。就像你一样,我也在学习如何成为一名更好的数据科学家和工程师。请帮助我改进,以便我可以在后续的文章发布中更好地帮助您。

谢谢大家,编码快乐:)

关于作者

Vincent Tatan 是一名数据和技术爱好者,拥有在 Google LLC、Visa Inc .和 Lazada 实施微服务架构、商业智能和分析管道项目的相关工作经验。

Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。

他一直积极咨询 SMU BI & Analytics Club,指导来自不同背景的有抱负的数据科学家和工程师,并为企业开发他们的产品开放他的专业知识。

最后,请通过 LinkedIn Medium Youtube 频道 联系文森特

字符级语言建模

原文:https://towardsdatascience.com/intro-to-nlp-and-language-models-47e85f9202e4?source=collection_archive---------23-----------------------

在 NLP 模型中利用知识蒸馏

等级 RNN(一个灵感)

语言模型是自然语言处理中的一个关键要素。好的 LM 可以描述单词之间的关系,帮助机器理解单词或句子的意思。目前,研究更倾向于单词嵌入而不是字符嵌入(单词的基本元素)。在本文中,我们主要研究字符级的单词嵌入。一个字符的体积比一个单词的体积小。因此,我们采用知识提炼的方法来训练我们的模型。我们试图让模型从变压器(BERT)字符感知卷积神经网络的双向嵌入表示中学习。然后我们用这个模型来检验几个相似单词的例子。

1 导言

LMs 根据文本中的例子学习一个句子或单词出现的概率。它们被应用于句子生成器、问题回答、情感分析、机器翻译等。最初,像 N-grams 这样的统计方法被用作 LMs。最近,神经语言模型,如基于神经网络的 LM (NNLM)已经远远超过了 N-grams,并取得了明显更好的结果【1 】。基于卷积和递归神经网络(分别为 CNN[2和 RNNs)的方法也已经被开发出来。为了对一个词进行建模,需要理解上下文。语境是由几个词构成的,为此发展了注意力的概念,其中焦点指向特定的词,以便产生句子的语境。基于这种注意机制,开发了变压器模型,其中使用多个层来分析上下文和聚焦单词[ 3 ]。自从引入 BERT 模型以来,现在的转换器使用双向层来分析上下文[ 4 ]。

2 相关工作

传统 LMs 和单词嵌入。传统的 LMs 使用 N 阶序列马尔可夫模型,其中平滑和计数用于计算 N 元概率【5】。对这些基于计数的技术进行训练是简单的,然而,尽管有这些平滑技术,由于数据的稀疏性,对稀有 N 元语法概率的估计可能会减少。相比之下,NNLMs 采用单词嵌入:参数在训练过程中学习,语义接近的单词的单词嵌入在向量空间中显示相似性[ 5 ]。例如,他们不能在无事件、无事件、有事件和有事件的向量空间中建立单词嵌入的先验。

自然语言处理模型的可解释性。NNLM 模型具有很高的精度,但与其他深度神经网络(DNN)模型一样,也存在同样的可解释性问题。计算机视觉的新方法

协助评估 DNNs[ 6 ],使用潜在表示法,并附有可解释的输入值,如单词或图像像素,这有助于评估输入的显著性和贡献。现有的群体分为三类:基于梯度的方法,包括逐层传播和基于反演的传播。这些方法表明,中间层的定量评估提高了人们对 DNNs 内层的理解[ 6 ]。

自我关注更深的 LMs。到目前为止,角色级 LMs 一直由 rnn 主导。诸如 LSTMs 的 RNN 变体已经为角色级别的 LMs 提供了很好的结果。因为它涉及到我们的模型。艾尔。的工作展示了使用 64 个堆叠变压器层的网络时,字节级 LMs 的性能如何优于字 LMs。重要的是,他们表明深度转换模型可以提供比典型的 RNN 更好的结果,在中间序列和外层增加了损失函数。

形态学分割科特雷尔等。艾尔。【8】提出了一种上下文无关语法(CFG)方法,其中 I)单词本身的直觉被捕获,并且可能属于不同的组成成分,ii)词缀被附加的顺序以分层结构表示。这种基于 CFG 的方法是新颖的,并且有人认为这种分层方法比马尔可夫模型中的标准扁平分段更合适。从他们的研究中得出的结论是,层次结构可以提供更大的词素分割,并在总体上导致更大的准确性。

3 模型架构

我们使用了一个改进的字符感知 CNN 模型[ 5 ],增加了一个字符嵌入门,如图 1 所示:

图 1:提议的模型架构

基本思想是使模型输出与预先训练的角色级 LM 相匹配。我们通过让 CNN 扮演一个“老师”的角色来做到这一点。字符感知 CNN 由字符嵌入层、CNN 层(具有几个内核大小的过滤器)、字符顺序方向的池、高速公路架构(Gate)和 LSTM 组成。我们还建议在字符嵌入层和 CNN 之间增加一个双向 LSTM 和 Softmax 门。Softmax gate 预计将调节来自每个字符的信息:模型输出(来自公路层的 525 维向量输出)和预训练的字符感知 CNN 的输出之间的均方误差(MSE)。如果模型的输出可以匹配预训练模型的输出,双向 LSTM 门可以避免不必要的字符嵌入进入 CNN 和公路层,允许 CNN 获得分段的字符级嵌入。我们期望双向 LSTM 门能够以某种方式将单词分割成变体。

4 个结果

我们使用手套数据集训练我们的模型。培训损失下降,如图 2 所示:

图 2:培训损失

其中根据训练和测试数据,两个模型都具有低损失。我们分析了模型高速公路层的单词嵌入输出,检查了随机选择的单词中 7 个最接近的单词嵌入,如图 3 所示:

图 3:相似词的结果

经由双向 LSTM 选通结果如图 4 所示:

图 4:LSTM 门的结果

单词被分成单词和填充区域。然而,我们无法观察到任何变形边界。

5 结论

我们构建了一个双向 LSTM 来实现输入字符级嵌入的门。该门有望减少投入和培训损失。提出的网络能够找到相似的字符级单词。然而,所提出的网络不能通过 LSTM 输出发现变体间隙,并且它不能学习教师模型的嵌入。可能的改进点包括:在第二个或第三个相似的隐藏层添加损失,以及在损失中实现互信息。具有字符意识的神经网络似乎不太适合学习,因为它们不能很好地找到相似的单词。

我和我的同事撰写的原始乳胶文件

参考

【1】约舒阿·本吉奥、雷让·杜查梅、帕斯卡尔·文森特和克里斯蒂安·贾乌文。一种神经概率语言模型。机器学习研究杂志,3(2 月):1137–1155,2003。

Yann LeCun,Léon Bottou,Yoshua Bengio 和 Patrick Haffner。基于梯度的学习在文档识别中的应用。电气和电子工程师学会会议录,86(11):2278–2324,1998 年。

【3】Ashish vas Wani、Noam Shazeer、Niki Parmar、Jakob Uszkoreit、Llion Jones、Aidan Gomez、ukasz Kaiser 和 Illia Polosukhin。你需要的只是关注。在神经信息处理系统进展中,第 5998–6008 页,2017 年。

雅各布·德夫林、张明蔚、肯顿·李和克里斯蒂娜·图塔诺娃。Bert:用于语言理解的深度双向转换器的预训练。 arXiv 预印本 arXiv:1810.04805 ,2018。

Yoon Kim,Yacine Jernite,David Sontag 和 Alexander M Rush。字符感知神经语言模型。在2016 年第三十届 AAAI 人工智能大会

【6】关、王希庭、张全世、陈、狄鹤、邢燮。对自然语言处理中深层神经模型的深入和统一的理解。2019.

【7】Choe 等人。具有更深自我关注的字符级语言模型。谷歌 AI 语言,2018。

【8】库马尔·科特雷尔和舒茨。由内向外的形态学分割。 ENMLP ,2016。

面向地球科学计算的开放式数据库简介:第 1 部分,共 2 部分

原文:https://towardsdatascience.com/intro-to-open-database-for-geoscience-computing-part-1-of-2-2ad214fc2388?source=collection_archive---------46-----------------------

了解如何在 Google Colab 中访问大量在线开放地球科学数据库

开放式地球科学计算。背景图像是 Dutch-F3 地震剖面。

如今,开放的地球科学数据对于研究、基准测试和项目目的非常重要。它们非常有用,在能源行业(石油、天然气和地热)和学术界工作的人利用这些数据集对他们的方法进行基准测试,也可以作为高等院校学生的可复制教材。与此同时,并不是所有的机构都能够获得广泛的工业商业软件或应用程序来计算和处理这些数据集。本文的目的是介绍如何充分利用开放数据库的教程。

我已经在互联网上编辑了至少三个大型开放式地球科学数据库,我相信现在每个人都可以“在同一个屋檐下”访问它们!这是三个开放的地球科学数据库。

  • Google Drive 中的公共地球科学数据
  • SEG Wiki 开放数据
  • 地热数据储存库

公共地球科学数据 是一个开放的数据库,可以作为 Google Drive 使用,由彼得·阿姆斯特兰德创建。该数据库包含广泛的可复制数据集,如荷兰 F3Canning 项目的地震 3D 数据,GEOLINK 编制的北海项目的测井文件,用于训练和测试机器学习研究中数据集的各种地球科学图像,等等。

SEG Wiki 开放数据 是勘探地球物理学家协会(SEG)拥有的可用开放地球物理数据目录。该目录包含 30 多个地球物理数据集,如海上和陆上地震数据和测井文件、新西兰 3D 项目、地球物理综合基准模型,如 BP 基准模型马尔穆西模型KFUPM-考斯特红海模型、重磁数据和地形-水深数据。

地热数据仓库GDR OpenEI 是由美国能源部(DoE)提供,美国国家可再生能源实验室(NREL)开发的开放式地热能源数据门户。顾名思义,这个数据门户主要关注地热和热液勘探数据,例如犹他州米尔福德附近的 FORGE 项目数据。

Google Colab 是什么,为什么要用?

使用 Python 作为开源编程语言使人们能够开发各种功能强大的程序,因为它在地球科学目的中的应用也不可避免地得到了很好的认可。Python 编程语言现在也正在成为开发者中的“沟通语言”。毫无疑问,使用商业软件受限的人可以使用 Python 开发自己的程序。

此外,在云服务中运行是提高计算效率的绝佳机会。一个不需要在本地计算机中为内存占用大量空间。 谷歌合作实验室 (或 Colab )是谷歌的一项研究计划,旨在让 Python 中的计算在云中成为可能。我们在 Google Colab 中工作的 Python shell 类型是一个 IPython 笔记本

本文由 3 个教程组成,从如何访问公共地学数据 Google Drive 开始,然后如何解压打开简单文件,最后如何从网站直接访问 SEG Wiki 和 GDR OpenEI 到 Google Colab。

教程 1:如何访问公共地球科学数据

打开 Google Drive 公共地学数据 链接。一旦你点击了这个链接,你就会在你的与我共享目录中得到这个数据库的一个拷贝。您的下一步是将公共地球科学数据从您的与我共享目录传输到您的我的驱动器。您可能不知道如何在 Google Drive 中执行此操作。下面的 GIF 动画为你指路!

GIF 教程将文件夹从“与我共享”转移到我的驱动器目录

公共地球科学数据现在存储在您的 My Drive 目录中。确保通过访问您的 My Drive 目录并搜索 Public geoscience Data 文件夹来存储它。现在打开文件夹。你会发现里面有 12 个文件夹和 2 个文件。

我的驱动器目录中的公共地球科学数据文件夹的屏幕截图

然而,并不是所有在公共地球科学数据中的文件夹和文件都包含地球科学数据集,供你进一步处理、分析和计算。例如, report for images 文件夹包含斯塔万格大学和奥斯陆大学发布的地球科学文档(以 PDF 和图像格式)。这些文件应该对研究参考非常有价值,但对计算(地震处理、测井分析等)没有价值。如果你对内容感到好奇,这是我列的清单。

表 1。公共地学数据中每个文件夹的内容

在上面的列表中,你会发现一些文件夹包含 ZIP 文件夹和一些简单文件比如格式 PNGJPG 的图片。在本文的教程 2 中,您将学习如何在 Google Colab 中解压缩文件并打开这些图像。但是,如何访问大文件(即地学数据集)的教程,如地震数据 SEGYSGY测井数据 LAS 文件,在这里就不赘述了,因为我们需要进行很长的讨论。但是,不要担心,我们将在本系列教程的下一个第 2 部分中介绍这一点。在第 2 部分的后面,我们将更多地介绍 Python 代码。

另一篇教程文章:面向地球科学计算的开放数据库介绍,第 2 部分,共 2 部分

因此,经过整理,我筛选了 6 个包含数据集的文件夹,如下所示:

  • 坎宁三维 TDQ 地震
  • 荷兰 F3 地震数据
  • GEOLINK 北海油井
  • 波塞冬地震
  • 核心图像
  • 48 口井的综合测井

接下来,如果您只检查了 6 个文件夹中的一个,例如在扫描 3D TDQ 中,您会发现一个名为canning3d_GDA94_UTM50s.sgy 的地震数据文件,其文件大小为 103 千兆字节!如果您在石油和天然气行业,您不会感到惊讶,因为事实上,通常大多数地震数据都是如此,文件大小非常大。在你的本地电脑上下载如此大量的地震数据不是一个明智的决定。这就是为什么我给你介绍一个有效的方法打开这个文件。我这里说的云服务就是 Google Colab。

所以现在我们去 Google Colab。访问这个链接将你重定向到 Google Colab。在你访问 Google Colab 时弹出的第一个窗口,点击新建笔记本创建一个新的 IPython 笔记本

谷歌 Colab 的第一次遭遇

然后,您将被重定向到新笔记本。现在,您已经有了一个新的空白笔记本,您将在其中放置打开公共地球科学数据的代码。下面是一个笔记本的结构。

Google Colab 中 IPython 笔记本的结构

在你的新笔记本上面,你会看到Untitled.ipynb。这是您笔记本的名称,因此请将其更改为您喜欢的名称,但切记不要删除扩展名。ipynb ,因为它是 IPython 笔记本的典型扩展。例如,将我们的新笔记本命名为**Public-geoscience-Data.ipynb**

你也看到 代码 。**代码用于在笔记本中创建新的单元格代码,因此每当您创建代码脚本时,单击它即可添加新的单元格。为了预热,您可以创建一些代码,如下所示。要运行你的代码,点击单元格左边的 播放 按钮,或者干脆做CTRL + ENTER

在笔记本的最左边,你也可以找到三个符号。最底部的符号是 文件夹 ,在这里你可以浏览你正在处理的目录。默认情况下,如果你点击它,只有一个名为 sample_data 的文件夹。它是由 Colab 为您创建的,但在这里,我们不使用它。

样本代码写在笔记本上

现在,让我们开始访问你的 Google Colab 的 Google Drive 中的公共地球科学数据文件夹。通过点击代码按钮添加一个新的单元格,并运行下面的脚本。

from google.colab import drivedrive.mount('/content/drive')

将出现以下消息。该邮件提供了一个 Google Drive 链接。点击该链接,并按照您需要的说明访问您的 Google Drive 帐户。一个新的链接将再次提供给您,复制它,并将链接粘贴回您的笔记本单元格内的“输入您的授权码:”然后,按ENTER。请等待授权过程完成。

Google Colab 中的 Google Drive 帐户授权

如果你已经完成了授权,你可以在 文件夹 按钮中查看你的 Google Drive 文件夹(之前讨论过)。如果找不到,请点击REFRESH。然后浏览你的 Google Drive 文件夹,找到 公共地球科学数据 。这是该文件夹的路径。

"/content/My Drive/Public geoscience Data"

文件夹应该在那里。如果您没有找到该文件夹,您可能无法成功地将公共地球科学数据从您与我共享的*移动到您的 My Drive。在这种情况下,你应该再次查看上面的教程。*

确保公共地球科学数据在路径中的另一种方法是,运行以下脚本。

cd "/content/drive/My Drive/Public geoscience Data"

如果它返回罚款,那么罚款,没有问题。如果出现“没有这样的文件或目录”的信息,这意味着您需要确保您已经成功地将文件夹移动到您的 My Drive 中。

下一步,查看文件夹的内容。你有两种方法可以做到这一点。最简单的方法是导航到笔记本最左侧的 文件夹 部分,展开文件夹,就像在 PC 中操作一样。另一种优雅的方式是运行下面的脚本。

ls "/content/drive/My Drive/Public geoscience Data"

你会发现以下内容。

通过运行“ls”脚本公开地学数据的内容

脚本ls用于检查文件夹,而前面提到的cd用于转到我们工作目录中的某个文件夹。它被称为 Bash 脚本,一种 Linux 中的命令行编程语言。这是一个有趣的话题,我们暂时不需要关注那一个!

恭喜!你现在已经在你的 Google Colab 中拥有了你的开放数据库!如前所述,在这个公共地球科学数据中,只有 6 个文件被认为是数据集。

此外,如果您查看一些文件夹(回忆:表 1 ),例如 GEOLINK 北海油井,您将会看到。再次运行ls来检查这个文件夹中的文件。

ls "/content/drive/My Drive/Public geoscience Data/GEOLINK North sea wells with Lithology interpretation"

有一个名为GEOLINK_Lithology and wells NORTH SEA.zipZIP 文件,还有一个名为Lithology code in the well.pngPNG 格式的图像文件。在接下来的教程 2 中,你将学习如何解压缩这个文件,并在你的 Google Colab 笔记本中打开一个图像。

教程 2:如何解压文件夹和打开简单的文件

使用 Google Colab 的优势是可行的,你可以解压一个文件,而不需要下载到你的本地电脑,也不需要使用任何解压程序。到上面的 GEOLINK North Sea ZIP 文件,运行以下脚本来解压缩该文件。

!unzip '/content/drive/My Drive/Public geoscience Data/GEOLINK North sea wells with Lithology interpretation/GEOLINK_Lithology and wells NORTH SEA.zip' -d '/content/GEOLINK North Sea'

解压缩文件需要一些时间。完成后,解压缩后的文件将出现在您的工作目录/content下的一个新文件夹中,名为GEOLINK North Sea

上面的脚本可以分成四个语法:!unzip ‘zip_file_path’ -d ‘to_new_folder’。第一个语法!unzip指示 Colab 解压文件,第二个语法‘zip_file_path’是 zip 文件的路径,第三个语法-d告诉 Colab 将解压后的文件存储到一个新的目录中,其中新的目录路径名在第四个语法‘to_new_folder’中。

恭喜你!你现在知道如何解压文件了。因为解压缩后的文件现在存储在一个新目录中,所以运行ls来检查内容。

ls '/content/GEOLINK North Sea'

你会在中找到大约 200 个测井 LAS 文件

GEOLINK 北海油井文件夹的测井 LAS 文件内容

这些是在北海钻的井。同样,关于如何打开这些 LAS 文件的教程将在第二部分的后续文章中介绍。

我们现在将关注另一个任务,打开一个简单的文件,例如 PNGJPG 图像。如果你回到原来的 GEOLINK 北海油井文件夹,你会发现一个名为location of geolink wells.png的图像文件。这是这些井的位置图。

我们将使用名为PillowPIL的 Python 库。首先,我们需要 **PIL** 导入一个模块,命名为 **Image** 到我们的 Colab 笔记本中(PIL已经在 Colab 中了,所以我们不需要安装。)

from PIL import Image

接下来,运行以下脚本打开图像。图像文件路径为/content/GEOLINK North Sea/location of wells.png。我们使用Image模块中的open函数来实现。

img = Image.open("/content/GEOLINK North Sea/location of wells.png")img

当您运行该脚本时,一个图像将出现在您的 Colab 笔记本中!正如你已经猜到的,这是包含油井位置的北海地图。这是斯诺尔油田附近的一个海上油田。

在 Colab 打开的北海油井的位置(数据所有者:https://github.com/bolgebrygg/MalenoV)

恭喜你!您已经知道如何在 Colab 中打开图像。在此讨论之前,您已经足够了解如何从公共地球科学数据 Google Drive 访问一些数据集。当然,在第 1 部分的文章中还讨论了很多未涉及的文件,比如地震数据和测井文件,所以请继续关注第 2 部分的文章。至少,你知道如何通过 Google Drive 直接访问 Google Colab 中的一个地球科学数据库。

接下来,在教程 3 中,我们将讨论如何访问其他开放数据库,即 SEG Wiki 开放数据和 GDR OpenEI。

教程 3:如何访问 SEG Wiki 开放数据和 GDR OpenEI

要访问这两个数据库,我们不再需要上面的 Google Drive 工作流了!我们可以直接从网页上流式下载数据集到我们的 Colab 笔记本

我们需要看看这两个开放数据库的网页是什么样子的。首先,我们将访问 SEG 维基开放数据网页

SEG Wiki 开放数据的网页

在内容中,您将看到 30 多个开放数据集。我们建议首先访问您想要访问 Google Colab 的数据的内容链接。您将找到数据的详细信息,并单击相关链接。例如,访问此链接 Stratton 3D 地震数据集

在 Stratton 3D 网页中向下滚动到如何下载部分,有带链接的文件。现在,我们将使用第三行中的3D filtered migration file,右键单击它,并选择,复制链接地址

右键点击 Stratton 3D 网页

链接已经被复制,现在回到您的 Colab 笔记本,将复制的 URL 粘贴到下面的脚本中,并运行该脚本。记得将复制的 URL 粘贴在单引号内。

!wget 'your_copied_URL' -P '/content/Stratton/seismic'

这里,我们使用!wget语法下载 URL 中的数据集。传递下一个语法-P,将下载的数据存储到一个新文件夹中,在下一个语法中命名为 '/content/Stratton/seismic’。这个!wget语法是通用的,这意味着你可以以 URL 的形式下载任何数据集。

正如我们在下载数据集 URL 时注意到的,文件大小为 423 兆字节!想象一下,我们将这个数据集下载到我们的本地计算机,它肯定会占用很大的空间。

Google Colab 中下载数据集的过程

如果我们导航到Stratton内新创建的文件夹seismic,我们将看到一个名为Stratton3D_32bit.sgy的地震数据。在第二部分文章中,我们将讨论如何打开这些地震数据。

恭喜你!你现在知道如何从SEG Wiki Open Data直接下载数据集到 Google Colab。同样的使用!wget的方法我们也将适用于另一个 GDR OpenEI 数据库

接下来,让我们访问地热数据储存库(GDR) OpenEI 网页。第一次相遇,你需要浏览一个带有某个关键词的数据集进行搜索。只需输入gravity forge。我们将使用犹他州米尔福德附近的 FORGE 站点的 3D 重力数据实例。

犹他州伪造重力数据搜索网页

访问搜索网页中出现的Utah FORGE: 3D Gravity Data。除非你找到了,只需在“搜索”块中浏览完整的名字。在页面内,向下滚动找到ZIP文件FORGE_3D_gravity.zip,右键点击“下载”,同样“复制链接地址”。

右键单击下载重力数据集

再次,回到 Colab 笔记本,这一次我们将把它留给你!如果您还记得(我们确信您记得),使用!wget下载 URL,然后指定目标文件夹。

*!wget 'https://gdr.openei.org/files/1144/FORGE_3D_gravity%20(1).zip' -P /content/FORGE*

您现在可以在新创建的文件夹FORGE中获得下载的文件。如您所知,这是一个 ZIP 文件。你肯定已经知道怎么解压了。运行以下脚本。

*!unzip '/content/FORGE_3D_gravity (1).zip' -d '/content/FORGE'*

恭喜你!您已经使用!wgetGDR OpenEI 访问了一些数据集

结论

在这个关于在 Google Colab 云环境中使用 Python 的介绍性文章系列的第一部分中,我们讨论了三个教程,涵盖了访问开放数据集的基本工作流。

作为总结,我创建了一个 Colab 笔记本,其中包含了本教程中讨论的所有代码。打开笔记本这里

除了这篇文章,我还制作了一个 GitHub 知识库,其中包含了关于开放地球科学计算的分步教程。游览此 [环节](https://github.com/yohanesnuwara/open-geoscience-repository) 开始旅程。

最后但同样重要的是,强烈建议任何对使用开放数据集感兴趣的人引用这些数据,以尊重数据所有者。 引文维基 可在我的 GitHub 维基页面上获得。引用内容也会经常更新。

享受您的开放地球科学计算,并继续关注第 2 部分!

到达我的 GitHub:github.com/yohanesnuwara

到达我的邮箱:ign.nuwara97@gmail.com

**到达我的领英:https://www.linkedin.com/in/yohanes-nuwara-5492b4118/

数据科学家后结构主义法国哲学导论(上)

原文:https://towardsdatascience.com/intro-to-post-structuralist-french-philosophy-for-data-scientists-c74019122f17?source=collection_archive---------24-----------------------

数据科学家的哲学

人文学科如何看待数据科学

如果你没注意到,那是一只穿着法国国旗衬衫的可爱的狗。查尔斯·德鲁维奥在 Unsplash 上拍摄的照片

在这一系列的文章中,我想简单介绍一些对人文学科产生巨大影响的法国重要思想家。特别是,我想把重点放在旨在理解和解释数据挖掘的现代实践的人文/哲学工作上,包括数据收集和自动化剖析。然而,由于这项工作的复杂性,我将需要分几期进行。

在这些哲学家中,我们将会看到米歇尔·福柯、皮埃尔·布迪厄、吉勒·德勒兹、布鲁诺·拉图尔、江泽龙·利奥塔、雅克·德里达、保罗·里科尔和让·波德里亚。这篇文章将关注福柯和德勒兹,并通过对尼采、黑格尔和马克思的相对随意的介绍来提供一些必要的背景。

为什么在乎?

例如,根据最近的统计,米歇尔·福柯被引用了近 40 万次。相比之下,皮埃尔·布迪厄只有区区 18.8 万英镑。这些作者的单本书被引用的次数比大多数学者都多。如今,很难读到来自人文学科的关于个人数据、隐私和算法歧视的讨论,这些讨论没有提到这些和其他法国哲学家的工作。例如,约翰·切尼-李波德的 一个新的算法身份:软生物政治和控制的调制 从一个文化和数字研究教授的角度呈现了对自动机器学习的一个有影响力的观点。

如果没有这些哲学家和社会学家的思想背景(事实上很难将他们中的许多人归入一个单一的学科),目前发表在社会科学、人文科学和营销期刊上的许多内容可能很难理解,似乎过于抽象,并且充满了新词和各种“后现代术语”我会尽我所能为你解开这些谜团,但是理解他们工作的一部分在于学习他们的概念词汇。

此外,如果你对任何类型的定性社会科学研究感兴趣,你可能会遇到这些名字,因为他们的思想是反对维也纳圈思想家开创的更实证/定量方法的哲学基础。

为什么写这个帖子?我们需要在数据和计算机科学家、工程师、社会科学家和人文主义者之间培养跨学科的“思想交汇”。

鉴于数据挖掘在我们日常生活中的无处不在,我们必须弥合科学家和小说家 CP Snow 曾经提到的将科学和人文分开的两种文化

数据科学家能从人文学科中获得什么?

这个问题值得单独发帖,我现在就不深究了。可以说,人文学科通常关注对文本、事件、行为和符号的 解释,以及与人类体验相关的 等许多其他事物。

如果你认为诠释是懦弱的、戴着贝雷帽的、啜饮着键盘的战士们的事,想想有多少人因为他们对一本书或一件事的诠释被认为是“错误的”而被杀害对于数百万人来说,这是一件事关生死的大事。(我在看你们毛斯大林)。例如,现在在美国,激烈的文化辩论正在激烈地进行着,关于为那些从奴隶所有权中获利的人竖立雕像和建造纪念碑是什么意思。约翰·梅纳德·凯恩斯这样描述人文学科的力量:

“经济学家和政治哲学家的观点,无论是对的还是错的,都比我们通常理解的更有力量。事实上,这个世界很少被别的东西所统治。务实的人认为自己完全不受任何知识分子的影响,他们通常是一些已故经济学家的奴隶。”

凯恩斯实际上是在召唤工程师和数据科学家,他们幸福地意识到——有时骄傲地意识到——他们只是社会机器中的一个齿轮,很可能是某个被遗忘已久的哲学家在某本落满灰尘的旧书中虚构出来的。如果不接受这些想法,不考虑你在这个系统中的角色,你很可能成为别人乌托邦愿景中的一枚棋子。我在另一篇名为数据科学家和权力伦理的文章中进一步探讨了这一点。

人文学科发挥的其他关键功能包括:解释、发现和证明体现在技术中的 价值观 ,阐明社会政治系统的更好和更坏 愿景 ,以及探索(后)人类的本质 经验 。简而言之,如果没有人文学科的道德想象力,现代生活可能会很有效率,但却极其贫瘠,并且完全被对利润的追求所驱动。

****😗*我不是现代/后现代哲学的学者,所以请不要误以为我对这些思想家的著作的颇为独特的解释构成了这一领域专家的共识。

快速背景:黑格尔(1770-1831),马克思(1818-1883),尼采(1844-1900)

我们将要探索的许多现代法国哲学思想都深受德国哲学家的影响 G.W.F .黑格尔弗里德里希·尼采、卡尔·马克思。不简要地触及他们引入的一些关键概念,就很难给出福柯、德勒兹和其他人的后期作品的背景。因此,在接下来的内容中,我将试着列出你需要知道的东西,以便以后理解。请记住,后结构主义者倾向于避免直接论证,而倾向于发展广阔的、全面的哲学视野。他们与其说是在论证,不如说是在向读者展示现实的另一种可能性。如果我有时显得漫无边际,我道歉。

黑格尔声称发现了思维的突现逻辑。矛盾的是,概念包含相反的方面(命题和对偶),它们在更高的层次上被解决(综合)。来源:丹尼斯·斯皮维的 Pinterest

黑格尔:概念动力和模糊逻辑

很难在几个段落中公正地评价黑格尔,所以我将只关注我认为与数据科学最相关的黑格尔的一些方面。首先,黑格尔的想法暗示了对监督的机器学习解释现实的能力的概念限制。

黑格尔不喜欢二进制、非此即彼的逻辑,这种逻辑体现在机器学习中使用的传统统计学的清晰集合理论中。事物可以同时存在也可以不存在。例如,严格地说,你已经不是昨天的那个了。构成你身体的数十亿个细胞已经死亡,并被新的细胞取代。然而你们看起来是同一个人,我们用同样的名字来称呼你们。儿童特拉维斯和成人特拉维斯明显不同,但仍然是同一个人。我们如何调和这一事实?从这个角度来看,黑格尔可以被认为是洛夫蒂·扎德的模糊集合论的知识先驱,该理论假定清晰集合论是一个特例,其中集合 隶属函数仅取值 1/0。黑格尔的思辨逻辑和“可能性理论”(与概率论相对)在我看来有着共同的概念根源。**

黑格尔对科学思维逻辑的理解是内在的本质。他的意思是,概念本身包含着它们自己的否定。从表面上看,这听起来自相矛盾,违反了支撑现代概率论的排中律(某物要么是 p,要么不是 p* ),但它与许多精神概念有相似之处,如佛教中的 轮回 。*

上图通过整合这些积极和消极的内在方面,说明了概念是如何随着时间的推移而演变的。综合是一种创造性的行为,由命题和对立面在创造性的破坏行为中“消灭”彼此而产生(因此是轮回参考)。我们应该注意到,毁灭是自我实现的必要步骤。看似矛盾的东西实际上可以在一个更高的统一中得到调和,如果我们愿意继续下去的话。在数学中,我们经常发现一些抽象仅仅是一个更抽象概念的特例。例如,点积是更抽象的内积的特例。

如果我们要以绝对的形式理解精神的本质(艾斯特),矛盾不是要被避免,而是要被拥抱。

黑格尔最出名的可能是他声称历史是有逻辑的,它根据理性的秩序展开,而作为有意识的理性主体的个体人类也参与其中。对于黑格尔来说,理性和自由是联系在一起的:自由正是理性在这种理性秩序中的展开,因为它朝着总体性或独特性的点努力,在这一点上它理解自己。我们所看到的理性实际上只是理性在这个辩证旅程中的自我表达运动,表现在人类意识、人类制度、艺术作品等等。作为理性的、自我意识的生物,我们充其量只能随波逐流,但我们无法逃脱“理性的狡猾”。黑格尔有一句著名的话“历史的屠宰场”,他认为好的和坏的事件都是“绝对精神”自我实现的必然实现。理性是不可驯服的。

在我看来,欧洲大陆学派和 T2 分析学派的主要区别在于逻辑的本质。它是否如黑格尔所主张的那样具有内在的动态性和自由性?或者它能像弗雷格、怀特海和罗素所希望的那样被抑制和形式化吗?

黑格尔的科学逻辑中有一种独特的禅宗元素。根据斯蒂芬·侯盖特的《黑格尔逻辑的开篇:从存在到无限》,黑格尔对科学思维本质的探索是基于对思维自身动态的无预设观察。换句话说,黑格尔旨在通过让思想自行运动来揭示思想的本质。我们不应该像康德那样,假定思想必须被限制在某些先验的类别中。

在现代形式中,超人类运动将人类物种视为绝对精神自我实现的更大宇宙展开中的一步(所谓的 奇点 )。我们还应该指出,这种合理展开历史的思想是马克思提出的。马克思的共产主义乌托邦是人类历史的最终实现:资本主义应该只是途中的一站。

解释主义的社会科学已经被胡塞尔的现象学的类似思想所塑造,其目的是将意识的对象精确地* 作为意识的对象来研究,拒绝早期理性主义者关于精神和身体的物质可以完全分离的主张。沉浸在启蒙理性主义中的自然科学家最初可能会对黑格尔的辩证思维感到不舒服,这种思维避免了简单的二元对立自我-他者内外好-坏男女*。事实上,自我和他人之间的明确界限可以而且确实在生物和分子水平上被打破,正如那些患有自身免疫疾病的人可以证明的那样。**

自我意识和争取他人认可的斗争

黑格尔可能是第一个明确阐述认知中的自我意识和反身性的哲学家。对他来说,“他人”的认可为作为客体的自我提供了温床。换句话说,自我实现——承认自己是一个“自我”——从根本上取决于其他自主对象(人)的社会认可,这些自主对象(人)承认你是一个具有独特愿望和目标的个性化的人。我们的个人身份依赖于这种被他人认可的行为。我们不是脱离实体的笛卡尔式自我:我们是相互依存的,是嵌入社会环境中的社会性生物。

阿克塞尔·霍耐特扩展了黑格尔的观点,将边缘化群体对社会不公的哭喊解释为争取认可的斗争。根据这一观点,受压迫群体正在为获得承认和社会合法性而斗争。朱迪斯·巴特勒在她的书消除性别中,以一种强调黑格尔对模糊逻辑先驱的承诺的方式解释了争取认可的斗争:

“被称为复制品,被称为不真实,是一种可以被压迫的方式,但考虑到它比那更根本。被压迫意味着你已经作为某种主体存在,你作为主主体的可见的被压迫的他者存在,作为一个可能的或潜在的主体,但不真实又是另一回事。要被压迫,你必须首先变得可理解。发现你根本不可理解(事实上,文化和语言的法则发现你是不可能的)就是发现你还没有接近人类,发现你只是说话,并且总是好像你是人类,但感觉你不是,发现你的语言是空洞的,没有识别即将到来,因为识别发生的规范对你不利。”

从克里斯普集合论的局限来看,跨性别者和其他边缘人群是作为矛盾体出现的。我们被教导性别认同必须是非此即彼,1 或 0。像跨性别身份这样的东西的存在威胁着破坏现实的最基本的分裂,导致一些人对这种形而上学的否认产生暴力和愤怒。但是黑格尔会说,通过学会接受矛盾,我们实际上可以理解更伟大的东西。

工业化的社会效应深深影响了马克思。今天,我们正在处理算法化的社会外部性。维多利亚博物馆在 Unsplash 拍摄的照片

马克思:异化与意识形态上层建筑

作为黑格尔的追随者,马克思当然因他的《***宣言》而闻名,但他对社会科学的贡献根深蒂固,即使在今天。尽管他的许多历史预言从未实现,但他对资本主义体系和概念方法的批判仍然极具影响力。一个很好的例子,见肖莎娜·祖博夫的巨著监视资本主义

借用黑格尔的话,马克思认为历史发展有一个合理的形状或弧线,最终将在未来的某个时刻导致共产主义乌托邦,在那里被压迫的无产阶级的“枷锁”将被撕掉。同时,人们常说马克思“颠倒了黑格尔”或“颠倒了”他的思想。对于黑格尔来说,思想的动力最终解释了我们对现实的体验,这是一种被称为唯心主义的哲学立场。黑格尔有句名言,“什么是理性就是真实的,什么是真实的就是理性。但是在马克思那里,是物质的、经济的事实说明了现实。因此,当黑格尔是一个理想主义者时,马克思是一个唯物主义者。

在马克思的思想中,关于物质对象的生产方式的事实决定了社会的结构。如上所述,马克思在这个意义上是一个唯物主义者,因为他认为一个社会的物质条件(即资本家和劳动者之间的经济关系)决定了它的非物质结构。马克思主义者把生产资料称为社会赖以形成的基础。其他一切,包括所有的社会规范、道德、法律和文化都是上层建筑的一部分。

资本主义上层建筑

马克思关心的是他那个时代的工厂制度如何有效地把孤独的工人从他的劳动果实中分离出来以换取工资。这个观察很重要,因为马克思认为人类从他们的生产活动中获得意义和享受。人类本质上是劳动的产物,能够建造和创造新奇的物品来满足他们的需求。因此,资本主义统治阶级剥夺他们的劳动成果令马克思深感不安。

简而言之,资本主义疏远了人们的工作,用金钱符号取代了道德价值问题。此外,资本主义体系中组织固有的过度专业化导致了法国社会学家涂尔干在他的“失范”概念中所捕捉到的东西。在你醒着的大部分时间里,组装小配件——或者焊接 iPhone 部件——肯定不是马克思认为有利于人类繁荣的生活。

我们已经可以看到一些学者使用这种剥夺的图像来解释人们如何在谷歌和脸书等公司追求广告利润的过程中被剥夺了个人数据。如果你有兴趣阅读更多关于这种想法以及它如何应用于主要的行为大数据(BBD)平台的信息,请查看 Zuboff 的监视资本主义

尼采认为基督教道德从根本上是倒退的:它恰恰评价了那些阻止个人伟大和创造力的东西。克里斯托夫·施密德在 Unsplash 上的照片

尼采:奴隶道德和权力意志

尼采本可以成为一名伟大的数字营销者:他知道如何利用震撼价值来吸引读者的注意力。在他的经典之作《道德谱系的 T4》中,尼采对西方犹太-基督教价值观进行了强有力的批判。根据尼采的心理分析,基督教道德是建立在罗马上层社会价值观的复归之上的。受压迫的早期基督徒利用他们的“怨恨”来美化他们的社会和政治弱点。因此,温顺、平等和其他缺乏权力的表现被捧为道德理想,而事实上它们仅仅是尼采认为的流氓无产阶级的一种“奴隶道德”的表现。

尼采会说,我们西方人被这种奴隶道德所欺骗,导致了一种道德和精神发育障碍,阻止我们以最充实、最有创造性和最有激情的方式生活。从这个意义上说,这与马克思关于意识形态上层建筑的概念有着明显的相似之处,在这一概念中,资产阶级的道德已经取代了我们更基本的、工业化前的生活方式。卢梭会同意,我们现代人似乎已经失去了对生活的欲望。

众所周知,尼采是个精英主义者。例如,他信奉一种由荷马的《奥德赛》中的希腊英雄所体现的独特的、有创造力的和强大的个人的神话。在历史的大格局中,我们忘记了大众,记住了社会的伟大推动者和震撼者。我们真的只关心培养那些黑天鹅,他们的生活给后代留下了不可磨灭的印记,不管是好是坏。注意到安·兰德和她的技术沙文主义追随者的相似之处。

基于他的道德谱系,很明显,尼采认为道德价值观不是基于任何深刻的、不变的形而上学真理,而是基于统治阶级的利益和价值观。强权即公理。这种道德透视主义的思想可以追溯到苏格拉底的时代,但是尼采将它发挥到了逻辑的极致。罗伯特·所罗门在他的《与尼采一起生活》一书中解释说,透视主义是这样一种观点,即“所有的学说和观点都是片面的,并且受到特定观点的限制。”因此,我们所知道的本质上受限于我们的认知环境、感知局限、语言、社会教养等等。尼采认为,没有上帝的视角。在后面的章节中,我们会看到福柯、德里达和拉图尔复活了这个观点。**

目前,我们已经可以看到这种观点似乎如何限制了对 ML 客观性的主张,特别是当盈利性公司决定收集哪些数据时。尼采会同意原始数据是一个矛盾。然而,与此同时,尼采可能会谴责社会正义战士为实现更大的平等所做的努力,并声称这些关于人的新数据表示——无论是否有偏见——是脸书和谷歌公司权力意志的表达。我们不应该隐瞒。

福柯声称“凝视”(持续监视)的力量来自于它被内化的能力,从而创造了消费主义大众的“温顺的身体”。由paweczerwińskiUnsplash 上拍摄的照片

福柯(1926-1984):规训权力&圆形监狱,

米歇尔·福柯也许是理解当前科技领域社会公正问题的最重要的思想家。福柯真正感兴趣的是剖析和阐释权力的“无形”形式。他对国家对公民的政治镇压或暴力的明显例子不太感兴趣,而是对社会规范微妙地“生产”带有容易区分标签的主题的方式感兴趣。像尼采一样,福柯也担心墨守成规的大众对独特个体的压迫。事实上,福柯看到了统计理论的进步,随着它对理论人口的使用,作为这种对个人的压迫和他所谓的的出现的一个例子。**

对福柯来说,分类标签(例如,“精神错乱”、“男人”、“女人”、“黑人”)允许国家实现或多或少与身体暴力相同程度的一致性,但带有启蒙人文主义的色彩。与中世纪的欧洲不同,在现代社会,偏离规范的行为不是通过身体暴力来惩罚,而是通过标签和与之相关的制度来惩罚。对福柯来说,学校、监狱和医院被设计成产生温顺的身体和塑造大众。我们可以清楚地看到,福柯正在发起对现代生活方式的批判。此外,我们可以看到尼采的影响,他拒绝奴隶道德(赞美独特、强大和热情的个人)和支持行使我们与生俱来的权力意志,这有助于区分我们作为独特的个人。

福柯最著名的是通过他对圆形监狱的比喻阐明了权力的无形本质。在这种轮辐式的监狱设计中,一名中央警卫可以监视每个单独的牢房,但没有囚犯知道自己被监视着。不需要对囚犯进行身体上的虐待,狱警们可以仅仅通过凝视的可能性来实现一致性。根据福柯的说法,凝视的力量来自于它被个人内化的能力。一旦内化,凝视的功能是影响和控制个人的性情,使其在没有任何身体干预的情况下以某种方式行事。这是一种无形的力量。

作为权力表达的知识和话语

鲁哈·本雅明的新书《技术之后的种族》从福柯探索的各种观点中汲取了深刻的思想。像他之前的马克思一样,福柯关注于描述与各个社会历史时期相关的“意识形态上层建筑”,从文艺复兴时期到现代时期。结合弗洛伊德的无意识理论,福柯在他的书《事物的秩序》中称这些上层结构为知识,并着手揭示决定特定时期话语形式的无意识“规则”。认识论可以被认为是各种话语的可能性的前提条件,这些话语为知识规定了各种各样的、通常是无意识的标准。他们为什么有价值,什么没有价值,什么有价值,什么没有价值制定了规则。托马斯·库恩关于科学范式的想法是这种想法的一个很好的例子。在一个给定的范式之外,有些问题问起来甚至没有意义。

对福柯来说,支配一个时期的知识的能力才是真正的力量:这是一种塑造主体的存在主义叙事的力量,这些主体必须在给定的话语范围内运作。福柯最初认为,话语在决定我们的经验、制度和社会实践方面占据主导地位。维特根斯坦也认为,我们无法逃避这些塑造我们思维和行为的语言和社会话语。从这个结论中,我们看到了科学技术研究(STS)中的主张,例如,t 没有独立于我们的语言和认知机构的原始数据这种东西。

最后,我还应该提到,一些批评家不喜欢福柯把人的能动性从人身上去除,并把他们置于当前社会话语的支配之下的方式。如果我们无力在主流话语之外采取行动,为什么要抵制或抗议变革呢?

德勒兹对单一物体被分割和分配的方式很感兴趣,这种方式产生了新的存在形式和可能性。照片由马特·阿特兹Unsplash 上拍摄

德勒兹(1925–1995):控制、调制和个体

让我们的最后一位哲学家 Gilles Deleuze 来发表这篇文章。像他之前的福柯和尼采一样,德勒兹着迷于权力、创造性表达和视角。但是他根据计算机和数字革命的时代更新了他们的工作。

与福柯更老的“纪律社会”不同,德勒兹认为我们现在生活在“控制社会”中,这种社会通过“永久训练”(如学校)来调节人,以达到一致性。福柯描述的封闭空间现在被分布式网络所取代。纪律团体的集体/个人区别不再成立。当我们进入这个被描述为超人类时代的新技术时代时,黑格尔的辩证思维再次出现。人类和非人类之间的传统界限因此变得模糊。然而,正如我们将会看到的,这对德勒兹来说未必是件坏事。

在大数据时代,个人现在是个体,通过数据库和社交网络数字化传播。权力是通过把单一的事物分解成分散的形式来行使的。一旦物体被切割并还原成它们的组成部分,同一性的问题就不再清楚了。虽然福柯的纪律社会依靠机械物体如“杠杆、滑轮和时钟”来行使权力,但控制社会更多的是关于“能量、熵和计算机”。

按照德勒兹的说法,我们已经进入了资本主义的新阶段,在这个阶段,服务而不是产品是目标。公司已经取代了工厂。我们没有人,但是有模糊的“编码数字”,比如“股东”他们没有面孔,没有明确的身份。市场营销,而不是商品生产,已经成为“公司的中心或‘灵魂’”数字技术将个人分割开来,并找到新的方式将他们重新组合并提取价值。正如营销理论家 Cluley & Brown (2015) 解释的那样:“权力是通过操纵和从零件或微型组合中提取价值来行使的。”

根茎是德勒兹思想的一个定义性隐喻。它表明不同的物体网络可以产生新的、突现的现象。由马特·阿特兹Unsplash 上拍摄的照片

生活是不同的:去区域化和重组

德勒兹着迷于成为的过程和相关的身份概念。艺术和哲学是特殊的,因为它们允许思想在新的环境中“去中心化”。这种去地域化的过程允许我们创造新事物。德勒兹希望超越真理符合论,这种理论推动了许多传统的理性主义科学思想,使地图与领土完全分离。

如果你是一名数据科学家,你可以把“去领域化”想象成给定向量表示(这里是一个想法或概念)的基础运算(矩阵乘法)的改变。在新的“基础表征”(语境)中,我们可能会获得关于概念潜在本质的新的、以前未被注意到的洞见。

然而,如果我们抛弃了对应理论,有些人可能会担心语言将不再有任何东西可以“挂钩”,我们只会成为沮丧的虚无主义者。如果什么都不是真实的,那还有什么意义呢?德勒兹颠倒了这个结论,就像尼采在他的道德谱系中所做的那样。

德勒兹的思想并没有因为语言在本质上只是自我参照而放弃科学项目,而是颂扬了这样一个事实,即存在可以自由计算和删除的个体,而无需与真实的人有任何明确的语义联系。通过把人们从他们的数字表现中分离出来,我们可以用新的方式和他们玩。正如 CTRL-Z 给你创造你可能不敢尝试的东西的自由一样,德勒兹试图展示数字现实的这种“超然”的方面如何导致创造力和新的存在形式。

德勒兹认为哲学的目标是创造新概念。对他来说,生活就是不同。人生的目标是以不同的方式思考,变得与众不同,创造差异。我们应该感到高兴,因为我们无法将我们的经验融入福柯的纪律社会的封闭且容易束缚的结构中。德勒兹很清楚:这不是失败,而是庆祝和探索发明创造可能性的理由。哲学和艺术的目标是创造差异,而不是一致和常识。我们应该拥抱差异,因为它促进了成长的过程。

将地图从疆域中分离出来,给了我们不受现实约束的发挥、重组和创造新方式的空间。

暂时就这样了。在下一篇文章中,我将关注德里达、布迪厄和布鲁诺·拉图尔。

概率编程导论

原文:https://towardsdatascience.com/intro-to-probabilistic-programming-b47c4e926ec5?source=collection_archive---------11-----------------------

使用张量流概率(TFP)的用例

图片来源:Unsplash

什么是概率规划?

概率编程背后的思想是将来自统计的推理算法和理论与来自编程语言的形式语义、编译器和其他工具结合起来,为来自机器学习的模型和应用程序构建高效的推理评估器。换句话说,概率编程是统计建模的工具。这个想法是从编程语言的世界中借鉴经验,并将它们应用到设计和使用统计模型的问题中。

概率编程是关于使用计算机科学工具进行统计的。

关于张量流概率

在上图中,你可以看到一个典型的计算机科学编程管道:编写一个程序,指定它的参数值,然后评估程序产生一个输出。右侧说明了统计学建模的方法:从输出、观察值或数据 Y 开始,然后指定一个抽象的生成模型 p(X,Y ),通常以数学方式表示,最后使用代数和推理技术来描述给定观察值的模型中未知量的后验分布 p(X | Y)。而在概率程序设计中:一种用于模型定义和统计推理算法的程序设计语言,用于计算程序输入的条件分布,这些条件分布可能会导致观察到的程序输出。

注意:概率编程并不是编写表现概率的软件。

为了实现这样的系综结构,张量流引入了张量流概率。

张量流概率

TensorFlow Probability 是 TensorFlow 中用于概率推理和统计分析的库。作为 TensorFlow 生态系统的一部分,TensorFlow Probability 提供了概率方法与深度网络的集成、通过自动微分进行的基于梯度的推理,以及通过硬件加速(例如 GPU)和分布式计算对大型数据集和模型的可扩展性。
tensor flow-probability 中的概率机器学习工具是分不同层次构建的。在这篇博客中,我们将讨论使用 TensorFlow-probability 的统计构建模块模型构建

让我们从导入必要的模块开始:

张量流概率中的统计函数

分发-

A [tfp.distributions.Distribution](https://www.tensorflow.org/probability/api_docs/python/tfp/distributions/Distribution)是一个具有两个核心方法的类:samplelog_prob。这个类包含许多可以通过书写看到的发行版:

print_subclasses_from_module(tfp.distributions, tfp.distributions.Distribution)

让我们看看如何使用 tf-probability 对 stat101 中的正态分布进行采样,这是一个很好的开端:

# A standard normal
normal = tfd.Normal(loc=0., scale=1.) # mean=0, std=3samples = normal.sample(1000)
sns.distplot(samples)
plt.title("Samples from a standard Normal")
plt.show()'''
log of the probability density/mass function evaluated at the given sample value.
'''
print("log(PDF):",normal.log_prob(0.))

现在,为了计算其他统计参数,如累积分布函数和多重分布,我们仍然可以利用 tf 概率原生类。

# Define a single scalar Normal distribution.
dist = tfd.Normal(loc=0., scale=3.)  # mean=0, std=3# Evaluate the cdf at 1, returning a scalar.
dist.cdf(1.)# Define a batch of two scalar valued Normals.
# The first has mean 1 and standard deviation 11, the second 2 and 22.
dist = tfd.Normal(loc=[1, 2.], scale=[11, 22.])# Evaluate the pdf of the first distribution on 0, and the second on 1.5,
# returning a length two tensor.
dist.prob([0, 1.5])# Get 3 samples, returning a 3 x 2 tensor.
dist.sample([3])

使用上面的代码,你可以计算 CDFs 和多个正态分布。
在您的项目中使用统计工具时,您可能还需要声明多元分布,tf-probability 也为您提供了这方面的帮助!

mvn = tfd.MultivariateNormalDiag(loc=[0., 0.], scale_diag = [1., 1.])
print("Batch shape:", mvn.batch_shape)
print("Event shape:", mvn.event_shape)samples = mvn.sample(1000)
print("Samples shape:", samples.shape)g = sns.jointplot(samples[:, 0], samples[:, 1], kind='scatter')
plt.show()

在 tfp 模块中有很多这样的分布,对数正态分布、逻辑分布、对数正态混合分布、多项式分布、多变量正态分布等等。每一个分布都带有过多的统计推断和函数。

双喷射器-

双投影表示可逆的光滑函数。它们可用于转换分布,保留采样和计算 log _ probs 的能力。可以从[tfp.bijectors](https://www.tensorflow.org/probability/api_docs/python/tfp/bijectors)模块访问它们。

每个 bijector 至少实现 3 种方法:

  • forward
  • inverse,以及
  • forward_log_det_jacobianinverse_log_det_jacobian中的(至少)一个。

有了这些成分,我们可以转换一个分布,并仍然从结果中获得样本和日志问题!

print_subclasses_from_module(tfp.bijectors, tfp.bijectors.Bijector)

使用上面的代码片段,我们可以列出 tf-probability 中所有可用的双射函数。

现在让我们看看如何使用双对象声明一个 NormalCDF,并计算正向传播中雅可比行列式的对数。

normal_cdf = tfp.bijectors.NormalCDF()
xs = np.linspace(-4., 4., 200)
plt.plot(xs, normal_cdf.forward(xs))
plt.show()plt.plot(xs, normal_cdf.forward_log_det_jacobian(xs, event_ndims=0))
plt.show()

双投影器主要用于变换分布。这里有一个应用变换的快速示例:

# creates a Y=g(X)=exp(X) transform
exp_bijector = tfp.bijectors.Exp()# declare a Normal Distribution and Transform it
log_normal = exp_bijector(tfd.Normal(0., .5))

samples = log_normal.sample(1000)
xs = np.linspace(1e-10, np.max(samples), 200)sns.distplot(samples, norm_hist=True, kde=False)
plt.plot(xs, log_normal.prob(xs), c='k', alpha=.75)
plt.show()

运行上面的代码片段后,您会看到一个转换后的分布(蓝色的框)和概率密度估计图(黑色的曲线)

我们成功地在 Tensorflow-probability 中实现了统计推断的构建模块,现在让我们看看如何对表格时序数据使用相同的框架。

张量流概率时间序列

TensorFlow-Probability (TFP)内置了对使用结构化时间序列模型进行拟合和预测的支持。这种支持包括模型的贝叶斯推断。因为它们是内置的 TensorFlow,所以这些方法自然利用了矢量化硬件(GPU 和 TPU),可以高效地并行处理许多时间序列,并可以与深度神经网络集成。

让我们用张量流概率来解决一个时间序列问题:

导入必要的模块:

现在我们来定义一个 Co2 浓度历年(按月采样)的时间序列问题:

上述时间序列图

模型和拟合

我们将用一个局部线性趋势,加上一年中一个月的季节效应来模拟这个系列,并使用变分推断来拟合这个模型。这包括运行一个优化器来最小化一个变分损失函数,负证据下限(ELBO)。这符合参数的一组近似后验分布(实际上我们假设这些是变换到每个参数的支持空间的独立法线)。

tfp.sts预测方法需要后验样本作为输入,所以我们将通过从变分后验中抽取一组样本来结束。

运行上面的脚本后,您将看到如下图:

埃尔博损失曲线

预测

现在,让我们使用拟合模型来构建预测。我们只调用tfp.sts.forecast,它返回一个 TensorFlow 分布实例,表示未来时间步长上的预测分布。

特别是,预测分布的meanstddev给了我们一个在每个时间步长都有边际不确定性的预测,我们也可以从中抽取可能未来的样本。

现在让我们想象一下二氧化碳浓度的预测。

上述代码片段的输出

我们可以观察到,我们的模型做出的预测结果相当不错。它能够捕捉季节变化和时间序列的总体趋势,并能够在发生时预测二氧化碳浓度。

现在让我们看看二氧化碳浓度的趋势和季节性:

正如我们已经讨论过的,统计推断和工具可以通过 TFP 轻松实现。在上面的图中,我们可以像其他核心统计模块一样有效地从数据中识别趋势和季节性。

你已经到达终点了!

恭喜你!我们刚刚学习了概率规划的用途和重要性,并讨论了张量流概率中的统计工具。更不用说我们刚刚使用 Tensorflow-probability 的模型解决了一个结构化的时间序列问题!

法比亚娜 YData 的首席数据官。

通过设计使数据在保密的情况下可用。

YData 帮助数据科学团队交付 ML 模型,简化数据采集,因此数据科学家可以将时间集中在重要的事情上。

成为一名量子计算程序员

原文:https://towardsdatascience.com/intro-to-quantum-computing-a5657afaf58b?source=collection_archive---------29-----------------------

奇点研究

使用 Python 和 Qiskit

量子计算被许多人视为未来的技术。在这篇文章中,我们将看看如何在实际的量子计算机上运行一些重要的程序。特别是,我们将讨论一种叫做的图形状态。图态用于量子密码术、量子纠错和基于测量的量子计算。如果这些听起来像外语,那没关系。我们将从头到尾仔细检查每一件事…别担心,我们会保持轻松愉快。

照片由分形哈桑Unsplash 上拍摄

什么是量子计算?量子计算应该被视为 ASIC,或“专用集成电路”,如用于加速机器学习的 GPU。它们不应被视为标准“经典”计算机的替代品,如笔记本电脑、智能手机或谷歌等公司用于处理大量数据和训练机器学习模型数天的超级计算机。量子计算机是一种专门的计算资源,我们向它发送某些问题。量子计算机处理信息的方式与标准计算机中的标准二进制处理方式完全不同。他们使用类似于“干涉“”、“叠加”、“纠缠”的特性,在解决某些类型的问题时获得超越经典计算机的优势。虽然通用量子计算机可以做经典计算机可以做的任何事情,但我们有兴趣解决的问题决定了我们是否要使用量子计算机。

最受欢迎的量子计算模型是电路模型,它将量子位上的操作描述为一系列,可以用一个矩阵乘以一个向量来表示。让我们看一个例子。

首先,你需要下载免费的 Jupyter 笔记本工具,这是 Anaconda 的最新发行版(也是免费的)。下载完成后,打开 Anaconda navigator,并打开“Jupyter Lab”的一个实例。它会给你运行 Python 3 内核的选项,选择它。接下来,你会看到一个有单元格的窗口,如果你喜欢黑客风格,你可以将它切换到黑暗模式

朱庇特实验室的黑暗主题

现在,在第一个单元格中,运行以下命令来导入您需要的库。

进口

一旦你做到了这一点,创建一个“量子寄存器”和一个“经典寄存器”如下,以及一个“量子电路”。

创建一个量子电路

量子和经典寄存器应该被认为是比特和量子比特的信息通道。在这个电路中,我们有两个量子比特和两个经典比特。现在,让我们对我们的量子位进行一些操作!让我们准备一个“铃州”。贝尔态是展示纠缠的经典例子。由于爱因斯坦、波多尔斯基和罗森在一篇经典论文中对这些量子态如何呈现纠缠态的评论,它们有时被称为 EPR 态。以下代码将构建一个电路,对第一个量子位应用“哈达玛门”,对第一个和第二个量子位应用“CNOT 门”,然后绘制电路。

Qiskit 中的贝尔态电路

上述电路可以用线性代数解释如下:

贝尔电路线性代数

如果你不是线性代数专家,没关系,Python 和 NumPy 可以为我们做这些计算…

贝尔电路的数值计算

这输出了运行我们构建的量子电路所产生的状态向量。

贝尔电路的状态向量

现在,我们刚刚构造的态矢,展示了纠缠和叠加。它同时以两种状态的组合存在,不像传统的位元总是 0 和 1。特别地,我们的状态向量表示两个状态“00”和“11”的组合。因此,两个量子位在测量时要么是自旋向上要么是自旋向下,但结果是概率性的,一个是 50%的时间,另一个是 50%的时间。令人着迷的是,我们只需要测量一个量子位就可以知道另一个量子位处于什么状态!这是因为纠结。我们不需要观察第二个量子位就能知道它处于第一个量子位的任何状态。如果我们想在 IBM 量子计算机上运行这个,我们可以在(免费) IBM 量子体验中构建这个电路,使用一个交互式拖放电路编辑器。注册一个帐户,然后导航到边栏中的 circuit composer。

现在,点击“新电路”按钮。

接下来,只需将下列电路拖放到电路图上。这将准备与我们准备的相同的贝尔态,并将测量第一个量子位(带 z 的小黑米符号)。

如果运行此电路,您可以在左侧看到可能要测量的两个状态。

您可以在云中的 IBM quantum 计算机上运行该程序,并根据等待列表(该硬件上的作业数量)的长度来获取结果。就这么简单!

现在,如果你想构建一个图形状态,你可以使用我们在奇点研究用 NetworkX 写的以下函数。

您需要运行以下导入:

这个函数将定义一个图态量子电路:

如果我们在 NetworkX 中定义以下图形:

我们可以将“G”馈入“graph_state_measure(G)”函数,得到如下电路:

像这样的电路被称为图态,因为它们展示的纠缠是基于我们定义它们的图。连接电路图中两条线的粉红色“CZ 门”对应的是图中的边,图中的节点对应的是沿着电路图黑线运行的量子位。这些图态可以用在量子密码术中(见本互动笔记本)。它们也用于纠错(见本互动笔记本)。

如果你想了解更多关于量子计算的知识,如果你想通过更高级的教程来解决纠缠、熵、复杂电路和算法等问题,你可以查看奇点的 Github 页面。我们有大量的交互式笔记本,您可以在浏览器中运行,而无需下载任何东西!你也可以查阅 IBM 为 Qiskit 编写的优秀的在线书籍,它以略微不同的方式涵盖了一些类似的主题,以及一些不同的主题。请随时联系并向 thesingularity.research@gmail.com 提问。确保在你的主题中包含“黑客宇宙”,这样就不会错过这封邮件。我们可以帮助你开始使用量子技术和量子机器学习。

posted @ 2024-10-15 13:42  绝不原创的飞龙  阅读(530)  评论(0)    收藏  举报