Niall Turbitt是Databricks机器学习实践团队的数据科学家。他与Databricks客户合作,构建和部署机器学习解决方案,并提供专注于Spark机器学习的培训课程。他拥有都柏林大学学院的统计学硕士学位,之前在从电子商务到供应链和物流等一系列领域构建可扩展的数据科学解决方案方面有经验。
本研讨会是我们为有抱负的数据科学家提供的数据分析入门系列研讨会的第三部分。
Scikit-learn是数据科学从业者中最受欢迎的开源机器学习库之一。本次研讨会将介绍什么是机器学习,不同类型的机器学习,以及如何建立一个简单的机器学习模型。本次研讨会的重点是应用和评估机器学习方法的技术,而不是它们背后的统计概念。我们将使用《纽约时报》(https://github.com/nytimes/covid-19-data)发布的数据。要求有基本的Python和pandas经验。
你需要:注册社区版在这里并获得研讨会演示材料和样本笔记本在这里.
虽然不需要做任何准备工作,但我们还是建议您了解基本的python和熊猫知识,并在此之前报名参加社区版。如果你还没有这样做,可以观看第一部分,Python介绍来了解Python,观看第二部分,与熊猫一起进行数据分析来了解熊猫。
-这是我们为有抱负的数据科学家介绍数据分析的第三部分。之前,如果你们都参加了前两次课程,那是一个三部分的课程,我很兴奋地宣布,我们实际上把它变成了一个四部分的系列研讨会。今天是关于机器学习的第三部分,接下来的第四部分安排在下周三。
第四部分将介绍Apache Spark,我在这里有一个链接,但在介绍完所有人之后,我也会在聊天中删除这个链接。如果你想重温第一部分或第二部分的视频,可以在我们的YouTube频道上找到。这是一个简短的播放列表链接。这就是我们在线聚会的播放列表,包括研讨会和技术讲座。所以你可以在那里访问内容。
太好了。我们来快速地讲一下。所以访问我们内容的最好方式是加入我们的在线聚会群,我想你们大多数人都是这样的,如果你从Zoom拨号进来,那就是你今天加入我们的链接。这就是链接。如果你从YouTube加入我们,我希望你能加入我们。这是所有即将到来的内容通知的地方,我们在那里发送一些消息和不同的资源。所以请加入我们。然后我们也通过YouTube进行直播,我们所有的技术演讲、在线聚会和研讨会都是这样做的。确保你订阅了我们的YouTube频道,打开通知,这样你就能知道即将到来的技术演讲和内容,那里也有链接。下面是YouTube链接。
所以我们今天有两个资源。一个是GitHub回购。我相信这些资源在事件页面中都有链接。所以我们想再把他们叫出来。你们中的大多数人可能已经注册了社区版。但如果你还没有这样做,这里还是有链接。
抱歉,我的手机有一些通知,我只是想确认一下,我在演讲时看不到聊天内容。所以我只是想确保我们都没事。所以我会把这些链接放到聊天或者助教留言板上。
好的,我想让我们的老师和助教简单介绍一下。
让我们从助教开始。阿米尔,也许你可以开始,然后我们可以去找凯利和布鲁克,然后我把它交给我们今天的教练尼尔。-大家好,我叫阿米尔·伊赛。我是一名数据科学家和Databricks顾问。我花了大约30%到40%的时间培训不同的客户大规模地进行机器学习,大约40%到50%的时间花在开发解决方案、机器学习和人工智能解决方案上。我和布鲁克在同一个队,我把话筒递给凯莉。-大家好。我是凯利。我是洛杉矶Databricks公司的解决方案工程师。我主要与刚接触Databricks的初创公司合作,帮助他们弄清楚如何最好地设计他们的大数据管道。
-大家好。我叫布鲁克·维尼格。我是Databricks的机器学习实践主管。因此,我们的团队专注于与客户合作,帮助他们使用机器学习,无论是为他们构建全新的管道,还是帮助他们扩展管道。同时也与项目经理和工程团队合作,提供产品更新和产品反馈。所以如果你们对这个产品有任何反馈,也请随时联系我。-谢谢,布鲁克。——太棒了。抱歉,尼尔,打断你一下。我刚想起来我想对与会者说一下在聊天中利用问答的方法。 So the chat, you know, we’ll send links in there, and if there’s any audio issues or whatnot, ping us there, and then please use the Q&A function if you have questions, and that’s where we’ll be answering everything. This session is recorded, and we’ll share all the resources, including the video recording 24 hours after the broadcast ends. So sorry again Niall, and take it away. – No problem at all. Hi, everyone. So my name is Niall Turbitt. I’m a data scientist on our professional services and training team. I’m based out of London in the UK. So very similar to Amir, my time is kind of split half and half between working with our customers to architect, develop, and deploy machine learning solutions at scale to our customers, and then on the other side of things, delivering trainings, which focus primarily on data science and machine learning. So, super excited to take you through a little bit of thought today. What I would say is, pretty much don’t be shy with the questions, put them into the channel and we can address those at the end as we come to them.
我来看看凯伦还在不在。
-是的,我们都准备好了。你可以开始了。-好的,太好了。记住这一点,我给大家几分钟时间来设置社区版。我先分享一下我的屏幕。我要做的就是给大家讲一下在社区版上设置集群本身需要做什么。一旦我们有了这些,我们要做的就是把我们的笔记本电脑导入到Databricks环境中。所以我要做的就是像我说的,给每个人几分钟的时间来注册。如果你还没有,这个链接在聊天中,所以我们要做的是访问www.neidfyre.com/trydatabase,它会把你带到这个页面。如果你还没有注册,我们需要一分钟来注册我们要做的就是进入社区版。 And what Community Edition is, is effectively replicating Databricks workspace whereby we can spin up our clusters, all these limited resources to what we would typically have. And then what we can do is spin up our own cluster and then bring in the notebook that we will be using today and to explore kind of first steps with of machine learning with Scikit-learn.
我想说的另一件事是如果你已经设置好了,你要做的就是去community。cloud。www.neidfyre.com在那里你会被提示用你的登录登录。就像我说的,我将暂停一分钟左右,让每个人都注册,登录,然后我要做的是介绍如何启动一个集群。然后我要讲第二步,也就是我们要加载我们今天要用的笔记本。如果有任何问题,请告诉我们的助教,如果你们在第一步中遇到任何问题或困难。
一旦我们有了这些,一旦我们进入到实际的工作空间本身,我们的第一步实际上是建立一个集群。当我们在旋转集群时,我们说的是有效地旋转数据中心某处的资源,我们要做的是安装Databricks运行时,它将允许我们连接和上传工具。要做到这一点,我们要做的是向下导航到欢迎屏幕左侧面板上的群集选项卡。当我们浏览Databricks本身时,它会一直出现。但是一旦我们到了这里,我们要做的就是创建我们的集群。要创建集群,你能做的就是给集群起个名字,不需要什么特别的名字。我要给它起个名字,尼尔。
在Databricks运行时版本方面,我们将保持原样。运行时更特定于我们在集群上安装的东西当我们启动集群时。所以在虚拟机或数据中心的资源上,我们正在运行我们有效安装在上面的软件。我们把这个设为默认值。Databricks Runtime 6.4。差不多就是这样,我们要保持一切不变。完成之后,我们将创建我们的集群。因此,在这个阶段,您所要做的就是为集群指定一个名称,保持其他所有内容不变,然后单击Create。
我们会看到它需要几分钟才能旋转起来。
一旦我们看到这个转轮,我们就会看到状态pending。现在,当我们等待集群资源被获取时,我们要做的是通过如何实际导入我们今天将使用的笔记本进行一步操作。就像我们说的,让我们给它一到两分钟的时间,我给每个人一分钟左右的时间来创建那个集群。就像我说的,在这个阶段我不想失去任何人,所以花点时间来设置这个,然后我可以展示如何导入我们今天要使用的笔记本。
所以当我们在等待我们的集群启动时,我要引导我们去的是GitHub存储库,在那里我们有今天的笔记本,我们将逐步浏览。
所以这个应该发布到问答频道。但它的位置在我们的技术讲座中,然后我们将进入今天的技术讲座。所以4月22日,机器学习与Scikit-learn,你会发现我们有这个机器学习与Scikit-learn IPython笔记本。ipynb代表IPython笔记本。对于数据科学笔记本来说,这几乎是一种通用格式。我们可以有效地将这个笔记本导入到Databricks本身,并将它连接到您的集群,然后开始运行实际的笔记本本身。很简单,我们需要做的就是复制这个链接。我只需要进入这个IPython笔记本,复制链接,导航到我的Databricks社区环境,导航到home。你可以把它想象成一个文件系统。我们称它为Databricks文件系统。 Navigating to home, I see that I’m in my home directory as it were. And if I then right click, I can import, once I have the option to import from file or from URL, at this instance, I want to select the URL. And very simply if I have the given notebook here in GitHub, what I can do is paste in the URL and simply click Import. And that might take a second or three just to actually import this notebook for today.
所以,我再花一分钟左右的时间让每个人都跟上,只是为了确保我们都跟上了,如果在这个阶段有任何问题或问题,请引导他们进入聊天,如果你遇到任何麻烦,请告诉我们。
完美的。有了这些,让我们开始实际浏览我们的笔记本。也为我们今天所做的事情做了一点辩护。这是我们数据分析网络研讨会系列介绍的第三部分,我们实际上想做的是,在了解了数据分析,特别是Pandas,然后是Python的介绍之后,我们已经掌握了在机器学习管道中继续下一步的技能。我们今天要做的是,使用Scikit-learn。所以Scikit-learn可能是最受数据科学从业者欢迎的开源机器学习库之一。bob下载地址
在这节课中,我们要讲的,基本上是为什么是机器学习打下基础,我们要探索机器学习的类型。我真正想要武装你们的是能够识别问题的能力,在哪里可以应用机器学习,以及你可以应用什么类型的机器学习。我们将讨论一些特定的概念,比如训练Test Split,当我们谈论如何训练机器学习模型时,这是非常关键的理解。我们会特别使用Scikit-learn,我们会更深入地了解Scikit-learn是什么,我们为什么要使用它,然后还有我们将要用到的具体技术。这就是所谓的One-Hot编码,以及我们如何处理非数字的数据以及我们如何将其输入到我们的模型中。我们还会讲到一种叫做管道的东西。因此,我们如何将数据上的多个转换链接在一起,然后最后检查我们在构建模型时做得如何。我们想要做的是讨论评估指标,但是对于我们的用例,我们可以使用什么?
在整个过程中,我们将引用来自Scikit-learn的文档,特别是任何其他文档,并简单地为您提供一些上下文以及为什么我们使用这些技术。最后,我们今天将使用的数据集,我想,与我们所处的时代相关,所以它将是《纽约时报》和COVID-19的数据。所以,除了用机器学习的能力武装你们,也向你们展示和演示我们如何有能力将它应用到今天非常相关的话题上。
在我们开始之前,还有一个免责声明,我们今天要探讨的是线性回归。我从很简单的开始。
关于这个问题,我有一个警告,尤其适合我们现有的数据,线性回归可能不是最适合数据集的算法。然而,我们真正想要巩固的,是将机器学习应用于给定数据集的能力,而使用实际的Scikit-learn库更加困难,我希望我们可以通过Pandas读取数据,然后如何使用Scikit-learn来拟合模型。
有了这些,我想后退几步,给机器学习本身下个定义。我认为有很多神秘主义,尤其是来自媒体或者关于机器学习是什么。然后是更高层次的人工智能,你也会听到深度学习这样的术语。让我们退一步,区分一下这些术语的实际含义。特别是机器学习,我想回到这个非常简洁的定义,即机器学习是有效地使用一种算法,在不显式编程的情况下学习数据中的模式。因此,我们将有效地利用机器学习算法并向它们提供数据,因此我们不会提供明确的规则来告诉我们应该在那里做什么,但更多的是,我们把它留给实际的算法本身来揭示结构化数据并学习那些模式。所以有效地,我们为我们的算法提供数据,这实际上是一个将我们的特征映射到输出的函数。在我们今天的案例中,是某种形式的预测。
那么,机器学习在人工智能和深度学习的整个领域中处于什么位置呢?所以人工智能,我想,我们可以把它想象成一个笼统的术语,它指的是任何一种自动做某事的计算机程序。人们经常互换使用这些术语:AI、ML和深度学习。
但我们可以把它们看作是独立的实体。从某种意义上说,人工智能是一个更广泛的术语,有效地概括了任何使计算机能够模仿人类行为的技术。在此范围内,我们可以将机器学习视为人工智能的一个子集,由更先进的技术和模型组成,然后使计算机能够从数据本身推导出结构。
机器学习,我想,就像我说的,是一种从数据中学习模式的科学,而不是明确地编程。
特别是深度学习,我们使用特定的子集模型,在机器学习领域之外,还有一种叫做多层人工神经网络的东西。我们今天会讲到这个,从基本的开始。
就我们机器学习的类型而言,有效地,我想让我们做的是,就像我说的,能够辨别我们应该应用某些机器学习技术来解决什么问题。
就机器学习的类型而言,广义上,我们将其分为两种解决特定问题的特定范式。我的意思是,我们的数据有时有标签,我们的数据有时没有标签,然后我们有时可以使用的其他方法,有点具体化,我想从机器学习的一个这样的方法或这样的一个领域开始,叫做监督学习。有效地,我们可以把它分解成回归问题和分类问题。在回归问题中很简单,我们要做的是预测连续输出中的结果,本质上意味着我们将输入特征作为数据,我们要做的是将这些变量或特征映射到连续输出中。例如,在给定卧室数量的情况下,可以尝试预测房价。在这种情况下,我们会说我们有一个特征,我的意思是,如果我们要绘制它,它可能是卧室的数量,如果我们暂时忽略这里的坐标轴。也许是卧室数量,有人会假设房价会随着卧室数量的增加而上涨。但在这里,我们所做的是我们取一个特征,也就是这里的卧室数量,但是我们的输出,我们的目标特征,可能是房子的价格。今天不要混淆,我们用的是线性回归。线性回归只是整体回归的一个子集,我们可能遇到的监督学习问题。 And something to remember in particular, is that a regression problem is simply any problem or simply any supervised learning problem whereby our target is going to be a continuous variable. A classification problem, and is effectively where we’re trying to predict results which lie in a discrete output.
举个例子,在这个例子中,我们要做的是,特别是我想,我们可以用一个给定的例子来具体化,给一些可爱的狗和可爱的小猫的图像,我们能预测图像是狗还是猫吗?在这个例子中,我们输入数据,输出是一些离散的类别。
在这个例子中,如果它是两个输出中的一个,它就叫做二元分类,而如果我们有两个以上的类,它就叫做多类分类。在光谱的另一端,我们有一种叫做无监督学习的东西。与监督学习相反,在监督学习中,我们明确地标注了数据,想想我们的房价例子,如果我们给出一些卧室的数量,我们提供的例子中我们知道价格,然后我们要做的是预测一个新实例的价格或者我们得到新的数据,卧室的数量可以预测任何价格。在这个例子中,对于我们的分类监督学习问题,如果给我们一张新图像,我们能预测它是猫还是狗吗?然而,对于无监督学习,它更多的是,它是在一个实例的范围内,我们没有带有明确标签的数据。
这是一种有效的方法,我们试图从数据中推导出结构,而我们不一定知道变量的影响。举个例子,如果我们有一组客户的数据,我们有关于他们消费习惯的人口统计元数据,我们想做的是把这些客户聚类在一起。我们能做的就是使用某些无监督学习方法来创建这些聚类,并有效地从数据本身的固有结构中提取一些意义。
案例机器学习领域的一个小子集或越来越大的子集被称为强化学习。在一个非常简单的层面上,强化学习试图解决或设置的问题,本质上是弄清楚如何随着时间的推移将长期奖励最大化?
这实际上是对智能体进行编程,这是我们在对智能体进行编程时所使用的方法让它在特定情况下采取行动使奖励最大化。所以这个智能体与环境交互,它采取某种行动,它从环境中收到一些关于它做得如何的反馈。随着时间的推移,这个智能体的主要目标是采取这些行动来最大化奖励信号。今天,我们不会直接深入到强化学习中,但我们会从第一个回归问题开始第一个监督学习问题。所以我们要做的是,首先,导入我们的数据,这是《纽约时报》和COVID-19的数据,我们将使用一个线性回归模型来预测COVID-19导致的死亡人数。
它会说,这个数据集已经在Databricks上可用了。因此,一旦它启动并运行,您所要做的就是连接到您的集群。因此,一旦集群启动并运行,您应该会看到一个绿色圆圈。我们要运行的第一个单元格是,这个百分比FS, LS。让我运行一下然后我就能解释这个命令到底是做什么的。
当我们让它运行时,这个纽约时报数据集可以作为Databricks数据集,这意味着,一旦你进入社区版,或者在Databricks工作空间,我们就可以导入这个US States CSV文件并开始使用它。因此,percent FS只是一个命令,它允许我们浏览Databricks文件系统。我们看到我们有这个COVID-19数据目录,其中有我们的US States CSV。在我们加载之前,我想先讲一下这个数据集是什么。在顶部我们看到我们的github.com/newyorktimes。我要在单独的选项卡中打开这个。
所以,简单地说,正如我所说,我们将使用的数据集是《纽约时报》的COVID-19数据集,基本上他们所做的是跟踪冠状病毒的病例和死亡人数,以及美国每个州和每个县的病例和死亡人数。所以我们今天要做的是,看看我们如何使用这些数据,同时使用Pandas和Scikit-learn来建立一个线性回归模型。数据本身,我们会在导入时看到,由日期组成。因此,给定的记录病例数和死亡人数的日期,我们记录的州,我们会看到FIPS,我们不会使用这一列,但只是一个免责声明,它实际上是一个关于区域本身的地理指标。
对于将来的工作,您也可以使用它来连接其他外部数据源。作为一个指示器,除非你想和我们使用的数据结合。这个州某一天的病例数,以及死亡人数。回到我的笔记本,我们要做的是导入读取文件,这个CSV文件。我们要用熊猫来做这件事。如果你关注了上周Connor的网络研讨会,我们知道,我们可以导入Pandas as pd,我们可以读取CSV文件,只需输入pd。readcsv。Df。然后Head会给我们这个数据集的前五行。注意这是0下标,所以是0 1 2 3 4。我们看到我们有日期,州,FIPS病例和死亡人数。 If we want to see how many rows and columns we have, we can quickly get that by calling df.shape. So we see that we have 2385 rows and five columns.
在我们真正开始构建这个模型之前,让我们做一些探索性数据分析。所以在数据中发现特定的模式并对数据本身有基本的感觉。所以我们要做的第一件事是检查病例和死亡之间的关系。看看这两者之间是否有联系。
最初,我们想做的,只是过滤到某一天。所以我要过滤到4月14日。要做到这一点,我们要做的是从数据帧上方获取df,然后将日期列子集为4月14日。
我们接下来要做的是把它画出来。我们有一个数据帧,我们能做的就是在上面调用。plot然后把x轴提供给我们的图,y轴是我们想要的死亡数。这只是一个简单的散点图。图形大小,最后,我们还要给它一个标题。
如果我运行这个,我们需要的是matplotlib内联。
是的,你实际上可能需要的,如果它不为你运行,就是这个简单的命令。输入%matplotlib inline。
如果这对你不起作用,一定要联系你的助教,他们可以帮助你。这实际上只是让我们可以画出来。把它拆开分析一下。正如我们所看到的,而且可以预料的是,我们看到病例数量或随着病例数量的增加,死亡人数也在增加。我们清楚地看到,我们在纽约和新泽西有显著的异常值。鉴于最近这些国家的病例和死亡人数很高的消息,这也是意料之中的。特别地,我们要看的是没有这些异常值的数据集。如果我们取新泽西和纽约,会发生什么呢?要做到这一点,我们要做的是,提供这两个条件。也就是供给不等于纽约的dfstate不等于新泽西的dfstate。
再看一下这个头部,我的意思是,我们不能说它们不包含在里面,但是我们能做的是画出它。这和我们之前看到的细胞差不多。我们要做的是,再一次过滤到4月14日,我称之为相同的绘图功能。所以用散点图来绘制死亡案例
然后我们要做的是问这部分,纽约和新泽西正如标题中解释的那样。对于最后这一行,我要指出的是,有效地将这些标签应用到每个数据点上。因此,以各州的病例和死亡为例,调用.apply,实际上对每一行都是相同的,并解包这些不同的标签。
正如我们所看到的,如果没有纽约和新泽西,我们可以更好地了解数据的样子。我们看到密歇根州、CMS和路易斯安那州的病例和死亡人数都很高。
最后,我们想看看纽约和加州的对比。让我们看看它们在COVID-19死亡人数方面是如何比较的。一开始,我们要做的是创建一个数据帧从中我们创建或子集到纽约州等于纽约州然后过滤到该州等于加州。我们还需要对数据进行枢轴变换,这样我们就可以画出来了。这里我们要做的是用这个作为数据坐标系的下标。然后我们要做的是,把状态作为列,最上面的变量,然后是值。Fill in a基本上是说如果有任何空值,就用值0来填充。
所以我们可以看到,从1月25日开始,没有死亡病例。然后我们看到从3月17日到18日,他们迅速增加。我们看到了快速增长。为了实际绘制,让我们在数据帧上调用相同的。plot功能,这一次,让它成为一个线形图。
好的,我看到了另一个问题,这个apply是什么?这有效地将状态拆开,并将它们标记在我们的图表上。
正如我们在这里看到的,随着时间的推移,我们看到随着时间的增加。加州的死亡人数,抱歉,是死亡人数,增长非常缓慢,但我们看到纽约也在呈指数级增长。再一次,从新闻中可以预料到,但是我们看到死亡率的增长有很大的差异。
从我们的探索性数据分析开始,让我们开始做一些机器学习。
我问的一个核心理论就是我们要做的建模就是如何分割数据。所以我们做了所谓的火车测试拆分,研究我们为什么这么做的基本原理。我们从一个完整的数据集开始,这是为我们的监督学习问题准备的,我们有标记的数据,我们从完整的数据集开始。然后我们将把数据分成训练集和测试集。这个训练集是我们用来适应模型的数据集。所以我们的模型会从我们可能有的数据中学习模式,n × d, n是行数,d是特征的数量。每一个实例,或者说每一个输入,都有一个给定的标签。接下来我们要做的是拟合我们的模型然后我们要做的是评估我们的模型在这个测试集上的表现。这个测试集是为了检验我们的模型在训练集之外的泛化效果。这都是为了适应你的训练集,但我们想看的是它在实际中的表现。
因此,将我们的模型拟合到我们的训练集之后,我们就可以根据我们的测试集进行预测,并评估我们做得如何。这就是我们得到准确性的地方,对给定的测试集进行预测,看看我们的预测和这个测试集的实际标签相比有多好。
这就是我们如何迭代和更新我们的模型,如何改进我们的模型,一旦我们有了令人满意的准确性,我们就可以使用我们的模型并预测进入的新实体。然而,这里需要注意的是,我们正在处理的是一种称为临时数据的东西。时态数据实际上是指基于时间的数据。时间序列数据,我们每天都在做。
这里我们要做的不是随机分割,随机选择一部分数据作为我们的训练集和一部分数据作为我们的测试集,我们要做的是我们将使用从3月1日到4月7日的所有数据来实际训练模型。然后我们将它作为我们的测试集,4月8日到4月14日,作为我们的测试集。这将有效地让我们评估我们的模型做得有多好。为了做到这一点,我们要做的是,创建一个列车数据帧和一个测试数据帧。对于这个原始数据帧,我们要过滤到大于等于3月1日,小于等于4月7日。对于我们的测试集,我们会选取4月7日之后的任何日期。所以实际上是4月8日到4月14日。
然后我们要做的是创建所谓的x序列数据帧,也就是这组特征,n × d的特征,然后是y序列,这是训练数据的标签。然后我们要对我们的测试集做同样的事情,我们有案例,然后我们的标签,或者我们试图预测的东西,是死亡。那么根据病例数量,我们能预测死亡人数吗?
就像我说的,我们将从我们使用的模型开始,我们将使用线性回归。线性回归几乎是作为数据科学家学习的第一个模型。它非常强大,也非常流行,但它的假设也相当简单,但它允许我们为某些用例匹配一个相当好的模型。在这种情况下,我们要做的是有效地将一条线拟合到数据中。这在数学上看起来是这样的,用y帽表示。
所以任何时候你在这里看到一顶帽子或一个特定的符号,它实际上意味着一个预测。那么我们能根据这个方程预测或生成一个预测吗?所以w0或者是w0的子集,意思是我们经过这个截距的权值,加上特征的权值。
我们实际上是说,我们可以,或者我们想要接近y,所以死亡人数的真实值,考虑到我们的预测,还有一些误差项。所以实际上,我们所做的是在数据中寻找一条直线,请注意,这不是我们实际拟合的数据,而纯粹是线性回归如何工作的一个例子。但我们实际上是在通过数据拟合一条直线,使每个数据点与给定直线之间的距离最小化。这意味着每当我们看到一个新的实例,我们就会说,好吧,我们用这条线来预测x = 0.4时,我们就会看到y的位置并预测y的值。这里,我们要用Scikit-learn来拟合这个线性回归模型。我要给大家看Scikit-learn,线性回归模型文档。这里我们拟合一个普通的最小二乘,线性回归,普通最小二乘有效地说我们在最小化直线上这些点之间的距离。我们可以看到,我们可以传入这些参数,比如拟合截距,归一化。我现在还不担心这些。我们能做的就是指定默认值,默认参数,我们要做的是从sklearn导入线性回归之后。线性模型,我们用括号表示线性回归,有效地说使用默认值,然后在x-train和y-train上调用。fit。
然后我们要做的是打印,哦,对不起,我忘了运行上面和下面的单元格。我们看到的是死亡人数,在这个例子中,我们的直线方程。拟合了一条使距离平方和最小的直线后,拟合的直线不在方程中,减去8.9911加0.0293例。让我们来分析一下这意味着什么。这实际上是说,如果病例数为0,死亡人数实际上小于0,这说不通。所以我们可以把截距设为0,这实际上意味着我们迫使这条线经过0,在这种情况下,直观上是有意义的。如果我们没有病例,那么我们就预测没有死亡。
让我们再进行一次拟合,尽管这次,我们会说fit intercept为false,然后再一次拟合到x序列和y序列上。
我们来看看方程是什么样的。所以死亡人数是。029乘以患病人数。我们怎么解释呢?我们实际上是说,作为单位增加的情况,抱歉,如果我们增加一个单位的病例,平均来说,我们增加了0.029的死亡人数。实际上,这意味着数据集的死亡率为2.9%。我们所知道的是,一些州的死亡率高于其他州。所以我们能做的就是把状态作为一个特征。
然而,要做到这一点,我们需要介绍一种叫做One-Hot编码的东西。所以本质上,我们需要输入到模型中的,是数值数据,然而,我们的状态数据将是非数值数据。处理非数值特征的一种方法,叫做one - hot编码。
为了把数据输入到我们的模型中,就像我说的,我们如何进行单热编码,这里我们不能做什么?如果我们考虑一个非常简单的例子,其中我们有纽约州,加利福尼亚州和路易斯安那州,我们能简单地将这些编码为纽约州等于1,加利福尼亚州等于2,路易斯安那州等于3吗?本质上,这意味着加州是纽约州的两倍,路易斯安那州是纽约州的三倍,我们实际上是在这些输入之间引入了一种虚假的关系。一个想法是创建一个虚拟特征。基本上,虚拟特征是,二进制的1或0对于给定的实例,或者给定的行,无论该实例是否适用于那个状态。所以这里纽约是100,加州是010,路易斯安那是001。这就是所谓的One-Hot编码。所以我们可以做的是One-Hot编码我们的状态。所以让我们首先尝试,导入One-Hot Encoder。我们将使用我们的训练和测试数据框架,我们会说用例和状态,所以预测我们想要输入的特征,我们将适合我们的模型,然后我们将定义这个One-Hot Encoder。 So handle unknown is basically saying, if when we go to fit this again, and we come across a state that we haven’t seen before, ignore that. So essentially, in this instance, it will be if we don’t see anything that is New York, California or Louisiana, ignore that instance. We’re also going to set this sparse to be false. This is purely from a consideration of how you store sparse values. So for example, if we have many, many zeros, so if we had many states, and in effect we would then have many zeros, what we could do is optimize the way we store this data by only storing the nonzero values. So we’re gonna take our defined One-Hot Encoder, and we’re going to fit that to the train set and then transform it to a train set.
一旦我们这样做了,我们看到的是这个二进制编码的数据,不好意思,是One-Hot编码的数据,但是我们看到它是以二进制的方式。所以剩下的元素是1,然后是0。让我们快速检查一下它的形状,看看它是否有意义。
在我们将训练集拟合并转换到你的训练集之后,我们看到我们有1754行,然而,我们有914列。所以有些地方不太对。当然没有914个不同的州。
我们要做的是看一下这些类别。最引人注目的是我们有这些数字。
只有这样,我们才能把状态作为一个类别。
所以这里发生的不仅仅是单热编码的状态,还有情况。这是我们指定的另一个特征。
我们现在要做的是使用列转换器,在这里我们只能指定一个列,或者在这个例子中使用one - hot Encode。这里,我们通过给列转换器一个名字来定义它,所以任何名字都可以。然后我们会指定实际对象是什么。enc是上面的One-Hot编码器。
提醒= pass through,这实际上意味着任何其他不是状态的列,只传递它们,不应用于。那么列转换器。拟合变换到我们的火车,或者x-火车检查一下形状,我们现在有56列了,为什么是56列呢?这里也有领土,比如维尔京群岛,北马里亚纳群岛。
所以不仅仅是州在里面。
所以把这些都放在一起,我们能做的是,创建一个所谓的管道。这个管道允许我们做的是,将一系列不同的转换连接在一起。它还允许我们做的是确保我们对训练集做的任何事情,我们也可以对测试集做。在我们的管道中,我们要指定的是列转换器,然后是线性回归模型,我们要把它和x轴和y轴匹配起来。然后我们会创建一个对管道模型的预测。predict on x test。
然后我们可以看看我们的表现如何。
所以我们现在有了一个新的模型。本质上,对于我们的情况和特征我们有了不同的系数。如果我们真的看一下这个,看看不同州的系数,以及我们解释这些的方式,如果我们有一个正的,那么路易斯安那州的影响,明显高于低的。所以随着这个系数的增加,它有效地表明那里的死亡人数在增加。我说的是在其他变量不变的情况下。
你在这里看到的一些东西,纽约是负面的,我们看到加州也是相对负面的。
所以最终我们需要评估我们的模型在这些预测方面的表现如何。
对于回归模型,特别是监督学习,我们想做的是评估我们的模型在未见数据方面的表现如何。我们用RMSE来评估它。所以RMSE实际上是,均方根误差的平方。所以请不要让这些数学问题让你失去兴趣。如果我们一点一点地分解,我们就能证明,这是一个很好的回答问题的方法,我们期望我们的模型在下一次预测中诚实的距离有多远?评估我们的模型做得如何的一种方法是,首先对我们拥有的每一个标签进行评估。我们要减去给定实例的预测值。然后我们要取误差的平方,也就是我们从实际值中减去预测值,平方它,然后把它们加起来,除以实例数,然后取它的平方根。我们最终能做的是,引入均方误差。然后我们可以计算它的平方根得到均方误差和RMSE。 And what we’re effectively saying is that, kinda, on average, how far off should I expect myself to be on my next prediction? Just very quickly, visualizing our predictions themselves to see how we did, what we can do see that we have our predicted deaths here and our actual deaths here. And we do this by concatenating together our two data frames and getting our predicted deaths together as well. So I know I’m running close to the time. So I do wanna stop just now and then any questions come through if we do have time for them. But hopefully you’re able to follow along. Hopefully you can take away some things here. Lastly, if you do want to apply some of these methods, do check out Scikit-learn in general, but also datasets that you can openly use from the UCI ML Repository and then also Kaggle as well, which you could then actually earn money from as well. So thank you. And if we do have time, I’d be more than happy to take questions.
-所以现在一个常见的问题是,你为什么要使用Scikit-learn的one - hot Encoder而不是pd.getdummies?当然,如果我滚动到上面,这里是我们的实现,One-Hot Encoder,它允许我们处理未知。基本上,使用get dummies,你要做的是将它应用到数据帧,它将那个应用到给定的数据帧。这里我们可以选择处理未知特征如果它们出现了,我们也可以引入存储稀疏向量的方法来解压我们实际存储这些值的空间。
-嘿,凯伦。我不知道我们还有多少时间来回答其他问题,因为我知道时间到了。-是的,我只是在聊天里发了消息,你知道的,如果有人需要退出,不用担心。我想我们还有几分钟时间,我们可以回答一些其他问题,如果需要离开,大家可以离开。我们正在录音,所以如果你们还有其他觉得有意义的问题要回答,如果每个人都有多余的几分钟,让我们花几分钟。
-好吧,如果你想花点时间回答一些单节点和分布式的问题,还有很多其他关于Spark和Koalas如何适应整个情况,以及MLlib和Scikit-learn的问题。——确定。所以我想说的是,我的意思是,如果我们把它拆开一点,Koalas想要做的是,有效地使用Pandas API,但在Spark之上。因此,我们在这里所做的关于Pandas的数据处理的很多工作,都可以影响到Koalas的端口。koalas是一个开源包,它位于Apache Spark之上。bob下载地址我们在这里所做的都是在单节点上。对于单节点,我们说的是它没有以任何方式分布。如果您正在考虑使用大量数据,那么您可以有效地将这些数据分布到集群中。这么多不同的虚拟机,这就是Spark正在做的事情。然后Koalas允许我们使用完全相同的语法,但在底层,它使用Apache Spark来分发数据。 So with Koalas, you can do really large scale data processing, and especially if you have existing Pandas code, you can very quickly convert it to Koalas. Simply, instead of import Pandas as pd, you could do import Koalas as ks. And then it would be a simple change of one to one mapping of the actual API itself.
——太棒了。还有一些人问了关于Scikit-learn和MLlib之间的区别的问题,如果你想讨论一下的话。-当然。这又回到了我刚才说的关于单节点设置和分布式设置的问题。所以Scikit-learn是基于单节点的我们在一台机器上工作。所以即使在Databricks的环境中,我们建立了一个集群,当我们运行Scikit-learn时,本质上,我们只是在驱动上运行,所以它不是以任何方式分布的。Spark MLlib本质上是分布式的。当我们调用MLlib模型时,就会有底层算法。Spark的机器学习库,所有与拟合数据相关的事情都是以分布式的方式完成的,而Pandas和Scikit-learn则是在单节点设置中完成的。——太棒了。 All right, and then there’s still quite a few questions about the One-Hot Encoder, if you could go back there. – Yeah, sure. – One of the questions is about what the ignore parameter does, and the other one about sparse equals false, they thought they were only supposed to see ones.
-是的,处理未知。有效地,我们在训练和测试集的背景下思考这个问题。所以当我们把这个One-Hot Encode放到我们的训练集中时,在这种情况下,我们会看到一定数量的状态。
当我们把这个放进我们的测试集时会发生什么,如果有一个我们以前没见过的状态会发生什么,我们需要告诉One-Hot Encoder该怎么处理它。我们能做的就是有效地告诉它出错,如果发生了错误如果你把它放进测试集,它看到了以前没见过的东西,或者我们可以简单地处理,忽略,我们不处理这一行,不使用它。在这个稀疏等于假的情况下,如果我们让稀疏等于真,实际上,会发生什么,就是我们如何表示这个数组。所以sparse = false,意思是我们不存储为稀疏向量,一个稀疏向量,就像我说的,我们只存储非0值的值和下标。
-太好了,然后有人问了一个问题,没有考拉,你如何在Spark和Pandas之间来回切换。
- Spark和Pandas之间?——嗯。-是的,如果你有一个Spark数据帧,这很简单,你调用。topandas,这将给你一个Pandas数据帧。周围的一个警告我,小心你的数据量在数据帧火花然后你想转换成熊猫数据帧,在某种意义上,如果你有一个数据帧,分布在集群中,每当你叫.topandas,有效地在做什么,是你把所有的数据到驱动程序,所以你可以有效地崩溃你的司机,如果你没有足够的内存。
-是的,对我来说,我想在此基础上补充的另一件事是,你可以随时将数据保存到磁盘,将其直接保存到CSV文件中,然后你可以使用Pandas将其读入或Spark将其读入。-是的,说得好。好的,最后一个问题是关于列变换的。似乎人们对管道如何工作以及它如何应用于测试数据集有一点困惑,如果你想再次覆盖它。-当然了。对于列转换器,我们所做的是,如果我回到enc,就是有效地使用One-Hot编码器,我们要做的是将它应用到state。所以当我们应用我们的,当我们调用拟合转换器,或者拟合变换,使用列转换器到我们的x-train,有效地发生的是,它在寻找一个状态列,然后它会应用这个One-Hot Encoder形状。所以我们要做的,还有我们的管道,就是这些阶段。我们的第一步是这个列转换器,在这个列转换器中,我们将One-Hot Encoder应用到state,其他的东西,我们也会通过。事实上,我们也有case作为一个特性,我们也会保留,但我们只会把One-Hot Encoder应用到state。 It effectively allows us to apply One-Hot Encoder to only one variable.
-很好,然后我想有个问题是关于如何把它应用到测试集上。-是的,然后把它应用到,我的意思是,这是一样的,它会调用。fit到你的测试集。如果我们有了管道模型,你就可以在你的测试集上做。predict,它要做的就是把这些相同的步骤应用到你的测试集上。这样我们就有了适合训练数据和训练集的管道模型。当我们在测试集上调用预测时,实际上发生的是,我们在运行这个管道。我们将把相同的列转换器应用到您的测试集,然后根据我们拟合的线性回归模型应用预测。
-好了,凯伦,你还有时间问问题吗,还是就到这里吧?-再问一个问题,然后就结束。-好的,还有一个问题是fit_transform做什么?我认为。fit和。transform有一些混淆。-当然了。
如果我们将上面的比较,那么我们将。fit调用到我们的训练集,然后。transform, .fit transform有效地将这两步结合在一起。在这个例子中,我们要做的就是拟合和变换x轴。所以这个的结果输出将是一个形状的数据帧。我们有行,但是,看看我是否调用,看看它是什么样子的,我们会有一个数组。所以有效地,我们有了情况的数量,还有One-Hot Encoded列。所以它已经完成了,基本上,它既拟合又转化为x列。
——太棒了。好了,这就是我们的提问时间。凯伦和凯莉,你们想宣传下一期Spark研讨会吗?-当然。谢谢大家参加我们的节目。我们四集系列节目的第四集将于下周三29日播出,同一时间,太平洋时间上午10点,我们希望大家都能参加。我会把所有东西的链接发给你,看起来凯利已经把它放到聊天里了。谢谢你!所以我希望你能加入我们。谢谢你,尼尔,精彩的演讲。