在未来,你可能会被一个算法解雇
Photo by Adam Fossier on Unsplash
算法决定我们在 Tinder 上遇到的人,识别你的脸来打开无钥匙的门,或者在你的生产力下降时解雇你。机器被用来做出关于健康、就业、教育、重要的金融和刑事判决的决定。算法被用来决定,谁获得工作面试,谁获得捐赠器官,或者自动驾驶汽车在危险情况下如何反应。
算法反映并强化了人类的偏见
人们普遍错误地认为算法是客观的,因为它们依赖于数据,而数据不会说谎。人类认为数学模型是可信的,因为它们代表了事实。我们经常忘记算法是由人类创造的,人类选择了数据并训练了算法。源自人类的偏见不可避免地蔓延到人工智能模型中,因此,算法强化了人类的偏见。例如,谷歌图片搜索“首席执行官”产生了 11%的女性,尽管 27%的美国首席执行官是女性。
了解基于人类的偏见
虽然人工智能(AI)偏见应该始终得到重视,但指控本身不应该是故事的结尾。只要人们在开发人工智能技术,对人工智能偏见的调查就会存在。这意味着迭代开发、测试和学习,人工智能的进步可能会超出我们之前认为的可能——甚至可能会去人类以前没有去过的地方。然而,有偏见的人工智能是不能掉以轻心的,因为它可能对个人产生严重的改变生活的后果。了解偏差何时以及以何种形式影响数据和算法变得至关重要。最明显和最常见的问题之一是样本偏差,即数据收集的方式使得目标人群中的一些成员比其他人更不可能被包括在内。考虑一个法官用来做量刑决定的模型。显然,将种族因素考虑在内是不合适的,因为历史原因,非裔美国人受到的判决不成比例,这导致了统计数据中的种族偏见。但是健康保险呢?在这种情况下,判断男性不同于女性是完全正常的,但对于人工智能算法来说,这种禁止可能不是那么明显。我们,人类,对道德有一个复杂的观点,有时考虑性别等属性是好的,有时是违反法律的。
人工智能伦理的问题
数据集并不完美,它们天生就是肮脏的,现在,我们开始清理人类偏见。无论如何,关键的问题不是偏见的存在,深层的问题是缺乏对道德的共同理解,因为它实际上没有定义没有偏见应该是什么样子。这不仅仅是在计算机科学领域,而是对人类的挑战。在自动驾驶汽车背景下,关于人工智能伦理的最大在线实验之一是“电车困境”,它收集了 233 个国家的 4000 万个道德决定。不出所料,研究人员发现各国的偏好差异很大:人类对道德有不同的定义。电车问题只是理解数据科学中道德的深度和复杂性的一种简单方法,不用说,它超越了自动驾驶汽车,这导致了一个问题,即机器如何通过承认个体和跨文化的道德差异来做出“公平”的决定?我们能指望一个被人类训练出来的算法比社会更好吗?
寓意困境无人驾驶汽车必须做出决定的地方
令人毛骨悚然的事情人工智能开始自己做
承认,我们距离科幻小说的场景还有几十年,在科幻小说中,人工智能变得有自我意识并接管世界。截至今天,算法不再是静态的,它们会随着时间的推移自动修改自己的行为,这种修改会引入所谓的人工智能诱导的偏差。一种远远超越人类最初定义的进化。在某些时候,我们可能需要(或不需要)通过信任机器来接受结果?!
前进之路:为公平而设计
展望未来,我们对人工智能的依赖将会加深,不可避免地导致许多伦理问题的出现,因为人类将决策交给机器,将健康、正义和商业交给具有深远影响的算法——影响每个人。对于人工智能的未来,我们需要回答棘手的伦理问题,这需要多学科的方法,领导层的意识,而不仅仅是由技术专家来处理。数据科学知识需要发展成为未来劳动力的标准技能。与火灾类似,机器学习既强大又危险,重要的是我们要弄清楚如何促进利益和最小化伤害。由于它不仅限于与人有关的偏见,它还涉及到提供决策的透明度,澄清问责制以及维护人工智能的核心道德价值观,如平等,多样性和无歧视。在未来几年,植入道德意识和法规的能力将成为一个关键挑战,只有通过政府、学术界和企业的密切合作才能解决。不管挑战有多复杂,这是一个激动人心的时代,它将继续存在并深化人工智能革命,这有可能改善全球数十亿人的生活。
撰稿
Cyrano Chen —高级数据科学家
Joanne Chen—沟通负责人
Michael Renz —创新总监
在新的知识时代,联系总是胜过收集
“看看数据——数字不会说谎。”这是一条经常给出的建议,但却很少被理解。因为给出建议的人真正的意思是*“看看数据,想想这对我们面临的情况意味着什么。一旦你在更广阔的背景下考虑这个问题,你就会明白——并且直觉地知道——下一步该怎么做。”*这是一个非常不同的挑战,但当你试图理解一个复杂的情况时,这是一个非常有价值的挑战。只有当你意识到连接数据比收集数据更重要时,这才有可能。
为什么收集已经不够了
数据收集现在是主流。存储成本低廉,资源丰富,而且当今制造的大多数产品都是在这样的预期下完成的,即组织希望通过批量导出或自动交付等产品提供之外的方式访问其数据。尽管这种访问方式很有帮助(并且很快成为人们的期望),但大多数数据仍然是在收集数据的单一视角下查看的。当然——图形、图表和仪表板是可能的,当然也是有帮助的,但是它们通常是使用已经实施的数据创建的,并且通常只是重复已经讲述过的相同故事。创新系数低,因为连接系数也低。
但是除了这些技术上的考虑之外,还有一个更基本的原因可以解释为什么断开连接的数据没有发挥应有的作用。人类是进化的动物,在我们最基本的层面上,我们本能地在做出反应之前考虑整个情况。早期人类部落不会寻求短期利益,如果这损害了他们长期生存的机会(尽管可以说现代世界降低了我们这种类型的思维能力),因为这样做会与我们考虑环境关系的独特意识相矛盾。从技术系统收集的数据也是如此——默认情况下缺少更广泛的上下文,而上下文是理解的关键。
什么联系是可能的
数据通过连接而丰富,这提供了复杂环境的更真实的表示。当我们查看通过相关框架连接起来的数据时,我们的大脑会理解结果、依赖性以及关系的质量如何影响我们所寻求的结果。
人们有时会争论说,这种类型的思维在不连续的数据中仍然是可能的,它只需要我们在头脑中把这些片段放在一起。这是说人类可以同时处理多项任务的同一论点,但多项研究已经证实我们不能——相反,我们可以快速切换单个任务。然而,这种转换需要付出精神代价,因为每次需要做出决定时,不愿意收集所有不相关的信息,从而导致糟糕的结果。
将数据连接到一个无缝的整体视角中,消除了切换的需要。它使我们能够了解事件的促成因素并采取适当的行动。随着时间的推移,这种增强的意识导致了新知识的发展,如果将这些新知识反馈到框架中,就会产生一个独特的反馈循环,由此洞察力会产生进一步的洞察力。随着知识的共享,意想不到的合作机会出现了。创新因素随着联系的增加而增加。
联系总是相关的——尤其是涉及人类的时候
理解如何在组织中连接数据有时会很困难。随着时间的推移,人们倾向于专注于某个特定领域,这种专注会导致人们认为一种类型的数据与另一种类型的数据相关性有限。但是如果仔细观察,通常会发现这些相同的区域与其他区域有着看不见的联系和关注。连接一个组织中所有领域的数据有助于产生一个更广泛的背景,表明我们对自然和我们在其中的位置的进化理解,其中没有一个实体真正孤立存在。
对于与人际网络打交道的组织来说,更是如此。我们是紧密相连的生物,我们的行为受周围人(甚至是他们周围的人)的影响比我们认为的要大得多。这些社会联系在类型和强度上经常不同,这两者都影响着影响力和变化的流动。正确考虑这些不同的关系是做出明智决策的基础,只有当数据正确连接时才有可能。
本文首次出现在 insightabletimes.org 的https://insightabletimes . org/in-the-new-era-of-knowledge-connection-beats-collection-every time
包容是人工智能性别偏见的唯一解决方案
人工智能中的性别话题正日益成为主流。我知道这一点是因为在完成关于这个主题的硕士论文后,我的许多朋友和家人会给我发他们在这个主题上看到的文章,所以我每周至少会收到一篇。
今天发给我的这篇文章来自 ICT Works ,在我看来,它代表了许多关于这个主题的主流文章的做法——强调了一些相对众所周知的关于女性在技术领域缺乏的观点,并提出我们只需要让更多女性进入 STEM 教育。任务完成。
不幸的是,这个问题/解决方案框架过于简单,尽管这是一个非常普遍的分析,它表明问题(人工智能中的偏见=没有足够的女性开发技术)可以通过增加女性在技术领域的人数来解决。不要误解我。我们当然需要鼓励和支持,但是教育者和学生要让两性都参与 STEM。但我坚信,除非教育、工作和社会系统具有包容性,否则这不可能通过强制性别多样化来实现。
扩展标准“人工智能中的性别问题可以通过让更多女性进入技术领域来解决”论点的五个复杂性:
1/ 为什么选择了女声,至少根据我的分析,远比 CS 发展中的男性主导问题复杂。既有“硬编码”(即我们对听到女性和男性声音的方式的生物倾向),也有更多的“软编码”(即设定我们对女性/男性声音及其对我们的意义的观点的社会学条件)。我的中帖对此有更深入的探讨。
2/为了进一步补充这一点,我们不能忘记的是 Siri、Alexa、Cortana 都是纯粹为了盈利的商业产品(苹果并不真正关心社会学影响)。他们知道第一点,因为他们已经测试过了:例如:在英国,Siri 实际上是默认的男性声音,但在德国,司机拒绝在他们的宝马里使用女性声音,因为它不够“权威”。在我们的后现代主义世界中,公司对社会的影响可能比反过来更大,这意味着我们在这个“恶性循环”中有一个次要的复杂因素,即我们继续犯下社会偏见和刻板印象。
让更多的女孩接受 STEM 教育和工作远比坐在教室的椅子上要复杂得多。有证据表明,计算机科学的整个教学都是重男轻女的(也就是说,计算机科学的整个语言及其教学方式更倾向于男性对女性的“认知方式”,这实际上可能是为什么我们在技术领域没有更多女性的根源。《人工认识》这本书是对这个话题非常优秀的考查。
4/榜样。尽管该领域目前存在性别失衡,但在主流的科技历史记录中,不可否认的是忽略了女性榜样,尽管她们对该领域做出了许多贡献。迄今为止,600 个诺贝尔科学奖中只有 20 个授予了女性——2019 年的获奖者都是男性。在媒体和现实世界中看到杰出的女性成为 STEM 领导者,将是打破当前技术仅仅是男性努力的刻板印象的关键因素。
5/最后,关注“管道”问题(例如,没有足够的女性候选人)是“指责系统”的好方法,然而,它模糊了一个更大的偏见问题(有意识和无意识的),即在招聘、薪酬和留住女性方面。对超过 98 项实证研究的回顾表明,劳动力中存在系统性问题,导致女性被不成比例地排除在晋升、权威角色和高薪职位之外。此外,从某些方面来看,微妙性别歧视的险峻“男性文化”在今天的科技公司以及 Siri、Alexa 和 Cortana 的开发者中非常猖獗。
对抗多样性的最佳方式不是强迫它,而是创造和培养更具包容性的教育、社会和工作环境,在这样的环境中,每个人的声音都是同等有效的。那是一件不可能的事情——直到我们都相信它是值得的。
通过…删除数据来提高模型性能?
数据越少对机器学习越好吗?
The effect of removing low value data on predictor performance in a breast cancer dataset. Image adapted from Data Shapley: Equitable Valuation of Data for Machine Learning arXiv:1904.02868v2 [Ghorbani and Zhou].
并非所有数据都是平等的
在任何给定的数据集中,不是每个样本都对训练机器学习模型有同等的贡献。当你大声说出来的时候,这是显而易见的。一些数据可以教会一个模型很多东西。但有些会是不相干的,或者多余的,根本不会真的动针。有些甚至可能损害你的表现——比如贴错标签的数据——这将教会模型与它试图学习的相反的东西。下面是 Food-101 数据集 [1]中错误标注数据的一个例子,这是一个流行的公共数据集,包含 101 个食物类别的 101,000 张图片。
The images shown here are from the Food-101 dataset. Images in the dataset are supposed to be of the food item itself, but the first image is of a keyboard, the second is of a beer, and the third is of a food truck.
但机器学习的常见工作流程仍然是获取尽可能多的数据,对所有数据进行标记,并将所有内容输入到您的模型中。或多或少是盲目的行动。每个人都关心数据的质量,但是没有(简单的)方法以编程方式评估数据的相关性或冗余性,尤其是以模型驱动的方式。还是有?
如果有,为什么认为删除数据实际上会提高性能会令人惊讶呢?
因为确实如此。您只需移除最低值数据。要做到这一点,你需要一种评估数据价值的方法。
数据评估
有一些关于数据评估的有趣研究。其思想是查看数据集,并根据数据点相对于特定模型或预测任务的值对其进行排序。
数据沙普利
由 Ghorbani 和周撰写的《机器学习数据的公平评估》于今年早些时候出版。作者从博弈论【3】(这让劳埃德·沙普利获得了 2012 年诺贝尔经济学奖)中提取了沙普利值,并将其应用于机器学习中的数据。他们建议,公平的估价方法应满足以下条件:
- 当添加到训练数据的任何子集时,它应该给一个不改变您的 ML 系统的性能的数据点一个值零。
- 当添加到训练数据的任何子集的时,它应该通过对称给具有完全相等贡献的数据点赋予相同的值。
- 如果一个机器学习系统的价值可以分解为子系统的总和,那么数据的价值应该是那些子系统中的加法。
唯一能满足这个的物业?沙普利值。
若要计算给定数据点的 Shapley 值,您需要用包含该数据点的每个数据子集来训练模型,然后再用不包含该数据点的子集来训练模型。取性能差异,Shapley 值就是所有子集的加权平均值。
但是相对于训练数据源的数量,计算这个值需要指数级的大量计算。这就是为什么本文提出了以下估计,这些估计都是为了节省时间和计算:
- 蒙特卡罗估计;
我们可以只通过查看数据的一些子集来估计样本 i 的值。这些子集是随机抽样的,可以证明是其余数据的近似值。
2.截断:
如果 ML 模型的边缘值没有增加,则提前结束多次迭代的训练(对大型数据集有帮助)。有了以上,这就是 TMC-Shapley。
3.梯度沙普利:
将 ML 系统的价值视为通过一个时期的训练而不是通过模型的完整训练获得的性能。这是 G-沙普利。
4.沙普利集团:
组级评估是对一批数据一起进行评估,而不是对样本级别的数据进行评估。您可能希望按值对数据源进行排序,在这种情况下,您不需要关心样本级别的粒度。
这些有用吗?
以下是论文的结果,显示了移除训练数据对预测准确性的影响。
数据以四种方式评估,最高值的数据在左边被删除,最低值的数据在右边。
LOO 是 Leave-One-Out:一种更简单的估值方法,它训练整个数据集,然后训练除单个数据点之外的所有数据,并根据排除它的影响对该点进行估值。除了计算量太大之外,这种方法也不能真正处理不同数据点之间的关系。
随机将数据随机作为基线值。
正如您所看到的,删除高值和低值数据的效果远远大于随机数据。 以乳腺癌为例,删除了 40%以上的数据,预测准确率提高了 16%以上!
但是过度拟合怎么办?
如果我正在删除数据并变得更好,这是否意味着我正在删除我表现更差的数据,这难道不好吗?
不,这个想法是你只从你的训练集中删除数据。性能是在一个保留测试集上测量的,这个测试集(希望)代表了您的数据分布。这是 ML 的标准做法。
估值不会惩罚离群者,它会奖励他们。 如果你对你的测试数据集的质量和覆盖范围有信心,这种类型的评估会对出现在训练集和测试集中的任何稀有样本排名更高。通过删除冗余、不相关或错误标记的数据,不会有过度拟合的风险。
我该怎么试?
将数据工作流转变为更加模型驱动意味着通过按值对数据源、注释器和增强函数进行排序,来获取、标记和生成您所需要的数据。
我们围绕着数据评估的这一确切想法开始了Gradio——因为我们认为它将触及数据管道的每一个部分。我们正在开发一系列适用于不同环境的估值方法。如果您正在部署任何容量的机器学习,我们很乐意与您交谈。
[1] L. Bossard,M. Guillaumin 和 L. Van Gool,Food-101-用随机森林挖掘歧视性成分(2014),欧洲计算机视觉会议
[2] A. Ghorbani 和 J. Zhou,Data Shapley:机器学习数据的公平估值(2019)
[3] L. S. Shapley,N 人游戏的价值(1953),对理论游戏的贡献 2,307–317
增加 Kaggle 收入:分析用户数据以推荐最佳新产品
在这个项目中,我们将为 Kaggle(一个面向数据科学专业人士的在线社区)提供增加收入的建议。我们将分析 Kaggle 客户调查,试图了解是否有任何公司潜在收入增长的指标。为了提出我们的建议,我们将努力了解:
- “免费增值”内核产品有市场潜力吗?
- 咨询市场有市场潜力吗?
- 基于目前的用户数据,哪个更有可能盈利?
观察总结
- 超过 60%的 Kaggle 用户年收入低于 5 万美元,并且不太可能将可自由支配的收入用于更高级别的订阅。此外,超过 58%的用户在员工少于 1,000 人的公司工作。愿意投资昂贵的企业解决方案的公司似乎只是 Kaggle 当前用户群中的一小部分。
- 尽管订阅服务可以通过创造增加用户群的“战略价值”来推动长期收入,但 Kaggle 似乎不太可能通过提供免费增值产品来获得大量新用户。
- Kaggle 目前产品的用户受教育程度高,大多在美国以外,并且倾向于较低的薪酬水平。所有这些因素都可能使 Kaggle 用户成为数据科学项目高质量远程合同工作的非常有前途的候选人。
建议概要
Kaggle 的用户调查结果显示, **Kaggle 更有可能从货币化的顾问市场中获得可观的未来收入,而不是免费的核心产品。**开发一款免费的核心产品很难收回大笔投资,而且 Kaggle 目前的用户群不太可能从 GitHub 和其他现有产品中夺走大量市场份额。相比之下,鉴于他们有能力和地理上多样化的用户群,一个强大的数据科学承包商市场应该会带来更显著的收入增长。
有关本报告方法的更多详细信息和全面描述,请参见下文。
方法论
这个项目的数据来自公开发布的 Kaggle 竞赛。该调查于 2019 年 10 月 8 日至 28 日展开,反馈主要来自 Kaggle 相关渠道(电子邮件列表、社交媒体和论坛)。该调查收到了 19,717 个可用的回复,并过滤掉了所有自动标记为“垃圾邮件”的回复
所有的清理和可视化都将通过 pandas 和 NumPy 库使用 Python 编码来完成。
感兴趣区域
Kaggle 未来潜在收入来源的概要可以在 Kaggle 的创始人 Anthony Goldbloom 在 Quora.com 上发表的一篇文章中找到。在这篇文章中,Anthony Goldbloom 展示了 Kaggle 目前的几个收入来源:
- 特色比赛
- 招聘竞赛
- 研究竞赛
此外,Goldbloom 列出了 Kaggle 计划增加的几项服务,以增加收入:
- 让 Kaggle kernels 成为一项免费增值服务,公司将作为一个团队协作空间进行订阅。
- “咨询帮助的数据科学市场”
截至撰写本报告时(2019 年 11 月 25 日),这两个选项都没有在 Kaggle 网站上明显列出,因此都是潜在的收入来源。
假设
“团队协作”领域目前由 GitHub 主导,GitHub 也使用免费增值服务通过企业订阅赚钱。GitHub 最近被微软以 75 亿美元收购,收购价格很大程度上是由 GitHub 的合作网络中提供的机会推动的。根据《哈佛商业评论》的报道:
…微软支付 75 亿美元购买 GitHub 并不是为了它的赚钱能力(它的财务价值)。它为每天使用 GitHub 代码库产品的大量开发人员的访问付费(该公司的战略价值)——因此他们可以被引导到微软开发人员环境中,在那里真正赚钱。
考虑到这一点,Kaggle 的潜在收入不仅仅是基于潜在的订阅费用,而是基于 Kaggle 在该领域可以从 GitHub 获得的市场份额(如果有的话)。因此,一个合理的假设是考虑到 Kaggle 当前的客户群,Kernels 免费增值服务将比数据科学咨询市场提供更大的未来收入潜力。
所需数据
为了检验这一假设,我们需要探索:
- 当前客户的人口统计和专业知识信息
- 关于客户数据科学团队规模的信息(最有可能利用基于内核的系统)
- 关于大型预算公司(最有可能购买企业系统)雇用的用户百分比的信息
- 关于具有丰富教育和数据科学经验的用户百分比的信息(最有可能在咨询市场产生高额收入)
此外,我们将探索数据集中提供的其他人口统计数据,看看是否有任何其他潜在的假设出现。
假设
重要的是要注意这个分析中的几个关键假设。
- 调查数据代表了 Kaggle 的整体客户群。根据现有数据,不可能知道这项调查是否能代表 Kaggle 客户的总体情况。选择偏差可能以某种形式存在。然而,鉴于调查中的大量回复,它可能是本分析的可靠来源。
- 一个新的免费增值内核产品的结构将与该领域的其他产品非常相似,有一个付费订阅层和一个更大的团队企业级层。这是这个领域的领导者 GitHub 和大多数其他免费增值服务所使用的策略。
- 为了让 Kaggle 从免费的核心产品中获得可观的收入,他们需要一个有财力订阅的现有客户群。这需要一个庞大的群体,要么是有可自由支配收入的用户,要么是有预算和企业订阅需求的大公司员工。
数据清理
首先,我们导入并清理 Kaggle 提供的数据集。提供了四个数据集,我们将把它们作为单独的文件读入。“survey_schema”文件显示,并非所有问题都发给了所有参与者,这有助于理解较大数据集中的空值。
只有包含所有选择题答案的“mc_responses.csv”文件与此分析相关。
从这个数据集中,我们执行一些清理操作来为分析准备数据:
- 重新分配标题并删除第一行
- 删除重复项和“文本”响应列
- 将多项选择答案聚合到单个列中
- 重命名列标题
- 用“np”替换空值。南
经过初步探索、清理和整合,数据似乎完全由“str”对象组成,而不是数值。几个类别已经被分解成大的类别箱,这将有助于快速分析。在给定调查模式的情况下,预计后面类别中的空值数量。然而,这些类别中的大部分可能与本分析无关。
对于一些感兴趣的类别,仍然有大量的空值:' comp_size '
、' ds_teamsize '
、' use_ml '
、 ' compensation '和
’ dollars_mlorcloud ` '。然而,即使在减去空值之后,这些类别中的每一个都有超过 12,000 个数据点,这对于有意义的分析来说应该绰绰有余。
探索性数据分析
我们首先分析与我们的分析最相关的分类变量。首先,我们使用 matplotlib 库为每个变量创建一个频率表和条形图:
# Creating Age Frequency Table
age_freq = mc[‘age’].value_counts(normalize=True)
age_freq = age_freq.sort_index(axis=0)
age_freq = age_freq.reset_index()
age_freq = pd.DataFrame(age_freq)# Setting style for bar graphs
import matplotlib.pyplot as plt
%matplotlib inline# set font
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = 'Helvetica'# set the style of the axes and the text color
plt.rcParams['axes.edgecolor']='#333F4B'
plt.rcParams['axes.linewidth']=0.8
plt.rcParams['xtick.color']='#333F4B'
plt.rcParams['ytick.color']='#333F4B'
plt.rcParams['text.color']='#333F4B'# numeric placeholder for the y axis
my_range=list(range(1,len(age_freq.index)+1))fig, ax = plt.subplots(figsize=(8,5))# create for each bin a vertical line that starts at y = 0 with the length
# represented by the specific percentage.
plt.vlines(x=my_range, ymin=0, ymax=age_freq['age'], color='#007ACC', alpha=0.5, linewidth=30)# create for each bin a dot at the level of the expense percentage value
# plt.plot(my_range, age_freq['age'], "o", markersize=10, color='#007ACC', alpha=0.6)# set labels
ax.set_xlabel('Age', fontsize=15, fontweight='black', color = '#333F4B')
ax.set_ylabel('% of Respondents', fontsize=15, fontweight='black', color = '#333F4B')# set axis
ax.tick_params(axis='both', which='major', labelsize=12)
plt.xticks(my_range, age_freq['index'])# add an horizonal label for the y axis
# fig.text(-0.15, 0.5, '% of Respondants', fontsize=15, fontweight='black', color = '#333F4B')# change the style of the axis spines
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_smart_bounds(True)
ax.spines['bottom'].set_smart_bounds(True)# set the spines position
ax.spines['bottom'].set_position(('axes', -0.04))
ax.spines['left'].set_position(('axes', 0.015))# set background color
ax.set_facecolor('white')# add margin to y-axis
ax.margins(0.1, 0)# add title
fig.suptitle('Age of Survey Respondents', fontsize=18, fontweight='black')plt.savefig('age_freq.png', dpi=300, bbox_inches='tight')
EDA 可视化
在为每个变量创建频率表和图表后,我们可以对 Kaggle 数据进行一些有趣的观察。
调查答复的分布似乎有些正常,在 22-34 岁之间的比例很高。
大部分调查样本要么是数据科学家,要么是学生。这可能解释了回答者年龄分布的年轻化。由于学生不太可能在任何以咨询为基础的市场中吸引高度的价值,这将是一个有趣的领域,可以在我们的分析中用作过滤器。
受访者最有可能生活在印度或美国,其他国家的人口占总人口的比例都不超过 5%。
调查样本非常男性主导,女性受访者不到 20%。
调查样本受教育程度较高,绝大多数人至少获得了学士学位。
15%的调查受访者回答说,他们从事的数据科学工作少于 3 人。所有其他受访者都是更大的数据科学团队的一部分。最受欢迎的回应是给出的最大选项,20 人或更多成员的团队。这与我们关于基于免费增值企业的内核服务的问题非常相关。
Kaggle 用户的年薪主要由年收入低于 5 万英镑的员工决定。这是我们的“免费增值”服务提案中的一个相关事实,因为许多人个人不太可能为付费服务提供可观的利润。
超过 60%的调查受访者在过去一年中没有在机器学习或云计算上投入任何资金的公司工作。因此,他们不太可能具备使用这些技术的专业知识。
与上图类似,超过 60%的受访者拥有 2 年以上使用机器学习的经验。因此,他们在这一领域的专业知识有限。
EDA 结果
在回顾了分类变量之后,有几个重要的见解脱颖而出:
- 超过 20%的受访者是学生,因此不太可能有助于推动免费增值核心产品或咨询市场的收入。应该删除他们的信息,以进一步评估 Kaggle 这些产品的目标市场。
- 近 25%的受访者目前居住在印度,绝大多数人居住在美国以外,这使得用户更有可能参与远程咨询市场产品。
- 超过 65%的受访者目前在由 3 人或更多人组成的数据科学团队中工作,超过 20%的受访者在由 1-2 人组成的团队中工作。因此,Kaggle 的绝大多数客户已经在合作开发数据科学相关产品。
- 超过 60%的受访者年收入不到 5 万英镑。因此,他们不太可能为付费数据科学协作服务获得大量可自由支配的收入。
- 超过 60%的受访者就职的公司没有在机器学习或云计算方面投入任何资金,并且个人使用机器学习产品的时间不到 2 年。
进一步清洁
为了继续我们的分析,我们将只关注那些目前在数据科学/分析领域工作的受访者。这些受访者最有可能使用任何 Kaggle 产品,并为增加收入做出贡献。为此,我们将从数据集中删除“学生”值。
# Get names of indexes for which title is student.
indexNames = mc[mc[‘title’] == ‘Student’ ].index
# Delete these row indexes from dataFrame
mcclean = mc.drop(indexNames)
print(len(mc)-len(mcclean))
4014
我们现在已经删除了 4000 多个与我们的分析无关的回复。有了这个新的数据集,我们可以专注于探索我们的假设,即内核免费增值服务将比咨询市场提供更多的潜在收入。
分析:免费增值服务的潜力
首先,我们将探讨调整后的薪酬百分比,从样本中剔除学生(更有可能失业或未充分就业)。
在这个较小的样本中,薪酬数字仍然在很大程度上向低端倾斜。超过 60%的非学生 Kaggle 用户年收入不到 5 万英镑。这意味着他们可能不太可能为付费订阅服务获得可自由支配的收入。
接下来,我们将使用这个缩减的样本量来查看有多少受访者是大型数据科学团队的一部分,这需要在数据科学项目上进行协作。
从调查数据中剔除学生后,超过 53%的受访者属于 3 人或以上的数据科学团队,超过 23%的受访者属于 20 人以上的团队。此外,22%的人属于 1-2 人团队,这意味着在这一领域有更多的合作机会。
考虑到这个数字,似乎对合作免费增值服务感兴趣的人的总数是值得注意的。
然而,从上面的探索性分析来看,似乎大多数受访者来自在机器学习和云计算等产品上花费很少甚至没有钱的公司。为了进一步探索,我们将分析调查对象所代表的公司的规模。
根据该信息,超过 58%的调查受访者在员工少于 1,000 人的公司工作。这些公司很可能无力为员工支付企业级免费增值订阅。如上所述,由于相对较低的年薪,样本中的大多数个人也不太可能购买订阅。
这意味着 Kaggle 将依赖“中端”价格的订阅,其用户的公司规模足以支持数据科学团队,但不足以证明企业解决方案的合理性。
分析结果
鉴于 Kaggle 用户相对较低的补偿率,个人客户不太可能大量注册付费模式。由于 Kaggle 的大部分用户来自员工不到 1000 人的公司,大规模的企业订阅不太可能成为重要的收入来源。
即使考虑到免费增值内核产品通过增加整体曝光和访问可能提供的潜在价值增长,增加免费增值产品也不太可能增加 Kaggle 的整体用户群。GitHub 似乎是这个细分市场的主导者,创建和营销一个独特的免费增值服务的成本可能会高得令人望而却步。
根据对当前 Kaggle 客户群的分析,内核订阅服务不太可能为公司带来可观的新收入。
咨询市场的潜力
在考虑提供咨询市场的潜在价值时,有几个因素需要考虑:
- 品牌意识吸引了那些需要外部人才的公司。
- 有才能的用户提供有意义的解决方案。
**吸引合同雇主:**提供的数据集包括一些与这两个因素相关的有趣信息。
尽管小公司规模是推动企业订阅的负面因素,但小公司更有可能需要外部帮助来满足数据科学需求。58%的 Kaggle 用户在 1000 人以下的公司工作,52%的用户在不到 5 人的数据科学团队工作。对于这样的公司来说,一个声誉良好的基于合同的市场会非常有帮助。
此外,Kaggle 目前的收入来源主要来自公司驱动的竞争,其中一部分专门专注于为公司问题寻找创造性的众包解决方案。吸引需要外部顾问型人才的公司的潜力唾手可得。
**吸引有才华的承包商:**此外,调查数据显示,Kaggle 已经与大量潜在的合同制员工建立了联系。如上所述,超过 60%的受访者年收入不到 5 万美元,这可能是一个有用的指标,表明用户希望从基于合同的数据科学工作中获利。Kaggle 竞赛的受欢迎程度,获奖者获得现金奖励,是一个明显的指标,表明 Kaggle 很容易与潜在的数据科学承包商建立联系。
此外,Kaggle 用户中有一个高素质的子集,他们可能会要求高额合同,从而增加公司的收入潜力。
除去“学生”受访者,超过 62%的 Kaggle 用户至少拥有硕士学位,其中 16%拥有博士学位。
此外,近 25%的 Kaggle 受访者来自印度,超过 80%的受访者生活在美国以外,而且绝大多数用户可能对远程咨询机会感兴趣。
最终结论
在研究了 Kaggle 用户调查的结果后,我们最初的假设被证明是错误的。由于 GitHub 等免费协作环境的激增,以及个人或企业订阅的不太可能的客户群,免费增值服务似乎只能略微增加收入。相比之下,由于 Kaggle 与需要外部帮助的积极雇主有现成的联系,以及高技能潜在承包商的大量用户群,承包商市场可以为实施成本带来更多收入。
作为这一分析的结果,我们可以确定 Kaggle 更有可能从一个货币化的顾问市场中获得可观的未来收入,而不是一个免费的核心产品。
GitHub / Jupyter 笔记本
关于这个项目代码的完整 Jupyter 笔记本,请访问我的 GitHub 库。
使用 Scikit-Multiflow 进行增量(在线)学习
使用 scikit-multiflow 在 Python 中进行增量学习的实用介绍
Source: https://scikit-multiflow.github.io
介绍
数据就在我们身边。无论是个人资料图片、推文、传感器应用、信用卡交易、电子邮件还是新闻源,数据都在这里…并且以令人难以置信的速度生成。对于这些看似无限的数据流,一个关键的挑战是创建轻量级模型,这些模型总是能够预测和适应数据分布的变化。传统机器学习方法在这种情况下的局限性导致了在线学习(也称为增量学习)方法的发展。
在这篇文章中,我们将通过一个简单的在线分类器的实际实现,用 scikit-multiflow,一个用于数据流学习的 Python 框架,温和地介绍增量学习。
什么是增量学习?
在每次迭代中,模型预测一个类别标签,揭示真正的标签,然后更新
增量学习指的是一系列可扩展的算法,这些算法学习从无限的数据流中顺序更新模型。在“传统”机器学习中,我们得到了一个由(输入,输出)对组成的完整数据集,而在增量学习中,我们在创建模型时没有所有可用的数据。相反,数据点一次到达一个,我们必须建立一个“活的”模型,一个随着数据的到来而学习和适应的模型。增量模型具有以下特征:
- 它可以随时预测
- 它能够**适应概念漂移***——即*数据 distribution⁴.的变化举一个具体的例子,如果我们有兴趣建立一个模型来预测银行应该贷款多少钱,金融危机可能会改变金额或需要考虑的因素。在这种情况下,模型需要重新学习很多信息。
- 它能够用有限的资源(时间和内存)处理无限的数据流**。这意味着它不能像典型的机器学习方法那样存储所有的训练数据。**
在 Python 中使用数据流
既然我们已经讨论了什么是增量学习,那么让我们在 Scikit-Multiflow 中解决一个简单的例子,这是一个用于数据流学习的免费 Python 框架。
我们要做的第一件事是安装 scikit-multiflow。
pip install -U scikit-multiflow
导入数据生成器很容易,可以通过以下命令完成:
from skmultiflow.data import SEAGenerator
这里,我们将使用 SEA generator,但是还有许多其他可用的选项(详细信息请参见文档:https://scikit-multiflow.github.io/scikit-multiflow/)。SEA 生成器允许你生成一个有 6 个输入和 2 个输出的无限数据流。这个特定的数据流包含频繁的、突然的概念漂移。
使用发电机很容易。我们需要做的第一件事是如下初始化它:
stream = SEAGenerator() # create a stream
stream.prepare_for_use() # prepare the stream for use
然后,如果我们希望获得一个数据样本,我们需要做的就是
X,Y = stream.next_sample()
其中,输入 X 是 6 维 np.array,输出 Y 是 2 维 np.array。
简单在线分类器
现在,让我们为 SEA 数据流创建一个简单的分类器。scikit-multiflow 提供了许多增量模型,其中最受欢迎的是 Hoeffding 树。
胡夫丁树
赫夫丁树是使用非常快速的决策树学习器(VFDT)构建的,这是一个随时系统,它使用每个示例的恒定内存和恒定时间来构建决策树。它是由 Pedro Domingos 和 Geoff Hulten 在 2000 年引入的,它利用了一个众所周知的统计结果,Hoeffding 界限,以保证其输出与传统学习者的输出渐近相同。
在 scikit-multiflow 中,创建 Hoeffding 树的过程如下
from skmultiflow.trees import HoeffdingTreetree = HoeffdingTree()
训练用于分类的赫夫丁树
如果我们想在海洋数据流上训练树,我们可以循环通过我们想要的任意多个数据点。
correctness_dist = []for i in range(nb_iters):
X, Y = stream.next_sample() # get the next sample
prediction = tree.predict(X) # predict Y using the tree if Y == prediction: # check the prediction
correctness_dist.append(1)
else:
correctness_dist.append(0)
tree.partial_fit(X, Y) # update the tree
使用“correctness _ dist”,一个由 1 和 0 组成的数组,取决于学习者是否准确地对输入的样本进行了分类,我们可以绘制出一段时间内的准确性
import matplotlib.pyplot as plttime = [i for i in range(1, nb_iters)]
accuracy = [sum(correctness_dist[:i])/len(correctness_dist[:i]) for i in range(1, nb_iters)]plt.plot(time, accuracy)
Accuracy over time for a Hoeffding tree modeling the SEA generator
Scikit-Multiflow 的替代方法
在 scikit-multiflow 中,有一种内置的方法可以用更少的代码做完全相同的事情。我们可以做的是导入 EvaluatePrequential 类:
然后,我们可以如下设置“评估器”
evaluator=EvaluatePrequential(show_plot=True,max_samples=nb_iters)
设置 show_plot=True 选项将允许弹出窗口显示分类精度的实时图。
现在赋值器已经设置好了,我们可以使用它在 SEA 数据流上递增地训练我们的 Hoeffding 树,方法和以前一样:
evaluator.evaluate(stream=stream, model=tree)
结论
希望这篇教程已经帮助你理解了增量学习的基础。此外,我希望您现在已经掌握了如何使用 scikit-multiflow 完成基本的数据流学习任务。
参考
[1] Doyen Sahoo 等人,“在线深度学习:动态学习深度神经网络”(2017), 1711.03705
[2] Jesse Read 等人,“动态和演进数据中的批量增量与实例增量学习”(2012 年),978–3–642–34156–4 _ 29
[3] Pedro Domingos 和 Geoff Hulten,“挖掘高速数据流”(2000 年),. 3447107
[4] Maayan Harel 等人,“通过重采样进行概念漂移检测”(2014), citation.cfm
Python 中的独立分量分析(ICA)
Photo by ThisisEngineering RAEng on Unsplash
假设你在一个家庭聚会上和一个可爱的女孩聊天。当你听的时候,你的耳朵会被屋子里不同人群之间的对话和背景音乐的声音所包围。然而,这并不妨碍你专注于女孩在说什么,因为人类拥有区分声音的天赋。
然而,如果这是电影场景的一部分,我们用来记录对话的麦克风将缺乏必要的能力来区分房间里的所有声音。这就是独立成分分析,或简称 ICA 发挥作用的地方。ICA 是一种用于将多变量信号分离成其基本分量的计算方法。使用 ICA,我们可以从多个信号的融合中提取出想要的成分(即你和女孩之间的对话)。
独立分量分析(ICA)算法
在高层次上,ICA 可以分为以下几个步骤。
- 通过减去平均值使 x 居中
- 变白 x
- 为去混合矩阵 w 选择一个随机初始值
- 计算 w 的新值
- 正常化 w
- 检查算法是否收敛,如果没有,返回步骤 4
- 取 w 和 x 的点积,得到独立的源信号
美白
在应用 ICA 算法之前,我们必须首先"白化"我们的信号。“白化”一个给定的信号意味着我们以这样一种方式对其进行变换,即消除其分量之间的潜在相关性(协方差等于 0),并且每个分量的方差等于 1。另一种看待它的方式是白化信号的协方差矩阵将等于单位矩阵。
Identity Matrix
Covariance Matrix
我们着手白化信号的实际方法包括协方差矩阵的特征值分解。相应的数学方程可以描述如下。
其中 D 是特征值的对角矩阵(每个λ是协方差矩阵的特征值)
**
并且 E 是特征向量的正交矩阵
一旦我们完成了对信号的预处理,对于每个分量,我们更新去混合矩阵 w 的值,直到算法收敛或者达到最大迭代次数。当 w 与其转置的点积大致等于 1 时,认为达到了收敛。
在哪里
Python 代码
让我们看看如何使用 Numpy 在 Python 中从头开始实现 ICA。首先,我们导入以下库。
*import numpy as np
np.random.seed(0)
from scipy import signal
from scipy.io import wavfile
from matplotlib import pyplot as plt
import seaborn as sns
sns.set(rc={'figure.figsize':(11.7,8.27)})*
接下来,我们定义g
和g’
,我们将使用它们来确定 w 的新值。
*def g(x):
return np.tanh(x)def g_der(x):
return 1 - g(x) * g(x)*
我们创建一个函数,通过减去平均值来确定信号的中心。
*def center(X):
X = np.array(X)
mean = X.mean(axis=1, keepdims=True)
return X- mean*
我们使用上述方法定义一个函数来白化信号。
*def whitening(X):
cov = np.cov(X) d, E = np.linalg.eigh(cov) D = np.diag(d) D_inv = np.sqrt(np.linalg.inv(D)) X_whiten = np.dot(E, np.dot(D_inv, np.dot(E.T, X))) return X_whiten*
我们定义一个函数来更新去混合矩阵 w 。
*def calculate_new_w(w, X):
w_new = (X * g(np.dot(w.T, X))).mean(axis=1) - g_der(np.dot(w.T, X)).mean() * w w_new /= np.sqrt((w_new ** 2).sum()) return w_new*
最后,我们定义调用预处理函数的 main 方法,将 w 初始化为某个随机的值集,并迭代更新 w 。同样,收敛可以通过理想的 w 将是正交的这一事实来判断,因此 w 乘以其转置将近似等于 1。在计算出每个分量的最佳值 w 之后,我们将得到的矩阵与信号 x 进行点积,从而得到信号源。
*def ica(X, iterations, tolerance=1e-5):
X = center(X)
X = whitening(X)
components_nr = X.shape[0]W = np.zeros((components_nr, components_nr), dtype=X.dtype)for i in range(components_nr):
w = np.random.rand(components_nr)
for j in range(iterations):
w_new = calculate_new_w(w, X)
if i >= 1:
w_new -= np.dot(np.dot(w_new, W[:i].T), W[:i])
distance = np.abs(np.abs((w * w_new).sum()) - 1)
w = w_new
if distance < tolerance:
break
W[i, :] = w
S = np.dot(W, X)
return S*
我们定义一个函数来绘制和比较原始信号、混合信号和预测信号。
*def plot_mixture_sources_predictions(X, original_sources, S):
fig = plt.figure() plt.subplot(3, 1, 1)
for x in X:
plt.plot(x)
plt.title("mixtures") plt.subplot(3, 1, 2)
for s in original_sources:
plt.plot(s)
plt.title("real sources") plt.subplot(3,1,3)
for s in S:
plt.plot(s)
plt.title("predicted sources")
fig.tight_layout()
plt.show()*
为了前面的例子,我们创建了一个人工混合不同源信号的方法。
*def mix_sources(mixtures, apply_noise=False):
for i in range(len(mixtures)):
max_val = np.max(mixtures[i])
if max_val > 1 or np.min(mixtures[i]) < 1:
mixtures[i] = mixtures[i] / (max_val / 2) - 0.5
X = np.c_[[mix for mix in mixtures]]
if apply_noise:
X += 0.02 * np.random.normal(size=X.shape)
return X*
然后,我们创建 3 个信号,每个信号都有自己独特的模式。
*n_samples = 2000
time = np.linspace(0, 8, n_samples)
s1 = np.sin(2 * time) # sinusoidal
s2 = np.sign(np.sin(3 * time)) # square signal
s3 = signal.sawtooth(2 * np.pi * time) # saw tooth signal*
在前面的例子中,我们计算矩阵 A 和信号的点积,以获得所有三者的组合。然后,我们使用独立分量分析将混合信号分离为原始源信号。
*X = np.c_[s1, s2, s3]
A = np.array(([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]]))
X = np.dot(X, A.T)
X = X.T
S = ica(X, iterations=1000)
plot_mixture_sources_predictions(X, [s1, s2, s3], S)*
接下来,我们使用 ICA 分解实际音轨的混合,并绘制结果。如果你想亲自尝试,你可以在这里获得音频样本。我鼓励你实际尝试听不同的音轨。
*sampling_rate, mix1 = wavfile.read('mix1.wav')
sampling_rate, mix2 = wavfile.read('mix2.wav')
sampling_rate, source1 = wavfile.read('source1.wav')
sampling_rate, source2 = wavfile.read('source2.wav')
X = mix_sources([mix1, mix2])
S = ica(X, iterations=1000)plot_mixture_sources_predictions(X, [source1, source2], S)wavfile.write('out1.wav', sampling_rate, S[0])
wavfile.write('out2.wav', sampling_rate, S[1])*
Sklearn
最后,我们看看如何使用 ICA 的scikit-learn
实现来达到同样的结果。
*from sklearn.decomposition import FastICAnp.random.seed(0)
n_samples = 2000
time = np.linspace(0, 8, n_samples)s1 = np.sin(2 * time)
s2 = np.sign(np.sin(3 * time))
s3 = signal.sawtooth(2 * np.pi * time)S = np.c_[s1, s2, s3]
S += 0.2 * np.random.normal(size=S.shape)
S /= S.std(axis=0)
A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]])
X = np.dot(S, A.T)ica = FastICA(n_components=3)
S_ = ica.fit_transform(X)fig = plt.figure()models = [X, S, S_]names = ['mixtures', 'real sources', 'predicted sources']colors = ['red', 'blue', 'orange']for i, (name, model) in enumerate(zip(names, models)):
plt.subplot(4, 1, i+1)
plt.title(name)
for sig, color in zip (model.T, colors):
plt.plot(sig, color=color)
fig.tight_layout()
plt.show()*
附带的 Jupyter 笔记本可以在这里找到。
深度:逐层相关性传播
深入 LRP 解释神经网络预测。
Predicting 5 seems to be related to an open loop at the bottom and a straight stroke at the top.
分层相关传播(LRP)是可解释机器学习(XML)中最重要的方法之一。这篇文章将会给你一个关于 LRP 的细节和一些实现它的技巧的好主意。内容很大程度上是基于本书第章。
为了让你对 LRP 的潜力垂涎三尺,先来看看这个互动演示。
LRP 的目的是为任何神经网络在其输入域中的输出提供一个解释。例如,如果你的网络从乳房 x 光片(乳房组织的图像)中预测出癌症诊断,那么 LRP 给出的解释将是原始图像中的哪些像素有助于诊断以及在多大程度上有助于诊断。这种方法不与网络的训练相互作用,因此可以很容易地将其应用于已经训练好的分类器。
XML 方法在安全关键领域特别有用,在这些领域中,从业者必须确切地知道网络在关注什么。其他用例是网络(错误)行为的诊断、科学发现和改进网络架构。你可以在 my short primer 中阅读 XML 的高级介绍以及它为什么有用。
逐层相关性传播
直观地说,LRP 所做的是,它使用网络权重和前向传递创建的神经激活,通过网络将输出向上传播到输入层。在那里,我们可以看到哪些像素真正影响了输出。我们将每个像素或中间神经元的贡献大小称为“相关性”值 R 。
LRP 是一种保守技术,这意味着任何输出 y 的幅度在反向传播过程中都是保守的,并且等于输入层的关联图 R 的总和。该属性适用于任何连续的层 j 和 k ,并且适用于输入和输出层的传递性。
记住那个属性,让我们一步一步来。假设我们的网络是一个分类器,它的输出是一个大小为 M 的向量,其中每个条目对应于 M 个类中的一个。在输出层,我们选择一个我们想要解释的神经元或类。对于这个神经元,相关性等于它的激活,输出层中所有其他神经元的相关性为零。例如,如果我们想使用 LRP 找出网络神经元和输入与预测类别 c 的相关性,我们从类别 c 的输出神经元开始,只查看网络如何得出该神经元的值。
从那里开始,我们通过遵循这个基本的 LPR 规则来回溯网络:
LRP-0
这里, j 和 k 是任意连续层的两个神经元。我们已经知道输出层中的相关性 R ,因此我们将从那里开始,并使用该公式迭代计算前一层的每个神经元的 R 。 a 表示各自神经元的激活, w 是两个神经元之间的权重。
这是最简单的 LRP 法则。根据您的应用程序,您可能想要使用不同的规则,这将在后面讨论。所有这些都遵循相同的基本原则。
这个公式是什么意思?分数的分子是神经元 j 对神经元 k 的影响量(对于有效 ReLU 的线性情况也是如此)。为了加强上述守恒性质,这必须除以下层所有神经元贡献的总和。我们通常在分母上加一个非常小的常数ϵ,使分数更稳定。外和超过 k 意味着神经元 j 的相关性由其对下一层所有神经元 k 的影响之和乘以这些神经元的相关性决定。
我们可以简单地从最后一层一直到第一层。取决于我们选择从什么输出神经元开始,我们可以得到任何类的解释。因此,我们甚至可以检查网络认为什么与预测任何类别 A 相关,即使它实际上预测了类别 B !
可以这样分析的网络结构没有很强的限制。例如,LRP 也非常适合 CNN,而可以用于 LSTMs 。但是,要求网络只包含 ReLU 激活功能。
希望你已经看到,基本原理很简单。为了让你更好地理解我们应用这个公式时的过程,我将把它解释为一个 4 步的过程——遵循下表中原始作者的过程。
Table from “Layer-Wise Relevance Propagation: An Overview”
第一步确定较高层中每个神经元的影响总和,类似于改进的正向传递。请注意,对于 ReLU 层,它与通过网络的正常正向传递相同,只是我们添加了一个小的常数ϵ,并在我们的权重周围包裹了一个函数ρ。这个ρ只是为了使公式更通用,包括我们后面会看到的所有可能的 LRP 规则。在我们之前的例子中,ρ是恒等函数,这意味着我们可以忽略它。
请注意,求和会在较低层的每个神经元 j 上进行,也会在偏置神经元上进行。在接下来的所有步骤中,偏差将被忽略,因为我们希望相关性只流向输入神经元,而不是在静态偏差神经元中结束。
在的第二步中,我们简单地用之前计算出的 z 值除以更高层中每个神经元的相关性。这确保守恒性质成立。
在第三步中,我们为前一层中的每个神经元计算一个量 c ,因此它可以被看作是一个反向传递。这个 c 可以粗略地看作有多少相关性从后续层向下流到神经元 j 。
最后,在第四步中,来自上面的相关性与神经元的激活相乘,以计算其自身的相关性。直觉上,如果 1)一个神经元具有高激活,并且 2)它对更高层的相关神经元贡献很多,则该神经元是相关的。
现在你应该已经能够自己实现 LRP 了!下一节将对此有所帮助。如果您只是想开箱即用,请注意已经有了优秀的实现。
实现技巧
当第一次介绍时,LRP 的作者提供了一个伪代码片段,它将通过网络一层一层地计算相关性,类似于我们前面看到的。(查看这个简短的教程来实现这个基础版本。)随着他们自己应用 LRP 的经验越来越丰富,他们出版了一个更有效的方法。
关键部分是利用高效的自动签名框架,如 pytorch 或 tensorflow 来为我们做反向传递。
From “Layer-Wise Relevance Propagation: An Overview”
与我们上面看到的公式的最大区别是,我们将计算 c 值作为梯度计算。
这允许我们利用高效的自动反向操作。为了解决这个问题并给出正确的结果,我们必须将 s 视为常数。这由。上面代码中的数据。
不同的规则
需要注意的是,LRP 有不同的传播规则,您可能希望将其中几种规则结合起来以获得最佳结果。幸运的是,这里有一个最重要的规则的简洁列表,以及何时使用它们的建议。
**输入层:**对于图像,LRP 的作者在深度泰勒分解论文中介绍了选择规则,并采用以下形式:
LRP-z
这里 l 和 h 分别是最低和最高的容许像素值。
**较低层:**这里我们希望解释更流畅,噪音更少,因为这些层已经非常接近我们人类将看到的并且必须理解的关联图。出于这个目的,我们可以使用 LRP-γ规则,该规则不成比例地倾向于正面证据而不是负面证据:
LRP-γ
**更高层:**上面的 LRP-γ或者下面的 LRP-ϵ规则在这里都可以很好地工作。它们从相关性图中去除了一些噪声。特别是,ϵ将吸收一些小的或矛盾的证据。
LRP-ϵ
输出层:这里我们理想地使用未修改的 LRP-0 规则。
规则甚至比这些更多,但是您在这里看到的规则对于大多数应用程序来说已经足够了。如果选择正确的规则对你来说过于复杂,不要担心!仅仅 LRP-0 和 LRP-ϵ应该可以让你走得很远,一旦你得到了这些规则的解释,你就可以决定是否花时间去试验其他的规则,让解释更漂亮。为了对不同的规则有一点直觉,我建议用互动演示来体验一下。
有这么多可能的规则也意味着你应该对 LRP 和类似技术之间的比较持保留态度,因为这些通常只根据基本的 LRP-0 规则进行。
应用程序
本节旨在简要给出一些成功应用 LRP 的例子。
Lapuschkin 等人利用该技术研究了从图像数据预测性别和年龄的网络。
Thomas 等人将该技术应用于大量 fMRI 神经成像数据,从 3D 数据中解释大脑状态。
Arras 等人将 LRP 应用于文本,研究神经网络如何将文本分类为属于一个或另一个主题。
霍斯特等人用 LRP 分析人类的步态模式。
Srinivasan 等人使用 LRP 找出视频中的哪些部分被分类器用于人体动作识别。
蒙塔冯等人在。将 LRP 应用于雅达利游戏和图像分类。
相关著作
既然您已经对 LRP 的内部运作有了很好的了解,那么提到相关的技术也是公平的。总括术语可解释的人工智能或可解释的人工智能可用于许多不同的技术。在这里,我将只指出一些与 LRP 密切相关的问题。
泽勒和弗格斯在 2014 年发表了一篇开创性的论文,用去进化网络可视化神经元激活。
Simonyan 等人在 2014 年发表了另一篇重要论文,基于泰勒分解计算显著图。
Springenberg 等人很快发表了导向反向传播。
张等()引入了激励反向传播,将反向传播视为一个概率过程。
Ramprasaath 等人为 CNN 引入了 Grad-Cam。
Sundararajan 等人介绍了积分梯度法。
在 LRP 的基础上由巴赫等人、蒙塔冯等人创立了深度泰勒分解。
感谢您的阅读!希望你学到了有用的东西。
熊猫系列最佳实践索引
何时以及如何执行有效的索引
Video Version of the story | By author
声明:这篇文章不会让你成为
***Pandas.Series***
方面的专家。这本身就是一篇文章要涵盖的非常广泛的主题。为此,我会推荐你阅读一本书或***Pandas***
文档。但是,我可以告诉你的是,这篇文章将让你在学习机器的旅程中离开地面。
在这篇文章中,我们将讨论一些在[Pandas.series](/pandas-series-a-part-of-the-backbone-for-machine-learning-in-python-c6a5003836c7)
中执行索引的最佳方法。众所周知,Pandas.series
中的索引不必是整数。在以下示例中,我们使用字符串作为索引:
import pandas as pd
george = pd.Series([10, 7],
index=['1968', '1969'],
name='George Songs')george
输出
这里,变量george
的索引类型是对象(熊猫表示字符串索引条目是对象)
george.index
输出
→**.is_unique**
**——**这是判断一个指标是否有重复的功能。
dupe = pd.Series([10, 2, 7],
index=['1968', '1968', '1969'],
name='George Songs')dupe.index.is_uniquegeorge.index.is_unique
输出
False
True
S 类似于NumPy
数组,一个Series
对象可以沿着轴被索引和切片。
george[0]
输出
10
索引规则有些复杂。它们的行为更像一个字典,但是在使用字符串索引标签(而不是基于整数的索引)的情况下,行为退回到 Python 列表索引。
george['1968']
输出
10
这个系列也可以通过位置(使用整数)进行索引,即使它有字符串索引条目!第一项位于 0 键,最后一项位于-1 键:
george[0]
george[-1]
输出
10
7
注意:如果索引已经使用整数标签,那么回退到基于位置的索引不起作用!:
george_i = pd.Series([10, 7],
index=[1968, 1969],
name='George Songs')george_i[-1]
输出
→ **.loc**
和**.iloc**
— 通过索引关闭.loc
和.iloc
属性来访问优化的数据访问方法。这两个属性分别允许基于标签和基于位置的索引。
当我们对.iloc
属性执行索引操作时,它会基于索引位置进行查找(在这种情况下,pandas 的行为类似于 Python 列表)。如果该位置没有索引,pandas 将引发一个索引错误:
george.iloc[0]
george.iloc[-1]
george.iloc[4]
george.iloc['1968']
输出
10
7
除了提取单个项目之外,我们可以像在普通 Python 中一样进行切片,并且您还可以将索引位置列表传递给索引操作:
george.iloc[0:3]
george.iloc[[0,1]]# both statements above will give the same output
输出
.loc
应该基于索引标签而不是位置。因此,它类似于基于 Python 字典的索引。虽然它有一些额外的功能,因为它可以接受布尔数组、切片和标签列表(这些都不适用于 Python 字典):
george.loc['1968']
george.loc['1970']
george.loc[0]
george.loc[['1968', '1970']]
george.loc['1968':]
输出
10
如果你被 .loc
和弄糊涂了。记住这一点。iloc 基于索引(从 I 开始)位置。。loc 基于标签(以 l 开头)。
→ **.at**
和****.iat**
—.at
和.iat
索引访问器类似于.loc
和.iloc
。不同的是,当拉出一个重复值时,它们将返回一个numpy.ndarray
,而.loc
和.iloc
返回一个序列。**
george_dupe = pd.Series([10, 7, 1, 22],
index=['1968', '1969', '1970', '1970'],
name='George Songs')george_dupe.at['1970']
george_dupe.loc['1970']
输出
array([ 1, 22])
→**.ix**
**——**它类似于[]
分度。因为它试图支持基于位置和基于标签的索引。
george_dupe.ix[0]
george_dupe.ix['1970']
输出
10
限幅
S 可以对指标属性.iloc
和.loc
进行 licing。切片试图提取一系列索引位置,结果是一个序列,而不是单个索引位置的标量项。
切片采用[start]:[end][:stride]
的形式,其中 start、end 和 stride 是整数,方括号表示可选值。下表解释了.iloc
的切片可能性:
**Slice, Result** 0:1, First item
:1, First item(since default start is 0 & last index non-inclusive)
:-2, From start until second to last item
::2, From start to end every second item
以下示例返回从索引位置 0 到(但不包括)索引位置 2 的值:
george.iloc[0:2]
输出
布尔数组
使用布尔运算结果的切片被称为布尔数组。它返回一个经过筛选的序列,对该序列进行布尔运算。
mask = george > 7
mask
输出
当掩码与索引操作结合使用时,它返回一个序列,其中只返回与 True 位置相同的项目。
george[mask]
输出
多个布尔运算可以与这些运算相结合。
**Operation, Example** And, x[a & b]
Or, x[a | b]
Not, x[~a]
使用布尔运算符时,注意运算符优先级,以避免在()中包含运算。
mask2 = george <= 2
george[mask | mask2]
输出
我们看了指数。通过索引操作,我们可以从序列中提取值。因为可以通过位置和标签提取值,所以索引可能有点复杂。使用.loc
和.iloc
可以让你对索引操作更加清晰。我们也可以使用切片来提取值。此外,我们还可以使用布尔数组来过滤数据。
我将免费赠送一本关于一致性的电子书。在这里获得你的免费电子书。
这个关于索引的帖子在**Pandas.series**
到此结束。我希望你喜欢这篇文章。
如果你喜欢阅读这样的故事,那么你应该 在你的收件箱 中获得我的帖子,如果你想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金,不需要你额外付费。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
tarun-gupta.medium.com](https://tarun-gupta.medium.com/membership)
感谢阅读。要阅读更多文章,请访问此处:
[## 标记故事列表的快速链接—感谢您的访问
我也有一份以快节奏出版为目标的出版物。读书成为作家。
tarun-gupta.medium.com](https://tarun-gupta.medium.com/thank-you-for-visiting-my-profile-9f708062c75e)
印度空气质量数据分析
健康影响研究所(Health Effects Institute)关于印度空气污染的报告(2018)称,2015 年,空气污染导致印度 110 万人死亡。
空气污染是指污染物释放到空气中,对人类健康和整个地球都有害。
今天,空气污染已经成为任何国家都要解决的重大问题之一。在南亚,它被列为第六大最危险的杀手。如果一个人一开始没有经历过某个问题,他/她就不会意识到它的有害影响。
以德里为例,排灯节后,我们都经历过在持续约一周的“致命”烟雾中吸入空气的感觉。市民被告知不要离开他们的家,并被要求外出时戴上口罩。看着窗外,让我觉得自己好像生活在一个毒气室。能见度低,死亡人数多等。是污染的影响。
作为一名数据分析和数据科学爱好者,我决定分析我自己国家的空气质量数据,以找到一些潜在的原则或模式,这些原则或模式可能会让我深入了解问题有多严重,我必须说这些结果值得分享。所以,我写这篇文章来分享我的方法和我对数据的分析,同时也让人们意识到我们国家面临的巨大问题。
方法
以下数据分析用 python 进行,代码可从 Github 库下载:空气质量分析
数据
该数据是印度环境和森林部以及中央污染控制委员会根据国家数据共享和可访问性政策(NDSAP)发布的历史每日环境空气质量数据的更干净版本。
数据集包含以下特征:
- 车站代码:车站代码。每个记录数据的站点都有一个代码。
- 采样日期:记录数据的日期。
- 状态:表示测量空气质量数据的状态。
- 位置:代表测量空气质量数据的城市。
- 机构:测量数据的机构名称。
- 类型:进行测量的区域类型。
- so2 :测得的二氧化硫的量。
- no2 :测得的二氧化氮量
- rspm :测得的可吸入悬浮颗粒物。
- spm :测量悬浮颗粒物。
- location _ monitoring _ station:表示监控区域的位置。
- pm2_5 :表示颗粒物的测量值。
- 日期:表示记录的日期(是‘采样 _ 日期’功能的更简洁版本)
为什么有这些功能?
SO₂:二氧化硫是一种气体。它是空气中的主要污染物之一。它是无色的,并且有一种令人讨厌的、刺鼻的气味。
它毫不费力地与其他化学物质结合,形成有害物质,如*硫酸、*等。
二氧化硫被吸入后影响人体健康。它会刺激鼻子、喉咙和气道,导致咳嗽、喘息、呼吸急促或胸部紧绷感。如果接触二氧化硫,最有可能出现问题的是患有哮喘或类似疾病的人。此外,大气中二氧化硫的浓度会影响植物群落和动物的栖息地适宜性。
吸入二氧化硫会导致呼吸道症状和疾病增加、呼吸困难和过早死亡。
还会造成酸雨。
NO₂ :二氧化氮是一种红棕色气体,带有刺鼻、辛辣的气味。
它会导致支气管收缩、炎症、免疫反应减弱,并可能对心脏产生影响。直接接触皮肤会导致刺激和灼伤。
下面大致介绍一下二氧化氮对健康的影响:
10-20 ppm 会引起对鼻子和喉咙的轻度刺激
25-50 ppm 会引起水肿导致支气管炎或肺炎
浓度超过 100 ppm 会导致死亡由于窒息体内的液体高浓度的 NO₂会损害植物,包括叶子受损和生长减缓。会使植被更容易受到病害和冻害。
长时间暴露于高浓度的 NO₂可能会导致哮喘的发生,并可能增加呼吸道感染的易感性。
颗粒物:这些也被称为大气气溶胶粒子、大气颗粒物、颗粒物(PM) 或悬浮颗粒物(SPM)。 这些是悬浮在大气中的微观固体或液体物质。
微粒是最致命的空气污染,因为它们能够未经过滤就深入肺部和血流,导致永久性 DNA 突变、心脏病发作和过早死亡。
2016 年,全球暴露于 PM 2.5 导致了 410 万人死于心脏病和中风、肺癌、慢性肺病和呼吸道感染。总体而言,环境颗粒物是全球过早死亡的第六大风险因素。
互联网上充斥着上述污染物的有害影响,因此当讨论空气污染时,它们成为分析和考虑的重要因素。
回到分析上来。
数据探索 让我们获得一些关于数据的见解——每一列中条目的数量、每一列中条目的类型等等。
从上图中,我们看到我们的数据集中有 435742 个条目。我们还看到我们只有两种数据类型:float 和 object。pm2_5 的数值很少。
现在,让我们检查空值。
Null values in the dataset
似乎我们在一些列中有很多空值。查看该图,我们看到 pm2_5 具有非常少的非空值,并且它可能无法贡献太多。stn_code、agency、spm 也用空值填充。
让我们停下来看看这些特性有多大帮助。如果我必须分析印度的空气污染数据,那么我需要考虑为我提供数据的机构的名称吗?不,因为这个机构的名字与这个州的污染程度无关。同样, stn_code 也是不必要的。
数据描述中给出了日期是采样 _ 日期属性的更清晰的表示,因此我们将通过移除后者来消除冗余。
location _ monitoring _ station属性也是不必要的,因为它包含了监测站的位置,我们在分析时不需要考虑它。
因此,总的来说,我们将从数据集中删除以下要素:
机构、stn_code、sampling_date 和location _ monitoring _ station。
让我们看看还剩下什么
Dataset after removing the unnecessary columns
现在让我们考虑一下型的特征。
表示记录数据的区域类型,如工业区、住宅区等。
让我们看看考虑了多少种类型的区域:
Different categories in the type attribute
似乎我们有多余的类型。请看上图,可以说一个给定的区域可以分为三类:工业区、住宅区、其他区。
所以,我们必须去掉这个冗余,让类更干净。
我已经简化了类型属性,使其只包含上述三个类别中的一个。
输入属性后改变类别:
现在看起来好多了,也干净多了。我们可以使用 cat 图来可视化类型属性。
the plot of Number of entries vs Categories in the type column
看上面的图,我们可以说数据是在居民区附近记录的,因为它有最多的条目。这是显而易见的,因为人们更关心人们居住的地方。
现在让我们考虑空值。
我们在*类型、*和 so2 中有几个空值,因此我们将删除这三个属性中每一个都有空值的行。
现在让我们看看我们的数据是什么样的:
Dataset after deleting the rows which had null values in so2, location
我们可以看到剩下 396157 个值,所以我们没有删除非常多的值。
删除三列中的空值而不是输入,这只是我个人的偏好。人们可以估算这些空值;然而,估算像 pm2_5 这样具有大量空值的列是一种不好的做法。
数据可视化
让我们用柱状图按降序画出不同状态下的 so2 浓度。
barplot of so2 vs states
从上图中,我们看到北阿坎德邦的二氧化硫水平最高,昌迪加尔邦最低。
北阿坎德邦、锡金邦、贾坎德邦、古吉拉特邦、马哈拉施特拉邦、查提斯加尔邦——政府应采取措施应对这些邦不断增长的二氧化硫浓度。
让我们通过绘制 so2 浓度的位置(城市)来更深入地了解:
barplot of so2 vs location for 50 sites with highest so2 concentrations
上图显示了 50 个二氧化硫含量最高的地方,按降序排列。
我们可以看到,Dharudhera 的 so2 浓度最高,位于哈里亚纳邦,其次是贾坎德邦的 Jamshedpur。
另一方面,Amlai(中央邦)和 Sindri(恰尔肯德邦)的二氧化硫浓度在前 50 个地区中最低。
现在让我们画出 so2 浓度最低的 50 个地点:
barplot of so2 vs location for 50 places with least so2 concentrations
我们可以看到,位于喀拉拉邦的 Kottayam 的二氧化硫水平最低,正如我们从二氧化硫与邦的柱状图中看到的那样,喀拉拉邦是二氧化硫浓度最低的邦之一。事实上,Malappuram(喀拉拉邦)、Konark(奥里萨邦)、dawki(梅加拉亚邦)……Nala garh(喜马偕尔邦)、Naharlagun(阿鲁纳恰尔邦)和 Kalyani(西孟加拉邦)的二氧化硫浓度几乎相同。
现在让我们看看 no2 的浓度:
barplot of no2 vs state
从图中可以清楚地看出,西孟加拉邦的 no2 含量最高,而那加兰邦的 NO2 含量最低。德里(首都)排名第二,其次是贾坎德邦。
过去几年里,德里因空气污染,尤其是二氧化氮浓度问题多次成为头条新闻,这并不奇怪。
让我们更深入地看看哪些地方受影响最大:
barplot of no2 vs location for 50 sites with highest no2 concentrations
上图显示了 50 个二氧化氮水平最高的地方。
我们可以看到,豪拉(西孟加拉邦)的 no2 浓度最高,其次是巴德拉布尔(马哈拉施特拉邦)和杜尔加布尔(西孟加拉邦)。
很明显,就二氧化氮而言,污染最严重的城市(豪拉)属于污染最严重的邦(西孟加拉邦)。
现在让我们看看 no2 浓度最低的 50 个位置:
barplot of no2 vs location for 50 sites with the least no2 concentrations
从上图中我们可以看出,Rudrapur(北阿坎德邦)是 no2 污染最少的城市,其次是 Alappuzha(喀拉拉邦)和 Kohima(那加兰邦)。
现在让我们看看 rspm :
barplot of rspm vs state
从上面的图中,我们看到德里的可吸入颗粒物浓度最高,这一点也不奇怪,因为在过去几年中,任何与印度污染相关的新闻报道中都可以看到这一点。谈到空气污染,德里一直是一个重要的目标。德里污染物的显著增加使人们遭受了很多痛苦,并导致了数千人的死亡。
从上面的图中,我们还看到,就 rspm 而言,北方邦(UP)离德里也不远。作为美国人口最多的州,UP 的空气呼吸起来并不“安全”。应对可吸入颗粒物水平的上升变得非常必要,尤其是在 UP,因为它是 20 多亿人的家园。还有,UP 和德里是邻州(有意思)。
接下来,我们来看看旁遮普。谈到空气污染,旁遮普总是成为头条新闻,主要是因为农民。这是一个如此重要的问题,以至于政府已经发布了许多政策和计划来阻止稻农通过焚烧水稻收获后留下的残茬来清理他们的田地。
另一方面,锡金的可吸入颗粒物浓度最低,其次是米佐拉姆和普杜切里。
让我们更深入地研究,看看不同位置的可吸入颗粒物浓度:
barplot of rspm vs location for 50 locations which have the highest levels of rspm
从上面的图中可以看出,Kashipur(北阿坎德邦)的 rspm 水平最高,其次是 Ghaziabad(上)和 Allahabad(上)。大多数顶级位置属于 UP,这说明 UP 在可吸入颗粒物方面是污染第二严重的州。
现在让我们看看可吸入悬浮粒子浓度最低的地点:
barplot of rspm vs location for few sites which have the least levels of rspm
从上面的图中我们可以看出,可吸入颗粒物水平最低的是巴塔那姆希塔(喀拉拉邦),其次是农斯托因(梅加拉亚邦)和占姆海(米佐拉姆邦)。我们可以看到,这些位置所属的状态位于 rspm 与状态的条形图的下方。
现在让我们考虑 spm:
barplot of spm vs states
我们看到北方邦和德里再次名列榜首。UP 和德里的 spm 和 rspm 浓度相当。一则新闻报道称:
1997 年,北方邦首府勒克瑙的一个空气质量监测站记录的悬浮颗粒物质(spm)最高水平为每立方米 2339 微克,超过住宅区允许限值的 11 倍,工业区限值的 4 倍。这与德里记录的最高值一样高:1992 年为 2,340 克/立方米。
如果我们更仔细地观察这个图,我们会发现德里及其以上地区的 spm 水平远远高于其他任何一个邦。拉贾斯坦邦 3 号的浓度明显低于 UP 或德里。
另一方面,果阿的悬浮颗粒物浓度最低,其次是喀拉拉邦和梅加拉亚邦。
请注意,阿鲁纳恰尔邦和特伦甘纳邦的值为空,并且这些邦的 spm 浓度不为零。
让我们更深入地了解一下 spm 最集中的位置:
barplot of spm vs location for sites with the highest level of spm
从上面的柱状图我们可以看出,密鲁特(上图)是悬浮颗粒物污染最严重的城市,其次是胡尔贾(上图)和加济阿巴德(上图)。
事实上,排名前 7 位的城市,即密拉特、胡尔贾、加济阿巴德、坎普尔、菲罗扎巴德、诺伊达和阿拉哈巴德,都位于上城区。这是一个令人担忧的情况,因为当谈到 spm 或 rspm 时,这个国家人口最多的州污染最严重。
现在让我们考虑最后但并非最不重要的特征,即 pm2_5:测量/记录的颗粒物值:
bar plot of pm2_5 vs state
我们可以看到,大多数状态都有空值,如上所述,很明显 pm2_5 有最多的空值(97.86%的空值)。从我们掌握的信息来看,我们看到德里再次位居榜首,其次是西孟加拉邦和中央邦。由于 pm2_5 有大量的空值,所以没有太多可以讨论的。
让我们绘制 pm2_5 和所有非空值的位置之间的柱状图:
barplot of pm2_5 vs location for all non-null values
我们看到德里仍在榜首,紧随其后的是塔尔彻(奥里萨邦)和瓜廖尔(中央邦)。
统计分析
现在,让我们对数据集进行一些统计分析,并检查这些特征是否有一些关系。
我们将从绘制每个特征的散点图开始:
scatter plot for each column
首先,我不会评论 pm2_5 和任何其他特性之间的关系,因为 pm2_5 有大量的空值。因此,其统计意义非常低,甚至可以忽略不计。
so2 和 no2 值高度集中在原点附近,这意味着在大多数观测中,这两个值都很低。
我们可以看到 no2 和 so2 的模式与其他特征有些相似。
可以说 spm 和 rspm 有一定的线性关系,其余所有特征并不完全相关。
为了进行更深入的分析,让我们来看看相关矩阵:
Correlation matrix for the dataset
从相关矩阵中可以清楚地看出, spm 和 rspm、之间存在一定的相关性,这支持了我们的散点图分析。 其他特征之间关联不大。
日期特征
现在让我们使用我们还没有接触过的日期特性。
日期特征表示记录数据的日期。
让我们提高效率,从日期特征设计一个新的特征(年份)。这是因为我们对空气污染的年度影响感兴趣。
制作年份列后,数据如下所示:
dataset after devising year column from date feature
现在我们已经创建了一个 year 列,这样我们就可以每年分析数据。
使用热图进行 so2 分析
让我们绘制 so2 热图,其中
行:州属性
列:年属性
值: so2 属性
heatmap for so2 with state and year attributes
从热图中可以明显看出,从 1987 年到 1999 年,比哈尔邦的二氧化硫浓度逐渐增加。同样,1995 年前后,古吉拉特邦的二氧化硫浓度也很高。在哈里亚纳邦,我们也可以看到 1987 年左右的二氧化硫水平很高,并且一直高到 2003 年。从 1987 年到 2000 年,卡纳塔克邦的二氧化硫浓度也逐渐增加。大约在 1996 年,Puducherry 也见证了 so2 浓度的高值。
拉贾斯坦邦在 1987 年左右也经历了高浓度的二氧化硫。
从 2004 年至今,北阿坎德邦的二氧化硫浓度一直很高。在西孟加拉邦,so2 浓度从 1987 年到 2000 年一直很高。
上述分析表明,从 1980 年到 2000 年,一些国家的污染物二氧化硫含量很高,但在新世纪(从 2000 年起)有所下降。
我找到了下面这篇支持我们的结论和热图分析的新闻文章。
美国宇航局 Aura 卫星发布的数据质疑中央污染控制委员会(CPCB)在 2012 年声称的准确性,即 2010 年印度的二氧化硫(SO2)平均排放量与 2001 年相比有所下降。
一些邦,如北阿坎德邦、恰尔肯德邦、锡金邦等。仍然经历相当高水平的 so2 浓度。
请注意,这些是二氧化硫与状态的柱状图顶部的状态。
热图显示,关注二氧化硫浓度的危险水平,采取了正确的措施来降低它。例如,空气(污染防治)法案于 1981 出台,并于 1987 修订。
实施见成效,二氧化硫水平下降。
使用热图进行 No2 分析:
在下面的热图中,我们有
行:州属性
列:年属性
值: no2 属性
heatmap for no2 with state and year attributes
我们可以看到,拉贾斯坦邦、比哈尔邦、德里、哈里亚纳邦、恰尔肯德邦、普杜切里邦、西孟加拉邦等邦都经历了严重的 no2 浓度水平。
在一些邦,如拉贾斯坦邦,二氧化氮浓度逐年下降,而在比哈尔邦、德里等邦。它增加了。在西孟加拉邦、恰尔肯德邦等其他邦,no2 浓度一直居高不下。
如果我们仔细观察热图,我们会发现从 2000 年开始,整个国家的 no2 浓度都在增加。
我找到了以下支持上述结论的新闻文章:
美国宇航局的卫星地图显示,在 2005 年至 2014 年期间,包括印度在内的南亚地区,二氧化氮污染物的排放量显著增加,严重影响了空气质量。
使用热图的 rspm 分析
在下面的热图中,我们有
行:州属性
列:年属性
值: rspm 属性
heatmap for rspm with state and year attributes
热图是一种非常重要的数据分析工具,它让一切都变得非常容易分析。人们可以很容易地看到变化,各州各年的可吸入颗粒物水平等。
这里我们看到,像德里、旁遮普、北方邦、哈里亚纳邦和恰尔肯德邦都遭受了高水平的可吸入颗粒物。
使用热图进行 spm 分析
在下面的热图中,我们有
行:状态属性
列:年份属性
值: spm 属性
heatmap for spm with state and year attributes
这里我们看到,像德里、哈里亚纳邦、旁遮普邦、北方邦等邦是 spm 高度集中的主要受害者。
结论
从上面的分析中,我们看到印度受空气污染影响最大的邦属于北部地区。德里、旁遮普邦、北方邦、哈里亚纳邦等邦污染严重,需要立即采取行动。
我们还发现,即使一个州的污染物水平很高,也有一些地区没有受到污染。
我们还从统计分析散点图中看到,具有高 rspm 浓度的州也具有高 spm 浓度。
根据热图,我们得出结论,一些州在早期(1980 年至 2000 年)污染严重,但后来得到了治理。下降的原因可能是公民意识和政府政策。
例如,1981 年空气(防止和控制污染)法案是和法案,规定了防止、控制和减少空气污染。另外,我发现了一篇新闻文章,内容如下:
车辆排放控制的故事始于印度,当时大规模排放标准于 1991 年首次对汽油车实施,并于 1992 年对柴油车实施。1996 年,随着汽油车催化转换器的强制安装,排放标准进一步收紧。巴拉特阶段排放标准(相当于四轮车的欧洲标准)于 2000 年首次引入。这些规范规定了一氧化碳(CO)、碳氢化合物(HC)、氮氧化物(NOx)和颗粒物(PM)的最大允许排放限值。
上述新闻文章明确指出,政府采取了必要的措施,以对付日益严重的空气污染(我们看到的),从 1990 年至 2000 年。这可能是我们在热图中看到一些州的污染物浓度从 2000 年开始下降的原因之一。
下文陈述的另一篇新闻文章支持上述结论。
环境和森林部发起的 1997 年白皮书已经提出了各种措施来减少交通造成的污染,包括通过停车条例来改善交通流量,通过强制限制驾驶来减少交通流量。城市当局声称在降低空气污染方面取得了一些成功;例如,在 2014 年亚运会的申办过程中,该城市的组织委员会声称,“随着地铁的到来以及所有公共交通车辆强制使用压缩天然气,德里的污染水平大幅下降”。
结束注释
从上述数据分析方法,我们得出结论,数据分析是一个更好的未来至关重要的方面。
这种方法是纯数据驱动的,但是有现实生活中的实例(新闻文章)支持。
有趣的是,我们可以看到数据分析和日常实例是如何联系在一起的,以及数据分析是如何用于处理重大问题的。
我建议通过 GitHub repository 链接(在本文开头提供)找到上述方法的代码,以便更深入地了解如何用 python 实现数据分析。
这就是我对我的国家的分析,这个国家正在慢慢变成毒气室。不仅印度,其他国家也遭受空气污染。我们必须找到解决这个重大问题的方法,因为它正在慢慢地扼杀我们的国家。
如果你有任何建议或任何改进建议,请写在评论区。我将不胜感激。
使用深度神经网络的印度演员分类
如果你需要使用深度网络对你最喜欢的演员进行分类,该怎么办?
在这篇文章中,我想演示使用神经网络的多类分类。
对于数据集,我已经收集了印度演员的图像样本[萨尔曼·可汗(401 张图像)、沙鲁克·汗(411 张图像)和阿米尔·可汗(433 张图像)]到单独的文件夹中。]
我们的问题陈述包括使用深度神经网络将印度演员的样本图像分类到正确的标签中,并在测试数据集上训练模型和计算准确度。
让我们开始练习吧
1.首先导入要使用的必要库。对于神经网络,我使用了 Keras 以及 numpy、pandas、matplotlib、cv2 和 seaborn。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import to_categorical
from keras.layers import Flatten,MaxPooling2D,Conv2D,LeakyReLU
from keras import optimizers
2.数据集包括对应于每个印度演员的图像的命名文件夹。将文件夹中的图像加载到 numpy 数组中。此外,转换所有的图像大小为常数大小,即(6464)或(128128)和可视化的一类。
import cv2
import os
def load_images_from_folder(folder):
images = []
for filename in os.listdir(folder):
img = cv2.imread(os.path.join(folder,filename))
if img is not None:
img1=cv2.resize(img,(64,64))
images.append(img1)
return images**#Load the images**
amir=load_images_from_folder('./AamirKhan/')
salman=load_images_from_folder('./SalmanKhan/')
shahruk=load_images_from_folder('./ShahrukhKhan/')train_amir = np.array(amir)
train_salman = np.array(salman)
train_shahruk= np.array(shahruk)**#Visualize the images**
fig = plt.figure(figsize=(20,5))
for i in range(36):
ax = fig.add_subplot(3, 12, i + 1, xticks=[], yticks=[])
ax.imshow(np.squeeze(salman[i]))
3.下一步是为图像创建标签,因为每个印度演员都有对应的文件夹。我创建了一个 numpy 数组,其长度与特定的类[阿米尔·可汗]相同,并给定标签为零。类似地,萨尔曼·可汗为 1,沙鲁克·汗为 2。
train_amir_label=np.zeros(len(train_amir))
train_salman_label=np.ones(len(train_salman))
train_shahruk_label=np.full(len(train_shahruk),2)
print(train_amir.shape,train_amir_label.shape)
print(train_salman.shape,train_salman_label.shape)
print(train_shahruk.shape,train_shahruk_label.shape)
4.将所有图像连接成 X,将所有相应的标签连接成 y。使用 keras.utils 的 to _ categorical 方法将 y 标签转换成一个热编码。使用训练测试拆分方法,将数据集拆分为 X_train、y_train、X_test 和 y_test,并对数据进行归一化处理。
**#Concatenate**
X=np.concatenate((train_amir,train_salman,train_shahruk))
y=np.concatenate((train_amir_label,train_salman_label,train_shahruk_label))
y_label =to_categorical(y)**#Train -Test Split**
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y_label, test_size=0.33, random_state=42,shuffle=True)**#Normalize the data**
X_train=X_train.astype('float32')
X_test=X_test.astype('float32')
X_train=X_train/255
X_test=X_test/255
print("Training Data",X_train.shape)
print("Testing Data",X_test.shape)
5.现在我定义多层神经网络。框图包括以下内容。基本架构是 Conv2d 层[3*3],然后是 leaky Relu 激活,然后在其上应用 Max Pooling[2 * 2]层。有 3 个这样的分层网络[Conv2d->Leaky Relu->Max Pool]将尝试使网络更深,并将从这些层中提取特征地图。在后面的层中,我将 Conv2d 层的输出展平为 1 维,并应用了两个密集层,中间有 Leaky Relu,然后是 Softmax,以将最终输出转换为 3 类概率。使用的一些超参数如下
epochs =20,alpha =0.1,batch size =64,padding = same[这是为了保留与输入图像相同的大小],optimizer = Adam,loss function = cross 熵。
**#HyperParameters**
batch_size = 64
epochs = 20
num_classes = 3
input_shape=(64,64,3)
**#Model Define** model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3),activation='linear',input_shape=input_shape,padding='same'))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling2D((2, 2),padding='same'))
model.add(Conv2D(64, (3, 3), activation='linear',padding='same'))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Conv2D(128, (3, 3), activation='linear',padding='same'))
model.add(LeakyReLU(alpha=0.1))
model.add(MaxPooling2D(pool_size=(2, 2),padding='same'))
model.add(Flatten())
model.add(Dense(128, activation='linear'))
model.add(LeakyReLU(alpha=0.1))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='Adam',metrics=['accuracy'])
model.summary()
6.在定义了模型之后,我传递了 X_train,y_train 数据以及验证数据(X_test,y_test ),并计算了精确度。对数据集的 834 个样本进行了训练,对数据集的 411 个样本进行了验证。准确率为- 86.86%
np.random.seed(42)
model_1=model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=64,shuffle=True)
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))
7.我绘制了验证和训练曲线,并检查模型是否过拟合或欠拟合,或者它只是很好。这个模型既没有过拟合也没有过拟合。
test_eval = model.evaluate(X_test, y_test, verbose=0)
print('Test loss:', test_eval[0])
print('Test accuracy:', test_eval[1])accuracy = model_1.history['acc']
val_accuracy = model_1.history['val_acc']
loss = model_1.history['loss']
val_loss = model_1.history['val_loss']
epochs = range(len(accuracy))
plt.plot(epochs, accuracy, 'r', label='Training accuracy')
plt.plot(epochs, val_accuracy, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'r', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
8.我还想知道有多少样本被错误分类。为此,我计算了混淆矩阵,发现 149 个样本中有 123 个样本正确地将阿米尔·可汗归类为阿米尔·可汗。26 个样本被错误归类,109 个样本正确地将萨尔曼·可汗归类为萨尔曼汗,125 个样本将沙鲁克汗归类为沙鲁克汗。
from sklearn.metrics import confusion_matrix
y_test_pred=model.predict(X_test)
cnf_matrix = confusion_matrix(y_test.argmax(axis=1), y_test_pred.argmax(axis=1))
cnf_matrix
9.最后,我在看不见的数据上测试了模型,并可视化了样本。几乎所有的随机样本都给了我正确的预测。
testdata= load_images_from_folder('../Q1_TestData/')
testimages=np.array(testdata)
predicted_classes = model.predict(testimages)
predicted_classes1 = np.argmax(np.round(predicted_classes),axis=1)
**#Visualize the test data**
fig = plt.figure(figsize=(20,5))
for i in range(36):
ax = fig.add_subplot(3, 12, i+1,xticks=[], yticks=[])
plt.imshow(testimages[i])
if (predicted_classes1[i]==0):
plt.xlabel('amir')
if (predicted_classes1[i]==1):
plt.xlabel('salman')
if (predicted_classes1[i]==2):
plt.xlabel('shahruk')
plt.show()
瞧啊。请点赞并分享…谢谢…你可以帮我联系@https://www.linkedin.com/in/ashishbansal1/
印度犯罪数据分析
rawpixels
对所犯罪行的详细分析和可视化。
犯罪率不断上升,科技也是如此。我想把它们结合起来产生有意义的见解。不过,关于伦敦和芝加哥犯罪分析的工作很多,但关于印度的记录却很少。因此,我从 data.world 中找到了一个数据集用于这项研究。这个项目的目标是找出哪个州的犯罪率最高,哪个州发生了犯罪。事不宜迟,我们开始吧。
该数据集包含因对儿童犯罪而被逮捕的州和中央直辖区人员的数据。从柱状图中可以看到 2001 年至 2012 年的犯罪数量。
我们将导入熊猫库来访问数据集。之后,我们将 CSV 文件读入数据帧(df)。显示了数据框的片段。
**import** **pandas** **as** **pd** df = pd.read_csv('data.csv')
df.head()
数据争论
数据争论是清理复杂数据集以进行操作和分析的过程。
由于这些值是以年度格式表示的,我们将对它们进行组合运算。为此,我们将使用以下代码
df['total']=df.iloc[:,-12:].sum(axis=1)
df.head()
We can see that a new column, total is added which contains the sum of all the values from 2001–2012
现在,我们已经添加了一个新列,我们不需要所有其他列,因此为了简化我们的数据框,我们将删除它们。
df.drop(df.columns[[2,3,4,5,6,7,8,9,10,11,12,13]], axis = 1, inplace = **True**)
df.head()
为了获得数据框的简明摘要,我们将使用 info()函数。它有助于获得数据集的快速概览。
df.info()
正如我们在输出中看到的,摘要包括所有列及其数据类型的列表,以及每列中非空值的数量。因为我们的值不为空,所以我们不必填充缺失的值。
我们只想访问国家和联盟领土的犯罪数据。因此,为了更好地可视化,我们将删除包含所有值的行。
d=df[:-38] *#to drop total crime rows*
删除包含总值的最后 38 行。
数据可视化
他们说一张照片胜过千言万语。
的确是!!数据的可视化有助于理解数据中的趋势、异常值和模式。
我们将绘制一个条形图来了解哪种犯罪在印度最为普遍。为此,我们将导入’ matplotlib '库,只用 3 行代码来绘制图表。
**import** **matplotlib.pyplot** **as** **plt**
plt.xticks(rotation='vertical') #for labeling the values vertically
plt.bar(x="CRIME HEAD", height="total", width=0.8, bottom=**None**, align='center', data=d)
从图表中,我们可以看到“其他犯罪”类别的数量最高,其次是“绑架”和“强奸”儿童。因此,我们将重点关注这些类型,因为它们更普遍。
剖析具体犯罪
我们将逐一分析具体的犯罪,以获得更好的见解。首先是绑架。
*#Analyzing a specific crime-kidnapping*
kidnap = d[d.crime_list.str.contains('KIDNAPPING and ABDUCTION OF CHILDREN')]
kidnap.shape
k=kidnap.drop(kidnap.index[[-1,-2,-10]])
k.plot(kind='bar',x='State/UT',y='count',color='blue')
通过图表我们可以看出,北方邦的绑架案数量最多,共有 30,625 起,占所有邦的 38%。对于一个国家来说,这是一个令人震惊的数字,那里已经混乱不堪。因为如此高的比率,人们正在散布诱拐和绑架儿童的虚假谣言。由于这种情况,该州宣布:“如果将来有此类案件被报道,将根据《国家安全法》(NSA)对被告提出指控。”
现在,我们将想象第二高的犯罪,即强奸儿童。
在印度,2001 年至 2011 年期间,"亚洲人权中心"共报告了 48,338 起强奸未成年人案件,增长了 336%:从 2001 年的 2,113 起增加到 2011 年的 7,112 起。
2017 年,世卫组织估计,多达10 亿 2 至 17 岁的未成年人遭受过暴力身体、情感或性暴力。根据联合国儿童基金会 2014 年的一些估计,性虐待(从猥亵到强奸)影响了超过 1 . 2 亿儿童,这是受害者人数最多的一次。
*#Analyzing a specific crime-rape*
rape = d[d.crime_list.str.contains('RAPE OF CHILDREN')]
r=rape.drop(rape.index[[-1,-2,-10]])
r.plot(kind='bar',x='State/UT',y='count',color='blue')
图表显示,中央邦发生的强奸案最多。为了解决这个问题,该州通过了法律,对那些被判犯有强奸未成年人罪的人判处死刑,这在一个记录了最高数量的儿童强奸案的州是一个里程碑式的决定。
A tableau visualization of states and the total number of crimes. It shows that Uttar Pradesh has the highest number of crimes.
我们得到了北方邦目标的结果,绑架是最常发生的犯罪。
请随时分享您的反馈,以便我可以纠正错误。我开这个博客是为了分享我的工作和学习新事物。
你可以在我的 Github 个人资料中找到相同的代码。
谢谢大家!😃
参考资料:-
- https://www.unicef.org/protection/57929_58006.html
- https://www . PBC 2019 . org/protection-of-minors/child-虐待罪全球层面
- https://www . hindustantimes . com/India-news/man-lynched-诱拐-谣言-stir-panic-in-up/story-iefmqcfmtrd 5 uy 6 zbxfkuj . html
- https://qz . com/India/1333614/莫迪政府改善了印度妇女的生活吗/
象征性投票——痛苦的英国退出欧盟聚类分析
你可能听说过英国退出欧盟。无论你的政治背景如何,人们普遍认为,它正以镇静的獾的果断和蹒跚的蜜糖的紧迫感前进。
最近有两轮象征性投票,允许议员们表达他们的观点,因此议会可以自信而文明地就最佳前进方式达成一致。
如果不是因为十二张指示性投票中没有一张通过,那就太好了。
那么,这到底是怎么回事?有没有任何关于议员、议会情绪或议员群体之间关系的信息,可以让我们从这令人恐惧的犹豫不决中梳理出来?
#sendhelp
发生了什么事?!!
议会投票数据很容易从 CommonsVotes 网站下载。我使用 R 下载、绘制并大体上分解数据,看看会产生什么——你可以在这个 github 库中找到所有代码。
我们拥有的数据仅限于以下内容:对于每一次投票,我们都有每个议员的决定— 赞成、反对或无投票记录。就是这样。这不是很多,但需求必须…
如果我们将三种投票可能性形成为每张选票的情感得分 (aye = +1 ,no = -1 ,no vote = 0 ),并组合所有 12 张选票的数据,我们可以将每个议员放置在 12 维情感空间 中的某处。如果两个议员每次都以完全相同的方式投票,他们将在这个空间的同一点上,如果他们每次都投反对票,他们将截然相反。
然后,我们可以使用分区层次聚类来构建 MP 的层次结构,根据它们在这个情感空间中的接近程度。这允许我们绘制一个树状图。把这想象成一个生命树类型的东西,从最大的物种(所有议员)开始,分成所有不同的亚种和亚种,一直到议员个人。
我认为给三个最大的集群上色会很有用。严格地说,这些是任意的,但可以合理地认为是 保留? (那些大多在 Remainer 阵营的), 离开? (光谱中大多站在脱欧一边的那些),还有 ??? 为流动选民。
[click/tap the plot to see the interactive version…]
左边的热图显示了每位议员在每次投票中的投票方式——黄色代表赞成,蓝色代表反对,灰色代表没有投票记录。那还在吗?组在最上面:很容易看出,除了无交易(没有真正的惊喜)和或有优惠安排外,他们对赞成投了大多数票。有趣的是,相当一部分人离开了?阵营投票反对无交易 …
为什么是 HAPENNING?
树状图显示了复杂的关系层次,热图显示了所有议员如何投票。好极了:但是为了真正直观地了解议员之间的距离,以及是什么问题实际上将他们分开,我们需要将维度数量从 12 (有点笨拙)减少到更易于管理的程度。我们可以用主成分分析非常直接地做到这一点,它将数据分解成复合维度——其中每个维度都由所有 12 个原始维度的加权贡献组成。然后可以根据重要性(每个对总体方差的贡献)对这些进行排序,并且将前两个用于绘制二维图像(而不是 12 个!)
理论上,这应该把一个集群放在左边,另一个放在右边,第三个集群放在中间。让我想想…
Cluster Plot
所以,这里有几点需要注意。首先,看起来我们的三个集群确实被很好地分开了。三角形(▲)代表*离开?和都在右边;圆圈(●)代表依然存在?*在左边。
有趣的是,*???集群(■)似乎更接近保持?比离开?。所以,也许他们更容易被留下来的人说服?*阵营?
蓝色轮廓强调了空间中议员的密度。离开? (▲)具有相当密集和局部化的结构。值得注意的是,*依然存在?*这个群体有两个截然不同的分支——所以这个群体有两个明显的派别。
这是什么意思?展示由两个元维度组成的平面上的分离是非常迷人的,但是这两个维度到底代表什么?
现在这是什么意思?
从下图中我们可以看到,我们的两个复合维度解释了 MPs 之间大约 80%的差异。这很好——即使我们已经折叠了 12 个原始维度中的 10 个,我们仍然捕获了 80%的信息。
contribution of each PCA dimension to overall variance
尺寸 1
那么什么是我们最重要的维度(即聚类图的左右轴)?
Dimension 1’s ingredients
上面的图显示了每个投票对这个维度的贡献。红线代表贡献均匀时的预期值(即 100/12 = 8.33%);任何高于这条线的贡献都可以被认为是相当重要的。
这里的贡献大致相当分散。然而,有几票是等价的:这个维度的大约 40%是由 C 确定性公众投票和 C 习惯工会意见组成的。
让议员们沿着这条轴线走到一起,统一剩下的人?和离开?集群最需要在这两个问题上找到共同点。
尺寸 2
该维度表示聚类图中的垂直散点图。这个维度上的分离较少,但仍然存在明显的分裂*?*一分为二…
Dimension 2’s ingredients
从这个图中我们可以看到定义这个维度的最重要的问题是欧洲自由贸易区&欧洲经济区和*共同市场 2.0。如果还在?*就是要统一自己,这些才是要集中精力的事情。
现在怎么回事?
当我开始看这个的时候,这个国家正一头栽向悬崖边缘。现在,冲击的截止日期已经推到了万圣节 2019。
在那之前会发生什么?没人知道。我不确定是否还有人想让 T1 知道。如果有更多的指示性投票就好了,我们可以看到所有的集群都汇聚到一个辉煌的、最终的、有凝聚力的地方,每个人都很高兴。但是,说实话,我并不乐观。
这很复杂。简直是地狱。这是政治。
尽管如此,振作起来,嗯?你必须对这些事情有幽默感…
[注释等]
- 在计算情感空间的距离时,曼哈顿距离是最合适的度量吗?
- 与此相关的是,总体上情绪谱的概念可以说是不一致的,在内部(从赞成到反对的距离是否总是与从反对到反对的距离相同?)对外(一票赞成与另一票赞成是否相同?).**
- 请注意,聚类图上的点已经过抖动,以确保它们可见,并且不重叠。等高线图更接近地表示了所有点组的位置。
- 有相当多的议员(特别是内阁部长)在所有的指示性投票中没有记录的投票。
- 来自 Pixabay 的 Alexas_Fotos 精选图片;gif 从这里和这里。
- 维布尔。
印度尼西亚的贫困状况
探索 2013-2018 年印度尼西亚县级贫困数据
For Interactive (Tableau)
贫困问题一直是各种经济和社会论坛讨论的主要议题之一。贫困被认为是一个严重的问题,必须解决,因为它有很高的社会成本。贫困本身通常被定义为个人无法满足食物和清洁水等商品形式的基本需求以及教育和卫生等服务形式的基本需求。
从形式上看,满足这些基本需求的能力是以支出或个人收入来衡量的。在印度尼西亚,中央统计局(Badan Pusat Statistik)使用平均支出变量作为基准,分为基本粮食和非粮食需求。如果一个人的支出低于贫困线,他就被归类为穷人。
印度尼西亚的贫困线是根据人均每天相当于 2100 千卡的最低食物需求和最低住房、衣服、教育和健康需求的支出值之和计算的。2019 年 3 月,印度尼西亚的贫困线记录为人均 425,250 印尼盾/月(约人均 1 美元/天),食物构成为 73.66%。
For Interactive (Tableau)
根据这一名义贫困线,印度尼西亚的贫困人口比例为 9.41%,约为 2,514 万人,贫困人口主要集中在农村地区,尽管贫困率基准为 12.85%,而城市为 6.89%。总体而言,这些结果显示与上一年相比下降了 0.41 个百分点。
贫困人口数量和贫困率下降的趋势确实也发生在地球的其他地方。这一现象始于第二次世界大战结束和殖民实践。这一和平与独立时期为处于世界贫困地区的前殖民地国家提供了在本国进行变革的机会。然后,它导致更具包容性的经济增长,并最终减少贫困。
在印度尼西亚的背景下,值得注意的是,每个政府总是有一个专门针对减贫的主要方案,尽管它有不同的名称,如 Takesra、Kukesra、PKH、BPNT、BLSM、Raskin 等。然而,它通常以补贴或现金援助的形式提供。补贴或现金转移的接受者是根据当地政府的数据选择的,以确定接受者的资格。即便如此,仍有许多关于提供的计划目标不准确的报告。因此,贫穷数据的分类过程相当重要,因为它不仅着眼于持续下降的贫穷率的发展。
For interactive chart (Tableau)
分解到县一级
我将分解到县一级,因为只有县一级的数据可用。只有几个省有更具体的数据。即便如此,印尼中央统计局发布的数据通常也会滞后一年。上面的主图是 2013 年与 2018 年相比,2018 年 3 月所有县的贫困人口数量变化分布(两点年度数据)的初步说明。显然,爪哇几乎所有的县都成功地减少了贫困人口的数量。之所以会出现这种情况,是因为 Java 的贫困人口数量最多,所以在每一个扶贫项目中作为重中之重是合理的。此外,爪哇也是印尼的经济和政治中心
与此同时,如果我对这一时期贫困人口数量减少最多的县进行排名,Buton Regency 是这一类别中最好的县(在 494 个县中)。布顿县的地方政府应该为他们的辛勤工作获得奖励。干杯。
但是如果我把这些变化和人口增长做更详细的比较。Buton Regency 的成就不如以前辉煌,因为贫困人口数量大幅减少,随之而来的人口数量也大幅下降,分别为-65%和-62%。这也可以从人口指数的变化中得到证明,该指数仅变化了 1.58%,这意味着如果布顿县的人口全年保持不变,贫困人口只会减少 4113 人。所以基本上,在过去的五年里,布顿县的贫困人口数量只减少了 10%。因此,如果我只看到贫困人口数量的减少,我认为这是不够的。
如果把人口增长作为奖励的额外要求,我假定贫困人口对县人口增长有显著影响。结果,333 个县满足了这些额外要求,可悲的是,上图中前十五名中只有三个属于这一额外类别。因此,前三个县在这两个变量上的比率或 delta 不同,分别是 Tolikara 县、Tanatidung 县和 Gunung Sitoli 市。因为,尽管人口每年都在增长,他们还是设法减少了贫困人口的数量,这确实需要努力。
好了,现在我们来谈谈贫困线。我之前告诉过你,印尼名义上的贫困线大约是每人每天 1 美元。那么,供你参考,印度尼西亚的支出分布是正偏态的。因此,如果我将贫困线提高到 1.5 倍,印度尼西亚的贫困率将增加到 40%。换句话说,许多印尼中等收入阶层处于贫困易发状态。事实上,在这五年期间,有 143 个县的贫困人口数量增加,贫困线逐年提高。虽然平均来说全县人均收入有所增加。因此,县域经济增长并没有向贫困人口倾斜。
seaborn.boxplot(showfliers=False, …)
Three Main Poverty Index Graph (Github Gist)
年同比比较
人口指数只衡量贫困人口占总人口的比例。如果你想只关注贫困群体的消费分配,那么 P1 和 P2 是常用的。P1 用于计算贫困人口与贫困线的平均消费距离。与此同时,P2 计算了贫困人口的消费差异。这两个指数的值越高,越是不好的迹象。
上图以“x”为算术平均值,显示了所有观察县的三项指标情况。图表显示贫困率下降了,但是 P1 和 P2 相对停滞不前。直观上,这可以解释贫困项目很难帮助处于最低百分位数的穷人。另一方面,如果贫困计划被证明能够将接近贫困线的穷人推出贫困区,那么到目前为止,贫困计划可以说触及了几乎所有的穷人,因为平均而言,穷人的支出增加了。不过,我没有资料显示开支的增加是否只是名义上的,换言之,只是作为对通胀上升的补偿。我还找不到令人信服的答案。
2015 年和 2016 年的 P1 和 P2 指数引起了我的注意。很明显,当贫困人口比例下降时,P1 和 P2 指数实际上是上升的。那一年是佐科·维多多内阁政府的开始,并对目前的国家预算结构进行了重大改革。佐科·维多多政府削减了前政府用于基础设施项目的大量补贴。补贴的削减确实打击了穷人。虽然随后预算有所调整,尤其是临近 2019 年选举年。
结论
然而,在这十年中贫困人口数量下降的成就应该得到赞赏。这至少表明了政府在努力克服这一贫困问题方面的认真态度。然而,分配不平等的问题——无论是在社区经济阶层内部还是在县与县之间——仍然是一个大问题,几乎一半的印度尼西亚人口非常容易变穷。
为什么我总是在这个贫困问题上提到政府。因为政府是唯一有能力分享经济增长蛋糕的一方。穷人没有足够的资本和权力在社会中成长。谢谢你到目前为止阅读我的故事。我希望你们都能更多地了解印度尼西亚的贫困状况。在这个故事中,我只探讨了贫困数据集,没有过多涉及贫困与其他相关变量的关系。甚至我根本没有用花式模特。也许下次,我会试着写讨论。最诚挚的问候。
工业级数据科学
管理数据科学很难。数据科学项目有很多失败的机会。此类项目的风险并不广为人知。原因是与软件开发相比,数据科学仍然是一个年轻的领域。在本帖中,我们将探讨数据科学项目的主要风险,并了解控制这些风险的方法。
探索普通数据科学项目的风险
Photo by Tobias Tullius on Unsplash
我们先来看看一个数据科学项目如何出现在一个普通的组织中。这一切都始于一些热衷者,他们可能是软件供应商或公司员工,看到了用数据科学改变世界和他周围的企业的方法。互联网上有很多成功的案例。他觉得他的公司也能从中受益,所以他建议公司管理层研究数据科学。管理层接受并要求内部 IT 或分析团队研究我们如何应用数据科学来改善我们的业务。团队开始在组织内部寻找大型数据源,一般会找到一个或几个好的数据库。然后,他们努力思考如何应用数据科学和机器学习来让他们的公司变得更好。大多数团队发现了某种可以应用机器学习算法的数据集,所以他们继续这项任务。最后,这类项目通常以下列方式结束:
- 企业不明白他们从新系统或算法中获得了什么好处。结果令公司管理层感到困惑。因此,他们指责数据科学团队在不必要的项目上花费了时间和金钱
- 系统投入生产。业务流程的 KPI(关键性能指标)在团队部署模型后突然下降。该公司的管理层非常愤怒,并将公司的损失归咎于数据科学团队
但是如何才能避免数据科学项目的失败呢?为了理解这一点,让我们深入了解数据科学项目的主要风险。
知识
任何数据科学项目的首要和主要风险是知识的可用性和传播。决策者通常缺乏数据科学方面的基本专业知识。这会导致过高的期望和不正确的问题陈述。人们开始谈论人工智能,以及它如何通过查看他们的数据库并在数据中发现新的利润来神奇地解决问题。
目标
缺乏关于数据科学和机器学习的知识会导致错误和模糊的问题陈述。事实上,以可解的形式解释问题是关键的一步。正确的问题是数据科学项目成功的 80%。原因在于数据科学使用科学的方法和研究过程来衡量结果。一般来说,数据科学家希望改进某种度量标准,一种衡量项目绩效的公式。模糊的目标定义导致数据科学团队方面的解决方案不正确。数据科学家大多是数据专家,不是商业顾问。企业应该与数据团队合作,创建一个值得投资的问题陈述。
在开始一个项目之前,确保你的想法是:
- 附属于业务
- 可以用一组指标来衡量
- 能够以可理解的方式呈现给业务部门
- 有相关数据。没有数据意味着你有一个数据收集项目,而不是数据科学项目
在讨论了战略风险之后,让我们求助于执行风险。
管理办法
项目经理经常求助于数据科学项目的软件开发管理方法。这似乎是一个好的开始:我们最终会开发软件。是的,内部深处可能有一个机器学习模型,但为什么它需要不同的管理方法?事实上,像敏捷这样的管理实践是管理数据科学项目的良好开端。但他们需要额外的调整和适应,以服务于数据科学项目的目的。
核心问题是敏捷,像许多管理方法一样,关注于处理外部范围的变化。例如,Scrum 以产品经理为中心,在项目 backlog 中填写所有请求的变更,这后来被系统化。在数据科学项目中,变化可能只出现在项目团队的外部,但也会出现在内部。例如,实验的结果可以改变项目中使用的建模技术的方法。这可能会导致内部软件架构不可避免的变化,以及整个系统的重大变化。您应该采用数据科学项目的管理方法来处理这种情况,因为它们很常见。特别是,考虑将项目分成两个集成的部分,每个部分都有独立的积压工作。研究子项目应该处理建模和数据预处理,而软件子项目应该包含端到端的解决方案,并集成研究子项目的结果。
任何数据科学项目的另一个有趣的方面是测试。在好的软件项目中,测试是过程中不可或缺的一部分。它从开发阶段开始,贯穿整个项目,直到生产部署。在数据科学项目中,测试更加突出。理想情况下,您应该在编写一行代码之前记录模型测试方法。这种测试方法是项目目标定义不可分割的一部分。没有评估项目效果的一组业务和技术指标,问题陈述是不完整的。
花式科技
数据科学、人工智能和机器学习都是时髦词汇,被新的有吸引力的技术包围着。另一方面,数据科学解决了各种各样的实际问题,这使得组织渴望在该领域进行投资。通常,技术专家是组织中第一个传播数据科学的人。在某些情况下,人们渴望尝试新技术和新算法,将问题陈述留到项目的后期。在这种情况下,数据科学将被商业专家贴上的标签,仅仅是技术人员的另一个玩具。
这种以技术为先整合数据科学的方法是有风险的。如果没有业务方面的支持和想法,即使是该领域最优秀的专家也会发现很难利用公司的数据推进公司的业务。数据科学和新项目想法的动机应该始终是一种协作努力,而不仅仅是技术上的。
队
数据科学项目通常看起来像研究项目。您需要测试新的、未经探索的方法和技术来解决业务问题。你需要一个团队来产生这个解决方案。仅从研究角度看待数据科学项目会让你创建以 R&D 为中心的团队。然而,许多组织忽略了开发生产就绪系统的必要性。实际上,围绕您的模型的数据工程和软件将占用项目总投资时间的 90%。这意味着你需要组建团队,这些团队已经准备好将原型开发成可靠的、高度可用的和生产就绪的软件解决方案。对于大多数企业来说,面向机器学习实际应用的跨职能团队比内部研究实验室更有价值,后者将推进最先进的方法,推动科学向前发展。为了控制这种风险,您应该考虑数据科学团队的目标,并调整您的招聘策略以与这些目标保持同步。
工装
另一个重要问题在于技术方面。数据科学项目通常被视为研究工作。然而,研究只是为任何商业问题提供解决方案的一部分。如果您希望您的团队高效可靠地实施项目,您需要从工程的角度来看待数据科学。ModelOps 是 DevOps 的近亲——一门围绕机器学习模型开发和部署研究工程流程的学科。如今,ModelOps 为您呈现数据版本化、构建可重用管道(【https://dvc.org】)、实验跟踪和模型部署(【http://mlflow.org】)以及快速项目设置()的工具。GitLab CI 等传统 CI/CD 工具也能给你的项目带来很大的好处,所以尽量考虑使用。为了控制这种风险,不仅要考虑模型的准确性,还要考虑模型的交付过程。
下一步去哪里?
如果你想了解更多关于数据科学项目管理和团队领导的知识,查阅我的书: 管理数据科学
它展示了对机器学习背后的主要概念的直观理解,并描述了用于以下目的的详细方法:
—管理数据科学项目
—组建数据科学团队
—将模型操作整合到您的开发流程中
利用 Kubeflow 实现人工智能和机器学习应用的产业化
全栈数据科学
使数据科学家能够制造可扩展和生产的 ML 产品
By Unsplash
背景
人工智能和人工智能应用的产业化主题近年来获得了极大的关注,例如著名的 Netflix 奖 以及在现实世界场景中实现获胜的 Kaggle 解决方案所面临的困难。这突出了 AI 和 ML 开发的两个主要方面之间的根本脱节:
构建 AI / ML 模型不同于缩放和维护它。一个是典型的数据科学问题,一个是典型的工程问题。
by gfycat
当谈到生产 AI & ML 算法时,需要从产品和人的角度来解决差距。
- 从产品角度来看,隐藏的技术债务可能来自不清楚或未分类的工程工作。值得注意的是,AI/ML 产品不仅包括 AI & ML 建模,还包括大量的开发工作和工程工作。
By Hidden Technical Debt in Machine Learning System
- 从人员的角度来看,数据科学团队缺乏开发人员和工程技能会带来挑战。在与数据科学家朋友的交谈中,很明显许多人不熟悉 CI/CD(持续集成&持续部署)、微服务、容器化、Kubernetes 等概念,有时甚至不熟悉 Git。
为了缩小差距
为了应对这些挑战,行业引入了新的角色,如 ML 工程师或 ML DevOps,旨在填补数据科学团队的知识缺口,或从他们那里接管生产任务。
此外,企业正在开发统一的 AI 和 ML 平台,以自动化许多工程任务,并最大限度地减少数据科学家的工作量,如 H2O、DataRobot 和 SageMaker。
Kubeflow 在这个领域是一个相对较新的参与者,最近几个月已经获得了极大的关注。在本文中,我们将研究 Kubeflow 如何帮助解决人工智能和人工智能产业化中的一些核心挑战。
什么是库伯流?
我们的目标是尽可能简单地扩展机器学习(ML)模型并将其部署到生产中。
以上来自 Kubeflow 网站不言自明。它的主要目标是利用 Kubernetes (K8s)的力量使 ML 更具可伸缩性,并以微服务的方式运行。
为了支持数据科学工作流程的不同阶段,Kubeflow 集成了几个开源组件和工具,包括:
- Kubeflow Notebooks,为数据科学家提供 Python Jupyter 笔记本。
- Kubeflow 管道,它允许 ML 管道的编排。
- 整流罩,它简化了模型构建、训练和部署的过程。
- Katib,它在 Kubernetes 上提供超参数调优。
- 谢顿,负责模特上菜。
通过将这些工具结合到一个统一的平台中,并提供一个解决方案来解决可扩展性、部署和维护以及开发经验,Kubeflow 有潜力成为生产中 AI 和 ML 的领先平台。
可量测性
AI 和 ML 的进步导致了对处理大量数据的需求,这需要在数据科学过程的不同阶段进行大量的"测试&学习周期。这突出了平台可扩展性和构建可扩展 AI & ML 产品的效率之间的重要关系。
以前,数据科学家会访问内部服务器上具有数百 GB RAM 的虚拟机。虽然这提供了一个基本的解决方案,但它在每个虚拟机中可用 RAM 和内核的硬性上限方面有所限制。
后来,Hadoop YARN 和 Spark 的引入解决了可扩展性问题,并允许快速数据处理。然而,这些平台对于数据科学家来说不是用户友好的,并且缺乏对 ML 的支持。
最近,Kubernetes (K8s)的流行,这是一个基于容器的编排引擎,用于自动化容器化应用程序的部署、伸缩和管理,这导致了对其托管 ML 应用程序的适用性的探索。
Kubeflow 是一款基于 Tensorflow 和 Kubernetes 的 ML 解决方案,它在 K8s 上运行 ML 应用程序方面具有业内公认的优势,例如:
总之,与传统的 VMs 和 YARN 相比,Kubeflow 不仅提供了可扩展性,还为数据科学家提供了一个更加熟悉和可访问的环境。
部署和维护
我以前曾将生产中的模型视为一个黑盒,这是对 AI & ML 算法的普遍看法。为了将模型部署到生产环境中,它必须由 CICD 管道进行测试、自包含、版本控制和管理。这些任务对数据科学家来说可能不是最愉快的,也不是最有效地利用他们的技能。
然而,Kubeflow 认识到支持数据科学家的重要性。它为其管道提供了软件开发工具包(SDK ),使数据科学家能够基于 Python 中定义的管道创建预编译的 zip 文件,其中包含必要的 Dockerfile 和 YAML 文件。然后,可以将这个预编译的文件直接提交给 CICD 管道公司进行审查、测试,并最终部署到生产环境中。这大大减少了数据科学家的工作量,因为他们不再需要手动创建 YAML 文件,从而简化了整个 ML 部署流程。
如下图所示,数据科学家只需专注于黄色任务,而 Kubeflow Pipelines SDK 则负责从源代码库到容器注册表的其余流程。
By Kubeflow Community
通过将 Argo 集成为其管道工具,Kubeflow 简化了基于容器的 ML 管道的部署,使得以微服务方式测试、扩展和维护这些管道变得简单。
这不仅简化了 ML 工作流程,还为数据科学家提供了轻松版本化和测试模型的能力,从而增强了他们的体验:
- 容器化的 ML 模型的部署确保了每个模型或组件都是自包含的,并且包含了所有必要的依赖,使得它们可移植和可测试。
- 平台的健壮性得到了提高,因为任何团队成员都可以轻松识别和解决部署模型的问题,而不需要深入了解平台的架构。
- 在生命周期管理方面,数据科学家能够通过部署新版本来更新现有模型,使用新发布的容器进行 A/B 测试,或者根据需要淘汰容器。
- ML 模型和服务生命周期的清晰性增强了数据治理和风险管理,因为可以在容器级别管理机密,以确保对数据资产和资源的安全访问。
下图是一个端到端 XBoost 模型的 Kubeflow 管道示例,其中每个盒子代表一个由 Python SDK 生成的容器。
多用户隔离
多用户隔离是一个至关重要的方面,尤其是在拥有多个团队和产品流的组织中。这有助于避免不同团队的数据科学家之间的干扰,并改善他们的开发体验。为了解决这个需求,Kubeflow 利用 Kubernetes 资源配额,允许基于名称空间管理资源。这确保了每个团队都可以访问必要的资源,并消除了意外冲突的风险。
在当前版本(v0.6)中,这仅适用于笔记本电脑。
By Kubeflow Community
监视
Kubeflow 通过使用 Prometheus 提供监控功能,能够监控每个 pod/worker 的 GPU、CPU、网络和 RAM 使用情况。这一特性不仅满足了 DevOps 的需求,还为数据科学家提供了宝贵的见解。
通过监控生产中的资源利用率,数据科学家可以优化管道计划和依赖关系,识别模型中的瓶颈,并在平衡模型培训成本和性能方面做出明智的决策。这有助于数据科学家更有效地工作,并关注成本效益。
开放源码
最后但同样重要的是,Kubeflow 的开源特性是其关键优势之一。虽然特定于供应商的解决方案和开源解决方案都有其优势,但我认为敏捷性和灵活性是要考虑的主要因素。对于任何规模的组织,无论是大型多云实体还是中小型创业公司,开源解决方案都提供了必要的适应性,可以随着时间的推移调整和发展他们的 AI & ML 基础设施。
无论你在哪里运行 Kubernetes,你都应该能够运行 Kubeflow。
此外,Kubeflow 社区非常活跃,致力于不断发布新功能,定期举行产品设计会议,并根据反馈迭代其路线图。
Commits over time — by Kubeflow Github
全部的
Kubeflow 已经成为人工智能和人工智能产业化领域的一个有前途的解决方案,提供了一系列好处来帮助组织在其数据科学项目中取得成功。
然而,值得注意的是,Kubeflow 目前正在进行重大开发,并且尚未考虑企业就绪。
- 社区在最近的版本中做了一些重大的改变,比如从 Ambassador 到 Istio 作为服务网格,从 ksonnet 到 kustomize 作为部署模板。这些更改可能会影响与旧版本 Kubeflow 的兼容性。
- 此外,在预计于 2020 年 1 月发布 1.0 版之前,多租户和用户隔离等关键功能已经不再重要。对于组织来说,在实现 Kubeflow 时,仔细评估他们的需求并牢记这些考虑因素是很重要的。
下一步是什么
在这篇文章中,重点主要是从运营和团队的角度来看 Kubeflow 在 AI & ML 产品产业化方面的优势。
展望未来,探索 Kubeflow 为个体数据科学家提供的优势将会非常有趣。这包括使他们能够使用 JupyterHub、Katib 和 Seldon 等工具开发端到端的 AI & ML 模型。
工业 4.0:向知识型企业演进
Photo by Franck V. on Unsplash
自柏拉图和亚里士多德时代以来,认识论即“知识论”一直是一个哲学话题。正是这种对知识的理论、认知和实践,在过去的 2000 年里极大地促进了人类的进化。
在许多方面,哲学也延伸到组织知识或企业认识论。信息爆炸、技术成本下降、人工智能兴起、人才全球化、快速创新周期和资本市场经济正在重塑金融和知识资本在企业中的作用。资本主义时代早期的经营业绩显著依赖于资本效率(结合其他因素);然而,现在可以说,在(所谓的)工业 4.0 中,赢家和输家将受到“知识效率”(也就是使用中的知识)的驱动。事实上,越来越多的证据表明,2017 年美国最受赞赏的知识企业(MAKE)的获奖者的平均收入回报率(RoR)是财富 500 强 RoR 公司中位数的 2.85 倍,资产回报率(RoA)是财富 500 强 RoA 公司中位数的 2.7 倍。
那么,这对未来的任何企业意味着什么呢?—企业需要将自己视为知识的系统***,为利益相关者有效地开发、培育、转化和使用知识。成功转型为知识型企业的企业将最有能力在人工智能时代取得成功,并对社会产生积极影响。虽然这不是一个新概念(1994 年的一篇 HBR 文章谈到了知识型企业及其特征),但许多企业并没有清楚地解释这一点,而是专注于数字化、人工智能& ML、自动化,而不是全面知识转化(本质上,更关注如何与为什么)。***
对于总体知识转化,企业在最概念性的层面上需要关注三个领域:**
定义知识的目的
创造符合目的的知识
通过知识管理为员工赋权
重点领域 I:为企业定义知识的目的
挑战:信息越多,理解越少
可能的解决方案:任务绩效价值知识评估
今天,我们生活在一个信息高度密集的环境中。然而,对于企业来说,并不是所有形式的信息和知识都是相关的。在最高层,知识的目的应该来源于(或理解于)公司/部门的核心理念/使命。例如,MAKE awards 的获奖者(以及领先的知识公司)有以下使命陈述(图 1):
Image 1: Mission Statement of 3 MAKE Award Winners
虽然这些使命陈述可能故意说得很宽泛,但它们确实提供了公司计划如何利用知识的洞察力。
这个“任务目的”可以映射到关键绩效知识资产。I-Space 研究所的知识地图就是这样一个绘图框架。地图的主要概念包含两个维度:知识结构(非结构化到结构化)和扩散(非扩散到扩散,即知识的传播程度)。这一框架使公司能够相对于市场绩效驱动因素来评估他们的知识资产。
最后一步是将知识资产映射到价值创造。价值创造是一个复杂的话题,涉及到复杂的变量,但是,如果一个企业明白了在经济和社会中所扮演的角色,他们就可以定义知识的价值。Tom Trost 在他的书《基于价值的知识策略》中,通过价值控制图提供了一个非常简单的观点。
他解释说,在绩效上竞争的企业(价值创造者和塑造者)成功地利用知识专注于五个能力领域:
重点领域二——创造符合目的的知识
挑战:信息多,信任少&行动
解决方案:实现知识创造和测量实践
知识创造和管理需要着重强调 1)了解你现有的隐性和显性知识资产 2)将知识从一种形式转换为另一种形式,以扩大知识总量。
信息空间研究所的知识地图也可用于绘制隐性和显性功能知识资产。
功能知识能力的映射提供了一个关于如何进一步培养它们的行动计划(您应该进一步构建某个知识能力还是进一步传播它们,以及它如何帮助企业)。
为了将知识转化为扩大总知识的更广泛目标,野中郁次郎关于知识创造公司的理论(21 世纪初)可能是最相关的。在他的 HBR 文章中,他解释说,在不断变化的市场环境中,成功的企业是那些不断创造新知识,在整个组织中广泛传播,并迅速体现在新技术和新产品中的企业。这些活动定义了“创造知识”的公司,其唯一的业务是持续创新。他开发了一个简单的知识转换框架,叫做 SECI 螺旋:
该框架强调,知识是通过显性和隐性知识的社会互动创造和扩展的。随着编码、通信、设计和技术模式的飞速发展,这可能是当今企业面临的最大机遇。
为员工提供知识管理
挑战:信息太多,时间太少&创意
解决方案:使信息民主化,利用知识
在过去的几十年里,知识监管已经从低技术的监管发展到现在的高技术的监管。据估计,全球有 2.3 亿知识型员工(如果你扩大知识型企业中策展人的定义,这个数字会翻很多倍)。在工业 4.0 中,知识的管理将在许多层面上得到释放,并由云和人工智能提供动力。那么,每个知识工作者如何在这种新环境中策划呢?在一个简单的框架中,知识监管区将被夹在两个技术层之间(使能信息技术和分发/工作流技术)。这在今天已经是事实,在某种程度上也是如此,但是还没有完全实现。
由人工智能和分析技术支持的更加互联、更具凝聚力的企业信息系统将把重点从生产任务转移到创造任务,并实现整个组织的无缝传播。当然,只有组织中的每个人都很好地理解了知识目的和创造原则,策展区才会成功。
向知识型企业的发展始于 20 多年前。然而,现在看来,随着企业认识到它的潜在价值,它的发展势头和可伸缩性将会大大提高!
感染建模—第 1 部分
通过蒙特卡罗模拟估计病原体的影响
一句警告:本系列中提出的一些观点可能不道德。关于隐私、个人自主、平等、‘更大的利益’、和医源性的争论肯定会出现。但是,忽略所有这些会成为系统建模和优化的一个有趣例子。因此,为了我们自己的娱乐,我们将回避道德对话(因为这些概念可以很容易地应用于其他缺乏这种道德灰色地带的领域)。
社交网络通常被认为是在线社交媒体的同义词,但它们也存在于现实世界中:我们的朋友群体、同事、家人、杂货店购物者等。分析这些真实世界的社交网络对于选举策略、零售客户细分,或者我们将在这里看到的流行病学,都是有价值的。
在这项工作中,我们将着眼于一个经常使用的,简化的,流行病模型,并显示它如何可以应用到一个特定的社会网络与蒙特卡罗模拟相结合,以估计病原体的影响。后面的部分将讨论最优化、系统动力学,以及(重要的是)对所有过度简化、笼统概括和不能全信的事物的回顾。
SIR 流行病模型
流行病的定量模型有几种形式,尽管它们都处理属于这些群体的部分人口:易感(S)-无免疫能力并能够感染病原体,暴露(E)-与病原体接触过,感染(I)-当前感染病原体,以及脱离®-对病原体免疫(通过疫苗或暴露后)或死亡。在这项工作中,我们将重点放在 SIR 模型,其中的人口成员要么是易感,感染,或删除。
SIR 模型由(1)中的微分方程控制。β是病原体的感染率,γ是恢复率。这两个值一起给出了基本繁殖数 R0: 由被感染宿主引起的二次感染的平均数量。
Equation 1: SIR model differential equations. x(t) is the fraction of the population infected, s(t) is the fraction of the population susceptible, r(t) is the fraction of the population removed (recovered and/or immune, or worse, dead). Beta is the infection rate, and gamma is the recovery rate.
如果 R0 值大于 1,则感染率大于恢复率,因此感染将在整个群体中增长(如图 1 所示)。如果 R0 小于 1,传染病会很快消失,因为人们愈合的速度比传播的速度快。
Figure 1: Typical SIR model applied to populations. gamma=0.17, beta=0.23, initial infected fraction=0.01
SIR 模型的网络方法
上述 SIR 模型是一个强有力的工具,但它针对的是抽象的“群体”。如果你有更多关于社区互动的信息呢?手机和可穿戴技术的普及使得追踪运动和互动变得更加可行。有可能建立一个当地人口的社会网络,并根据这一网络对过程进行建模。在高度关注流行病的情况下,公共卫生官员可以通过网络模拟感染的传播,以更好地了解预期的结果并做好准备。这里介绍的方法与刘等人在 2018 论文中的方法类似。
感染模拟从初始化为受感染的 n 个节点开始,以将病原体引入网络。在每个时间步,受感染的节点有百分之 p 的机会感染它们的邻居,随着每个时间步 p 衰减,以说明个体在意识到他们生病时变得更加小心。在 r 时间步之后,一个被感染的节点被从网络中移除,这意味着恢复和感染后免疫,或者死亡,这取决于被建模的病原体和/或建模者的乐观程度。
与基于人口的 SIR 模型不同,这是一个通过蒙特卡罗模拟进行建模的随机过程:使用不同的输入参数进行重复模拟,以生成可能结果的分布,而不是生成单一的确定性结果。也就是说, p 和 r 是从每个节点的概率分布中产生的,导致每次模拟的不同结果。
构建感染模拟
作为一个例子,我们将使用一个 62 节点的社交网络,它是由一群海豚的互动构成的。让我们以一种感染为例,其平均恢复时间 r 为 30 天(标准偏差为 8 天),平均传播概率 p 为 6%(标准偏差为 1%),在一个节点的感染中每天衰减 10%。让我们进一步假设随机选择的两个节点( n =2)是网络中的感染源。
按照上述建模过程,重复 1000 次,得到平均 SIR 响应,如图 2 的上图所示。疫情期间感染节点总数的概率密度函数如下图所示。
Figure 2: (above) averaged predictions of fraction of the population susceptible, infected, and removed. (below) PDF of the total number of nodes infected during the outbreak. The time span of the simulation is 150 days.
蒙特卡洛模拟的平均 SIR 反应相当惊人,有近 80%的人口在某一时刻被感染。最终“删除”数字的 PDF 显示了它在 1000 个模拟中的分布情况。从图 3 中可以看出,它大致符合偏态正态分布,感染节点的平均总数为 50(标准偏差为 3.5)。
Figure 3: PDF of total infected nodes roughly fits to a skewed normal distribution
最坏的情况是 62 个节点中有 59 个被感染。但就尾部事件而言,在模拟结果中,影响较小的异常值似乎比影响较大的异常值更普遍。
求解(1)中β和γ的 SIR 微分方程得到下面(2)中所示的方程。随着 t 的增加,β和γ收敛到各自的值。
Equation 2: Solving SIR equations from (1) for beta and gamma
利用蒙特卡罗模拟结果计算出的β和γ,我们可以计算每个模拟的 R0 值,以了解这种病原体在当地人群中的感染情况。模拟计算的 R0 值的 PDF 如下图 4 所示。
Figure 4: Probability distribution of R0 calculated from Monte Carlo simulations
蒙特卡洛模拟显示,网络中这种病原体的 R0 值最有可能在 2 到 3 之间,与 1918 年 H1N1 流感的值相当。虽然在一些模拟中观察到更接近 5 的 R0 值,但是在左尾的 R0 值更普遍,这表明如果公共卫生官员在创建响应计划时假定“最有可能” R0 值,他们更有可能(尽管不能保证)准备过度而不是准备不足。
在下一篇文章中,我们将探讨如何使用这种建模方法来解释疫苗接种的影响。此外,我们将尝试优化疫苗接种策略,以尽量减少病原体在这个网络中的影响。
感染建模—第 2 部分
用遗传算法优化疫苗接种策略
在第一部分中,我们模拟了传染性病原体通过社交网络的传播。蒙特卡洛模拟允许计算基本再生数 R0 的概率分布。在实践中,公共卫生官员将试图制定一项计划,通过接种疫苗或隔离来降低影响。根据定义, R0 是疾病爆发的内在属性,一旦计算出来就不会改变,因为它是在假设完全易感人群的情况下计算的。有效繁殖数, R ,代表可能包含免疫成员的群体中继发感染的平均数量。这是希望通过疫苗接种运动最小化的度量。
Figure 1. PDF of calculated R0 value from the Monte Carlo simulations of the epidemic from part 1.
第 1 部分显示,对于我们的示例网络和病原体, R0 预计在 2 和 3 之间,如图 1 中蒙特卡洛模拟结果的分布所示。在本文和下一篇文章中,我们将对网络中的疫苗接种效果进行建模。具体来说,我们将研究疫苗供应短缺的情况,并试图回答一个问题:鉴于只有 25%的成员可以接种疫苗,我们如何才能最好地保护人口?
在 62 个节点的网络中,只有 15 个将在用与第一部分相同的方法模拟病原体传播之前接种疫苗(从而从网络中移除)。然后将计算得到的(平均) R 值,以确定该疫苗接种策略的有效性。目标是将 R 降低到 1 以下,这表明病原体的传播速度可能比感染者的恢复速度慢。
遗传算法优化
确定接种疫苗的最佳节点可以通过强力组合搜索来完成,尽管这将需要相当长的时间(在这种情况下,需要检查 93 x 10 个组合)。遗传算法是一种受生物启发的搜索算法,它通过模仿自然选择来缩小搜索空间。许多候选解(也称为染色体)以与它们在目标函数上的表现成比例的概率加入交配池。交配池产生的后代具有特定的突变机会,然后根据目标函数进行评估,重新开始进化过程。
在这种情况下,GA 被编程为使用 20 个候选解的群体来最小化网络中病原体的 R 值。图 2 显示了候选解在 20 次迭代中的演变。
Figure 2. Evolution of R for the GA population. The mating pool is formed with the tournament method. Instead of assigning a fixed probability of mutation, mutation occurs when crossover results in duplication.
在 GA 例程完成之后,通过对节点 0、7、8、9、10、13、17、19、21、25、29、30、38、43 和 49 进行接种,最佳策略导致平均大约 0.98 的 R 。实施该策略的蒙特卡罗模拟结果如下图 3 所示。
Figure 3. Monte Carlo simulation results for the optimal policy found via GA. Averaged SIR response (upper). Distribution of total infected nodes (lower).
受感染节点的平均数量约为总人口的 27%(13 个节点),尽管该数量大致均匀分布在 3-15 个节点之间,此时可能性开始下降。
R 的概率分布如下图 4 所示,大致符合正态分布。用这种疫苗接种策略获得的 R 的值最有可能在 0.68 和 1.36 之间。
Figure 4. PDF of calculated R values fit to normal distribution.
结论
实施 GA 来减少病原体对网络的影响是成功的。20 次反复后,最佳疫苗接种政策导致预期传染性下降 32%至 77%。然而,预期的 R 的上限仍然高于 1,考虑到我们的目标是将 R 移动到尽可能低于 1,这是不期望的。
此外,对蒙特卡罗模拟执行遗传算法优化是昂贵的。使用 20 条染色体、20 次 GA 迭代以及每次蒙特卡罗模拟 1000 次模拟,总共计算了 400,000 次模拟。我的机器花了 48 个多小时才完成。记住,这个例子使用了一个 62 节点的小型社交网络。在更大范围内,需要一个规模适当的集群,以便及时取得成果。
第 3 部分将说明网络科学工具如何比 GA 优化更快(更好)地执行这种优化。