TowardsDataScience 博客中文翻译 2020(二百零四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

在你和你的团队分享你的实验结果之前,检查这 4 件事

原文:https://towardsdatascience.com/check-these-4-things-before-you-share-your-experiments-results-with-your-team-16dac876f435?source=collection_archive---------35-----------------------

经典的实验文献默认实验将运行一次,所有参与者一起到达,并被记录和管理治疗。Web 实验(A/B 测试)在一段时间内收集用户,分别记录暴露和处理,并连续运行。这就产生了一些陷阱——下面是如何测试它们的方法。

我也犯过一些分析错误,有些花费了团队成员数周的时间来做错误的事情,或者更糟——错过了一个很好的机会。但通过这些,我收集了一份分析中一些常见陷阱的清单,无论是实验(A/B 测试)还是观察数据。

1.异质处理效果

这种说法仅仅意味着你看到的效果是不同用户群的不同效果的平均值。例如,也许你的网站的新版本在转化男性方面比女性好得多:男性的转化率比以前高 23%,而女性的转化率略差(-2%)。但是如果你网站的观众 80%是女性,你会认为新版本是个好主意:平均转化率上升了 3%。现实中你的大部分用户喜欢的略少,只对一小部分用户更好。

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

很少用户非常高兴+大多数用户略微悲伤可能看起来是一个总体良好的结果(图片由作者提供)

为了避免这种情况,通常没有其他办法,只能通过你收集的任何维度(例如,人口统计、地理、设备等)对你的用户进行细分。)并寻找组间效应大小的主要差异。然而,如果你做得太多,你需要小心多重比较(本质上,随机发现不存在的效果)。

不过在某些情况下,你可以通过绘制效果分布图来更直接地测试这一点:有多少%的用户体验到了分配给他们的治疗所带来的效果。例如,当测量类似“用户一个月访问你的服务的平均天数”这样的重复活动时,你可以检查一个实验是否将每个人向上移动了 3%(橙色线),或者是否有+3%的平均效果,但实际效果的分布很广,一些用户受到了变化的伤害(紫色)。然后,尝试找出这些用户的不同之处。

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

橙色实验对每个人都有同样的效果;紫色实验有一系列的影响(图片由作者提供)

2.混合班次

我检查的一个相关问题是绘制随时间变化的数据时。最糟糕的错误之一是不正确的趋势:如果数据在“方向上”是正确的,但错误了一个常数(所以,当它上涨时,你认为它上涨了,只是没有你想象的那么上涨),这对大多数商业决策来说通常是没问题的。但是当你认为某样东西在上升的时候下降了,你可能会停止一个成功的活动或者倾向于一个有害的活动!

当同时存在异质效应时(因此两个或更多组具有不同的结果,例如保留率)随着时间的推移,一个组在总体中所占的比例在增长,就会出现混合变化。随着时间的推移,这造成了一个错误的趋势,它来自于人口的变化,而不是行为的变化。在上面的例子中,如果你的网站开始搅动女性用户(在我们做出改变后,她们的体验变得更差),你会认为整体转化率在提高——但实际上只有剩下的男性转化得更好,而不是企业成功的整体改善。

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

从 F 到 M 的种群变化可能会使相同的实验看起来有所改善(图片由作者提供)

3.检查曝光

一个非常微妙的话题,但在线实验的现实是,当我们记录一个人被随机分配到一个实验组时,以及当他们的实际经历发生变化时,有时我们会分离出来。这里有一个例子:在一个电子商务网站上,我可能有一个实验,一半登录的用户在结账时会得到 10%的折扣,另一半不会。天真地说,我可能会在用户进入网站的那一刻就把他们分成两个实验组,A 组和 B 组,并把这个记录在我们的数据库中。然后,我对 A 组和 B 组中哪一组的结账率更高进行了分析,并计算了实验的功效——基本上是确保我有足够多的用户进行实验,以得出关于其效果的具有统计意义的结论。对吗?

嗯,差不多了。事情是这样的,我记录了哪些实验组的用户第一次访问这个网站的时候。但是他们中的很大一部分人(比如说 90%)甚至没有最终购买任何东西。所以他们实际上没有看到优惠券——他们有着与完全没有优惠券的对照组完全相同的体验。因此,他们的购买行为当然不会改变。但是计算实验效果背后的数学方法在这里是误导性的:我们在稀释实验的效果,因为很多人没有购买优惠券。结果,我们最终认为实验是无效的,或者没有达到我们期望的统计显著性水平,并放弃了它。这是“过度暴露”——你把实际上没有接受治疗的人登记到实验中。

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

过度曝光和曝光不足都会让实验看起来不稳定。签名。当他们是。(图片由作者提供)

在更罕见的相反情况下,我们可能会在记录之前暴露用户在一个实验组中——这可能发生在复杂的设置中,例如,我们只在他们实际结账时记录暴露,而不是当他们第一次看到购物车中的优惠券时——结果我们暴露不足,也冲淡了我们实验的效果(或者更糟糕的是,如果暴露与某些行为相关,可能会得出错误的结论)。

底线是始终确保你清楚用户在哪里第一次遇到实验的任何可能效果,然后才将其纳入实验组(或控制组)

4.一千次(统计上无关紧要)削减造成的死亡

我们知道我们可能会错误地发现一种效应(XKCD 在一项实验中很好地测试了不同颜色的软糖和痤疮之间的联系)。但我们也可能会错过一个效果,因为我们的实验动力不足(很难发现你做的事情提高了 0.1%的转化率,因为这通常需要成千上万的用户)。虽然 0.1%的改进通常对企业的成功并不重要,我们也不应该关注它,但 0.1%的下降一直在发生,很难发现,并且会增加。这里有一个例子:假设我们是一个成长团队,正在试验我们应用程序的各个部分,其中许多测试对我们的日常活跃用户产生了很好的结果。

但是,我们并不傻——我们也检查对长期记忆的影响。如果一个实验对记忆有显著的负面影响,我们会拒绝它。然而,长期保留是一个嘈杂的指标,用更少的用户和更少的能力来衡量,其影响往往更微妙。他们通常平均得出轻微的负面或轻微的正面结果,但是置信区间意味着他们在统计学上是不显著的:我们不能确定他们是负面的。不过,他们中的许多人可能会。我们可能会不知不觉地对记忆力产生微小的负面影响。因此,有了“千刀万剐”(脸书的一位同事创造的)。

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

在每个单独的实验中,对性能的影响是轻微的,但不是统计的。签名。但是综合起来看,这显然对 Perf 有害。(图片由作者提供)

防止这种情况的主要方法是长期抵制。长期抵制者是一组不接受任何新实验的用户,即使这些实验已经推广到其他用户群。然后,您可以测量所有其他实验一起对长期维持的影响,并查看其他用户的体验是否与维持有显著差异——实质上,维持是对许多实验一起的影响的控制。

我想知道为什么我在职业生涯中花了几年时间才了解这些,结果是在经典实验中不会发生这种情况,在经典实验中,所有参与者通常会被一起放在一个房间里,接受治疗,然后在测量结果后再也不会见到他们。因此,所有关于实验的文献通常都忽略了这些考虑。但是如果你在做在线 A/B 测试,那么保持一小部分用户在“永久控制组”中,观察治疗效果的分布而不仅仅是平均治疗效果,当你观察治疗效果时固定分组,并同时仔细检查你的任务和暴露记录将帮助你避免许多常见的陷阱。

在平台迁移期间检查数据一致性

原文:https://towardsdatascience.com/checking-data-consistency-during-platform-migrations-83eed17479c5?source=collection_archive---------33-----------------------

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

检查数据的一致性是一项具有挑战性的任务(图片尤利娅·卢卡申娜)

实践教程

确保平稳的数据迁移:我自己在 Salesforce、SAP 和许多其他公司的经验,包括实际例子、图表和代码块

什么是“平台”,它与数据科学有什么关系?

对于平台,我指的是以某种方式永久存储数据的所有软件。不一定是数据分析平台,而是 CRM、ERP(企业资源规划)、活动管理平台等。

十年前,平台迁移曾经是一件独特而罕见的事情。如今,许多公司每隔几年就迁移一次工作流程。有时,他们这样做是因为更好的技术已经到来。更常见的是,一个老的甚至工作良好的人被安排退休。

该平台收集的数据通常用于业务分析报告。通常,业务平台有一个分析扩展。一个很好的例子是 Salesforce 平台及其爱因斯坦分析扩展。在某些情况下,必须定期在第三方工具中提取、处理和可视化数据。

什么是数据一致性,平台迁移有什么问题?

每个平台及其分析扩展都有用于计算和可视化关键性能指标的例程。这些例程因平台而异。有些提供 ETL 工具;有些没有,所以您可以直接在可视化界面中进行一些数据清理。

但是作为企业所有者或经理,您需要一个共同标准,即您日常决策中使用的所有关键 KPI 的标准表示。您还希望确保基础计算可能导致相同或几乎相同的结果,尽管结果可能不同。

迁移结束后,您打开一个新构建但不熟悉的 KPI 仪表板。这些数字对你来说一定还是有意义的。

另一个潜在的陷阱是实现新的计算程序意味着新的数据管道。新的数据存储。从原始位置弹出数据的新方法。一份闪亮的商业报告需要很多步骤才能完成。出现错误的可能性很大。

几个实际例子

到目前为止,这听起来可能太理论化了——这是我过去的几个例子。

亚马逊 S3 的传统平台

几年前,我参与了一次平台迁移,这是因为需要更大的数据存储和更快的基于云的数据管道。该公司决定用亚马逊 S3 云取代传统平台。

客户以。他们保存在 SFTP 服务器上的 CSV 文件。亚马逊 S3 数据管道将对它们进行消化、处理,并创建一个 SQL 数据库。数据库连接到多个 Tableau 仪表板。新数据每天都有。

在向客户展示新系统之前,我们同时运行了一段时间。我们很快注意到,新的管道往往无法提供与旧管道相同的结果。原因之一是。CSV 文件与亚马逊 S3 中创建的模式不匹配。粗略地说,这些文件通常有不同的列名或者数据格式错误。

Google DoubleClick 的传统活动管理工具

还有一次,我的公司想从利基营销管理工具迁移到 Google DoubleClick。因为我们的主要客户希望他的旧报告是一对一的,所以应该从 DoubleClick 中提取数据,写入 SQL 数据库,然后消化到 Microsoft PowerBI 中。

陷阱很快就暴露出来了。与前一种情况一样。CSV 文件包含错误的列名。在谷歌分析中,它们有时会在没有警告的情况下被更改。自从下载了。CSV 文件自动运行,不一致的数据被插入到数据库中,随后破坏了 KPI 仪表板。此外,没有遵循分类维度的命名约定。

新数据也是每天都有。这些差距被自动传输到 PowerBI 可视化中,它们的错误让很多人感到非常沮丧。

SAP 至 Salesforce

我的下一次迁移有一个巨大的范围:该公司希望从 SAP 迁移一个 ERP、一个 CRM 和一个分析工具,SAP 宣布其一些模块退休,转到其竞争对手 Salesforce。Salesforce 并不专注于 ERP 市场。它提供单个软件包,可以帮助您组装预订和发票的工作流程。不过,这需要大量的定制。

因此,来自新 ERP 的数据与来自 SAP 环境的数据非常不同。此外,Salesforce 分析扩展有相当多的细节。在迁移过程中,SAP 数据被直接插入到 Salesforce Einstein Analytics 中。作为两个系统之间的桥梁,SQL 数据库存储两者之间的数据。

的。从 SAP 弹出的 CSV 文件未能添加到数据库中。最重要的是,Einstein Analytics 数据管道交付的结果与我们在 SAP 分析工具中看到的结果有所不同。KPI 就像高度聚合的总收入一样,完全不一样!

即席检查数据一致性

每一个差异都让我去钻研数据。我开发了一些可靠的方法。

向下的方法

您从 KPI 开始,这些 KPI 通常是较小单位值的高度聚合。例如,您会发现不同平台的总收入是不同的。您可以进一步比较每个客户或给定时间段的收入。

可能只有特定客户的金额会有偏差。你继续深入,选择下一层,例如,一个合同。然后是账单。迟早,你会发现差异,现在可以寻找原因。您应该找到一个错误的数据条目。然后你去找出数据条目是什么时候被添加到你的系统中的。查看一堆数据,比如. CSV 文件。可能,它已损坏,与数据结构不匹配,或者有数据格式问题。

向上的方法

根据报告的类型,有时您可以直接分配错误数据条目到达的时间段。或涵盖显示不正确总收入的合同期限的时间段。然后,您可以跳到最低的汇总级别,或者跳到根本没有汇总的级别。例如,您获取每个合同或账单,从每个系统中导出它们,并通过匹配它们的 id 来比较它们。

元数据级别

我不喜欢比较 KPI。这意味着理解他们的业务逻辑。这种逻辑经常会在我不知道的情况下改变。比较元数据似乎是一种更安全的方式,但并不总是足够的。

众所周知,元数据是关于数据的数据。我之前所说的模式。您检查传入的数据是否具有相同的结构。这包括但不限于:

  • 列名
  • 对于某些工具:列顺序!
  • 数据格式,尤其是日期
  • 分类维度的名称

如果您有关于三个营销活动的数据,突然,一个. CSV 有了第四个活动,而您没有处理规则,那么您的数据管道可能会混乱。

数据不一致的其他原因

如果最小的数据单元——合同、账单、预订——在不同的平台上具有不同的值,这意味着您将错误的数据加载到一个或两个数据管道中。

从这个水平开始,偏差只会越来越大,总的结果会越来越大。

在许多情况下,这些最小的单元与管道内的一些附加数据相匹配,如客户、行业等。这允许在流程的后期对数据进行分组和聚合。这些匹配经常失败:客户更改了公司名称,CRM 的名称不正确,名称和 ID 不匹配,等等。

匹配规则中的异常也令人头疼。如果你忘记把旧系统的所有异常都复制到新系统中,你就会有偏差。只有当您开始比较聚合数据时,它们才变得可见。

持续检查数据的一致性

基本上,所有方法都适用于持续监控。你只需要将它们自动化。

您可以监控一个平台,可能是新平台,或者两个都监控。这取决于您对遗留平台的信任或您使用的方法。

从技术角度来看,这是通过以下方式实现的。我提取了两个平台的数据,并把它们进行了对比。我花了有限的一段时间,主要是最近的一段时间。一些计算也需要以前时期的数据。在一些特殊情况下,用户可以调整过去期间的数据条目,比如为当前达到折扣启用值的合同添加折扣。这就是为什么我定期对去年的数据进行一致性检查。

那么,这实际上意味着什么呢?

您可以在其中一个分析扩展中运行检查。或者,您可以从两个系统中导出数据,并在第三个工具中比较元数据。两种方法我都尝试过,但最终都是基于 Python 的管道。

这两个报告的提取也可以自动化。不过,这取决于工具。

比较数据

我下载了两个 CSV。旧平台和新平台上的文件。它们有不同的结构,但是应该有一个键,比如事务 ID。我有一个 R 或 Python 脚本,它处理来自两个系统的数据,获取键,并将其他数据作为键的属性进行比较。

下面是两个(当然是虚构的)导出的截图:

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

遗留平台样本原始数据:电子商务交易

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

目标平台样本原始数据:电子商务交易

