计算机如何画出平滑的线条?
将用于追踪数据点连线的统计技术背后的一些直觉可视化
如果我让你在一堆点之间画一条平滑的线,你可能会做得很好。这也是记者们一直在做的事情,用计算机图形来展示他们数据的趋势。但是我们如何从第一个例子转到第二个例子——计算机如何复制我们在描绘线条时的直觉?
一种这样的方法被称为核回归(或者更具体地说, Nadaraya-Watson 核回归),它使用以下等式来估计输入 x 的因变量 y :
如果你是那种一旦一个数学方程式出现就放弃一篇文章的人,我劝你留下来,因为这实际上比看起来要简单,我们将在下一段之后完成数学。
上面的等式只是说,我们可以通过对现有点进行加权平均来估计任何新点。 x-xi 项测量我们的新点和旧点之一之间的距离,并且 K 函数(内核)在乘以伴随的 y- 值之前基于该距离分配一个权重。将所有这些加权点相加,您将获得一个基于所有旧点的值的新点的估计值(分母确保权重总和为 1)。
这当然是一种更明确的技术方法,我们本能地在数据中划线:考虑接近的点,而忽略其余的大部分,尤其是那些最远的点。
如果这仍然没有意义,那么…很好!这篇文章的目标是直观地理解内核是如何工作的,而不是数学上的。我们最终的成果将会是一张 GIF 图,清晰地展示了一个运行中的内核,它画出了一条平滑的线。从现在开始,我们将使用 R 来写一些代码,如果你熟悉这种语言或者忽略它,你就可以理解。
首先我们需要一些假数据。我们将为我们的 x- 值数到 100,并且为了创建一个体面的曲线响应,我们的 y- 值将是 x 的平方和 x 的正弦的乘积(缩小到一个周期)。自然地,我们会添加一些噪声来动摇这些点的基本功能。
使用 R 包 ksmooth ,我们可以很容易地使用我们刚刚定义的内核回归为这些数据画一条平滑的线。“正常”一词指定了我们使用的内核类型,而带宽设置了它的灵敏度——带宽越小,平滑线就越优先考虑非常接近的点。
现在,在我们看到中间步骤之前,内核包自动实现了前面的等式——这毕竟是统计软件的目的——但我们需要每个点的权重的实际值,以便我们可以直观地看到它们对曲线的影响。
因为我们使用的是高斯核,所以周围点的权重是正态分布的,峰值出现在距离 0 处(也就是说,处的是正在讨论的新点),我们可以使用 R 的 dnorm 函数来计算。冒着做一些经典数学手势的风险,我会忽略下面的“比例”线——简而言之,这是我们将由四分位数定义的 ksmooth 带宽转换成适当的正态分布的方式。
现在我们有了一种方法来表达进入内核估计的每个周围点的权重,我们可以使用点的大小和颜色来可视化它。更具体地说,对于光滑线上的任何一个新点,现有点的影响都是通过它们有多大和多红来体现的。比如这里是点 x = 50:
本质上,如果我们跟踪平滑线到它落在值为 50 的 x- 上的地方,我们会得到周围点的平均值,这些点具有由它们的大小和颜色表示的各种权重。附近的点对平滑器的影响很大,因此又大又红;更远的点几乎可以忽略不计,因此又小又蓝。
让我们想象一下。通过对 1 到 100 之间的每个 x 值进行相同的计算和可视化,我们可以生成一堆图像,然后将它们拼接成一个漂亮的小 GIF。这就像在 for 循环中执行上述代码一样简单,然后将各个图像上传到一些免费的在线软件中来创建 GIF:
如果 GIF 因为某种原因没有加载,也是这里
这在某种程度上是对内核回归的权宜之计。当然,我们可以解开更多的等式,或者使用不同的内核和不同的带宽。
但是我们最终的 GIF 仍然说明了平滑内核背后的概念。此外,这有点像我们在窥视电脑的脑电波,因为它决定在画线时要考虑哪些点。反过来,这个过程对于任何用传统的手工方式做过类似事情的人来说都是非常熟悉的。
感谢阅读。我其他的大部分统计思想都可以在我的博客上找到,conflem . city。这里的完整代码是 。
人脸检测程序是如何工作的?(使用神经网络)
神经网络人脸检测初学者指南
Cover image: Face Detection // Source
最近,我一直在玩一个用于人脸检测的多任务级联卷积网络(MTCNN)模型。该模型具有三个卷积网络(P-Net、R-Net 和 O-Net ),能够在保持实时性能的同时超越许多人脸检测基准。但是,它到底是如何工作的呢?
注: 如果你想要一个如何处理人脸检测神经网络的具体例子,我在下面附上了 MTCNN 模型的下载链接。下载后,打开。/mtcnn/mtcnn.py 并滚动到 detect_faces 函数。这是您在实现该模型时会调用的函数,因此浏览该函数会让您了解程序是如何计算和缩小边界框和面部特征的坐标的。但是,我不会一行一行地解读代码:这不仅会使本文变得冗长,而且对大多数读者来说也是适得其反的,因为代码中的许多参数只适用于这个特定的模型。
Image 1: MTCNN Structure // Source
第一阶段:
显然,要做的第一件事是向程序传递一个图像。在这个模型中,我们想要创建一个图像金字塔,以便检测所有不同大小的人脸。换句话说,我们希望以不同的尺寸创建相同图像的不同副本,以便在图像中搜索不同尺寸的人脸。
Image 2: Image Pyramid // Source
对于每个缩放副本,我们有一个 12 x 12 的阶段 1 内核,它将遍历图像的每个部分,扫描人脸。它从左上角开始,是图像从(0,0)到(12,12)的一部分。图像的这一部分被传递给 P-Net,如果 P-Net 注意到人脸,它将返回边界框的坐标。然后,它将对部分(0+2a,0+2b)到(12+2a,12+2b)重复该过程,一次将 12 x 12 内核向右或向下移动 2 个像素。2 个像素的移动被称为步距,或者内核每次移动多少像素。
步长为 2 有助于降低计算复杂度,而不会显著牺牲精度。由于大多数图像中的人脸都比两个像素大得多,所以内核仅仅因为人脸移动了两个像素而错过它是极不可能的。同时,你的计算机(或任何运行这段代码的机器)将有四分之一的运算量要计算,使程序运行得更快,内存更少。
唯一的缺点是,我们必须重新计算与步幅相关的所有指标。例如,如果内核在向右移动一步后检测到一张人脸,输出索引将告诉我们该内核的左上角在(1,0)。但是,因为步幅是 2,所以我们必须将索引乘以 2 才能得到正确的坐标:(2,0)。
每一个核相对于一幅大图像来说都要小一些,所以它能够在大图像中找到更小的脸。类似地,相对于较小尺寸的图像,内核会更大,因此它能够在较小尺寸的图像中找到较大的人脸。
Video: Kernels can find smaller faces in larger images, and bigger faces in smaller images.
传入图像后,我们需要创建图像的多个缩放副本,并将其传入第一个神经网络——P-Net——并收集其输出。
Image 3: Sample output for P-Net. Note that the actual output has 4 dimensions, but for simplicity, I’ve combined it into a 2-dimensional array. Also, the coordinates for the bounding boxes are values between 0 and 1: (0,0) would be the top left corner of the kernel, while (1,1) would be the bottom right corner of the kernel.
P-Net 的权重和偏差已经被训练,使得它为每个 12×12 核输出相对准确的边界框。然而,网络对一些盒子比其他的更有信心。因此,我们需要解析 P-Net 输出,以获得每个边界框的置信度列表,并删除具有较低置信度的框(即,网络不太确定是否包含人脸的框)
Image 4: Standardizing kernel coordinates by multiplying it by the scale
在我们挑选出具有较高可信度的框后,我们必须标准化坐标系,将所有坐标系转换为实际的“未缩放”图像的坐标系。由于大多数内核位于缩小的图像中,因此它们的坐标将基于较小的图像。
然而,仍然有许多边界框留下,并且它们中的许多重叠。非最大抑制,或 NMS,是一种减少边界框数量的方法。
在这个特定的程序中,NMS 是通过首先根据置信度或得分对边界框(以及它们各自的 12×12 个内核)进行排序来进行的。在其他一些模型中,NMS 采用最大的包围盒,而不是网络最有信心的那个。
随后,我们计算每个核的面积,以及每个核与得分最高的核之间的重叠面积。与得分高的内核重叠很多的内核会被删除。最后,NMS 返回一个“幸存”边界框的列表。
Image 5: Non-Maximum Suppression
我们对每个缩放的图像进行一次 NMS,然后对每个尺度中所有幸存的内核再进行一次。这消除了多余的边界框,允许我们将搜索范围缩小到每张脸一个精确的框。
为什么我们不能只选择可信度最高的盒子,把其他的都删掉呢?上图只有一张脸。然而,在其他图像中可能有不止一张脸。如果是这样,我们将会删除其他面的所有边界框。
之后,我们将边界框坐标转换为实际图像的坐标。现在,每个边界框的坐标是一个介于 0 和 1 之间的值,其中(0,0)是 12 x 12 内核的左上角,(1,1)是右下角(见上表)。通过将坐标乘以实际的图像宽度和高度,我们可以将边界框坐标转换为标准的实际大小的图像坐标。
Image 6: Here, the red box is the 12 x 12 kernel, while the yellow box is the bounding box inside it.
在此图中,红框代表 24 x 24 内核,大小调整回原始图像。我们可以计算内核的宽度和高度:1500–200 = 300,1800–500 = 300(注意宽度和高度不一定是 12。这是因为我们使用了原始图像中内核的坐标。这里我们得到的宽度和高度是当缩小到原来的尺寸时内核的宽度和高度。)之后,我们将包围盒坐标乘以 300: 0.4x300 = 120,0.2x300 = 60,0.9x300 = 270,0.7x300 = 210。最后我们加上内核的左上坐标,得到包围盒的坐标:(200+120,500+60)和(200+270,500+210)或者(320,560)和(470,710)。
由于边界框可能不是正方形的,我们通过拉长较短的边将边界框整形为正方形(如果宽度小于高度,我们向侧面扩展;如果高度小于宽度,我们就垂直展开)。
最后,我们保存边界框的坐标,并将其传递给阶段 2。
第二阶段:
有时,图像可能只包含从框架侧面窥视的脸部的一部分。在这种情况下,网络可能会返回一个部分超出框架的边界框,就像下面照片中 Paul McCartney 的脸:
Image 7: The Beatles and their bounding boxes. Paul McCartney’s box is out of bounds and requires padding. // Source
对于每个边界框,我们创建一个相同大小的数组,并将像素值(边界框中的图像)复制到新数组中。如果边界框超出边界,我们只将边界框中的图像部分复制到新数组中,并用 0 填充其他所有内容。在上图中,麦卡特尼脸部的新数组在盒子的左侧有像素值,在右边附近有几列 0。这个用 0 填充数组的过程叫做填充。
填充边界框数组后,我们将它们的大小调整为 24 x 24 像素,并将其归一化为-1 到 1 之间的值。目前,像素值在 0 到 255 之间(RGB 值)。通过将每个像素值减去 255 的一半(127.5)并除以 127.5,我们可以将它们的值保持在-1 和 1 之间。
现在我们有了许多 24 x 24 的图像数组(与阶段 1 中幸存的边界框的数量一样多,因为这些边界框中的每一个都已被调整大小并归一化到这些内核中),我们可以将它们输入 R-Net 并收集其输出。
R-Net 的输出类似于 P-Net 的输出:它包括新的、更精确的边界框的坐标,以及每个边界框的置信度。
再一次,我们去除具有较低置信度的盒子,并且对每个盒子执行 NMS 以进一步消除冗余的盒子。由于这些新边界框的坐标是基于 P-Net 边界框的,我们需要将它们转换成标准坐标。
标准化坐标后,我们将边界框整形为正方形,以传递给 O-Net。
第三阶段:
在我们可以从 R-Net 传入边界框之前,我们必须首先填充所有超出边界的框。然后,在我们将框的大小调整为 48 x 48 像素后,我们可以将边界框传入 O-Net。
O-Net 的输出与 P-Net 和 R-Net 略有不同。O-Net 提供 3 个输出:边界框的坐标(out[0])、5 个面部标志的坐标(out[1])和每个框的置信度(out[2])。
再一次,我们去除了具有较低置信水平的框,并且标准化了边界框坐标和面部标志坐标。最后,我们让他们通过最后一个 NMS。此时,图像中的每个面应该只有一个边界框。
交付结果:
最后一步是将所有的信息打包到一个字典中,字典有三个关键词:“盒子”、“信心”和“关键点”。“框”包含边界框的坐标,“置信度”包含每个框的网络置信度,而“关键点”包含每个面部标志(眼睛、鼻子和嘴的端点)的坐标。
当我们想在自己的代码中实现这个模型时,我们所要做的就是调用 detect_faces,我们将得到这个字典,其中包含绘制边界框和标记面部特征所需的所有坐标。
下面是整个过程的简短总结:
第一阶段:
- 传入图像
- 创建图像的多个缩放副本
- 将缩放图像输入 P-Net
- 收集 P-Net 输出
- 删除低置信度的边界框
- 将 12 x 12 内核坐标转换为“未缩放图像”坐标
- 每个缩放图像中内核的非最大值抑制
- 所有内核的非最大抑制
- 将边界框坐标转换为“未缩放图像”坐标
- 将边界框整形为方形
第二阶段:
- 填充未装订的盒子
- 将缩放后的图像输入 R-Net
- 收集 R-Net 输出
- 删除低置信度的边界框
- 所有框的非最大抑制
- 将边界框坐标转换为“未缩放图像”坐标
- 将边界框整形为方形
第三阶段:
- 填充未装订的盒子
- 将缩放图像输入 O-Net
- 收集 O-Net 输出
- 删除低置信度的边界框
- 将边界框和面部标志坐标转换为“未缩放图像”坐标
- 所有框的非最大抑制
交付结果:
- 将所有坐标和置信度打包到一个字典中
- 归还字典
最后备注:
这个模型与我以前遇到的模型很不一样。它不仅仅是一个普通的旧神经网络:它利用一些有趣的技术来实现高精度和更少的运行时间。
低计算复杂度导致快速运行时间。为了实现实时性能,它使用步长 2,将操作数量减少到原来的四分之一。在边界框坐标被校准之后,它直到最后一个网络(O-Net)才开始寻找面部标志,这甚至在它开始计算之前就缩小了面部特征的坐标。这使得程序快了很多,因为它只需要在通过 O-Net 的几个盒子中找到面部标志。
深度神经网络实现了高精度。拥有 3 个网络(每个网络都有多个图层)可以提高精度,因为每个网络都可以微调前一个网络的结果。此外,该模型采用图像金字塔来查找大脸和小脸。即使这可能会产生大量的数据,NMS,以及 R-Net 和 O-Net,都有助于拒绝大量的错误边界框。
看着这个模型的高性能,我不禁想知道我们还可以利用这个模型做什么。它能识别某些动物吗?某些车?能不能调成既能做面部识别,又能做面部检测?这个模型——以及它的应用——给了我们无数的未来应用。
点击此处下载 MTCNN 论文和资源:
- Github 下载:【https://github.com/ipazc/mtcnn
- 研究文章:http://arxiv.org/abs/1604.02878
一个推荐引擎到底是怎么工作的?
在我们上一篇博客中,我们了解了推荐引擎的基本知识以及不同类型的推荐引擎。听了这么多关于推荐引擎的介绍,你一定很想了解它实际上是如何工作的,以及它是如何向客户展示他/她最可能喜欢的东西的。根据文章在计算引擎上使用机器学习进行产品推荐,典型的推荐引擎通过以下四个阶段处理数据,即收集、存储、分析和过滤。
数据收集:
创建推荐引擎的第一步是收集数据。数据可以是显式数据,也可以是隐式数据。显式数据将由用户输入的数据组成,例如对产品的评级和评论。隐式数据将是订单历史/退货历史、购物车事件、页面视图、点进和搜索日志。将为访问该网站的每个用户创建该数据集。
行为数据很容易收集,因为你可以在你的网站上记录用户的活动。收集这些数据也很简单,因为它不需要用户的任何额外操作;他们已经在使用这个应用程序了。这种方法的缺点是更难分析数据。例如,从不太需要的日志中筛选出需要的日志可能很麻烦。
由于每个用户对某个产品肯定会有不同的喜好或厌恶,他们的数据集将是不同的。随着时间的推移,当你“喂”给引擎更多的数据时,它会越来越聪明地给出建议,这样你的电子邮件订户和客户就更有可能参与、点击和购买。就像亚马逊的推荐引擎如何与“经常一起购买”和“推荐给你”标签一起工作一样。
存储数据:
您可以为算法提供的数据越多,推荐就越好。这意味着任何推荐项目都可以迅速转变为大数据项目。
用于创建建议的数据类型可以帮助您决定应该使用的存储类型。您可以选择使用 NoSQL 数据库,一个标准的 SQL 数据库,甚至是某种对象存储。这些选项中的每一个都是可行的,具体取决于您是否在捕获用户输入或行为,以及实施的容易程度、存储可以管理的数据量、与环境其余部分的集成以及可移植性等因素。
当保存用户评级或评论时,可扩展和可管理的数据库最大限度地减少了所需的任务数量,并有助于专注于推荐。Cloud SQL 满足了这两个需求,并且使得直接从 Spark 加载数据变得很容易。
分析数据:
我们如何找到具有相似用户参与度数据的项目?为此,我们使用不同的分析方法过滤数据。如果你想在用户浏览产品时向他们提供即时的建议,那么你就需要一种更灵活的分析方式。我们可以分析数据的一些方法有:
- 实时系统可以在数据被创建时对其进行处理。这种类型的系统通常包含可以处理和分析事件流的工具。需要一个实时系统来给出即时的建议。
- 批量分析要求你定期处理数据。这种方法意味着需要创建足够的数据来进行相关的分析,比如日销售量。批处理系统可以在以后发送电子邮件。
- 近实时分析让您能够快速收集数据,以便每隔几分钟或几秒钟刷新一次分析。接近实时的系统最适合在同一浏览会话期间提供推荐。
过滤数据:
下一步是过滤数据,以获得向用户提供推荐所需的相关数据。我们必须从上面解释的算法列表中选择一个更适合推荐引擎的算法。喜欢
- **基于内容:**一个受欢迎的、推荐的产品与用户观看或喜欢的产品具有相似的特征。
- 集群:推荐的产品搭配的很好,不管其他用户做过什么。
- 协作:喜欢与另一个用户查看或喜欢的产品相同的产品的其他用户,也会喜欢一个推荐的产品。
协同过滤使您能够将产品属性理论化,并根据用户口味进行预测。这种过滤的输出基于这样的假设,即过去喜欢相同产品的两个用户现在或将来很可能会喜欢相同的产品。
您可以将关于评分或互动的数据表示为一组矩阵,以产品和用户作为维度。假设以下两个矩阵相似,但我们用数字 1 替换现有评分,用数字 0 替换缺失评分,从第一个矩阵中减去第二个矩阵。结果矩阵是一个真值表,其中数字 1 代表用户与产品的交互。
我们使用 K-Nearest 算法、Jaccard 系数、Dijkstra 算法、余弦相似度来更好地关联基于评级或产品进行推荐的人的数据集。
上图显示了 k-nearest 算法的聚类过滤是如何工作的。
然后最后,过滤和使用算法后获得的结果,基于推荐类型的时效性向用户给出推荐。无论是实时推荐还是稍后发送电子邮件。
在我们的下一篇博客中,我们将解释您的组织如何实现产品推荐引擎,以及与它相关的好处。
机器学习是如何工作的?
这是一系列文章中的第二篇,旨在使机器学习对那些没有受过技术培训的人来说更容易理解。第一篇,描述机器学习的典型用途和例子,这里可以找到。
在本系列的这一期中,将使用一个简单的示例来说明从正反例中学习的底层过程,这是分类学习的最简单形式。我犯了一个简单的错误,让所有人都可以理解机器学习的原则,但我应该强调,现实生活中的用例很少像这样简单。
从训练集中学习
想象一下,一家公司有一个招聘流程,该流程会查看成千上万份申请,并将它们分成两组——有“高潜力”获得该公司工作的人和没有“高潜力”的人。目前,人类决定每个应用程序属于哪一组。假设我们想要学习和预测哪些应用程序被认为是“高潜力”的。我们从该公司获得了一些数据,用于一组随机的先前申请,包括那些被归类为高潜力的申请(正面例子)和那些没有被归类为高潜力的申请(负面例子)。我们的目标是找到一个所有正面例子都有的描述,而没有负面例子。然后,如果出现新的应用程序,我们可以使用此描述来确定新的应用程序是否应该被视为“高潜力”。
对应用程序的进一步分析表明,有两个主要特征会影响应用程序是否可以被描述为“高潜力”。第一个是申请人的大学 GPA,第二个是申请人在申请过程中参加的考试的表现。因此,我们决定在确定某项申请是否具有“高潜力”时,只考虑这些因素。这些是我们的输入属性。
因此,我们可以选取当前申请的一个子集,并用两个数值 (x,y) 来表示每个申请,其中 x 是申请人的大学 GPA, y 是申请人在测试中的表现。如果是正面例子,我们也可以给每个应用程序赋值 1,如果是负面例子,赋值 0。这被称为训练集*。*
对于这个简单的示例,可以在二维图上绘制训练集,正面示例标记为 1,负面示例标记为 0,如下所示。
在进一步查看数据后,我们可以在两个维度上确定某些最小值 x 和 y ,我们可以说任何“高潜力”应用都必须在这些值以上。即 x > x1 和 y > y1 为 x1 和 y1 的合适值。
这将“高潜力”应用的集合定义为图表上的矩形,如下所示。
这样,我们就做出了这样的假设:我们的“高潜力”应用类是二维空间中的矩形。我们现在将问题简化为寻找 x1 和 y1 的值,以便我们在训练集中具有最接近的正例。
我们现在决定尝试一个特定的矩形,看看它与训练数据的吻合程度。我们称这个矩形为 T21。 r 是一个假设函数*。我们可以在我们的训练集上尝试 r ,并计算在训练集中有多少个正例没有落入矩形 r 中。这些实例的总数称为 r 的错误。我们的目标是使用训练集使这个错误尽可能的低,如果可能的话,甚至使它为零。*
一种选择是使用最具体的假设。也就是说,使用包含所有正例而不包含反例的最紧密矩形。另一种是使用最一般的假设,即包含所有正例而不包含任何负例的最大矩形。
事实上,在最具体和最一般的假设之间的任何矩形都将对我们已经得到的特定训练集起作用。
但是,我们的训练集只是应用程序的示例列表,并不包括所有应用程序。因此,即使我们提出的矩形 r 在训练集上起作用,我们也不能确定如果应用于不在训练集中的应用,它将没有错误。因此,我们的假设矩形 r 在训练集之外应用时可能会产生错误,如下所示。
测量误差
当一个假设 r 从一个训练集中发展出来,然后在不在训练集中的数据上进行试验时,会发生以下四种情况之一:
- 真阳性(TP): 当 r 给出阳性结果且与实际数据相符时
- 真阴性(TN):当 r 给出阴性结果且与实际数据相符时
- 假阳性(FP): 当 r 给出阳性结果且与实际数据不符时
- 假阴性(FN): 当 r 给出一个阴性结果,与实际数据不符。(这是上图中的阴影区域)
假设函数 r 的总误差等于 FP 和 FN 之和。
理想情况下,我们希望这个等于零。然而…
噪音
前面基于两个输入属性学习“高潜力”应用程序的例子非常简单。大多数学习场景将涉及数百或数千个输入属性、训练集中的数万个示例,并且将花费数小时、数天或数周的计算机能力来处理。
由于噪声*,在这些情况下几乎不可能创建零误差的简单假设。噪音是数据中不必要的异常,它可以掩盖或复杂化潜在的关系,并削弱学习过程。下图显示了一个可能受噪声影响的数据集,简单的矩形假设对其不起作用,更复杂的图形假设对于完美拟合是必要的。*
噪音可能由以下原因引起:
- 输入数据中的错误或遗漏
- 数据标签中的错误
- 不可观察且无数据可用的隐藏属性,但会影响分类。
尽管有噪声,数据科学家通常会致力于在训练集上找到最简单的假设,例如直线、矩形或简单的多项式表达式。为了使假设尽可能简单,他们愿意接受一定程度的训练误差。简单假设更容易构建、解释,并且通常需要更少的处理能力和容量,这是大型数据集的一个重要考虑因素。
泛化、欠拟合和过拟合
如上所述,数据科学家有必要假设哪个函数最适合训练集中的数据。实际上,这意味着数据科学家假设某个模型或算法最适合训练数据。学习过程需要这样的输入假设或假说,这被称为学习算法的归纳偏差*。*
正如我们所观察到的,某个算法可能非常适合训练集,但当应用于训练集之外的数据时却失败了。因此,一旦根据训练集建立了算法,就有必要针对训练集之外的一组数据来测试该算法,以确定它是否适合新数据。模型预测新数据结果的好坏被称为泛化*。*
如果数据科学家试图拟合过于简单的假设算法,尽管它可能会为训练数据提供可接受的误差水平,但在处理新数据时,它可能会有更大的误差。这被称为欠拟合*。例如,尝试用一条直线来拟合一个高阶多项式的关系可能在某个训练集上工作得相当好,但不能很好地推广。*
同样,如果使用太复杂的假设函数,它将不能很好地推广,例如,如果在关系接近线性的情况下使用多阶多项式。这叫做过拟合*。*
通常,学习算法的成功是三个因素之间的微妙平衡:
- 训练集中的数据量
- 新数据的概化误差水平
- 符合数据的原始假设的复杂性
其中任何一个问题通常可以通过调整其他问题来解决,但只能在一定程度上解决。
机器学习的典型过程
将上述所有观察放在一起,我们现在可以概述机器学习中使用的典型过程。这个过程旨在最大化学习成功的机会,并有效地测量算法的误差。
***培训:*向数据科学家提供真实数据的子集。该数据包括足够数量的正面和负面示例,以允许任何潜在的算法进行学习。数据科学家在决定最适合训练数据的算法之前,会对许多算法进行实验。
验证:**向数据科学家提供真实数据的进一步子集,其具有与训练数据相似的属性。这被称为验证集。数据科学家将在验证集上运行选择的算法,并测量误差。产生最小误差的算法被认为是最好的。即使是最好的算法也可能对数据进行过拟合或欠拟合,从而产生不可接受的误差水平。
***测试:*测量任何被认为是可实现的学习算法的误差将是重要的。验证集不应用于计算此误差,因为我们已经使用验证集来选择算法,以使其误差最小。因此,验证集现在实际上已经成为训练集的一部分。为了获得准确可靠的误差度量,应该使用第三组数据,称为测试集。在测试集上运行该算法并计算误差。
分类算法的典型输出
分类算法的典型输出可以采取两种形式:
***离散量词。*一个二进制输出(是或否,1 或 0 ),表示算法已将输入实例分类为正还是负。使用我们之前的例子,算法会简单地说应用程序是“高潜力”或者不是。如果在决策过程中不存在人工干预的预期,例如,如果公司对被视为“高潜力”的申请数量没有上限或下限,这一点尤其有用。
***概率分类器。*概率输出(0 到 1 之间的数字),表示输入落入正类的可能性。例如,该算法可以指示该应用具有 0.68 的高潜力概率。如果在决策过程中需要人工干预,例如公司对被视为“高潜力”的申请数量有限制,这一点尤其有用。请注意,一旦人类定义了“截止”来确定哪些实例属于肯定类,概率输出就变成了二进制输出。
在下一期,我们将看看机器学习算法的一些典型例子,比如贝叶斯分类器和决策树。这里读一下。**
最初我是一名纯粹的数学家,后来我成为了一名心理计量学家和数据科学家。我热衷于将所有这些学科的严谨性应用到复杂的人的问题上。我也是一个编码极客和日本 RPG 的超级粉丝。在LinkedIn或Twitter上找我。
机器学习是如何工作的?像大脑一样!
图像分类中描述机器学习的人类类比
我可以举出几十篇关于机器学习和卷积神经网络的文章。每篇文章描述了不同的细节。有时会提到太多的细节,所以我决定用机器学习和人脑的相似之处来写我自己的帖子。我不会碰任何数学或者深度学习的细节。我们的目标是保持简单,帮助人们尝试 Vize.ai 来实现他们的目标。
介绍
机器学习为计算机提供了无需显式编程就能学习的能力。
对于图像:我们想要的东西可以看到一组图像,并记住模式。当我们给我们的智能**【模型】曝光一个新图像时,它会【猜测】**图像上是什么。人就是这么学的!
我提到了两个重要的词:
- 模型——我们称之为机器学习算法。不再编码(ifgreenthengrass)。是一个可以学习和概括的结构(小的,圆形的,绿色的是苹果)。
- 猜测 —我们不是在二元世界。现在,我们进入概率领域。我们收到一个图像是苹果的可能性。
深入但仍然简单
模型就像孩子的大脑。你给一个小孩看一个苹果,然后说“这是一个苹果”。重复 20 次,它大脑中的连接就建立起来了,现在它可以识别苹果了。重要的是开始时它不能区分小细节。你手中的小球将会是一个苹果,因为它遵循同样的模式*(小的,圆形的,绿色)*。只有苹果植根于小小的大脑。
显示给孩子的一组图像称为 训练数据集 。
大脑是模型,它只能识别**图像数据集中的类别。**由层和连接构成。这使得它与我们的大脑结构相似。网络的不同部分正在学习不同的抽象模式。
监督学习意味着我们要说“这是苹果”,并给它添加一个视觉信息。我们正在给每张图片添加一个标签。
Simple deep learning network
评估—模型精度
用人类的话来说,这就像考试时间。在学校,我们学习许多信息和一般概念。为了了解我们实际上知道多少,老师准备了一系列我们在课本上没有见过的问题。然后我们评估我们的大脑,我们知道 10 个问题中有 9 个回答正确。
教师的问题就是我们所说的测试数据集。它通常在训练前从训练数据集分离(提供图片的 20%在我们的例子中)。
准确率是我们答对的图片数量(百分比)。重要的是:我们不在乎他对自己的答案有多确定。我们只关心最后的答案。
计算机的局限性
为什么我们还没有拥有人类水平技能的计算机?因为大脑是最强大的计算机。它有着惊人的处理能力,巨大的内存和一些我们连自己都不懂的神奇酱。
我们的计算机模型受限于内存和计算 功率。我们在存储内存方面做得很好,但在处理器可访问的超高速内存方面做得不够。功率受到热量、技术、价格等的限制。
更大的模型可以容纳更多的信息,但需要更长的训练时间。这使得 2017 年的 AI 发展重点是:
- 让模型变小,
- 计算强度较低,
- 能够了解更多的信息。
连接到自定义图像识别- Vize.ai
这项技术驱动了我们的 自定义图像分类 API 。人们不需要很深的知识就可以在几分钟内建立图像识别器。有时客户问我,我们是否能识别 10 000 个类别,每个类别有一个训练图像。想象一下孩子的大脑学习这个。这几乎是不可能的。这个想法是你想让你的孩子知道更多的类别,看到更多的图像。我们的大脑需要很长时间来发展和理解这个世界。与子对象相同从基本对象开始从基本类别开始。
孩子自信什么是好/坏。辨别好坏的教学模型非常准确,不需要很多图像。
总结:
我试图将机器学习简化为仅视觉任务,并将其与我们都知道的东西进行比较。在 Vize.ai 中,我们在试验新模型和处理流水线时,经常会想到人脑。我将很高兴听到你的一些反馈。
不同媒体的新闻报道有何不同?
使用 R 和 Python 对上个月的新闻媒体进行对比分析
在过去的一年里,政治新闻似乎变得更加分裂,更加偏颇。当川普总统指责科技公司没有平等地宣传新闻来源时,我想知道,这些天的新闻有明显的不同吗?
幸运的是,有一个很棒的 python 库可以用来抓取新闻网站,所以我们可以开始回答这个问题了。使用报纸,我能够从多个媒体渠道抓取上个月的主要标题。通过编写一些简单的脚本来收集和分析新闻数据,我能够了解他们的报道是如何偏离的。
新闻的焦点
查看文本数据模式的一个有趣方法是生成单词云。r 提供了一些简单的文本挖掘库(tm、wordcloud 和 SnowballC ),使得生成 word cloud 变得轻而易举。关于这个话题的丰富资源,请看本教程 ⁴.
在我从数据中删除了明显的英语停用词(“the”、“a”等)以及一些特定新闻的停用词(“link”、“video”等)后,我看到了明显的模式。
Mainstream news sites are all about ‘trump’
2018 年,主流新闻被‘川普’主导也就不足为奇了。
然而,我也想看看那些不太受欢迎的媒体报道了什么。为了做到这一点,我从各政治派别中挑选了一些资料。尽管这些消息来源的次要兴趣领域有所不同,但每一个都主要集中在总统身上。
最后,我从两家国际新闻网站——英国广播公司(BBC)和《卫报》(Guardian)——获取了数据,以了解全球对特朗普总统的重视程度是否一样高。
令人欣慰的是,全球新闻似乎不仅仅关注唐纳德·特朗普。
新闻标题中的热门词汇
另一个检测文本数据语料库中最常见术语的有用工具是 R“TermDocumentMatrix”函数。它告诉我们《text⁵.全集》中每个单词的频率利用这些信息,很容易从每个新闻来源中找出最常见的词。下面我列出了 MSNBC、CNN 和福克斯新闻频道头条中最常见的 5 个词。
很明显,CNN 和 MSNBC 几乎完全专注于特朗普总统和他的丑闻,“特朗普”、“科恩”、“穆勒”和“马纳福特”是最热门的词汇。在福克斯电视台,《特朗普》仍然遥遥领先地排名第一,但其他故事更为普通(即。男人’,‘女人’,‘报告’,'警察)。
有趣的是,这里也有其他网站头条中的热门词汇。
浅析标题情感
新闻总是倾向于负面的偏见。在这个动荡的时代,有些人声称我们生活在一个新的黑暗时代,我想看看这些头条新闻到底有多负面。
测量文本的情绪的一个简单方法是使用情绪词典,或者每个单词都有一个与之相关的积极得分的词典。我选择使用流行的⁶词典,它给单词打分,范围是-5 到+5。例如,在这个语料库中,像“担心”这样的词得分为-3,像“很好”这样的词得分为+3。
通过平均每个新网站相关词汇的情感分数,我能够得到它们看起来是积极还是消极的图片。
令人惊讶的是,华盛顿邮报被证明是使用这种方法的最负面的新闻来源。我猜这家公司的新座右铭是“民主在黑暗中消亡”,它不会拐弯抹角。
使用 Sentimentr 库进行情感分析
单纯使用单词得分来天真地衡量情感的一个缺陷是,这种方法忽略了句子的上下文。使用这种方法,像“这个比萨饼不错”这样的句子将只记录单词“bad ”,而不记录前面的变价词“not”。幸运的是,⁷图书馆考虑到了这些变价因素,让我们能够以句子为单位测量情感。
用这个库来比较头条本身的正面/负面,我得到了下面这个情节。
《华盛顿邮报》再次以明显优势成为最负面的,击败了布莱巴特和 Infowars 等更激进的网站。其余的新闻来源都差不多,都略显负面。
结论
在这个“假新闻”的时代,政治客观性的理念似乎比以往任何时候都更加遥远。然而,有了数据驱动的方法,我们也许能够更中立地看待媒体呈现给我们的东西。正如我所展示的,收集新闻数据非常容易。我鼓励任何有一点点时间的人看看他们最喜欢的新闻渠道如何,并确保他们真正获得了我们共同现实的全面代表。
笔记
本文使用的所有代码和数据都在 https://github.com/taubergm/NewsHeadlines的网站上
1-一项关于媒体偏见的有趣研究—http://www . nieman lab . org/2018/06/Democrats-see-most-news-outlets-as-unbiased-Republicans-think-they-almost-all-biased/
2—https://gizmodo . com/president-trump-accounts-Google-withing-search-result-1828647850
3—https://github.com/codelucas/newspaper
4 — a 如何使用 R—https://datascienceplus.com/building-wordclouds-in-r/
5 —关于文档矩阵的信息—https://en.wikipedia.org/wiki/Document-term_matrix以及如何生成它们https://www . rdocumentation . org/packages/TM/versions/0.7-5/topics/TermDocumentMatrix
6—阿芬情感词典http://corpustext.com/reference/sentiment_afinn.html
7—sentiment r lib—https://cran . r-project . org/web/packages/sentiment r/readme . html
缩放如何改变主成分?—第一部分
Photo by Markus Spiske on Unsplash
请注意,这篇文章是出于我自己的教育目的,也是为了满足我的好奇心。
动机/摘要
假设我们有一个像上面这样的数据,红色箭头表示第一个主成分,而蓝色箭头表示第二个主成分。规范化和标准化会如何改变这两者?我们还可以对方差进行某种标准化吗?(我将继续发布更多帖子。)
正常化
上面的 gif 显示了不同规模的数据看起来是什么样子,以及它的主要组成部分(红色表示第一台电脑,蓝色表示第二台电脑。).
如上所述,PC 的方向不会随着不同的比例而改变。
标准化
标准化并没有改变 PC 的方向,生成的图形也没有什么特别之处。
投影到主元件
上面的过程显示了通过两个主要部分投影我们所有数据的旋转。左边的 gif 显示了相互重叠的结果,右边的 gif 显示了我们将数据投影到投影矩阵后的结果。
当我们完全投影到投影向量上时,我们会看到类似上面的东西,现在让我们将数据投影回原始空间。
当我们将数据投影回数据空间时,我们可以看到原始数据。如上所述,这些值检查出来是相同的。
当我们将结果可视化时,我们会得到一个俯视图。
交互代码
对于 Google Colab,您需要一个 Google 帐户来查看代码,而且您不能在 Google Colab 中运行只读脚本,因此请在您的游戏场上制作一份副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问该笔记本,请单击此处的。
遗言
关于 tensorflow 的 svd 需要注意的一点是,返回的 v 已经被转置,不需要被转置。Else numpy 的 svd 转置 v 矩阵。
参考
- tf.linalg.svd | TensorFlow。(2018).张量流。检索于 2018 年 11 月 15 日,来自https://www.tensorflow.org/api_docs/python/tf/linalg/svd
- PCA?,R. (2018)。奇异值分解与主成分分析的关系。如何用 SVD 进行 PCA?。交叉验证。检索于 2018 年 11 月 15 日,来自https://stats . stack exchange . com/questions/134282/relationship-between-SVD-and-PCA-how-to-use-SVD-to-perform-PCA
- PCA?,R. (2018)。奇异值分解与主成分分析的关系。如何用 SVD 进行 PCA?。交叉验证。检索于 2018 年 11 月 15 日,来自https://stats . stack exchange . com/questions/134282/relationship-between-SVD-and-PCA-how-to-use-SVD-to-perform-PCA
- PCA?,W. (2018)。为什么吴恩达更喜欢用奇异值分解而不是协方差矩阵的 EIG 来做主成分分析?。交叉验证。检索于 2018 年 11 月 15 日,来自https://stats . stack exchange . com/questions/314046/why-do-Andrew-ng-prefere-to-use-SVD-and-not-EIG-of-协方差矩阵-do-pca
- 【复本】,U. (2018)。理解 SVD 用于 PCA 时的输出。交叉验证。检索于 2018 年 11 月 15 日,来自https://stats . stack exchange . com/questions/96482/understanding-the-output-of-SVD-when-use-for-PCA
缩放如何改变主成分?—第二部分
Photo by Nikita Taparia on Unsplash
今天,我想对数据中存在的差异进行某种标准化。
请注意,这个帖子是出于我自己的教育目的。
比较 Numpy 和张量流 SVD
当我使用特征值分解来寻找主分量时,主分量的符号已经翻转,因此当我们在主空间中投影数据时,我们注意到数据已经翻转。然而,当我们重建回原始数据空间时,我们可以看到结果是相同的。
动机/摘要
上图显示了标准化后对数据的影响,我们可以注意到每个轴的比例都发生了变化。特别是当我们观察 x 轴时,我们可以注意到刻度已经急剧缩小。
在上面的原始数据中,最小 x 轴值是-20,而最大 x 轴值是 15,但是标准化后,我们注意到它已经缩小到-3 到 3 的范围。批量标准化(即标准化)在深度学习中很有帮助,因为它将数据集中起来,并将其标准化。然而,如果我们(在每个轴上)根据它的变化量来定标,会有帮助吗?
根据各轴的变化改变缩放比例
上面的图像可能很难看到,但我们正在将投影数据重建到原始数据空间,然而,根据每个轴的变化量,缩放因子会有所不同。让我们仔细看看。
上图 →原始数据
中图 →带主轴的标准化数据
下图 →带主轴的 PC 重新缩放数据
如上所述,最终结果不同于我们比较标准化和按比例缩放的结果。
这里需要注意的一个重要事实是,尽管重建的数据与我们开始时的原始数据不同(因为我们对其进行了不同的缩放)。两个主分量的方向确实匹配。
交互代码
对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要查看这本笔记本,请点击此处。
最后的话
在下一篇文章中,我将增加维度。
参考
- matplotlib.pyplot,H. (2018 年)。如何用 matplotlib.pyplot 改变图例大小.堆栈溢出?检索于 2018 年 11 月 16 日,来自https://stack overflow . com/questions/7125009/how-to-change-legend-size-with-matplotlib-py plot
- plot,H. (2018)。如何更改 matplotlib 绘图的字体大小?堆栈溢出。检索于 2018 年 11 月 16 日,来自https://stack overflow . com/questions/3899980/how-to-change-the-font-size-on-a-matplotlib-plot
- 字符串,M. (2018)。Matplotlib xticks 字体大小如果字符串。堆栈溢出。检索于 2018 年 11 月 16 日,来自https://stack overflow . com/questions/39211707/matplotlib-x ticks-font-size-if-string
- Jupyter 笔记本教程。(2018).Plot.ly .检索 2018 年 11 月 16 日,来自https://plot.ly/python/ipython-notebook-tutorial/
- 斧头。(2018).Plot.ly .检索 2018 年 11 月 16 日,来自https://plot.ly/python/axes/
湾区怎么通勤?
使用无监督机器学习定义公交服务区
对于这个项目,我想回答一个问题。我们能否仅使用通勤数据来定义旧金山湾区公交机构的服务区域?如果可以,会是什么样子?
答案是肯定的,它看起来像这样:
我是这样到达那里的。
背景
海湾地区在多极性质的大都市中是不寻常的。这早已反映在我们的交通系统中——我们有大约 28 个交通系统服务于九个县的海湾地区(忽略每天一次的美国国家铁路客运公司州际铁路服务)。粗略地说,这些分为三类:
- 跨区域交通—国会走廊、圣华金、阿尔塔蒙走廊快线、未来高铁。这些系统服务于九县湾区以外的目的地。
- 区域公交 — BART、Caltrain、SMART、金门轮渡、三藩市湾轮渡。这些系统服务于下面列出的两个或更多的本地交通区域。
- 当地公交 — Muni、AC Transit、VTA、SamTrans、金门公交、Marin Transit、Dumbarton Express、County Connection、Santa Rosa City Bus、Tri Delta Transit、Wheels、SolTrans、Sonoma County Transit、WestCAT、Fairfield 和 Suisun Transit (FAST)、Solano Express、Vine、City 蔻驰、Petaluma Transit、Rio Vista Delta Breeze。
Bay Area Transit Agencies (Source: SPUR, Seamless Transit, April 2015)
湾区交通的分散导致交通乘客的体验不佳,他们被迫浏览多个票价系统和信息材料,以便到达他们要去的地方。人们常常天真地认为,解决方案只是将所有机构合并在一起,但这在政治上具有挑战性,可能会产生比解决的问题更多的问题。正如交通咨询顾问 Jarrett Walker 指出的那样,“一位非常左派的旧金山主管曾经问我,为什么旧金山应该把对其交通的任何控制交给郊区主导的董事会,他们根本不会理解旧金山对非常高的人均服务水平的密度驱动的需求。他说得有道理。”
由交通分散引起的许多问题在 SPUR 的无缝交通报告中有详细描述,该报告讨论了如何通过更好的机构间合作来解决这些问题,而无需将所有的交通机构合并成一个庞大的实体。其他国家也采取了类似的方法;比如德国的莱茵-鲁尔区和湾区是类比的,人口相似,大城市距离相似,多极相似。一个叫做 Verkehrsverbund 的组织负责协调服务;尽管有 27 家不同的运营商,但他们的公交系统只有一张地图、一个票价结构和一个品牌
A service map for the Rhein-Ruhr Verkehrsverbund
因此,如果我们可以用一个 Verkehrsverbund 来掩盖我们交通系统中的裂缝,我们就不需要担心分裂,对吗?不完全是。Verkehrsverbund 没有解决的一个问题是为其管辖范围内的交通系统定义合理的边界。在这些边界,乘客必须换乘另一个系统来继续他们的旅程。一个例子是旧金山/圣马特奥县线,市政的 14 任务巴士在此终止,SamTrans 的 ECR 巴士继续沿着埃尔卡米诺雷亚尔的旅程;另一条是圣马特奥/圣克拉拉县线,ECR 公共汽车在此终止,VTA 的 522 公共汽车沿着埃尔卡米诺路继续开往圣何塞。
界限虽然不方便,但也是必要的;将这三条公交线路合并为一条 60 英里长的线路是不现实的,旧金山也不会对圣何塞决定其公交服务感到满意,反之亦然。如果一定要在某个地方划一条线,那么这条线应该划在一个尽可能少的乘客因为过渡而感到不便的地方。**我们能否改进本地公交服务区的定义,以更好地匹配居民的实际通勤模式?**对湾区通勤模式的了解应该让我们能够在适当的时候提出交通机构合并的建议,并在不合适的时候将这些机构分开。
方法学
Kaggle 已经发布了从美国每个人口普查区到美国其他人口普查区的通勤流量,以 2010 年美国人口普查为原始来源。此数据的“流量”值,即从给定的起始人口普查区域到给定的目的人口普查区域的通勤人数,可用于计算特征空间中人口普查区域之间的距离。
我们将特征空间中人口普查区域 i 和 j 之间的距离 d(i,j) 定义为:
其中:
这意味着两个没有通勤者的人口普查区域之间的要素空间距离在数量上等于数据集中的最大通勤流量,即这些人口普查区域在要素空间中相距最远。这也意味着具有最大通勤流量的人口普查区域对具有~1 的特征空间距离,即那些人口普查区域在特征空间中是最近的。
创建距离矩阵时,通勤流的方向性带来了挑战。聚类算法一般取一个数据集在特征空间中的位置,计算距离矩阵,然后建立链接;然而,对于这个问题,我们直接从源数据中定义距离矩阵。这导致了不寻常的性质,即从 A 到 B 的特征空间距离可能不同于从 B 到 A 的特征空间距离,因为更多的通勤者将在一个方向上比在另一个方向上通勤。对于这个项目,我们决定只检查从起点到目的地的通勤流,因为这将导致在特征空间和真实空间中明确定义的聚类,而相反将导致在真实空间中明显重叠的聚类。
一旦我们计算出每对人口普查区域之间的距离,我们就将其输入到 SciPy 的层次聚类算法中,以确定湾区人口普查区域之间的关系。(在本分析中,湾区被定义为位于纬度 37°和 38.5°之间以及经度-123°和-121.5°之间的所有普查区域。)聚类的数目不是预先确定的,但是可以通过计算样本中所有数据点的平均轮廓得分来计算聚类的有效性和一致性。下面显示了 k 的变化值:
Bay Area Silhouette Scores
剪影得分图中双峰的存在表明了通勤模式中的区域和局部一致性。在 3 处找到了 k 的最佳值,并且再次在 9、10 和 11 处找到。
我们先来看一下 k =3:
Bay Area Census Tract Clustering (k=3)
这种聚类代表了海湾地区的第一个内部内聚的次区域划分。首先,纳帕和索拉诺县在 k =2 处分裂;然后,圣何塞和硅谷在 k = 3 时分道扬镳。其余的海湾地区包括所有你可以乘坐 BART 火车到达的地方,再加上南边的红木城和北边的圣罗莎。
下一级可行聚类出现在更高的 *k 值处。*让我们从 k =9 开始:
Bay Area Census Tract Clustering (k=9)
直觉上,这个看起来不错;我们在湾区的所有逻辑子区域之间有一个清晰的分隔。这些大致可以描述为:索诺玛/马林,索拉诺/纳帕,旧金山/圣马特奥,奥克兰/伯克利/里士满,核桃溪/康科德/安提阿,三谷地区,海沃德/弗里蒙特,圣何塞/硅谷。
让我们上升到 k =10:
Bay Area Census Tract Clustering (k=10)
现在,旧金山和圣马特奥已经分裂,旧金山保留了戴利市、科尔马和帕西菲卡。
最后我们来看 k =11:
Bay Area Census Tract Clustering (k=11)
在这里,南部的东湾分成了北部的海沃德/卡斯特罗谷和南部的联合城/纽瓦克/弗里蒙特。
值得注意的是,最初脱离的两个集群(纳帕/索拉诺和圣何塞)没有进一步细分,这表明了很强的内部一致性。(在 k =15 时,圣何塞从圣克拉拉县的其余部分分离出来;Napa 和 Solano 保持相互连接,直到非常高的值 k 。)
结论
区域间运输
没有得出关于区域间交通的结论,因为区域间交通主要服务于商务和休闲旅客,因此不适合使用通勤数据进行分析。由于覆盖的距离,这些服务可能最好在州一级汇总和管理。
区域运输
- 圣何塞和湾区的其他地方不同。作为一个以汽车为主的大都市区,它的许多通勤模式包括从圣何塞南部和东部的卧室社区到圣何塞北部和硅谷的办公园区的汽车旅行。认为硅谷与湾区的其他地方联系在一起是错误的;谷歌巴士可能有很多恶名,但它们服务的通勤者相对较少。
- 索拉诺县和纳帕县也与湾区的其他地方脱节,尽管它们在地理上很接近;前往该地区其他地方的交通选择少得可怜,60-70 分钟的 Vallejo 渡轮是唯一直接连接旧金山的方式。这种情况可以通过在这些县增加通勤铁路来改善,从里士满向北穿过一座新桥到达瓦列霍,然后分支到索诺马、纳帕和费尔菲尔德。理想情况下,这将通过一个新的跨湾管道直接运行到旧金山,但也可以在短期内作为巴特的馈线。
- 尽管如此,没有任何理由为了区域交通的目的而划分湾区。Caltrain 服务于旧金山湾区和南湾,不久 BART 也将提供同样的服务。这两种服务都是区域交通系统的组成部分,不能一分为二。虽然 Solano/Napa 比 Sonoma/Marin 更远离旧金山湾区,但这主要是由于 I-80 拥堵和糟糕的交通选择,这些问题可以也应该得到补救。所有地区公交提供商应合并为一个系统,为横跨九个县的海湾地区的地区出行提供服务。
本地运输
虽然聚类与这些机构的服务区域惊人地匹配,但仍有一些变化可以做出,大致基于 k =10 地图。在多种选择都是合理的情况下,我选择了对现状改变最小的选择。
- 金门交通、马林交通、佩塔卢马交通和圣罗莎市公共汽车应该合并成一个北部湾交通机构。(注意:有一种观点认为应该将 SMART 包括在这个机构中,但我认为它应该保留为一个区域机构,以便于与金门大桥整合。)
- Vine、FAST、SolTrans 和蔻驰市应该合并成一个索拉诺/纳帕运输机构。里约维斯塔三角洲微风也可能包括在内。
- 县连接和三角运输应该合并。
- Wheels 应该从 County Connection 接管 San Ramon 和 Danville 的服务,因为这些城市与都柏林/普莱森顿的通勤联系比与核桃溪的更紧密。
- AC Transit 应该将 WestCAT 吸收到北部。里士满地区两种服务之间的分界线完全是人为的。
- 目前由 AC Transit、Union City Transit 和 Dumbarton Express 提供的从 Bay Fair BART station south 到 Alameda/Santa Clara county line 的公共汽车服务应合并为一个新的机构,为东南湾提供服务。这一变化与上述变化相结合,将使 AC Transit 专注于成为服务于奥克兰/伯克利/里士满大都市的城市交通系统。
- 市政当局应该从 Daly 市和 Colma 的 SamTrans 接管服务。圣布鲁诺山的大部分和科尔马墓地的(字面上的)死亡区形成了旧金山和圣马特奥县之间的一条天然分界线,这条线在地图上划出的位置以南一点。Pacifica 也将受益于到旧金山的直航服务。
- VTA 应该接管位于门洛帕克和东帕洛阿尔托的 SamTrans 的服务。阿泽顿镇太富裕,人口太稀少,无法支撑公交乘客,形成了圣马特奥服务区和硅谷之间的屏障。
这是最终结果。我对系统名称使用了一些创造性的许可。
当然,合理化服务领域并无帮助,除非我们也合理化票价体系和品牌。请继续关注未来关于湾区 Verkehrsverbund 可能会是什么样子的帖子。
有问题吗?评论?
这个分析背后的代码是 GitHub 上可用的 。感谢Alex Golden Cuevas和Bonnie Shen帮助编写代码;另外感谢 亚历克斯·戈尔登·奎瓦斯 和 布兰登·阿纳尼亚斯·马丁-安德森 在发表前审阅了这篇文章。
奖励地图
虽然我对其他地区不太熟悉,无法提出交通重组建议,但对其他多极地区进行类似的聚类分析提供了一些有趣的见解。
南加州
剪影分数为正且平坦,直到 k =12,之后快速下降。有趣的是,在 k =3 时,洛杉矶县与圣地亚哥的联系比奥兰治县或内陆帝国更紧密。洛杉矶县在 k = 9 时一分为二,主要是高地和盆地,高地也声称贝弗利山和沿海城市。
Southern California Silhouette Scores
Southern California Census Tract Clustering (k=3)
Southern California Census Tract Clustering (k=6)
Southern California Census Tract Clustering (k=9)
Southern California Census Tract Clustering (k=12)
东北走廊
这里有很多东西要打开。有趣的是,州界线对人们工作的地方有重大影响,即使这些地方不符合自然特征。新泽西州和纽约州之间,以及马里兰州和特拉华州之间的陆地边界有明显的分界线。费城/卡姆登/特伦顿根据流经城市的河流被整齐地分为四个,其中一些也是州界。波士顿/普罗维登斯逆势而行,尽管位于不同的州,但仍然聚集在一起,而巴尔的摩的分布在南部的 DC 和北部的哈里斯伯格之间。
Northeast Corridor Silhouette Scores
Northeast Corridor Census Tract Clustering (k=19)
流行的 XGBoost 和 LightGBM 算法是如何实现单调约束的
XGBoost 和 LightGBM 都有这个很好的参数来加强特性和目标之间的单调关系。当我们的“心智模型”告诉我们期待这样一种单调的关系时,这就很方便了。例如,在其他条件相同的情况下,我们预计同一街区的大房子会比小房子贵。如果让算法自由运行,它可能会捕捉到总体上积极的平方英尺与价格的关系(控制其他因素),但一些局部区域具有相反的关系-更大的平方英尺与更低的价格相关联-这是违反直觉的。这种情况经常发生在数据稀疏或有大量噪声的区域。从我的经验来看,放置一个真正有意义的单调约束通常会在测试数据上产生更好的模型性能,这意味着受约束的模型可能会更好地泛化。因此,人们可以将单调约束视为一种正则化。
如果单调性的概念对你来说很陌生,请点击下面的链接阅读 XGBoost:https://XGBoost . readthedocs . io/en/latest/tutorials/monotonic . html
然而,大多数数据科学家都在使用这个参数,而不知道它实际上是如何工作的。我的过去就是其中之一。毕竟,不是每个人都想弄乱源代码。
XGBoost 代码片段 1:
XGBoost 代码片段 2:
上面两个代码片段展示了 XGBoost 如何实现单调约束。我花了一段时间才完全理解实现。还没有关于 XGBoost/LightGBM 中单调性实施的确切实现的论文。下面我将把我的解释分成几个部分,希望你会觉得有用。
**举一个例子:**在 XGBoost 或 LightGBM 估计器中生长树时,如果候选分裂导致非单调关系,算法将会放弃它。这个很简单:假设你对特征 fₘ施加一个正单调约束,在某个内部节点,fₘ被选中,在值 vₙ处的分割将产生最佳增益。因为约束是正的,所以您希望分配给右侧子对象的权重高于左侧子对象。该算法检查是否是这种情况,如果是,它将继续并以值 vₙ分割该节点,如果不是,它将放弃 vₙ,并将试图找到下一个最佳分割,直到右孩子的权重高于左孩子的权重。
这对应于 *XGBoost 代码片段 1 中的第 432 和 433 行。*如果条件不满足,则增益由负无穷大代替,因此算法将放弃分割。类似地,如果您实施负单调约束,则左孩子的权重需要高于右孩子的权重(行 434 和 435)。
当该特征仅被选择一次时,这听起来不错。但是如果沿着这条路,这个特性又被选中了呢?让我们想象一下,如果算法继续下去,对碰巧再次选择相同特征的左孩子(L)做同样的事情,由于你施加的正单调约束,你将得到分配给左孩子(LR)的右孩子的更高权重。然而,这个重量可能比你之前得到的右孩子®还要高。所以现在你有一个问题,因为为了保持单调的正关系,分配给右孩子的权重®不仅应该高于左孩子(L),还应该高于它的后代(LL,LR,LLL,LLR,LRL,LRR…你能想到的)。那么如何确定是这样的呢?或者换句话说,如何确保约束在树级得到执行?
**取二:**在一个节点上拆分时,子节点的权重以其父节点权重和叔叔权重的平均值为界(叔叔指的是与父节点共享同一个父节点的节点)。这确保了如果在树中多次选取特征,则分配给来自最近分裂的后代节点的权重不会以违反单调约束的方式高于或低于祖先节点。让我们使用上述相同的例子:左孩子(LR)的右孩子的权重现在由左孩子(L)和右孩子®的权重的平均值来限定。并且因为左孩子(L)的体重低于右孩子®,所以右孩子(LR)的左孩子的体重永远不能超过右孩子®的体重。该规则贯穿于树的整个构建过程,因此,无论如何左右切割树,与左侧子树中的要素 fₘ相关联的权重始终低于与右侧子树中的要素 fₘ相关联的权重。特征 fₘ对预测的正单调约束(左节点的权重)在树级被保留。
这对应于 XGBoost 代码片段 1 中的第 448 到 457 行以及所有 XGBoost 代码片段 2。
太好了!算法层面的单调约束呢?
**拿三:**轻松!因为 XGBoost 预测是叶节点权重的相加(对于分类问题,在 sigmoid 或 softmax 变换之前),所以在算法级保留了单调约束。
让我们更正式一点:
假设对于特征 x1 的每一对值(α,β),其中α≤β,我们想要强制执行正单调关系,即 w(α)≤w(β)。
- 在根节点,只产生一个权重 w₀。w₀(α)=w₀(β),用于根节点 0 中的特征 x₁中的α,β。这符合单调约束。
- 在第一次拆分时,任何导致左孩子(l)权重大于右孩子®权重的拆分都被放弃,因此对于节点 l 中的特征 x₁的α和节点 r 中的特征 x₁的β,wₗ(α)≤wₗ(β
- 类似地,在从左孩子(l)开始的下一次分裂时,导致其左孩子(LL)权重大于其右孩子(LR)权重的任何分裂都被放弃,从而对于节点 LL 中的特征 x₁的α和节点 LR 中的特征 x₁的β,wₗₗ(α)≤wₗᵣ(β。
- 除了 3 之外,为了确保在树级别实施约束,wₗₗ和 wₗᵣ的值还受到 wₗ和 wᵣ-midₗᵣ.的平均值的限制也就是 wₗₗ≤midₗᵣ和 wₗᵣ≤midₗᵣ.
- 类似地,3 和 4 也适用于节点 r 的子节点,只是这次是 wᵣₗ≥midₗᵣ和 wᵣᵣ≥midₗᵣ.
- 3、4 和 5 的过程贯穿于树的构建。因此,对于要素 x₁,左侧子树的权重始终低于右侧子树。因此,正单调约束在树级被强制执行。
- 由于 XGBoost 的最终输出是叶节点权重的相加(最终分类问题需要 sigmoid 或 softmax 变换),因此单调约束在算法级别得以保留。
最终想法
边界值的使用是实现的关键。这个概念对于决策树来说并不新鲜。然而,使用“中间”值(父节点和叔节点的平均值)似乎不是基于任何文献,并且过于严格,可能潜在地损害算法的预测能力。然而,在我构建的所有约束 XGBoost 模型中,我没有看到模型性能的严重恶化。正如我在开始时提到的,在许多情况下,性能实际上概括得更好。我的直觉是,助推机制确实弥补了约束权重的损失。另一方面,单个决策树可能确实受到这种限制方法的影响。
另外,你还可以使用 R Caret 库创建一个单调约束 GBM。
请在评论中告诉我你的想法。乐于讨论。
企业软件如何通过机器学习变得智能化
Photo by Hunter Harritt on Unsplash
当想到自动化时,人们总是可以追溯其根源,而不是实际的发明家,而是富有想象力的作家。几个世纪以来,一个智能机器可以在改善人类生活的各个方面发挥关键作用的世界一直吸引着思想家和作家。他们让人们思考这种努力中蕴含的可能性和精彩。自从第一台计算机诞生以来,人们一直在努力使机器更加智能。
计算机的发展已经使它更接近那些作家和发明家很久以前预见的东西。人工智能、机器学习和神经网络已经成为计算领域创新和发展的焦点。它们已经逐步接近实现其全部潜力,目前正在从农业到交通运输的几乎每个人类活动领域中找到应用。此外,这种不断发展的计算形式在企业领域也产生了显著的影响。
其中,机器学习已经在企业中被广泛接受。通过将其集成到企业软件中,大多数公司发现了一种更可预测、更数据驱动的模型,这使他们能够实现流程自动化。机器学习利用数据集的核心动力有助于产生洞察力,从而促进创新和效率,并使企业软件更加智能。
在本文中,我们将深入探讨:
- 机器学习基础
- 为什么传统企业软件是无效的
- 机器学习将改变企业软件的原因
- 机器学习改革企业软件的方式
对机器学习的洞察
那么到底什么是机器学习呢?机器学习使计算机能够在没有任何编程或人工干预的情况下进行学习和改进。机器学习系统中专门编程的算法可以从数据中识别模式,并预测可能的结果。它革新了从医疗保健到零售的每个领域,采用率越来越高。
联合市场研究的预测指出,到 2020 年,像机器学习这样的认知计算的全球市场将增长约 137 亿美元。这将在企业和服务行业利用数据的方式上引发一场彻底的变革
通过机器学习,计算机可以挖掘和处理大量数据,以得出预测模型和见解。你可以在电子商务中找到机器学习的一个典型例子,像亚马逊这样的在线零售商正在使用这项技术为顾客提供更好的服务。
每当你购买或浏览其产品列表时,你都会留下一系列数据,供 it 机器学习系统用来为你提供个性化的产品推荐。此外,机器学习的使用让电子商务平台在客户服务、交付和定价方面获得了优势。
传统企业软件的缺点
基本上,企业软件或企业应用软件(EAS)是一个组织为满足其特定需求而使用的任何软件。它构成了部署在公司内的计算系统的一部分,并作为面向业务的工具,在客户关系管理、人力资源、会计、企业资源规划等过程中提供帮助。
其他形式的软件,如系统和应用软件,不属于企业软件的范畴。它们只用于执行特定的功能,如运行计算机或创建电子表格、演示文稿、文档等。而企业软件是可扩展的和集中的,能够为整个组织提供解决方案。
企业软件将机器学习纳入其框架的转变是由特定原因引导的。传统的企业软件在效率、速度、可扩展性等方面都有自己的缺点。它依赖于人的干预,这种干预会以错误、信息不充分、个人偏见等形式影响输入系统的数据。
如果输入的与业务运营相关的数据不正确,可能会导致数据堆积。这使得它在很大程度上是分散的,在需要的时候很难整理。由于传统的企业软件依赖于人工努力的结合,因此与机器学习相比,它在快速准确地生成洞察方面最没用。
传统企业软件的一个共同缺点是适应性。大多数企业不得不改变他们的工作方法,以适应软件。此外,它在硬件和软件方面都有非常大的前期资本成本。可伸缩性也是一个问题,事实证明要满足不断变化的业务需求是困难和昂贵的。
为什么机器学习会改变企业软件
每天,企业都面临着从管理到运营的各种挑战。到目前为止,企业软件在处理这些重要过程中发挥了重要作用。但是商业中不断增长的需求意味着需要更新的方法来处理不同的领域。随着机器学习在企业中的引入,一扇可能性的窗户打开了。
机器学习正在提供企业可以依赖的正确框架。机器学习嵌入式计算系统中使用的算法和应用程序可以通过利用企业拥有的庞大数据集来产生预测性的洞察力。这些数据包括结构化和非结构化形式,如数据库和互联网。
根据麻省理工科技评论和谷歌的一项研究,60%的公司已经在他们的计算基础设施中采用了机器学习策略。18%的人计划在明年实施机器学习。
图一。来源——麻省理工科技评论和谷歌
向机器学习软件模型的转变,通过提供更好、更快的数据分析和见解,使组织明显受益。它可以提高组织内部运作的效率,同时增进对客户的了解。
当提到内部运作时,具有机器学习的企业软件的一个明显的用例是在物流领域。ML 系统可以在没有人工干预的情况下,通过做出数据驱动的决策,实现订单、库存、运输和仓储管理流程的自动化。
物流专业 DHL 最近整合了机器学习以降低其供应商风险。该公司最新进入其名为 DHL Supply Watch 的 Resilience 360 供应链管理平台,使用机器学习和自然语言处理的结合来早期识别任何潜在的中断。
此外,世界各地的企业都在他们的软件中转向机器学习,原因多种多样,例如:
- 改善行为分析以提供个性化的客户体验
- 利用自然语言处理(NLP)功能进行更好的分析
- 提供风险分析以提升数据安全性
- 挖掘和分类数据
- 经常提出建议
- 启用图像识别
此外,机器学习的复杂性正在阻止公司转向这种模式。目前正在开发中,完全转向机器学习模型可能被证明是不明智的。机器学习有几个局限性,因为其算法经常遇到错误,并且由于其复杂性,解决这些错误是一项艰巨的任务。
此外,机器学习嵌入式软件可能需要时间来熟悉数据,以便进行更好的预测。同时,在历史数据不可用的所有情况下,预测可能都不准确。从机器学习企业软件中提取期望的输出仍然需要人工干预。
机器学习改革企业软件
机器学习被认为是今年企业软件的主要趋势。通过使企业软件智能化,机器学习可以通过创造有价值的见解来接管评估的关键过程。一个组织可以利用这一点采取必要的行动,使他们的生产力得到提高。
将机器学习框架整合到企业软件中,可以确保所有的数据堆栈都得到充分利用,从而提高整体效率和生产率。这实际上增强了企业中使用的软件的功能,使其更加智能和自给自足。
例如,在销售领域,一个公司可以通过使用具有 ML 模型的软件而获益匪浅。机器学习可以扰乱关键流程,并在预测、客户行为和评估方面创造更多理解,从而使销售流程更加智能。
以下是机器学习将改变企业软件的一些方式:
产生更好的见解和分析
近年来,企业中数据的使用和生成已经大大增加。处理这些大量的数据是一个挑战,这正是机器学习适合的地方。拥有具有机器学习功能的企业软件有助于从这些大型非结构化数据集获得竞争优势。
通过提供收集的数据,机器学习嵌入式软件中的算法可以轻松处理这些数据集,并发现见解和模式。通过帮助他们实现目标并推动增长,组织可以从这些成果中受益匪浅。
跨国零售公司沃尔玛是成功实现机器学习软件的一个很好的例子。他们大量利用机器学习来发现客户在产品推荐等领域的行为和使用。
结果。沃尔玛极大地改善了他们的零售业务和顾客体验。此外,机器学习帮助他们在商店和在线平台提供的购物体验之间建立了一座桥梁
数据的非本地化
由于移动和社交媒体等技术的激增,数据现在在很大程度上是分散的。通常,企业软件使用特定种类的数据库模型来存储和组织数据。结构化和非结构化数据现在共同存在于外部源中,这需要更深入的处理才能生成有用的最终结果。
谷歌等科技巨头已经完全转向数据中心形式的外部存储模块,以处理其海量数据。这些位于世界各地不同位置的数据中心需要持续的监控和维护,以确保它们不间断地运行。
谷歌利用机器学习软件来帮助这一过程,仅在 2014 年就大幅降低了 50%的能源使用量。这家科技巨头通过使用机器学习模型,能够优化和节省其数据中心的更多能源。
促进数据驱动的决策
以有效的方式使用数据对公司制定关键的商业决策有巨大的好处。使用机器学习的企业软件系统可以通过帮助组织基于从数据池中收集的见解单独和公正地做出决策,来极大地帮助这一过程。这对人才招聘、客户管理、R&D 等领域尤其有帮助。
例如,使用 TensorFlow,谷歌用于机器学习应用的开源库,使公司的研究部门能够发挥机器学习的潜力,以更好地洞察产品和服务的开发。当机器学习在 R&D 应用于做出数据驱动的决策时,DMAIC(定义、测量、分析、改进和控制)的使用是常见的。这导致了产品和服务质量的显著提高。
增强员工智能
机器学习通过自动评估组织中员工进行的搜索,将企业软件向前推进了一步。这实际上增强了员工的智能,通过监控他们参与的所有关键领域,促进了工作相关领域的决策。
通过这种方式,机器学习可以帮助提高生产率、节省时间并给出及时的响应。例如,IBM 已经建立了一个模型,说明机器学习等认知技术如何通过创造更好的参与和个性化的信息传播来增强员工的能力,以达到教练等目的。
IBM 全球员工发展合作伙伴 James Cook 表示,
"认知技术的优势在于,它可以快速准确地处理大量结构化和非结构化数据,以找到与[员工]当前职业经历相匹配的培训课程。我们认为人力资源部门面临着前所未有的机遇来推动许多行业的数字化转型。
IBM 自己的 Watson Discovery 广泛依赖于机器学习来快速整理和向员工提供信息,以便他们可以将这些信息用于当前的任务,而不必浪费时间进行广泛的搜索。此外,机器学习软件也在提升员工技能方面得到应用。
欺诈检测
欺诈行为的持续存在每年都会给组织带来损失。具有机器学习框架的企业软件通过及早发现欺诈帮助降低了欺诈。机器学习算法使用的模式识别方法可以识别交易等操作中的任何违规行为。
机器学习如何帮助欺诈检测的一个例子是在企业的财务部门。通过在企业软件中包含机器学习,它可以评估交易数据和外部来源,以检测涉及个人网络的交易中的任何类型的欺诈活动和异常。
SAS 是欺诈检测等领域机器学习的早期采用者。在金融领域,SAS 涉足欺诈检测,其软件被多家信贷机构用于消除交易中的欺诈行为。
总结
像机器学习这样的计算技术的发展,通过提高组织的生产力和效率,使组织受益匪浅。已经实施了机器学习企业软件模型的组织已经获得了相对于仍然坚持传统系统的其他组织的优势。
因此,越来越多的公司正在转向机器学习,或者已经在考虑投资机器学习的可能性。在未来几年,更多的组织将拥有由机器学习驱动的企业软件,以利用其推动业务创新和增长的可能性。
作者简介:
Vinod 已经概念化和交付利基移动产品,以满足各种领域,包括物流,媒体和非营利组织。他在 Fingent 领导、指导和训练一个由项目协调员和分析师组成的团队。https://www.facebook.com/vsaratchandra
T3T5https://in.linkedin.com/in/vsaratchandran
我们离完全自动驾驶的世界还有多远?
Source: Business Insider
麻省理工学院自动驾驶汽车深度学习课程刚刚发布了他们的第一堂课视频
该讲座是对深度学习技术的概述,也对自动驾驶技术的未来进行了一些讨论,并对当前系统的差距进行了简要警告。
以下是我们离自主驱动的未来还有多远,以及对伦理的简要介绍:
到 2017 年,计算机视觉已经达到 97.7%+的准确率!(ImageNet 挑战)很神奇吧?
那么,我们离一个完全自主的世界还有多远?
97.7%听起来足够好了。是吗?毕竟驾驶涉及很多计算机视觉,它确实比人类的高分更好——那么我们接近了吗?
ImageNet 挑战包括将 1400 万张图片分类到 22000 个可能的类别中。
当外推至真实世界时,这种准确性有多好?
现在,是的,挑战中涉及的类不会都涉及到 SDC 场景,但它们确实指出了一件事,计算机视觉,尽管它现在比人类更准确,但仍然不完美。这不是 100%准确。
这与现实世界的动态相结合,表明自治系统以意想不到的方式运行的可能性很小。在所有情况下,您会完全信任系统吗?比人类司机更好地处理各种情况?
讲座中提出的论点是,SDC 现在将作为工具,帮助我们更好地驾驶。他们甚至可能比我们开得更好,但在某些时候,人类需要干预。我们从 2018 年开始有一个半自治年。
大致来说,在 90%的情况下,汽车会比我们更好地自动驾驶,但在其余 10%的情况下,需要人工干预/控制。
100%的准确性将得到普遍认可,这也需要对所有意外情况进行概括,例如:百万分之一的情况,其中一只鹿将穿过道路,该情况必须得到处理。
Lex Fridman 在演讲中认为,“完美的系统”需要更多的研究工作,并提高深度学习算法的效率。这也是非常低效的(从计算角度来说)。
我说的完美情况不是指一辆能自动驾驶的汽车。最完美的情况是,我们对系统如此自信,以至于我们的汽车里不再有方向盘。人类驾驶会被认为比自动驾驶更危险。
在那之前,SDC 肯定会出现在道路上,毫无疑问,我们可能不必长时间握着方向盘。但是肯定会有需要人类控制的时刻。因此,术语半自治。
简要提及与强化学习相关的道德规范:
再举一个强化学习的例子——强化学习包括一套算法,在这套算法中,人工智能(agent)自我学习,以最大限度地实现既定目标,从而获得最大回报。这里有一本入门书做一个抽象的概述。
很多时候,系统(特定术语为代理)以完全出乎意料的方式运行。(哪些更擅长得到结果)。
Coast Runners. Source: Lecture Notes.
讲座中海岸跑步者的例子:你和我可能会参加比赛并收集绿色圆圈。代理人发现当地的高额奖励忽略了“隐含的”完成比赛的大目标。
前沿的 AlphaGo 和 AlphaGo Zero 系统已经证明了这一点,它们在围棋比赛中表演了令人类专家感到惊讶的棋步。
那么,如果我们想以最快的方式从 A 到达 B,而 SDC 决定采用一种意想不到的方法/路径,该怎么办呢?(我知道交通规则已被很好地编码到核心系统中——但这不允许我们忽略这种可能性)
鉴于结果可能是意想不到的,我们肯定需要对系统进行检查。
Source: Lecture 1 slides.
视觉系统的鲁棒性也是有问题的。这里有一个例子,说明了如何给图像添加一点扭曲,就能轻易地骗过 ImageNet 获奖模特。
最后,SDC 来了吗?随着 Voyage 在乡村部署自动驾驶出租车;通用汽车公司测试他们的大规模生产车辆?
是也不是。是的,我们周围有半自动车辆。但是一个完全自主的世界还很遥远。一种汽车根本没有方向盘的模式。几年——也许几十年。
我们有一个开始成形的半自主的现在(或未来)。
我相信到目前为止,SDCs 会像丰田展示的守护者模式那样运作良好。
在人类可能无法迅速做出反应的情况下,机器会接管控制权,例如:当你前方的车辆发生碰撞,需要在毫秒内做出决定时。或者在恶劣的天气条件下,由于车上的传感器(在这种情况下是雷达),车辆可以比人类“看得更清楚”。
另一方面,当情况复杂时,司机会控制局面。
在高速公路上,你可以打开自动驾驶仪,看报纸,玩游戏。但是在复杂的情况下,自动驾驶系统需要人工控制。
奔驰汽车能多快测试发布?——一场纸牌游戏比赛
我在 10 个月前注册了 Kaggle,并不时更新不同的比赛。我会窥探并查看数据,查看评估指标,还会浏览一些讨论和内核。但我绝不会真的做任何事。这场比赛是我第一次参加 Kaggle。我和我的另一个朋友 Vinayaka Raj 合作。数据清理、特征工程和模型调整的大部分见解都是他的主意。在这篇文章中,我会分享我们使用的方法。
比赛的主要目的是决定一辆车能以多快的速度通过筛选过程,以减少在测试台上花费的时间,从而减少污染。由于奔驰汽车有各种各样的选项,测试每一个选项,看看它们是否按照标准工作是至关重要的。因此,随着越来越多的功能年复一年地被添加到汽车中,测试一辆这样的汽车所花费的时间增加了。因此,戴姆勒向 Kaggle 社区提供了许多具有众多“匿名”功能的此类汽车的数据集,以提出最佳算法来帮助他们解决这一问题。
评定标准
首先,让我们看看在这次比赛中提交的作品是如何被评估的。用于评估的度量是 决定系数 (也称为 R 的平方)。它是预测分数和实际分数(范围 0-1)之间相关性的平方。简而言之,该指标决定了模型在用样本数据训练后预测真实值数据的能力或接近程度。
数据探索
在这样做之前,我想让你知道我们在这次比赛中使用了 python 及其相关包(matplotlib、pandas、numpy、sklearn 等等)。
现在我们开始研究数据!让我们先看看吧!
Snapshot of the csv file provided by Kaggle
每一行都有一个唯一的 ID、一组分类变量(X0-X8)和二进制/标识变量(X10-X378)以及输出“y”。
经过分析,我们发现了一些列:
- 这表明非方差(整个列中的值相同)
- 高度倾斜的**(大部分时间出现的少数值(> 95%))**
- 那是完全相同的副本****
- 那些与某些其他列线性相关**(正相关或负相关)**
我们没有遇到任何缺少值的列。因此没有必要进行插补。
数据预处理
预处理背后的主要思想是应对我们在数据探索阶段遇到的问题。那我们做了什么?在问这个问题之前,让我们先问一下我们为什么要这样做
- 降低手头问题的维度。
- 降低过度拟合的可能性(模型倾向于学习所有冗余、重复或不必要的可用特征)。
- 更少的特征意味着更简单的模型、更少的内存、更少的训练时间和更快的结果。
现在我们回到问题‘我们做了什么?’**
- 我们删除了没有可变性的列,即始终只包含一个值的列。
- 我们还删除了值在整个列中出现超过 95%的列。
- 我们扫描了数据集的重复出现,在每种情况下只保留一列。
- 显示高相关性的列也被删除,以减少过度拟合。
特征工程
特征是用于预测的有用信息。因此,更好的特性会带来更好的结果。
实际上,原始数据集中可用的特征(数字特征)可以立即用于预测。然而,你不会达到所需的精确度。如果我们可以创建更多的功能,并将它们转换成算法可以理解的东西,会怎么样?通过这样做,我们通过强调潜在的问题,使模型学习起来更简单。
冲击编码
由于数据包含分类变量,我们的第一项工作是将它们转换成算法可以理解的形式。我们进行了影响编码,其中每个分类变量都被该变量在该列中出现的“平均值”所替代。因此,具有更多“平均值”的变量将具有更高的数值。
有许多方法可以将分类变量转换成数字变量。本文对此提供了更多的见解。
在分类变量中创建新特征
我们能够创建具有分类变量的新特征。以下是列车组的前五行:
First five rows of the dataframe
列 X0、X1 和 X2 有一些共同点。他们有一些有两个字母的变量(例如:az,ab,bc 等。)所以我们想到创建一个新的专栏,叫做 X0_club、X1_club 和 X2_club。在把那些以相同字母开头的列组合起来之后,这些列中的每一列都会有变量。例如:[aa,ab,ac,…,az]会被棒化为[a],而[ba,bb,bc,…,bz]会被棒化为[b]等等。下图显示了包含新创建的列的数据帧:
Notice the three additional columns in the end
也可以为数值变量创建新特征。但是因为已经有很多列了,我们没有创建更多的(大错误)。
注意: 需要记住的一个关键点是,在训练数据集上执行的步骤也必须在测试数据集上执行**。因此,在进行数据预处理和特征工程时,要确保这些步骤是针对测试数据同时进行的。**
构建和训练模型
由于我们的问题是一个涉及回归的问题,我们决定使用随机森林,这是众多可用集成方法中的一种。还有许多其他算法可供选择。
我们使用 sklearn 库中可用的 RandomForestRegressor 函数来执行回归。该函数的不同参数(树的数量、树的深度、分割的最小样本和特征的数量)通过为循环运行决定,并使用交叉验证进行验证。
另一种方法
将输出变量与观察值的数量进行对比,我们看到它是高度倾斜的,也有一些异常值。我们决定使用 Box Cox 变换对此进行变换。它将偏态分布转换为正态分布。为此,我们使用了 scipy 中的相应函数。然而,根据转换后的结果训练模型并没有提高验证的准确性
我们能做什么?
以下是一些我们本可以使用但没有使用的技术/方法:
- 使用现有数据中非常重要的变量创建新要素。一个变量的重要性可以通过观察在决定结果时最依赖哪个变量来发现。在这种情况下,交叉验证可以帮到你。
- 我们想到在二进制变量之间执行基本的逻辑运算(AND、XOR 和 OR ),以增加特性的数量。但是由于我们有一个 8GB RAM 的系统,并且有大量的二进制变量(~300),它挂起了几次:(。如果这一步对您有用,必须注意确保删除重复和相关的列。
- 使用 AdaBoost 算法。虽然它有时对噪声和异常值敏感,但在大多数情况下,它优于其他集成方法。尽管如此,还是要小心,因为很有可能会吃得过多。
- 我们也可以在内聚力和回归中使用正则化的方法。sklearn 库中的套索函数可以帮你做到这一点。
结尾注释
所以现在你想要密码了?嗯所有相关的代码都可以在GitHub 的资源库中找到。
你有更好的办法解决这个问题吗?或者你还有其他想分享的评论吗?请随意评论。顺便说一下,这是我在 Medium 上的第一篇帖子。
我目前正在参加另一个 Kaggle 比赛——insta cart 市场篮子分析。一旦完成,我一定会写下我的经历。
今天五家企业如何使用人工智能和大数据
预测分析可以定义为一种数据挖掘形式,它使用统计建模来分析历史模式,然后使用这些模型来预测未来的结果。人工智能的部署使分析技术能够发现人类根本无法看到的变量之间的关系。
在本文中,我们希望通过五个预测分析用例将这一理论付诸实践。
在这个领域有一些有新闻价值的故事,特别是几年前引起如此多关注的“目标知道你何时怀孕”头条新闻。
从那以后,事情有了很大的发展。广泛可用和可访问的分析平台的发展为各种规模的公司提供了对复杂统计模型的访问。除了稍微令人毛骨悚然的怀孕预测的夸张之外,大数据更典型地被小型和大型企业用来改善他们的日常功能。
通过定义他们想要解决的问题,获取正确的数据,雇用具有理解数据的技能的人,并为他们提供适当的技术,任何企业都可以从今天有利可图的预测分析领域开始。
竞争者太多了,无法在一篇文章的范围内考虑每一个例子,所以我们试图提供一个有效的基于人工智能的分析的代表性样本,涵盖广泛的案例研究。
1.供应链优化:沃尔玛
我们从一个重量级的例子开始,但它为所有零售商提供了灵感。
当许多其他“传统”零售商还在苦苦挣扎时,沃尔玛已经连续 11 个季度公布了增长数据。值得注意的是,这是由网上销售额同比增长 63%推动的。
沃尔玛因其适应数字时代的意愿而备受赞誉,并押注于其连接线上和线下世界的能力,以与亚马逊竞争。
人工智能和预测分析是这一驱动力的核心。沃尔玛从其销售点系统即时获取数据,并将其纳入预测,以评估哪些产品可能售罄,哪些产品表现不佳。
Photo by chuttersnap on Unsplash
结合在线行为模式,这提供了大量的数据点(超过 40pb)来帮助沃尔玛为产品需求的上升或下降做准备。
数据通过沃尔玛的“数据咖啡馆”在云中管理,该咖啡馆由硅谷的沃尔玛实验室团队维护。这是一项复杂的、大规模的工作,要根据可靠的数据做出准确的预测,就需要与如此规模的企业所需的变量数量保持一致。
尽管如此,它带来的好处也可以被小企业所追求。
例如,沃尔玛对人工智能和预测分析的使用对于库存管理来说非常宝贵,因为经理们可以适当地进货,而不必冒着在需求超过供应时不得不做出昂贵的最后一分钟调整来填补缺口的风险。
这些预测还允许沃尔玛个性化其在线存在,根据特定客户的预测购买可能性向他们展示产品。
这种方法带来的纪律和严谨性意味着沃尔玛可以坚持严格的交货日期,因为其供应链的每一步都通过使用预测分析进行了优化。所有这些领域都可以由任何企业通过谷歌和 Adobe 这样的可用技术来改进。
引人注目的是,如果顾客从实体店取货,沃尔玛还会以降价或插队特权的形式向他们提供激励。尽管基于人工智能的分析可以给企业带来所有好处,但在运输成本上与亚马逊竞争仍然是一项艰巨的任务。
2.预测价格趋势:Hopper
众所周知,T2 的旅游业竞争激烈,需求时好时坏,还有许多低利润的线路。这可能会让旅行者蒙在鼓里,不确定最佳预订时间。有时最好提前预订,有时最好等到离出发日期更近的时候。
这使得它成为一个成熟的领域,可以发挥人工智能驱动的预测分析的力量,这一事实见证了旅行应用 Hopper 自 2015 年以来的受欢迎程度大幅增长。
Hopper 通过预测未来的价格模式并提醒旅行者购买飞往他们首选目的地的航班的最便宜时间,领先一步。
它通过每天观察数十亿的价格,并基于每条路线的历史数据,预测趋势将如何发展来做到这一点。然后,用户可以设置通知,提醒他们在价格下降时预订。
虽然不是唯一一家提供这种服务的公司,但 Hopper 报告称其预测准确率达到 95%,并声称每次飞行平均为客户节省 50 多美元。
下面的截图显示了这个过程是如何运作的。在一只可爱的、戴着眼镜的小兔子的陪伴下,我选择了纽约到檀香山的飞行路线,度过了一个当之无愧的假期。
Image created by author
根据我选择的日期,令人惊讶的专横的兔子告诉我现在预订,因为这条路线的门票只会随着时间的推移越来越贵。
Hopper 提供了一个将机器学习和预测分析作为其商业战略核心原则的商业范例。没有预测分析,就没有 Hopper。
然而,它所使用的统计模型对所有企业都有借鉴意义。Hopper 的成功本质上来自于它作为一个客观的消费者建议平台的可靠性。因此,许多其他公司可以通过使用统计数据来提供符合客户最佳利益的预测,而不仅仅是他们自己的底线。
3.小企业增长:迪法恩斯角动物园和水族馆
SAP 在 2016 年末进行的一项调查发现,超过 70%的小企业领导者认为他们仍处于从数据中获得洞察力的“早期阶段”。
华盛顿塔科马的一家动物园逆潮流而动,与国家气象局合作,找出导致游客人数如此不可预测地上升和下降的因素。这给管理人员带来了问题,他们总是为公园配备工作人员以迎合大量观众,但往往由于出席人数不多而导致工资超支。
凭直觉,我们可以假设,在温暖干燥的日子里,上座率较高,但在寒冷或潮湿的日子里,上座率较低。然而,通过将国家气象局的数据纳入 IBM 的人工智能驱动的沃森平台,动物园能够准确地确定哪些条件导致更多人参观。
这一知识随后被用于模拟未来的游客模式,使用历史游客人数和预测的天气统计数据。
Source: Unsplash
该项目取得了巨大的成功,现在是动物园商业规划的核心部分。Point Defiance 可以预测 95%以上的出席人数,使管理人员能够适当地为公园配备人员。这对游客如何体验公园没有负面影响(甚至可能相反),并创造了一些重要的商业效率。
当然,这种方法的应用范围远远不止是出席人数。迪法恩斯港可以监控游客与动物园的互动,有助于提供更好的客户体验。还计划使用人工智能驱动的预测分析来监控健康数据,诊断公园动物的问题,以提供预防性治疗。
4.留住员工:IBM
预测分析的根本吸引力在于它有可能根据组织目标提供更好的结果。这些通常公开以利润为基础,但预测分析也可以帮助识别员工保留问题并提出解决方案。
通过上传结构化数据文件(如下图所示),Watson 可以发现员工流失的常见原因。然后,根据每个员工预计不久离开公司的可能性,为他们生成一个“质量分数”。
真正发挥作用的是它响应用户自然语言请求的能力。与谷歌的新分析功能类似,Watson 可以根据用户的偏好响应特定的查询并构建数据可视化。
这是一个平台从探索性和诊断性分析快速进入预测性分析领域的绝佳例子。任何企业所有者或管理者都可以利用这些工具来精确地确定到底是什么导致员工离职,但他们也可以看到这些因素背后的原因,并采取预防措施来平息任何潜在的离职。考虑到招聘新员工与留住现有高绩效员工的成本,这将直接导致运营成本的降低。
5.观众延伸:安德玛
受众扩展是从人工智能和预测分析的使用中受益匪浅的另一个营销领域。通过了解现有高价值客户的数量特征,可以识别相似的个人,并向他们提供可能引起共鸣的个性化信息。
知道把广告预算花在哪里很重要,但知道不花在哪里也很重要。预测分析允许像安德玛这样的公司专注于将带来最大回报的领域,并将原本会被不准确花费的预算进行再投资。
安德玛使用人工智能来执行情感分析和社交倾听等任务,以了解客户对该品牌的看法,以及市场的差距在哪里。这使得该公司专注于成为一个数字健身品牌,这一举措使其在饱和的市场中开辟了一个新的利基市场。
安德玛生产健身产品,也生产应用程序和可穿戴设备,将线下和数字世界联系在一起。使用这些产品的人越多,安德玛就能收集到越多的数据来改进产品。每年有超过 2 亿的注册用户和超过 100 亿次的数字交互,因此不缺少数据。
最初发表于【www.clickz.com】。
模糊匹配如何改进你的 NLP 模型
模糊匹配
Photo by Ross Joyner on Unsplash
处理自然语言处理任务的挑战之一是文本模糊匹配对齐。当跳过这个文本处理文本时,您仍然可以构建您的 NLP 模型,但是代价是您可能不会获得好的结果。有人可能会说,在使用深度学习时,没有必要进行预处理。从我的经验来看,有适当的文本预处理至少可以提高你的模型 3% ~ 5%。
那么在什么样的场景下我们需要处理文本模糊匹配,我们能做些什么呢?如果输入源(即文本)不能保证 100%正确,或者存在别名,如“纽约”和“美国纽约”。
对于情况 1,输入可以来自用户,典型的例子是搜索。想象你正在构建谷歌搜索引擎,你必须验证输入而不是盲目地使用输入。
“language” is suggested to replace “lang” by Google
另一种可能的情况是输入是其他模型的输出。例如,输入来自光学字符引擎(OCR)的输出,您最好减少来自其他模型的错误。
对于第二种情况,即别名。尽管有人认为我们可以构建一个惊人的单词嵌入,使得“纽约”和“美国纽约”的向量对于模型来说足够接近。但是,为什么不用一种简单的方法来解决呢?
Photo by KEITH WONG on Unsplash
模糊的
FuzzyWuzzy 是一个简单但有用的库,可以找到相似的文本和分数。这个库是由 SeatGeek 提供的。使用这个库非常简单。您只需要传递目标令牌和字典。对于下面的例子,我试着搜索国家,国家列表可以从这里下载。
from fuzzywuzzy import process
process.extract('Hong Kong', countries, limit=3)
第一个参数是你的目标词,而第二个参数是字典。
[('Hong Kong SAR China', 90), ('Kongo', 72), ('Tonga', 54)]
经过计算,fuzzywuzzy 提出“中国香港特别行政区”与“香港”的得分最高。
其他得分算法
Fuzzywuzzy 为我们提供了以下不同的算法来对字符串进行评分。详细实现可以访问源代码。
ratio:sequence matcher 的包装器。根据 0 到 100 之间的匹配字符块的数量计算分数。
Formula: 2*(Matched Characters) / (len(String A) + len(String B))
以“Edward”为目标词,以“Edwards”、“Edwards2”和“drawdE”为词典。字符数分别为 7、8 和 6。
process.extract('Edward', ['Edwards', 'Edwards2', 'drawdE'], scorer=fuzz.ratio)
结果是
[('Edwards', 92), ('Edwards2', 86), ('drawdE', 50)]
“drawdE”的结果是 50,你可以看到它不是简单地计算匹配字符的数量,而是字符块。
WRatio:默认计分器。使用不同的算法给 0 到 100 之间的字符串打分。
为了查看我们是否可以查询回预期的位置名称,让我们看看是否可以返回日本(输入“日本”)和美国(输入“美国”)。
# Default scorer is Weighed Ratio
for location in ['Hong Kong', 'jepen', 'United tates']:
result = process.extract(location, countries, limit=2)
print(result)
结果是
[('Hong Kong SAR China', 90), ('Congo - Kinshasa', 57)]
[('Japan', 60), ('Yemen', 60)]
[('United States', 96), ('United Arab Emirates', 86)]
QRatio:字符串的快速比率比较。
# Partial Ratio
process.extract('Hong Kong', countries, scorer=fuzz.QRatio, limit=3)
结果是
[('Hong Kong SAR China', 64), ('Kongo', 57), ('Togo', 46)]
还有 UWRatio(与 WRatio 相同)和 UQRatio(与 QRatio 相同),以防你必须处理 unicode。
拿走
要访问项目模板,您可以访问这个 github repo。
关于我
我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。你可以通过媒体博客、 LinkedIn 或 Github 联系我。
参考
谷歌如何利用人工智能将软件与新硬件结合起来
谷歌已经发布了一系列备受期待的硬件产品,包括一款新的 Pixel 智能手机、一款较小的谷歌 Home、一款较大的谷歌 Home 扬声器、一款笔记本电脑和一些耳塞。
即使是最不经意的观察者也应该清楚,谷歌对硬件越来越认真了。这标志着一家最初依赖其开源 Android 软件影响智能手机市场的公司的方向发生了变化。
软件方法导致了太多的碎片;没有产品和服务的独立生态系统,很难正面应对苹果。
仅有硬件是不够的。摩尔定律不再适用;CPU 的发展速度已经不如从前了。一家科技公司需要找到新的增长领域,才能主导现代格局。
谷歌正押注于其人工智能技术来实现这一点:一个可以统一其硬件和软件的竞争优势领域。
整个活动传达的信息非常明确,谷歌知道自己在这个领域抢在了竞争对手的前面。
“在人工智能优先的世界,计算机应该适应帮助人们生活”——谷歌首席执行官桑德尔·皮帅
中国科学家最近在进行的一项研究发现,谷歌人工智能的智商是苹果同类产品的两倍多。还是落后于一般人,但是差距每年都在减少。另一方面,谷歌和其他公司之间的差距每年都在扩大。
谷歌现在可以将人工智能产品直接构建到其硬件中,这在速度和隐私方面都给消费者带来了好处。
Tensor Processing Units
当然,大部分工作将在云中完成,这让谷歌有机会利用如此庞大的数据集来训练和改进其流程。最近推出的张量处理单元(TPUs)专门用于大规模提供机器学习,为谷歌在这方面的未来做好了准备。
Pixel 手机是旗舰产品,它将使人工智能助手脱颖而出。
谷歌助手将直接与谷歌的服务器通信,它是一个无处不在的固定设备,现在已经有很多谷歌设备。
这款手机的摄像头在开发时就考虑到了 AR 和 VR,尽管公平地说,谷歌在短期内更专注于前者。
“Pixel 用户拍摄的照片是 iPhone 用户的两倍,他们每年存储大约 23GB 的图像。”——布莱恩·拉考斯基,谷歌
在这方面,Google Clips 是一个有趣的发展。Clips 是谷歌将 AI 直接构建到其硬件中的一个例子;在这种情况下,硬件将自动识别和捕捉重要的时刻。无论像素相机有多好(据说确实非常非常好),它仍然依赖于有缺陷的人来充分利用它。
Clips 完全消除了这一因素,它可以同步到 Pixel 手机和基于云的谷歌照片存储平台。当然,Photos 充分利用机器学习和人工智能来解释图片,消除不完美之处,并将主题相关的图像捆绑在一起。
也许最有趣的公告是苹果 AirPods 的竞争对手 Pixel Buds。这些耳塞并不完全是无线的(它们通过一根线相互连接),但它们确实具有一系列的无线功能。
用户可以通过触摸来调高、调低或关闭音乐,也可以通过将手指放在其中一个芽上来调用谷歌助手。这将受到那些觉得在公共场合使用“Ok,Google”提示有点不自然的人的欢迎。
同样,Pixel Buds 允许谷歌使用人工智能来整合其硬件和软件,甚至提供 40 种语言的即时翻译服务。这已经在一系列语言中进行了测试(包括瑞典语,如下面的现场演示所示),早期的报告非常积极。
所有这些都清楚地表明了谷歌的商业战略。
拥有硬件允许搜索巨头将其人工智能和机器学习系统直接集成到产品中。
消费者将会愿意放弃他们的个人数据,因为通过更好的个性化服务,这些数据给他们带来了如此直接的好处。
所有这些数据都是谷歌机器学习系统的燃料,随着时间的推移,随着他们从反馈中学习,准确性只会提高。这将创造新的赚钱机会,搜索在未来一段时间内仍将是谷歌的摇钱树。
当然,只有当人们完全沉浸其中时,才能真正感受到这个生态系统的全部影响。例如,如果搭配 Beats 耳机和亚马逊 Echo,Pixel 智能手机的容量将会减少。
这一赌注是否会有回报还有待观察,但谷歌相信,其卓越的人工智能技术将说服消费者做出转变。
你的国家有多幸福?—快乐星球指数可视化
介绍
幸福星球指数(HPI) 是由英国经济智库 NEF 推出的人类福祉和环境影响指数,旨在促进社会、经济和环境公平。它根据“什么最重要——所有人的可持续福祉”对 140 个国家进行了排名。
HPI 是这样计算的:
Source: HPI
它告诉我们“各国在实现长寿、幸福、可持续生活方面做得有多好”。该指数加权后,生态足迹越低的国家得分越高。
我从 HPI 网站下载了 2016 年的数据集。我感兴趣的是找到幸福、财富、预期寿命、足迹等等之间的相关性,然后根据上述衡量标准,将这 140 个国家归入不同的组别。我想知道这些发现是否会让我吃惊。
注:对于那些想现在就看到结果的人,我已经建立了一个 Tableau 故事,可以从这里进入。
数据
经过预处理后,这是我们正在处理的数据:它包含 140 个国家和 12 个变量:国家,地区,预期寿命,幸福,幸福年,足迹,不平等结果,预期寿命,幸福指数,国内生产总值和人口。
最幸福的 20 个国家(根据幸福星球指数)
哥斯达黎加位居榜首,紧随其后的是墨西哥和哥伦比亚。挪威是排名最高的欧洲国家。
最不快乐的 20 个国家(根据快乐星球指数)
乍得排名垫底,其次是卢森堡。卢森堡是富裕国家中得分非常低的最极端的例子——它在预期寿命方面做得很好,但不平等程度较低;它是世界上人均 GDP 最高的国家之一,但却以世界上最大的人均生态足迹维持着这种生活方式。“如果卢森堡的生活在其他国家复制,我们需要 9.1 个地球来维持我们的生存!”快乐星球指数声称。
人均 GDP 和预期寿命的关系
人均国内生产总值和预期寿命之间的相关性相对较强,因为这两个变量是一致的。这两个变量之间的皮尔逊相关性相当高,约为 0.62。
Figure 1
Pearson's product-moment correlation
data: hpi$gdp and hpi$life_expectancy
t = 9.3042, df = 138, p-value = 2.766e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.5072215 0.7133067
sample estimates:
cor
0.6208781
预期寿命和幸福星球指数得分的关系
尽管欧洲和美洲的许多国家预期寿命较长,但由于碳足迹较大,它们的 HPI 指数最终处于中低水平。
Figure 2
GDP 与幸福星球指数得分的关系
GDP 买不到幸福。GDP 和幸福星球指数得分的相关性确实很低,大概在 0.11 左右。
Figure 3
Pearson's product-moment correlation
data: hpi$gdp and hpi$hpi_index
t = 1.3507, df = 138, p-value = 0.179
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.05267424 0.27492060
sample estimates:
cor
0.1142272
一个简单的关联热图
Figure 4
使聚集
在一系列统计分析之后,通过应用 Pam 聚类分析,我将这 140 个国家按照财富、发展、碳排放和幸福程度分成三组(如果你对聚类分析的细节感兴趣,你可以在 Github 上的 R Markdown 文件中找到它们)。
Figure 7
这三个星团是如何出现在世界地图上的?
Figure 8
摘要
幸福星球指数被批评为对生态足迹的加权过重;生态足迹是一个有争议的概念。此外,幸福星球指数被误解为个人“幸福”的衡量标准,而事实上,它是地球“幸福”的衡量标准。
然而,快乐星球指数已经成为政治领域的一个考虑因素。对我们来说,它是有用的,因为它结合了福祉和环境方面,而且简单易懂。而且,它可以在网上找到,所以我们可以用它来创作一个故事。
创建这篇文章的源代码可以在这里找到。同样,欢迎你尝试用这些数据创建的画面故事。我将很高兴收到关于上述任何反馈或问题。
我如何解决数据科学问题
对于刚刚进入数据科学领域的人来说,事情肯定会变得令人生畏。数据科学有太多的技术和程序会让任何人困惑。
亲身经历过这个问题,并且看到我的大多数同学都在为这个问题而挣扎,我决定写这篇博客,讲述我通常是如何处理数据科学问题的。
第一步:将你的业务问题陈述转化为技术问题陈述
与任何其他软件问题类似,数据科学旨在解决商业问题。大多数时候,业务问题陈述是模糊的,可以有多种解释。这主要是因为我们通常在语言中使用不能直接翻译成机器可读代码的定性词汇。
比方说,我们需要开发一个解决方案来降低城市的犯罪率。术语“减少”可以解释为:
- 降低高犯罪率地区的犯罪率
- 降低最常见犯罪类型的犯罪率
与定义问题的客户或业务团队一起确定正确的解释是一个好的实践。
第二步:决定监督学习技术
几乎每个数据科学问题的最终目标通常是分类或回归。确定问题的监督技术将有助于你更清晰地理解商业陈述。
让我们来看看降低犯罪率的问题。虽然降低犯罪率的问题更多的是一个政策决定,但根据上面的选择,我们必须决定是否需要进行分类或回归。
- 如果我们需要降低高犯罪率地区的犯罪率,我们就需要确定一个地区的犯罪率。这是一个回归问题。
- 如果我们需要降低最常见犯罪类型的犯罪率,我们就需要确定一个地区最常见的犯罪类型。这是一个分类问题。
再次强调,与定义问题需求的客户或业务团队进行交流,澄清确切的需求,这是一个很好的实践。
第三步:文献调查
文献调查是解决任何问题的最重要的一步(也是最容易被忽视的一步)。如果你阅读任何关于数据科学组成部分的文章,你会发现计算机科学、统计/数学和领域知识。因为对一个人来说,在所有可能的领域都拥有专业知识是很不人道的,所以文献调查通常有助于弥补专业知识不足的差距。
在浏览了与某个问题相关的现有文献后,我通常会尝试提出一组假设,这些假设可以形成我的潜在特征集。浏览现有文献有助于你理解该领域中的现有证据,作为在你的问题中采取正确方向的指南。它还有助于解释从预测模型中获得的结果。
回到我们降低犯罪率的问题上来,如果你想预测一个地区的犯罪率,你会考虑人口统计、邻近地区、执法规则等常识因素。文献调查将帮助你考虑额外的变量,如气候、交通方式、离婚率等。
第四步:数据清理
如果您与任何在数据科学方面花了一些时间的人交谈,他们总是说他们的大部分时间都花在清理数据上。真实世界的数据总是杂乱无章的。以下是大多数数据集中的一些常见差异,以及如何清理它们的一些技巧:
- 缺失值
缺失值是数据集中的空白值。这可能是由于各种原因,如价值未知、未记录、保密等。由于缺少某个值的原因不清楚,因此很难猜测该值。
您可以尝试不同的技术来估算缺失值,从简单的方法开始,如列平均值、中位数等。以及复杂的方法,如使用机器学习模型来估计缺失值。
- 重复记录
重复记录面临的挑战是识别重复的记录。在合并来自多个来源的数据时,经常会出现重复记录。这也可能是由于人为错误造成的。要识别重复项,您可以将数值近似到特定的小数位,对于文本值,模糊匹配可能是一个好的开始。识别重复项有助于数据工程团队改进数据收集以防止此类错误。
- 不正确的值
不正确的值大多是由于人为错误。例如,如果有一个名为“年龄”的字段,其值为 500,这显然是错误的。拥有数据的领域知识将有助于识别这些值。识别数值列的错误值的一个好方法是手动查看平均值的 3 个标准偏差以上的值,以检查其正确性。
第五步:特征工程
特征工程是任何数据科学问题中最重要的步骤之一。一组好的要素可能会使简单的模型适用于您的数据。如果功能不够好,你可能需要复杂的模型。特征工程主要包括:
- 移除多余特征
如果某个要素对输出值贡献不大,或者是其他要素的函数,则可以移除该要素。有各种各样的度量标准,如 AIC 和 BIC 来识别冗余特征。有内置的包来执行向前选择、向后选择等操作。删除多余的功能。
- 转换特征
某个要素可能与输出列存在非线性关系。虽然复杂模型可以用足够的数据捕捉到这一点,但简单模型可能无法捕捉到这一点。我通常试图想象每列的不同函数,如对数、倒数、二次、三次等。并选择看起来最接近正常曲线的变换。
第六步:数据修改
一旦清理了数据,在应用机器学习模型之前,可能需要进行一些修改。最常见的修改之一是将每一列缩放到相同的范围,以便给予所有列相同的权重。其他一些所需的修改可能是数据特定的,例如,如果输出列是倾斜的,您可能需要上采样或下采样。
步骤 7 到 9 是迭代的。
第七步:建模
一旦我准备好了数据,我通常会从尝试所有标准的机器学习模型开始。如果是分类问题,一个好的开始将是逻辑回归、朴素贝叶斯、k-最近邻、决策树等。如果是回归问题,可以试试线性回归、回归树等。从简单模型开始的原因是简单模型需要修改的参数较少。如果我们从一个复杂的模型开始,像神经网络或支持向量机,有太多的参数可以改变,穷尽所有选项可能会很费时间。
每个机器学习模型都对数据做出一些潜在的假设。例如,线性回归/逻辑回归假设数据来自输入参数的线性组合。朴素贝叶斯假设输入参数相互独立。了解这些假设可以帮助您判断不同模型的结果。将实际值与预测值可视化以了解这些差异通常很有帮助。
第八步:型号对比
评估不同机器学习模型的最标准的技术之一是通过交叉验证的过程。我通常选择 10 重交叉验证,但是你可以根据数据的大小选择正确的交叉验证分割。交叉验证基本上得出一个模型的平均性能。这有助于避免选择针对数据表现良好的模型,或者换句话说,避免过度拟合。在交叉验证之前随机化数据通常是一个好的做法。
比较不同模型性能的一个好方法是 ROC 曲线。ROC 曲线有助于您可视化不同模型在不同阈值下的性能。虽然 ROC 曲线给出了模型性能的整体感觉,但根据业务决策,您必须选择性能指标,如准确性、真阳性率、假阳性率、F1-得分等。
第九步:错误分析
此时,你已经尝试了一堆机器学习模型,得到了结果。这是一个很好的利用时间的方法,不仅仅是查看结果,如准确性或真正的阳性率,而是查看在一些模型中失败的数据点集合。这将帮助您更好地理解数据,并且比尝试所有可能的模型组合更快地改进模型。这是尝试集合模型的时候了,比如随机森林、梯度推进或者你自己的元模型【比如决策树+逻辑回归】。集合模型几乎总是保证比任何标准模型表现更好。
第十步:改进你的最佳模特
一旦我有了最好的模型,我通常会根据参数的数量来绘制训练与测试的准确性(或正确的度量标准)。通常,根据数据点的数量来检查训练和测试的准确性是很容易的。基本上这个图会告诉你你的模型是过拟合还是欠拟合。这篇文章检测过拟合与欠拟合清楚地解释了这个概念。
了解您的模型是过度拟合还是欠拟合将告诉您如何继续下一步。如果模型过度拟合,您可以考虑收集更多数据。如果模型不合适,您可以考虑使模型更复杂。[例如,将高阶项添加到线性/逻辑回归中]
步骤 11:部署模型
一旦您有了最终的模型,您会希望模型被部署,以便它自动预测新数据点的输出,而无需重新训练。你可以为简单的模型推导出一个公式,比如线性回归,逻辑回归,决策树等等。对于像 SVM、神经网络、随机森林等复杂的模型来说,就不是那么简单了。我不太熟悉其他语言,但 Python 有一个名为 pickle 的库,它允许你保存模型,并使用它来预测新数据的输出。
第 12 步:添加反馈
通常,任何数据科学问题的数据都是历史数据。虽然这可能在一定程度上类似于当前的数据,但它可能无法捕捉当前的趋势或变化。例如,如果您使用人口作为输入参数,虽然 2015-2016 年的人口可能会略有变化,但如果您在 5 年后使用该模型,它可能会给出不正确的结果。
处理这个问题的一个方法是不断用额外的数据重新训练你的模型。这可能是一个很好的选择,但是重新训练一个模型可能很耗时。此外,如果您有大量数据流入的应用程序,这可能需要定期进行。另一个更好的选择是使用主动学习。主动学习基本上试图使用实时数据作为反馈,并自动更新模型。最常见的方法是批量梯度下降和随机梯度下降。基于应用程序使用正确的方法可能是合适的。
结束语
数据科学的领域真的很广阔。人们一生都在研究上面讨论的各个主题。作为一名数据科学家,比起研究单个子主题,你更需要解决业务问题。此外,您必须向可能没有足够技术知识的业务团队解释技术过程和结果。因此,虽然您可能不需要对每种技术都有非常深入的了解,但是您需要有足够的清晰度来抽象技术过程和结果,并用业务术语来解释它。
LinkedIn 上的链接:https://www . LinkedIn . com/pulse/how-I-approach-data-science-problem-Ganesh-n-Prasad?trk=prof-post
如果您有任何建议,请留言或通过ganeshn1411@gmail.com联系我
我是如何在短短一个多月内完成 Udacity 的机器学习 ND 的
Machine Learning by mohamed_hassan, Pixabay license
如何在短时间内有效地学习?在这篇文章中,我描述了我是如何在大约一个月内完成 Udacity 的机器学习纳米学位的,而这通常需要 6-12 个月。我希望这能给你一些见解和想法,告诉你如何更有效地完成自己的学习目标。
这篇文章中的部分:
- 背景:我开始之前做了什么,基本技能是什么
- 导航纳米学位计划
- 观看视频讲座
- 时间管理
- 完成项目
一.开始之前
Build firm foundations. Photo by Mads Schmidt Rasmussen on Unsplash
我对数学和统计学(高中水平)有一定的了解,以前也做过编程(主要是关于 CodeAcademy 和基本 web 开发的入门课程)。特别是,我参加了 Udacity 的免费数据分析入门课程,因此我接触到了熊猫。Numpy 和 Pandas 是 Python 中用户友好的库,用于分析和操作数据。
要吸取的教训:对将要使用的工具有一个坚实的基础,例如 Numpy 和 Pandas 。这对你会有很大帮助。
- 我提到的教程似乎已经集成到 MLND 的第一部分(项目 1 之前)了,所以在开始之前你不必学习使用这些工具。
- 在继续之前,您不必掌握这些工具,但我建议您至少要基本熟悉**,这样您就可以专注于其他事情,如数据预处理和建模**。
如果你是 Numpy 和 Pandas 的新手,花点时间记下常用的命令并在需要时查阅你的备忘单。这是一张熊猫小抄(不是我的)。
Scikit-learn 也是你将要使用的一个关键的机器学习工具,但是我不认为你需要在早期就很好地了解它。
二。导航 ND
Photo by Himesh Kumar Behera on Unsplash
Udacity 的课程结构是,先有课程,再有项目。每节课都由短视频组成,中间有小测验。例如,在监督学习部分,在进入监督学习项目之前,您将学习回归、决策树、神经网络、支持向量机、基于实例的学习、朴素贝叶斯、贝叶斯学习和集成学习。
你可能知道会有很多视频观看。问题是,如果你按时间顺序进行,当你完成这个项目时,你可能已经忘记了在这一节的前几课中学到的东西。
为了解决这个问题,我在观看视频讲座之前浏览了项目大纲,并在浏览视频的过程中完成了项目。此外,我没有按顺序观看所有视频——我先去看我需要的视频,然后再去看其他视频。这样做有两个原因:
1。理解你为什么要学习一些东西。
- 你会更积极地寻找重要的或有用的材料。
2。一边做一边完成这个项目。
- 课后,你将能够更彻底地应用所学的知识,所以你会更好地吸收材料。
- 你也可以花更少的时间在课程中寻找你以后需要的答案。
示例:监督学习项目
拿监督学习项目(这里是项目笔记本)来说。通过浏览笔记本,您可以很好地了解机器学习过程——从探索和预处理数据到选择和调整模型。您可能不知道许多术语的意思,但这不是问题,您稍后会了解它们。现在浏览笔记本意味着当你遇到一些想法时,你会更好地了解它们在大局中的位置。
您还可以看到,例如在问题 2 中,您被要求描述每种模型的优点和缺点,以及为什么它们可能适合该问题。这些是你在观看视频讲座时需要注意的事情。这些项目的伟大之处在于它们很实用,并且只问你一些你在工作中作为一个真正的项目来做时需要回答的问题。因此,通过观察他们问的问题,你可以推断出你需要从视频中学到什么。因此,你会更好地理解内容,更快地完成项目。
我也建议你从一开始就开始考虑你的顶点项目。顶石项目是一个准自由形式的项目,你将在项目结束时完成。
三。观看视频讲座
Illustration by mohamed hassan, CC0 License.
充分利用观看视频讲座的时间也很重要,因为你会花很多时间来做这件事!这里的关键是主动学习并避免因为忘记所学内容而不得不再次观看视频。(重新观看部分视频,因为你不明白所说的是好的。)
主动学习是什么意思?这意味着你不只是坐在那里听,而是想想你在说什么,你是否理解它。如果你不积极思考所说的话,你就不会记得或理解它。你需要把知识变成你自己的。
怎样才能积极倾听?你可以通过边看视频边记笔记来做到。试着不要逐字逐句地记下老师说的话,而是用自己的话写(或画)一个总结。这也意味着你不必写下所有的东西——只写下你认为以后需要的信息。这样,你不仅处理了信息,而且避免了以后为了寻找你需要的东西而不得不重播视频。
你可以看看我在 GitHub repo 上的笔记。Udacity 在程序的资源部分也有一些注释。
四。时间管理
Photo by Anastase Maragos on Unsplash
我很幸运能够在 2016 年 9 月几乎全职从事 MLND 的工作,所以设置将与大多数人不同。当我兼职从事自动驾驶汽车工程师 Nanodegree 的工作时,这些想法仍然适用(如果不是更适用的话)。
可操作项目
有很多关于时间管理的建议,但是这两个是对我有用的,并且我已经坚持了一年多的:
1。优先考虑你要做的事情
我列出了三件我想做的事情,并按照优先顺序去做。如果你每天花一个小时在 MLND 上,你可能想把这个调整到每周一到三个项目。
这个想法是决定少数几件重要的事情,并专注于这些事情。
2。追踪您的时间
知道你实际上是如何度过你的时间是很棒的——你经常会意识到有多少时间花在了不重要或完全无用的事情上。你可以使用像 Toggl 这样的工具、电子表格或纸笔来完成。
一般想法
1。深潜比浅潜更好
- 在继续前进之前,花时间去理解这些想法。如果你不知道某个部分发生了什么(也没有试图去理解它),只是继续前进,你很可能不得不重新观看视频。你可能会觉得当时你走得更快了,但通常不值得。
- 如果你能一次花更长的时间在这个项目上(45 分钟足够坚持下去)会有帮助。我每天花大约 3-6 个小时在这个项目上,这样我就可以每天完成一大部分。这意味着我花更少的时间来复习我已经忘记的课程材料。
2.记录你的工作
- 这看起来像是浪费时间,但是*特别是如果你是兼职做这个的话,*当你两周后回到你的项目时,你会很高兴你做了。
3。努力工作,但不要超越自己的极限
- 如果你认为你没有任何进展,因为你不能思考或者感觉不舒服,休息一下。时间的质量比时间的数量更重要。如果我累到无法清晰思考,我会去散步,只有在感觉好多了之后才继续工作。休息的一个好方法是小睡一会儿或者只是睡觉。充足的睡眠真的很重要。
4。保持动力
- 通过 MOOCs 学习的最大问题是,你可能会失去动力,不再投入时间。如果你能激励自己,这是很有帮助的,例如通过和朋友一起参加课程,在闲聊中寻找学习伙伴,对朋友负责或者写下你所学到的。
- 当我在做这个项目时,Udacity 正在我所在的地区试验面对面的联系小组会议。我见到了其他 Udacity 的学生,并讨论了我们每个人的进步。这对我很有帮助。你可以看看你所在的地区是否有联谊团体,或者是否有其他空闲时间的学生愿意见面。
动词 (verb 的缩写)完成项目
Photo by Joshua Hoehne on Unsplash
你需要通过所有的项目才能从纳米学位项目毕业。为了通过一个项目,你的提交需要满足项目标题中的所有要求。
1.如前所述,在观看视频之前,浏览项目的每个部分。
- 你甚至可以一边浏览视频,一边完成你的项目。通过这种方式,你可以更好地理解每个被教授的思想是如何融入大局的,以及它为什么重要。
特别是,尽早开始考虑你的顶点项目。随着项目的进展,你可以寻找一些想法来解决你的问题。有问题要解决也会让你有动力。
2。边走边草拟问题的答案
MLND 有许多问答形式的问题。当你完成项目时,做一个第一遍的“草稿”回答。
记下你的问题或你不能回答问题的原因。这将帮助你摆脱困境,因为你知道要寻找什么。这在心理上也是有帮助的,因为你不会盯着许多空白的地方——你知道你有所收获。
3。不要害怕提交项目,即使你认为它们不怎么样,或者你不知道怎么做。
提交项目意味着你可以得到反馈。**多次提交(因为你第一次没有通过)意味着你可以得到更多的反馈!**评论可以说是项目中最精彩的部分。请你的评论者对你不确定的地方提出建议。
从经验来看,很多学生的一大拦路虎是泰坦尼克号项目(Project 0) 。人们可以为此花费数周时间,因为他们认为他们的结果会更好。Project 0 是在你学习大部分东西之前,是为了让你体验一下机器学习的过程。如果你想做出色的工作,当你对概念和工具有了更好的理解时,把它留给以后的项目。给泰坦尼克做点基础的就行了,符合精度要求就提交。
祝你学习愉快,万事如意!如果你有任何问题或反馈,请在评论中告诉我。
阅读更多关于机器学习和编程的帖子, 访问我在 jessicayung.com 的网站 。
我如何用 4 小时的工作和 500 美元创建了一个 40,000 标签的音频数据集
我将向您展示如何使用 amazon mechanical Turk 创建定制的高质量数据集。
我已经开发深度学习产品好几年了,在我开始一个新项目之前,我对客户的要求之一是他们必须已经有一个数据集。这一直是一个要求,因为它确保我不必做任何我不太喜欢的数据集创建工作。这通常需要一段时间,并且会变得非常繁琐,尤其是在没有公开可用的数据源的情况下。虽然公平地说,每天都有许多数据集可用,而且越来越多,你现在可以使用谷歌的新数据集搜索工具进行搜索。
几个月前,一家读者公司找到我,希望帮助我开发一款产品,但他们没有数据集,这次我决定尝试一下。我想这将是一个探索过程和培养技能的绝佳时机。这是我发现亚马逊 Mechanical Turk 对于深度学习工程师的强大之处。经过 4 个小时的编码和跑腿工作,我发表了我的第一首热门歌曲。40 小时后,我有了一个包含 40k 标签图像的数据集,而我的钱包只轻了 500 美元。我觉得我刚刚用了一个作弊代码。我想分享一些我使用 MTurk 学到的东西,并希望它能帮助你为你的项目建立定制的深度学习数据集。
尝试构建自定义数据集?不确定从哪里开始?和我一起聊 30 分钟,谈谈你的项目。我会帮助你更清楚地看到问题,并帮助你消除噪音。
报名一个时间段
什么是机械土耳其人
Mechanical Turk 或 MTurk 是一个众包市场,在这里你可以发布和协调广泛的人类智能任务(HITs)。任务可以是任何东西,如分类、标记、调查、转录、数据收集,以及任何你可以制作成网站的东西。工人可以查看/选择您的任务,并为每个任务赚取少量奖励。
该平台提供了许多有用的工具来创建您的工作,并使工人轻松地成功完成您的任务。假设您想要创建一个包含 1000 张带标签图像的数据集,您可以对每 10 张分类图像收取 0.25 美元,并以 25 美元的价格获得完整的数据集。最棒的是,你将在几个小时内获得数据集。
从现实世界的例子开始
1:选择击中的类型
MTurk 有多种 HIT 模板可供选择,这使得它很容易开始。它们的范围从调查模板到音频和视频的转录。花些时间检查不同的项目,了解你能做什么。
如果您看不到可以使用的项目模板,您可以随时使用通用调查链接模板,并将其链接到自定义网页,这样员工就可以执行任何任务。我用这种方法收集非标准的训练数据已经非常成功了。
2.设置点击的属性
命中属性对于成功收集数据非常重要。命中属性包括像标题和描述这样平凡的事情,但也有很多重要的设置,如每次命中的任务数量和每次命中的奖励。
每次点击的奖励是你要付给完成你的任务的工人多少钱。当试图计算一个公平的报酬率时,花点时间自己做,并计算好时间。看看你完成任务需要多长时间,然后计算出等价的报酬,假设完成任务需要 1 个小时,并且你支付了最低工资。我已经无数次使用这种方法来获得我所有任务的启动费,并且结果的质量一直很高。请记住,工作越努力,你就应该付出更多来保持质量。我花了高达 2.00 美元去做一件需要 10 分钟的工作。
每项任务分配的时间也是一个需要考虑的重要因素。我发现这一点时,我认为这只是一个数字,工人们看看他们是否有时间完成任务。我了解到,一旦他们开始工作,就会被限制在这个时间范围内。这导致了一些工人的问题,当他们的时间用完了,不能领取他们的奖励!
其他一些有用的参数:
- 点击过期
- 自动审批和支付员工
- MTurk 大师
- 点击率
- 批准的点击次数
- 特定位置的工人
- 特定语言技能要求
3.自定义您的 HIT HTML 模板
设置好参数后,您可以创建或更改所有员工在决定是否接受您的工作时都会看到的 HTML 设计。MTurk 为你提供了一个非常用户友好的 HTML 编辑器来帮助你。如果你想要一个非常定制的模板,你也可以直接编辑 HTML 源代码。
最佳实践
花点时间为任务创建说明,因为这可能意味着好数据和坏数据之间的差异。这是每一击最关键的组成部分。保持你的指示简单明了,以避免工人的错误
为你的项目制定清晰的评估政策
您应该手动评估您的点击结果。当您制定评估政策时,无法满足这些指标的明确员工有机会不接受 HIT,而不是糟糕地完成它,这将浪费您和他们的时间。
包括黄金标准项目
黄金标准项目是那些你已经知道答案的项目。当您将这些项目包含到您的 HIT 中时,您就有办法在评估期间自动剔除不良员工的工作。
评估你得到的结果
总是评估你得到的结果。您可以选择自动或手动完成这项工作,但这是至关重要的一步。不检查工人的工作会导致质量低劣和彻头彻尾的欺诈。
我最近遇到过一个案例,一个工人正在提交由自动化系统生成的结果。幸运的是,我的黄金标准项目和我花在评估结果上的时间提醒了我这个坏演员,我能够阻止他们的帐户提交任何更多的工作。
尝试构建自定义数据集?不确定从哪里开始?和我一起聊 30 分钟,谈谈你的项目。我会帮助你更清楚地看到问题,并帮助你消除噪音。
报名一个时间段
最后的想法
Mechanical Turk 对于深度学习工程师和团队来说是一个非常棒的工具。它可以用来建立数据集,只有大公司才能在很短的时间和成本内完成。它的 API 还允许你自动化剩下的大部分工作。我可以进行全自动的评估和职位发布。
除了显而易见的成本和时间优势,还有出色的员工群体。他们来自各行各业,为了完成你指定的 10 分钟任务,他们愿意走多远会让你吃惊。我最近开发了一个数据集,我用它来建立一个老年人监测和警报系统,我收到了 10 封电子邮件感谢我开发这个系统,还有几封电子邮件让我知道如何更好地帮助工人们完成它。
感谢阅读:)如果你喜欢它,尽可能多的点击下面的按钮!这对我意义重大,鼓励我写更多这样的故事
我如何创建一个分类器来确定一首歌的潜在流行度。
帮助音乐人成功的工具。
Source: Unsplash
介绍
从我的角度来看,我看到许多音乐家,无论是乐队还是个人,都没有在社会上获得他们想要的受欢迎的地位,而很少有人主宰音乐行业。因此,我的努力是开发一个系统,让每个对通过歌曲展示自己独特才华感兴趣的音乐爱好者能够评估他们可能从观众那里获得的潜在受欢迎程度。
受欢迎程度与取决于音乐观众偏好的评级相关联。将有三个评级等级,分别标为优秀、中等和差。因此,较高的评价(优秀)表明在音乐观众中类似于其他高评价歌曲的流行度,反之亦然,而中等的保持在以上两者之间的音轨。
技术
tensor flow——一个流行的机器学习库
pandas——python 的数据处理和操作库
一个音乐和音频分析工具
另一个机器学习库(一个高级 API)
numpy——有效执行矩阵(2d 数组)运算的便捷工具
操作系统处理与文件系统相关的操作
CatBoost——一个用较少的过度拟合实现增强树的库
XGBoost- a 梯度推进算法
方法
我们将需要一个数据集来工作,我们需要手工制作,因为我将使用僧伽罗语歌曲,因为僧伽罗语是我的母语,以及基于这些做的研究较少。目前没有关于僧伽罗歌的数据集。因此需要创建一个。我们的任务将是一个采用监督学习方法的分类任务。我们将主要关注神经网络作为我们的分类算法。具体来说,我们将使用使用 tensorflow 实现的多层神经网络。我们还将在结果部分对使用多种技术获得的结果进行比较。
设计
A complete process execution of the system
方法学
在开发我们的解决方案时,我们考虑了各种方法来选择最佳方案。每种方法的性能比较可以在结果部分找到。考虑了以下实现。
1.香草神经网络(多层神经网络)
2.集合技术(随机森林)
3.升压(XGboost,CatBoost)
4.堆叠(2 个基础学习者,1 个元学习者)
创建数据集
我们将使用 librosa 从 8000 多首音乐库中为每首歌曲提取三个有意义的特征。这三个特征将是节奏(每分钟节拍数)、梅尔频率倒谱系数(模仿人类语音产生和语音感知的某些部分)和谐波元素(音频信号内的谐波分量)。使用这三个特征的原因是因为它们被认为是音乐的高级特征,并且高级特征已经被证明是观众偏好的更具决定性的因素,因为它们捕获了观众最看重的特征。接下来,我们需要标记这个数据集。为此,我们使用 K-means 聚类将数据点分成三个聚类,这三个聚类的数量等于评级类别的数量。这里,我们假设具有相似特征的歌曲生成彼此接近的特征值,因此当计算距离度量以确定数据点所属的聚类时,具有相似评级的数据点的距离将具有微小的差异。从而落入相同的集群。确定标注后,合并要素和标注以创建数据集。
Clustering performed on the dataset using three clusters
聚类标签将被分配 0 和聚类数-1 之间的随机整数给三个聚类。这些标签 0、1 和 2 只是分隔三个集群的符号,因此没有数字表示。因此,如果有人需要确定哪个标签是优秀、中等和差,以评估他们的立场。他们必须从自己的角度来定义成功。原因是音乐因人而异的主观性。例如,如果我想根据我认为的流行歌曲来评价我的歌曲。我必须首先选择我认为优秀、一般和差的三首歌曲,并提取这些歌曲的特征,将它们提供给系统,并获得这些歌曲的评级/标签。现在,既然我知道了这些标签在我看来意味着什么,我就可以把我的作品交给系统,并获得标签/评级,然后比较我的立场。
First few records of the dataset
Label Distribution
数据预处理
sklearn 中的 LabelBinerizer()已用于在标签上创建等效的一键编码。
StandardScaler()用于将数据标准化为平均值为零、标准差为一的普通高斯分布。
构建神经网络
神经网络有一个输入层、两个隐藏层和一个输出层。首先,我们创建三个占位符,以提供每个神经元存在的特征、标签和概率,这是丢弃层中需要的参数。这些占位符的值将在运行时提供。然后,我们通过声明每一层的权重和偏差来创建网络的每一层。除了输出层之后,在每一层之后,将在激活函数的输出上添加漏失。前馈神经网络的基本概念是,输入到某一层的输入乘以一个权重矩阵,并添加到该层的偏差中。这些权重和偏差是可以改变的变量,以便使学习函数一般化。来自层的结果被给予激活函数,该激活函数根据激活函数将输入映射到特定范围内的输出。输入层和隐藏层的激活函数将是 tanh ,而输出层将具有 softmax 激活函数。中间层的最佳激活被证明是 tanh ,其流行的激活函数与性能的比较将在结果部分提供。
价值函数
我们使用的成本函数是交叉熵函数,它取预测标签的对数值,然后乘以实际标签。然后进行求和并创建新的矩阵值。为了获得每一批的成本,我们计算矩阵各行的平均值。现在我们有了一个列矩阵,它指定了每一批或一个时期的成本。
优化功能
作为优化函数,我们使用了随机梯度下降法,它通过学习率在降低成本的方向上调整学习曲线。
培养
训练是分批进行的,以减少过度拟合。此外,训练时期的数量被设置为 200。这应该在 Tensorflow 的会话中完成,因为 Tensorflow 中的计算图形仅在会话中进行评估。要提供给占位符的值是在训练期间使用 feed_dict 字典参数提供的。session 类中的 run 方法可用于运行计算图的操作。
设置超参数
训练时期
当我们将所有的训练数据用于训练过程时,我们说一个时期完成了。训练数据由我们的训练特征及其相应的训练标签组成。这里,我们将训练时期设置为 200,这意味着我们在 200 次迭代中训练我们的全部训练数据。没有我们可以使用的训练时期的理想数量。这取决于数据的复杂程度。因此,您应该进行参数调整或基本上尝试几个参数配置,以找到该参数的理想/合适值。
超参数 1:training_epochs = 200
因为我们正在实现一个多层神经网络。它将由一个输入层、两个隐藏层和一个输出层组成。
隐藏层中的神经元数量
隐藏层是对输入数据执行转换以识别模式并概括我们的模型的层。在这里,我在第一和第二个隐藏层中分别使用了 120 个神经元,这足以达到相当好的精度。但是正如我之前解释的那样,所有的超参数都应该以这样一种方式进行调整,以改善您的模型。
超参数 2:n_neurons_in_h1 = 120
超参数 3:n_neurons_in_h2 = 120
学习率
这是算法学习的阶段。机器学习大师说,我们应该从高学习率开始,逐步降低学习率,以达到最佳效果。此外,建议学习率保持在 0 & 1 的范围内。
超参数 4:learning_rate = 0.001
辍学者
用于减少训练时的过度配合。
keep_prob=0.5 用于训练,1.0 用于测试。退出仅用于培训,不用于测试。上述概率变量指定了每个神经元留在层中的概率。
最后,可以在训练后使用 save()类中的 save()方法保存模型。
为减少过度配合而采取的措施
1.打乱数据集
2.标准化数据集
3.添加漏失层
4.成批样本的训练数据集。
结果和讨论
在本节中,我们将评估我们在解决问题时使用的每种方法的性能,以及我们可以获得的推论。
参数调整结果如下:
Hyper parameter configurations with changes in accuracy
其他参数(批量和分割百分比)变化:
Changes in accuracy with other parameter configurations
Accuracy variation against training epochs
Cost variation against training epochs
Performance comparison of each approach
Feature importance plot
上图显示了通过 F-score(2TP/2TP+FP+FN)测量的每个特征的预测能力。其中 TP 是真阳性的数量,FP 是假阳性的数量,FN 是假阴性的数量。
Variation in misclassification error with various activation functions
很明显,就预测精度而言,堆叠通过正确分类每个类中的每个元素提供了令人印象深刻的结果。而增压和装袋也进行得很好。神经网络的实现不是很令人印象深刻,但给出了可接受的结果。最重要的事实是,给定数据集的偏差性质,神经网络仍然能够识别类别 2 的小部分。但这是在上面提到的许多技术被结合以最小化过度拟合之后。此外 tanh 被认为是为输出层以外的层选择激活函数的最佳选择。
参考文献
用于机器智能的开源软件库
www.tensorflow.org](https://www.tensorflow.org/) [## LibROSA - librosa 0.5.1 文档
LibROSA 是一个用于音乐和音频分析的 python 包。它提供了创作音乐所必需的构件…
librosa.github.io](https://librosa.github.io/librosa/) [## sci kit-learn:Python 中的机器学习
编辑描述
scikit-learn.org](http://scikit-learn.org/stable/) [## 催化增强/催化增强
catboost 是一个开源的决策树梯度提升库,支持分类特征。
github.com](https://github.com/catboost/catboost) [## XGBoost 文档- xgboost 0.4 文档
这是 xgboost 库的文档。XGBoost 是极端梯度增强的缩写。这是一个旨在…
xgboost-clone.readthedocs.io](http://xgboost-clone.readthedocs.io/en/latest/) [## 城市声音分类,第 1 部分
基于神经网络的声音特征提取和分类
aqibsaeed.github.io](https://aqibsaeed.github.io/2016-09-03-urban-sound-classification-part-1/) [## 语音识别维基
1.自动语音识别(ASR)中最常用的特征提取方法是 Mel-Frequency…
recognize-speech.com](http://recognize-speech.com/feature-extraction/mfcc)
附录
Source code for feature extraction
Source code fro neural network implementation,training and evaluation
我如何利用我自己的社交媒体数据
如果他们能从中受益,为什么我不能?
大约两年前,我参加了第一次数据科学入门课程。在我注册的十周时间里,我学会了如何收集数据,修改数据,分析数据,可视化数据,并将其粘贴到机器学习算法中。我立刻就被吸引住了。在这个大数据就像吃到饱的流行词自助餐一样随处可见的时代,我感觉一个全新的世界展现在我的眼前。
在我学习数据科学入门的同时,我还参加了一个名为职业责任的课程。在我的大学,这通常被称为计算机伦理。我快速增长的渴求数据的欲望突然被极端的认知失调所压制。
早上,我会学到从训练数据集中推断缺失的属性是多么容易,而下午,我会学到发生在行业中的去匿名化丑闻。我在学习上下文完整性的同一天学会了如何创建一个网页抓取器。我瞥见了两种未来;一个将延续系统性的欺骗,另一个可以利用我的技术知识实现社会公正。
虽然我在打一场数据冲突战,但我对这场战斗无比感激。那十周完全改变了我对技术的看法。我一直生活在一个自满和否认的现实中。我曾想,如果我假装不知道自己对数据隐私的需求,我就不必为自己过度使用社交媒体辩护。
然后是这个季度的最后三周。我们被分配了一个数据科学课程的期末项目。我要获得一个数据集,清理它,进行某种分析,创建可视化,将其输入到机器学习模型中,并教给学生一些东西。
我知道我想用我的项目做一些重要的事情。我想发表声明。我可以很容易地找到一个关于体育统计或电影评论的数据集,但这些不会影响我以我需要的方式培养道德的能力。当我上传一张集体照片到脸书的超级数据库时,我突然想到。
我打算利用我自己的脸书数据。
揭幕仪式
在 GDPR 出现之前,脸书的数据收集是透明的对立面。我很难找到这家公司在收集什么数据,更不用说如何获得任何形式的访问权了。最终,在眯着眼睛阅读设置页面上的小字时,我用一句话找到了我的金券。
[Download a copy](https://www.washingtonpost.com/news/the-intersect/wp/2018/03/27/heres-how-to-download-all-your-data-from-facebook-it-might-be-a-wake-up-call/?noredirect=on) of your Facebook data.
花了几天时间,但最终我收到了一个 html 文件的压缩文件夹,里面有我在与这家社交网络巨头共事的八年中亲自提供给他们的所有信息。我很震惊。
- 我犹豫地说,因为有一种可能性,这种信息只是脸书愿意分享他们从用户那里收集/汇总的信息。
Facebook has since changed the design of our data representation, but this was what they offered pre-GDPR
实际上,我不知道我为什么这么惊讶。我应该知道他们一直保存着我所有的数据。近十年来的想法、信息、事件、图片和喜好加在一起。我认为这是实际看到我的在线生活在一个 zip 文件中的聚合的行为,真正把樱桃放在隐喻的数据-隐私-危机圣代的顶部。他们甚至有我的面部识别数据。我第一次删除了脸书。
具有讽刺意味的是,我刚刚在计算机伦理课上学到,删除一个脸书账户实际上是不可能的,因为已经收集的数据永远不会被删除。不管怎样,我打开我的笔记本电脑,开始搜索我的在线身份。我有工作要做。
该项目
此时,我第一次接触数据科学大约已经八周了。我无法创建一个面部识别神经网络或我朋友的社交图谱分析。真的,我只希望我的项目证明一件事:如果社交媒体公司从使用我们的个人数据中受益,为什么我们不能做同样的事情?我决定创建两个数据集:
- 我在 Facebook Messenger 上的私人信息。
- 我在脸书发表的公开帖子。
使用 nltk 库,我对这两个数据集进行了情感分析,看看我是否在我的公众形象和我的私人事务之间保持一致的积极和/或消极。我发现我不是。(可以理解的)我私下比公开场合更消极。我摆弄了一下数据。我意识到在一月份,我更有可能变得消极。不过,四月很棒。我创造了一个机器学习预测器,它可以猜测我在任何一天的积极或消极程度,精确到秒。
我用八周的数据科学知识做到了这一点。是什么阻止了脸书的专业人士做类似的事情?如果我通过基本的数据分析了解了这么多关于我个人生活的信息,我甚至无法想象一群专家会发现我什么。
我向全班展示了我的发现。我告诉他们我的动机、在线数据隐私和社交媒体数据利用。他们鼓掌,我坐了下来。项目结束了……但旅程才刚刚开始。
我利用了自己的数据,希望能更多地了解自己。相反,我对自己的身份有了更多的了解。在欧洲,我的数据被认为是我身份的一部分。在美国,情况并非如此。当我在过去十年收集的数以千计的个人信息、公共想法或习惯性页面赞中搜寻时;很难想象有人会认为数据不是我们身份的一部分。
一个瞬间可以改变一个人一生的看法。我的时刻是大学三年级的时候,坐在咖啡店里,利用我自己的数据。随着自满的安慰开始变得越来越虚幻,我知道漠不关心不是一个选项。
在这个话题上,我一直在考虑把我的老项目变成一个通用的开源工具,这样每个人都可以分析自己的脸书情绪。如果您对利用自己的数据感兴趣,请联系我们,也许我们可以让这成为现实!
我是如何在凯格尔斯的泰坦尼克号比赛中获得 98%的预测准确率的
首先,我想开始目测数据,看看人们加入这艘船的城市是否有任何统计上的重要性。尽管从瑟堡开始旅程的旅行者在存活率上有轻微的统计改善。我决定放弃这个专栏。
Count of survivors vs non-survivors, grouped by arrival point
Survivors using mean (Southhampton, Cherbourg & Queenstown)
接下来,我想确定乘客支付的票价是否对整体存活率有影响。这是一个重要的发现,表明票价和存活率之间有很大的相关性。
Y Axis denotes ticket cost
在对数据集进行更多检查后,我发现 18 岁以下的人有更大的生存机会。18-35 岁年龄段的几率要低得多,此后基本上是 50:50。
Chance of survival by age
独自旅行的人比有家人的人死亡率更高:
Family vs Lone Passenger
因为 16 岁以下年龄组的存活率更高。当按性别分析数据时,我把孩子们分成单独的班级。妇女和儿童确实有更大的生存机会。
Gender breakdown of survival
让我们开始做一些机器学习吧!我使用了三种不同成功程度的模型。
首先,我尝试了传统的逻辑回归。
logistic_regression = LogisticRegression()
logistic_regression.fit(X_train, y_train)
y_pred = logistic_regression.predict(X_test)
logistic_regression.score(X_train, y_train)
这产生了大约 80%的准确度。接下来,我尝试了 K 近邻。
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
knn.score(X_train, y_train)
~81%.略有改善,但也好不了多少。最后,我尝试使用随机森林。
random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, y_train)
y_pred = random_forest.predict(X_test)
random_forest.score(X_train, y_train)
哇哦!使用该模型的准确率超过 98%!Kaggle 真的是一个很好的乐趣来源,我建议任何人都尝试一下。
我希望你喜欢我这篇概述了我的数据集分析过程的简短文章,并希望很快见到你!
我如何用人工智能制造假的人
—以及为什么它很重要
下棋赢了人类?检查。
对恶性肿瘤和良性肿瘤的分类比医生更好?检查。
对数百万种可能治愈癌症的药物建模?等等,人工智能真的能做到吗??
我们美丽的人类肤色呢?当然,人工智能不能模仿人类面部的纯粹的华丽的,对吗?
权利的反义词。
人工智能的最后两个令人兴奋的应用可以通过 GANs 来完成。但首先,在我们进入如何,什么,为什么和“哦,我的上帝,我想我只是拉屎我自己”之前,让我们用一个故事来描述这种特殊类型的人工智能背后的直觉。
Are these paintings even real or did AI make them too? Is it safe to trust your eyes?
假设几个月后有一家画廊开张,希望展示著名艺术家的真实可信的画作,所以他们雇了一名侦探来检查每一幅画。与此同时,这个地区有个伪造者试图卖掉他的一些赝品。但他还不是一个伟大的画家,所以他的艺术现在看起来就像随机的形状和涂鸦(他称之为抽象)。
起初,侦探能够很容易地分辨出真迹和赝品。请记住,这位侦探对他的工作来说也是新手,但不需要太多技巧就能看出伪造者现在的画非常糟糕,一点也不像真正的艺术。
但是随着几个月的过去,伪造者发现是什么让真正的艺术品看起来…嗯,是真的。他研究真正的艺术家为使他们的作品看起来是世界级的而使用的风格、模式和形状,并开始尽可能地复制它们。他做得如此之好,以至于侦探现在很难区分赝品和真品。尽管随着时间的推移,侦探也获得了更多的工作经验,但伪造者只是超过了他。
当画廊真正开放时,大约一半的画是真的,一半的画是伪造者画的。侦探非常困惑,最后只能猜测一件作品是真是假。
现在让我们更进一步;让我们看看你能不能分辨出哪些脸是真的,哪些是假的(如果有的话)。
可怕的是右边所有的人脸都是由一个 AI 系统生成的;具体来说,一种特殊类型的神经网络称为生成对抗网络(GAN)。
GANs 概述
GANs 由两个神经网络组成,生成器和鉴别器,它们在游戏中相互竞争以最小化或最大化某个函数。鉴别器接收真实的训练数据以及来自生成器的生成(假)数据,并且必须输出每个图像是真实的概率。它的目标是最大化正确分类给定数据类型的次数,同时生成器试图最小化该次数;它试图让鉴别器将生成的输出分类为实数,使鉴别器不那么正确。
简单来说,发电机就像我们的伪造者;它的目标是制造假的图像来欺骗侦探,让他们以为这些图像是真的。鉴别者就像我们的侦探;它的工作是将真正的训练图像与伪造者制作的图像区分开来。
等等,为什么这里有两个神经网络?
The function that both networks are trying to minimize/maximize (the rules of the game)
上面这个复杂的函数实际上意味着,生成器(G)和鉴别器(D)都在进行一场博弈,竞争看谁更擅长实现他们的某个目标。当给两张图片供选择时,一张来自真实的数据集(艺术家),另一张是 G 画的,D 想知道如何分辨哪一张是真实的。它每次都想准确地挑出真正的一个。
G 认为它比 D 更聪明,可以很容易地愚弄它,所以它的工作是努力确保 D 认为 G 的图像是真实的,并使 D 得到正确答案的次数尽可能低。实际上,当鉴别器确信一幅图像是真的时,它会输出 1,当它发现一幅赝品时,它会输出 0。理想情况下,我们希望 D 的平均输出为 0.5,这证实了 G 非常擅长制作赝品,以至于它们看起来几乎与真实图像相同,这意味着 D 只需猜测,并且只有大约一半的时间是正确的。
What the Discriminator (left) and Generator (right) look like in code (PyTorch Implementation)
我构建的特殊类型的 GAN 是一个深度卷积生成对抗网络(DCGAN ),它生成了上面看到的伪假。基本思想是网络 D 和 G 都是使用卷积层结构构建的,其中特征图或内核扫描图像的特定部分以寻找关键特征。
这实际上是通过矩阵乘法来实现的,因为图像中的每个像素都可以表示为一个数字。像素组的值乘以矩阵,允许网络学习该像素组中存在的重要特征,如边缘、形状和线条。这在一开始是很难接受的;你可以在这里看到更深入的解释和可视化。
生成器扫描真实输入图像,以寻找尽可能接近地模仿真实训练图像的特征的模式。鉴别器扫描训练数据和生成的图像,以找到它们的特征之间的重要差异,从而可以将它们区分开来。这些重要的数据通过每一层进行传输,最终得到每幅图像中最重要的特征。
一遍又一遍地重复训练过程,让生成器和鉴别器更好地了解真实人脸的样子,我们可以从左边的图像到右边的超逼真的结果。我实际上有点敬畏;右边的一些脸看起来真的像真人!
Results over time look wayyyyyyyy more realistic
在现实生活中,我们能用甘斯做什么?
我个人最喜欢的也可以说是最有趣的应用程序之一是条件 GANs 的 pix2pix 实现。一个不熟练的艺术家只需要画出一幅画的轮廓,GAN 就可以根据它被训练模仿的图像来填充其余的特征(伪造的未来)。
Edges2cats draws a great cat, not that great of a hat
音乐
甘不仅仅对图像有好处;他们也可以制作音乐。我们可以识别和弦和旋律等方面来创作歌曲,而不是识别图片中的边缘和形状等特征来伪造绘画。
药物发现
GANs 最令人兴奋和实用的用途是在药物发现方面。生成器可以连续生成随机药物的分子结构,接收来自鉴别器的关于药物看起来是否真实的反馈,以继续迭代。理想情况下,我们最终希望生成器能够模仿真实药物结构中的模式。这将是疯狂的;**机器能够创造出前所未有的新药,**有可能征服世界上最有害的疾病。
关键要点
- gan 是两个相互竞争的神经网络
- 生成器的目标是最小化某个函数;鉴别器试图最大化相同的功能
- 发生器制造模仿真图像的假图像来欺骗鉴别器,鉴别器试图准确地区分假图像和真图像
- 随着时间的推移,网络能够生成超逼真的数据
- 有多种变体,其中 2 种是条件和深度卷积 gan
- 甘斯可以用来制造假人、音乐、毒品和画猫
- 不要相信任何人;任何东西都可以伪造
非常感谢您的阅读!关注我关于 中 更多和LinkedIn。如果你想了解更多,或者让我知道你在做什么,请随时联系我!
我是如何得到 82.3%的分数,并最终进入 Kaggle 的泰坦尼克号数据集的前 3%的
就我的经历而言,我不是一名专业的数据科学家,但我一直在努力成为一名数据科学家。幸运的是,有 Python 作为我的主要武器,我在数据科学和机器学习领域有优势,因为这种语言有大量的库和框架支持我。我也阅读这方面的书籍,我最喜欢的是“Python 机器学习入门:数据科学家指南”和“用 Scikit-Learn 和 TensorFlow 进行机器学习”。
但仅此还不够。在浏览各种博客、浏览几个网站并与朋友讨论后,我发现,要成为一名数据科学家专家,我肯定需要提高赌注。参与竞争,建立网上形象,这样的例子不胜枚举。然后我遇到了 Kaggle。就像 HackerRank 是为了一般的算法竞赛,Kaggle 是专门为机器学习问题开发的。不得不试试。它举办各种各样的比赛,其中著名的“泰坦尼克号”问题是欢迎你在门户网站上注册的。接下来呢?我下载了训练数据,在我的机器上安装了所有我需要解决的库。我甚至初始化了一个空的存储库来避免以后的麻烦。剩下的唯一部分是处理数据和训练模型。“应该很简单,能有多难?”,我问自己脸上有笑容。
“应该很简单,能有多难?”,我问自己脸上有笑容。
我匆忙地从下载的 csv 文件中解析数据,将其输入决策树模型进行训练,预测测试乘客的生存能力,并上传结果。我得了 64 分,在排行榜上排名倒数 7%。是的,你没看错;垫底的 7%!!!
这是我的原始代码,第一个版本
结果在我面前粉碎了我的自尊。**是的,它教会了我现实世界的问题不能用 5 行代码来解决。**我是在我之前的一篇博客中说这些的——“用 5 行代码用 Python 编写的简单机器学习模型”😄
它教会了我现实世界的问题不是 5 行代码就能解决的。
我坐下来,重新访问并阅读了我之前提到的书中的更多章节。我通读了“端到端建立一个完整的机器学习模型”部分。因此,这不是向模型输入垃圾,数据需要尽可能干净,这直接反映了所用模型的性能。
分析现在开始…
Source : http://www.azquotes.com/quote/593283
由于我曾使用 Jupyter 笔记本进行分析部分,请前往我的 github 项目进行详细分析。链接在这里:
<源代码—最终迭代>
在 GitHub 上创建一个帐户,为 kaggle-titanic 的发展做出贡献。
github.com](https://github.com/ramansah/kaggle-titanic/blob/master/Analysis.ipynb)
我还建立了一个爱好项目,以提高我在 Python 和机器学习方面的技能。目前托管在这里,(目前未激活)它可以在云上运行和保存一些机器学习模型。虽然还需要进一步改进…
我如何让 Matplotlib 绘制苹果颜色表情符号
以及为什么图书馆目前不能
问题是
如果你尝试绘制表情符号,你可能会看到这样的东西:
This graph has no meaning other than to demonstrate the appearance of plotted emojis.
虽然我们明确指定为字体,但这些表情符号并不是苹果色表情符号。它们来自字体 DejaVu Sans,默认字体在 Matplotlib 无法处理我们指定的字体后接管,抛出以下错误:
RuntimeError: In FT2Font: Could not set the fontsize.
关于 Matplotlib 中绘制表情符号的堆栈溢出的一些相关问题:
- 如何在 matplotlib 中绘制(高质量)表情符号?
- matplotlib:用表情符号标签标注剧情
- OS X Matplotlib 中的表情符号
- matplotlibs x ticks 中的表情符号
- 无法加载 Matplotlib 中的表情字体
所有这些都没有答案。最近版本的 Matplotlib 根本无法做到这一点。看看 Matplotlib 的 GitHub repo 就会发现问题 #3135 、 #4492 和 #12830 ,其中第一个问题截至 2022 年已经开放了近 8 年。
为什么 Matplotlib 不能从苹果彩色表情符号字体中绘制表情符号?我们如何克服这种功能性的缺失来绘制表情符号呢?本帖回答了这些问题。
为什么 Matplotlib 不能绘制表情符号
苹果颜色表情符号是一个 TrueType 集合(TTC)文件。这种格式将多种字体合并到一个文件中,以节省空间。我们之前看到的抛出运行时错误的依赖项 FT2Font 只支持从 TTC 文件中获取第一种字体。虽然这可能行得通,但是转换依赖项 ttconv 的限制阻止了后端实际使用这种字体。
有一个解决方案是以拉请求的形式出现的 #9787 。目前正在等待进一步审查。
当我们等待拉请求被合并时,有一个直接的解决方案,我们可以使用 Matplotlib 成功地绘制表情符号。
直接解决方案:使用第三方后端
输入 Mplcairo 。作为“Matplotlib 的 cairo 后端的一个全新的、本质上完整的实现”,Mplcairo 在最初后端的几个方面进行了改进。最值得注意的是,Mplcairo 引入了对在 TTC 文件中使用第一种字体的支持。
看起来我们应该能够通过pip install mplcairo
轻松安装 Mplcairo,但是对我来说,当我试图将它导入到我的代码中时,这个安装继续抛出错误。
相反,我用 git 将 repo 克隆到我的机器上(git clone https://github.com/matplotlib/mplcairo.git
),然后遵循构建和安装指令。下面我总结一下我的过程。
建筑物
由于车轮不可用于 OS X,我们需要建立自己的 OS X 车轮使用终端。为此,我们需要以下依赖关系:
- 支持 C++17 的 C++编译器,如 GCC ≥ 7.2 或 Clang ≥ 5.0 。我用
brew install llvm
安装了后者。 - Cairo 和 FreeType 头,以及定位它们的 pkg-config 信息。由于 cairo 在 1.15.8 版本中引入了对表情符号的颜色支持,我们需要一个不早于此的 cairo 版本。直到康达-福吉更新它的开罗,
brew install cairo
。然后是pip install pycairo
。
一旦我们获得了依赖项,我们就可以激活 llvm(如brew info llvm
所述)并构建 OS X 轮子,而在 mplcairo 的根文件夹中:
echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
export LDFLAGS="-L/usr/local/opt/llvm/lib"
export CPPFLAGS="-I/usr/local/opt/llvm/include"
export CC='/usr/local/opt/llvm/bin/clang'
export CXX='/usr/local/opt/llvm/bin/clang++'
tools/build-macos-wheel.sh
装置
现在我们已经构建了 Mplcairo,我们可以用pip install dist/mplcairo-0.1.post47+g109b19f-cp37-cp37m-macosx_10_9_x86_64.whl
在系统范围内(或者在我们的虚拟环境中)安装它。
这可能是一个异常,但是在构建终端时,我的 Python 从版本 3.7.0 降级到版本 3.6.5。当我打开一个新的终端窗口时,Python 又回到了 3.7.0,我可以安装滚轮了。
注(2020 年 8 月 16 日):确认 tools/build-macos-wheel.sh 和 dist/mpl cairo-0.1 . post 47+g 109 b 19 f-cp37-cp37m-ma cosx _ 10 _ 9 _ x86 _ 64 . whl 是正确的文件路径——2018 年我第一次发表这篇文章的时候,它们的命名是不同的。
用法!
为了绘制我们的表情符号,我们只需导入 Mplcairo 并将其设置为 Matplotlib 的新后端。
import matplotlib, mplcairo
print('Default backend: ' + matplotlib.get_backend())
matplotlib.use("module://mplcairo.macosx")
print('Backend is now ' + matplotlib.get_backend())
运行上面的脚本后,您应该会看到以下输出:
Default backend: module://ipykernel.pylab.backend_inline
Backend is now module://mplcairo.macosx
您的默认后端可能会有所不同,这取决于您运行脚本的位置。我的默认后端来自 Jupyter 笔记本。(如果使用的是 Jupyter Notebook,必须先重置内核,然后才能重置后端。您还必须在导入 matplotlib.pyplot 之前重置后端。)
一旦你启动并运行 Mplcairo,Matplotlib 就能漂亮地绘制表情符号。
Lo and behold the emoji.
完整代码:
如果你想阅读更多我的文章或者探索数以百万计的其他文章,你可以注册成为中级会员:
[## 通过我的推荐链接加入 Medium-briena Herold
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
brienna.medium.com](https://brienna.medium.com/membership)
你也可以订阅我的邮件列表,以便在我发表新文章时得到通知:
每当布蕾娜·赫罗尔德发表。通过注册,您将创建一个中型帐户,如果您还没有…
brienna.medium.com](https://brienna.medium.com/subscribe)
你可能会对我的其他一些故事感兴趣:
Python 中的简单指南
towardsdatascience.com](/how-to-download-twitter-friends-or-followers-for-free-b9d5ac23812) [## 如何批量获取 arXiv 全文预印本
使用 Python3 和 MacOS X 命令行
towardsdatascience.com](/how-to-bulk-access-arxiv-full-text-preprints-58026e19e8ef) [## 从《纽约时报》收集任何时期的数据
Python 中的简单指南
towardsdatascience.com](/collecting-data-from-the-new-york-times-over-any-period-of-time-3e365504004)