联系人追踪是如何工作的?
我们在保护隐私的同时阻止新冠肺炎病毒传播的最好办法
接触追踪,作为一个概念,自艾滋病危机以来已经存在了几十年[1]。接触者追踪的基本原则包括确定可能有患病风险的人,并通知他们接受检测(如艾滋病)或自我隔离(如新冠肺炎)。
我们将考虑开发分散隐私保护邻近追踪(DP-3T) 的团队提出的世界版本。还有其他关于如何进行联系人追踪的提议,比如苹果和谷歌提出的那些提议,但同样的基本概念仍然适用。我们将看看该协议是如何工作的,以及它是如何被设计来保护每个人的隐私的。
DP-3T 是如何工作的?
5 步追踪联系人
基本算法可以分为 5 个步骤:
- 每隔 x 分钟从你的手机发送一个随机代码。
- 收听附近的电话发送给你的其他代码。
- 如果你的疾病检测呈阳性,然后(只有在那时)将你发送的随机代码上传到一个安全的中央数据库。
- 从中央数据库下载代码,并测试是否有与您已收听的代码相匹配的代码。
- 如果找到匹配,则通知用户他们有感染疾病的风险。
发送随机代码
如果您有兴趣了解更多信息,白皮书中会详细解释这些信息是如何生成的。值得一提的是,创建EphIds
的方法对每个用户来说是确定的,但看起来是随机的——这种设计决策的原因将在后面变得清楚。
监听代码
除了发送EphIds
之外,你的手机还需要监听并记录来自附近手机的所有 Ephids 列表。id 和日期一起安全地存储在设备中。EphIds
只需要储存 14 天,为新冠肺炎的最大孵化时间。
上传 EphIds
该论文的作者建议,当一个人进行测试时,应该给他们一个访问代码,以便在需要时将他们的结果上传到中央数据库。该代码仅在患者测试呈阳性时激活。然后,个人可以选择指示应用程序从第一天开始上传第一个Ephid
,它们具有传染性(在出现症状【2】之前平均 5-6 天)。
只有来自个体传染期的第一个Ephid
需要被上传,因为,如上所述,由于Ephids
的创建是确定性的,所有其他的Ephids
可以被用户重新创建。
正在检查匹配
每天你的手机都可以从中央数据库下载一份Ephids
列表以及它们被传送的日期。您的手机可以在传染期间重建完整的Ephids
系列,并与您的手机在同一时间段听到的Ephids
进行交叉引用。如果找到匹配项,则会记录下来,并根据匹配项的数量和找到这些匹配项的时间来计算自定义风险分值。风险评分由当地卫生当局设计,是与中央数据库匹配的Ephids
数量的函数。
隐私
像这样的算法的优雅之处在于,它们从不需要知道个人的位置,也不需要访问 GPS 数据。它也不知道个人的日常习惯是什么,或者他们是否遵守锁定策略。使用该协议的应用程序只关心用户的安全。
结论
DP-3T 联系追踪是一种隐私转发、轻量级和安全的联系追踪方法。如果实施得好,它有机会大大减少新冠肺炎的传播,并有助于拯救生命。
[1] Ramstedt K,Hallhagen G,Lundin BI 等.人类免疫缺陷病毒(HIV)感染的接触追踪.性传播疾病。1990;17(1):37‐41.
数据科学如何为企业创造价值?
不要关注技术、角色和组织结构图。相反,请考虑如何让数据科学成为您组织的核心竞争力。
马林·斯特兰德瓦尔在 Unsplash 上拍摄的照片
W 我们都读到过数据是“未来的燃料”,听说过数据科学家拥有“21 世纪最性感的工作”,也看到过商业智能和分析行业惊人同比增长的预测。但是,随着多达 85%的大数据项目失败,显然许多公司难以实现数据和人工智能的承诺收益。以我作为数据科学顾问的经验来看,这通常会让公司问这样的问题:
- 我们应该使用什么技术和方法来存储、分析和共享我们的数据?
- 我们的数据科学团队需要哪些技能和角色?
- 我们应该如何在组织中定位我们的数据科学团队?
- 我们能像传统项目一样计划和管理数据科学项目吗?
- 我听说行业中的公司xy 和 z 取得了巨大的成功。这适用于我的情况吗?
虽然这些都是重要的考虑因素,但我认为它们都是同一个基本问题的不同版本:
数据科学如何为企业创造价值?
我最近在华威大学的 MBA 论文中研究了这个问题,在这篇文章中,我将给出一个研究的总结。在这个过程中,我将根据我作为一名实践数据科学家和顾问的工作描述一些经验和建议。附加的注释和参考资料可以在最后找到。
关键要点
- 公司的数据科学功能可以被认为是一组可以协调成能力的资源。理想情况下,这些能力应该支持公司的总体战略目标,并创造可持续的竞争优势。
- 数据科学能力创造的价值取决于它在多大程度上是公司的核心竞争力。数据科学家和云计算自己什么都不做;当这些资源和能力与公司的战略目标相一致并帮助公司应对动态竞争环境时,价值就被创造出来了。
- 这种关系因行业和公司类型而异。虽然结果并不支持一个确定的答案,但在快速变化的竞争环境中的行业(如 it 或服务)的公司最有可能拥有强大的数据科学核心能力。成熟的公司和那些具有较新的数据科学能力的公司也更有可能在数据科学方面拥有强大的核心竞争力。
- 企业可以从他们的数据科学能力中提高竞争优势,例如,通过强调数据科学管理技能的发展;通过选择符合核心战略目标并需要跨职能团队的项目;通过确保数据科学能力对于公司所在行业的变化步伐足够敏捷;以及在个人、操作和战略层面上规划潜在的冲突。
资源、能力和核心竞争力
企业的基本目标是发展和保持市场竞争优势。为了理解数据科学对这一目标的潜在贡献,有必要回顾一下战略管理文献中的两个关键概念:基于资源的企业观和动态能力。
战略优势的资源基础理论(RBT)是“理解组织的最突出和最有力的理论之一”(Barney,Ketchen 和 Wright,2011: 1299)。简而言之,该理论认为企业由以下部分组成:
- 资源:由企业控制的生产投入(Grant,1991)或“任何可以被认为是优势或劣势的东西”(Wernerfelt,1984: 172)。
- 能力:“一组资源执行某项任务或活动的能力”(Grant,1991: 119)。对于数据科学而言,相关能力可能包括收集和处理运营数据、构建预测模型以及向利益相关者和决策者传达由此产生的见解的能力。
虽然 RBT 可以有力地解释为什么企业目前具有竞争优势,但它在解释这些职位是如何在动态竞争环境中创造和保持的方面却不太有效。为此,我们转向动态能力,“企业整合、建立和重新配置内部和外部能力以应对快速变化的环境的能力”,例如,通过感知市场机会和威胁,抓住这些机会,并转变企业资产以保持竞争力(Teece,2007)。
关于管理信息系统的文献,特别是数据分析,强调了两个值得注意的动态能力。第一种观点认为,信息技术系统的利益取决于其与公司战略目标的一致性,以及其日常运营和文化(例如,Venkatraman,1993;Krishnamoorthi &马修,2018)。传统上,这种一致性可能是通过过程标准化和瀑布式项目管理来实现的;相比之下,数据科学活动通常是探索性的,这意味着通过敏捷开发方法更有可能实现一致性。
第二,IT 系统可以提高组织的 a gility ,即其“快速识别并有效应对威胁和机遇”的能力(Ghasemaghaei,Hassanein and Turel,2017: 95)。一项针对 3,500 多名企业高管的关于数字技术挑战的调查表明,这种灵活性对于企业长期应对快速变化的环境至关重要。正如一位受访者所说,一家公司可以在短期内积极推广某项特定能力,但在十年的时间框架内,“我们正在被我们的客户、技术和全球化所牵引”(Buckley and Natasha,2017: 5)。
在下面的分析中,我将市场整合和内部敏捷性作为企业“核心竞争力”的要素;也就是说,战略能力是企业绩效的基础,是创造价值的多种来源的基础(Prahalad 和 Hamel,1990)。最近,关于“大数据分析能力”的文献(如 Mikalef 等人,2018)提出了数据科学在多大程度上可以成为这样的核心竞争力,我的假设是,数据科学通过支撑多种组织能力为公司创造价值;这种关系如图 1 所示。
**图一。**数据科学如何为企业创造价值的提议模型。尽管之前的研究( 1 、 2 、 3 )已经强调了核心能力结构对于数据科学价值创造的重要性,但他们设想核心能力结构独立于公司的数据科学能力。通过将其建模为中介— 而非调节— 关系,本研究能够更好地评估数据科学能力是否仅通过培养支持企业更广泛目标和动态能力的核心数据科学能力来创造价值。潜在结构显示在圆角矩形中,测量项目显示在矩形中。在本文的结尾可以找到所用项目的列表。
数据收集
关于这一主题的大多数文献都使用了验证性因素分析和结构方程模型来检验假设,我在这里也采用了同样的方法。为了收集所需的数据,我设计了一个封闭式调查,询问受访者以下问题:
- 他们的人口统计数据、数据科学经验和公司属性;
- 组织内数据科学资源的性质;
- 数据科学功能与公司整体战略目标的整合程度;和
- 他们对数据科学在其公司创造的价值的看法。我测量的价值是对数据科学帮助被调查者的公司发现、创造和实现价值的方式的主观评估(Sheng et al. ,2007);成本和收益的货币评估(如 Vidgen 等人,2017)被排除,因为调查受访者是未知行业的代表,也可能无法获得这些信息。
在对调查进行试点和修订后,该调查于 2019 年 5 月通过 LinkedIn、社交媒体、专业人士和校友网络上的数据科学小组进行了分发。图 2 总结了 50 名有效回答者的主要特征。
**图二。**调查对象的选定特征。受访者来自 ICT、医疗保健、专业服务和零售等行业。
有关如何检查调查工具的有效性以及研究限制的详细信息,请参见技术说明。
主要发现
发现 1:拥有数据科学能力是不够的
为了从数据科学能力中创造价值,仅仅雇用数据科学家并让他们通过一些机器学习算法来运行您的数据是不够的。如图 2 所示,当数据科学能力成为公司核心竞争力时,价值就被创造出来了;也就是说,它使组织能够在多个市场上竞争,它协调整个组织的技能,它被认为是创造客户价值不可或缺的一部分。
**图 3。**数据科学能力(CAP)创造价值,但主要是当该能力被整合为公司的核心竞争力时。边缘权重显示来自结构方程模型的标准化负荷,除了 CAP → VALUE (p = 0.71),潜在结构之间的路径在 p ≤ 0.01 时显著。为清晰起见,未显示剩余差异。
在实践中,这一结果对于刚开始数据科学之旅的组织来说可能是最重要的。在 DAIN 工作室,我们与之前进行数据科学试点研究的客户合作,但他们对这些项目没有对他们的业务产生变革性影响感到失望。小项目本质上没有错——它们是在组织内建立能力和信任的好方法——但是它们需要有助于可持续的核心竞争力。我们的顶级技巧包括:
- 试点研究团队应该是跨职能团队。不要只是将大量数据导出给数据科学团队,然后期望他们带着成品回来。合作有助于组织协调利益和工作流程,从而为更轻松地部署数据科学见解奠定基础。
- 选择试点研究,开发与战略目标一致的新能力。例如,如果公司的总体目标是通过 x% 增加收入,一个合适的试点研究可能涉及整合两个以前不相关的数据源,这些数据源提供了关于您的客户以及什么类型的优惠可能会吸引他们的更多见解。拥有一个分析路线图也是很有帮助的,它描绘了单个项目如何共同促进所需功能的开发,例如数据存储基础设施、算法开发或可视化。
发现 2:快速发展行业的公司更有可能拥有强大的 DS 核心竞争力
对于不同的企业类型,上述关系如何变化?先前的研究表明,企业特征对企业的敏捷性影响很小,甚至没有影响(见图 1 标题中的参考文献);然而,目前的结果突出了两个重要的特点:一个公司的整个行业和它的个人历史(图 4 和图 5)。
**图 4。**公司特征—如行业(F1:行业= ICT?F2:工业=服务业?)、规模(F3)及其数据科学能力的年龄(F4) —被发现对数据科学成为核心竞争力的程度有显著影响。边缘权重显示了来自结构方程模型的标准化负荷,除了 CAP → VALUE (p = 0.392),潜在结构之间的路径在 p ≤ 0.01 时显著。为了清楚起见,没有显示残差方差和外生协方差。
**图五。**公司特征会影响数据科学成为核心能力的程度。所有特征都被建模为虚拟变量。老牌公司是那些超过 25 年或拥有 1000 多名员工的公司。线条表示 95%置信区间,F1 和 F3 在 p < 0.05 显著(F2 → CORE,p = 0.075F4 →核心,p = 0.093)。
先说行业。相对于所有其他行业,ICT 和服务行业的公司在数据科学方面拥有最强的核心竞争力。环境速度的概念有助于解释为什么会出现这种情况(McCarthy 等人、2010)。企业竞争环境的变化速度——例如,企业使用的基础技术、产品供应、客户需求等——在塑造企业为保持竞争力而必须拥有的资源和能力方面起着重要作用。现代市场是充分开放和动态的,企业至少需要某种程度的动态能力才能生存,但在高速环境中,竞争优势的持续时间是不确定的,可用于决策的时间是有限的,动态能力本身是不稳定的(Eisenhardt 和 Martin,2000)。出于这个原因,Schilke (2014)认为,当环境变化的方向和幅度大致可以预测,并且开发这种能力的成本可以在一定程度上收回时,动态能力对竞争优势的贡献最大。随着行业的成熟以及所需资源和能力变得更加广泛可用和标准化,这种“适度”的环境速度似乎适用于数据科学和分析(Ransbotham et al. ,2016)。
对于大多数公司来说,数据科学只是公司整体能力的一部分,因此母行业的发展速度仍然很重要。例如,ICT 行业是由快速的外生技术发展推动的,因此我们希望这些公司拥有整合数据科学能力的经验和能力,无论数据科学是否代表另一波重大创新,或者只是“新瓶装旧酒”。类似地,服务公司的创新周期更短,更容易试验和适应新技术。相比之下,医疗保健、制造或其他行业的公司可能更习惯于由监管变化或有限竞争等因素驱动的较慢的环境速度。
因此,企业应该密切关注其行业的环境速度。如果变革的步伐缓慢,那么可能会有更多的时间来开发数据科学能力。然而,如果变革的速度更快,那么企业需要更加积极主动。这凸显了那些习惯于较慢变革速度、但现在面临新进入者破坏的公司面临的特殊风险;事实上,许多医疗保健公司已经开始认识到将数据科学和人工智能引入其价值链所带来的战略威胁( 1 、 2 )。
发现 3:公司历史影响数据科学核心竞争力的强度,但关系是复杂的
上述回归结果还包括公司历史的属性,即它是否是一家老牌公司(超过 25 年或超过 1000 名员工)以及它的数据科学能力是超过还是少于两年。然而,鉴于这项研究中有限的数据,这个故事仍然不清楚。
拥有年轻数据科学能力的公司似乎拥有更强的核心竞争力。这可能是因为这些公司本质上是数据科学的后期采用者,并且能够从他人的经验中学习。例如,最近的报告( 1 , 2 )表明,德国公司在更普遍地采用数据科学和数字技术方面落后于国际同行。作为一家拥有德国和芬兰共同传统的公司,DAIN 工作室通过安排“体验之旅”,展示在数据和人工智能方面拥有核心竞争力意味着什么,帮助客户克服了一些障碍。
更大、更成熟的组织似乎也具有更强的核心竞争力,而人们可能会认为这些公司很难将新的数据科学技术应用到现有流程中。一种可能的解释是,这些公司只是将现有能力重命名为“数据科学”,例如,通过更名“商业智能”功能或将数据科学嵌入业务部门。或者,成熟企业的持久成功可以建立在敏捷性能力的基础上,这种能力允许几乎任何新的能力一旦被认为与公司的总体方向有很强的一致性,就可以被迅速采用。
需要做更多的研究来更好地理解这些影响。然而,在实践中,人们应该意识到公司内部的潜在冲突,这些冲突可能会阻止数据科学能力成为核心竞争力。这些可以用三个尺度来描述:
- 个人:保险行业报告称,由于“墨守成规的传统主义者和危险的牛仔”之间的冲突,很难调和现有的分析能力和新的数据科学家。
- 运营:数据科学和 IT 职能部门之间经常发生冲突。例如,现有的 IT 采购和安全政策可能会限制数据科学团队开展工作的能力。这里的关键是区分实验和生产;这两个活动之间显然存在依赖关系,但是风险在于,过于关注生产系统的约束会抑制生产性实验。这种运营冲突更有可能发生在具有风险规避文化的公司中。
- 战略:在成熟的公司中,数据科学项目和能力通常在高层管理人员的支持下启动,希望数据科学能够为公司带来重大价值。因此,可以理解的是,现有的 It 职能部门可能会认为数据科学团队侵入了他们的地盘,并声称现有的 IT 活动也是“数据科学”。这可能会在组织内部造成政治冲突,再次阻碍数据科学成为核心竞争力。
这些障碍没有简单的解决办法。但是仔细考虑一个组织的历史并识别潜在的冲突来源有助于顺利采用数据科学。
发现 4:所有数据科学能力都很重要,但有些能力比其他能力更重要。
研究结果 1 表明,企业的数据科学能力通过数据科学核心能力间接影响其从数据科学中创造价值的能力。但是,我们所说的数据科学能力是什么意思呢?
根据文献(如 Gupta 和 George,2016),数据科学能力可分为三个部分:
- 技术资源,如数据源和数据处理技术;
- 人的技能,包括技术和管理技能;和
- 无形资源,例如组织学习和数据在决策文化中的作用。
目前的问卷采用了同样的模式,但验证性因素分析发现,并非所有这些组成部分都同等重要(图 6)。
**图六。**验证性因素分析表明,公司数据科学能力的最重要元素是其员工的技术和管理技能。数据资产、技术和决策文化不太重要,在最终模型中被忽略了。
有形的数据科学资源,如数据和技术,在该分析中的负载相对较低。这与以前关于信息技术战略管理的文献一致,这些文献认为,当这些资产可以在公开市场上容易地获得时,它们提供的竞争优势很小(例如,Powell 和 Dent-mical lef,1997)。可以说,许多数据科学技术正在被类似地商品化;例如,本次调查中使用的调查项目最初是在 2016 年编写的,涉及 Hadoop 和 NoSQL,这些技术现在被许多数据科学家视为标准(甚至过时)。
这意味着数据科学能力的战略优势主要来自那些难以在企业间复制的因素:即,人力技能和无形资源。虽然人们可能希望在本次调查中看到数据驱动的决策文化项目的更高负载,但技术和管理技能被确认为整体数据科学能力的最佳反映。随着时间的推移,这种情况会如何变化还不确定。一些评论家认为,目前由数据科学家完成的许多任务将在不久的将来实现自动化,这意味着技术技能在组织之间可能变得不那么独特。
这些发现在实践中意味着什么?
- 仔细思考外包的技术技巧。公司可以在技能获取的“做”和“买”两种模式上取得成功,但它们也可能在两种模式上挣扎。一个有用的启发是问自己,这种技术技能在多大程度上促进了我们客户产品的核心部分?如果答案是“不太多”,那么外包可能是好的。但是,如果你的整个企业会因为关键技术人员的离开而受到威胁,那么最好将这些技能留在公司内部。正如普拉哈拉德和哈默尔指出的:
“在我们看来,太多公司在削减内部投资时,无意中放弃了核心竞争力,他们错误地认为内部投资只是为了外部供应商的‘成本中心’。”(第 7 页)
- 成功建立和管理数据科学团队是另一个话题,但在最近的一篇斯隆管理评论文章中,Roger Stein 强调了教育的重要性。组织(尤其是大型组织)中的数据科学家需要与其他业务部门合作,以增加他们对业务领域的了解,了解业务文化中的本地差异,并解释数据科学项目可能与成熟的工作实践有何不同。特别是如果你是一名数据科学经理,这些任务应该像代码审查和技术讨论一样成为你日常工作的一部分。
摘要
数据科学作为一种职业正在走向成熟,它已经成为许多现代组织中的一项重要职能。然而,企业仍然面临着从数据科学能力中提取价值的真正挑战。这项研究证实,仅仅购买“一公斤艾”是不够的;组织还必须努力使这种能力成为公司的核心竞争力,对多种资源和能力、多种产品和服务产生影响。这一挑战的规模似乎取决于公司及其行业的属性。虽然可以采取具体步骤来促进这种关系,但没有简单的解决办法。开发为您的公司创造价值的数据科学能力需要时间和精力。
技术札记
理论模型(图 1)描述了三个潜在结构之间的关系:数据科学能力(CAP)、数据科学核心能力(core)和数据科学价值(value)。由于这些结构不能直接测量,回答者被问了一系列关于整体结构的具体元素的问题。潜在结构不是由这些项目分数的组合形成的,而是被设计成在测量项目中反映的 T2。例如,数据科学能力的总体水平反映在关于数据科学技术使用、技术和管理技能水平以及数据驱动文化方面的具体问题的答案中。
每个潜在的结构都是基于先前发布的调查工具(CAP 和 CORE)或在试点研究中评估的(VALUE)。在拟合整体模型之前,用验证性因子分析检查每个结构。由于没有足够的数据来支持更复杂模型(如 CAP)的拟合,因此必须简化一些结构。对于其他结构,内部有效性和一致性检查表明,可用的数据不支持提出的理论模型,项目要么被分配到其他结构或完全从模型中删除。
这项研究有两个主要的局限性。第一个是相对较小的样本量,,这是 SEM 研究中的一个常见问题,它实际上限制了可评估模型的复杂性。但此外,样本是异质的,包含了来自不同国家、行业和职业经历的受访者;未来的研究最好侧重于数据科学界的特定领域,或者在数据收集方面投入更多资金。
问卷项目
- DM1:性别
- DM2:你住在哪里?
- DM3:你有多少年的职业经验?
- DM4:你从事什么行业?
- DM5:你的组织有多少员工?
- DM6:你的组织的主要收入来源是什么?
- DM7:你的组织有多老了?
- DM8:贵组织的数据科学能力有多强?
- D2:我们将来自多个内部来源的数据整合到一个数据仓库或数据集市中,以便于访问。
- T1:我们已经探索或采用了并行计算方法(如 Hadoop)来处理大数据。
- T3:我们已经探索或采用了基于云的服务来处理数据和进行分析。
- T5:我们探索或采用了新形式的数据库,如用于存储数据的 NoSQL。
- TS3:我们的数据科学员工拥有成功完成工作所需的技能。
- TS4:我们的数据科学员工接受过适当的教育,能够成功完成他们的工作。
- TS6:我们的数据科学员工训练有素。
- MS2:我们的数据科学经理能够与职能经理、供应商和客户合作,确定数据科学可能给我们的业务带来的机会。
- MS3:我们的数据科学经理能够以支持其他职能经理、供应商和客户的方式协调数据科学相关活动。
- MS4:我们的数据科学经理能够预测职能经理、供应商和客户的未来业务需求。
- MS5:我们的数据科学经理非常清楚在哪里应用数据科学。
- DD2:我们的决定是基于数据而不是直觉。
- DD3:当数据与我们的观点相矛盾时,我们愿意超越自己的直觉。
- DD4:我们不断评估和改进业务规则,以响应从数据中提取的洞察力。
- DD5:我们不断指导员工根据数据做出决策。
- M1:我们的数据科学能力使我们能够在多个产品或服务市场上竞争。
- M2:我们的数据科学能力对我们最终产品或服务的感知客户利益做出了重大贡献。
- M3:竞争对手很难模仿我们的数据科学能力。
- M5:如果没有我们的数据科学能力,我们将面临错失未来增长机会的风险。
- I1:我们的数据科学能力协调整个企业的各种技能、数据和技术。
- I2:数据科学是我们组织最重要的能力之一。
- VD1:我们组织的数据科学计划与组织的使命、目标、目的和战略相一致。
- VD3:我们根据对业务绩效的预期影响来确定数据科学投资的优先级
- VC1:数据科学在多大程度上被用于支持内部运营,例如改善生产和运营流程、提高生产率、提高灵活性和设备利用率、简化运营
- VC3:数据科学在多大程度上被用于支持创造客户价值,例如提高产品/服务质量,更好地响应客户需求,更好的售后服务和支持,提高客户忠诚度
- VR1:我们比竞争对手更快地进入新市场。
- VR3:总的来说,我们比竞争对手更成功。
参考
Barney,J. B .,Ketchen,D. J .和 Wright,M. (2011)“资源基础理论的未来:复兴还是衰落?”,管理学杂志。由 J. B. Barney、D. J. Ketchen 和 M. Wright 编辑,37(5),第 1299-1315 页。doi:10.1177/0149206310391805。
Buckley,D. P .,Gerald C. Kane 和 Natasha (2017)“实现数字化成熟”,麻省理工斯隆管理评论。可在:https://Sloan review . MIT . edu/projects/achieving-digital-maturity/。
艾森哈特,K. M .和马丁,J. A. (2000)“动态能力:它们是什么?”,战略管理杂志;芝加哥,21(10/11),第 1105–1121 页。
Ghasemaghaei,m .,Hassanein,k .和 Turel,O. (2017)“通过使用数据分析提高企业敏捷性:fit 的作用”,决策支持系统,101,第 95–105 页。doi:10.1016/j . DSS . 2017 . 06 . 004。
Grant,R. M. (1991)“基于资源的竞争优势理论:对战略制定的影响”,加利福尼亚管理评论;伯克利,第 33 卷第 3 期,第 114 页。
Gupta,m .和 George,J. F. (2016)“发展大数据分析能力”,信息&管理,53(8),第 1049–1064 页。doi:10.1016/j . im . 2016 . 07 . 004。
Krishnamoorthi,s .和 Mathew,S. K. (2018)“商业分析和商业价值:比较案例研究”,信息&管理,55(5),第 643–666 页。doi:10.1016/j . im . 2018 . 01 . 005。
McCarthy,I. P .,Lawrence,T. B .,Wixted,b .和 Gordon,B. R. (2010)“环境速度的多维概念化”,《管理学会评论》,35(4),第 604-626 页。
Mikalef,p .、Pappas,I. O .、Krogstie,j .和 Giannakos,M. (2018)“大数据分析能力:系统性文献综述和研究议程”,信息系统和电子商务管理,16(3),第 547-578 页。doi:10.1007/s 10257-017-0362-y。
t . c . Powell 和 Dent-mical lef,A. (1997)“作为竞争优势的信息技术:人力、业务和技术资源的作用”,《战略管理杂志,第 18 卷第 5 期,第 375-405 页。
Prahalad,C. K .和 Hamel,G. (1990)“企业的核心竞争力”,《哈佛商业评论》,68(3),第 79-93 页。
Ransbotham,s .、Kiron,d .和 Prentice,p . k .(2016)‘超越宣传:分析成功背后的辛勤工作’,麻省理工学院斯隆管理评论,57(3),第 3-16 页。
Schilke,O. (2014)“论竞争优势动态能力的权变价值:环境动态性的非线性调节效应”,战略管理杂志,35(2),第 179–203 页。doi: 10.1002/smj.2099 。
Sheng,j .、Amankwah-Amoah,j .和 Wang,X. (2017)“大数据在管理研究中的多学科视角”,《国际生产经济学杂志》,191,第 97–112 页。doi:10.1016/j . ijpe . 2017 . 06 . 006。
Teece,D. J. (2007)“阐明动态能力:(可持续)企业绩效的本质和微观基础”,战略管理杂志,28(13),第 1319-1350 页。doi: 10.1002/smj.640 。
n .文卡特拉曼、J. C .亨德森和 s .奥达赫(1993)“持续战略联盟:利用信息技术能力取得竞争成功”,《欧洲管理杂志》,11(2),第 139-149 页。doi:10.1016/0263–2373(93)90037-I。
Vidgen,r .,Shaw,s .和 Grant,D. B. (2017)“从业务分析中创造价值的管理挑战”,欧洲运筹学杂志,261(2),第 626–639 页。doi:10.1016/j . ejor . 2017 . 02 . 023。
Wernerfelt,B. (1984)“基于资源的企业观”,战略管理杂志,5(2),第 171-180 页。doi:10.1002/smj . 4250050207。
我在整篇文章中使用了“公司”一词,但这种分析并不取决于所讨论的组织是否追求利润。
包括政府、金融、专业服务和非营利组织。
候选药物筛选是如何进行的?
数据科学家入门。
**一种化合物(“配体”)停靠在酶蛋白中(左:“卡通”视图,右:“表面”视图)。**资料来源:EMSKE Phytochem,软件:PyMol
当谈到药物试验时,在产生实验室(体外)和临床(体内)试验的额外费用之前,有必要列出高潜力候选人的名单。大多数制药公司在现实世界的试验之前进行“电子”筛选:他们希望尽可能以最少的“错过”成本通过“击中”筛选。
在对我们大多数最近的 关于抗病毒疗效的的背景研究中,我意识到对于数据科学家观众来说,没有很多药物对接“如何做”。数据科学武库中的这一明显差距让我感到有点难过,因为数据科学家可能是这些工具最高效的用户之一。如果有一代“生化数据科学家”挥舞着生化软件工具来解决人类最大的健康挑战,那就太好了。
如果数据科学家能够克服对使用开源工具的恐惧或不熟悉,这将是可能的。一定要接受你的生物化学家/分子生物学家/病毒学家同事,但不要陷入这样的陷阱,认为你不可能在他们的领域有独特的范围。恰恰相反,这些科学的实践者可以从你的支持中受益匪浅。从经验来看,他们中最聪明的人甚至张开双臂欢迎你。
然后,在这个池塘里放入一块早期的鹅卵石,这是我们为数据科学界准备的关于药物对接的初级读本,通过我们将这些工具应用于一个特定的应用——病毒学——的方法来说明。
背景
在 EMSKE,我们开发了一种自动筛选过程,以在计算机上分析新型冠状病毒冠状病毒的主要蛋白酶(“Mpro”)的候选植物化合物。(这种蛋白酶不要与病毒的第二种蛋白酶 PLpro 混淆)。
一个良好的抗病毒筛选释放了对靶向病毒酶进行早期、大量“赞成/反对”指示的能力。为什么针对主要的蛋白酶?只要一种安全的候选药物(在体外证明对这种关键酶具有抑制作用)能够通过人体代谢和跨细胞膜,那么它就可以一次性杀死病毒。当然,这不是唯一值得靶向的病毒蛋白,但它是比尖峰抑制剂更好的选择,在尖峰抑制剂中,你需要处理多个尖峰,才能对其进入细胞产生任何效力。
计算机筛选基础
我们的屏幕位于一个名为 Autodock Vina 的药物对接工具之上。Autodock 和 Autodock Vina 是由斯克里普斯研究所推出的开源工具。它植根于机器学习,使用梯度下降来寻找符合的、极性吸引的候选化合物“姿势”,以符合正在研究的任何蛋白质受体位点。十多年来,Autodock 系列对接软件已被生命科学研究人员广泛应用于筛选已出版的生物化学文献。Vina 是 Autodock 的成本函数和得分细化,与原始 Autodock 相比,它提高了命中失误的准确性,并显著提高了计算速度。以下是自动对接工具的一般工作流程:
自动对接流程图(来源: MTIOpenScreen ,( CC BY 4.0 )修改为通用自动对接)
- 下载自动对接 Vina
- 从蛋白质数据库下载(较大的)pdb 文件。
- 从在线数据库下载 3D SDF 格式的化合物(称为“配体”),通常是 P ubChem 或 ZINC。
- 为了让 Autodock Vina 与它们一起工作,您需要将化合物和配体转换成。pdbqt 格式。转换是通过 Scripps 网站的 MGLTools 下载页面中的一个工具包完成的(如果你是 Mac 用户,你会希望确保在未升级的 32 位 Mac OS 版本上运行它)。
- 使用 MGLTools 的 prepare_receptor4.py 将蛋白质 pdb 文件转换为。pdbqt 我们更喜欢使用 obabel(不幸的是,obabel 是它自己的安装成果,但是对于 Mac 用户来说,babel 是一个令人愉快的前端)和 prepare_ligand4.py 的组合来转换。sdf 文件转换成。pdb 以及随后的。pdbqt 分别。
现在你几乎准备好做对接运行!剩下要整理的项目是搜索框。Vina 通过迭代 3D 位置、方向和配体旋转键构象的多维空间进行梯度下降搜索。它在用户以埃为单位指定的三维体积搜索框内搜索。用户还指定搜索的中心。总的来说,这些参数允许选择“盲”搜索,即包含整个蛋白质的搜索体积(我们使用 150 埃)。对于与活性位点的靶向对接,更紧密的搜索体积(我们使用 30 埃)缩小了搜索范围并加快了计算速度。
使用像 PyMol 这样的 3D 可视化程序,很容易确定盲对接的坐标(通常是蛋白质的估计几何中心)。对于目标站点,只需打开人类可读的 pdbqt 文件本身,并找到目标站点感兴趣的氨基酸。活性位点的氨基酸是从感兴趣的蛋白质的公开文献中确定的。对于 SARS-CoV 的 Mpro,我们通常查看由 A-组氨酸-41&A-半胱氨酸-145 定义的活性位点。(“A”是指结合形成该酶蛋白整体的两条氨基酸链中的一条)。
根据配体-蛋白质复合物能级定义的成本函数梯度下降,Vina 迭代配体相对于蛋白质表面的位置、旋转和结构姿态。它不是直接考虑配体分子和蛋白质受体表面上相反电荷的吸引力,而是成对地观察配体和受体之间在给定姿势下产生的原子键。Vina 根据-4 到-12 的范围生成结果(形式上:以每摩尔千卡为单位)。换句话说,像 Autodock Vina 这样的对接软件是从最小化一组化学键的“能量水平”的角度来考虑的,这些化学键是由化合物对蛋白质受体位点的姿态决定的。
我们对 Vina 的应用基本上保持了这一规模,但应用了一些基本逻辑,并对蛋白质受体位点的组合进行了适当次数的试验。这样,我们的结果(负数越大,抑制性越强)可能更好地反映了一种化合物击败病毒自我复制能力的倾向,如下图所示。
我们如何有效地将这一工具应用于冠状病毒的主要蛋白酶?
当早期的 SARS 病毒在 2003 年首次袭击时,在随后的几年中,研究人员有足够的时间和资金对病毒的主要蛋白酶 Mpro(在早期的 SARS 文献中通常称为 3CLpro)进行体外抑制研究。研究人员正在研究确定哪些化合物可以抑制这种蛋白酶在培养皿中的生长(称为体外*)。*
为什么以蛋白酶为目标?因为它能一次性杀死病毒。蛋白酶作为靶标的功效已经得到了很好的确立,特别是得益于 20 世纪 90 年代出现的 HIV 蛋白酶抑制剂。
关键的是,SARS 2003 冠状病毒与目前的 2019 冠状病毒非常非常相似。这两种病毒的主要蛋白酶在氨基酸序列上有 95%的同一性,主要区别在于它们的三维折叠结构。
将体外结果视为我们的“真理来源”,我们将我们对 2003 年 SARS Mpro 的 Autodock 研究结果与自该流行病以来 16 年间研究人员的体外结果进行了逐个化合物的比较。然而,很难知道在现实生活中,体外研究人员设法将他们的抑制化合物结合到哪个目标位点。就像一种真正的化合物可以结合到不同的位点并有可能抑制一样,我们也可以在不同的位点靶向自动对接。
因此,我们必须探索自动对接目标结果的不同组合。通过比较盲法、A 和 B 对接研究的组合结果(首先是单独的,然后是彼此不同的组合)并与相同化合物的真实体外数据进行比较,我们得出了以下与真实数据相关性最高的组合:
经处理的 Autodock 结果与体外研究的相关性
我们获得了 0.362 的 R,这是一个对于生化病毒学研究来说并非非典型的值。
形成分类器的时间
有了相关性,我们现在可以开发一个分类器,用于将抑制性的‘命中’配体与无价值的‘缺失’配体分开。
体外研究人员将任何抑制浓度为 100 uM(微摩尔)或更低的化合物视为体外“命中”的低端截止值。这相当于 log10 值为 2.0。因此,我们通过将模拟的 27 种化合物针对相似的原始 SARS (2003)冠状病毒 Mpro 的多个活性位点的 Autodock Vina 结果与相同化合物的那些实际的体外实验室抑制结果进行比较,来训练我们的分类器。我们对几个活跃网站的 Vina 结果进行了最符合实际的表述,得出了以下命中失误图表:
Autodock Vina 结果的 ML 分类器的 27 种化合物训练集适用于 SARS-2003 化合物
受益于这个训练集,我们分析了我们的 Vina 结果公式对一个额外的 8 化合物测试集。分类器证明,任何具有 -7.7 千卡/摩尔分数或以上的物质都应被归类为“击中”。
我们的 ML 分类器对另外 8 种化合物的测试结果,也是基于 SARS-2003。
我们的 ML 分类器对另外 8 种化合物的测试结果,也是基于 SARS-2003。
基于测试集,我们的分类器显示了 87.5% 的分类准确率*。***
离别的思绪
请考虑鼓励你自己准备好工具,在家尝试你自己的对接研究。在野外有许多感兴趣的病毒酶(和正常的生化过程蛋白),人们可以尝试与之对接。如上所述,通过将结果与已公布的真实体外研究结果进行比较,确保你的模拟是有根据的。你想把假阳性和真阴性保持在最低限度,但是谦逊要求你接受即使这样也会有一些假阳性和真阴性。
正如本文开头提到的,即使你有了体外 hits,仍然需要对摄入的任何物质应用整个药代动力学建模过程(这被称为 ADME 建模),以及细胞膜进入建模,以防你的候选药物需要进入细胞内部。甚至还有药物相互作用模型来避免药物在人体内的意外后果。这些工具比药物对接处于更早的成熟水平,但也许配备生化设备的数据科学家可以帮助这些努力更快地达到成熟。
但总的来说,计算机是运行模拟生化分析的一个非常安全的环境。(到了得出结论和开始实验室测试的时候,问题就开始了)。但是在你达到那一点之前,无论如何,D̶o̶n̶’̶t̶在家里试试这个。
正如全球毒品码头工人喜欢说的那样— —“对接愉快!”😃
作者想要感谢 1 .开源软件 Autodock、Vina、MGLTools 的创始人和贡献者 2 .MTiOS 主持的对接计划;第三。英国剑桥大学蛋白质晶体学博士余伟臣,致力于 跨越 几十年来 构建意识的计算药物对接工具。
9 月 3 日更新:之前的描述称 Vina 考虑了受体和配体之间原子对的极性。事实上并非如此;相反,Vina 根据两个原子之间形成的键的类型进行评分,但没有执行基于物理学的原子之间的极性模型。这是有意的,因为它 比 Vina 开发之前基于物理的模型更好地匹配了真实世界的蛋白质-配体结合亲和力 。
RNN(及其变体)中的屏蔽是如何工作的,为什么
Keras 有一个掩蔽特性,在 RNNs 中经常提到。在这里,我给出了一个快速的可视化来展示它做了什么,并解释了为什么需要这样做。
如果你正在阅读这篇文章,你可能知道为了计算效率以及减少梯度下降路径中的太多随机性,学习是分批进行的(出于某种原因被命名为小分批)。如果您正在处理序列,那么在大多数情况下,序列的长度不会相同,然后要进行批处理,您需要对序列进行“0 填充”。这可以在序列的开始或结束时完成。
现在,如果你在这样的小批量上学习,你的系统最终会学习忽略 0 填充的条目,但这将浪费学习周期。因此,你应该用这个来帮助你的算法。
在 Keras 中,您可以通过向支持它的层提供遮罩来打开遮罩,嵌入层甚至可以生成这样的遮罩。您可以在张量流指南中找到详细信息。
在这篇短文中,我将帮助您直观地了解 RNNs 及其变体中掩蔽的作用。
我们认为迷你电池
inputs=tf.constant([[1,2,4,0,0,0],
[0,0,0,1,2,4],
[0,1,0,5,7,0]
])
如上所述,第一个元素是“后填充”,第二个是“前填充”,第三个是随机插入 0 的序列。我们将看到掩蔽对这三者的影响。
我们制作一个普通的 RNN 单元,它通过给状态加 1 来修改状态,并输出输入和 new_state 元组。这是非常不现实的,但将有助于我们想象在喀拉什发生了什么
class TrivialRNNCell(keras.layers.SimpleRNNCell):
def call(self,inp,state):
next_state=state[0]+1.
return (inp,next_state), next_state
最后,我们使用 Keras 的函数式 API 制作了一个非常简单的模型
inputs=keras.layers.Input(shape=(None,1))
mask = keras.layers.Lambda(lambda inputs: K.not_equal(inputs,3))(inputs)
seq,state=keras.layers.RNN(TrivialRNNCell(1), return_sequences=True,return_state=True)(inputs,mask=mask)
model=keras.Model(inputs=[inputs],outputs=[seq,state])
该模型将小批量作为输入,并将 RNN 输出和状态作为输出。
正如你在上面看到的, 所有被屏蔽的值都被忽略,那些时间步长的输出和状态只是从最后一个非屏蔽状态复制过来的。
为什么会有这种行为?对于一个最后被填充的序列,很容易看出我们想要的 RNN 隐藏状态是最后一个有效(非填充)输入步骤的状态。这正是第一个例子中发生的情况。如果我们在开始时填充了一个序列,那么默认状态将继续,直到遇到第一个相关状态,这就是第二个示例中发生的情况。第三个例子在处理缺失数据时可能有用,在这种情况下,插补方法是简单地结转最后的结果(这是与时间序列数据相关的因果插补)。
这部分总结了我想在这里说的,但请阅读张量流指南,看看掩蔽还有什么作用。一般来说,您还希望确保损失函数只考虑实际数据(而不是填充产生的虚假数据),而掩码对此很有用。此外,在注意机制中,你要注意与此相关的真实数据掩蔽。事实上,我是在全神贯注地为一个编码器-解码器架构编写代码时产生了这篇文章的想法。最后,掩蔽也与保持因果关系相关。
项目管理如何在数据科学中发挥作用?
为什么将数据科学融入传统的项目管理方法如此困难?
愚蠢的一致性是心胸狭窄的妖怪。
拉尔夫·沃尔多·爱默生(1803-1882)
数据科学通常不太适合其他学科早已确立的标准项目管理方法。这是为什么呢?
数据科学项目传统上涉及一个漫长的探索阶段,甚至在项目后期还有许多未知因素。这不同于传统的软件开发,在传统的软件开发中,一开始就可以列举和量化任务。软件项目经理通常会在编写一行代码之前定义项目的持续时间和最终结果。
传统方法
甘特图的一个例子。来源:维基媒体
最著名的传统项目管理方法有
- 瀑布——以甘特图而闻名,一种显示任务及其依赖关系的级联条形图。
- 敏捷——任务分成 1-2 周的冲刺。
- 看板——卡片从到从左到右穿过一块板,进入进程到完成。
- 还有一个面向数据科学的项目管理系统叫做 CRISP-DM ,它涉及到项目的一系列阶段:业务理解、数据理解、数据准备、建模、评估、部署。
我认为所有这些方法的主要问题是数据科学项目是高度不可预测的,并且容易发生变化。不幸的是,在投入相当大的努力之前,通常甚至不可能预测数据科学项目可以实现什么。
那怎么办呢?
我建议在一周的初步探索阶段结束之前,不要决定项目结构。
然后,我建议确定业务需求:
- 部署的预测模型?
- 独立分析?
- 一个完整的网站和 API?
关键是灵活性,这些需求以后可能会改变。
一个例子
让我们举一个例子:一个部署预测模型的项目。让我们假设商业广告和利益相关者的认同已经到位。假设一家假设的企业想要一个预测模型来预测其客户将购买哪些产品。
该项目可能大致分以下几个阶段进行:
- 2-5 天:了解业务问题。
- 2-5 天:了解可用的数据。你开始了解这个项目是否可行,以及它是否会持续几周、几个月或几年。
- 10-20 天:建立一个“快速和肮脏”的原型。这可能只能在笔记本电脑上运行,但会给涉众一种可以实现的定性感觉。
- 利益相关者会议:定义 KPI 和需求、时间表等。到这个时候,你就会知道这个项目需要多长时间——比软件开发或建设项目要晚得多。
- 3-6 个月:完善模型,并找出如何让它在实时数据上运行。这通常包括建立 200 个不同的模型,根据 KPI 评估每个模型。随着项目和模型的形成,在整个过程中还将与涉众进行密切的沟通。
- 3 个月:部署、负载测试、质量保证,确保它与客户的系统集成。这涉及到客户端的开发人员,可以用常用的软件开发工具进行项目管理。
- 利益相关者会议,以评估项目结果、结束项目、移交、文档和维护计划等。
除了最后的部署阶段,我建议项目的所有阶段都应该非常灵活地定义。
特别是,如果你在第一次尝试量化一项任务时认为它需要 1 个月的时间,实际上它通常需要 2 个月,因为所有未知的障碍都有可能出现。项目中的任何一点都可能出现意外,所有意外都会延长而不是缩短总持续时间。
这种灵活性的另一面是,与利益相关方的定期会议、电子邮件和沟通是必不可少的,以确保企业了解最新的项目进展,数据科学家获得他们需要的一切(数据、安全访问、企业相关部门的合作等)。
结论
关键在名字:数据科学。科学包括定义假设并测试它,而数据科学包括尝试、失败和改进的迭代过程。试图将它硬塞到其他学科的项目管理技术中以失败告终,并增加了项目失败或被放弃的可能性。
我不想建议根本不要使用敏捷或瀑布方法。事实上,它们可能是必不可少的,尤其是当您必须扩展数据科学团队时。然而,所采用的任何项目管理方法都只能作为指导方针,而不能严格遵守。
Python 是如何工作的?
简单解释 Python 代码的执行与旧的编程语言有何不同。
作为一名机器学习工程师,我使用 Python 已经一年多了。最近也开始学 C++,为了好玩。这让我意识到 Python 是多么的简单和直观。我对 Python 与其他语言的不同之处及其工作原理更加好奇。在这篇博客中,我试图了解 Python 的内部工作原理。
Python 最初是 Guido Van Rossum 的爱好项目,于 1991 年首次发布。作为一种通用语言,Python 正在为网飞和 Instagram 等许多公司提供支持。在的一次采访中,Guido 将 Python 与 Java 或 Swift 等语言进行了比较,并表示后两者是软件开发人员的绝佳选择——他们的日常工作是编程,但 Python 是为那些日常工作与软件开发无关,但他们主要是为了处理数据而编码的人而设计的。
当你阅读 Python 的时候,你经常会遇到这样的词——编译 vs *解释,字节码 vs 机器码,动态类型 vs 静态类型,垃圾收集器等等。*维基百科将 Python 描述为
解释语言
当你用 C/C++写程序时,你必须编译它。编译包括将你的人类可理解的代码翻译成机器可理解的代码,或*机器代码。*机器码是可由 CPU 直接执行的指令的基础级形式。成功编译后,您的代码会生成一个可执行文件。执行该文件会逐步运行代码中的操作。
在很大程度上,Python 是一种解释型语言,而不是编译型语言,尽管编译是一个步骤。Python 代码,用写的。py 文件首先被编译成所谓的字节码(将进一步详细讨论),它与一起存储。pyc 或**。pyo** 格式。
它不是像 C++那样把源代码翻译成机器码,而是把 Python 代码翻译成字节码。这个字节码是一组低级指令,可以由一个解释器执行。在大多数 PC 中,Python 解释器安装在*/usr/local/bin/Python 3.8 .*不是在 CPU 上执行指令,而是在虚拟机上执行字节码指令。
为什么解释?
解释语言的一个普遍优点是它们是独立于平台的。只要 Python 字节码和虚拟机的版本相同,Python 字节码就可以在任何平台(Windows、MacOS 等)上执行。
动态类型是另一个优势。在像 C++这样的静态类型语言中,您必须声明变量类型,任何差异,比如添加一个字符串和一个整数,都会在编译时被检查。在像 Python 这样的强类型语言中,检查变量类型和执行的操作的有效性是解释器的工作。
解释语言的缺点
动态类型提供了很大的自由度,但同时也使代码有风险,有时很难调试。
Python 经常被指责‘慢’。虽然这个术语是相对的,并且有很多争议,但是速度慢的原因是因为解释器必须做额外的工作,将字节码指令翻译成可以在机器上执行的形式。一篇 StackOverflow 的帖子用一个类比更容易理解—
如果你可以用你的母语和别人交谈,这通常比让翻译把你的语言翻译成其他语言让听者理解要快得多。
垃圾回收到底是什么?
在早期的编程语言中,内存分配是相当手工的。很多时候,当你在程序中使用不再使用或不再被引用的变量时,它们需要从内存中清除。垃圾收集器会帮你做这件事。它自动释放空间,无需你做任何事情。内存管理有两种方式——
简单地说,它跟踪对一个对象的引用次数。当这个数字下降到零时,它会删除该对象。这被称为引用计数。这在 Python 中是不能禁用的。
在对象引用自身或者两个对象相互引用的情况下,一个叫做的代垃圾收集的过程会有所帮助。这是传统的引用计数无法做到的。
什么是 pycache?
在您的个人项目或 GitHub 上,您可能会多次看到名为 pycache 的文件夹被自动创建。
/folder - __pycache__ - preprocess.cpython-36.pyc - preprocess.py
如您所见,该文件名与 pycache 文件夹外的文件名相同。的。pyc 扩展告诉我们文件包含 preprocess.py 的字节码。名字 cpython 表示解释器的类型。CPython 意味着解释器是用 C 语言实现的。类似地,JPython 是用 Java 实现的 Python 解释器。
但是为什么首先要创建文件夹呢?嗯,它稍微提高了 Python 程序的速度。除非您更改 Python 代码,否则可以避免重新编译成字节码,从而节省时间。
我已经开始了我的个人博客,我不打算在媒体上写更多令人惊叹的文章。通过订阅 thenlp.space 支持我的博客
恶劣天气如何影响您的客户?
如何创建风暴事件的动画可视化
图片由 Free-Photos 来自 Pixabay
我们经常被要求寻找关于客户的新见解。有时我们得到指导,有时我们被告知开发一些“新”的东西。
我想建议把恶劣天气作为一层数据。如果客户所在地区正在经历极端天气事件,他们的行为会发生变化吗?他们会在网上购物、平衡投资资产配置、阅读电子邮件、联系呼叫中心或注册新的数字产品吗?不同的天气事件是否与特定的客户行为相关?您能够根据天气预报预测未来的客户活动吗?这有业务用例吗?
所以你的基础数据就是你的客户业务数据。“Flair”是天气数据。
天气数据可能很难掌握,但我确实有一个对我很有用的来源。国家环境信息中心是一个有用的资源。可以下载。您要分析的时间段的 csv 文件。
[## 风暴事件数据库
NCEI >风暴事件数据库批量数据下载该数据库目前包含从 1950 年 1 月到 2020 年 6 月的数据,如…
www.ncdc.noaa.gov](https://www.ncdc.noaa.gov/stormevents/ftp.jsp)
对于这个例子,我提取了 2020 年的恶劣天气事件细节。
数据字典—作者截图
我将这些信息加载到 Tableau Public 中。Tableau Public 对你我都是免费的!
以下是我制作 viz 动画的一些关键步骤。
如何设置动画—作者截图
- 在页面架上,放下事件的数据。这将添加一个特殊的动作框,你可以点击播放。添加日期序列将按增量(在本例中为天)遍历数据,显示所请求的数据。
- 为了激活地图选项,我在图表中添加了 begin_location。该数据将事件的位置放置在地图上。
- 我对事件类型感兴趣。您还可以将事件类型添加到过滤器架,以关注特定情况,如龙卷风、洪水、飓风或暴风雪。
- 为了增加一些严重性,我在 size 参数中加入了财产损失。伤害成本越高,圈子越大。
一旦你准备好了,你点击播放按钮,天气就开始变化了。有时候,你可以看到风暴系统从西向东沿着阿巴拉契亚山脉移动。
请随意下载该笔记本,将您的业务数据分层。我把它发表在 Tableau Public:https://public.tableau.com/profile/dmoyer#!/viz home/2020 weather inmotion/Location
尽情享受吧!
英国的新冠肺炎应对措施有多有效?
在英国封锁的第一周,一位同事分享了这篇来自华盛顿邮报的文章。我受到了疾病如何传播的伟大模拟和一些社会距离措施如何有助于减少传播的演示的启发。
作为对这篇文章的回应,我决定重新创建这些模拟,并为它们添加更多的细节。在本文中,我将讨论一些有趣的特定场景。相比之下,所有的场景都运行了相同的时间长度,但在某些情况下,这并没有足够的时间让疾病完全发展。
作者注: 马特·克鲁克斯是一位从事数据科学家工作的数学家。他不是健康专家、流行病学家或政府顾问。虽然本文中的模拟旨在展示某些真实现象,但它们并不代表病毒对政府干预的实际反应。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
无响应场景
我看到的第一种情况不涉及政府干预。它还排除了人们产生免疫力的可能性,因此如果他们与感染者接触,可能会再次感染病毒。
在下面的动画中,每个点代表一个四处走动和与人交往的人。如果两个人密切接触,感染者(橙色)和健康人(蓝色)之间会发生传播。我给每个点分配了一个年龄,与英国人口的正确比例大致相同。随机应用每个年龄范围的相应恢复率,死亡率随年龄呈指数增长。
我想强调的是,死亡率在模拟中被夸大了
在首次出现症状一周后,每个人随机地要么康复(变回蓝色)要么死亡(变红),其概率基于与年龄相关的恢复率。这里的大部分红点将与更古老的时代联系在一起。
每个点代表一个人四处走动和与人交往。如果人们密切接触,感染者(橙色)和健康人(蓝色)之间会发生传播。红点表示死亡。
下面显示了每个类别中人口的比例,时间沿 x 轴增加(有意模糊,因为它不代表真实时间)。我们可以看到这种疾病传播很快,直到大多数人被感染。尽管在任何特定时间都有一小部分人没有被感染,但这种疾病仍然非常普遍。每一次再感染都有死亡的风险,一次恢复并不意味着长期存活。我们还可以看到模拟早期臭名昭著的指数增长。
免疫反应情景
目前的证据表明,身体确实产生了免疫反应,至少在短期内——这表明康复的人不会再次感染。
在下面的模拟人中,那些康复的人会变成绿色,并且无法感染其他人。
从下图中我们可以看到,橙色区域的初始指数增长完全相同,因为我们必须等待人们恢复,然后免疫反应才会发生(绿色区域)。橙色区域显示的是活的感染,是我们听说过的“钟形”曲线。一段时间后,剩余的种群会产生完全的群体免疫。
死亡率也显著下降,因为在之前的场景中,每次有人被感染时,死亡的概率是随机的。在目前的情况下,人们只需要恢复一次就能获得免疫力。**
自我隔离
英国政府的第一反应是要求出现症状的人留在室内,7 天内不要与任何人接触。这样做的一个问题是,可能需要 5 天症状才会出现,在此期间,这个人可能仍然会感染其他人。
下面你会看到人们被感染(变成橙色),然后过一会儿就静止不动了——这是他们自我隔离,在此期间他们不会感染任何人。7 天后,大多数人产生免疫力,变成绿色,并开始再次走动。
至少在这个模拟中,自我隔离只有轻微的影响。这可能是由于早期的快速传播——大多数人在第一次感染出现症状并开始自我隔离之前就得了这种疾病。然而,我们确实看到“钟形曲线”的峰值从 80%的感染率下降到 75%。我们还可以看到尾部向峰顶右侧延伸。
社交距离
全球几乎每个国家的关键反应之一是社会距离——让人们保持 2 米的距离以降低传播速度。我们听说过很多关于“拉平曲线”的说法,它指的是加宽和缩短上面的橙色钟形曲线形状。
在下面的模拟中,我们看到最初的 3 种感染在很长一段时间内只发展成局部群集,这些群集内的人在疾病变得更广泛传播之前开始康复。
下面我们可以看到曲线急剧变平。现在曲线中没有明显的峰值。感染率最高可达 30-40 %,这个数字保持相当稳定——防止 NHS 同时被所有感染淹没。
我们也看到一部分人(10%)从未感染过这种病毒。虽然值得注意的是,模拟结束时仍有活感染(12%)。
无症状病例
事实上,症状出现平均需要 5 天时间,据信有 50%的人根本没有表现出任何症状。这似乎在儿童和年轻人中更为普遍。
模拟中的每个年龄都有不同的无症状可能性,老年人都有症状,只有极少数 10 岁以下的人有症状。如果我们考虑到无症状病例,那么我们将开始看到一些受感染的橙色圆点继续四处移动,并感染人们,即使他们已经开始自我隔离。
我们可以在下面看到,在模拟的中间区域有更多的感染,与逐渐下降到 30%相比,这段时间的感染率更稳定,为 40%。
学校关闭
学校停课对派对来说太晚了。我在上一节中展示无症状病例的影响的主要原因是,无症状病例在学龄儿童中的比例过高。我们可以通过在模拟中隔离 18 岁以下的学生来模拟学校关闭。这可以防止他们传染给其他人。在下面的模拟中,你会看到一些静止的蓝点,代表留在家中的健康儿童。
我们可以在下面看到,峰值再次下降到 40%以下。我们也看到病例的逐渐增加和急剧下降。这一点在避免被感染的人数中表现得最为明显,如模拟结束时的蓝色区域所示——28%的人口,相比之下,上图中只有 10%(同样,仍有活跃的感染,这可能会减少 28%)。我们还可以看到死亡率显著下降——首次降至 10%以下。
保护弱势群体
由于新冠肺炎在社会中最脆弱的人群中引起了更严重的反应,英国政府已经要求那些最危险的人进行防护——避免与他们家以外的其他人进行任何接触。在我们的模拟中,我们可以隔离 70 岁以上的人,防止他们被感染。在模拟中,你会看到很大一部分静止的蓝点,代表 70 岁以上的老人和学生。
通过隔离 70 岁以上的老人,我们减少了四处走动的人数,从而增加了模拟中的社会距离。这将感染的峰值进一步降低到大约 25%。不过,它对死亡率的影响最为显著。通过防止这些人患上这种疾病,我们可以对死亡率产生显著的影响——在模拟中将其降低到大约 3%。
我想再次强调,这些模拟中使用的死亡率是不现实的
结论
虽然这些模拟不是真实生活,但希望你能看到英国政府实施的一些社交距离措施的有效性。
机器学习探测系外行星的效率有多高?
“在某个地方,一些不可思议的事情正等待被知晓。”卡尔·萨根
我们生活在一个其规模超出我们想象的宇宙中。这个事实让我们质疑我们在宇宙中的位置,很自然地,我们问了这个问题:“我们在宇宙中是孤独的吗?”。它确实是一个大宇宙,只是观测部分覆盖了 10 颗⁴估计的恒星和 50×10 颗与地球相似的行星。
当我看着这些数字时,我会说,“哇,除了我们的星球之外,一定还有生命。”但是,我们没有任何证据来证明这一点,除了最近在金星的大气中发现的磷化氢。尽管如此,它并不是完全可靠的。今天,在望远镜、人造卫星和计算机等技术的帮助下,我们有可能研究其他恒星周围的行星。我们正在努力寻找像我们一样的其他行星和太阳系。
版权所有:欧空局
所以,出于对天文学的好奇,我决定在 Nasa 的系外行星档案上开发一个机器学习项目。通过这个项目,我的目标是测量 M.L 算法寻找其他行星的效率。
什么是系外行星?
系外行星是指在太阳系外围绕恒星运行的行星。搜寻系外行星有两个任务:开普勒,现在已经结束了,还有继续进行的 Tess 任务。这些年来,这些望远镜发现了许多系外行星。因此,我提取了观测恒星的数据集,以便找到系外行星。
版权所有:欧空局
第一步:数据知识
提取的 Nasa 数据集包含 9564 行和 141 列,这些列是关于恒星的特征,但我只需要每个恒星的时序通量数据。因此,我使用了lightkurve
包来维护时序流量数据。
#method to gather flux data
def TFsinglestarpipe(kepid):
try:
tpf = KeplerTargetPixelFile.from_archive(kepid, quarter = 1)
lc = tpf.to_lightcurve(aperture_mask=tpf.pipeline_mask)
flat, trend = lc.flatten(window_length=301, return_trend=True)
df = flat.to_pandas()df['KeplerID'] = kepid
df = df.drop(columns = ['time',
'flux_err',
'quality',
'centroid_row',
'centroid_col',
'KeplerID'], axis=1)
df = df.reset_index(drop=True)
df.index.names = [kepid]
flux = df['flux']
array = list(flux)
return array
except:
return None
在收集通量数据后,我得到了一个包含 7888 行和 1627 行的数据集——其中一列是 disposition feature,它指示了一颗恒星是否存在系外行星的状态。
有系外行星和无系外行星恒星的归一化通量水平。作者图片
步骤 2:特征工程
嗯,我的数据集是时间序列,不太适合机器学习算法,因为它有 1626 列。因此,我决定创建自己的数据集,其中包含更多的特征。
首先,我定义了具有统计显著性的特征:
#median flux
medians = []
for i in range(len(df)):
medians.append(np.median(df_values[i]))
#std
stds = []
for i in range(len(df)):
stds.append(np.std(df_values[i]))
#min flux
minimum = []
for i in range(len(df)):
minimum.append(np.amin(df_values[i]))
#max flux
maximum = []
for i in range(len(df)):
maximum.append(np.amax(df_values[i]))
#first percentile
frst_perc = []
for i in range(len(df)):
frst_perc.append(np.percentile(df_values[i], 1))#third percentile
thrd_perc = []
for i in range(len(df)):
thrd_perc.append(np.percentile(df_values[i], 3))#fifth percentile
fifth_perc = []
for i in range(len(df)):
fifth_perc.append(np.percentile(df_values[i], 5))
#seventh percentile
seventh_perc = []
for i in range(len(df)):
seventh_perc.append(np.percentile(df_values[i], 7))
#delta
delta = []
for i in range(len(df)):
delta.append(maximum[i]-minimum[i])
新约简数据集的相关矩阵。作者图片
步骤 3:分类模型
各种算法可用于分类任务。我从逻辑回归、朴素贝叶斯、SVC 等基本模型开始,然后跳到随机森林等集合模型。
作者图片
我的方法是,在运行完本节中的所有模型后,选择最佳模型进行优化。因此,我用默认参数运行了所有的模型,以查看结果。左图是我分类模型的结果。
我在 Bagging 分类器上得到最好的测试精度,因此我用它进行网格搜索。
n_est = [60, 80, 100, 120, 140, 160, 180, 200]
max_features_opt = [0.88, 0.91, 0.93, 0.95, 0.97, 0.99]param_grid = dict(n_estimators = n_est, max_features = max_features_opt)# GridSearchCV on the Bagging Classifier model to make it more robust
# Cross-validation
kf = KFold(n_splits = 10, shuffle = True, random_state = 76)
bag_grid = GridSearchCV(bag, param_grid, cv=kf, scoring='accuracy',
n_jobs=-1, verbose=1)
bag_grid.fit(X_train, y_train)
于是,我用GridSearchCV
调了调我的模型的参数,结果得到了 65,8%的准确率分数。以下是优化模型的相关矩阵:
作者图片
步骤 4:结论和进一步的工作
- 我通过定义的模型得到的最好结果是大约 67%的测试准确度。
- 我可以说 M.L 模型不太擅长寻找系外行星。但这并不是彻底的失败。
- 根据特征重要性表,确定系外行星候选的最大因素是最小通量。
作为进一步的工作:
- 我计划将 TESS 数据纳入项目中。
- 视觉识别和神经模型可以添加到项目中。
此外,如果你想了解更多,也可以看看我的 Github 简介!
流行病如何呈指数传播,社会距离和受欢迎的地方如何影响它?
使用 SIR 模型在 Python 中模拟城市内、城市间的人口流动动态以及热门地点的影响
来源:via pixabay
**免责声明:**我是数据科学家,不是流行病学家。此模拟仅用于教育目的,不用于决策。
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
新型冠状病毒(新冠肺炎)的爆发在不到半年的时间里已经感染了数百万人。始于一座城市的东西被世卫组织宣布为疫情。在没有任何预防措施的情况下,这种病毒以指数方式传播,每隔几天就翻一番。
来源:我们的数据世界
这种指数式的增长是可怕的,但如果人们实行“社交距离”和其他锁定措施,这种增长可以放缓。为了理解这些行动的重要性,这里将模拟这种疾病在一个假设的城市中的传播。疾病的传播将通过 SIR 模型在划分为不同社区的几何区域内进行建模。人们可以在这样的社区之间旅行,他们的移动将使用转移概率矩阵来控制。人员移动的思想基于一阶马尔可夫链,并且移动将仅取决于他们的当前位置。通过更新转移概率,我们将模拟不同的实验。
什么是 SIR(易感——传染——去除)模型?
SIR 模型是研究最多和最稳健的房室模型之一,许多模型都是这种基本形式的衍生物。该模型由三个区间组成:【S(t)】为易感者数量,【I(t)为传染者数量,【R(t)为给定时间移除(痊愈、死亡或免疫)个体数量【t】。SIR 模型是动态的,因为三种状态下的个体数量随时间而变化。我们将在没有生命动力学的情况下对 SIR 进行建模,即不考虑疾病本身以外的出生或死亡,使总人口保持不变。这背后的一个想法是,像新冠肺炎这样的疾病的动力学比出生和死亡的动力学要快得多。
S(t) + I(t) + R(t) = N(常数值)
SIR 模型可以定义为三个常微分方程(ODE)的集合:
其中,***【s(t)******I(t)******r(t)*是在时刻易感、感染、被清除的一小部分人群。 b 为感染率 k 为治愈率。需要注意的一点是,因为我们是在没有生命动力学的情况下建模,所以三个 ODE 的和是 0,表示没有从外部添加或删除新的群体
感染率和恢复率的值?
在我们继续之前,我们将不得不估计感染率和恢复率的值。我们可以通过对这两个参数进行网格搜索来找到最优值,该最优值最小化感染和去除状态的模拟计数和实际计数之间的 RMSE。让我们先做一些假设:
- 由于我们将 R 状态视为已恢复和已死亡,我们将死亡和已恢复计数相加为一个值
- 我们将使用德国的数据,因为:
- 在撰写本报告时,德国也是检测数量最多的国家之一,并已开始检测和记录第一例患者的数据
- 在撰写本文时,德国已经越过了感染高峰期,在过去的一个月中,活跃病例正在下降[1]
在计算 RMSE 时,传染状态和恢复状态的误差将被赋予相等的权重
从上述方法中观察到:
- 参数估计为b = 0.27k = 0.07这意味着患者保持感染状态的平均天数约为 2 周**【1/k】**。这与恢复持续时间的实际范围一致[2]
- 新冠肺炎的 R0 值或基本再现数为**【b/k】=3.9。而实际期望值为1.4–5.7***[3]*
- 预测计数和实际计数的曲线高度相关,并且彼此一致
基于以上几点,我们可以得出结论,我们的研究可以考虑估计的比率。
实验—锁定
在下面的实验中,模拟将在一个分成 400 个社区的城市中进行(在 20 * 20 的网格中)。每个个体将属于一个社区(我们可以称之为他的家的位置),并且可以基于一些概率移动到其他社区。这些转移概率将按如下方式计算:
- 对于一个给定的社区 i ,它的邻居将被存储在一个名为“ 到 的列表中
- 一些非邻居将被随机选择并添加到同一列表’'中**
- 随机概率将被分配给列表’--'中的每个位置。这些概率将是从社区 i 移动到列表“”中的位置的概率
- 将对所有社区重复步骤 1-3
例如,对于生活在社区中的一个人(用红色边框标记),我们有以下转移概率(每个单元代表一个社区):
实验 1: SIR 模型,人们不受任何限制地跨社区移动。
在这个实验中,我们将看到如果不采取预防措施,并且允许所有人不受任何限制地旅行,这种疾病将如何传播。(要了解如何创建下面的动画,请查看下面的文章— 使用 gifski 制作 R 中的任何图形的动画)
不受任何限制,90%的人在 200 天感染,其中2437天 103 。该图在第 50 天左右达到第一个平稳期。在第 75 天之后,斜率再次开始增加,并在第 103 天达到峰值。在右边的动画中,我们可以看到高感染区域达到了城市网格的对角线,并且在第 100 天的右下角创建了一个新的感染热点。****
实验二:25%运动限制的 SIR 模型。
在这个实验中,人们以 0.25 的概率留在他们的家乡社区,因此,模拟了25%的移动受到限制的情况。
在这种情况下,88%的人群仍然受到了感染。但是感染高峰在 13 天之后到达,剧情稍微平缓了一些。
实验三:50%运动限制的 SIR 模型。
在这个实验中,人们以*【0.50】的概率留在他们的家庭社区,因此,模拟了% 50%*移动受到限制的情况。
随着 50%的封锁,我们能够减少疾病的影响,只有 49%的人口在 200 天内受到感染。一天中的最大活跃病例也减少到只有1053**,并且发生在第 146 天(而在实验 1 中它发生在第 103 )。我们可以说,限制运动一半,大大有助于“拉平曲线”。**
实验 4:75%运动限制的 SIR 模型。
在这个实验中,人们以 0.75的概率留在他们的家庭社区中,因此,模拟了一种【75%】运动受到限制的情况。
75% 一级防范禁闭大大减少了疾病的传播。在 200 天内只有 30% 人群感染,感染高峰值仅在第 147 天(比未封锁病例晚 44 天)。我们还可以在热图动画中看到,传播非常缓慢。与没有封锁的第 100 天相比,75%的封锁在第 100 天几乎没有扩散,感染局限在中左部分的一小块区域。由于 100%的完全锁定是不可能的,我们可以在 75%时停止锁定分析。****
有了这个分析,我们可以得出结论:少量的锁定 ( 25%) 只会少量的减少疾病的影响。但是,当我们将锁定增加到高于 50% 时,曲线变平的效果将非常显著。
实验——增加一个受欢迎的位置,如超市
实验五:在市中心有热门场所的 SIR 模型。
在这个实验中,我们将看到超市、商场等受欢迎场所的存在。影响疾病的传播。我们将在市中心增加一个这样的地方,每个人每周都会去一次。
有一个人人都去的受欢迎的地方使得病毒很容易传播到城市的各个地方。正因为如此,感染高峰出现得更早(在 第 66天),活跃病例数更高,为3,255 例(对于实验 1,高峰出现在第 102 天,活跃病例数为*2,437 例)。***
在右边的热图中,我们还可以看到中心社区(有受欢迎的地方)在一开始就被突出显示,这有助于将病毒传播到不同的部分。在 第 100天,传播穿过了城市的对角线部分(而在之前的所有实验中,传播从未在第 100 天穿过对角线)。
实验六:锁定热门地点后的 SIR 模型。
在这个实验中,我们将把受欢迎的地方(这有助于传播疾病)封锁起来,看看它如何影响传播。这意味着不允许任何人去受欢迎的地方。否则,所有人都可以自由迁移到其他社区。
中间的灰色单元格显示了这三个州中任何一个州的 0 人口的热门地点。结果几乎与实验 1 的结果相似,总感染数略有减少。
实验 7: SIR 模型,热门地点是唯一允许去的地方。
在这个实验中,我们将只允许人们参观受欢迎的地方,其他所有活动都受到限制。
这次感染率非常低。由于每个人只被允许移动到一个地方,即使概率很低,这种疾病也得到了很好的控制。
实验——双城动态
实验八:两个城市之间的建模。
在本实验中,两个城市通过一条路线连接。感染始于 1 号城市,慢慢蔓延到 2 号城市。转移概率矩阵创建如下:
- 为两个城市(TM_1 和 TM_2)随机创建转移矩阵
- 两个城市的中心位置被选为他们的机场
- 一个城市中所有个人去机场的概率改为 1/14 (期望人们两周去一次另一个城市)
- 转移矩阵按行标准化,使概率之和为 1
我们从城市 1 开始感染,然后蔓延到城市 2。我们可以看到,城市 1 的感染高峰更早,活跃病例数最高4786**。城市 2 在城市 1 之后 40 天达到高峰,因为病毒到达那里需要一些时间。疾病的严重程度也较低,城市 2 的曲线更平坦,传播更平缓。由于在城市 2 中有单一的疾病来源,并且它与城市的所有部分相连,因此与城市 1 相比,疾病在整个城市中的传播更加均匀,这显示了类似“波浪”的现象。**
结论
我们没有要求建立准确的流行病模型,我们的目的是深入了解不同的措施和人员流动如何影响像新冠肺炎这样的传染病的传播。虽然小规模的旅行限制没有带来很多好处,但 50%及以上的限制显著减缓了传播速度,使曲线变得更平坦。这意味着,如果任何人感染了新冠肺炎病毒,需要住院治疗,将有机会获得床位和适当的治疗。在实施更持久的解决方案时,这可以是遏制疫情的一项临时措施。
不同实验的高峰日
参考资料:
PCA 到底是怎么工作的?
最简单的 PCA 指南。
照片由 Unsplash 上的 Pritesh Sudra 拍摄
主成分分析是将大量数据压缩成抓住数据本质的东西的过程。
直觉
PCA (主成分分析)是一种在数据中寻找主要模式进行降维的技术。第一次读到这一行可能会引发几个问题:
这些图案是什么?
如何找到这些模式?
什么是降维?
维度到底是什么?
为什么要减少它们?
让我们一个一个地去看看他们。
假设我们有一个数据集,比如说,有 300 列。所以我们的数据集有 300 个维度**。干净利落。但是我们真的需要这么多维度吗?我们可以。但大多数时候,我们没有。因此,我们需要找到一种快速简单的方法,不仅删除一定数量的特征,而且在更少数量的转换的维度中捕获 300 个维度的数据的本质。**
差异
这 300 个特征中的每一个都有一定量的变化,即整个值的变化。如果一个特征描述了特定建筑物 200 天的楼层数,那么它的方差将为 0。因为它的值始终没有变化。方差为 0 的特征是没有用的,因为它们不提供洞察力。所以,方差的确是我们的朋友!这就是我之前提到的模式。
差异越大,该特性的重要性就越大。因为它包含更多的“信息”。方差为 0 的变量包含 0 个信息。不要混淆方差和相关性!方差与数据的目标变量无关。它只是陈述特定特性的值在整个数据中是如何变化的。
主成分
现在我们知道了方差,我们需要找到一组新的转换特征集,它可以更好地解释方差。原始的 300 个特征被用来进行特征的线性组合,以便将所有的变化推入几个变换的特征中。这些变换后的特征称为主成分。
主要部件现在与原始特征无关。我们将从 300 个特征中得到 300 个主成分。现在 PCA 的妙处来了——新形成的变换特征集或主成分将具有第一个 PC 中解释的最大方差。第二台 PC 将具有第二高的方差,依此类推。
例如,如果第一个 PC 解释了数据中总方差的 68%,第二个特征解释了总方差的 15%,接下来的 4 个特征总共包含 14%的方差。所以你有 97%的方差可以用 6 个主成分来解释!现在,假设接下来的 100 个特征总共解释了总方差的另外 1%。现在,仅仅为了增加一个百分比的方差而增加 100 个维度已经没有什么意义了。通过只取前 6 个主成分,我们将维数从 300 减少到仅仅 6!
特征向量和特征值
现在让我们考虑一个更简单的例子,它只有两个特征,更容易理解。下图是我们用特征 2 绘制特征 1 的情况。
PCA(具有 SVD 的)所做的是,它为这些数据点找到最佳拟合线,该最佳拟合线使最小化数据点与其在最佳拟合线上的投影之间的距离。现在,考虑特征 1 和特征 2 的数据点的平均值。它将在 a 附近的某个地方。因此,同样地,PCA 也可以最大化最佳拟合线上的投影点与点 a 的距离。
移动直线,使 A 点与原点重合,这样更容易观察。
距离 d1 是点 1 相对于原点的距离。类似地,d2、d3、d4、d5、d6 将是投影点离原点的相应距离。最佳拟合线将具有最大的距离平方和。假设直线的斜率为 0.25。这意味着该线由要素 1 的 4 部分和要素 2 的 1 部分组成。这将类似于:
其中 B=4 & C=1。因此,我们可以很容易地通过毕达哥拉斯定理找到 A,结果是 4.12。PCA 缩放这些值,使得向量 A 为单位长度。因此 A=1,B=4/4.12 = 0.97 & C=1/4.12 = 0.242。这个单位向量 A 就是特征向量!距离 d1、d2、d3、d4、d5、d6 的平方和为特征值。相当直接!这就是我前面说的特征 1 和特征 2 的线性组合**。这告诉我们,对于 PC1,功能 1 的重要性几乎是功能 2 的 4 倍,或者说,它包含的数据分布(变化)几乎是功能 2 的 4 倍。**
现在,主分量 2 将是与 PC1 正交的向量,因为主分量之间具有 0 相关性。这就像红线一样:
根据类似的理解,PC2 将具有特征 1 的-0.242 份和特征 2 的 0.97 份。这告诉我们,对于 PC2 来说,特性 2 的重要性几乎是特性 1 的 4 倍。对于 PC2,可以类似地计算特征向量和特征值。所以我们终于找到了我们的主要成分!
解释方差
我们计算了两个主成分的距离平方和。如果我们将这些值除以 n-1(其中 n 是样本大小),我们将得到相应主成分的方差。
假设 PC1 的方差为 15,PC2 的方差为 3。因此,围绕两个主成分的总变化是 18。因此,PC1 占 15/18,相当于数据总方差的 0.83 或 83%。PC2 占 3/18,等于数据中总方差的 0.17 或 17%。这就是解释的方差比**。这表明数据中有多少差异是由特定的主成分解释的。主成分按其解释的方差比排序。如果总的解释方差比率达到足够的值,我们可以选择前 m 个成分。**
主成分分析降低了维数以克服过拟合。您的模型可能不需要所有的功能来提供良好的性能。它可能会给出很高的训练分数,但测试分数却很低。换句话说,它可能过度适应**。PCA 不是特征选择或特征消除技术。这更像是一种 T4 特征提取技术。您也可以将它归入特征工程范畴。**
这就是本文的全部内容。请参考以下优秀资源,了解更多信息:
- https://sebastianraschka . com/Articles/2014 _ PCA _ step _ by _ step . html
- StatQuest:主成分分析(PCA),逐步
- https://towards data science . com/a-一站式主成分分析-5582fb7e0a9c
与世界其他地区相比,新冠肺炎在你的国家传播的速度有多快?
Tableau 分步指南
“与世界其他地区相比,新冠肺炎在你的国家传播的速度有多快?”
这是我几天前问自己的问题,但我找不到以一种漂亮、吸引人的方式呈现的相关信息。对我来说,能够将特定的国家列表与其他国家进行比较真的很重要。因此,我决定建造这个仪表盘* 。
基里尔·尤纳科夫的画面是冠状病毒新冠肺炎:https://tabsoft.co/33Y9YIL
*写完这篇文章后,我可能会改进仪表盘,但本教程的步骤仍然有效且可重复。如果没有,请不要犹豫与我联系。
- **复杂程度:**初级/中级
- 完成时间: ~10 分钟。
- 所需软件: Tableau Desktop ( 免费公版)
**重要提示:**在我们进入分步指南之前,请先熟悉这些 10 注意事项,然后再通过 Tableau 创建另一个关于新冠肺炎的图表。
第一步。获取数据
您可以通过各种渠道获取这些数据。对我来说,最快最简单的方法是通过 GitHub 应用,然后连接到约翰·霍普斯金 GitHub 库。
您可以在 Tableau Covid-10 数据中心页面探索其他方法。例如通过一个*。亢奋,*。CSV 文件,网络数据连接器,谷歌表和其他。所有数据源的分步说明可在这里找到。
另一个快速而肮脏的方法是打开约翰·霍普斯金日报回购,直接从那里下载几个 CSV 文件。对于本教程的目的来说,这也是绝对足够的。
手动下载*。来自约翰·霍普斯金 GitHub 库的 CSV 文件
第二步。在 Tableau 中导入数据
*如果您已经建立了与数据源的直接连接,您可以跳过这一步。*一旦我们有了所有需要的文件,我们就可以在 Tableau 中导入它们。为了做到这一点:
- 打开的画面
- 点击连接到数据
- 通过选择一个文件连接到一个文本文件
在 Tableau 中导入 CSV 文件
第三步。将所有文件合并到一个数据源中
一旦我们在 Tableau 中有了所有可用的 CSV 文件,那么我们就可以继续将这些文件合并/组合到一个专用的 Tableau 数据源中。换句话说,我们将所有文件的所有行合并到一个文件中。在 Tableau 中,这个操作被称为 Union ,它与 SQL 的 UNION ALL 完全相同。通常,当我们知道文件中的所有列都具有相同的名称/结构时,就会执行此操作。
- 点击导入的表格并选择转换为联合**。**
- 选择通配符(自动),点击点击确定****
将所有文件合并到一个数据源中
第四步。数据争论
步骤 4.1 检查数据
我们需要知道的第一件事是熟悉数据集。您可以在数据源选项卡的表格概览窗格中看到相应列的数据示例。
数据的样本
值得注意的是您可以看到日期数据的两个特殊字段:
- 上次更新 —这是关于上次更新该文件的信息。特别是在新冠肺炎爆发之初,有许多病例被删除或后来被添加。这意味着我们不能使用这个字段作为日期字段。
- 路径 —该字段包含文件的路径信息,包括文件名。在这种情况下,它是该报告的创建日期。然而,字段的数据类型不是日期类型,但是我们将使用它来创建一个日期类型。
步骤 4.2 为日期创建计算字段
为了基于文本字段路径创建日期字段,我们需要使用函数创建计算字段,使用以下计算:
DATE(DATEPARSE ( "'csse'_'covid'_HH_'daily'_'reports'/MM-dd-yyyy.'csv'", TRIM([Path]) ))
为日期创建计算字段
步骤 4.3 创建起点
现在,有一个日期字段是伟大的,是时候创建我们的锚点。因为我们想比较不同的国家,所以为每个国家创建一个共同的起点是有意义的。在我们的案例中,我们将使用数据集中任意一行的第 100 个注册案例作为起点。
- 转到过滤器****
- 添加一个过滤器用于确认
- 选择至少**并将其设置为 100,OK**
创造一个起点
步骤 4.4 分组 国家名称和重命名****
在这一步,我们只是对几个国家不同的命名惯例进行简单的分组,例如
中国(中国;中国内地)、伊朗(伊朗;伊朗伊斯兰共和国)、韩国(韩国;韩国、韩国)、英国(英国;英国)、美国(美国;美国)等。
- 转到工作表标签
- 右击国家/地区维度
- 创建,然后**组……**
- 将此维度命名为国家****
- 执行分组,好吗
将国家分组
步骤 4.5 创建天数的计算字段
在横坐标上,我们希望显示每个国家自第 100 例登记病例以来的天数。为了做到这一点,我使用了以下计算方法:
DATEDIFF(‘day’, {FIXED [Country]: MIN([Date]) }, {FIXED [Date]: max([Date]) } )+1
这里,我们取每个国家数据集中的最小日期,实际上是第 100 个病例的日期(因为我们已经对此进行了过滤)。然后,我们估计该日期与该行级别上表示的日期之间的差异。我已经将这个字段命名为: days_passed
注意:确保将该字段创建为一个尺寸**,而不是一个尺寸。**
步骤 4.6 为活动案例创建计算字段
一个非常有用的衡量标准是活动案例的数量。我们可以使用下面的计算和命名措施活动案例轻松实现这一点:
ZN([Confirmed])-ZN([Deaths])-ZN([Recovered])
为了安全起见,我们使用 ZN()函数来防止数据集中出现空值。
步骤 5:创建视觉效果
现在是有趣的时候了。
- 将天已过拖放到列****
- 将活动案例拖放到行****
- 将国家拖放到过滤器架上
- 选择您想要比较的国家
- 将国家从标志架拖放到颜色功能
现在,您可以通过添加标签、工具提示、附加过滤器等进行试验。
冠状病毒 COVID-10 传播的可视化实例
***Part 2 for creating the dashboard —*** [***click here.***](/how-fast-is-the-corona-virus-spreading-in-your-country-compared-to-the-rest-of-the-world-7f8585e77095)The final dashboard can be found here: [https://tabsoft.co/33Y9YIL](https://tabsoft.co/33Y9YIL)
如果你觉得这篇文章有用,你不同意其中的一些观点,有问题或建议,请在下面给我留言。非常感谢您的反馈!
领英: 基里尔·尤纳科夫
从世卫组织获得关于新冠肺炎冠状病毒的最新信息:世卫组织
与世界其他地区相比,冠状病毒在你们国家的传播速度有多快?—第二部分
Tableau 分步指南
在我之前的文章中,我描述了如何用 Tableau (Public) 构建一个简单的仪表盘,显示每个国家从第 100 个注册病例开始的病例增长速度。
基里尔·尤纳科夫的画面是冠状病毒新冠肺炎:https://tabsoft.co/33Y9YIL
但是有一个问题——每个国家都不一样。它有不同的人口,大城市有不同的人口密度,不同的卫生系统,等等。因此,我们还可以使用 Tableau 构建一个函数,它将允许我们在考虑各个国家的人口的同时对这些国家进行比较。换句话说,计算每 10 万人的比率。当然,这并不能提供一个完全准确的画面,但也许足以看出一个趋势。此外,通过本教程,我们旨在学习如何使用 Tableau 和而不是如何根据医疗和健康数据得出结论。
- **复杂程度:**中等
- 完成时间: ~15 分钟。
- 所需软件: Tableau 桌面(免费公版)
**重要提示:**在我们进入分步指南之前,请先熟悉这些 10 注意事项,然后再用 Tableau 制作另一个关于新冠肺炎的图表。
在下面的逻辑图中,您可以看到度量、参数和计算字段的逻辑,我们将为我们的控制面板创建这些逻辑。我们必须创建单独的 2 个参数,并使用它们的值作为输入,以在我们的仪表板中显示特定度量的值。如您所见,参数 1 和参数 2 之间的关系是多对多,与计算字段的关系是一对二。换句话说,两个参数的每个值的组合产生一个测量。
下面是使用 Tableau SQL 语法时的逻辑:
// this is just for explaining the chart above
CASE
WHEN[Parameter 1].[Parameter Value] **AND**
[Parameter **2**].[Parameter Value]THEN [Calculated Field].[Measure]
END
第一步。创建具有调整值的度量
我们将从右到左开始—通过创建我们需要的度量。我们已经从我们的数据源(约翰·霍普斯金 GitHub 库)获得了所有病例、痊愈和死亡的措施。活动案例的度量是一个计算,这在我的前一篇文章的第步中有所涉及。4.6.离开的是:
- 所有案例均已调整
- 已调整的活动案例
- 恢复调整
- 死亡人数调整后
步骤 1.1 获取每个国家的人口
为了计算这些调整后的指标,我们需要每个国家的人口。这里的是由维基百科提供的世界上所有国家的人口列表。你既可以抓取网页,也可以将表格复制/粘贴到 Excel/Google 电子表格文件中,并使用函数将文本连接成 Tableau 计算,如下所示。
来自 Google 电子表格的示例
然后复制/粘贴 Tableau 计算(F 列),并在 Tableau 中为总体创建计算字段:
**// Population**IF [Country] = "India" THEN "1366417754"
ELSEIF [Country] = "United States" THEN "329064917"
ELSEIF [Country] = "Indonesia" THEN "270625568"
ELSEIF [Country] = "Pakistan" THEN "216565318"
ELSEIF [Country] = "Brazil" THEN "211049527"
ELSEIF [Country] = "Nigeria" THEN "200963599"
ELSEIF [Country] = "Bangladesh" THEN "163046161"
ELSEIF [Country] = "Italy" THEN "60550075"
ELSEIF [Country] = "Russia" THEN "145872256"
ELSEIF [Country] = "Mexico" THEN "127575529"
ELSEIF [Country] = "Japan" THEN "126860301"
ELSEIF [Country] = "Ethiopia" THEN "112078730"
ELSEIF [Country] = "Philippines" THEN "108116615"
ELSEIF [Country] = "Egypt" THEN "100388073"
ELSEIF [Country] = "Vietnam" THEN "96462106"
END// ... this is just a sample of all countries
确保将人口的新字段转换为一个度量值,并切换到一个**数字(整数)**作为数据类型。
步骤 1.2 创建校正值的计算字段
为了创建这些度量,我们需要使用以下公式,例如:
**// All cases adjusted:**IF [Country] =”Italy” THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] ="Spain" THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] = "India" THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] = "United States" THEN (**[All Cases]**/[Population])*100000
ELSEIF [Country] = "Pakistan" THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] = "Brazil" THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] = "Nigeria" THEN (**[All cases]**/[Population])*100000
END// ... this is just a sample of all countries
为了添加其他国家,只需将这段计算扩展到您想要的所有其他国家。您可以使用步骤 1.1 中的相同方法。并将所有国家连接成一段代码。完成后,对于您希望拥有的国家,您也可以完成为其他度量创建计算字段的相同过程:
**// Active cases adjusted:**IF [Country] =”Italy” THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] ="Spain" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "India" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "United States" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "Pakistan" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "Brazil" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "Nigeria" THEN (**[Active cases]**/[Population])*100000
END// ... this is just a sample of all countries
还有…
**// Recovered adjusted:**IF [Country] =”Italy” THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] ="Spain" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "India" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "United States" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "Pakistan" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "Brazil" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "Nigeria" THEN (**[Recovered]**/[Population])*100000
END// ... this is just a sample of all countries
…还有
**// Deaths adjusted:**IF [Country] =”Italy” THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] ="Spain" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "India" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "United States" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "Pakistan" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "Brazil" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "Nigeria" THEN (**[Deaths]**/[Population])*100000
END// ... this is just a sample of all countries
如果您完成了上述步骤,您应该有以下措施:
这意味着我们已经准备好了逻辑图的正确部分:
第二步。创建参数 1
要创建第一个参数,进入左侧窗格的空白区域,右键单击并选择创建参数。
将数据类型更改为字符串,从可用值选项中选择列表,然后输入值:
**Parameter name:** ADJUST PER 100k CAPITA**Parameter Value 1:** ADJUST PER 100k CAPITA
**Display Value 1 as:** ADJUSTED PER 100k CAPITA**Parameter Value 2:** REMOVE ADJUSTMENT
**Display Value 2 as:** REMOVE ADJUSTMENT
第三步。创建参数 2
同样,创建一个新参数,将数据类型更改为 string,从列表中选择可用值,并使用以下值:
**Parameter name:** Metric Selection**Parameter Value 1:** All cases
**Parameter Value 2:** Active cases
**Parameter Value 3:** Deaths
**Parameter Value 4:** Recovered
如果操作正确,您应该有两个独立的参数。这意味着我们现在还要创建一个东西—计算字段。
第四步。创建计算字段
下一步是创建函数,该函数将根据参数 1 和参数 2 的值显示特定的度量。
// Shows adjusted or non-adjusted **Measures**IF [ADJUST PER 100k CAPITA] = "REMOVE ADJUSTMENT" and [Parameters].[Metric Selection] = "All cases" then [All cases]ELSEIF [ADJUST PER 100k CAPITA] = "ADJUST PER 100k CAPITA" and [Parameters].[Metric Selection] = "All cases" then [All cases adjusted]ELSEIF [ADJUST PER 100k CAPITA] = "REMOVE ADJUSTMENT" and [Parameters].[Metric Selection] = "Deaths" then [Deaths]ELSEIF [ADJUST PER 100k CAPITA] = "ADJUST PER 100k CAPITA" and [Parameters].[Metric Selection] = "Deaths" then [Deaths adjusted]ELSEIF [ADJUST PER 100k CAPITA] = "REMOVE ADJUSTMENT" and [Parameters].[Metric Selection] = "Recovered" then [Recovered]ELSEIF [ADJUST PER 100k CAPITA] = "ADJUST PER 100k CAPITA" and [Parameters].[Metric Selection] = "Recovered" then [Recovered adjusted]ELSEIF [ADJUST PER 100k CAPITA] = "REMOVE ADJUSTMENT" and [Parameters].[Metric Selection] = "Active cases" then [Active cases]ELSEIF [ADJUST PER 100k CAPITA] = "ADJUST PER 100k CAPITA" and [Parameters].[Metric Selection] = "Active cases" then [Active cases adjusted]END
第四步。完成可视化
现在,我们已经准备好将组件添加到可视化中。右键单击两个参数并选择“显示参数控制”。这将向您显示两张卡片,您可以在其中选择想要查看的指标,以及哪个版本—调整或未调整的数字。
然后将度量“Metric Selection”拖放到行架上。
干得好。在我的仪表板最终版本中,我使用了一个扩展,你可以在这里免费下载。该扩展称为单个复选框参数。
下载完成后,只需将其添加到您的仪表盘中,并选择参数 1:每 100k 人均调整。仅此而已。
最终的仪表盘可以在这里看到:https://tabsoft.co/33Y9YIL
如果你觉得这篇文章有用,你不同意其中的一些观点,有问题或建议,请不要犹豫,在下面给我留言。非常感谢您的反馈!
领英: 基里尔·尤纳科夫
从世卫组织获得关于新冠肺炎冠状病毒的最新信息:世卫组织
如何在科技初创公司找到一份数据科学的工作
帮助你获得更多面试机会的三步系统
在一家科技初创公司获得数据科学职位的面试可能具有挑战性:由于初创公司相对较小,它们的招聘信息更难找到,它们的流程也没有更成熟的公司那么正式。
所以你需要依靠你自己的“系统”来获得面试机会。
为此,我想分享一个对我个人来说非常有效的系统。
使用这个系统,我能够争取到对我真正感兴趣的旧金山初创公司的多次数据科学面试。最棒的是,比把我的简历扔进网上求职栏的黑洞有效多了。
首先,你需要做的第一件事是建立一个高质量的潜在职位空缺列表。
第一步:建立一个潜在职位空缺的列表
我发现最有效的方法是使用谷歌搜索特定的网站,使用如下查询。
site:jobs.lever.co data scientist San Francisco
请注意使用site:jobs.lever.co
如何将谷歌的搜索结果过滤到该网站上的页面,而这些页面恰好是 Lever 上的所有招聘信息。
注意:Lever 是一个候选人跟踪系统,在科幻科技公司中很受欢迎。Lever 与 Monster 等网站非常不同,因为它不是一个列表网站。
我使用网站
boards.greenhouse.io
也取得了不错的效果。如果你知道其他网站可以这样工作,请在评论中告诉我,我会在这里添加它。
你也可以使用谷歌的搜索工具只显示上个月的新列表,这有助于确保帖子不会“过时”
将职位发布的搜索结果过滤为仅“最近”的结果
每个结果都会带你去一个职位描述,它们会包括公司的标志和公司网站的链接。
通过使用这种方法并调整你使用的标题,你应该可以在一个小时左右的时间里找到 10-20 个有趣的创业公司。
杠杆上的帖子允许你直接申请,但我不会推荐它。相反,你应该找到初创公司招聘人员的电子邮件地址,直接联系他们。
第二步:直接给初创公司的招聘人员发电子邮件
我的经验是,直接给招聘人员发电子邮件比提交招聘启事要有效得多。
一旦你知道了公司的域名,就很容易找到招聘人员的电子邮件。
首先,使用 LinkedIn 查找该公司的员工名单。搜索有“招聘人员”或类似头衔的人。
他们的电子邮件几乎总是如下。
firstname@domain.com
所以,如果公司的网站是polleverywhere.com
,招聘人员的名字是汤姆·沃特曼,你可以试试tom@polleverywhere.com
。(如果你申请的是更大的公司,这种方法不太可能奏效)。
要验证电子邮件地址,您可以使用 http://clearbit.com 的。他们的免费产品允许你“丰富”一个电子邮件地址,它还可以检查你使用的电子邮件地址是否正确。(注:我与 Clearbit 没有任何关系)。
使用 Clearbit 的免费产品检查招聘人员的电子邮件地址
但是如果公司没有招聘人员,你该怎么办?这在初创企业中并不少见。
下一个最好的人选是你申请的团队的经理,甚至是创始人。你可能会对直接给创始人发邮件感到紧张,但我保证他们不会觉得这很粗鲁。
既然你已经收到了招聘人员的电子邮件,你猜对了——你必须给他们发电子邮件。
第三步:明确要求招聘人员打电话
你可能不知道如何给招聘人员发电子邮件要求打电话。
以我的经验来看,最好的方法是保持邮件极其简短,附上你的简历,并包括一个明确的电话请求。
不要用一整面墙的文字来解释你为什么要申请,你的职业历史,或者其他任何东西。不要称呼招聘人员为“先生”只要说明你发邮件的原因和你要求他们采取的行动。
这里有一个对我很有效的模板。
你好[招聘人员名字],
我正在联系我在[公司网站]上找到的数据科学职位。
你有空打个电话讨论一下这个角色是否合适吗?
我希望更多地了解团队当前的项目,以及我的技能和经验是否能与之相匹配。
关于我:
- 目前是脸书的一名数据科学家
- 曾是一家约 50 人的 SaaS 公司的唯一产品分析师
- 以前是一家咨询公司的分析师,主要从事分析项目
- 我还附上了一份更详细的我的项目经历和相关技能的简历
感谢您的宝贵时间!
汤姆
第 3.5 步:如果没有得到回应,继续跟进
你的邮件被忽视是很糟糕的,但这是会发生的。有时候招聘人员忽略你是因为这个职位已经有人了,或者他们认为你不是一个好的候选人,或者他们只是在度假。
别往心里去——我肯定你也没有回复邮件。不管是什么原因,发送一封跟进邮件肯定会提高你的回复率。我总是会发一封后续邮件,即使重温我最初被忽视的事实会伤害我的自尊心。
这个系统对我来说非常有效。我可以在大约两个小时内找到大约 20 份创业招聘信息,并给他们的招聘人员发电子邮件。你的回复率会有所不同,但我通常会看到超过 50%的回复,即 10 个面试请求。
如果你真的尝试了这个系统,我很想知道你会得到什么样的结果——请在评论中告诉我!我不能总是回复,但我会阅读我收到的每一条评论。
找一份数据科学的工作就像买一辆新车
为什么有些人比其他人更有可能找到工作的框架
马特·拉默斯在 Unsplash 上拍摄的照片
首先,我想说这不仅仅适用于数据科学工作。它与 所有的 工作相关——我只是提到数据科学工作,因为我的大部分观众都渴望获得数据科学职位。因此,在本文中,“数据科学工作”与“工作”同义。
那么,找一份数据科学的工作和买一辆新车有什么区别呢?
嗯,让我们想象一下,你现在正计划买一辆新车。你可能会有一些你希望你的新车达到的标准。例如,你可能想要一定程度的燃油效率,如果你有一个大家庭,你可能需要五个以上的座位,或者你可能只是想要一辆红色的车。最终,你需要你的车来满足你的需求。这就引出了我的第一点…
1.你是一个产品,就像一辆汽车。
就像产品一样,人们被雇佣是为了解决问题,满足业务需求。同样,你也有一个你希望你未来的汽车达到的标准列表,面试官也有一个他们希望他们未来的员工达到的预定标准列表。
同时,还有不同类型的汽车,像 SUV 和小型货车,满足不同消费者的各种需求。类似地,数据科学是一个包含许多领域的宽泛术语:分析、可视化、ML 工程和建模是数据科学家可能拥有的专业化的几个例子。
因此,想想你想成为哪种类型的数据科学家,并想想成为那种类型的数据科学所需的技能?你发展了这些技能吗?如果你还没有,那么你需要提高自己的技能,然后才能考虑找一份数据科学家的工作。发展您的技能,成为满足需求(业务问题)的有价值的产品(数据科学家)。
提示:要知道你是否已经获得了成为数据科学家的必要技能,看看你想要的数据科学工作的要求。你满足了所有的需求吗?对自己诚实,在自己欠缺的地方努力。
让我们回到汽车的例子。一旦你决定了对未来汽车的要求,你就必须找到一辆符合你需求的汽车。你现在想到了哪些汽车公司?你现在可能会想到一些汽车公司,但是为什么你会特别想到这些公司呢?这是因为这些公司在营销自己方面做得很好,这就引出了我的第二点…
2.你必须推销自己,让人们了解你。
更具体地说,营销有两个部分你应该牢记在心;意识和可及性。
意识
推销自己的第一步是建立知名度。在市场营销中,知名度描述的是消费者对产品名称的认可程度。汽车公司通过播放电视广告和参加车展来建立知名度。
从工作的角度来看,你可以通过获得更多的意识来增加你的机会。现在,你可能正在一个接一个地申请工作。你还能通过什么方式曝光?你可以做一些事情,比如参加编程竞赛,参加社交活动,甚至在 LinkedIn 上发布成就。
更清楚地描述一下,如果一个人只申请了工作,但没有通过其他渠道建立曝光率,他/她只能接触到他/她申请的工作数量。在这种情况下,应该是 100 人。然而,通过其他渠道建立意识,你的意识会显著增加。在这个例子中,他的意识会增加超过 50000%。
总的来说,树立意识有多种作用:
- 它能建立信誉并表现出兴趣。像参加活动和完成项目这样的事情,展示了你的承诺,也表明了你对你想要得到的任何角色都有热情。
- **它增加了获得机会的可能性和机会的数量。**如果你是一个好的“产品”,那么人们会注意到你,并向你伸出援手。
易接近
一旦你确立了自己是一个有价值的“产品”,并建立了曝光渠道,你就要确保自己是可以接触到的**。**
例如,一家汽车公司花费了数百万美元进行营销,但在纽约只有一家汽车经销商,这将是一家知名度高、可访问性低的公司。
可访问性是一个简单的步骤。让人们向你伸出援手变得简单。创建 LinkedIn 个人资料。创建 YCombinator 配置文件。公开你的电子邮件或创建一个个人网站,人们可以直接联系你。
结合知名度和可访问性,如果你有 YouTube 频道,包括你的联系信息。如果你要参加社交活动,带上名片。你明白我想说什么。
TLDR
- 你就像一件产品,除非你把自己的技能发展到足够有价值,否则你不会被注意到。做法拉利,不要做福特。
- 推销自己——不要等别人来找你。你必须自己创造机会。
- 关注知名度(获得曝光)和可及性(让人们更容易接触到你)
感谢阅读!
如果你喜欢我的工作,想支持我…
- 支持我的最好方式是在媒体T10【这里上关注我。
- 在 Twitter 这里成为第一批关注我的人之一。我会在这里发布很多更新和有趣的东西!
- 另外,成为第一批订阅我的新 YouTube 频道 这里的人之一吧!还没有视频,但快到了!
- 在 LinkedIn 上关注我这里。
- 在我的邮箱列表** 这里报名。**
- 看看我的网站,terenceshin.com。
浮点数是如何工作的
尼克·希利尔在 Unsplash 上的照片
深度学习和数码摄影的应用
一个讨厌的事实是,计算机以二进制近似值工作,而人类倾向于以精确值思考。这就是为什么,在你的高中物理课上,当你在你的解中计算中间数值时,你可能经历了“舍入误差”,以及为什么,如果你打开一个 python 终端并计算 0.1 * 3,你将得到一个奇怪的结果。
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
这使得浮点数成为一个泄漏抽象的例子。通常,python 和数值计算库(如 numpy 或 PyTorch)会在幕后处理这些。但是理解细节可以帮助你避免意外的错误,并加快许多机器学习计算的速度。例如,谷歌的张量处理单元(TPU)使用了一种改进的浮点格式,在试图保持良好结果的同时,大幅提高了计算效率。
在本文中,我们将深入探讨浮点数的具体细节,涵盖边缘情况(数值下溢和上溢),并以应用程序结束:TPU 的 bfloat16 格式和 HDR 成像。假设的主要背景是你了解如何在二进制中计数,以及二进制分数如何工作。
表示整数
我们简单回顾一下二进制数到 5:0,1,10,11,100,101。明白了吗?这对于一个无符号整数来说很棒;一个从不消极的人。例如,如果我们有一个 8 位无符号整数,我们可以表示 00000000 和 1111111 之间的数字。在十进制中,那是在 0 和 2⁸-1=255.之间例如,大多数标准图像格式是 8 位颜色,这就是为什么“RGB”值从 0 到 255。
还要注意,我们通常用十六进制(以 16 为基数)表示法来缩写:0x00 到 0xFF。0x 前缀表示“这是一个十六进制数”。十六进制数字是 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F;所以 F 本质上是四位“1111”的缩写(0xF 和 1111 在十进制中都是 15)。同样,8 位是一个字节,所以我们的数字是少得可怜的 1 字节。但在本文中我们不会过多关注十六进制。
有符号整数
现在,你会注意到,对于无符号 int,我们不能表示像-2 这样的简单数字。解决这个问题的一个方法是让第一位代表符号。说“0”表示负,“1”表示正。想想 4 位数字,0111 应该是-7,而 1111 应该是+7。然而,这有一些奇怪的特征。例如,0000 是“-0”,而 1000 是“+0”。这并不好:比较两个数字是否相等会变得棘手;另外,我们正在浪费空间。
对此的标准解决方案是使用二进制补码,这是大多数实现用于有符号整数的方式。(还有一个很少用的补语)。然而,这不是我们将需要的浮点数,所以我们不会深入研究它。
让我们考虑一个有符号的 8 位整数的有偏表示。这是有偏差的,因为它有点偏离。我们不用 00000000 来表示 0,而是用 0111111 来表示 0。这通常表示基数为 10 的 127。但是我们的表述有 127 的偏差。这意味着 00000000 代表–127,而 1111111 代表 128。
双精度浮点数
因为最近生产的个人计算机使用 64 位处理器,所以默认的浮点实现是 64 位是很常见的。这被称为“双精度”,因为它是以前标准的 32 位精度的两倍(在过去十年的某个时候,普通计算机切换到 64 位处理器)。
科学符号
对于上下文,浮点数的基本思想是使用科学记数法的二进制等价物。你的高中科学老师满怀希望地训练你如何做到这一点(以及一大堆可怕的有效数字——sigfigs)。例如,8191.31 的科学表示是:
杂项十进制数的科学记数法
您应该注意到三个关键因素。首先,一个符号(数字是+还是-?).第二,我们总是把数字写成一位数(1 到 9 之间,含 1 和 9),后面是小数点,后面是若干位数。相比之下,下面的不在科学符号中,尽管它们是真正的数学事实。
不使用科学符号的表示法
考虑到这一点,让我们想想当我们进入二进制时会发生什么变化。首先,我们不使用 10 作为指数的基数(也称为基数),而是使用 2。其次,我们想用二进制分数代替十进制分数。
二进制与十进制科学记数法
请注意,我选择用十进制形式写基数(2 或 10)和它们的指数(分别是 1 或 0),而左边的数字和有效数字分别是二进制或十进制。
二进制数 1101 以 10 为基数是 13。13/16 是 0.8125。这是一个二进制分数。如果你还没有玩过这些,你应该说服自己以下几点:
一些简单的二元分数
这是事实 0.3 是 3/10,0.55 是 55/100 的二进制版本(当然可以进一步简化)。
太好了。我们现在准备深入研究浮点数的细节。
IEEE 754 标准
下面是通常实施的“ IEEE 754 ”标准的示意图。第一位是符号。0 是正的,1 是负的(与我们上面天真的建议相反)。指数有 11 位,分数有 52 或 53 位(取决于您如何计数),也称为“尾数”或“有效数”。这个标志就像我们上面看到的旗子一样工作,所以我们将深入研究后两个标志。
IEEE 754 双精度浮点数(维基
指数
与我们之前看到的一样,指数是一个 11 位有偏(有符号)整数,但有一些注意事项。偏差为 2 ⁰–1=1023,因此 11 位 01111111111 代表 0。
这通常意味着最大可能的指数由 11 位 11111111111 表示(表示 2–1–1023 = 1024),最小可能的指数由 11 位 0000000000 表示(表示–1023)。
然而,正如我们将要讨论的:
- 由 111111111111 表示的指数是为无穷大和 NaNs 保留的。
- 000000000000 指数是为表示 0 和其他我们将会用到的东西而保留的。
这意味着在正常情况下,指数可以在–1022 和 1023 之间(2046 个可能值)。
有效数字
52 位有效数字表示二进制小数。如果你回顾上面的科学记数法部分,你会发现每当我们用“二进制科学记数法”写一个二进制数时,前导数字总是 1。(在 10 进制中,它可以在 1 和 9 之间,但 2-9 不是二进制数字)。因为我们知道前导数字总是 1(还有一些需要讨论的注意事项),所以我们不需要把它存储在计算机上(这是一种浪费)。这就是为什么我说有效位是 53 位,“取决于你如何计数。”
换句话说,存储在计算机上的 52 位代表小数点后的 52 位(或者我们应该称之为“二进制点”)。始终假定前导 1。
正常数字
我一直在提一些警告,并且我打算尽可能地拖延。“正常数”是一个不使用任何这些警告的非零数,我们可以给出一些例子。
回想一下这三个组件:
- 1 位用于符号
- 11 位表示指数,指数(十进制)在–1022 和+1023 之间。在二进制编码中,它被表示为有偏差的整数。
- 52 位有效位。
我们如何表示十进制数 1?
嗯,符号是正的,所以符号位是 0。(把 1 想象成“负”的标志)。指数是 0。记住有偏表示意味着我们加上 1023,我们得到二进制表示 01111111111。最后,所有的分数位都是 0。简单:
1 的浮点表示形式
我已经写了二进制浮点表示法,用空格将三部分分开。通常,“二进制科学”表示法中的基数和指数实际上是以 10 为基数的。
更难的例子呢,比如 3?3 是 2 的 1.5 倍(十进制),所以把它变成二进制分数,我们得到 1.1。考虑到偏差,指数 2 表示为 10000000000。
我们能得到的最大(正常)数是多少?我们应该把指数做成 111111111110(不能全是 1,那是保留的),十进制就是 1023。
最大浮点值
我们可以这样计算:
但是我们也可以利用 Python 自带的任意精度整数运算,免费写出所有 10 进制的 309 位数字:
>>> 2 ** 1024 - 2 ** 971179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
最小可能的浮动正好是这个的负数。但是最小的正(正常)浮动是多少呢?我们已经说过最小的正指数是–1022。使有效数字全为 0,这意味着最小的正标准浮点数为:
同样,任意精度整数运算意味着我们可以利用中间分数轻松获得精确的十进制值。
>>> numerator = 5 ** 1022
>>> print('0', str(numerator).rjust(1022, '0'), sep='.')0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002225073858507201383090232717332404064219215980462331830553327416887204434813918195854283159012511020564067339731035811005152434161553460108856012385377718821130777993532002330479610147442583636071921565046942503734208375250806650616658158948720491179968591639648500635908770118304874799780887753749949451580451605050915399856582470818645113537935804992115981085766051992433352114352390148795699609591288891602992641511063466313393663477586513029371762047325631781485664350872122828637642044846811407613911477062801689853244110024161447421618567166150540154285084716752901903161322778896729707373123334086988983175067838846926092773977972858659654941091369095406136467568702398678315290680984617210924625396728515625
以防你好奇。顺便说一下,您可以在 python +硬件设置上使用以下命令检查所有这些:
>>> import sys
>>> sys.float_infosys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
基本上其他编程语言都有类似的特性。
不定式和名词
好吧,事情变得奇怪了。如果所有指数位都是 1,则表示的数字要么是无穷大,要么不是数字(NaN):
- 如果分数位都是 0,则数字是无限的。符号位控制它是–∞还是+∞。
- 如果分数位不全为 0,则“数字”不是数字(NaN)。根据第一位,它可以是安静 NaN 或信令 NaN。一个安静的 NaN 传播(再加一个数,就得到 NaN)。粗略地说,发信号的 NaN 应该“抛出一个错误”。通常不使用剩余的位。
我最初对此感到惊讶的是,这是在常用芯片上的硬件实现。这意味着,例如,你可以在 GPU 上使用它。你为什么要这么做?好吧,考虑这样一个方便的事实,即–∞的幂是 0。
>>> from math import exp
>>> minus_infinity = float('-inf')
>>> exp(minus_infinity)0.0
在介绍用于 NLP 任务的转换器架构的论文中(伯特、GPT-2 和他们最近的同类使用的),训练是自回归的,这意味着在注意力模块的 softmax 层中,某些输出被要求为 0。但是,如果您查看 softmax 的公式,并回忆起您的高中数学老师告诉您“没有任何数字的指数等于 0”,您会发现让 softmax 返回 0 是很棘手的。当然,除非你把(负)无穷大变成一个数!
重要的是,这是一种硬件实现。如果这是一个巧妙的 Python(或 PyTorch,或 Numpy)变通方法,将数字表示为一个对象,有时可能包含一个浮点数,这将大大降低数值计算的速度。
此外,计算机硬件无止境的复杂性总是令人印象深刻。
零
但是等等,还有呢!我们甚至还没有描述如何表示 0。使用我们的指数和分数位,我们只能得到一个很小的正数,实际上不是 0。当然,解决方案是,如果指数位都是 0,分数也是 0,那么数字就是 0。换句话说,如果指数位是 00000000000,并且分数位也全是零。注意,这意味着 0 是“有符号的”——既有+0 也有–0。在 Python 中,它们的存储方式不同,但它们是彼此相等的。
>>> zero = 0.0
>>> print(zero, -zero)0.0 -0.0>>> zero == -zeroTrue
不过,在一些边缘情况下,事情会变得很奇怪。当试图用 atan2 计算一个角度时,你会发现它们实际上是以不同的方式表示的:
>>> from math import atan2
>>> zero = 0.0
>>> print(atan2(zero, zero),
>>> atan2(zero, -zero))0.0 3.141592653589793
低于正常值的数字
最后一种情况是所有指数位都为 0,但分数位不为 0。如果我们有一个不使用一些可能的位序列的表示,我们就是在浪费空间。那么为什么不用它来表示更小的数字呢?这些数被称为次正规(或非正规)数。
基本上,规则是指数仍然被认为有其最小值(–1022),而不是我们的“二进制科学”符号总是从 1 开始(如在 1.001 中),而是我们假设它从 0 开始。所以我们可以得到 0.001 乘以 2 的–1022 次方。这让我们可以用小于 52 的指数来表示数字(小到-1074)。因此:
>>> 2 ** -1074
5e-324>>> 2 ** -1075
0.0>>> 2 ** -1075 == 0
True
次正规数的好处是,当你减去两个不同的正规浮点数时,你一定会得到一个非零的结果。代价是精度损失(前导 0 中没有存储精度——还记得 sigfigs 是如何工作的吗?).这叫做逐渐下溢。随着浮点数变得越来越小,它们逐渐失去精度。
如果没有低于正常值的数字,你将不得不冲到零,立刻失去你所有的精度,并大大增加你意外地被 0 除的机会。然而,低于正常值的数字会显著降低计算速度。
应用程序
好吧,我们一直在讨论浮点数。除了一些从未真正出现的关于 0.1 * 3 的怪异边缘情况,谁会在乎呢?
张量处理单元
除了我们详细探讨的 64 位浮点之外,还有常见的 32 位浮点(单精度)和 16 位浮点(半精度)。PyTorch 和其他数值计算库默认倾向于坚持 32 位浮点。一半的大小意味着计算可以更快地完成(处理一半的位)。
但是较低的精度是有代价的。对于标准的半精度浮点型(5 个指数位,10 个有效位),大于 1 的最小数字约为 1.001。不能代表整数 2049(必须选 2050 或者 2048;中间也没有小数)。65535 是最大的可能数字(或者接近,取决于精确的实现细节)。
相反,谷歌的张量处理单元使用一种经过修改的 16 位格式进行乘法,作为他们对深度学习任务进行优化的一部分。具有 7 位有效位的 8 位指数与 32 位浮点数的指数位数一样多。事实证明,在深度学习应用中,这比有效位更重要。此外,乘法时,指数可以相加(容易),而有效位必须相乘(困难)。使有效数位变小会使相乘的硅浮动大约比小 8 倍。
此外,TPU 浮点格式刷新为零,而不是使用低于正常值的数字来提高速度。
高动态范围(HDR)图像
如果你阅读谷歌关于他们定制的 16 位浮点格式的博客文章,你会看到他们谈论“动态范围”事实上,类似的事情也发生在 HDR 图像上(比如你可以用手机捕捉到的图像)。
标准图像使用 8 位 RGB 编码。这 8 位表示 0 到 255 之间的无符号整数。这样做的问题是,当它更暗时,相对精度(连续值之间的跳跃百分比)要差得多。例如,在(十进制)像素值 10 和 11 之间,有 10%的跳跃!但对于亮值,250 和 251 之间的相对差异仅为 0.4%。
现在,人眼对暗色调的亮度变化比对亮色调的亮度变化更敏感。这意味着固定精度的表示与我们想要的相反。因此,拍摄 JPEG 或类似图像的标准数码相机或手机相机通过使用伽马编码在较暗的色调中相对更精确地记录来调整其灵敏度。
这样做的缺点是,即使你增加了比特(比如一个 16 比特的 RBG 图像),你也不一定能在图像中明亮的部分获得同样的精度。
因此,HDR 图像使用浮点数来表示像素!这允许较高的“动态”范围(指数可高可低),同时在所有亮度范围内保持相对精度。非常适合保存高对比度场景的数据。例如,在辐射 HDR 格式中,指数由每个像素中的三种颜色(通道)共享。
结论
关于浮点数,这可能比你想知道的还要多。幸运的话,你不会遇到太多无法用简单的 log-sum-exp 或任意精度整数解决的数字下溢或上溢。但是如果你这样做了,你会有充分的准备!希望你也能很好地思考你的机器学习模型需要多精确。
笔记
[1]注意:本文假设了一个相对标准的设置。根据您的硬件和软件实现,您的结果可能会有所不同(尽管不常见)。
[2]我的意思是,你 Python 解释器被允许抛出一个错误,崩溃,然后停止做事。你的 CPU 不能完全做到这一点:它必须保持活力。
足球如何帮助理解糟糕的算法
戴夫·阿达姆松在 Unsplash 上拍摄的照片
在商业中实施 AI 时,经常会出现两个主要问题。项目会遇到“坏数据”和“坏算法”。上周的博客描述了处理不良数据时出现的一些问题。本周,我们将使用足球来说明为什么糟糕的算法会给机器学习项目带来麻烦。
想象你是达拉斯牛仔足球队的教练。你的团队努力赢得比赛,你担心失去工作。你已经看到了分析和人工智能为棒球做了什么,所以你决定尝试一下。你雇了一个数据科学家,给她你剧本中的所有战术,以及游戏中每一次战术的结果。你告诉她创建一个算法,显示你应该运行哪些游戏以及以什么顺序运行。
数据科学家获取数据并应用机器学习算法。让我们想象 3 种结果场景:
- 整个游戏的完整剧本
- 建议每次都使用相同的剧本
- 根据游戏中的情况而变化的游戏列表
在场景 1 中,我们可能认为一个完整的剧本在理论上是可行的,但是在真实的游戏中会出现可怕的错误。由于比赛中出现了不同的情况,教练不能相应地调整战术。这意味着游戏脚本可以处理用于训练模型的数据(教练提供的游戏和结果),但不能很好地应对不确定性或新游戏中出现的情况。
这被称为过度拟合数据。当复杂模型应用于数据,并且不允许预测中的任何漂移或变化时,会发生过度拟合。在像足球这样的游戏中,有数以百万计的可用序列和结果,这些序列和结果可能没有被教练提供的数据捕捉到。因此,原始数据集没有提供的任何新情况都不会在所提供的“完美”剧本中得到承认。
在场景 2 中,我们可以看到数据科学家严重缺乏数据。他们选择了一种不了解数据潜在复杂性的模型,并输出了一个它认为最有效的策略。一场足球比赛比模型允许的要复杂得多,因此即使在训练数据上预测也不准确。想象画一条穿过散点图的直线。它不会对数据的起伏做出反应,也不会对变量的变化提供任何见解。
最好的情况是第三种。这里教练给一个理解正规化概念的全明星数据科学家打分。这个花哨的数学术语意味着数据科学家已经允许足够的复杂性来正确理解数据,但限制了输出值以确保模型不会过度拟合。正规化既是一门科学,也是一门艺术。正确限制模型并避免过度/欠拟合数据的问题需要经验和理解。
管理人员需要意识到当不正确的算法应用于数据集时会出现的问题。优秀的经理会看着数据集问:
- 预期的结果是什么?
- 变量之间的预期关系是什么?
有了预先的期望,管理者可以帮助识别过度或不足拟合数据的模型,并避免实现提供不正确结果的模型。
GANs 如何改进医疗保健分析
生成性对抗网络为医疗保健组织提供了在患者治疗和隐私保护方面的应用
安娜·施瓦茨在像素上拍摄的照片
在过去的十年中,电子健康记录(EHR)系统在医院中的采用已经变得普遍。这一转变得益于 2009 年的《经济和临床健康卫生信息技术(HITECH)法案》,该法案拨款 3000 万美元用于激励医院和医生采用 EHR 系统。大医疗保健数据中的这种数字爆炸有助于现代机器学习工具,这些工具可用于各种任务,如疾病检测、患者旅程跟踪、概念表示、患者去识别和数据扩充。在过去,一类被称为卷积神经网络(CNN)的深度学习模型已经被成功地部署到各种疾病检测任务,包括与间质性肺病和结肠镜检查帧相关的分类任务以及息肉和肺栓塞的检测。
这些努力是成功的,因为这些任务的基础数据通常包含每个检测类别的足够的正面和负面例子。在上述每个疾病/紊乱的例子中,许多人测试呈阳性,也有许多人测试呈阴性。拥有大量正面和负面的例子有助于机器模型更有效地学习。对于阳性与阴性结果不平衡的疾病检测问题,像 CNN 这样的监督学习方法很难执行。例如,受监督的机器学习模型可能会与像埃博拉这样的罕见疾病斗争,因为很少有患者会检测出阳性,从而导致一个更大的阴性群体。
在这些情况下,生成敌对网络(GANs)是有用的,因为它们可以学习产生未被充分代表的数据的虚假例子,从而更好地训练模型。除了改进疾病检测,GANs 还可用于数据去识别,防止患者个人信息暴露。1996 年健康保险便携性和责任法案(HIPAA)隐私规则要求保护患者信息,这意味着医疗保健提供商需要认真对待它。在医疗保健分析领域,数据去识别是一个具有挑战性的问题,因为传统方法不够强大,不足以承受重新识别。也就是说,大多数当前的去识别方法都可以被逆转,从而危及医疗保健患者个人记录的隐私。研究和实践中的 GAN 模型为当今医疗保健面临的许多棘手问题提出了有希望的解决方案。
什么是生成性敌对网络?
在我们进入 GANs 的医疗保健应用之前,让我们先讨论一下它们的一些基本操作。GANs 背后最重要的底层概念是深度神经网络(即卷积神经网络)和反向传播。鉴于它们的相关性,我们应该简要回顾一下这些术语。
人工神经网络是由人脑粗略启发的数学模型。它们由一组单元(人工神经元)和单元之间的连接(突触)组成,每个单元的权重都随着反向传播过程中学习的改善而变化。要理解反向传播,请考虑下图。与神经网络预测相关联的误差值相对于分配给“学习”特征的权重值来绘制。训练神经网络的目标是找到给出最小误差的权重,这对应于找到图中的山的底部。你可以把学习过程想象成在丘陵地带行走,直到找到最低点。
反向传播图解。作者创作的插图。
典型的神经网络是这些互连和加权单元的集合,这允许模型捕捉输入和输出之间的高维和非线性关系。这种结构是它们运转良好的部分原因。在图像分析的背景下,由神经网络生成的低级特征可以是边缘(即:人脸的边缘/轮廓),高级特征可以是人类可识别的概念,例如字母、数字或人脸。
下图显示了一个基于患者特征(如年龄、体重、胆固醇水平和吸烟状况)预测糖尿病风险的简单示例。神经网络对这些输入进行转换,并设计重要的预测特征,这些预测特征是输入的非线性组合。然后,该网络使用学习到的特征来预测患者患糖尿病的风险。
在这种情况下,高层次特征的一个例子可能是捕捉一个超重的老年人的复合效应,他是一个高胆固醇的重度吸烟者。该患者患糖尿病的风险可能明显高于年轻、超重、高胆固醇的重度吸烟者。但是一个肥胖的高胆固醇的不吸烟的老年人怎么办?肥胖的不吸烟者比超重的重度吸烟者风险更大还是更小?人类很难准确预测这两个病人的结果。幸运的是,神经网络擅长捕捉这些特征之间的复杂相互作用以及它们如何影响结果的概率。
神经网络图像
神经网络图解。作者创作的插图。
卷积神经网络是这些更简单的网络的扩展,但它们也包括卷积层和池层。在高层次上,这些层擅长学习图像中最重要的部分,因为它们与整体图像的内容相关。正如我前面提到的,这些高级特征可能是人类能够识别的。卷积层提取高级概念(即:人脸、字母、物体、数字),max pooling 层将那些特征减少到学习所需的最本质的特征。
下图显示了对患者 CT 扫描中是否存在脑瘤进行分类的示例。卷积神经网络使用卷积层从图像中学习与健康大脑和肿瘤大脑最接近的高级特征。相关特征可以包括健康脑组织的片段、肿瘤的片段、整个肿瘤、肿瘤的边缘以及不一定能被人类解释但对机器学习有用的附加特征。max pooling 图层通过移除不会改善学习的冗余图像片段来减少这些提取的特征。该过程有助于模型从图像像素中优先考虑由高级特征表示的最重要或最常见的图像碎片。
cov net 的图像
卷积神经网络图解。作者创作的插图。脑部 CT 图像
现在我们有了基础,让我们讨论甘斯。GANs 是一组深度神经网络模型,由 Ian Goodfellow 在 2014 年开发,用于产生合成数据。合成数据是与特定情况相关的任何数据,不是通过真实世界的测量直接获得的。
GAN 的目标是训练鉴别器能够区分真实和虚假数据,同时训练生成器产生可以可靠地欺骗鉴别器的数据的合成实例。鉴别器是用于区分真实图像和合成图像的普通卷积神经网络,生成器是被训练来产生看起来真实的假图像的修改的卷积神经网络。GANs 一起训练鉴别器和发生器,以迭代地提高鉴别器识别假图像的能力和发生器产生真实图像的能力。
在下图中,一个生成器根据随机噪声像素数据进行训练,然后生成假的大脑 CT 图像。发生器产生的假图像随后与真图像一起被送入鉴别器。鉴别器是一个普通的 CNN,它被训练来区分真实和虚假的图像。生成器的训练旨在产生越来越逼真的假图像,以欺骗鉴别者。随着训练的继续,生成器在制造假货方面变得更好,鉴别器在区分真实和虚假图像方面变得更好,直到生成器产生与真实图像非常相似的图像。一旦训练完成,GAN 应该能够生成可用于扩充现有数据或创建全新数据集的逼真图像。数据扩充适用于示例中存在不平衡的情况(例如,与埃博拉等罕见疾病相对应的数据)。此外,创建新的合成数据集对于保护患者隐私以及提供购买昂贵的临床注释医疗数据的替代方案是有用的。
甘形象
一个生成性对抗网络的图解。作者创作的插图。脑部 CT 图像。噪声图像。
医学成像领域的 GANs
GANs 在医疗保健领域最普遍的应用是医学成像。两个重要的医学成像任务是脑肿瘤的数据分割和医学图像合成。
脑肿瘤分割
GANs 的一个有趣的应用是脑瘤分割,这相当于将脑 CT 图像分割成图像对象,如肿瘤边缘、健康组织和整个肿瘤部位。虽然对医生来说,检测大多数类型的脑肿瘤,如低级和高级别神经胶质瘤,通常是直截了当的,但通过视觉评估来定义肿瘤边界仍然是一个挑战。在最近的一项研究中,Eklund 等人。艾尔。开发了一种叫做 Vox2Vox 的方法,试图进行脑瘤分割。在他们的研究中,研究人员在脑肿瘤分割(BraTS)挑战 2020 数据集上训练了一组 3D GAN 模型,并能够生成高质量的脑肿瘤片段。具体来说,他们的集成模型能够检测整个肿瘤、肿瘤核心和活动期肿瘤,每个类别的 dice 系数>为 87%,这优于过去使用 CNN的研究。这些方法提供了用于生成高质量脑瘤片段的手段,这些脑瘤片段可以在分析、治疗和手术期间对医生有所帮助。
医学图像合成
GANs 的另一个有趣的应用是在医学图像合成中。由于获得临床注释的高成本,医学成像数据很少可用于大规模分析。考虑到这一阻碍因素,许多研究项目致力于开发可靠的医学图像合成方法。在 2017 年的一篇论文中,Campilho 等人。艾尔。开发了生成合成视网膜图像的方法。通过在来自 DRIVE 数据库的视网膜图像上训练 GAN,这些研究人员能够证明生成真实不存在的高质量视网膜图像的可行性。这些假图像可用于在视网膜图像数量有限的情况下增加数据,并可进一步用于训练未来的人工智能模型。在未来,这些方法可以用来为训练模型产生数据,以检测没有足够真实数据来训练准确模型的疾病。此外,这种类型的合成成像数据可用于进一步保护患者隐私。
生成合成离散医疗数据
虽然 GANs 最常见的用途是用于医学图像合成和图像分割,但是 GANs 也可以帮助生成合成的多标签离散数据。这是 GANs 的一个有用的医疗保健应用,因为它可以为患者隐私提供强大的保护。通常,为了保护患者隐私,EHR 记录去标识的方法包括稍微修改个人可识别属性,例如出生数据。一种常见的去标识方法是一般化,在这种方法中,出生数据等属性只能一般化为月份和年份。
不幸的是,在这种方法中,被修改的记录和产生它们的原始记录之间仍然存在一对一的映射。这使得他们容易受到攻击,不良行为者可以重新识别患者信息。另一种方法是开发合成的患者数据。2017 年,孙等人。艾尔。开发了医疗 GANs (medGAN),以生成合成的多标签离散患者记录。使用这种方法,他们能够准确地产生合成的二进制数,并对代表 EHRs 中事件的变量进行计数(即:某种疾病的诊断或某种药物的治疗)。鉴于访问 EHR 数据的难度,medGAN 为医疗保健研究做出了重大贡献,因为它提供了一种生成高质量合成患者数据的方法。作者还提供了一个隐私的实证评估,并证明了 medGAN 在个人身份识别中造成的风险有限,这进一步验证了他们的方法。
结论
鉴于 GANs 已在图像分割、图像合成和离散患者数据合成领域展现出前景,它们有可能彻底改变医疗保健分析。医学中的图像分割方法可以扩展到医学图像中的外来物体识别、其他类型的肿瘤生长的检测以及器官结构的精确识别。对于后者,使用 GANs 的图像分割可用于在磁共振成像中给出脑、肝、胸、腹和肝的精确结构细节。此外,GANs 在医学图像合成领域显示出巨大的潜力。在许多情况下,医学成像分析受到缺乏数据和/或真实数据的高成本的限制。GANs 可以通过使研究人员和医生能够使用高质量、逼真的合成图像来解决这些问题。这可以显著改善疾病诊断、预后和分析。最后,GANs 在患者数据隐私领域显示出巨大的潜力,因为它提供了一种更可靠的方法来隐式地将真实的患者数据映射到合成数据。这种隐式映射改善了患者的数据隐私,因为它不是典型的一对一映射,因此难以显式恢复。医学图像分割、图像合成和数据匿名化方面的改进都是提高医疗保健信息学效率和可靠性的垫脚石。
地理空间数据如何帮助抗击流行病
约翰·霍普斯金大学绘制的冠状病毒地图
新型冠状病毒或新冠肺炎正在肆虐,这不是我们必须面对的第一种或最后一种传染病。在最近的过去,我们也看到了新传染病的大规模爆发,如 MERS、SARS、寨卡病毒、埃博拉病毒、H1N1 猪流感、禽流感和许多其他疾病。我们目前还有不同的流行病,如脊髓灰质炎、艾滋病、登革热等。在世界的不同地方。
我们相信可能会有更多有害的疾病向我们袭来。我们希望这不会发生,但当我们这样说时,我们有四个理由:
1)超级细菌的进化
2)气候变化
3)人口过剩
4)生物恐怖主义
现在让我们简单解释一下。
超级细菌
随着抗生素的发明,人类找到了杀死以前杀死数百万人的有害细菌的终极武器。但是细菌,像所有生物一样,会进化。它们现在正在进化成超级细菌,这是同样的细菌,但对抗生素有抗药性。
如果你想深入了解超级细菌的细节,请观看这段 6 分钟的视频。它很好地解释了这一现象:
气候变化
气候变化也是人类面临的另一个巨大威胁。人们认为这只会导致极端天气事件,但不幸的是,事实并非如此。它也会带来致命的疾病。
病毒可以休眠数万年,当有生存条件时又会复活。世界各地的冰川中埋藏着过多的古代病毒。对于这些古老的病毒,我们没有药物和疫苗,更糟糕的是,我们的免疫系统也没有进化到可以对抗它们。
一个这样的例子出现在俄罗斯北极地区,一种古老的病毒从融化的永久冻土中复活,杀死了数千只驯鹿和一些人。你可以在 BBC 地球的这个故事中读到更多关于这个事件的细节。
纵观历史,人类一直与细菌和病毒共存。从黑死病到天花,我们…
www.bbc.com](http://www.bbc.com/earth/story/20170504-there-are-diseases-hidden-in-ice-and-they-are-waking-up)
问题不仅仅在于极地冰川。西藏山脉,通常被称为世界第三极,也有正在融化的巨大冰川,这些冰川也有大量休眠的古代病毒。
锡亚琴冰川是世界上第二长的非极地冰川,为印度河提供水源。脸书的照片
世界上最大的四条河流,即印度河、恒河、黄河和长江都从这些西藏冰川流出。一些相对较小的河流,如雅鲁藏布江和湄公河,也发源于相同的冰川。这些河流流入中国、印度、巴基斯坦、尼泊尔、孟加拉国和阿富汗。这些国家大约拥有地球人口的一半。因此,这些冰川中的任何病毒都可能很快感染人类和/或威胁我们的牲畜。
人口过剩
随着人类人口达到历史最高水平并仍呈上升趋势,我们需要更多的资源和空间。由于这个原因,我们的物种正在越来越深地侵占野生动物的栖息地。这些动物中有许多生活在病毒中,这些病毒对我们人类来说可能是致命的,但对他们来说是无害的。
这段 2015 年的视频警告人们不要打扰野生蝙蝠。它讲述了野生蝙蝠是如何给人类带来潜在的致命疾病的。
生物恐怖主义
现在有一种新的、低成本的、非常致命的武器:生物恐怖主义。
现在,通过修改基因和其他各种技术,可以在实验室合成病毒和细菌。这是非常具有杀伤力的,因为这是一个极低成本和有效的。此外,追踪细菌/病毒的来源非常困难,因此任何人都可以这样做而不用担心遭到反击。
它可以被军队、军队中的流氓分子甚至恐怖组织所利用。所以在我们看来,这是人类对人类非常大的威胁。
地理空间数据有什么帮助?
迄今为止,情况看起来非常糟糕,但事实并非如此。现在来说说解决办法。这里我们有三个地理空间数据可以提供帮助的例子。
识别风险区域
当涉及到冠状病毒等传染病时,地理空间数据非常有用,因为它有助于识别模式。我们最近建立了一个工具“电晕地图”,它显示了电晕在国家层面上传播的历史和地理空间数据。
2020 年 3 月 30 日的统计数据在 thecoronamap.com上查看
这个工具现在有国家一级的数据。但是,如果数据可用,这可以用来深入到最小的地理边界,如县或街道。在这个层面上,它变得非常强大。
当局可以看到哪些是热点,哪些是真正受到攻击的地区,这种地理空间可视化提供了决策支持,如哪些地区需要封锁,哪里需要更多的测试中心等等。这些信息使当局能够将邪恶扼杀在萌芽状态,并将任何流行病遏制在萌芽状态。
可以为医院、临时医院、隔离中心等资产的压力创建类似的地理空间可视化。压力可能是医务人员、呼吸机、氧气瓶和个人防护用品等的缺乏。这种可视化也可以帮助当局有效地管理他们的资源。
我们已经创建了这样一个空间决策支持系统将如何工作的简单流程图。
空间决策支持系统如何帮助当局进行决策的流程图
这种系统不仅可用于流行病/大流行病,还可同样用于监测其他疾病,并有助于发现模式和热点。例如,一个县腹泻病例的增加可能意味着供水管道被污染等等。
该系统的另一个非常重要的要求是其数据必须在国际上共享。这些国家需要在欧洲联盟、阿拉伯联盟、非洲联盟、南亚区域合作联盟和联合国等区域和/或国际组织制定的框架内相互共享数据。
追踪和跟踪患者
这种方法已经在巴基斯坦和韩国等一些国家使用。这些国家正在从电信服务提供商那里获取其公民的位置和移动历史数据。现在,当一名患者的新冠肺炎病毒检测呈阳性时,他过去 14 天的旅行记录会被检查,在此期间与他见过面的人会得到提醒。
巴基斯坦用户收到的警报短信的屏幕截图
在这个流程图中,我解释了这样一个系统应该如何工作。
各国如何追踪冠状病毒感染患者的流程图
同样的数据也被用来追踪病毒的踪迹,并发现更多处于危险中的人。事实证明,地理空间数据的这种用途在这些国家非常有用。
在线考试
另一个非常重要的工具是在线症状检查器,它也在一些地方被使用。如果添加位置数据,这也会变得更加有用。我们还创建了一个症状检查器,你也可以用它来检查你自己的症状这里。
一旦我们有了症状的信息,病人的位置和他有电晕的可能性就被标绘在地图上。这张地图真的可以帮助当局了解更多病例的来源。您可以在此查看上述测试的症状。
这些信息也可用于筛选重症病例,并可派遣团队在患者自我隔离时从他们身上收集检测样本。这不仅减轻了对医疗基础设施的压力,还消除了患者在通勤期间进一步传播病毒的风险。
在下面的流程图中,我们解释了这个用例,以帮助您更好地理解。
在线症状检查器如何减轻医疗基础设施的压力
这篇文章是与哈佛医学院的教师 Jacques Kpodonu 博士合著的。
我是拉米兹·萨米。我爬山、举重、构建 WebGIS 解决方案。请随时在 Linkedin 上与我联系。
GIN 索引如何让 Postgres 查询速度提高 15 倍
通过查询示例,您可以在笔记本电脑上运行
添加索引将查询时间从几分钟缩短到了几毫秒,这是我职业生涯中从未有过的。作为数据科学家,我们花费大量时间来查询和分析数据,因此我们应该知道如何高效地完成这项工作。
Postgres 有 6 种索引类型。今天我们将讲述杜松子酒指数。
我们将为数据库植入越来越多的数据,并比较使用和不使用 GIN 索引的查询时间。如果您使用 SQL 编辑器(我使用的是 DBeaver)进行操作,您会受益更多。
什么是指数?
一种数据结构,以较慢的插入速度和更多的磁盘空间为代价,提高了从数据库中检索数据的效率。
什么是杜松子酒指数?
GIN 代表广义倒排索引。通常,倒排索引将单词映射到它在表中的位置。
下面是我对倒排索引的一个抽象。
如果我们想在没有索引的情况下在表中查找包含单词lazy
的句子,我们需要迭代表中的每个句子来查找匹配。
但是通过增加一个索引,我们提前知道哪些句子包含了lazy
这个词,可以直接加载那些。这使得事情快了很多!
这种类型的索引适用于查询复合数据类型,这意味着它们存储不止一个值。例如 hStores、Arrays、Ranges 和 JSONs。
杜松子酒指数快了多少?
让我们找出答案。
首先创建一个表并用数据填充它。
**# create table**
CREATE TABLE articles (
body text,
body_indexed text
);**# add an index**
CREATE INDEX articles_search_idx ON articles USING gin (body_indexed gin_trgm_ops);**# populate table with data**
INSERT INTO articles
SELECT
md5(random()::text),
md5(random()::text)
from (
SELECT * FROM generate_series(1,100000) AS id
) AS x;
太棒了,我们现在有一个名为articles
的表,有 100k 条记录和 2 列随机字符串。
如果你对指数感兴趣。我们没有直接索引字符串,而是使用 Postgres 的gin_trgm_ops
从每个字符串创建trigrams
(想想sklearn
中的ngrams
),并对其进行索引。
在我的 SQL 编辑器中,该表如下所示。
我将在添加每 100k 条新记录后跟踪查询时间。
我会运行这些查询。
**SELECT** **count**(*) **FROM** articles **where** body **ilike** '%abc%';
**SELECT** **count**(*) **FROM** articles **where** body_indexed **ilike**'%abc%';
相同或相似的查询运行多次会在运行时间上有所不同。这是由于机器上变化的系统负载和变化的查询计划。为了我们的目的,忽略波动,看看时差的一般趋势。
哇!这对于仅有的 200 万张唱片来说是一个巨大的差异。想象一下,我们正在查询一个数十亿的数据库。
结论
大多数时候我们只需要添加一个 B 树索引。但有时像杜松子酒这样的另一个指数更合适。当您最终遇到 B 树无法解决的问题时,知道其他索引类型是有用的。
你有没有遇到过任何很酷的索引用例,或者以有趣的方式应用它们?
民意测验专家有多好?分析 538 的数据集
我们分析了来自历史悠久的政治预测网站 538 的民调数据。
图片来源:作者拼贴创作(免费图片)
介绍
这是一个选举年,围绕选举(总统大选和众议院/参议院)的投票正在升温。这将在未来几天变得越来越令人兴奋,推文,反推文,社交媒体斗争,以及电视上无休止的专家评论。
我们知道,不是所有的民意测验都是同样的质量。那么,如何理解这一切呢?如何使用数据和分析来识别值得信赖的民意调查者?
图片来源: Pixabay (免费用于商业用途)
在政治领域(以及其他一些领域,如体育、社会现象、经济等)。)预测分析, 五三八 是一个令人生畏的名字。
自 2008 年初以来,该网站已经发表了关于当前政治和政治新闻的各种主题的文章,通常是创建或分析统计信息。该网站由 rockstar 数据科学家和统计学家 Nate Silver 运营,在 2012 年总统大选期间获得了特别的关注和广泛的声誉,当时其模型正确预测了所有 50 个州和哥伦比亚特区的获胜者。
图片来源:维基百科(创意常见)
而在你嗤之以鼻说“ 但是 2016 年大选呢? ”,你或许应该读一读这篇关于唐纳德·川普(Donald Trump)的当选如何在统计建模的正常误差范围内的文章。
即使在总统竞选结束时,民意调查也不能完美地预测选举的最终差距。有时候…
fivethirtyeight.com](https://fivethirtyeight.com/features/trump-is-just-a-normal-polling-error-behind-clinton/)
对于对政治更感兴趣的读者来说,这里有一整袋关于 2016 年大选的文章。
数据科学从业者应该会喜欢上 Five-38,因为它不回避用高度技术性的术语解释他们的预测模型(至少对于外行来说足够复杂)。
图片来源:本文
在这里,他们正在谈论采用著名的 t 分布,而大多数其他民调聚合者可能只是对无处不在的正态分布感到满意。
大多数学生被告知,随着样本量的增加,t 分布接近正态分布。
rpsychologist.com](https://rpsychologist.com/d3/tdist/)
然而,除了使用复杂的统计建模技术,Silver 领导下的团队还以一种独特的方法为傲,即民意测验专家评级,以帮助他们的模型保持高度准确和可信。
在这篇文章中,我们分析了这些评级方法的数据。
five-38 并不回避用高度技术性的术语解释他们的预测模型(至少对于外行来说足够复杂)。
民调评级和排名
这个国家有许多民意测验专家。阅读和评估它们的质量可能非常费力和棘手。据该网站称,“阅读民意测验可能对你的健康有害。症状包括过度自信为瘾君子数字 ,以及 急于判断 。谢天谢地,我们有治疗方法。(来源)
有民调。然后,还有的民调的民调。然后,还有民调的加权民调。最重要的是,有一个民意调查的权重是统计建模和动态变化的权重。
** [## 选举 2020 投票现场指南-皮尤研究中心方法
虽然美国的调查研究是一项全年的事业,但公众对投票的关注从来没有像现在这样多…
www.pewresearch.org](https://www.pewresearch.org/methods/2019/11/19/a-field-guide-to-polling-election-2020-edition/)
作为一名数据科学家,你对其他著名的排名方法是否耳熟能详?亚马逊的产品排名还是网飞的电影排名?可能吧,是的。
本质上,538 使用这种评级/排名系统来衡量民意测验结果(排名高的民意测验者的结果被给予更高的重要性等等)。他们还积极跟踪每个民意调查结果背后的准确性和方法,并在全年调整他们的排名。
见 FiveThirtyEight 的民意测验评分。民意测验是 FiveThirtyEight 的创始特色之一。我在……
fivethirtyeight.com](https://fivethirtyeight.com/features/how-fivethirtyeight-calculates-pollster-ratings/)
有民调。然后,还有民调的民调。然后,还有民调的加权民调。最重要的是,有一个民意调查的权重是统计建模和动态变化的权重。
有趣的是注意到他们的排名方法并不一定把样本量大的民意测验专家评为更好的。下面来自他们网站的截图清楚地证明了这一点。虽然 Rasmussen Reports 和 HarrisX 这样的民意调查机构有更大的样本量,但事实上,Marist College 以适中的样本量获得了+评级。
图片来源:网站作者于 2020 年 6 月 6 日截屏。
幸运的是,他们还在 Github 上开源了他们的民意调查排名数据(以及几乎所有其他数据集)。如果你只对好看的桌子感兴趣,这里有。
自然,作为一名数据科学家,您可能希望更深入地研究原始数据,并理解诸如以下内容:
- 他们的数字排名如何与民意测验专家的准确性相关联
- 如果他们对选择特定的民意测验专家有党派偏见(在大多数情况下,他们可以被归类为倾向民主党或倾向共和党)
- 谁是排名最高的民意测验专家?他们进行了很多民意调查,还是有选择性的?
我们试图分析数据集来获得这样的见解。让我们深入研究代码和发现,好吗?
分析
你可以在我的 Github 回购 T3 上找到 Jupyter 笔记本 。
源头
首先,您可以直接从他们的 Github 中提取数据,放入 Pandas 数据框架中,如下所示:
该数据集中有 23 列。这是它们的样子,
一些改造和清理
我们注意到一列有一些额外的空间。其他一些可能需要一些提取和数据类型转换。
在应用该提取之后,新的数据帧具有额外的列,这使得它更适合于过滤和统计建模。
“538 等级”栏目的考核与量化
列“538 等级”包含了数据集的关键—民意测验者的字母等级。就像正规考试一样,A+比 A 好,A 比 B+好。如果我们画出字母等级的数量,我们观察到总共 15 个等级,从 A+到 f。
我们不需要处理这么多的分类等级,我们可以把它们组合成少量的数字等级——4 代表 A+/A/A,3 代表 B,等等。
箱线图
进入视觉分析,我们可以从箱线图开始。
假设我们想要检查哪种轮询方法在预测误差方面表现更好。数据集有一个名为“ 简单平均误差 ”的列,它被定义为“公司的平均误差,计算为投票结果和实际结果之间的差值,用于区分比赛中前两名参赛者。
然后,我们可能会有兴趣去检查是否有一定党派偏见的民意调查者比其他人更成功地正确预测选举。
注意到上面有趣的东西了吗?如果你是一个进步的、自由的思想家,十有八九,你可能是民主党的党员。但是,一般来说,倾向共和党的民意调查者认为选举更准确,可变性更小。最好小心那些投票!
数据集中另一个有趣的列叫做“”NCPP/阿泊尔/罗珀 【T3”。它“表明这家民调公司是不是全国民意调查委员会的成员、 美国公众舆论研究协会透明度倡议 的签署者,还是罗珀公众舆论研究中心数据档案 的贡献者。实际上,成员资格表明遵循了更可靠的轮询方法”(来源)。
如何判断前述论断的有效性?数据集有一个名为“ 高级加减 ”的列,这是“一个将一个民调机构的结果与调查相同种族的其他民调公司进行比较的分数,它对最近的结果加权更大。负分是有利的,表示质量高于平均水平”(来源)。
这是这两个参数之间的箱线图。与 NCCP/阿泊/罗珀相关的民意测验专家不仅表现出较低的误差分数,而且还表现出相当低的可变性。他们的预测似乎是稳健的。
如果你是一个进步的、自由的思想家,十有八九,你可能是民主党的党员。但是,平均而言,倾向共和党的民意调查者认为选举更准确,可变性更小。
散点图和回归图
为了了解参数之间的相关性,我们可以通过回归拟合来查看散点图。我们使用 Seaborn 和 Scipy Python 库以及一个定制的函数来生成这些图。
例如,我们可以将正确称为 的“ 种族”与“ ”预测正负 ”联系起来。根据 538,“ 预测正负 ”是“对民意调查者在未来选举中准确性的预测。它是通过将民意测验专家的高级正负分数还原为基于我们的方法论质量代理的平均值来计算的。(来源)
或者,我们可以检查我们定义的“ 数字等级 ”如何与轮询误差平均值相关联。负趋势表示较高的数字等级与较低的轮询错误相关联。
我们还可以检查“ ”、 “用于偏见分析的民调数字”是否有助于减少分配给每个民调者的“”党派偏见程度。我们可以观察到一种向下的关系,表明大量民意调查的可用性确实有助于降低党派偏见的程度。然而,这种关系看起来高度非线性并且对数标度会更好地拟合曲线。**
越活跃的民意调查者越值得信任吗?我们绘制了民意测验数量的直方图,看到它遵循负幂律。我们可以过滤掉民意测验数量非常低和非常高的民意测验者并创建一个自定义散点图。然而,我们观察到在民意测验的数量和预测的正负分数之间几乎不存在相关性。因此,大量的民意调查并不一定导致高的民意调查质量和预测能力。
****
…大量民意调查的可用性确实有助于降低党派偏见的程度。
过滤和排序顶级民意测验专家
最后,我们可以通过定制的过滤逻辑,执行简单的数据帧操作来提取排名最高的民意测验者列表。例如,我们可以提出问题“做过 50 次以上民意调查的前 10 名民意调查者中,谁的高级加减分最好?”。
这是结果。请注意,我们没有按照“538 等级”或“数字等级”进行排序,但是因为它们与“高级加减”分数相关,所以在这个提取的列表中,大多数民意调查者都有 A+或 A 评级。
因此,大量的民意调查并不一定导致高的民意调查质量和预测能力。
其他因素
数据集包含其他参数,如’ 、豪斯效应 ‘和’ 、均值回复偏差 ',其中也包含党派偏差信息。它们肯定被用于五点三八预测的内部建模,可以进一步探索。
摘要
在本文中,我们展示了如何从久负盛名的 538 门户网站获取民意测验者评级的原始数据,并编写一个简单的 Python 脚本来进行适当的转换和可视化分析数据。
同样,你可以在我的 Github repo 上找到 Jupyter 笔记本 。
答同样,你可以查看作者的 GitHub 知识库获取机器学习和数据科学方面的代码、思想和资源。如果你像我一样,对人工智能/机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。
** [## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…
通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和有趣…
www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)****
你的预测有多准确?
Artur Matosyan 在 Unsplash 上拍摄的照片
为您的预测选择正确的误差指标
介绍
你的预测几乎总是错误的。无论你是在试图预测苹果下周的股价、巴西明年的能源消耗,还是你公司未来几个月的收入,几乎都不可能击中靶心:你肯定会弄错,哪怕只是很小的误差。一个非常重要的问题是如何测量误差。一个+50 的错误和一个-50 的错误一样糟糕吗?一个+100 的错误是一个+50 的错误的两倍吗?
正确的误差度量将主要取决于您的数据、您的目标和您的业务环境。在这里,我将介绍一些最常见的测量误差的方法(也有一些不常见的),它们的优点和缺点,以及在哪些特定情况下它们是可取的或不可取的。
开始之前的一些重要概念…
天真的模型
朴素模型是你能想到的做出预测的最简单的模型,它被用作比较所有其他模型的基线。通常,这意味着用你最后的观察作为你对下一个时期的预测。所以如果有人问你你的公司这个月会赚多少钱,你会说:“和上个月一样”。此外,如果您正在处理季节性数据,那么您将使用上一季度的同一时期(因此您预测今年 12 月的销售额与去年 12 月的销售额相同)。好像不是很好的模式吧?事实上,要大幅度击败它是非常困难的,尤其是对于非常复杂的模型。
这是一个有用的分析,可以确保你的预测过程是增值的,或者你是否应该坚持简单天真的预测。
步行验证
当处理时间序列时,我们使用以前的信息来估计未来,有时如果我们对下周或未来 10 周进行预测,会产生巨大的差异。因此,在您的模型评估步骤中,您应该尝试复制将在模型实施和预测使用后使用的相同过程。假设您必须制作一个模型来估计您公司的销售额,并且该模型将在每月的第一天用来估计下个月的销售额。为了测试您的模型,您应该使用相同的方法,这意味着您将忽略上个月的观察值来计算每个月的估计值(因为在应用您的模型时您将无法访问该信息),但仅此而已。
这意味着,如果您对数据应用一次传统的训练/测试分割,并尝试评估您的预测,您将不会获得准确的结果。相反,您应该重复训练/测试分割过程,以模拟进行预测的实际条件。在我们之前的示例中,如果您正在测试 2019 年的数据,您将首先使用 2018 年 12 月之前的所有数据作为您的训练集,并预测 2019 年 1 月。然后,为了预测 2 月份,我们将 2019 年 12 月添加到我们的训练集中,以此类推。
误差度量
注释
对于下面的所有公式,我们将使用以下符号:
均方根误差(RMSE)
RMSE 将误差(预测值和实际值之间的差异)进行平方。然后,将它们平均,并计算平均值的平方根。这种双重转换有两个效果:它给较大的误差更大的权重,并且它阻止正负误差相互抵消,因为它们都将变成正的。它可以用来比较同一系列的不同预测,但它不是很直观,所以我不会在管理演示中使用它。
平均绝对误差
也称为平均绝对偏差(MAD),MAE 对绝对值中的误差求和,因此负差不会抵消正差,而是将它们平均。它非常直观,所以很容易解释。它的一个缺点是依赖于规模,也就是说,它会根据你预测的收入是美元还是欧元而变化。同样,这不是很直观,但对于计算另一个误差指标很有用,我们将在下面看到。
平均绝对百分比误差(MAPE)
MAPE 与 MAE 非常相似,不同之处在于它与比例无关,因为我们将其除以实际值。这可能是商业预测中最常用的误差指标,因为它非常容易解释。然而,有一个警告:它有时可能有点误导,让你认为它总是保持在 0 到 100%之间。尽管它总是大于 0,但也可能远高于 100%。另一个不方便的地方是当你的观测值等于 0 时,这意味着你不能把它们作为分数的分母。在这种情况下,有些人会忽略这些观察结果,但是你应该知道,例如,当你处理间歇需求(很多值等于 0)时,MAPE 不是一个足够的度量。
另一个主要缺点是它的不对称性:它对过度预测的惩罚比对预测不足的惩罚更重,导致在比较不同模型时可能出现偏差。
尽管它有缺点,但它非常受欢迎,主要是因为它直观且易于解释。因此,您可以使用其他指标来评估您的预测,但在演示文稿中使用 MAPE 进行管理。
平均绝对标度误差
MASE 增加了一个有趣的视角:它将你的模型误差与简单模型的误差进行比较。它总是正的,尽管它可以无限大,但是如果它大于 1,就意味着你的模型实际上比原始模型表现得更差,因此没有增加价值。
它的价值来自于这样一个事实,即它是唯一一个实际使用天真预测的指标,因此考虑到了数据固有的可预测性。
平均误差/平均值
也被称为 MAD/MEAN,它是你的观察值的平均误差和平均值之间的分界点。这是创建 MAE 的无标度版本的尝试。
结论和进一步阅读
我们已经看到了许多衡量我们的预测有多好的方法,以及我们应该在什么时候使用它们。理想情况下,你不应该只依赖一个指标,而是依赖 2 个或 3 个:一个简单的无标度指标来比较你的模型;另一个是使用天真的预测来检查你的预测过程是否增加了价值;最后一种更直观,更容易理解,可以在演示中使用。
如果你想了解更多关于商业预测的知识,我推荐你从这两本书开始:《商业预测:实际问题和解决方案》和《商业预测交易》,这两本书都是迈克尔·吉利兰写的。
如果你想从整体上了解更多关于预测工作流程的信息,这篇文章展示了一种精益方法。