该脚本将来自两个系统的数据标准化,重命名列或维度,或者使用附加数据将不同的命名放在一起。

例如,交易 313200 在旧系统中的价值为 40,00 美元,在新系统中的价值为 40 美元。它是匹配的。Python 脚本找到了两种格式的共同点,并对实际值进行了比较。

我比较了交易的每一个属性,不仅包括总和,还包括字符串列:

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

检查单个事务的属性

作为最后一个例子,我附上了总收入比较。

您可能已经注意到,相同的交易在不同的平台上有不同的客户 ID。我转换包含它们的名称的列,并将它们用作键。然后,我对交易值求和,得到每个客户的收入,并计算增量。

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

比较每个客户的总收入(不同平台之间的差异)

比较元数据

您可以用日期-时间来标记数据的时间戳,以指示它被弹出或被消化的时间。然后,检查最近一段时间(如昨天)添加到数据库的新数据量,以排除此阶段的异常和错误。

您计算在某一天(比如昨天)打上时间戳的行数。

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

检查元数据:过去 24 小时内添加到两个系统的行数

检查分类变量也是如此。您可以创建一个数据可视化来显示您的维度值,甚至检查是否添加了任何新值。

得到通知

另一个好的做法是创建一个警报,在出现问题时向您发出警告。例如,如果新行的数量小于零。

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

在小部件上设置通知

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

定义通知触发器:如果最近没有添加新行

一会儿之后

对于这篇文章,我以稍微简化的形式重新创建了我以前的工作程序。我不能发布完全相同的数据和方法,因为我既没有访问它们的权利,也没有为自己的利益使用它们的权利。我创建了我的真实方法的抽象,使它们匿名和通用。所有特定于公司的信息都被小心翼翼地删除了。除了日常工作之外,我还主动要求定期进行数据一致性检查,并制定方法。

我使用了 sales force Einstein Analytics trail head 操场来构建上面的数据可视化。不涉及数据管道。数据处理直接发生在数据可视化界面中。

下面是我用来构建表的 SAQL 查询:

属性比较:

legacy = load "System_1_Legacy";
legacy = filter legacy by date(Processed_Year, Processed_Month, Processed_Day) in ["1 day ago" .. "1 day ago"]; 
legacy = foreach legacy generate Processed, count() as Count_Rows;
legacy = group legacy by Processed;
legacy = foreach legacy generate Processed as Last_Insert_Date, sum(Count_Rows) as Count_Rows_Legacy;target = load "System_2_Target";
target = filter target by date(System_Timestamp_Year, System_Timestamp_Month, System_Timestamp_Day) in ["1 day ago" .. "1 day ago"]; 
target = foreach target generate System_Timestamp, count() as Count_Rows;
target = group target by System_Timestamp;
target = foreach target generate System_Timestamp as Last_Insert_Date, sum(Count_Rows) as Count_Rows_Target;result = cogroup legacy by Last_Insert_Date full, target by Last_Insert_Date;
result = foreach result generate legacy.Last_Insert_Date as Legacy_Last_Insert_Date, target.Last_Insert_Date as Target_Last_Insert_Date, 
    coalesce(sum(legacy.Count_Rows_Legacy), 0) as Count_Rows_Legacy,
    coalesce(sum(target.Count_Rows_Target), 0) as Count_Rows_Target,
    coalesce(sum(legacy.Count_Rows_Legacy), 0) - coalesce(sum(target.Count_Rows_Target), 0) as Delta_Count_Rows;

总收入比较:

legacy = load "System_1_Legacy";
target = load "System_2_Target";
legacy = filter legacy by date(Processed_Year, Processed_Month, Processed_Day) in ["1 day ago" .. "1 day ago"]; 
target = filter target by date(System_Timestamp_Year, System_Timestamp_Month, System_Timestamp_Day) in ["1 day ago" .. "1 day ago"];legacy = foreach legacy generate Surname + ", " + Name as Customer_Name, Transaction_Value;
result = cogroup legacy by Customer_Name full, target by Name;
result = foreach result generate legacy.Customer_Name as Customer_Name, 
coalesce(sum(legacy.Transaction_Value), 0) - coalesce(sum(target.Total_sum), 0) as Delta;

行数/元数据比较:

legacy = load "System_1_Legacy";
target = load "System_2_Target";
legacy = filter legacy by date(Processed_Year, Processed_Month, Processed_Day) in ["1 day ago" .. "1 day ago"]; 
target = filter target by date(System_Timestamp_Year, System_Timestamp_Month, System_Timestamp_Day) in ["1 day ago" .. "1 day ago"]; 
legacy = foreach legacy generate Transaction_ID, 
                                Surname + ", " + Name as Customer_Name, 
                                Transaction_Currency,
                                Transaction_Timestamp,
                                Processed,
                                Transaction_Value;
result = cogroup legacy by (Transaction_ID, 
                            Customer_Name, 
                            Transaction_Currency,
                            Transaction_Timestamp,
                            Processed) full, 
                target by (Order_ID, 
                            Name, Currency,
                            Ordered_at,
                            System_Timestamp);
result = foreach result generate legacy.Transaction_ID as legacy_ID, target.Order_ID as target_ID,
(case when coalesce(sum(legacy.Transaction_Value), 0) == coalesce(sum(target.Total_sum), 0) then 0 else 1 end) as Transaction_Value_Check,
(case when legacy.Customer_Name == target.Name then 0 else 1 end) as Customer_Name_Check,
(case when legacy.Transaction_Currency == target.Currency then 0 else 1 end) as Transaction_Currency_Check,
(case when legacy.Transaction_Timestamp == target.Ordered_at then 0 else 1 end) as Transaction_Timestamp_Check,
(case when legacy.Processed == target.System_Timestamp then 0 else 1 end) as Processed_Check;

测试愉快!

用 BERT 和 ULMFiT 检查语法。

原文:https://towardsdatascience.com/checking-grammar-with-bert-and-ulmfit-1f59c718fe75?source=collection_archive---------18-----------------------

让我们来看看迁移学习的两个重量级人物在检查语法方面的表现。

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

绿色变色龙Unsplash 上的照片

迁移学习对于所有 NLP 研究人员来说是一个游戏改变者,所以在开始之前,让我们快速回顾一下什么是迁移学习。

迁移学习(Transfer learning)是一种机器学习方法,其中为一项任务开发的模型被重新用作第二项任务的模型的起点。

简单地说,它将来自一个领域和任务的先验知识运用到不同的领域和任务中。幸运的是,我们有各种这样的模型,它们具有关于语言及其语义的先验知识,所以我们将只使用那些(有知识的)模型,并看看它们如何执行我们手头的任务(这里检查语法)。

但是我们许多人在各种 NLP 任务中面临的一个主要问题是缺乏良好的硬件(GPU 和 TPU),这是 NLP 任务的一个必要条件,因为我们要处理高维密集向量。在本文中,我们将看到如何克服这一点,使用 Google Colab 来训练模型,并使用一台 CPU 机器来测试和使用我们的语法检查器。

让我们见见竞争者

一方面,我们有 fast.ai 的杰瑞米·霍华德和 NUI Galway Insight Center 的 Sebastian Ruder 提出的 ULMFiT。ULMFiT 使用以下新技术实现了最先进的结果:

  • 区别微调
  • 倾斜三角形学习率,以及
  • 逐步解冻

该方法包括将在 Wikitext 103 数据集上训练的预训练语言模型(LM)微调到新的数据集,以使其不会忘记之前学习的内容。

为了与 Fast.ai 的 ULMFIT 竞争,我们有谷歌的 BERT (来自变压器的双向编码器表示),它为大多数 NLP 任务提供了最先进的结果。BERT 的关键技术创新是将 Transformer(一种流行的注意力模型)的双向训练应用于语言建模。这与以前从左到右或者结合从左到右和从右到左训练来查看文本序列的努力形成对比。

在本文中,我们不会深入讨论每个模型的细节,而是看看它们在检查语法方面的表现。

那么数据在哪里呢?

我们将使用语言可接受性语料库(CoLA) 数据集进行单句分类。它是一组被标记为语法正确或不正确的句子。它于 2018 年 5 月首次发布,是“GLUE Benchmark”中包括的测试之一,BERT 等模型正在进行竞争。

让我们看一下我们的数据:

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

数据集的一小部分。(0 ->错,1->对)。

让我们开始战斗吧

我们将使用 Google Colab 来微调预训练的模型,因为我们可以轻松地使用 Colab 免费提供给我们的 GPU,这将大大减少训练时间。

伯特

对于伯特,我们将使用拥抱脸的 PyTorch 实现,因为它非常简单和直观。以下是我们大致遵循的步骤:

  1. 加载数据集并解析它。
  2. 将句子编码成伯特可以理解的格式。
  3. 训练(微调),它涉及到这些步骤 :
  • 打开我们的数据输入和标签
  • 将数据加载到 GPU 上进行加速
  • 清除上一步中计算的渐变。
  • 正向传递(通过网络输入数据)
  • 反向传递(反向传播)
  • 告诉网络使用 optimizer.step()更新参数
  • 跟踪用于监控进度的变量
  • 我们将指定BertForSequenceClassification作为最后一层,因为它是一个分类任务**。**

4.将微调后的模型保存到我们的本地磁盘或驱动器。

5.下载保存的模型,并在我们的本地机器上做一些语法检查。

这里的笔记本包含了全部代码。

乌尔菲特

Fast.ai 提供了一个简单得多的接口来实现 ULMFIT。以下是涉及的步骤:

  1. 加载数据集并解析它。
  2. 使用我们的数据集建立一个语言模型。
  3. 只使用语言模型的编码器来构建分类器。
  4. 微调分类器(这里是语法检查器)。
  5. 保存微调后的模型。
  6. 下载模型在我们的本地设置中玩。

这里是包含上述代码的笔记本

那么谁是赢家呢?

为了可视化结果,让我们用 HTML 和 CSS 构建一个带有简单 UI 的小 flask 应用程序。这里是 Flask 应用程序的 Github repo ,在这里你可以很容易地下载你自己的模型并使用这个应用程序。

让我们从一些句子开始:

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

下面是一个简单的陈述。

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

伯特和乌尔菲特都预测正确。

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

干得好,伯特,你不适合,你需要更多的训练。

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

太好了,你们俩都在这里。

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

这是一个棘手的问题,但乌尔菲特可能有优势。

玩了一天后,伯特似乎是这场战斗的明显赢家。尽管我们可以进一步微调超参数以改善结果。

评估模型的更好方法是通过使用马修相关系数的预测,因为这是更广泛的 NLP 社区用来评估可乐性能的指标。按照这个标准,+1 是最好的分数,而-1 是最差的分数。通过这种方式,我们可以看到我们在这项特定任务中相对于最先进模型的表现有多好。

对于我们的车型,BERT 的 MCC 得分为 0.55 优于 ULMFiT 的 0.4042

结论

在这场战斗中,BERT 可能在理解语言语义方面比 fast.ai 的 ULMFiT 有优势,但我们可以进一步优化我们的模型,以获得更好的结果。我们也可以尝试其他迁移学习模式,如:脸书的 RoBERTa,XLNET,ALBERT 等。用于检查语法。

参考资料:

  1. Fast.ai 文档https://docs.fast.ai/
  2. 拥抱脸变形金刚https://huggingface.co/transformers/index.html
  3. Chris mcCormick 的博客文章http://mccormickml . com/2019/11/11/Bert-research-EP-1-key-concepts-and-sources/

Keras 中的检查点深度学习模型

原文:https://towardsdatascience.com/checkpointing-deep-learning-models-in-keras-a652570b8de6?source=collection_archive---------4-----------------------

了解如何使用检查点保存深度学习模型,以及如何重新加载它们

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

保存和加载深度学习模型的不同方法正在使用

在本文中,您将了解如何对使用 Keras 构建的深度学习模型进行检查点检查,然后将模型架构和训练好的权重恢复到新模型,或者从您停止的地方恢复训练

检查点的使用

  • 允许我们使用预训练的模型进行推理,而不必重新训练模型
  • 从我们停止的地方继续训练过程,以防训练中断或用于微调模型

在训练因任何原因中断的情况下,它可以自动保存您的模型。

使用检查点保存和加载模型和权重的步骤

  • 创建模型
  • 指定我们要保存检查点文件的路径
  • 创建回调函数来保存模型
  • 在培训期间应用回调函数
  • 根据测试数据评估模型
  • 使用 l oad_weights()从最近的检查点恢复重量,将预训练的重量加载到新型号上

创建具有损失函数、指标和优化器的基础模型架构

我们为时尚 MNIST 数据集创建了多类分类模型

**# Define the model architecture 
def create_model():
    model = tf.keras.Sequential()
    # Must define the input shape in the first layer of the neural network
    model.add(tf.keras.layers.Conv2D(filters=64, kernel_size=2, padding='same', activation='relu', input_shape=(28,28,1))) 
    model.add(tf.keras.layers.MaxPooling2D(pool_size=2))
    model.add(tf.keras.layers.Dropout(0.3))
    model.add(tf.keras.layers.Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))
    model.add(tf.keras.layers.MaxPooling2D(pool_size=2))
    model.add(tf.keras.layers.Dropout(0.3))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(256, activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(10, activation='softmax'))

    #Compiling the model
    model.compile(loss='sparse_categorical_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])

    return model**#create the model
**model_ckpt= create_model()**

指定存储检查点文件的路径

**checkpoint_path = "train_ckpt/cp.ckpt"**

创建回调函数保存模型。

在训练的不同阶段应用回调函数,以给出内部训练状态的视图。

我们使用 模型检查点 创建一个回调函数来保存模型权重。

如果我们将save _ weight _ only设置为 True,那么将只保存重量。模型架构、损失和优化器将不会被保存。

我们还可以指定是否要在每个时期或每隔 n 个时期保存模型。

# Create a callback that saves the model's weights
**cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,save_best_only=True, save_weights_only=True, verbose=1)**

模型检查点回调类具有以下参数:

  • 文件路径:指定我们想要保存模型的路径或文件名
  • 监控:我们想要监控的指标,比如损失或准确性
  • 详细度 : 0 表示调试模式,1 表示信息
  • save_weights_only :如果设置为 True,则只保存模型权重,否则保存整个模型,包括模型架构、权重、损失函数和优化器。
  • save_best_only :如果设置为 True,则根据我们监控的数量,仅保存最佳模型。如果我们正在监控精度并且 save_best_only 被设置为 True,那么模型将在我们每次获得比先前精度更高的精度时被保存。
  • 模式:有三个选项- 自动、最小或最大如果我们正在监控精度,则将其设置为最大值,如果我们正在监控损耗,则将其设置为最小值。如果我们将模式设置为自动,则方向会根据监控的数量自动推断
  • save_freq 或 period : 设置为‘epoch’或一个数字。当它设置为 epoch 时,模型在每个 epoch 后被保存。当我们指定一个数字,比如说 5,那么模型在每五个时期后被保存,如下面的代码所示
# Create a callback that saves the model's weights every 5 epochs
**cp_callback = tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_path, 
    verbose=1, 
    save_weights_only=True,
    save_freq=5)**

在培训过程中应用回调

# Train the model with the new callback
# Pass callback to training
**model_ckpt.fit(train_images, 
          train_labels,  
          batch_size=64,
          epochs=10,
          validation_data=(test_images,test_labels),
          callbacks=[cp_callback])**

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

