数据收集的四项原则
数据收集
通过减少对数据的处理来简化分析
资料来源:农业营销服务本地食品目录
我花了一生的时间收集原始数据,无论是在我的工作中还是作为更广泛的研究团队的一部分。在这样做的过程中,我对数据在科学中的作用、数据的收集和组织变得相当固执。在这篇文章中,我详细介绍了数据收集和组织的四个原则,这些原则对任何需要收集数据的分析师都很有用,不管是用手还是用机器。通常,学生、初级学者、商业分析师和公共管理者会参与数据收集。然而,它在大多数课程中很少受到关注。尽管数据科学的兴起,以及其用于抓取、解析和自动化清理、组织和学习过程的工具,我们许多人仍然需要收集我们的数据。
我定量研究精英文本和政策文件。我的项目涉及官僚主义、政策实施和监管政策。我的书使用了近 25 万份监管提案的数据,我目前正在从事一个国家科学基金会(NSF)资助的项目,该项目逐段检查 10 万份公众对监管的意见。
我还在一所大型公立大学教授本科生和研究生级别的统计学。我经常被一些学生所震惊,他们理解统计学的概念逻辑和如何建立回归模型,但对如何收集和组织数据却缺乏直觉。尽管数据科学和统计学开始在日常管理中发挥更大的影响,但我发现这种直觉在私营部门更加缺乏。以下一套基本原则可作为数据收集的指南。对它们的忠诚将提高数据的质量及其对决策的影响——无论是研究还是公共和私营部门的管理。
忠实于数据生成过程
我们经常讨论或描述科学,或学习,作为一个围绕理论和假设检验的过程。这种描述只是部分准确。在萌芽阶段,科学是结构化的观察。没有对观察结果的精确记录和保存,发展和检验理论是不可能的。而且,科学是不可复制的。
数据是社会、生物或物理过程的结果。这个世界没有给我们半个人,百分比,或对数美元;它给我们人,计数,和美元。对数据生成过程的保真度允许我们在迭代决策过程中以及归纳和演绎推理循环之间的转换中改进计算和测量。
原则 1:记录数据;不要计算,不要变换。
过去,可用的电子表格或数据库(例如 MS Excel 或 MS Access)的数据限制限制了一个单元格中可以存储的字符数或给定数据集可以包含的行数。这些限制意味着保留数据原始形式的记录极具挑战性,并且需要大量文件和空间。幸运的是,大多数电子表格应用程序不再是这种情况。(SQL 或 SQLite 数据库可以快速处理剩余的限制。)鉴于这些进步,在收集期间按原样存储数据。
1A:如果可能的话,以文本或文本兼容格式存储数据。
在获取忠实于数据生成过程的数据方面,数据收集并不是唯一的危险。程序,尤其是“工具化”的电子表格,经常给数据添加隐藏的结构或内容。例如,开头或结尾的空白尤其令人讨厌,因为问题并不明显。其他问题包括将文本存储为数字,反之亦然,以及将所有字符串作为因子变量读取。因此,建议将您收集的数据存储为文本或文本兼容文件(例如。txt 或者。csv“分隔”文件)。
1B:备份数据。
这里不需要大量的文字。将您的数据存储在多个位置。如果必要的话,其中一个应该是物理硬盘——所有的云都会不时出现故障。如果遵循这些原则,您应该只需要存储原始的、基于文本的文件。
原则 2:管理数据组织
一旦收集了数据,首先要做的是围绕它的结构思考。我在这里使用“策划”这个词,因为它意味着对数据的仔细(重新)组织——一些经过思考的事情。数据很容易在“宽”或“长”格式之间转换,只要其结构和组织是一致的。(宽格式和长格式数据之间的差异可能是一个单独的帖子。)
2A:观察值出现在行中;变量出现在列中;变量的观察值出现在它们之间的单元格矩阵中。
数据组织的基本关注点是观察值和变量或指标之间的区别。观察、主题或案例总是成排出现;变量出现在列中。(第一列包含行[即观察]标签。)
2B:嵌套结构应该出现在列中,而不是行中。
观察可能包含分组。例子包括时间、地理位置、重复测试、宗教等。在商业中,常见的分类是部门、类别或商店。这些类型的分组不应该在行中显示(通过缩进或任何其他方式),而应该在列中作为单独的变量出现。例如,在一项全国性调查中,受访者的居住状态可能会被记录下来。“State”应该出现在一个单独的列中行标签右侧的某个列中,列标签为“state”
商业计算提供了一个很好的例子。在我涉足商业咨询的过程中,我经常看到按时间顺序排列的时间段。当您从这些列计算奇异值时,这是有意义的,但是如果没有大量的重组,对数据做任何其他事情几乎是不可能的,特别是如果行包含嵌套的话。句点是分组变量,应该出现在它们的列中。
小心复杂的行、列或数值标签。
带有区分大小写字符、特殊字符或空白的行、列或值标签会在电子表格之外的分析软件中引起问题(它们也可能是电子表格中的问题)。使用小写字母完全表示观察值、变量或标签,除非数据按原样使用。避免空格。使用下划线而不是句点来表示空白。避免使用特殊字符——“百分比”或“百分比”比“%”更好
最后,要认识到组织和标签是有意义的,因为其他人会使用你的数据。我们通常不为单一用例生成数据。组织简单的干净数据促进了数据的使用以及对程序和分析的共同理解。
原则 3:计算和分类在数据收集之外。
记住,度量是观察的模型。度量并不完全忠实地表示数据。通过忠实地以原始形式记录观察,从观察到测量的地图是可见的,允许评估、复制、更新和调整。
我发现初学分析的人(尤其是学生)经常误解什么是数据,把它们误认为是从数据中计算出来的统计数据(例如,均值不是数据,而是数据的简约表示)。这种误解通常是由于我们这些年长的分析师没有花太多时间来教授什么是数据或传达什么是数据收集的关键。
3A:所有计算都应该在数据存储库之外进行。
在商业中,电子表格是分析的引擎。原则 3 只需将原始的、未掺假的数据副本保存在单独的表格或文件中即可。对于社会科学家来说,所有的计算和其他统计程序都应该发生在统计程序中,而不是在原始数据中。在这两个领域中,从数据收集和保存中解析计算和分析方法都有逻辑上的好处。更新一个分析仅仅意味着更新由过程调用的数据集(也是以原生形式),如果脚本和函数被很好地记录的话。自动化报告和分析在公共部门和私营部门都是一件大事。在数据结构中进行计算、汇总和分析会妨碍有效的更新。
3B:在收集过程中不要汇总数据。
除非需求紧迫,否则不要在收集期间汇总数据。摘要必然意味着信息的丢失。禁止汇总包括数据结构中的总计和平均值等计算。再次,记住忠实于数据生成过程。所有的总结都可以通过记录良好的分析程序轻松重复。
在文本作为数据的情况下,如果需要摘要,你应该尽力把全文和摘要放在一起。同样,这种总结应该在收集之后进行。
原则 4:如果错了,就一直错下去。
这个原则乍听起来可能很奇怪,它需要理解分类或归类的可靠性和有效性之间的区别。出于这里的目的,有效性仅仅是一个观察是否被放在“正确的”类别中或者被“正确地”分类。可靠性指的是相似的观察结果、案例、主题或项目是否以相同的方式被归类或分类。这两种品质对于数据收集和测量都是必不可少的。
4A:在对数据进行分类或归类的最初尝试中,可靠性优先于有效性。
我使用或开发了无数的分类和归类方案。这些经历告诉我,在分类或归类上一贯错误比平均正确要好,但差异很大。使分类或归类正确(充满有效性)是一个迭代过程,高度的可靠性有助于这一过程。在三种情况下,您会发现自己在调整分配的类别或分类:
- 分类不正确,但可靠性高。
- 分类平均正确,但可靠性低。
- 分类不正确,可靠性低。
如果你发现自己处于第一种情况,调整是很容易的,因为所有不正确的分类可以一起被分配一个新的分类。然而,请注意,第二点意味着所有数据必须逐个观察地重新编码。换句话说,由于缺乏可靠性,你必须重复整个过程。最后,第三点意味着你可能还没有很好地理解这个概念来对观察结果进行分类。
分类或归类应该是互斥的。
模糊和双重分类是可靠性的敌人。在一个列中,每个观察应该接收一个且只有一个代码。综合来看,4A 和 4B 是比较的敌人。重要的是要记住,所有的研究和分析(无论是公共部门、私人部门还是学术部门)都是在时间或空间上比较事物并做出选择的努力。如果你觉得有必要对案例或观察结果进行两次分类,那么就在单独的一栏中这样做。尽管记住,如果代码是可靠的,双重编码的安全网就没有必要了。
总而言之
无论是在商业、公共部门还是在学术领域,回答问题和做出决策首先取决于在观察中收集的信息——记录和保存数据。使用这些原则并不复杂,它们使分析师的生活变得更加容易。最后,使用现有的数据集总是很诱人的。当数据适用于许多问题时,这很好。小心使用。所有数据的存在都是为了一个可能与你无关的目的。这些原则不能回答你的目标和现有数据之间的匹配的概念问题。
原载于 2020 年 5 月 13 日 https://www.samuelworkman.org**的 。
为什么除了计算机科学家,其他人都写马虎代码的四个原因
五次黑客攻击让你的更干净。
有些代码看起来很干净,但实际上很乱。尼基塔·万托林在 Unsplash 上的照片
为什么每个开发人员都认为他们正在编写完全可以理解的代码?为什么同一个开发人员不能破译别人的代码,更不用说维护它了?
因为他们写的都是可以工作的草率代码。也就是说,代码现在可以工作,但是由于它的混乱,不太具有可扩展性或通用性。除了计算机科学家——他们写的漂亮代码行不通。
理由 1:对计算机科学家来说,编码是一门艺术。对其他人来说,它是一种工具
计算机科学家编码是因为他们想编码。其他人编码是因为他们想完成一些事情。
一个普通的开发人员会根据他们脑海中出现的第一个想法来构建一个程序。然后他们会在这个想法的基础上发展,直到他们有了一个 MVP。通常,他们甚至不会考虑替代方法。
因为大多数时候,我们都弄错了
medium.com](https://medium.com/better-programming/what-does-a-real-mvp-look-like-ac35b4953e28)
相比之下,计算机科学家会考虑实现的每一个选项,并权衡每一个选项的利弊。几周后,他们会有一段漂亮的代码,但仍然没有完全发挥作用,因为计算机科学家还没有决定输出的格式。
由于开发人员从一个简单的工具开始,并有机地发展代码,所以产生了许多草率的代码。相比之下,计算机科学家通常先建立一个结构,然后在其中工作。
有机的方法是避免程序员的阻塞和按时交付的最好方法。然而,如果你想写持久的代码,你可能想把结构放在第一位。
当你害怕你的游戏机时
towardsdatascience.com](/how-to-overcome-coders-block-51ece9dafe00)
原因 2:开发者并不总是把读者放在心上
即使在协作项目中,开发人员在编写代码时也倾向于只考虑它的功能。在这样做的时候,他们忘记了代码也需要维护的事实。
问题是这种心态适得其反。当开发人员想在三个月后添加一个特性时,他们可能无法理解自己的代码。这种情况比你想象的要经常发生!
当不同的开发人员被要求实现一个新特性时,事情变得更加复杂。根据项目的大小,理解别人的代码可能需要几天到几周的时间。
理由三:风格是一个东西
每个人的编码都不一样。有些人讨厌在线评论,有些人喜欢。有些人在它的第一行上面评论它们的功能,有些人在下面。有些人喜欢开关盒,有些人讨厌它们。
这就是为什么一段代码对一个人来说可能很可怕,但对另一个人来说却很好。
当你独自工作时,这不成问题。但是现在,很多软件都是合作开发的。所以在项目的早期阶段确定一个风格指南是很重要的。
当然,您需要确保所有开发人员都遵守它。否则,您最终会得到混乱的代码,因为它是不同约定的混杂。
快速修复是值得的,但从长远来看可能会导致大混乱。Muhannad Ajjan 在 Unsplash 上拍摄的照片
原因 4:即时奖励的谬论
当你被一个问题困扰了好几天,直到你最终找到解决问题的办法时,你有没有感到兴奋?这是一个非常激动人心的时刻。
问题是,当开发人员追求快速修复时,他们往往会忽略长期问题。例如,他们可能修复了一个 bug 或者添加了一个特性,但是没有意识到代码的结构已经过时了。
这意味着每增加一项新功能,他们都必须投入更多的工作。相比之下,从长远来看,对程序进行一次重组会更容易添加更多的特性。
如果你喜欢快速解决问题,而不是解决根本问题,你并不孤单。人类的奖励系统更容易受到短期修复而不是长期变化的影响。但这样一来,你就积累了技术债务。从长远来看,这会让你付出很大代价。
你赢不了。你只能控制你输得有多快。
medium.com](https://medium.com/@erichiggins/technical-debt-is-like-tetris-168f64d8b700)
干净与脏乱的危险
声称自己总是写出干净代码的开发人员要么是在撒谎,要么是高估了自己。也就是说,有几个原因让你不想写太干净的代码:
- 如果你的目标是从头开始编写干净的代码,你就增加了遇到编码障碍的机会。为了防止主要的阻塞发生,最好在一开始就有机地发展你的代码。这尤其适用于你是初学者的情况。
- 一些开发人员花了一整天的时间清理他们的代码,没有别的原因,只是为了美观。当然,如果有许多其他合作者,或者代码将以任何方式呈现,这可能是有用的。但通常情况下,润色代码就像普通医疗的整形手术一样有效——它可能看起来不错,但并不能解决任何更深层次的问题。
糟糕的代码是有代价的,写好的代码并没有那么复杂
medium.com](https://medium.com/better-programming/the-art-of-refactoring-5-tips-to-write-better-code-3bc1f6f7689)
另一方面,你也不想让你的代码太乱。太多的混乱会使你的代码不可维护。缺乏维护会导致代码腐烂,从长远来看,项目会被丢弃,因为它们弊大于利。
因此,我们需要的是快速结果和可维护代码之间的健康平衡。大多数开发人员都倾向于凌乱的一面,所以提高整洁度是一条可行之路。好消息是,一些好习惯可以对开发人员的整洁和生产力产生巨大的影响。
黑客 1:尽早并经常测试
一些开发人员对他们的技术非常有信心,以至于他们在没有运行测试的情况下构建了整个项目。但是,除非手头的任务完全无关紧要,否则就会适得其反。
一旦他们试图编译或执行程序,屏幕就会充满错误信息。或者,更糟糕的是,错误直到几个月后才被发现,这时用户才意识到程序没有按预期运行。
这些都是不好的做法。如果说在科技行业工作教会了你什么,那应该是这个:
如果你没有测试过所有的场景,千万不要认为某样东西能按预期工作。
尽快尝试构建一些可执行的东西。哪怕非常非常简单。一有机会就测试一下。这样,您就可以在错误一产生就修复它们。
诀窍 2:结构良好,格式草率
只要代码的底层结构良好,追求快速修复是没问题的。现实情况是,开发人员试图在结构混乱或过时的代码中实现快速修复。
在这种情况下,最好花时间重新构建代码。如果修复没有得到正确的注释,或者有一些模糊的变量名,那也不是世界末日。但是试图在错误的代码中构建一个干净的特性是浪费时间和资源——无论如何,你都可能不得不重写很多。
因此,在整洁和速度之间的一个好的折衷是保持底层结构的整洁和更新,并且在细节上尽可能的整洁。
把魔鬼藏在细节里。阿尔瓦罗·雷耶斯在 Unsplash 上拍摄的照片
黑客 3:为重构分配时间
每当你变得混乱,你就在制造技术债务。就像货币债务一样,你拖得越久,它就变得越昂贵。
另一方面,花几天甚至几周的时间清理代码对普通开发人员来说听起来并不怎么鼓舞人心。这就是为什么建立一个每天偿还一点债务的惯例是有用的。
一个好的开始方法是每天用 15%的时间进行重构。我称之为时间法则。您会惊讶于您可以改进多少代码!
列出了八种代码气味,所以您可以避免它们
medium.com](https://medium.com/better-programming/what-is-it-that-makes-your-code-smell-f9c96ac93ba2)
黑客 4:留下比你发现的更干净的代码
我称之为厕所规则。如果每个人离开公共浴室时至少保持他们发现的清洁,他们将处于一种无可挑剔的状态。
从大多数公共厕所的状况来看,现实并非如此。遵守这样的规则需要每个开发人员的纪律,这反过来又需要一个优秀的经理。
但这种纪律是值得的,因为随着时间的推移,回报会是巨大的。你不能通过做不可能的事情来实现不可能——你只能通过做一些好的决定,每天朝着这些决定迈出一小步来实现。
黑客 5:请求评论!
有时,代码很混乱,因为开发人员不知道如何做得更好。例如,一个代码可能会使用 switch 语句,这样映射就容易多了。在这种情况下,高级开发人员的建议是关键。
建立一个常规的代码审查可以帮助创建一个反馈循环。这将改善年轻开发人员的学习曲线,并培养健康讨论的文化。
就像如厕规则和时间规则一样,常规是关键。要求评审应该是初级开发人员的习惯,而给出建议应该是高级开发人员工作中不可或缺的一部分。
理想情况下,评审时间应该是开发团队核心流程的一部分,关键建议的总结应该是每次会议的一部分。
平衡结构和混乱
过多的清洁会浪费时间和资源。写草率的代码要比遇到编码器阻塞而不交付好得多。
另一方面,草率的代码缺乏灵活性,难以维护。这五条规则将有助于在不浪费时间的情况下,使您的代码更加清晰。正如生活的每一部分一样,美好的事物都是在结构和混乱的健康平衡中产生的。
关于 Python 类和库,数据科学家需要知道的四件事
我从来没有机会在教室里学习 Python。而是通过自学,学会了编程语言。没有系统地学习编程语言的一个缺点是,有时我不能完全理解其他人的 Python 代码,我可能无法充分利用 Python 编程的特性。在这里,我将总结一下关于 Python 类和库的四件事,这四件事曾经让我很困惑。希望这对你学习 Python 有帮助!
1.调用内部变量和函数的类
在 Python 类中,_ _ init _ _ 方法需要显式传递 self 参数。此外,如果一个函数需要使用在同一个类中定义的内部变量或函数,self 参数也需要显式传递给那个函数。
2.定义具有多个输入参数的类
Python 允许通过使用 arg,*args 和kwargs 来定义具有多个输入参数的类。*args 接受无关键字的可变长度参数列表,而kwargs 接受有关键字的可变长度参数列表。下面我们来看一个例子。
Multiple_constructor(1, 2, 3, 4, a='a',b='b')
输出:
arg1: 1,arg2: 2
args: (3,4)
args: {‘a’: ‘a ‘,’ b’: ‘b’}
Multiple_constructor(1, 2, a='a',b='b')
输出:
arg1: 1,arg2: 2
没有*args 传入
args: {‘a’: ‘a ‘,’ b’: ‘b’}
Multiple_constructor(1, 2)
输出:
arg1: 1,arg2: 2
无*args 传入
无**kwargs 传入
Multiple_constructor(1)
输出:
init()缺少 1 个必需的位置参数:“arg2”
3.重用模块
通常,我们希望在其他程序中重用类或函数。其实 Python 库是一种代码复用的方式。在下面的例子中,我将展示如何在 main.py 文件中重用 moduleA 和 moduleB。
重用 moduleA 很简单。由于 moduleA.py 与 main.py 在同一个文件夹中,所以 moduleA 可以直接导入到 main.py 中。
由于 moduleB 位于子文件夹中,我们需要先将 moduleB.py 的相对路径添加到系统中。然后我们可以在 main.py 中导入 moduleB。
moduleA.py 和 moduleB.py 在 main.py 中重用
输出:
你好爱丽丝!你好鲍勃!
4.if name == 'main ’
name 是一个特殊的 Python 变量。如果直接运行当前文件,name = 'main '。但是,如果导入了当前文件,name = fileName。
if name=='main ’ '是控制是否在此 if 测试中运行代码的一种方式。当直接运行当前文件时,将运行 if 测试中的代码。但是,当当前文件被其他文件导入时,if 测试中的代码将不会运行。通过这种方式,Python 允许根据文件是直接运行还是导入来灵活地控制是否运行代码。
输出:
文件 1 在 if name=='main '测试之前是 _ _ main _ _
文件 1
文件 1 在 if _ _ name _ _ = ’ _ _ main _ _ '测试之后直接运行
文件 1
输出:
文件 1 是文件 1
文件 1 之前 if _ _ name _ _ = ’ _ _ main _ _ '测试
文件 1 导入
文件 1 之后 if _ _ name _ _ = ’ _ _ main _ _ '测试
文件 2 是 main
文件 2 之前 if _ _ name _ _ = ’ _ _ main _ _ '测试
文件 2 直接运行
文件 2 之后 if _ _ name _ _ = ’ _ _ main _ _ '测试
结论
在这篇短文中,我讨论了 Python 类和库的四个重要方面。作为一种面向对象的编程语言,Python 允许灵活使用类和库。通过包含一些代码示例,希望您对这四个 Python 概念有更清晰的理解!
在 Python 中探索数据的四个有用函数
在 Python 中探索和可视化数据
瓦伦丁·安托努奇在的照片
在探索数据的过程中,我经常发现自己重复定义类似的 python 逻辑,以便执行简单的分析任务。例如,我经常计算数据中特定类别的数字列的平均值和标准偏差。我还经常分析数据中分类值的频率。为了节省时间,我编写了一些函数,允许我在不重写太多代码的情况下进行这种类型的分析。
在这篇文章中,我将分享我在模型构建的探索性数据分析步骤中经常使用的四个有用的函数。然后我将展示我们如何使用这些函数来探索葡萄酒评论数据集。数据集可以在这里找到。该文件夹包含三个。csv 文件。我将使用名为“winemag-data_first150k.csv”的文件。
我们开始吧!
- 计数器
我将讨论的第一个函数允许我们查看分类值在数据集中出现的频率。它接受数据帧、列名和限制作为输入。当被调用时,它打印分类值的字典以及它们出现的频率:
def return_counter(data_frame, column_name, limit):
from collections import Counter print(dict(Counter(data_frame[column_name].values).most_common(limit)))
让我们打印数据集的前五行:
import pandas as pd
df = pd.read_csv('winemag-data_first150k.csv')
print(df.head())
我们可以看到有几个分类列。让我们将函数应用于“国家”列,并将结果限制在五个最常见的国家:
return_counter(df, 'country', 5)
我们可以看到大部分的葡萄酒记录都对应于美国生产的葡萄酒。
让我们将函数应用于“品种”列:
return_counter(df, 'variety', 5)
大多数葡萄酒是夏敦埃酒和黑皮诺酒。这是一个有用的快速测试,可以查看数据中是否有任何明显的不平衡,这通常是建模时要处理的一个关键问题。
2.汇总统计
下一个函数是汇总统计函数(有点类似于 df.describe())。该函数采用一个数据帧、一个分类列和一个数字列。每个类别的数字列的平均值和标准偏差存储在数据框中,并且数据框根据平均值以降序排序。如果您想要快速查看特定类别对于特定数字列是否具有更高或更低的平均值和/或标准偏差值,这将非常有用。
def return_statistics(data_frame, categorical_column, numerical_column):
mean = []
std = []
field = []
for i in set(list(data_frame[categorical_column].values)):
new_data = data_frame[data_frame[categorical_column] == i]
field.append(i)
mean.append(new_data[numerical_column].mean())
std.append(new_data[numerical_column].std())
df = pd.DataFrame({'{}'.format(categorical_column): field, 'mean {}'.format(numerical_column): mean, 'std in {}'.format(numerical_column): std})
df.sort_values('mean {}'.format(numerical_column), inplace = True, ascending = False)
df.dropna(inplace = True)
return df
我们可以查看“品种”和“价格”的汇总统计数据:
stats = return_statistics(df, ‘varieties’, ‘prices’)
print(stats.head())
麝香葡萄品种的平均价格最高。
我们可以为国家做同样的事情:
stats = return_statistics(df, ‘countries’, ‘prices’)
print(stats.head())
英国的平均价格最高。
3.箱线图
下一个函数是 boxplot 函数。我们使用箱线图来显示基于最小值、最大值、中值、第一个四分位数和第三个四分位数的数值分布。如果你对它们不熟悉,可以看看文章了解盒子情节。
与汇总统计函数类似,此函数采用数据框、分类列和数值列,并根据限制显示最常见类别的箱线图:
def get_boxplot_of_categories(data_frame, categorical_column, numerical_column, limit):
import seaborn as sns
import matplotlib.pyplot as plt
keys = []
for i in dict(Counter(df[categorical_column].values).most_common(limit)):
keys.append(i)
print(keys)
df_new = df[df[categorical_column].isin(keys)]
sns.boxplot(x = df_new[categorical_column], y = df_new[numerical_column])
让我们为 5 个最常见的国家的葡萄酒价格绘制箱线图:
get_boxplot_of_categories(df, 'country', 'price', 5)
正如我们所见,在所有五个国家类别中,葡萄酒价格都有明显的异常值。我们可以对“多样性”做同样的事情。为了更好地可视化,我将类别值限制为三个国家:
get_boxplot_of_categories(df, 'variety', 'price', 3)
4.散点图
最后一个函数是散点图函数。此函数将一个数据框、分类列、分类值和两个数字列作为输入,并显示一个散点图:
def get_scatter_plot_category(data_frame, categorical_column, categorical_value, numerical_column_one, numerical_column_two):
import matplotlib.pyplot as plt
import seaborn as snsdf_new = data_frame[data_frame[categorical_column] == categorical_value]
sns.set()
plt.scatter(x= df_new[numerical_column_one], y = df_new[numerical_column_two])
plt.xlabel(numerical_column_one)
plt.ylabel(numerical_column_two)
让我们制作一个美国葡萄酒点数与价格的散点图:
get_scatter_plot_category(df, 'country', 'US', 'points', 'price')
价格和奖励积分之间似乎存在轻微的正相关关系。我就讲到这里,但是请随意处理数据并自己编码。
概括地说,在这篇文章中,我回顾了我在探索性数据分析过程中经常使用的四个有用的函数。我回顾了分析数据的方法,包括用箱线图和散点图可视化数据。我还定义了生成汇总统计数据的函数,比如平均值、标准差和分类值的计数。我希望这篇文章是有帮助的。
这篇文章的代码可以在 GitHub 上找到。感谢您的阅读!
团队在 Kaggle 上获胜的四种方式
框架、多重处理、云以及更大的团队
Kaggle 是最好和最差的机器学习的家园。这是成千上万个团队的战场,他们争相建立最佳模型,在最后期限内解决现实世界的问题,赌注是几十万美元。在大型数据集上训练这些世界级的模型通常需要数百个计算小时。在本帖中,我们将探索获胜团队使用的一些技巧以及如何加快速度。
[图片来源】
#1 —使用顶层框架
有时 Kaggle 上的竞争会导致模型无法复制或者彻头彻尾的欺诈。但其中一些竞争为整个行业设立了新的标准。Kaggle 是机器学习成为焦点并取得巨大进展的地方。世界上最好的模型构建框架受到 Kaggle 竞赛的启发并围绕其构建。
获胜——团队从他们的工具中榨出每一分每一毫的绩效。当工具不够好或不够快时——更好的工具就会被制造出来。这方面的例子有流行的梯度增强库:
- 2014—XGBoost—【github】【论文】—2015 年 Kaggle 比赛期间,29 个获奖方案中有 17 个方案使用了 XGBoost 。
- 2017—light GBM(LGBM)—【github】【paper】—由微软开发,比 XGBoost 快 20 倍,但并不总是那么准确。这个库是 2019 年 Kaggle 上流行内核的默认选择。
- 2017—CatBoost—【github】【论文】 —没有 LightGBM 常用,但在利用分类列的中可以有优势。
竞赛获胜者经常结合多个模型构建库来稍微提高性能。关于这些梯度增强框架的深入比较,请参见本文。许多竞赛获胜者也使用 Keras 库,尽管它最初的设计并没有考虑到 Kaggles。
上面的图片来自 Keras 图书馆的作者 Franç ois Chollet 的一条推文。在这条线索中,他指出:
赢家是那些经历了“进步循环”的“更多迭代”的人——从一个想法,到它的实施,再到可操作的结果。所以获胜的团队就是那些能够跑得更快的团队。
#2 —利用多重处理
为了获胜,Kaggle 团队需要在有限的时间内测试尽可能多的想法。对于千兆字节的数据,每次迭代都以小时为单位。有许多参数可以调整,使训练过程更短。但是,为了优化排行榜分数,训练必须“进行到 11”。考虑到需要许多小时的计算,自然的优化是并行化。
在 Python 中,由于全局解释器锁(GIL),使用线程来并行化工作通常是没有意义的。Kaggle 上流行的框架都在内部进行了多线程优化,以利用多个内核将训练时间减少 10 倍。他们还可以利用 GPU 将训练速度提高10 倍。但是,测试许多超参数和特征组合意味着进一步增加工作量。仅仅是加载数据就可能非常耗时,以至于一些团队使用多重处理来应对这种情况,如下所示:
files = ['../input/test_identity.csv',
'../input/test_transaction.csv',
'../input/train_identity.csv',
'../input/train_transaction.csv',
'../input/sample_submission.csv']def load_data(file):
return pd.read_csv(file)with multiprocessing.Pool() as pool:
test_id, test_tr, train_id, train_tr, sub = pool.map(load_data, files)
多重处理本身可以在强大的机器上本地工作。不幸的是,我的 MacBook 有点温顺。最重要的是,繁重的任务完全消耗了我的机器资源。后台任务繁重,即使阅读电子邮件也变得缓慢而痛苦。
#3 —云上的多重多处理
启动一台机器来运行一个可能需要一个多小时才能返回的函数可能是值得的。让机器运转几个小时来实现多种功能尤其有用。有很多方法可以获得一台机器来完成工作,比如使用 AWS Fargate、Google Cloud Run 和其他提供商。在 XGBoost 分布式培训教程中有一些这样的例子。
使用云时要考虑的权衡是速度、成本和设置一切的复杂程度。下面的代码片段使用了dismap,它提供了对multiprocessing.Pool()
的替换,所以它非常简单。map 中的每次迭代可能会发现自己在不同的机器上,而我们的主机只会等待结果。
def pow3(x):
print (x**3)
return (x**3)
with discomp.Pool() as po:
results = po.map(pow3, range(10))
print(results)
# prints [0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
虽然这个例子很简单,但是您可以推断出可以做什么。对于更完整的场景,您可以看到我如何使用 XGBoost 在信用卡欺诈数据集中比较不同超参数配置的性能。使用传统的map
呼叫测试 30 组参数需要 82 分钟,使用multiprocessing.Pool().map
需要 35 分钟,使用discomp.Pool().map
需要 9 分钟。使用云机器,我可以以 9 倍的速度运行测试。使用云确实要花钱,所以它并不是适合所有人的解决方案。有点像这艘船。
[图片来源
#4 —更大的团队
通常较大的团队在 Kaggle 上有优势,因为每个团队成员都用不同的参数和库探索不同的特性和不同的模型。团队中的每个人也将贡献自己的计算资源。最后,所有的模型将被组合成一个集合平均值,它往往比每个单独的模型表现得更好。要更深入地分析团队规模趋势,请查看本笔记本。
优化时间
在 Kaggle 中,给你的是带标签的数据,所以机器学习中的一个大问题已经解决了。所有竞争者剩下要做的就是预处理,选择正确的模型,使用最好的软件包,设计最好的特性和确定最好的参数。这仍然是一项很少有人擅长的艰巨任务。一个团队可以测试的组合数量直接受限于他们周期的持续时间以及他们可以在多少台机器上运行它们。幸运的是,现在有许多选择可以节省时间并获得计算资源。请告诉我你是否觉得这些技巧有用,或者只是在 twitter 上打个招呼。
根据数据值集合过滤 Spark 数据集的四种方法
Ref: Pixabay
实践教程,SPARK 执行指南
根据数据值集合过滤 Spark 数据集是许多数据分析流程中经常遇到的问题。这个特别的故事将解释四种不同的方法来达到同样的目的。
假设有一个非常大的数据集“A ”,其模式如下:
root:
| — empId: Integer
| — sal: Integer
| — name: String
| — address: String
| — dept: Integer
数据集“A”需要根据一组员工 id(empid)、“B”(可以广播给执行者)进行过滤,以获得过滤后的数据集“A”。过滤操作可以表示为:
A` = A.filter(A.empId contains in 'B')
为了实现这种最常见的过滤场景,您可以在 Spark 中使用四种类型的转换,每一种都有其优缺点。这里描述了使用所有这四种转换来执行这个特定的过滤场景,并详细说明了每种转换的可靠性和效率。
**Filter:**Filter transformation(在布尔条件表达式或布尔返回过滤函数上过滤数据集记录),在数据集上,可以用以下方式:
1\. Dataset<T> A` = A.filter(Column condition)
2\. Dataset<T> A` = A.filter(FilterFunction<T> func)
3\. Dataset<T> A` = A.filter(String conditionExpr)
对于筛选场景,如前所述,可以对“A”使用“Filter”转换,将“FilterFunction”作为输入。对相应数据集的分区中包含的每个记录调用“FilterFunction ”,并返回“true”或“false”。在我们的过滤场景中,将对数据集“A”的每个记录调用 FilterFunction,并检查记录的“empId”是否存在于广播的 empId 集“B”中(“B”由相应的哈希表支持)。
不管数据集“A”的大小如何,如上所述的过滤器变换的使用都是非常简单、健壮和有效的。这是因为,转换是逐记录调用的。此外,由于所广播的 empIds 组由执行器上的哈希表支持,所以在过滤函数中对每个记录的过滤查找保持有效。
**映射:**映射转换(对数据集的每条记录应用一个函数,以返回空的、相同的或不同的记录类型),在数据集上以下列方式用于:
Dataset<U> A` = A.map(MapFunction<T,U> func, Encoder<U> encoder)
对于过滤场景,如前所述,可以对“A”使用“Map”转换,将“MapFunction”作为输入。在我们的过滤场景中,将对数据集“A”的每个记录调用“MapFunction ”,并检查记录的“empId”是否存在于广播的 empId 集“B”中(由相应的哈希表支持)。如果记录存在,MapFunction 将返回相同的结果。如果记录不存在,将返回 NULL 。此外,MapFunction 的编码器输入将与数据集“A”的相同。
尽管‘Map function’的语义类似于‘Filter function ’,但是对于过滤场景,如上所述的‘Map’转换的使用与直接‘Filter’转换方法相比并不简单和优雅。必须在转换中明确提供额外的编码器输入。此外,在调用“Map”转换后,需要过滤输出中的空值,因此,“Map”方法不如“Filter”方法有效。然而,该方法的可靠性类似于“过滤”方法,因为无论“A”的大小如何,它都不会出现问题。这是因为,“映射”转换也是逐记录调用的。
map partitions:map partitions转换(在数据集的每个分区上应用一个函数,返回 null 或迭代器到相同或不同记录类型的新集合),在数据集上,以下面的方式使用:
Dataset<U> A` = A.map(MapPartitionsFunction<T,U> func, Encoder<U> encoder)
对于筛选方案,如前所述,还可以对“A”使用“MapPartitions”转换,该转换将“MapPartitionsFunction”作为输入。在我们的过滤场景中,将在数据集“A”的每个分区上调用“MapPartitionsFunction ”,迭代该分区的所有记录,并检查每个记录,如果记录的“empId”存在于广播的 empId 集“B”中(由相应的哈希表支持)。在记录存在的情况下,相同的记录将被添加到在“MapPartitionsFunction”中初始化的可返回集合中。最后,从“MapPartitionsFunction”返回可返回集合的迭代器。
与“映射”和“过滤”方法相比,“映射分区”方法通常更有效,因为它是分区方式操作,而不是记录方式操作。然而,与“映射”类似,必须在转换中明确提供编码器输入。此外,在数据集‘A’的某些分区的大小超过为执行每个分区计算任务而提供的存储器的情况下,‘map partitions’方法可能变得非常不可靠。这是因为更大的分区可能导致潜在的更大的可返回集合,从而导致内存溢出。
内连接:内连接转换应用于两个输入数据集,A & B,采用的方式:
Dataset<Row> A` = A.join(Dataset<?> B, Column joinExprs)
对于筛选场景,如前所述,还可以对“A”使用“内部连接”转换,该转换根据连接条件连接“B”的数据集表示(A.empId 等于 B.empId ),并从每个连接的记录中只选择“A”的字段。
“内部连接”方法返回一般“行”对象的数据集,因此需要使用编码器将其转换回 A 的记录类型的数据集,以匹配精确的过滤器语义。然而,类似于“过滤”方法,“内部连接”方法是有效和可靠的。效率来自于这样一个事实,因为“B”是可广播的,Spark 将选择最有效的“广播散列连接”方法来执行连接。此外,可靠性来自于“内部连接”方法适用于“A”的大型数据集,就像“过滤”方法一样。
考虑到所有的方法,从可靠性和效率的角度来看,我会选择“过滤”方法作为最安全的选择。此外,要注意的是,“过滤器”方法还允许我以类似的效率和健壮性执行反搜索,这是“内部连接”所不允许的。
如果对这个故事有反馈或疑问,请写在评论区。我希望,你会发现它有用。这里是我在 Apache Spark 上的其他综合报道的链接。 *还有,*拿一份我最近出版的关于 Spark Partitioning 的书:《Spark Partitioning 指南: 深入讲解 Spark Partitioning》
傅立叶变换和图像的床单视图。
约翰·汤纳在 Unsplash 上拍摄的照片
开发傅立叶变换工作原理背后的直觉。
傅立叶变换是做什么的?傅立叶模式代表什么?为什么傅立叶变换在数据压缩方面是出了名的受欢迎?这些是本文旨在用一个有趣的类比来表示图像的问题。
图像是数字绘画。它们由不同的特征组成。有些功能需要非常精确地控制笔刷,比如在狗身上画胡须。其他的可以用粗画笔快速填充,像清澈的蓝天。所有图像都是不同程度的精细和暗淡特征的组合,即高频和低频特征。
让我们花点时间来理解频率是如何进入我们的分析的。想象正弦波经过半个周期。它慢慢上升,达到最大值,然后慢慢减小。正弦的频率越高,波就越窄。
想象一个被诅咒的画家,他只能用笔尖是半波正弦的画笔画画。如果他要画一个精致的特征,比如狗的胡须,他会选择一个正弦频率高的笔刷,即一个窄尖的笔刷。类似地,如果他要画一个没有任何细节的晴朗的天空,他会选择低频率的笔刷,也就是说,一个厚一点的笔刷。
频率越高,峰值越窄。
令人惊讶的是,所有现存的图像就像被诅咒的画家的作品一样。值得注意的是,傅立叶表明每一幅图像(信号)都可以分解成一系列复杂的项,其中每一项都有一个数值。幅度被称为傅立叶系数。将图像分解成各种正弦项及其幅度的整个过程称为傅立叶分解。傅立叶级数是一种更普遍的情况,其中要分解的信号是周期性的。傅立叶变换是信号具有无限时间周期,即非周期性的特殊情况。
完成上述分解的一种优雅而快速的算法是快速傅立叶变换,它可以说是 21 世纪将要开发的最重要的算法。它在蜂窝通信、卫星、电影、电视等领域有着深远的应用。
为了形象化图像的弯曲性质,绘制图像的大小,就像绘制表面图一样,并观察轮廓的俯视图,这将是很有趣的。这个想法是由华盛顿大学的史蒂文·布伦顿博士提出的。
图像的曲折性质清晰可见。高频特征作为窄峰清晰可见。这些包括眼睛、面部结构的轮廓和人手的轮廓。低频特征通常是均匀颜色的巨大延伸,在背景中观察到。这些包括大面积的黑色皮毛和背景。
下面是复制先前结果的简单代码。
制作表面情节动画的源代码包含在我的 Github 中,在这里!
这被称为图像的床单视图。这个名字背后的想法是,如果四个人拿着一张床单的每一边,并开始以相应的幅度在一个傅立叶频率下振荡,并且对于无限傅立叶模式中的每一个都存在四个人的类似设置,那么所有床单的叠加将导致物理上的折痕,看起来像上面的图像。因此得名,床单观!
好了,现在有了一个好的直觉来理解傅立叶变换能做什么,这是一个很好的练习来正式回顾这些想法。离散信号的傅里叶分解方程如下:
这里,xn 是时间 N 处的信号值,Xk 是每个频率 k 的傅立叶系数,N 是信号样本的总数(即记录信号的离散时间步长的数量)。FFT 算法返回每个频率的 Xk 值。使用欧拉公式可以将复指数分解为正弦和余弦。这为迄今为止开发的直觉提供了一个健全的检查。
例如,让我们用多个频率构建一个正弦信号。比方说,频率为 50、100 和 200 赫兹的正弦信号以不同的比例组合而成。周期性质仍然可见,但通过在时域中可视化信号来理解原始频率成分确实很难。
傅立叶变换有助于直观地显示频域中的信号。因此,对上述信号进行傅立叶分解,我们可以得到下面的图。
混合物在 50、100 和 200 Hz 下的真实频率在频域中显示出预期的峰值。值得注意的是,FFT 算法也可以给出每个频率分量的权重,而不需要信号的任何先验知识。
啊,是的!臭名昭著的单线 FFT 命令。在 MATLAB 中,就更简单了,不需要任何导入,只需要 fft()。
现在回到图像的单页视图,每张图片都是可以应用傅立叶分解的二维信号。如果获取图像的一部分,它将类似于我们示例中的时域信号,但具有自己的频率成分。床单的看法是强大的开发直觉背后的一个图像可以是一个简单的信号,在时域,与多维度。
一般来说,信息密集区由高频项组成,而均匀的平坦区域由低频项组成。傅立叶的天才在于推导加权模式(或频率-幅度对)。这为理解构成图像的最重要的模式提供了一个思路。事实证明,帕累托法则在这里是成立的,只有极少数的模式包含了图像的大部分信息。这个原则对数据压缩至关重要。通过忽略大多数模式,我们可以减小图像的大小。然而,图像质量只是略有下降。
如果你有兴趣更深入地了解傅立叶变换如何用于数据压缩,或者理解为什么数据是可压缩的,首先,查看我的前一篇文章。像往常一样,联系我继续对话,或者向我提供一些关于内容的反馈。
FP 增长——用 Python 实现数据挖掘中的频繁模式生成
在大项目集中挖掘关联规则的强大算法!
介绍
在前一篇文章中,我们已经介绍了 Apriori 算法,并指出了它的主要缺点。在本文中,我们将展示一种叫做 FP 增长算法的高级方法。我们将介绍 FP 增长算法的整个过程,并解释为什么它比 Apriori 算法更好。
[## Apriori:关联规则挖掘的深层解释及 Python 实现
关联规则挖掘是一种识别不同项目之间潜在关系的技术。方法有很多…
towardsdatascience.com](/apriori-association-rule-mining-explanation-and-python-implementation-290b42afdfc6)
为什么好?
让我们回忆一下上一篇文章,Apriori 算法的两个主要缺点是
- 候选项目集的大小可能非常大
- 计数支持的高成本,因为我们必须一遍又一遍地扫描项目集数据库
为了克服这些挑战,Fp 增长的最大突破是
不需要候选人生成!
Apriori 的所有问题都可以通过利用 FP 树来解决。更具体地说,项集大小将不再是一个问题,因为所有的数据将以一种更紧凑的方式存储。此外,没有必要一遍又一遍地扫描数据库。相反,遍历 FP 树可以更有效地完成同样的工作。
FP 树
FP 树是整个 FP 增长算法的核心概念。简单来说,FP 树就是项目集数据库的压缩表示。树结构不仅在数据库中保留项目集,而且跟踪项目集之间的关联
该树是通过获取每个项目集并一次一个地将其映射到树中的路径来构建的。这个建筑背后的整个想法是
更频繁出现的项目将有更好的机会共享项目
然后我们递归地挖掘树来得到频繁模式。模式增长,算法的名字,是通过连接从条件 FP 树生成的频繁模式来实现的。
忽略树上的箭头。图片作者。
FP 增长算法
请随意查看评论良好的源代码。这真的有助于理解整个算法。
pip 安装 fpgrowth_py,然后像使用 git clone git clone 一样使用它来获得此回购的副本…
github.com](https://github.com/chonyy/fpgrowth_py)
FP 增长如此高效的原因是这是一种分而治之的方法。我们知道,有效的算法必须利用某种数据结构和高级编程技术。它实现了树、链表和深度优先搜索的概念。这个过程可以分为两个主要阶段,每个阶段又可以进一步分为两步。
阶段 1: FP 树构建
第一步:清洁和分类
对于每个事务,我们首先删除低于最低支持的项目。然后,我们按照频率支持降序对项目进行排序。
图片作者。
第二步:构建 FP 树,标题表包含已清理的项目集
遍历清理后的项集,一次映射一个到树中。如果分支中已经存在任何项目,则它们共享同一个节点,并且计数递增。否则,该项将位于创建的新分支上。
标题表也是在这个过程中构建的。交易中每个独特的项目都有一个链表。使用链表,我们可以在短时间内找到项目在树上的出现,而无需遍历树。
来源:https://www . researchgate . net/figure/An-FP-tree-and-its-header-table-15 _ fig 1 _ 280940829
阶段 2:挖掘主树和条件 FP 树
步骤 1:将主 FP 树分成条件 FP 树
从每个频繁 1-模式开始,我们用 FP 树中的前缀集创建条件模式基。然后,我们使用这些模式库,以与阶段 1 完全相同的方法来构造条件 FP 树。
步骤 2:递归挖掘每个条件树
频繁模式从条件 FP 树中生成。为一个频繁模式创建一个条件 FP 树。我们用来挖掘条件树的递归函数接近深度优先搜索。它确保在继续之前,没有更多的树可以用剩余的项目来构建。
让我们仔细看看下面的过程
图片作者。
同级别同颜色。算法工作流程如下所示
- 检查第一个 1-频繁模式“a”
- 获取粉红色的“a”的条件 FP 树
- 挖掘粉红色的树,深入到第二层
- 检查粉色树上的“f ”,发现没有更多的树可以构建
- 在粉红色的树上勾选 c
- 开采黄树,深入到第 3 层
Python 实现
FP 增长函数
乍一看这个 FP growth 主函数,你可能会对它的两个部分产生疑问。
为什么要为项目集和频率使用单独的列表,而不是创建一个字典?
原因是 Python 字典中的键必须是不可变的,所以我们不能把 set()作为键。然而,不可变版本的 set, frozenset 是可以接受的。不幸的是,由于这些项目的顺序在 FP 增长算法中至关重要,我们无法在转换到 frozenset 后保留顺序。对此的唯一解决方案是将其存储在单独的列表中。
为什么在 mineTree 函数中不把 FP 树作为输入变量?
这就是表头的威力。因为我们已经在标题表中存储了所有的事件,所以没有必要将根节点传递给函数。利用表上的链表,我们可以快速找到树上的项目。
树形结构
对于 itemset 列表,我们首先创建一个半空的标题表,其中只包含项目及其频率。我们遍历每个项目集,按照频率降序对项目进行清理和排序。然后,我们通过从清理的项目集中逐个传递项目来更新树。
如果项目已经存在于树中,我们只需增加计数。否则,我们用该项创建一个新的分支,并将其附加到父节点。这里要做的一个重要步骤是更新标题表,因为出现了新的条目。将新出现的链接到标题表中的链接列表。
树木开采
矿井树
从 1-频繁模式出发,我们找到所有的前缀路径,并用它构造条件模式库。对于条件模式基,使用与上面完全相同的 constructTree 函数来构建树。如果这棵树能被成功构建,我们会更深入,开始研究这棵树。这是递归发生的地方。
还记得我提到过为每个频繁模式构建一个条件树吗?你可以在线 8 上看到图案生长。
查找前缀路径
获取该项在树上的第一个匹配项,它是表头链表的头节点。然后,遍历树直到根,以获得前缀路径。之后,我们转到链表中的下一个节点,重复遍历。
上升 FP 树
用自递归来提升树。继续追加项目并调用自身,直到它到达根。
比较
FP 增长与先验
图片作者。
我已经组织了两种算法的主要特征,并把它制作成上表。通过观察表格,我们可以知道,在大多数情况下,FP 增长通常比先验增长好。这就是为什么 Apriori 只是一个基本方法,FP Growth 是对它的改进。
具有不同最小支持的运行时
图片作者。
我们从 源代码回购 中取数据集,尝试一些实验。我们做的第一件事是检查最小支持如何推断运行时间。
从图中我们可以看出,FP 的增长总是比 Apriori 快。原因已经在上面解释过了。一个有趣的观察是,在两个数据集上,apriori 的运行时间在一个特定的最小值后开始快速增加。另一方面,FP 增长的运行时间仅仅受到值的干扰。
运行时有不同数量的交易
图片作者。
两种算法的运行时间都随着项目集数量的增加而增加。然而,我们可以清楚地看到,先验增加的斜率要高得多。这意味着与 Fp 增长相比,Apriori 算法对项集大小更敏感。
升序与降序
您可能想知道为什么在使用它构建树之前,我们必须按照频率降序对项目进行排序。如果用升序试试会怎么样?从图中可以看出,降序排序总是更快。而且支撑越低速度的差别越明显。
图片作者。
但是为什么呢?我想给出一些我自己的假设。让我们回忆一下 FP 增长的核心概念
更频繁出现的项目将有更好的机会共享项目
从支持度较高的物品开始,共享分支的可能性会较高。共享的分支越多,树的大小就越小。树越小,运行整个算法的成本就越低。因此,按降序对项目进行排序会使该方法运行得更快。
结论
我想分享一个有趣的故事。当我下班后写这篇文章时,一个全职工程师走过,他看到我正在写一些关于先验和 Fp 增长的东西。他说,“有趣,但不现实”他进一步解释说,这种算法不考虑称重。例如,有多个相同项目的交易怎么办?还有更微妙的条件没有包含在这个算法中。这就是为什么公司不会在他们的业务中实现这一点。
源代码
pip 安装 fpgrowth_py,然后像使用 git clone git clone 一样使用它来获得此回购的副本…
github.com](https://github.com/chonyy/fpgrowth_py)
以前的帖子
[## Apriori:关联规则挖掘的深层解释及 Python 实现
关联规则挖掘是一种识别不同项目之间潜在关系的技术。方法有很多…
towardsdatascience.com](/apriori-association-rule-mining-explanation-and-python-implementation-290b42afdfc6)
PyPi 包
pip 安装 fpgrowth_py,然后像使用 git clone git clone 一样使用它来获得此回购的副本…
pypi.org](https://pypi.org/project/fpgrowth-py/)
医疗保健中的欺诈检测
使用表格即识别可疑的医疗服务提供者
engin akyurt 在 Unsplash 上拍摄的照片
你知道吗,在美国,数十亿美元花费在欺诈、浪费和滥用处方药上。
此外,您是否知道只有 20%的医疗保健提供商承担了 80%的成本!?
你会问,我是怎么知道的?
TLDR :如何识别可疑的和可能有欺诈行为的医疗服务提供者?看看我的场景,即和我制作的解释这些场景的视频。
我曾经和美国一家主要的健康保险公司合作过。在广泛研究了绝密的患者索赔数据后(它受到严格的法律保护!)在多个项目中,我意识到的一件事是阿片类药物危机是真实存在的。即使我们把阿片类药物放在一边,欺诈性索赔的数量也是巨大的。然而,应该提到的是,我们通常所说的欺诈,实际上是欺诈、浪费和滥用(FWA)。而欺诈是故意和恶意进行的(咄!),浪费和滥用并不要求对不法行为有意图和知情。浪费是对资源的过度利用,而滥用是指提供者的做法与合理的财政、商业或医疗做法不一致。
无论如何,当目标是确定这样的医疗保健提供者时,我们面临一个问题:他们实在是太多了!
这就像大海捞针。更准确地说,这就像在一堆针中找到一根有缺陷的针。进入图形分析来拯救。使用 Tableau 仪表板,我将展示如何过滤提供者并识别可疑的提供者。通过这种方式,我们减少了搜索池的大小,从而使查找故障针变得容易。;)
但是数据在哪里呢?实际的患者索赔数据受到保护(称为 PHI,即受保护的健康信息),公众无法获得。但是我们可以凑合使用公共可用的医疗保健数据,这些数据是在提供者级别上汇总的,因此它不会识别患者。医疗保险和医疗补助服务中心在开处方者汇总表中提供此类数据。该数据包含每个提供者提供的处方的汇总详细信息,如阿片类药物、抗生素、品牌药物、仿制药,以及提供者的人口统计信息。
我确定了一些我认为在判断开处方者的欺诈行为时很重要的特征。
我应用了 k-means 聚类,并使用 KElbowVisualizer 来确定最佳聚类数,如下所示。
from yellowbrick.cluster import KElbowVisualizervisualizer = KElbowVisualizer(KMeans(init='k-means++'), k=(3,11))
visualizer.fit(X) # Fit the data to the visualizer
visualizer.show()
完整的代码可以在这个 colab 笔记本中看到。使用肘方法,我决定 5 是集群的最佳数量
我在数据帧中为每个处方者标记了他们的簇号。
看看我做的这个画面。它有三个视图来讲述一个故事,并帮助确定一些特定的可疑处方。
以下是三视图显示的内容:
美国整体医疗保健提供者/开处方者情景概述;这些图表还充当其他图表的过滤器,因此我们可以使用上面的两个图表在右下角的条形图中看到加利福尼亚去看牙医的患者的疾病水平。
第二个屏幕直观地解释了集群之间的差异;查看器可以选择使用下拉功能列表来更改指标,该列表给出了每个集群的前 3 个特性。可以明显看出,集群 4 确实是可疑的,因为它在所有类别中具有最高的成本。
最后,我们更深入地研究集群 4,以识别异常提供商。我们还可以选择任何其他集群来精确定位混淆的提供者。右侧的散点图提供了悬停在圆圈上的提供商的详细信息。最右边的提供者/处方者是产生高费用的人。当他们的患者风险评分低时,我认为他们是可疑的。
总之,仪表板的视图 1 旨在教育美国数据和整体医疗保健情况的分析师或查看者。在熟悉数据之后,在第二个视图中,我希望直观地传达所形成的集群和所使用的特征之间的差异。因此,观点 2 可以被认为是解释性的。在视图 3 中实现了识别一个或多个混杂或异常处方者的最终目标。正如在第三视图的最后一个图表中可以看到的,我们有一个简单的方法来确定潜在欺诈的开处方者。
所呈现的可视化的优势在于成功地实现了识别可疑处方者的主要任务。在这个过程中,分析师或观众还可以了解医疗保健领域数据的复杂性,如成本和患者风险评分。然而,这种方法的鲁棒性不能保证。
仍然需要领域专家来判断使用 viz 识别为可疑的开处方者是否是假阳性。
例如,通过可视化识别的开处方者可能是仅迎合高费用患者/病例的开处方者。这样的开处方者将通过建议的可视化被错误地识别。与此同时,可以认为,考虑到其他特征,精通医疗保健领域的分析师或观察者将能够判断开处方者实际上是否是混淆者。
在 LinkedIn 上与我联系
在 GitHub 上查看一些我感兴趣的项目
欺诈检测:问题、解决方案和工具
机器学习如何改变欺诈检测格局
瑞安·波恩在 Unsplash 拍摄的照片
1.1 问题的性质
什么是欺诈?有许多正式的定义,但本质上欺诈是一种“艺术”,是在金融交易中欺骗和诈骗人们的犯罪。欺诈在整个人类历史中一直存在,但在这个数字技术时代,金融欺诈的策略、范围和规模变得越来越广泛,从信用卡交易到健康福利再到保险索赔。欺诈者也变得越来越有创造力。谁从来没有收到过一个尼日利亚皇室寡妇的电子邮件,说她正在寻找一个值得信任的人来移交她的大笔遗产?
难怪欺诈是一件大事。由于欺诈性交易,商业组织的估计损失飙升至其收入的 4-5%。5%的欺诈听起来可能不算多,但从货币角度来看,这不是小事,远远超过不采取任何行动的成本。普华永道的一项调查发现,他们调查的 7200 家公司中有 50%是某种欺诈的受害者。FICO 最近的一项研究发现,接受调查的五分之四的银行经历了欺诈活动的增加,预计这种情况在未来还会增加。
尽管许多组织采取措施打击欺诈,但欺诈永远无法根除。我们的目标是将它的影响降到最低。这种筛选的好处必须与成本进行权衡,例如,欺诈检测技术的投资和由于“假阳性”警报而可能失去的客户。
因此,本文的目的是强调欺诈检测领域的一些工具、技术和最佳实践。最后,我将使用公开可用的数据集提供一个 python 实现。
1.2 个使用案例
欺诈无处不在——无论交易涉及到哪里——但信用卡欺诈可能是最广为人知的案例。它可以是简单的偷窃或使用偷来的卡,也可以是侵略性的形式,如账户接管、伪造和更多。信用卡欺诈一直存在,但由于每天通过信用卡进行的在线交易越来越多,其规模只是在最近有所增长。根据尼尔森报告2010 年,全球欺诈金额为 76 亿美元,预计 2020 年将突破 310 亿美元。仅在英国,2018 年欺诈交易损失估计超过10 亿美元。
保险行业还在发生其他类型的大欺诈案件。一些估计表明,美国多达 10%的健康保险索赔可归因于欺诈,这是一个不小的数字,每年高达 1100 亿美元。
2.1 数据科学解决方案
在过去(即机器学习成为趋势之前),标准做法是使用所谓的“基于规则的方法”。由于每个规则都有例外,这种技术只能部分缓解问题。随着越来越多的在线交易和大量客户数据的产生,机器学习越来越被视为检测和反欺诈的有效工具。然而,没有一个特定的工具,银弹,适用于每个行业的各种欺诈检测问题。在每个案例和每个行业中,问题的性质是不同的。因此,每个解决方案都是在每个行业的领域内精心定制的。
在机器学习中,用语欺诈检测通常被视为一个监督分类问题,其中根据观察结果中的特征将观察结果分类为“欺诈”或“非欺诈”。由于不平衡的数据,这也是 ML 研究中一个有趣的问题,即在极其大量的交易中很少有欺诈案例。如何处理不平衡的阶级本身是另一个讨论的主题。
欺诈也可以通过几种异常检测技术来隔离。离群点检测工具有自己解决问题的方式,如时间序列分析,聚类分析,实时事务监控等。
2.2 技术
**统计技术:**平均值、分位数、概率分布、关联规则
**监督 ML 算法:**逻辑回归、神经网络、时间序列分析
**无监督的 ML 算法:**聚类分析、贝叶斯网络、对等组分析、断点分析、本福特定律(异常数定律)
3.一个简单的 Python 实现
3.1 数据准备
对于这个简单的演示,我使用了一个流行的 Kaggle 数据集。
# import libraries
import pandas as pd
import numpy as np# import data
df = pd.read_csv("..\creditcard.csv")# view the column names
df.columns
数据集有 31 列。第一列“时间”是交易时间戳,倒数第二列“金额”是交易金额,最后一列“类别”指定交易是欺诈还是非欺诈(欺诈= 1,非欺诈= 0)。其余的列,“V1”到“V28”是未知变量,在公开数据之前进行了转换。
# number of fraud and non-fraud observations in the dataset
frauds = len(df[df.Class == 1])
nonfrauds = len(df[df.Class == 0])print("Frauds", frauds); print("Non-frauds", nonfrauds)## scaling the "Amount" and "Time" columns similar to the others variablesfrom sklearn.preprocessing import RobustScaler
rob_scaler = RobustScaler()df['scaled_amount'] = rob_scaler.fit_transform(df['Amount'].values.reshape(-1,1))
df['scaled_time'] = rob_scaler.fit_transform(df['Time'].values.reshape(-1,1))# now drop the original columns
df.drop(['Time','Amount'], axis=1, inplace=True)# define X and y variables
X = df.loc[:, df.columns != 'Class']
y = df.loc[:, df.columns == 'Class']
3.2 制作子样本
这是一个极度不平衡的数据集,所以我们需要通过所谓的欠采样进行子采样。
# number of fraud cases
frauds = len(df[df.Class == 1])# selecting the indices of the non-fraud classes
fraud_indices = df[df.Class == 1].index
nonfraud_indices = df[df.Class == 0].index# From all non-fraud observations, randomly select observations equal to number of fraud observations
random_nonfraud_indices = np.random.choice(nonfraud_indices, frauds, replace = False)
random_nonfraud_indices = np.array(random_nonfraud_indices)# Appending the 2 indices
under_sample_indices = np.concatenate([fraud_indices,random_nonfraud_indices])# Under sample dataset
under_sample_data = df.iloc[under_sample_indices,:]# Now split X, y variables from the under sample data
X_undersample = under_sample_data.loc[:, under_sample_data.columns != 'Class']
y_undersample = under_sample_data.loc[:, under_sample_data.columns == 'Class']
3.3 建模
## split data into training and testing set
from sklearn.model_selection import train_test_split# # The complete dataset
# X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 0)# Split dataset
X_train_undersample, X_test_undersample, y_train_undersample, y_test_undersample = train_test_split(X_undersample,y_undersample ,random_state = 0)## modeling with logistic regression#import model
from sklearn.linear_model import LogisticRegression
# instantiate model
model = LogisticRegression()
# fit
model.fit(X_train_undersample, y_train_undersample)
# predict
y_pred = model.predict(X_test_undersample)
3.4.模型验证
注意:不要使用准确性分数作为衡量标准。在一个具有 99.9%非欺诈观察的数据集中,您可能会在 99%的时间内做出正确的预测。混淆矩阵和精确度/召回分数是更好的度量。
# import classification report and confusion matrix
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrixclassification_report = classification_report(y_test_undersample, y_pred)
confusion_matrix = confusion_matrix(y_test_undersample, y_pred)print("CLASSIFICATION REPORT")
print(classification_report)
print("CONFUSION MATRIX")
print(confusion_matrix)
结束注意:
感谢您通读这篇文章。一个 Jupyter 笔记本连同 python 演示可以在GitHub repo中找到。可以通过Twitter或LinkedIn联系到我。
欺诈检测—无监督的异常检测
发现信用卡交易欺诈的 100%无人监管的方法
瑞安·波恩在 Unsplash 拍摄的照片
许多企业主最关心的问题之一是如何保护他们的公司免受欺诈活动。这种担忧促使大公司保存与他们过去的欺诈行为相关的数据,然而,无论是谁实施欺诈,目的都是不被发现,那么这种数据通常是未标记的或部分标记的。
在本文中,我们将讨论如何在信用卡交易数据集上发现欺诈,与大多数欺诈数据集不同,该数据集是完全标记的,但是,我们不会使用标签来发现欺诈。信用卡欺诈是指有人使用他人的信用卡或账户信息进行未经授权的购买或通过预付现金获取资金。信用卡诈骗不仅仅发生在网上;这也发生在实体店中。作为企业主,您可以通过识别支付环境中潜在的信用卡欺诈来避免严重的问题和不必要的宣传。
发现欺诈交易最常见的方法之一是随机选择一些交易,并要求审计员对其进行审计。这种方法非常不准确,因为欺诈交易的数量与正常交易的数量之间的关系接近 0.1%。
然后,我们的目标是利用机器学习来检测和防止欺诈,并使反欺诈者更加高效和有效。通常,有监督和非监督方法:
此外,还可以部署这些模型来自动识别未来已知欺诈模式/类型的新实例/案例。理想情况下,这种类型的机器学习算法的验证有时需要时间验证,因为欺诈模式会随着时间的推移而变化,但是为了简化本文,验证将被简化。
数据集
该项目使用了来自 Kaggle 的约 284000 笔信用卡交易的数据集。
标记为欺诈或真实的匿名信用卡交易
www.kaggle.com](https://www.kaggle.com/mlg-ulb/creditcardfraud)
数据集高度不平衡,正类(欺诈)占所有交易的 0.172%。它只包含作为 PCA 变换结果的数字输入变量。不幸的是,由于保密问题,原始特征和关于数据的更多背景信息没有被提供。特征 V1、V2、…、V28 是用 PCA 得到的主要成分,唯一没有用 PCA 变换的特征是“时间”和“数量”,并且没有空值(数据集页面)。
因为只有“时间”和“金额”特征很容易解释,所以我们可以使用一些可视化方法来查看这些特征对目标变量(欺诈)的影响。首先,欺诈更多发生在小额交易还是大额交易上?
检测欺诈的方法
本文提出了一种无监督的方法来检测欺诈,唯一使用标签的地方是评估算法。这个问题的最大挑战之一是目标高度不平衡,因为只有 0.17%的案件是欺诈性交易。但是表征学习方法的优点是它仍然能够处理这种不平衡性质的问题。使用 TSNE,我们可以尝试了解交易是如何相似的:
这种方法的主要思想是压缩数据,形成“潜在表示”,然后重构数据。如果样本与数据集的其余部分相似,则重构的数据将与原始数据相似甚至相等。然而,如果样本与其余样本不相似,则重构样本将不会与原始样本相似。
简而言之,我们压缩数据并重建它。如果重建的数据与原始数据不相似,我们就有欺诈行为。
主成分分析
使用主成分分析(PCA),我们设法将数据从 30 个特征压缩到 10 个特征,并计算重建分数。该分数的直方图如下:
我们可以看到,大多数样本具有较低的重构分数,然后,可能大多数欺诈具有超过 50 的重构分数。使用 TSNE,我们可以将原始数据处理与 PCA 压缩数据分布进行比较。
原始分布与 PCA 分布
现在,我们需要为重建分数设置一个阈值。通常使用领域专业知识来帮助设置这个阈值,因为它直接影响精确度和召回率的权衡。
使用重建分数的平均值和标准偏差,我们可以设置合理的阈值。然后,我选择将阈值设置为 mean + 2std。*这样,我们审计了 0.74%的交易,发现了 87%的欺诈行为。
自动编码器
自动编码器是一种人工神经网络,用于以无监督的方式学习有效的数据编码。它由负责压缩数据的编码部分和重建数据的解码器组成。
自动编码器的目的是学习一组数据的表示(编码),通常是为了降维。与 PCA 方法类似,重建得分直方图如下所示:
我们可以看到,大多数样本的重构分数较低,而大多数欺诈的重构分数可能超过 60。使用 TSNE,我们可以将原始数据处理与自动编码器压缩数据分布进行比较。
原始发行版与自动编码器发行版
自动编码器表示似乎很好地将欺诈从正常数据中分离出来。现在,我们需要为重建分数设置一个阈值。通常使用领域专业知识来帮助设置这个阈值,因为它直接影响精确度和召回率的权衡。
使用重建分数的平均值和标准偏差,我们可以设置合理的阈值。然后,我选择将阈值设置为 mean + 2std。*通过这种方式,我们审计了 0.85%的交易,发现了 65%的欺诈行为。
结论
该方法的目标已经实现,使得用 100%无监督的方法检测欺诈成为可能。然而,有几种方法可以使这种方法更好地工作,例如:
- 调整使用的模型(PCA 和自动编码器);
- 调整重建分数的阈值;
- 探索 PCA 和 Autoencoder 是否检测到相同的欺诈。如果他们以不同的方式工作,也许值得一试;
- 用一些特征工程增加数据。
在 GitHub 上可以找到用于执行这种方法的代码以及更多的分析:
permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/lmeazzini/Small-projects/blob/master/Credit_fraud.ipynb)
欺诈防范不仅仅是不平衡的数据集
大型电子商务网站的欺诈防范看起来与 Kaggle 竞争非常不同。
数据科学家在欺诈检测上花费了大量时间。数据科学博客充满了关于如何处理不平衡数据集、平衡精确度和召回率以及解释 F1 分数的文章。这些主题对于欺诈检测系统至关重要,但它们经过了充分的研究,可以说是人满为患。说真的,关于如何处理不平衡数据集的文章已经够多了。正在寻找新挑战的数据科学家应该考虑大规模欺诈防范系统面临的一些较少探索但同样重要的问题。本文将重点讨论这些系统面临的三大挑战,以及数据科学家如何提供帮助。
挑战 1:敏捷
欺诈是一个移动的目标。一旦部署了模型,欺诈者就会找到漏洞。虽然您可能认为这可以通过一个更好的模型来解决,但请记住,数据科学家面对的是复杂的组织,这一点很重要。例如,这个由 18 名成员组成的诈骗组织利用一个复杂的电子商务账户网络窃取了 2 亿美元。这些诈骗组织有时间和资源找到漏洞。这不是是否的问题,而是何时的问题。
欺诈是一个移动的目标。一旦部署了模型,欺诈者就会找到漏洞。
数据科学家不应该专注于构建完美的模型,而应该专注于尽快发现漏洞。他们应该尽快专注于建立新的模型。这是许多大型电子商务公司仍在使用陈旧的基于规则的系统,而不是更复杂的机器学习模型的原因之一 ( 查看使用 Accertify 的公司列表 ,这是一个主要基于规则的欺诈管理平台)。基于规则的模型在处理增量变化方面非常出色,而随机森林、逻辑回归或深度神经网络中的一个微小变化可能会产生与原始模型完全不同的结果。
挑战 2:更快的反馈循环
数据科学家以退款的形式了解遗漏的欺诈或漏报。也就是说,欺诈的受害者向他们的信用卡公司提交报告,声称他们的账户上有未经授权的购买。然后,信用卡公司将这种欺诈行为通知给该商家。
当数据科学家收到对他们模型的反馈时,几个月已经过去了,欺诈交易已经损失了数百万美元。
然而,像 visa 这样的支付处理商允许他们的客户有 120 天的时间来提交退款。当数据科学家收到对他们模型的反馈时,几个月已经过去了,欺诈交易已经损失了数百万美元。因此,数据科学家需要找到更具创造性的方法来更快地识别遗漏的欺诈行为。
挑战 3:更便宜的假阳性
当电子商务公司将信用卡交易归类为欺诈交易时,他们会取消该交易。如果交易是误报,那么公司就错过了合法收入,并给他们的客户带来了不便。像 Airbnb 这样的电子商务网站正在寻找方法来降低他们欺诈模型的误报成本。
误报的代价是收入损失和给客户带来不便
降低误报成本的一种方法是防止上游欺诈行为。也就是说,开发分类模型,在欺诈用户有机会完成交易之前识别他们。提前预测欺诈行为通常会降低精确度。但是,您不是取消交易,而是要求客户验证他们的帐户或重置他们的密码。因此,误报的代价不是取消交易,而是给客户带来不便。
欺诈数据科学家的下一个前沿
为了让数据科学家保护公司免受财务欺诈,他们需要做的不仅仅是建立一个模型。他们需要接受他们的模式会被打破,一旦被打破,他们需要迅速采取行动。为了让复杂的机器学习技术在防欺诈领域得到广泛应用,数据科学家需要学习如何优雅地进行渐进式改变。
[1] E Vuittpm,签证退款时限 (2016),Chargeback.com
使用 Geopandas 和 Contextily 为静态地图提供免费底图
了解如何在 Python 中添加免费底图
来源:https://github.com/darribas/contextily
context ily是 Python 中对上下文瓦片的一个包。在这个快速教程中,我将向您展示如何在 Jupyter Notebook 中使用上下文和 Geopandas 来制作一些漂亮的地图。首先,我们需要确保安装了这些包,在 anaconda 提示符下键入:
conda install -c conda-forge geopandas
conda install -c conda-forge contextily
我假设你已经安装了 matplotlib 包,如果没有,确保你先安装它。
conda install -c conda-forge matplotlib
现在,我们需要将包导入笔记本:
import geopandas as gpd
import contextily as ctx
import matplotlib.pyplot as plt
在本教程中,我将使用北达尔富尔州/苏丹的冲突点数据及其边界形状文件,该数据和本教程的完整代码可在Github找到。
# Read in the conflict points and the boundary shape files using geopandas
conf_data = gpd.read_file("NorthDarfurConf.shp")
ND_Boundary = gpd.read_file("NorthDarfurBoundary.shp")
为了快速浏览数据,您可以简单地打印地理数据帧的标题,以查看它们有哪些列。
conf_data.columns
ND_Boundary.columns
我们只需要冲突地理数据帧中的 event_type 列,它包含所记录事件的类型。显示这些数据只有一行代码:
# we specify the column that is going to be used for the symbology
conf_data.plot(column = 'event_type');
为了使它更好,需要设置一些参数,我们还将使用边界地理数据框架来显示州的边界。但是首先,我们需要定制情节的颜色(如果你已经意识到它是随机生成的)。简单地说,我们将为 even_type 列中的唯一值创建一个字典,并为每个值分配一个唯一的自定义颜色代码。
# get the uniques values in event_type column
categories = conf_data.event_type.unique()# create a list for our custom colors
c = ['m', 'k', 'g', 'r', 'y', 'c']# create a dictionary to combine both lists, categories are keys and # color codes are values
colorDict = dict(zip(categories,c))
print(colorDict)
要使用自定义颜色绘制我们的点,我们需要按照 event_type 列对 conf_data geo-dataframe 进行分组,以便每个唯一的事件类型都能从颜色字典中获得其指定的颜色。
# plot the state's boundary with black edge color only and line width of 2
ax = ND_Boundary.geometry.boundary.plot(figsize = (10,15), color = None, edgecolor = 'K', linewidth=2)# Loop through each event type group for eventType, data in conf_data.groupby('event_type'):
color = colorDict[eventType]
data.plot(ax = ax, color = color, label = eventType)
上下文地
现在我们准备探索上下文,看看我们如何使用它在我们的地图中包含一个底图。Contextily 有一个完整的供应商列表。它们都存储为字典,因此您可以在 python 中轻松地浏览和切换它们:
print(ctx.providers.keys())
要查看每个提供者包含哪个切片,您可以使用提供者名称来打印其切片。例如,让我们看看开放街道地图提供商有哪些切片:
print(ctx.providers.OpenStreetMap.keys())
要将基础地图添加到前面的地图中,我们只需将一行代码添加到前面的代码中,其中我们指定:
- 轴:以确保我们一起策划一切。
- 坐标参考系统(crs):对于 crs,将使用 conf_data 或 ND_Boundary 的相同 crs(两者具有相同的 crs ),否则它将不起作用。
- 提供者:例如带有 Mapnik 磁贴的开放街道地图。
# add open street map basemap
ctx.add_basemap(ax, crs = ND_Boundary.crs, url = ctx.providers.OpenStreetMap.Mapnik)
最后,将为我们的地图添加一个图例和标题:
ax.legend(bbox_to_anchor = (0.31,1), prop={'size':10}) # set legend's position and sizeax.set(title="Conflict in North Darfur/Sudan (1997-2020)") # add a title to the mapax.set_axis_off() # remove the axis ticks
plt.tight_layout() # adjust the padding between figure edges
plt.savefig('norhtDarfur_conf_OSM_Map.png')# Save the map as an image
plt.show()
以下是一些其他提供商:
从左至右:Esri 世界影像、Esri 地形和开放地形底图。
参考文献
[## GeoPandas 0.7.0 - GeoPandas 0.7.0 文档
GeoPandas 的目标是简化 python 中地理空间数据的处理。它结合了熊猫的能力…
geopandas.org](https://geopandas.org/) [## 达里巴斯/语境地
contextily 是一个小的 Python 3 (3.6 及以上版本)包,用于从互联网上检索切片地图。它可以添加那些瓷砖…
github.com](https://github.com/darribas/contextily) [## 苏丹-冲突数据
ACLED 项目代码报告的信息类型,代理人,确切位置,日期和其他特点…
data.humdata.org](https://data.humdata.org/dataset/acled-data-for-sudan)
自然语言处理入门的免费实践教程
开始使用 NLP 并不困难
自然语言处理(NLP)是人工智能的一个子领域,近年来发展迅速。由于研究、学术和工业领域的许多人的共同努力,取得了巨大的进展。其中一些机构非常友好地公开了他们的资料,这样全世界的人都可以从中受益。这篇文章是五个这样的优秀资源的汇编,这些资源可以被证明对刚开始学习 NLP 的人或者有经验的人非常有益。这些课程由各自领域的专家创建,提供互动练习、简明理论和真实案例研究的组合。
1.dair.ai 的《自然语言处理基础》(第一章)
dair.ai 是一个致力于使人工智能研究、教育和技术民主化的社区。他们所有的项目都在 GitHub 上免费托管,他们通过聚会、时事通讯、博客和学习材料传播知识。其中一个正在进行的项目是关于自然语言处理基础的****,,这将是一个从零开始的自然语言处理原则系列。目前,只有第一章是可用的,如果你是一个绝对的初学者,这应该是一个很好的起点。这一章有 colab 版本和网络版本。本章以清晰易懂的术语介绍了以下 NLP 基础知识:
作者图片
阅读完教程后,你会对一些重要的 NLP 概念背后的动机有足够的理解。这将为先进的东西奠定基础。
2.sci kit-学习文本数据
[来源:scikit-learn 开发者](http://r The scikit-learn developers)
Scikit-learn ,一个流行的用于机器学习的 Python 库,有几个关于 处理文本数据 的动手教程。实践教程使用 20 个新闻组数据集向您介绍文本分析的一些基本方面:大约 20,000 个新闻组文档的集合,平均分布在 20 个不同的新闻组中。在本教程结束时,您将对 NLP 的以下方面有一个大致的了解:
作者图片
本教程后面还有一些练习来进一步练习和巩固概念。
3.Elena (Lena) Voita 的 NLP 课程
来源:https://lena-voita.github.io/nlp_course.html
莉娜是爱丁堡大学的博士生。她最近发布了一个名为 NLP 课程|给你 的 NLP 课程。这是她从 2018 年秋季开始在 Yandex 数据分析学院(YSDA) 教授的(ML for) 自然语言处理课程的延伸。这门课程在很多方面都很独特:
- 首先,它是免费和公开的。
- 其次,本课程设计方便、清晰,并且对学习者友好。这使得它不同于我过去遇到的许多其他 NLP 课程。事实上,埃琳娜如此关注课程的个性化是非常值得称赞的。用她的话说:
我想制作这些材料,这样你(是的,你!)可以自己学习,学自己喜欢的东西,按自己的速度学习。我的主要目的是帮助你进入你自己的非常个人化的冒险。送给你。
本课程目前涵盖以下模块:
- 单词嵌入
- 文本分类
- 语言建模
- Seq2seq 和注意
每个模块都是精心策划的内容的组合,包括交互部分、练习、相关研究论文的链接,甚至一些 NLP 游戏。该课程正在积极开发一个关于迁移学习的模块,预计将于 11 月添加。甚至还有关于卷积网络的补充部分。
4.带空间的高级 NLP
来源:https://course.spacy.io/en/
spaCy 是一个用于工业级自然语言处理的现代 Python 库。 高级 NLP with spaCy 是由 spaCy 的核心开发者之一 Ines Montani 打造的免费互动课程。在这个免费的互动在线课程中;您将学习如何使用 spaCy 构建高级自然语言理解系统,同时使用基于规则和机器学习的方法。本课程包括四个章节,这些章节又进一步细分为几个小的互动模块:
本课程结束时,您将有足够的经验使用 spacy 在 NLP 中构建自己的小项目。
5.Fastai 的自然语言处理的代码优先介绍
自然语言处理 代码优先入门是 Rachel Thomas 教授的课程,遵循 fast.ai 自上而下的教学方法。以下是该课程官方博客文章的节选:
该课程教授传统的自然语言处理主题(包括正则表达式、奇异值分解、朴素贝叶斯、记号化)和最新的神经网络方法(包括 RNNs、seq2seq、注意力和变压器架构),以及解决紧迫的伦理问题,如偏见和虚假信息。
本课程配备了 Jupyter 笔记本和相关视频,涉及 NLP 的一些重要方面,如:
结论
在这篇文章中,我们看了五种不同的 NLP 资源,它们对初学者或有语言处理经验的人都有好处。这不是一个详尽的列表,还有其他一些我可能遗漏了的众所周知的资料。然而,我亲自浏览了所有上述资源,因此可以毫无疑问地推荐它们。你可以选择所有的课程,也可以选择其中的一些。无论你走哪条路,确保你练习你的技能,因为仅仅有理论知识不会让你在这个行业走得更远。
自动驾驶汽车人工智能应用的免费激光雷达数据集
Scale AI 发布了一个新的开源数据集,用于学术和商业用途,并加速了自动驾驶研究的发展。
数据标注,也称为数据标注/标注/分类,是用标签标注(即标注)数据集的过程。这个过程的质量对于受监督的机器学习算法来说是至关重要的,这些算法在试图通过识别未标记数据集中的相同模式来预测标签之前,从标记的数据中学习模式。
半自动图像标记的数据标记引导流程示例。图片来源: segments.ai
对于自动驾驶汽车应用程序,我们通常会避免明确地对机器学习算法进行编程,以如何做出决策,而是向深度学习(DL)模型提供带标签的数据进行学习。事实上,DL 模型可以随着更多的数据变得更好,似乎没有限制。然而,要得到一个功能良好的模型,仅仅有大量的数据是不够的,还需要高质量的数据标注。
有鉴于此, Scale AI 旨在为自动驾驶汽车、地图绘制、AR/VR 和机器人等人工智能应用提供训练数据。Scale 首席执行官兼联合创始人亚历山大·巴甫洛夫·王在最近的一次采访中告诉 TechCrunch :“机器学习绝对是一种垃圾进,垃圾出的框架——你真的需要高质量的数据来支持这些算法。这就是我们建立规模的原因,也是我们今天使用该数据集以开源视角帮助推动行业发展的原因。”
车道和边界检测应用的注释点云示例。图片来源:比例人工智能
本周,该公司与激光雷达制造商何塞合作,发布了一个名为 PandaSet 的新数据集,可用于训练机器学习模型,例如应用于自动驾驶挑战。该数据集是免费的,并授权用于学术和商业用途,包括使用何塞的前向(固态)PandarGT 激光雷达和名为 Pandar64 的机械旋转激光雷达收集的数据。
该车安装有广角相机、长焦距相机、1 台机械旋转激光雷达(Pandar64)和 1 台固态激光雷达(PandarGT)。图像演职员表: 比例人工智能
这些数据是在旧金山和硅谷的市区行驶时收集的,之后官员们在该地区发布了呆在家里的新冠肺炎命令(据该公司称)。
数据集功能:
- 48,000 张相机图像
- 16000 次激光雷达扫描
- +100 个 8 的场景
- 28 个注释类
- 37 个语义分割标签
- 完整的传感器套件:1 台机械激光雷达、1 台固态激光雷达、6 台摄像机、机载 GPS/IMU
它可以在这个链接免费下载。
PandaSet 包括 28 个对象类的 3D 边界框和一组丰富的与活动、可见性、位置、姿势相关的类属性。该数据集还包括具有 37 个语义标签的点云分割,包括烟雾、汽车尾气、植被和充满汽车、自行车、交通灯和行人的复杂城市环境中的可驾驶表面。
开源数据集的一些形态。图像演职员表: 比例 AI
虽然存在其他优秀开源自动驾驶汽车数据集,但这是一种不受任何限制地许可数据集的新尝试。
我收集了以下四个高质量的其他数据集,它们肯定会对您的机器学习/自动驾驶汽车项目或推动点云数据的形成和研究有用:
编队学习先进的点云处理和三维自动化。开发新的 python 地理数据技能和开源…
learngeodata.eu](https://learngeodata.eu/point-cloud-processor-formation/) [## 三维点云的未来:一个新的视角
被称为点云的离散空间数据集通常为决策应用奠定基础。但是他们能不能…
towardsdatascience.com](/the-future-of-3d-point-clouds-a-new-perspective-125b35b558b9)
开源自动驾驶汽车数据集
与 LiveData 和 MVVM 一起提供免费的冠状病毒案例 API
我们将通过 LiveData & MVVM 实现实时冠状病毒病例应用编程接口
Dương Trần Quốc 在 Unsplash 上拍照
我们将建造什么?
我们将构建一个 Android 应用程序,它将在 RecyclerView 中显示冠状病毒的真实病例。我们将遵循 MVVM 架构模式,用 Kotlin 实现 LiveData。
我们最终的应用程序将是这样的。
我们会学到什么?
- MVVM 建筑模式
- LiveData
- 使用改进的 API
为什么是 MVVM?
MVVM 是一种架构设计模式,它帮助我们实现以下目标。
- MVVM 让代码更容易理解
- 对于其他开发人员来说,代码变得更容易维护
- 这也使得项目松散耦合,意味着减少了组件(如类、活动和片段)之间的依赖性。
- 代码测试变得容易多了。
MVVM 建筑模式
MVVM 建筑
上图解释了 MVVM 架构模式。在这个图中,在体系结构的顶部存在我们的视图,用户通过这些视图与数据进行交互。
为了显示数据,我们使用 ViewModel ,因此我们的视图依赖于 ViewModel 来获取数据。使用 ViewModel 的好处是,如果活动被破坏,它不会更新数据。这意味着它减少了应用崩溃的机会。
接下来,在视图模型下面存在存储库,它进一步依赖于各种数据源。存储库可以从任何来源获取数据,它可以是远程存储库或本地存储库,这完全取决于您的逻辑。
LiveData
当谈到可观察或观察者时,这意味着我们在谈论两种不同的东西,一种你可以认为是电视,另一种你可以认为是正在观看电视的人。所以电视是可观察的,因为它被观察,而观看它的人是一个观察者。如果我们把这个概念应用到我们的数据和视图上,数据被我们的视图观察,所以数据是可观察的,而视图是观察者。现在我希望你能理解这个概念。
现在是时候来点技术了,不是吗?
[LiveData](https://developer.android.com/reference/androidx/lifecycle/LiveData)
是一个可观察的数据持有者类,这意味着扩展了LiveData
类的类负责通知处于活动状态的视图。一旦数据发生任何变化,我们的视图就会看到,即我们的视图会得到通知。
让我们考虑一个场景来更好地理解这个概念。
例如:-
让我们假设,你在任何应用程序的主屏幕上,它向你显示项目列表,但只要你单击任何项目,就会发生一些处理,这意味着后台服务正在获取数据,同时,你关闭应用程序。该应用程序对您不可见,但后台服务很快停止(因为您关闭了该应用程序),并且它仍在尝试设置视图上的数据,现在由于数据未被提取,因此您的应用程序将因NullPointerException
而在后台崩溃。那就是没有使用LiveData
的问题。
现在,我们可以从这个例子中了解到,我们获取数据的过程并不知道我们的活动、片段和服务的生命周期,这就是我们的应用程序崩溃的原因。
市场上唯一可用的解决方案是解决此类问题的LiveData
。那我们还在等什么?让我们直接进入编码部分。
项目结构
在您的项目中创建以下包
网络包:
这个包包含另外两个包,即 data 和 repos,data 包有两个类来接收从 RemoteRepository 类获取的数据。
用户界面包:
这个包还有另外两个包,它们是适配器和接口,适配器包有一个ModelListAdapter
类,这个类创建了一个冠状病毒的详细列表。
接口包包含一个返回改造对象的接口。在这个接口中,我定义了 BASEURL 和它的端点。
接下来的两类 ui 包是MainActivity
和MyViewModel
。我们的MainActivity
类包含了RecyclerView
和ProgressBar
。MyViewModel 类为我们的活动提供数据。
说够了,让我们现在开始编码…
这个项目我准备用免费的冠状病毒 api。
API 网址:【https://api.covid19api.com/summary
我将只使用国家数组。
主活动. kt
我在这个应用程序中有一个单独的屏幕,这个屏幕使用 RecyclerView 描绘了冠状病毒详细信息的列表。
ViewModelProviders
是一个类,这个类的of()
方法返回活动范围的 MyViewModel 类的对象。这是提供视图模型核心逻辑的主类。一旦我们创建了我们的 MyViewModel 类的对象,现在我们可以开始使用 observer() 方法观察数据。这个观察者接受两个参数,即当前活动的上下文和观察者匿名类。匿名类是没有任何名称的唯一类,这些类减少了类的数量。java 文件,这些类用于一些特定的情况,当只有一次使用是必要的。在 Observer 匿名类中,我们设置 recyclerview 适配器来显示我们的项目列表。所以这是我们在活动中需要的唯一代码。当 observer() 发现数据中有任何更新时,它会通知适配器或任何视图。
MainActivity 的布局文件仅包含 recyclerview 和一个 progressBar,用于显示从远程存储库获取数据时的处理情况。
ModelListAdapter.kt
这是在 recyclerview 中设置项目列表的适配器类。这个类是从MainActivity
中调用的。ModelListAdapter 类使用*list_item*
布局文件,该文件有四个 textviews 来显示数据。
我们的适配器类的布局文件。
MyViewModel.kt
这是我们的 ViewModel 类, MainActivity.kt 类依赖于这个类。每当视图需要数据时,这个类就提供它。ViewModel 类只负责管理数据。这个类永远不能访问视图。这个类的callAPI()
方法访问Repository
类的对象并调用它的callAPI()
方法。然后Repository
类返回可变数据对象的对象。这个对象进一步传递给 our MainActivity
来设置数据。
翻新设备服务
是一个有fetchData()
方法的接口,这个函数返回Country
类的对象。注意,fetchData()方法是用 @GET 请求注释的,这意味着我们要发出的是一个 GET 请求。Get request 仅在仅从服务器获取数据时使用,这意味着在服务器上既不发送数据也不更新数据,除此之外,该接口还创建了 reform 类的 singleton 对象。 invoke() 函数在伴随对象内部,这意味着无论何时我们需要调用这个invoke()
方法,我们都不必创建对象。伴随对象与 Java 的静态方法相同。在 baseurl()方法中,我传递了我的 web 服务的 url。
Repository.kt
Repository 类处理网络调用。当从MyModelView
类调用这个类的 callAPI() 方法时,它很快开始执行它的异步方法enqueue()
。该方法有两个回调函数, onFailure() 和 onResponse() ,如果调用成功,则调用onResponse()
,否则调用onFailure()
。
数据类别:
Country 是我的主类,它在构造函数中接受一个 GlobalData 类的列表。这个类由我们的 API 返回。
**class** Country(**val Countries**: List<GlobalData>) {
}
这是我们从 API 得到的数据。
**data class** GlobalData(
**var Country**: String,
**var NewConfirmed**: Int,
**var TotalConfirmed**: Int,
**var NewDeaths**: Int,
**var TotalDeaths**: Int,
**var NewRecovered**: Int,
**var TotalRecovered**: Int
)
使用 LiveData 的优势
- 确保用户界面与数据状态相匹配
- **没有内存泄漏:**观察器被绑定到
[Lifecycle](https://developer.android.com/reference/androidx/lifecycle/Lifecycle)
对象,当它们相关的生命周期被破坏时,它们会自行清理。 - **没有因停止的活动而崩溃:**如果观察者的生命周期处于非活动状态,例如在后台堆栈中的活动,那么它不会接收任何 LiveData 事件。
- 不再手动处理生命周期: UI 组件只是观察相关数据,并不停止或恢复观察。LiveData 自动管理所有这一切,因为它在观察时知道相关的生命周期状态变化。
- **总是最新数据:**如果生命周期变为非活动状态,它会在再次变为活动状态时接收最新数据。例如,一个在后台的活动在返回前台后会立即收到最新的数据。
- **适当的配置更改:**如果由于配置更改(如设备轮换)而重新创建活动或片段,它会立即接收最新的可用数据。
如果你在代码的某个地方卡住了,不要担心,你可以从 这里 下载我的 Github 项目。
我希望你喜欢读这篇文章,你也可以访问我的 网站 ,在那里我会定期发布文章。
订阅 我的邮件列表,以便在您的收件箱中直接获得我的文章,并且不要忘记关注我自己在 Medium 上发表的文章The Code Monster来完善您的技术知识。
结论
我们已经看到了如何将 LiveData 用于 MVVM 和改进 API。为了详细说明 LiveData 的用例,我使用了 Live Api,这样可以帮助您轻松理解 LiveData 的概念。
新冠肺炎危机期间的免费在线数据科学课程
提供免费课程的在线平台
J. Kelly Brito 在 Unsplash 上的照片
许多教育公司希望让数据科学对每个人来说更实惠、更容易获得。由于现在对许多人来说,时间是艰难和不确定的,许多付费平台现在要么提供免费订阅,要么提供课程。
如果你现在希望提高你的数据科学技能,查看这篇文章中的资源。
在你开始学习之旅之前,请务必阅读我在如何学习和做更好的笔记上的帖子。
[## 如何记笔记:来自人工智能、神经科学、社会学家和免费应用程序的见解
帮助您更好地记笔记和思考的见解和工具
medium.com](https://medium.com/@ausius/how-to-take-notes-insights-from-ai-neuroscience-a-sociologist-and-a-free-app-34b4be63080a) [## 使用这个免费的笔记应用程序做更好的笔记,它将成为你的第二大脑
黑曜石使连接想法变得容易,帮助你更好地思考和写作
medium.com](https://medium.com/swlh/take-better-notes-with-this-free-note-taking-app-that-wants-to-be-your-second-brain-1a97909a677b) [## 2 元学习原则帮助你更有效地学习
高效获取知识和技能
medium.com](https://medium.com/@ausius/2-meta-learning-principles-to-help-you-learn-more-efficiently-44061c9951e1)
JetBrains 学院
制作 PyCharm 等 ide 的软件公司 JetBrains 通过 JetBrains Academy 提供免费课程。您将通过构建工作应用程序来学习 coe。此优惠活动免费,有效期至 2021 年 1 月 1 日。
乌达城
图片来自 Udacity 的博客
Udacity 提供为期一个月的免费高级纳米学位课程,但只针对美国或欧洲的学生,而且每位学生仅限一个纳米学位课程。他们还计划在未来几周和几个月内宣布更多的举措,所以请注意!
乌德米
Udemy 免费资源中心页面截图
Udemy 免费提供数百门课程。许多是数据科学课程,但你也可以找到关于生产力、个人发展和音乐的免费课程。
谷歌云培训
谷歌云网站截图
谷歌通过谷歌云培训在有限时间内提供独家优惠。你可以在qwikilabs、Pluralsight 或 Coursera 上学习课程(只是这三个网站中的一个,尽管 Pluralsight 和 Coursera 也在提供优惠——见下文)。
我们在 Qwiklabs、Pluralsight 和 Coursera 上提供的 Google Cloud 培训有特别折扣。要申领这些特别优惠,只需填写下表,并在 2020 年 5 月 31 日(星期日,太平洋时间晚上 11:59)之前在您首选的平台上注册培训。
Coursera
图片来自 Coursera 的博客
危机期间,Coursera 提供了许多新的免费课程(带证书)。许多甚至与危机直接相关:精神健康和福祉、公共健康和流行病学。
从今天开始,我们将为任何人、任何地方提供完全免费的课程选择,这样更容易坚持学习。虽然 Coursera 上的许多课程已经可以免费获得,无需证书,但这次促销活动使您不仅可以参加讲座和测验,还可以获得提供这些课程的免费证书。我们计划在 2020 年 5 月 31 日前提供此项优惠,更多详情请访问以下链接。
国际商用机器公司
IBM 的培训和技能博客截图
IBM 正在提供数百门免费课程,比如 IBM Cloud、Watson、Systems、Professional Skills、Finance & Operations。
包装
Packt 的免费车间访问页面截图
Packt 是一家出版公司,出版编程书籍和工作坊。他们目前正在为 web 开发、数据科学和编程提供免费的研讨会。你必须向他们注册,购买他们的工作室(想买多少就买多少),并在结账时输入促销代码(PACKTFREE)。
代码集
代码学院页面截图
Codecademy 正在提供专业版订阅。然而,只有 10,000 个奖学金可用,你需要一个有效的学校电子邮件地址。
Dataquest
图片来自 Dataquest 的助学金奖学金页面
Dataquest 为那些真正有经济需求并渴望提高数据科学技能的人提供经济援助奖学金。
谁可以申请?任何人都可以申请,但我们要求两件事:你有真正的需求,并且在 5 月 27 日之前至少完成一次 Dataquest 任务。
多元视觉
Pluralsight 页面截图
Pluralsight 提供四月份的免费订阅。他们提供各种主题的课程,从软件开发到网络安全和机器学习。
Linux 基金会培训奖学金
Linux 基础培训页面截图
Linux 基金会提供了高达 500 英镑的奖学金来发展开源社区。你将接受培训课程和认证考试。
奖金
许多教育公司都提供免费订阅(看看这个庞大的汇编,尤其是如果你在为你的孩子寻找资源的话!)由于学校关闭
国家应急图书馆(互联网档案馆)已经提供了超过 140 万册图书。
当你享受这些难以置信的学习资源时,记得保持安全和健康!
更多帖子, 订阅我的邮件列表 。
免费阅读资源|机器学习
有助于理解机器学习概念的资源
在这篇文章中,我们将通过免费阅读资源来更好地理解机器学习。这将是一个简短的帖子。我将通过提供一些基本信息向您介绍每种资源。我试图通过在线访问找到资源,这样任何地方的任何人都可以免费访问它们。这也是我喜欢编程的原因之一,有无限多的开源和免费资源。这个列表中的七本书都与机器学习有关,但每本书都会给你不同的视角。希望这些资源对您也有所帮助。
阅读一本编程书籍可能有点挑战性,但我通常不会阅读整本书,而是检查他们的索引,阅读我觉得有趣或需要在那一刻学习的部分。当然,如果你有时间,你可以读完整本书。我们开始吧!
1-Python 数据科学手册
这是对 Python 世界中最重要的数据科学工具的全面介绍。这是杰克·范德普拉斯写的一本书。Jake VanderPlas 以前是 eScience Institute 的开放软件主任和物理科学研究主任;他现在在谷歌工作。在本书中,您还可以找到关于 Numpy、Pandas 和 Matplotlib 库的有用内容。
https://jakevdp.github.io/PythonDataScienceHandbook/
https://jakevdp.github.io/PythonDataScienceHandbook/
2-Python 101
另一个有用的书籍资源,由 Michael Driscoll 撰写。Michael 从 2006 年开始用 Python 编程。他是广受欢迎的 Python 博客“鼠标大战 Python”的作者。他也是 Real Python 的贡献者。
如果您刚刚开始使用 Python,这是一个很好的资源。这也是更新您 Python 知识的好读物。这本书将帮助你从头到尾学习如何用 Python 3 编程。Python 101 从 Python 的基础开始,然后转到 Python 的标准库。
https://leanpub.com/python_101
3 —机器学习和大数据
这个资源比其他资源更具学术性。可以找到机器学习和大数据的实现。这些项目大多是使用 Python、C++、Java 和 Scala 解决的。如果您有兴趣了解有关大数据的更多信息,这将是一本不错的读物。
http://www.kareemalkaseer.com/books/ml/
【http://www.kareemalkaseer.com
4 —用于机器学习的数学
这本书更侧重于机器学习背后的数学。如果你有兴趣提高你的机器学习知识,你应该知道它是如何工作的。当你知道事情是如何运作的,你就有更多的力量去改变和尝试新事物。这本书分为两部分:
- 数学基础
- 使用数学基础的示例机器学习算法
https://MML-book . github . io
https://MML-book . github . io
5 —机器学习向往
人工智能正在改变众多行业。来自吴恩达的免费电子书《机器学习向往》教你如何构建机器学习项目。
这本书的重点不是教你 ML 算法,而是如何让 ML 算法工作。读完《机器学习向往》,你将能够:
- 优先考虑人工智能项目最有前途的方向
- 诊断机器学习系统中的错误
- 在复杂的设置中构建 ML,例如不匹配的训练/测试集
- 建立一个 ML 项目来比较和/或超越人类水平的表现
- 了解何时以及如何应用端到端学习、迁移学习和多任务学习。
https://www.deeplearning.ai/machine-learning-yearning/
https://www.deeplearning.ai/machine-learning-yearning/
6 —理解机器学习:从理论到算法
作者:Shai Shalev-Shwartz 和 Shai Ben-David。
这本教科书的目的是以一种有原则的方式介绍机器学习,以及它所提供的算法范例。这本书提供了机器学习的基础理论和数学推导,将这些原则转化为实际的算法。
https://www . CSE . huji . AC . il/~ shais/understanding machine learning/copy . html
https://www . CSE . huji . AC . il
7 —百页机器学习书
这本书涵盖了机器学习的大部分新趋势。安德烈写的。他是两个孩子的父亲,也是加拿大魁北克市的机器学习专家。9 年前,他获得了人工智能博士学位,在过去的 7 年里,他一直在 Gartner 领导一个机器学习开发人员团队。
这本书就像一杯奶昔,里面有你最喜欢的水果。健康简洁🙂
在一个段落中,本书涵盖的主题可以列为:监督和非监督学习,支持向量机,神经网络,集成方法,梯度下降,聚类分析和降维,自动编码器和转移学习,特征工程和超参数调整!数学,直觉,插图,都在短短一百页里!
【http://themlbook.com
我是贝希克·居文,我喜欢分享关于创造力、编程、动力和生活的故事。
谢谢你,
使用 Yahoo Finance API 为 Python 免费提供股票数据
在这篇文章中,我将探索通过 Python 代码与 Yahoo Finance API 集成的用途。
什么是雅虎财经 API?
雅虎财经是一个媒体平台,提供金融新闻、股票报价数据、新闻发布和财务报告。而且雅虎财经提供的所有数据都是免费的。Yahoo Finance API 是 Yahoo 提供的获取财务信息的 API。
雅虎在 2017 年弃用了他们的财务 API。所以你可以看到很多网站在谈论雅虎财经 API 的替代品。然而,python 库 yfinance 通过从 Yahoo!财务并以 DataFrame 格式返回数据。所以你仍然可以使用雅虎财经获得免费的股市数据。
雅虎财经提供了超过五年的每日 OHLC 价格数据。此外,您可以获得最近几天的分钟 OHLC 数据。
开始吧
Yahoo Finance API 提供对以下信息的访问:
- 财务摘要,如收益,资产负债表。
- 股票历史价格。
- 股票行为(包括拆分和分红)。
所有这些信息都来自雅虎财经官网。
# To install yfinance before you use it.
> pip install yfinance
速度限制
调用 Yahoo Finance API 有一些限制:
- 使用公共 API(没有身份验证),每个 IP 每小时最多只能有 2,000 个请求(或者一天最多 48,000 个请求)。
我不确定这是为了财务数据。但是请使用 time.sleep(1)来避免您的 IP 被阻止。
历史价格和图表
您必须调用Ticker
模块来访问 ticker 数据。这里有一个简单的例子来检索五天的MSFT
股票 OHLC 数据:
现在你可以得到如下结果:
您可以为 history()方法设置更多参数:
绘制历史价格
如果还没有安装,可以运行命令安装 matplotlib 和 seaborn。
pip install matplotlib
pip install seaborn
将数据导出为 CSV 格式
此外,您可以将数据导出为 CSV 格式进行分析。
该功能将设置 auto_adjust 默认值为真。如果你不想要它,你可以改变它的值。
金融基础
您可以快速查看一些财务数据,如股息和拆分。您需要更改历史记录的代码长度来获取金融基本面数据。
更新于 2020/03/21 :目前没有收益和资产负债表信息。可能需要另一个 API 来找出数据。
最后
在本文中,我们了解了从雅虎财经获得股票市场数据有多简单。你可以开始写数据背后的分析。如果你有任何问题,请在下面提问。
2020 年你应该去看看的免费虚拟数据科学会议
数据科学会议发生了怎样的变化,为什么您仍然应该参加
由于疫情会议的召开,像数据科学会议这样的大型聚会不再明智。许多组织者没有完全取消会议,而是将会议虚拟化——有些人甚至免费举办会议!对于那些已经有旅行或预算限制的人来说,这是一个很好的机会(会议可能很贵!).你仍然可以舒舒服服地坐在沙发上享受数据科学会议的诸多好处。
数据科学会议可以提供很多东西:对该领域的发展轨迹有重大想法的演讲者,深入前沿话题的会议,在该领域有应用经验的专家,网络等。这些好处中的大部分仍然可以在虚拟会议上实现。
我参加了在旧金山举行的 2019 年地层数据会议
在我分享要查看的会议列表之前,我先简要总结一下数据科学会议体验的变化。
- 缩放(或其他平台)格式。会议是指在预定的时间主持会议,并有一个现场发言人。观众可以通过聊天或语音实时提问。
- 录制并免费提供的会话。错过了你想要的疗程?不用担心,录音通常在演示结束后不久就可以免费获得!过去,会议为与会者提供了这种服务,但现在许多录音可供所有人使用。
- Slack 等消息 app 已经取代了面对面的联网。像 Slack 这样的应用程序提供了与更多观众互动的好处,并可以继续关于不同会话的对话。虽然这显然不同于面对面的交流,但它近似于曾经面对面的讨论。
免责声明——我不隶属于本文所列的任何会议,也不受其赞助。所有列出的会议之所以被选中,是因为它们对我来说很有趣,也很有用。
即将召开的会议
该列表突出显示了当前虚拟的会议。我可能会在将来更新这个列表。按日期顺序排列的清单。
Spark + AI 峰会
2020 年 6 月 22 日至 26 日
Spark + AI 峰会涵盖了与 Apache Spark 和 AI 相关的主题,为开发人员、数据科学家和高管提供了不同的赛道,他们将应用最好的数据工具并使用 AI 来构建创新产品。在虚拟会议上,您将了解到:
- Apache Spark、Delta Lake、MLflow 和考拉的下一步是什么
- 管理机器学习生命周期的最佳实践
- 大规模构建可靠数据管道的技巧
- 流行的深度学习和机器学习框架的最新发展
- 人工智能的实际、真实的用例
会议是虚拟的,对所有人开放。会议是免费的,但半天和全天的培训课程和认证课程需要付费。峰会在 5 天内举行了 200 多场会议。
“数据和 AI 需要统一。但是最好的人工智能应用程序需要大量不断更新的训练数据来建立最先进的模型。Apache Spark 是唯一一个将大规模数据处理与最先进的机器学习和人工智能算法相结合的统一分析引擎。”
[## Spark + AI 峰会|人工智能& Apache Spark 大会
对于数据团队来说,这是前所未有的重要时刻。齐心协力,我们可以解决世界上最棘手的问题,而且…
databricks.com](https://databricks.com/sparkaisummit/north-america-2020)
数据和分析:实时
2020 年 7 月 14 日至 16 日(美国),2020 年 7 月 21 日至 23 日(欧洲)
Data & Analytics: Live 是一个端到端的数字会议,它通过 keynote theatres、互动展览、虚拟会见发言者分组会议和网络区域复制了面对面的会议。该会议旨在为与会者提供从数据中提取商业价值和可行见解所需的最佳实践和见解。会议的目标是高管和精通技术的数据从业者。会议将包括直播和点播。
免费通行证仅适用于所有行业的数据/分析从业者,他们不提供任何解决方案、招聘服务、咨询或在数据社区内提供任何软件/硬件解决方案作为其核心业务。
参加这一面向数据和分析领导者的免费实时虚拟活动。在手机、台式机或平板电脑上。我们带来了最好的…
data-analytics-live.coriniumintelligence.com](https://data-analytics-live.coriniumintelligence.com/) [## 数据和分析实况-欧洲| Corinium
数据与分析:Live,Europe 是一个 100%虚拟的会议,将连接欧洲最先进的数据分析…
data-analytics-live-eu.coriniumintelligence.com](https://data-analytics-live-eu.coriniumintelligence.com/)
人工智能的未来
2020 年 7 月 28 日
人工智能的未来活动展示了“人工智能的最新创新、技术和商业模式”,并将“领先的公司、创业公司、投资者、开发者和科技巨头聚集在一起,共同探索、学习和交流。”该会议旨在通过网络机会将会员和商业及技术领导者联系起来,以支持他们的增长和商业战略,并提供与人工智能相关的最新内容。
参加会议是免费的,但空间有限。
下载活动计划书,联系人工智能、数据、商业和技术虚拟活动的初创公司、企业和投资者…
www.futureofai.com](https://www.futureofai.com/)
AI4
8 月 18 日至 20 日
AI4 是一个为期三天的会议,主要关注人工智能和机器学习在企业中的采用和应用。会议采用了“面向内容的用例方法”,并提供了“一个通用框架,用于思考人工智能对每个行业意味着什么,并提供在组织的人工智能旅程的任何阶段促进理解的内容”。商业领袖和数据从业者都会发现这个会议很有价值。
要想免费参加,你必须申请一张会议通行证。Ai4 2020 是免费参加合格的申请人谁是…
- 在拥有 250 多名员工的组织中工作
- 担任高级职位和/或技术职务
- 对会议听众没有销售兴趣(或为有销售兴趣的公司工作)
[## 人工智能大会——8 月 18 日至 20 日——数字化举行
Ai4 2020 是业界最具影响力的人工智能活动。通过聚集来自各行业、政府和企业的领导者…
ai4.io](https://ai4.io/)
具有(免费)录制会话的过去会议
英伟达的 GPU 技术大会(GTC)
英伟达 GPU 技术大会的所有内容,包括人工智能、高性能计算、加速数据科学、医疗保健、图形等广泛主题的最新突破,都可以在 GTC 点播平台上免费获得。NVIDIA 已经在计划下一届 GTC 数字盛会了!
[## 观看英伟达首席执行官黄仁勋的 GTC 2020 主题演讲
加入我们新的实时网络研讨会,与专家会议联系,并录制讨论最新人工智能的演讲…
www.nvidia.com](https://www.nvidia.com/en-us/gtc/)
全球人工智能体验
DataRobot 在本次会议上的会议承诺向与会者传授人工智能如何有意义地影响组织,以及如何解决组织的关键问题。有来自各行各业先驱的用例会议,以及关于如何在人工智能方面取得成功的实际见解。所有录制的会议都是免费的。
两天充满了无限的机会来加速你的人工智能。查看数据机器人人工智能体验的完整议程…
aiworldwide.datarobot.com](https://aiworldwide.datarobot.com/agenda)
MongoDB.live
MongoDB.live 推出了 100 多个教育讲座和一个激动人心的主题会议,并发布了大量公告。现在可以免费点播课程。这是与 MongoDB 数据库软件相关的内容的一个很好的来源。
[## MongoDB World 现在是 MongoDB.live | June 年 6 月 9 日-10 日
加入我们的 MongoDB .无论你在哪里都可以现场直播!了解前沿内容、流式主题演讲、分组会议等
www.mongodb.com](https://www.mongodb.com/world)
PyCon US 2020 Online
PyCon 2020 是“使用和开发开源 Python 编程语言的社区的最大年度聚会。”会议记录的会议涵盖了各种与 python 相关的主题,如语言特性、机器学习和数据工程。
[## PyCon US
PyCon 2020 Online 已进入最后一周。回想过去 5 周左右的时间,有一个想法贯穿其中:…
us.pycon.org](https://us.pycon.org/2020/online/)
奥赖利地层数据和人工智能超级流
约会 TBD——“更像是来了”
奥莱利已经取消了 2020 年的所有会议;但是,将继续举办实时在线活动,并提供交互式教程。此外,O’Reilly 在线学习平台包含大量与数据科学、数据工程、机器学习、编程和可视化各种主题相关的有组织的内容(包括以前活动的会议记录)。在线学习平台不是免费的,但是 O’Reilly 目前提供 10 天的免费试用。
将我们的现场活动转变为在线活动
www.oreilly.com](https://www.oreilly.com/conferences/)
借助加权产品模型,让您不再犹豫不决
公司和疯狂的数据科学家如何使用决策分析来选择事物
来源:像素 (CC0)
作为一名友好的数据科学家,同事们总是带着有趣的问题来找我寻求帮助。人们要求我创建一个模型,一个公式,一个图表,一些东西…来解决一个定量的问题。
在过去的六个月里,一个反复出现的问题出现在不同的人面前:如果你必须评估许多标准,如何在众多选择中决定最好的项目/活动/项目/公寓?
人们可能会认为我毫不犹豫地选择了一些令人惊叹的人工智能算法、深度学习分类器,甚至是带有 Bootstrap 采样的爬山集成选择。然而,正如罗伯特·勃朗宁所说,“嗯,少即是多,卢克雷西亚”。
一个加权产品模型 (WPM)是解决多准则决策分析 (MCDA)问题的一个简单而流行的技术。它基本上包括将所有属性值相乘以得到一个分数。越高越好。
例如,请看下表:
表一:项目和特点。来源:作者
第一行的 WPM 分数为:
项目 1 = 30 x 17 x 5 x 20 = 51,000
更正式的定义是:
公式一:WPM 得分。来源:作者
其中:
- i :索引
- n :特征数量
- vi :第 I 个特征的值
- wi :第 I 个特征的重量
因此,使用 WPM 提供的分数,偏好被排序如下
表二:按 WPM 评分排序的项目。来源:作者
如果每个特征的权重相同( wi = 1 )。
现实生活中的问题
称重产品模型是一项非常简单的技术。你可以使用任何编程语言,甚至是电子表格(从 Github 获取代码)。
为了展示如何用 Python 来做这件事,我们再举一个例子:
表三:待售公寓清单。来源:作者
上表对应于伊利诺伊州芝加哥市的待售公寓,数据基于一个流行的 real state 网站,并针对教育目的进行了调整。这些特征是卧室数量(张床)、浴室数量(个浴室)、总面积、业主协会费用( hoa )、停车位数量**、建筑年份**、公寓楼层**、日照**、是否有电梯**、价格**。************
尽管它很简单,但还是有一些陷阱。首先我会告诉你如何正确地做这件事,然后我会告诉你什么是你不应该做的。
让我们导入一些库:
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
然后,我创建了一个熊猫数据框架:
raw = pd.read_csv('apartments.csv')
WPM 只使用数字特征。所以,我把曝光和升降转换成数字:
# keep original data safe
df = raw.copy()
# now exposure to West and to East are, respectively, 0 and 1
df['exposure'] = df.apply(lambda r: 1 if r['exposure'] == 'E' else 0, axis=1)
# if an building has an elevator, it will receive 1; 0 otherwise
df['elevator'] = df.apply(lambda r: 1 if r['elevator'] == 'Yes' else 0, axis=1)
现在,表格看起来像这样:
表四:曝光量和电梯转换成数字。来源:作者
接下来,我将所有特征缩放到相同的范围:
# create a scaler with range [10, 100]
mms = MinMaxScaler(feature_range=(10, 100))
# apply scaler
df = pd.DataFrame(mms.fit_transform(df), columns=df.columns)
现在,每个值都在 10 到 100 之间。
表 V:缩放到范围[10,100]的特征。来源:作者
是时候定义权重了:
weights = {'beds' : 1.,
'baths' : 1.,
'area' : 1.,
'hoa' : -1.,
'parking' : 1.,
'year' : 1.,
'floor' : -1.,
'price' : -1.,
'exposure' : 1.,
'elevator' : 1.}
这里的想法是让消极的特征不是好处。举个例子,如果价格上涨,WPM 值就会下降。
让我们定义 WPM 函数:
def wpm(option, weights):
value = 1
for column in option.keys():
if column in weights.keys():
value *= option[column] ** weights[column]
return value
然后,我们对行应用函数:
df['wpm'] = df.apply(lambda r: wpm(r, weights), axis=1)
# merge the wpm score with the original table to a better interpretation of the results
pd.merge(raw, df['wpm'], left_index=True, right_index=True).sort_values(by='wpm', ascending=False)
表六:按 WPM 评分排序的公寓。来源:作者
WPM 评分以所有功能同等重要的方式对公寓进行了排名。然而,如果一个负担得起的 HOA 比浴室的数量更重要呢?不同的特征重要性可以通过改变它们的权重来实现:
weights = {'beds' : 1.,
'baths' : 1.,
'area' : 3.,
'hoa' : -5.,
'parking' : 5.,
'year' : 1.,
'floor' : -5.,
'price' : -3.,
'exposure' : 1.,
'elevator' : 5.}
这些权重值完全是任意的,它们通常取决于决策者的判断。此外,还可以定义不同的比例。这里我用了一个李克特量表,因为它非常简单。
车位、电梯、便宜的 HOA、低矮的楼层,现在都是必不可少的;面积和价格都很可观,其余的都不太重要。
表七:按新 WPM 评分排序的公寓。来源:作者
WPM 得分现在有了一个完全不同的尺度,但这并不重要,因为只有排名是相关的。
不要
正如我之前所说,你需要采取一些预防措施来正确使用 WPM。
首先,你必须对数据进行缩放。所有功能。永远不会。人们可能会说你不需要这样做,因为数据已经准备好了,或者 WPM 本身不需要它。不要相信他们:否则,你会弄乱权重。作为一个例子,让我们只取两个特征:床和区域**,并假设权重分别等于 2 和 1:**
表八:带有未缩放数据的 WPM 示例。来源:作者
如你所见,卧室的数量比总面积更重要,但后者的比例更高,破坏了重量。如果您对[10,100]范围的特征进行缩放,情况就不同了:
表九:带有缩放数据的 WPM 示例。来源:作者
第二:不要将值缩放到[0,1]范围。更喜欢比这大的值。为什么?因为以下电源属性:
公式 II:功率特性的一些例子。来源:作者
0 几乎总是 0,1 总是 1,如果应用大于 1 的幂,分数会变小。所以,选择另一个范围。
与权重相关,可以使用任何值。但是,还是要保持简单:使用整数,只有当一个特性是一种负担时才使用负数,并且小心使用零。
第三个警告有点复杂:特性应该是合理独立的。如果其中两个或两个以上有因果关系,你应该只保留一个。例如,假设您有一个名为 房产税 的特性,其计算强烈依赖于公寓的价格:
表十:公寓及其财产税。来源:作者
如果计算这两个特征之间的皮尔逊相关系数:
df[['price', 'tax']].corr()
你会发现一个完美的相关性:
XI:价格和税收之间的完美关联。来源:作者
如果添加这两个特性,就像添加两次列价格**。它的权重将增加一倍,使其相关性增加两倍。换句话说,会把权重搞乱。**
然而,皮尔逊相关性的高值可能是一个线索,但不能保证这两个特征是相关的。作为一个例子,让我们测试另外两个特性,电梯和停车**😗*
df[['elevator', 'parking']].corr()
表十二:电梯与停车的完美关联。来源:作者
这两个特征是高度相关的,但是大楼里有电梯并不意味着公寓会有停车位!
因此,您需要分析这些特征来决定应该丢弃哪些特征。
WPM 很酷,但是…
决策分析有很多技巧,解决了很多问题。如果你有兴趣了解更多,请随意点击我放在这篇文章末尾的链接。
参考
[1] C. Tofallis,加法还是乘法?关于多标准排名和选择的指南 (2013),告知教育事务
[2] E. Triantaphyllou,B. Shu,S. Sánchez 和 T. Ray,多准则决策:一种运筹学方法 (1998),电子电气工程百科全书
2021 年,自由职业可能是从事数据科学的最佳方式
为什么我决定做自由职业者
在 Unsplash 上由 Austin Distel 拍摄的照片
虽然由于新冠肺炎的冲击,经济形势一直在转型,但英国的失业率已经上升到 4.5%,这是三年来的最高水平,它也在缓慢但肯定地蚕食数据科学市场— Edouard Harris 几个月前写了一篇非常有趣的文章,题为“过去一个月数据科学市场发生了什么”。
随着公司预算紧缩,找到最具成本效益和时间效率的方法来满足需求是非常重要的,因此我认为自由职业者正在增加,我相信你可能更适合做自由职业者(至少目前是这样),特别是作为一个试图进入这个领域而不是申请数百份工作却没有成功的人。
让我们来谈谈我相信这一点的一些原因:
真实世界的体验
图 1 :西装男形象由猎人赛于 Unsplash 上; robtowne0 在 Pixaby 上竖起大拇指毕业照;(图片由作者整理)
注意:你需要一定程度的教育才能得到一份数据科学的工作。
考虑到我们有两个有抱负的候选人,他们有相似的教育背景,但是其中一个决定从事项目并使它们开源,而另一个继续寻找教育资源来学习。谁的努力会首先引起你的注意?
希望你说的是参与项目的人。如果是这样,太好了!为什么是自由职业者?你今天问了所有正确的问题…作为一个有抱负的人,你获得了在现实世界中从事项目工作的经验,再加上客户的好评,这使你成为许多正在招聘全职数据科学家的公司非常有竞争力的雇员,如果你决定在机会出现时过渡到全职角色。
一般来说(对于有抱负和经验丰富的数据科学家来说),作为一名数据科学家,自由职业不仅会在你从事客户工作的同时增长你的数据科学技能。你还在培养一些人可能称之为“T0”的创业技能——我个人认为这是成为数据科学家的一个关键方面。
这是因为自由职业不仅让你对客户的工作负责,因为你还必须负责自己的个人营销、个人财务管理和客户服务。实际上,你已经变成了一个企业——我们已经在以前的帖子中讨论了数据科学的各种“创业”方面。
每个数据科学家都必须做的项目
towardsdatascience.com](/the-most-important-data-science-project-458d016ef8a6) [## 品牌在数据科学中的重要性
最近,一个特别的话题在我和朋友的讨论中反复出现。品牌的重要性!我…
towardsdatascience.com](/the-importance-of-branding-in-data-science-467b2d2b1e7f)
我认为这非常有价值,原因有二:
- 你对经营企业有一种感觉,如果你觉得它适合你,你可能会决定继续经营自己的企业。
- 当你管理自己的事务时,你发展了对企业价值的第三感
赚取你的价值
学习新的技能和增加你的知识是在这个领域长期存在的必要条件。然而,一次又一次,公司因支付给数据科学家的报酬过低而闻名,因为他们做的事情超出了他们的预期。
除此之外,在一家公司工作时,如果没有某种形式的妥协,你就不太可能因为学习新技能或提高原有技能而获得加薪。例如,为了弥补你将会赚到的几个额外先令,你可能会被安排一些无关紧要的任务,或者你可能不得不增加工作时间,这样你就没那么多时间来花这些额外的钱了。
“学得越多,赚得越多”
另一方面,作为一名自由职业者,你有能力与客户协商你的收入。如果你已经学会了如何将机器学习模型部署到云上,这反过来应该会产生 5%的报酬,你有权与你的客户谈判。本质上,随着你发展和提高你的技能,你的收入潜力就在你手中,你可以决定自己的价值。
灵活性
我觉得,对于在家工作是否会持续下去,世界上的意见分歧很大,但就目前情况来看,我们大多数人都在家里工作。
虽然在办公室工作 8 小时是可行的,但我个人认为许多人可能会同意我的观点,即在家工作是无益的,因为随着越来越多的干扰进入我们的环境,我们的生产力会下降。
当自由职业者时,这不是一个大问题,因为一个主要原因…你可以决定工作多长时间,这意味着你可以花一些时间专注于深度工作,以完成你为一天留出的任务。
包裹
现在,有一些显而易见的原因可以解释为什么自由职业可能不像一个公司的永久工作那样合适:
- 提交新作品的提案本身几乎就是一项工作
- 工作和现金流不一致
- 没有带薪休假
在疫情之前,我最初从未想过做自由职业者,但随着全球经济持续紧张,我开始认为,对于那些认为自己可以独立工作的人来说,这可能不是一个坏选择。
因此,如果你认为自己有能力被一家公司聘用,但由于一些你无法控制的原因,你无法获得一份工作,那么在缓冲期间从事自由职业是个不错的主意。同样,如果你想在毕业后(或学习期间)获得实践经验,那么自由职业是一个不错的选择。
对于已经接受自由职业的弊端并接受经济现状的数据科学家来说,自由职业数据科学是一个非常赚钱的职业,这可能是 2021 年的发展方向,尤其是在经济面临更大压力的情况下。
另一个你可能会感兴趣的帖子是“你不需要工作来获得数据科学经验”
把硬币翻转过来
towardsdatascience.com](/you-dont-need-a-job-to-get-data-science-experience-26af4fd4c200)
你觉得这个帖子怎么样?留下回复或者让我们在 LinkedIn 上进行对话…
[## Kurtis Pykes -数据科学家-自由职业者,自由职业者| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有 3 个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
对博客感兴趣?订阅我的 youtube 频道获取最新内容(本周日第一篇帖子)!
欣赏您喜爱的视频和音乐,上传原创内容,并在上与朋友、家人和全世界分享这些内容…
www.youtube.com](https://www.youtube.com/channel/UCu6zdBQhvEY5_j-ifHWljYw?view_as=subscriber)