AWS EMR 上的 PySpark 入门
使用 Spark on AWS 大规模处理数据的分步指南
带有 PySpark 和 AWS EMR 的数据管道是一个多部分系列。这是第 1 部分,共 2 部分。如果您正在寻找如何将数据管道作为产品工作来运行的指导,请查看第 2 部分。
- AWS EMR 上的 PySpark 入门**(本文)**
- 在 AWS EMR 上使用 PySpark 处理生产数据 (接下来)
动机
如果您在过去十年中一直关注业务和技术趋势,您可能会意识到组织生成的数据量已经激增。企业渴望使用所有这些数据来获得洞察力和改进流程;然而,“大数据”意味着巨大的挑战。
必须发明全新的技术来处理越来越大的数据集。这些新技术包括云计算服务提供商的产品,如亚马逊网络服务(AWS)和开源的大规模数据处理引擎,如 Apache Spark。随着生成的数据量持续飙升,能够使用这些“大数据”工具的有抱负的数据科学家将在市场中脱颖而出。
我们开始吧
在本指南中,我将教您如何在 Amazon EMR 集群上开始使用 PySpark 处理数据。本教程面向熟悉 Python,但刚开始使用 Spark 的当前和有抱负的数据科学家。
Spark 非常适合处理大型数据集,用于探索性数据分析和特征工程等日常数据科学任务。它还可以用于大规模实现许多流行的机器学习算法。
我们今天要讲的内容
- Spark、亚马逊 S3 和 EMR 概述
- 在 Amazon EMR 上创建集群
- 通过 Jupyter 笔记本连接到我们的集群
- 从亚马逊 S3 加载数据
大数据工具概述
火花
在文档中,“Apache Spark 是一个用于大规模数据处理的统一分析引擎。”Spark 的引擎允许您在分布式集群上并行处理大型数据处理任务。Spark 集群包含一个充当中央协调器的主节点和几个处理主节点分配的任务的工作节点。
在本指南中,我们将使用 Python,但是 Spark 开发人员也可以使用 Scala 或 Java。模块包含 Pandas 和 SQL 用户熟悉的语法。pyspark.ml
模块可以用来实现很多流行的机器学习模型。
Spark 使用懒惰评估,这意味着它不做任何工作,直到你要求一个结果。通过这种方式,引擎可以决定执行 DAG(有向无环图-或您指定的操作列表)的最佳方式。当我定义一个操作时— new_df = df.filter(df.user_action == 'ClickAddToCart')
— Spark 将该操作添加到我的 DAG 中,但不执行。一旦我请求一个结果— new_df.collect()
— Spark 就会执行我的过滤器和我指定的任何其他操作。
在我们继续之前有一个小提示: 使用分布式云技术可能会令人沮丧。首先,您可能会发现 Spark 错误消息难以理解,难以调试。我鼓励你坚持下去!阅读错误。了解哪些部分信息丰富,然后谷歌一下。我不能保证你最终会停止敲键盘,但会变得更容易。如果没有学习曲线,这就不是一个让你与众不同的好方法!
亚马逊 S3
亚马逊 S3 (简单存储服务)是一种简单且相对便宜的安全存储大量数据的方式。典型的 Spark 工作流是从 S3 存储桶或其他源读取数据,执行一些转换,并将处理后的数据写回另一个 S3 存储桶。
亚马逊电子病历
亚马逊 EMR (Elastic Map Reduce)是一个大数据平台,将多个节点同步到一个可扩展的集群中,可以处理大量数据。如上所述,我们将作业提交给集群的主节点,它会计算出运行作业的最佳方式。然后,主节点相应地将任务分配给工作节点。
在 Amazon EMR 上设置您的环境
首先,创建一个 AWS 帐户并登录控制台。我建议现在花时间创建一个 IAM 用户并删除你的根访问键。
更新:我已经创建了一个 AWS 快速设置指南 引导您如何创建 IAM 用户和角色,创建一个 S3 桶,并配置 AWS CLI。
在本教程中,我将使用美国西部地区(俄勒冈州)。您可以通过右上方的下拉菜单更改您所在的地区:
关于 AWS 费用的警告:你需要提供一张信用卡来创建你的账户。 为了保持成本最低,不要忘记在使用完 EMR 集群后终止它 。对于本指南,我们将使用 m5.xlarge 实例,在撰写本文时,每小时的成本为 0.192 美元。此外,在亚马逊 S3 上托管数据每月会收取少量费用——这一费用会随着你托管的数据量而增加。为避免持续成本,请在使用后删除存储桶。
在亚马逊 S3 上存储配置文件
为了在集群的所有节点上安装有用的包,我们需要创建文件emr_bootstrap.sh
并将其添加到 S3 上的 bucket 中。
#!/bin/bash
sudo pip install -U \
matplotlib \
pandas
使用控制台中的“查找服务”搜索框搜索 S3,导航至该城市:
点击“创建存储桶”,填写“存储桶名称”字段,点击“创建”:
点击“上传”、“添加文件”,打开您创建的文件emr_bootstrap.sh
。点击“上传”上传文件。
创建密钥对文件
从控制台主页导航到 EC2:
选择“密钥对”
单击“创建密钥对”,然后输入名称并单击“创建”。
你的文件emr-key.pem
应该会自动下载。把它存放在一个你会记住的目录里。我把我的.pem
文件放在~/.ssh
里。确保这个文件不要放在你的 GitHub repos 或任何其他公共场所,以保证你的 AWS 资源更加安全。
在 Amazon EMR 上创建集群
从您的控制台导航到 EMR,单击“创建集群”,然后“转到高级选项”。
进行以下选择,从“版本”下拉列表中选择最新版本并选中“Spark”,然后单击“下一步”。
选择“us-west-2a 中的默认”选项“EC2 子网”下拉列表,将您的实例类型更改为 m5.xlarge 以使用最新一代的通用实例,然后单击“下一步”。
命名您的集群,添加emr_bootstrap.sh
作为引导操作,然后单击“Next”。你的引导动作的脚本位置将是你在教程前面上传emr_bootstrap.sh
的 S3 文件路径。您的引导操作将在集群中的每个节点上安装您指定的软件包。
选择您之前创建的密钥对,然后单击“创建集群”。您的集群将需要几分钟的时间来启动,但是一旦它进入“等待”状态,您就可以进入下一步了——使用 Jupyter 笔记本连接到您的集群。
使用 Jupyter 笔记本连接到您的集群
导航至左侧面板中的“笔记本”。点击“创建笔记本”并按照以下步骤操作。
命名您的笔记本并选择您刚刚创建的集群。
一旦你的笔记本“准备好”,点击“打开”。您现在已经准备好开始在云上运行 Spark 了!
连接到 S3 上的数据源
在笔记本的第一个单元格中,导入您要使用的包。例如:
from pyspark.sql import functions as F
您应该得到以下输出:
注意:SparkSession 在笔记本中被自动定义为spark
—您必须在创建脚本作为 Spark 作业提交时自己定义。
接下来,让我们从 S3 导入一些数据。我们将使用亚马逊在公共桶中提供的数据。让我们看看亚马逊客户评论数据集。具体来说,我们来看看书评:
input_bucket = 's3://amazon-reviews-pds'
input_path = '/parquet/product_category=Books/*.parquet'
df = spark.read.parquet(input_bucket + input_path)df.show()
input_path
中的/*.parquet
语法告诉 Spark 读取s3://amazon-reviews-pds/parquet/product_category=Books/
桶目录中的所有.parquet
文件。
我将很快推出一个关于 PySpark DataFrame API 的数据争论的教程,但是现在,请查看 DataCamp 的这个优秀的备忘单开始吧。
下一个
一旦你在 Jupyter 笔记本上测试了你的 PySpark 代码,把它移到一个脚本中,然后用 Spark 和 AWS 命令行界面创建一个生产数据处理工作流。然后,你准备好安排你的气流火花工作。
保持联系
感谢您的阅读!请让我知道你是否喜欢这篇文章,或者你是否有任何批评。如果这篇指南对你有用,一定要关注我,这样你就不会错过我以后的任何文章。
如果你在一个数据项目上需要帮助或者想打声招呼,在LinkedIn上联系并给我发消息。干杯!
R 编程入门
使用数据科学中第二常用的编程语言 R 进行端到端的数据分析。
介绍
r 是一种专注于统计和图形分析的编程语言。因此,它通常用于统计推断、数据分析和机器学习。r 是目前数据科学就业市场上最受欢迎的编程语言之一(图 1)。
Figure 1: Most Requested programming languages for Data Science in 2019 [1]
R 可从r-project.org安装,R 最常用的集成开发环境(IDE)之一当然是 RStudio 。
有两种主要类型的包(库)可用于向 R 添加功能:基本包和分布式包。安装 R 时会附带基础包,分布式包可以使用 CRAN 免费下载。
一旦安装了 R,我们就可以开始做一些数据分析了!
示范
在本例中,我将带您浏览对手机价格分类数据集的端到端分析,以预测手机的价格范围。我在这次演示中使用的代码在我的 GitHub 和 Kaggle 账户上都有。
导入库
首先,我们需要导入所有必需的库。
可以使用***install . packages()***命令在 R 中安装软件包,然后使用 library() 命令加载。在这种情况下,我决定先安装 PACMAN(软件包管理工具),然后用它来安装和加载所有其他软件包。PACMAN 使加载库更容易,因为它可以在一行代码中安装和加载所有必要的库。
导入的包用于添加以下功能:
- dplyr: 数据处理与分析。
- ggplot2: 数据可视化。
- **里约:**数据导入导出。
- gridExtra: 制作可以在页面上自由排列的图形对象。
- **比例尺:**用于缩放图中的数据。
- ggcorrplot: 到在后台使用 ggplot2 可视化相关矩阵。
- **脱字符:**用于训练和绘制分类和回归模型。
- e1071: 包含执行机器学习算法的函数,如支持向量机、朴素贝叶斯等…
数据预处理
我们现在可以继续加载数据集,显示它的前 5 列(图 2)并打印每个特性的主要特征的摘要(图 3)。在 R 中,我们可以使用 < - 操作符创建新的对象。
Figure 2: Dataset Head
summary 函数为我们提供了数据集中每个要素的简要统计描述。根据所考虑特征的性质,将提供不同的统计数据:
- **数值特征:**均值、中位数、众数、极差、四分位数。
- **因子特征:**频率。
- **因子和数字特征的混合:**缺失值的数量。
- **人物特征:**长班之长。
Factors 是 R 中使用的一种数据对象,用于将数据(例如整数或字符串)分类并存储为级别。例如,它们可用于一个特征的热编码或创建条形图(我们将在后面看到)。因此,当处理具有很少唯一值的列时,它们特别有用。
Figure 3: Dataset Summary
最后,我们现在可以使用下面的代码检查我们的数据集是否包含任何非数字(NaNs)值。
从图 4 中我们可以看到,没有发现缺失的数字。
Figure 4: Percentage of NaNs in each feature
数据可视化
我们现在可以通过绘制数据集的关联矩阵来开始我们的数据可视化(图 5)。
Figure 5: Correlation Matrix
接下来,我们可以开始使用条形图和箱线图分析单个特征。在创建这些图之前,我们需要首先将考虑的特征从数值转换为因子(这允许我们将数据分箱,然后绘制分箱后的数据)。
我们现在可以通过将它们存储在三个不同的变量(p1,p2,p3)中来创建三个条形图,然后将它们添加到***grid . arrange()***中来创建一个子图。在这种情况下,我决定检查蓝牙,双卡和 4G 功能。正如我们从图 6 中看到的那样,该数据集中考虑的手机中,略多的手机不支持蓝牙,是双卡,支持 4G。
Figure 6: Bar Plot Analysis
这些图是使用 R ggplot2 库创建的。当调用 ggplot() 函数时,我们创建一个坐标系,我们可以在其上添加图层[2]。
我们给 ggplot() 函数的第一个参数是我们将要使用的数据集,而第二个参数是一个美学函数,我们在其中定义我们想要绘制的变量。然后,我们可以继续添加其他参数,如定义所需的几何函数(如柱状图、散点图、箱线图、直方图等),添加绘图主题、轴限制、标签等…
进一步分析,我们现在可以使用 prop.table() 函数计算不同案例之间差异的精确百分比。从结果输出(图 7)中我们可以看到,50.5%的考虑移动设备不支持蓝牙,50.9%是双卡,52.1%有 4G。
Figure 7: Classes Distribution Percentage
我们现在可以继续使用之前使用的相同技术创建 3 个不同的盒状图。在这种情况下,我决定研究更多的电池电量、手机重量和 RAM(随机存取存储器)如何影响手机价格。在这个数据集中,我们得到的不是实际的手机价格,而是一个价格范围,表示价格有多高(从 0 到 3 的四个不同级别)。
结果总结在图 8 中。增加电池功率和 RAM 会导致价格上涨。相反,更贵的手机似乎总体上更轻。在 RAM 与价格范围图中,有趣的是记录了总体分布中的一些异常值。
Figure 8: Box Plot Analysis
最后,我们现在将检查前置和主摄像头的百万像素摄像头质量分布(图 9)。有趣的是,前置摄像头分布似乎遵循指数衰减分布,而主摄像头大致遵循均匀分布。如果你有兴趣了解更多关于概率分布的信息,你可以在这里找到更多信息。
Figure 9: Histogram Analysis
机器学习
为了执行我们的机器学习分析,我们需要首先将我们的因素变量转换为数字形式,然后将我们的数据集划分为训练集和测试集(75:25 的比率)。最后,我们将训练集和测试集分成特征和标签( price_range )。
现在是时候训练我们的机器学习模型了。在这个例子中,我决定使用支持向量机(SVM) 作为我们的多类分类器。使用 R summary() 我们可以检查我们训练好的模型的参数(图 10)。
Figure 10: Machine Learning Model Summary
最后,我们现在可以测试我们的模型,在测试集上做一些预测。使用 R***confusion matrix()***函数,我们就可以得到我们的模型准确性的完整报告(图 11)。在这种情况下,记录的准确度为 96.6%。
Figure 11: Model Accuracy Report
我希望你喜欢这篇文章,谢谢你的阅读!
联系人
如果你想了解我最新的文章和项目,请通过媒体关注我,并订阅我的邮件列表。以下是我的一些联系人详细信息:
文献学
[1]2019 年哪些语言对数据科学家很重要?Quora。访问:https://www . quora . com/2019 年哪些语言对数据科学家很重要
[2] R 代表数据科学,Garrett Grolemund 和 Hadley Wickham。访问网址:https://www . bio inform . io/site/WP-content/uploads/2018/09/rdata science . pdf
Python 随机优化入门
如何用 Python 的 mlrose 包使用随机化优化算法解决简单的优化问题
mlrose 提供实现一些最流行的随机化和搜索算法的功能,并将它们应用于一系列不同的优化问题领域。
在本教程中,我们将讨论什么是优化问题,并逐步通过一个例子来说明如何使用 mlrose 来解决它们。这是三个系列教程中的第一个。第二部分可以在这里找到,第三部分可以在这里找到。
什么是优化问题?
Russell 和 Norvig (2010) 将优化问题定义为“目标是根据目标函数找到最佳状态”的问题
“国家”的含义取决于问题的背景。状态的一些例子是:
- 机器学习模型中使用的权重,例如神经网络;
- 在国际象棋棋盘上放置棋子;
- 在一个国家的地图上的所有城市的游览中所访问的城市的顺序;
- 为世界地图上的国家选择的颜色。
对我们来说,重要的是状态可以用数字来表示,理想情况下是一个一维数组(或向量)。
“最佳”的含义是由数学公式或函数(称为目标函数、适应度函数、成本函数或损失函数)定义的,我们希望最大化或最小化它。该函数接受一个状态数组作为输入,并返回一个“适合度”值作为输出。
输出适应值允许我们将输入的状态与我们可能考虑的其他状态进行比较。在这种情况下,状态数组的元素可以被认为是函数的变量(或参数)。
因此,优化问题可以简单地认为是一个数学函数,我们希望通过选择每个参数的最佳值来最大化/最小化它。
例子
五维一最大优化问题涉及找到使适应度(x)=x0+x1+x2+x3+x4最大化的状态向量 x = [ x0,x1,x2,x3,x3,x4 。
如果 x 的每个元素只能取值 0 或 1,那么这个问题的解就是x=【1,1,1,1,1】。当 x 设为等于这个最优值时,适应度(x) = 5,它可以取的最大值。
为什么使用随机优化?
对于上面给出的一个最大值的例子,即使解决方案不是立即显而易见的,也有可能计算所有可能的状态向量的适应值, x ,然后选择这些向量中的最佳向量。
然而,对于更复杂的问题,这不能总是在合理的时间内完成。随机化优化克服了这个问题。
随机化优化算法通常从初始“最佳”状态向量(或多个状态向量的群体)开始,然后随机生成新的状态向量(通常是当前“最佳”状态的邻居)。
如果新状态比当前的“最佳”状态更好,则新向量成为新的“最佳”状态向量。
重复该过程,直到不再可能找到比当前“最佳”状态更好的状态向量,或者如果在预先指定的尝试次数内找不到更好的状态向量。
不保证随机优化算法将找到给定优化问题的最优解(例如,该算法可能找到适应度函数的局部最大值,而不是全局最大值)。
然而,如果在算法的每一步进行足够多的尝试来寻找更好的状态,那么算法将返回问题的“好”解决方案。
在搜索优化问题的最优解所花费的时间和最终找到的解的质量之间存在权衡。
用 mlrose 解决优化问题
使用 mlrose 解决优化问题包括三个简单的步骤:
- 定义一个适应度函数对象。
- 定义一个优化问题对象。
- 选择并运行随机优化算法。
为了说明这些步骤中的每一个,我们将通过 8 皇后优化问题的例子来工作,如下所述:
例如:8-皇后
在国际象棋中,皇后是棋盘上最有力的棋子。它可以攻击同一行、同一列或同一对角线上的任何棋子。在 8 皇后问题中,给你一个 8 x 8 的棋盘,上面有 8 个皇后(没有其他棋子),目的是将皇后放在棋盘上,这样它们就不会互相攻击。
显然,在这个问题的最佳解决方案中,棋盘的每一列都有一个皇后。所以我们只需要确定每个皇后的行位置,我们可以将这个问题的状态向量定义为 x = [ x0,x1,x2,x3,x4,x5,x6,x7 ,其中 x i 表示皇后在 i 列中的行位置(对于 i = 0,1,…,7)。
因此,下图中的棋盘可以用状态向量 x = [6,1,7,5,0,2,3,4]来描述,其中假设棋盘的左下角位于第 0 列和第 0 行。
这不是 8 皇后问题的最佳解决方案,因为列 5、6 和 7 中的三个皇后正在对角地攻击彼此,列 2 和 6 中的皇后也是如此。
在开始这个例子之前,您需要导入 mlrose 和 Numpy Python 包。
import mlrose
import numpy as np
定义一个适应度函数对象
解决任何优化问题的第一步是定义适应度函数。这是我们最终想要最大化或最小化的函数,并且可以用来评估给定状态向量的适合度, x 。
在 8 皇后问题的上下文中,我们的目标是找到一个不存在攻击皇后对的状态向量。因此,我们可以将我们的适应度函数定义为评估给定状态的攻击皇后对的数量,并尝试最小化该函数。
mlrose 包含一系列常见优化问题的预定义适应度函数类,包括 N 皇后问题家族(8 皇后是其中一员)。预定义的Queens()
类包括上述(8-)皇后适应度函数的实现。
我们可以为这个类初始化一个适应性函数对象,如下所示:
fitness = mlrose.Queens()
或者,我们可以把 8 皇后问题看作是一个目标是找到一个状态向量的问题,在这个状态向量中,所有的皇后对不会互相攻击。在这种情况下,我们可以将我们的适应度函数定义为评估给定状态的非攻击皇后对的数量,并尝试最大化该函数。
8-Queens 健身函数的定义不同于 mlrose 的预定义Queens()
类所使用的定义,因此要使用它,我们需要创建一个自定义健身函数。这可以通过首先用形式为fitness_fn(state, **kwargs)
的签名定义一个适应度函数来完成,然后使用 mlrose 的CustomFitness()
类来创建一个适应度函数对象,如下所示:
定义一个优化问题对象
一旦我们创建了一个适应度函数对象,我们就可以使用它作为优化问题对象的输入。在 mlrose 中,优化问题对象被用来包含我们试图解决的优化问题的所有重要信息。
mlrose 提供了定义三种优化问题对象的类:
DiscreteOpt()
:用于描述离散状态优化问题。离散状态优化问题是状态向量的每个元素只能取一组离散的值。在 mlrose 中,这些值被假定为 0 到( max_val -1)范围内的整数,其中 max_val 在初始化时定义。ContinuousOpt()
:用于描述连续状态的优化问题。连续状态优化问题类似于离散状态优化问题,除了状态向量中的每个值可以取在初始化时指定的 min_val 和 max_val 之间的连续范围内的任何值。TSPOpt()
:用于描述旅行推销员(或旅游)优化问题。旅行销售人员优化问题不同于前两种问题类型,因为我们知道最优状态向量的元素是整数 0 到( n -1),其中 n 是状态向量的长度,我们的目标是找到这些整数的最优排序。
8 皇后问题是离散状态优化问题的一个例子,因为状态向量的每个元素必须取 0 到 7 范围内的整数值。
为了初始化离散状态优化问题对象,需要指定问题长度(即状态向量的长度,在本例中为 8); max_val ,如上定义(也是 8);在前一步骤中创建的适应度函数对象;以及该问题是最大化还是最小化问题。
对于这个例子,我们将使用上面定义的两个适应度函数对象中的第一个,所以我们想解决一个最小化问题。
problem = mlrose.DiscreteOpt(length = 8, fitness_fn = fitness,
maximize = False, max_val = 8)
然而,如果我们选择使用第二个(自定义)适应度函数对象,我们将处理一个最大化问题,因此,在上面的代码中,我们必须将最大化参数设置为真而不是假(此外还要更改适应度 _fn 参数的值)。
选择并运行随机优化算法
现在我们已经定义了一个优化问题对象,我们准备解决我们的优化问题。mlrose 包括(随机重启)爬山、随机爬山(也称为随机爬山)、模拟退火、遗传算法和 MIMIC(互信息最大化输入聚类)随机优化算法的实现。
对于离散状态和旅行推销员优化问题,我们可以选择这些算法中的任何一个。但是,在 MIMIC 的情况下,不支持连续状态问题。
对于我们的例子,假设我们希望使用模拟退火。要实现这个算法,除了定义一个优化问题对象,还必须定义一个调度对象(指定模拟退火温度参数如何随时间变化);算法在每一步寻找“更好”状态的尝试次数(max _ attempts);以及算法总体上应该运行的最大迭代次数( max_iters )。如果需要,我们还可以指定算法的开始状态( init_state )。
为了指定时间表对象, mlrose 包括预定义的几何、算术和指数衰减的衰减时间表类,以及一个用于定义您自己的衰减时间表的类,其定义方式类似于我们创建定制适应度函数对象的方式。
假设我们希望使用指数衰减时间表(具有默认参数设置);在每个算法步骤中,最多尝试 10 次以找到“更好”的状态;将我们自己限制在算法的最多 1000 次迭代;并且从初始状态 x = [0,1,2,3,4,5,6,7]开始。这可以使用下面的代码来完成。
给定提供给它的参数值以及该状态的适合度值,该算法返回它能找到的最佳状态。
The best state found is: [6 4 7 3 6 2 5 1]The fitness at the best state is: 2.0
运行这段代码为我们提供了 8 皇后问题的一个好的解决方案,但不是最优的解决方案。该算法找到的解决方案如下图所示:
解状态的适应度值为 2,表示棋盘上还有两对进攻皇后(0 列和 3 列的皇后;和第 6 排的两个皇后)。理想情况下,我们希望我们的解决方案的适应值为 0。
我们可以通过调整算法的参数来尝试改进我们的解决方案。算法的任何参数都可以调整。然而,在这种情况下,让我们只关注调整 max_attempts 参数,并将其从 10 增加到 100。
这一次当我们运行我们的代码时,我们得到一个适应度值为 0 的解,表明棋盘上没有一个皇后在互相攻击。
The best state found is: [4 1 3 5 7 2 0 6]The fitness at the best state is: 0.0
这可以从下面得到证实:
摘要
在本教程中,我们定义了优化问题的含义,并通过一个简单的例子说明了如何使用 mlrose 来解决这些问题。这就是解决大多数优化问题所需的全部内容。
然而,有一种类型的问题我们到目前为止只是简单地涉及了一下:旅行销售人员优化问题。在本教程的第 2 部分,我们将通过一个例子来说明如何使用 mlrose 来解决这类问题。你可以在这里找到第二部分。
要了解更多关于 mlrose 的信息,请访问这个包的 GitHub 资源库,这里有。
Genevieve Hayes 博士是数据科学家、教育家、人工智能和分析专家,供职于Genevieve Hayes Consulting。你可以在LinkedIn或者Twitter上关注她。她还是 价值驱动数据科学 的主持人,这是一个每月两次的播客,面向寻求最大化其数据和数据团队价值的企业。
想要发掘企业数据的价值,但不知道从哪里开始?**下载免费的数据科学项目发现指南。T50**
推荐系统和 TensorRec 入门
一步一步建立推荐系统的原型。
推荐系统在许多产品中用于向用户呈现相关或个性化的项目(食物、电影、音乐、书籍、新闻等)。为此,他们从用户之前与物品的交互中学习,以识别用户的口味并改进未来的推荐。
这篇文章将带领我们使用 TensorRec 完成一个新的 Python 推荐系统的原型,包括输入数据操作、算法设计和预测的使用。
你可以从这篇文章的例子这里找到 Python 代码。
系统概况
TensorRec 是一个用于构建推荐系统的 Python 包。TensorRec 推荐系统消耗三条输入数据:用户特征、项目特征和交互。基于用户/项目特征,系统将预测推荐哪些项目。在拟合模型时使用相互作用:将预测与相互作用进行比较,并计算损失/惩罚,系统学习减少损失/惩罚。
当我们制作系统原型时,我们将处理三个主要问题:我们如何处理交互,我们如何处理特征,以及我们如何构造推荐器本身。
交互数据
对于这个例子,我们将使用 MovieLens 数据集。该数据集包含电影的 1-5 星评级、关于这些电影的元数据以及用户应用于电影的标签。对于我们的第一个原型,我们将关注评级,但我们稍后将返回到其他元数据。
原始形式的评级如下所示:
userId, movieId, rating, timestamp
1, 1, 4.0, 964982703
1, 3, 4.0, 964981247
1, 6, 4.0, 964982224
1, 47, 5.0, 964983815
1, 50, 5.0, 964982931
1, 70, 3.0, 964982400
...
每行代表一个等级:一个用户对一部电影的看法。我们将使用这些评分作为我们的互动。我们训练这个系统的第一步是接收和格式化这些交互数据。首先,我们读入收视率的 CSV 文件。
在这一点上,我们将通过洗牌和分割评级来将评级分为训练和测试集。我们的原型将在训练集上进行训练,我们将使用测试集来评估它们的成功。像这样随机分割训练集/测试集是不成熟的,并且有更严格的模型评估技术,但是对于这个例子来说是快速和清晰的。
接下来,我们将这些评级重新组织到一个稀疏矩阵中。在这个矩阵中,每行代表一个用户,每列代表一部电影。这个矩阵中的第[ i,j 个值是用户 i 与电影 j 的交互。
协作过滤器原型
协作过滤器是一种算法,它可以学习哪些用户有相似的品味,并根据相似用户的喜好向用户推荐商品。一种常见的方法是通过矩阵分解。在矩阵分解中,我们必须学习两个矩阵(用户表示和项目表示),当它们相乘时,近似交互:
From Wikipedia
在这种情况下, W 的行是用户表示, H 的列是项目表示, V 中的值是交互。需要学习 W 和 H 以产生v的最佳近似值
W 的宽度和 H 的高度是相同的——这个共享尺寸被称为“组件数量”具有更多组件的模型正在学习更复杂的用户和项目表示,但这可能会导致过度拟合训练数据。总的来说,我们希望将大量信息压缩到小的表示中。出于这个原因,在我们的原型中,我任意选择使用 5 个组件。当进一步构建原型时,我们应该尝试增加和减少组件的数量,并警惕过度拟合。
如果只给出单位矩阵作为用户/项目特征,TensorRec 将默认执行矩阵分解。这些单位矩阵通常被称为“指示器特征”
我们现在已经创建了两个指标特征矩阵,构建了一个包含 5 个组件的简单协作过滤器模型,并对模型进行了拟合!
接下来,当然,我们将想看看模型的表现如何。
为了做到这一点,我们将查看一个名为“K 处召回”的指标。Recall@K 表示,对于普通用户来说,他们的测试项目在预测排名中排在前 K 的百分比。换句话说,如果我们的 recall@10 值为 0.06,那么我喜欢的某部电影就有 6%的机会进入我的十大推荐。
Recall@K 对于许多推荐系统来说是一个很好的指标,因为它模拟了推荐产品的行为:如果一个电影网站只向我展示我的前 10 个推荐,那么他们的算法将希望有效地将我喜欢的电影放入我的前 10 个推荐中。
在计算召回之前,我们要决定哪些交互应该算作“喜欢”在这种情况下,我选择使用所有评分至少为 4.0 的评分作为“喜欢”,并忽略其他评分。
太好了!让我们来看看结果:
Matrix factorization collaborative filter:
Recall at 10: Train: 0.0008 Test: 0.0010
…不太好。这些结果告诉我们,在测试集电影中,喜欢的电影进入前 10 名的几率只有 0.1%。这个推荐系统是无效的,我们会想办法改进它。
损失图
配置 TensorRec 系统的一种方法是改变损耗图。损失图包含预测和交互,并计算系统在学习时试图减少的惩罚(损失)。
默认情况下,TensorRec 使用 RMSE(均方根误差)作为损失图。这意味着 TensorRec 正试图精确地估计交互的值:如果我给一部电影打 4.5 分,TensorRec 正试图产生一个精确的 4.5 分的预测分数。
这很直观,但它并不符合推荐系统在许多产品中的工作方式:一个电影网站不需要准确预测我的评级,它只需要能够将我喜欢的电影排在我不喜欢的电影之上。由于这个原因,许多系统通过“学习排序”来运行。我们可以通过使用称为 WMRB 的损耗图来使 TensorRec 系统以这种方式工作。
WMRB,代表“加权边际-等级批量”,的工作原理是随机抽取用户没有互动过的项目样本,并将他们的预测与用户喜欢的项目进行比较。随着时间的推移,这将用户喜欢的项目推到排名的顶部。
我们可以告诉 TensorRec 使用 WMRB,方法是在构建模型时指定它,并在拟合模型时指定样本批次的大小。在这种情况下,我们希望只训练正面评级(≥4.0)的模型,因此 WMRB 会将这些评级推到顶部。
让我们来看看结果:
WMRB matrix factorization collaborative filter:
Recall at 10: Train: 0.1098 Test: 0.0776
好多了!我们已经从一个喜欢的项目进入前 10 名的 0.1%的机会一直到 7.76%的机会。这是一个右损失函数有多大影响力的例子。TensorRec 允许您指定和定制自己的损失图,您可以在这里看到更多示例损失图。
添加元数据要素
为了继续实验,我们应该尽量利用其他可用的数据。在 MovieLens 示例中,我们可以使用电影元数据,比如电影的类型,来丰富推荐内容。
原始格式的电影元数据文件如下所示:
movieId, title, genres
1, Toy Story (1995), Adventure|Animation|Children|C...
2, Jumanji (1995), Adventure|Children|Fantasy
3, Grumpier Old Men (1995), Comedy|Romance
4, Waiting to Exhale (1995), Comedy|Drama|Romance
...
首先,我们要读取这些数据,将电影映射到我们的内部 id,并跟踪每部电影的类型。然后我们将使用 Scikit 的 multilabel binary izer对流派标签进行二进制化。二值化的输出将成为我们新的推荐系统的特征。
运行该程序将打印出原始元数据和二进制类型的示例:
Raw metadata example:
['movieId', 'title', 'genres']
[0, 'Toy Story (1995)', ['Adventure', 'Animation', 'Children', 'Comedy', 'Fantasy']]Binarized genres example for movie Toy Story (1995):
[0 0 1 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
基于内容的推荐
既然我们已经有了关于我们的项目的元数据,我们可以尝试的一件事就是仅仅基于项目元数据进行推荐。
为此,我们将配置一个 TensorRec 模型,对项目特征使用传递表示图。对我们来说,这意味着项目表示将与传入的项目特征相同(只是电影类型),并且用户表示将反映用户有多喜欢该特定类型。
太好了!让我们来看看结果:
Content-based recommender:
Recall at 10: Train: 0.0471 Test: 0.0130
它没有排名协作过滤器好,但召回率为 1.3%,比我们的第一个协作过滤器有效得多。
这个系统有一个主要的弱点:仅仅是流派本身并不能很好的描述,也不能提供足够的信息来做出明智的推荐。如果我们有更多的描述性元数据(更多的标签、演员、子流派等),我们可能会在这个基于内容的推荐系统上取得更大的成功。
另一方面,该系统有一个主要优点:通过仅依赖元数据特征,而不使用指示符特征,我们可以推荐在训练模型时不存在的电影。类似地,如果我们有有价值的用户元数据,我们可以避免使用用户指示器功能,并为从未与电影互动过的用户做出预测。这被称为“冷启动”推荐。
混合模型
我们知道我们的排名协作过滤器给了我们最好的结果,但似乎使用电影元数据也有一些价值。让我们将这两者结合起来:我们将使用指示器特性来获得协作过滤器的优势,我们还将使用内容特性来利用元数据。像这样结合了协同过滤和基于内容的推荐的系统被称为“混合”模型。
为此,我们将两组特征叠加在一起:
太好了!让我们来看看结果:
Hybrid recommender:
Recall at 10: Train: 0.1196 Test: 0.0794
凭借 7.94%的召回率,这是我们迄今为止最强的推荐系统。与纯协作过滤器 7.76%的结果相比,差异并不明显,但仍然是一个进步。如果我们使用比流派更多的元数据,我们可能会看到更大的影响。
提出建议
我们有一个经过训练的模型,现在我们可以使用这个模型为我们的用户提供建议。我们通过将用户的特征向量和所有项目特征传递给predict_rank()
并检查结果排名来做到这一点:
这个代码片段将为用户 432 打印出前 10 个推荐。我选择用户 432 是因为我熟悉他们评价过的电影,所以我觉得我可以站在他们的立场上判断他们的推荐。我们应该注意,用户 432 已经评级的电影仍将被包括在内——如果我们想要过滤掉这些电影,我们将需要通过后处理步骤来完成。
让我们看看用户 432 的训练数据,看看他们喜欢什么类型的电影:
User 432 liked:
Usual Suspects, The (1995)
Pulp Fiction (1994)
Silence of the Lambs, The (1991)
Reservoir Dogs (1992)
Shawshank Redemption, The (1994)
Kill Bill: Vol. 1 (2003)
Social Network, The (2010)
Trainspotting (1996)
Arrival (2016)
My Big Fat Greek Wedding (2002)
一些犯罪,一些黑色喜剧,和一个著名的爱塔伦蒂诺。让我们看看用户 432 对我们混合模型的建议:
User 432 recommendations:
Seven (a.k.a. Se7en) (1995)
Usual Suspects, The (1995)
Pulp Fiction (1994)
Silence of the Lambs, The (1991)
Fargo (1996)
American Beauty (1999)
Fight Club (1999)
Shawshank Redemption, The (1994)
Departed, The (2006)
Memento (2000)
更多带有明显黑色喜剧倾向的犯罪电影!这看起来一目了然,但让我们检查用户 432 的测试电影:
User 432's held-out movies:
Fargo (1996)
American History X (1998)
Fight Club (1999)
Dark Knight Rises, The (2012)
《法戈》和《搏击俱乐部》都符合用户 432 的推荐——这是一个很好的结果!对于这个特定用户,我们实现了 50%的召回率。
前进
为了继续完善我们的推荐系统,我们应该试验更多的表示、预测和损失图,为系统提供更多的元数据,以不同的方式设计这些元数据功能,以不同的方式管理交互/反馈数据,并优化系统的各种超参数。
我最近有机会拜访了 T2,讨论了设计和部署推荐系统时的许多设计选择。你可以在这里找到这次演讲的视频。
如果您有任何问题,请在这里提问或打开 GitHub 问题。
强化学习入门,开放 AI 健身房
使用 Q-learning 解决山地汽车环境。
这是强化学习和开放 AI 健身房系列文章的第三篇。第一部可以在这里找到,而第二部可以在这里找到。
介绍
强化学习(RL)是机器学习的一个分支,它通过与反馈可能延迟的环境进行交互来处理学习。
虽然 RL 是一个非常强大的工具,已经成功地应用于从优化化学反应到教计算机玩视频游戏的各种问题,但由于缺乏有趣和具有挑战性的实验环境,它在历史上一直很难开始。
这就是 OpenAI 健身房的用武之地。
OpenAI Gym 是一个 Python 包,包含一系列 RL 环境,从简单的“玩具”环境到更具挑战性的环境,包括模拟机器人环境和 Atari 视频游戏环境。
它的开发目标是成为 RL 研究的标准化环境和基准。
在本文中,我们将使用 OpenAI Gym 山地汽车环境来演示如何开始使用这个令人兴奋的工具,并展示如何使用 Q-learning 来解决这个问题。
本教程假设您的计算机上已经安装了 OpenAI Gym。如果你还没有这样做,安装说明可以在这里找到 Windows,在这里找到 Mac 或 Linux。
山地汽车问题
The OpenAI Gym Mountain Car environment
在 OpenAI 健身房网站上,对山地车问题描述如下:
汽车在一维轨道上,定位在两座“山”之间。目标是开车上右边的山;然而,这辆车的引擎不够强劲,不足以单程爬上这座山。所以,成功的唯一方法就是来回开车造势。
汽车在任何时间点的状态都由一个包含其水平位置和速度的向量给出。汽车在两山之间的山谷底部(大约在-0.5 的位置)静止不动地开始每一集,当汽车到达旗子(位置> 0.5)或移动 200 次后,该集结束。
在每次移动时,汽车有三个可用的动作:向左推、向右推或什么都不做,每次移动(包括什么都不做)都要罚 1 个单位。这意味着,除非他们能在不到 200 步的时间内找到爬山的方法,否则他们总的“奖励”将是-200 个单位。
从这个环境开始,按如下方式导入并初始化它:
import gym
env = gym.make(‘MountainCar-v0’)
env.reset()
探索环境
一旦导入了山地汽车环境,下一步就是探索它。所有 RL 环境都有一个状态空间(即环境中所有可能状态的集合)和一个动作空间(即环境中可以采取的所有动作的集合)。
您可以使用以下方式查看这些空间的大小:
> print(‘State space: ‘, env.observation_space)
State space: Box(2,)> print(‘Action space: ‘, env.action_space)
Action space: Discrete(3)
这告诉我们,状态空间表示一个 2 维的盒子,所以每个状态观察是 2 个(浮点)值的向量,并且动作空间包括三个离散的动作(这是我们已经知道的)。
默认情况下,这三个动作由整数 0、1 和 2 表示。但是,我们不知道状态向量的元素可以取什么值。这可以通过以下方法找到:
> print(env.observation_space.low)
[-1.2 -0.07]>print(env.observation_space.high)
[0.6 0.07]
由此我们可以看出,状态向量的第一个元素(代表小车的位置)可以取-1.2 到 0.6 范围内的任何值,而第二个元素(代表小车的速度)可以取-0.07 到 0.07 范围内的任何值。
当我们在本系列的第一篇文章中介绍 Q-learning 算法时,我们说过,只要每个状态-动作对被访问足够多的次数,它就能保证收敛*。然而,在这种情况下,我们处理的是一个连续的状态空间,这意味着有无限多的状态-行动对,因此不可能满足这一条件。*
解决这个问题的一种方法是使用深度 Q 网络(dqn)。DQNs 通过使用深度神经网络作为 Q 函数的近似器,将深度学习与 Q 学习结合起来。dqn 已经成功应用于开发能够玩 Atari 视频游戏的人工智能。
然而,对于像山地车问题这样简单的问题,这可能有点矫枉过正。
另一种方法是将状态空间离散化。一种简单的方法是将状态向量的第一个元素四舍五入到最接近的 0.1,将第二个元素四舍五入到最接近的 0.01,然后(为了方便起见)将第一个元素乘以 10,将第二个元素乘以 100。
这将状态-动作对的数量减少到 855 个,这使得满足 Q 学习收敛所需的条件成为可能。
q-学习回顾
在本系列的第一篇文章中,我们详细介绍了 Q-learning 算法。在执行该算法时,我们假设了一维状态空间,因此我们的目标是找到最优的 Q 表, Q ( s , a )。
在这个问题中,由于我们处理的是二维状态空间,我们用 Q ( s1 , s2 , a )代替了 Q ( s , a ),但除此之外,Q 学习算法基本保持不变。
概括地说,算法如下:
- 初始化 Q ( s1 、 s2 、 a ),将所有元素设置为小随机值;
- 观察当前状态,( s1 ,S2);
- 根据探索策略,选择要采取的行动,a;
- 采取行动 a 并观察产生的奖励 r ,以及环境的新状态(S1’,S2’);
- 根据更新规则更新 Q ( s1 、 s2 、 a ):
Q’(s1,s2,a) = (1 — w)Q(s1,s2,a) + w(r+dQ(s1 ',s2 ‘,argmax a’ Q(s1 ',s2 ',a '))*
其中 w 为学习率 d 为折现率;
6.重复步骤 2–5,直到收敛。
开放式健身房的 Q-Learning
要在开放人工智能健身房实施 Q-learning,我们需要观察当前状态的方法;采取行动并观察行动的结果。这些可以按如下方式完成。
重置环境时,会返回环境的初始状态:
> print(env.reset())
array([-0.50926558, 0\. ])
要采取行动(例如, a = 2),必须使用step()
方法通过该行动“向前推进”环境。这将返回一个 4-ple,给出新的状态,奖励,一个布尔值,指示该情节是否已经终止(由于目标已经达到或 200 步已经过去),以及任何附加信息(对于这个问题,它总是为空)。
> print(env.step(2))
(array([-0.50837305, 0.00089253]), -1.0, False, {})
如果我们假设一个ε-贪婪的探索策略,其中ε在总集数上线性衰减到指定的最小值(min_eps
),我们可以将上述所有内容与上一节中的算法放在一起,并产生以下用于实现 Q-学习的函数。
出于跟踪目的,该函数返回一个列表,其中包含 100 集每集的平均总奖励。它还使用env.render()
方法可视化了最后 10 集的山地车运动。
环境只在最后 10 集可视化,而不是所有集,因为可视化环境会显著增加代码运行时间。
假设我们假设学习率为 0.2,贴现率为 0.9,初始ε值为 0.8,最小ε值为 0。如果我们运行 500 集的算法,在这些集的结尾,汽车已经开始明白它需要来回摇摆以获得爬山所必需的动量,但只能做到大约一半。
然而,如果我们将剧集数量增加一个数量级至 5000 集,到 5000 集结束时,汽车几乎每次都能完美地爬山。
Success!
绘制 5000 集的平均奖励与集数的关系图,我们可以看到,最初,平均奖励相当平稳,一旦达到最大 200 次移动,每次运行就终止。这是算法的探索阶段。
然而,在最后的 1000 集里,该算法采用了它通过探索学到的东西,并利用它来增加平均奖励,随着汽车学习爬山,这集现在以不到 200 个动作结束。
这个开发阶段是唯一可能的,因为给了算法足够的时间来探索环境,这就是为什么当算法只运行 500 集时,汽车不能爬山。
摘要
在本文中,我们展示了 RL 如何用于解决 OpenAI Gym 山地车问题。为了解决这个问题,有必要对我们的状态空间进行离散化,并对 Q-learning 算法进行一些小的修改,但是除此之外,所使用的技术与本系列第一篇文章中用于解决简单网格世界问题的技术相同。
但这只是 Open AI Gym 中可供用户使用的众多环境之一。对于有兴趣尝试自己在本文中学到的技能的读者,我建议尝试其他任何经典控制问题(此处提供),然后继续讨论 2D 盒子问题。
通过不断修改和构建 Q-learning 算法,应该有可能解决 OpenAI Gym 用户可用的任何环境。然而,和所有事情一样,第一步是学习基础知识。这就是我们今天成功做到的。
想了解更多关于价值驱动的数据科学的信息吗? 加入我的邮件列表,让我的最新文章和建议直接发送到你的收件箱。
如何使用 Saturn Cloud 轻松创建、发布甚至共享云托管的 Jupyter 笔记本
用土星云以闪电般的速度在 Jupyter 笔记本上创建、运行和协作的完全初学者指南
Image by Mary Gorobchenko from Pixabay
很难不爱 土星云 。
Saturn Cloud on YouTube
我最近开始使用一个名为土星云的托管 Jupyter 服务,它很神奇。
有了土星云,运行云托管的 Jupyter 笔记本变得异常容易。你点击几个按钮,你就完全设置好了。您可以创建、运行、发布甚至共享 Jupyter 笔记本了。你甚至可以与其他人合作!对于数据科学家来说,在他们的 Jupyter 笔记本上使用基于云的计算可能是最简单的方法。这是我发现的唯一能让你立即(而且毫无痛苦地)做到的方法!)发布并与全世界分享您的笔记本。
如果你想确切地看到设置土星云并共享你的笔记本有多快多轻松,向下滚动到“设置土星云”
Image by Peter Mill from Pixabay
数据科学环境正在发生变化。无论你是经验丰富的专业人士还是在校学生,分享你的工作变得越来越重要。几乎不费吹灰之力就能在笔记本上发布和协作,这太棒了!
没有其他简单的方法可以让您的团队共享笔记本进行协作。(至少在没有雇人安装的情况下不会…)如果你刚出校门,这是一个很大的坎!对于那些已经雇佣了昂贵的数据科学家的公司来说,这也是一个问题,他们需要专注于数据,而不是试图找到某种解决方法。有了土星云,就简单得可笑了。
Jupyter 笔记本
Jupyter 笔记本是最好的之一(免费!)工具,帮助您获得在大量数据相关领域高效工作所需的技能。它们是数据科学、机器学习、深度学习、人工智能等的理想工具。它们不仅可以保存代码,还可以保存丰富的文本元素,比如图像、图形、链接等等。这使得他们成为一个完美的地方,把分析,你的结果,以及正在发生的事情的描述。
还有大约一百万种方法可以定制您的 Jupyter 笔记本,让它变得令人惊叹…
** [## 技巧、窍门、诀窍和魔法:如何毫不费力地优化您的 Jupyter 笔记本电脑
让 Jupyter 笔记本变得更好、更快、更强、更光滑、更棒的完整初学者指南
towardsdatascience.com](/how-to-effortlessly-optimize-jupyter-notebooks-e864162a06ee)
如果你不熟悉 Jupyter 笔记本,一旦你知道你在做什么,使用它们会非常简单。开始使用 Anaconda 和 Jupyter 笔记本可能会有一些小问题,但是一旦你设置好了,就可以轻松使用它们,并且定制它们非常有趣。
如果您在设置时遇到问题,您可能想看看这篇文章:
[## 如何在 Mac 上成功安装 Anaconda(并让它实际工作)
正确安装 Anaconda 和修复可怕的“找不到 conda 命令”错误的快速而简单的指南
towardsdatascience.com](/how-to-successfully-install-anaconda-on-a-mac-and-actually-get-it-to-work-53ce18025f97)
尽管它们很容易使用,但要启动并运行云托管服务通常很困难。有很多人已经完全陷入了试图让他们的笔记本电脑运行云提供商的困境。
这就是土星云出现的地方!
土星云
如果你能弄清楚如何在亚马逊上订购东西,你就能在土星云上建立起来。
首先也是最重要的,土星云是由几个非常不可思议的人领导的:
- 雨果·史是蟒蛇的联合创始人。他在金融部门的数据科学领域工作了 5 年( JP 摩根、都铎投资公司和 Teza Technologies )。他还花了 5 年时间在 Enthought 和 Anaconda 开发数据科学工具。
- 塞巴斯蒂安·梅蒂是 Resolute.ai 的联合创始人。他在管理咨询方面有丰富的经验,他了解业务问题、战略和增长。
(你可以在这里找到相关信息。)
我很幸运能花一点时间和他们交谈,我可以告诉你,他们是一些非常不可思议的人。
完全披露:我有机会与他们交谈的原因是因为我为土星云做了一点工作(并得到了他们的报酬)。另一方面,这意味着我已经了解了他们是一个多么伟大的团队,我也有机会了解他们所提供的东西!
有一些服务提供云托管的 Jupyter 笔记本,如谷歌云和亚马逊 SageMaker 。这些都是很好的选择!但是它们并不总是那么容易使用。已经有很多关于让你的 Jupyter 笔记本在 Azure 、 Google Cloud 和 SageMaker 上运行的文章。当你阅读文章时,你可以看到一些平台肯定比其他平台更容易。如果你想把事情做好,通常需要很多步骤。
另一方面,建立土星云几乎毫不费力。
Image by Bolanu Teslaru Andrei from Pixabay
土星云是简单的,免费的,每个人都可以使用,完全不费力。
建立土星云
土星云的建立再简单不过了。你只需点击几个按钮就能让一切正常工作。大约需要两分钟。
如果你能弄清楚如何在亚马逊上订购东西,你就能在土星云上建立起来。
你可以在这里找到官方文档,但是你需要做的就是注册,然后你就会被放到你的仪表盘上。你将命名你的 Jupyter,选择你需要多少磁盘空间,你想要多少 ram/CPU/GPU,然后点击“创建”
您可能会在一分钟内启动并运行!
如果你是那种做完后忘记按停止键的人,确保你设置了自动关机,这样你就可以避免不必要的费用!
现在,您将看到一个指向您的 Jupyter 笔记本的链接和一个指向您的 Jupyter 实验室的链接。如果您想直接进入笔记本并开始使用,只需点击 Jupyter 笔记本的链接。您将看到一个启动 Jupyter 的播放按钮,一个停止 Jupyter 运行的停止按钮,一个修改服务器的编辑按钮,以及一个删除 Jupyter 的垃圾桶图标。
如果愿意,您甚至可以定制您的 Python 和 Linux 环境。如果您想在主目录中创建新环境,请查看高级选项。
就是这样!你被陷害了!
点击“去 Jupyter 笔记本”,建立一些不可思议的东西!
发布和共享
如果你想分享你的笔记本,这是难以置信的简单。你可以在这里找到详情。你只需要在你的 Jupyter 实验室里打开一个终端。
运行下面这行简单的代码,将“笔记本”替换为您的文件夹或笔记本的名称:
publish ~/notebooks
重新加载“如何发布”页面,您将在屏幕上看到已发布笔记本的名称。单击您的笔记本名称以配置其发布方式。您可能需要更改标题或添加描述。你肯定要决定笔记本是否保密,是否要让别人匿名执行你的笔记本。(这些执行的计算费用将记入您的账户。)一切都清晰得令人难以置信,所以不用担心会有惊喜!
Reload the page and click on your notebook
Make some changes if you feel like it!
现在你有一个发布的笔记本,看起来很棒!
与世界分享!
有了土星云,你就拥有了 Jupyter 笔记本的所有优势,难以置信的速度,你甚至可以发布和分享你的作品。如果您厌倦了免费选项的缺点,并且您希望能够现在就开始并专注于您的数据,而不是跳过一堆圈,请看看土星云。
你还在等什么?
Image by Alexandr Ivanov from Pixabay
感谢阅读!像往常一样,如果你用这些信息做了什么惊人的事情,请在下面的评论中让大家知道,或者随时在 LinkedIn @annebonnerdata 上联系。
当然了,
开始使用 TabPy
集成 Tableau 和 Python 的介绍
在任何领域,保持弹性和适应性,勤奋地接触新的工具和想法都是至关重要的。在像数据科学这样年轻的领域,自学和接受新的挑战变得越来越重要。当我进入数据科学训练营的最后一个月时,我回想起我在课程开始时看到的下图。
https://towardsdatascience.com/the-most-in-demand-skills-for-data-scientists-4a4a8db896db
Jeff Hale 浏览了几个职位列表网站,列出了数据科学职位招聘中最常见的技术技能。虽然我的训练营已经涵盖了大量的这些技能,但该计划不可能详尽地介绍与数据科学相关的技能。对于我没有学到的技能,仅仅因为它们没有在项目中介绍,并不意味着它们在我的职业生涯中不会有用。如果他们真的出现了,我想确保我准备好最好地利用现有的资源和我现有的知识来发展对这些技能的全面理解。
在这篇博客中,我决定深入其中一个我们在训练营中没有涉及到的相关概念。我之前听说过几次 Tableau,但是我从来没有用过。我了解它作为数据可视化工具的功能,可以轻松连接到多个数据源,并允许用户构建仪表板,但除此之外我知道的不多,所以我决定进行调查。一旦我下载了免费试用版(【https://www.tableau.com/products/trial】T2),我就导入了一个 CSV 文件,这个文件是我在最近的项目中使用的,使用的数据来自詹姆斯·勒杜。这个文件包含了大量关于咖啡豆及其质量的数据。一旦导入了文件,我就可以在 Tableau 的一个表中查看数据,如下所示。
导入这个数据集后,我惊喜地发现,用以用户为中心的界面创建数据可视化非常简单。数据集功能列在工作簿的左侧,并且自动生成与每个豆的原产地相关联的地理坐标。我可以简单地将下面列出的度量拖到一个标有“列”和“行”的区域来生成可视化。
为了创建下面的热图,我将“纬度”和“经度”标签拖到“列”和“行”条目中,如下所示。
为了创建下面的散点图,我简单地将“香气”和“回味”字段拖到“列”和“行”条目中。接下来,我单击“香气”和“回味”标签右侧的箭头,选择标准偏差作为要显示的测量单位。
在创建了热图、散点图和其他一些基本的可视化之后,我对如何将 Python 和 Tableau 集成在一起感到好奇。我发现使用 API Tableau Python Server(tabby)可以很容易地实现这一点,它支持 Python 代码的远程执行。
用 TabPy 连接 Tableau
为了集成 TabPy 和 Tableau,我克隆了下面的 Github 库。
动态执行 Python 代码并在 Tableau 可视化中显示结果-Tableau/tabby
github.com](https://github.com/tableau/TabPy)
接下来,使用存储库上的指令和这里的指令,我遵循以下步骤:
1.通过在命令行中键入以下命令来安装 tabby-server。
pip install tabpy-server
2.在克隆的存储库中,转到路径 tabpy-server/tabpy_server。
3.运行文件 tabpy.py。为了运行这个文件,我需要将文件common/config . py . template改为 common/config.py.
4.打开 Tableau 工作簿。按照路径帮助>设置和性能>管理外部服务连接到在 Tableau 上选择外部服务连接。
使用 TabPy 在 Tableau 中运行 Python
此时,连接被设置为在 Tableau 工作簿中运行 Python 代码。这可以通过填写计算字段来完成。
计算字段遵循以下示例中的常规格式。
https://github.com/tableau/TabPy
https://github.com/tableau/TabPy/blob/master/TableauConfiguration.md
函数可以以 SCRIPT_REAL、SCRIPT_INT、SCRIPT_STR、SCRIPT_BOOL 开头,代表函数返回类型。在引号内,输入被称为 _arg1、_arg2、…、_argN。右引号后面是逗号和参数定义。据 Tableau 网站上的一个社区帖子称,这些都是表格计算,所以必须聚合,比如 SUM()、MAX()、MIN()、ATTR()。
后续步骤
这篇博客文章仅仅提供了一个关于 Tableau 和 TabPy 的概述。还有很多其他功能。Tableau 可以连接到其他数据源,并可以创建不断更新的实时仪表板。我只是想了解如何将 Python 整合到 Tableau 中,当然还有其他方法可以整合 Python。下面的链接包括描述如何使用 Tableau 的其他资源以及合并 Python 的更高级方法,如机器学习模型。我计划利用这些资源继续我对 Tableau 的探索,并希望进一步提高我整合 Python 和 Tableau 知识的能力。
回到 11 月,我们引入了 TabPy,使得在 Tableau 计算字段中使用 Python 脚本成为可能。当你…
www.tableau.com](https://www.tableau.com/about/blog/2017/1/building-advanced-analytics-applications-tabpy-64916) [## Tableau 和 Python 集成|Tableau 社区论坛
必须了解表格计算,包括了解维度和度量如何影响…
community.tableau.com](https://community.tableau.com/docs/DOC-10856) [## 使用 Tableau 实现数据可视化
作为数据分析师,我们的目标是以这样一种方式整理我们数据的洞察力,使每个看到它们的人都能够…
www.datacamp.com](https://www.datacamp.com/community/tutorials/data-visualisation-tableau) [## Tableau 培训和教程
学习你在做深入的数据准备和分析吗?负责给别人创作内容?如果你有画面…
www.tableau.com](https://www.tableau.com/learn/training?qt-training_tabs=1#qt-training_tabs)
TensorFlow.js 入门
学习 TensorFlow.js 的基本构建模块,并在浏览器中使用 JavaScript 构建您的第一个(简单)模型
TL;DR 通过 TensorFlow.js 了解机器学习的基础知识-张量、基本可视化和训练一个将千克转换为磅的简单模型
那么这个东西 TensorFlow.js 是什么?
TensorFlow.js 是一个用 JavaScript 开发和训练 ML 模型,并在浏览器或 Node.js 上部署的库
出于我们的目的,TensorFlow.js 将允许您建立机器学习模型(特别是深度神经网络),您可以轻松地与现有或新的 web 应用程序集成。想想您的 ReactJs、Vue 或 Angular 应用程序通过机器学习模型的力量得到了增强。
在浏览器中运行本教程的完整源代码:
[## 入门-tensorflow-js - CodeSandbox
浏览器中 TensorFlow.js 基础教程。包括张量,可视化与 tfjs-vis 和建立一个…
codesandbox.io](https://codesandbox.io/s/getting-started-tensorflow-js-3182j?fontsize=14)
张量
张量是 TensorFlow 的主要构件。它们是 n 维数据容器。你可以把它们想象成 PHP、JavaScript 等语言中的多维数组。这意味着你可以用张量作为标量,向量和矩阵值,因为它们是这些的推广。
每个张量包含以下属性
rank
-尺寸数量shape
-每个尺寸的大小dtype
-数值的数据类型
让我们从创建第一个张量开始:
检查它的等级:
1
这证实了你的张量是一维的。让我们检查一下形状:
[3]
具有 3 个值的一维。但是你怎么能看到这个东西的内容呢?
Tensor {kept: false, isDisposedInternal: false …}
不是你所期望的,对吗?张量是自定义对象,有一个输出其值的 print() 方法:
Tensor
[1, 2, 3]
当然,这些值不一定只是数字。您可以创建字符串的张量:
您可以使用 tensor2d() 创建矩阵(或二维张量):
[2, 3]
当我们开始开发模型时,有一些实用的方法会很方便。先说 ones() :
Tensor
[[1, 1, 1],
[1, 1, 1],
[1, 1, 1]]
您可以使用 reshape() 来改变张量的维度:
Tensor
[[1, 2, 3],
[4, 5, 6]]
张量数学
您可以使用 add() 进行元素相加:
Tensor
[5, 7, 9]
和 dot() 来计算两个张量的点积:
Tensor
[[9, 12],
[9, 12]]
最后,我们来看看转置():
Tensor
[[1, 3],
[2, 4]]
您可以将转置视为输入张量的翻转轴版本。
使用 tfjs-vis 进行可视化
tfjs-vis 是一个小型的浏览器可视化库,旨在与 TensorFlow.js 一起使用。
让我们从创建一个简单的条形图开始。以下是我们的数据:
现在,让我们使用条形图()来呈现数据:
请注意,我们向渲染器提供了一个 DOM 元素作为图表的容器,当您想要将图表嵌入到应用程序中时,这可能会很方便。
让我们看看直方图()并创建一个示例图表:
这两个图表的 API 非常一致。让我们做一个散点图:
训练你的第一个模型
是时候将你学到的东西付诸实践,并建立你的第一个模型。为了使它更真实,我们将尝试近似计算千克到磅的转换,它由以下函数描述:
让我们用它来准备数据并创建 2000 个训练示例:
我们将使用一种叫做监督学习的机器学习方式。简而言之,我们需要为我们的模型提供 2 个数组——X 是训练特征(千克),y 是训练标签(相应的磅)。
TensorFlow.js 允许您使用 sequential() 构建分层模型。我们将非常简单:1 层,输入大小为 1,1 个学习参数:
并教它把千克换算成磅:
你的模型需要一个指标来知道做得有多好。在我们的例子中,这就是均方误差(MSE) 。一旦你知道了如何测量误差,你就需要知道如何利用数据最小化误差。在我们的例子中,这就是亚当优化器。
最后,我们使用这些数据为 100 个时期(我们的模型看到数据的次数)训练我们的模型,并请求洗牌。为什么洗牌?我们不希望我们的模型学习数据的排序,只是不同例子之间的关系。
训练完成后(可能需要一些时间),您可以使用您的模型来预测 10 公斤对应的磅数:
10 kg to lbs: 22.481597900390625
看起来不错,对吧?
结论
祝贺你完成了机器学习理解之旅的第一部分。您了解了:
- 张量:n 维数据容器
- tfjs-vis:与 TensorFlow.js 集成的可视化库
- 使用简单模型从千克预测磅
在浏览器中运行本教程的完整源代码:
[## 入门-tensor flow-js-code sandbox
浏览器中 TensorFlow.js 基础教程。包括张量,可视化与 tfjs-vis 和建立一个…
codesandbox.io](https://codesandbox.io/s/getting-started-tensorflow-js-3182j?fontsize=14)
我希望这篇教程只是让你渴望了解机器学习和 JavaScript 的可能性。准备好下一个了吗?
最初发表于https://www.curiousily.com。
建立机器学习模型(特别是深度神经网络),可以轻松地与现有或新的 web 应用程序集成。想想您的 ReactJs、Vue 或 Angular 应用程序通过机器学习模型的强大功能得到了增强:
建立机器学习模型(特别是深度神经网络),您可以轻松地与现有或新的网络集成…
leanpub.com](https://leanpub.com/deep-learning-for-javascript-hackers)
通过使用 Python 从头构建机器学习模型、工具和概念,加深对它们的理解
“我不能创造的东西,我不理解”——理查德·费曼这本书将引导你走向更深的…
leanpub.com](https://leanpub.com/hmls)
Yelp API 入门
面向小型企业的数据科学
构建一种算法来帮助小企业利用 Yelp 数据。
这篇文章是我们探索小企业如何利用 Yelp 数据更好地了解他们在当地市场的地位的系列文章之一。在深入研究事实之前,我想先告诉你一些这个项目的灵感和目标。当然,如果你只是对技术部分感兴趣,你可以在这里跳到它。
灵感
我在 2012 年搬到纽约市,在过去的七年里,我已经看到一些我最喜欢的当地企业倒闭。大牌品牌开始缓慢但稳步地进入。当然,我们可以整天谈论规模经济和租金上涨,但钱包的力量也允许大公司以小公司无法做到的方式利用大量数据。是我们开始缩小这一差距的时候了。
通过这个系列,我们将对阿斯托里亚我最喜欢的墨西哥餐馆之一进行分析:查诺酒吧。
邻近地区
与纽约市其他更著名的街区不同,阿斯托里亚保持着独特的身份,有着一系列当地美食。毫无疑问,它得益于作为这个城市最多样化的区的邻居。但这也意味着每家餐馆都有众多的竞争对手,这让任何一家本地餐馆都更难脱颖而出。事实上,在 Yelp 上快速搜索阿斯托里亚的墨西哥餐馆会得到 24 页的结果。
目标
我们的目标很简单:确定感兴趣的业务的前五到十名竞争对手,然后使用自然语言处理和情感分析来确定公司做得好的地方和需要改进的地方。要做到这一点,需要大量的数据科学技术,我们将在本系列的每一部分逐一介绍。这些包括但不限于:
- 使用 Yelp API 访问数据
- k 均值聚类
- 网页抓取
- 情感分析/自然语言处理
- 监督机器学习
- 神经网络
现在,你可能会问自己,一个不精通这种类型的分析的小企业应该如何实现所有这些?最终,我们希望将它部署在一个干净的模块中,只需要一些基本的输入:
- 公司名称(如 Yelp 上显示的):查诺酒吧
- 地点(邮编或城市,St): 纽约州阿斯托里亚
- 搜索词(潜在客户可能用来在 Yelp 上找到该企业的任何短语或短语组合):墨西哥餐厅酒吧
不多说了,让我们开始构建并使用 Yelp API 进行设置。
Yelp API
认证令牌
首先:如果你想使用 Yelp API 访问数据,Yelp 需要能够验证你的身份。这是通过生成一个访问令牌来完成的。如果您还没有 Yelp 帐户,您需要创建一个。点击上面的链接,您应该会看到一个如下所示的页面:
为每个独立的项目创建一个具有不同的应用名称的新令牌是一个好主意。必填字段包括:
- 应用名称
- 工业
- 联系电子邮件
- 描述
不需要过多考虑这些,只需要尽你所能地填写,同意条款和条件(别担心,我检查过了,没有 human 厘泊条款),然后为机器人确认你不是机器人。在下一页,您将获得一个客户端 ID 和令牌。
你会注意到我把自己的令牌模糊掉了,那是因为你不想和别人分享你的令牌。如果有恶意的人得到了你的令牌,他们可能会使用它来暂停你的帐户,甚至更糟。换句话说:
理想情况下,您会希望将这些保存为环境变量。关于这个主题的更多详细信息,这篇文章是个很好的起点。
现在,您可以将这些硬编码到您的 Jupyter 笔记本中,如下所示:
client_id = your_unique_client_id
api_key = your_unique_api_key
给 Yelp 打电话
现在我们已经解决了这个问题,我们可以开始调用 Yelp API 来获取新数据了。在我们的例子中,我们想要搜索纽约阿斯托里亚的墨西哥餐馆&酒吧,并将结果保存到 dataframe 中。第一步是通过命令行安装 Yelp API。
pip install yelpapi
安装 API 后,您现在可以将它加载到任何 Jupyter 笔记本电脑中:
from yelpapi import YelpAPIyelp_api = YelpAPI(api_key)
很简单!现在,对 Yelp API 的请求需要三个部分:
- 搜索词:标准 Yelp 搜索中使用的搜索词。
- **位置:**城市、街道或邮政编码
- **搜索限制:**您想要多少个结果(最多 50 个)?
我们想在纽约的阿斯托里亚找到墨西哥餐馆&酒吧,所以我们将所需数据传递给一个搜索查询,如下所示:
term = 'Mexican restaurant bar'
location = 'Astoria, NY'
search_limit = 50response = yelp_api.search_query(term = term,
location = location,
limit = search_limit)type(response)--------------OUTPUT:
dict
如你所见,我们将搜索结果保存到一个响应变量中,它是一个字典。
将结果保存到数据框架
通过进一步的检查,我们会发现这个字典有三个键:
- 商业
- 总数
- 地区
出于我们的目的,我们对业务数据感兴趣。随着进一步的评估,你会发现这个键中的数据是一个字典列表,每个字典代表一个不同的业务,所有的字典都有相同的键。这允许我们将键列表设置为列名,并将值用作 dataframe 中的数据。我们可以用几行代码来实现这一点:
cols = list(response['businesses'][0].keys())
data = pd.DataFrame(columns=cols)for biz in response['businesses']:
data = data.append(biz, ignore_index=True)data.head()
瞧啊。我们有一个数据框架,其中包含了我们在使用传统 Yelp 搜索时通常会看到的所有信息,但其格式可以用于分析。
结论
正如您所看到的,使用 Yelp API 访问数据非常简单和方便。在下一篇文章中,我们将看看分类标签,并使用 K-Means 聚类来找出哪些餐厅与 Chano’s Cantina 最相似。我们将这些视为最直接的竞争对手,以便进行更深入的分析。
有关 Yelp API 更广泛功能的更多信息,请查看文档。
Python 可视化入门
想象任何事情都会让我们有更好的理解,对事情有一个整体的了解,无论是你公司每月的营业额,不断上升的温度,甚至是你可以跑得比其他人都快的紧张局势,相信我,后一种情况很有效。
艺术的目的不是表现事物的外表,而是表现其内在的意义。
—亚里斯多德
可视化是一门艺术,它不仅仅是更好地呈现数据,而是实际上描绘出隐藏在数据深处的趋势、模式和其他迹象,光盯着数据是看不出来的。
这是任何想要从事数据科学的人都需要掌握的关键艺术之一,没有它,你将是不完整的,你的任务,你的任务将是不完整的,尤其是当你去找某人解释,为什么会发生这种情况?
让我们来看看一些最常见的情节;
先沉住气。
难道我们不应该先看看这里需要什么来策划吗?
有如此多的开源库可供您使用,实际上需要做的是将要做的事情。
现在别跟我开玩笑了!
显然,你需要一台笔记本电脑和 Jupyter 笔记本,也许还需要一些 Python 基础知识。
让我们现在开始吧。
线形图:
折线图或折线图是一种图表,它将信息显示为由直线段连接的一系列数据点,称为“标记”。
这更像是一个散点图,只是中间有线条,它用于显示与正在进行或移动的因素相关的数据点。L
让我们用一个例子来观察这一点;
该数据代表股票在某一天的价值。
这里的索引包含了查询的日期,我们有一个单独的列用于不同的公司,在本例中是 IBM 和 Apple。
空谈不值钱。给我看看代码!
使用 Plotly 时要记住的事情。首先,您需要创建如下跟踪:
trace0 = go.Scatter(
x= <List of values on x-axis>,
y= <List of values on y-axis>,
name= <Trace Name>
)
这将创建一个分散的对象,通常被称为跟踪。
一些智慧即将到来,你可以做出任何数量的这些,并在同一个情节中表现出来。
第二,布局,
layout = go.Layout(
title=go.layout.Title(
text= <Heading for your plot>
),
xaxis=go.layout.XAxis(
title=go.layout.xaxis.Title(
text= <X-Axis Name>
)
),
yaxis=go.layout.YAxis(
title=go.layout.yaxis.Title(
text= <Y-Axis Name>
)
)
)
plot ly . graph _ objs . graph _ objs . layout提供了各种即兴创作和排列情节的方法,可以是颜色、字体,通常是任何东西。
太好了!这是上面代码的线图输出
W 如果我想用 Matplotlib 代替 Plotly 呢?
非常欢迎你!
而这就给了我们下面的剧情。
直方图:
直方图是数字数据分布的精确表示。它是对连续变量的概率分布的估计。
抓住你了。首先,不要把它和条形图联系起来。
-直方图与条形图非常不同,因为条形图涉及两个变量,而直方图只涉及一个变量。
让我们来看看泰坦尼克号的数据集。
直方图有助于我们做出推论,比如如果我是一个有年龄的女孩,我活下来的概率是多少。
不,我不想成为一个女孩,我只是不想像杰克那样死去。
假设你得到了这个,让我们冲向代码。
Plotly 提供了不同的类,当输入数据时,可以产生惊人的结果, plotly.figure_factory 就是其中之一。
fig = ff.create_distplot(hist_data, #Used for finding distribution
group_labels, #Labels of the classes used
bin_size=1.5, #Width of the bin
colors = ['#393E46', '#2BCDC1'],
show_rug=False)
看起来简单,输出花式!
看到这里,我们可以很容易地提供前一个问题的答案,**如果我是一个年龄在 18 岁到 35 岁之间的女孩,我很可能会幸存下来,**因为我们可以看到,女性的生存密度在 18 岁到 35 岁之间最高。罗斯活下来的证据之一,如果我们为男性设计,我们肯定会知道为什么杰克没有。
那不是很容易吗!
现在你们就像,
好吧,我会给你的。
箱线图:
这是一种通过四分位数图形化描述数字数据组的方法。
这家伙捕捉了很多信息,我是说很多。
它很好地显示了分布情况,即数据中的值如何分布。
它们是基于五个数字摘要(“最小值”、“第一个四分位数(Q1)”、“中值”、“第三个四分位数(第三季度)”和“最大值”)显示数据分布的标准化方式,这在一个图中包含了大量信息。
空谈不值钱!不用提醒我,我知道。
我们会考虑同样的泰坦尼克号的数据,但我们会考虑票价,而不是年龄。
类似于线图,我们有plotly . graph objs . graph obj . Box,我们可以用它来传递值,它会将其转换为盒图 obj。
trace0 = go.Box(
x = train.loc[(train['Sex']=='female'), 'Fare'].dropna().values,
name = "Female"
)
虽然你们很聪明,但盒子图更聪明。
看到这里,我们可以推断出,大多数男性乘客都是廉价旅行,而大多数女性乘客都有昂贵的机票,而且大多是高级别的。
现在泰坦尼克号对我来说是有意义的,杰克和罗斯在一起的原因,也是他没能活下来的原因。
数据说话。
Weka 3 入门 GUI 上的机器学习
Weka Splash Screen
使用 Weka 构建机器学习模型的分步指南
eka 是一种不会飞的强壮的棕色鸟。名字读作T3 这个,鸟的声音读作T7 这个。它是美丽的新西兰岛上特有的,但这不是我们在本文中讨论的。在这篇文章中,我想向您介绍用于机器学习的 Weka 软件。WEKA 是 Waikato 环境的缩写,用于知识分析。它是由新西兰怀卡托大学开发的。它是一个开源的 Java 软件,拥有一组用于数据挖掘和数据探索任务的机器学习算法。这是一个非常强大的工具,用于理解和可视化本地机器上的机器学习算法。它包含用于数据准备、分类、回归、聚类和可视化的工具。
使用案例:
- 如果您刚刚开始学习机器学习和算法,那么 WEKA 是入门和探索不同算法的最佳工具,以了解哪一种算法最适合您的问题。
- 有时您有一个分类问题,但您不知道哪种算法可以解决它并获得最佳的精确结果。WEKA 是一种简单的方法,可以将许多不同的算法应用于您的数据,并查看哪一种算法会给出最好的结果。
安装:
安装软件非常简单,你只需要先安装 Java 8,然后从这里下载适合你的平台的可执行文件。
安装后,导航到包管理器,开始安装任何学习方案和工具
GUI Chooser — Weka
我将安装和演示的第一个包是 Auto-Weka 。Auto-weka 是 weka 的 AutoML 实现。对于给定的分类或回归任务,它会自动找到具有最佳超参数设置的最佳模型。
安装完成后,您需要重启软件来加载库,然后我们就可以开始了。
**注意:**有一个已知问题。为了通过 OSX 上的 WEKA GUI 使用 Auto-WEKA,WEKA 必须从命令行运行,而不是从 Mac 应用程序运行。例如:
CD/Applications/WEKA-3–8–1-Oracle-JVM . app/Contents/Java/
java -jar weka.jar
加载数据集:
Weka 还提供了一些数据集,你可以用它们来做实验。现在,让我们加载第一个数据集,并对其进行一些探索。在这个例子中,我将使用虹膜数据集。对于 Mac OSX,点击“浏览器”→**“打开文件”→/Volumes/WEKA-3–8–3/WEKA-3–8–3/data。**
加载数据集后,您可以看到 weka 会自动显示属性的一些统计数据(在左侧窗口中列出),当您选择一个要素时,它会显示该特定要素的类分布。
您也可以点击**“可视化全部”,可视化与所有其他功能相关的类别分布。**
培训:
现在。让我们训练一个实际的分类器。Weka 附带了许多可以立即使用的分类器。当您选择“分类”选项卡时,您可以看到一些分组的分类算法:
以下是每个组的摘要:
- 贝叶斯:一组使用贝叶斯定理的分类算法,比如朴素贝叶斯、朴素贝叶斯多项式。
- 函数:一组回归函数,如线性回归、逻辑回归等。
- 懒惰:懒惰学习算法,比如局部加权学习(LWL)和 k 近邻。
- meta:AdaBoost、Bagging 等一套降低方差的集成方法和降维算法。
- misc :比如 SerializedClassifier,可以用来加载预先训练好的模型进行预测。
- 规则:基于规则的算法,比如 ZeroR。
- 树:包含决策树算法,如决策树桩和随机森林。
现在,让我们首先使用随机森林分类器对虹膜数据集进行分类。随机森林是一种集成学习算法,可用于分类、回归和其他任务。它的工作原理是在训练时构建大量的决策树并输出预测的类。为了在 Weka 中使用 RF,从树组中选择随机森林。一旦选择了随机森林算法,它将自动加载默认的超参数集。您可以通过单击显示在分类器旁边的命令来自定义超参数。
至于评估训练,我将使用 15 k 倍交叉验证,然后我们准备好训练。虹膜数据集非常小,因此训练时间将在几分之一秒内。它将生成培训的输出摘要,如下所示:
您可以看到混淆矩阵、ROC 面积、精确度、召回率等指标。
我应该用什么算法来解决我的问题?
一般来说,很难知道哪种算法最适合你要解决的问题。一旦你缩小了问题的范围(多类分类、回归、二元分类),你就可以开始尝试一套算法来处理这个范围的问题。在此过程中,您可能会发现可以提取数据中隐藏结构的算法。
Weka 是实现这一点的一个非常好的工具,因为你可以在算法之间快速切换,并在数据集的一部分上训练它们,然后比较结果,而不必编写太多代码。一旦您确定了算法,您就可以开始实现对您的数据最有效的算法的生产级别。因此,您可以使用更智能的方式,为您的数据自动选择正确的算法和正确的超参数。这种聪明的方式叫做: AutoML 。
使用 AutoML (Auto-Weka):
Auto-WEKA 是 WEKA 的 AutoML 实现包。它的使用非常像任何其他 WEKA 分类器。将数据集加载到 Weka 后,可以使用 Auto-Weka 自动确定最佳 WEKA 模型及其超参数。它通过使用 [SMAC 工具](http://www.cs.ubc. ca/labs/beta/Projects/SMAC/)智能地探索分类器和参数的空间来做到这一点。
Auto-WEKA 只有几个选项可以调整。大多数情况下,只有两个选项是相关的:
- **时间限制:**Auto-WEKA 确定最佳分类器和配置所需的时间(分钟)。如果您不能在默认时间(15 分钟)内获得好的结果,您可以将此旋钮调到更高的值
- memLimit: 运行分类器的内存限制,以兆字节为单位。如果您有一个非常大的数据集,您应该增加这个值。Auto-WEKA 运行时,它将在状态栏中提供迄今为止评估的配置数量和最佳配置的估计误差,如下所示:
- 并行运行:并行执行的运行次数。
时间限制结束后,auto-weka 过程将停止,并显示数据集的最佳配置。现在,让我们探索一下 Auto-Weka 的一些结果。下面是 Auto-Weka 输出的摘要:
它说最好的分类器是逻辑模型树算法(LMT ),上面指定的超参数是“自变量”。您可以使用 LMT 分类器的文档来解释这些参数。以下是每个参数的含义:
- -C 在所有节点使用交叉验证进行升压
- -P 用概率上的误差代替误分类误差作为停止判据。
- -M 3 将一个节点可拆分的最小实例数设置为 3。
- -W 0 为 LogitBoost 的重量微调设置 beta。0 表示不进行重量调整。
你也可以看到 Auto-Weka 证明了 LMT 会给出比随机森林更好的结果。LMT 有 96%的正确分类实例,而 RF 有 94%, LMT 的错误分类实例较少,为 4 %,而 RF 为 6%。这是一个很小的差异,但它会对较大的数据集产生巨大的影响。
总结:
这篇文章是一个快速入门指南,介绍如何使用 Weka 通过 GUI 在数据集上探索和训练机器学习算法,而无需编写任何代码。收集一些对数据的见解,甚至学习一种新的算法或知道哪种算法最适合你的数据集,都是非常有用的。
为新手在黑客马拉松上完成任务
我非常喜欢我的第一次黑客马拉松(你可以从以前的帖子中了解我关于 scope 的经历)。通过 BetaNYC,有机会参加所有能力的移动黑客马拉松,这是 2019 年更大的全国公民黑客日的一部分。
我是“可靠访问地铁”团队的成员,与运输中心和纽约平等访问联合会合作,我们的提示是这样的:
我们想要探究电梯和自动扶梯故障的原因,并以阐明模式和洞察解决方案的方式呈现数据。
如果你要去参加你的第一次黑客马拉松,请记住一些来自一个二年级黑客马拉松的事情,我会在我做的工作之间做这些事情。
评估你的团队
立即开始编码很有诱惑力,但是如果你马上投入进去,你将永远不会有作为一个团队取得成功所必需的专注。大家都是技术吗?每个人都用同一种语言写作吗?你的背景是什么?大家对什么感兴趣?
了解手头的问题
对我们来说,这个问题比一个下午的工作所能解决的要大得多。我们的团队中有两位非技术主题专家,来自 TransitCenter 的 Colin 和来自 United for Equal Access NY 的 Dustin,他们帮助引导了围绕我们的提示的对话。
MTA 在其季度交通和公共汽车委员会会议上发布 PDF。每份报告都有数百页长,但我们关注的是利用率低于 85%的电梯和自动扶梯的报告。埋在这份 491 页的 2019 年 Q2 报告是第 380-384 页的表格。
每一排被分配到一部电梯或自动扶梯,每一部电梯或自动扶梯都在地铁站,其可用性为季度的%,以及注释。评论是报告中最有问题的部分。以下是哈德逊站 ES622 号自动扶梯的评论示例:
自动扶梯于 2019 年 4 月 15 日至 2019 年 4 月 24 日停止运行,以维修和调整 combstop 和碰撞安全装置。由于电线松动,控制器也进行了维修。洒水系统失灵了,引发了洪水。水被抽出来了,喷水系统也修好了;自动扶梯经过测试后重新投入使用。由于安全检查和相关维修工作,自动扶梯于 2019 年 5 月 17 日至 2019 年 5 月 23 日停止运行。调整了 combstop 安全装置,更换并调整了左侧扶手链;自动扶梯经过测试后重新投入使用。
在此期间,有两次停机,每次停机都有多种原因导致停机,并且需要采取多种措施来修复。该信息在其他任何地方都不可用,所以我们的目标是从 PDF 中提取表格。
接受任务
使这些信息可用的第一步是从 PDF 中提取,从那里我们可以开始从评论中分离出每个事件。
有人被指派去确定电梯和自动扶梯故障的所有类型的原因以及如何修理它们,有人被指派去尝试构建脚本来解释不同类型的问题和修理。许多人接受任务,寻找不同的方法将 PDF 表格转换成可操作的数据库。
低下头,做些工作
你已经得到了你的任务,你知道它将如何发挥更大的作用,现在是时候做一些工作了。在我的例子中,我要从 pdf 创建 csv 文件。
Here’s the first page of the PDF I needed to convert
为了让一切快速运行,我使用了 PyPDF2 来读取 PDF。我最初打算使用更复杂的东西来读取文件,但是当我开始编码时,我只有不到四个小时的工作时间来完成一些功能。
PyPDF2 提取了文本并揭示了文件格式的一些问题。这里有一个例子:
‘ES235’,
’34 St-Herald Sq ‘,
‘BDFM84.34%’,
‘The escalator was out of service from 12/4/18 to 12/11/18 due to worn out handrail and countershaft chains ‘,
‘as well as defective brake assemblies. The countershaft assembly and chain were replaced and adjusted. ‘,
‘The right handrail chain was adjusted. The main brakes were replaced and adjusted as well as a controller ‘,
‘’,
‘relay; the escalator was tested and returned to service. The escalator was out multiple times due to the ‘,
‘’,
‘activation of various safety devices. Those safety devices were tested and adjusted as needed.’,
换行符是硬编码的,地铁线和百分比在同一条线上,评论中有一堆额外的换行符,没有解释原因。很乱,但这是我们能做的。
休息一下,吃点零食
记住你和其他人一起参加活动。参加社交活动,如果有食物,你应该去吃一顿饭,并和房间里的其他人联系。这些都是认识人的好方法。
问问周围
如果你独自做项目的一部分,你可能会和一群做类似工作的人坐在一起,在这次黑客马拉松中,有几个人朝着相同的目标工作。我碰巧坐在我熨斗学校的同学 Jen McKaig 旁边,能够谈论我们遇到的一些问题非常有帮助。
让我们来看看我的函数在哪里:
def convert_transit_pdf_to_csv(pdf, start, end):
'''
Input is a PDF file in the local directory, the first page
of the PDF and the last page of the PDF. The function adjusts
the first page to account for zero-based numbering. It will
output a csv file back into the directory.
There are a few issues with the code as-written. If an escalator
or elevator is avialable 0.00% of the time, it will add an
additional digit or character to the availability column. There
is one other issue I've encountered where the subway lines
aren't formatted properly.
The comments will occaisonaly cut off and a fix for that is the
first priority once this code is re-visited.
'''page_range = list(range(start - 1,end))pdfFileObj = open(pdf, 'rb')pdfReader = PyPDF2.PdfFileReader(pdfFileObj)lines = []
availability = []
units = []
stations = []
conditions = []condition = ''for page in page_range:
pageObj = pdfReader.getPage(page)
current_page = pageObj.extractText().split('\n')**# the last two lines of each page are the page identifiers, so it's the current page without the last two lines**
for i in range(len(current_page[:-2])):
**# removes some titles that would otherwise be caught
** if not re.match(string = current_page[i], pattern = '.* THAN 85% AVAILABILITY'):
if len(current_page[i]) > 1:# this is less than ideal and occasionally cuts off the last line
# of a comment if it's under 40 characters. This was about as quick
# and dirty as it comes.
if len(current_page[i]) > 40:
condition += current_page[i]**# this would be [-6:] if all availabilities were above 10%,
# but some are available 0.00% of the time** if re.match(string = current_page[i][-5:], pattern = '\d\.\d{2}\%'):
availability.append(current_page[i][-6:])
lines.append(current_page[i][:-6])**# identifies the elevator or escalator unit**
if re.match(string = current_page[i], pattern = 'E[LS]\d{3}'):
units.append(current_page[i])
stations.append(current_page[i + 1])
if len(condition) > 1:
conditions.append(condition)
condition = ''**# specifically looks for the end of the page and ends the 'condition'**
if i == len(current_page[:-2]) - 1:
conditions.append(condition)
condition = ''
df_stations = pd.DataFrame(
{'units': units,
'stations': stations,
'lines' : lines,
'availability' : availability,
'condition': conditions
})df_stations.to_csv(pdf + ' converted.csv')
你可以在我的 Github 知识库上看到关于 beta NYC Mobility for All Abilities hackathon的最新更新。
获得相关性和协方差的基础知识
相关性是广泛使用的统计概念之一。这篇博文试图回答什么是相关性,为什么它如此有用,相关性和协方差有什么关系,以及计算相关性的一些方法。
什么是相关性?
相关性,决定一个变量如何相对于另一个变量移动/变化的统计技术。它给了我们关于这两个变量的相关程度的概念。这是一种双变量分析方法,描述了不同变量之间的关联。在大多数商业活动中,用一个主题与其他主题的关系来表达这个主题是很有用的。
例如:如果在产品营销上花很多钱,销售额可能会增加。
它为什么有用?
1.如果两个变量密切相关,那么我们可以从一个变量预测另一个变量。
2.相关性在确定其他变量所依赖的重要变量方面起着至关重要的作用。
3.它被用作各种建模技术的基础。
4.适当的相关性分析有助于更好地理解数据。
5.相关性有助于理解因果关系(如果有的话)。
相关性和协方差的关系
在深入研究相关性之前,让我们先了解一下协方差。
协方差:前缀‘Co’定义某种联合动作,方差指的是变化或变动。所以它说,两个变量是相关的,基于这些变量,如何改变彼此的关系。
但是等等,协方差和相关性一样吗?
因为协方差和相关性有相同的含义,所以相关性比协方差更进一步,也告诉我们关系的强度。
两者都可以是正面的,也可以是负面的。如果一个增加另一个也增加,协方差为正,如果一个增加另一个减少,协方差为负。
协方差计算如下
Covariance formula
变量 x 的 Xᵢ=观测点
所有观察值的 x̅=平均值(x)
变量 y 的 Yᵢ=观测点
ȳ =所有观察值的平均值(y)
n=观察次数
**解码协方差公式:**两个变量 x 和 y 之间的协方差是每一项与其各自均值的差的乘积之和除以数据集中的项数减一…
通过一个简单的示例数据获得更好的理解:
以下数据显示了相应温度下的客户数量。
Example to understand correlation and covariance
首先找出两个变量的平均值,用各自的平均值减去每一项,然后按如下方式相乘
x 的平均值,x̅=(97+86+89+84+94+74)/6 = 524/6 = 87.333
y 的平均值,ȳ=(14+11+9+9+15+7)/6 = 65/6 = 10.833
COV ( x,y)= 112.33/(6–1)= 112.33/5 = 22.46
温度和顾客之间的协方差是 22.46。因为协方差是正的,所以温度和顾客数量有正的关系。随着温度的升高,顾客的数量也在增加。
但是这里没有关于这种关系有多强的信息,这就是相关性出现的原因。
相关系数是指任何相关测量方法的结果。
这里,样本相关系数计算如下
Correlation formula
COV ( x,y ) =变量的协方差 x 和y
σx=变量的样本标准差x
σy=变量的样本标准差 y
COV(x,y) = 22.46
σx = 331.28/5=66.25= 8.13
σy = 48.78/5=9.75=3.1
相关性= 22.46/(8.13 x 3.1)= 22.46/25.20 = 0.8
0.8 表示温度和客户数量之间的相关性强度非常强。
样本相关系数可以用来估计总体相关系数。
存在不同的方法来计算两个对象之间的相关系数。一些方法是:
1。 皮尔逊相关系数
它捕捉两个连续变量之间线性关联的强度和方向。它试图通过两个变量的数据点绘制最佳拟合线。皮尔逊相关系数表明这些数据点离最佳拟合线有多远。只有当一个变量的变化与另一个变量的变化成比例时,这种关系才是线性的。
皮尔逊相关系数计算方法为
r =皮尔逊相关系数
n =观察次数
∑xy = x 和 y 值乘积之和
∑x = x 值之和
∑y = y 值之和
∑x2 = x 值的平方和
∑y2 = y 值的平方和
斯皮尔曼相关系数
它试图确定存在于两个顺序或连续变量之间的单调关系的强度和方向。在单调关系中,两个变量会一起变化,但不会以恒定的速率变化。它是根据变量的排序值而不是原始数据计算出来的。
单调和非单调关系如下所示:
Spearman rank correlation coefficient
ρ= Spearman 等级相关系数
di=相应变量等级之间的差异
n=观察次数
比较:皮尔逊和斯皮尔曼相关系数
Pearson 和 Spearman 相关系数可以取-1 到 1 之间的值。
(i) 如果一个变量以一致的速率随另一个变量增加,则皮尔逊系数将为 1,这产生一条完美的线。在这种情况下,斯皮尔曼系数也是 1。
(ii) 如果一个变量随着另一个变量增加,但不是以一致的比率增加,那么皮尔逊系数将是正的,但小于 1。在这种情况下,斯皮尔曼系数仍然是 1。
(iii) 如果关系是随机的,那么两个系数都将接近 0。
(iv) 如果变量之间的关系是一条完美的直线,但关系是递减的,那么两个系数都是-1。
(v) 如果两个变量之间的关系是一个变量减少,而另一个变量增加,但比率不一致,则皮尔逊系数将为负,但大于-1。在这种情况下,斯皮尔曼系数为-1。
什么时候用什么?
皮尔逊相关描述线性关系,斯皮尔曼相关描述单调关系。散点图将有助于可视化数据,并了解应该使用哪个相关系数。另一种方法是同时应用这两种方法并检查哪种方法执行得好。例如,如果结果显示 spearman 相关系数大于 Pearson 系数,这意味着我们的数据具有单调关系,而不是线性的。
此外,相关性并不意味着因果关系。这里看为什么为什么。
更多阅读:
- https://365 data science . com/协方差-线性相关系数/#close
- https://www.wallstreetmojo.com/correlation-vs-covariance/
感谢阅读!
从阅读书籍中获得最大收益——以“专业的方式”阅读
注:此文最初发布于martinheinz . dev
阅读书籍,无论是关于编程、软件开发还是其他方面的书籍,都是获取某一领域知识的最佳途径之一。然而,人们经常快速浏览书籍,注意力不集中,最终记不住或很快忘记他们刚刚学到的东西。但是有更好的方法。
专业的读书方式
我在学校从来没有真正注意过,尤其是在高中的斯洛伐克语课上,但有一件事我记得很清楚,那就是我们的老师告诉我们的阅读书籍的方式*“专业方式”。她告诉我们,当她阅读书籍(主要是诗歌和其他东西)时,她会从每几行或每一段中做笔记。当时我唯一的想法是:“哇,这么浪费时间读诗,真是有些敬业啊……”*(开个玩笑)。
后来,当我开始学习计算机科学并阅读了相当多的书籍和文章时,我意识到按照高中老师告诉我们的方式开始记笔记可能是个好主意。从那以后,我写了很多笔记,养成了一些好习惯,并对整个过程进行了*【优化】,所以让我告诉你如何有效地阅读书籍【专业方式】*。但是首先,为什么写笔记真的有好处呢?
为什么呢?
做笔记有益原因有很多,有些很明显,有些不太明显。所以,现在开始:
- 集中注意力——阅读时,你可能会走神,读了几段后,你会意识到自己不知道刚刚读了什么。如果你做笔记,你会被迫思考你正在读的东西,否则你就不能做笔记
- 多记——思考、写作,并试着把你对刚读过的东西的想法用连贯的句子表达出来,这将有助于你从中记起更多的东西
- 保持记录——如果你正确地写了笔记,那么你可以用它们来记录你读了哪些书/文章,或者你读到哪里了——它就像书上的一个标记,如果你读了很多,从一本书跳到另一本书,这很有帮助
- 笔记本身——嗯,做笔记最明显的优势就是笔记。无论你刚刚读了什么,你都会得到摘要,当有一天你需要它的时候,你会很高兴你真的写下了一些东西。
做这件事的最好方法
现在,我可能已经说服你开始记笔记了,我想分享一些习惯和方法,让它对你来说尽可能的简单和有用。
- 不要复制粘贴书本上的句子——自己写或者最好重新措辞,这样你就容易理解了
- 章节注释基于书籍/文章的章节,这样以后更容易找到具体的部分
- 使用要点——你不需要整段文字,你只需要回忆起你在一本书上读到的内容或者在哪里可以找到更多的信息,有时关键词就足够了
- 使用版本控制软件——这是最重要的一个——为你的笔记创建一个存储库,并根据流派或类型(书籍或文章)将它们归类到目录中,这样你就可以在任何地方访问它们,并可以跟踪你在什么时候读了什么,读了多少
- 使用有意义的提交消息——如果你决定使用 GitHub 或其他版本控制软件,那么我强烈建议你花时间编写好的提交消息。我一般用*“第 X 章(第 X.Y,X.Z 节)”*这样的格式(见下图)。
——使用 markdown——如果你要阅读任何编程书籍,那么都会有代码,而编写包含代码的文本的最简单方法无疑是 markdown。另外,当你在 GitHub 中打开它时,它会被很好地格式化。 - 养成一个习惯——一开始可能会很烦人,会让你慢下来,但随着时间的推移,它会变得越来越自然,你会变得更有效率,所以坚持下去。
Example of commits
结论
在这里,我主要写了阅读书籍或文章时做笔记,但这真的适用于你做的所有学习。阅读书籍、文章时写笔记,阅读你从未使用过的图书馆文件时也要写笔记,例如建立数据库或新网站时。迟早(实际上这可能一直发生在我们所有人身上)你会想:“我读到的这个东西是什么…?”或“我已经做过一次了……但是我不记得怎么做了……”。拥有好的笔记可以给你很大的帮助,所以下次你打开某本书或文章时,只要打开你最喜欢的文本编辑器,创建 Book Name.md 就可以了。
掌握解析树
对 NLP 有用。没那么复杂。
Source: Anni Roenkae for Pexels
虽然我们按顺序读、写、说,但实际上单词是按层次排列的。随着我们掌握了母语,这种等级制度就成了我们的第二天性,以至于我们很少需要停下来思考哪些单词应该放在哪里才能构成一个完整的句子。
解析树是在树形图中显式可视化这种层次的一种方式。
直到几年前,许多自然语言处理(NLP)都涉及到将句子解析成这样的图形并对其进行处理。例如,人们可以将树分成不同的结构类型;或者操纵一棵树来形成新的树,新的树可能对应于也可能不对应于具有相邻语义属性的新句子。
对一些人来说,足够的计算能力和深度神经网络的出现使所有这些努力都变得多余:如果一个词的完整上下文由其邻居决定,让你的网络处理足够的文本数据就足够了。
嗯,也许吧。然后,也许你有很多句子碰巧有相似的结构,简单地把它们分开会很有用。为了以防万一,解析树是一个很好的工具。
我们先从小事做起
让我们从一个微小的句子开始。我们将使用 spaCy 解析器对其进行解析,并以三种不同的方式呈现结果,以帮助将解析树结构上下文化。
第一个是句子中单词的有序列表,以及每个单词所扮演的角色。
第二个是相同的信息,展示了解析树在空间中的可视化方式。
第三张是同一棵树的稍微不同的插图,从上到下读起来很容易。
下面是关于解析树需要注意的四件事:
1 .句子中的每个单词都是图表中的一个节点。我们所说的词实际上是指“句法词”,称为标记。例如, She 的可以写成一个单词,但是表示“她是”,所以 She 将是一个令牌,的将是第二个令牌,在它自己的节点中。
2.该树有一个根节点,树的其余部分从该节点流出。这是一个句子的主要动词。
3.如箭头所示,边缘是有方向的。如果一条边从一个节点到另一个节点,第一个节点是“父节点”,第二个节点是“子节点”。在解析树中,每个节点(根节点除外)都有一个父节点,并且可以有零个或多个子节点
4.每个节点都有一个标签。每条边都有单独的标签。这是两套不同的标签。
你可能对节点上的标签很熟悉,它们表示词性(词性):动词、名词、形容词等。
这个清单比你想象的要长(稍后会有更多)。这里还有几个,完整的名单可以在这里找到。
边缘的东西呢?
它们被称为句法依赖标签,显然,有些是通用的(确切地说是 37 个),而有些是语言依赖的。你可以在 spaCy 文档中找到一个完整列表,但是你真正需要做的是:a .识别它们是什么,b .理解它们有助于导航树,以及 c .记住那些碰巧对你有用的。
例如, nsubj 将是一个显而易见的答案,因为这通常是句子的主语。另一个流行的是 amod ,这是一个形容词修饰语。在我们的例子中,这位女士驾驶的不是任何旧钢琴,而是一种特殊的钢琴——一架希腊钢琴。
细化词性标注
假设我们的句子改成“她驾驶希腊钢琴”。词性标注完全相同——drives 和 drives 都是动词。需要一个更精确的系统来区分这两者。
嗯,完整的 POS 标记系统确实适应这种区别。以下是不同标签的列表;正如你所料,它比以前长了很多。再说一次,我不可能记住哪怕是一半,所以我把它保存在一个文档中作为参考。
为了区分简化的标记(它可能告诉你一个令牌是一个动词,但不是它的时态)和完整版本,spaCy 调用第一个 POS 和第二个标记。您的解析树可以显示标记的完整标记。在其文档中,spaCy 列出了标签及其相应的位置,这很有帮助。
短语和子树
让我们看看当我们把“她”改成更具体的东西时会发生什么。句子的主语现在从一个单词变成了包含几个单词的名词短语。因此, nsubj 边指向“Queen ”,并从那里流出一个子树。
The subtree for the sentence’s subject
要知道子树在哪里开始,在哪里结束,我们可以在句子中寻找属于这个子树的最右边和最左边的标记,并获取它们之间的所有内容:
现在,看看下面这个新句子。尽管这个句子和我们之前的句子没有一个单词相同,我们还是觉得这两个句子有很大的相似之处。例如,在这里我们可以看到主题子树在语法上是相同的:
快速回顾
解析树是表示句子的方向树:标记是节点,边是单词之间的语法关系,源于句子的主要动词。这意味着每个令牌都可以通过从根开始的单一路径到达。
树表示明确了句子的层次性质,因此句子中较小的句法单元对应于子树。
节点和边都用两组不同的标签进行了标注。重要的是不要陷入这些标签的字母汤。请记住,它们可以用来导航树。这为基于规则的分析提供了坚实的基础,尤其是与正则表达式结合使用时。
摘要
在 2019 年 spaCy IRL 活动的主题演讲中,NLP 研究员兼艾伦人工智能研究所研究主任 Yoav Goldberg 概括地描绘了用于分析文本的技术。
他补充说,大多数应用自然语言处理仍然使用基于规则的系统,而不是来自学术界的最新研究。基于规则的系统的优点是需要的数据更少,更透明,更容易调试。
然而,他们确实需要更多的语言知识。
基于规则的系统远非完美,NLP 的未来可能会将规则与机器学习和深度学习技术结合起来。
最终,我们的目标是让 NLP 不仅高效,而且让更容易(或者至少更容易)。这意味着降低专业知识的前期要求。不仅仅是机器学习,语言学也是如此。
我认为这篇文章有助于做到这一点。
了解 Mel 光谱图
如果你想像 Neo 一样了解 Mel 光谱图,请阅读这篇短文!(也许不是全部,但至少有一点)
对于 TL;博士和全部代码,去这里。
几天前发生在我脑子里的一次真实对话
我:嗨梅尔声谱图,我可以叫你梅尔吗?
梅尔:确定。
我:谢谢。梅尔,我们第一次见面时,你对我来说是个谜。
梅尔:真的吗?击球手出局了吗
我:你由两个概念组成,它们的全部目的是使抽象的概念对人类来说是可理解的——梅尔标度和光谱图——然而你自己对我这个人类来说很难理解。梅尔:这种片面的讲话有什么意义吗?
**我:你知道更困扰我的是什么吗?我听说你是 DSP (数字信号处理)领域的 buzzz ,但是我在网上很少找到关于你的直观信息。梅尔:我应该为你感到难过吗?
我:所以无论如何,我不想让你被误解,所以我决定写你。
梅尔:啧啧。这其实挺好的。希望现在有更多的人理解我。
我:很乐意,我的朋友。我想我们可以谈谈你的核心元素是什么,然后用 python 上的librosa包展示一些好看的招数。梅尔:哦,太棒了!我爱 librosa!它可以用一行代码生成我!
我:太好了!让我们在这篇文章中用这首美丽的鲸鱼歌曲作为我们的玩具例子吧!你怎么想呢?梅尔:你知道你在自言自语,对吗?
声谱图
视觉化声音是一种恍惚的概念。有一些迷人的方法可以做到这一点,也有更多的数学方法,我们将在这篇文章中探索。
Photo credit: Chelsea Davis. See more of this beautiful artwork here.
当我们谈论声音时,我们通常谈论一系列不同压力强度的振动,所以想象声音有点像想象空气波。**
但这只是这首复杂而丰富的鲸鱼歌曲的二维表现!
声音的另一种数学表示是傅立叶变换。不需要太多的细节(观看这个教育视频以获得易于理解的解释),傅立叶变换是一种功能,它将时域中的信号作为输入,并将其分解为频率输出。
让我们以一个短时窗为例,看看应用傅立叶变换会得到什么。
现在让我们把完整的鲸歌分成几个时间窗口,并在每个时间窗口上应用傅立叶变换。
哇,这里看不到什么,是吗?这是因为人类听到的大多数声音都集中在非常小的频率和振幅范围内。
让我们做另一个小调整——将 y 轴(频率)转换为对数标度,将“颜色”轴(振幅)转换为分贝,这是振幅的对数标度。
这就是我们所说的声谱图!
熔融标度
让我们暂时忘记所有这些可爱的形象化,谈谈数学。从数学上来说,Mel 标度是频率标度的一些非线性变换的结果。这种 Mel 标度被构造成使得在 Mel 标度上彼此距离相等的声音,对于人类来说也是“声音”,因为它们彼此距离相等。
与 Hz 标度相反,500 和 1000 Hz 之间的差异很明显,而 7500 和 8000 Hz 之间的差异几乎不明显。
幸运的是,有人为我们计算了这个非线性转换,我们需要做的就是使用 librosa 中的适当命令来应用它。
没错。就是这样。但是这给了我们什么呢?
使用重叠的三角形滤波器,将 Hz 标度划分为仓,并将每个仓转换为 Mel 标度中的相应仓。
现在这个给了我们什么?
现在,我们可以获取一个时间窗口的振幅,计算与mel
的点积以执行转换,并在这个新的频率范围内获得声音的可视化。**
嗯,还是没什么意义,他?好吧,让我们总结一下,看看我们会得到什么。
梅尔光谱图
我们现在知道什么是声谱图,也知道什么是梅尔标度,所以梅尔声谱图是一个声谱图,相当令人惊讶的是,它以梅尔标度为其 y 轴。
这就是如何用一行代码生成 Mel 光谱图,并使用另外 3 行代码很好地显示它:
概述
Mel 谱图是以下管道的结果:
- 分离到窗口:用大小为
n_fft=2048
的窗口对输入进行采样,每次进行大小为hop_length=512
的跳跃来采样下一个窗口。 - 对每个窗口进行 FFT (快速傅立叶变换),从时域变换到频域。
- 生成 Mel 标度:取整个频谱,并将其分成
n_mels=128
均匀间隔的频率。
我们所说的均匀分布是什么意思?不是通过频率维度上的距离,而是人耳听到的距离。 - 生成谱图:对于每个窗口,将信号的幅度分解成其分量,对应 mel 标度中的频率。
未完待续…
现在我们知道了梅尔光谱图和尼奥,我们要用它做什么?
好吧,那是另一个帖子…
与此同时,你有没有利用 Mel 光谱图做一些疯狂的项目?请在评论中分享!
通过 3 个简单的步骤获取天气数据
Photo by Max LaRochelle on Unsplash
继续我们的数据收集之旅,这次我们将看看如何收集天气数据。天气数据的应用是无穷无尽的,从独立的天气预报应用到天气分析只是更大目标的一个组成部分的项目。
在我的团队帮助俄亥俄州辛辛那提市改善其紧急医疗响应系统的项目中,我个人发现需要访问天气数据。我的团队需要使用每日天气数据作为模型中的预测器,来预测整个城市的应急响应水平。
我们将从最可靠的来源获得天气数据, NOAA (美国国家海洋和大气管理局)。
既然我现在住在美丽的加州长滩,让我们通过尝试回答以下问题来引导我们的探索:
【2015 年以来,长滩的日平均气温变化如何?
我们开始吧!
1.向 NOAA 请求访问令牌
为了从 NOAA 请求数据,我们将需要请求一个访问令牌,它基本上确认我们是请求数据的可信来源。导航至请求令牌网站。
Request an Access Token from NOAA
填写一个电子邮件地址,您很快就会收到一封包含您的访问令牌的电子邮件。把它存放在安全的地方,保持私密。否则,其他人可能会代表你向 NOAA 提出请求,而你不一定希望这样。
2.确定要访问哪个气象站
下一件你可能想做的事情是找出从哪个气象站收集数据。找到该电台最简单的方法是导航到查找电台网站
根据您的首选位置、数据集首选项(选择每日概要获取每日数据)、时间范围(您选择的范围越长,越少的站将拥有完整的数据)和数据类别(我们只关心手头任务的气温)。
页面右侧的地图将自动更新可用的电台。
对于这个应用程序,我们将选择长滩机场站。请务必记下电台 ID。对我们来说就是 GHCND:USW00023129。
3.抢数据!
现在我们有了访问令牌,并且知道了我们希望访问的站点的 ID,剩下要做的就是向 NOAA 请求数据。我们将使用 Python 的 请求 库来完成这个任务。
首先让我们用 Python 导入所需的库。
为了向 NOAA 请求数据,我们需要使用 NOAA 的 API (应用程序编程接口),它基本上只是与 NOAA 通信以请求数据的特定语言。
让我们来看一下 NOAA API 请求的结构。
基本请求如下所示:
https://www.ncdc.noaa.gov/cdo-web/api/v2/data?
在问号后面,‘?’,我们将需要把所有的选项指定确切的数据,我们正在寻找。这些将包括:
- datasetid ,对我们来说就是 GHCND (全球历史气候网络日报)。
- datatypeid ,这是我们要寻找的变量列表。对我们来说,那将是平均气温
- 限制 ,指定响应中包含的最大项数。默认是 25,最大是 1000 ,这是我们要设置的。
- stationid ,指定我们想要哪个(些)站的数据。我们的站号是 GHCND:USW00023129
- 开始日期 和 结束日期 ,指定我们希望从中获取数据的日期范围。我们将每年调用一次 API,因为 1000 个项目对于我们从 2015 年到现在的整个 3.5 年的日期范围来说是不够的。
总之,我们对 2015 年所有数据的第一个请求如下:
【https://www.ncdc.noaa.gov/cdo-web/api/v2/data? datasetid = GH CND&data typeid = TAVG&limit = 1000&station id = GH CND:usw 00023129&start date = 2015-01-01&end date = 2015-12-31
让我们看看进行 API 调用的代码:
现在是将收集的数据存储为数据帧的代码:
由生成的数据帧制成的图表如下所示:
**好看!**因此,我们成功地请求、处理并报告了自 2015 年 1 月以来加州长滩的日平均气温。
事实上,NOAA API 内置了更多的选项。查看完整文档。我认为浏览 NOAA API 的一个完整的具体用例是一个好的开始。
~数据采集快乐!😃
整理您的数据
经理和企业主指南。
“大数据”现在风靡一时。这是多年来在“热门词汇前 40 名”中排名靠前的词汇之一,但有很好的理由:数据正迅速成为一种新的资产类别,因此也应该如此对待。此外,代替 2018 年最近的数据丑闻(脸书、MyHeritage、Aadhaar),越来越明显的是,需要在数据质量和数据安全方面达成更大的共识。
幸运的是,存在与实物资产管理、质量和风险相关的完整知识体系——其中的每一个现在都可以被利用和调整,以帮助管理我们更难以捉摸的朋友:数据——以及从中收集的信息。
大量涌入的数据
在整个人类历史中,超过 90%的数据都是在过去的两年中产生的——这种惊人的快速发展没有显示出放缓的迹象;据《经济学人》报道,到 2020 年,每人每秒将产生近 2MB 的数据。
当观察财富 500 强公司的领导层时,大约五分之三的领导者认为,未能成为数据驱动很可能导致过时。因此,分析公司数据将成为保持竞争力的核心,这已成为常识。
两层
需要理解的是,世界正日益分为两层——物理层和数字层;我们也越来越多地与物理层的代理交互,而不是像过去那样直接与它交互。在资产管理(AM)行业,当与大公司打交道时尤其如此——每个公司都拥有大量有价值的实物资产。
我们非常熟悉的物理层是实际的物理世界。它是你的基础设施、工厂、机器和设备——当然,还有你的员工;50 年前,你需要直接管理——通过观察和指挥链。
数字层由数据和信息组成。它是你的 It 和财务系统,你的协议和机器数据,你的网络和社交媒体;它是一个数字足迹,包含物理层可以提供的所有信息——随着数字化和超连通性的发展,这一层也在增长。
The World is Being Divided into Two Layers (CREDIT: Grahame Fogel, Gaussian Engineering, 2018)
物理层的管理代理数量众多,可以是您的 SCADA 系统、您的物联网管理门户、您的 ERP 系统和商业智能仪表板等等。
但是,重要的是要认识到,所有这些代理(通过它们来管理物理层)都依赖于您的数据。整理数据极其重要,因为有了坏数据,你与物理世界的联系就会动摇,组织很容易陷入混乱和无序。在这个领域中,决策是基于通常不正确的信息做出的,而决策本身会导致行动,这些行动会通过一个复杂的、官僚的电话故障游戏过滤掉。
产业的碰撞
现在是上述各层提供整个行业碰撞和融合的背景的时候。行业颠覆大体上是关键技术和消费者行为演变的结果——这种行为通常是技术格局变化的结果。从广义上来说,关键技术颠覆在以前局限于自己领域的行业之间创造了融合节点。
最先经历这种融合的行业是科技、媒体和电信:我们现在已经习惯于通过电信公司观看电影和电视剧,通过科技公司购买书籍和音乐。
如今,新一轮行业融合正变得越来越明显。在这里的高斯,我们相信这是两个,最值得注意的:
- 医疗保健、消费品、保险
- 公用事业、建筑空间、交通和电信的融合
The Next Wave of Industry Collision (Credit: Author on Canva)
在南非,我们已经看到第一波浪潮在我们面前展开,Discovery 和 Momentum(两家当地保险提供商)开始利用各种智能设备来监控客户的健康并将数据与他们的产品联系起来。
第二波浪潮是我们 Gaussian 最感兴趣的——这一波浪潮将推动“智能城市”的普及;是实物资产真正与无形资产相遇的浪潮;在这一浪潮中,公用事业公司开始重新思考并转变其运营,以利用实时数据;这是断电管理、分布式电源和高级资产管理的浪潮。所有这些都是通过使用数据实现的。
所以这个数据最好是对的。
孤岛式数据集成的可怕之处
我们最近参与了一个煤矿项目;我们被要求分析他们的数据,并帮助他们做出更好的决策。我们发现该矿从各种来源收集数据,并将其存储在不同的地方:
- 他们的财务数据存储在 SAP(他们的企业资源规划或 ERP 系统)中
- 他们的交易数据存储在他们的计算机化维护管理系统(CMMS)中
- 他们的石油分析结果存储在各种 Excel 电子表格中
- 他们的主数据存储在一个独立的、自托管的数据库中
- 他们的安全事故数据存储在安全事故应用程序中
整合这个数据,类似于美国人、意大利人、法国人、西班牙人、瑞典人;每个人都有不同的有价值的知识;坐下来试着玩琐碎的追求。他们都说不同的语言。协作很难。
Siloed Data Can Prove an Immense Challenge for Organizations Wishing to Make Use of Data Analytics (Credit: Author on Canva)
同样,集成来自各种来源的数据是乏味的、耗时的,有时甚至是完全不可能的!经常会有大量重复的信息;每个源以不同的名称或不同的格式引用事物(员工、资产、日期);很多数据最终都没有被使用。
如果上述情景听起来和你自己的公司非常相似,你并不孤单!这是(不幸的)许多大中型组织的情况;确保数据质量并非易事。
ISO 8000 是数据质量和交换的全球标准,为这类问题提供了解决方案。
标准的重要性
标准是建立规范和程序的已发布文档,它们有助于描述提高兼容性和互操作性的协议。大多数标准都是为在合同中使用而设计的,所以做生意的人可以确保他们“在同一页上”,可以这么说。
当一项标准在全球范围内被采用时,它有助于大大降低成本并促进国际贸易——然而,要想有机会在全球范围内被采用,标准本身必须具有一定的质量。标准的质量主要取决于两个因素,即:
- 开发它的领域专家的专业知识和声誉
- 用于建立共识的过程
可能最大和最著名的标准组织是国际标准化组织或 ISO 这是一个独立的非政府组织,由 163 个国家标准机构组成。正如他们在自己的网站上提到的,ISO 成立的初衷是回答一个基本问题:“做这件事的最佳方式是什么?”。
ISO 从更明显的东西开始,如重量和其他测量方法,但在过去的 50 年里发展成为一个标准家族,涵盖了从我们穿的衣服到我们视频聊天的 Wi-Fi 网络的一切。
但是我们最感兴趣的标准——也是最高管理层应该感兴趣的标准——是 ISO 的一套管理系统标准。这些标准提供了清晰的定义,组织应该用这些方法来管理业务的相互关联的部分,以实现他们的目标。有几种 ISO 管理体系标准,其中几种列举如下:
- ISO 45001 |职业健康和安全管理
- ISO 14001 |环境管理
- ISO 9001 |质量管理
- ISO 55000 |资产管理
- ISO 8000–61|数据质量管理
- ISO 31000 |风险管理
当我们聚焦于数据时,ISO 8000——数据质量和交换的标准——是最相关的。通过实施这些文档中的原则,组织可以确保持续维护高质量的可移植数据,这些数据独立于应用程序,并且对制定战略和运营决策非常有用。
对综合管理系统的需求
有趣的是——也值得考虑的是——随着行业的合并和新行业的出现,这些标准之间的界限变得越来越模糊。除此之外,上述管理标准其实极其相似。这些标准中的每一个都共享一个 计划-执行-检查-行动 结构,并具有类似的要求,例如:
- 记录系统
- 控制文件和记录
- 培养
- 内部审计
- 纠正/预防措施
- 管理评审
这里的要点是: 组织需要整合一个 集成管理系统,首先允许制定数据驱动的决策,包括运营决策和战略决策。
There is an Increasing Need for a Data-Driven, Integrated Management System (Credit: Author on Canva)
一体化管理体系的好处怎么强调也不过分。您的组织将体验到更高的效率、有效性和成本降低;同时最大限度地减少因需要多次年度审计而造成的干扰。IMS 允许管理团队依靠一个系统来实现他们组织的目标;它允许他们将他们的系统和流程整合在一起,并确保他们作为一个具有统一目标的单一单位工作。
未来属于能适应的人;变形者、早期采用者和创意者;那些能够创建组织,将所有这些东西集合在一起并统一起来的人。但最重要的是,未来属于那些为未来做打算的人。
我们将很快发布一个由 6 部分组成的博客系列,详细介绍开发一个**数据驱动的集成管理系统的过程。**保持关注@ 高斯工程、资产和数据管理专家。
使用 TensorFlow 2.0 和 Keras API
深入研究使用 TensorFlow 2.0 和 Keras API 创建回归模型的技术细节。在 TensorFlow 2.0 中,Keras 自带 TensorFlow 库。API 得到了简化,使用起来更加方便。
Source: Pixabay
TensorFlow 2.0 内部打包了 Keras,没有必要将 Keras 作为单独的模块导入(虽然如果需要也可以这样做)。TensorFlow 2.0 API 进行了简化和改进。这对我们——机器学习开发者来说是个好消息。
现在,您可以这样从 TensorFlow 导入 Keras:
from tensorflow import feature_column
from tensorflow import keras
from tensorflow.keras import layersprint(tf.__version__)
2.0.0
我正在使用 tf.data 输入管道来编码分类列,Keras API 与 tf.data 配合得很好。tf.data 的一个主要优势是它充当了数据和模型之间的桥梁。无需自己转换数据,只需定义转换规则,转换后的数据将自动应用于训练。
数据从 CSV 文件提取到 Pandas 数据帧:
column_names = ['report_id','report_params','day_part','exec_time']
raw_dataframe = pd.read_csv('report_exec_times.csv')
dataframe = raw_dataframe.copy()dataframe.head()
report_params 的列值各不相同,我们需要对该列进行规范化(使值处于相似的范围内):
eps=0.001 # 0 => 0.1¢
dataframe['report_params'] = np.log(dataframe.pop('report_params')+eps)
我使用一个实用的方法(这个方法取自 TensorFlow 教程)从熊猫数据帧创建 tf.data 数据集:
def df_to_dataset(dataframe, shuffle=True, batch_size=32):
dataframe = dataframe.copy()
labels = dataframe.pop('exec_time')
ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))
if shuffle:
ds = ds.shuffle(buffer_size=len(dataframe))
ds = ds.batch(batch_size)
return ds
接下来,我们需要为分类列编码定义数据映射。我用的是 TensorFlow 词汇列表函数,包括所有唯一值的映射(如果值很多,用嵌入 API 会更好)。两列被编码— 报告 _id 和日 _ 部分:
feature_columns = []feature_columns.append(feature_column.numeric_column('report_params'))report_id = feature_column.categorical_column_with_vocabulary_list('report_id', ['1', '2', '3', '4', '5'])
report_id_one_hot = feature_column.indicator_column(report_id)
feature_columns.append(report_id_one_hot)day_part = feature_column.categorical_column_with_vocabulary_list('day_part', ['1', '2', '3'])
day_part_one_hot = feature_column.indicator_column(day_part)
feature_columns.append(day_part_one_hot)
使用 TensorFlow 编码在数组外创建 Keras 密集要素图层。我们将在 Keras 模型构建期间使用该层来定义模型训练特征:
feature_layer = tf.keras.layers.DenseFeatures(feature_columns)
我们已经完成了功能。接下来,在实用函数的帮助下,将 Pandas dataframe 转换为 tf.data:
batch_size = 32
train_ds = df_to_dataset(train, batch_size=batch_size)
val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)
test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)
定义 Keras 顺序模型时使用密集特征层(无需将特征数组传递到 fit 函数中):
def build_model(feature_layer):
model = keras.Sequential([
feature_layer,
layers.Dense(16, activation='relu'),
layers.Dense(16, activation='relu'),
layers.Dense(1)
]) optimizer = keras.optimizers.RMSprop(0.001) model.compile(loss='mse',
optimizer=optimizer,
metrics=['mae', 'mse'])
return model
通过 model.fit 功能执行训练。我们使用 tf.data 输入管道来通过训练和验证集:
history = model.fit(train_ds,
validation_data=val_ds,
epochs=EPOCHS,
callbacks=[early_stop])
令人惊叹的是,数据编码发生在幕后,基于为要素图层定义的规则。
如何用 tf.data 和 feature 图层运行 model.predict 函数?很简单。
用输入数据构建熊猫数据框架:
headers = ['report_id', 'report_params', 'day_part']
dataframe_input = pd.DataFrame([[1, 15, 3]],
columns=headers,
dtype=float,
index=['input'])
将 report_params 值转换为与训练时相同的比例:
eps=0.001 # 0 => 0.1¢
dataframe_input['report_params'] = np.log(dataframe_input.pop('report_params')+eps)
从 Pandas 数据帧创建 tf.data 输入管道:
input_ds = tf.data.Dataset.from_tensor_slices(dict(dataframe_input))
input_ds = input_ds.batch(1)
运行模型预测功能:
res = model.predict(input_ds)
print(res)
资源:
- 带有示例数据的源代码可以在我的 GitHub repo 上获得
尽情享受吧!