我们可以看到,如果 val_loss 没有改善,那么权重就没有保存。每当丢失减少时,这些权重就会保存到检查点文件中

在测试图像上评估模型

**loss,acc = model_ckpt.evaluate(test_images,  test_labels, verbose=2)**

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

检查点文件

检查点文件以二进制格式将训练好的权重存储到检查点格式化文件的集合中

tensor flowsave()保存三种文件:检查点文件、索引文件、数据文件。它将图形结构变量值**分开存储。

检查点文件:包含索引文件以及一个或多个数据文件的前缀

索引文件:指示哪些权重存储在哪个分片。当我在一台机器上训练该模型时,我们看到CP . ckpt . data-00000-of-00002CP . ckpt . data-00001-of-00002

数据文件:保存所有变量的值,无结构。可以有一个或多个数据文件

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

检查点文件

加载预训练的重量

加载预训练重量的原因

  • 从我们停止的地方继续或
  • 中断后恢复或
  • 加载预训练的重量进行推断

我们创建一个新的模型来加载预训练的权重。

当加载具有预训练权重的新模型时,新模型应该具有与原始模型相同的架构。

# Create a basic model instance
**model_ckpt2 = create_model()**

我们使用***load _ weights()***将预训练的权重加载到我们的新模型中。

**model_ckpt2.load_weights(checkpoint_path)**

我们可以使用新模型对测试图像进行推断

**loss,acc = model_ckpt2.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))**

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

未经训练的模型将随机执行(大约 10%的准确度)

从我们停止的地方继续训练

**model_ckpt2.fit(train_images, 
          train_labels,  
          batch_size=64,
          epochs=10,
          validation_data=(test_images,test_labels),
          callbacks=[cp_callback])**

我们看到现在精确度已经改变了

loss,acc = model_ckpt2.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))

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

从最新的检查点加载权重

***latest _ check point()***查找最新保存的检查点文件的文件名

#get the latest checkpoint file
**checkpoint_dir = os.path.dirname(checkpoint_path)
latest = tf.train.latest_checkpoint(checkpoint_dir)**

我们创建一个新的模型,从最新的检查点加载权重并进行推理

Create a new model instance
**model_latest_checkpoint = create_model()**# Load the previously saved weights
**model_latest_checkpoint.load_weights(latest)**# Re-evaluate the model
**loss, acc = model_latest_checkpoint.evaluate(test_images,  test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))**

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

在文件名中包含纪元编号

# Include the epoch in the file name (uses `str.format`)
**checkpoint_path = "training2/cp-{epoch:04d}.ckpt"**

使用时尚 MNIST 保存模型和重新加载模型的代码

结论:

我们现在了解了如何使用**模型检查点类、**创建不同的检查点文件来创建回调函数,以及如何恢复预训练的权重

参考文献:

https://www.tensorflow.org/tutorials/keras/save_and_load

创建自定义对象检测模型的简单方法

原文:https://towardsdatascience.com/chess-rolls-or-basketball-lets-create-a-custom-object-detection-model-ef53028eac7d?source=collection_archive---------11-----------------------

数据科学工具包第二部分

介绍

OLO 是我最喜欢的计算机视觉算法之一,很长一段时间以来,我一直计划专门为这个奇迹写一篇博文。然而,我决定我不想让它成为另一篇详细解释 YOLO 如何在幕后工作的文章。至少有一些媒体上的出版物很好地涵盖了事物的理论方面。除此之外,如果你想拓宽你对这个架构的理解,直接从源头获取你的信息并阅读最初的论文也是一个很好的主意。

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

基于 YouTube-8M 数据集,检测在篮球场上走动的球员

代替理论,这次我将向你展示如何快速地,以相对较低的努力,并且不需要强大的机器,创建定制的模型,能够检测你选择的任何物体。如果你需要在工作中快速测试你的想法,或者只是在家里愉快地建立你的小宠物项目,这是一个很好的方法。去年我有机会做了几个这样的实验,本文中出现的所有可视化都是这些项目的成果。

**注意:这一次,**我们将主要使用开源库和工具,因此我们网站上的编码量将是最小的。然而,为了鼓励你和 YOLO 一起玩,并给你一个项目的起点,我还提供了脚本,允许你下载我预先训练的模型以及所有的配置文件和测试数据集。像往常一样,你会在我的 GitHub 上找到它。

YOLO

一个 你们都不知道 YOLO 是什么——但出于好奇决定点击封面图片——别担心, 哪儿也别去!我现在会简单解释一下我在说什么。

YOLO——或者你只看一次——是一种实时对象检测算法,它是首批平衡所提供预测的质量和速度的算法之一。这种类型中最强大的模型是建立在卷积神经网络之上的,这次也不例外。通过“对象检测模型”,我们的意思是,我们不仅可以使用它来指示给定照片中存在什么对象,还可以指示它们的位置和数量。这种模型在机器人和汽车工业中广泛使用,因此干涉的速度至关重要。自 2015 年以来,这种算法已经有了三次迭代,以及为 TinyYOLO 等移动设备设计的变体。移动版本的精度有限,但它的计算要求也更低,允许它运行更快。

资料组

和深度学习中的惯例一样,创建模型的第一步是准备数据集。监督学习是关于查看带标签的例子,并在数据中找到不明显的模式。我必须承认,创建数据集是一项相当乏味的任务。这就是为什么我准备了一个脚本,可以让你下载我的国际象棋数据集,看看 YOLO 是如何处理这个例子的。

但是那些想要建立自己的数据集的人面临一个挑战。为了实现这个目标,我们需要收集一组图像并创建匹配的标签文件。图片应该包含我们想要识别的物体。**还建议数据集群体中所有对象类的分布相似。**如你所见,在我的第一个项目——篮球探测器中,我使用了游戏视频中的帧。

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

篮球数据集中的图像示例

您的标签文件应该与图像具有相同的名称,但显然具有不同的扩展名,并且应该位于一个并行目录中。最佳数据结构如下所示。除了imageslabels目录,我们还必须准备class_names.txt文件,它定义了我们计划检测的对象类的名称。这个文件的每一行都代表一个类,应该包含一个单词或多个单词,不带空格。

project
 └──dataset
    ├── class_names.txt
    ├── images
    │   ├── image_1.png
    │   ├── image_2.png
    │   └── image_3.png
    │       ...
    └── labels
        ├── image_1.txt
        ├── image_2.txt
        └── image_3.txt
            ...

标记

不幸的是,YOLO 需要一种特定的标签格式,大多数免费标签工具都不支持这种格式。为了消除从 VOC XML、VGG JSON 或其他广泛使用的格式解析标签的需要,我们将利用 makesense.ai 。这是我在 GitHub 上开发的一个免费开源项目。该编辑器不仅支持直接导出到 YOLO 格式,而且直观,不需要安装,因为它在浏览器中工作。此外,它支持多种功能,旨在加快您的贴标工作。用 MakeSense 看看 AI 支持的标注过程。

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

使用 makesense.ai 的人工智能支持的贴标过程

一旦工作完成,我们可以下载一个.zip,包含.txt文件。每个这样的文件对应于一个单独的标签图像,并描述了照片中可见的对象。如果我们打开其中一个文件,我们会发现,每一行都是class_idx x_center y_center width height格式。其中class_idx代表从class_names.txt文件中分配的标签的索引(从 0 开始计数)。其余参数描述围绕单个对象的边界框。它们可以取 0 到 1 之间的值(相对于图像尺寸)。幸运的是,大多数时候我们不需要考虑这些细节,因为编辑器会为我们处理好一切。YOLO 格式的标签示例如下所示。

4 0.360558 0.439186 0.068327 0.250741
7 0.697519 0.701205 0.078643 0.228243
3 0.198589 0.683692 0.076613 0.263441

环境设置

Y OLO 最初是在一个名为 Darknet 的深度学习小众框架中编写的。从那以后,出现了许多其他实现,其中大部分使用了两个非常流行的 Python 平台——Keras 和 PyTorch。在所有可用的解决方案中,有一个是我特别喜欢的。它提供了一个用于训练和检测的高级 API,但也有丰富的有用功能。使用它时,我们所有的工作都归结为准备一个数据集和创建几个配置文件,然后责任就转移到了库上。

project
 ├── dataset
 └── yolov3

环境设置也很简单,因为它归结为运行几个命令,您可能会在下面找到(假设您已经在您的计算机上安装了 PythonGit )。最好从project目录执行命令,以实现上面所示的结构。值得一提的是,该环境也可以通过 Docker 创建(这对 Windows 用户尤其有用)。你可以在这里找到关于这个主题的更多说明。

