使用 Datawrapper 和 Python 获得可发布的可视化效果
有时候 Matplotlib 感觉你在用马克笔画画。杰森·库德里特在 Unsplash 上拍摄的照片
Datawrapper Python 库使它变得前所未有的简单
本文中的所有代码和数据都可以在 Deepnote 上的中找到,如果你愿意,你也可以在那里复制并运行代码。
如果您是使用 Python 的数据专家,那么您肯定熟悉 Matplotlib、Seaborn 和 Plotly 等库。它们是数据可视化工具箱的主力。它们提供了极大的灵活性来创建您想要的可视化效果。不幸的是,这种灵活性是以现成的可用性和美观为代价的。
当做演示、写报告或写博客时,你的视觉效果必须看起来很棒。任何使用过这些库的人也知道从这些库中获得漂亮的和可出版的情节是多么困难。Datawrapper 旨在给你一个快速简单的方法来制作漂亮的可视化效果。
他们的博客最近的图表显示了利用上下文创建丰富的可视化是多么容易。
从 GUI 到 API
工作时,我大部分时间都在 JupyterLab,我发现很难从编码转移到网站制作可视化,然后再回到编码。所以当我听说 Sergio Sánchez 写了 Datawrapper Python 库。它利用 Datawrapper 的 API 允许以编程方式创建 20 多种类型的可视化。
让我们探索如何使用 Datawrapper Python 包快速构建一些可视化。我们将使用来自蒙古的每周肉价数据。你不需要了解蒙古或肉类价格,这只是一个很好的数据集。所有这些代码都是在 Jupyter 笔记本中执行的。
首先,我们可以导入我们的库,并从 Kaggle 获取数据。我们的环境变量已经用我们的 Kaggle 用户名和 API 键设置好了。
import pandas as pd
from datawrapper import Datawrapper
import kaggle
import os
kaggle
包允许我们搜索数据集并下载它。一旦我们找到它,我们就可以把它从我们的 Jupyter 笔记本里提取出来。
# Shows results matching our search term.
!kaggle datasets list -s “mongolia meat price”# Download and unzip the dataset.
!kaggle datasets download -d robertritz/ub-meat-prices
!unzip -o ub-meat-prices.zip
让我们加载数据集并看一看。我们数据集中的每一行都是一种特定肉类一周的平均市场价格。所有价格均以蒙古货币为单位。
df = pd.read_csv(“meat_prices_20180103_20211027.csv”)
df.head()
如您所见,我们的数据是标准的长格式。如果你想在类似于matplotlib
的地方绘图,你可以过滤数据框,只过滤你想要的,这很好。作为一个例子,我们可以看到如何只绘制数据集中的牛肉数据。
df['date'] = pd.to_datetime(df['date'])
df[df['meat_type'] == 'Beef, kg'].plot.line('date','price')
作者图片
我们需要做的是透视我们的数据,使每种肉类都在自己的列中,值是那一周的价格。此外,我们将只选择牛肉和羊肉,因为它们是我们感兴趣的主要肉类。
df = df.pivot(index='date', columns='meat_type', values='price').reset_index()
df = df.drop(columns=['Goat meat, kg','Horse meat, kg'])
作者图片
熊猫使用matplotlib
作为它的绘图库。虽然这些情节非常适合在笔记本上探索,但要为演示或博客帖子做好准备,还需要做大量的工作。
让我们看看 Datawrapper 可以做些什么来提升这个漂亮的级别。首先,我们可以用访问令牌实例化 Datawrapper 类。Datawrapper 有一个非常慷慨的免费层,这包括 API 访问您的帐户。你可以在你的账户页面获得一个 API 访问令牌。
dw = Datawrapper(access_token = os.environ[“DATAWRAPPER_TOKEN”])
如果您想确保您的帐户正常运行,您可以使用account_info
便捷方法查看您的帐户信息。
# Input
dw.account_info()# Output
{'id': 175781,
'email': 'robert@mongol.ai',
'name': None,
'role': 'editor',
'language': 'en_US',
'teams': [],
'chartCount': 18,
'url': '/v3/users/175781'}
接下来,我们可以用我们的数据创建一个图表。Datawrapper Python 包的工作方式类似于 Plotly Express 的工作方式。在一行代码中,您可以创建一个图表,声明其标题,并指定要绘制的数据。
有一件事不是很明显,那就是chart_type
。Datawrapper 目前有 22 种图表类型,您可以在它们的 API 文档页面上找到每种图表类型的名称。为了简单起见,我们将制作一个简单的时间序列图,因此我们将使用d3-lines
图表类型。
meat_prices = dw.create_chart(
title = "Market Prices for Meat, Ulaanbaatar, Mongolia",
chart_type = 'd3-lines',
data = df
)
create_chart
方法有以下参数:
title
—字符串形式的图表标题。chart_type
—支持的 22 种图表类型之一。图表类型列表是这里是。data
—接受熊猫数据帧。folder_id
—允许您在 Datawrapper 中指定文件夹 ID,以帮助组织图表。
需要注意的一点是,Datawrapper 包没有返回图表。相反,它将图表元数据作为字典返回。实际的图表现在存储在 Datawrapper 服务上。最重要的是,我们可以通过引用字典来访问图表的 ID。在我们的例子中,我们将使用meat_prices[‘id’]
。
# Input
meat_prices# Output
{'publicId': 'jFWEN',
'language': 'en-US',
'theme': 'datawrapper-data',
'title': 'Market Prices for Meat, Ulaanbaatar, Mongolia',
'type': 'd3-lines',
'metadata': {'data': {},
'describe': {'source-name': '',
'source-url': '',
'intro': '',
'byline': '',
'aria-description': ''},
'visualize': {},
'publish': {'blocks': {'logo': {'enabled': False},
'embed': False,
'download-pdf': False,
'download-svg': False,
'get-the-data': True,
'download-image': False}}},
'authorId': 175781,
'id': 'jFWEN',
'lastModifiedAt': '2021-11-03T13:51:52.233Z',
'createdAt': '2021-11-03T13:51:52.200Z',
'url': '/v3/charts/jFWEN'}
要访问图表,我们首先需要发布图表。这使得图表在我们的 Datwrapper 配置文件上公开,并将为图表生成一个嵌入代码。然后我们可以在笔记本上交互显示。
dw.publish_chart(meat_prices['id'], display=False)
dw.display_chart(meat_prices['id'])
作者图片
在 Jupyter 笔记本中,现在的输出是相当时髦的。这是因为 Jupyter 在输出中为 IFrame 留出了相对较小的空间。为了检查以确保我们的图在更大的尺寸下看起来更好,我们可以用特定的宽度导出它并检查它。
或者,您可以去 Datawrapper 站点看一看。网址格式为https://app.datawrapper.de/chart/{chart_id}/visualize
,在这里可以替换{chart_id}
。您也可以在https://app . data wrapper . de .的仪表板上找到它
dw.export_chart(meat_prices['id'], width=800)
互动还是静态?
导出图表后,您将看到一个名为image.png
的文件,该文件与您的笔记本位于同一目录下。你可以把它作为图片展示或者放在任何你想放的地方。
如果您想在 Twitter 或 LinkedIn 帖子上将其用作静态图像,导出图表是很好的选择。然而,大多数时候你会希望保持剧情的互动性。为此,您可以使用get_iframe_code
方法获取图表的 IFrame 嵌入代码。
Datawrapper 支持 Embedly,它被 Medium 和许多其他站点用于嵌入内容。要在介质上嵌入 Datawrapper 图表,只需将图表链接粘贴到介质编辑器中,然后点击 enter。
# Input
dw.get_iframe_code(meat_prices['id'])# Output
<iframe title="Market Prices for Meat, Ulaanbaatar, Mongolia" aria-label="Interactive line chart" id="datawrapper-chart-jFWEN" src="https://datawrapper.dwcdn.net/jFWEN/1/" scrolling="no" frameborder="0" style="border: none;" width="undefined" height="undefined"></iframe>
自定义您的图表
在 Datawrapper 站点上,您有许多选项来定制图表,包括注释、颜色等等。如果您喜欢使用 Jupyter 界面,也可以通过 Datawrapper Python 包自定义图表。
通过 Datawrapper 包,您可以使用一些内置的关键字参数来更新您的图表。
dw.update_description(
meat_prices['id'],
source_name = 'NSO Mongolia',
source_url = '1212.mn',
byline = 'Robert Ritz',
)
除了update_description
方法之外,您还可以使用update_metadata
方法来改变颜色、线条的粗细等等。可编辑元数据的例子可以在 Datawrapper API 文档这里找到。
现在,我们将线条设置为粗线,并改变颜色。
properties = {
'visualize' : {
'thick': True,
'custom-colors': {
"Beef, kg": '#15607a',
"Mutton, kg": '#1d81a2',
},
}
}dw.update_metadata(meat_prices['id'], properties)# Output
Chart's metadata updated!
用 Datawrapper Python 库处理的一个领域仍然有些困难,那就是注释。可以用属性字典声明注释,但是找到正确的位置可能需要大量的反复试验,这在 Jupyter 笔记本中很难完成。
在这种情况下,我建议转到 Datawrapper 站点上的可视化来完成可视化。这是添加了注释的最终可视化效果。
如果您是一名关心可视化效果的数据专家,您可能想尝试一下 Datawrapper。通过将其包含在 Python 工作流中,您可以在很短的时间内获得生产质量的可视化效果。
感谢阅读。你可以在这里找到更多关于我的信息。考虑订阅以便在我发布时收到通知。如果你想直接支持我的文章,你可以使用我的推荐链接注册成为媒体会员。
量子计算入门
并使用 Q#和 Qiskit 解决数独游戏
📸洛伦佐·埃雷拉
T2:阅读量子力学会让你想知道我们生活在一个什么样的世界里。更糟糕的是,诺贝尔奖获得者理查德·费曼说过一句名言:“如果你认为你理解量子力学,你就不理解量子力学。”那么,没有计算机科学或量子力学的学位,我们究竟如何学习量子计算呢?幸运的是,这个问题有一个答案:你不需要了解太多关于量子现象的知识,也不需要了解你的‘经典’计算机如何一点一点地工作来开始使用量子计算机。相信我,我正在这么做!
位开关处于 0 或 1 位置。量子位开关在 1 和 0 两个位置。
量子计算机不会取代经典计算机,但会让我们解决一些问题(破解密码是一个流行的问题),即使是我们最先进的超级计算机也无法在我们太阳系的寿命内解决这些问题。量子位使之成为可能。量子位是量子计算机中的位,但它的状态(量子位没有的值)不是像常规位那样具有 1 或 0 的值,而是 1 和 0 的叠加**(想象一种可以同时代表 1 和 0 的混合状态)。**
用一台经典计算机和 3 个比特,你可以同时拥有 8 个经典状态中的一个(000,001,010,…,111),但是 3 个量子比特可以同时处于 8 个经典状态的叠加态。
考虑下面这个过于简单的例子:我的经典笔记本电脑使用 64 位 2.3 GHz 处理器,因此每秒可以执行 2300000000 次操作,同时可以保持任何 2⁶⁴状态。尽管我要等 200 多年才能让我的笔记本电脑遍历所有的 2⁶⁴态,但由于叠加,一台有足够量子位的量子计算机可以同时访问所有的态*!*
在过去的几个月里,我一直在用 IBM 的 Qiskit 和微软的 Q# 检查量子计算。Qiskit 使用 Python,而 Q#更接近 C#。无论你使用哪种来源,量子怪异纠缠、叠加以及相关概念很早就出现了。我认为这些是推动量子算法的超级食物成分;你知道这些包装具有不可思议的特性,尽管你不太明白它们是如何做到的…
在我的光量子之旅中,我偶然发现了 Grover 的算法,它在搜索问题中提供了潜在的二次加速(这些问题可以表述为‘这个解决方案是有效的吗?’比如‘这个数据库包含这个记录吗?’).二次加速意味着我们需要 √n ,而不是在数据库中查找 n 次来找到有效的解决方案。
想象一下,你需要检查 4 家不同的商店,找出哪家有你要找的礼物的库存。有了量子计算机助手,你可以花一半的时间。
一个 2x2 的数独游戏不需要太多的思考就能解决。
Qiskit 的 Grover 算法章节以一个 2x2 数独解算器的实现结束。想出一个有效的解决方案不需要太多的思考(它只要求同一行或同一列中的数字不相同),我们根本不需要为量子计算费心。但这是一个很好的起点,而且令人印象深刻的是,它使用量子计算解决了 2x2 数独,这促使我将这个解决方案扩展到更大的数独。
使用 Qiskit 的教科书措辞:可能很难找到常规 9x9 数独的解决方案,但是给定一个解决方案,很容易验证它是否有效。图着色问题(找出由顶点连接的对不能具有相同颜色的 n 节点的着色)也可以用这些术语来表述,并且在 Q# 和 Katas 教程中可以找到这样的例子。
我的 Q#数独解算器使用 Grover 的搜索紧紧跟随关于图着色的 Q#教程,并带来了来自 Katas 挑战的叠加思想
考虑到我们可以模拟的量子位数量和可用计算资源的限制,只能获得部分数独解。30 个量子位需要大约 16GB 的内存,而完整的 4x4 数独至少需要 89 个量子位💥
解决数独的第一步是对数字进行二进制编码,这样一系列的 0 和 1 就可以表征数独的扁平解。
4x4 数独二进制编码的扁平解决方案。
4x4 数独有 4 个不同的数字,例如 0 到 3,每个数字最多需要两位(0 = 00,1 = 01,2 = 10,3 = 11)。这样,一个 32 位的字符串可以分成对,对 4x4 数独网格的 16 个数字进行编码,其中每对的位置决定了它在数独网格中的位置,从左上到右下。
同样,一个 9x9 数独游戏使用 9 个数字,例如 0 到 8,每个数字需要 4 位(0 = 0000,1 = 0001,…,7 = 0111,8 = 1000)。因此,一个 324 位的字符串可以分成 4 组,对 9x9 数独网格的 81 个数字进行编码。
记住这个介绍,我实现量子数独解算器的关键区别在于 Grover 算法的初始化:不是准备所有基态的的相等叠加,而是准备由位串定义的基态的相等叠加。
一个寄存器有 3 个量子位,位串= [[0,0,1],[1,0,0]]准备叠加态 1/√(2) * (|001⟩ + |100⟩),而忽略的另外 6 个基态|000⟩、|010⟩、|011⟩、|101⟩、|110⟩和|111⟩.
这种方法背后的原因是为了获得潜在解决方案的集合,其中具有不在数独范围内的数的基础状态不在准备好的叠加态中(例如,在 9x9 数独中,具有等于|1011⟩的前 4 个量子位的基础状态不在准备好的叠加态中,因为二进制数 1011 表示在 9x9 数独中不存在的十进制数 11)。
数独解算器可以总结为以下步骤:
1.定义数独属性。
2.准备数独数字排列的数组。
3.用上一步的排列来准备叠加态。
4.运行格罗弗的算法。
5.使用量子预言机检查解决方案是否正确。
这个数独解算器简单地从所有存在于叠加状态的有效解中输出一个有效(部分)解。任何解决方案都可能被选中,因为唯一存在的约束是数独规则(即同一数字在每一行中不能出现一次以上,等等。).
考虑到内存限制,返回 4x4 数独的 7 个单元将使用 30 个量子位进行模拟,并且需要相当长的时间。
对 4x4 数独的 6 个单元格运行求解程序后返回的部分解可能是:
求解程序返回的部分解。(在未来的某一天,这个解算器将会毫不费力地完成 9x9 的数独游戏!)
*The resulting Sudoku solution:
Index 1 - Number 0
Index 2 - Number 2
Index 3 - Number 3
Index 4 - Number 1
Index 5 - Number 3
Index 6 - Number 1*
其中索引是 4x4 数独图形中所示的位置。
如果你已经做到这一步:干得好!本文的目标是通过编码和解决问题来吸引人们对学习量子计算的惊人资源的注意。
该代码可在 GitHub 上获得。
[1]约翰·格里宾,《用量子猫计算:从巨像到量子位》(2013),矮脚鸡出版社。
使用 Databricks 和 PySpark 开始使用 Spark
使用纯 Python 开始使用 Spark 和 Databricks
图片来自https://unsplash.com/s/photos/spark
一开始,编程大师创建了关系数据库和文件系统。但是单台机器上的文件系统变得有限且缓慢。数据黑暗就在数据库的表面。缩小地图的精神正在大数据的表面上酝酿。
编程大师说,要有火花,于是就有了火花。
已经有 Hadoop 了,为什么还要麻烦 Spark
如果关系数据库是一个维护良好的数据花园;Hadoop 是一个杂乱的数据森林,它可以无限增长。
要将数据放入花园,数据需要被仔细清理并在那里结构化地生长。在 Hadoop 森林中,女士们、先生们,不要担心,这里的任何数据都可以,文本、数字,甚至音频和视频都没有数据大小和类型的限制。
但是 Hadoop 还是有一些不足,Spark 来解决。这里列出了我的 4 个主要区别。
- 在 Hadoop 中,每一个映射和归约动作都是用磁盘存储作为数据中间人,磁盘操作比较慢。Spark 通过利用内存直接数据访问优化流程。换句话说,在内存中存储一些中间数据来提高性能。(这就是为什么你总是阅读官方 Spark 介绍描绘自己比 Hadoop 快得多,这里没什么神奇的。)
- Hadoop 基本上是一个分布式文件系统,可以通过它的 map-reducer 和批处理调度器扩展到无限大小。但是你需要用 Java 来实现真正的应用。Spark 来提供 Python 之类的操作语言,r .为数据流、机器学习、数据分析提供有用的工具。
- Hadoop 不包含作业调度程序,需要第三方调度程序,Sparks 自带作业调度程序。
- Hadoop 更便宜,需要的内存也更少。Spark 需要更多内存。好吧,这个是 Hadoop 的优点而不是缺点。
有了 PySpark,我们可以用纯 Python 代码、Jupyter Notebook 或 Databricks Notebook 与 Spark 进行充分的交互。这是 Spark 的一大优势。
已经有火花了,为什么还要麻烦数据布里克
Spark 是开源的、免费的、功能强大的,为什么还要使用 Databricks 呢?为了建立一个有用的 Spark 集群,并利用分布式存储,我们需要构建至少 2 台虚拟或物理机器。接下来,设置驱动和工作节点,配置网络和安全等。
来自 https://spark.apache.org/docs/latest/cluster-overview.html的火花元件
仅仅运行一个 Spark“hello world”就要做更多的手工工作。如果得到 JAVA_HOME 找不到,或者找不到 Spark path 之类的错误信息就别提了。
通过解决所有这些繁琐的配置,Databricks 提供了一个开箱即用的环境。
以 Azure Databricks 为例,在几次鼠标点击和几分钟等待集群启动之后。我们有一个功能齐全的火花系统。他们称之为数据砖。
与免费的 Spark 不同,Databricks 通常根据集群大小和使用情况收费。小心,在创建第一个实例时选择正确的大小。
还有一点需要注意,请记住你选择的 Databricks 运行时版本。我更愿意选择 LTS 7.3。稍后,当您安装databricks-connect
时,版本应该是相同的。
开始连接
我准备用 Python 做所有的事情,那么我应该安装pyspark
包吗?不,要使用 Python 来控制数据块,我们需要首先卸载pyspark
包以避免冲突。
pip uninstall pyspark
接下来,安装databricks-connect
。其中包括所有名称不同的 PySpark 函数。(确保您的本地机器上已经安装了 Java 8+)
pip install -U "databricks-connect==7.3.*"
在配置到 Databricks 集群的客户端连接之前,请转到 Databricks UI 获取以下信息并记下。详细步骤可以在这里找到
- 访问令牌:
dapib0fxxxxxxxxx6d288bac04855bccccd
- 工作区网址:
[https://adb-8091234370581234.18.azuredatabricks.net/](https://adb-8091234370581234.18.azuredatabricks.net/)
- 集群 id:
1234-12345-abcdef123
- 端口号:
15001
- 组织 id:
8091234370581234
,组织 id 也出现在工作区 url 中。
当您准备好上述所有信息后,就可以配置到 Databricks 集群的本地 PySpark 连接了。
databricks-connect configure
跟着向导走,你不会迷路的。之后,使用这个 Python 代码来测试连接。
# python
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
print('spark session created.')
如果你受到“火花会议已创建”的欢迎,一个活蹦乱跳的火花簇正在云中运行。我们现在可以做一些大数据分析。
数据仓库:BDFS
Hadoop 的 HDFS 允许用户在本地磁盘上构建可扩展的海量存储。BDFS 几乎和 HDFS 一样。区别在于它的后端存储是基于云的。
你可以用dbutils
用 Python 远程管理 BDFS,
在本地 Python 上下文中获取dbutils
对象处理程序。官方文件假设你使用的是 Databricks 笔记本,省略这一步。当用户试图在普通 Python 代码中使用它时会感到困惑。
from pyspark.dbutils import DBUtils
dbutils = DBUtils(spark) # the spark object here
# is already initialized above
列出/mnt/
文件夹中的文件和文件夹
dbutils.fs.ls('dbfs:/mnt/')
你会得到这样的信息:
[FileInfo(path='dbfs:/mnt/folder1/', name='folder1/', size=123),
FileInfo(path='dbfs:/mnt/folder2/', name='folder2/', size=123),
FileInfo(path='dbfs:/mnt/tmp/', name='tmp/', size=123)]
dbutils 官方文件列出了所有其他操作。
用 Python 上传一个 CSV 文件到 DBFS
在本地磁盘上准备一个圣经 CSV 文件。用您的用户名替换[用户名]以运行下面的代码。
import urllib.request
bible_url = "https://raw.githubusercontent.com/scrollmapper/bible_databases/master/csv/t_kjv.csv"
urllib.request.urlretrieve(bible_url,"/home/[username]/temp/bible_kjv.csv")
现在,上传圣经 CSV 文件到 BDFS。
bible_csv_path = "file:/home/[username]/temp/bible_kjv.csv"
dbutils.fs.cp(bible_csv_path,"/tmp/bible_kjv.csv")
如果您决定移动文件而不是复制,请使用mv
代替cp
。
使用 Spark Dataframe 分析数据
读取刚刚上传的圣经 CSV 文件,并将其封装在 Spark 数据帧中(与熊猫数据帧形成对比)。
bible_spark_df = spark.read.format('csv')\
.options(header='true')\
.load('/tmp/bible_kjv.csv')
bible_spark_df.show()
你会看到结果的
+-------+---+---+---+--------------------+
| id| b| c| v| t|
+-------+---+---+---+--------------------+
|1001001| 1| 1| 1|In the beginning ...|
|1001002| 1| 1| 2|And the earth was...|
|1001003| 1| 1| 3|And God said, Let...|
...
|1001019| 1| 1| 19|And the evening a...|
|1001020| 1| 1| 20|And God said, Let...|
+-------+---+---+---+--------------------+
only showing top 20 rows
如果你是熊猫数据框的粉丝,很容易将数据转换成熊猫数据框
bible_pandas_df = bible_spark_df.toPandas()
我们用 Spark Dataframe 看看每本书有多少节。
bible_spark_df.groupBy("b")\
.count()\
.sort("count",ascending=False)\
.show()
你会看到结果的
第一卷是创世纪,这本书包含 1533 节经文。
在创建临时视图的帮助下,我们还可以使用 Spark SQL 查询数据
bible_spark_df.createOrReplaceTempView('bible')
bible_sql_result = spark.sql('''
select * from bible
where id == 1001001
''')
bible_sql_result.show()
查询结果
+-------+---+---+---+--------------------+
| id| b| c| v| t|
+-------+---+---+---+--------------------+
|1001001| 1| 1| 1|In the beginning ...|
+-------+---+---+---+--------------------+
将 Spark Dataframe 作为 JSON 文件保存回 BDFS。
bible_spark_df.write.format('json').save('/tmp/bible_kjv.json')
对于所有 Spark 数据集操作,请查看Spark SQL、数据帧和数据集指南
Spark 数据库和表格
Spark 还支持 Hive 数据库和表,在上面的示例中,我创建了一个临时视图来启用 SQL 查询。但是当会话结束时,临时视图将会消失。启用在 Hive 表中存储数据,并且可以使用 Spark SQL 进行长期查询。我们可以在配置单元表中存储数据。
首先,创建一个 Hive 数据库
spark.sql("create database test_hive_db")
接下来,将圣经火花数据帧写成表格。这里的数据库名称有点像表文件夹。
bible_spark_df.write.saveAsTable('**test_hive_db**.bible_kjv')
有关 Spark 配置单元表操作的所有信息,请查看配置单元表
总结和概括
祝贺并感谢你阅读到这里。当我开始学习 Spark 和 Databricks 时,当书籍作者试图用复杂的图表介绍 Spark 后端架构时,我陷入了困境。我写这篇文章是为了那些从来没有接触过 Spark 的人,想在不被弄糊涂的情况下弄脏自己的手。
如果您成功地运行了所有代码,那么您应该可以开始使用 Spark 和 Databricks 了。Spark 和 Databricks 只是工具不应该那么复杂,能比 Python 复杂吗?(开玩笑)
还有一点要说明的是,默认的 Databricks 入门教程使用 Databricks Notebook,很好很好看。但是在真实的项目和工作中,您可能希望用普通的 Python 编写代码,并在 git 存储库中管理您的工作。我发现带有 Python 和 Databricks 扩展的 Visual Studio 代码是一个很棒的工具,完全支持 Databricks 和 Spark。
贝叶斯统计入门
探索数据科学
想了解贝叶斯统计的世界,并更好地理解贝叶斯和频率方法之间的区别?心理学家兼顾问汉娜·鲁斯写下了你一直在寻找的资源。在介绍了必要的术语后,Hannah 开始研究一个精彩的案例(涉及婚礼和天气!)让这些概念变得鲜活起来。如果你想知道何时、为什么以及如何使用贝叶斯统计,这篇文章就是为你准备的。
作为一名数据科学家,开始前端开发
重新掌控你向世界展示自己的方式,成为一名更好的工程师
渴望亲自动手并学习新技能?—Quino Al在 Unsplash 上拍摄的照片
作为一名数据科学家,你应该花时间学习前端开发吗?
虽然这听起来是一个有趣的话题,但我们的时间有限,学习一个全新的领域似乎令人生畏。
在讨论了为什么这会让你受益之后,我将分享我作为一名数据科学家开始使用前端开发的经历,并为你提供快速启动你的网站的起点。
对于上下文,我的核心工程技能(过去)围绕 Python 和 Docker。
该职位划分如下:
1 |数据科学家应该学习前端开发吗?
2 |学习 HTML、CSS、Javascript
3 |构建您的前端
4 |构建您的数据科学后端
5 |服务和托管您的网站
6 |分享您的作品
1 |数据科学家应该学习前端开发吗?
我做了调查,发现了一些宝石。
来自 Quora: 数据科学家需要学习 web 开发吗?
Chip Huyen 在 LinkedIn上的帖子—2020 年 2 月 7 日
另一篇讨论这个话题的文章是不久前写的。建议你去看看。
</5-reasons-why-im-learning-web-development-as-a-data-scientist-33bd61601b62>
作为一名数据科学家,无论是在工作场所还是在互联网上,我都觉得自己交流工作的能力有限。报告、图表、幻灯片……无论你是一个多么优秀的沟通者,都很难超越移动响应界面的惊艳效果。
现在已经有了很棒的专注于 python 的工具( Streamlit , plotly Dash ),可以很容易地可视化数据分析或模型预测。
虽然我相信这些工具对于公司内部的应用程序来说是完全可以接受的,但是当涉及到向更多不太专业的观众展示你的作品时,你可能最终会觉得你的应用程序设计受到了限制。
在过去几周的过程中,我意识到重新掌控并没有我想象的那么难。
对我来说,夺回控制权意味着:
- 提高我对互联网工作原理的理解
- 学习用当前的最佳实践(flexboxes、网格、响应式设计等等)编写 HTML 和 CSS
- 学习编写普通的前端 Javascript
- 能够部署一个与我编写的 Python Flask API 交互的网站(这是我作为数据科学家开发的技能)
我相信掌握一个更好的了解前端会有几个的好处:
- 更好地理解可能与您一起工作的开发人员的工作
- 增强您对自己引导产品能力的信心
- 避免你的伟大作品被不太好的界面降级
如果你还在读,我会分享我是如何在这个领域起步的。我真的很惊讶自己能这么快学会我认为很难达到的技能。我还设法让他们与已经获得的技能互动。
2 |学习 HTML、CSS、Javascript
HTML 用于页面内容,CSS 用于样式,Javascript 用于交互。虽然我有关于 HTML 和 CSS 的高级知识,但 JS 真的很陌生。
无论如何,我需要用当前的最佳实践在新的基础上重新建立我的知识。对我来说,另一个要求是在引入任何库之前,理解这些语言的全部能力。
我对斯克林巴的团队感激不尽。自 2017 年以来,Scrimba 以互动和动手的方式为在线编码课程提供了一种创新的方法。
我目前正在学习前端开发人员职业道路课程,该课程不需要任何先验知识,重点是训练你的编码肌肉记忆,而不是理论知识,因此可以让你很快取得切实的成果。
3 |构建您的前端
在斯克林巴,有两章引起了我的注意:
- 响应式设计
- 使用 API
卡斯帕·卡米尔·鲁宾在 Unsplash 上拍摄的照片
响应式设计
请记住,如果你像我一样对夺回控制权感兴趣,这将为你的利益相关者提供愉快的体验,无论他们在哪里,无论他们使用什么设备。
响应式设计就是能够根据浏览器客户端来调整网站的内容布局。对于手机和平板电脑用户来说尤其如此。
虽然这本身是一个完整的主题,它涉及 UI 设计,但主要的关键在于媒体查询,它将根据与屏幕大小相关的条件相应地修改 CSS(样式)。
使用 API
当您想让其他团队使用您的模型时,最简单的方法可能是通过 REST API 访问它**。自然,你可以在你的网站上使用同样的微服务概念。**
然后, web 客户端会监听网页上的用户事件,比如点击按钮,并相应地使用 Javascript 的获取方法向后端发送 HTTP 请求。
注意 Javascript 是用于同步代码执行的。发送请求和等待响应需要编写异步 Javascript,如果你来自 Python,这更直观。
同样,Scrimba 在引入这一概念以及如何实现这一概念方面做得非常出色。
4 |构建您的数据科学后端
Flask 是一个最小的 Python 框架,满足了我的大部分需求。
这是一个你如何为你的模型服务的例子。
5 |服务和托管您的网站
知识库组织
照片由 Richy Great 在 Unsplash 拍摄
你应该把你的后端和前端代码分成两个仓库吗?
这取决于项目的规模和团队组织。
在较小的规模下,将这些组件放在同一个库中可能更明智。
除了给你机会在同一次提交中修改后端和前端,它还使得跟踪你的网站的进度变得更加容易:不存在哪个后端提交和哪个前端提交配合得更好的问题。
微服务
说到上菜,我的建议是使用 Docker 强大的技术。
简而言之,Docker 允许复制运行时环境。
想法是分离前端服务和后端服务的环境,每个环境都有一个最小的依赖集。
将后端放在微服务容器中,前端放在另一个容器中。使用docker-compose
一起构建和运行这些容器。
对于后端 Docker 映像,它可以像具有正确依赖关系的 python 映像一样简单。
对于前端,我尝试使用一个 nginx 图像,将我想要提供的 HTML、CSS、Javascript 文件复制到这个图像中,效果非常好。更准确地说,是在/usr/share/nginx/html
。您也可以选择在该位置装载卷。
https://www.docker.com/blog/how-to-use-the-official-nginx-docker-image/
这样,如果您启用了加密通信,您的网站将在端口 80 或 443 上提供服务。您的后端在端口 5000 上提供服务(默认的 flask 服务端口)。
请注意,此时您可能会遇到与跨来源资源共享相关的问题( CORS )。这是因为您的fetch
语句向源域(您的index.html
文件所在的位置)之外的域发出了请求。在这种情况下,你可能想看看flask-cors
。
主办;主持
数字海洋平面设计
我试了一下数字海洋。更准确地说,我尝试使用 droplets ,这是你需要的规格的普通远程机器,或者 AWS EC2 替代品。
我欣赏干净的界面和易用性。
为了部署我的网站,我ssh
到我在 DigitalOcean 的网络控制台上启动的机器,检查代码 repo、docker-compose build
和docker-compose up
。
关于这个实例,我建议选择从 Ubuntu 上的“ Docker”镜像中启动它,这个镜像随docker-compose
一起安装。此外,您可能有兴趣遵循以下附加步骤(例如,创建具有 sudo 权限的非 root 用户):
https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-20-04
域名
此时,您的网站将可以在您的云机器的 IP 上访问。为了更方便,您可能会对将一个域名路由到那个地址感兴趣。
幸运的是,这个过程是有据可查的。你所需要做的就是从注册商那里购买域名并配置域名服务器。
https://www.digitalocean.com/community/questions/how-do-i-set-a-domain-name
6 |分享您的作品
这就是了。你已经部署了你的网站。你现在可以和全世界分享了。如果你读到这里,我希望这让你渴望夺回控制权,或许激发一些项目想法。
至于我自己,我写了explorehsk.com,一个为中文学习者准备的工具。它通过将相关的单词(按单词的意义和用法)分组,并允许你从一张抽认卡跳到相邻的抽认卡,来帮助巩固 HSK 标准考试的词汇。
存储库演示了上面列出的要点。
https://github.com/syltruong/explorehsk
带回家的信息
- 你可以用前端技能增加你的影响力。
- 有很多资源可以学习 HTML,CSS,Javascript。这些越来越复杂了。这些语言的普通用法已经可以让你走得很远了。
docker-compose
轻松管理您的前端和后端部署- 找到你最喜欢的云提供商和域名注册商。设置好它们,你就可以开始了。
我个人对在这个方向上学习更多感到兴奋,并希望听到你的建议、观点和项目。
让我们在 LinkedIn、Twitter 或评论区联系吧!
领英—https://www.linkedin.com/in/syltruong/
推特—https://twitter.com/syltruong
免责声明:这篇文章不是由文中提到的任何公司赞助的。所有观点都是我的。
MLOps 入门
实践教程
包含开源工具的综合 MLOps 教程
pch.vector 创建的人向量—【www.freepik.com
将机器学习(ML)模型投入生产是一项艰巨的工作。实际上,根据雄心的程度,这可能会异常困难。在这篇文章中,我将回顾一下我个人的想法(包括实现的例子),这些原则适合于在一个受监管的行业中将 ML 模型投入生产的旅程;也就是说,当一切都需要可审计、合规和受控时——在这种情况下,部署在 EC2 实例上的拼凑的 API 将无法满足要求。
机器学习操作 (MLOps)指的是一种方法,其中 DevOps 和软件工程的组合以一种能够在生产中可靠有效地部署和维护 ML 模型的方式得到利用。可以在网上找到大量讨论 MLOps 的概念细节的信息,因此,本文将侧重于通过大量实际操作代码等来提高实用性。,基本上建立了一个基于开源工具的概念验证 MLOps 框架。你可以在 GitHub 上找到最终代码。
这一切都是为了将 ML 模型投入生产;但这意味着什么呢?在这篇文章中,我将考虑下面的概念列表,我认为它们应该被视为 MLOps 框架的一部分:
- **开发平台:**用于执行 ML 实验和授权数据科学家创建 ML 模型的协作平台应被视为 MLOps 框架的一部分。该平台应支持对数据源的安全访问(例如,从数据工程工作流)。我们希望从 ML 培训到部署的过渡尽可能平稳,这对于这样一个平台来说比在不同的本地环境中开发的 ML 模型更有可能。
- **模型单元测试:**每次我们创建、更改或重新训练模型时,我们都应该自动验证模型的完整性,例如
-应该满足测试集的最低性能
-应该在合成的用例特定数据集上表现良好 - **版本化:**应该可以及时返回,检查与给定模型相关的一切,例如,使用了什么数据&代码。为什么?因为如果有东西坏了,我们需要能够回到过去,看看为什么。
- **模型注册:**应该有已部署的&退役 ML 模型、它们的版本历史以及每个版本的部署阶段的概述。为什么?如果出现问题,我们可以将之前归档的版本回滚到生产环境中。
- **模型治理:**只有某些人应该有权查看与任何给定模型相关的培训。对于谁可以请求/拒绝/批准模型注册中心中部署阶段之间的转换(例如,从开发到测试到生产),应该有访问控制。
- **部署:**部署可以是很多事情,但是在这篇文章中,我考虑了我们想要将模型部署到云基础设施并公开 API 的情况,这使得其他人能够消费和使用该模型,也就是说,我没有考虑我们想要将 ML 模型部署到嵌入式系统中的情况。在适当的基础设施上高效的模型部署应该:
-支持多个 ML 框架+定制模型
-具有定义良好的 API 规范(例如,Swagger/OpenAPI)
-支持容器化的模型服务器 - **监控:**跟踪性能指标(吞吐量、正常运行时间等。).为什么?如果一个模型突然开始返回错误或者出乎意料地慢,我们需要在最终用户抱怨之前知道,以便我们可以修复它。
- **反馈:**我们需要向模型反馈关于它表现如何的信息。为什么?通常,我们会对新样本进行预测,但我们还不知道基本事实。然而,当我们了解真相时,我们需要通知模型报告它实际做得有多好。
- **A/B 测试:**无论我们认为我们在做多么可靠的交叉验证,我们永远不知道模型在实际部署之前会有怎样的表现。在 MLOps 框架内,使用真实模型进行 A/B 实验应该很容易。
- **漂移检测:**通常,给定模型部署的时间越长,与模型被训练时相比,随着环境的变化,情况变得越糟。我们可以尝试对这些不同的情况进行监控和警告,或者在它们变得太严重之前进行“漂移”:
*-概念漂移:*当输入和输出之间的关系已经改变时
-预测漂移: 预测中的变化,但是模型仍然保持
*-标签漂移:*模型的结果相对于训练数据的变化
*-特征漂移:*分布中的变化 - **异常值检测:**如果部署的模型接收到与训练期间观察到的任何东西都显著不同的输入样本,我们可以尝试将该样本识别为潜在的异常值,并且返回的预测应该如此标记,这表明最终用户应该小心地信任该预测。
- **对抗性攻击检测:**当对抗性样本攻击我们的模型时(例如,有人试图滥用/操纵我们算法的结果),我们应该得到警告。
- **可解释性:**ML 部署应该支持端点返回我们预测的解释,例如,通过 SHAP 值。为什么?对于许多用例来说,预测是不够的,最终用户需要知道为什么要做出给定的预测。
- **部署的治理:**我们不仅需要对谁可以查看数据、训练模型等进行访问限制。而且还取决于谁最终可以使用部署的模型。这些部署的模型通常就像它们被训练的数据一样保密。
- **以数据为中心:**除了关注模型性能&的改进,MLOps 框架还能够更加关注终端用户如何提高数据质量和广度。
当然,上述原则是对开发运维及软件工程的常规最佳实践的补充,包括代码、文档、单元测试、CI/CD 等基础设施。在探索了 MLOps 的各种解决方案的应用之后(同时考虑到以上几点),我将在这篇博客文章中探索的解决方案是ml flow+Seldon-core的组合——这些的优点是不需要昂贵的订阅。它们大部分都是开源的,这意味着我们可以直接设置和测试它们🙌 …我将逐一讨论上述要点,看看这个堆栈如何应对每个挑战。这是一个很大的范围,所以也许在阅读之前喝杯咖啡。☕️
PS:我不属于 mlflow 或 Seldon-core 团队。虽然这篇文章包含了这些特定框架的大量代码,但这篇文章来自于一种技术不可知论者的心态,试图了解更多关于上述挑战的知识。
1.发展
有多种工具可以解决数据科学家的 ML 实验管理和协作问题,例如 Neptune.ai 、Weights&bias、 Comet.ml 和 mlflow 。这里我们将重点关注 mlflow,它既有一个开源版本,也有一个托管 D atabricks 解决方案。我们可以将 Databricks 部署为我们云基础架构的一部分(无前期成本,按使用付费),从而为我们提供:
- 数据工程工作流的坚实基础(本文不会涉及)。这些数据可能是高度机密的,并且可能是我们不允许保存在本地计算机上的内容,需要这些数据来训练我们的模型。
- 一个可扩展的协作平台,用于在笔记本电脑上运行实际数据的数据科学实验,非常类似于 jupyter 笔记本电脑。
- 用于训练给定 ML 模型的数据和代码的版本控制,以及与模型训练相关的信息(通过工具 Delta Lake、Jobs API 和 mlflow)
- 用户管理,例如,在 Azure Databricks 的情况下,可以与许多公司使用的 Azure AD 链接。这使我们能够非常精细地控制谁可以看到什么,对我们的模型做什么。
要测试 databricks+mlflow,首先要做的是创建一些基础设施。在这种情况下,我们将使用 terraform 部署到 Azure,terraform 是一个跨不同云提供商轻松配置基础设施的工具。我们将保持简单,只需使用以下脚本在一个文件夹中运行 CLI 命令terraform init && terraform apply
:
用于在 Azure 中设置 Databricks 工作空间和 blob 存储容器的 Terraform 脚本。作者代码。
通过 Terraform 运行上面的脚本会在你的 Azure 帐户上设置一个 Databricks 工作区——如果你在 Azure 门户中导航到已创建的 Databricks 资源,你应该能够点击“启动工作区”,这会将你发送到新创建的 Databricks 工作区;到目前为止一切顺利。👌
现在我们已经建立并运行了数据块,我们需要训练一个 ML 模型并将其登录到 mlflow 中-这可以对任何类型的自定义模型进行,但当我们使用流行的框架时,mlflow 提供了许多方便的函数-在这种情况下,我们将利用 mlflow 的魔力,训练一个经典的 Keras 模型来对 MNIST 数据集中的手写数字进行分类。导航到 Databricks 左侧的“Workspace”选项卡,我们可以创建一个笔记本并运行以下代码片段:
使用 Keras 训练 MNIST 分类器并将结果记录到 mlflow 的 Python 代码。作者代码。
注意:为了能够运行笔记本电脑,您必须将其连接到集群,但这可以使用 UI 轻松创建。
2.模型单元测试
数据块使我们能够定义“作业”,这使我们能够用一组输入参数运行给定的笔记本。我们可以使用它来捆绑我们的训练代码,这样当我们希望重新训练我们的模型时,我们只需要重新运行我们的工作,这可以通过一个简单的 REST 请求来完成,而不是手动进入训练笔记本并重新训练模型。我们的模型训练的这种“可操作化”的一个关键部分是,我们在笔记本中包括检查,以确保模型仍然按照预期在例如测试数据集或合成数据集上工作。例如,可以将以下内容添加到我们之前的笔记本中:
在测试数据集上评估我们的模型的代码片段,如果精度太低,则失败。作者代码
在笔记本中添加了这些检查或“测试”之后,我们可以在 Databricks 中创建一个指向笔记本的“作业”。为了重新训练我们的模型,我们简单地告诉作业用笔记本创建一个“run”(这可以在 UI 中或者通过 REST 调用来完成)。
显示我们 MNIST 工作“运行”的屏幕截图——作者提供的屏幕截图。
这正是我们想要的;例如,如果我们在已部署模型的性能开始下降太多时,自动向 Databricks 发送重新训练 REST 请求,但是由于某种原因,自上次训练以来,新的损坏数据被引入到数据集,从而破坏了模型,我们不希望该模型进入生产。
3.版本控制
一旦我们的模型训练完成,我们可以查看本笔记本附带的 mlflow“实验”,在这里我们可以获得作为本笔记本一部分训练的模型的概述以及每个模型的指标和参数(例如,随时间推移的损耗等)。).我们可以点击“源”按钮(见下面的截图),这将显示我们到底是什么代码被用来训练模型;这意味着我们将能够审计生产中的任何模型,以查看是谁以及如何训练它的。
截图显示了我们的两个训练有素的 MNIST 模型的 mlflow 实验。作者截图。
在上面的屏幕截图中,还有一个“Models”列,对于每次运行,mlflow 都创建一个“mlflow model”对象,它在运行结束时封装模型。单击其中一个,我们将进入一个页面,其中包含有关模型的详细信息,包括有关训练期间的损失和准确性、训练参数的信息,最后是一个包含工件的部分,在这里我们可以看到封装的“mlflow model”,其中包含有关模型所需的conda.yaml
环境、训练的模型权重等信息。通过点击“注册模型”按钮,我们可以将这些模型中的任何一个输入到 mlflow 模型注册表中(当然,这也可以在代码中完成)
特定运行的 mlflow 工件的屏幕截图,特别关注于经过训练的 mlflow 模型。
4.模型注册表
一旦我们将一个或多个模型登录到我们的模型注册中心,我们可以在数据块中单击左侧的“模型”选项卡,以便获得我们的模型注册中心的概览,其中包含所有模型及其当前阶段:
来自 Databricks 的模型注册表显示了每个模型、其最新版本、部署阶段等。
这为我们提供了很多透明度,比如当前部署了什么,之前部署了哪些版本,以及到所有模型对象的链接,允许我们检查他们接受了哪些代码和数据的培训,等等。
5.模型治理
对于注册到我们的模型注册中心的每一个经过训练的模型,我们可以控制许可设置,这意味着我们可以控制谁可以看到模型注册中心中的哪些模型,以及谁可以授权从例如阶段到生产的转换;这正是我们想要的,因为我们希望有一个模型进入生产的控制门;例如,创建给定模型的数据科学家的经理可能需要在给定模型过渡到部署之前对其进行验证和批准,检查如下内容:
- 确保根据已知的测试集或通过交叉验证对模型进行了测试,以确认其有效。
- 确保该模型已针对具有已知“信号”的合成数据集进行了测试如果它没有通过这种类型的测试,可能是引入了错误。
屏幕截图显示了模型注册表中给定模型的权限设置,演示了我们如何给不同的用户不同的权限。作者截图。
6.部署
一旦模型注册中心中的模型已经转换到“生产”阶段,下一个阶段就是将该模型推送到部署服务器,以便该模型的消费者可以使用例如 REST API 来调用它。在本帖中,谢顿核心将处理这些部署。简而言之,Seldon-core 将 ML 模型包装并部署到一个 Kubernetes 集群上,Kubernetes 是一个通用的开源系统,用于自动化部署、扩展和管理容器化的应用程序。为了测试所有这些,首先,我们需要一个 Kubernetes 集群,我们可以通过向 terraform 脚本添加一些配置来设置一个 azure 管理的 Kubernetes 集群:
扩展以前的 terraform 脚本,在 Azure 上创建一个 Kubernetes 集群。作者代码。
将上述内容添加到我们之前的 terraform 脚本并重新运行terraform apply
,应该可以用一个非常简单的 Kubernetes 集群来更新我们的基础设施。既然我们已经启动并运行了一个集群,我们需要安装 Seldon-core +相关的包,这可以通过以下命令来实现(取自官方文档):
在我们新创建的 Kubernetes 集群上安装 Seldon-core 的 Bash 命令
就这样👌 …现在,我们已经有了一个安装了 Seldon-core 的基本 Kubernetes 集群。作为设置的一部分,上面的命令还安装了 Ambassador ,它控制对我们的 Kubernetes 集群的请求,当您运行上面的edgectl install
时,它应该已经打开了您的浏览器到您新设置的 Ambassador 域,这为我们提供了一个很好的界面来检查我们从我们的 Kubernetes 集群公开了什么,它是如何运行的,等等。
我们新集群的大使界面截图。截图由作者拍摄。
既然我们已经建立了 Seldon-core 的基础版本,我们可以开始探索如何部署我们的 mlflow 模型。可悲的是,我们将不得不做一些充实来实现这一点——即,尽管在 Seldon-core 中支持 mlflow 模型,但它不是以一个漂亮的大按钮的形式自动部署我们的模型。但是,请记住,部署模型所涉及的许多步骤都是可以自动化的——我将在下一篇博客文章中更全面地讨论这一点,可以在下面找到:
好吧。我们希望从 Databricks 模型注册表中获取 mlflow 模型,并将其部署到 Seldon-core 中。Seldon-core 确实提供了一个开箱即用的 mlflow 包装器来部署 mlflow 模型,但对我来说,它总是与有问题的模型发生冲突。相反,我采用了一种更加定制的方法,我们需要创建一个与 Seldon 兼容的 docker 映像,我们可以将它部署到 Seldon-core 上。实际上,我发现这更好,因为它将允许我们在后面与漂移和异常值检测相关的章节中探索 Seldon 的更多边缘应用。首先,我们需要从 Databricks mlflow 服务器下载 mlflow 模型:
获取一个 Azure AD 令牌,并使用它根据您的工作区对 Databricks CLI 进行身份验证。
用于将模型从数据块托管的 mlflow 下载到本地文件夹的脚本
使用上面的脚本,我们可以很容易地从 mlflow 下载一个给定的模型,例如,在我的例子中,我运行了python download_mlflow_model.py --model-name “Digit Classifier" --model_stage Production
。这将把训练好的 mlflow 模型下载到一个model/
文件夹中。从这里开始,我们只需要编写一个小的可重用 python 包装器,它让 Seldon 知道如何加载这个 mlflow 模型,并通过定义load()
和predict()
方法来执行预测。这个MyMlflowModel
python 包装器是我们在 mlflow 和 Seldon 之间拥有的接口的核心部分,在这篇文章中我们会多次提到它。
我们的 mlflow 的 Python 接口将由 Seldon-core 使用。模型是从我们的下载器/模型文件夹中加载的。
有了下载的模型和 python 包装器,我们就可以用 mlflow 模型打包一个合适的 docker 映像了。这可以使用命令行工具s2i
轻松完成,它让我们将代码注入到由 Seldon 维护的 docker 映像中:
将我们的 mlflow 模型捆绑在一个 docker 映像中,该映像被推送到 dockerhub
通读 Seldon-core 文档,有多种方法可以在部署之前本地测试这个 docker 映像,例如,通过启动 docker 映像并向其发送请求,或者使用 Seldon-core 提供的各种命令行工具。一旦确认它在本地工作,我们就必须将我们的映像推送到某个容器存储库——在这种情况下,我只使用公共 dockerhub,但我们必须记住,模型也可以是高度机密的,因此在现实世界的设置中,docker 映像存储库的安全性也必须考虑。最后,我们可以使用一个超级基本的 Kubernetes mlflow.yaml
文件将我们训练好的 mlflow 模型推送到我们的 Kubernetes 集群,这个文件是用kubectl apply -f mlflow.yaml
应用的:
我们在 Kubernetes 上部署 mlflow 模型的配置文件
一旦kubectl apply
命令成功,您应该能够转到您的大使端点(例如,https://YOUR _ URL/seldon/mlflow models-namespace/ml flow-Mn ist/API/v 1.0/doc/)来获取您新部署的模型的 REST API 的文档。该页面还将使您能够通过直接从浏览器向 API 发送请求来快速开始测试 API:
显示我们部署的 mlflow 模型的 Swagger UI 的屏幕截图。作者截图。
或者,我们可以使用 python 通过整个测试数据集来访问我们的 API:
用于将整个测试 MNIST 数据集发送到我们部署的模型端点的 Python 脚本。
7.监视
我们部署的 docker 映像自动设置了许多监控样板文件,这些文件公开了大量的指标,这些指标可以被 Prometheus (一种常见的监控解决方案)抓取。Seldon-core 附带了快速设置所有这些的工具,使我们能够在 Grafana 中可视化这些指标。本质上,我们所要做的就是在我们的 Kubernetes 集群上安装seldon-core-analytics
,这可以通过运行以下命令来完成:
Bash 命令用于安装 Seldon-core-analytics 并将 Prometheus 和 Grafana 端口转发到本地主机
使用这些命令,我们在集群上安装了 Prometheus 和 Grafana,并将其端口转发到我们的本地主机,这样我们就可以转到localhost:3001
查看 Prometheus 界面,该界面允许我们发送对所有记录的指标的查询,或者我们可以转到localhost:3000
查看预先填充的 Grafana 仪表板,该仪表板为我们提供请求率、延迟等的概述。,适用于所有当前部署的型号。本质上,使用 Seldon-core 设置监控非常简单,Grafana 可以根据用户的需求和愿望方便地定制仪表盘。
作者提供的图片,展示了 Grafana dashboard 和我们部署的 mlflow 模型。
8.反馈
您可能已经从 Seldon 公开的 API 文档中注意到,它自动公开了一个/feedback
端点和/predict
端点。此外,默认情况下,Grafana 仪表板还提供了一个图表,显示来自我们模型的“奖励”信号。“反馈”和“奖励”使我们能够在部署模型后对其进行评估,因为我们逐渐开始获得带有已知标签的额外数据。在我们知道真实标签的地方获取新数据,我们可以给/feedback
端点发送一个给定的奖励,记录一个模型是表现得好(高奖励)还是差(低奖励)。例如,我们可以通过循环我们的测试数据来测试端点,并根据它的预测情况将奖励发送回模型:
循环测试集,从模型中获得预测,基于性能向模型反馈奖励。
Grafana 仪表板的屏幕截图,显示我们的模型表现良好,由奖励信号确定。
除了直接发送奖励,值得注意的是,我们还可以在 python 模型包装器上覆盖send_feedback()
方法,使我们能够将数据样本和真实标签发送到/feedback
端点,然后在后端计算“奖励”(例如,在准确性方面)——本质上,在如何跟踪实时模型性能方面有很大的灵活性。
注意,我们可以很容易地在 Python 包装器中实现一个阈值,当平均回报低于给定阈值时,它会自动向 Databricks 发送重新训练请求。🚀
9.A/B 测试
当引入新版本的模型时,您可能希望验证它是否比以前的模型更好。因此,我们可能希望在生产中运行 AB 测试,看看哪个模型的性能更好。Seldon-core 使这一点变得非常容易,因为我们基本上只需要将traffic
关键字添加到我们之前的yaml
文件中,并添加另一个预测器。作为一个例子,让我们尝试添加另一个 MNIST 模型,该模型偶然只被训练了一个时期。在全面更换我们的旧型号之前,我们将 80%的流量导向旧型号,20%导向新型号:
这样,80%的流量流向旧模型(版本 0.1),20%流向新模型(版本 0.2),两者都向我们的 Grafana 仪表板报告,在那里我们可以比较它们接收反馈信号时的表现。
在这种情况下,两个模型实际上表现得差不多,因此仅训练 1 个时期的 MNIST 分类器不会导致模型更差,但也不会显著改善结果。然而,在某些情况下,模型实施或训练数据中的错误可能会通过我们之前的所有检查,因此为任务关键型部署执行这些 AB 测试可能是一个好主意,Seldon-core 使它非常容易做到。
10.漂移检测
在这篇文章中选择 Seldon-core 的原因之一是他们维护并集成了库 Alibi-Detect ,该库为漂移检测、敌对攻击检测和异常检测提供了预实现的算法——预实现这些算法可以节省大量时间,因为没有一种算法适合所有人,并且我们自己实现它们会很痛苦。
Alibi-Detect 中的漂移检测算法支持(2021 年 5 月 4 日)
假设我们希望将一种漂移检测算法应用于我们的 MNIST 分类器。为了以 Seldon-core 推荐的方式完成这项工作,我们必须引入另一个工具,即“ KNative ,它允许我们从 Seldon-core API 中提取有效载荷信息,并异步处理它,见下图:
图片来自 Seldon-Core 文档
设置这个有点麻烦,因为它涉及安装 Knative 并设置它与 Ambassador 一起正常工作,训练 Alibi-Detect 模型并将其推送到 blob 存储,最后为我们的模型设置所需的 Knative 资源。不过,最终,在所有的设置之后,部署漂移检测算法并不比向 Kubernetes 应用另一个yaml
文件更复杂,指向预训练的漂移检测算法。
为了保持这篇文章的简洁,我选择不去经历这个棘手的过程,而是提到在谢顿核心文档中有关于如何继续的例子。作为替代,值得指出的是,我们可以选择直接在 python 模型包装类上实现自定义指标,这意味着我们可以在模型本身中包含预训练的漂移检测模型(基于 Alibi-Detect ),从而让它与每个请求同步评估,并在 Grafana 中实时报告漂移。为此,我们可以回到 Databricks 笔记本,训练一个 Kolmogorov-Smirnov 漂移检测算法(检查数据分布的差异):
为 MNIST 数据集训练 KS 漂移检测器并添加到 mlflow 模型伪影
这样,我们就可以将漂移检测算法训练并添加到我们的 mlflow 模型中,然后我们可以将它重新打包到 Seldon-core docker 映像中,并部署到我们的 Kubernetes 集群中。不过,在此之前,我们也将更新我们的 python 包装器类,以便对每个预测执行漂移检测:
添加了漂移检测器的 mlflow 模型的 Python 包装器。
随着这个模型的部署,漂移现在由普罗米修斯刮出,我们可以很容易地在 Grafana 中创建一个显示漂移的图形。我们甚至可以添加警报阈值,这样,如果数据偏离训练数据太远,相关用户就会收到通知。这里有一个例子,最初我给模型输入了大量正常的 MNIST 图像,突然之间,输入了大量失真的样本,这些样本很容易被检测器检测到:
作者截图来自 Grafana 仪表板
这种特定类型的漂移称为“特征漂移”或数据漂移,即输入数据特征的变化。然而,任何其他类型的漂移检测也可以直接在 python 包装器中实现。
11.离群点检测
与漂移检测类似,Alibi-Detect 采用各种算法来识别输入样本是否为异常值。Seldon-core 中推荐的实现类似于漂移检测,因为它涉及设置 Knative 并异步处理给定样本是否为异常值。为了简洁起见,我将再次跳过这个实现,而是链接到文档示例。
Alibi-Detect 中的异常值检测算法支持(2021 年 5 月 4 日)
除了设置 Knative,值得一提的是,与我们如何在 python 模型包装器上实现自定义指标类似,我们也可以实现在预测时返回的自定义标记——因此,我们可以将异常值检测器与模型捆绑在一起,并同步处理进入异常值检测器中的/predict
端点的每个样本。一种想法是,如果样本是异常值,则返回一个标签,声明该样本与预测一起被认为是异常值。如果我们要尝试这样做,我们首先回到我们的 Databricks 笔记本,在那里我们可以训练异常值检测器并将其与我们的 mlflow 模型捆绑在一起:
用于为 MNIST 数据集训练异常值预测值并将其绑定为 mlflow 模型工件的 Python 脚本。
然后,我们只需要将离群点检测器添加到当前的 python 包装器中:
我们的 mlflow 模型的 Python 包装器,增加了漂移和异常值检测器
这样,我们可以将新的 mlflow 模型捆绑到一个新的 Seldon-core docker 映像中,并将其部署到 Kubernetes。当使用明显是异常值的样本(例如,完全白色的图像)向预测端点发送 REST 请求时,我们现在得到以下响应:
当我们发送白色图像时,来自部署具有漂移和异常值检测器的 mlflow 模型的样本响应。
现在,终端用户将立即能够看到,该预测是相当不确定的,因为与训练数据相比,输入数据被标记为异常值。
12.对抗性攻击检测
机器学习算法可能很脆弱,因为通过非常轻微地改变我们给模型的输入,我们有时可以从根本上改变它的输出——我相信你们都在网上看到过这样的例子,对给定图像的细微改变可以改变其分类,例如从熊猫到长臂猿。在 MLOps 的上下文中,我们需要考虑一个坏演员可能会利用我们部署的一些机器学习模型的这一事实,试图确定如何优化算法的预测。根据不同的用例,这可能或多或少很关键。Alibi-Detect 包再次派上了用场,它采用了一种算法来检测使用敌对自动编码器的“敌对”(被操纵)样本,使我们能够在部署的模型遇到异常数量的敌对数据时获得警报。
与异常值和漂移检测一样,我们可以在模型代码中直接包含对抗性检测器;这样做的一个额外好处是,我们不仅可以使用对抗性检测器来检测我们的 ML 模型的攻击,还可以纠正对抗性示例,从而使攻击变得更加困难,详见论文。这一点的实现将非常简单地遵循异常值和漂移检测器的步骤,因此我选择在这里不包括它。
13.可解释性
除了 Alibi-Detect,Seldon 还维护和集成了一个库 Alibi ,它实现了各种用于模型解释的算法(例如,SHAP、集成梯度、锚点等)。这些都是以这样的方式实现的,它们在我们的 REST API 中提供了一个额外的/explain
端点,这样任何感兴趣的用户都可以很容易地查询给定预测的解释。这太棒了,因为这意味着当最终用户对为什么返回给定的预测有疑问时,他不需要手动执行大量的分析,而只需调用/explain
端点。
让我们尝试向我们的 MNIST 模型添加一个“集成渐变”解释器——不同的解释器有不同的要求,但在这种情况下,解释器需要直接访问我们的 Keras 模型——因此,首先,我们将在我们的 Databricks 笔记本中保存模型,并上传到我们最初用 Terraform 创建的 Azure blob:
将我们的 Keras 模型保存到云中 Azure blob 存储的脚本。
注意:我们从 Azure 的存储帐户中获得的AZURE_CONNECT_STRING
。既然我们已经将解释器上传到 blob 存储器,我们可以扩展我们的 Seldon 部署的yaml
-文件以包含explainer
部分:
有了这个,我们就可以向一个端点发送格式为:https://[URL]/sel don/[space]/[name]-explainer/default/API/v 1.0/explain 的请求,我们会收到一个包含每个像素对分类贡献的响应。对给定的样本进行可视化,我们会得到如下的图,显示哪些像素导致了给定标签的给定阳性分类。
使用测试集中的示例图像调用/explain 端点,并绘制返回的解释
结果图显示了发送到解释终点的样本(左)和像素属性(右)
这种方法非常有效,我们可以看到,该模型将重点放在了敏感像素上,以便进行预测。
14.部署治理
重要的是,并非所有用户都可以访问给定的部署模型——基本上,最小特权原则应该始终适用:允许人们做他们需要做的事情,仅此而已。例如,我们可能不希望财务部门的人在一个模型周围闲逛,这个模型是根据 R&D 部门的高度机密数据训练出来的。幸运的是,Kubernetes 周围有很多工具可以解决这些问题,例如,在我们的例子中,我们使用托管 Azure 集群和 Ambassador 例如,我们可以使用 Azure AD 来认证我们的端点;查看此链接了解更多详情。这些安全方面的细节超出了本文的范围,但是解决方案肯定是有的。
就治理而言,一个有趣的复杂情况是,最终端点上的访问权限应该与 Databricks/mlflow 中的模型注册中心内设置的权限一致,因此需要实现一些额外的工具来紧密同步这些权限。这种工具的细节也不在这篇博文的讨论范围之内。
15.数据中心性
最后但可能是最重要的一点是,我们如何改变 MLOps 的主要焦点,使其远离模型、性能、监控等。,并返回到数据。任何在数据科学领域工作过的人都知道,系统地提高数据质量、一致性和广度(涵盖边缘情况)将比追求更复杂和更花哨的模型带来更好的模型性能。
如何构建以数据为中心的 MLOps 管道是一个有点悬而未决的问题,答案取决于使用情形,但一些观察结果如下:
- 反馈监控、漂移检测和异常值识别的实现已经分别告诉了我们一些关于我们的模型在特定新样本上表现如何、它们与我们已经观察到的有多大不同以及我们是否应该怀疑新样本的准确性的信息。在重新训练我们的模型之前,这些是需要记住的重要指标;例如,如果我们确定某个样本是异常值(例如,传感器损坏),我们就不应该将其包含在我们的重新训练中,对于我们知道旧模型表现不佳的样本,我们可能应该在添加到我们的数据集之前进行更彻底的调查。
- 在一些我们可以选择收集什么数据的应用程序中,可以部署一个适合贝叶斯优化的附加模型;这样,部署的模型可以指导用户收集哪些额外的数据点。
- 类似于根据反馈进行重新训练,我们可以很容易地想象这样一种场景:我们收到了如此多的新数据,以至于重新训练模型实际上会提高性能,即使旧模型的性能并没有衰退。因此,不仅模型性能的变化将决定我们何时重新训练,而且可用训练数据的变化也将决定我们何时重新训练。
结论
我经常被希望引入其最新和最棒的 MLOps 框架的公司接洽,仅基于营销材料来评估每种框架的利弊可能相当困难。正如我希望这篇文章所展示的那样,实现一个全面的 MLOps 框架绝不是一项简单的任务,有许多需要考虑的事项和缺陷需要考虑。
本帖中提出的概念验证解决方案涵盖了本帖中提出的 15 个原则的相当多的方面,除此之外,正在讨论的系统(mlflow + Seldon)支持许多其他概念,这些概念也可能与给定的 MLOps 解决方案相关。然而,mlflow+seldon 的解决方案绝不是完美的,当我在这个框架中调试部署以使它们工作时,我不得不经历许多困难。在理想的场景中,我希望数据科学家能够专注于实现符合一些 python 接口实现方法的 ML 模型,如predict()
、feedback()
、drift()
、outlier()
、transform()
等。,然后能够按下一个绿色的“部署”按钮,启动一个自动化的管道,将接口容器化,并部署具有本文中讨论的所有功能的 ML 模型。要求普通市民数据科学家编写和调试 Kubernetes 部署(以及工件部署以保护 blob 存储等。)不太现实。此外,以这种手动方式进行新模型的每一次部署,对我来说似乎都不可扩展或者非常不容易,如果突然需要多人来将一个模型投入生产,就更不容易了。
一种设想是实现一种工具,将 mlflow 与 Seldon-core 更紧密地联系起来。该工具将负责确保只有符合适当接口的模型才能被推送到 mlflow 模型注册中心中的“生产”阶段,并且一旦模型被提升到生产阶段,该工具将负责确保模型得到部署,权限从 mlflow 传播到 Kubernetes,监控功能正常,等等。这种工具的愿景与我在博文中没有过多提及的最后一个原则联系在一起,那就是*自动化的原则。*从本质上来说,MLOps 框架要被认为是“完整的”,它应该包含我们在 DevOps 等领域看到的所有最佳实践,并自动化所有可以通过代码自动化的事情。
虽然我不认为 mlflow + Seldon 是一个“无缝”的 MLOps 框架,但我确实认为它代表了一个强有力的组合,并且我认为两者都是非常棒的工具。在一天结束的时候,我没有看到一个全面的 MLOps 系统是微不足道的,因此,在我的书中,所提出的解决方案是开源的这一事实是一个巨大的好处,因为这意味着我们可以很容易地自己填补任何缺失的漏洞。
在本系列的下一部分中,我将介绍如何结合使用 Databricks 和 BentoML 来为最终用户创建一个无缝的设置:
SQL 连接入门
使用示例学习左连接、内连接、自连接
为了执行高级分析处理和数据发现,一个表通常不足以带来有价值的见解,因此将多个表组合在一起是不可避免的。SQL 作为与关系数据库通信的工具,提供了在表之间建立关系的功能。本文介绍了如何使用 SQL 将表链接在一起。如果你想学习更多关于 SQL 的基础知识,我建议你读一读我的第一篇关于用日常语言学习 SQL 的文章。它为绝对初学者提供了全面的 SQL 介绍。
为什么我们需要学习 SQL 连接
也许你还没有意识到,我们也经常遇到加入 Excel。这是通过 VLOOKUP 函数实现的,如下所示。VLOOKUP 函数允许我们执行一列的匹配,并从另一列返回相应的参考值。在这种情况下,我们可以通过将国家代码与国家代码表中的 fips 代码进行匹配,找到与每个标准相关的国家名称。
excel 中的 vlookup(图片由作者提供)
当一个表中的信息不够时,我们可能会遇到许多这样的情况。SQL join 使用完全相同的逻辑,但是它更强大,因为它匹配并合并两个或更多的表,而不是两列。在下一节中,我们将深入探讨如何使用 SQL 来解决这个问题。学习 SQL join 还有一个很实际很现实的原因就是面试!没错,SQL join 几乎是任何一个数据科学家或者数据分析师面试中不可避免的问题。有些问题比较理论化,比较露骨,“能告诉我左连接和内连接的区别吗?”;还有的比较实际含蓄“能不能写一个 SQL 语句,找到这个员工的经理的名字?”所以这给了你另一个理由去学习和区分每一种连接的实现。
如何创建联接
SELECT <attributeName>, <attributeName>, <attributeName>, ...
FROM <TableA>
<LEFT|INNER|FULL OUTER|...> JOIN <TableB>
ON <TableA.commonAttribute> = <TableB.commonAttribute>
SQL join 遵循这个语法,我把它分成三个部分: 1)选择属性和表;2)确定连接条件;3)选择合适的连接类型。
属性和表格
和其他 SQL 语句一样,需要以SELECT <attribute> FROM <table>
的形式指定属性和表名。但是不同之处在于需要连接多个表。如果相同的属性名称存在于多个表中,那么简单地通过名称引用属性将是不明确的,因为数据库不确定您从哪个表中选择该属性。为了解决这个问题,我们需要使用表名作为属性前缀。
例如,如果名称属性同时存在于客户和国家表中,我们只选择客户名称。然后我们将该属性称为“ Customer.name”。
连接条件
表通过至少一个公共属性连接在一起。这个公共属性通常被称为外键。如 excel 示例所示,VLOOKUP 函数也利用了这个共享属性。我们使用这个共享属性(外键)作为匹配点,在这里我们可以找到另一个表中每一行的相应信息。这个公共属性需要作为 SQL 语句中的连接条件显式地表示出来。
国家代码示例(图片由作者提供)
让我们继续这个国家代码的例子。本练习的目的是在“Google_Ads_GeoTargets”表中找到每个标准的国家名称。这些数据集来自谷歌公共数据集。如果有兴趣,可以尝试在 BigQuery 中实现它。
在左侧表格中,我们已经获得了每个标准的国家代码,并且国家代码表格为我们提供了国家名称 fips_code 。因此,逻辑是将 GeoTarget 表中的 country_code 与 Country_Code 表中的 fips_code 进行匹配,找到对应的名称。 country_code 和 fips_code 是建立两个表之间关系的公共属性。
我们写下下面的语句来表示连接条件。注意,最好使用表名作为属性前缀,并且不要忘记关键字“on”:
ON Google_Ads_GeoTargets.country_code = Country_Code.fips_code
连接类型
还有五种主要的连接类型:左连接、内连接、全连接、自连接、和交叉连接。为了与数据库通信,我们需要在语句中显式或隐式地指示连接类型。这是通过使用关键字“左连接”、“内连接”或“全外连接”等实现的。每种类型都有其独特的用例。希望下面的比较能帮助你区分它们的细微差别。
1。左接合
左连接与 excel 中的 VLOOKUP 最相似。右边的表可以被看作是一个参考表或者一个字典,从这里我们扩展了左边表中存储的现有知识。因此,采用左连接来返回左表中的所有记录,并从右表中引用相应的值。左连接还可以让我们更深入地了解为什么有些值找不到匹配项。例如,是因为左表中的记录不正确或打字错误,还是因为右表中的数据不完整?
我们用这个语句生成左连接结果如图所示:
SELECT criteria_id, country_code, country_name, fips_code
FROM Google_Ads_GeoTargets gt
LEFT JOIN Country_Code cc
ON gt.country_code = cc.fips_code;
左连接结果(作者图片)
来自 Google_Ads_Geo_Targets 的所有行都作为结果返回,即使有些行与 Country_Code 表不匹配(因此返回 null)。
你可能想知道为什么大部分时间都没有必要使用右连接。这是因为右连接可以通过交换表的方向和执行左连接来实现。
此外,右表往往被视为一本参考书。在这种情况下,Country_Code 表被视为一个引用或字典。没有必要返回所有 fips_codes 的匹配。想想我们碰到一个新单词的情况。我们会在字典中找到这个单词的意思,而不是在字典中查找每个单词来匹配我们所输入的单词。范围将过于宽泛和模糊。
2。内部连接
当我们对表的交集感兴趣时,内部连接很有用。因为它只显示存在于两个表中的记录,所以内部联接通常返回最少的行数。如下面的结果所示,所有空值都被过滤掉了。我们使用 INNER JOIN 关键字来表示这种连接类型:
SELECT criteria_id, country_code, country_name, fips_code
FROM Google_Ads_GeoTargets gt
INNER JOIN Country_Code cc
ON gt.country_code = cc.fips_code;
内部连接结果(图片由作者提供)
3。完全外部连接
完全外连接覆盖两个表中的每一行,不管是否找到匹配。它用于全面掌握存储在两个表中的信息,并找出任何不匹配的地方。在本例中,第一行对于 country_name 和 fips_code 显示为 null,因为在 Country_Cod e 表中没有匹配的 fips_code = “AZ” 。另一方面,最后一行没有 criteria_id 和 country_code ,因为在 Google_Ads_GeoTargets 表中没有带有 country_code = “ZA” 的标准。
完整的外部连接结果(图片由作者提供)
要写下完整的外部联接语句,请执行以下操作:
SELECT criteria_id, country_code, country_name, fips_code
FROM Google_Ads_GeoTargets gt
FULL OUTER JOIN Country_Code cc
ON gt.country_code = cc.fips_code;
4。自连接
自连接意味着将表链接到自身,我们应用它来处理一元关系。这是强大的创建层次关系,例如,雇员和经理,类别和子类别等。最终,它仍然可以被看作是将两个表连接在一起。
员工示例(图片由作者提供)
我用一个员工的例子来解释自我加入。在这个例子中,如果我们想要找到每个雇员的经理姓名,我们需要使用一个自连接来找到每个雇员的经理的姓名,并且我们使用 managerID 来派生该姓名。在 ERD 图中,manageid 被表示为外键,因为它是从 employeeID 中借用的。
员工示例 ERD(图片由作者提供)
SELECT e.employeeID AS employee ID, e.name AS name, m.name as manager
FROM Employee e
LEFT JOIN Employee m
ON e.managerID = m.employeeID
如 ERD 中所示,我们可以将经理表视为雇员的子集,因此这种自连接相当于将雇员表左连接到其子集经理。连接条件是雇员表中的经理 ID 需要等于经理表中的雇员 ID ,因此 e.managerID = m .雇员 ID 。对于自连接,我们仍然需要考虑什么是连接类型。在这种情况下,我们希望显示所有员工记录,即使他们没有经理(例如,员工 3 和 6),因此需要一个左连接。值得注意的是,需要对表进行重命名,以清楚地表明您引用的是哪个表中的哪些属性。此外,我们可以使用 AS 关键字将属性重命名为可读的内容。
自连接结果(图片由作者提供)
5。交叉连接
我会说交叉连接是最不合理的连接,因为它没有任何连接条件。
SELECT criteria_id, country_code, country_name, fips_code
FROM Google_Ads_GeoTargets gt
CROSS JOIN Country_Code cc;
交叉联接将一个表中的每一行与另一个表中的所有行进行匹配,如下例所示。带有 criteria_id = “1000998” 的地理目标标准与 Country_Code 表中的所有记录匹配。下表并不详尽,但我们可以计算出总共有 42 行(7 行谷歌广告标准 x 6 行国家代码)。当表中有重复的行时,我们可能会意外地创建交叉连接。因此,在预处理数据时,消除重复行是非常重要的。我将在下一篇文章中更详细地解释这一点,如果感兴趣,请继续关注:)
交叉连接的计算成本很高,应尽可能避免。我能想到的唯一用例是在两个表中填充所有记录的组合,例如,size x color。如果您对交叉连接用例有任何建议,请在下面评论。
交叉连接插图(图片由作者提供)
交叉连接结果(图片由作者提供)
带回家的信息
本文的主要内容是将 SQL 连接归结为三个步骤:
- 选择表和属性
- 2.确定连接条件
- 3.从左联接、内联接、自联接和完全联接中选择适当的联接类型
希望这篇文章能帮助你通过结合表格将基本的 SQL 技能提升到更高级的分析。
相关文章
https://www.visual-design.net/post/learn-sql-in-everyday-language https://www.visual-design.net/post/five-data-science-podcasts-to-follow-in-2021
原载于 2021 年 1 月 4 日 https://www.visual-design.net*。*
让你的人工智能道德方法论透明化
从道德实践的“为什么”到“如何”
照片由 Anh Vy 在 Unsplash 上拍摄
所以你已经听说了人工智能伦理及其在构建符合社会价值观的人工智能系统中的重要性。你选择踏上将负责任的人工智能原则融入你的设计、开发和部署阶段的旅程,可能有许多原因。但是,我们之前在这里讨论过这些,你会在其他地方找到大量的文献来阐述为什么你应该这样做。
我想花点时间谈谈你应该怎么做。我想专注于其中的一个方面:你的人工智能伦理方法论的透明度。
我认为有一个非常强有力的理由来说明为什么我们需要对我们的人工智能道德方法论保持透明,特别是因为它将帮助你更好地定位自己,以在高度竞争的环境中吸引稀缺的人工智能人才,展示成熟度,提高客户信任,并降低反馈障碍。
因此,让我们深入到这些领域中的每一个,并了解你的人工智能道德过程透明的好处:你会做得更好,你将能够做得更多!
1.在有限人工智能人才的竞争中胜出
正如 ElementAI(现在是 ServiceNow 的一部分)的全球人工智能人才报告中多次提到的那样,人工智能人才继续向世界上的某些地区倾斜。即使在这些地区,人口也高度集中在少数几个地区,人口构成非常有限,导致了多样性问题。进一步加剧所有这些问题的是,那些不是最大的人工智能公司的有限能力,无法吸引和留住能够创造和提供功能良好、高性能人工智能系统的顶级人才。另一个需要考虑的方面是,我们目前对西方伦理方法论的关注要比对伦理框架的考虑更加全球化和多样化。
但是,这不应该成为绝望的理由!
越来越多的证据表明,技术专家正在认识到他们的工作对社会的影响,因此,它可以成为一个区分因素,让你展示你拥有人工智能道德方法论,即使它是新生的,因为它有助于求职者筛选出并专注于与他们的价值观一致的机会。
有时,组织选择保持他们的人工智能道德过程的私密性,通常是因为他们不确定它会被如何看待,以及他们是否会因为它的当前状态而受到惩罚。然而,它可以为求职者提供一个关于你正在做的工作的强烈的市场信号。你计划做的工作可能会帮助你的组织与更大的组织竞争类似的工作,但不同的是,你会思考如何以一种审慎的方式管理你的工作的社会影响。
因此,它可以帮助您用同样多的资源做更多的事情,并通过吸引关心这些问题的顶级人才来帮助您走得更远!
2.展示成熟
阻碍组织的事情之一(除了对法律后果的担忧之外)是他们对他们的过程缺乏信心,并且害怕他们可能被认为是不成熟的,尤其是在过程开发和利用的早期阶段。
使流程公开透明展示了组织的成熟度,也有助于您学习并与您所在行业的同行组织分享最佳实践。这是一项团队运动,我们不会有一个单独的组织能够独自找出所有的答案。对你的过程保持透明,并分享它在哪里工作,在哪里失败,将有助于整个生态系统更快地成熟,帮助你在负责任的人工智能工作中走得更远,更有效。
3.提高客户信任度
当客户四处寻找他们可以雇佣的不同公司为他们工作时,比如说引入外部专业知识来帮助将人工智能能力注入他们现有的产品中,有许多选项可供选择。事实上,这些选择与日俱增!
那么,当顾客在四处观望时,我们如何用我们的产品吸引他们呢?
这些客户中的一些人关心他们的工作对社会的影响,随着他们的用户和客户表现出更强的意识并使用他们的钱来支持他们的信念,越来越多的组织开始关注这一点。
通过对你的人工智能道德方法论保持透明,你向正在寻找合作伙伴的客户发出了一个明确的信号,即你不仅在名义上关心这些想法,而且已经给予足够的思考来将这些想法付诸实践。在过去的几年里,我们已经看到了很多很多的文档出现谈论原则,但是很少关注实施策略,这是生态系统中的参与者注意到并呼吁的事情。
事实上,我即将出版的新书《 可操作的人工智能伦理 》正在帮助人工智能从业者弥合这一鸿沟!
你可以具体地提升客户的信任,这将对你的组织的底线产生直接影响,并利用这一点作为在你的组织中吸收和组织人工智能道德努力的号角。这是一种很好的方式来提高你的工作的影响(从社会的角度来看),并帮助你建立长期的可持续性,因为你的客户信任你做正确的事情,他们可以通过你实施的人工智能道德流程来验证这一点。
4.降低反馈障碍
当你的过程透明时,征求和接受反馈就变得更加容易。
征求反馈变得更加容易,因为人们可以在你的流程中提出他们的反馈,他们可以评估这是否有效。这也清楚地表明,你有反馈渠道,表明你对你的过程有信心,并致力于随着时间的推移改善它。对于那些希望提供反馈的人,他们知道在哪里可以这样做,这是建立用户和客户信任的另一个途径。
正如我们从上面的讨论中看到的,让你的人工智能道德方法论透明化有很多好处:
- 在有限人工智能人才的竞争中胜出
- 展示成熟
- 提高客户信任度
- 降低反馈障碍
我强烈建议你走这条路,把你的人工智能道德反馈透明化!我总是乐于与你进行简短的交谈,就你的过程向你提供建议,并从什么有效和什么无效中学习。不要犹豫,通过蒙特利尔人工智能伦理研究所联系我。
我很乐意听到更多关于你正在做什么来将你的组织的人工智能道德方法论公开化,以及如果这些点是你已经付诸实践的事情。
在这里注册以获得关于可操作的人工智能伦理书的更新!你可以在这里了解更多关于我的作品!
你可以通过订阅人工智能伦理简报从蒙特利尔人工智能伦理研究所了解更多这样的见解!
让您的 Conda 环境在 Jupyter 笔记本电脑上展示——简单的方法
(还有一些其他方式……)
美国宇航局在 Unsplash 拍摄的照片
当我第一次开始使用 Jupyter 笔记本时,我花了比我愿意承认的更长的时间来弄清楚如何让我的 conda 环境内核显示在内核列表中。当我成功时,我并不满意,因为我希望它是自动的。像大多数事情一样,一旦你知道怎么做,两者都很简单。
下面我将展示三种方法,每种方法都最适合特定的场景。
方法 1:“简单的方法”
这是我的首选方法,因为它简单。新环境会自动出现(只要它们安装了ipykernel
。)
在撰写本文时,
nb_conda_kernels
还不支持 Python 3.9。这只会影响我们的基本环境,我们在任何工作中都不会用到它,对吗?😃.您的其他环境可以使用任何 Python 版本,包括 3.9。
最初,您的内核列表(在 Change kernel 下)将只显示您当前的环境。
作者图片
要让您的其他环境内核自动显示:
1.首先,在您的基础环境中安装nb_conda_kernels
。一旦安装完毕,任何从基础环境运行的笔记本都会自动显示任何其他安装了ipykernel
的环境的内核。
(base)$ conda install nb_conda_kernels
2.接下来,创建一个新环境。我会叫我的new-env
。如果您已经有了一个想要在 Jupyter 笔记本上展示的环境,请跳过这一步。
(base)$ conda create --name new-env
3.激活您想要在笔记本中使用的环境,并安装iypkernel
。我的环境叫new-env
。如果您已经有了一个环境,用您的环境名称代替new-env
(base)$ conda activate new-env(new-env)$ conda install ipykernel
4.从您的基本环境重新启动 Jupyter 笔记本电脑,完成。你可以在这里看到我所有安装了 ipykernel 的环境,包括new-env
都显示出来了。我现在可以随意在它们之间切换。极乐世界。
作者图片
方法二:“通常的方式”
单独注册您想要在内核列表中显示的每个环境并不难。如果您有许多环境,这可能更好,因为它允许您注册和取消注册您的环境内核,这有助于保持列表整洁。
- 记下您的环境正在使用的 python 的位置。一些 os/python 版本组合引入了一个路径问题,如果你知道它的存在,这个问题很容易解决。
(new-env)$ which python
/opt/homebrew/Caskroom/miniforge/base/bin/python <- yours may be different.
2.在您的新环境中安装ipykernel
(new-env)$ conda install ipykernel
3.检查您的 python 位置。
(new-env)$which python
/opt/homebrew/Caskroom/miniforge/base/bin/python
如果 python 位置与第一步中的位置不匹配,您需要在继续之前停用并重新激活 conda 环境。
(new-env)$conda deactivate new-env
(base)$conda activate new-env
(new-env)$which python
/opt/homebrew/Caskroom/miniforge/base/bin/python <- this should match step 1
2.使用下面的命令向 Jupyter 注册内核规范。--name=
参数将为这个环境的内核设置您在 Jupyter 笔记本上看到的名称(因此您可以随意命名它,但是使用环境的名称可能是明智的)。
(new-env)$ipython kernel install --user --name=new-env
3.现在new-env
将会显示在你的内核列表中(不需要重启 Jupyter Notebook——只需要在你的浏览器中重新加载页面)。
作者图片
4.当您想要取消注册内核规范(从可用内核列表中删除环境内核)时,使用以下命令:
$jupyter kernelspec uninstall new-env
方法三:“快速肮脏的方法”
这个方法实际上并没有让你的环境在 Jupyter 笔记本上显示出来,但是值得注意。如果你在任何环境中安装jupyter
并从该环境中运行jupyter notebook
,笔记本将使用活动环境中的内核。内核将以默认名称Python 3
显示,但是我们可以通过执行以下操作来验证这一点。
- 激活您的环境,安装
jupyter
,运行jupyer notebook
。
(base)$ conda activate new-env
(new_env)$ conda install jupyter
(new_env)$ jupyter notebook
2.在您的笔记本中运行以下代码,以确认您使用的是正确的内核
import os
print (os.environ['CONDA_DEFAULT_ENV'])
作者图片
结论
最后,你如何选择在 Jupyter Notebook 中与你的内核交互应该基于你的特殊需求,而不是缺乏关于你的选择的信息。希望这篇文章有助于消除后面的。
去做好事吧。
参考资料:
我觉得这个栈溢出答案的评分不够高(去投上一票吧,以示对 lumbric 贴上回答自己问题的答案的一点爱)。这是我对这个主题最初理解的基础。
https://stackoverflow.com/questions/58068818/how-to-use-jupyter-notebooks-in-a-conda-environment
将您的双脚浸入 Power BI
数据科学工具
微软分析工具的实践介绍。
雅各布·鲍曼在 Unsplash 上的照片
作为一名数据科学家,你迟早需要学会适应分析工具。在今天的帖子中,我们将深入学习 Power BI 的基础知识。
请务必点击图片,以便更好地查看一些细节。
数据
我们将在今天的实践教程中使用的数据集可以在https://www . ka ggle . com/c/insta cart-market-basket-analysis/data找到。该数据集是“一组描述客户订单的相关文件。"下载 zip 文件,并将它们解压缩到本地硬盘上的一个文件夹中。
下载 Power BI 台式机
如果你还没有,去 https://powerbi.microsoft.com/desktop点击“免费下载”按钮。
如果你使用的是 Windows 10,它会要求你打开微软商店。
继续并点击“安装”按钮。
让我们点击“启动”按钮开始吧。
一千次点击
出现闪屏时,点击“获取数据”。
截图来自埃德纳林·c·德·迪奥斯
你会看到很多文件格式和来源;让我们选择“文本/CSV”并点击“连接”按钮。
选择“order_products_prior.csv”并点击“打开”按钮。
下图显示了数据的样子。单击“加载”按钮将数据集加载到 Power BI Desktop 中。
通过选择“获取数据”并在下拉菜单中选择“文本/CSV”选项来加载数据集的其余部分。
您应该将这三个文件加载到 Power BI Desktop 中:
- order_products_prior.csv
- orders.csv
- 产品. csv
您应该会在 Power BI Desktop 的“Fields”面板上看到以下表格,如下所示。(注:图像显示的是报表视图中的电量 BI。)
截图来自埃德纳林·c·德·迪奥斯
让我们点击 Power BI 桌面左侧的第二个图标,看看数据视图是什么样子。
现在,让我们看看模型视图,在这里我们将看到不同的表是如何相互关联的。
如果我们将鼠标悬停在某一行上,它会变成黄色,相应的相关字段也会高亮显示。
在这种情况下,Power BI Desktop 很聪明地推断出了这两种关系。然而,大多数时候,我们必须自己创造关系。我们将在以后讨论这个话题。
让我们回到报告视图,仔细检查“可视化”面板。寻找“切片器”图标,它看起来像一个正方形,右下角有一个漏斗。单击它可以向报告添加一个可视化内容。
在“Fields”面板中,找到“department_id”并单击其左侧的复选框。
截图来自埃德纳林·c·德·迪奥斯
这将导致“部门标识”字段出现在“字段”框中的“可视化”面板下。
接下来,将鼠标光标悬停在报告视图的右上角。点击出现在角落的三个点,如下所示。
在出现的下拉菜单中点击“列表”。
当“department_id”视觉对象被选中时,您应该会看到指示该视觉对象为活动视觉对象的角标记。当“department_id”处于活动状态时,按 CTRL+C 复制它,然后按 CTRL+V 粘贴它。将新的视觉效果移到原始视觉效果的右侧。
通过单击第二个视觉对象内部的某个位置来激活它。然后在 Power BI Desktop 右侧的“Fields”面板中查找“aisle_id”字段,如下所示。
尝试在“部门标识”上选择一个值,并观察“通道标识”上的选择如何相应变化。
截图来自埃德纳林·c·德·迪奥斯
截图来自埃德纳林·c·德·迪奥斯
现在,再次检查“可视化”面板,并点击如下所示的表格可视化。
在“字段”面板中,选择“产品标识”和“产品名称”,或者将它们拖到“值”框中。
Power BI Desktop 看起来应该类似于下图。
这一次,尝试从“department_id”和“aisle_id”中选择一个值,观察右边的表格视图会发生什么变化。
让我们通过复制和粘贴表格视图来创建另一个视图。这一次,选择(或拖动)以下字段到可视化的“值”框中。
- 订单 id
- 用户标识
- 订单编号
- 订单时间
- 订单 _dow
- 天数 _ 自 _ 前 _ 顺序
Power BI Desktop 现在看起来应该类似于下图。
尝试单击可视表格中的一个选项(显示“product_id”和“product_name”),并观察右侧表格如何相应变化。
为了仔细观察,通过点击如下所示的图标激活聚焦模式。
截图来自埃德纳林·c·德·迪奥斯
该表显示了订单的详细信息,这些订单包含您在表中选择的带有“产品 id”和“产品名称”的产品
点击“返回报告”退出聚焦模式,如下所示。
让我们通过右键单击页面名称(“第 1 页”)并选择“重命名页面”来重命名此页面或选项卡
键入“产品”并按回车键。
让我们通过再次右键单击页面名称(“产品”)并选择“复制页面”,向报告添加另一个页面或选项卡
将新页面重命名为“TRANSACTIONS ”,并删除(或移除)最右边的包含订单详细信息的表。
更改左上角的视觉效果,并更新字段,如下所示。当左上角的图标被激活时,“Fields”框应该显示“order_dow”。
移动视觉效果,使其看起来与下图相似。
截图来自埃德纳林·c·德·迪奥斯
对下一个画面做同样的事情。这一次,选择“order_hour_of_day ”,您的 Power BI 桌面应该会像下图一样。
截图来自埃德纳林·c·德·迪奥斯
对最后一个表做最后一次同样的操作,现在它应该包含如下所示的字段。
让我们通过单击报告主工作区底部的“+”图标,向报告添加另一个页面或选项卡。
基础探索
在“可视化”面板中,选择“堆积柱形图”
拖动移动手柄来调整图表的大小。
确保“轴”框中分别包含“order_dow”和带有“order_id”的“值”框。Power BI Desktop 应自动计算“order_id”的计数,并将该字段显示为“order_id 计数”,如下所示。
上图很有趣,因为它显示了第 0 天和第 1 天的订单数量较高。
让我们再做一个图表。
我们将遵循添加图表的相同步骤,这一次,我们将在“轴”框中使用“order_hour_of_day”,如下所示。
该图显示了订单数量的峰值时间。
最后一张图!
我们将在“轴”框中添加另一个带有“days_since_prior_order”的图表。
最后一个图是最有趣的,因为再订购的数量在这三个时间段达到峰值:自前一次订购后的 7 天、14 天和 30 天。这意味着人们习惯于每周、每两周、每月补给一次。
就这样,伙计们!
在下一篇文章中,我们将“美化”我们的图表,使它们对其他人更具可读性。
上面的程序已经被拉长了。但是如果你是一个初级的 BI 用户,不要绝望!通过定期练习,本文中演示的概念将很快成为你的第二天性,你很可能在睡梦中也能做到。
感谢您的阅读。如果你想了解更多关于我从懒鬼到数据科学家的旅程,请查看下面的文章:
如果你正在考虑改变方向,进入数据科学领域,现在就开始考虑重塑品牌:
敬请期待!
获得有趣的机器学习项目
机器学习项目会给你更多的技术实践经验
来自 Pexels 的 Jules Amé 的照片
我们现在生活在一个越来越被机器学习、人工智能、物联网等新兴技术主导的时代。
特别是机器学习,它已经影响了我们所有人的生活,并在许多方面比我们想象的更聪明。由于它的人气飙升,我们今天使用的大多数数字服务都以这样或那样的方式依赖于机器学习,这使它成为最好和最有用的技术之一。
如果你也对机器学习的能力印象深刻,并且已经开始了解它,为什么不更进一步,在常规的理论方法之外,还包括一种更实用的方法呢?
在本文中,我们将分享 10 多个机器学习项目,这些项目将让您对该技术有更多的实践经验,从本质上加快您的学习。
机器学习项目
当你在学习技术的过程中,你一定会问自己为什么要从事一个实用的机器学习项目。
答案在于软件开发的本质。任何软件开发人员都必须通过尝试开发现实世界问题的实用解决方案来深入他们正在学习的技术,机器学习也是如此。
尽管实际上有成千上万的应用程序在使用机器学习,但为了帮助你 开始使用技术 ,我们在下面列出了一些对初学者友好的应用程序。
1.鸢尾花分类 ML 项目
凯文·卡斯特尔在 Unsplash 上拍摄的照片
鸢尾花分类是另一个简单的机器学习项目,适合初学者。这个项目通常被视为最古老也是最简单的机器学习项目,现在它已经获得了“Hello World”的称号。军情六处的世界。
鸢尾花分类项目主要处理根据其萼片和花瓣的宽度和高度将鸢尾花分类为该项目使用的三个物种之一,即 Setosa、Versicolor 或 Virginica。
该项目还鼓励 ML 新手掌握构建机器学习应用程序的最基本步骤之一,即加载和处理数据。该项目的数据集也非常轻量级,包含大约 150 个示例,可以帮助您训练分类模型,而不用担心内存限制。
- 你可以从 GitHub 获得源代码。
- Iris 数据集也可以从 UCI ML 资源库下载— Iris Flowers 数据集。
2.使用智能手机数据集的人体活动识别
现代智能手机配备了一系列传感器,可以检测环境光、运动等一系列事情。智能手机、智能手表、平板电脑和智能手环都使用这些传感器来识别用户试图做什么,当与智能软件配合使用时,它们可以非常准确地建议适当的行动。这个有趣且对初学者友好的项目是围绕同样的想法建立的。
在人类活动识别项目中,您将学习如何构建一个分类模型,该模型将尝试预测用户正在进行的身体活动,如跑步、步行、骑自行车以及许多其他活动。
该项目的数据集是从智能手机的加速度计和陀螺仪中捕获的,涵盖了坐、站、走、上楼下楼和躺等活动。它是经过预处理的,所以你不需要在它上面花费任何时间。一旦经过训练,您应该能够更准确地预测用户活动。
你也可以利用这些数据在健身或医疗保健领域建立一个有趣的项目。
3.BigMart 销售预测 ML 项目
Artem Beliaikin 在 Unsplash 上拍摄的照片
机器学习还能够对数据集执行销售预测,这是您将在本项目中学习的内容。这个对初学者友好的项目将教你无监督机器学习算法如何工作,以及你如何使用它们来预测企业的销售。
您将使用 2013 年的 BigMart 销售数据集,其中包含 10 家不同商店的 1500 多种产品的数据。数据集包含所有产品的特定属性,如脂肪含量、MRP、重量、出口尺寸、出口位置等。
**就像 BigMart 一样,**这个数据集可以帮助你了解他们产品的各种属性,同时还可以指出在提高他们的整体销售额方面发挥关键作用的商店。这里的目标是建立一个回归模型,预测未来几年 10 个销售点的所有 1500 多种产品的销售额。
您可以在此访问销售数据集。
4.了解社交媒体帖子背后的“情绪”
数百万人使用社交媒体分享他们对各种话题的看法,使这些平台成为一个极其庞大和多样化的数据收集宝库。
您可以将所有这些数据用于一个名为情绪分析的有趣的 ML 项目。它本质上分析了社交媒体帖子背后的人们的情绪,并确定他们是积极的还是消极的。
**以 Twitter 为例,**每秒钟它都会收到成千上万条包含各种数据的推文,比如位置、姓名、想法、标签、用户名等等。
你把所有的数据放在一起,你会有一个数据集,你甚至可以用它来研究一个正在进行的趋势,或者发现人们对任何给定主题的看法。企业可以利用这个项目来改进他们的产品、客户服务,甚至计划他们的下一次产品发布。
关于情感分析的 TEDx 演讲—
5.股票价格预测
我们名单上的下一个最热门的 ML 项目来自金融领域,涉及预测企业的股票价格。
根据一个组织在现实世界中的成功,它的股票价格可能会非常频繁地上涨或下跌。为了更好地预测他们的股票价格,组织总是在寻找可以有效做到这一点的现代工具。
幸运的是,ML 驱动的股票价格预测工具能够轻松地进行股票价格预测。这些工具通过使用数据集来工作,这些数据集考虑了一系列过去的股票相关数据,如开盘价和收盘价、交易量、波动指数和许多其他价格因素。
简而言之,这些股票价格预测工具分析一个组织过去和当前的全部表现来预测他们股票的未来价格,这也使他们能够将任何潜在的风险降至最低。
6.使用 Movielens 数据集的电影推荐
推荐系统已经成为所有主流媒体提供商的最爱,如网飞、亚马逊、Hulu、苹果,甚至更多。
这些推荐系统是使用大量的 ML 算法 构建的,这些算法向用户建议他们接下来可能想看什么。该系统所要做的就是分析你喜欢什么类型的电影,你看了多少,以及一些其他因素。之后,他们会开始向你推荐更多由底层 ML 算法推荐的电影。
有大量的数据集可以用来创建这样的推荐系统,而 MovieLens 数据集 就是其中之一。MovieLens 数据集由超过 2500 万个电影评级和超过 100 万个标签应用组成,涵盖由 16.2 万个用户创建的超过 6.2 万部电影。如果您想尝试创建推荐系统,我们建议您尝试一下 MovieLens 数据集。
另一个好的推荐系统是 Youtube 趋势视频统计。
7. MNIST 手写数字分类
机器学习已经用于一系列涉及语音、图像和文本识别的项目,这个项目也来自类似的类别。
在这个项目中,你将学习如何训练你的机器学习模型识别手写数字。在这个项目中,你将使用一个巨大的手写数字数据库,以及机器学习以简单易懂的方式提供的各种其他学习和模式识别技术。
为了使这个项目更轻便,更适合新手,它使用了一个 MNIST 或修改的 NIST 手写数字数据库,可以轻松地加载和处理,而不用担心任何预处理和格式化。
MNIST 或修正 NIST 数据库在其训练集中包含大约 60000 个手写数字示例,在其测试集中包含大约 10000 个示例,这应该足以让您开始您的第一个模式识别项目。您可以在此访问 MNIST 数据集。
8。假新闻检测
互联网在向数百万人提供各种新闻和有用信息方面发挥着关键作用,但当今互联网上最常见的问题之一是假新闻。
在像 ML 和 AI 这样的技术到来之前,任何一条编造的新闻都会像野火一样在互联网上传播,在人民中间造成大量的恐慌和混乱。
但现代的 ML 和 NLP 解决方案已经变得足够强大,可以筛选大量的新闻,以识别和阻止任何假新闻到达更多的用户。如果所有这些对你来说都很有趣,你绝对会喜欢这个项目。
在这里,您将使用朴素贝叶斯分类器构建一个模型,它将进行文本分类,并将真实的新闻与虚假的新闻分开。对于数据集,你可以从互联网上的真实和虚假的新闻数据集中挑选。
9.乳腺癌预测
近年来机器学习的改进已经允许它广泛用于医疗保健行业,以预测和检测几种疾病,其中之一是癌症。
乳腺癌,特别是,是一种非常常见的癌症,影响了全球许多女性,虽然治疗是可能的,但很大程度上取决于疾病的早期检测。
这就是乳腺癌预测项目的由来。这个 ML 项目旨在教授如何使用像线性支持向量机、高斯朴素贝叶斯、 k 近邻和 C 分类和回归树这样的技术来创建一个基于给定数据的模型,该模型将能够预测症状是否会导致乳腺癌。
数据集中已经提供了半径、纹理、平滑度、对称性、凹度、面积等所有特征,以便您开始使用。
10.房价预测项目
Terrah Holly 在 Unsplash 上拍摄的照片
对任何人来说,买房都是最具挑战性的决定之一,这背后的原因很简单。除了价格本身,还有许多因素要考虑。
你有小巷类型,地段面积,街道类型,土地坡度,屋顶风格,基础类型,屋顶材料,中央空调系统,围栏质量,以及 64 个其他类似的复杂变量,我们大多数人经常忽略。
在这个机器学习项目中,你将使用 ML 中的回归技术建立一个模型,例如随机森林和梯度推进,以准确预测各种房屋的最终价格。您可以从 Kaggle 获得数据集,它将涵盖训练数据和测试数据,以帮助最大化模型的整体准确性。
房价预测项目数据集—
11.葡萄酒质量预测
照片由 Hernán Santarelli 从 Pexels 拍摄
葡萄酒鉴赏家总是在寻找葡萄酒的完美混合,但这听起来很容易,实际上很难。当然,葡萄酒的年份对它的味道影响很大,但这里还有许多其他因素需要考虑。讨论的因素包括固定酸度、密度、pH 值、酒精含量、氯化物等。
在这个项目中,您将构建一个 ML 模型,该模型将使用分类和回归技术,通过分析葡萄酒的化学特性来预测葡萄酒的质量。这个有趣项目的数据集覆盖了 4800 多个实例,共有 12 个属性。
https://medium.datadriveninvestor.com/regression-from-scratch-wine-quality-prediction-d61195cb91c8
结束…
看看 ML 驱动的应用程序在野外越来越受欢迎,现在很明显为什么开发人员急于通过添加少量机器学习来使他们的应用程序更加智能。像世界上大多数开发人员一样,如果你也好奇了解机器学习及其好处,你也应该专注于获得对事物的实际理解以及它们的理论理解。
本文中列出的项目在以适合每个人的方式提供机器学习所有方面的实践经验方面做得非常好。尽管机器学习提供的实际好处非常多,但上面提到的项目应该能够让您开始将 ML 部署到您的应用程序中。
了解你的作者
克莱尔 D 。是 Digitalogy 的内容设计师和战略家,他可以将你的内容想法转化为清晰、引人注目、简洁的文字,与读者建立强有力的联系。
使用 K 个最近邻的分类介绍
一种逐步建立 KNN 分类器的方法
作为机器学习实践者,我们会遇到各种各样的机器学习算法,我们可以利用这些算法来建立特定的预测模型。在本文中,我将重点介绍最复杂的学习算法之一,即 K 近邻算法。该算法可用于处理最大似然法中的回归和分类问题。
在这篇文章中,我将首先尝试给你一个什么是算法的直觉,以及它如何做出预测。然后,我将尝试分解与该算法密切相关的某些重要术语,最后,在本文结束时,我们将使用 KNN 算法设计自己的分类器。
在开始这篇文章之前,我建议你看一下我的以前的文章,我在那里讨论了各种学习算法。此外,如果你喜欢这篇文章,请考虑为这篇文章鼓掌,并确保关注我的更多机器学习食谱。这篇文章的 PDF 副本可以从这里下载,继续你的离线学习。
算法背后的想法
假设你从一个装满金属球的袋子里随机选择一个球,这些金属球要么是金的,要么是碳的。为了区分球是由金还是碳制成,你可以检查它的颜色、导电性、沸点和熔点。这些被称为特征。利用这些特征,我们可以确定球属于哪一类。这类似于 KNN 分类算法的工作原理。
图片由丹尼斯·巴克豪斯拍摄
KNN 算法是一种简单、一致但通用的监督学习算法,可用于解决分类和回归问题。它本质上可以被视为一种算法,该算法基于训练数据集中与其接近的其他数据点的性质来进行预测。
也就是说,简单地说,分类器算法通过计算输入样本和最接近输入样本的 k 个训练实例之间的相似性,输出对象最有可能被分配到的类别。它假设相近的值存在。KNN 经常被认为是一个懒惰的学习者,因为它不学习判别函数。
当很少或没有关于数据分布的信息时,通常使用这种算法。此外,该算法本质上是非参数化的,这意味着它不对数据或其总体分布模式做出任何潜在假设。
图片来自 covartech.github.io
因此,KNN 算法不需要训练时间。然而,无论何时将该算法投入使用,它都需要搜索整个数据集以找到 K 个最近邻。该算法主要用于设计推荐系统和执行分析评估。
KNN 选粉机的引擎盖下
通常,解决分类问题的复杂部分是找到要使用的正确算法。不同的算法适用于不同类型的数据。KNN 算法一般用于小于 100K 标记非文本数据样本的数据集,一般在 LinearSVC 无法投入使用时使用。
如前所述,KNN 是一种监督学习算法,可用于处理回归和分类问题。在这篇文章中,我们将集中在 KNN 分类器。
图片来自 JournalDev
分类器将训练数据作为输入,并输出对象预期所属的类。该对象被分配给其大多数相邻实例所属的类。
KNN 中的 K 分类器
KNN 中的 k 是一个参数,指的是包含在决策过程中的特定数据点的最近邻居的数量。这是核心决定因素,因为分类器输出取决于这些相邻点的大多数所属的类别。
考虑如果 K 的值是 5,那么该算法将考虑五个最近的相邻数据点来确定物体的类别。选择正确的 K 值被称为参数调整。随着 K 值的增加,预测曲线变得更加平滑。
图片来自康奈尔 CS
默认情况下,K 的值为 5。没有找到 K 值的结构化方法,但是 K 的最佳值是数据集中存在的样本总数的平方根。K 的值通常取为奇数值,以避免决策过程中出现平局。误差图或精度图通常用于寻找最合适的 k 值。
KNN 的距离度量
KNN 使用各种不同类型的距离度量来计算距离。为了使算法有效工作,我们需要选择最合适的距离度量。其中一些指标如下所述:
- **欧几里德距离:**这是 sklearn KNN 分类器使用的默认度量。它通常被称为 L2 规范。它计算欧几里得空间中两点之间的普通直线距离。
图片来自 Packt 订阅
- **曼哈顿距离:**通常被称为城市街区度量,在这种情况下,两点之间的距离是它们的笛卡尔坐标的绝对差,并且在高维度的情况下使用。
- **汉明距离:**该指标用于比较两个二进制数据字符串,通常与 OneHotEncoding 一起使用。它查看整个数据集,并发现数据点何时相似或不相似。
既然我们已经讨论了 KNN 分类算法的理论概念,我们将应用我们的学习来使用 K 最近邻算法构建一个分类器。用于构建这个模型的代码和其他资源可以在我的 GitHub 句柄中找到。
步骤 1:导入所需的库和数据集
构建分类器的第一步是导入将用于构建分类模型的所有必需的包。首先,我们将导入 Pandas、Numpy、Seaborn 和 Matplotlib 包。
***#Importing the Required Libraries and Loading the Dataset*** import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt%matplotlib inline
dataset = pd.read_csv("Iris.csv")
在这个例子中,我们将尝试使用各种特征,如花瓣长度、花瓣宽度、萼片长度和萼片宽度,对鸢尾花进行分类。我们在选择模型参数时需要非常小心,因为 KNN 对要使用的参数非常敏感。
图片来自兰卡斯特大学
一旦导入了所有这些库,下一步就是获取数据集。用于建立这个模型的数据可以从这里下载。read_csv()函数用于将数据集加载到笔记本中。用于该模型的数据集可以从这里下载。
第二步:数据分割和标签编码
加载数据集后,下一步是将数据分割为要素和标注。在机器学习中,特征是作为输入提供给系统的独立变量,而标签是我们试图预测的属性。
***#Dividing Data Into Features and Labels*** feature_columns = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
X = dataset[feature_columns].values
y = dataset['Species'].values***#Label Encoding*** from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
图片来自 ResearchGate 的 Danilo Bzdok
KNN 分类器不接受字符串标签,因此有必要在对数据建模之前对这些标签进行编码。标签编码器用于将这些标签转换成数值。
步骤 3:可视化数据集
在构建分类模型时,可视化数据集是一个重要的步骤。这使得理解数据和寻找数据中隐藏的模式变得更加容易。Python 有一系列可以用来可视化数据的包。
***#Visualizing Dataset using Pairplot*** plt.figure()
sns.pairplot(dataset.drop("Id", axis=1), hue = "Species", size=3, markers=["o", "s", "D"])
plt.show()***#Visualizing Dataset using Boxplot*** plt.figure()
dataset.drop("Id", axis=1).boxplot(by="Species", figsize=(15, 10))
plt.show()
Matplotlib 是 Python 中静态绘图的基础。Seaborn 是最流行的绘制视觉上吸引人的图形的库之一,它建立在 Matplotlib 之上。Matplotlib 和 Seaborn 就是这样的两个软件包,它们用于在各种不同类型的图表上绘制数据。
图片来自MagratheaGabriela Moreira Mafra
Matplotlib 的网站包含了多个文档、教程和大量的例子,这使得它的使用更加容易。箱线图、Pairplot 和 Andrews 曲线是几种最广泛使用的数据可视化图形,可用于绘制图形以可视化分类问题。
第四步:分割数据集并拟合模型
选择所需的参数并可视化数据集后,下一步是从 sklearn 库中导入 train_test_split,该库用于将数据集拆分为训练和测试数据。我们将把数据集分成 80%的训练数据和 20%的测试数据。
***#Splitting the Data into Training and Testing Dataset*** from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)***#Fitting the Model and Making Predictions*** from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix, accuracy_score
from sklearn.model_selection import cross_val_score
classifier = KNeighborsClassifier(n_neighbors=3)
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
在这之后,KNeighborsClassifier 从 sklearn.neighbors 包中导入,并且使用设置为 3 的 k 值实例化分类器。然后将分类器拟合到数据集上,并使用 y _ pred = classifier . predict(X _ test)对测试集进行预测。
图片来自sumunosato . koukodou . or . jp
由于在本例中,要素处于相同的数量级,因此不对数据集执行任何要素缩放。但是,建议在拟合分类器之前对数据集进行归一化和缩放。
第五步:评估预测并交叉验证
评估分类算法预测的最简单和最常用的技术是通过构建混淆矩阵。另一种方法是计算模型的准确度分数。
***#Confusion Matrix*** confusion_matrix = confusion_matrix(y_test, y_pred)
confusion_matrix***#Calculating Model Accuracy*** accuracy = accuracy_score(y_test, y_pred)*100
print('Accuracy of the model:' + str(round(accuracy, 2)) + ' %.')
图片由 Dmytro Nasyrov 从媒体获取
***#Performing 10 fold Cross Validation*** k_list = list(range(1,50,2))
cv_scores = []
for k **in** k_list:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy')
cv_scores.append(scores.mean())***#Finding Best K*** best_k = k_list[MSE.index(min(MSE))]
print("The optimal number of neighbors is **%d**." % best_k)
评估输出预测后,下一步是为参数调整执行多重交叉验证。在这里,我们正在进行十倍交叉验证,以找到 k 的最佳值。
KNN 分类器的优势
KNN 分类器是最复杂和应用最广泛的分类算法之一。使该算法如此流行的一些特征如下所述:
- KNN 没有对这些数据做出任何潜在的假设。
- 与许多分类算法相比,它具有相对较高的精度。
- 随着更多数据点的添加,分类器不断进化,能够快速适应输入数据集中的变化。
- 它为用户提供了选择距离度量标准的灵活性
图片来自 Milliams
KNN 分类器的局限性
虽然分类器有多种优点,但它也有一些严重的局限性。其中一些限制如下所述:
- KNN 对异常值非常敏感。
- 随着数据集的增长,分类速度会变慢
- KNN 没有能力处理缺失的价值观。
- 由于高存储要求,它在计算上是昂贵的。
总结你所学的知识
为了总结我们在本文中学到的东西,首先我们看一下算法背后的思想及其理论概念。然后,我们讨论了参数“K ”,并了解了如何找到 K 的最佳值。之后,我们回顾了各种距离度量指标。
图片来自 Piyush Pathak
然后,我们应用我们的学习来建立 KNN 分类器模型,以对各种植物物种进行分类,然后我们通过浏览分类算法的优点和局限性来支持我们的学习。
至此,我们已经到了这篇文章的结尾。我希望这篇文章能帮助你对 KNN 算法的工作原理有所了解。如果你有任何问题,或者如果你认为我犯了任何错误,请随时与我联系。通过电子邮件或 LinkedIn 与我联系。快乐学习!
让人工智能玩 atari Pong,进行深度强化学习
详细的指导
首先我们统治 pong,接下来,世界…
让一个计算机程序学习如何玩 Atari 游戏似乎是一项非常困难的任务。好吧,我来告诉你…它是什么。但是相信我,如果我能做到,你也能。本页假设你已经通读并稍微理解了深度 RL 的理论(链接在下面)。但是要注意,理论不足以让代理学习雅达利!有了强化学习,一切都在实施中,魔鬼就在细节中!因此,这篇文章的其余部分将集中在一行一行地实现代码,以使我们的代理工作。
实施:
为了实现,我们将使用开放的人工智能健身房环境。对于代理的神经网络,我将使用 Keras 建立一个 CNN。我们将首先处理 Pong,然后在另一篇文章中,我们将让代理玩 breakout(这需要花费更多的时间来训练)。真的要慢慢来,通读我的代码,了解发生了什么。
此外,如果你没有一台功能强大的电脑,我强烈建议你在 google colab 上做这个项目。如果你不知道 google colab 是什么,那就谷歌一下看看吧!他们免费为你提供 GPU 和 CPU 来运行代码。
这里的策略是。我们从 openai 健身房收到当前的游戏画面。来自 4 个最近帧的像素值的张量是我们的当前状态(稍后将详细介绍)。基于ε贪婪策略,我们要么采取随机行动,要么将我们的当前状态输入 CNN 以获得我们的行动。现在我们采取行动,获得奖励,并被带到一个新的状态。我们将(S,A,R,S’)值存储在内存中用于训练。在每个动作之后,我们从我们的代理的内存中随机抽取数据,并使用我们在关于深度 RL 理论的文章中导出的损失函数来训练我们的代理。
一个快速打开的人工智能健身房教程
开放人工智能健身房是一个充满雅达利游戏(在其他游戏中)的图书馆。这个库很容易让我们测试我们的理解,而不必自己构建环境。在你导入健身房后,我们将只使用其中的 4 个功能。这些功能是:gym.make(env)、env.reset()、env.step(a)和 env.render()。
- gym.make(env): 这只是从 open ai gym 中获取我们的环境。我们将调用 env = gym . make(’ PongDeterministic-v4 '),这表示我们的 env 是 Pong。
- env.reset(): 这将环境重置回它的第一个状态
- env.step(a): 通过执行动作 a 在环境中前进一步,返回下一帧、奖励、完成标志和信息。如果 done 标志== True,那么游戏结束。
- env.render(): env.render()显示代理在玩游戏。在检查代理的性能时,我们将只使用 env.render()。我不认为这在谷歌 colab 或任何其他笔记本上行得通,尽管我可能是错的。因此,您可能需要保存代理的权重,然后将它们加载到您的本地计算机上,并在那里渲染游戏。
下面是如何实现这些函数的代码示例:
预处理帧
目前,从 openai 接收的帧比我们需要的大得多,分辨率也比我们需要的高得多。见下文:
我们不需要底部的任何空白,也不需要顶部白色条纹上方的任何像素。此外,我们不需要这个是彩色的。
首先,我们裁剪图像,以便只显示重要的区域。接下来,我们将图像转换为灰度。最后,我们使用 cv2 和最近邻插值来调整帧的大小,然后将图像数据类型转换为 np.uint8
生成的图像如下所示:
提供方向信息
站在代理的角度想想,看看下面的框架:
现在,球在朝哪个方向移动…没办法知道。我们只能知道位置,因为我们只有一个时间步长。仅仅在一帧中提供的信息不足以知道方向。如果给定两个时间步长,我们可以知道球的速度,如果给定三个时间步长,我们可以知道加速度,等等。
回想一下,我们的帧是像素值的矩阵。为了将方向信息添加到我们的输入中,我们可以简单地将我们的帧堆叠在一起以形成张量。假设我们的帧的形状是(84,84),如果我们将最近的 4 帧堆叠在一起,我们的状态的形状将是(84,84,4)。所以在游戏中的时间 t,我们当前的状态是 t,t-1,t-2 和 t-3 的帧的堆栈。
代理内存
在我开始实现代理内存之前,我想解释一下最初是什么激发了研究人员使用它。
当我第一次接触这个项目时,我试图使用实时生成的数据来训练代理。所以在时间步长 t,我将使用时间(t-1)的(S,A,R,S’)数据来训练我的代理。
我能解释这个问题的最好方法是回到我大学的早期。在我大二的时候,我连续一年被灌输静力学理论(我学的是机械工程)。然后在我大三的时候,我对静力学一无所知,相反,我被迫接受了机器设计。到了高三,我已经忘记了所有关于静力学的事情。
在我们的环境中,可能有 100 帧球移动到屏幕的左侧。如果我们在完全相同的情况下反复训练我们的代理,那么最终它会过度适应这种情况,它不会推广整个游戏,就像我在学习机器设计时忘记了静力学一样。
所以,我们将所有的经历储存在记忆中,然后从整个记忆列表中随机抽取样本。通过这种方式,代理从学习他在培训时的所有经验,而不仅仅是他的当前情况(为了更好地击败这匹死马,想象一下如果你不能从过去学习,而只能从现在学习)。
好了,现在开始实施。对于内存,我用 4 个独立的 deques 创建了一个独立的类(固定大小的先进先出列表)。列表包含帧、动作、奖励和完成标志(它告诉我们这是否是一个终止状态)。我还添加了一个函数,允许我们添加到这些列表中。
add_experience 中 next_x 的古怪命名稍后会变得清晰
环境
接下来,我们开始实施我们的环境。我通过创建 4 个函数来做到这一点;
- Make_env()
- 初始化 _ 新 _ 游戏()
- take_step() …这是所有奇迹发生的地方
- 播放 _ 剧集()
在深入细节之前,我将展示代码,以便您能够理解。
make_env() 函数是不言自明的。它只是调用 gym.make()函数。
initialize_new_game() 函数重置环境,然后获取开始帧并声明一个虚拟动作、奖励和完成。现在,这个数据被添加到我们的内存 3 次。记住,我们需要 4 帧来完成一个状态,这里添加了 3 帧,最后一帧添加在 take_step()函数的开始处。
take_step() 函数有点复杂。我将在下面列出伪代码:
- 更新代理总时间步长
- 每 50000 步节省重量
- 现在,我们使用代理的动作列表中的最后一个动作调用 env.step。这将返回下一帧、奖励、完成标志和信息
- 调整下一帧的大小,并从最后 4 帧中获取下一个状态。
- 使用下一个状态获取下一个动作。这就是为什么我们能够在步骤 3 中使用代理动作列表中的最后一个动作
- 如果游戏结束,则返回分数和一个终止标志
- 将这段经历加入记忆
- 如果调试,渲染游戏。我们不会使用它,但我发现它在尝试让它工作时很有用。
- 如果代理的内存包含足够的数据,那么让代理从内存中学习。稍后将详细介绍。
- 返回代理分数和一个错误的终端标志
正如您所看到的,这个函数与代理类一起工作了很多。这个类将很快介绍。
play_episode 函数非常简单明了。这个函数只是初始化一个新游戏,调用 take_step 函数,直到返回一个真正的终端标志。然后返回剧集评分。
代理类
这个类有 5 个函数,包括构造函数。这些函数是:init()、_build_model()、get_action()、_index_valid()和 learn()。
build_model() 函数只是为代理构造一个 CNN。请注意,CNN 中没有 max_pooling 图层,因为池化消除了一些所需的空间信息。我使用 Huber 损失和 Adam 初始化器。
get_action() 函数只是 greedy 的一个实现。我们生成一个随机数,如果它小于我们的ε值,我们就采取随机行动。如果没有,那么我们将当前状态传递给 CNN 并返回最大输出。
_index_valid() 函数是学习函数的助手。它只是检查在给定的索引处,在我们的内存的过去 4 帧中是否有一个终止帧。我们不想创造一个介于两个游戏之间的状态。
在我解释 learn 函数之前,您可能已经注意到了该类的 model_target 属性。这是一种用于降低训练噪音的方法。基本上,我们复制我们的 CNN,所以我们现在有了我们的模型,和我们的模型目标。现在,回想一下,在训练时,我们将下一个状态输入到 CNN 中,以帮助生成误差函数的目标。注意,在权重被更新之后,误差函数中的目标将会改变,因为 CNN 被用于生成该目标,并且 CNN 权重刚刚被改变。
下面是我们损失函数的一个提示:
V(t+2)是我们的神经网络的输出。所以如果我们更新一次权重,那么 V(t+2)会有一点变化。这意味着我们的目标在移动,这在实践中被证明是低效的。
有人在谷歌有一个想法,我们可以使用目标模型来生成我们的损失函数的目标,然后我们经常只是设置目标模型的权重到我们的主模型的权重。所以他们尝试了一下,它提高了性能,减少了培训时间(这就是我在这里实现它的原因)。
现在我们来看一下 learn() 函数。我们将用 32 个迷你批次来训练我们的 CNN。
- 我们的第一步是收集 32 个状态、next_states、actions、rewards 和 done 标志。
- 我们通过模型传递状态,通过目标模型传递下一个状态。我们从模型中得到的输出将在下一步中被修改,因此它可以用作我们的 Vtrue。
- 现在,对于迷你批处理中的每个状态,我们首先要弄清楚采取了哪个操作。然后我们计算采取这个动作的真实值,并用这个真实值替换输出值。 not next_done_flags[i] 代码只是确保如果我们处于终止状态,则不考虑下一个奖励。此外,伽玛被称为贴现因子。这只是让当前的奖励比未来的奖励更有分量。Gamma 可以取出来,不用担心弄坏代理。
- 现在,我们使用我们创建的状态和标签来拟合我们的模型。
- 现在更新 epsilon 和代理学习了多少次
- 每 10,000 步将模型权重复制到目标模型
对代理人来说就是这样。学习功能是我第一次尝试这个项目时出错的地方。所以如果你有困难,先检查这里。
main.py
现在是我们最后的文件。我不打算在这里详细介绍,这个文件是不言自明的。只需初始化代理和环境,然后循环调用 play_episode()函数。偶尔打印出一些有用的指标,每 100 集我打印出一个图表,显示得分的移动平均值。在对我的代理人进行培训后,我意识到根据采取的步骤而不是玩的游戏来绘制分数会更有用。如果你正在重新创建这个项目,我建议每 10,000 步左右标一次分数。
总结:
你可以在这里找到完整的、完成的项目。训练持续了大约 24 小时。最后的结果就是这篇帖子顶部 gif 中右边的代理。
我第一次这样做花了几个星期。这确实是一个困难的项目。如果你有困难,真的要花时间去理解理论,通读我的代码。
这种特殊的 RL 算法被称为深度 Q 学习。深度 Q 学习通常被视为深度 RL 的介绍,但它不是最有效的算法。我最喜欢使用的算法是 A2C,我将在以后的文章中介绍它。
但在此之前,让我们证明这个算法有多酷。我曾经把这个展示给一个朋友看,他说,“你就不能硬编码一下球拍,让它跟着球走吗”。尽管他是对的,但这个项目的酷之处不仅仅在于我们用它来玩乒乓球。就是经纪人学会了打 pong。这个算法是迈向通用人工智能的一步。证明我们已经获得某种程度的通用人工智能的一个方法是,看看这个智能体是否可以学习多个游戏。我会在这里留下一个链接,说明如何让这个代理在完成后学习游戏突围。
作者所有图片、gif、代码片段!
感谢您的阅读!如果这篇文章在某种程度上帮助了你,或者你有什么意见或问题,请在下面留下回复,让我知道!此外,如果你注意到我在某个地方犯了错误,或者我可以解释得更清楚一些,那么如果你能通过回复让我知道,我会很感激。
熟悉 Rmarkdown HTML
使用 R 降价
我认为开始做任何事都不晚,除了成为一名芭蕾舞演员。~温迪·利伯曼
简介
R Markdown 最早发布于 2014 年。它是一个工具,为作者提供了一些强大的技术来将报告和分析合并到一个文档中。R Markdown 的官方网站声称这个工具可以用于可复制的文档,以优雅的格式放置叙述性文本和报告元素;使用像 R、Python 和 SQL 这样的语言。它允许作者以 HTML、PDF、Word、演示文稿甚至书籍或仪表板的形式生成组合报告。多年来,许多研究人员、分析师、内容作者、开发人员和软件程序员一直在不懈地发布文章、书籍和帖子,以熟悉研究和分析工作区中的这一强大工具。如果没有这些资源的贡献,从构思将该工具集成到分析表示中,到设置工作站和实际执行任务的过程是不可能的。其中一些将在文章中分享。
R Markdown 被认为在研究和学术领域被学生和教授广泛采用。项目、作业、论文或论文的提交需要在结合数据集、图表、表格、见解、统计结果以及数学方程方面付出大量努力。下图显示了过去 52 周几个关键 R Markdown 包的下载趋势。
图-1 rmakrdown,knitr,tinytex 的 52 周下载趋势。(闪亮 App 来源):链接
虽然通过减价来使用纯文本文档是为互联网用户创建格式良好的文档的关键,但由于多种原因,在企业工作区大规模采用这种做法可能会很麻烦。大多数公司的工作空间严重依赖于幻灯片,多个用户可以编辑和润色内容,而无需花费太多精力进行语法编码。幻灯片或办公工具允许不同类型和大小的内容众包来传达一个共同的信息。然而,如果一个作者主要使用像 R 或 Python 这样的开源编码平台,通过各种复杂的数据源来策划一个讲故事的练习,那么 R Markdown 可以为分析或科学文章提供几个这样的用例。
议程
在这篇文章中,我们将主要关注 R Markdown 用于生成 HTML 文档的一些快速而有用的特性。目标是分享一些可用于生成 HTML 输出格式的基本和扩展元素。我的目标不是出版一本有效的手册或食谱给读者,而是分享我在过去几周收集的快乐和挑战。不过在 RStudio 编辑器中使用 install.packages()函数预装这些包就好了; “rmarkdown “、” tinytex “、” gridExtra “、” kableExtra “、” summarytools “、” sjPlot “、” sjmisc “、” sjlabelled “、” stargazer” 。首先,无论如何,我们都将依赖这些实用程序来完成本文。
R 降价元数据
图-2 R 降价元数据。(图片来源) :图片来自作者
在 RStudio 中,如果我们遵循 File → New file → R Markdown,那么我们将得到一个创建 HTML 文档的选项,该选项是默认选中的。一旦我们单击“OK ”,我们将被定向到一个. rmd 脚本,其中元数据部分是自动填充的(由包含三个破折号的线分隔)。这种结构遵循 YAML 非标记语言(YAML)格式,它通过 R 进行通信,为 HTML 输出提供特定的结构指令。作者可以在引号内键入相关的标题、作者姓名和日期,这将允许 R Markdown 将它们放在文档的顶部。不像*标题,在双引号内键入姓名或日期并不是强制性的。*标题中的引用需要从文本中屏蔽冒号(😃。
下面的 YAML 元数据为 HTML 文档添加了标题、名称和当前系统日期。
图 3 元数据输出。(图片来源) :图片来自作者
还有更多在 PDF 格式中大量使用的元数据功能。 大多为 HTML 用例;在我们不需要为分页符而烦恼的地方,对自动填充的 YAML 的上述修改就足够了 。
代码块设置
三个连续的反勾号后跟一对以字母“R”开头的花括号,调用环境中的 R 编辑器。这必须以另外三个连续的倒勾结束。在此期间,作者可以编写代码块。setup 部分中声明的任何选项将优先用于流向整个文档的剩余块,除非在单个块中明确更改。设置选项是习惯性的,是文档特有的,是一次性的练习,也是很好的实践。我们不需要为同一个文档重复设置两次。include=FALSE 选项告诉设置不要在输出中包含代码块中的任何内容。warning=FALSE 和 message=FALSE 特别要求设置不要在 HTML 文档中包含来自 R 代码的任何警告消息。打开这些选项意味着作者想要打印代码中的所有内容。许多选项都有详细的记录,可以在这里找到。还有一个 echo=FALSE 选项,请求在输出文档中不包含源代码。我们将暂时在每个块中使用 echo 选项。
哈希和文本
图 4 使用多少个散列值?(图片来源) :图片来自作者
在定义与 R 或 Python 相关的代码块的反斜杠之外,作者可以使用“#”符号后跟一个空格来定义部分。散列越多,意味着章节标题的字体越小。根本不使用散列意味着简单的降价文本。
我遵循的一个非常快速简单的参考是这里的。它快速提醒我如何使用斜体、粗体、项目符号列表或编号列表。
包摘要工具
图 5 使用 dfSummary()在 HTML 中包含数据摘要。(图片来源) :图片来自作者
这个包在一个 HTML 报告 中显示数据集的有用的汇总统计数据。开发这个包的主要目标之一是确保通过 R Markdown 以 HTML 格式轻松呈现数据摘要。对于具有大量分类特征的数据集,通常需要在获得叙述性文本之前显示数据透视表的快照。这个包提供了一些其他的核心功能来满足这个目的。详细的链接是这里,如果渲染 HTML 看起来很有趣,你可以把它加入书签。接下来的几个数字会给你一个基本的外观和感觉,你可以根据自己的兴趣进一步美化。
图 6 使用 descr()在 HTML 中包含数值变量的单变量汇总。(图片来源) :图片来自作者
图 7 使用 freq()处理 HTML 中的分类变量。(图片来源) :图片来自作者
图 8 使用 stby()处理 HTML 中的分组摘要。(图片来源) :图片来自作者
stby()中的 INDICES 参数接受多个分组变量作为列表。
打包 kableExtra
图 9 在 HTML 中使用 kableExtra。(图片来源) :图片来自作者
这个包在使用 R Markdown HTML 时的意义是确保 时尚且格式良好的表格显示在输出 中。这个实用程序产生的结果的外观和感觉与我们通常在 R print()函数中看到的截然不同。这个实用程序的详细指南可以在这里找到,不用说,这个链接可以作为在 R Markdown 中编写语法的圣经。
显示回归表
图 10 在 HTML 中使用 tab_model()。(图片来源) :图片来自作者,(数据来源):链接
tab_model()允许作者在 HTML 文档 中显示格式良好的回归表。虽然无法将此工具用于 PDF 或 Latex,但如果需要,可以通过导入来使用图像。这个函数有更多的参数,你可以使用来检查?R 控制台中的 tab_model() 。请注意,在显示逻辑回归表时, tab_model() 已经自动将β系数转换为优势比,并显示了 95%的置信区间,无需额外的努力。当作者想要展示建模实践中两到三个最重要的迭代或者甚至展示最终的模型时,这个模型就派上了用场。tab_model() 也是线性回归表或其他形式回归的常用工具。这里的链接是在 R Markdown 中工作时的快速参考指南,我希望可以根据具体要求实现进一步的加速。
HTML 标签集
图 11 在 HTML 中使用标签集。(图片来源) :图片来自作者
{.tabset}参数允许在 HTML 文档中创建选项卡。当调整了正确的哈希数后,我们可以看到每个选项卡都可以作为一个单独的页面,在这里可以放置进一步的分析和叙述性文本。当我们想要呈现不同公司的类似分析或者一个特定公司的不同模型时,这个选项卡集布局是有用的。选项卡集布局有助于放置分组的结果或模型输出,以便最终用户阅读和导航。
结论
R Markdown 是一个很好的工具,可以为消费者生成可再现的分析图、表格、见解和图像。本文的目的不是鼓励 Office 套件和开源减价工具之间的任何争论。两者都有其独特的用法,并在提交分析结果时对作者有利。然而,随着 R 中如此强大的扩展的出现,R Markdown 为作者提供了过多令人兴奋的特性来管理分析的外观和感觉。不用说,对于每一个分析,编写语法来美化 HTML 文档中的输出将是有用的和经济有效的,幻灯片或单词仍可能赢得比赛。然而,在使用 R 或 Python 分析数据时,R Markdown 在增强分析师的工具箱方面取得了很大的进步。
除了栈溢出 Q & A forums 之外,本文中提供的超链接是我提到的最常访问的资源。请看一下谢一辉、克里斯托夫·德维约和艾米丽·里德雷尔写的 书 。然而,我还想提一下这篇文章,它是一篇很好的读物,激励我写这篇文章。
谢谢你。
熟悉 Rmarkdown PDF
元数据和引用
塞萨尔·阿布纳·马丁内斯·阿吉拉尔在 Unsplash 上的照片
如果你把一本书掉进马桶里,你可以把它捞出来,擦干,然后读那本书。但是如果你把你的 Kindle 掉到马桶里,你已经做得很好了。~斯蒂芬·金
一个作家的大部分时间花在阅读上,为了写作:一个人会为了写一本书而翻遍半个图书馆。~塞缪尔·约翰逊
简介
为分析表示创建 PDF 报告是学者、业务分析师或现代数据科学家的长期传统。自从 PowerPoint 动画问世以来,最近又引入了 PowerPoint 变形转换或幻灯片缩放功能,作者们一直致力于寻找更有效、更强大的方式来传达信息并获得更好的观众接受度。R Markdown 没有涉足动画领域。然而,在分析领域,复制科学期刊的格式,尤其是美国心理学协会(APA)的格式,对于提交重大项目工作供同行评审并不奇怪。此外,分析师或商业顾问总是希望能够以书籍的形式进行写作,以传达具有强大背景的分析,具有精确的目标,正确的证据碎片和强制性的结论。R Markdown PDF 允许作者将报告和叙述性文本结合起来,并将其放入 PDF 或书籍格式中,这对于在组织的分析功能中工作的非学者来说,确实比漫游癖更强烈。在阿拉伯,他们说“当狮子打喷嚏时,猫就诞生了”。如果假设商业分析师是一只在院士打喷嚏时创造出来的猫,那么对一只坐在牛奶旁边而不舔牛奶的猫的期望就太高了。对于一个分析从业者来说,写降价报告就像喝牛奶一样难,哪怕只有一次。
在上面的文章中,我们打算强调使用 R Markdown HTML 时的几个关键元素。在当前的文章中,我们将关注 R Markdown PDF,首先,我们将在查看 PDF 的主体之前关注元数据和引用。原因是元数据不仅定义了文档的结构,还定义了报告的开始部分。引用出现在文件的末尾,对于任何涉及一些研究工作的科学期刊来说都是强制性的。
注意:如果读者有过一些学术论文的经历,那么这篇文章并不打算区分作者的感知能力和实际能力。随时欢迎您的建议和经验。
议程
目标是分享一些可用于生成 PDF 输出格式的基本和扩展元素。我的目标不是出版一本有效的手册或食谱给读者,而是分享我在过去几周收集的快乐和挑战。不过在 RStudio 编辑器中使用 install.packages()函数预装这些包就好了;“rmarkdown”、“tinytex”、“gridExtra”、“kableExtra”、“stargazer”。首先,无论如何,我们都将依赖这些实用程序来完成本文。
R 降价元数据
LaTex 是学者、研究人员或大学生常用的工具。对于那些不知道的人来说,LaTex 是一个文档编写工具,可以用来编写复杂的数学方程、统计符号和假设。" LaTeX 是科学文献交流和出版的事实标准."(来源:乳胶 网站 )。R Markdown 可以通过“tiny tex”包和 pandoc 与 LaTex 工具通信。要了解更多关于 pandoc 的信息,你也可以访问他们的官方网站。如果一个人熟悉 LaTex 语法,那么 R Markdown 可以作为一个极好的平台来利用研究人员的统计计算、可视化和文档编写能力。然而,即使一个人与研究工作无关,并且处理任何领域的分析工作空间,R Markdown PDF 或 HTML 也可以作为一个很好的附加工具来升级现有的技能组合,以编写格式良好的报告。
图 pdf 输出的上半部分。(图片来源) :图片来自作者
图 pdf 输出的中下部。(图片来源) :图片来自作者
图 1 和图 2 显示了 pdf 输出的第一页。每个编号的框都是第一个代码片段中显示的元数据参数的结果。
第 1 个框是标题(标题:)。
第 2 个框是副标题(副标题:)。
第三个框是作者信息(作者:)。
第四个框是日期(日期:)。
第五个框由分析的摘要(摘要:)和关键字(\ textbf{Keywords:} )组成。
第六个盒子将保存目录( toc )。
第 7 个框保存确认(感谢)消息,最后,我们在第一页的右下角看到页码(编号 _ 部分:)。
管道(“|”)允许在同一参数中键入新的一行。
geometry 参数允许页边距宽度,以便在打印 pdf 时,作者不会因硬装订而丢失任何文本。
当为真时的 keep_tex 参数指示 pandoc 在输出文件中保留 LaTex 转换。
latex_engine 参数指示 pandoc 使用特定的 latex 引擎进行文档转换。像“*pdflatex”*和“*xelatex”*这样的引擎是最常用的。使用非英语语言或系统字体的作者更喜欢“ xelatex”。
fig_caption 参数指示 latex 引擎对 pdf 文档中的表格和图像/图表进行自动编号。例如,当插入第一个表格时,标题将从表-1 开始,因此第一个图或图像的标题为图-1。 fontfamily 参数选择文档的字体。
header-includes 下的 \usepackage{} 参数指示 tinytex 确保安装特定的 LaTex 包,用于编写数学方程和放置图形或表格。基本上,以上三个包大部分时间用于基本的 pdf 输出创建。还有一个程序创建一个 。工作目录中的 sty 文件 用于给出显式 LaTex 指令,这些指令可以在下的元数据中使用,包括 _header 参数中的和*。*
引文
重要的是要提及其作品启发了分析表示的想法和作者。在创建期刊或发表研究论文时,通常会特别注意在同行评审的输出中包含所有必要和正确的引用。事实上,这是审查机构打击剽窃的最重要的评估标准之一。APA 格式的最常见的引用指南和最新版本很容易在公开论坛上通过谷歌搜索获得。R Markdown 可以与 BibTex 格式无缝交互。每一份研究出版物都会附上一个 DOI ( 数字对象标识符),同时在他们的出版物库中发布作者的作品。这个标识符包含一些关于作者和作品种类的独特信息。
上面的网站可以将任何 doi 转换成一个等价的 BibTex 标识符,R Markdown 可以使用 citation_package 参数对其进行翻译和呈现。因此,如果你试图找到一个你已经有的 doi 的相应 BibTex,那么这是一个救命稻草。或者,如果你想获取某个谷歌学术期刊/书籍的 BibTex,你可以点击“双引号符号,然后点击 BibTex 链接。
图 3 如何从谷歌学术获得 BibTex。(图片来源) :图片来自作者
图 4 这是第二个片段的目录。(图片来源) :图片来自作者
图 5 这是第二个代码片段的第二页输出。(图片来源) :图片来自作者
本文所附的第一段和第二段代码的不同之处在于添加了书目:、书目样式:、链接引用:和 natbiboptions: 参数。的例子。当前工作目录中的 bib 文件包含了作者在文档中可能引用或不引用的所有引文。\ n site { * }参数通过 pandoc 明确指示 latex 引擎在 references 部分包含所有引用,而不管它是否在主体中被引用。[@ < id > ]语法允许作者在文档的叙述性文本中明确引用作品。文献目录文件中未明确引用的那些 id(即 bib 文件)将按照\ n site { * }显示在参考部分。如果不需要此功能,那么作者可以简单地删除\ n site { * }参数。
图 6 这是 example.bib 文件在记事本++ 中编辑时的样子。(图片来源) :图片来自作者
函数 write_bib() 在 R 控制台中打印机器中已安装软件包的 BibTex。文档链接在这里是。 wirte_bib()无法从出版网站获取学术文章或期刊的 BibTex。这仅用于获取安装在机器中的 R 包的 BibTex。
最简单的方法是从与分析相关的所有可能来源中逐一收集所有 BibTex 引用,将它们附加到一个单独的 Notepad++文件中,保存该文件,并将该文件及其扩展名重命名为 example.bib. R Markdown 无法识别。txt 文件,除非将其重命名为. bib.
结论
渲染 HTML 和 PDF 文档是两个不同的球赛。呈现 HTML 很简单,相对来说不那么费力,而且有其自身的局限性。另一方面,呈现 PDF 很费力,需要多次迭代才能看到文档是否放在作者想要的地方。在渲染 PDF 输出时,分页符和乳胶浮动对象的概念对初学者来说有很大的作用。然而,正如股市所说的“风险越大,收益越高”,一旦最初的几个项目结束,这种技能组合给分析师带来了很多快乐和满足。不推荐在没有 LaTex 广泛知识的情况下渲染 PDF 输出,但是,R Markdown 并不要求 LaTex 基础的先决条件。R Markdown 的强大功能和它的扩展包使得这种技术对于非学术界人士来说也是触手可及的,而不管它在日常演示中的大规模使用。渲染 PDF 的旅程相对较长,因为它涉及到更多的元素来管理最终输出。我同意,有时搜索数百个 Stackoverflow 问题来学习单个论点及其功能变得很单调。然而,我们的目标不是成为一名 LaTex 开发者,甚至不是 R Markdown 开发者。更大的目的是多花一点功夫来管理这个 husky 工具,以便能够在发送给同行评审时,从常规 Excel 或 PowerPoint 中脱颖而出,释放出一个封装良好的分析流。
在 R Markdown 中有多种方法来构造元数据以呈现 PDF,学习一些的最好方法是迭代不同的版本。虽然这对于学者来说可能不一样,但对于基础从业者来说,熟悉这个大力士的最好方法是熟悉 HTML 过程,然后谨慎地使用 PDF。像“rticles”这样的软件包已经提供了许多不同的模板来呈现 PDF,但是它并不能保证“一个尺寸适合所有人”的目的。我想分享一个来自 Pat Schloss 的视频,这可能会激励更多人。
谢谢你。