# Clone framework
git clone [https://github.com/ultralytics/yolov3.git](https://github.com/ultralytics/yolov3.git)
# Enter framework catalogue [Linux/MacOS]
cd ./yolov3
# Setup Python environment
pip install -U -r requirements.txt

配置

正如我在上一段中提到的,我们现在需要做的就是创建几个配置文件。它们定义了我们的训练和测试集的位置、对象类的名称,并提供了所用神经网络架构的指南。

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

用于标注象棋数据集的参考照片

首先,我们需要将数据集分成训练集和测试集。我们在两个.txt文件的帮助下完成这项工作。它们中的每一个都包含从我们的数据集中指向特定图像的路径。为了加快我们的工作,我准备了一个 Python 脚本,它会自动为我们创建这些文件。您需要做的只是指出数据集的位置,并定义训练集和测试集之间的百分比分割。下面显示了train.txt / test.txt文件的一个片段。

./dataset/images/image_1.png
./dataset/images/image_2.png
./dataset/images/image_3.png
 ...

.data是我们需要提供的最终文件。让我们以我的下一个项目——象棋探测器为例来讨论它的内容。在这种情况下,我有 12 个唯一的对象类需要识别。接下来,我们给出定义哪些照片属于训练集和测试集的文件的位置,最后给出前面讨论的带有标签名称的文件的位置。为了一切正常工作,应将文件chess.datachess_train.txtchess_test.txtchess.names移动到project/yolov3/data目录。

classes=12
train=./data/chess_train.txt
valid=./data/chess_test.txt
names=./data/chess.names

培养

现在我们准备好开始训练了。正如我前面提到的,我们使用的库有一个高级 API,所以终端中的一个命令和几个参数就足以启动这个过程。然而,在这背后,有几件重要的事情正在发生,大大增加了我们获得最终成功的机会。

python3 train.py
   --data ./data/project.data
   --cfg ./cfg/project.cfg
   --weights ./weights/yolov3.pt

首先,我们可以应用迁移学习——我们不必从头开始训练。我们可以使用在不同数据集上训练的模型的权重,这导致我们自己的网络的学习时间更短。我们的模型可以使用基本形状的知识,并专注于将这些信息与我们想要识别的新类型的对象联系起来。其次,该库执行数据扩充,因此它基于我们提供的照片生成新的示例。正因为如此,即使我们只有一个很小的数据集——几百张图片,我们也可以训练我们的模型。我们使用的库也为我们提供了作为增强结果而创建的图像样本。下面你可以看到在我的篮球探测器的训练过程中创建的例子。

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

在训练集上执行的数据扩充的可视化

侦查

终于,快乐的时刻到来了!我们致力于创建模型的工作得到了回报,因为我们现在可以用它在任何照片中找到我们想要的物体。同样,这是一个非常简单的任务,我们可以在终端中用一个简单的命令来完成。执行之后,我们将在输出目录中找到我们预测的结果。值得一提的是,我们还可以对来自网络摄像头的视频进行现场预测,这在我们希望通过展示演示给大家留下深刻印象时特别有用。

python3 detect.py
   --data ./data/project.data
   --cfg ./cfg/project.cfg
   --weights ./weights/best.py
   --source ./data/sample

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

使用 TinyYOLO 的国际象棋检测

结论

如果你设法来到这里,祝贺你。非常感谢你花时间阅读这篇文章。如果你喜欢这篇文章,考虑把它分享给你的朋友,或者两个或五个朋友。我希望我设法证明了训练你自己的定制 YOLO 模型并不困难,并且我的提示将在你未来的实验中有所帮助。

本文是“数据科学工具包”系列的另一部分,如果您还没有机会,请阅读其他文章。此外,如果你喜欢我目前的工作,请在 TwitterMedium 上关注我,并在 GitHubKaggle 上查看我正在进行的其他项目。保持好奇!

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

胸部 CT 扫描 5 分钟机器学习

原文:https://towardsdatascience.com/chest-ct-scan-machine-learning-in-5-minutes-ae7613192fdc?source=collection_archive---------30-----------------------

临床目标、数据表示、任务、模型

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

作者图片

这篇文章提供了胸部 CT 扫描机器学习的概述,由临床目标,数据表示,任务和模型组织。

胸部 CT 扫描是一种灰度三维医学图像,描绘了胸部,包括心脏和肺。CT 扫描用于诊断和监测许多不同的疾病,包括癌症、骨折和感染。

临床目标

临床目标是指作为研究重点的医学异常。下图显示了一些异常情况,显示为通过 CT 容积的 2D 轴向切片:

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

图片作者。子图片来自:毛玻璃放射科助理、肺炎卡尔帕纳班萨尔、结节肺部编年史、蜂窝肺Radiopaedia.org、肺气肿TES.com、肺不张研究门

很多 CT 机器学习的论文都聚焦于肺结节

最近的其他工作关注了肺炎、肺气肿、肺癌、气胸和气胸,前者是肺部感染,后者是肺气肿,前者是吸烟导致的一种肺部损伤,后者是肺癌,后者是气胸。

我一直专注于多种异常预测,其中模型同时预测 83 种不同的异常发现

数据

在机器学习模型中,有几种不同的方法来表示 CT 数据,如下图所示:

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

作者图片

3D 表示包括大约 1000×512×512 像素的整个 CT 体积,以及可以大(例如整个体积的一半或四分之一)或小(例如 32×32×32 像素)的 3D 补片。

2.5D 表示使用不同的垂直平面。

  • 轴面像腰带一样水平,冠状面像头带或旧式耳机一样垂直,矢状面像弓箭手面前的弓箭的平面一样垂直。
  • 如果我们取一个轴向切片、一个矢状切片和一个冠状切片,并将它们堆叠成一个 3 通道图像,那么我们就有一个 2.5D 切片表示。
  • 如果这是用小的小块来完成的,例如 32×32 像素,那么我们有一个 2.5D 的小块表示。

最后,还使用了 2D 表示法。这可以是一个完整的切片(例如 512 x 512),也可以是一个 2D 面片(例如 16 x 16,32 x 32,48 x 48)。这些 2D 切片或贴片通常来自轴向视图。

任务

胸部 CT 机器学习有很多不同的任务。

下图说明了一些任务:

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

图片作者。子图片来自颜等 2018 深度病变江等 2019

二元分类包括给 CT 表现分配 1 或 0,表示异常的存在(1)或不存在(0)。

多级分类用于互斥的类别,如间质性肺病的不同临床亚型。在这种情况下,模型将 0 分配给除 1 类别之外的所有类别。

多标签分类用于非互斥类别,如肺不张(肺组织萎陷)、心脏肥大(心脏增大)和肿块。CT 扫描可能有一些、全部或没有这些发现,并且模型确定存在哪些(如果有的话)。

目标检测包括预测感兴趣的异常周围的边界框的坐标。

分割包括标记每个像素,这在概念上就像“描绘异常的轮廓并给它们着色”

训练这些模型需要不同的标签。需要异常的“存在或不存在”标签来训练分类模型,例如[肺不张=0,心脏肥大= 1,质量= 0]。需要包围盒标签来训练对象检测模型。训练分割模型需要分割掩模(轮廓中跟踪和填充的)。如果这些标签是从自由文本放射学报告中自动提取的(例如,36,316 CT 的 RAD-ChestCT 数据集),则只有“存在或不存在”标签可扩展到数万次 CT 扫描。获得分割掩模是最耗时的,因为它们必须在每个切片上手动绘制;因此,分割研究通常使用 100-1000 次 CT 扫描。

型号

卷积神经网络是在 CT 数据上使用的最流行的机器学习模型。关于 CNN 的 5 分钟介绍,见本文。

  • 3D CNNs 用于整个 CT 体积或 3D 补片
  • 2D CNN 用于 2.5D 表示(3 个通道,轴向/冠状/矢状),与 2D CNN 可以将 3 通道 RGB 图像作为输入(3 个通道,红/绿/蓝)的方式相同。
  • 2D CNN 用于 2D 切片或 2D 补丁。

一些 CNN 结合了 2D 和 3D 卷积。CNN 也可以被“预训练”,这通常是指首先在像 ImageNet 这样的自然图像数据集上训练 CNN,然后在 CT 数据上精炼 CNN 的权重。

这里是一个架构示例,其中预训练的 2D CNN (ResNet18)应用于 3 个相邻切片的组,然后进行 3D 卷积:

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

作者图片

间质性肺病分类举例

下表包括几个关注间质性肺病的研究实例,按临床目标、数据、任务和模型组织。

  • 临床目标:这些论文都集中在间质性肺病。不同的研究使用的确切类别不同。一些研究侧重于临床分组,如特发性肺纤维化或特发性非特异性间质性肺炎(如王等人 2019 年和沃尔什等人 2018 年)。其他研究侧重于网状或蜂窝状等肺部模式(如 Anthimopoulos 等人 2016 年和高等人 2016 年)。
  • 数据:数据集由 100–1,200 个 CT 组成,因为所有这些研究都依赖于片、切片或像素的手动标记,这非常耗时。进行碎片、切片或像素级分类的好处在于,除了诊断信息之外,它还提供了定位信息。
  • 任务:任务大多是多类分类,其中每个片或片被分配给多个可能的类中的一个类。
  • 模型:一些研究使用定制的 CNN 架构,等人 2019 和高等人 2018,而其他研究采用现有的 CNN 架构,如 ResNetAlexNet

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

补充阅读

原载于 2020 年 8 月 4 日 http://glassboxmedicine.com**T21

基于卷积神经网络的胸部 X 线肺炎检测

原文:https://towardsdatascience.com/chest-x-rays-pneumonia-detection-using-convolutional-neural-network-63d6ec2d1dee?source=collection_archive---------13-----------------------

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

面向初学者的基本 Tensorflow 和 Keras 实现

对于初学者来说,卷积神经网络(CNN)可能看起来有些吓人。然而,该项目将概述如何使用 Tensorflow 和 Keras 从头构建一个模型来检测肺炎。

迷你项目的内容如下:

  • 模型结构
  • 模特培训
  • 模型评估
  • 最终模型预测

什么是肺炎?

肺炎是一种由病毒或细菌感染引起的肺部炎症,病情从轻微到严重不等。这种炎症使患者无法呼吸足够的氧气进入血液。当感染使肺部的气囊(肺泡)充满液体或脓液,可能影响一侧或两侧肺部时,就会发生这种情况。如果你的医生认为你可能患有肺炎,将进行胸部 x 光检查,以发现患者肺部的感染及其扩散程度。

资料组

该实验利用了来自 Kaggle 知识库的名为胸部 x 光图像(肺炎)的数据。点击查看数据集。数据集由正常肺和肺炎肺两类组成,如下图所示。

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

履行

在我们开始构建卷积神经网络之前,以下是必要的库和依赖项。

模型开发

所以让我们直接进入代码。我们将要开发的模型由几个部分组成,它们是:

  • tf.keras.layers.Conv2D() :卷积层,通过隔离图像特征来提高图像识别
  • TF . keras . layers . maxpooling2d():减少图像中的信息同时保持特征的层
  • TF . keras . layers . flatten():将结果展平为一维数组
  • TF . keras . layers . dense():添加密集连接层

将构建一个五层卷积网络,其中 Conv2D()和 MaxPooling2D()作为一层堆叠在一起。然后,最终卷积层的输出将变平,并适合完全连接的神经元。

此外,在模型适合训练之前,有必要按如下方式配置规格:

  • **丢失:**肺炎检测在最后一步使用乙状结肠激活,其结果为 0 或 1(正常或肺炎)。因此,二元交叉熵是最合适的损失函数
  • 优化器:将使用学习率为 0.001 的 RMSprop (均方根传播)
  • 度量:准确度是获得每个历元上的预测准确度的测量度量

下面是 model.summary() 的输出。

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

我们建立的模型概述如下:

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

作者插图

模特培训

在模型适合训练之前,我们将设置数据生成器从源文件夹中读取图像,而不是逐个标记图像。在基本概念中,imagedata generator根据图像所在的目录对图像进行标注。这个生成器指向数据的子目录。下面的代码可以描述如下:

  • 通过使用重新缩放参数,执行灰度归一化,以便 CNN 更快收敛。标准化将图像像素从[0…255]转换为[0…1]
  • 创建两个生成器,即 train_generatoreval_generator 。其中 train_generator 指向训练数据的子目录,eval_generator 指向评估数据的子目录
  • 然后,将模型训练 10 个时期,每个时期 10 步

此外,以下是在训练和验证数据集之间的模型训练之后的 10 个时期内的模型准确度和损失率的分析:

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

模型评估

一旦模型被完全训练,测试数据集将被用于确保最终模型的无偏预测。此模型评估步骤对于衡量训练模型预测未知数据的能力非常有用。

训练后的模型准确率达到 81.25%,如下图所示:

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

最终预测

现在模型已经准备好进行预测,下面的代码允许用户输入一个图像来确定 x 光图像是否被诊断为肺炎。完整的代码可以在 GitHub 上找到。

输出:

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

结论

在开发用于肺炎预测的 CNN 模型的整个过程中,我们从零开始建立了一个模型,该模型由 5 层组成,随后是一个完全连接的神经网络。然后,使用单独的看不见的数据来评估训练的模型,以避免偏差预测。结果,测试数据集的准确率达到 81.25%,表明该模型是不错的。这个迷你项目允许初学者获得如何建立一个模型来解决现实世界问题的概述。

毫无疑问,通过执行数据扩充或实施迁移学习概念,可以更好地改进预测模型,从而为模型提供改进空间。因此,这将被添加到未来的故事中作为进一步的增强。

参考

** [## 胸部 x 光图像(肺炎)

5,863 张图片,2 个类别

www.kaggle.com](https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia) [## Keras 文档:图像数据预处理

从目录中的图像文件生成 tf.data.Dataset。如果您的目录结构是:然后调用…

keras.io](https://keras.io/api/preprocessing/image/) [## 深度学习用于从 X 射线图像中检测肺炎

从 X 射线图像中自动检测肺炎

towardsdatascience.com](/deep-learning-for-detecting-pneumonia-from-x-ray-images-fc9a3d9fdba8)**

Python 中独立性的卡方检验以及 IBM HR 分析数据集的示例

原文:https://towardsdatascience.com/chi-square-test-for-independence-in-python-with-examples-from-the-ibm-hr-analytics-dataset-97b9ec9bb80a?source=collection_archive---------5-----------------------

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

活动发起人Unsplash 上的照片

假设您正在研究一个数据集,并且想要检查两个分类变量是否相互依赖。

动机可能是更好地理解结果变量和预测因子之间的关系,识别相关预测因子等。

在这种情况下,卡方检验可以成为有效的统计工具。

在这篇文章中,我将讨论如何用 Python(从头开始和使用 SciPy)进行这个测试,并用一个流行的 HR 分析数据集 IBM 员工流失和绩效数据集——做例子。

古玩目录

  1. 什么是卡方检验?
  2. 我们要检验的分类变量是什么?
  3. 如何从头开始进行这项测试?
  4. 这样做有捷径吗?
  5. 我们还能做什么?
  6. 有哪些局限性?

概观

卡方检验是一种统计假设检验,用于检验统计量在零假设下的卡方分布,特别是独立性卡方检验通常用于检验两个分类变量之间的独立性【1】。

与该测试相关的关键假设是:1 .从人群中随机抽取的样本。2.在任何变量中,每个主题不能属于一个以上的组。

为了更好地说明这个测试,我选择了来自 Kaggle ( 链接)的 IBM HR 数据集,其中包括一个关于减员、工作满意度、绩效等员工 HR 信息的样本。人们经常用它来揭示员工流失和其他因素之间的关系。

注意,这是由 IBM 数据科学家创建的虚构数据集[2]。

要查看完整的 Python 代码,请查看我的 Kaggle 内核

事不宜迟,让我们进入细节!

探测

让我们首先检查雇员的数量和属性的数量:

data.shape
--------------------------------------------------------------------
(1470, 35)

员工 1470 人,属性 35 个。

接下来,我们可以检查这些属性是什么,并查看是否有任何与它们相关联的缺失值:

data.isna().any()
--------------------------------------------------------------------
Age                         False
Attrition                   False
BusinessTravel              False
DailyRate                   False
Department                  False
DistanceFromHome            False
Education                   False
EducationField              False
EmployeeCount               False
EmployeeNumber              False
EnvironmentSatisfaction     False
Gender                      False
HourlyRate                  False
JobInvolvement              False
JobLevel                    False
JobRole                     False
JobSatisfaction             False
MaritalStatus               False
MonthlyIncome               False
MonthlyRate                 False
NumCompaniesWorked          False
Over18                      False
OverTime                    False
PercentSalaryHike           False
PerformanceRating           False
RelationshipSatisfaction    False
StandardHours               False
StockOptionLevel            False
TotalWorkingYears           False
TrainingTimesLastYear       False
WorkLifeBalance             False
YearsAtCompany              False
YearsInCurrentRole          False
YearsSinceLastPromotion     False
YearsWithCurrManager        False
dtype: bool

识别分类变量

假设我们想检验“流失”和“工作满意度”之间是否有关系。

两类“损耗”的计数:

data['Attrition'].value_counts()
--------------------------------------------------------------------
No     1233
Yes     237
Name: Attrition, dtype: int64

按频率排序的四类“工作满意度”的计数:

data['JobSatisfaction'].value_counts()
--------------------------------------------------------------------
4    459
3    442
1    289
2    280
Name: JobSatisfaction, dtype: int64

请注意,对于“工作满意度”,1 表示“低”,2 表示“中”,3 表示“高”,4 表示“非常高”。

原假设和替代假设

对于我们这里的独立性卡方检验,零假设是在‘流失’和‘工作满意度’之间没有显著的关系。

另一个假设是,在“流失”和“工作满意度”之间有显著的关系。

列联表

为了计算卡方检验统计量,我们需要构建一个列联表。

我们可以使用 pandas 的“交叉表”功能来实现:

pd.crosstab(data.Attrition, data.JobSatisfaction, margins=True)

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

表中的数字代表频率。例如,“工作满意度”中的“2”和“流失”中的“是”都显示为“46 ”,这意味着在 1470 名员工中,有 46 名员工将他们的工作满意度评为“中等”,他们确实离开了公司。

卡方统计

卡方统计量(X)的计算公式如下所示:

X =总和[(观察值-预期值)/预期值]

术语’观察到的是指我们在列联表中看到的数字,术语’期望的是指零假设为真时的期望数字。

在零假设下,“流失”和“工作满意度”之间没有显著的关系,这意味着流失的百分比在工作满意度的四个类别中应该是一致的。例如,“4”和“流失”的预期频率应该是将工作满意度评为“非常高”的员工人数*(总流失/员工总数),即 459*237/1470,或大约 74。

让我们计算所有预期的数字,并将它们存储在一个名为“exp”的列表中:

row_sum = ct.iloc[0:2,4].values
exp = []
for j in range(2):
    for val in ct.iloc[2,0:4].values:
        exp.append(val * row_sum[j] / ct.loc['All', 'All'])
print(exp)
--------------------------------------------------------------------
[242.4061224489796,
 234.85714285714286,
 370.7387755102041,
 384.99795918367346,
 46.593877551020405,
 45.142857142857146,
 71.26122448979592,
 74.00204081632653]

注意最后一项(74)验证了我们的计算是正确的。

现在我们可以计算 X:

((obs - exp)**2/exp).sum()
--------------------------------------------------------------------
17.505077010348

自由度

除了 X 之外,我们还需要一个参数,即自由度,其计算方法为(第一个变量中的类别数-1)(第二个变量中的类别数-1),在本例中为(2–1)(4–1),即 3。

(len(row_sum)-1)*(len(ct.iloc[2,0:4].values)-1)
--------------------------------------------------------------------
3

释义

对于 X 和自由度,我们可以使用卡方表/计算器来确定其对应的 p 值,并在给定 alpha 的指定显著性水平的情况下,推断是否存在显著关系。

换句话说,给定自由度,我们知道在零假设下,“观察到的”应该接近“预期的”,这意味着 X 应该相当小。当 X 大于某个阈值时,我们知道 p 值(假设存在零假设,则出现如此大的 X 的概率)极低,我们会拒绝零假设。

在 Python 中,我们可以如下计算 p 值:

1 - stats.chi2.cdf(chi_sq_stats, dof)
--------------------------------------------------------------------
0.000556300451038716

假设显著性水平为 0.05。我们可以得出结论,在“流失”和“工作满意度”之间有着重要的关系。

使用 SciPy

在 Python 中有一个执行这个测试的捷径,它利用了 SciPy 库(文档)。

obs = np.array([ct.iloc[0][0:4].values,
                  ct.iloc[1][0:4].values])
stats.chi2_contingency(obs)[0:3]
--------------------------------------------------------------------
(17.505077010348, 0.0005563004510387556, 3)

请注意,这三个术语分别是 X 统计量、p 值和自由度。这些结果与我们之前手工计算的结果一致。

‘减员’和‘教育’

员工是否离职与工作满意度有关,这多少有些直观。现在让我们看另一个例子,在这个例子中,我们检验“流失”和“教育”之间是否有显著的关系:

ct = pd.crosstab(data.Attrition, data.Education, margins=True)
obs = np.array([ct.iloc[0][0:5].values,
                  ct.iloc[1][0:5].values])
stats.chi2_contingency(obs)[0:3]
--------------------------------------------------------------------
(3.0739613982367193, 0.5455253376565949, 4)

p 值超过 0.5,因此在 0.05 的显著性水平上,我们无法拒绝“流失”和“教育”之间没有关系。

按部门分解分析

我们还可以检查是否存在按部门细分的重要关系。例如,我们知道“自然减员”和“工作生活平衡”之间有很大的关系,但我们想检验这是否与部门无关。首先,让我们看看有哪些部门以及每个部门的员工人数:

data['Department'].value_counts()
--------------------------------------------------------------------
Research & Development    961
Sales                     446
Human Resources            63
Name: Department, dtype: int64

为了确保卡方检验有足够的样本,我们在分析中将只关注 R&D 和销售。

alpha = 0.05
for i in dep_counts.index[0:2]:
    sub_data = data[data.Department == i]
    ct = pd.crosstab(sub_data.Attrition, sub_data.WorkLifeBalance, margins=True)
    obs = np.array([ct.iloc[0][0:4].values,ct.iloc[1][0:4].values])
    print("For " + i + ": ")
    print(ct)
    print('With an alpha value of {}:'.format(alpha))
    if stats.chi2_contingency(obs)[1] <= alpha:
        print("Dependent relationship between Attrition and Work Life Balance")
    else:
        print("Independent relationship between Attrition and Work Life Balance")
    print("")
--------------------------------------------------------------------
For Research & Development: 
WorkLifeBalance   1    2    3   4  All
Attrition                             
No               41  203  507  77  828
Yes              19   32   68  14  133
All              60  235  575  91  961
With an alpha value of 0.05:
Dependent relationship between Attrition and Work Life Balance

For Sales: 
WorkLifeBalance   1    2    3   4  All
Attrition                             
No               10   78  226  40  354
Yes               6   24   50  12   92
All              16  102  276  52  446
With an alpha value of 0.05:
Independent relationship between Attrition and Work Life Balance

从这些输出中,我们可以看到在 R&D 部门中有一个重要的关系,但在销售部门中没有。

警告和限制

进行此分析时有一些注意事项,以及此测试的一些限制:

  1. 为了得出有意义的结论,每个场景中的样本数量需要足够大,但现实中可能并非如此。
  2. 重要的关系并不意味着而不是意味着因果关系。
  3. 卡方检验本身并不能提供除“显著关系与否”之外的额外见解。例如,测试没有告知随着工作满意度的增加,离开公司的员工比例趋于减少。

摘要

让我们快速回顾一下。

我们对独立性进行了卡方检验,以检查 IBM HR 分析数据集中变量之间的关系。我们讨论了用 Python 实现这一点的两种方法,一种是从头开始,另一种是使用 SciPy。最后,我们表明,当一个重要的关系存在,我们也可以分层,并检查它是否是真实的每一个水平。

我希望你喜欢这篇博文,并请分享你的想法:)

查看我的另一篇关于通过 Streamlit 和 PyTorch 构建图像分类的文章:

[## 使用 PyTorch 和 Streamlit 创建影像分类 Web 应用程序

用 50 行代码搭建一个简单的图像分类 app!

towardsdatascience.com](/create-an-image-classification-web-app-using-pytorch-and-streamlit-f043ddf00c24)

参考

[1]https://en.wikipedia.org/wiki/Chi-squared_test
【2】https://www . ka ggle . com/pavansubhasht/IBM-HR-analytics-attraction-dataset

手工卡方独立性检验

原文:https://towardsdatascience.com/chi-square-test-of-independence-by-hand-e87c0d36e7cd?source=collection_archive---------11-----------------------

或者如何测试两个定性变量之间的关联

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

戴维·潘宁顿的照片

介绍

C 独立性的卡方检验检验两个定性变量是否独立,即两个分类变量之间是否存在关系。换句话说,该测试用于确定两个定性变量之一的值是否依赖于另一个定性变量的值。

如果测试显示两个变量之间没有关联(即变量是独立的),这意味着知道一个变量的值不会给出另一个变量的值的信息。相反,如果测试显示变量之间的关系(即变量是相关的),这意味着知道一个变量的值就提供了关于另一个变量的值的信息。

本文重点介绍如何手工执行独立性的卡方检验,以及如何用一个具体的例子来解释结果。要了解如何在 R 中进行这个测试,请阅读文章“R 中独立性的卡方测试”。

假设

独立性的卡方检验是一种假设检验,因此它有一个零假设(H0)和一个替代假设(H1):

  • H0:变量是独立的,两个分类变量之间没有关系。知道一个变量的值无助于预测另一个变量的值
  • H1:变量是相关的,两个分类变量之间有关系。知道一个变量的值有助于预测另一个变量的值

测试是如何进行的?

独立性卡方检验的工作原理是,如果两个分类变量之间没有关系,则将观察到的频率(即样本中观察到的频率)与预期频率(即零假设为真时的预期频率)进行比较。

如果观察频率和预期频率之间的差异很小,我们不能拒绝独立性的零假设,因此我们不能拒绝两个变量不相关的事实。另一方面,如果观察频率和预期频率之间的差异很大,我们可以拒绝独立性的零假设,因此我们可以得出两个变量相关的结论

小差异和大差异之间的阈值是来自卡方分布的值(因此称为测试)。该值称为临界值,取决于显著性水平α(通常设置为等于 5%)和自由度。这个临界值可以在卡方分布的统计表中找到。关于这个临界值和自由度的更多信息将在本文后面介绍。

例子

以我们的例子为例,我们想确定吸烟和成为职业运动员之间是否有统计学上的显著联系。吸烟只能是“是”或“不是”,做职业运动员只能是“是”或“不是”。感兴趣的两个变量是定性变量,因此我们需要使用独立性的卡方检验,并且已经收集了 28 个人的数据。

注意,为了简单起见,我们选择了二元变量(二元变量=具有两个水平的定性变量),但是独立性的卡方检验也可以在具有两个以上水平的定性变量上进行。例如,如果变量吸烟有三个水平:(I)不吸烟者,(ii)中度吸烟者和(iii)重度吸烟者,测试的步骤和结果的解释与两个水平的测试相似。

观察到的频率

我们的数据汇总在下表中,报告了每个亚组的人数、按行、按列的总数以及总计:

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

预期频率

请记住,对于独立性的卡方检验,我们需要确定如果两个变量之间没有关联,观察到的计数是否与我们预期的计数显著不同。我们有观察到的计数(见上表),所以我们现在需要计算变量独立情况下的预期计数。使用以下公式逐一计算每个子组的这些预期频率:

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

obs 在哪?符合观察结果。给定我们上面的观察频率表,下面是为每个亚组计算的预期频率表:

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

请注意,只有当所有组中的预期频率等于或大于 5 时,才应进行独立性卡方检验。我们的例子满足了这个假设,因为预期频率的最小数量是 5。

检验统计量

我们有观察到的和预期的频率。我们现在需要比较这些频率,以确定它们是否有显著差异。观察频率和预期频率之间的差异称为检验统计量(或 t-stat ),用χ2 表示,计算如下:

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

其中 O 代表观察频率,E 代表预期频率。我们使用观察频率和预期频率之间的差值的平方来确保负差值不会被正差值所补偿。该公式看起来比实际更复杂,所以让我们用例子来说明它。我们首先根据以下公式逐一计算每个子组中的差异:

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

然后我们将它们相加,得到检验统计量:

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

临界值

单独的检验统计不足以得出两个变量之间的独立性或依赖性的结论。如前所述,这个测试统计量(在某种意义上是观察到的频率和预期的频率之间的差异)必须与临界值进行比较,以确定差异是大还是小。如果不从临界值的角度来看,就无法判断一个检验统计量是大还是小。

如果测试统计值高于临界值,这意味着观察到观察频率和预期频率之间的差异的可能性不大。另一方面,如果检验统计低于临界值,则意味着观察到这种差异的概率是可能的。如果有可能观察到这种差异,我们不能拒绝这两个变量是独立的假设,否则我们可以得出结论,变量之间存在关系。

临界值可在卡方分布的统计表中找到,并取决于显著性水平(表示为αα)和自由度(表示为 dfdf)。显著性水平通常设置为等于 5%。独立性卡方检验的自由度如下:

df =(行数 1) ⋅(列数 1)

在我们的例子中,自由度因此是 df =(21)⋅(21)= 1,因为列联表中有两行和两列(总数不作为一行或一列计算)。

我们现在有了在卡方表中找到临界值的所有必要信息(α = 0.05,df = 1)。为了找到临界值,我们需要看看下图中 df = 1 的行和χ^2_0.050(因为α = 0.05)的列。临界值是 3.84146。 1

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

卡方表——α= 5%和 df = 1 时的临界值

结论和解释

既然我们已经有了检验统计量和临界值,我们可以比较它们来检查变量独立性的零假设是否被拒绝。在我们的例子中,

测试统计= 15.56 >临界值= 3.84146

像任何统计检验一样,当检验统计量大于临界值时,我们可以在指定的显著性水平上拒绝零假设。

在我们的案例中,我们因此可以在 5%的显著性水平上拒绝两个分类变量之间独立性的零假设。

这意味着吸烟习惯与是否是运动员之间有很大关系。知道一个变量的值有助于预测另一个变量的值。

感谢阅读。我希望这篇文章能帮助您手工执行独立性卡方检验并解释其结果。如果你想了解如何在 R 中做这个测试,请阅读文章“R 中独立性的卡方测试”。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

相关文章:

原载于 2020 年 1 月 27 日 https://statsandr.com

R 中独立性的卡方检验

原文:https://towardsdatascience.com/chi-square-test-of-independence-in-r-c109947ca73a?source=collection_archive---------15-----------------------

如何检验两个定性变量之间的独立性

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

乔治·托马塞蒂拍摄的照片

介绍

他的文章解释了如何在 R 中进行独立性卡方检验,以及如何解释其结果。要了解更多关于测试如何工作以及如何手工操作的信息,我邀请您阅读文章“手工卡方独立性测试”。

简要回顾一下那篇文章中所说的内容,卡方独立性检验测试两个分类变量之间是否存在关系。无效假设和替代假设是:

  • H0:变量是独立的,两个分类变量之间没有关系。知道一个变量的值无助于预测另一个变量的值
  • H1:变量是相关的,两个分类变量之间有关系。知道一个变量的值有助于预测另一个变量的值

独立性卡方检验的工作原理是,如果两个分类变量之间没有关系,则将观察到的频率(即样本中观察到的频率)与预期频率(即零假设为真时的预期频率)进行比较。

数据

对于我们的示例,让我们重用文章“R中的描述性统计”中介绍的数据集。这个数据集是众所周知的稍微增强的iris数据集。因为只有一个分类变量,而卡方检验需要两个分类变量,所以我们添加变量size,如果花瓣的长度小于所有花的中值,则对应于small,否则对应于big:

dat <- irisdat$size <- ifelse(dat$Sepal.Length < median(dat$Sepal.Length),
  "small", "big"
)

我们现在用table()函数创建两个变量Speciessize列联表:

table(dat$Species, dat$size)##             
##              big small
##   setosa       1    49
##   versicolor  29    21
##   virginica   47     3

列联表给出了每个亚组中观察到的病例数。例如,只有一朵大刚毛藻花,而数据集中有 49 朵小刚毛藻花。

绘制一个条形图来直观地表示数据也是一个很好的做法:

library(ggplot2)ggplot(dat) +
  aes(x = Species, fill = size) +
  geom_bar() +
  scale_fill_hue() +
  theme_minimal()

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

如果您更喜欢用比例来形象化它(因此所有条形的高度都是 1 或 100%):

ggplot(dat) +
  aes(x = Species, fill = size) +
  geom_bar(position = "fill")

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

如果在 x 轴上绘制的变量的每个级别中有不同数量的观察值,则第二个条形图特别有用,因为它允许在相同的基础上比较两个变量。

参见文章“R 中的Graphics with gg plot 2”了解如何在{ggplot2}中创建这种条形图。

R 中独立性的卡方检验

对于这个例子,我们将在 R 中测试变量Speciessize之间是否有关系。为此,使用chisq.test()功能:

test <- chisq.test(table(dat$Species, dat$size))
test## 
##  Pearson's Chi-squared test
## 
## data:  table(dat$Species, dat$size)
## X-squared = 86.035, df = 2, p-value < 2.2e-16

您需要的一切都会出现在这个输出中:

  • 测试的标题,
  • 使用了哪些变量,
  • 测试统计,
  • 自由度和
  • 测试的 p 值。

您还可以使用以下方法检索χ2 检验统计和 p 值:

test$statistic # test statistic## X-squared 
##  86.03451test$p.value # p-value## [1] 2.078944e-19

如果你需要找到期望的频率,使用test$expected

如果出现诸如“卡方近似可能不正确”的警告,这意味着最小预期频率低于 5。要避免此问题,您可以:

  • 收集一些水平(尤其是那些具有少量观察值的水平)以增加子组中的观察值,或者
  • 使用费希尔精确检验

费希尔的精确检验不需要假设最少 5 个预期计数。由于功能fisher.test(),它可以在 R 中应用。该检验在假设和结果解释方面类似于卡方检验。在专门讨论这种测试的文章中了解更多关于这种测试的信息。

供您参考,还有另外三种方法来执行 R 中独立性的卡方检验:

  1. 具有summary()功能
  2. 使用{vcd}包中的assocstats()功能
  3. 使用{summarytools}包中的ctable()功能
# second method:
summary(table(dat$Species, dat$size))## Number of cases in table: 150 
## Number of factors: 2 
## Test for independence of all factors:
##  Chisq = 86.03, df = 2, p-value = 2.079e-19# third method:
library(vcd)
assocstats(table(dat$Species, dat$size))##                      X^2 df P(> X^2)
## Likelihood Ratio 107.308  2        0
## Pearson           86.035  2        0
## 
## Phi-Coefficient   : NA 
## Contingency Coeff.: 0.604 
## Cramer's V        : 0.757library(summarytools)
library(dplyr)

# fourth method:
dat %$%
  ctable(Species, size,
    prop = "r", chisq = TRUE, headings = FALSE
  ) %>%
  print(
    method = "render",
    style = "rmarkdown",
    footnote = NA
  )

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

如你所见,所有四种方法给出了相同的结果。

如果不同方法的数据没有相同的p-值,请确保在chisq.test()函数中添加correct = FALSE参数,以防止应用 Yate 的连续性校正,该校正在此方法中默认应用。 1

结论和解释

从输出和test$p.value我们看到 p 值小于 5%的显著性水平。像任何其他统计检验一样,如果 p 值小于显著性水平,我们可以拒绝零假设。

在我们的上下文中,拒绝独立性卡方检验的零假设意味着物种和大小之间存在显著的关系。因此,知道一个变量的值有助于预测另一个变量的值。

绘图和统计检验相结合

我最近从{vcd}包中发现了mosaic()功能。该函数的优势在于它结合了镶嵌图(可视化列联表)和独立性卡方检验的结果:

library(vcd)mosaic(~ Species + size,
       direction = c("v", "h"),
       data = dat,
       shade = TRUE)

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

如您所见,镶嵌图类似于上面的柱状图,但是卡方检验的 p 值也显示在右下角。

此外,如果变量是独立的,这个彩色镶嵌图显示了观察频率与预期频率的偏差。红色情况表示观察频率比预期频率小,而蓝色情况表示观察频率比预期频率大。

另一种选择是{ggstatsplot}封装中的ggbarstats()功能:

# load packages
library(ggstatsplot)
library(ggplot2)# plot
ggbarstats(
  data = dat,
  x = size,
  y = Species
) +
  labs(caption = NULL) # remove caption

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

从剧情来看,似乎大花更有可能属于virginica种,小花更倾向于属于setosa种。因此,预计物种和大小是相互依赖的。

这一点得到了图表副标题中显示的统计结果的证实。有几个结果,但在这种情况下,我们可以关注显示在p =之后的 p 值。

和前面的测试一样,我们拒绝零假设,我们得出结论,物种和大小是相关的(p 值< 0.001)。

感谢阅读。我希望这篇文章有助于您执行 R 中独立性的卡方检验并解释其结果。如果你想了解如何手工做这个测试以及它是如何工作的,请阅读文章“手工卡方独立性测试”。

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

  1. 感谢 Herivelto 指出这一点。 ↩︎

相关文章:

原载于 2020 年 1 月 27 日 https://statsandr.com

特征选择的卡方检验及其 Python 实现

原文:https://towardsdatascience.com/chi-squared-test-for-feature-selection-with-implementation-in-python-65b4ae7696db?source=collection_archive---------5-----------------------

一个统计测试,用于识别两个变量之间的关联/关系及其在 Python 中的实现。

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

图片提供:全菲尼克斯,[Pinterest 邮报]。于 2020 年 2 月 13 日从 https://in.pinterest.com/pin/641059328193274870/检索

简介:

机器学习中有各种技术来确定我们的输入特征是否与要预测的结果相关。我们可以使用这些技术找出并删除对模型结果没有贡献的不重要的特性。在某种程度上,我们只选择那些真正重要的特征,因此这些技术被称为特征选择方法。卡方检验可用于特征选择。让我们深入细节。

特征选择方法:

确定特征重要性的方法有很多,主要分为两组:

  1. 过滤器特征选择方法
  2. 包装器特征选择方法

我们将只看到第一个,因为我们的卡方检验属于这一类。

简而言之,滤波器特征选择方法是那些使用一些统计技术(如卡方检验)考虑输入和目标变量的数据类型来评估它们之间关系的方法。

有许多其他的统计测量可用于基于过滤器的特征选择。因此,统计测量的选择高度依赖于特征和目标变量数据类型。

数据类型可以是数字的,也可以是分类的。

何时使用卡方检验:

当要测试的特征的数据类型和目标变量都是分类的(即我们有一个分类问题)时,我们可以使用卡方检验。

卡方检验解释道:

皮尔逊卡方检验,或简称卡方检验,是以数学家 卡尔·皮尔逊 **命名的。它也被称为“拟合优度”**统计量。

让我们看看如何进行这个测试,以及 8 个简单步骤中的一个例子。

例如,让我们考虑一个只有两列的非常简单的数据集。我们将发现性别是否与对运动的兴趣相关/依赖/联系在一起。

╔════════╦══════════╗
║ Gender ║ Interest ║
╠════════╬══════════╣
║ Male   ║ Cricket  ║
║ Female ║ Tennis   ║
║ Male   ║ Cricket  ║
║ Male   ║ Football ║
║ ....   ║ ....     ║
╚════════╩══════════╝

步骤 1:定义假设

假设检验是一种统计方法,它评估两个陈述(假设)并确定哪个陈述是正确的。在假设检验中,最初的陈述被称为零假设,表示为 H0 ,通常与第一个陈述互补的第二个陈述被称为替代假设,表示为 H1。

对于我们的例子,假设是:
H0: 特征性别兴趣独立(也就是说它们没有关联)。
H1: 性别兴趣不是独立的(也就是说它们是关联的)。

第二步:选择一个重要级别

基本上,由α (alpha)表示的显著性水平是我们希望对我们的结果有多确定的度量。

或者简单地说,显著性水平用于确定是否应该拒绝零假设。对于要拒绝的零假设,p 值**(稍后解释)应小于显著性水平。

较低的α值通常是优选的,可以在 0.01 至 0.10 的范围内。

我们选择 α = 0.05

步骤 3:创建列联表

以行和列显示一个变量和另一个变量的频率分布的表格,用于研究两个变量之间的相关性,称为列联表(也称为交叉制表或交叉表)。看到下表后你会更清楚:

*╔══════════════╦═════════╦══════════╦════════╦═══════════╗
║              ║ Cricket ║ Football ║ Tennis ║ Row Total ║
╠══════════════╬═════════╬══════════╬════════╬═══════════╣
║ Male         ║      20 ║       30 ║     15 ║        65 ║
║ Female       ║      20 ║       15 ║     30 ║        65 ║
║ Column Total ║      40 ║       45 ║     45 ║       130 ║
╚══════════════╩═════════╩══════════╩════════╩═══════════╝*

我们可以看到,在数据集中的 130 名候选人中,分别有 20 名、30 名和 15 名男性对板球、足球和网球感兴趣。同样,分别有 20、15 和 30 名女性对板球、足球和网球感兴趣。

表中的值称为观察值。

步骤 4:计算预期频率

我们计算每个单元的预期频率计数。计算预期频率的公式为:

*E = (row total * column total)/grand total*

第一个细胞(即雄性蟋蟀)的预期频率为:

*E₁ = (65 * 40)/130 = **20***

我们计算其余单元的预期频率,并得到下表,其中括号 ‘[]’ 中的值表示预期频率:

*╔══════════════╦═════════╦════════════╦═══════════╦═══════════╗
║              ║ Cricket ║  Football  ║  Tennis   ║ Row Total ║
╠══════════════╬═════════╬════════════╬═══════════╬═══════════╣
║ Male         ║ 20 [20] ║  30 [22.5] ║ 15 [22.5] ║        65 ║
║ Female       ║ 20 [20] ║  15 [22.5] ║ 30 [22.5] ║        65 ║
║ Column Total ║ 40      ║ 45         ║ 45        ║       130 ║
╚══════════════╩═════════╩════════════╩═══════════╩═══════════╝*

步骤 5:计算卡方值或卡方统计

计算卡方值或χ的公式为:

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

其中χ不是我们所知道的英语 aphabet 而是第 22 个希腊字母 Chi
如图所示,χ是所有小区的观测频率和预期频率之间的平方差除以预期频率的总和。计算结果如下所示:

***Χ² = ((20-20)^2/20) + ((30-22.5)^2/22.5) + ((15-22.5)^2/22.5) + ((20-20)^2/20) + ((15-22.5)^2/22.5) + ((30-22.5)^2/22.5)****Χ² = 0 + 2.5 + 2.5 + 0 + 2.5 + 2.5****Χ² = 10***

步骤 6:计算自由度

自由度可以计算如下:

*df = (total_rows - 1) * (total_cols - 1)*

列联表中有 2 行3 列,因此我们的自由度是 2。

第七步:寻找 p 值

我们可以看到像这样的卡方分布表,这个使用卡方和自由度值找到 p 值。

如果您打开了到表的链接,选择左边的自由度值(2),沿着它的行找到最接近卡方值(10)的数字,然后检查第一行中的相应数字,得到 p 值 0.005

也有一些网站像这个一样为你计算 p 值。
这里我们得到的 p 值为. 0067,我们可以使用其中任何一个,让我们继续使用从表中得到的那个。

步骤 8: 决定是拒绝还是保留我们的零假设

简而言之,如果我们的 p 值小于显著性值,我们拒绝零假设,如果我们的 p 值大于显著性值,我们不拒绝它

由于 0.005 小于我们的显著性值 0.05,我们拒绝零假设,这意味着性别和感兴趣的运动之间存在关联。

用 python 实现

*# required imports
from scipy.stats import chi2_contingency# we create contingency table same as above
table = [[20, 30, 15], [20,  15,  30]]# Get chi-square value , p-value, degrees of freedom, expected frequencies using the function **chi2_contingency**
stat, p, dof, expected = chi2_contingency(table)# select significance value
alpha = 0.05# Determine whether to reject or keep your null hypothesis
print('significance=%.3f, p=%.3f' % (alpha, p))
if p <= alpha:
    print('Variables are associated (reject H0)')
else:
    print('Variables are not associated(fail to reject H0)')*

为了简单起见,我创建了一个列联表。要从数据帧列中创建列联表,可以使用 pandas 中的交叉表函数。

摘要

我们已经看到了如何进行卡方检验来检查两个分类变量之间是否存在某种关系。

用很少几行代码我们就可以使用 Python 的 scipy 库实现这个测试。

希望你喜欢。建议总是受欢迎的。

参考资料:

* [## 机器学习的卡方检验简介

应用机器学习中的一个常见问题是确定输入特征是否与输出相关

machinelearningmastery.com](https://machinelearningmastery.com/chi-squared-test-for-machine-learning/) [## 卡方检验

术语“卡方检验”,也写作,指的是某些类型的统计假设检验是有效的…

en.wikipedia.org](https://en.wikipedia.org/wiki/Chi-squared_test)*

时尚外观,带 Chiclet 切片器的 Power BI

原文:https://towardsdatascience.com/chic-look-in-power-bi-with-chiclet-slicer-ad726af94a14?source=collection_archive---------30-----------------------

使用新的切片选项增强您的功耗 BI 报告

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

Cottonbro 在 Pexels.com 拍摄的照片

在 Power BI 报告创建中使用自定义视觉效果,为您提供了扩展内置视觉功能的绝佳机会。Appstore 中有数百种自定义视觉效果,我建议你在想用非标准视觉效果丰富你的报告时查看它们。

这是 Power BI 的主要优势之一——您可以从数百种视觉效果中进行选择,以一种吸引人的方式讲述您的数据故事。

Chiclet 切片机

最近,我遇到了一个基于姓氏对客户进行切片的特定请求。它们是按字母顺序排序的,但是要求只查看姓氏以 r 开头的客户。

第一步是从市场上导入 Chiclet Slicer visual。单击可视化窗格下的三个点,然后选择从 AppSource 导入。

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

在搜索字段中输入 Chiclet,看到它后,单击添加。

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

现在,您已经准备好在您的报告中使用 Chiclet Slicer 了。下一步是只提取客户姓氏的第一个字母。我将使用 Adventure Works 2017 数据库进行演示。

由于我想查看客户的全名,我将首先在 DimCustomer 表中创建一个新列,并将客户的姓和名连接起来:

*Full Name = DimCustomer[LastName] & " " & DimCustomer[FirstName]*

下一步是从该列中提取第一个字母,最简单的方法是使用 LEFT 函数:

*Cust Lastname 1st = LEFT(DimCustomer[LastName],1)*

数字 1 告诉函数只在文本左侧保留一个字符,并删除其他所有字符。

一旦我这样做了,我就可以在报表上拖动 Chiclet Slicer,并将我新创建的列 Cust Lastname 1st 作为切片的类别:

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

现在,我可以只选择那些姓氏以特定字母开头的客户,所有其他可视化结果也将被相应地过滤。

你也可以将“首字母技巧”用于其他类别,如产品、国家等。

用图像增强切片器

Chiclet slicer 还为您提供了一个很好的功能,可以将图像用作切片器。为了证明这一点,我将使用 Adventure Works 2017 数据库中作为地区存在的特定国家的国旗。

我使用维基百科的网址,但是你可以自由选择你想要的任何来源。您可以在 DimGeography 表中创建一个附加列,并为每个国家插入一个 web URL。但是,在这种情况下,您的数据模型将变得更大,因为您不能忘记计算列是数据模型的一部分,因此会占用内存空间。

为了避免这种情况,我使用 DimGeography 和 web URL 中的国家/地区代码将数据规范化到一个单独的表中。权力匕很聪明的认出了这两张表的关系:

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

现在,非常重要的一步是正确标记图像的 URL,以便 Power BI 可以将其作为图像处理。您可以通过单击列标志 URL 并将此列归类为图像 URL(列工具选项卡下的数据类别下拉菜单)来实现。

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

现在,是时候将 Chiclet Slicer 再次拖到我们的报告中了。将国家/地区代码作为一个类别,将标志 URL 作为图像。

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

然后,在格式窗格下,您可以尝试各种属性的不同定制。我已经将图像分割值设置为 80,这样类别和图像都可见,但是您也可以通过将该值放大到 100 来选择仅在您喜欢时查看图像。

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

正如我所说的,尝试不同的数字,直到你得到最适合你的报告的外观和感觉。

结论

Chiclet Slicer 是您的另一个有趣的工具,它通过扩展标准的可视化,为您提供了增强报表的可能性。但是,要小心,不要过度使用。最重要的是找到正确的平衡并在一些有意义的特定场景中使用它。

感谢阅读!

订阅这里获取更多有见地的数据文章!

机器学习儿童指南

原文:https://towardsdatascience.com/childrens-guide-to-machine-learning-b90171f86cef?source=collection_archive---------21-----------------------

向未来的领导者介绍当今最重要的技术之一。

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

来源:https://undraw.co

(本文旨在让小学生也能轻松理解机器学习的基础知识。反过来,这将使每个人都可以访问它。如果你觉得有哪个部分没有达到你的目的,请在评论中告诉我,我会努力改进这个部分)

成年人喜欢用很多复杂的词来说一些事情。这可能是因为他们想展示他们令人印象深刻的词汇。在像计算机科学这样有很多专业术语的技术领域,情况变得更糟。这些技术词汇应该有助于区分相似的想法。但最常见的是,它使简单的想法变得复杂。在这篇文章中,我会尽量不使用这些复杂的词汇。这是为了让你能清楚地理解想法,而不是死记硬背大词。所以让我们从一点历史开始。

让我们从头开始。

你可能已经看到你周围都是电脑。从智能手表到手机、平板电脑和笔记本电脑,它们都是不同形式的计算机。今天这些有用的小玩意一直是“哑机器”。他们擅长服从命令,就像一只听话的小狗(或者像小猫一样古怪的人)😀).如果你告诉它向右刷,它就向右刷。如果你告诉它向左滑动,它就向左滑动。如果你告诉它打开 Instagram,当有人点击 Instagram 图标时,它就会打开它。你明白了。它自己想不出任何东西。

尽管这些机器很笨,但在过去的 50 年里,我们已经让计算机做了很多事情。从添加数字和播放歌曲到在国际象棋中击败大师。但是对于这些事情中的每一件,必须有人告诉计算机该做什么以及具体怎么做。

所以计算机能为我们做的事情是有限的。计算机只能做我们可以展示给它们如何做的事情(一步一步地)。正如你所猜测的,这种魔力很快就失去了它的魅力。总有一些事情:

  • 连人类都不知道怎么做(更别说向计算机解释了)
  • 以及一些我们不知道如何告诉计算机做什么的任务。(我们无法用机器能理解的语言解释清楚)

(告诉计算机做什么和怎么做的一个大词是 编程。但是我们不会用这些大词,因为我们还不想成为成年人。)

今天有什么故事?

在很长一段时间里,如果没有人告诉计算机如何做某件事,它们什么也做不了。直到最近还是如此。一些非常聪明的人找到了一种教计算机自学的方法。(大人对此用的另一个大词是 【机器学习】 但是嘶。谁需要那个)。想象你在一个没有老师的教室里。在那里,你和你所有的同学在没有任何老师的情况下自学。很奇怪吧?想象一下计算机自己学习是多么奇怪。令人惊讶的是,计算机非常擅长自己学习。它甚至能学会人们教不了它的复杂东西。

(他们不断尝试教计算机,直到慢慢地,即使是愚蠢的计算机也开始学习

“自学”是什么意思😮?

我们教计算机的方法是给它看许多问答的例子。专家们喜欢将整套例子称为数据集*。这些例子包含一个样题( x )*及其正确答案( y )。一个例子可以包含例如“一张猫的图片”和它的回答“猫”。

这很像学校里一些好老师在考试前做的小测验。这个小测验样本有助于你对考试内容有所准备。你可能不会在考试中得到完全相同的问题,但它有助于你准备类似类型的问题。

我们向计算机展示问题和答案的例子,而不告诉它如何找到正确的答案。利用这些例子,计算机试图找出一种方法来猜测正确答案。它学会做出正确的猜测,即使它在我们展示的例子中没有看到这个特定的问题。计算机寻找它以前见过的类似问题,并使用以前见过的正确答案进行猜测。这就是计算机所做的一切——根据之前看到的例子进行猜测。

懂数学的人有一种奇怪的癖好,喜欢用无意义的字母来称呼事物。学生们最害怕的字母是 X。来自世界任何角落的每个学生都花了无数个小时来尝试“寻找 X”。字体这个数学领域叫做代数,尽管它看起来很奇怪,但却非常有用。在用字母、数字甚至类似外星人的符号漂亮地表达非常复杂的想法时,它是有用的。)

“猜你说,就这样?”是也不是。

计算机所做的只是根据它所知道的类似问题进行猜测。(猜测的一种花哨说法叫做***)。嗯,不是随便猜的。它试图学习根据一些有趣的数学知识做出尽可能好的猜测(我们现在还不需要进入这个领域)。重申一下,机器学习中的学习是关于如何做出最好的猜测*。最可能的猜测是最接近正确答案的一个。**

“那它怎么猜对呢?”

最初,计算机做出非常糟糕的猜测(从随机猜测开始)。然后,它将自己的猜测与我们在示例中提供的正确答案进行比较。我们要求计算机减少猜测中的错误。然后,它继续徒劳地减少错误。当它试图减少自己的错误时,它会自我纠正,从而慢慢接近正确的猜测。

计算机正在修正自身错误的过程被专家称为梯度下降。现在不用记名字了。这可能是将来另一个有趣帖子的主题。现在,只要记住计算机通过查看正确答案的例子来慢慢纠正自己。

“如果机器在自我修正,我们人类会怎么做?”

机器学习不是由计算机自己完成的。人类在机器学习中有非常重要的作用。人类扮演着教练或调解人的角色,控制着整个游戏:

  • 人类提供了计算机用来学习的例子。
  • 人类告诉计算机如何发现他们的错误。

基本上,机器所做的唯一事情就是根据例子进行猜测,并尽最大能力纠正猜测。其他一切都由人类提供的信息和代码指导。

包扎

这是对什么是机器学习的一个非常快速的介绍,没有进入油腻的细节。以下是这篇文章主要观点的快速总结:

  • 机器学习允许计算机执行任务,而无需你告诉计算机如何去做。
  • 机器学习就是计算机查看大量示例,并试图找出如何做出最佳猜测。
  • 机器学习如何做出最佳猜测的方法是自我纠正错误的猜测。这是通过查看示例中的正确答案来完成的。
  • 人类通过提供正确的示例集、检测错误的方法等来运行整个游戏。

如果你明白这一点,你就比大多数人更了解机器学习是如何工作的。欢迎在评论区留下您的反馈和疑问。

穿蟒蛇皮的中国邮递员

原文:https://towardsdatascience.com/chinese-postman-in-python-8b1187a3e5a?source=collection_archive---------15-----------------------

详细的实现和解释,特别强调使用递归生成奇数顶点对的独特方法

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

梅森 B.Unsplash 上拍摄的照片

今天,我将解释并实现流行的“中国邮递员”算法。

为了方便读者,本文分为以下几个部分,建议按顺序浏览所有部分。

动机

中国邮递员问题最早是由中国数学家关美子在 20 世纪 60 年代初研究的。他提出了这样一个问题,如果一个邮递员(在他的情况下是一个中国邮递员,因此得名:D)希望以尽可能短的距离走遍一个城市的所有街道,投递信件并返回他的邮局。

由于我们生活在互联网时代,电子邮件和即时通讯已经取代了传统的信件,我将修改这个问题,以适应这一代人😃

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

杰克·吉塞尔Unsplash 上的照片

让我们想象一下,你正在一个古老而美丽的城市里度过一个美妙的假期。鉴于目前的情况,我们必须想象这一点,并等到新冠肺炎疫情吹走来尝试这一点。

你想游览这座城市,并成为一名热情的游客,比如说一名摄影师;从您的酒店出发,您希望游览这个城市的每条街道至少一次,然后回到您的酒店。(街头摄影是你的爱好:D)

但是,你要背一个大背包,摄像器材,口粮等。这给你能走多远设置了一个物理限制。而且,你没有世界上所有的时间去蜿蜒曲折,整天不停地游荡,一条一条地寻找所有的街道。(虽然听起来很可爱!)

你想知道完成这次旅行的最小可能距离是多少,以及如何做到这一点?

嗯,读完这篇文章后,你将能够实现一个 python 程序,如果你以图表的形式输入城市地图,它将返回你游览所需的最小距离!

算法、前提条件和假设

就图论而言,问题是简单地找出图中欧拉回路的路径距离。然而,一个图只能有一个欧拉回路(或也称为欧拉圈),如果它的所有顶点的度数都是偶数。

因此,如果我们有一个所有顶点都是偶数的图,那么图中的欧拉回路将恰好穿过每条边一次。

这涵盖了我们算法的一种情况:如果我们的图有所有偶数顶点,我们只需要返回该图中所有边的权重之和。

但是现在这个世界并不完美,不是吗?找到一个所有顶点都是偶数的城市的图是不太可能的。事实上,人们甚至在他们的考试题中找不到这样的图表,更不用说古代城市了(我也是:D 的学生)

那么,如果一个图有一些奇数个顶点,会发生什么呢?这就是中国邮递员算法的优势所在。

  1. 我们找到了图中所有的奇数顶点。

2.确定所有可能的奇数顶点对。

3.对于每一对,我们找到连接奇数顶点和最短可能路径的边。

4.从以上组合中,我们选择总长度最短的一个。

5.我们通过考虑新增加的最短额外边来计算中国邮递员的最小距离。

在我深入每一个步骤之前,我将详细阐述我将详细解释的算法的哪些部分,以及哪些部分是先决条件。

先决条件:

  1. 我们将使用 Dijkstra 算法来计算配对之间的最短可能路径。我将在 python 中实现这一点;然而,我不会解释算法本身的细节。
  2. python 数据结构和语法的基础知识,如列表、集合、循环等。
  3. 熟悉递归的概念。
  4. 熟悉图论的基本概念。
  5. 愿意学习!😄

详细步骤:

  1. 生成奇数顶点配对:这是通过使用递归的算法来完成的,这是我在第一次解决这个问题时想到的。
  2. 从所有组合中选择合适的一个。
  3. 所有的计算导致一个中国邮差旅行的最后最小距离。

假设:

  1. 我在实现这个算法时考虑了一个连通的、无向的、加权的图,其权重为正。
  2. 由于问题陈述通常被解释为寻找路线的最小距离,我认为无向和正加权图的假设是合理的。

所以现在我们配备了一个算法来获得游览古城的最小距离。我将通过 python 代码块演示每一步,完整的代码将附在最后。请注意,我所做的实现可能不是社区中最有效的,但是,它们反映了一个普通学生编写这个算法:D 所需的思想和方法

实施

该算法的实现遵循以下步骤:

一、将输入定义为图形

二。将 Dijkstra 算法实现为一个函数

三世。用函数寻找奇数次顶点

四。用递归生成所有奇数顶点对

五、借助 Dijkstra 函数选择最佳配对

六。实现函数以获得所有边的和

七。将所有代码块组合在一起

八。给定中国邮递员距离作为图形输入的输出

I .将输入定义为图形

我们将一个无向的正加权图作为我们的输入。我们将以列表的形式存储它,如代码块所示。

注意:我们可以在运行时获取用户输入的图形,但是由于逐个输入值会很麻烦,所以我们使用预定义的图形来简化我们的工作😄

如代码块所示,我们将两个图作为输入。

**图形输入:**列表列表

将 Dijkstra 算法实现为一个函数

该算法的目标是在图中给定的两个节点之间找到最短的可能路线,从而也找到距离。它属于贪婪算法的范畴,试图通过寻找最近的邻居和自我调整来找到最佳路径。Dijkstra 的唯一主要缺点是当权重为负时它会失败,此时我们使用贝尔曼福特或其他算法来寻找最短路径。

代码块显示了对于一组给定的图的源和目的顶点,实现该算法所采用的方法。要了解有关该算法实现的更多详细信息,请参见参考资料。

迪杰斯特拉算法 作为函数

寻找奇数次顶点

对奇数顶点执行这些步骤的决定取决于我们的图中是否存在奇数顶点这一事实。如果不是,我们可以吃颗定心丸&只返回所有边的权重之和😎否则我们需要叫中国邮递员来支援👊

由于我们的输入图是加权的和无向的,找到每个顶点的度数并不困难。我们只需要计算图中每个节点的非零条目的数量。

为此,我们运行一个简单的嵌套 for 循环,并计算每个顶点的度数。一旦我们有了每个顶点的度数,我们使用列表理解来找到奇数个顶点,并将顶点编号存储在另一个名为 odds 的列表中,这是我们将来需要的。

记住,根据握手定理,输入图中奇数顶点的数量总是偶数。

在一个列表中得到图的所有奇数顶点

IV 生成所有奇数顶点对

这一步通常被认为是该算法中最难实现的部分,需要大量的思考和努力。当我第一次自己解决这个问题时,我花了几乎 3-4 个小时来想出一个算法来生成这些配对!然而,结果是非常令人满意和值得的🔥我鼓励你也这样做,并且考虑一下这一步。如果你有逻辑地思考和进行,你也许能解决这个问题。

这个算法是我做的,但它可能不是独一无二或原创的,从某种意义上说,有人可能遵循相同的思维过程,并提出了类似的算法。然而,我非常自豪自己有这样的想法,这也是我写这篇文章的原因之一,为了社区的利益,分享我的方法:)

直觉和逻辑

我们的任务是得到所有可能的配对,包括所有奇数顶点。例如,如果奇数顶点是:A,B,C & D,可能的配对是:-

(A,B)和(C,D)

(A,C)和(B,D)

(A,D)和(B,C)

这看起来很简单,但是随着奇数顶点数量的增加,这种组合的数量会呈指数增长。例如,对于 10 个奇数顶点,有 945 种可能的组合!

因此,要解决这个问题,我们必须理性地对待它。如果我们观察这些对是如何被少量顶点组合的,我们可以推广到任意数量的顶点。

参考下面给出的图表。我已经写下了 6 个奇数顶点的所有唯一对:A,B,C,D,E & F。

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

图 1 作者的图片:这代表了我们如何将所有唯一的顶点对分组

每列包含从 A、B、C、D、E & F 开始的对。现在,任何对的组合都必须包括所有奇数顶点,从 A 到 f。因此,如果我们考虑第一种可能的组合:

  • 我们可以结合 AB,
  • 那么既然 B 被取->就去 C 列
  • 拿 CD
  • 那么既然 D 取了->去 E 列
  • 拿 EF 来说

所以我们得到了第一个可能的组合:(A,B) & (C,D) & (E,F)

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

图 2 作者的图片:这是我们如何得到第一个组合的

对于第二种可能的组合:

  • 因为 E 列没有剩余的线对,我们回到 C 列
  • 现在我们拿 CE
  • 现在既然 D 没有被取->去 D
  • 因为 E 已经被取了,取 DF

所以我们得到了第二种可能的组合:(A,B) & (C,E) & (D,F)

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

图 3 作者图片:这是我们如何得到第二个组合

我们观察到这里出现了一种模式。如果我们能够以某种方式跟踪我们已经使用过的顶点,那么通过递归,我们可以很容易地得到所有可能的配对组合。请参考下图。在这里,我已经形象化了我们如何通过像树一样递归的每个分支得到所有的组合。我们看到,对于 6 个奇数顶点,我们将得到总共 15 个组合。

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

图 4 作者图片:递归树获取所有组合

递归代码

我们首先需要一个函数,它可以按照图 1 所示的顺序给出所有唯一的对。我们定义了一个函数“gen_pairs”,它使用一个简单的嵌套循环来获取所有唯一的对。因为我们希望这些对按照以每个字母开始的列进行分组,所以我们制作了一个 list-> ’ pairs ',其中每一列都是一个列表。如代码块中所示,该函数获取包含所有奇数顶点的赔率列表,并返回对。

**生成所有唯一对:**如图- 1 所示

现在我们来看看递归函数。为了构造递归函数,我们总是需要考虑两种情况

基本情况,我们返回一些输出,或者停止递归

我们执行一些计算并再次调用函数的一般情况

我们需要两个列表作为递归函数的输入:

  1. ’ done ':这将跟踪我们在组合中已经获得的顶点
  2. ’ final ':这将存储我们想要生成的所有组合
  3. 注意:这些需要从一个递归调用传递到另一个递归调用,不能被覆盖。为了解决这个问题,我使用 slice 操作符在没有引用的情况下复制了它们。Example - val = done[:]

递归将在我们之前生成的“pairs”列表中完成,每次都将通过切分 list -> pairs[1:]来调用该函数

只有当我们最终得到一个组合时,递归才会停止。但是由于组合的结束对可以来自任何列,我们通过匹配组合列表的长度是否等于“顶点数/ 2”来检查这个条件。出现这种情况的原因是,因为我们将有 2 对,所以对的总数将是“顶点数”/2。因此,我们预定义了一个变量“l”,其值为:(len(pairs) + 1)//2

(注意:我们使用 pairs 列表来检查这个条件,因为逻辑是相同的。请随意使用“赔率”来获得此条件)

如代码块中所示,代码是简短的和甜蜜的:D。这种情况下只需检查字母对中的任何字母是否在我们的完成列表中,如果它们不在,那么我们将该字母对视为组合。

**递归函数:**生成所有奇数对

我还附上了这段代码的调试版本,这是我最初在制作这个函数时使用的。如果您想了解函数在每次递归调用时是如何工作的,那么建议删除我的一些注释并运行它。

递归代码 调试版本 :带注释我原来用来测试代码的

借助 Dijkstra 的帮助选择最佳配对

首先,如果你已经走到这一步,那么我对你的努力表示赞赏,我也有一些好消息要告诉你。所有繁重的工作都完成了!🎊

我们现在寻求配对,其中配对之间的总距离最小。例如,如果我们有奇数个顶点:A,B,C & D

  • 我们取每一个可能的配对,并计算该配对中每一对之间的总距离,加上该配对的总距离。这听起来很难理解,但是很容易理解和实现
  • 举个例子,我们来看配对:(AB) & (CD):

使用 Dijkstra 的,让我们说 A & B 之间的最小距离是:20

使用 Dijkstra 的,让我们说 C & D 之间的最小距离是:10

那么这个配对的总距离是:20 + 10 = 30

  • 我们对(AC)和(BD)以及(AD)和(BC)重复这个过程
  • 我们从所有 3 个配对中选择距离最小的配对作为我们的最佳配对

下图也说明了这一点。(所有值都是随机考虑的,以演示该过程)

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

图 5 作者图片:如何使用 Dijkstra 选择最佳配对

这在下面的代码块中实现。我们将所有的距离存储在一个列表中,并获取其中的最小值作为完成中国邮递员距离所需的额外距离

选择与 Dijkstra 的最佳配对

VI 函数获得所有边的和

下面的代码块使用简单的嵌套循环来获得所有边的权重之和。我们将需要这个来获得输入图的权重和,这将加上由最小奇数配对计算的额外距离。

获取所有边总和的函数

VII 组合所有代码块

恭喜你!你坚持到了最后😃剩下的就是在一个函数中调用&使用我们写的所有函数。请记住,我们需要考虑输入图的两种情况:

如果所有顶点都是偶数:我们返回中国邮递员距离作为所有权重的和

如果有奇数个顶点:我们计算奇数对,从最优顶点得到最小距离,并把它加到所有权重的和上

第八卷最后的中国邮递员距离

下面的代码块具有最终编译的函数,当使用图形调用该函数时,将返回遍历图形所有边至少一次所需的最小距离,并返回到起始顶点。

最终编译函数

为什么会这样

现在,你将成功地从上面的代码中找到中国邮递员的距离。然而,有些疑问可能会萦绕在你的脑海中,比如这在❔实际上是如何运作的

下图是一个简单的图,所有的顶点都是偶数。图中的欧拉回路沿着箭头方向,从 A -> B -> C -> D -> A。我们看到,为了能够访问所有边至少一次,并返回到起始顶点,我们需要经过的最小距离与所有边的权重之和相同。

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

图 6 作者图片:所有顶点都是偶数的图

现在考虑下图所示的图表的附加内容。现在我们有两个奇数顶点。因为这里唯一可用的配对是 AD,所以我们得到它们之间的最小距离作为最小配对距离。

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

图 7 作者图片:修改后的奇数顶点图

现在,为了形象化我们是如何完成旅程的,让我们沿着所选配对广告之间的最短距离添加一条新边

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

图 8 作者图片:应用中国邮递员,我们添加一条新的边得到欧拉回路

我们看到这条边会使图中所有的顶点都是偶数。现在,如果我们在这里考虑欧拉回路,我们会看到,我们需要穿越这个新的边缘,回到我们的出发点。因此,中国邮递员的总最小距离是原始图的所有权重之和,加上添加的边的权重。这正是我们的代码所做的,不需要显式地添加边。

所以上面的图传达了中国邮递员算法背后的光辉!

现在你可以访问世界上的任何一个城市,把它的地图做成图表,输入到你的代码中,就可以得到“中国邮差之旅”😄 所需的最短距离

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

安妮·斯普拉特在 Unsplash 上拍摄的照片

最终代码和参考文献

附上实现中国邮递员算法的完整代码。如果你还想要最小距离的路径,那么你可以看看 Fleury 的算法,它可以用来在修改后的图形中显示欧拉回路。

作者写的实现中国邮递员的完整代码

我非常感谢我的大学图论教授 Surabhi Narayan 博士,他教会了我这些概念,激发了我对:D 这个领域的兴趣

我希望您喜欢这篇文章,并且现在已经准备好自己实现这个算法了!

下面是一些参考资料,可以阅读更多关于中国邮递员算法和 Dijkstra 算法的内容。

1.https://www . geeks forgeeks . org/Chinese-postman-route-inspection-set-1-introduction/

2.https://en.wikipedia.org/wiki/Route_inspection_problem

3.【https://www.youtube.com/watch?v=XB4MIexjvY0

4.https://www . geeks forgeeks . org/dijkstras-shortest-path-algorithm-greedy-algo-7/

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

马特·拉格兰在 Unsplash 上拍摄的照片

Pytorch 挑战中国十二生肖分类

原文:https://towardsdatascience.com/chinese-zodiac-sign-classification-challenge-with-pytorch-d89a8897d00b?source=collection_archive---------13-----------------------

在贝塔斯曼 AI Udacity 奖学金(Bertelsmann AI Udacity Scholarship)中,学者们不仅要完成 AI uda city 课程,而且还要相互挑战,以应用他们在课程期间收集和实践的技能和知识。这些挑战之一是中国十二生肖分类挑战。在,你知道,中国农历新年的时候。

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

来源

中国的十二生肖被分为十二个年度周期,每一年都由一种特定的动物来标识。

我认为这将是一个有趣的挑战,所以我一头扎了进去。

对于那些想尝试这个挑战的人,你可以在这里得到数据

设置环境

最重要的是。使用 GPU 会使任务更容易,所以我尝试使用 Google Colab 和 Kaggle Notebook 来构建这个模型。但是因为我喜欢能够编辑(添加、更改、移动或删除)我的数据,我更喜欢使用 Google Colab,因为数据存储在我的 Google Drive 中。

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

来源

加载并检查数据

我们有 12 类图像,我们希望我们的 Pytorch 模型进行分类。将数据分为三组是一个好主意——训练数据,用于训练我们的模型;验证和测试数据,用于确保我们的模型不会过度拟合。

我们先来看看这些数据的分布情况。

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

十二生肖图像分布

好的,所以对于每个训练,我们有 600 个训练图像(一个是goat的缩写),54 个验证图像(一个是goat的额外图像,这可能是因为一个图像放错了位置),以及 54-55 个测试图像。

我觉得不错。

让我们来看看这些图片的样本。

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

样本图像

我也觉得不错。我们还可以看到,我们正在纳入绘图图像以及(因为龙并不存在)。

使用 Pytorch 创建模型

Pytorch(以及其他机器学习/深度学习框架)的一个好处是,它为我们提供了简化的样板代码。其中之一是加载列车值测试数据。

现在来建立模型。

我将使用预训练的 Resnet34 模型来转移它的学习,以构建这个分类模型。我还尝试了其他预训练的模型,如 Resnet101 和 VGG 19 与 BatchNorm,但 Resnet34 给我一个相当好的性能,所以我要用它。Resnet34 要求输入图像的宽度和高度为 224。

全模型架构如下。

这里我不会用什么很复杂的东西。只有两个额外的 FC 层,每个层有 512 个神经元,一个输出层有 12 个神经元(当然,每个十二星座类一个)。

训练模型

现在是第一个令人兴奋的部分,训练模型。

我们只需要迭代训练数据加载器,同时(a)对模型进行向前和向后传递,以及(b)测量模型的当前/运行性能。我选择每 100 个小批量做点(b)。

我选择在 7-15 个时期内训练模型。你会在下面的图表中看到原因。

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

训练和验证损失和精确度(Resnet50 try 1)

在每 100 次迷你批次传递中,该模型在训练数据集上肯定会随着时间而改进。但是当我们查看验证数据集的性能时,它似乎并没有提高太多(虽然随着时间的推移,准确性似乎提高了一点点,但我认为这还不够)。

但是当我们看一看具有不同架构的其他模型时,同样的事情发生了。

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

训练和验证损失和精确度(Resnet50 try 2)

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

培训和验证损失和准确性(VGG 协议 19 和批次标准)

第二个模型是 Resnet50,除了我把学习率从 0.001 改为 0.003 之外,与第一个模型基本相同。三是使用 VGG 19,批量常模,学习率 0.001。

三个不同的模型+参数讲述了相同的故事——在多个历元之后,验证的准确性性能并没有像训练一样显著提高(特别是对于最后两个模型)。

我们并不太关心模型的损失,因为这是对模型表现的“自信”程度的衡量,我们更关注准确性。

测试模型

让我们看看模型实际上是好的,还是满足测试数据集。

  • ResNet (lr 0.001) —损失:0.355 acc: 90.5%
  • ResNet (lr 0.003) —损失:0.385 acc: 90.6%
  • VGG 19 批次标准—损失:0.586 acc: 90.8%

从精确度来看,它们基本相同。对于损失,具有 0.001 lr 的 ResNet 至高无上。这些数字与我们的训练和验证几乎相同,所以我们可以说我们的模型没有过度拟合(或者至少我们在它与我们的小纪元发生之前停止了它),并且在分类中国十二生肖方面工作得相当好。

我很好奇,哪张图片的问题最大。

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

混淆矩阵

喜欢混乱矩阵中的数字。

我们可以看到,模型很少会弄错一个goat,如果弄错了,也总是带着ox(喇叭)。

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

被模特误认为是公牛的山羊图像

我们还可以看到,这个模型在区分dragon和其他星座时有一点困难。最显著的是oxes (角)和snake(身体)。

最后的话

在贝塔斯曼 AI Udacity 奖学金期间参加中国十二生肖分类挑战赛非常棒,令人耳目一新。它推动并激励我做我热爱的事情——在人工智能/机器学习/深度学习领域进行实验和建设。

更多的挑战会到来,我已经等不及了。

你可以在我的 Github 页面查看我的笔记本。请回顾并关注:)

选择智能数据而非大数据来拯救您的企业

原文:https://towardsdatascience.com/choose-smart-data-over-big-data-to-save-your-business-a334c6302618?source=collection_archive---------62-----------------------

从数据工程师的角度来看

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

肖恩·斯特拉顿在 Unsplash 上拍摄的照片

为什么您的数据需要智能?

大数据并不神奇。你不能指望把所有的东西都扔进一个罐子里,然后希望出来的东西能让你的业务增长。在处理数据时,口头禅“越多越好”是一个错误的信条。尽管有最先进的算法,你喂它垃圾,它最终给你垃圾。选择不适当的数据策略会让您的公司损失一大笔钱,甚至会让整个运营破产。

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

Artem Maltsev 在 Unsplash 上拍摄的照片

每隔一段时间,大数据就被当做一个科技流行语。我见过一些公司声称他们正在使用大数据来改变世界,而他们甚至不能改变他们的 MySQL 数据库的 root 权限。我夸大了数据库的部分,但我正试图说明我的观点。

大数据以五个 v 而闻名:量、速、变、准、值。最终的 V 偶尔会被低估和忽略,但事实上它是所有数据系统中最关键的元素。从长远来看,数据的价值不在于它的数量或速度,而在于它决定了其他方面的方法。万一你的数据没有给你的企业带来任何价值,你还会费心去收集它吗?

您为拥有数百 TB 的数据而自豪,但您却让这些数据扎根于数据中心的机架中。您坚持雇佣最熟练的数据团队,但是您让他们做的只是清理和重命名 JSON 文件。那种违反直觉的一点也不环保的方法会阻碍你成为一个数据驱动的企业。

我的数据比你的数据大

心满意足地说“我的数据比你的数据大”可能会让你觉得自己和其他大数据大师是一个档次的,但这里有另一种说法供你磨练: “我的数据比你的数据聪明”。

这是我在互联网上遇到的关于智能数据的两种不同定义

“智能数据是经过格式化的数字信息,在发送到下游分析平台进行进一步的数据整合和分析之前,可以在收集点对其进行处理。”—WhatIs.com

“智能数据”是指实际上有意义的信息。这就是看到一长串每周销售额的数字与识别一段时间内销售额的高峰和低谷之间的区别。— 连线

前者甚至声明智能数据确实来自智能设备,嗯?作为一名数据工程师,这与我对智能数据的看法相去甚远。后者似乎更适合我,但感觉还是不对。我用自己的话给出了一个新的定义

智能数据是数据的一部分,其价值可直接用于满足特定的业务需求或实现预定义的结果。智能数据完全符合技术规范,应该在数据结构中没有任何冗余信息的情况下使用。

简单来说,智能数据并不是大数据的一个独立实体,而是从未经处理的数据中,提取出一条条有价值的信息。智能数据是您在 PowerPoint 演示文稿中放入的内容,是您在决策过程中投射的内容。

尽管听起来令人惊讶,智能数据并没有排在最后,但它应该出现在流程的初始设计中。它决定了你如何收集数据,你构建数据架构的方式,你想雇佣哪些人来完成这项工作。 用结果来决定收益是一种精益的方法,使结果最大化,成本最小化。

两位数据创始人的故事

这个想法

让我们介绍一下约翰和杰克,两位年轻热情的企业家。他们都是从数据世界开始创业的。他们希望利用现成的大数据和机器学习工具来改变电子商务市场的面貌。他们倾向于收集购物平台上用户事件的每个数据点,以构建一个典型的购物者之旅。然而,约翰和杰克采取不同的步骤来理解这个想法。

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

奥斯汀·迪斯特尔Unsplash 上拍摄的照片

行动

John 将赌注压在了现成的分析工具上。他在网站、移动应用程序上集成了一个代码片段,并立即开始查看数据。由于他无法控制如何将数据作为输入形成管道,*他将分析工具提供给他的任何东西输入到数据基础设施中。*管道的其余部分由过度优化的学习模型组成,John 希望这些模型能够提供最佳结果。他为在他的数据管道中摄取数百千兆字节而自豪。

这是约翰输入数据的一个例子

来源: 谷歌分析

前数据工程师杰克从另一个角度出发。他渴望完全控制数据结构。当他的同伴已经从他们的训练模型中得到结果时,杰克仍然在努力把他自己的跟踪模块组合在一起。他正在焦急地等待,但这将使他对自己拥有的输入数据有一个适当的认识。Jack 可以有一个紧凑的数据格式来支持他的开箱即用的机器学习模型。

与 John 的数据相比,Jack 的示例数据更加简洁和精确

余波

让我们快速计算一下。在 John 的数据点中,有 3 个空值、1 个重复字段、4 条不必要的信息,总共有 8 列可以删除。假设在 John 的数据存储中,他用 16 个字节存储整数,用 32 个字节存储长整数,用 256 个字节存储字符串,总计:

16 * 3 + 256 * 3 + 32 = **848 bytes** on each data pointFor a data point every second, that number would be**72 MB** a day = **2 GB** permonth = **765 GB/**year.

在 John 的 Hadoop 数据中心内,一年内有 765 GB 的数据处于闲置和非生产状态。这将花费约翰数千美元来维护冗余的 Hadoop 节点。他的现金很快就花光了,他想不出为什么他的机器学习模型不能处理这么大的数据。当 John 在数据库中积累了数百 TB 的数据时,他不知道该如何处理。他无法控制他的数据。

另一方面,Jack 在他的数据管道中保持少量的摄入。他有适量的数据来填充他的训练模型,这可以给他带来积极的结果。Jack 在数据存储方面节省了大量资金,并重新投资于为其应用程序构建更好的算法。当谈到数据结构时,Jack 掌握了主动权,他为自己的小而聪明的数据感到自豪。

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

克拉克·蒂布斯在 Unsplash 上拍摄的照片

结论

现实生活中没有绝对的约翰和杰克,而是介于两者之间。企业正在通过优化算法和超调模型来努力实现投资回报最大化。他们不断将大数据输入到他们的流程中,相信最终会学到一些有用的东西。

如果没有有价值的信息,大数据只不过是无用的数字片段,仅仅是您业务的负担。冗余、不必要、重复的数据是万恶之源。在一个混乱的数据时代,智能数据将是我们的救星,它不会排在最后,而是排在首位。

我叫 Nam Nguyen,我写关于大数据的文章。享受你的阅读?请在 Medium 和 Twitter 上关注我,了解更多更新。

[## 如何构建可扩展的大数据分析管道

大规模建立端到端系统

towardsdatascience.com](/how-to-build-a-scalable-big-data-analytics-pipeline-7de18f8be848) [## 大数据工程师的一天

为巴黎的一家广告技术巨头工作

towardsdatascience.com](/a-day-in-the-life-of-a-big-data-engineer-a286e4a5ae29)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值