TowardsDataScience-博客中文翻译-2022-二十五-
TowardsDataScience 博客中文翻译 2022(二十五)
使用美国农业部 NASS API、Python 和 Tableau 采集和分析农业数据
数据工程、数据分析、农业和 Tableau
这篇教程文章将向您展示如何

照片由 Scott Goodwill 在 Unsplash 上拍摄
美国有幸拥有肥沃的土壤和庞大的农业产业。客观来看,2021 年,超过 200 万个农场在超过 9 亿英亩(3.64 亿公顷)的土地上运营。这相当于平均每个农场经营近 450 英亩。数据科学家、分析师、工程师和任何公众成员都可以自由地利用美国农业部(USDA)管理的超过 4600 万条农业相关数据记录。
本文“将向您展示如何使用 Python 通过 NASS 快速统计 API 检索农业数据。”—作者
美国农业部国家农业统计局(NASS)通过报告、地图、搜索工具和 NASS 快速统计 API,在的网站上向公众提供农业部的农业数据。这篇文章将为您提供 NASS 网页上可用数据的概述。然后,它将向您展示如何使用 Python 通过 NASS 快速统计 API 检索农业数据。最后,它将解释如何使用 Tableau Public 来可视化数据。
NASS 数据概述
NASS 在国家、州和县一级收集和管理不同类型的农业数据。以下是它存储和提供的一些数据类型:
- 农作物和植物
- 人口统计数据
- 经济和价格
- 环境的
- 家畜和动物
- 研究、科学和技术
NASS 通过 CSV 和 PDF 文件、图表和地图、可搜索的数据库、预定义的查询和快速统计 API 提供数据。它收集数据的一种方式是通过农业普查,对普查年度内生产或销售的产品达到或超过 1000 美元的所有农业活动进行调查。人口普查每五年进行一次,下一次将于 2022 年完成。
搜索 NASS 数据集
快速统计
NASS 让任何人都可以很容易地通过其快速统计数据库搜索网页检索它捕获的大部分数据。在下面的例子中,我使用 Quick Stats 构建了一个查询来检索美国从 2000 年到 2021 年收获的玉米英亩数。我只是通过从一系列动态下拉菜单中选择一个或多个项目来构建查询。
提示:点击图片查看完整尺寸的可读版本。

使用快速统计创建玉米查询。Randy Runtsch 截图。

从快速统计中的玉米查询得到的数据。Randy Runtsch 截图。
玉米产量数据可以追溯到 1866 年,就在美国内战结束一年后。然而,并不是所有的 NASS 数据都可以追溯到那么久以前。
NASS 还开发了 Quick Stats Lite 搜索工具来搜索其数据库中的商品。虽然它不能通过快速统计访问所有可用的数据,但您可能会发现它更容易使用。
普查数据查询工具
Quick Stats 和 Quick Stats Lite 检索农业调查数据(每年收集)和人口普查数据(每五年收集一次),而人口普查数据查询工具更容易使用,但只能检索人口普查数据。它可以为 77 个不同的表返回国家、州和地方级别的 2012 年和 2017 年人口普查数据。每个表都包含不同类型的数据。
在下面显示的示例中,我选择了人口普查表 1-明尼苏达州 2017 年农业普查的历史亮点。报告显示,在 2017 年的人口普查中,明尼苏达州有 68,822 个农场,占地 25,516,982 英亩。

明尼苏达州的农场经营。Randy Runtsch 截图。
NASS 快速统计 API 简介
现在你已经对 NASS 数据库中的可用数据有了基本的了解,你可以学习如何通过 NASS 快速统计 API 在你的项目中获得它的好处。通过快速统计应用程序编程接口(API),您可以使用编程语言(如 Python)从快速统计数据库中检索数据。事实上,您可以使用 API 来检索通过 Quick Stats search 工具和 Census Data Query 工具获得的相同数据,这两个工具在上面都有描述。
在开始使用 Quick Stats API 之前,请熟悉它的服务条款和用法。在使用 API 之前,您需要请求一个免费的 API 密钥,您的程序将在使用 API 的每个调用中包含这个密钥。

从 Quick Stats API 菜单,您可以访问开始使用所需的一切。Randy Runtsch 截图。
API 使用页面提供了其使用说明。虽然有三种类型的 API 查询,但本教程主要关注最灵活的查询,即“GET /api/api_GET”查询。它接受“what”、“where”和“when”参数的组合来搜索和检索感兴趣的数据。
虽然 Quick Stats 数据库包含超过 5200 万条记录,但是任何使用 GET /api/api_GET 查询的调用都被限制为 50,000 条记录的结果集。会返回更多记录的查询会返回错误,并且不会继续。
构建示例快速统计 API URL
下面是本文示例中将使用的基本 URL 的格式:
http://quickstats.nass.usda.gov/api/api_GET/?key=api关键字&{参数…参数} &格式={json | csv | xml}
请参见 Quick Stats API“使用”页面了解该 URL 和其他两个 URL。
在示例程序中,“ api 键的值将被替换为我的 api 键。此外,参数值可以用特定的参数值对来替换,以搜索所需的数据。最后,格式将被设置为“csv”,这是一种在 Tableau Public 中工作良好的数据文件格式类型。上面的例子中没有显示回调函数参数的使用,这超出了本文的范围。
下一节中展示的示例 Python 程序将调用带有一系列参数的快速统计数据。从服务器接收到 CSV 格式的数据后,它会将数据写入一个文件,每行一条记录。然后,该文件将被导入 Tableau Public,以显示数据的可视化效果。
该程序将使用 API 来检索从 1997 年到 2021 年全国范围内每种商品(一种作物,如玉米或大豆)使用的英亩数。下面是它将在 API 调用中提交以检索该数据的参数和值对:
- 资料来源 _desc =调查
- 部门 _desc =农场&土地&资产
- 商品 _desc =农场经营
- 单位 _desc =英亩
- desc 频率=年度
- 参考 _ 期间 _desc =年
- Year__GE = 1997(大于或等于 1997 的所有年份)
- State_name =美国总计
- 格式= CSV
下面是完整编码的 URL,下面的程序用 Quick Stats API 创建并发送。请注意,值“PASTE_YOUR_API_KEY_HERE”必须替换为您的个人 API 密钥。
http://quickstats.nass.usda.gov/api/api_GET/?KEY = PASTE _ YOUR _ API _ KEY _ HERE&source _ desc = SURVEY§or _ desc % 3d farms % 20% 26% 20 lands % 20% 26% 20 资产&商品 _ desc % 3d farm % 20 operations&statistics cat _ desc % 3d area % 20 operated&unit _ desc = ACRES&freq _ desc = ANNUAL&reference _ period _ desc = YEAR&YEAR _ _ GE = 1997&agg
每个参数都在“快速统计使用”页面的“快速统计列定义”表中进行了描述,如下所示。对于大多数列名或标题名值,第一个小写的值是 API 参数名,如上所示。括号中的名称是快速统计查询工具中使用的相同值的名称。例如,在上面显示的 API 参数列表中,参数“source_desc”等同于快速统计查询工具中的“程序”。

“快速统计 API 用法”页面上的“快速统计列定义”表命名并描述了可用于查询和结果的每个参数。作者截图。
调用快速统计 API 的 Python 程序
Python 编程工具
虽然我使用免费的 Microsoft Visual Studio 社区 2022 集成开发 ide (ide)来编写和运行本教程的 Python 程序,但请随意使用您最喜欢的代码编辑器或 IDE。如果你有兴趣尝试 Visual Studio 社区,可以安装在这里。如果使用它,一定要安装它的 Python 应用支持。安装 Visual Studio 后,可以随时添加语言功能集。
Python 代码
调用 NASS 快速统计 API 来检索农业数据的 Python 程序包括以下两个代码模块(文件):
- c_usad_quick_stats.py —该文件包含 c_usda_quick_stats 类,该类封装了使用快速状态 API 所需的代码。它的 get_data()函数调用 API,检索结果数据集,并将数据集写入 CSV 文件。
- run _ USDA _ Quick _ Stats . py—这个文件为快速统计 API 的调用准备参数。然后,它创建 c_usa_quick_stats 类的一个实例。最后,它使用参数和文件名调用实例,生成的农业数据 CSV 文件将保存在该文件中。
向下滚动查看两个模块的代码。以下伪代码描述了程序的工作原理:
- 在文件 run_usda_quick_stats.py 中创建 parameters 变量,该变量包含用于从快速统计数据库中选择数据的参数和值对。
- 创建 c_usda_quick_stats 类的一个名为 stats 的实例。这将调用其初始化器(init())函数,该函数设置 API 键、Quick Stats API 的基本 URL 以及该类将在其中写入包含农业数据的输出 CSV 文件的文件夹的名称。
- 使用参数字符串和输出文件的名称(不带扩展名)调用函数 stats.get_data()。
- 在 c_usd_quick_stats 的 get_data()函数中,创建完整的 URL。
- 从快速统计服务器检索数据。
- 解码 utf8 格式的数据快速统计数据。
- 创建完整的输出文件名。
- 打开输出文件。
- 将 CSV 数据写入输出文件。
- 关闭输出文件。
注意在步骤 1 中创建参数字符串时使用了 urllib.parse.quote()函数。该函数用转义码替换文本中的空格和特殊字符,转义码可以作为完整 URL 的一部分传递给 Quick Stats web 服务器。
还要注意,我是在 Windows PC 上编写这个程序的,它在文件名和文件夹名中使用反斜杠(" \ ")。因此,如果要在 Mac OS 或 Linux 上运行代码,可能需要更改文件路径值的格式,例如:self . output _ file _ path = r ' c:\ \ USDA _ quick stats _ files \ \ '。
以下是使用 Quick Stats API 检索农业数据的两个 Python 模块:
该计划检索数据与快速统计 API,并将其存储在一个 CSV 文件。由 Randy Runtsch 编写的代码。
运行程序
要运行这个程序,你需要安装 Python requests 和 urllib 包。在某些环境中,您可以使用 PIP 安装实用程序来完成此操作。如果你使用 Visual Studio,你可以按照微软的指示,通过 IDE 的菜单安装它们。
此外,在运行程序之前,在 c_usda_quick_stats 类的 init()函数中创建 self.output_file_path 变量中指定的文件夹。您也可以随意更改路径名的值。
如果您使用的是 Visual Studio,则将启动文件设置为 run_usda_quick_stats.py 文件,方法是在解决方案资源管理器中右键单击文件名,然后从弹出菜单中单击[设置为启动文件]。然后,当您单击[运行]时,它将首先使用该文件开始运行程序。
记得请求您的个人 Quick Stats API 密钥,并将其粘贴到 c_usda_quick_stats 类的 init()函数中 self.api_key 的值中。
完成上面列出的步骤后,运行程序。如果一切正常,那么它应该在几秒钟内完成,并将指定的 CSV 文件写入输出文件夹。
示例 Tableau 仪表板
为了演示使用 Quick Stats API 获得的农业数据,我在 Tableau Public 中创建了一个简单的仪表板。Tableau Public 是商业 Tableau 数据可视化工具的免费版本。它的主要限制是 1)它只能将可视化项目保存到 Tableau 公共服务器,2)世界上的任何人都可以看到所有的可视化项目,3)它只能处理少量的输入数据类型。

为本文创建的 Tableau 仪表板中的两个工作表中的第一个。使用 Quick Stats API 检索的数据,它显示了美国农场每年种植的商品(作物—本例中显示的是玉米)的种植面积。由 Randy Runtsch 创建的 Tableau 仪表板。

为本文创建的 Tableau 仪表板中的两个工作表中的第二个。使用 Quick Stats API 检索的数据,它显示了每年种植八种商品(作物)的面积,这八种商品消耗了美国最大的农田面积。由 Randy Runtsch 创建的 Tableau 仪表板。
样本 Tableau 仪表盘名为 美国按土地面积划分的农业商品产量 。请随意下载并在 Tableau 公共桌面应用程序中修改它,以了解如何创建和发布 Tableau 可视化。
如何使用 Tableau Public 的说明超出了本教程的范围。但是,以下是安装 Tableau Public 并构建和发布仪表板的基本步骤:
- 在 Windows 或 Mac OS 机器上安装 Tableau Public Desktop。如果有兴趣学习如何使用 Tableau,请点击查看免费互动培训视频。
- 打开 Tableau Public Desktop,并通过上述 Python 程序将其连接到使用 Quick Stats API 检索的农业 CSV 数据文件。
- 创建一个工作表,允许用户选择一种商品(玉米、大豆,选择的)并查看从 1997 年到 2021 年种植或收获的英亩数。
- 创建一个工作表,显示从 1997 年到 2021 年顶级商品的收获英亩数。
- 将这两个工作表添加到仪表板中。
- 将仪表板发布到 Tableau 服务器。

这张来自 Tableau Public Desktop 的截图显示了与文件 national _ farm _ survey _ acres _ ge _ 1997 . CSV 的连接,该文件是由本文中描述的 Python 程序创建的。屏幕显示文件中的样本记录。Randy Runtsch 截图。

这张来自 Tableau Public Desktop 的屏幕截图显示了名为“所有商品(按区域)”的工作表是如何创建的。请注意左侧 CSV 文件中的字段名称。Randy Runtsch 截图。
摘要
完成本教程后,您应该对以下内容有了大致的了解:
- 存储在 FDA 快速统计数据库中的农业数据类型。
- 如何查询数据库?
- 如何编写 Python 程序通过 Quick Stats API 查询 Quick Stats 数据库?
- 如何安装 Tableau Public 并了解它,如果您想尝试使用它来可视化农业数据或将其用于其他项目。
我可以想象许多使用 Quick Stats 数据库数据的项目用例。收集丰富的数据集为理解和发展提供了机会。
如何用气流设置 HashiCorp 保险库
原文:https://towardsdatascience.com/hashicorp-vault-airflow-cfdddab31ea
将 HashiCorp Vault 与 Apache Airflow 集成

介绍
默认情况下,Apache Airflow 从元数据数据库中读取连接和变量,该数据库实际上存储了 Airflow UI 的相应选项卡上可见的所有内容。
尽管通过 UI 添加(或删除)连接和变量(并因此将它们存储在也提供静态加密的元数据数据库中)绝对没有什么特别的问题,但有时将 Airflow 连接到一个中央秘密管理工具可能更容易管理,该工具也被组织中的其他工具使用。
这种方法将从本质上帮助您以更有效的方式管理您的秘密,这样无论何时发生变化,它都会反映在实际读取该秘密的每个工具上,因此您不必手动更新相应系统上的每个秘密(例如 Airflow)。
在今天的教程中,我们将展示如何将 HashiCorp Vault(最常用的秘密管理工具之一)与 Apache Airflow 连接。
步骤 1:更新 airflow.cfg 文件
为了将 HashiCorp Vault 与 Airflow 集成,以便后者从前者检索连接和变量,我们需要将[**VaultBackend**](https://airflow.apache.org/docs/apache-airflow-providers-hashicorp/stable/_api/airflow/providers/hashicorp/secrets/vault/index.html#airflow.providers.hashicorp.secrets.vault.VaultBackend)指定为airflow.cfg的[secrets]部分中的backend。
**[secrets]**
backend = airflow.providers.hashicorp.secrets.vault.VaultBackend
backend_kwargs = {
"connections_path": "connections",
"variables_path": "variables",
"url": "http://127.0.0.1:8200",
"mount_point": "airflow",
}
上述配置假设您的气流连接作为秘密存储在airflow mount_path 和路径connections(即airflow/connections)下。同样,您的变量存储在airflow/variables下。
您还应该确保指定允许您在 Airflow 和 Vault 之间执行身份验证的附加参数。例如,您可能需要传递approle、role_id和secret_id参数(或者可能是token参数)。你可以在这里看到可用参数的完整列表。
步骤 2:将连接作为机密添加到 Vault
连接库应存放在气流配置中指定的connections_path中,如上一步所示。
对于每个连接,您必须创建一个至少包含以下密钥之一的存储库密码:
**conn_id**(str) -连接 ID。**conn_type**(str) -连接类型。**description**(str) -连接描述。**host**(str)——主持人。**login**(str) -登录。**password**(str)——密码。**schema**(str) -模式。**port**(int) -端口号。**extra**(Union[str, dict]) -额外元数据。私有/SSH 密钥等非标准数据可以保存在这里。JSON 编码的对象。**uri**(str) -描述连接参数的 URI 地址。
这是因为机密的内容应该与提供的应该与[airflow.models.connections.Connection](https://airflow.apache.org/docs/apache-airflow/stable/_api/airflow/models/connection/index.html#airflow.models.connection.Connection)类的预期参数对齐。
步骤 3:添加变量作为 Vault 机密
现在进入变量,当你把它们作为秘密添加到 vault 中时,你应该小心一点,因为预期的格式可能不像你通常预期的那样直接。
让我们假设在airflow.cfg中,你已经将variables_path指定为variables,将mount_point指定为airflow。如果您希望存储一个名为my_var的变量,其值为hello,那么您必须将秘密存储为:
vault kv put airflow/variables/my_var value=hello
注意,秘密Key是value,秘密Value是hello!
步骤 4:访问气流 Dag 中的连接
您可以使用以下代码来访问作为 Vault 机密存储的 Airflow 连接,并观察其详细信息:
import json
import logging from airflow.hooks.base_hook import BaseHook conn = BaseHook.get_connection('secret_name')
logging.info(
f'Login: {conn.login}'
f'Password: {conn.password}'
f'URI: {conn.get_uri()}'
f'Host: {conn.host}'
f'Extra: " {json.loads(conn.get_extra())}'
# ...
)
请注意,将首先搜索存储库机密,然后是环境变量,最后是 metastore(即通过 Airflow UI 添加的连接)。这种搜索顺序是不可配置的。
步骤 5:访问气流 Dag 中的变量
同样,以下代码片段将帮助您检索存储在 Vault 中的变量值:
import logging from airflow.models import Variable my_var = Variable.get('var_name')
logging.info(f'var_name value: {my_var}')
步骤 6:使用 DAG 测试存储集成
在下面的代码片段中,您可以找到一个示例 Airflow DAG,您可以使用它来测试 Airflow 是否可以从airflow.cfg文件中指定的 Vault 中正确读取变量和连接。
import logging
from datetime import datetime from airflow import DAG
from airflow.models import Variable
from airflow.hooks.base_hook import BaseHook
from airflow.operators.python_operator import PythonOperator def get_secrets(**kwargs):
# Test connections
conn = BaseHook.get_connection(kwargs['my_conn_id'])
logging.info(
f"Password: {conn.password}, Login: {conn.login}, "
f"URI: {conn.get_uri()}, Host: {conn.host}"
) # Test variables
test_var = Variable.get(kwargs['var_name'])
logging.info(f'my_var_name: {test_var}')with DAG(
'test_vault_connection',
start_date=datetime(2020, 1, 1),
schedule_interval=None
) as dag:
test_task = PythonOperator(
task_id='test-task',
python_callable=get_secrets,
op_kwargs={
'my_conn_id': 'connection_to_test',
'var_name': 'my_test_var',
},
)
最后的想法
在今天的教程中,我们展示了如何配置 HashiCorp Vault,以便被 Apache Airflow 用作主要的后端秘密存储。然后,我们演示了如何向保险库添加连接和密码。
最后,我们通过几个实例演示了如何以编程方式从 Vault 中检索连接和变量,并在 Airflow DAGs 中使用它们。
成为会员 阅读介质上的每一个故事。你的会员费直接支持我和你看的其他作家。你也可以在媒体上看到所有的故事。
https://gmyrianthous.medium.com/membership
相关文章你可能也喜欢
您曾经“测试”过您的数据管道吗?
原文:https://towardsdatascience.com/have-you-ever-tested-your-data-pipelines-165e31fd87d8
使您的数据管道可测试、可维护且可靠的综合指南
为什么有必要测试您的数据管道?
在您的数据管道中嵌入适当的测试使它们不容易出错,并且还确保数据在流向最终数据消费者之前通过适当的数据质量检查。
任何数据管道的两个关键组成部分是“代码”和“数据”。代码被用作管理如何提取、转换和加载(ETL)数据的工具,而数据是数据管道的组成部分。老实说,大多数数据管道的复杂性存在于数据中,而不是代码中。为了构建和运行可靠的数据管道,仅仅进行标准代码测试是不够的。因此,当我们谈论测试数据管道时,我们需要确保代码和数据都得到正确的测试。
因此,今天的文章将分为两部分:
- 代码测试——类似于传统软件/应用的测试。代码测试包括单元测试、集成测试和端到端系统测试。代码测试通常作为持续集成(CI)管道的一部分进行,以确保代码质量良好,数据接收、数据转换和数据加载的功能符合预期。
- 数据测试 —设定对关键数据元素的期望,并确保数据在向消费者提供最终数据之前通过这些期望检查。数据测试需要持续的努力,一旦数据管道被部署到生产环境中,数据测试就变得更加重要。除了测试数据质量之外,监控测试结果以确保任何违反数据质量的问题都可以立即得到解决也是非常必要的。
我先讲代码测试,再讲数据测试。最后,我将分享一些开源工具和框架,您可以利用它们开始向您的数据管道添加必要的测试。

代码测试
数据管道的代码测试与软件的代码测试没有太大区别。它通常包括单元测试、集成测试以及端到端的系统测试。然而,数据管道有几个特性,使得在数据管道上进行代码测试更具挑战性。
- 首先,数据管道非常依赖于数据,因此您需要生成样本数据——有时是大量的样本数据——用于测试目的。
- 其次,执行数据管道需要严重依赖外部系统,包括 Spark 和 Databricks 等处理系统,以及雪花、红移和 Databricks SQL 等数据仓库。因此,您需要找到独立进行测试的方法——将测试数据处理逻辑的功能与测试与这些外部系统的连接和交互分开。
让我们分别讨论单元测试和集成测试,并理解它们是如何专门为数据管道工作的。
- 单元测试 —单元测试是非常低级的,接近应用程序的源代码。它们包括测试数据管道中使用的各个方法和函数。数据管道的单元测试的目的是在不提供繁重的外部环境的情况下捕捉错误。这些错误可能包括重构错误、解释语言中的语法错误、配置错误、图形结构错误等等。例如,为了得到最终结果,您可能需要相当多的数据转换函数。您可以对这些转换函数执行单元测试,以确保它们按照预期生成数据。正如我们在本文开头所讨论的,数据是任何数据管道的组成部分。因此,要对数据管道中使用的函数执行单元测试,您还需要确保有可用于测试的数据。因此,有两种流行的方法可以获得足够的数据来测试您的管道代码。第一种是根据真实数据的分布和统计特性来模拟虚假的测试数据。第二种方法是将真实数据的样本复制到开发或试运行环境中进行测试。对于第二个问题,将数据复制到不如生产环境严格的环境中时,确保不违反数据隐私、安全性或合规性非常重要。
- 集成测试 —集成测试验证您的数据管道所使用的不同模块或服务能够很好地协同工作。数据管道最必要的集成测试是测试与数据平台的交互,如数据仓库、数据湖(主要是云存储位置)和数据源应用程序(OLTP 数据库应用程序和 SaaS 应用程序,如 Salesforce 和 Workday)。众所周知,数据管道的三个关键步骤是提取、转换和加载。至少其中两个(提取和加载),有时三个都需要与上面提到的数据平台进行交互。此外,您的数据管道还需要与消息传递系统进行交互,例如 Slack 或团队,以便为您的数据管道上发生的关键事件发送通知或警报。因此,对您的管道大量交互的所有外部平台和系统进行集成测试至关重要。
大多数数据管道都是用 Python 编写的。为了自动化数据管道的代码测试,您需要利用 Python 测试框架,例如 pytest ,这可能是使用最广泛的 Python 测试框架。它可以用来编写各种类型的软件测试,包括单元测试、集成测试、端到端测试和功能测试。
除了测试框架,还可以利用数据管道编排工具来简化数据管道的代码测试。据我所知,Dagster—pipeline orchestrator 工具—提供了数据管道工作流和相关功能,允许您对您的数据应用程序进行单元测试,将业务逻辑与环境分离,并对不受控制的输入设置明确的预期。如果您知道其他高质量的编排工具,它们也提供了使代码测试更容易的能力,请随时告诉我。我总是渴望了解更多。
现在我们已经讨论了代码测试部分,让我们转到数据测试部分,它更有趣,更动态,也许更有挑战性。
我们开始吧!
数据测试
如上所述,数据测试是关于设置对关键数据元素的期望,并确保流经数据管道的数据在服务于最终数据消费者之前通过这些期望检查。如果存在任何违反这些数据质量预期的情况,则应采取相关的通知/警报和相应的修复措施。
与通常在编译/部署时进行的代码测试不同,数据测试是在每次有新的数据流/数据批次被接收和处理时连续进行的。您可以将数据测试视为一系列连续的验收测试。您对新到达的数据做出假设和期望,并进行实时测试以确保这些假设和期望得到满足。
数据测试绝对必要的原因如下:
- 首先,数据是许多关键业务决策的基础。随着越来越多的组织转向数据驱动的决策,数据在现代组织的运营中扮演着越来越重要的角色。因此,拥有高质量的数据也将提高业务决策的质量和相关性。
- 其次,数据总是变化的。与通常静态且干净的代码不同,数据是极其动态的。有许多因素会给你的数据带来变化,如业务运营变化、宏观经济变化以及最近的疫情(新冠肺炎)。所有这些都给底层数据带来了显著的变化。此外,在大多数情况下,数据是脏的,需要一些清理工作才能使用。因此,进行数据测试可确保及时检测到重大变化/漂移,并适当过滤和拒绝损坏的数据。
数据测试可以大致分为以下几类:
- 表格级测试 :表格级测试侧重于了解一个表格的整体形态。下面是一些示例表级测试:
#row-wise
expect_table_row_count_to_equal
expect_table_row_count_to_equal_other_table
expect_table_row_count_to_be_between
#column-wise
expect_table_column_count_to_equal
expect_table_column_count_to_be_between
expect_table_columns_to_match_ordered_list
expect_table_columns_to_match_set
- 列级测试 :一般来说,列级测试有两种——一种是单列测试,一种是多列测试。
单列测试往往侧重于设置单个列的统计属性的期望值。对于数字列,单列测试将检查列最大值、列最小值、列平均值、列分布等。对于分类列,单列测试将检查列中最常见的值、列中不同的值等等。多列测试更多的是检查列之间的关系。例如,多列测试期望 A 列中的值大于 b 列中的值。下面是一些列级测试:
#Single column tests
expect_column_average_to_be_within_range_of_given_point
expect_column_max_to_be_between
expect_column_min_to_be_between
expect_column_mean_to_be_between
expect_column_median_to_be_between
expect_column_distinct_values_to_be_in_set
expect_column_most_common_value_to_be_in_set
#Multi-coumns tests
expect_column_pair_values_to_be_equal
expect_column_pair_values_a_to_be_greater_than_b
expect_column_pair_values_to_have_diff
当然,您可以根据您的业务领域知识定制特定的数据测试,以确保所有的测试都与您的数据和数据运行的业务环境相关。
有几个开源库是为支持数据团队实现数据质量测试而设计的,比如远大前程(GX) 、 Deequ 和 PyDeequ 。
我已经发表了另一篇文章,专门讨论如何利用远大前程(GX) 、 Deequ 和 PyDeequ 将可靠性嵌入您的数据管道。你可以在这里找到这篇文章:
摘要
为了完成本文,有必要重申测试数据管道的目标是构建高度可靠和值得信赖的数据管道,这样您就可以为下游数据消费者提供高质量的数据和信息。同时,您还应该避免过度测试的情况,这意味着您只测试与您的数据管道质量和您的数据管道所服务的业务用例相关的代码、特性和数据。因此,在您编写测试之前,您需要了解什么样的测试是必要的,并且还建议与您的业务利益相关者交谈,以获得他们关于什么数据测试和期望对他们最相关和最必要的领域知识。
如果你想在这些文章发表时得到通知,请随时关注我。我一般每周都会发表 1-2 篇关于数据和 AI 的文章。
如果想看到更多围绕现代高效数据+AI 栈的指南、深度潜水、见解,请订阅我的免费简讯— 高效数据+AI 栈 ,谢谢!
注:万一你还没有成为媒介会员,而你想无限制地接触媒介,你可以使用我的推荐链接来注册!
非常感谢你的支持!
作为一名分析师坐在桌边
原文:https://towardsdatascience.com/having-a-seat-at-the-table-as-an-analyst-36acfe9bbdae

(图片来自Unsplash.com)
作为一名分析师坐在桌边
…而不仅仅是为利益相关方的下一次会议处理临时数据请求
对我来说,刚开始做分析师时,最令人沮丧的时候是我只对特定的数据请求做出响应的时候。我不觉得我是周围正在进行的对话和决策的一部分。相反,我正忙着整合仪表板,准备数据和图表,以便我的利益相关者在下一次会议上使用。
"嘿,你能按设备类型快速分解这个按钮的交互吗?"
我想做的是帮助塑造我们未来的战略,而不仅仅是分析其他人所做决策的结果。在这篇文章中,我分享了一些帮助我“赢得席位”的策略,并致力于我真正感兴趣的事情。
数据请求(只是)工作的一部分
作为一名分析师,成为临时请求的联系人太容易了,而且可能会很快发生。问题总是比回答问题的人多,很快我们就会发现自己面对一大堆问题,每个问题都比其他问题更紧迫。
支持利益相关者并提供所需的信息是分析师工作的关键部分。但是,仅仅对数据请求做出反应既不令人满意,也无助于组织充分利用其分析功能的价值。
分析师希望并且需要参与我们团队内部和周围正在进行的对话,并帮助指导团队朝着正确的方向发展以产生影响。
理解与执行模式
概括地说,分析师以两种不同的模式运作:理解模式或执行模式。
在理解模式中,重点在于基本面分析,以加深对业务或产品特定领域的理解。理解工作的几个例子是:
- 保留率分析:公司保留用户的情况如何,提高保留率的最大机会在哪里?
- 漏斗分析:产品漏斗中提升用户转化率的最大机会在哪里?
- 表面参与度分析:用户如何与特定的表面互动,如何进一步改善体验?
一旦团队开始实施基于这些见解的具体想法,我们就切换到执行。在这种模式下,分析师帮助实施实验,回答特别的请求,并帮助团队根据实验结果决定下一步要运送什么和建造什么。

(图片来自 Unsplash.com 的
通过理解工作成为专家
理解工作是建立影响力和成为商业相关话题的最佳途径。如果你成为了某个领域的专家,而这个领域目前是业务的重中之重,那么你就会自动成为被邀请参加会议并寻求建议的人。
找到正确的主题
如上所述,理解工作可以有不同的方向。所以第一步是弄清楚(领导)团队当前的重点是什么。
分析师自然会对不同的团队以及与他们相关的主题有一个整体的看法。这有助于确定值得调查的最紧迫的问题。如果你要加入一个新团队,介绍性对话是了解当前优先事项和问题领域的最佳机会。
理想情况下,你的理解工作为更广泛的领域而不是仅仅一个团队提供见解和建议,这增加了你的影响范围。
人们担心高用户流失率吗?保留分析有助于制定明确的战略。一个团队是否缺乏明确的路线图来提高特定站点的转化率?表面参与度分析有助于识别网站上有助于用户做出购买决定的组件。
勾勒出清晰的战略并进行沟通
为了吸引注意力,你理解工作必须尽可能地相关和可行。这意味着它不仅需要传达当前形势的清晰画面,还需要概述一些机会领域以及如何利用这些机会的建议。
例如,如果一个电子商务网站努力吸引新用户,漏斗分析可以得出以下结论和行动项目:
- 当前状态:登录屏幕上只有 40%的注册尝试成功。
- 机会:谷歌登录的注册成功率比通过电子邮件注册高 50%,但只有 10%的注册尝试使用谷歌登录。
- 推荐:让我们把谷歌登录放到登录界面的顶部,让它成为主要选项。
将这些结果传达给相关人员是关键。理想情况下,你的理解工作为更广泛的领域而不是仅仅一个团队提供见解和建议,这增加了你的影响范围。在你的分析文档中标记合适的人(例如通过谷歌文档中的评论)或向团队领导发送简短的定制摘要是获得可见性的好方法。
不要害怕之前的分析
“我们已经研究过这个问题了。”在寻找可以深入的领域时,这可能是一件非常令人沮丧的事情。尤其是在大型组织中,选择一个好的理解主题可能很困难。通常有人已经研究了与我们想法相似的领域,或者我们认为团队中所有聪明的人都已经研究了所有值得研究的东西。
首先,总有一些事情要调查。理解工作是耗时的,已经在团队工作一段时间的人通常忙于日常事务。这意味着要么有许多领域还没有被研究,要么如果是这样,那些分析已经过时了(但是提供了一个很好的起点!).
巧妙处理临时请求
着手解决更具战略性的问题固然很好,但也会占用你大量的时间。同时,处理临时请求仍然是分析师工作的一个重要部分,这意味着我们必须聪明地管理我们的工作量。
与其避免数据请求,不如确保我们只处理输出将提供可操作结果的请求,这一点很重要。本文对如何处理即席数据请求进行了更深入的概述:
结论
以我的经验来看,如果分析师能够尽早参与决策过程,帮助将业务战略引向正确的方向,他们将为一个组织提供最大的价值。然而,在餐桌上拥有一个座位通常不是自然而然的事情。通过采取主动,成为企业最相关的焦点领域的专家,分析师可以确保他们成为周围对话的一部分。
用 Python 实现快速异常检测
原文:https://towardsdatascience.com/hbos-vs-iforest-on-macbook-pro-m1-c258d2b5fe6b
M1 MacBook Pro 上的 HBOS vs iForest

HBOS 算法图解(图片由作者提供)
在这篇博文中,我们将比较基于直方图的异常值分数(HBOS ),一种基于邻近度的异常值检测算法,该算法被证明是快速的,具有线性时间复杂度,以及一种称为隔离森林的集成方法。
我们将讨论这两种算法背后的工作原理,以及它们在 MacBook Pro M1 上针对 17 个不同数据集的各自性能。
异常检测数据集(ODDS) 组公开提供可用于测试异常检测算法的数据集。它们为几个领域提供不同种类的数据,并且总是提供我们可以用来评估异常值检测项目的基础事实。
HBOS
基于直方图的异常值分数(HBOS)是一种识别数据异常值的机器学习算法。该算法于 2012 年由 Goldstein、Markus 和 Andreas Dengel 在一篇名为“基于直方图的异常值得分(HBOS):一种快速无监督异常检测算法”的论文中发表[1].
这是通过为每个维度创建数据的直方图,然后基于特定数据点落入每个维度的直方图区间的可能性来计算分数来实现的。

每个维度的直方图分布(图片由作者提供)
分数越高,数据点越有可能是异常值。
为了计算一个实例(一个数据点)的得分,我们查看该实例属于哪个箱。大多数情况下,特征向量将占用非常可能的条柱,如下图所示。

推导过程中获得的非常可能的特征向量的图示(图片由作者提供)
另一方面,来自异常的特征向量将在其一个或几个维度中占据不太可能的面元,如下图所示。

推导过程中获得的非常不可能的特征向量的图示(图片由作者提供)
原始论文[1]中提出的计算异常分数的指标如下:

HBOS 方程(来源:[1])
想法是将每个特征向量维度的结果二进制数的倒数相乘。
根据我们之前的示例,描述落入非常不可能的箱中的异常值的第一个特征向量的分数明显更高:

异常示例的 HBOS 异常分数(图片由作者提供)
并且更可能的特征向量将具有较低的分数:

无异常示例的 HBOS 异常分数(图片由作者提供)
你可能想知道为什么 HBOS 方程使用对数函数?
应用日志的目标是获得对极小 bin 值不太敏感的异常分值,以及由于浮点精度不可避免的误差而可能带来的误差。
对数是单调递增的,因此不会改变分数的顺序。
HBOS 可以有效地识别低维和高维数据中的异常值。然而,每个维度的直方图的宁滨方法将影响时间复杂度。在固定宁滨方法的情况下(如上图所示),面元具有相等的大小,并且时间复杂度是线性的,即 O(n)。
如果我们不知道每个维度的分布,或者如果我们面临长尾分布,那么动态绑定方法也是可能的,并且受到鼓励。但那样的话,时间复杂度就变成 O(n log(n))。
iForest
隔离森林(iForest)是一种异常检测算法,其工作原理是隔离样本,并根据样本隔离的难易程度为其分配一个分数。2008 年,刘、和在一篇名为“隔离森林”的论文中首次提出了该算法[2]。
iForest 算法实现简单,可用于任何类型的数据(数值型、分类型等)。).

隔离树算法的图示(图片由作者提供)
通过递归分割数据来构建隔离树。例如,要在 100 个数据点上构建一个具有 10 个维度的决策树,我们首先将这 100 个数据点分成两部分,然后将分开的部分再分成其他部分,以此类推。
要拆分数据点,我们只需从 10 个维度中选择一个随机属性,并根据所选属性上设置的随机值拆分数据。
即使在选择用于分割数据的属性和值时涉及到许多随机过程,也更有可能在早期分割异常值。
比如说我们要建一个隔离树,把人民按照财富来隔离。埃隆·马斯克预计将成为世界上第一个亿万富翁。因此,该属性的可能值范围是 0 到 1 万亿。我们从 0 到 1 万亿中随机选择一个数字——比如 25 亿——我们已经把拥有财富少于 1 万亿的人群从富人中分离出来。
事实上,离群值最终出现在隔离树中较短的路径上。路径越小,数据点越有可能是异常值,异常值越高。
最后,iForest 算法构建一组隔离树,输出异常分数,并计算所有隔离树之间的平均异常分数。
MacBook Pro M1 的结果
在这篇博文中,我们使用了 Pyod 库来测试异常值检测算法。
它提供了一种简单的方法来比较不同的算法,并为给定的数据集选择最佳的算法。PyOD 还提供了多种功能,方便研究和生产。如果您想在不同的机器上运行相同的基准测试,这里有他们网站的链接:
https://pyod.readthedocs.io/en/latest/benchmark.html
关于测试的设置,基准测试是通过以下配置完成的:
- 型号名称:MacBook Pro
- 芯片:苹果 M1
- 最大值 CPU 时钟速率:3.2 GHz
- 内核总数:8 (4 个性能和 4 个效率)
- 内存:16 GB
这是 10 次独立试验的平均结果:
10 次独立试验的平均执行时间(源代码: PyOD
10 次独立试验的平均 ROC 性能(源代码: PyOD
10 次独立试验的 N 个样本的平均精度(源代码: PyOD
结论
在异常检测领域,有许多竞争者,但是对于这篇博文,我们决定比较 HBOS 和 iForest。这两种方法在实时应用中都被证明是有效的,但是哪一种更好呢?
总的来说,HBOS 通常是一种更快的方法,但它可能没有 iForest 准确,这取决于数据集的类型。
所以,这真的取决于你的需要,至于哪种方法更好。如果速度更重要,那么 HBOS 是最好的选择。但是,如果准确性是最重要的,并且您正在使用高维特征向量,那么您可能希望使用 iForest。
好奇想了解更多关于 Anthony 的工作和项目吗?在中、 LinkedIn 、 Twitter 上关注他。
需要技术写手?将您的请求发送到https://amigo CCI . io。
[1]戈尔茨坦、马库斯和安德烈亚斯·登格尔。"基于直方图的异常值分数(hbos):一种快速无监督异常检测算法." KI-2012:海报和演示音轨 9 (2012)。
[2]刘,费托尼,,丁,.“隔离林。” 2008 年第八届 ieee 数据挖掘国际会议。IEEE,2008 年。
利用 GANs 进行医疗保健预测分析
原文:https://towardsdatascience.com/healthcare-predictive-analytics-with-gans-f4e776dcc2c6
用 GANs 增加不平衡的医疗再入院数据

生成对抗网络(GANs)是 Ian Goodfellow 及其同事在 2014 年开发的一类深度学习模型。在高层次上,gan 由两个竞争的神经网络组成,这两个神经网络构成了一个零和游戏。这意味着一个神经网络代理的收益对应于另一个代理的损失。具体来说,GAN 算法训练鉴别器来区分真实数据和合成数据,同时训练生成器来产生可以欺骗鉴别器的合成数据实例。
GANs 有各种各样的应用,包括图像生成、图像到图像的转换、表格数据扩充等等。数据扩充用例很有趣,因为它可以用来扩充不平衡数据集,以进行离群点检测,这在行业中有广泛的应用。例如,在医疗保健空间数据中,使用 GANs 进行增强可用于改进预测患者再入院的机器学习模型。
患者再次入院对应于在特定时间间隔后,入院的患者返回同一家或另一家医院的事件。患者再入院率是衡量治疗和护理质量的一个很好的指标。高再入院率意味着较差的患者结果和较高的手术成本。事实上,《平价医疗法案》( ACA)对高再入院率的医疗服务提供者进行了处罚。也就是说,医疗保健提供者通过提供更高质量的护理来降低再入院率。
造成高再入院率的因素有很多。这包括年龄、体重、地理位置、合并症、多种药物等等。例如,老年患者更有可能再次入院,因为他们有更多的慢性病和疾病。体重,尤其是肥胖,也起着很大的作用,因为超重和肥胖的人更有可能患有心脏病、癌症和其他严重的并发症。
目前大多数降低再入院率的尝试包括理解 ACA 政策、识别高风险患者、药物调和、预防保健获得性感染以及良好的移交沟通。例如,ACA 制定了减少再入院计划,激励医疗服务提供者提高医疗质量。此外,能够根据病史和人口统计数据识别高危人群也很重要。医疗协调包括确保患者的药物清单尽可能是最新的。这有助于降低因服用多种药物而导致的药物相关不良事件的风险。
接受多种药物治疗的患者也很有可能再次入院。这很大程度上是由于需要这些药物治疗的合并症。多重用药还会导致药物相互作用,这可能会导致出院后的不良事件,增加再次入院的可能性。采取措施预防这些类型的感染可以降低再次入院的可能性。最后,不干涉交流很重要,因为它包含了对患者病情和治疗计划的清晰记录。如果在不干涉交流过程中遗漏了任何相关因素的信息,如多药或共病,可能会增加再入院的可能性。
除了手动监控这些再入院因素,医疗保健提供商还可以利用机器学习来帮助识别和锁定高危人群。在过去,基于各种风险因素训练的逻辑回归模型被用于预测再入院的概率。这些模型可以与人工检查配合使用,以采取预防措施来降低再入院率。
鉴于医疗保健数据高度敏感和机密,访问用于建模的数据源可能会很困难。尽管存在这些挑战,但仍有许多开源工具可用于创建真实代表预测建模所需因素的合成数据集。合成数据具有匿名、免费使用和公开共享的优势。尽管数据是合成的,但有了足够的领域专业知识,就可以生成一个具有高度代表性的数据集,并应用于各种用例中。
Faker 是一款开源 python 工具,可用于生成各种行业垂直领域的合成数据,包括金融、零售和医疗保健。我们将了解如何使用 Faker 生成合成的医疗保健再入院数据,并将其用于预测建模。我们将包括许多已知的导致再入院风险的因素。然后,我们将基于高风险因素,以基于规则的方式为我们的机器学习模型定义再入院目标。
鉴于再入院并不常见,我们将此数据集建模为不平衡数据集,其中大部分数据由在规定时间范围内未再入院的患者组成。我们将构建一个基线 catboost 模型,用于比较数据扩充前后的性能。然后,我们将使用表格生成对抗网络( tabgans )来扩充我们的不平衡数据。最后,我们将建立一个 catboost 第二分类模型,用于根据我们的扩充数据预测患者再入院。
对于这项工作,我将在 Deepnote 中编写代码,这是一个协作数据科学笔记本,使运行可重复的实验变得非常容易。
用 Faker 生成合成数据
首先,让我们导航到 Deepnote 并创建一个新项目(如果您还没有帐户,可以免费注册)。
让我们创建一个名为“synthetic_data”的项目,并在这个项目中创建一个名为“tabgan_experiment”的笔记本:

作者截图
让我们安装将要使用的软件包:
作者创建的嵌入
接下来,让我们导入 Faker,并为将要生成的合成数据的大小定义一个变量。我们将生成一个包含 5000 行的数据集:
作者创建的嵌入
接下来,让我们定义一个 Faker 对象,并将其存储在一个名为“fake”的变量中:
fake = Faker()
让我们设置一个种子,以便我们的结果是可重复的,并初始化一个名为 names 的列表,我们将使用它来存储我们的合成名称:
Faker.seed(42)
names = []
现在让我们在 for 循环中用合成名称填充列表。为此,我们调用 faker 对象上的 name()方法来生成合成名称:
for i in range(0,DATA_SIZE):
names.append(fake.name())
完整的单元格如下:
作者创建的嵌入
通过在 for 循环中调用 faker 对象上的 state()方法,我们可以为美国状态做一些类似的事情:
作者创建的嵌入
对于我们的示例,我们将考虑患者被重新接纳到急诊部的场景:
作者创建的嵌入
我们还将指定性别:
作者创建的嵌入
接下来,让我们导入 numpy 并使用 random.normal 生成平均值为 50 岁、标准差为 20 年的正态分布年龄:
作者创建的嵌入
让我们也生成体重的正态分布值,平均值为 180 磅,标准偏差为 70 磅:
作者创建的嵌入
让我们对以英寸为单位的高度做同样的事情:
作者创建的嵌入
我们还可以定义一个字段来指定患者是否吸烟:
作者创建的嵌入
另一个详细说明了病人在急诊室呆了多少天:
作者创建的嵌入
接下来,我们将使用动态提供者方法从外部列表或源中随机选择元素。让我们导入动态提供者:
from faker.providers import DynamicProvider
让我们定义一个带有健康保险列表的动态提供者对象:
health_insurance_provider = DynamicProvider(
provider_name="health_insurance",
elements=["UnitedHealth Group", "Anthem", "Aetna", "Cigna", "Humana", "Medicare"],
)
现在,我们将为可再现性设置一个随机种子,并将我们的健康保险提供商对象添加到我们的 faker 对象中:
Faker.seed(42)
fake.add_provider(health_insurance_provider)
我们现在可以将随机选择的保险附加到我们的保险列表中:
insurance = []
for i in range(0, DATA_SIZE):
insurance.append(fake.health_insurance())
完整的单元格如下:
作者创建的嵌入
接下来,让我们使用我们的列表创建一个熊猫数据框架:
作者创建的嵌入
让我们也从我们的体重和身高值计算身体质量指数:
作者创建的嵌入
我们的目标是创建一个数据集,用于训练再入院分类模型。接下来我们需要做的是为重新接纳生成目标标签。让我们从生成一些随机分配的标签开始。这将成为我们通常在真实数据中发现的噪声:
df['readmission'] = [np.random.randint(0,2) for x in range(0, DATA_SIZE)]
faker 对象的 names 方法生成的名称不一定是惟一的,所以让我们去掉重复的名称:
df.drop_duplicates('name', inplace=True)
接下来,让我们对 20%的结果数据进行采样,并将其存储在一个名为 df_sample1 的新数据帧中。该数据框将构成我们的阴性和阳性再入院结果的噪声值:
df_sample1 = df.sample(frac=0.2, replace=True, random_state=1)
其余 80%的数据将存储在另一个名为 df_sample2 的数据帧中:
df_sample2 = df[~df['name'].isin(list(set(df_sample1['name'])))]
我们将使用 df_sample 2 来定义我们的基本事实标签。重新接纳值将为 0 或 1。重新入院值为 0 表示患者在指定的时间段后没有重新入院。值为 1 表示患者已再次入院。这通常是 30 天或 60 天,但出于我们的目的,我们不必担心确切的值,因为这都是合成数据。让我们将 df_sample2 中的所有重新接纳值初始化为 0
df_sample2['readmission'] = 0
接下来,让我们将所有身体质量指数> 30、吸烟、有医疗保险且在急诊室停留> 5 天的患者标记为再入院值为 1:
df_sample2.loc[(df_sample2.bmi >=30) & (df_sample2.smoker == 'Yes') & (df_sample2.insurance == 'Medicare') & (df.length_of_stay >= 5), 'readmission'] = 1
最后,让我们将 df_sample1 追加到 df_sample2,并将结果存储在新变量 df 中:
df = df_sample2.append(df_sample1)
完整的单元格如下:
作者创建的嵌入
接下来,让我们使用计数器方法来查看 0 和 1 再入院结果的数量。如我们所见,数据不平衡,517 个再入院值等于 1,4405 个再入院值等于 0:
作者创建的嵌入
构建 Catboost 分类器
现在,我们可以开始为分类模型准备数据了。让我们将分类列转换成机器可读的代码。虽然 catboost 可以直接处理分类变量,但这将使以后使用 tabgan 更加容易:
作者创建的嵌入
我们现在可以为建模定义输入和输出。我们将使用“保险”、“性别”、“吸烟者”、“州”、“身高”、“体重”、“bmi”、“住院时间”来预测“再次入院”:
作者创建的嵌入
接下来,让我们将数据分为训练和测试两部分:
作者创建的嵌入
现在让我们导入 catboost 包:
作者创建的嵌入
我们现在可以定义我们的模型对象,并使它适合我们的训练数据。为简单起见,我们对 catboost 模型使用 10 次迭代(与 n_estimators 相同):
作者创建的嵌入
现在让我们来评估我们模型的性能。由于我们的数据是不平衡的,精度是一个很好的度量标准,用于衡量模型预测代表性不足的类别的效果。精度值为 1.0 意味着模型具有完美的精度:
作者创建的嵌入
我们看到,该模型预测测试集中的所有值都具有 0 的重新接纳值,即使测试集中有 146 个 1 的基本真值。这相当于精度值为 0。在不平衡数据上构建分类模型时,这是一个典型的问题。理想情况下,表格形式的 GANs 可以帮助我们通过数据扩充来提高模型精度。
用 Tabgan 扩充数据
让我们从导入 tabgan 开始:
from tabgan.sampler import GANGenerator
让我们定义列、输入和输出,并重置索引:
cols = ['insurance', 'sex', 'smoker', 'state', 'height', 'weight', 'bmi', 'length_of_stay', 'readmission']X = df[cols[:-1]]
y = pd.DataFrame(list(df['readmission']), columns=['readmission'])X.reset_index(inplace=True, drop=True)
y.reset_index(inplace=True, drop=True)
接下来,我们将拆分数据用于培训和测试:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)X_train.reset_index(inplace=True, drop=True)
y_train.reset_index(inplace=True, drop=True)
X_test.reset_index(inplace=True, drop=True)
最后用生成器生成我们的合成数据。该代码将生成输入(new_train2)和输出(new_target2)的新数据帧,其中合成输入数据被附加到 X_train 并存储在 new_train2 中,合成目标值被附加到 y_train 并存储在 new_target2 中。如果您对与 GANGenerator 和 generate_data_pipe 相关的参数感兴趣,请参见 tabgan 文档。
new_train2, new_target2 = GANGenerator(cat_cols = cols, epochs=2, is_post_process=False).generate_data_pipe(X_train, y_train, X_test,use_adversarial=False, only_generated_data=False)
完整的单元格如下:
作者创建的嵌入
我们现在可以使用计数器方法来查看重新接纳的 1 和 0 的分布:
我们看到产生了更多的数据。在我们的原始数据集中,有 4405 个再入院值等于 0,517 个再入院值等于 1。与上面的截图相比,我们现在有 8102 个值等于 0,2921 个值等于 1:
作者创建的嵌入
我们还可以显示新的输入数据 new_train2:
作者创建的嵌入
现在,让我们在扩充数据上训练一个新的 catboost 模型:
作者创建的嵌入
并评估性能:
作者创建的嵌入
我们看到我们在精度上有了一点点提高。这可以通过调节恒发生器的超参数进一步改善。例如,您可以尝试将纪元的数量从 2 增加到更大的数字,如 50 或 100。
这篇文章中使用的代码可以在 GitHub 上找到。
结论
在这里,我们看了如何使用开源 python 包来考虑预测患者再入院的真实医疗保健用例。首先,我们使用 faker 软件包生成患者属性,随后我们使用这些属性来训练再入院分类模型。然后,我们看到了如何使用 tabgan 包来扩充我们用由我们的 GANgenerator 生成的合成值生成的训练数据。我们发现,通过这种数据扩充方法,我们能够提高分类模型的精度。这种数据扩充的方法也可以用于这里没有提到的医疗保健预测问题。这包括罕见疾病检测、不良药物相互作用事件、基于价值的护理的患者人群风险分类等等。
你好 PyScript
原文:https://towardsdatascience.com/hello-pyscript-goodbye-javascript-c8d8fb83a93a
意见
既然浏览器中有了新的脚本语言,JavaScript 会发生什么变化

作者图片
未来的 web 应用会全部用 PyScript 编写吗?Python 拥有现代编程语言的所有属性和支持大量应用程序类型的大量库,所以如果可以选择,为什么要使用 Javascript 呢?
好吧,等一下。
对于许多投入大量时间和精力学习 Python 语言和各种库(Numpy、Pandas、Matplotlib、SciPy、Plotly……)的数据科学家来说,在浏览器中使用 python 无疑是一个好主意。例如,我们这些花了很长时间在 Jupyter 笔记本上编写数据可视化代码的人,现在可以直接将我们的工作发布到网络上,而无需担心 Django 或 Flask 等服务器框架,也无需配置服务器或担心如何在 Heroku 或 AWS 或 Azure 上部署应用程序。
PyScript 应用只是网页。
但是在 Javascript 开发方面也有大量的投资,大多数基于 JavaScript 的 web 应用程序并不关心数据科学。JavaScript 也有大量用于各种目的的库,并且与早年稍显古怪和实现不一致的版本不同,JavaScript 还是一种现代的全功能编程语言。
例如,如果您是 React.js 程序员,您肯定不会张开双臂欢迎对 PyScript 的更改。部署也很容易,因为 JavaScript 应用程序也只是网页。
那么 PyScript 适合做什么呢?如果不是 JavaScript 的替代品,那是什么?
到目前为止,Python 代码被归入服务器。老实说,这并不是什么坏事。Python 代码在功能强大的服务器上的运行速度要比在笔记本电脑的浏览器上快得多,因此,如果有大量的处理工作要做,服务器是最好的地方。
那么,问题来了: PyScript 擅长什么 ?
我目前的答案是:如果有合适的库,轻量级应用程序可以用 Javascript 编写。这些主要是面向科学和数据科学的应用。以及不需要大量处理(在浏览器环境中可能会很慢)和作者已经熟悉 Python 的应用程序。
目前,PyScript 处于 alpha 开发阶段,所以它只会不断改进,但目前它的进展有点慢。这当然取决于运行它的硬件的能力。我尝试在一台 2g 内存的 Windows 10 平板电脑上运行我编写的应用程序(见下文),在应用程序开始工作之前,加载和初始化需要大约两分钟——这是一段很长的时间。另一方面,在一台典型的家用笔记本电脑上,这个过程不到 30 秒——我见过许多网站在同一台机器上完全加载需要那么长时间。
PyScript 目前还缺乏某些功能,例如,您可能会发现您必须使用 PyScript 特定的函数来从服务器加载数据,尽管从积极的方面来看,它与 DOM 和 Javascript 函数的交互非常好,这是标准 Python 的附加功能。
那么,PyScript 是 JavaScript 的威胁吗?不会。它会成为科学家和数据科学家构建轻量级 web 应用的有用方式吗?我想是的,但是还有很多工作要做。
我写了一篇关于 PyScript 入门的教程——点击下面的链接,看看吧。
更新:PyScript 新特性 查看截至 2023 年初对 PyScript 进行的一些重大更改。
你可以在我的网页上找到更多我的工作和工作代码的链接。
这里有 30 种方法可以让你成为创建 NumPy 数组的专家
创建 NumPy 数组的综合指南

在 Unsplash 上 Vardan Papikyan 拍摄的照片
Python 中的 NumPy 库构成了当今几乎所有数据科学和机器学习项目的基础构建模块。
由于它在支持矢量化运算和高效处理大量数值数据方面的巨大潜力,它已经成为 Python 中最重要的库之一。
此外,整个数据驱动的生态系统在某种程度上依赖于 NumPy 及其核心功能。
Numpy 库的核心是它的数组对象,也称为 ndarray 。这些用于在 Python 中执行大量的数据操作,如逻辑、算术、数学、统计操作等。
然而,这些操作只有在您首先创建 NumPy 数组时才有可能。因此,这篇文章旨在展示 30 种创建 NumPy 数组的不同方法。
文章的亮点如下:
#1 — #6 从 Python List/Tuple 中创建一个 NumPy 数组# 7—# 10 创建一个特定数值范围的 NumPy 数组# 11—# 16 创建一个特定值的 NumPy 数组【17—# 17【26—# 30】其他流行方法结论
我们开始吧🚀!
导入依赖项
#1 — #6 从 Python 列表/元组创建 NumPy 数组
方法 1:来自 Python 列表
要从给定的 Python 列表创建 NumPy 数组,使用[np.array()](https://numpy.org/doc/stable/reference/generated/numpy.array.html)方法:
我们可以分别使用type()方法和dtype属性来验证所创建对象的类型和数据类型,如下所示:
方法 2:来自 Python 元组
输入不一定必须是 Python 列表。您还可以使用[np.array()](https://numpy.org/doc/stable/reference/generated/numpy.array.html)方法从 Python 元组创建 NumPy 数组:
方法 3:来自具有特定数据类型的 Python 列表
要创建具有特定数据类型的 NumPy 数组,请将dtype参数传递给[np.array()](https://numpy.org/doc/stable/reference/generated/numpy.array.html)方法,如下所示:
方法 4:来自 Python 列表列表
为了从一系列列表中创建一个二维 NumPy 数组,您可以再次使用上面的[np.array()](https://numpy.org/doc/stable/reference/generated/numpy.array.html)方法。
方法 5:三维数字阵列
按照我们在(方法 4) 中所做的,您还可以扩展到更高维的 NumPy 数组。例如,下面的代码块演示了如何从列表的列表中创建一个三维 NumPy 数组。
方法 6:从字符串列表
您还可以使用[np.array()](https://numpy.org/doc/stable/reference/generated/numpy.array.html)方法从字符串列表中创建一个 NumPy 数组:
#7 — #10 创建特定数值范围的 NumPy 数组
方法 7:定期增加数字
要创建一个值有规律递增的数组,使用[np.arange()](https://numpy.org/doc/stable/reference/generated/numpy.arange.html)方法。
可以用不同数量的位置参数调用[np.arange()](https://numpy.org/doc/stable/reference/generated/numpy.arange.html):
np.arange(stop):用step=1生成[0, stop)范围内的值。np.arange(start, stop):用step=1生成[start, stop)范围内的值。np.arange(start, stop, step):生成[start, stop)范围内的数值,数值间距由step给定。
方法 8:等距数字
如果您想要创建一个 NumPy 数组,其中包含特定数量的元素,这些元素在给定的值范围内等距分布,请使用[np.linspace()](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html)方法:
需要注意的事项:
- 您应该总是在
[np.linspace()](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html)方法中指定start和stop参数。 num参数的默认值为50。- 如果不想包含
stop值,请指定endpoint=False。
方法 9:数字形成几何级数(GP)
上面讨论的[np.linspace()](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html)方法在线性空间上生成数字。因此,它返回的数字构成了一个算术级数(AP)。如果您想生成形成几何级数(GP)的数字,请使用[np.geomspace()](https://numpy.org/doc/stable/reference/generated/numpy.geomspace.html)方法。
方法 10:在日志空间中等距分布
最后,如果您想要生成在对数空间中等距的数字,请使用[np.logspace()](https://numpy.org/doc/stable/reference/generated/numpy.logspace.html)方法:
这相当于获取[np.linspace()](https://numpy.org/doc/stable/reference/generated/numpy.linspace.html)的输出,并将单个数字提升到base的幂。
#11 — #16 创建特定值的 NumPy 数组
方法 11:标识数组
要创建单位数矩阵,使用[np.identity()](https://numpy.org/doc/stable/reference/generated/numpy.identity.html)方法:
它返回一个n x n数组,主对角线上的所有元素都设置为1,所有其他元素都设置为0。
方法 12:主对角线值为一的数组
要创建一个对角线上为 1,其他地方为 0 的二维 NumPy 数组(任何形状),请使用[np.eye()](https://numpy.org/doc/stable/reference/generated/numpy.eye.html)方法。
需要注意的事项:
[np.eye()](https://numpy.org/doc/stable/reference/generated/numpy.eye.html)方法不同于[np.identity()](https://numpy.org/doc/stable/reference/generated/numpy.identity.html)方法。[np.eye()](https://numpy.org/doc/stable/reference/generated/numpy.eye.html)是一个通用的方法,可以生成任意形状的 NumPy 数组,而[np.identity()](https://numpy.org/doc/stable/reference/generated/numpy.identity.html)总是返回一个正方形的 NumPy 数组。
方法 13:全 1 数组
要创建一个填充 1 的 NumPy 数组,使用如下所示的[np.ones()](https://numpy.org/doc/stable/reference/generated/numpy.ones.html)方法:
上面的演示创建了一个二维 NumPy 数组。但是,如果您希望创建 1 的一维 NumPy 数组,请将数组的长度传递给[np.ones()](https://numpy.org/doc/stable/reference/generated/numpy.ones.html)方法,如下所示:
方法 14:全零数组
类似于上面的方法,如果你想创建一个 NumPy 零数组,使用[np.zeros()](https://numpy.org/doc/stable/reference/generated/numpy.zeros.html)方法。下面,我演示了一个形状为(2, 2, 4)的三维 NumPy 数组的创建:
方法 15:用特定值填充的数组
要创建一个用 0 和 1 以外的值填充的 NumPy 数组,请使用[np.full()](https://numpy.org/doc/stable/reference/generated/numpy.full.html)方法。
第一个参数是数组的形状(本例中为(2, 4)),第二个参数是填充值(5)。
方法 16:空数组
最后,如果您想创建一个给定形状和类型的 NumPy 数组而不初始化条目,使用[np.empty()](https://numpy.org/doc/stable/reference/generated/numpy.empty.html)方法:
在这种方法中,Numpy 抓取一块内存并返回存储在那里的值,而不对它们做任何事情——返回看起来随机的值。
#17 — #20 创建特定形状的 NumPy 数组
在本节中,我们将讨论创建一个形状与另一个 NumPy 数组相似的 NumPy 的方法。
方法 17:1 和另一个数组形状的数组
如果你想创建一个与另一个 NumPy 数组形状相似的 NumPy 数组,使用[np.ones_like()](https://numpy.org/doc/stable/reference/generated/numpy.ones_like.html)方法:
方法 18:带有零和另一个数组形状的数组
与上面的方法类似,如果您想要创建一个具有另一个 NumPy 数组形状的 NumPy 零数组,请使用[np.zeros_like()](https://numpy.org/doc/stable/reference/generated/numpy.zeros_like.html)方法
方法 19:空数组和另一个数组的形状
要创建一个采用另一个 NumPy 数组形状的空 NumPy 数组,使用[np.empty_like()](https://numpy.org/doc/stable/reference/generated/numpy.empty_like.html)方法:
方法 20:用特定值和另一个数组的形状填充的数组
最后,如果您想要创建一个具有特定填充值的 NumPy 数组,它与另一个 NumPy 数组具有相同的形状,那么使用[np.full_like()](https://numpy.org/doc/stable/reference/generated/numpy.full_like.html)方法。
#21 — #25 创建随机数字数组
在这一节中,我将演示用随机值生成 NumPy 数组的方法。
方法 21:随机整数数组
要生成整数的随机 NumPy 数组,使用[np.random.randint()](https://numpy.org/doc/stable/reference/random/generated/numpy.random.randint.html)方法:
方法 22:浮点值的随机数组
要生成浮点值的随机 NumPy 数组,请使用[np.random.random()](https://numpy.org/doc/stable/reference/random/generated/numpy.random.random.html)方法。
方法 23:来自均匀分布的随机阵列
要从[0, 1)上的均匀分布生成随机 NumPy 数组,使用[np.random.rand()](https://numpy.org/doc/stable/reference/random/generated/numpy.random.rand.html)方法。
方法 24:来自正态分布的随机阵列
要使用µ=0和σ = 1从正态分布中生成随机 NumPy 数组,请使用[np.random.randn()](https://numpy.org/doc/stable/reference/random/generated/numpy.random.RandomState.randn.html)方法。
方法 25:正态分布的随机排列和特定的平均值和标准偏差
相反,如果您想从*X* ~ *N(µ, σ^2)*的正态分布中生成一个 NumPy 数组,请执行以下操作:
#26— #30 其他流行方法
方法 26:来自熊猫系列
如果您想将 Pandas 系列转换为 numpy 数组,您可以使用[np.array()](https://numpy.org/doc/1.23/reference/generated/numpy.array.html#numpy.array)来完成:
方法 27:来自熊猫数据框架
您还可以使用[np.array()](https://numpy.org/doc/stable/reference/generated/numpy.array.html)方法将 Pandas 数据帧转换为 NumPy 数组。但是,它将创建一个二维数组:
方法 28:从字符串中的值
要从字符串中的文本数据创建一维 NumPy 数组,请使用[np.fromstring()](https://numpy.org/doc/stable/reference/generated/numpy.fromstring.html)方法:
如果输入字符串有逗号分隔的值,可以按如下方式更改分隔符:
方法 29:定义 NumPy 数组的对角线
您可以使用[np.diag()](https://numpy.org/doc/stable/reference/generated/numpy.diag.html?highlight=diag#numpy.diag)方法创建一个沿对角线具有特定值的方形二维 NumPy 数组:
方法 30:从 CSV 文件
最后,如果您想要加载一个 CSV 文件并将其解释为一个 NumPy 数组,请使用[np.loadtxt()](https://numpy.org/doc/stable/reference/generated/numpy.loadtxt.html?highlight=loadtxt#numpy.loadtxt)方法。
CSV 文件的内容如下所示:
要创建一个 NumPy 数组,使用如下的[np.loadtxt()](https://numpy.org/doc/stable/reference/generated/numpy.loadtxt.html?highlight=loadtxt#numpy.loadtxt)方法:
由于第一行是标题行,我们跳过读取,从第二行开始。
结论
总之,在这篇文章中,我展示了 30 种创建 NumPy 数组的流行方法。
如果你想深入了解这个话题,请点击查看 NumPy 创建例程的官方指南。
感谢阅读!
🧑💻成为数据科学专家!获取包含 450 多个熊猫、NumPy 和 SQL 问题的免费数据科学掌握工具包。
✉️ 注册我的电子邮件列表 不要错过另一篇关于数据科学指南、技巧和提示、机器学习、SQL、Python 等的文章。Medium 会将我的下一篇文章直接发送到你的收件箱。
10 分钟内 Heroku + Docker
原文:https://towardsdatascience.com/heroku-docker-in-10-minutes-f4329c4fd72f
Python 应用程序的部署变得简单,而且是免费的

如果只需要精通一门编程语言,那么在本地机器上启动一个 web 应用程序是很容易的。然而,部署一个 web 应用程序需要大量的试验和错误,特别是当涉及到更多工具时,您现在必须担心部署环境、可伸缩性和其他问题。如果您正在寻找部署一个 Python web 应用程序(例如 Flask/Django),那么这篇文章就是为您准备的!如果你已经对 Heroku 和 Docker 有所了解,可以跳过前三节。
更新 :本文是系列文章的一部分。查看其他“10 分钟内”话题 此处 !
目录
- 为什么是 Heroku?
- 为什么是 Docker?
- 码头工人速成班
- 在 Heroku 部署码头工人
为什么是 Heroku?
Heroku 是一个云平台即服务(PaaS),允许应用程序托管在云上。对于寻找 Python 应用程序免费托管平台的人来说,Heroku 是十大选择之一(尽管也有付费层)。
对于免费层,Heroku 提供了与 GitHub 的集成,并使用 Heroku 容器进行部署,称为dyno。我还会提到一些我觉得很麻烦的使用免费层的注意事项。
- 无法选择自定义域,因此应用程序将由
<app-name>.herokuapp.com域托管 - 没有 SSL 证书,但一个解决方法是手动输入
https://来获得相同的安全锁图标 - Free
dynos会在一段时间不活动后休眠,因此重启应用程序需要一段时间(大约 1 分钟)来启动容器 - 存储库将被编译成一个
slug,如果段大小超过 500 MB,性能将开始下降。这将严重限制存储库的大小。一种解决方法是将您的应用程序编译成 Docker 映像,并绕过 slug 大小要求
更新 : Heroku 已于 2022 年 11 月移除其免费层,替代方案是使用 Google Cloud 或 Fly。如果你使用的是付费版本的 Heroku,请继续阅读!
为什么是 Docker?
Docker 帮助在称为容器的包中交付 web 应用程序。使用容器是部署的最佳实践,因为每个容器都有自己的软件、库和配置文件,并且很容易扩展或缩小 web 应用程序。然而,在 Heroku 免费层,我不认为有一个选项来扩展 web 应用程序。
上一节的最后一个警告也是我选择从使用 Heroku 容器切换到 Docker 容器的原因。我正在扩展我的 web 应用程序,意识到我的存储库变得太大了,而我的 web 应用程序越来越慢。在切换到 Docker 容器后,我的 web 应用程序甚至比在我的本地计算机上运行得更快!
我建议将 Heroku 与 Docker 结合使用,使您的 web 应用程序面向未来,这样您就不必像我一样进行切换。
码头工人速成班
如何创建一个容器的指令通常写在一个Dockerfile中,编译时要忽略的文件可以在.dockerignore中找到。下面是一个.dockerignore文件的示例,但是如果您希望 Docker 编译存储库中的所有内容,这个文件是可选的。
__pycache__
*.pyc
env/
db.sqlite3
docs/
*.log
对于Dockerfile,有一些常用的命令,
FROM在Dockerfile的开头使用一次,表示使用哪个基础映像,在我们的例子中,我们希望使用一个支持 Python 的基础映像ARG定义用户在构建时传入的变量。在下面的示例中,port是构建 Docker 映像时要传入的参数USER运行 Docker 镜像时设置用户名或用户组COPY将文件和目录复制到容器中WORKDIR设置容器的工作目录ENV设置环境变量RUN运行 shell 命令,该命令在 Linux 上调用/bin/sh -cEXPOSE通知 Docker 容器在运行时监听指定的网络端口,用于本地测试 Docker 应用程序CMD在Dockerfile的末尾使用一次,包含运行执行容器的最终命令
关于 Docker 命令完整列表的信息可以在 Docker 文档中找到。下面是Dockerfile的样图,
FROM python:3.8-slim
ARG port
USER root
COPY . /<your-app>
WORKDIR /<your-app>
ENV PORT=$port
RUN apt-get update && apt-get install -y --no-install-recommends apt-utils \
&& apt-get -y install curl \
&& apt-get install libgomp1
RUN chgrp -R 0 /<your-app> \
&& chmod -R g=u /<your-app> \
&& pip install pip --upgrade \
&& pip install -r requirements.txt
EXPOSE $PORT
CMD gunicorn app:server --bind 0.0.0.0:$PORT --preload
最好在部署之前测试一下Dockerfile是否能够在本地编译,这需要构建 Docker 映像并运行它。
- 构建 Docker 映像:下面的命令传入了
port参数,映像名为tmp_image、docker build --no-cache --build-arg port=8060 -t tmp_image . - 运行 Docker 镜像:以下命令将 Docker 镜像的端口映射到本地端口,以便可以在本地查看 web 应用程序,
docker run --rm -p 8060:8060 tmp_image
在 Heroku 部署 Docker
假设您已经有了 web 应用程序的文件夹结构,那么您只需要另外 3 个文件来部署到 Heroku。其中两个文件是 Docker 的指令,如前一节所述,最后一个文件heroku.yml包含 Heroku 的部署指令。下面是示例项目文件夹结构,
your-app
|-- **.dockerignore**
|-- app.py
|-- **Dockerfile
|-- heroku.yml** |-- requirements.txt
对于heroku.yml文件,您只需要指明部署使用的是 Docker,文件如下所示,
build:
docker:
web: Dockerfile
完成了!剩下的就是按照屏幕上的指示将 Heroku 链接到您的代码库,您的 web 应用程序将在构建完成后准备就绪!
希望你已经学会了如何使用 Docker 在 Heroku 上部署 Python 应用程序。如果您有兴趣查看我以同样方式部署的 web 应用程序,链接在下面!
感谢您的阅读!如果你喜欢这篇文章,请随意分享。
相关链接
Heroku 部署文档:https://dev center . heroku . com/categories/deploying-with-docker
Dockerfile文档:https://docs.docker.com/engine/reference/builder/
heroku.yml文件:https://devcenter . heroku . com/articles/build docker-images-heroku-yml
异质处理效应与元学习者
原文:https://towardsdatascience.com/heterogeneous-treatment-effect-and-meta-learners-38fbc3ecc9d3
使用 S 学习器、T 学习器和 X 学习器的因果推理

到目前为止,在我们之前的文章因果推断入门 和 因果推断方法中,我们谈到了平均治疗效果,这有助于我们理解是否应该给予特定的治疗,例如,我们是否应该推出特定的营销活动,或者我们是否应该提高产品的价格(我们是否应该治疗)等。但它没有告诉我们应该为谁推出或提高价格,因为治疗的效果因人而异(我们为谁治疗),如果我们为此进行优化,那么我们就有更好的机会提高我们的投资回报率。我们现在希望超越我们在以前的博客中讨论的平均治疗效果(ATE ),并估计条件平均治疗效果 (CATE) 或异质治疗效果,以更好地个性化治疗方案,并了解治疗效果如何因人而异**
机器学习模型在估计 E[Y|X]方面做得很好,因为在预测宇宙中,我们是被动的观察者,在给定一组特征 X 的情况下预测结果 Y,比如销售。但在行业中,我们希望调整某些杠杆来增加销售,我们对 E[Y|X,T]更感兴趣,其中 X 是我们不能或不想控制的一组特征,T 是我们希望干预以增加销售的治疗变量。异质处理效应是在 Xᵢ.的背景下,估计 Tᵢ对 Yᵢ的因果关系的过程
大多数情况下的因果推断涉及根据治疗效果对单位进行排序,例如,寻找更有可能对治疗做出积极反应的单位/个人。在进入元学习者之前,让我们用一个价格弹性的例子来理解美食,使用我们知道的最简单的模型,回归。假设一家果汁店想知道他们如何在不损失销售额的情况下改变价格,即价格相对于温度或星期几的弹性,等等。这是同样的玩具数据集。

让我们建立一个简单的模型来获得价格弹性,即价格的单位变化如何影响销售。这正是回归系数给我们的。

我们看到价格的平均治疗效果(ATE)为-1.025,这对于所有单位都是不变的。但更有用的是价格弹性如何随温度变化,因为这将使我们能够在某些日子改变价格,而不会损失大量销售。我们可以通过回归在方程中引入一个相互作用项来做到这一点

这里价格弹性由-3.45 + 0.0848 *temp 给出。价格对销售的影响随着我们果汁品牌温度的升高而降低。这是一个非常简单的例子,仅仅用来介绍美食的概念。现在,让我们深入研究元学习者和更多行业使用的 CATE 案例。
元学习者
元学习器是一组建立在随机森林、Xgboost 或神经网络等机器学习算法之上的算法,用于帮助估计 CATE。 【昆泽尔】
s 学习者
在 S 学习器或单估计器学习器中,治疗指示符作为一个特征被包括,类似于所有其他特征,而该指示符没有被赋予任何特殊的作用。然后我们在不同的状态下进行预测,预测的差异就是我们的 CATE 估计。

作者图片

我们将始终使用这个示例,其中 w 是我们的处理方式,可以是任何形式的干预,例如,发送给银行客户的电子邮件。


的学习器是一个非常简单的模型,它可能对某些数据集工作得很好,但是由于它部署了单个 ML 模型,该模型通常是一个正则化的模型,它倾向于将处理效果偏向零。如果处理效果在解释结果方面很弱,学习者可以完全忽略处理变量。下一个学习者克服了这个问题。
t 学习者
T 学习器通过为每个治疗值建立一个模型来克服完全忽略治疗效果的问题,对于二元治疗,开发了两个模型,因此命名为 T 学习器

作者图片


t 学习者避免不拾取弱的处理效果,但是仍然遭受正则化。考虑来自 Künzel 等人 2019 年的这篇论文中的例子。假设治疗效果是恒定的,并且我们在结果 Y 中有一些非线性,并且治疗单位的数量远少于对照单位

来源:https://arxiv.org/pdf/1706.03461v3.pdf
因为我们只有几个经过处理的观测值,M₁将是一个简单的线性模型,而 M₀将更加复杂,但由于我们有更多的控制单元数据,它不会过度拟合。然而,当我们估计 M₁(x)-M₀(x 的凯特时,从 M₁的线性中减去 M₀的非线性,将得到非线性的凯特,这是错误的,因为凯特在这种情况下是常数 1。为了克服这个问题, 昆泽尔 在同一篇论文中提出了 X 学习者。
x 学习者
X 学习者使用来自对照组的信息来为治疗组开发更好的估计器,反之亦然。它有三个步骤,其中之一是倾向得分模型。

作者图片

使用与上面相同的数据,künzel解释 X 学习者如何克服 T 学习者的弊端。在第一阶段,我们开发了两个类似于 T 型学习者的模型。在第二阶段,我们计算 τ(X,T=0) ,其中是对未治疗者的估算治疗效果,基于 τ(X,T=0) 的模型不好,因为 M₁是使用较少数据建立的简单模型,它没有捕捉 y 中的非线性,因此 τ(X,T=0) 是非线性的。 τ(X,T=0)是用红点表示的,而 Mτ0(X)是用红色虚线表示的。
用蓝点表示的处理过的 τ(X,T=1) 的估算处理效果,使用在较大的未处理模型上训练的 M₀来估计,并且由于其估算处理效果是正确的,我们能够获得正确的 Mτ1(X) 模型。

https://arxiv.org/pdf/1706.03461v3.pdf
因此,我们有两个模型,一个具有基于大量未处理数据的正确估算处理效果,另一个具有不正确的估算处理效果。我们结合这些第二阶段模型使用倾向得分

e(x)是倾向得分模型,并且由于我们有很少的处理单元,e(x)很小,给不正确的模型 Mτ0(X) 较小的权重,给正确的模型 Mτ1(X) 较大的权重 1-e(x)

**【https://arxiv.org/pdf/1706.03461v3.pdf **

我们不必自己实现这些学习器。 异构处理效果 有两个因果学习库,一个来自优步,名为CausalML,另一个来自微软,名为EconML,也提供了特征重要性和 Shapley 值的函数
使用 causalml 实现 X 学习器。

X 学习器的 EconML 实现

我强烈建议浏览一下CausalML和EconML文档中的元学习器和附加支持函数。**
元学习者通常在行业中用于提升建模。下面是几个来自 Booking.com 优步和瑞士的案例研究,元学习者被用来解决与行业相关的问题。
案例学习和研究:使用元学习者的提升建模
在优步使用元学习者进行多种处理成本优化的提升建模
在本文中,我们将元学习者视为评估 CATE 的方法之一。然而,元学习者不能进行连续的治疗。在下一篇文章中,我们将看看另一种称为双机器学习的方法,它对连续和离散处理都有效。
参考
- https://matheusfacure.github.io/python-causality-handbook/
- https://arxiv.org/pdf/1706.03461v3.pdf
- https://www.youtube.com/watch?v=88WHWv5QSWs&list = ploazktcs 0 rzb 6b 9 l 508 cyj 1z-u 9 iwka 0&index = 44
- https://econml . azure websites . net/spec/estimation/metal leakers . html
- https://causalml . readthedocs . io/en/latest/methodology . html # x-learner
基于双机学习的异构处理效果
使用双机器学习的因果推理

马库斯·温克勒在 Unsplash 上的照片
本文是下面链接的因果推理系列的延续。如果你是因果推理空间的新手,我强烈建议你先浏览下面的文章。
1 .因果推理入门
双机器学习(DML) 是估计异质治疗效果的方法,尤其是当我们有大量混杂因素时。与我们在上一篇文章中讨论的元学习者不同,它也适用于连续治疗。该方法在获得 2020 年诺贝尔经济学奖的论文中介绍了治疗和因果参数。
DML 基于这种很酷的回归概念,即如果您有两组特征 X₁和 X₂,您使用线性回归估计模型参数β₁和β₂y =β₁x₁+β₂x₂,然后通过以下步骤可以获得相同的参数集β₁can
- 回归 y 的第二组特征 Y₁ᵣ= γ₁X₂
- 在第二组要素上回归第一组要素 X₁ᵣ = γ₂ X₂
- 获取残差 Yᵣ = Y- Y₁ᵣ,xᵣ=x₁-x₁ᵣ
- 回归特征残差的结果残差 Yᵣ = α+ β₁Xᵣ
我们将通过一起回归所有要素来获得相同的β₁as。很酷吧。第一组特征(上面的 X₁)可以是我们的治疗方法,第二组特征可以是混杂因素,其对结果的影响可以单独估计。
双/去偏置机器学习
DML 使用上面解释的这个非常简单的想法,但是它使用 ML 模型而不是线性回归,因此我们可以在估计结果和治疗残差时处理非线性和相互作用。
yᵢ-mᵧ(xᵢ)=τ(tᵢ-mₜ(xᵢ))+εᵢ
Mᵧ(Xᵢ)是通过对 x 回归 y 获得的结果,而 Mₜ(Xᵢ)是通过对 x 回归 t 获得的结果。 τ 是在控制混杂因素后治疗对结果的影响,但它是一个常数,而不是任何协变量的函数,也就是说,它代表吃了(平均治疗效果在以前的文章中详细讨论过 因果推断入门 和推断方法
我们还可以估计 CATE,其中允许 τ 随单位的协变量而变化
yᵢ-mᵧ(xᵢ)=τ(xᵢ)(tᵢ-mₜ(xᵢ))+εᵢ
为了使用 DML 估计 CATE,我们将使用治疗和结果的残差,但现在我们将使用其他协变量来处理残差。
Yᵣ = β₁ + β₂XᵢTᵢᵣ
DML 可能遇到的一个问题是过度拟合。如果 Mᵧ模型过度拟合,剩余 Yᵣ将比它应该的要小,捕捉到的不仅仅是 x 和 y 之间的关系,还有 t 和 y 之间的关系,这将使因果估计(剩余回归)偏向于零。如果 Mₜ过度拟合,治疗残差的方差将小于它应有的方差。似乎每个人的治疗都是一样的,这使得很难估计在不同的治疗方案下会发生什么。因此,建议在结果和治疗模型中使用交叉验证
让我们编写代码,通过一个例子来理解这一点。我们将使用一个果汁品牌的合成销售数据。我们的目标是预测价格对温度的弹性。


让我们现在使用微软开发的 EconML 库中的 DML 函数,而不是开发我们自己的 DML 函数。我强烈建议浏览一下关于 DML 的 EconML 文档 ,因为他们的库中有不同版本的 DML。

非参数 DML
在上述设置中,我们对残差使用线性模型,这意味着我们假设治疗对结果的影响是线性的,这种假设可能不总是成立的。
我们已经看到了这个等式
yᵢ-mᵧ(xᵢ)=τ(xᵢ)(tᵢ-mₜ(xᵢ)+εᵢ
如果我们重新排列,我们得到的误差项为
εᵢ=(yᵢ-mᵧ(xᵢ))—τ(xᵢ)(tᵢ-mₜ(xᵢ)
这就是我们所说的因果损失函数,我们可以将其最小化以获得τ(Xᵢ),我们的美食。
lₙ(τ(x))= 1/nσ((yᵢ-mᵧ(xᵢ))—τ(xᵢ)(tᵢ-mₜ(xᵢ))
利用剩余项,我们得到这个
lₙ(τ(x))= 1/nσ(yᵢᵣ—τ(xᵢ)tᵢᵣ)
除掉 Tᵢᵣ,孤立τ(Xᵢ)
lₙ(τ(x))= 1/nσtᵢᵣ(yᵢᵣ/tᵢᵣ——τ(xᵢ)
我们可以通过最小化括号内的内容并使用 Tᵢᵣ作为权重来最小化上述损失。以下是步骤
- 创造 Tᵢᵣ
- 创造 Yᵢᵣ/Tᵢᵣ
- 使用任何最大似然模型预测 Yᵢᵣ/Tᵢᵣ,使用 Tᵢᵣ作为权重。
让我们使用非参数 DML 来预测上述示例的 cate。

DML 通常用于解决行业中的价格弹性问题,因为它可以很好地处理连续处理。下面是一些双机器学习被用来解决行业相关问题的案例研究
个案研究
参考
- https://matheusfacure.github.io/python-causality-handbook/
- https://econml.azurewebsites.net/spec/estimation/dml.html
- 双机治疗及因果参数
嘿,艾——给我讲一段关于彩虹的话
原文:https://towardsdatascience.com/hey-ai-tell-me-a-quote-about-rainbow-f351340ffb45
一个动手的人工智能项目

由作者设计。照片由欧文比尔德 & 阿比盖尔基南在 Unsplash
在这篇文章中,我们将学习如何建立一个人工智能程序,与我们分享特定的报价。该计划有不同的层次:语音识别,生成报价,并将文本转换为语音。在我以前的文章中,我已经讨论了语音识别和文本到语音转换的主题。
当我决定写一篇关于报价生成的文章时,我说为什么不通过添加人工智能来增加一点趣味呢。这是一个非常有趣的项目。关于这个话题,我有更多的想法,希望以后能写出来。
在不损失任何时间的情况下,我们开始吧。
目录
- 入门
- 第一步——库
- 步骤 2 —语音识别
- 步骤 3 —报价生成
- 最后一步—人工智能阅读报价
入门指南
让我首先列出这个项目的组成部分。我们只需要三个 python 库,分别是: quote,pyttsx3 和语音识别。
Quote 是 Goodreads quote API 的 python 包装器。
Pyttsx3 是一个文本到语音的 python 库。使用这个模块的一个很大的好处是,它可以离线工作,不需要互联网连接。
语音识别是一个语音到文本的 python 库。它支持多种语音识别引擎,例如:
- Microsoft Bing 语音识别 API
- IBM 语音转文本 API
- 谷歌云语音 API
- 还有更多。
现在我们对我们需要的包有了一个想法。为了能够使用它们,我们必须使用 pip 安装它们。PIP 是一个 python 库管理器工具。帮助组织库和包。我们将在终端窗口中运行下面一行来开始安装:
pip install quote pyttsx3 speechrecognition
步骤 1 —库
现在我们已经安装了库。我们可以将它们导入到我们的程序中。请随意使用任何类型的文本编辑器。
from quote import quote
import pyttsx3
import speech_recognition as sr
我已经在入门部分分享了每个包的文档。如果你想更多地了解它们是如何工作的,你可以检查它们。
步骤 2 —语音识别
在这一步,我们将学习如何使用 python 来识别语音。识别是直接通过麦克风进行的。它一直听到你停止说话,然后把它转换成文本。我挑的是谷歌的识别器引擎,基本使用不需要 API 键。但是如果您想使用不同的识别器引擎,请随意。
dynamic_energy_threshold 是我们定义麦克风在静音时应该停止监听的地方。我选择这个设置是因为用户可能会做一个很长的演讲,我不想被一个设定的持续时间所限制。
演讲大概是这样的"嘿,AI,给我讲一段关于彩虹的话。“关键词必须在演讲的结尾。我们要做的是将识别出的单词拆分成一个列表,并将最后一项作为我们的关键字。
这里是代码:
r = sr.Recognizer()
r.dynamic_energy_threshold = Falsewith sr.Microphone() as source:
print("Say a keyword: ")
audio_text = r.listen(source)
print("Time is over.")
s = r.recognize_google(audio_text)words = s.split()keyword = str(words[-1])
第 3 步—报价生成
keyword = str(keyword)result = quote(keyword, limit=3)
这里没什么复杂的。
我们只是将关键字转换成一个字符串。然后将它传递给 quote 函数,这是我们之前安装和导入的包。
它有两个参数,第一个是关键字,另一个是我们想要得到的报价数量。报价函数将我们连接到 Goodreads 的报价 API。
r = (random.randint(0, 2))quote_ = result[r]['quote']
author_ = result[r]['author']
在上面的代码中,我们将结果的值赋给两个不同的变量。返回的结果是一个字典,它现在存储着 3 个不同的报价。我喜欢做不止一个,这样当我们使用相同的关键字时,我们可以得到不同的报价,而不是同一个。
从中获得引用和作者值后,我们要放入一个句子。它必须是一个写得很好的句子,因为在下一步,我们将要求机器为我们读它。
这是我写的句子格式:
text = ("Quote of the day is about " + keyword + " by " + author_ + ". \n\n " + quote_)print(text)
以下是我们运行该程序时的一些引用示例:

图片由作者提供。
最后一步—人工智能阅读报价
在这最后一步,我们将定义我们的文本到语音转换引擎。我们使用的是 pyttsx3 库。这个库为不同的语言提供了许多不同的语音引擎。如果您想尝试不同的语音引擎,请查看我在简介中分享的文章。
代码如下:
engine = pyttsx3.init()en_voice_id = "com.apple.speech.synthesis.voice.Alex"engine.setProperty('voice', en_voice_id)engine.say(text)engine.runAndWait()
是时候看看代码是如何运行的了。
将文本文件保存为 python 文件。我把我的名字命名为: listen_to_quote.py
现在,让我们打开用来安装库的终端窗口。然后,我们将转到保存 python 代码的文件夹。然后我们会运行它。
由作者制作的视频演示。
结论
恭喜你。在这个实践教程中,我们学习了如何构建一个程序来读取与特定关键字相关的引用。我们在语音转文本和文本转语音库方面也有一些经验。我喜欢创建和从事这类项目,因为它们是机器学习和人工智能在我们日常生活中的伟大应用。
我是贝希克·居文,我喜欢分享关于编程、教育和生活的故事。订阅我的内容,保持灵感。泰,
如果你想知道我写什么样的文章,这里有一些:
嘿,首席执行官:人工智能救不了你!
原文:https://towardsdatascience.com/hey-c-suite-ai-wont-save-you-f160d38214e3
数据是有故事可讲的。如果我们允许自己倾听就好了。

存放照片,boule 1301 商业使用的标准许可证
本文是与 Infornautics 的负责人大卫·戈塞特(David Gossett)的合作,他构建了没有指令集、需要从头发明的先行者技术。他认为,如果我们应用正确的机器模型,数据就能讲述一个故事。他的专长是非结构化数据。这篇文章旨在引起人们的兴趣,唤起人们对当今困扰我们的机器学习问题的好奇心。我们在搜寻异常点。
三年前,我写了这篇文章,人工智能需要重置。人工智能的大肆宣传被认为是所有事情都自动化了,但这还很遥远。从那时起,我们经历了一些问题,包括缺乏模型责任(黑盒)、偏见、训练集中缺乏数据表示等。一场人工智能伦理运动出现了,要求更负责任的技术,增加模型透明度和可验证的模型,这些模型在这个过程中做它们应该做的事情,而不会损害或伤害个人或群体。
我们的未来是人工智能。据推测,这个神奇的人工智能将成为我们的救世主。我们一直处于信息过载的状态。当我们一天中的每一秒钟都在产生 Pb 级和 Pb 级的数据时,我们没有人类的能力去理解这些海量的信息。我们已经越来越依赖机器来为我们做这些。这就是问题所在。它不起作用。不完全是。
已经成为我们日常生活基础的规则,随着时间的推移,已经成为既定的规范,或者随着我们的学习和发展而不断完善的实践。为了防止在交通繁忙的十字路口发生车祸和行人被车撞,街灯指示了人们被允许过马路和车辆可以行驶的准确时间。这是演绎推理的一个例子。可能会有一两个前提,最后是基于证据的结论。这个基于规则的系统非常以人为中心。x 发生了?那就做 y。
前提 1 :交通流量大的路口车祸事件高发。
前提二:在人流量大的十字路口,人员伤亡事件高发。
规则:在交通繁忙的十字路口安装红绿灯。

大卫·戈塞特,信息技术
大数据的到来,让我们从演绎推理转向了现在的归纳推理。归纳推理来自大量的观察,其目标是寻找模式以做出总体概括。从数据中创建模型被称为模型归纳。这些一般规则是统计性的,因此并不是 100%的时间都适用。数据中的这些观察继续“直到我们越来越接近真相,我们可以接近,但 不能完全确定。“将归纳推理应用于这两个场景将如下所示:
数据:在多伦多和纽约,交通事故发生率很高。
假设:大城市往往交通事故发生率高。
规则:在上午 9 点-下午 5 点之间的城市路口至少有 1000 辆车和 500 个以上行人的地方安装红绿灯。

大卫·戈塞特,信息技术
今天的,人类编写计算机程序。客户告诉程序员需要什么功能,然后程序设计并构建应用程序。

大卫·戈塞特,信息技术
明天,随着 AI 成为常态,计算机将为我们编写程序。客户将向计算机提供功能需求和数据,计算机将编写应用程序,无需任何人工干预。

大卫·戈塞特,信息技术
未来的决策将由归纳模型 驱动,更多的是基于概率的观察,这些观察将最终影响新的规则和决策。正如我们将在后面看到的,这造成了一个难题。

大卫·戈塞特,信息技术
曲线拟合和 P-Hacking 的后果
当研究人员创建模型时,标准操作程序是创建最佳拟合线。这仅仅意味着给定一组观察值(或数据),我们需要确定数据之间的单一函数或数学关系。这种数学关系可用于根据输入与原始数据结果的关系来预测结果。例如,研究人员将使用各种非线性回归模型方法来拟合数据。一旦数据被输入到模型中,它就会生成一个分数,分数越高,模型就越适合。
在下面的例子中,生成的图表只显示了“OK”拟合。假设满分为 1000,最佳模型返回的分数为 744。给定用于曲线拟合数据的模型的数量,结果显示,倾向于“单独”或“在大多数观察结果倾向于聚集的地方之外”的观察结果是异常值。这些用红色箭头表示。这些都是异常现象。他们是这篇文章的主角。被忽视的。省略了。

大卫·戈塞特,信息技术
我们为什么要关心异常现象?
在大多数模型中都有异常值。这些异常值中的一些可以被认为是异常。异常是“不同的”或“不正常的”。因为它们没有遵循一个共同的趋势,许多研究人员倾向于把它们当作噪音而不予考虑。研究人员将尝试各种回归模型,直到他们得到一个很好的分数或可能的最佳拟合。
我和一位研究人员一起徒步旅行,当我告诉他,“你不应该做曲线拟合,你知道的!你只是把数据分成一条直线。徒步旅行的时候那家伙一个小时都没和我说话。他就是这么被冒犯的。他证明了曲线拟合将消除噪声。
这篇名为P-hacking的文章是这样定义的:
“一种被称为‘p-hacking’的偏见发生在研究人员收集、选择数据或统计分析,直到不重要的结果变得重要的时候。”
这篇论文的结论是,在科学界有很大的动力去发表有统计学意义的结果。雇主、资助者和评论者通过计算期刊的影响来评估研究人员的表现。
在一项为期 8 年的癌症研究中,人们试图重现从 53 篇顶级癌症研究论文中收集的 193 项实验的结果。他们的结论是不到 25%的实验是不可重复的。有人指出,⅓实验的作者没有回复提供更多信息的请求。其他人对想要复制他们作品的人表现出敌意。这篇文章验证了 P-hacking 论文中的类似结论:
“复制也可能让人感到害怕,因为科学家的生计甚至身份往往深深植根于他们的发现中……”发表是进步的货币,是一种关键的奖励,可以转化为获得资金、工作和保住工作的机会……复制并不完全符合这种奖励体系。”
在我们的另一个宇宙中,除了曲线拟合,我们还质疑为什么我们要限制自己?与其黑掉数据,为什么我们不分析异常点?
想想现在大多数的飞机都是由电脑程序员驾驶的。主题专家和工程师合作,为飞机可能遇到的每一种可能的情况编写代码。但是,有时候,并不是所有的情况都考虑到了。
虽然航空公司长期以来一直在安全地使用自动化来提高效率和减少飞行员的工作量,但最近的几起事故,包括 2013 年 7 月韩亚航空 214 航班的坠毁,表明通常使用自动化飞行的飞行员在遇到意外事件或过渡到手动飞行时可能会出错。 ~总监察长在给 FAA 的信中
2018 年,一架从巴西飞往巴黎的法航飞机在自动驾驶仪故障和机组人员失误导致飞机失速后坠入大西洋。机上 228 人全部遇难。调查发现“外部速度传感器被冻结并产生不规则读数,飞机陷入空气动力失速”。
2014 年,一架亚航飞机坠入爪哇海,原因是恶劣天气下自动驾驶仪启动,飞行员的错误决定导致飞机失速,导致 162 人死亡。
这些悲惨的航空事件有什么共同点?程序员没有为这些场景编写一行代码。此外,飞行员在驾驶舱里变得令人震惊地无知。当计算机代码丢失了一行,飞机的控制权必须交给飞行员时,飞行员就完全脱离了实践。
《黑天鹅》的作者纳西姆·尼古拉斯·塔勒布说过这样的话:
“救了一条命就是一个统计;一个人受伤是一件趣闻。统计是看不见的;轶事是突出的。”
美国人将记住 9/11 和 2977 起死亡事件,因为我们在全国电视上见证了这一天;然而,当我们将这一事件与二战后回家的战争英雄的数量相比较时,估计约有 75 毫米口径的坦克死亡——就不那么令人伤感了。正是这些突出的事件将推动巨大的变化,正如 9/11 后的地缘政治事件所证明的那样。
但是,如果这些异常现象得到足够的重视,这些事故本可以避免吗?
最近,一名没有飞行经验的乘客在飞行员晕倒时,成功地将飞机安全着陆。这位乘客展示了相当于一名学生完成首次单飞的技能。这件事真的那么罕见吗?是否应该对此进行分析,以确定如何让没有飞行经验的乘客在这种紧急情况下安全着陆?
为什么没人注意异常现象?
异常现象从一开始就存在。出乎意料,没有计划,但“巨大”的后果:震惊华尔街的安然丑闻。60 亿美元的矿业欺诈。战争(一战、二战、越南)充满了“未知的未知”。我们意识到我们今天所做的决定的长期影响了吗?我们认识到政府授予的 Covid-relief 福利使数百万受到不利影响的人受益。但是,未来十年,当我们的孩子支付激增的高税收时,他们会开始感受到下游效应吗?
今天的不同之处在于,随着互联网的发明,我们现在被大量的信息淹没了。庞大的数据量使得人类越来越依赖算法来理解这一切。在这些数据中有更多的知识,更多的细微差别,更多的结果。但是,我们倾向于倾向于那些更有可能发生的,无关紧要的事件。《T8》《T9》《T10》《黑天鹅》《T11》《T12》《反脆弱》的作者纳西姆·尼古拉斯·塔勒布这样说:
“我发现这是可耻的,尽管有经验记录,我们继续预测未来,好像我们很擅长,使用排除罕见事件的工具和方法。预测在我们的世界里已经被牢牢地制度化了。”
我们在科技网站上做了一个简单的搜索,比如 IBM、微软、思科、咨询公司和特定行业的公司,看看“人工智能”和“异常”或“异常检测”出现了多少次。
从方向上看,我们发现大多数网站都显示出明显更高的机器学习和人工智能搜索结果,而异常/检测相比之下则相形见绌。
然而,当我们比较“异常检测的关键词搜索结果时,突出的是科技公司(IBM、微软、思科、英特尔、甲骨文)明白异常确实很重要。咨询公司很少提到“异常”,在保险、金融和工业公司中几乎没有提到。鉴于上述亚航和法航坠机的例子,有理由认为“异常检测”应该在航空业得到更多的提及。

大卫·戈塞特,信息技术
涓滴效应
通常,驱动结果的是我们可以解释的事件——具有统计显著性并驱动高成功概率的事件。
最高管理层推动目标的实现。在一家大型出版平台工作时,我们的主要目标是影响力、收入和参与度。这些要求已经落实到员工身上,并根据这些目标进行了衡量。他们的工作,他们的奖金依赖于他们的个人表现。
我认识一个人,他在一家大型科技公司担任隐私主管,直接向首席执行官汇报。她的工作是确保他们的用户能够轻松有效地找到和浏览他们的隐私设置。她的工作表现是通过用户对隐私的满意度来衡量的。她确保与管理相关页面的工程师合作,以确保实现她的目标。然而,工程师受到激励,以确保用户参与到平台中。隐私主管指导的一些页面推荐会妨碍他充分实现目标的能力。由于高管层强加的要求(记住,参与是一个关键的要求)与工程师的目标更紧密地联系在一起,猜猜谁最终实现了他们的目标?
通常情况下,由首席执行官制定的目标会产生自我实现的结果。清楚的是,员工将只交付将产生预期结果的任务(由高管团队推动)。如果有异常,它们会被丢弃,并被描述为不太可能再次发生的事件,或者简单地称为噪音。他们不关注他们。
问题在于:使用人工智能的员工正在向高管们提供他们所要求的信息,他们的奖金取决于这些信息,结果也与总体目标一致。这些结果不会带来惊喜,因为数据会回归到平均值。
人工智能不属于高管层
高管们的这种涓滴效应也暴露了另一种效应——我们变得如此专注于自己的具体工作和任务,以至于看不到全局。人们已经习惯于做一个轮子上的齿轮,当他们被提升到舵手室时,他们不能充分地表现。
伊恩·麦克吉尔克里斯特写了《大师和他的使者》。他研究了我们两个大脑半球之间的关系,将其作为“T2”在我们文化中的关键塑造因素他质疑了左脑的主导地位,后者专注于细节和具体问题,而右脑则看到更广阔的视野,查看许多数据点以了解正在发生的事情。虽然两者共存并可以相互依赖,但右侧的能够领会“隐喻、笑话或未言明的含义”,其中的“左侧”显然是自闭的”。
这里有一个有趣的类比:一只鸟在公园里寻找食物。它需要集中注意力,辨别种子和鹅卵石的区别。这种集中的左脑活动将让鸟儿找到下一顿美餐。然而,与此同时,这种鸟需要认识到任何可能在该地区的捕食者。它需要用右脑扫描环境才能生存。注意这两个事件:寻找食物和对潜在掠食者的意识都是生存的关键活动。McGilchrest 认为,人类长期以来依赖于我们的左脑,我们从未建立起用右脑有效做出决定的能力,尤其是当我们处于权力地位时。
因此,首席执行官们开始依赖数据,并要求员工向他们提供有效决策所需的信息。由于涓滴式激励结构加上这种排除了这些异常现象的左脑思维,决策者永远不会拥有让他们对形势有一个整体看法所需的所有信息。
由于只见树木不见森林,首席执行官们错过了更大的含义:异常现象可能指向可能导致破产的巨大风险,或者他们可以利用的巨大市场机会。
2021 年,美国安全监管机构开始调查特斯拉在造成 1 人死亡、17 人受伤的 11 起撞车事故后使用自动驾驶。马斯克坚称自动驾驶系统没有缺陷。报道表明,马斯克驳回了他们的驾驶辅助程序应该监控司机的想法,坚持认为任何人为干预都可能“使这种系统不太安全”。
具有讽刺意味的是:因为我们已经将可以预测的事情制度化,我们也已经将机器学习模型制度化,以忘记异常情况——这些最不可能发生的误报、漏报。我们已经背弃了这些东西,这就是为什么我们总是感到惊讶。我们对 2008 年的金融危机感到惊讶。我们对 911 感到惊讶。我们对入侵乌克兰感到惊讶。我们对新冠肺炎感到惊讶。当埃隆·马斯克想要收购 Twitter 时,我们很惊讶。
我们是否应该停下来想一想,如果高管层被告知这些异常情况,那么这些重大事件中的一些本来是可以避免的?事后看来,我们是否考虑过关注这些异常值,我们是否能有额外的洞察力来改变结果?
异常点不适合现有的系统。然而,他们指出了新的知识和深化和扩展现有理论的潜力——未开发的潜力,或已识别的风险。
丹尼尔·卡内曼:“我们容易高估自己对世界的了解,低估机遇在事件中的作用”
丹尼尔·卡内曼的《 思考快与慢 》介绍了他的系统 1 和系统 2 思考定位人类如何做决定。这也许可以解释为什么我们会被正态分布吸引?这是一种“固化”的系统 1 方法,是本能的、无意识的,已经形成了思维定势和过程。这个站点记录了关于正态分布的默认值:“对于数学统计学家来说,使用它们很容易。几乎所有的统计检验都可以从正态分布中推导出来。
让我们来看看模型和分布曲线的作用。曲线的形状揭示了更多数据所在的位置。
下面的中间图像(对称分布)数据分布与中心趋势成比例相等。例如,在杂货店 x,通过他们的数据,人们将持续每周来购买基本需求:面包、牛奶和鸡蛋。这种高度可预测的行为将倾向于位于曲线的最高点之下。在正态或对称分布下,这种行为的 65%位于中间左右 1 个标准差以内。对于数据科学家来说,这是一件好事。
但社会很少是这样运转的。数据科学不是这样工作的。

大卫·戈塞特,信息技术
当夏天来临时,人们会买更多的西瓜。这确实是唯一可用的时间段,因此这将产生一个正偏差。人们购买的西瓜越多,平均值就会向右移动。在一个完美的世界里,平均值应该在曲线的最高点。但是,随着我们将更多的西瓜购买量加载到模型中,这种极端的正偏度对于分布来说是不可取的。
我们没有意识到的是,有很多我们今天看到的正偏度例子:收入水平;房价;季节性购买;Etsy 的手工制作和复古商品;高级护发产品等等……我们的选择越多,积极的数据就越多。平均值现在将大于中值,甚至高于众数。
旁注:负偏度,即平均值小于中位数或众数,是非常罕见的。一个例子是:手指的数量。大多数人总共有 10 个,但在事故中可能会丢失一个或更多。
所以现在,我们不得不求助于数据转换工具来帮助使偏斜的数据更接近我们的正态分布曲线。所以一旦我们做到了这一点,我们现在就可以很容易地使我们的机器模型易于使用。
争论的关键在于:公司围绕平均值管理决策。按照卡尼曼的说法,“ 我们低估了机遇在事件 中的作用”。特斯拉否认了他们的系统应该考虑人类监控的建议。这能避免 11 起异常事故吗?飞机安全标准和规则只在飞行员熟练/能够在理想条件下飞行时才会考虑。当飞行员丧失能力时,他们应该考虑异常情况吗?
当我们考虑异常情况时,我们注意到这些情况很少发生,但它们“与大多数数据明显不同”,从而引起了怀疑。正如所证明的那样,他们的结果可能是重大的。
峰度:自我实现的预言?
因此,当我们默认为正态或对称分布时,在人工智能时代,机器会因为做对了而获得奖励。他们被奖励不越轨。我们的概率倾向是尽可能接近平均值,因为这是最安全的回报赌注。因此,当我们试图影响数据走向均值时,它开始堆叠曲线,并变得更高——这种效应被称为正峰度。(见下图)。记住,在正态分布曲线中,65%的数据位于距中心 1 个标准差以内。但是我们越提高峰度,曲线变得越细,我们开始看到 75%,85%,90%的数据突然位于均值的 1 个标准差内。在这一点上,模型越来越好地猜测这个中间值。
我们越提高峰度,就越关注中间发生的事情。因此,当一只股票的收益率远低于预期时,我们会变得更加惊讶。
峰度之所以重要,是因为它所创造的东西:越来越厚的尾部在频率和影响上不断增加,即异常,虽然仍然是异常值,但与较薄的正态分布曲线相比,发生率要高得多。

大卫·戈塞特,信息技术
峰度可以用来衡量金融风险。大峰态与高风险水平相关,这表明极大和极小回报的概率较高。
因此,当我们将这一点应用于这些罕见的世界事件时:COVID 疫情导致了 Covid 疫苗和更多关于口罩和流动性的政府规则,并产生了这些肥尾副作用,这些副作用鼓励了反 vaxxers 和自由言论活动家。
当我们肥了尾巴,我们有更高的峰值,更小的肩膀,和更高的非常大的偏差的发生率。~纳西姆·塔勒布

大卫·戈塞特,信息技术
ML 和人工智能爱回归。在峰度的例子中,紫色的点代表奖励。曲线外的灰点不予奖励。在新冠肺炎之前,总有一些宗教或其他方面的边缘团体不同意政府强制接种疫苗。但是疫情加剧了这场运动,这场运动在规模和频率上都获得了更大的动力,并演变成了一场自由运动——否则这是无法预料的。
由于未能注意到这种异常现象,以前看不到的事件可能会在规模和范围上扩大,在全球范围内实现,并变得不可控制。
只有当我们考虑所有的数据时,人工智能才会为我们服务
如果我们继续默认正态分布,并被激励去做直接报告组织目标的任务,而忽略最不可能发生的价值,我们将会失败。
在这个过程中,我们对创新和竞争优势的潜在机会视而不见。我们忽视了潜伏在我们中间的危险,这些危险可能会对企业产生深远的影响。
随着我们越来越多地冒险进入机器学习以及我们如何分析信息,详细说明什么已经成为规范非常重要。在人工智能的年轻生命周期中,它仍在试图找到进入主流组织的道路,它成功地创造了一条从一开始就被认为是错误的道路。我们正在用错误的激励结构来试验、创造过程和政策,这种结构使这些偏见和重复出现的数据问题永久化。我们只见树木不见森林,因为我们变得自满,对我们确信不会再次发生的结果不屑一顾。
除非我们跳出行业公认的标准去思考,否则我们将继续走在一条通向最终失败的道路上。
在我们的下一篇文章中,我们将提供一种替代方法——一种共识方法,让我们更清醒,更少惊讶。
关于大卫·戈塞特
Infornautics 的负责人大卫·戈塞特(David Gossett)认为,人类和人工智能目前都忽略了异常现象。David 使用高级模型来识别异常值中的模式,他认为异常值代表了公司的所有风险和机会。他的专业是非结构化数据,以前教过计算机阅读简历,并决定每个职位应该面试哪些候选人。他在四大会计师事务所工作,建立了一个销售自动化系统,管理着 7.5 亿美元的新收入。他还花时间在安然公司建立交易台基本面和套利工具。
这篇文章最初出现在福布斯上。
隐藏的数据科学宝石:标签编码的彩虹方法
通过利用自然秩序制作更强大和更简单的模型

介绍
假设您有 2,000 个特征,您需要建立最佳的预测模型(“在复杂性、解释、合规性以及最后但同样重要的性能方面是最佳的”)。任何曾经处理过大量分类变量并使用过流行的一键编码方法的人都很熟悉这种情况。通常,稀疏数据集不太适合高效的基于树的算法,如随机森林或梯度提升。
相反,我们建议找到一种顺序编码,即使类别中没有明显的顺序。我们介绍了 Rainbow 方法——一套识别好的顺序编码的技术——并展示了当与基于树的算法一起使用时,它比传统的 One-hot 有多种优势。
与 One-hot 相比,Rainbow 方法有以下优势:
- 资源效率
- 节省大量建模时间
- 节省存储空间
- 显著降低计算复杂度
- 减少或消除对分布式处理等“大数据”工具的需求
2。模型效率
- 显著降低模型维度
- 保持数据粒度
- 防止过度拟合
- 模型通过更简单的超参数达到最高性能
- 自然地促进特征选择
背景
不同背景的数据科学家可能对分类变量编码有不同的偏好。然而,普遍的共识是:
- 具有自然顺序的分类变量应该使用尊重该顺序的编码,例如序数编码;和
- 没有自然排序的分类变量,即名义变量,应该使用某种名义编码,而 One-hot 是最常用的方法。
虽然一次性编码经常被反射性地使用,但它也可能导致多种问题。根据类别的数量,它可能会产生大量的维度增加、多重共线性、过度拟合和整体非常复杂的模型。这些暗示与奥卡姆剃刀原理相矛盾。
当建模者对没有内在顺序的分类变量应用顺序编码时,这既不经常也不被普遍接受。然而,一些建模者这样做纯粹是为了建模性能的原因。我们决定探索(从理论上和经验上)这种方法是否有任何优势,因为我们相信分类变量的编码值得更深入的研究。
事实上,大多数分类变量都有某种顺序。上面的两个例子——完美的自然排序和没有自然排序——只是极端情况。许多真正的分类变量介于两者之间。因此,将它们转换成一个数字变量既不完全公平也不完全是人为的。这可能是两者的混合。
我们的主要结论是,当与基于树的算法一起使用时,对于任何分类变量来说,顺序编码可能比一次性编码更好。此外,我们下面介绍的 Rainbow 方法有助于选择一种顺序编码,这种编码具有最佳的逻辑和经验意义。Rainbow 方法还渴望支持可解释性和遵从性,这是重要的次要考虑因素。
线性模型与基于树的模型
形式统计科学严格区分数量变量和分类变量。研究人员应用不同的方法来描述这些变量,并在线性模型中对它们进行不同的处理,如回归。即使某些分类变量有自然顺序,对它们应用任何定量方法都应该非常谨慎。
例如,如果任务是建立一个线性模型,其中一个独立变量是教育水平,那么标准方法是通过 One-hot 对其进行编码。或者,人们可以设计一个新的量化特征教育年限来代替原始变量——尽管在这种情况下,它不会是一个完全等价的替代。
与线性模型不同,基于树的模型依赖于可变等级而不是精确值。所以,对教育水平使用序数编码完全等同于一个热点。对具有清晰自然顺序的变量使用“一键热”实际上是多余的。
此外,只要保持正确的顺序,分配给类别的值甚至都无关紧要。以决策树、随机森林和梯度推进为例,如果变量的子代数量编码为
0 = "0 个孩子"
1 = "1 个孩子"
2 = "2 个孩子"
3 = "3 个孩子"
4 = "4 个或更多孩子"
或者作为
1 = "0 个孩子"
2 = "1 个孩子"
3 = "2 个孩子"
4 = "3 个孩子"
5 = "4 个或更多孩子"
或者甚至作为
-100 = "0 个孩子"
-85 = "1 个孩子"
0 = "2 个孩子"
10 = "3 个孩子"
44 = "4 个或更多孩子"
在这些算法中,这些值本身并不提供量化功能。重要的是变量的等级,基于树的算法将使用其魔力来进行最合适的分割,以引入新的树节点。
决策树不适用于大量的二进制变量。拆分过程效率不高,尤其是在拟合被严重规则化或约束的情况下。正因为如此,即使我们随机排序类别,并制作一个单一的标签编码功能,它仍然可能比一个热。
由于性能更好,随机森林和梯度提升经常在其他算法中被选中,所以我们的方法在许多情况下可以证明是方便的。将我们的方法应用于其他算法,如线性回归或逻辑回归,超出了本文的范围。我们预计这种特征工程的方法可能仍然是有益的,但这需要进一步的研究。
方法
想一个明确的名义分类变量。一个例子是颜色。比如说,标签有:“绿”、“红”、“蓝”、“紫”、“橙”、“黄”、“靛”。
我们希望在这些标签中找到一种秩序,而这样的秩序是存在的——彩虹。因此,您可以简单地创建带有编码的单个特征,而不是创建七个一次性特征:
0 =“红色”
1 =“橙色”
2 =“黄色”
3 =“绿色”
4 =“蓝色”
5 =“靛蓝”
6 =“紫罗兰”
因此,我们把在类别中寻找顺序的技术称为“彩虹法”。我们发现令人惊讶的是,存在一种自然现象,代表一个名义变量的标签编码!
概括这个逻辑,我们建议为任何分类变量找到彩虹。即使可能的排序不明显,或者似乎没有,我们也提供一些技术来找到它。通常,类别中存在某种顺序,但是建模者看不到。可以看出,如果数据生成过程确实假定类别中有某种顺序,那么在模型中利用它将比将类别分割成一个热点特征有效得多。因此我们的座右铭是:
“当大自然给你一道彩虹,带走它…”
根据我们的发现,类别顺序定义得越清楚,使用顺序编码而不是一次性编码在模型性能方面的好处就越大。然而,即使在完全没有顺序的情况下,制作和使用随机彩虹也可能产生与 One-hot 相同的模型性能,同时节省大量的维度。这就是为什么寻找彩虹是一个值得的追求。
颜色是一个名义变量吗?
有些读者可能会认为颜色显然是一个序数变量,所以我们发现一个序数编码也就不足为奇了。
一方面,来自不同科学背景的建模者可能会以不同的方式看待相同的分类变量,并可能习惯于反射性地应用某些编码方法。举个例子,我(安娜)学的是经济学和计量经济学,我没有遇到任何可以把颜色当做定量的用例。同时,研究物理或数学的建模者可能在他们的建模经验中利用了波长,并且可能考虑了颜色序数。如果你代表后一种建模者,请花一分钟想一个不同的例子,一个明确的名义变量。
另一方面,自然排序是否存在并不改变我们的信息。简而言之,如果订单存在—太好了!如果没有…好吧,我们希望你能找到它!我们将在下面提供更多的例子,希望它们能指导你如何为你自己的名义变量找到彩虹。
乍一看,大多数名义变量似乎不能转换成数量尺度。这就是我们建议寻找彩虹的地方。对于颜色,自然比例可能是色调,但这不是唯一的选择——还有亮度、饱和度、温度等。我们邀请你尝试几种不同的彩虹,它们可能捕捉到分类质量的不同细微差别。
根据类别 K 的数量和上下文,你实际上可以从一个类别变量中产生和使用两个或更多的彩虹。
我们不推荐使用超过 log₂(K)的彩虹,因为我们不想超过一个二进制独热的编码数量。
彩虹法非常简单,直观明了。在许多情况下,你选择哪种彩虹甚至都不那么重要(我们指的是颜色顺序);这总比一发不可收拾要好。更自然的顺序可能比其他顺序表现得更好,也更容易解释。
寻找彩虹—示例
计量水平的统计概念在区分具有自然排序的变量和没有自然排序的变量方面起着重要作用。虽然定量变量有一个比率标度,即它们有一个有意义的 0、有序值以及值之间的等距离,但分类变量有区间、序数或名义标度。让我们为每一种类型的分类变量说明我们的方法。
区间变量有有序的值,值之间的距离相等,但值本身不一定有意义。例如,0 不表示缺少某种质量。区间变量的常见例子有李克特量表:
此人购买智能手机的可能性有多大?
1:“非常不可能”
2:“有点不可能”
3:“既不可能也不太可能”
4:“有点可能”
5:“非常可能”
毫无疑问,区间变量本质上给了我们最好最自然的彩虹。大多数建模者会用数字编码它们。
1 = "非常不可能"
2 = "有点不可能"
3 = "既不可能也不可能"
4 = "有点可能"
5 = "非常可能"
注释:我们使用“冒号”符号来表示原始类别名称,使用“等号”符号来表示类别的数值分配。
序数变量有有序无意义的值,值与值之间的距离既不相等也不可解释。
该人完成的最高学历是什么?
A:“学士学位”
B:“硕士学位”
C:“博士学位”
D:“副学士学位”
E:“高中”
F:“没有高中”
类似于区间变量,序数变量有一个固有的自然彩虹。有时,顺序变量的类别没有按照正确的顺序列出,这可能会让我们看不到眼前的彩虹。通过对变量的关注,我们可以对类别进行重新排序,然后使用这个更新的变量作为量化特征。
1 =“没有高中”
2 =“高中”
3 =“大专”
4 =“学士”
5 =“硕士”
6 =“博士”
到目前为止,大多数建模者会有机地使用最好的彩虹。更复杂的问题是如何看待名义变量。
名义变量在类别之间没有明显的顺序。复杂的是,对于机器学习建模目标,我们可以更加灵活地使用变量和工程特征,即使从统计角度来看它们没有什么意义。这样,利用彩虹法,我们就可以把一个名义变量变成一个数量变量。
寻找彩虹背后的主要想法是利用人类智能或自动化工具。对于您可以直接检查每个分类变量的相对较小的项目,我们建议将直接的人类智能放入这样的选择中。对于具有许多复杂数据集的大规模项目,我们提供一些自动化工具来生成可行的量化尺度。
手动彩虹选择
我们来看一些人工主观彩虹选择的例子。诀窍是通过使用一些具体的相关属性或者从一个可能的抽象概念构建一个量化的尺度。
在我们的经典例子中,对于一个名义变量颜色,色调属性建议一个可能的比例。所以,名义类别
a:“红色”
B:“蓝色”
C:“绿色”
D:“黄色”
可以被新设计的彩虹功能所取代:
1 = "蓝色"
2 = "绿色"
3 = "黄色"
4 = "红色"
对于下面的车型变量,
车型
C:“紧凑型车”
F:“全尺寸车”
L:“豪华车”
M:“中型车”
P:“皮卡”
S:“跑车”
U:“SUV”
V:“面包车”
我们可以想出几十个特征来组成彩虹——车辆尺寸、容量、价格类别、平均速度、燃油经济性、拥有成本、发动机特性等。挑哪一个(或几个)?选择取决于模型的上下文。想想这个特性如何帮助预测你的结果变量。你可以尝试几种可能的彩虹,然后从模型表现和诠释方面选择最好的。
考虑另一个变量:
婚姻状况
A:“已婚”
B:“单身”
C:“推断已婚”
D:“推断单身”
这是我们可以发挥创造力的地方。如果我们认为单身和已婚是光谱的两端,那么推断的单身可能在两端之间,更接近单身,而推断的已婚可能在两端之间,更接近已婚。这是有道理的,因为推断具有一定程度的不确定性。因此,以下顺序是合理的:
1 = "单身"
2 = "推断单身"
3 = "推断已婚"
4 = "已婚"
如果有任何缺失的值,一个新的类别,“未知”,正好适合单身和已婚之间的中间值,因为没有理由选择一端而不是另一端。因此,修改后的比例如下所示:
1 =“单身”
2 =“推断单身”
3 =“未知”
4 =“推断已婚”
5 =“已婚”
另一个例子:
职业
1:“专业/技术”
2:“行政/管理”
3:“销售/服务”
4:“文员/白领”
5:“工匠/蓝领”
6:“学生”
7:“家庭主妇”
8:“退休”
9:“农民”
A:“军人”
B:“宗教”
C:“个体户”
D:“农民
在这个例子中找到彩虹可能更难,但有几种方法可以做到:我们可以根据平均年薪、职业在感兴趣的地理区域的流行程度或其他数据集中的信息对职业进行排序。这可能涉及调用人口普查 API 或一些其他数据源,并且可能因为这些值不是静态的而变得复杂,但这些仍然是可行的解决方案。
自动彩虹选择
没有好的相关属性怎么办?在某些情况下,我们无法找到彩虹的逻辑顺序,因为变量本身是不可解释的。或者,如果我们有非常大的数据,但没有资源来手动检查每个变量,该怎么办?下一项技术对于这种情况很方便。
我们来看一个第三方做的黑箱专栏:
家庭金融集群
1:“市场观察者”
2:“保守财富”
3:“特定储蓄者”
4:“屡试不爽”
5:“新潮倾向”
6:“当下消费者”
7:“农村信托”
8:“城市聚光灯”
9:“职业意识”
10:“数字金融家”
11:“金融期货”
12:“稳定影响者”
在这个例子中,我们不清楚每个类别包含什么,因此也不知道如何对这些类别进行排序。在这种情况下该怎么办?我们建议通过查看每个类别与目标变量的关系来创建一个人造彩虹。
最简单的解决方案是按照与目标变量的相关性来排列类别。因此,与因变量相关值最高的类别将获得数字代码 1,而相关值最低的类别将获得数字代码 13。在这种情况下,那么,我们的彩虹将意味着金融集群和目标变量之间的关系。这种方法适用于分类和回归模型,因为它可以应用于离散和连续的目标变量。
或者,你可以仅仅利用分类变量和目标变量的某些统计特性来构建彩虹。
例如,在二元目标变量的情况下,我们可以查看给定每个类别的一的比例。假设在市场观察人士中,正面目标的比例为 0.67%,而保守财富的比例为 0.45%。在这种情况下,市场观察人士的排名将高于保守财富(或者更低,如果目标百分比是上升的)。换句话说,这个彩虹将反映每个类别中积极目标的普遍性。
对这些自动化方法的一个合理担忧是潜在的过度拟合。当我们使用将自变量与因变量相关联的相关性或目标百分比的后验知识时,这可能会导致数据泄漏。为了解决这个问题,我们建议在随机维持样本上学习彩虹顺序。
彩虹保留完整的数据信号
在这一节中,我们简要地展示了彩虹序数编码在用于决策树时完全等同于 One-hot。换句话说,保留了完整的数据信号。
我们还在下面展示了,如果选择的彩虹(类别的顺序)与“真实的”彩虹一致,即与数据生成过程一致,那么得到的模型将严格优于一键模型。为了测量模型质量,我们将查看树中的分裂数量。更少的分割意味着更简单、更有效和更少的过度拟合模型。
让我们放大一分钟,看看只有 4 个值的经典彩虹示例:
颜色
0 = "红色"
1 = "黄色"
2 = "绿色"
3 = "蓝色"
对于一个热点,我们将创建 4 个特征:
Color _ Red= 1 ifColor= 0,否则为 0,
Color _ Yellow= 1 ifColor= 1,否则为 0,
Color _ Green= 1 ifColor= 2,否则为 0,
Color _ Blue= 1 ifColor= 3,否则为 0。
在彩虹的例子中,我们只需要单独使用颜色。
让我们比较一下使用这两种方法可能得到的模型:4 个特征对 1 个特征。为了简单起见,让我们构建一个决策树。考虑数据生成过程的几个场景。
场景 1
假设所有的类别都有很大的不同,并且每一个都给模型带来了很大的收益。这意味着每个独热特征确实是关键的——模型应该在由独热创建的所有 4 个组之间分开。
在这种情况下,像 XGBoost 这样的算法将简单地在所有值之间进行拆分,这完全等同于 One-hot。两个模型中正好有三个分裂。因此,仅用一个特征而不是四个特征就可以获得相同的精确结果。

图 1(由 Anna Arakelyan 绘制)
人们可以清楚地看到,这个例子很容易推广到具有任意数量类别的 One-hot。此外,请注意彩虹中类别的顺序并不重要,因为所有的类别都会被拆分。实际上,(K-1)分裂对于两种方法都足以在 K 个类别之间进行分离。

图 2(由 Anna Arakelyan 绘制)
最主要的一点是,当从 One-hot 切换到 Rainbow 时,一点数据信号都不会丢失。此外,根据类别的数量,会发生显著的降维,从而节省时间和存储,并降低模型的复杂性。
有时,建模者试图通过将类别组合成一些逻辑组并将它们转换成二元变量来克服“一个热点”的维度问题。这种方法的缺点是损失了数据粒度。注意,通过使用 Rainbow 方法,我们不会丢失任何级别的粒度。
场景 2
让我们来看一个对 Rainbow 不太有利的场景,其中选择的顺序与“真正的”顺序不一致。假设数据生成过程在{红色、绿色}和{黄色、蓝色}组之间分离。
在这种情况下,该算法将进行所有必要的分割-彩虹分割三次,一个热点分割两次或三次,具体取决于树选取的一个热点要素的顺序。

图 3(由 Anna Arakelyan 绘制)
即使在这种最不利的情况下,当选择 Rainbow 方法时,也不会丢失数据信息,因为具有最大(K-1)个分裂的树将反映任何数据生成过程。
场景 3
最后,如果数据生成过程实际上符合彩虹顺序,那么彩虹方法将优于 One-hot。它不仅不会丢失任何数据信号,还会大大降低复杂性,减少维数,并有助于避免过拟合。
假设真实模型图案仅在{红色、黄色}和{绿色、蓝色}之间分开。Rainbow 在这种情况下有明显的优势,因为它利用了这些分组,而 One-hot 没有。一次性模型必须进行两次或三次分割,而彩虹模型只需要一次。

图 4(由 Anna Arakelyan 绘制)
在我们的下一篇文章中,我们将更进一步,展示 Rainbow 方法的实际应用,将其应用于现实世界的数据科学模型,并直接强调其巨大的潜力。
信用
我们衷心感谢 MassMutual 的 Dan Garant、Paul Shearer、Xiangdong Gu、Haimao Zhan、Pasha Khromov、Sean D'Angelo、Gina Beardslee、Kaileen Copella、Alex Baldenko 和 Andy Reagan 提供了非常宝贵的反馈。
原创创意由Dmytro Karabash
Neo4j 隐马尔可夫模型
原文:https://towardsdatascience.com/hidden-markov-model-with-neo4j-dde776f9047b
用 Neo4j 演示维特比算法
在日常生活中,向前推理更有用……然而,很少有人,如果你告诉他们一个结果,能够从他们自己的内心意识中进化出导致那个结果的步骤是什么。当我谈到逆向推理或分析性推理时,我指的就是这种力量。
——夏洛克·福尔摩斯在《血字的研究》中
在小组讨论让知识图谱发挥作用 4You 中,我从星展银行的 Anand Sundarraman 那里了解到,他们正在使用思维导图来储存知识。他们没有在脑海中或白板上勾画出这些关系,而是将它们放入 Neo4j 知识图表中。这张思维导图可能有助于他们为未来的事件做好准备,比如当前俄乌危机的后果。
过去我曾用 Neo4j 来表示物理实体及其关系,如基因和基因组、药物和疾病、宝莱坞电影和演员,以及最近的病人病历( 1 、 2 、 3 、 4 )。但 Anand 的演讲提出了一个想法,即我们可以使用 Neo4j 来模拟概率过程。当我们谈到概率模型和图形时,我们会想到隐马尔可夫模型(HMM)。

图一。交互式 Neo4j Bloom 中隐马尔可夫模型的可视化。图片作者。

图二。图 1 的部分描述。图片作者。
嗯,一开始可能会让人害怕和困惑。Medium 上有很多关于 HMM 的文章( 1 、 2 、 3 等等)。他们用迭代的例子解释了 HMM 中的数学细节。这意味着有很多数学。他们的插图是静态的。但是我们都想要互动材料,因为它们可以让事情变得更清楚。所以在本文中,我想在交互式 Neo4j 中演示 HMM。我想特别演示一下维特比算法。只有两个简单的步骤,你可以很容易地遵循。我将使用你可以在许多其他 HMM 教程中看到的虚构的天气情绪虚拟数据。这个项目的代码存放在我的 GitHub 仓库中:
https://github.com/dgg32/markov_neo4j
1.天气猜谜游戏
假设我有一个朋友在外地,想猜猜他所在城市的天气。每天,他都告诉我他是快乐还是悲伤。第一天是晴天的几率是 66.6%,也就是下雨的几率是(100–66.6)% = 33.3%。此后的每一天,某一天的天气取决于前一天的天气,其概率如下(转移概率):
他的情绪取决于当天的天气,其概率如下(排放概率):
而我的朋友这六天有以下几种情绪:开心,开心,难过,难过,难过,开心。所以问题来了,他所在的城市最有可能出现的天气序列是什么?准确的说,导致最后一天 🥵.天气最有可能出现的天气序列是什么
2.在 Neo4j 中创建隐马尔可夫模型
有了上面的信息,我们可以在 Neo4j 中创建隐马尔可夫模型。首先,在 Neo4j 浏览器中新建一个名为markov的项目。你甚至可以在 AuraDB 上创建这个项目来获得额外的学分。之后,在我的存储库中运行create_node.py。
它创建所有的Hidden(天气)和Observed(情绪)节点,以及初始、发射和转移概率。我在脚本中提供了三个例子,因此参数2意味着例子 2——天气情绪的例子。
您可以使用以下命令在 Neo4j 浏览器或 Bloom 中检查这些节点和关系:

图 3。新创建的节点显示在 Neo4j 浏览器中。图片作者。
3.猜天气
现在让我们用维特比算法来猜测这六天的天气。运行viterbi.py:
该命令计算每个隐藏状态的概率,并突出显示所选的隐藏状态。该算法有两个部分:前向和后向阶段。
3.1 前进阶段
第一部分计算每个隐藏状态的最大概率。
该代码从 Neo4j 图表中获取概率、天气名称和情绪。在第 24 行和第 28 行之间,它计算第一天的天气概率。因为我朋友第一天很开心,所以那天是晴天的概率等于emission_p(Sunny-emits-Happy) × initial_p(Sunny) =0.53。我们也同样计算第一天下雨的概率。我们需要将两个结果都保存在previous_hid_ps中,因为直到后来我们才知道哪一个会导致最可能的路径。
对于其他日子,该算法不仅考虑排放概率,还考虑前一天的天气概率和转移概率。让我们计算一下第二天阳光明媚的概率。在那一天,因为我的朋友也很高兴,我们只需要从“高兴”的心情考虑发射概率。那么第一天可能是晴天也可能是雨天。因此,我们有以下计算:
在这种情况下,算法会修剪掉分支:它只会向前移动 0.341 的较大概率(第 42 行),并注意到该值是在第一天阳光明媚时获得的(第 43 行)。第一天下雨的较小概率 0.04256 已被删除。该算法可以做到这一点,因为无论在接下来的步骤中会发生什么,最大概率将总是优先用于该节点,即使该节点可能不在最可能的天气路径上。
同样,第二天下雨的概率是 0.04262:
该算法将各自的最大值和它们的后指针保存在节点中(第 46 和 47 行)。并在以后的日子里重复计算。您可以在 Neo4j 中检查它们的值(图 1)。
3.2 反向阶段
反向阶段选择最可能的天气路径。它从最后一天开始,因为累积概率到此结束。


图 4。最近天气的概率。图片作者。
在我们的例子中,最后一天最有可能是晴天,因为晴天的概率(0.001698)大于雨天的概率(0.001274)(在第 8 行和第 24 行之间)。根据后指针,更大的可能性来自一个下雨的第五天。那么这是一个多雨的第五天。之后,算法只是沿着多雨的第五天的后指针到第四天,依此类推,直到它到达第一天(在第 26 行和第 31 行之间)。所以最有可能的天气路径是:晴,晴,雨,雨,雨,晴。
4.其他示例
您可以在我的代码中用另外两个例子进一步探索维特比算法。第一个来自关于天气和健康的维基百科。第三个例子来自宾夕法尼亚大学关于蛋白质的。不要忘记首先清除数据库:
然后运行:


图 5。Neo4j Bloom 中其他两个示例的可视化效果。图片作者。
结论
隐马尔可夫模型被广泛应用于许多领域,从语言处理到生物信息学,从物理到金融。在生物信息学中,著名的蛋白质家族数据库(PFAM) 就是建立在 HMM 之上的。它为我们提供了许多蛋白质家族的轮廓隐马尔可夫模型(轮廓 HMM)。我们可以用 HMMER 工具将我们自己的序列与它们进行比对和分类。相比于 BLAST(阅读更多关于 BLAST 的内容: 1 和 2 ),HMMER 更加敏感。HMMER 能够找到更多的远程序列亲属,因为它可以接受更多的信号,这要归功于 HMM 的位置意识。自发布以来,已成为生物信息学中为数不多的不可或缺的常青工具之一。
尽管伟大的咨询侦探夏洛克·福尔摩斯既没有提到 HMM 也没有提到维特比算法,但本文开头的引用表明了他在工作中应用它们的能力。正反向推理是维特比算法的核心。下面是该算法的总结:在向前阶段,我们在每个隐藏状态内进行概率比较,以便我们得到每个隐藏状态的最大概率。在后向阶段,概率比较发生在最后一步的隐藏状态中,因此我们可以通过跟随它的后向指针来开始追踪最可能的路径。正如本文所展示的,给定一系列观察到的状态,结果是最可能的路径。维特比算法只是 HMM 的三个用例之一。你也可以用 HMM 做其他事情。你可以计算一个观察到的序列的可能性,比如快乐,悲伤,快乐,悲伤,快乐,悲伤。对于这两个用例,HMM 模型必须事先知道。但是如果你没有模型呢?你可以反过来。假设你有一个新的蛋白质序列家族。您可以根据它们与 HMMER 中的[hmmbuild](http://www.csb.yale.edu/userguides/seq/hmmer/docs/node19.html)的对齐来构建一个 HMM 模型。这个 HMM 模型本质上就是你蛋白质家族的“风格”。它描述了其成员的序列特征。
维特比算法是一种优雅而简单的算法。但是很容易弄错。我故意使用了与本视频和本文章相同的示例数据,因为后两者在算法中都犯了相同的错误。他们实现了向前的部分,但忘记了做回溯。所以他们错误地认为第三天是晴天。我在这里的文章已经纠正了这一点。
所以 HMM 和 Viterbi 算法一开始可能会混淆。本教程的目标是为您理清思路,因为 Neo4j 使我们能够轻松地以交互方式检查状态的内部值。请注意,像本文那样用 Neo4j 实现 Viterbi 算法计算效率不高😉。所以在这里我鼓励你实现你自己的维特比算法作为乐趣。
更新: 我的第二篇文章在 Neo4j 演示了用 Baum-Welch 算法训练 HMM。
https://dgg32.medium.com/membership
隐马尔可夫模型简单解释
原文:https://towardsdatascience.com/hidden-markov-models-simply-explained-d7b4a4494c50
隐马尔可夫模型及其相关计算的简单解释

由 Unsplash 上的 Pietro Jeng 拍摄
介绍
在我的马尔可夫链系列的最后一篇文章中,我们将讨论隐马尔可夫模型(HMM)。这些出现在数据科学和机器学习的许多方面,特别是自然语言处理和强化学习,因此绝对值得了解。
在本文中,我假设读者已经对马尔可夫性质和马尔可夫链、以及平稳分布背后的思想有了一些基本的了解。如果没有,请参考我之前关于这些主题的帖子:
直觉和范例模型
在一个规则的马尔可夫链中,我们能够看到状态和它们相关的转移概率。然而,在一个隐马尔可夫模型(HMM) 中,马尔可夫链是隐但是我们可以通过它给定的观察状态来推断它的性质。
注意:隐马尔可夫模型本身并不是马尔可夫链,它是马尔可夫过程/模型列表中的另一个模型。
让我们通过一个例子来获得一些理解:
- 如果天气晴朗,我有 90%的几率快乐,10%的几率悲伤。
- 如果天气下雨,我有 30% 的几率快乐,有 70% 的几率悲伤。

由作者生成的图像。
这些观察状态(快乐、悲伤)的关联概率被称为发射概率。
现在,假设我的朋友想从我的情绪中推断天气。所以,对于给定的一周,比方说,我: 悲伤、快乐、表示快乐、悲伤、开心、难过。 因此,我的朋友会推断天气一直: 下雨,晴天,下雨,晴天,下雨,晴天,下雨。 这是一种直观的方法,然而天气不太可能如此变化无常。因此,我们需要在我们的隐藏状态之间加上转移概率。

由作者生成的图像。
上面的情节就是我们的隐马尔可夫模型!我们现在将使用我们的模型进行一些基本计算!
晴天的概率?
随机一天是晴天还是雨天的概率有多大?这个问题由马尔可夫链的平稳分布来回答。这告诉我们长期处于给定状态的概率,或者称为马尔可夫链的均衡。
平稳分布是一个给定的分布,如果你应用转移矩阵, P ,结果分布是和以前一样的:

LaTeX 中生成的方程。

LaTeX 中生成的方程。
其中 π 为平稳分布。这个分布可以通过找到 P 的特征值为 1 的特征向量来导出。在本文中,我不会推导整个特征值分解过程,因为它是详尽的,但是它在我之前关于平稳分布的文章中有所涉及。
尽管如此,在对上述 HMM 应用特征值分解后,我们发现平稳分布为 {0.5,0.5}。** 换句话说,一个随机的日子是**同样可能是晴天或雨天!****
评估序列可能性
我们如何计算一系列隐藏的和观察到的状态出现的概率?
例如,让我们说昨天我是快乐的并且它是晴朗的并且今天我是悲伤的并且它也是晴朗的。这个序列的概率是多少?
数学上,我们想计算:

LaTeX 中生成的方程。
我们可以使用上面的 HMM 图中显示和导出的发射、跃迁和稳态分布概率通过蛮力做到这一点。我们将其分解为以下概率:

LaTeX 中生成的方程。
所以上面序列的概率是 0.056!
眼尖的人可能已经注意到我们在上面的计算中间接使用了贝叶斯定理!
解码最可能的序列
产生一个可观测的(情绪)序列的最可能的隐藏状态(天气)序列是什么?
这个答案可以通过简单地计算所有可能的隐藏状态组合并选择具有最高概率的来实现。这被称为最大似然估计。****
然而,组合的数量可以很快变得非常大。对于n 个隐藏状态和一个观测序列的个观测值,我们有(【n^t】)个可能的组合。在实践中, N 和 T 会很大,因此计算每个隐藏状态组合在计算上是不可行的**。****
为了解决这个复杂性问题,我们使用维特比算法或前向算法,其使用按照 O(N ) 的顺序工作的动态编程。我将把这些算法的解释留到以后的博客上,因为它相当密集。然而,请自行研究!
结论
希望你喜欢这篇关于隐马尔可夫模型的文章!这个统计算法的领域相当大,所以这只是一个基本的介绍,以及一些你可以用它做的事情。
和我联系!
- 要在媒体上阅读无限的故事,请务必在这里注册! 💜
- T49😀
- 领英 👔
- 推特 🖊
- github🖥**
- https://www.kaggle.com/egorphysics🏅****
(所有表情符号都是由 OpenMoji 设计的——开源的表情符号和图标项目。执照: CC BY-SA 4.0
国家数据的层次聚类和 K-均值聚类
概述两种聚类技术并比较结果

作者图片
聚类分析是一种无监督的技术,它试图在某些特征方面彼此相似的观察值中识别亚组。像主成分分析一样,聚类通过使用数据的某些摘要来简化数据。虽然 PCA 减少了数据的维数(特征),但是聚类识别了观察值中的相似组。
所有聚类技术都旨在将观测值分组为子组/聚类,以便:
- 每个聚类包含彼此相似的观察值。就某些群集特征而言,群集应该是同质的。
- 一个集群的观测值不同于其他集群的观测值。每个集群在相同的特征方面不同于其他群组。
相似性的定义必须针对特定的聚类任务来定义,并且通常需要一些关于数据的领域特定的知识。两个相似的观察结果意味着什么也取决于研究的目的。
在本文中,我将使用 k-means 进行两种类型的聚类,一种是层次聚类,一种是非层次聚类,并比较结果。分层聚类不需要事先知道适当的聚类数。它创建了一个称为树状图的类似树的聚类可视化,并提供了整个聚类的良好概览。把树砍到一定的高度会产生不同数量的簇。另一方面,K-means 要求我们指定聚类的数量。
我使用了在 Kaggle 可获得的国家数据集。
在分别研究层次聚类和 k-means 聚类之前,我想提一下聚类分析的总体步骤,以及无论选择哪种方法都需要考虑的几个重要方面。
进行聚类分析的 4 个步骤
- 选择相似性/距离(有些人更喜欢说不相似性)和缩放的度量。
- 选择聚类技术的类型,分层或非分层。
- 选择聚类方法的类型(即层次聚类中的平均或完全链接方法)。
- 决定一些集群。
选择距离/相似性和缩放的度量
距离/相似性的度量以及数据的缩放对结果有很大的影响。因此,根据研究的目的和数据的类型,我们需要考虑如何衡量相似性以及如何调整数据。
- 欧几里德距离:平方差之和的平方根,这是最常见的。曼哈顿、最大值和闵可夫斯基是您可以研究的其他指标。
- 基于相关性的距离:测量相关性将强调观察的形状,而不是它们的大小。特征高度相关的两个观察值将被认为是相似的,即使它们以欧几里德距离度量相距很远。
- 变量的缩放:决定标准差/方差是否应该为 1。具体选择取决于您希望按何种模式/相似性对观察值进行聚类。如果你想给每个特性同等的重要性,你应该让 std/var 等于 1。如果在不同的比例下测量要素,您可能希望缩放数据,使其具有 std/var 1。
分层聚类
分层聚类以分层的方式形成子组。分层聚类可以以聚集或分割的方式执行。
- 聚集(“自下而上”)聚类从每个观察值成为自己的聚类开始。当我们沿着树向上移动时,它们合并成子群。
- 分裂(“自上而下”)聚类从所有观察值的一个聚类开始。当我们沿着树向下移动时,集群被分成子组。
层次聚类的步骤:
- 选择距离/相似性和缩放的度量。
- 选择链接方法。
- n 个观测值中的每一个本身都被视为一个聚类。彼此最相似的聚类形成一个聚类,在第一次迭代之后留下 n-1 个聚类。该算法迭代进行,直到所有的观察值都属于一个聚类,该聚类用树状图表示。
- 决定集群的数量
链接方法:
- 最近邻法或单链法:两个亚组之间的距离用这两个亚组中所有可能的观测值对之间的最小距离来表示。
- 最近邻法或完全连锁法:与上述方法相反。两个子组之间的距离由两个子组中所有可能的观察值对之间的最大距离表示。
- 平均连锁法:在这种方法中,两个亚组之间的距离用两个亚组中所有可能的观察值对的平均值来表示。
- 质心法:每个聚类被一个作为该组质心的平均主体所代替。
- 沃德方法:该方法通过最大化类内同质性来形成类,测量类内平方和。
如何评估结果/选择聚类数
- 类内平方和
- 观察结果在树状图(树)和散点图中的可视化表示
让我们看看如何使用 r 进行层次聚类。
读出数据
我们将对两种聚类技术使用相同的数据集,您可以看到数据的第一行,以及下面变量的平均值和方差表。
library(tidyverse) # data manipulation and ggplot2
library(factoextra) # multivariate package# Read data
data_raw <- read.csv("Country-data.csv") # keeping countries as column
countries <- data_raw[, 1]
data <- read.csv("Country-data.csv", row.names = "country") # set countries as index# View first rows
head(data)

作者图片
# Check variance and mean of the numeric variables
variance <- as.data.frame(apply(data_raw[, 2:10], MARGIN = 2, FUN = var))
means <- as.data.frame(apply(data_raw[,2:10], 2, mean))# Store mean and variance in one data frame
mean_variance_df <- cbind(means, variance)
colnames(mean_variance_df) <- c('Mean', 'Variance')
round(mean_variance_df, digits = 2)

作者图片
# Standardize the data (mean 0, std 1)
data_std <- as.data.frame(scale(data))
创建集群
用hclust()函数进行层次聚类。它以距离矩阵为输入数据,采用链接法。距离矩阵可以用dist()函数或get_dist()函数计算。后者允许相关性作为距离度量。
### Hierarchical clustering with hclust()
# hclust() takes a distance matrix as data input, use dist() or get_dist() for this
# Choose linkage method with method argument# Hierarchical clustering on standardized data using Euclidean distance measure
complete <- hclust(get_dist(data_std, method = 'euclidean'), method = 'complete')
显示树状图
# Plot the dendrogram, showing the entire clustering result# Show dendrogram, pass cluster object as first argument
plot(complete, main = 'Complete Linkage', xlab = "",
sub = "", cex = 0.8)# Add rectangle around clusters, choose how many clusters with k, color in border
rect.hclust(complete, k = 5, border = 3:6)

作者图片
旁注:我尝试了几种聚类方法(完全、平均、单一、沃德),在所有聚类中,尼日利亚、海地和卡塔尔单独表现突出,卢森堡、马耳他和新加坡也很接近。这表明这些国家在某些方面不同于所有其他国家。此外,平均和单一的联系将几乎所有国家放在一个大的集群中,考虑到这些变量以及这些国家在这些变量上的差异,这是不合适的。
显示树状图的特定分支/簇
对于较大的数据集,树状图很快变得难以概括,但是可以通过在一定高度切割树并绘制它们来查看特定的分支/簇。高度是距离测量和连接方法的结果。低于特定高度的聚类的观测值在其聚类内具有小于该特定高度的最大距离和关联。
例如,如果我们想要查看用蓝色标记的聚类,我们在高度 8 处切割树,这将导致五个聚类。我们可以通过绘制切口上方的分支来查看簇的数量。为了显示每个分支/簇包含的内容,我们在切割下绘制树状图,并指定哪个分支/簇。看看哪些国家属于第二组,它们似乎是欠发达国家。
# Store cluster object as a dendrogram
complete_dend <- as.dendrogram(complete)# Plot full dendrogram
plot(complete_dend, main="Full Dendrogram")
rect.hclust(complete, k = 5, border = 3:6) # Plot branches above the cut
plot(cut(complete_dend, h=8)$upper,
main="Upper tree of cut at h=10")# Plot selected branch below the cut
plot(cut(complete_dend, h=8)$lower[[2]], # Change value in 'lower[]' to view different branches/clusters
main="Second branch of lower tree with cut at h=8")

作者图片
如何解读树状图
在树的底部,每个观察值是一片树叶,当我们沿着树向上移动时,观察值融合成树枝。沿着树向上延伸,树枝与其他树枝或树叶融合在一起。叶/枝融合越早,观察结果越相似。重要的是要记住,相似性是基于水平轴,而不是垂直轴。在树的底部早期融合的观察结果比在树的更高处融合的观察结果/分支更相似(后者实际上可能非常不同)。
使用 cutree()提取集群分配
我们可以在一个选定的高度砍下这棵树,这将给我们 k 个簇。然后,我们可以将聚类 id 存储在数据框中,并在散点图中绘制聚类。
# Cut the dendrogram at a certain height giving a specific number of clusters with cutree().
clusters_complete <- cutree(complete, k = 5) # ok cluster with 6 too# Append the cluster result to the dataset so that we can plot the clusters with different colors
complete_df <- data_raw %>%
mutate(cluster = clusters_complete) %>%
relocate(cluster, .after = country)# Filter cluster of choice too see the countries in that cluster
complete_df %>% filter(cluster == 3)

作者图片
聚类散点图
fviz_cluster()函数将聚类可视化,如果变量的数量超过两个,则应用主成分。
# Plot the clusters. Number of clusters as chosen in cutree() and stored in clusters_complete# Print clusters. The clusters make sense
fviz_cluster(list(data = data_std, cluster = clusters_complete),
main = 'Complete Linkage, euclidean distance')

作者图片
我们还可以根据一些变量绘制国家图,并用颜色分类,看看这些分类对特定变量是否有意义。
# Plot gpdp and life expectancy and color by clusters. As expected, life expectancy increases as gdp increases.
# Clusters ok. The outliers integrates with other clusters for these variables. ggplot(complete_df, aes(x=gdpp, y = life_expec, col = as.factor(cluster), label = country)) +
geom_point() +
geom_text() +
ggtitle('GDP and Life Expectancy') +
xlab('GDPP') +
ylab('Life Expectancy') +
scale_x_log10()

作者图片
# Plot gpdp and child_mort. Child mortality decreases as dgp increases.ggplot(complete_df, aes(x=gdpp, y = child_mort, col = as.factor(cluster), label = country)) +
geom_point() +
geom_text() +
ggtitle('GDPP and Child Mortality') +
xlab('GDPP') +
ylab('Child Mortality') +
scale_x_log10() +
scale_y_log10()

作者图片
k-means(非层次聚类)
非层次聚类要求聚类的起始分区/数目是先验已知的。我们希望将数据点划分为 k 个聚类,以便所有聚类的类内变化尽可能小。有不同的非层次聚类方法,大多数主要在以下方面有所不同:
- 用于设置初始聚类质心的方法。
- 在每次迭代中重新分配观测值的规则。
我们将使用 K-means 方法进行非层次聚类。
k 均值聚类的步骤
- 选择 k 个集群。
- 通过将每个观察值随机分配给 k 个聚类中的一个来初始化。
- 重复以下两个步骤,直到集群分配停止变化:
- 计算每个聚类的质心
- 将每个观察值分配/重新分配给质心最近的聚类。
如何评估结果/选择聚类数
为了帮助决定使用多少个集群,我们可以使用以下两种方法。
- 肘图:针对不同数量的聚类,绘制每个聚类的平方和内图。随着每一个额外的聚类,平方和内将减少,但是我们将寻找肘部,在那里平方和内从先前的聚类数减少最多,然后对于额外的聚类变平。
- 剪影分析:查看每个观察值被分配到一个集群的情况。
我们现在将看到 k-means 是如何使用 r 实现的。
使用 k-means 创建任意数量的聚类
# Perform k-means with arbitrary number of clusters to obtain the object
k_means <- kmeans(data_std, centers = 3)# Look at what k_means model object contains
str(k_means)List of 9
$ cluster : Named int [1:167] 3 1 1 3 1 1 1 1 1 1 ...
..- attr(*, "names")= chr [1:167] "Afghanistan" "Albania" "Algeria" "Angola" ...
$ centers : num [1:3, 1:9] -0.649 0.483 0.941 0.281 -0.278 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:3] "1" "2" "3"
.. ..$ : chr [1:9] "child_mort" "exports" "health" "imports" ...
$ totss : num 1494
$ withinss : num [1:3] 625 34.7 306.3
$ tot.withinss: num 966
$ betweenss : num 528
$ size : int [1:3] 98 3 66
$ iter : int 2
$ ifault : int 0
- attr(*, "class")= chr "kmeans"# After getting cluster assignment we can append them to data frame
data_kmeans <- data_raw %>%
mutate(cluster = k_means$cluster)
每个聚类的平方和内肘图
这里我们创建了一个函数,它对 1 到 8 个聚类执行 k-means 聚类,并存储每个聚类的平方和,以便我们可以绘制肘图。
# Use sapply to get wihtin sum of squares for k = 1:8
tot_withinss <- sapply(1:8, function(k){
km_mod <- kmeans(x = data_std, centers = k)
km_mod$tot.withinss
})# Run function and store within sum-of-squares in a dataframe
tot_withinss_df <- data.frame(k = 1:8, tot_withinss = tot_withinss)# Plot elbow plot
ggplot(tot_withinss_df, aes(x = k, y = tot_withinss)) +
geom_point() +
geom_line() +
scale_x_continuous(breaks = 1:8) +
ggtitle('Elbow plot of Within Sum of Squares') +
ylab('Within Sum of Squares') +
xlab('k = number of clusters')

肘形图没有给出明确的聚类数。也许三个或六个?我们稍后将绘制聚类图,并评估有多少聚类给出了合理的结果。
轮廓分析—观察水平
我们也可以创建一个小函数,手动绘制轮廓图,但是 factoextra 包有一个用于轮廓图的内置函数。
# Quickest to use factoextra package and use this plot
fviz_nbclust(data_std, kmeans, method= 'silhouette')

作者图片
评估 3-6 个聚类的 k 均值聚类
肘部和轮廓图没有给出明确的答案,因此我们可以对 3-6 个聚类进行 k-means 聚类,并查看每个聚类的结果,以确定哪个数量的聚类有意义。我们还会将结果与层次聚类进行比较。
# Run k-means clustering with 3-6 clusters
k_means_3 <- kmeans(data_std, centers = 3)
k_means_4 <- kmeans(data_std, centers = 4)
k_means_5 <- kmeans(data_std, centers = 5)
k_means_6 <- kmeans(data_std, centers = 6)# Add cluster assignments to data frame
data_kmeans_3 <- data_raw %>%
mutate(cluster = k_means_3$cluster) data_kmeans_4 <- data_raw %>%
mutate(cluster = k_means_4$cluster) data_kmeans_5 <- data_raw %>%
mutate(cluster = k_means_5$cluster) data_kmeans_6 <- data_raw %>%
mutate(cluster = k_means_6$cluster)
可视化 k 均值聚类
# Plot the clusters from k-means with x clusters# Print clusters. Here 3 clusters.
# Change digit in "k_means_x$clusters" to look at different number of clusters
fviz_cluster(list(data = data_std, cluster = k_means_3$cluster), main = 'K-means, 4 clusters')

作者图片
# Plot the clusters from k-means with 4 clusters
fviz_cluster(list(data = data_std, cluster = k_means_4$cluster), main = 'K-means, 4 clusters')

作者图片
# Plot the clusters from k-means with 5 clusters
fviz_cluster(list(data = data_std, cluster = k_means_5$cluster), main = 'K-means, 4 clusters')

作者图片
用 k 均值聚类分析变量
正如我们对层次聚类所做的那样,我们可以在聚类后观察一些变量和颜色。
# Plot gpdp and life expectancy and color by clusters. Life_expectancy increases as gdp increases.
# Clusters ok. The outliers integrates with other clusters for these variables.
ggplot(data_kmeans_4, aes(x = gdpp, y = life_expec, col = as.factor(cluster), label = country)) +
geom_point() +
geom_text() +
ggtitle('GDP and Life Expectancy') +
xlab('GDPP') +
ylab('Life Expectancy') +
scale_x_log10()
#scale_y_log10()

作者图片
# Plot gpdp and child_mort. As expected, child mortality decreases as dgp increases. Clusters ok.
ggplot(data_kmeans_4, aes(x=gdpp, y = child_mort, col = as.factor(cluster), label = country)) +
geom_point() +
geom_text() +
ggtitle('GDPP and Child Mortality') +
xlab('GDPP') +
ylab('Child Mortality') +
scale_x_log10() +
scale_y_log10()

作者图片
比较层次聚类和 k-means 聚类的结果
用 3、4、5 和 6 个聚类对 k-means 进行聚类和可视化会得到不同的结果。人们可以更仔细地研究不同变量中的分组,但总体而言,考虑到国家通常被分为“欠发达”、“发展中”和“发达”三类,我认为三四个分组是有意义的,因为至少有一些现有变量被用于对这些国家进行分类。
使用四个群集可以将马耳他、卢森堡和新加坡保持在自己单独的群集中。如果我们使用三个集群,这三个国家被合并到包含发达国家的集群中,这也是有意义的。
这两种聚类技术之间也有区别。相同数量的聚类使用不同的方法,层次和 k-means,给出非常不同的结果。例如,具有 k 均值的四个聚类与使用分层聚类的四个聚类非常不同。但是,四个 k-means 聚类与五个层次聚类非常相似,因为层次聚类将尼日利亚分配到它自己的聚类中。其余的四个聚类类似于四个 k 均值聚类。来自 k-means 的聚类更明显,重叠更少。使用 k-means 将更多的国家分配到发达国家组。
这两种方法各有利弊,选择哪种方法取决于研究的目的。请记住,它们可以被视为补充方法,在继续进行非层次聚类之前,可以在探索意义上使用层次聚类。
分层聚类:像我 10 岁一样给我解释一下
原文:https://towardsdatascience.com/hierarchical-clustering-explain-it-to-me-like-im-10-f949f8f3f80
这是向 10 岁的系列解释机器学习算法的第一部分。如果你读过前面两篇关于 XGBoost 回归和 K-Means 聚类的文章,那么你就知道该怎么做了。我们有一个听起来很可怕的算法,所以让我们剥去它可怕的部分,理解它背后简单的直觉。与 K-Means 聚类一样,今天我们将讨论另一种流行的聚类算法——层次聚类。
假设一家服装店收集了 9 名顾客的年龄,标记为 C1-C9,以及他们每个人上个月在店里消费的金额。(一个超级小的店,不过就顺其自然吧。)

现在,商店希望确定其客户的细分或聚类,以更好地了解他们和他们的需求。这就是我们数据科学家用层次聚类来拯救世界的地方。
我将把解释分为三个部分:
1.聚类创建和树状图
我们首先将每一个数据点作为一个集群。这形成了 9 个集群:

选取两个最接近的(更多关于接近度的信息,请参见第 2 节)集群,并使它们成为一个集群。由于 C2 和 C3 距离最近,所以它们形成了一个星团。这给了我们总共 8 个集群。

现在我们用一个叫做的树状图来表示这个集群。x 轴代表点(在我们的例子中是客户),y 轴是聚类之间的距离。

我们重复这个。取两个最近的聚类(C5 和 C6)并使它们成为一个聚类,并将其绘制在树状图上。

7 个集群
再做一次。(粉色集群和 C4)

6 个集群
再一次。(C7 和 C8)

5 个集群
我们不断重复这个过程,直到只剩下一个集群。

4 个集群

3 组

2 个集群

1 个集群
现在,这就是我们如何创建树状图和我们的层次集群。
2.关于距离的讨论
之前,我们谈到了寻找最接近的星团,但是我们究竟如何测量这种接近度呢?
想象我们有粉色、蓝色和紫色的星团。现在我们想弄清楚我们是应该把粉色的簇和蓝色的还是紫色的簇放在一起。

有 4 种方法可以做到这一点。但是在我们谈论它们之前,我们先简单地谈论一下距离。在这种情况下,当我说距离时,我指的是欧几里德距离。所以,如果坐标为 (p₁,p₂,…,pₙ) 的 p 和坐标为 (q₁,q₂,…,qₙ) 的 q 是 n 维中的两点,那么它们之间的欧氏距离为:

在我们的例子中,由于数据是二维的,两点之间的欧几里德距离将是:
**
现在我们知道了如何解释距离,确定距离的 4 种方法是:
- 单连接:在单连接方法中,我们将距离定义为每个聚类中两点之间的最短距离。因此,我们将粉色和紫色集群中最近点之间的距离与蓝色和粉色集群中最近点之间的距离进行比较。两个距离中较小的一个决定了粉色的那个更靠近哪个星团。**

由于距离较小,粉色与蓝色群集聚集在一起
2.完全连锁:类似于单连锁,但这里距离是在两个集群中最远的点对之间测量的。

由于距离较小,粉色与紫色群集在一起
3.平均关联*:顾名思义,距离定义为第一个聚类的每个观测值到第二个聚类的每个观测值之间的平均距离。(吓人的公式预警!这是为感兴趣的人准备的,但重要的是你要理解如何测量距离背后的逻辑。)***

4.质心法:这涉及到找到每个簇的中心(质心),然后找到它们之间的距离。(如果你不确定如何计算质心,我在这里解释这个过程

由于距离较小,粉色与蓝色群集聚集在一起
3。关于集群的更多信息
自定义集群
我们知道最终的树状图是这样的:

我们可以通过指定阈值距离来定制我们想要的聚类数。例如,假设我们不想要距离大于 3 的集群。然后我们在 3:

将阈值设置为 3
这一行意味着我们不希望任何集群超过这个级别,所以我们只剩下 3 个低于阈值线的集群:

阈值为 3 时形成的簇
如果我们将阈值距离设置为 5,那么…

…我们剩下两个集群:

阈值为 5 时形成的簇
最佳聚类数
我们可以通过找到不与任何水平延长线交叉的最长线来计算出最佳的聚类数。在我们的例子中,这将是最长的一行:

画一条水平线穿过这条最长距离的线,这条线将作为计算聚类的阈值:
****
我们有我们的集群。现在怎么办?
现在我们已经完成了聚类过程,并发现有 3 个最佳聚类,商店可以从中获得什么见解?
如果你观察这些客户群,我们会发现他们分为三类——花费不多的年轻客户,花费也少的年长客户,以及花费很多的中端客户。商店现在可以利用这些信息为自己谋利。他们可以通过扩大向第三部分中年客户提供的服务、产品和交易来优化业务。他们可以集中资源让这个群体更快乐——给他们更多迎合他们口味的选择,为他们带来最新产品,甚至为他们提供专属购物时间。
这是一个如何使用集群的简单例子,但是可能性是无穷无尽的!
如果你想支持我的工作,可以考虑使用我的链接注册一个媒体订阅!(每月 5 美元,随时取消)
如果你有更多关于人工智能算法的建议或意见,请随时通过 LinkedIn 联系我,或者发邮件到 shreya.statistics@gmail.com。
分层强化学习
原文:https://towardsdatascience.com/hierarchical-reinforcement-learning-56add31a21ab
使用表格 Q-Learning 的 Options-Critic 框架

分层强化学习将长期决策过程分解成更简单的子任务。这个想法非常类似于将大量代码行分解成更小的函数,每个函数执行一个非常具体的任务。
我们来看一个例子,假设代理人要清理或摆放餐桌。这包括伸手拿盘子的任务。这些都是高水平的任务。在较低的水平上,它需要控制和移动四肢,然后手指伸出并抓住物体,然后将它们放在适当的位置。分层强化学习是用同样的逻辑设计的。有多个策略级别,每个策略处理较低级别的任务,如移动手指,而较高级别的策略处理任务,如抓取对象。
HRL 让我们在训练和探索中受益匪浅:
- 训练:由于高等级对应多个环境步骤,因此情节相对较短,从而更快地传播奖励并提高学习。
- 由于探索发生在更高的层次,它能够学习更有意义的策略,从而采取比原子层次更有意义的行动。举例来说,与理解手指的关节运动相比,智能体在抓握物体的层次上会学习到更好的策略来达到目标。
HRL 的一些常见架构是-
让我们看看如何使用 Q-Learning 在一个简单的四个房间的环境中建立你自己的选择-评论框架。你可以看看这个博客来了解更多关于期权批判框架是如何工作的。
我们将在这里使用 2D 四室环境。环境有 4 个房间。env.reset()重置环境并返回随机开始状态。我们可以使用 env.goal()来更改目标,并将目标设置为从 4 个房间的 1 个角落开始随机选择。在这篇博客中,我们将在一千集之后改变一次目标,这类似于选择批评论文。-https://github . com/anki 08/Option-Critic/blob/main/four rooms . py。

四个房间的环境——作者图片
现在让我们创建我们的策略。
Q_Omega 是通知较低层策略的较高层元策略。
让我们将 Q_Omega 策略定义为 2D Q 表,其中每个状态都有一组选项。这些选项指导较低级别的策略采取何种行动来最大化其回报。选项的数量由选项定义。我们以ε贪婪的方式从 Q_Omega 表中采样。
选项是动作的概括,让我们定义宏观动作。在 Sutton et al. (1999) 中,它被定义为:
O 选项由三个部分组成:策略π : S × A → [0,1],终止条件β : S+ → [0,1],初始集 I ⊆ S。当且仅当 st∈ I 时,选项⟨I,π,β⟩在状态 st 可用。如果选择了选项,则根据π选择动作,直到选项根据β随机终止。
让我们将较低级别的策略创建为名为 Q_U 的 softmax 策略。我们的 Q_U 表存储了较低级别的策略采取的操作。这里,让我们用一个 softmax 策略来举例说明我们的操作。我们的更新是行李员更新。
最后,让我们定义我们的终止策略。这将用于更改较低级别一直遵循的选项或较高级别的策略。
我们已经准备好了两层。现在我们将定义我们的批评家。这是演员-批评家框架的延伸。在这里,批评家评估选项,并告诉更高层次的选项有多好。Q_Omega,即通知选项内策略的元策略,Q_U 和终止策略形成选项部分的一部分,而 Q_U,即在状态和选项的上下文中执行动作的值,形成批评的一部分。
现在我们有了所有的部件,让我们训练和测试代理。我为培训和测试部分创建了一个 colab 笔记本。https://colab . research . Google . com/drive/1 q 5j 0 ceahgp 2m _ bgjm 3 nhfpkvqgzwzj _ M?usp =分享
在训练期间,元策略学习选项和终止策略,然后在测试期间使用这些选项和终止策略来通知较低级别的策略要采取的动作。我们每 1000 集改变一次目标,以表明随着目标的每一次改变,代理花费更少的时间,因为它不必从头开始学习策略,并使用先前的知识来通知行动。

作者图片
正如我们所看到的,代理只需 6 个步骤就可以学习并达到目标,而 Q-learning 需要 50 个步骤。
你可以在这里找到完整的代码→【https://github.com/anki08/Option-Critic
参考资料:
https://www.sciencedirect.com/science/article/pii/S0004370299000521 https://arxiv.org/abs/1609.05140
R-NL:鲁棒非线性收缩
重尾时的高维协方差估计
在这篇文章中,我讨论了我们最近在 arXiv 上发表的论文“R-NL:基于非线性收缩的椭圆分布协方差矩阵估计”中的一种新的协方差估计方法。我介绍了我们正在解决的问题,尝试给出一些关于我们如何解决它的直觉,并简要介绍了我们开发的简单代码。在路上,我触及了一些有趣的概念,比如(健壮的)“泰勒估计量”,我觉得这些概念在现代数据科学中没有得到充分利用,可能是因为没有作者在他们的论文中提供代码(或者可能是因为大多数关于这个主题的论文似乎出现在信号处理社区中,这是他们被数据科学家忽视的另一个潜在原因)。
非线性收缩
非线性收缩是高维协方差估计的有力工具。在这篇新论文中,我和我的合著者介绍了一个经过修改的版本,它倾向于在重尾模型中产生更好的结果,同时在其他情况下保持强大的结果。为了展示这种新方法及其解决的问题,让我们从一个 R 示例开始。我们首先加载必要的函数,并定义维度 p 和示例数量 n,以及我们想要研究的真实协方差矩阵。
# For simulating the data:
library(mvtnorm)# The NL/QIS method available on [https://github.com/MikeWolf007/covShrinkage/blob/main/qis.R](https://github.com/MikeWolf007/covShrinkage/blob/main/qis.R)
source("qis.R")# Set the seed, n and p
set.seed(1)# p quite high relativ to n
n<-300
p<-200#Construct the dispersion matrix
Sig<-sapply(1:p, function(i) {sapply(1:p, function(j) 0.7^{abs(i-j)} )} )
我们这里定义的协方差矩阵对应一个 AR 过程。也就是说,虽然观察值是独立的,但是尺寸 X_i 和 X_j 的相关性越小,则 i 和 j 之间的差值绝对值越大。这意味着相关性指数变小,离对角线越远,实际上有一些结构需要学习。
首先,让我们用之前定义的相关结构模拟来自高斯分布的随机向量的独立同分布样本:
### Multivariate Gaussian case
X<-rmvnorm(n = n, sigma = Sig)
在非线性收缩文章、、中,我解释了如果只允许修改样本协方差矩阵的特征值,但必须保持特征向量不变(这是许多收缩方法所做的):让因此**_ j、 j=1,..p ,是样本协方差矩阵的特征向量,并且

特征向量矩阵。那么最佳值由下式给出

从而产生最佳的估计量

注意,根据(固定的)样本特征向量,( 1)中的最优值通常不完全等于真实特征值,而是真实特征值的线性组合。
因此,让我们计算样本协方差矩阵和非线性收缩矩阵,并检查我们离理想情况有多近:
*## Sample Covariance Matrix
samplespectral<-eigen(cov(X))## Nonlinear Shrinkage
Cov_NL<-qis(X)
NLvals<-sort( diag( t(samplespectral$vectors)%*%Cov_NL%*%samplespectral$vectors ), decreasing=T)## Optimal: u_j'*Sig*u_j for all j=1,...,p
optimalvals<-sort(diag( t(samplespectral$vectors)%*%Sig%*%samplespectral$vectors ), decreasing=T)plot(sort(samplespectral$values, decreasing=T), type="l", cex=1.5, lwd=2, lty=2, ylab="Eigenvalues",)
lines(optimalvals, type="l", col="red", cex=1.5, lwd=2, lty=1)
lines(NLvals, type="l", col="green", cex=1.5, lwd=2, lty=3)
title(main="Multivariate Gaussian")legend(200, 8, legend=c("Sample Eigenvalues", "Attainable Truth", "NL"),col=c("black", "red", "green"), lwd=2, lty=c(2,1,3), cex=1.5)*
这给出了情节:

来源:作者
该图显示了(1)对角线上的最佳值,以及样本和非线性收缩估计值。看起来像人们希望的那样,样本特征值显示出过度分散(对于大值来说太大,对于小值来说太小),而非线性收缩非常接近理想值。这正是我们所期望的,因为与样本大小 n=300 相比,维度 p=200 相当高。相对于 n 选择的 p 越大,样本协方差矩阵看起来就越差。
现在我们做同样的事情,但是模拟一个具有 4 个自由度的多元 t 分布,一个(非常)重尾分布:
*### Multivariate t case
X<-rmvt(n=n, sigma=Sig, df=4)## Truth
Sig <-4/(4-2)*Sig ## Need to rescale with a t distribution## Sample Covariance Matrix
samplespectral<-eigen(cov(X))## Nonlinear Shrinkage
Cov_NL<-QIS(X)$Sig
NLvals<-sort( diag( t(samplespectral$vectors)%*%Cov_NL%*%samplespectral$vectors ), decreasing=T)## Optimal: u_j'*Sig*u_j for all j=1,...,p
optimalvals<-sort(diag( t(samplespectral$vectors)%*%Sig%*%samplespectral$vectors ), decreasing=T)plot(sort(samplespectral$values, decreasing=T), type="l", cex=15, lwd=2, lty=2, ylab="Eigenvalues",)
lines(optimalvals, type="l", col="red", cex=1.5, lwd=2, lty=1)
lines(NLvals, type="l", col="green", cex=1.5, lwd=2, lty=3)
title(main="Multivariate t")legend(200, 40, legend=c("Sample Eigenvalues", "Attainable Truth", "NL"),col=c("black", "red", "green"), lty=c(2,1,3), cex=1.5, lwd=2)*

来源:作者
现在,这看起来不太好了!绿色的非线性收缩值也显示了一些过度分散:大的值太大,而小的值有点太小。显然,在有限样本中,重尾会扭曲非线性收缩。如果有一种方法在高斯情况下显示同样惊人的结果,但在重尾模型中也保持良好的结果,那就太好了。这是我们新方法背后的动机。现在,我将介绍一些细节,首先介绍这种方法的关键:椭圆分布。
椭圆分布
椭圆分布类包括合理范围的不同分布,如多元高斯分布、多元 t 分布、多元广义双曲线分布等。如果随机向量 X 遵循椭圆分布,则可以写成

其中 S 在 p 维度上均匀分布在单位球面上 R 是某个独立于 S 的非负随机变量。这听起来可能很复杂,但它只是意味着椭圆分布可以简化为圆形(二维)或球形(一般)上的均匀分布。因此,这些类型的分布有一个非常具体的结构。特别需要提到重要的一点:上式中, H 称为色散矩阵,与协方差矩阵相对。在本文中,我们想要估计协方差矩阵,如果它存在,给出如下

这已经很有趣了:在椭圆模型中, H 通过假设存在,但是如果 R 的期望值不是有限的,协方差矩阵可能不存在!例如,自由度小于 2 的多元 t 分布没有协方差矩阵。尽管如此,我们仍然可以在这种情况下估计出 H 。所以色散矩阵在某种意义上是一个更一般的概念。然而,在本文中,我们将假设协方差矩阵存在,在这种情况下,我们从上面看到,离差和协方差矩阵在一个常数之前是相同的。
有趣的是,我们可以看一下 Z = X/||X||,这是随机向量 X 除以它的欧几里德范数,这个东西将总是有相同的分布!其实这只是在 p 维球面上的均匀分布。我们可以在 p=2 的例子中看到这一点。
*X<-rmvnorm(n = n, sigma = diag(2))
Y<-rmvt(n = n, sigma = diag(2), df=4)# standardize by norm
ZGaussian<-t(apply(X,1, function(x) x/sqrt(sum(x^2)) ))
Zt <- t(apply(Y,1, function(x) x/sqrt(sum(x^2)) ))par(mfrow=c(1,2))
plot(ZGaussian)
plot(Zt)*
这给了

来源:作者
(线性收缩)泰勒估计量
泰勒在[1]中推导出的对离差矩阵 H 的估计,利用了 Z = X/||X|| 总是具有相同分布的事实。使用该分布的似然性,可以得到一个最大似然估计量(基本上只需求导并设置为零),如下所示:

注意,这只是隐式地定义了 H (它既在左边也在右边),所以尝试到达 H 的自然方式是迭代:

其中第二步只是出于技术原因需要的重正化。可以证明,这个简单的迭代方案将收敛于(2)中的解。 H 的这个估计量就是所谓的“泰勒估计量”。
泰勒估计量是对来自椭圆分布的独立样本分布矩阵的迭代估计。它是利用椭圆随机向量按其欧几里德范数标准化后总是具有相同的分布这一事实得到的。
好,这是一种抵抗重尾的稳健协方差或离差估计的方法。但是上面的泰勒估计器只对 p < n、有效,并且当 p 接近 n 时会恶化,所以我们仍然需要针对 p 接近甚至大于 n 的情况进行鲁棒估计。信号处理社区中的许多论文只是通过在每次迭代中使用线性收缩(我在这里也解释了)来做到这一点。这看起来像这样:

不同的ρ选择激发了不同的论文。例如,开始这一系列研究的论文之一是[2]。我们现在改为使用非线性收缩连同泰勒的方法。
通过在每次迭代中使用线性收缩,我们可以稳健地估计泰勒的高维估计量。不同的论文已经找到了计算自由参数ρ的智能自适应方法。
鲁棒非线性收缩
现在的目标是使用与上面相同的迭代方案,但不是使用线性收缩,而是使用非线性收缩进行迭代。不幸的是,这并不简单。我不会在这篇文章中详细介绍,因为需要一些技巧来使它工作,但相反,我指的是我们在 Github 和论文上的实现。我们提供的实现可能也很方便,因为上面提到的信号处理社区的文章似乎都没有给出代码或在包中实现他们的方法。
为了展示性能和代码,我们从这个新方法开始重复多变量 t 分析。为了完整起见,我们重申上面的整个过程:
*### Multivariate t case
X<-rmvt(n=n, sigma=Sig, df=4)## Truth
Sig <-4/(4-2)*Sig ## Need to rescale with a t distribution## Sample Covariance Matrix
samplespectral<-eigen(cov(X))## Nonlinear Shrinkage
Cov_NL<-QIS(X)$Sig
NLvals<-sort( diag( t(samplespectral$vectors)%*%Cov_NL%*%samplespectral$vectors ), decreasing=T)## R-NL code from [https://github.com/hedigers/RNL_Code](https://github.com/hedigers/RNL_Code)
Cov_RNL<-RNL(X)
RNLvals<-sort( diag( t(samplespectral$vectors)%*%Cov_RNL%*%samplespectral$vectors ), decreasing=T)## Optimal: u_j'*Sig*u_j for all j=1,...,p
optimalvals<-sort(diag( t(samplespectral$vectors)%*%Sig%*%samplespectral$vectors ), decreasing=T)plot(sort(samplespectral$values, decreasing=T), type="l", cex=1.5, lwd=2, lty=2, ylab="Eigenvalues",)
lines(optimalvals, type="l", col="red", cex=1.5, lwd=2, lty=1)
lines(NLvals, type="l", col="green", cex=1.5, lwd=2, lty=3)
lines( RNLvals, type="l", col="darkblue", cex=1.5, lwd=2, lty=3)
title(main="Multivariate t")legend(200, 40, legend=c("Sample Eigenvalues", "Attainable Truth", "NL", "R-NL"),
col=c("black", "red", "green", "darkblue"), lty=c(2,1,3,4), cex=1.5, lwd=2)*

来源:作者
R-NL(蓝线)几乎完全在红线上,因此反映了我们在高斯情况下看到的 NL 的良好性能!这正是我们想要的。此外,尽管在上面的代码中可能很难理解,但使用该函数非常简单, RNL(X) 给出了协方差矩阵的估计值(如果你可以假设它存在的话),而 RNL(X,cov=F) 给出了对 H 的估计值。
最后,如果我们在高斯例子的开始使用 RNL 函数,这些值看起来几乎与非线性收缩完全相同。事实上,下图显示了使用我们的两种方法 R-NL 和稍加修改的 R-C-NL 以及一系列竞争对手的模拟结果。设置几乎与上面的代码完全一样,具有相同的色散矩阵和 n=300 , p=200。不同之处在于,我们现在改变了多元 t 分布的尾部决定参数,在网格上从 3(极重尾)到无穷大(高斯情况)。我们不会详细讨论 y 轴上的数字到底是什么意思,只是说越大越好,100 是最大值。竞争对手“R-LS”和“R-GMV-LS”是两种线性收缩泰勒估计量,如上所述,而“NL”是非线性收缩。可以看出,对于重尾,我们比后者(好得多)得多,然后一旦我们接近高斯尾行为,我们就收敛到相同的值。

arXiv 论文的模拟结果。
结论
本文讨论了论文“R-NL:高维椭圆分布的快速稳健协方差估计”。关于 arXiv 的论文包含了广泛的模拟设置,表明 R-NL 和 R-C-NL 估计量在广泛的情况下表现非常好。
因此,我希望这些估计量也能成功地用于许多实际应用中!
参考文献
[1]泰勒博士(1987 年 a)。多元散度的无分布 M 估计。统计年鉴,15(1):234–251。
[2]陈、威塞尔和希罗(2011 年)。高维协方差矩阵的稳健收缩估计。IEEE 信号处理汇刊,59(9):4097–4107
高维学习
原文:https://towardsdatascience.com/high-dimensional-learning-ea6131785802
几何深度学习
维度的诅咒
一系列博文,总结了 AMMI 计划的 几何深度学习(GDL)课程; 非洲机器智能硕士 ,授课老师 迈克尔·布朗斯坦 , 琼·布鲁纳 , 塔科·科恩 ,以及佩塔尔·韦利奇科维奇
解决现实世界问题最重要的需求之一是高维度学习。随着输入数据维数的增加,由于一些计算和统计问题,学习任务将变得更加困难。在本帖中,我们讨论高维度学习中的三个故事。首先,我们回顾一下统计学习任务中的一些基础知识。然后,我们提出维度的诅咒,它是如何发生和影响学习的。最后,我们介绍几何域 及其对输入数据的假设。

维度的诅咒。图片来自 GDL 课程第二讲。
本帖与M . Elfatih Salah合著。另见我们的 上一篇 关于 ML 的埃尔兰根方案。我们主要参考的是四位导师的https://arxiv.org/abs/2104.13478,以及* GDL 课程atAMMI*。
统计学习可以被定义为从可能的高维和有噪声的数据中提取信息的任务,以对看不见的数据给出一些性能保证。因为我们想在计算机上完成这项任务,基本上我们需要四种主要材料:
- 数据分布。
- **近似模型:处理信息(线性回归、SVM、神经网络等)。
- **误差指标:比较和选择模型。
- **估算算法:我们可以在计算机上实现的一些程序,以找到估算值。
我们将在接下来的章节中讨论每种成分。

统计学习的四个要素。图片来自 GDL 课程第二讲。
数据分发
在监督学习中,会重点关注什么,考虑输入数据是一组 N 样本 ,𝒟= {(𝓍ᵢ, 𝓎 ᵢ): i 从 1 到 n }绘制 i.i.d 。从一个底层数据分布𝒫 、、定义过输入空间𝒳×输出空间𝒴.这个定义中的特征𝒳是一个高维空间(𝒳=ℝᵈ).* 为简单起见,我们假设输出空间为【ℝ】(实数集),标签𝓎来自未知函数 f* 这样𝓎ᵢ= f **𝓍ᵢ)因此 f: 𝒳 → ℝ.*****
例如,在医学领域中,为了诊断乳腺癌,输入可以是组织学图像,具有确定它是良性还是恶性的分类输出。这类问题叫做分类。对于回归,也许在化学中,我们得到了一个分子,我们想预测它的激发能。****
然而,正如我们也知道的,我们需要一些关于数据的假设来进行任何类型的 ML 分析,因为如果没有关于分布或目标的假设,我们将无法进行归纳。这些假设对于任何事情都是必不可少的,因此对于几何深度学习也是如此,我们将在后面看到。
近似模型
统计学习中的第二个要素是模型或假设类𝓕,它是从输入空间𝒳to 到输出空间 ℝ ,𝓕⊂{f:𝒳*→ℝ}的函数或映射的子集。*****
假设类别的一些示例可能是:
- { k 次以下的多项式}
- {给定架构的神经网络}
让我们也定义假设类𝓕 、上的复杂性度量γ ,它将像一个范数或非负量,我们可以在我们的假设中评估它以将其分为简单和复杂, γ: 𝓕 → ℝ₊.或者简单来说,允许的函数集是否过大。
下面可以作为复杂性度量的例子:
- γ(f)可以是神经网络假设中的神经元数目。
- 或者也可以是预测器的规范。
我们对复杂性度量感兴趣,因为我们想要控制我们的假设。否则,我们可能会陷入一个众所周知的问题,叫做过度拟合。
误差度量
误差度量(也称为损失函数)表示模型输出的质量。通常,我们有不同的模型,我们希望选择最好的一个,为此,我们使用误差度量。这取决于任务。在分类任务中,我们使用精确度,在回归中,我们使用均方差。在数学上,它被定义为从包含基本事实&的元组、模型输出 ( 𝓎 、f(𝓍)到正实数 ℝ₊.的映射𝓁****
损失函数是逐点测量(我们可以测量数据中每一点的损失)。所以我们需要考虑所有点的平均值。显然,在机器学习中有两个基本的平均概念,它们错综复杂地联系在一起;总体平均值和经验平均值。 总体平均(我们也称之为预期风险)定义为逐点测量𝓁 ( 𝓎 ,f(𝓍)的数据的期望值,即我们在数据分布上平均能做得多好。数学上,给定损失函数𝓁、模型 f ,以及在输入空间𝒳×和输出空间𝒴上定义的底层数据分布𝒫 、,将预期风险 𝓡( f 定义为 follows:︁︁︁****

人口流失。方程式:GDL 课程,第二讲——由作者编辑。
平均值的第二个概念是培训损失或经验风险。我们可以通过用经验预期代替上述等式中数据*的预期来推动这一损失。*****

经验损失。方程式:GDL 课程,第二讲——由作者编辑。
事实上,在 ML 的所有方面,我们试图做的是最小化总体误差,但是我们无法获得这个误差,相反,我们使用经验误差。你可能会问这两个平均的概念是如何相互联系的。如果你用固定的 f 来看经验损失,即如果我们固定假设,它就是I . I . d .的平均值,因为每个𝓍 ᵢ 都是来自数据分布的分布式 I . I . d .。因此,通过一些基本的概率和统计,并且因为经验损失是取决于训练集的随机量,这个损失的期望将与误差度量的期望相同,这是总体损失的无偏估计量。****
同样,w e 可以逐点计算方差,这只是通过将随机变量𝓍 ᵢ 组合成函数f数学上,f* 或每个 f ∈ 𝓕,𝓡( f̂ 是𝓡( f 的无偏估计量,方差𝜎 ( f 定义为:***

逐点方差。方程式:GDL 课程,第二讲——由作者编辑。
然而,这种逐点方差界限在 ML 中不是很有用,因为训练和测试误差之间的关系我们不能使它逐点,因为假设f 依赖于训练集。所以我们需要做一些叫做统一界限的事情,例如 Rademacher 复杂度 。**
估计算法
统计学习的最后一个要素是学习算法(或估计算法)。它被定义为从数据集𝒟 = {( 𝓍 ᵢ, 𝓎 ᵢ): i from 1 to N} 到从输入空间𝒳到输出空间𝒴.的函数简单来说,这是一个输出算法的算法!
我们将讨论一种流行的预测算法,称为经验风险最小化(ERM) 。因此,我们的目标是通过仅访问随机函数(训练损失或经验风险)来最小化确定性函数(总体损失或预期风险))。如前所述,我们必须控制这两个功能之间的距离,其方式必须超越逐点控制。**
让我们在假设𝓕 , 中定义一个半径为 𝛿 的球,其复杂性度量 γ , 为:

半径为的球𝛿在 𝓕.定义了一个更小的假设方程式:GDL 课程,第二讲。**

半径为的球𝛿在 𝓕.定义了一个更小的假设图片:GDL 课程,第二讲——由作者编辑**
换句话说,我们拥有所有可能的功能空间,例如,我们可以使用神经网络来实现这些功能,我们希望专注于那些复杂性较小的功能。由于我们在𝓕定义了一组半径为 𝛿 的较小假设,我们可以考虑一种称为经验风险最小化的算法或估计量(球中的函数恰好最小化经验风险),或者以约束形式:**

经验风险最小化(ERM)的约束形式。方程式:GDL 课程,第二讲。
联系到最优化,在实践中使用约束形式可能不容易。所以我们需要考虑另一种形式,比如惩罚形式和插补形式*。在惩罚形式中,我们引入了拉格朗日乘数 λ , ,其中约束成为优化目标的一部分( λ 是控制正则化强度的超参数)。*****

机构风险管理的惩罚形式。方程式:GDL 课程,第二讲。
经验风险最小化的第二种形式是插值形式,这是一种非常自然的估计方法,由以下等式定义:**

ERM 的插值形式。GDL 课程,第二讲。
经验风险为零意味着数据中每个点的逐点误差为零。通常,我们不希望在现实生活中这样做,因为数据包含噪声。
误差的基本分解
答在描述了监督学习中的四个主要因素后,由于我们的目标是最小化总体误差,目前,我们推导出该总体误差的各个组成部分。
设 f̂ 为我们从学习算法(ERM)中得到的模型。然后,𝓡 (f̂) 将代表这个特定函数的人口损失。我们将从减去开始:

误差的基本分解。GDL 课程,第二讲。
棕色中的项是 总体的所有假设的下确界;换句话说,在我们的假设中,𝓕.如果𝓕is 稠密,这一项将为零,即逼近几乎任意函数的能力 ( )普适逼近定理 ) 。
然后,我们可以写:

误差的基本分解。GDL 课程,第二讲。
我们把绿颜色的术语 称为逼近误差(εₐₚₚ【ᵣ】)其中表明了较小假设的函数能多好地逼近地面真值函数。换句话说,我们可以用很小的复杂度多好地逼近目标函数 f ******* 。**
因此,我们将上述等式简化为:

误差的基本分解。GDL 课程,第二讲。
此外,红色的术语可以写成:

误差的基本分解。GDL 课程,第二讲。
我们将蓝色项 称为优化误差(εₒₚₜ),它将群体目标与训练目标进行比较,从而衡量我们高效解决经验风险最小化(erm)的能力。**
等式同一侧的其他项可以由下式限定:

误差的基本分解。GDL 课程,第二讲。
我们分解的最后一个成分(橙色的术语)是 统计误差(εₛₜₐₜ)。该误差对真实函数(最佳函数)和随机函数(训练误差)之间球(半径为 δ )上的均匀波动不利。**
最后,总体误差可以写成:

总体误差的四个组成部分。方程式:GDL 课程,第二讲。
高维学习的挑战
S 总结我们在上一节中推动的内容,我们将总体误差分解为四个部分,如下所示:
1。总体假设的下确界。
如在 , 之前提到的,如果𝓕是稠密的,这一项将为零,例如具有非多项式激活的神经网络。

下确界超过所有假设的总体。 GDL 课程,第二讲。
2。近似误差。
近似误差是一个确定性函数,不依赖于训练数据的大小(样本数)。(如果假设空间使得目标函数具有小复杂度,则为小)。

近似误差。方程式: GDL 课程,第二讲。
3。统计误差。
该误差是一个随机函数,随着样本数量的增加而减小。(当假设空间可以被‘几个’小球覆盖时,小)。

统计错误。方程式 : GDL 课程,第二讲。
4。优化错误。
当 ERM 可以被有效地解决时(就迭代复杂性而言),规模较小。

优化错误。方程 : GDL 课程,第二讲。
因为我们不能直接访问我们的总体误差,相反,我们使用上面定义的三种不同的误差作为它的上限(近似、统计和优化误差)。当最小化这些误差时,将保证最小化我们的真实目标(即总体误差)。这里的紧迫问题是,当数据存在于高维空间时,我们如何同时控制这些误差源?
维度的诅咒
维度的诅咒是由美国数学家理查德·贝尔曼在动态规划和最优化的背景下提出的,从那以后它几乎成了高维统计学习的同义词。我们担心维数灾难,因为学习的基本原理从根本上是基于插值的。例如,对于下图中的两类样本,很容易就从给定样本中插入每一类的架构达成一致,这将由学习算法来完成。

2d 空间中的大量样本。图片来自 GDL 课程第二讲。
因此,学习原理基于一个非常基本的性质,即我们可以根据经验密度和人口密度之间的接近程度来提取结构。问题是,这种学习原则在更高维度中受到了很大的影响。为了传达高维问题,让我们考虑下面的例子。
我们先定义一下中的类 Lipschitz 函数。**
Lipschitz 函数是一个函数的假设,类似于初等基本正则性,只依赖于局部性。1-李普希茨函数 f:𝒳→ℝ;满足|f(𝓍f(𝓍)|≤||𝓍𝓍| |所有𝓍、𝓍 ∈ 𝒳.的函数
从这个定义出发,假设目标函数 f 为1-李普希兹,数据分布𝜈* 为标准高斯分布。然后:****
估计 f ******* 直到误差𝜖所需的样本数 n 为:n =θ(𝜖⁻ᵈ),其中 d 为维数。(为了证明, GDL 原型本,第 2.2 节)。
很明显,样本数量在维度上呈指数增长,这表明随着输入维度的增加,**李普希茨类增长过快。如果我们用一个全局平滑假设来替换lip schitz 类,比如Sobolev 类 ,这种情况不会更好,我们将在下一节中看到。******

维度的诅咒。图片来自 GDL 原型书。
近似诅咒
在解释了维度的诅咒之后,我们想要表明这个诅咒出现在许多其他的上下文中。例如,它也可以是一个纯粹的近似值。
让我们考虑一个只有一个隐藏层的神经网络模型,这类函数可以写成简单激活函数的线性组合。这个假设类有一个非常自然的复杂性概念,即隐藏层中神经元的数量。

浅层神经网络假设类(有一个隐藏层)。GDL 课程,第二讲。
有了 普适逼近定理我们几乎可以利用这个假设类逼近任意函数。这里,关键的问题是,近似率是多少?如前所述,我们对在有限的 δ 下工作的近似误差感兴趣。我们想要控制复杂度,因此,我们想要查看整个假设空间上的近似和假设空间的具有较小复杂度的子集上的近似之间的差异。因此,我们如何用少量的神经元来近似函数呢?****
不幸的是,这些近似率也被诅咒了。如果我们以一个简单的函数类为例, 索博列夫类 ,f∈ℋˢ(s:f 的有限导数的个数)。然后:****

近似率在 Sobolev 类中是被诅咒的。来自 GDL 课程的方程式,第二讲。
优化中的诅咒
另一个诅咒也出现在高维学习中,优化中的维度诅咒。假设我们想找到下图中定义的景观的全局最小值。先验地,我们需要访问每一个可能的点并存储最小位置。换句话说,我们必须检查整个空间,评估每个可能的点,以确定最小的点。该过程在维度 (NP-hard)上具有指数依赖性。这又是一个相同的故事,复杂性呈指数级增长。因此,我们通常如何在实践中克服这种诅咒?****

复杂的景观。图片来自 GDL 课程第二讲。
在许多 ML 问题中,场景比上面定义的更简单。就像下面这张图(总有一条像样的路)。用更数学的术语来说,我们关心的很多景观并没有很多坏的局部极小值;我们将在风景中停留的地方不是很大。这不像最坏的情况,我们有一个指数。如果我们能够实际理解为一个函数寻找一个局部极小值而不是寻找一个全局极小值的代价有多高,那么这个意义上的问题就简化了。**

简单的风景。图片来自 GDL 课程第二讲。
实际上,很容易在高维中找到 a 局部最小值,因为梯度下降可以高效地找到 a 局部最小值(就迭代复杂度而言);维度中没有指数相关性。
定理【金等 17】:含噪梯度下降在(β/ ε )次迭代中找到一个β-光滑函数的 ε- 近似二阶驻点。
然而,这种情况并不总是正确的,在 ML 中仍然有许多问题,其中假设“没有坏的局部最小值”不正确。**
到目前为止的总结
到目前为止,我们已经讨论了维数灾难,以及当假设一个相当大的类,如 Lipschitz 函数时,它如何出现在统计误差中。相比之下,如果我们试图强加关于规律性的更强的假设来使问题变得更容易,例如考虑到索博列夫类 ,近似误差将受到维度的诅咒。**
因此,我们需要打破这种模式。因此,问题将是,我们如何定义更适应的函数空间?**
走向几何函数空间
事实上我们数据中的每一个点都不仅仅是高维空间中的一个点。也可以认为是一个信号,其中每个点本身就是的一个函数。高维空间𝒳隐藏在一个低维结构中,这个低维结构可以是 2d 中的网格、组、球体、图形、网格等。我们将在后面的帖子中详细讨论这一点。****

几何函数空间:Input 数据中的每一点也是低维几何域上的信号。图片来自 GDL 课程第二讲。**
这里的主要问题是,我们能不能利用这个几何域来找到一个新的正则性概念,用来克服我们刚刚在经典空间函数中讨论过的这些限制?
这个问题的答案是几何深度学习(GDL)的主要目标之一,你会在我们后续的帖子中看到。**
在这篇文章中,我们讨论了统计学习任务,以及我们应该关注的三个主要错误。我们表明,由于维数灾难,没有假设,高维学习是不可能的,Lipschitz & Sobolev 类不是好的选择。最后,我们引入了几何函数空间,因为我们在高维空间中的点也是低维几何域上的信号 。在下一篇文章中,我们将看到这些几何结构如何被用来定义一个使用不变性和对称性的新假设空间,由几何先验定义。******
参考文献:
- GDL 课程,( AMMI ,2021 年夏季)。
- j .布鲁纳的第二讲[ 视频 | 幻灯片。
- 米(meter 的缩写))m .布朗斯坦、j .布鲁纳、t .科恩和 p .韦利奇科维奇,几何深度学习:网格、组、图形、测地线和量规 (2021)。
- F.巴赫,从第一原理中学习理论 (2021)。
我们感谢 Rami Ahmed 对草案提出的宝贵意见。
用 Haystack 实现高可扩展性快速搜索
原文:https://towardsdatascience.com/high-scalable-fast-search-with-haystack-8b7bb103df8e
使用 Elasticsearch 和 GPU 将您的 FAQ 搜索放在类固醇上

使用 Haystack 的嵌入式单词搜索来确保安全(照片由 Rutpratheep Nilpechr 拍摄)
在之前的帖子中,我们创建了一个简单的“字符串匹配搜索”来查找德语/英语翻译。从比喻的意义上来说,我们也可以把这个翻译表称为一种 FAQ。FAQ 搜索据说具有以下积极特征:
- 在推理时非常快
- 很好地控制答案
虽然也有令人沮丧的地方:
- 概括:只有与 FAQ 中现有问题相似的问题才能得到回答
出于纯粹的好奇,我们现在想为我们的翻译器尝试一种比简单的字符串搜索更高级的技术。为此,我们将使用 Haystack 的认知搜索。
解决方案:
Haystack 是使用单词嵌入功能的首选:
我们将使用 Google Colab 的 GPU 来弹性地改进 Haystack search (ElasticSearch,如果我应该直呼其名的话)
你也可以在 Colab 上找到完整的代码(图片由作者提供)
让我们看看这项先进技术的成果。虽然我们将主要关注这篇文章中的结果,但请随意查看我的 Github 资源库中的完整代码。

Haystack 向我们展示了这个问题的前三个答案(图片由作者提供)
如果您想了解更多关于单词相似性的知识,您可能会发现这篇文章很有帮助:
还记得我们在简单字符串搜索中搜索“absorption”时,我们得到的是“Vollkostenrechnung”这个单词的正确德语翻译吗?

(图片由作者提供)
使用 Haystack,我们得到了相同的结果(得分最高的前 1 个答案)。Haystack 的嵌入式单词搜索的一个明显的优点是,我们现在可以用自然语言查询我们的翻译。我们可以问一个完整的句子,仍然可以得到答案。通过我们的简单搜索,如果我们问“吸收在德语中是什么意思?”我们不会得到答案:

(图片由作者提供)
尽管训练数据仍然只基于英语/德语词汇,但 Haystack 从中获得了更多。就是草堆后面嵌入魔法这个词。

嵌入相似性基于问题(图片由作者提供)
这也是为什么 Haystack 将“边际贡献会计”列为第二,将“标准成本会计”列为第三。它们与“吸收”并不相同,但它们确实包含“成本核算”一词,因此被判定为相似。

为了更好地理解单词嵌入,请看http://projector.tensorflow.org/(图片由作者提供)
让我们尝试另一个例子,现在更精确地检查结果(详细说明“全部”而不是“最小”):
“所有细节”将告诉我们更多的嵌入背景,并给出以下输出:
Inferencing Samples: 100%|██████████| 1/1 [00:00<00:00, 62.73 Batches/s]Query: What are accruals?
Answers:
[ <Answer {'answer': 'Rückstellungen', 'type': 'other', 'score': 0.6129861828861322, 'context': 'Rückstellungen', 'offsets_in_document': None, 'offsets_in_context': [{'start': 0, 'end': 14}], 'document_id': 'd8dd4582c851b70968837d0ddc24b010', 'meta': {'answer': 'Rückstellungen', 'query': 'accruals'}}>,
<Answer {'answer': 'Rabatt', 'type': 'other', 'score': 0.5722656545690049, 'context': 'Rabatt', 'offsets_in_document': None, 'offsets_in_context': [{'start': 0, 'end': 6}], 'document_id': '9bf6c46ce95bdab52a72ab1bf7333f8c', 'meta': {'answer': 'Rabatt', 'query': 'allowance'}}>,
<Answer {'answer': 'Abgrenzungen', 'type': 'other', 'score': 0.5675899718102981, 'context': 'Abgrenzungen', 'offsets_in_document': None, 'offsets_in_context': [{'start': 0, 'end': 12}], 'document_id': '6251dfe668dd12ac323b626bf66d010d', 'meta': {'answer': 'Abgrenzungen', 'query': 'accruals and deferrals'}}>]
第一个答案是我们所期望的:“应计”的意思是“Rueckstellungen”。第三个答案也是合适的,因为“应计和递延”代表“Abgrenzungen”。但是,Haystack 从哪里得到答案 2(“津贴”,在德语中是“拉巴特”的意思)?在我们的字符串搜索中,当我们搜索“应计”时,我们只找到两个匹配项:

“应计项目”中绝对没有接近“拉巴特”的字符串:

但人们可以认为,“备抵义务”也可以被视为“应计项目”。也许这就是为什么 Haystack 将“备抵”排在第二位,甚至排在“应计和递延”(前 3 位)之前。
正如我们已经提到的,我们的翻译器是提供一个精确的翻译搜索单词。换句话说,它是一个 100%的问答映射。因此,这个上下文中的字符串搜索——原则上可能很简单——对于明确的“词汇词典”来说是一个很好的解决方案。这是否意味着 Haystack 对所有 FAQ 任务都没用?不,一点也不!我们只需要转向真正的 FAQ 任务(而不是词汇词典)。还记得艾萨克( I 智能 S 解决方案为 A 管理和 A 分析 C 沟通),我们的聊天机器人回答常见问题吗?多亏了 Haystack(链接如下),我们将显著改进 Isaac 的 FAQ 功能。
总结:
恭喜你,你现在已经了解了简单字符串搜索与使用 Elasticsearch 和 Haystack 的认知搜索相比的优缺点。在下一篇文章中,我们将利用这些知识来改进我们聊天机器人的 FAQ 功能。
在此之前,非常感谢您的阅读!希望这篇文章对你有帮助。请随时在 LinkedIn 、 Twitter 或工作室与我联系。
https://jesko-rehberg.medium.com/membership
您可以在我的 Github 资源库中找到完整的代码和文件。请随时在 LinkedIn 、 Twitter 或工作室与我联系。
用于诊断黑盒性能的最高先验密度估计
如何搜索精确度较差的数字要素
模型可解释性是机器学习的一个领域,在过去几年里越来越受欢迎。更好的理解导致利益相关者更大的信任和更好的推广。但是你怎么能偷看黑盒呢?

图 1:蓝色的 50%最高密度区域(HDR)的示例。图片作者— src 。
在之前的一篇文章中,我们介绍了 IBM 的解决方案 FreaAI 。用一句技术话来说,FreaAI 使用最高先验密度方法和决策树来识别模型性能较低的数据区域。在对统计显著性和一些其他标准进行过滤之后,可解释的数据切片呈现给工程师。
FreaAI 不是开源的,所以在这篇文章中,我们将做一个最高先验密度方法的代码演练。
事不宜迟,我们开始吧!
1-虚拟示例
我们正在寻找开发代码,有效地搜索我们的功能,并寻找低准确度的领域。对于单变量数值数据,我们使用最高先验密度(HPD)。
HPD 地区是我们数据的密集区域。根据 IBM 从事 FreaAI 的研究人员的说法,高密度区域更有可能有可解释和可纠正的不准确性。为了确定这些区域,我们…
- 近似概率密度函数(PDF)。
- 求一条水平线的 y 值,这条水平线将我们的 PDF 分为α和 1-α。
让我们慢慢来,一步一步来。首先,我们需要创建一些虚拟数据…
samples = np.random.normal(loc=[-4,4], size=(1000, 2)).flatten()

图 2:虚拟双模态数据的直方图。图片作者。
现在的数据只是一个向量。取而代之的是,我们想要近似一条平滑的曲线来表示我们在任何给定位置的数据密度。换句话说,我们正在寻找近似的概率密度函数(PDF) 。
一种估计概率密度函数的方法叫做核密度估计。我们没有时间讨论细节,但是如果你有兴趣的话,这里有一个深入的演练。
在下面的代码中,我们利用高斯核来开发上述数据的平滑近似值。
import plotly.express as px
import scipy.stats.kde as kde# 1\. get upper and lower bounds on space
l = np.min(sample)
u = np.max(sample)# 2\. get x-axis values
x = np.linspace(l, u, 2000)# 3\. get kernel density estimate
density = kde.gaussian_kde(sample)
y = density.evaluate(x)

图 3:使用高斯核的双模式数据的核密度估计。图片作者。
既然我们已经有了一条接近 PDF 的平滑曲线(图 3),我们就可以开始第二步了。
在这里,我们希望找到我们的 PDF 中包含了我们数据的百分之 p 的区域。例如,当 p为 0.05 时,我们希望 5%的数据包含在我们的区域中。这样做的代码有点冗长,所以我们不打算展示它,但是在图 4 中我们可以看到一个图表,它将我们所有的工作联系在一起。

图 4:50% HPD 区域的图(阴影区域)。图片作者。
分解图 4…
- 蓝色的框是我们原始数据的直方图。
- 橙色的 T4 曲线是我们对 PDF 的核密度估计。
- 红色垂直线是我们 PDF 中密度最高的点。
- 灰色框对应于 x 轴区域,该区域包含我们 50%的数据。
- 绿色水平线用于确定灰色框的宽度——绿色线和橙色线的交点为 50%对应的宽度。
这个图表看起来很复杂,但是我们想要关注的是绿线和它与灰框的关系。如果我们将绿线下移,灰框会变宽,从而容纳更多的数据。相反,如果我们向上移动线条,灰色区域会变得更窄,从而容纳更少的数据。
FreaAI 反复向上移动绿线,直到模型精度有足够的变化。每当这种情况发生时,区域(x 轴上的值)被返回给工程师。
通过这样做,我们以非常有效的方式接收可解释的数据切片,这可以扩展到大型数据集。
2 —训练我们的模型
现在我们已经了解了 HPD 方法,让我们在一个真实的模型上测试一下。
2.1 —获取数据
所有的模型都需要数据,我们就从这里开始吧。
在本帖中,我们将使用一个可以从这里下载的糖尿病数据集。行对应于人,列对应于这些人的特征,例如年龄和身体质量指数。

图 5:我们数据集的最后 4 列— src 。图片作者。
如图 5 所示,我们的结果是对应于给定个体是否患有糖尿病的二元标签。
幸运的是,数据已经被清理了,所以我们只需要将数据帧读入 pandas 就可以开始了…
import pandas as pd
df = pd.read_csv('DiabetesData/pima-indians-diabetes.data.csv', header=None)
2.2—训练模型
有了熊猫数据框架,让我们来训练我们的黑盒模型。我们选择适合的具体模型并不重要,但是我们将使用 XGBoost,因为它的速度、开箱即用的准确性和受欢迎程度。
这是一个代码块中的模型训练…
# split data into X and y
mask = np.array(list(df)) == 'outcome'
X = df.loc[:,~mask]
Y = df.loc[:,mask]# split data into train and test sets
seed = 7
test_size = 0.33
X_train, X_test, y_train, y_test = train_test_split(
X, Y,
test_size=test_size,
random_state=seed)# fit model no training data
model = XGBClassifier()
model.fit(X_train, y_train)# make predictions for test data
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]# evaluate predictions
accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))# add accuracy and return
out = pd.concat([X_test, y_test], axis=1, ignore_index=True)
out.columns = list(df)accuracy_bool = (np.array(y_test).flatten() ==
np.array(predictions))
out['accuracy_bool'] = accuracy_boolout
除了最后一步,所有的步骤都应该是不言自明的;在训练模型之后,我们返回带有一个accuracy_bool列的测试数据帧,该列对应于我们是否正确预测了标签。这用于确定不同数据分割的准确性。
在我们继续之前,让我们回到我们的高层次目标。上面的 XGBoost 模型展示了 71%的样本外准确性,但是数据的某些部分显示了非常不同的准确性水平,这难道不合理吗?
嗯,这是我们的假设——我们的错误分类(可能)有系统性。
让我们看看是否能识别这些系统区域。
3 —真实的东西
如上所述,我们利用 HPD 方法的方式是,我们将反复改变我们正在寻找的数据的百分比,以寻找准确性的“显著”下降。
为了简洁起见,我们很遗憾不能做到超级科学,我们将不得不省去助手。然而,这里的代码改编自。
import numpy as np# 1\. Get percents to iterate over
start, end, increment = 0.5, 0.95, 0.05
percents = np.arange(start, end, increment)[::-1]# 2\. Create prior vars
prior_indices = {}
prior_acc = None
prior_p = Nonefor p in percents:
# 3\. run HDP and get indices of data in percent
*_, indices = hpd_grid(col, percent=p) # 4\. Calculate accuracy
acc = get_accuracy(indices) # 5\. Save if accuracy increases by > 0.01
if prior_acc is not None and acc - prior_acc > 0.01:
out[f'{p}-{prior_p}'] = (prior_indices - set(indices), acc - prior_acc) # 6\. Reset
prior_indices = set(indices)
prior_acc = acc
prior_p = p
这有用吗?嗯,代码很简单(这就是为什么它没有被链接),但是我们确实看到我们的 8 个预测器列中有 5 个有低精度区域。一些快速击球手…
- 没有误差的栏是皮肤厚度、 bmi 、糖尿病血统
- 准确度下降范围从 1.00 到 3.18%
- 多达 4 个百分比变化显示精确度下降
为了给出更多的上下文,下面是列胰岛素的输出。
60-65%
> indices: {65, 129, 131, 226, 137, 170, 46, 81, 52, 26, 155}
> accuracy drop: 0.01730911565-70%
> indices: {33, 67, 134, 8, 76, 143, 175}
> accuracy drop: 0.01593264280-85%
> indices: {193, 98, 35, 196, 109, 142, 176, 210, 21, 86}
> accuracy drop: 0.010059552
既然我们知道了哪些指数返回了准确性的巨大变化,我们可以做一些探索性的分析,并尝试诊断问题。
最后,如果您想探索原始的最高先验密度函数,如下所示。请注意,它很快从这个回购改编而来,需要更多的工作才能量产。
下周我计划发布决策树逻辑的完整代码。敬请期待!
感谢阅读!我会再写 20 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。
Holoviz 正在简化 Python 中的数据可视化
原文:https://towardsdatascience.com/holoviz-is-simplifying-data-visualization-in-python-d51ca89739cf
Python 有那么多数据类型;我们能用一个工具把它们都画出来吗?

卢克·切瑟在 Unsplash上的照片
在过去的十年中,Python 已经迅速成为处理数据的默认语言。凭借广泛的功能和充满活力的开源社区,Python 是从机器学习到 web 开发的强大工具。
虽然我经常将 Python 的成功归功于优秀的开源库,但是依赖各种第三方工具的缺点是缺乏一致性和连续性。我们确实经常有内置的绘图工具,如 Pandas 的原生绘图 API,但它们无法复制更现代的工具如 Bokeh 和 Plotly 的交互式绘图。底线是,当涉及到绘图时,我们花了很多时间来考虑数据格式,如果有一种简单的方法来生成跨各种数据类型的交互式绘图就好了。
这就是 HoloViz 旨在通过提供高级工具来解决的问题,这些工具可以更容易地将绘图库应用于数据。HoloViz 有一套自己维护的库,但在本文中,我们将重点关注 hvPlot。hvPlot 本质上添加了一个定制的绘图 API,可以用.hvplot()方法直接从我们的数据中访问它。
HoloViz 还开发了其他一些很酷的工具,我们将在以后的帖子中探讨,包括 Panel,这是一个为你的地块制作应用程序和仪表盘的工具。我们将在以后的帖子中探索如何创建仪表板应用程序,但现在,让我们深入 hvPlot,看看我们如何轻松地创建具有各种数据类型的交互式绘图。
hvPlot
hvPlot 提供了一个高级绘图 API,可用于许多最流行的 Python 数据类型,包括:
- 熊猫:数据框,系列
- XArray :数据集,数据阵列
- Streamz :数据帧,系列
- GeoPandas :地理数据框架
- 网络 X: 图形
- Dask :数据帧,系列
- Rapids cuDF : GPU 数据帧,系列
- 进气:数据源
我们可以看到,hvPlot 通过向 Python 的一些最流行的库中添加新的高级绘图 API 来工作,以便为您可能处理的所有数据提供一致且强大的绘图工具。令我印象深刻的是,它们支持所有这些库,因为它们占了我个人在 Python 中使用的数据的大部分。
看到他们允许我们在 Bokeh、Plotly 和 Matplotlib 之间选择作为最终的绘图后端,我也非常兴奋。我通常是 Plotly 的大力支持者,然而,我承认自从我上次使用它以来,散景已经改进了很多。因此,我将使用散景作为这篇文章的 hvPlot 后端。
熊猫
Pandas 无疑是最常用和最重要的 Python 库之一。能够轻松地将数据加载到表中是 Python 能够与其他流行的数据工具如 R 和 Excel 竞争的原因。
虽然熊猫是一个优秀的图书馆,但它缺乏的一个领域是绘图。在我的上一篇文章中,我讨论了一些最好的绘图 Python 库,然而,Pandas 的内置绘图工具不在其中。在熊猫的辩护中,它不是一个绘图库,它的内置工具是为了给用户一个快速和肮脏的数据帧视图。让我们来看看用熊猫制作的数据图表。

由作者创建
Pandas 在幕后使用 Matplotlib,这意味着我们可以使用 axis 对象对此进行进一步的样式化。但是,当我们可以使用 hvPlot 以最小的努力创建一个交互式的和吸引人的情节时,我们为什么要花时间来设计这个情节呢?
注 : Medium 不支持直接嵌入 HTML,所以我发布了一个 在线 Jupyter 笔记本,你可以在上面与剧情 互动。

由作者创建
对于那些在处理数据时生成大量快速可视化图形的人来说,能够用同样多的代码生成更好看的图形可以节省大量时间。这也允许任何人在基本上任何技能水平上访问交互式绘图,这只会继续帮助 Python 服务于广泛的用例。
更复杂的熊猫情节
让我们看看一个更复杂的图,我们可以使用 hvPlot。为此,我导入了 Seaborn penguin 样本数据集,其中包含三种不同企鹅的信息。
由作者创建

由作者创建
我们可以看到,我们可以将图层层叠加,甚至在同一个窗口中生成数据表。能够以如此少的努力产生这种类型的图是一个主要的时间节省。
地理数据
到目前为止,地理图是我最喜欢的数据可视化类型,然而,用 Python 制作它们可能会很痛苦。这种摩擦很大程度上源于依赖性问题,这会浪费大量宝贵的时间。不幸的是,我使用 Holoview 绘制地理数据的体验并不像我希望的那样顺利,但我确实找到了一种可靠的方法来设置它。
在我们进入依赖性问题之前,让我们看一下 xarray 的示例数据中的气温数据的可视化。我们将使用 matplotlib 来创建绘图,并使用 cartopy 来处理投影。
由作者创建

由作者创建
说实话还不错!然而,我一直觉得当涉及到空间数据时,交互式绘图有很多好处。让我们使用 hvPlot 重新制作这个情节。
由作者创建

由作者创建
这是一个很棒的情节。很高兴我们可以提供一个时间片的数据,并自动获得一个滑块,通过不同的日子擦洗。在我用 Python 完成的所有空间绘图中,这可能是我遇到的绘制地球上有适当海岸线的投影数据最快的工具。
注 :如果你在复制这个情节时遇到问题,我会在文章的最后介绍避免依赖问题的步骤。
流数据
使用传统工具在 Python 中可视化流数据尤其困难。这是可能的,但没有我希望的那么容易。幸运的是,hvPlot 处理得非常好。我们可以使用 streams 库创建一个随机数据流,然后用 hvPlot 绘制该数据流。请记住,我们不再使用纯 pandas 数据框架,所以我们必须为 streamz 导入适当的 hvPlot API。
由作者创建

由作者创建

由作者创建
图形/网络数据
网络数据是另一种不太适合原生 Python 库的静态图的格式。对于这个例子,让我们使用一个网络,其中节点是星球大战中的角色,边代表一个共享的场景。
由作者创建

由作者创建
如果你去交互式笔记本,你会注意到当你悬停在一个节点上时,它会高亮显示所有的边。像这样的小事情使得交互图作为可视化工具如此有效,hvPlot 使创建交互图变得如此容易,这真是太棒了。
缺点是什么?
虽然我真的很喜欢 hvPlot 使我们能够不费吹灰之力做出的各种绘图,但使用更高级别的 API 来取代这些库的内置绘图方法也有一些小缺点。首先,你增加的抽象层次越多,当错误发生时就越难追踪。
我遇到的最恼人的问题是依赖问题,我花了相当多的时间来解决。Geoviews 包有助于使用 hvPlot 创建地理图,它对 Conda 中的依赖项非常挑剔。然而,这并不是唯一的例子,地理图书馆长期以来一直存在依赖性问题;任何必须依赖 GDAL 工作的人都可能曾经遇到过环境问题。
幸运的是,我找到了让它在两台机器上可靠工作的几个步骤。
- 创造清新的康达环境
- 使用 conda-forge 仅安装 pyviz、geoviews 和 hvplot
- 更新 nbconvert(以避免无错误消息的不可见图)
我知道创建一个单独的环境只是为了用地理数据来尝试 hvPlot 是很烦人的,但是,请随意尝试从这里安装您需要的其他库,因为很有可能一切都会继续工作。
包扎
总的来说,hvPlot 给我留下了深刻的印象,我可能会在以后的工作中使用它。对于大多数数据类型,这确实感觉像是对我在探索数据集时用 matplotlib 进行的快速绘图的严格升级。这对熊猫的绘图 API 来说尤其如此;我真的很喜欢直接从数据帧中创建交互式绘图是多么容易。
在我的大多数测试中,我并不觉得我必须花时间摆弄 hvPlot,在大多数情况下,它只是工作。我要说的是,如果你确实遇到了问题,互联网上的例子会更少,然而,随着图书馆今天工作得如何,这可能会继续改善。
资源
注意:如果你喜欢在 Medium 上阅读我和其他人的内容,考虑使用下面的链接订阅,以支持这样的内容创作,并解锁无限的故事!
https://medium.com/@willmnorris/membership
引文
- 星球大战数据 —开放许可,范创作
Gabasova,E. (2016 年)。星球大战社交网络。https://doi.org/10.5281/zenodo.1411479
- NetworkX 气温数据—无限制, NCEP/NCAR 再分析 1
国家环境预测中心/国家气象局/NOAA/美国商务部。1994 年,每月更新。NCEP/NCAR 全球再分析产品,1948 年-继续。https://psl.noaa.gov/data/gridded/data.ncep.reanalysis.html 国家海洋和大气管理局/PSL 的研究数据档案。
- 企鹅数据集 —知识共享, PamlerPenguins
艾莉森·玛丽·霍斯特。(2020).帕尔默企鹅:帕尔默群岛(南极洲)企鹅数据。多伊:https://doi.org/10.5281/zenodo.3960218
智人——KNN 分类器
原文:https://towardsdatascience.com/homo-sapiens-the-knn-classifier-92261023249a
我们的决策是如何受 KNN 方法支配的

Sylas Boesten 在 Unsplash 上的照片
K 近邻(KNN)法可能是最直观的分类算法,实际上我们每天都在使用它。简而言之,它可以用众所周知的谚语来描述,如
物以类聚,人以群分
或者
你就是你交往的人
这篇文章将简要概述 KNN 分类器是如何工作的,以及为什么我觉得它很好地描述了某些人类行为?
KNN 分类器的技术方面
KNN 算法根据数据点的周围环境(它们的“最近邻居”)为数据点分配类别。下图用三个简单的几何图形示意性地说明了它的工作原理。如果基于三个最近的邻居(整个圆的内部)做出决定,则 X 点被分类为三角形。然而,将该模型扩展到五个最近的邻居(虚线圆的内部)会产生一个正方形作为估计值。

KNN 分类器是如何工作的?图片作者。
如果你对更多的技术细节和如何在 R 中实现算法感兴趣,请查看我早先的帖子。如果没有,继续读下去,因为这个简单的解释是我们理解 KNN 算法如何与人相关所需要知道的。
培训、验证、测试、开始!
为了理解下面的讨论,我将首先简要回顾一下训练、验证和测试数据集的定义。训练集用于拟合我们的模型,验证集用于调整模型超参数,测试集用于查看它在一些以前未见过的数据上的表现。在 KNN 分类器的情况下,没有实际的训练发生-该模型仅包含来自训练集的原始数据,该训练集稍后用于找到最佳超参数值。
KNN 分类器的超参数是什么?它是 K,邻居的数量。我们使用验证集来找到产生最佳可能分类结果的最佳数量的邻居。接下来,来自测试集的未知数据被用于提供我们的模型在先前未知的环境中工作得如何的度量。如果我们对结果满意,我们的模型就可以开始了!
人和 KNN 的量词有什么相似之处?
现在我们可以开始实际的比较了。这套训练装备是在我们成长过程中提供给我们的。每次我们遇到一个新的人,我们用我们的感官收集他们的特征,然后将他们归类。一旦我们长大了,我们就用这些数据来让自己在这个世界上立足。当然,在这个过程中有很多尝试和错误。这是因为,在机器学习的语言中,我们正在调整我们的超参数。例如,我们可以从非常高或非常低的 K 开始,即,我们将比较新认识的人的特征与过去许多相似的人的特征,或者只是最相似的(K = 1)。不可能有先验的最佳值,因为最佳解决方案将高度依赖于社会结构的复杂性。综上所述,我们正在认识很多新的人,并试图根据我们以前的经验对他们进行分类。以这种方式,我们使用它们作为验证集,以便为我们的环境选择最佳 K。
一旦我们对我们的模型有了信心,我们的目标就是走出去,在没有能力验证它是否正确的情况下,尝试将人们划分到某些群体中。如果我们的模型得到很好的调整,它可以成为一个很好的工具,因为它允许我们快速评估一个人,并决定下一步的行动。然而,这种方法自然也会导致一些错误。
傲慢与偏见
我们之前已经说过,KNN 模型在训练期间实际上不做任何工作,因为它只存储数据点。这就是为什么它经常被称为懒惰模型。这对人类来说非常适用,因为我们在评判一个人的时候通常同样懒惰。我们不是给一个人时间去了解他们,而是经常当场评判他们,如果我们不喜欢我们所看到的,我们只是继续前进。KNN 分类器没有第二次猜测。你要么属于某一类,要么不属于。虽然这种简单快速的方法的进化优势显而易见,但它也可能导致误判。在我看来,这种与 KNN 分类器的相似性是我们人类如此倾向于偏见推理的核心原因。
如果训练集不再代表测试集,就会出现另一个潜在的陷阱。发生这种情况的原因有很多,比如搬到另一个城市/国家,或者换工作。当这种情况发生时,我们的模型的准确性将大大降低。如果我们太骄傲,拒绝放弃旧的模式,创造新的模式,我们会很快与周围的人发生冲突。
结束语
这个简短的意见仅仅是,我的意见。当然,事情从来没有这么简单,虽然有很多差异,但我认为 KNN 算法很好地描述了我们的原始反射。我认为这种相似性很诱人,决定写这篇文章,因为它为我打开了一个不同的视角。希望你也觉得同样有趣!
Hopfield 网络:神经记忆机器
原文:https://towardsdatascience.com/hopfield-networks-neural-memory-machines-4c94be821073
递归神经网络模型的美学切入点

图一。各种“记忆”矩阵,对应于由 Hopfield 网络模型记住的不同图像(图片由作者提供)
—概述—
本文涵盖了 Hopfield 网络——能够存储和检索多个记忆的递归神经网络。我们将从一个深入的概念性概述开始,然后从头开始用 python 实现 Hopfield 网络;在这里,我们将构建、训练、动画和跟踪我们网络的各种统计数据。最后,我们将以 Hopfield 网络在现代机器学习问题中的应用为例来结束。请随意使用下面的目录,跳到您感兴趣的部分。如果你在这篇文章中发现任何错误或不一致的地方,请联系我们,或者提供反馈,告诉我们这些文章将来如何改进;感谢您的关注!
—目录—
- 介绍
- 概念背景
- 耐能量
- 代码实现
- 现代 HOPFIELD 网络的应用
- 有用的链接
—简介—
在你生命的每一刻,活动波都在你的大脑网络中传播。数十亿个信号不断协调振荡;这些网络是支撑你一切的功能架构。它们是你的爱,你的压力,你最喜欢的歌,你的希望和梦想。你的整个存在感和体验是由这些网络的动态行为形成的,由记忆系统保持稳定,记忆系统不断适应以更好地代表你在不断变化的环境中的位置。
人脑中网络的庞大范围和整合使得研究我们熟悉的形式的计算如何、在哪里、甚至是否以我们熟悉的形式发生变得非常困难。有证据表明,在单细胞中的调节蛋白、皮层微电路和全脑功能网络等层面上存在信息处理。对大脑的实验性理解进展缓慢。幸运的是,聪明的工程师已经发明或发现了算法,可以部分地模拟这些网络的各个方面。没有一个单一的模型可以概括人脑的绝对复杂性和行为,但是这些工具让学习这类系统的学生有一个方便的窗口来观察在分布式网络的活动中,信息可能被计算并最终被表示的方式。
为了这篇文章的目的,我们将分析和用 python 实现二进制 Hopfield 神经网络。尽管存在更新的算法,但这台简单的机器是神经网络中记忆和信息处理的研究和建模的一个既有信息量又有美感的切入点。我们将从概念背景开始,然后转向实现。最后,我们将介绍 Hopfield 网络在现代数据分析和模型生成中的一些功能用例。
—概念背景—
Hopfield 网络是一种漂亮的递归人工神经网络 (RNNs)的形式,首先由 John Hopfield 在他 1982 年的论文中描述,题为:*神经网络和具有涌现集体计算能力的物理系统 值得注意的是,Hopfield 网络是联想神经网络的第一个实例:能够产生紧急联想记忆的 RNN 结构。关联存储器或内容寻址存储器是一种系统,在该系统中,通过输入模式与记忆模式的关联性来启动记忆回忆。换句话说,联想记忆允许只使用不完整或有噪声的部分来检索和完成记忆。举个例子,一个人可能会听到一首他们喜欢的歌曲,然后被“带回”他们第一次听到这首歌的记忆。那段记忆中的背景、人物、环境和情感,可以通过随后只暴露给原始刺激的一部分来恢复:只有这首歌。Hopfield 网络(HNs)的这些特征使它们成为人类联想记忆早期计算模型的良好候选,并标志着神经计算和建模新时代的开始。*
Hopfield 独特的网络架构基于 [Ising](https://en.wikipedia.org/wiki/Ising_model#:~:text=The Ising model (%2Fˈaɪ,of ferromagnetism in statistical mechanics.&text=The model allows the identification,a simplified model of reality.) 模型,这是一种解释铁磁材料产生的磁场的紧急行为的物理模型。该模型通常被描述为平面图,其中节点表示规则重复排列的磁偶极矩。每个节点可以占据两种状态之一(即自旋向上或自旋向下,+1 或-1),并且相邻节点之间的状态一致在能量上是有利的。当每个偶极“翻转”,或进化以找到局部能量最小值时,整个物质趋向于稳态,或全局能量最小值。HNs 可以以类似的方式来考虑,其中网络被表示为 2D 图,并且每个节点(或神经元)占据两种状态之一:活跃或非活跃。像伊辛模型一样,HN 的动态行为最终是根据“系统能量”的隐喻概念来确定的,网络收敛到“能量最小”状态,在学习网络的情况下,这恰好是一种记忆。
为了理解 Hopfield 网络的布局和功能,分解单个单元/神经元的质量和属性是有用的。
网络中的每个神经元都有三个品质需要考虑:
与其他神经元的连接 —网络中的每个神经元都与所有其他神经元相连,每个连接都有独特的强度或权重,类似于突触的强度。这些连接强度存储在权重矩阵中。
****激活——这是通过来自其他神经元的净输入和它们各自的连接权重来计算的,大致类似于神经元的膜电位。激活采用单个标量值。
双极状态 —这是神经元的输出,使用神经元的激活和阈值函数计算,类似于神经元的“触发状态”在这种情况下,-1 和+1。
Hopfield 网络的信息、或记忆存储在神经元之间的连接强度中,与根据长期记忆模型认为信息存储在大脑中的方式非常相似。这些连接及其各自的权重直接影响每一代网络的活动,并最终决定网络收敛的状态。你可以把神经元-a 和神经元-b 这两个神经元之间的权重,想象成神经元-a 的输出对神经元-b 激活的贡献程度,反之亦然。下面更多关于激活及其对神经元状态的影响。
重要的是,HN 中神经元之间的连接是对称的。这意味着,如果神经元-a 以+1 的强度连接到神经元-b,则神经元-b 到神经元-a 的连接也是+1。我们可以将具有 n 个神经元的网络的权重存储在一个维度为 n×n 的正方形对称矩阵中。因为神经元不与自身连接,矩阵对角线上的权重实际上为零。值得注意的是,网络结构,包括神经元的数量和它们在网络中的连接,是固定的。那些连接的权重是可调参数。当我们谈到“网络学习”时,我们真正的意思是对网络中的每一个权重进行微调,以便获得一些期望的输出。在 HN 的情况下,初始状态配置可以被认为是输入,而它的最终状态配置是输出。因为每个神经元的更新依赖于其输入的线性组合,所以整个网络实际上是一个巨大的数学函数:一个动态系统,随着每一代的更新,它将过去的输出作为当前的输入。这个函数的参数,即权重,决定了网络随时间演变的方式。
任何神经元的瞬时激活都可以通过对与其相连的神经元的输入进行加权求和来计算:

方程 1 : 二进制 Hopfield 网络中一个神经元的激活函数(图片由作者提供)
其中 yi 表示网络中神经元- i 的激活, yj 表示输入到神经元- i、和 wij 的所有神经元各自输出的向量,即神经元 i 和 j 之间连接的对称权重。
神经元的激活用于根据阈值函数确定神经元的状态或输出:

等式 2 : 二进制阈值输出函数(图片由作者提供)
其中 si 代表神经元 i 的给定状态和输出。
随着网络中每个神经元状态的更新,它对其他神经元活动的贡献也随之改变;这又反过来反馈和调节更多的活动,等等,直到网络达到稳定的形成。如果一个神经元在给定的一代中的激活是正的,它的输出将是+1,反之亦然。另一种思考方式是,一个给定的神经元正在接收一个类似于其激活的输入“场”。神经元接收到的每一个输入都经过加权和求和,产生一个净激活,无论它是正的还是负的。如果该场的符号与神经元当前输出的符号不同,它的状态将翻转以自我对齐。如果输入场的符号与神经元当前输出的符号匹配,它将保持不变。如果我们根据这些规则考虑整个网络的行为,重现的质量就变得清楚了;每个网络更新或输出成为下一个时间步的输入。
现在我们已经定义了单个单元的特征,但是这如何转化为网络中信息的分布式存储和表示呢?
虽然每个神经元在给定时间可以代表两种状态中的一种,但网络的整体状态,称为 s ,可以代表一串二进制信息。以此模式为例:

图 2.1 二进制信息串(图片由作者提供)
这种模式是一个 1 x 9 的二进制向量,它可以被整形为 3 x 3 的矩阵:

图 2.2 一个二进制信息串被整形并可视化为一个图像(作者提供的图像)
图像只是一个数字像素值的矩阵,因此任何可以用占据二进制状态的像素值来表示的图像都可以用二进制 HN 的状态来精确地表示。许多形式的信息可以用二进制/双极方式表示,但我们将把重点放在图像上作为我们的用例。
如果一个图案采取图像的形式,我们就用单个神经元来表示像素本身。在上面的例子中,我们有一个 3 x 3 的像素矩阵,所以我们需要 9 个神经元来完全代表图像。另一种形象化的方法是将网络表示为图形,如下所示:

图 2.3 表示 Hopfield 网络状态的示例二进制字符串。二进制字符串中的每一位都由网络中单个神经元的状态来表示(图片由作者提供)
在这个网络图中,节点代表神经元,边代表神经元之间的连接。红点表示神经元,其状态代表模式向量中的第一个元素, 1,。按照顺时针方向观察神经元的状态,就可以得出模式的其余部分。
在计算机中,每个神经元的状态被表示为 1×9 向量中的单个元素, S 。换句话说,我们直接使用网络中神经元各自的状态来表示我们试图存储的信息:
S =【0,1,0,1,0,1,0,1,0,1,0】。
任何任意的 n 比特的信息串都可以用一个 n 神经元的网络来表示。它是网络中神经元的组合活动,这些神经元以分布的方式共同代表我们的目标信息。在大多数 HNs 中,神经元的状态是双极的(-1 或+1)。为了简单起见,上面的例子使用二进制 0 或 1,从这里开始假设神经元处于双极状态。
现在我们知道了神经元的状态是如何随着时间的推移而更新的,以及状态本身是如何表示二进制信息的,我们开始了解 Hopfield 网络真正的 magic :它们朝着记忆模式的进化。
这里,多一点背景信息是有帮助的。HNs 通常被称为“吸引子网络”,因为它们倾向于进化到或被吸引到“稳态”。为了看到这一点,让我们再次考虑上面的示例模式。出于本节的目的,假设网络已经学习了该模式(我们稍后将讨论学习的细节)。假设我们将网络初始化为随机状态,并让网络按照上述更新规则运行,一次一个神经元:

图 3 一个 Hopfield 网络的进化,它已经学习了目标模式,并被允许一次进化一个神经元(图片由作者提供)
这里我们看到,尽管网络处于随机初始化状态,但它能够在三个更新生成步骤中恢复目标内存——网络的整体状态被吸引到内存状态。让我们将目标模式的分辨率提高一个等级:

图 4 从 MNIST 数据集中收敛到手写数字的 Hopfield 网络(图片由作者提供)
不可思议! 网络又一次慢慢收敛到稳定状态,在这种情况下是手绘的‘5’,并且不再进一步更新。这种行为意义重大。尽管每个神经元的初始状态被打乱,但神经元之间连接的权重,以及它们各自的激活和输出,足以推动整个网络状态随着每次后续更新而更接近记忆的模式。每个神经元只知道自己的状态和输入,然而网络的集体活动却呈现出一种分布式模式。
以这种方式配置的网络实际上能够存储多达 ~0.14n 个模式,其中 n 是网络中神经元的数量。当存储多个模式时,网络将收敛到与网络初始状态最相似的模式。多个存储模式的示例如下所示。




****
图 5 相同的 4096 神经元 Hopfield 网络形成三个图像存储器,并从每个存储器的失真版本初始化。这体现了模式完成的质量(图片由作者提供)
在上面的例子中,同一个 4096 神经元的神经网络已经记住了三种不同的模式(红色图像)。每个图案都是由网络学习的 64x64 像素的图像。网络随后从每个图像的失真版本中被初始化三次。在每次更新生成期间,随机选择 256 个神经元(网络的 7.2%)并根据二进制阈值更新规则进行更新。尽管每个网络初始化都严重失真,但是当网络状态收敛时,网络会恢复每个相应的模式。通过对几种模式的学习,网络已经变得有能力做出灵活的、特定于刺激的行为!
在这些示例存储器中,我们识别的信息是发光和不发光像素的简单空间关系,即形状,这使得图像可识别。然而,任何可以存储为二进制值串的信息都可以被 HN 记忆和调用。这篇文章的后面部分将讨论 HNs 的最新应用,但为了想象,让我们回到引言中的例子:想象一下,你大脑中一个非常高维度和集成的吸引子网络的状态正在编码许多关于你第一次听到你最喜欢的歌曲的感觉和上下文环境的信息,即记忆。
你和谁在一起,你周围的环境,你在经历中的情绪价值,等等。虽然这些信息编码了记忆的不同部分,但当你后来单独听到这首歌时,它们可能会被同一个记忆网络立刻回忆起来。这种现象被称为模式完成,是人类记忆研究中的一个完整的子区域。一些人认为这种物理机制是由人类海马体中吸引子动力学的存在所介导的——参见摘自The mechanisms for pattern completion and pattern separation in The 海马体 Rolls,2013 :
海马中的许多突触(连接)表现为长时程增强所示的联想性修改,而这种突触修改似乎与学习有关(参见 莫里斯,1989 年 , 2003 年;** 莫里斯等人,2003 年; 中泽友秀等人,2003 年2004 年;* 林奇,2004; 安达信等,2007; 王与莫里斯,2010; 杰克逊,2013 )。根据以上总结的证据, 卷(19871989 ab 1991等( 麦克诺顿和莫里斯,1987); 征,1989 年;McNaughton,1991)提出,CA3 阶段充当自动联想[也称为吸引子]记忆,其使得情景记忆能够形成并存储在 CA3 网络中,并且随后广泛的循环连接允许通过激活同一表征的一些小部分来启动整个表征的提取(回忆线索)。*****
在我们开始 HNs 的 python 实现之前,有两个网络级的概念是联系在一起的,有助于理解:
- 网络学习 —计算网络权重,使网络状态向一个或多个记忆吸引子发展
- 网络能量**——一个数学基础和有用的类比,有助于理解为什么网络保证收敛到一个吸引子状态,或能量最小值。**
首先,让我们看看上面所示的 4096 个神经元网络的权重矩阵:

图 6 代表 4096 个神经元网络所有连接权重的颜色编码矩阵(图片由作者提供)
你应该注意到的第一件事是这个图看起来很酷;)。每一行/列代表一个神经元,行/列之间的交叉点代表一个颜色编码的连接权重。你应该注意的第二件事是,我们有一个对角对称矩阵。这是意料之中的,因为行/列之间的彩色交叉点代表我们之前讨论过的对称和双向连接的权重。从技术上讲,我们只需要这个正方形的一半,但像上面这样的对称数组更容易在计算机中计算和实现,而且看起来有趣得多。
我们现在知道网络连接的权重决定了它的吸引子动力学。所以这个百万美元的问题是:我们如何设计这些权重,使得网络对我们希望它记住的每个记忆都有一个吸引子?
已知有几种学习算法对 HNs 有用,但这里我们将利用 hebbian 学习。h ebbian 学习算法起源于描述生物神经网络中突触可塑性现象的规则。总的来说,赫比学习可以被浓缩为“一起放电的神经元,连接在一起”的陈述。换句话说,如果通过突触连接的两个神经元同时活跃,它们的连接强度会增加(在 HNs 的情况下,更积极),并且它们的活动随着时间的推移变得更加相关。
对于异步触发的神经元来说,情况正好相反,相反,它们的连接权重降低(在 HNs 的情况下,变得更负)。在我们储存图像的例子中,希伯来人学习背后的直觉是清楚的。我们希望在目标模式中,同时“点亮”或“熄灭”的神经元之间的权重能够在网络更新时促进它们活动的一致性。我们也希望状态相反的细胞有相反的行为。
根据 hebbian 学习来计算两个神经元 I 和 j 之间的单个权重的公式由下式给出:

等式 3 :计算两个神经元(神经元 I 和 j)之间所需权重的赫比公式(图片由作者提供)
其中 si 和 sj 是神经元 I 和 j 在目标模式中将呈现的相应状态。为了计算导致几个同时存储的模式的权重,公式被扩展为:

等式 4 : 扩展版的赫比规则,它同时计算给定模式或一组模式的所有期望权重(图片由作者提供)
…它有效地计算了所有模式的平均权重,其中 p 代表任何模式, n 代表模式的数量。在右边,我们有矩阵形式的等价表达式,其中 Y 是包含我们的模式作为行向量的矩阵。重要的是,当存储多个模式时,当网络通过该算法学习时,每个模式中的位数必须保持一致。
如前所述,以这种方式学习的一个显著特征是它是“一次性的”,这意味着网络只需要一次“暴露”就可以学习。这是因为我们在一次操作中计算了整个权重矩阵。一次性学习有些独特,因为它通过反向传播直接对比现代深度学习;一种过程,其特征是反复调整网络权重以减少误差信号。根据任务的不同,通过反向传播进行训练通常需要数万甚至数百万个训练样本。这使得它不适合作为人类情景记忆处理的模型,根据定义,这需要一个“情节”来记忆。有趣的是,海马体,一个已知具有吸引子样动态的区域,在一次性学习期间被积极招募,并且已知该区域中的稀疏集合在情景记忆回忆期间协调过去皮层状态的重演。
在生物网络体内和吸引子网络电子的行为中观察到的东西之间存在功能和结构对称性,这让我非常感兴趣。对我来说,这表明记忆、认知和学习等行为背后的潜在机制可能比它们的物理实例化系统更为“基础”,无论是大脑还是 CPU 等等…
到目前为止,我们已经讨论了 HN 结构、行为和学习。接下来,我们将一切联系在一起,并使用网络能量的概念来理解为什么 HNs 会有这样的行为。****
我们知道,不管 HN 的初始状态如何,它都趋向于状态空间中的“定点”吸引子。“固定点”是描述网络状态保持稳定的一种方式,即网络可以在该点永远更新,没有神经元会翻转。这种现象对我们来说并不陌生;我们通常观察收敛到稳态的系统。想象一个球从山上滚下来,直到它停在山脚下,或者一枚掉落的硬币在地上快速旋转,直到它的一边静止不动。这种系统的状态,你可以用物体的位置、速度等来描述,收敛到没有进一步扰动就不会改变的结构。以伊辛模型为例,高温磁性材料中磁偶极子的取向可能处于高度熵无序状态。如果允许材料冷却,偶极子将独立地排列到它们的局部场,并且整个材料将趋向于均匀和稳定的全局排列状态。这些例子的共同点是它们的最终状态都处于能量极小状态。换句话说,从热力学角度来看,它们的静止是有利的,因此从每个系统的外部扰动停止的那一刻起,它们就开始各自的状态轨迹,朝着可能的最低能量前进。
在计算机中实现的 HNs 不是朝着热力学稳定状态演化的物理系统。然而,由于构建在网络中的约束,由它们的结构和更新规则定义,它们表现出类似的行为。记住,他们最初是受伊辛模型的启发。
事实上,HNs 有一个标量值,称为能量,它随着每个后续更新生成而单调下降。HN 的国家轨迹随着时间的推移可以被认为是一个点下降的能源景观;当网络汇聚成记忆时,它就发现自己处于风景的“山谷”中,除非受到干扰,否则不会进一步进化。

图 7。一个能量景观的例子——Hopfield 网络的“记忆”状态是稳定的吸引子。在上面的例子中,有许多稳定的吸引子或谷。每个吸引子代表一段记忆,网络状态会向最接近初始状态的吸引子方向演化(图片由作者提供)
HNs 的美妙之处在于,根据已知的权重,它们各自的吸引子或能量极小值是可调的。系统的任何状态都可以成为、或学习,成为吸引子,因此任何状态都可以成为学习记忆。下面是 HNs 中能量的数学描述,显示了能量如何保证在随后的更新世代中减少。**
—霍普菲尔德能量证明—
注:下面的证明是作者提出的,基于卡内基梅隆 ) 的 关于 Hopfield 网络的讲座中的数学
我发现在这种情况下把能量想成一种张力是很有用的,因为它非常符合物理能量的概念。通过将每个神经元对的各自状态以及它们之间的连接权重相乘,然后将所有可能对的值相加,来计算网络的能量:

公式 5 : 计算给定世代中 HN 能量的公式(图片由作者提供)
从物理学的角度来看,能量是做功的能力,或者系统改变的能力。这里的关键要点是,当单个节点的状态与其输入的“输入场”不一致时,张力或网络能量最高。二进制更新规则通过对齐神经元输出和输入场的符号来缓解这种紧张,这样一来,每次更新都会降低网络的整体能量。

等式 6 : 激活和二元决策规则(图片由作者提供)
当神经元状态与其输入场之间的乘积符号为负时,神经元将翻转:

等式 7 : 保证“翻转”的条件(图片由作者提供)
翻转神经元在 t=1(翻转后)和 t=0(翻转前)时的状态由下式表示:

等式 8 : 翻转前和翻转后神经元输出的描述(图片由作者提供)
例如,如果神经元在 t=0 时处于状态-1,那么在 t=1 时翻转的状态将是+1,反之亦然。根据这些规则,有一个与每次翻转相关联的数量保证增加。我们给这个量起了个绰号 D ,并把负数(- D) 作为我们对系统能量的类比,因为这个行为更类似于具有能量的物理系统的行为。

公式 9 : 描述更新生成期间的增量 D 的公式(图片由作者提供)
所以- D 保证每一代都会减少,我们对每一代中更新的所有神经元求和- D ,并将其称为能量:

方程 10 : 能量方程的迭代(图片由作者提供)
好吧,让我们看看它的行动!
让我们将经过训练的 HN 初始化为其存储器的失真版本,并在它被记住时为每一代更新计算这个值 E 。我们期望看到能量在初始化时最高,在内存中最低:



图 8 一个示例网络不断迭代,直到在其内存上收敛——在每一代测量网络的总能量,并显示收敛(图片由作者提供)
在这里,我们看到在网络记住一张蝴蝶的照片时,在随后的更新世代中, E 减少了。图中标有“收敛”的部分是静态的,因为网络中的每一个神经元的状态都符合其各自输入的符号。此时,网络状态与学习到的图像相匹配,因此已经收敛到其存储器中。
—代码实现—
我们已经介绍了 Hopfield 网络的基础知识;现在是时候用 python 从头实现一个了。
这个程序将包含建立、训练和动画 Hopfield 网络的方法。我们将导入 MNIST 手写数字数据集作为实验。首先,我们实施网络的核心结构和基本功能:
此代码包含构建 Hopfield 神经网络所需的核心函数。您可能想要试验的任何图像或其他二进制信息字符串都应该在类初始化时作为 numpy 数组传递。
接下来,我们可以使用从 MNIST 手写数字数据集中提取的样本进行实验。我们将随机选取一个数字作为我们网络的内存,然后使用 pygame 动画显示网络的更新步骤。
一个使用上面定义的 Hopfield 类的实验,使用 pygame 制作动画
fetch_MNIST 函数是乔治·霍兹写的,可以在这里找到。
我们做到了!一个功能齐全、生气勃勃的 HN。上面的代码提供了一个利用图像记忆探索这些特殊网络行为的机会。
—现代 Hopfield 网络的应用—
如果你已经做到了这一步,你就会明白我们到目前为止所讨论的 HNs 具有占据离散二进制状态的神经元:-1 或 1。这是有用的,但是在什么信息可能被有效地存储在网络中方面有些限制。理论上,一个足够大的二进制 HN 可以存储任何信息,但是想想看,你需要多少个神经元来存储一张灰度图像。
假设我们有一个 28x28 的灰度图像;灰度是一种图像格式,它将像素值存储为介于 0(黑色)和 255(白色)之间的整数。如果我们在相对较小的图像中有 28x28 = 784 个像素,并且我们选择将每个像素的灰度值表示为一个无符号 8 位整数,我们将需要一个具有 6272 个神经元的 HN 来完全表示图像的信息内容。对于更大的图像分辨率,比如 1024×1024,我们需要 800 万个神经元。现代机器学习中的信息在内容和维度上都很丰富,因此拥有能够占据连续状态的神经元显然是一个优势,减少了代表记忆所需的神经元数量,并极大地增加了网络的信息存储容量。**
在 2020 年的论文 中首次介绍了连续 Hopfield 网络(CHNs)* 领域的进展*Hopfield 网络就是你所需要的一切。与传统的二进制 HNs 相比,CHN 有几个优点。顾名思义,CHNs 中神经元的状态是连续的,即它们是浮点数,而不是整数 0 或 1。因此,在任何给定的更新生成中,CHN 的状态都是浮点数的向量。这大大增加了网络可以学习和检索的模式的复杂性。此外,网络的存储容量,如它可以记住和回忆多少不同的模式,比二进制网络中的存储容量高得多——二进制 Hopfield 网络(bhn)容易出现“虚假”最小值。如果 BHN 学习的记忆过于相似,或者学习了太多的模式向量,网络就有收敛到中间记忆的风险,即学习模式的某种组合;换句话说,网络将无法区分模式,变得毫无用处。**
在上面引用的 2020 年论文中,作者提出了一种 CHN 架构,该架构对现代机器学习问题提供了一些适用性。值得注意的是,该网络提议:
- 一步到位
- 存储的模式比 BHN 多得多
- 能够利用丰富的高维数据帮助分类任务
我不会在这里讨论论文的细节,但是您可以自己探索。作者为他们的实现提供了一个用例,并表明,作为深度学习架构的补充层,CHNs 在复杂的 免疫库分类 任务中的表现优于其他最先进的算法。
我使用的所有代码和更多代码可以在 github repo 中找到。下面是一些链接,它们在我学习 Hopfield Networks 的时候给了我很大的帮助!
—有用链接—
- 麻省理工学院开放式课程,霍普菲尔德网络
- 卡耐基甜瓜讲座关于 Hopfield 网络和深度学习
- Geoff Hinton 关于 Hopfield 网络的演讲
- 采访霍普菲尔德网络创始人约翰·霍普菲尔德
- geeksforgeeks Hopfield Networks
- 扬尼克·基尔彻解释的霍普菲尔德网络就是你所需要的
感谢您的阅读,并感谢任何反馈!
在 Docker 上提供 TF 服务的托管模型
原文:https://towardsdatascience.com/hosting-models-with-tf-serving-on-docker-aceff9fbf533
将张量流模型部署为 REST 端点

图片来自 Unsplash
训练机器学习(ML)模型只是 ML 生命周期中的一步。如果你不能从你的模型中得到回应,那么 ML 就没有任何意义。你必须能够主持你的训练模型进行推理。有多种托管/部署选项可用于 ML,其中最受欢迎的是 TensorFlow Serving 。
TensorFlow 服务有助于获取您的已训练模型的工件,并托管它以进行推理。使用 TensorFlow Serving 进行推理的最简单方法是 Docker 。在本文中,我们将举一个例子,训练一个模型,然后使用 TensorFlow Serving 结合 Docker 托管它,以提供一个用于推理的 REST API。如果你想直接跳到代码,看看这个库。
目录
- 先决条件/设置
- 张量流服务架构
- 培训和保存您的模型
- 使用 TensorFlow Serving & Docker 托管您的模型
- 学分+额外资源和结论
先决条件/设置
在这篇文章中,我们不会深入任何实际的模型构建。我们将采用流行的波士顿数据集并训练简单的人工神经网络。本文更多的是围绕托管 ML 模型的基础设施,而不是优化模型性能本身。
确保 Docker 已安装并正常运行。要完全理解这篇文章,请确保对 Docker 命令以及 Python 有一个基本的了解。
注:该数据集最初由 Harrison,d .和 Rubinfeld,D.L .出版并授权《享乐价格和对清洁空气的需求》,J. Environ。经济学&管理学。
张量流服务架构

作者截图(来源: TensorFlow Github )
理解 TensorFlow Serving 背后的要点是客户端用来执行推理的 可服务的 对象。通常,这个 Servable 是您将在训练您的模型之后创建的 SavedModelBundle 。每个 Servable 都有一个相关的版本,这可以在保存模型时指定。如果你愿意的话,你还可以用它同时为多个不同的型号服务。
流程大致如下-
- Source :从提供的文件路径加载模型,这是可服务对象。我们将在启动容器时指定这个路径。
- Loader :从源代码中获取一个新模型,包含加载和卸载 servable 的功能,根据新模型创建一个期望的版本。
- 模型管理器 :维护模型的生命周期,这意味着对模型版本/元数据的任何更新。如果必要的资源可用(例如:特定版本的元数据存在或不存在),管理器实质上监听源并满足请求。
- servable handle:这是与客户端代码的对话点,这里公开了合适的 API(REST 或者 gRPC )。
要全面深入了解 TensorFlow 服务架构,请务必阅读官方文档这里。
培训和保存您的模型
我们将首先在波士顿住房数据集上训练一个简单的模型。我们在一个 train.py 脚本中提供了所有这些,确保安装了以下导入。
培训导入
我们可以直接从 Sklearn 加载波士顿数据集,拆分数据集进行训练。
加载波士顿数据集
然后我们创建我们的神经网络并训练我们的模型。
模特培训
脚本的最后一行是正确服务您的模型的关键。
保存 TF 模型
“波士顿模型”将是模型名称和目录,我们将在其中指向我们训练过的模型工件。创建的子目录‘0000001’是包含您的模型元数据的目录:assets、variables、keras_metadata.pb 和 saved_model.pb。确保运行该脚本,并确保在执行后创建以下目录,如下所示。

模型数据(作者截图)
使用 TensorFlow Serving & Docker 托管您的模型
确保 Docker 启动并运行。我们要做的第一件事是使用以下命令提取 TensorFlow 服务 Docker 映像。
拉张量流服务图像
在您提取图像之后,我们需要启动容器,对于 REST API,我们需要公开端口 8501。请注意, gRPC 也是受支持的,对于这个 expose 端口 8500。
启动容器
如果您运行下面的 Docker 命令,您应该会看到您添加的容器名称。

tfserving_boston Docker 容器正在运行
确保在源命令中添加项目所在位置的路径。“MODEL_NAME”环境变量是保存模型的目录,这是保存模型最新版本的地方。请注意,在运行容器时,您还可以在这里注入容器可能使用的其他环境变量。

剩余端点暴露
现在我们有了一个 REST 端点,我们可以使用一个 Curl 命令发送一个示例调用。对于单个数据点,运行以下命令。
单次调用

结果(作者截图)
如果您想要发送多次调用,您也可以创建一个示例 shell 脚本来迭代有效负载。我们可以将样本数据点打包到一个 JSON 中,并将其提供给我们的端点。
样本数据点
迭代有效载荷
您可以使用以下命令执行 shell 脚本,并看到 10 个返回的结果。
为了更有创造性或者更大规模地加载测试,你也可以使用像 Python requests 库这样的包。
结论
https://github.com/RamVegiraju/TF-Serving-Demo
有关本示例的完整代码,请访问上面的链接。我希望这篇文章是对 TensorFlow 服务的良好介绍。对于数据科学家来说,理解机器学习的基础设施和托管方面变得比以往任何时候都更加重要。有很多主机选项,我在下面附上了我一直在做的 SageMaker 系列,以及一些其他资源,当我开始使用模型主机和推理时,这些资源也帮助了我。
信用/额外资源
如果你喜欢这篇文章,请在LinkedIn上与我联系,并订阅我的媒体 简讯 。如果你是新来的中号,用我的 会员推荐 报名吧。
SageMaker 上的托管与代码
原文:https://towardsdatascience.com/hosting-vs-code-in-sagemaker-studio-f211385e25f7
在您的环境中设置它的分步指南
ML 团队在进行项目时需要灵活选择笔记本电脑或完整的 IDE。他们甚至可能在同一个项目中使用多个 ide。
这有点像带着合适的装备爬山。这使得攀登更容易,也给了登顶更多的机会。

到目前为止,在 SageMaker,你可以在 Jupyter 和 RStudio 之间进行选择。在这篇文章中,我将首先展示如何在 Studio 环境和笔记本实例上托管 VS 代码。
预排概述
我们将通过以下步骤解决这一问题:
选项 A:在 Studio 上托管 VS 代码
- 我们将首先看到 VS 代码可以在 SageMaker Studio 架构中的什么地方运行,以及这种方法的关键考虑因素。
- 然后,我们将为一个 Studio 用户完成 VS 代码安装过程。
- 最后,我将展示 Studio 管理员如何使用生命周期配置来自动化所有 Studio 用户的安装。
在选项 B 中:我们将在一个笔记本实例上安装 VS 代码。
先决条件
要浏览此示例,请确保您具备以下条件:
对于选项 A:在 Studio 上托管 VS 代码
- 熟悉其底层架构。如果你对亚马逊 SageMaker Studio 笔记本架构感到陌生,你可以访问深入了解它。
- 我们将使用代码服务器在云中安装和运行 VS 代码。确保您熟悉这个实现。
- 在步骤 3 中,将使用生命周期配置自动安装 VS 代码。在继续之前,请确保您已经阅读了使用生命周期配置定制 Amazon SageMaker Studio。
对于选项 B:在笔记本实例上安装 VS 代码
- 访问一个 SageMaker 笔记本实例。确保它运行亚马逊 Linux 2。
- 笔记本上的这个外壳脚本实例。它将帮助我们安装 VS 代码并设置 Jupyter 代理,这样我们就可以访问它。
选项 A:在 Studio 上托管 VS 代码
第一步:VS 代码应该安装在 Studio 的什么地方?
架构概述
代码服务器允许我们从浏览器访问 VS 代码,同时将它托管在 Studio 中。所以首先,我们需要弄清楚我们将在 Studio 的什么地方安装和运行它。
下面是设置的架构概述:

作者图片
SageMaker Studio 在一个 JupyterServer 中运行 JupyterLab UI,与笔记本内核解耦。JupyterServer 自带代理,允许我们在浏览器上访问 VS 代码。这是我们托管代码服务器的地方。
该方法的主要考虑事项
关于 JupyterServer,您应该记住以下 4 点:
- 它托管在一个固定大小的小型实例上,允许最少的本地计算。
- 它运行在一个 docker 容器中,你不能做 docker-in-docker。
- 每次您停止/启动 JupyterServer 应用程序时,都会管理和重新初始化容器映像。
- 您可以使用 yum 或 pip 安装库。

图片作者:将 JupyterServer 留给开发,在 SageMaker jobs 中运行更大的计算。
启动pip install sagemaker来获得 SageMaker python SDK 。
步骤 2:为 Studio 用户安装和运行 VS 代码
现在您已经知道 VS 代码将被托管在哪里,让我们在一个 Studio 用户配置文件中安装并运行它。我们将分 3 步完成:
从你的工作室启动器启动一个系统终端
“系统终端”是 JupyterServer 的终端。

作者图片:点击工作室启动器中的终端图标
安装并运行代码服务器
您可以在系统终端运行以下脚本来安装 code-server:
脚本应该需要几秒钟的时间来运行,这就是本部分的全部内容。安装完成后,您可以使用以下命令运行 code-server:
code-server --auth none --disable-telemetry
确保从 Studio 用户的主文件夹/home/sagemaker-user中运行该命令。

Image by author:运行 code-server 命令后,您应该会看到以下内容。
注释
- 我们创建一个
vscode/文件夹来避免权限错误。代码服务器实际上并没有安装在其中。此外,我们使用默认安装,如果需要的话,可以随意定制你的。 - 为了便于说明,我们用
--auth none运行code-server。您可以使用密码或其他方式来保护您环境中的访问。更多细节参见代码服务器文档。
在浏览器上访问 VS 代码
现在,您需要做的就是复制您的工作室 URL,稍微修改一下,然后粘贴到一个新标签页中:


作者图片:左边是我工作室的原创网址。我替换了 /lab?与 /proxy/8080/ 并粘贴到新的浏览器标签页中。

图片作者:VS 代码会加载,你可以打开里面的**/home/sagemaker-user**文件夹。
您可以安装 Python 扩展并开始在您的 ML 项目中工作!
步骤 3:跨 Studio 用户自动安装
作为工作室管理员,你可以让每个用户自己安装 VS 代码。该设置不需要更改域。但是,如果您支持数百名数据科学家,您可以自动设置他们。
在这里,我们将从我们的脚本创建一个生命周期配置,并将其附加到一个 Studio 域。该安装将由域中的所有用户继承。
将安装脚本转换成 base64 编码的字符串
首先,我们需要将安装脚本下载到我们的环境中,并使用以下命令将其转换为 base64 字符串:
LCC_CONTENT=`openssl base64 -A -in on-jupyter-server-start.sh`
将生命周期配置附加到 Studio 域
然后,我们使用 AWS CLI 来创建域生命周期配置:
aws sagemaker create-studio-lifecycle-config \
--studio-lifecycle-config-name install-vscode-on-jupyterserver \
--studio-lifecycle-config-content $LCC_CONTENT \
--studio-lifecycle-config-app-type JupyterServer
如果需要,你也可以使用这个 Boto3 命令。只要确保在您的域所在的同一区域执行该命令即可。
注意- 现有的 Studio 用户需要停止/启动他们的 JupyterServer 应用程序才能看到变化。
选项 B:在笔记本实例上托管 VS 代码
笔记本实例的设置很快。您可以通过笔记本实例的 Jupyter/Jupyterlab 启动终端。
如果您使用 Jupyter,按钮应该在右上角:

图片来自作者
然后,您将需要 在终端上用下面的命令执行这个脚本 :
sudo sh install_vscode.sh
运行该命令需要几秒钟时间。

Image by author:当您看到以下内容时,您可以关闭“终端”选项卡。
现在重新加载 Jupyter 页面并检查右上角的New按钮:

图片作者:你应该在新按钮下看到一个 VS 代码选项。
点击 VS 代码按钮将在新的浏览器标签中打开 VS 代码。您可以为 VS 代码安装 Python 扩展,并开始在您的 ML 项目中工作!

作者图片
您还可以将脚本添加到生命周期配置中,并在实例重启时自动进行设置。
结论
ML 团队在进行项目时,需要灵活地使用笔记本或完整的 IDE。
在这篇文章中,我展示了如何在 SageMaker Studio 和 Notebook 实例上安装 VS 代码。对于单个用户和使用生命周期配置的数百个用户。
您还可以阅读利用 Amazon SageMaker Studio 实现 ML 平台的工业化,并了解企业 ML 平台团队如何组织、标准化和加速 Studio 环境的供应。
人工智能如何帮助智能城市计划
原文:https://towardsdatascience.com/how-ai-can-help-smart-city-initiatives-f83484891343
基于人工智能感知和市民数据来源,帮助智能城市计划的一些想法

图片来源:作者使用 Exlidraw 创作(使用免费 Pixabay 图片)
智能城市的人工智能
人工智能(AI)和机器学习(ML)工具和技术已经应用于世界各地的智能城市和社区项目。特定的应用领域仅受限于公众和城市规划者的想象力,例如,
- 交通管理,
- 道路安全,
- 水资源管理,
- 电动汽车,
- 公共安全和执法
- 较新的自动化系统
- 公共产品和服务的数字化交付
https://www.businessgoing.digital/artificial-intelligence-in-smart-cities/
这是一项至关重要的任务,因为数据的爆炸规模和快速城市化不可避免的问题的维度。根据联合国经济和社会事务部的数据,目前,世界上 55%的人口居住在城市地区。预计到 2050 年,这一比例将上升至 68%。

图片来源:联合国人口报告
人们正积极努力为管理如此巨大的人类及其愿望的融合奠定一个数字主干。最近在物联网方面的努力集中在将数十亿个传感器https://www.smartcitiesworld.net/news/news/iot-connected-devices-predicted-to-reach-7-billion-2132(各种类型和功能)放置在世界主要城市周围。这是获取数据的第一步。但是,吸收、分析、理解和处理“大数据”需要对数字和计算系统进行变革。
**https://www.smartcitiesworld.net/news/news/iot-connected-devices-predicted-to-reach-7-billion-2132
城市计算机视觉中的人工智能——挑战与理念
计算机视觉和智能场景感知是两个最突出的应用,因为这些领域已经完全被现代人工智能算法和系统(如卷积神经网络)所接管。
然而,使用智能城市项目中通常可用的数据来构建高性能和高成本效益的人工智能系统存在一些棘手的限制和挑战。在最基本的层面上,这可以归结为一个事实,即传统的监督学习模型和方法在应用于智能城市应用领域时可能会遇到数据源问题。
而且,我不是在谈论接收和摄取原始数据——在这种情况下是图像和视频。现代城市和公共基础设施的每一个角落都在增加成千上万的摄像机和图像传感器。当然,对于如此大量的数字数据的接收、存储、监管和处理也存在挑战。但是,即使一个组织可以相对容易地管理所有这些,他们也必须解决高质量数据标签的问题。
人类——通勤者、学生、慢跑者、骑自行车者、行人——每个人都可以通过他们的智能手机成为图像/视频数据的潜在来源。
让他们自主获取原始数据很容易。但是让他们准确、勤奋、一致地标注数据是非常困难的。
在这方面,已经有一些来自科技创业公司 的 新颖的想法和举措。这是一个很好的开始。
https://www.hayden.ai/safe-sense-app
与此同时,我们可以想出一些关于如何稍微调整基本 AI/ML 问题的想法,以便大量涌入的数据可以在短期内得到很好的利用。
更改度量标准并使用数据网格化
为了开始利用现有的数据和算法为智能城市系统和项目带来直接利益,我们可以扩展我们对用于“教授”人工智能系统的指标的定义。为此,我们必须超越人工智能模型训练的线性化视图,在平面之间移动(就像在三维网格中一样)。

图片来源: Pixabay (免费使用)
让人类自主地获取原始数据是很容易的。但是让他们准确、勤奋、一致地标注数据是非常困难的。
使用人工智能已经很擅长的常规任务
就计算机视觉而言,人工智能算法已经在许多日常工作中表现出色,
- 物体分类(是车,是垃圾桶,那是狗?)
- 物体识别和放置(它在场景中的什么位置?)
- 语义和实例分割(对象族的分组和标记
- 面部和人类姿态的语义理解(人类的年龄、性别、步态、运动方式,而不被个人识别
- 情境的语义理解(那是火吗?意外吗?路障?)
我们可以使用所有这些…

图片来源:作者使用 Exlidraw 创作
但它们只是堆栈的开始
通常,基于人工智能的初创公司甚至大型科技组织都会花费大量精力来构建性能最佳的深度学习(DL)模型,以获得上述任务的高度准确性。
跳出框框思考- 我们能否从公开可用的预训练模型(例如优步或谷歌发布的模型)中获取我们已经拥有的东西,并将它们用作更大预测模型的组件之一?
首先,我们调整这些人工智能模块的使用方式,
- 我们假设他们的准确性和性能在平均意义上已经很好了——对于一个与模型的训练集没有太大差异的城市或社区,输出是可信的
- 我们将它们设计成能够输出硬数字或统计数据,而不是标准 DL 模型的概率输出
想法是这样的。请注意在 DL 模型的输出中添加了新的提取层,以及我们通过该层询问的一些问题实例。
- 那张图中有多少辆车?有多少行人?
- 在那次公众集会中,年龄和性别的分布是怎样的?
- 一天中那个时间的交通密度是怎样的?

图片来源:作者使用 Exlidraw 创建
连接到更大的网格
一旦我们开始获得这些数字并回答这些问题,我们必须将它们与其他动态数据集融合在一起,这些数据集可以来自智能城市数字基础设施或社区的数字化记录。
- 道路和城市规划图
- 住房记录
- 犯罪和安全记录
- 气象资料
- 关于学校、住宅单位和企业的公共信息
这些都进入数据网格。

图片来源:作者使用 Exlidraw 创建(使用 Pixabay 免费图片)
问正确的问题
这只是 20000 英尺高度的概观。从这个计划中获得有意义的结果的关键是,
- 确定项目范围
- 问正确的问题
这意味着,为这个预测模型设置正确的机制和指标。一些例子是,
- 天气模式、交通密度和公共安全之间有关联吗?
- 对于给定的天气条件和一天中的时间,车辆距离和位置的分布如何影响事故率?
因此,我们将大量使用将统计分布与基础事实联系起来的方法。

图片来源:作者使用 Exlidraw 创建
请注意,我们提出的问题是关于对定量变量的影响,如事故率和公共安全记录,这两者都应该是,
- 对现代城市的健康和发展至关重要
- 任何智能城市计划都有望对其进行数字化和良好维护
因此,对于我们的预测模型训练,我们更少依赖于不可预测的公民数据标签,而更多地依赖于预训练人工智能模型的统计输出和数字城市基础设施数据的组合。
我们不会达到 90%以上的准确率,但这没关系
我们必须准备好接受这样一个事实:我们不会一直得到一个强有力的预测趋势或信噪比。模型准确性(或任何其他度量标准)不会像伟大的人工智能模型(ImageNet)所宣传的那样超过 90%。
应该没多大关系。
在大多数智能城市项目中,没有人工智能模型。没有机器学习指标。没有太多的基线可以比较。
没有人能在脑子里进行这种数据网格化,并提出一个预测模型。没有 的人性化表现 来配合高达。这不是识别猫和狗的问题。
这只是一个向前推进的想法,拥抱现代人工智能模型和大规模数据分析软件工具的礼物,并为实现未来智能城市的真正数字化转型的梦想提供价值。
我们不太依赖不可预测的公民数据标签,而更依赖于预训练人工智能模型的统计输出和数字城市基础设施数据的组合
摘要
在本文中,我们谈到了以统计方式使用预训练人工智能模型的输出的概念——将它们的计数和分布输入到更大的预测模型中。
核心思想是用现代智能城市数字基础设施中确定性的、校准良好的数据来修饰这个预测模型。
我们认为这种想法是一种平行的方法,同时公民开发者(通过智能手机获取图像或感知数据的人类)的数据收集和标记正在完善和改进。
我们还讨论了这种混乱的数据模型的预期挑战和性能限制。然而,任何相关性或统计显著趋势的发现都应该能够为智能城市计划的管理提供比当前方法更高的价值,当前方法没有充分发挥大规模人工智能和数据科学的力量。
喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果您使用下面的链接, ,我会收到您的一部分会员费,而不会对您产生额外的费用 。
**https://medium.com/@tirthajyoti/membership ****
人工智能如何加剧全球变暖
原文:https://towardsdatascience.com/how-ai-could-fuel-global-warming-8f6e1dda6711
新的大型模型是能源密集型的。他们的训练需要多少二氧化碳?

作者使用 DALL-E 制作的图像
数据和云不是虚拟技术。他们需要昂贵的基础设施和电力。训练人工智能模型也是如此。研究人员预测,未来他们的排放量可能会远远超过预期。简短的概述
谁不让我们整夜安眠?
几周前,英国打破了气温记录,气温首次超过 40 摄氏度。夏夜温暖潮湿,在类似的日子里很难入睡。到目前为止,这是第五个最热的年份,但是其他四个都在同一十年内(可能我们会记得今年夏天是最冷的一年)。毫无疑问,年复一年,我们面临着更高的温度,这种趋势也被定义为全球变暖的一部分。全球变暖不仅意味着夏季变暖,还意味着极端事件的增加(如飓风、龙卷风、干旱、森林火灾等等)。
谁是罪魁祸首?由一个碳原子和两个氧原子组成的小分子,通常被称为二氧化碳或 co2。还有其他温室气体,但是二氧化碳仍然是最重要的一种。下图显示了二氧化碳在过去两个世纪中是如何呈指数增长的。

该图比较了大气中的二氧化碳(蓝色)和人类活动产生的二氧化碳(灰色)。图片来源:此处
简而言之,二氧化碳增加得越多,照射到地球的太阳辐射的红外成分保留的部分就越多。这些额外的能量使地球变暖。谁产生二氧化碳?
人类及其所有活动。撇开我们通过吸入呼出二氧化碳的事实不谈,能量的消耗导致了二氧化碳的产生。汽车和飞机旅行、商业、畜牧场等等都会向大气中释放二氧化碳。
也有一些东西会产生大量的二氧化碳,但鲜为人知。数据。
云是由二氧化碳构成的
数据看起来是虚拟对象,几乎是形而上的实体,但它们需要被存储、处理和传输,这就需要基础设施。例如,当你在云端保存一些文件时,它们必须穿过数千公里的光缆才能到达数据中心。全球有数以千计的数据中心,但本质上它们是装满大量硬盘的建筑。这些硬盘持续活动,并产生热量。
"你的储物空间越大,你积累的东西就越多。"—亚历克西斯·斯图尔特
存储在云中的 1gb 的估计成本是7 千瓦时(不超过一百张高分辨率照片)。我们每天生产 2.5 万亿字节 (2.5 后跟 18 个零)。如果不算一下,储存起来会很多,而且在这个过程中会产生大量的二氧化碳。事实上,据预测,通信行业的产量将很快超过汽车、航空和能源行业的总和。

由作者用 Dall-E 生成的图像(并在unsplash.com使用来自 C Dustin 的此图像)
事实上,今天大约有800 万个数据中心(2012 年有 800,000 个),这表明我们正在以多大的速度增加数据的生产和存储。一些模型预测,到 2030 年,超过 10 %的全球电力供应将专用于数据中心。这些预测只考虑了存储数据所需的能量消耗,但是数据在互联网上传输也是消耗能量的。
许多研究人员正在关注我们如何减少数据存储对环境的影响。然而,数据不仅被存储。事实上,当你有如此多的可用数据时,你可以用它来训练一个非常大的模型。那么问题来了:人工智能消耗了多少?
(人工)智能吞噬能量来维持自身
人脑是地球上进化得最复杂的东西之一。它的复杂性使我们能够在抽象推理、科学和艺术之间徘徊。如果拥有如此发达的大脑是一种进化优势,为什么大多数物种的神经元要少得多?一个答案是因为成本高;仅人脑就消耗了人体全部能量的 20-30%。对一个器官来说不便宜。

图片由作者使用 DALL-E 2
我们可以怀疑人工智能也在做同样的事情:消耗大量的能量来做所有的计算。这个问题变得越来越重要,因为现在几乎所有公司都在投资机器学习。那么,AI 到底在消耗多少呢?
在关于该主题的第一批作品之一中,艾玛·斯特鲁贝尔计算出,使用神经架构搜索训练的变压器模型将相当于五辆汽车在其一生中的二氧化碳排放量(2019 年论文链接是这里是)。在连续的文章中,帕特森扩展了对不同流行模型架构( T5 、伯特、 GPT-3 )的分析,比较了他们的培训成本和碳足迹。

不同模型训练的能耗和二氧化碳生成量(图片来源:此处)
在文章中,Patterson 展示了计算模型的能量成本需要考虑多少因素(加速器、优化方法、训练集的维度、超参数的数量等等)。在文章中,他们将训练成本比作喷气式飞机的排放,考虑到新模型有更多的超参数,并且训练数据集的大小也在增加,这令人担忧。
在文章中,他们还强调了其他有趣的点:地理位置和基础设施很重要(使用或不使用云)。现在,有许多服务提供了在云上训练模型的可能性(Azure、AWS 等等)。事实上,对于一家小公司来说,在云上训练一个模型比购买一堆昂贵的 GPU 和设置内部基础设施更容易。由于这是一个越来越受欢迎的选择,不同的研究人员在云实例中研究了人工智能的碳强度。
事实证明,位置仍然很重要,即使是在使用云的时候。在他们的工作中,他们监测了在微软 Azure 上的 11 种算法(从语言模型到视觉算法)的训练,并监测了不同地点的电网电力。差异是巨大的,表明在美国数据中心进行培训产生的排放是在挪威进行的相同培训的两倍。

不同地点训练 BERT 的 CO2 排放。图片来源(此处)
“效率最高的地区产生了效率最低地区三分之一的排放量”——杰西·道奇,合著者之一,对 Nature 说
此外,当你训练时,你的模型也在改变你的碳足迹。例如,在华盛顿白天训练模型时,能量来自燃气发电站,而在晚上,能量由水力发电产生。
“团队只完成了变形金刚训练过程的 13%;道奇说,完全训练它将产生“相当于燃烧一整节装满煤的火车的数量级”的排放。(来源:自然)
结论和观点
对于许多中小型公司来说,云将是训练人工智能模型的首选。然而,在全球变暖效应越来越明显的时刻,云和 AI 模型正在增加碳足迹。因此,我们需要考虑如何减少这两种技术的影响。
公司需要投资减少能源的影响。正如研究人员所建议的那样,第一步是在云上训练人工智能时,选择和使用碳足迹最低的数据中心的可能性。此外,当能源需求较低或数据中心由绿色能源供电时,培训应灵活安排。
“我们现在应对气候变化做得越少,未来的监管就会越多。”—比尔·奈
由于人工智能市场规模预计将从 2022 年到 2030 年以 38.1%的复合年增长率(CAGR)在扩张,我们应该尽快解决其能源消耗问题。好消息是,公司和研究人员已经意识到这个问题,并正在努力解决。此外,还有一项制度性努力,即考虑将绿色能源用于培训(如布鲁姆模型)。最后,人工智能模型也有利于优化能源消耗和控制二氧化碳排放。
附加资源
- 如果你有兴趣通过训练深度学习模型来跟踪或预测能源消耗和/或碳足迹,你可以尝试: carbontracker ( 文章,资源库), codecarbon ( 网站, GitHub 资源库,文档), ML CO2 影响(网站),或者 EnergyVis
如果你觉得有趣:
你可以寻找我的其他文章,你也可以 订阅 在我发表文章时得到通知,你也可以在LinkedIn上连接或联系我。感谢您的支持!
这是我的 Github 知识库的链接,我计划在这里收集代码和许多与机器学习、人工智能等相关的资源。
**https://github.com/SalvatoreRa/tutorial **
人工智能如何帮助保存艺术品
原文:https://towardsdatascience.com/how-ai-could-help-preserve-art-f40c8376781d
艺术杰作随时都是风险;人工智能和新技术可以助一臂之力

作者使用 OpenAI 的 DALL-E 2 生成的图像
最近几个月,人们一直在谈论人工智能如何根据文本提示创建图像。因此,当一个人将人工智能和艺术这两个词联系在一起时,他会立即想到 DALL-E、稳定扩散和其他算法。相反,在这篇文章中,我想讨论为什么艺术品往往比我们想象的更不安全,以及人工智能如何帮助保存它们。
在《对美的憎恨:是什么威胁着世界的记忆?

人工智能想象中的卢浮宫博物馆废墟。作者使用稳定扩散创建的图像
"每一个创造的行为首先是一个毁灭的行为."――巴勃罗·毕加索”
认为文化遗产是安全的是错误的。许多人类最有价值的作品也是最脆弱的。纵观历史,随着时间的推移,只有一小部分艺术作品得以保存下来。
例如,在战争期间,文化遗产经常遭到破坏。在古代,掠夺新征服的领土被认为是一种常见的行为,这一传统在殖民主义和拿破仑掠夺时期一直保持着。此外,在第二次世界大战期间,大量的艺术品被损坏或永远丢失。几件作品被纳粹偷走(再也没有找到),而其他的则在盟军对德国的空袭中被毁。
即使在今天,在叙利亚的战争中,像阿勒颇这样的千年古城也遭到了残酷的破坏(根据联合国的统计,该城超过 70%的面积遭到破坏)。更不用说恐怖组织破坏和抢劫帕尔米拉和伊拉克博物馆的行为了(通常这些作品会被转卖去购买武器)。此外,独裁政权甚至在近代也经常毁坏重要的艺术品(巴米扬的佛像被塔利班摧毁)。

佛像被塔利班摧毁。图片来源:此处
此外,许多作品在自然事件中被摧毁或损坏。地震或其他自然灾害等事件往往会导致珍贵作品的丢失。在 1966 年 11 月 4 日的佛罗伦萨洪水中,数千份珍贵而古老的手稿被泥土覆盖,严重受损(有些仍在修复中)。奇马布埃珍贵的十字架是 14 世纪的作品,也受到了洪水的影响,需要精心修复。即使在今天,许多地区仍有洪水的危险,而 acqua alta (高水位)现象对威尼斯是一种威胁。

佛罗伦萨洪水的图片。在左图中,被洪水淹没的历史中心。中图,一些志愿者帮助将画作从乌菲齐博物馆运送到安全的地方。右图,志愿者在街道上铲泥..图片来源:此处

奇马布埃的十字架,洪水破坏前左,修复后右。图片来源:此处
在 1755 年摧毁里斯本的地震中,皇家图书馆保存的大量珍贵古卷丢失(同时丢失的还有提香、鲁本斯、柯雷乔和卡拉瓦乔的作品)。此外,许多作品在 1734 年的皇家宫殿大火中丢失(贝拉斯克斯、鲁本斯、博施、布鲁格尔、范·戴克、埃尔·格列柯、莱昂纳多·达·芬奇、拉斐尔和许多其他人的无价作品)。即使在今天,像 2018 年巴西国家博物馆或 2019 年巴黎圣母院这样的火灾表明这种破坏性事件仍然会发生。
此外,一些对艺术品造成损害的自然现象是由人类活动引起的。事实上,污染和气候变化将艺术和建筑遗产置于危险之中。例如,酸雨正在加速腐蚀埃及狮身人面像,但对于大理石建筑来说,这也是一个严重的问题。气温上升被认为是通过增加对历史建筑的破坏来催化化学反应。

左图显示了 2019 年失火的巴黎圣母院。中间画面,着火的巴西博物馆。右图中,哈佛大学每年冬天都会用防水罩包裹校园里的一些青铜和大理石雕像,以保护它们免受酸雨和酸性雪的腐蚀。图片由作者使用维基百科的图片组合而成
也有艺术品丢失的意外事件(飞机失事和其他形式的运输)。2006 年,一名男子在菲茨威廉博物馆(剑桥)因踩到自己松开的鞋带而摔倒,毁坏了三个 17 世纪的中国花瓶。而在 2010 年,一名女子在大都会博物馆摔倒在一幅毕加索的画作上,导致画作受损(这幅画价值 1.3 亿美元,被认为是他的杰作之一)。2000 年,苏富比的一名员工用粉碎机处理了一个箱子,只是箱子不是空的,而是装着一幅吕西安·弗洛伊德的画。
此外,对艺术品的忽视也是一个严重的问题。壁画、古画、雕像和纪念碑是脆弱的作品,因此维护和修复是昂贵和精细的工作。2012 年,西班牙一位业余修复者修复了一幅画,引起了轰动(但还有其他例子,比如帕伦西亚的“土豆头】)。

第一块展板是毕加索的《Le Rêve 》,在一次拍卖中受损。第二块展板是毕加索的画“演员”,这幅画在纽约大都会博物馆被一个跌倒的女人损坏。第三和第四块展板是 Elías García Martínez 的油画《幼儿保育和教育之家》,以及 2012 年的修复成果。图片由作者使用维基百科的图片组合而成
此外,我们还可以加上疏忽(如庞贝古城导致的坍塌)、破坏者和疯子(如损坏米开朗基罗圣像的人)、艺术品交易、经济利益(如修建大坝)以及其他原因。这就是为什么联合国教科文组织审查了世界遗产的,也保留了一份不太有名的名单,其中包括处于危险中的遗产。
对艺术品的破坏不仅仅是作品的经济价值。在古代和现代,蓄意这样做是为了抹去一个民族的记忆(无论是宗教的还是文化的)。最近,这些相同的机制被用于破坏波斯尼亚、叙利亚和阿富汗的考古遗迹(这被认为是违背宗教教义的)。此外,这场辩论比以往任何时候都更具话题性,例如,那些呼吁归还殖民主义时期被盗物品的人(例如,代表该国历史的著名的贝宁青铜器被分散在欧洲博物馆中)声称。
一个不了解其过去历史、起源和文化的民族就像一棵没有根的树。马库斯·陈嘉炜
正如我们所看到的,当指定用于保护的资金被削减时,遗产面临着自然现象和政治选择的风险。我们每个人都有保护记忆的公民义务,我认为这也包括数据科学。事实上,人工智能的使用越来越民主化,任何人都可以以更低的成本用于社交应用。

左图:贝宁青铜器之一,现藏于大英博物馆,强烈要求归还。中间的面板,是吉萨狮身人面像仪式胡须的一部分,现藏于大英博物馆。右图是希腊要求归还的帕台农神庙大理石浮雕。
简而言之,艺术作品是脆弱的,往往比人们想象的更有风险。科学和人工智能如何保护它们?
人工智能拯救人类创造力

作者使用 OpenAI 的 DALL-E 2 生成的图像
首先,新的科学调查技术使我们能够了解这些作品。即使是最伟大的艺术家也是从草图开始他们的作品,并且经常在过程中重新思考。今天我们有几种技术可以让我们分析绘画作品(比如 x 射线),这些技术不仅是非侵入性的,还可以让我们讲述作品的故事。然而,这些技术产生的数据通常很难解释(尤其是有几个重叠的图像),因此机器学习算法已经被开发用于图像分析。
x 射线曝光能够显示绘制不足或进展中的变化。例如,这表明伦勃朗在他的杰作布料商协会中多次微调人物的构成。列奥纳多·达·芬奇在画《岩间圣母》之前曾画过天使和其他人物。虽然有时可以很容易地识别艺术家的各种干预,但通常有几个图案,艺术家会重画几次,产生几个重叠的图像。这些模式很难区分,人工智能有助于重建工作的不同阶段。

伦勃朗的绘画及其射线照相术。图片由作者使用维基百科的图片组合而成
人工智能也被证明在修复方面是有用的。例如,它已成功用于数字修复(摄影、文章,甚至手稿)。剑桥的马赫实验室已经使用人工智能算法来识别损坏并虚拟重建手稿中的图像(这一过程被称为修复)。类似的技术已经被用于重建受损照片,彩色黑白照片,重建壁画图像等等。

上图:修复有大面积损坏的大图像区域。该图像显示了损坏的设计(左),修复域(中),以及最终结果的权利。图片来源:此处。下图:照片的数字修复(修复前后)。图片来源:此处
作为一个有趣的例子,研究人员最近用 AI 重建了,并预测了伦勃朗的杰作守夜人原本的样子(这幅画在被移到另一个地点时被任意缩短)。此外,这种技术可以用来重建被认为丢失的作品:例如,著名的范艾克兄弟的根特祭坛画 (1432)中的两块嵌板丢失了,研究人员使用卷积神经网络试图忠实地重建这两块嵌板。
即使是艺术作品最完美的复制品也缺少一个要素:它在时间和空间中的存在,它在它出现的地方的独特存在— 来源
重建丢失的绘画仍然是一个有争议的应用。事实上,当试图用 AI 重现丢失的克里姆特画作时(1945 年,克里姆特的三幅杰作不可挽回地丢失了),研究人员明确表示,这个想法不是要取代,而是要给出一个什么被认为是永远丢失的概念。

神秘羔羊崇拜也被称为根特祭坛画。图片来源: 此处
人工智能的另一个有趣的用途是通过算法鉴定画作。事实上,对作品的估价是一个巨大的市场,通常给作品归属并不容易(特别是如果它是一位画家或他工作室里的某个人的作品)。最近,提出了一种方法,通过研究作品的地形,可以重建作者的签名。简而言之,表面高度信息被记录下来(以 50 微米的空间分辨率),然后通过卷积神经网络 (CNN),这样就可以研究笔触的差异。
许多著名的艺术家,包括埃尔·格列柯、伦勃朗和彼得·保罗·鲁本斯,都利用不同规模和结构的作坊来满足市场对他们艺术的需求。因此,需要公正的定量方法来深入了解作坊绘画有争议的归属—文章作者(来源)
类似的方法对于避免艺术品的伪造非常有用,甚至对于确定作品的年代和归属也很有用。此外,可以识别作品签名的算法可以用于打击艺术品贩运。

用于识别作者的笔触风格的数据准备和分析工作流程。图片来源:原文
人工智能深入挖掘

维姬·T 在 unsplah.com 拍摄的照片
人工智能及其应用也将对考古学和考古遗产产生影响。
此外,x 光并不局限于绘画。事实上,研究人员还经常分析玻璃(例如,为了了解做工)、木乃伊和雕像等物体。此外,还经常使用其他技术,如 CT 扫描。Antikythera 机械装置(神秘的希腊神器)本身已经通过 X 射线进行了分析,以研究其可能的操作。在所有这些情况下,应用于图像分析的人工智能算法被证明是非常有用的。
另一个有趣的例子是重写本:羊皮纸或书籍被刮掉墨水后重新书写(羊皮纸很贵,因此被阿曼涅西斯僧侣重新使用)。今天,抹去的文字可以用成像技术重建,让我们重新发现被认为已经遗失的古代杰作。最近,使用人工智能和 X 射线已经有可能转录解码阿基米德重写本(其中包含两部被认为遗失的阿基米德作品)。

左图:印第安纳波利斯艺术博物馆的非洲叶松权力人物的 x 光照片。右图:在不同光源下进行分析的阿基米德重写本的图像。图片由作者使用维基百科的图片组合而成
公元 79 年可怕的火山爆发使火山灰和火山灰淹没了庞贝和赫库兰尼姆。在这个毯子下面发现了一个珍贵的纸莎草图书馆(纸莎草很少能在地中海气候下存活)。不幸的是,之前解开和破译它们的尝试导致了纸莎草纸的毁灭。幸运的是,新的成像技术使得不需要打开它们就可以分析它们。
“虽然有可能注意到赫库兰尼姆纸莎草纸的每一卷上都有文字,但打开它需要纸莎草纸有自己的柔韧性。而且没有更多的灵活性,”——Brant Sales(来源)
在以色列恩格迪发现的一张有 1700 年历史的希伯来羊皮纸上,已经成功尝试了 X 射线方法。不幸的是,虽然以色列卷轴含有一种金属基墨水,在 x 射线下显示良好,但赫克拉诺斯纸莎草纸是用碳基墨水书写的,这意味着“在 x 射线扫描中文字和纸莎草纸之间没有明显的对比”。为此,研究作者使用了更高能的 X 射线,但也使用了人工智能。作者使用 3D 卷积神经网络来检测文本并解密。

左边:赫库兰尼姆碎片的分析结果。右边:训练神经网络来检测 ct 扫描数据中的碳墨的系统概述。(来源:此处,授权:此处)
图像分析也可以用来发现未知的考古遗址。考古遗址的发现通常是偶然事件(出于其他原因的挖掘)或需要昂贵的调查。事实上,激光雷达技术(用激光瞄准一个物体或表面)已经被成功地用于探测新的考古遗址(在墨西哥发现了 Angamuco 的遗迹)。这项技术也被用来揭示吴哥景观的人为变化。激光雷达、热图像和卫星图像因此可以通过人工智能进行分析,以监控考古遗址的状态和研究干预措施。
在过去,这些仪器在直升机或小型飞机上。然而今天,无人机越来越受欢迎并且允许更大的灵活性。例如,一个研究项目使用无人机为 T2 绘制庞贝古城遗址的地图。测绘是第一步,以核实哪些结构处于危险中,跟踪现场的演变,并计划干预的优先次序。再者,无人机还可以用于水下考古等困难领域。
无人机拍摄的庞贝鸟瞰图
正如我们所见,人工智能可以用来重建受损的画作。同样的方法也可以用于考古文物,如马赛克。最近,发表了一篇论文,介绍了一种有趣的方法。作者测试了 OpenAI 的 DALL-E 的“outpainting”能力(人工智能将不完整的图像作为输入,并填充缺失的部分)。他们或者用已经损坏的马赛克(包括图形和几何图案)进行测试,或者通过人工移除保存完好的马赛克部分进行测试,这样他们就可以比较结果。
方法和结果很有趣;它还通过在不同条件下进行试验来利用现有的算法。这证明了这些算法的灵活性和涌现性。另一方面,正如作者指出的,结果并不总是令人兴奋的:
然而,重建显示出几个错误,因此,在大多数情况下,它仍然远远达不到手动重建的质量。当重新创建人脸和出现裸体时,性能最差(这是由于对图像内容的 DALL-E 策略)。对于几何形状,性能似乎更好,但 DALL-E 在颜色再现和某些形状上有一些限制,特别是当它们很小时。—来源:原创文章

使用人工智能的马赛克重建。上图中:亚马逊战役的马赛克,和原版一样(左)和人工智能重建的(右)。在下面的面板中:原始的马赛克(左)被人为破坏(中)并被算法重建(左)。图片由作者整理,来源:原创文章
人工智能还可以用于编目和自动化繁琐的任务。考古学家发现了成千上万的陶器碎片(尤其是罗马的),分析成千上万的花瓶、双耳瓶和盘子碎片是一项乏味的工作。另一方面,所有这些碎片一旦被编目并研究了它们之间的关系,就可以提供关于过去文明的日常生活的有价值的信息。在剑桥,他们开发了一种算法,将碎片与数据库中的陶器轮廓进行匹配。这种方法可以快速分类,然后用其他算法研究考古遗址中各种陶瓷的分布。
这种方法不仅限于罗马陶瓷。亚利桑那大学的研究人员使用类似的方法对古普韦布洛陶瓷的设计和图案进行分类。
考古学家经常发现铭文,但这些铭文往往在几个世纪后被损坏,变得难以辨认。最近, DeepMind 推出了 Ithaca (之前名为皮媞亚的模型的后续),这是一个人工智能模型,能够在受损的文本中找到缺失的字符。DeepMind 的作者在最大的希腊铭文语料库之一上训练他们的模型,以获得类似于人类碑文作者获得的结果。其他语言也尝试了类似的方法,比如斯基台语、3000 年前的中国甲骨文和波斯楔形文字。

左图:古罗马陶器。中间的面板:罗塞塔石碑(允许象形文字被破译的石碑)。右图:中国甲骨文。图片由作者使用维基百科的图片组合而成
“仅仅因为你能阅读这些字母,并不意味着你知道它们的意思”——雷吉娜·巴兹莱(来源)
虽然在已知语言(希腊语、拉丁语等)的情况下解读古代碑铭并不容易,但也有语言失传的情况。语言可以根据它们共有的特征(字母、词汇、语法、声音等等)被分成不同的家族。各种语言通常有一个共同的词根(例如,新拉丁语言,拉丁语中的“aquam”,意大利语中的“acqua”,西班牙语中的“agua”),然后经历了一个导致它们分化的进化路径。这些原则被语言学家用来寻找相似性和共同模式,以破译死亡的语言。
人工智能已经被证明有能力找到模式和相似之处。因此,这种方法一直试图解码丢失的语言,如 Ugaritic 或 Linear B。在这种情况下,作者使用了基于 LSTM 和嵌入的模型,并获得了一些有趣的结果。所使用的方法只不过是在丢失的文本中寻找具有已知标记的跨度。

上图中:一个受损的古希腊石碑讲述着雅典卫城的故事,右边是一个用皮媞亚重建的碑文的例子(正确的是蓝色,不正确的是紫色),来源:原文。下图,线性 B 和 Ugaritic 写作的例子,来源:维基百科
离别的思念

作者使用 OpenAI 的 DALL-E 2 生成的图像
最近几年,人们在努力将艺术数字化。主要的博物馆(如大都会博物馆)已经建立了绘画、书籍、雕像、物品、艺术品等的大型数据库。通常这些巨大的数字图书馆对公众和学者免费开放。这些机构本身正在采取协调一致的举措。例如,欧盟已经制定了将庞大的文化遗产数字化的指导方针。
这些举措旨在实现藏品和文化遗产获取的民主化。事实上,许多保存在博物馆里的作品,公众只要参观一下就可以看到。此外,博物馆只展示其藏品的一小部分(许多作品存放在仓库里,除了在罕见的展览中从不展出),因此这些举措允许人们接触通常看不到的作品。一方面,这些举措为想要研究作品的学者提供了宝贵的资源。另一方面,算法需要数据,这使得越来越复杂的人工智能模型能够得到训练。
正如我们所看到的,保存在博物馆里的作品是很脆弱的物品,随时都可能丢失。保护它们是一项重要而困难的工作,无论是保护它们还是恢复它们。在这些任务中,人工智能可以提供帮助(监控、研究它们等等)。另一方面,技术需要得到保护遗产的政策和投资的支持。

作者使用稳定扩散创建的图像
更重要的是,人工智能近年来发展迅速,有趣的视角为日益强大的模型开辟了道路。事实上,正如我们所看到的,所使用的许多模型都是卷积网络,它们已经被证明对于涉及图像的任务是有效的。然而,机器学习的所有其他领域也可以使用。事实上,例如,无监督聚类可以用来分组陶瓷碎片。
此外,用于重建铭文和翻译死语言的第一个模型是基于编码器-解码器和 LSTMs 的。皮媞亚也使用了相同的架构,但后来的 DeepMind Ithaca 文章已经基于类似于 transformer 的架构。随着视觉变压器被证明对成像有效,我们可以期待在未来几年有更多类似的模型。
另一个值得注意的是,为新任务开发新的复杂算法并不一定是必要的:正如我们所见,一些研究人员已经利用了 DALL-E,它可以通过网站公开访问。这表明许多可用的算法可以在未来重新利用。

除了人工智能能力的技术演示,它还开辟了真正的视角和影响。例如,有一个好的数码图像是修复一幅画或马赛克的第一步。此外,许多考古遗址人员不足,监督费用昂贵且存在问题。更不用说人工智能将能够帮助决策,优先干预,并降低成本。
“这些东西看起来像漫画。它们看起来不像克里姆特的画。这就像人们试图克隆他们的狗。可以,但不是同一只狗。”— Jane Kallir 关于人工智能重建遗失的克里姆特画作(来源)
公开的伦理问题当然仍然存在。应该仔细观察镶嵌画的结果。毕竟,这种模式有时不仅仅是在重建历史,更像是在改写历史。就像伦勃朗的画作一样,该算法试图根据其掌握的数据进行猜测,事实上,展览的策展人指出了原始部分和重建部分之间的分离。
此外,卫星图像和激光雷达技术已经确定了数千个尚未探索的新考古遗址。在考古学家对它们进行研究之前,这些可能是盗墓贼挖掘出的。考虑公布数据固然重要,但也必须谨慎行事。
另一个棘手的案例是修复。自 19 世纪以来,每一项新技术都被用于修复,而没有考虑可能的损害。例如,混凝土对结构造成的负担有时会比预期的更大。
如果你觉得有趣:
你可以寻找我的其他文章,你也可以 订阅 在我发表文章时获得通知,你也可以在LinkedIn上连接或联系我。感谢您的支持!
这是我的 GitHub 知识库的链接,我计划在这里收集代码和许多与机器学习、人工智能等相关的资源。
**https://github.com/SalvatoreRa/tutorial
或者随意查看我在 Medium 上的其他文章:
https://medium.com/mlearning-ai/reimagining-the-little-prince-with-ai-7e9f68ed8b3c **
人工智能如何拯救科学的支柱
原文:https://towardsdatascience.com/how-ai-could-save-a-pillar-of-science-43d564d5564d
同行评审是人类的工作,但我们可能需要机器的帮助

图片来自 unsplash.com的 Patrick Tomasso
不同的研究人员和教授正在推动变革。几个问题也减缓了讨论的速度:我们如何评估同行评议的质量?能不能客观做,或者定量衡量?
最近发表的一篇科学文章显示了这是如何可能的,以及在使用机器学习模型的规模上是可能的。这篇文章探讨了研究人员如何分析同行评议,为什么它很重要,以及人工智能意想不到的新应用开辟了什么有趣的前景
同行评议:现代科学的支柱

科学之海中同行评议的支柱,图片是作者使用稳定扩散开源代码完成的。
同行评议被认为是现代科学的支柱之一。每一篇文章和每一个研究提案都要提交给“同行”、研究人员和/或教授进行评判,他们评判一篇手稿的好坏。今天,同行评议通常用于所有学科(从生物学到医学,从物理学到计算机科学),以评估一篇手稿是否可以在期刊或会议上发表。
此外,同行评审还用于评估申请资金、职业发展等方面的提案。有不同的变体;从本质上讲,一篇文章是由匿名评论者来评判的,他们对手稿或提案提供评论。
然而,这一体系并非没有缺陷,如新冠肺炎论文的撤回、掠夺性期刊和会议的出现等等。这是一个简短的介绍,如果你对我概述的关于如何改进同行评审的好处、问题和建议感兴趣的话(链接如下)。
一方面,关于如何判断一篇文章的质量,或者是否有可能使用一种算法来评估提交的手稿,还有几个问题没有解决。另一方面如何评价高质量同行评议的决定因素和特点。安娜·塞弗林最近试图用人工智能来回答后一个问题
用 AI 评估同行评审

图片由廷杰伤律师事务所在【https://unsplash.com/】T2
数据集
许多同行审查报告的保密性质以及缺乏评估其质量的数据库和工具,阻碍了对同行审查的大规模研究。— 原文
正如作者所指出的,直到几年前,综述还是审稿人、编辑(或会议委员会)和作者之间的私人讨论。然而,今天,Publons 网站收集了数百万条评论,可以下载并用作数据集。该网站接收和收集由不同学者进行的评论,并收集不同的元数据(目前有来自大约 100 万学者的 1500 万条评论)。
为了进行分析,作者下载了 500 万篇评论,使用了以下标准:
- 对于这项分析,他们不包括物理学、空间科学和数学。这些综述提出了许多难以归类的数学公式
- 他们只选择了医学和生命科学期刊
- 他们选择了 10,000 篇经过验证的出版前评论作为对照
- 他们决定根据《华尔街日报》的影响因子分成 10 组,并从中抽取 1000 篇评论
影响因子是什么?由于很难定义同行评审的质量,他们选择了影响因子作为替代指标。影响因子是为了帮助图书馆员选择购买哪些期刊而开发的,它只是一个期刊发表的文章数量与该期刊的文章在过去两年中被引用的次数之间的比率。这个简单的指标被认为是期刊质量的同义词。
从理论上讲,人们可能会认为,一篇影响因子较高的论文(或接受率较低的会议)等同于更彻底的同行评审和稿件选择。这篇文章正是针对这一点。
模型和训练
作者从评论中挑选了 2000 个句子,然后进行标注。然后,他们决定了 8 个类别,并手动评分每个句子是否符合这些类别。不同的类别涵盖两个不同的宏观领域:
我们关注的是彻底性(句子是否可以归类为评论材料和方法、陈述、结果和讨论,或论文的重要性),以及有用性(如果句子涉及表扬或批评,提供例子或提出改进建议)。——作者采访到 性质
之后,他们使用了五重交叉验证和朴素贝叶斯算法。他们使用不同的评估标准,并确定哪些单词对每个类别的分类最重要。此外,他们还使用了一系列线性混合效应模型来研究综述特征和期刊影响因子之间的关联。
正如作者所指出的,可以看出,来自亚洲、非洲和南美洲的审稿人的比例从影响因子较低的期刊向影响因子较高的期刊递减(欧洲和北美的趋势相反)

综述和科学期刊综述表。来自原始文章
总的来说,模型的预测与人类注释者编码的预测相差不远,证明了使用机器学习模型评估评论的可行性。
作者还注意到,影响因子与综述内容不相关:影响因子较高的期刊通常较长,对材料和方法更关注,但对如何改进稿件的建议较少
但是,即使在影响因子相似的期刊中,这些比例也相差很大。所以我想说,这表明影响因子对于评论的“彻底性”和“有用性”来说是一个不好的预测指标。

原文:“相对于最低期刊影响因子组,涉及彻底性和有用性类别的句子比例的百分点变化。”
结论和离别感想
总的来说,一些研究人员抱怨同行评议的现状(包括生命科学和计算机科学)。多年来的范式一直是:高影响因子(或低接受率)等于高质量的同行评议和文章。
事实上,旧金山研究评估宣言 t (DORA)提议在资助和推广中消除任何基于期刊的指标。例如,乌特勒支大学已经正式放弃将期刊影响因子作为决定员工招聘或晋升的标准(新政策包括团队合作、领导力、公众参与和开放科学实践)。
这项研究还表明,同行评议不具有包容性,几个地理区域在高影响因子期刊中的代表性不足。即使在同行评审期间,更大的包容性将允许更好地考虑来自相同地理区域的作者所写的文章。
此外,这项研究表明,即使评论的质量不能与期刊的影响因子相关联,也可以使用人工智能来监控同行评议的质量。欧盟和几个委员会正在推动同行评审改革和同行评审数据更加透明。像这样的研究表明出版商如何监控评论者的评论或决定每篇评论的彻底性和有用性标准。
未来,审稿人在同行评议时得到 AI 助手的辅助并非不可想象。事实上,通常最有声望的会议和期刊会收到成千上万的投稿,但由于作为审稿人的研究人员数量减少,他们几乎没有时间对这些投稿进行评估。未来,在提交评审之前使用人工智能将实现更加客观、公平和包容的同行评审。
如果你觉得有趣:
你可以寻找我的其他文章,你也可以 订阅 在我发表文章时获得通知,你也可以在LinkedIn上连接或联系我。感谢您的支持!
这是我的 GitHub 知识库的链接,我计划在这里收集代码和许多与机器学习、人工智能等相关的资源。
**https://github.com/SalvatoreRa/tutorial
或者随意查看我在 Medium 上的其他文章:
https://pub.towardsai.net/a-new-bloom-in-ai-why-the-bloom-model-can-be-a-gamechanger-380a15b1fba7 **
内部竞争如何提升我们的机器学习技能
在享受乐趣的同时为您的人工智能创新提供动力
W 我们都热衷于开放协作来学习、成长和激发创新,但有时你需要感受竞争对手的压力来推动自己前进。通过我们公司内部的人工智能竞赛,我们做到了这一点。我们选择了一个相关的挑战,我们的工程师在小组中相互竞争,以开发-同时-最好和最有效的机器学习模型。
没错:我们在这里使用了一种权衡,因为对于现实世界的人工智能问题,你不能总是抓住性能最高的最大模型。需要考虑成本和时间限制。
这个比赛是 Slimmer AI 钟爱的 AI 伙伴计划的一部分。这个项目划分并构建了专门的 R&D 时间,在这段时间里,我们的机器学习工程师在最先进的技术上进行合作、实验、学习和进步,以解决大问题。目的是加强他们的个人发展,并推进我们不久的将来的公司目标。我们按季度周期工作,所以我们承诺用整整三个月的周期来投入这场竞赛。
最终,比赛的形式将决定它是否有助于公司和员工的成长,或者它是否只是一个打发时间的有趣活动。要实现你的目标,你需要找到理想的主题,组建合适的团队,并创造完美的条件。
在这篇文章中,我将分享我们所做的一些决定,以及这些决定是如何被事后评估的,这样你就可以在你自己的团队中展开一场更加成功的竞赛。

规则
完美的挑战
为了最大限度地发挥作用,竞赛必须既强化我们在过去一年中获得的知识又包含一种新的元素来进一步推动我们的专业知识。我们选择致力于自然语言处理(NLP)领域内的一项挑战,因为我们过去一年的创新有相当一部分发生在那里。之前,我们探讨了命名实体识别和少量学习等主题,并认为通过结合它们来更深入地研究这些概念是有意义的。此外,在不久的将来,我们的一个产品精通多语言人工智能解决方案,这具有战略意义。我们知道我们也必须解决这个问题。
包含数千个数据集的拥抱脸中枢在寻找正确的挑战方面提供了宝贵的帮助。它让我们发现了 XTREME 数据集,这是一个多语言多任务 NLP 基准。它涵盖了 40 种不同类型的语言,包括 9 项需要对不同层次的语法和语义进行推理的任务。在九项任务中,我们选择了四项与我们最近的研发工作一致的任务。多任务和多语言方面给团队增加了新的挑战,从而确保比赛是一次相关的学习经历。
没有选择退出
就像伙伴计划的其他部分一样,参加比赛不是可有可无的。该团队高度重视持续学习,因此积极参与创新活动只是工作的一部分。作为回报,每周有半天时间用于竞赛等联谊活动。
比赛还有另一个强制性的方面,让参赛队伍引以为豪:想出一个很棒的队名。因此,我们有像 Ditto(一个“变形金刚”神奇宝贝)、neuronary Networks 和 Astrology(由前天文学毕业生组成)这样的团队试图确保他们的第一名。
黄金情侣
我们将我们的机器学习工程师团队分成两人一组。我们不希望人们独自应对挑战,因为我们希望促进合作,并从彼此的优势中学习。然而,我们也不想让车队变得更大,也不想制造免费骑行的诱惑。
结对的选择是一个深思熟虑的过程,在这个过程中,我们希望将高年级学生与低年级学生配对,每对学生中至少有一个人具有相关的主题经验,并通过让在前一年中合作不多的人联合起来加强新的联系。当然,团队的专业知识需要平衡,以确保每个人都有公平的机会。是的,我们确实很想写一个优化算法来解决这个问题,但是我们最终手工做得相当成功。
高效良好
一开始,我们非常清楚获胜的标准。我们对四个选定任务的得分进行平均,以根据性能对每个团队的模型进行排名。
然而,在测试阶段,团队的效率也会被评分。我们打算使用由实验撞击跟踪器计算的功率度量,但是这没有提供我们希望的可靠结果。因此,我们转而简单地使用测试阶段的总持续时间作为模型效率的近似值。毕竟,当所有型号运行在相同的硬件上时,效率较低的型号通常会更慢。
为了选出最终的获胜者,我们为拥有最高效模型的两个团队创建了一个重新排名规则。拥有最高效模式的团队在整体绩效排名中被提升了两位。第二高效的团队被推上了一个位置。请注意,只有当平均任务得分的绩效差异在 100 分的范围内小于 10,并且效率差异大于 5%时,这种重新排序才适用。我们不希望一个超级快速但随机的模型爬上队伍。
独立评估
当训练数据集被移交给竞争团队时,评估测试数据集和最终测试数据集被保留。然后,指派一名未参与的工程师根据保留的数据对模型进行评估。有三次机会在评估测试数据集上运行模型,每次尝试后都会更新中间排行榜。最终的测试数据集只在最后使用一次来确定最终排名。
协作竞赛
当然,团队需要竞争,但我们也希望人们基于彼此的发现快速学习和创新。我们每周举行站立会议,人们在会上分享他们遇到或测试过的有趣方法。每个团队都对具体的实现和参数保密。
此外,所有提交的作品将在比赛结束后分享。虽然这样做是为了确保更多的学习和促进干净的代码,但这也是防止作弊的万无一失措施,因为测试集可以在网上免费获得。

图片由更苗条的 AI 提供
比赛
每个团队必须提交一个可以处理 40 种不同语言和四种不同 NLP 任务的模型:
- 确定一个前提句是必然的,矛盾的,还是对一个假设句中立的。
- 判断两个句子是否是彼此的释义。
- 执行词性标注(例如,识别名词、动词、代词等。).
- 执行命名实体识别(例如,识别命名的人员、组织、位置等。).
三个月每周四个小时的时间远远不够从头开始训练一个成功的模特。你也不应该真的有高质量的预训练模型可用的开源。团队尝试寻找和微调最适合的预训练模型,始终记住不必要的笨重会受到惩罚。
技巧
现在,这是我们为那些渴望一睹我们团队成就的人提供技术支持的地方。如果您对此不感兴趣,请随意跳到下一部分。
大多数团队使用一个 mBERT 模型作为他们的基础。不是因为它是最好的,而是因为它是我们非常熟悉的建筑。BERT 模型只允许 512 个令牌序列作为输入,这对于数据集中一些较长的样本来说是个问题。团队尝试了各种技术来更好地服务较长的输入序列,例如不要在单词中间剪切序列,或者为后续句子添加更多上下文。他们还试验了模型的架构。例如,通过向分类头添加第二层来获得改进的结果。
学习率在微调过程中至关重要,有两个动作被证明特别有用。首先,一些团队不仅训练头部,还解冻编码器,并对模型的较低层使用持续较低的学习速率。第二,带热身的学习速度表可以提高成绩。在预热过程中,学习率首先从低值上升到初始学习率,然后再次下降到较低值。
一个团队通过不填充样本成功地加速了他们的模型并提高了效率。取而代之的是,他们将所有的样本背靠背的连接在一起,使用一个分隔符来表示他们的划分。当然,在生产系统中,这只有在样品也成批出现时才有效。通过启用混合精度训练和并行标记化,还发现了其他重大改进。
我们支持吴恩达目前正在倡导的以数据为中心的人工智能运动。在某一点上,通过改进数据而不是进一步微调模型可以获得更大的收益。为了提高不常用语言的性能,团队成功地进行了过采样和添加常用语言翻译样本的实验。从多种语言中一次性取样增强了模型的概括能力,而不是一个接一个地对语言进行训练。
获胜的队伍
最后,最后的结果非常接近。有一个团队非常大胆,提交了一个 InfoXML 架构,而不是使用 mBERT。使用这种野兽模型,他们在性能方面被推到第一位。然而,他们的模型效率非常低,比第二名慢了三倍多,以至于他们不幸在伟大的重新排名中失去了第一名(如果你忘记了我们是如何评估模型的,请回过头来看)。实际上,这种模式是如此的低效,以至于第三个表演团队也走在了他们的前面。这意味着表现最佳的型号在最终排行榜上名列第三。第二个表演队获得了冠军。多好的旅程啊!

我们人工智能竞赛的最终结果。虽然蓝队神经质网络在他们的最终提交上得分最高(折线图),但他们的模型速度慢得多,效率低得多(条形图),导致他们因处罚而下降了两个位置。粉红色的亚军团队垃圾古伯带着一等奖回家。图片由更苗条的 AI 提供。
吸取的教训
比赛结束时的一项调查显示:
- 10 个工程师中有 9 个认为他们在构建深度学习模型方面扩大了自己的知识和技能。
- 10 人中有 8 人认为这项任务很有趣,比赛本身也是一次非常有价值的经历。
- 每个人都觉得有足够的能力和支持来完成他们自己的实验。
- 大多数人认为没有足够的时间和计算资源来完成他们想要的所有实验。
我们是一家数据驱动的公司,所以显然我们喜欢可量化的调查结果,以数字方式跟踪我们朝着正确的方向前进。然而,没有通过回顾得到的更深层次的个人反馈,我们是做不到的。这些见解有助于持续改进。
那么,我们从复古中学到了什么?
从一个工作版本开始
很多时间都花在了创建数据加载器和获得端到端的工作管道上。给真正的 ML 创新留下更少的空间。虽然一些工程师发现这种体验非常有价值,但我们不认为我们需要重复这一点,并且可能会为我们的下一次竞争提供基线模型和数据加载器,以便人们可以直接进入好的东西。
进一步细化标准
事后看来,因为一个模型的效率比它的亚军低 5%而严厉惩罚它似乎有点过于严厉。我们很幸运,重新排序规则在我们的案例中运行良好,因为表现最好的团队之间的效率差异是如此之大。但下一次,我们可能会根据我们提供的基准模型的性能来校准这些阈值,并在将这些数字刻在石头上之前与整个团队进行核对。我们也可以尝试激励训练较少的模型。
面向所有人的 GPUs】
除了竞争对手,我们还有用户需要服务,所以时间限制仍然存在。然而,为了克服资源限制,下次我们将为每个团队提供专用的云 GPU,而不是共享我们的内部 GPU。我们可能会给每个团队相同的资源预算,以刺激更有效和更环保的模型训练。
引入新工具
虽然几个深度学习库已经在我们的技术堆栈中存在多年,但 PyTorch Lightning 库对许多工程师来说是新的,比赛让整个团队获得了使用它的经验。许多工程师喜欢这种动手体验,这让我们最终扩大了我们的技术堆栈,因为每个人都熟悉它。下一次,我们将快速浏览一些有用的库,并加入到竞赛中。
带回禅意
人们对比赛变得如此热情,以至于兼顾比赛和其他责任变得相当有压力。我们的工作不是制造压力,所以这是我们下次要避免的。更大的团队可能会有所帮助,但我们都同意要避免搭便车,这可能会让每个人都失去动力。因此,我们可能会在下一次比赛中奖励更多的中间提交。我们甚至可以在每个中间阶段宣布获胜者,让每个人公开分享他们的代码,然后让其他团队在下一次提交时对其进行改进。希望这能平均分配工作量,让紧张保持在一个令人愉快的水平。
保持学术性
我们讨论了数据集多少有些人为的、颇具学术性的本质是否是一个好主意。作为一家应用人工智能公司,我们不应该使用真实世界的数据吗?总的来说,我们的结论是所选的数据集非常适合我们的目的。我们一年中的每一天都在研究现实世界的人工智能问题。专注于更具学术性的任务让每个人都有空间专注于创新部分并提高技术技能,而不是试图用肮脏的数据抓住不断发展的问题陈述。
少一点对话?
我们从一开始就知道,试图促进合作竞争可能有点愚蠢。想吃掉你的蛋糕,还能拥有它。事实上,尽管团队在每周的站立会议上肯定分享了进展和突破,但他们也提到他们有点不愿意分享他们最好的想法,这是可以理解的。下一次,我们可能会对单口相声采用问答的形式,因为每个人都非常愿意帮助其他陷入困境的人。这与中间提交后的代码共享相结合,可能仍然会创造一个开放的环境,而不会破坏竞争元素。
结论
举办比赛是为了提高我们的技术能力,并从中获得乐趣。虽然下一次我们可能会改变一些规则,但我们很高兴两个目标显然都达到了。
在比赛中,我们获得了训练多任务模型和准备数据的新的实践经验。在下一个季度,当来自竞争对手的代码直接应用于商业产品的开发时,这种经验已经被证明是有用的。我们在多语言培训方面的经验目前帮助我们设计一个新的人工智能应用程序。由于他们的实践经验,所有的工程师都更加意识到他们可以预期的机遇和挑战。在更高的技术层面上,我们的整个团队获得了使用新 ML 库的实践经验,大大加快了新产品的开发时间。
但是人工智能奖学金和它的竞争不仅仅是学习和推动创新。这也是一个联系和庆祝成功的地方。虽然参与者显然很喜欢这场比赛,但公司的其他人也加入了公布中间排名的每周例会。获胜的队伍在我们公司的圣诞晚会上成为焦点,并将在我们食堂的名人堂的墙砖上找到永恒的荣耀,上面有他们的名字。在这一年中,远程工作让我们在身体上的距离超出了我们的期望,比赛证明了这是一个享受乐趣和为共同目标建立联系的好机会。

竞赛获胜者在我们的名人堂中找到了永恒的荣耀。图片由更苗条的 AI 提供。
特别感谢sy bren Jansen——我们的人工智能创新负责人——精心设计和组织了这次活动!我们可能会很快再次举办另一场比赛,但我们推动创新的其他有趣想法也在不断增加。我想最好说…敬请期待!
如果你想了解更多关于我们在 Slimmer AI 的工作,请随时联系或访问我们的网站了解更多信息。
如果你想到了其他创意方案来让持续学习和创新变得有趣,请在评论中分享这份快乐!
如何以及为什么在您的数据科学项目中执行一键编码
一篇关于什么是一键编码,为什么使用它,以及如何使用它的文章(Python 语言)

马库斯·斯皮斯克在 Unsplash 上的照片
W 当处理真实数据时,你经常会得到带有“混合”值的数据集:字符串和数字。如果您是数据科学和机器学习领域的新手,您通常会发现“非常漂亮”的列(最多有一些 nan 要处理),通常带有缩放值。但是当涉及到真实世界的数据时,我们经常要处理杂乱的数据。
因此,当涉及到真实数据时,我们可能必须在同一个数据集中处理带有字符串的列和带有数字的列。我们该如何应对?
一种可能性是执行所谓的一键编码。在本文中,我们将了解什么是一键编码,为什么要执行它,它的局限性,以及执行它的几种方法。
1.为什么您应该需要一次性编码
一些算法可以直接处理分类数据;例如,可以直接从分类数据中学习决策树,而不需要数据转换(这取决于具体的实现)。相反,许多机器学习算法要求所有输入和输出变量都是数字。
在这些情况下,一键编码会有所帮助,因为它将分类数据转换为数字数据;换句话说:它将字符串转换为数字,以便我们可以毫无问题地应用我们的机器学习算法。
现在,想象一个有某种动物的柱子;类似于:
animals = ['dog', 'cat', 'mouse']
一键编码将创建与“动物”列中的独特动物种类数量一样多的新列,新列将填充 0 和 1。因此,如果您的“动物”列中有 100 种动物,一键编码将创建 100 个新列,全部用 1 和 0 填充。
正如你所想象的,这个过程会导致一些麻烦。在这种情况下,麻烦的是所谓的“哑变量陷阱”。
虚拟变量陷阱是这样一种场景,其中存在的变量变得彼此高度相关,这意味着一件重要的事情:一次性编码可能导致多重共线性;这意味着我们总是必须分析变量(新特性,又名:新列),并决定是否要删除它们中的一些(你可以在这里阅读我的文章关于特性选择:它甚至涵盖了多重共线性的场景)。
这意味着一件重要的事情:当我们没有“太多”的唯一值要转换到新列(即新要素)时,我们最好执行一次性编码,这样我们可以避免多重共线性(但有时我们别无选择:我们必须面对多重共线性并执行要素选择,意识到我们可能会遗漏一些东西)。
现在,让我们来看看执行一键编码的几种方法。
2.scikit-learn 中的“OneHotEncoder”方法
我要展示的第一个方法是 scikit-learn 提供的“OneHotEncoder”方法。直接举个实际例子吧。假设我们有这样一个数据集:
import pandas as pd
from sklearn.preprocessing import OneHotEncoder# initializing values
data = {'Name':['Tom', 'Jack', 'Nick', 'John',
'Tom', 'Jack', 'Nick', 'John',
'Tom', 'Jack', 'Nick', 'John',],
'Time':[20, 21, 19, 18,
20, 100, 19, 18,
21, 22, 21, 20]
}#creating dataframe
df = pd.DataFrame(data)#showing head
df.head()

我创建的数据框。图片作者。
为了执行一键编码,我们可以使用下面的代码:
#creating instance of one-hot-encoder
encoder = OneHotEncoder(handle_unknown='ignore')#perform one-hot encoding on columns
encoder_df = pd.DataFrame(encoder.fit_transform(df[['Name']]).toarray())#merge one-hot encoded columns back with original DataFrame
df2 = df.join(encoder_df)#drop columns with strings
df2.drop('Name', axis=1, inplace=True)#showing new head
df2.head()

使用 scikit-learn 的编码数据帧。图片作者。
因此,编码器创建了 4 个新列,相对于另一列(列“时间”)的值,全部用 0 和 1 填充。如果有十个(或更多)独立值成为新列,您可能会理解数据框会变成什么样。
现在,这个方法有一个问题:如你所见,新列是数字…你如何理解哪个数字代表你的旧字符串值?更具体地说:这些数字中哪个是汤姆,哪个是尼克?我们必须以某种方式重命名这些列。
在这个过程中,我寻找了一些重命名列的解决方案,这样我们就不会丢失新列和旧列之间的关系(也就是 Nick?),但我只找到了一个,我对此不满意,所以我不会在这里展示它。
幸运的是,我在 Linkedin 上发布了这个方法,我网络中的一个家伙 Filippo 回答并建议我另一个方法。让我们看看。
3.熊猫中的“get_dummy”
有一种更简单的方法来执行一键编码,它可以直接在熊猫身上完成。考虑我们之前创建的数据帧 df。要对其进行编码,我们可以简单地编写以下代码行:
#one-hot encoding
df3 = pd.get_dummies(df, dtype=int)#showing new head
df3.head()

熊猫的编码数据帧。图片作者。
就这么简单。只需一行代码,您就可以获得用“Name”列中的唯一值命名的列,并删除“Name”列。现在,如果您想要重命名列,例如从“Name_Jack”重命名为“Jack ”,您可以使用 Pandas 轻松完成,但是列的名称是已知的。
结论
在本文中,我们已经了解了什么是一键编码,以及何时以及为什么要执行它。记住,我们必须在编码过程之后执行特征选择,我的建议是在 Pandas 中使用“get_dummy()”方法,这既快速又简单。你可以在文档上阅读更多关于“get_dummy()”方法的内容。
让我们连在一起!
LINKEDIN (向我发送连接请求)
如果你愿意,你可以 订阅我的邮件列表 这样你就可以一直保持更新了!
考虑成为会员:你可以免费支持我和其他像我一样的作家。点击 这里的 成为会员。
如何以及为什么执行 K 倍交叉验证
原文:https://towardsdatascience.com/how-and-why-to-perform-a-k-folds-cross-validation-adf88665893b

如何以及为什么执行 K 倍交叉验证
帮助您在处理较小的数据集时避免过度拟合等情况
你好,朋友们!一年多前,我开始了一系列的短文,我称之为数据科学快速提示。我已经有一段时间没做了,这一个与我正在做的另一个系列特别相关,我正在创建一个围绕电影评级的预测模型。为了回顾我们在该系列中所做的事情,我创建了一个预测模型,试图预测我最喜欢的播客之一可能给他的下一部电影的电影评级。
虽然我一直在通过收听播客的备份目录来收集有关他评级的电影的数据,但我发现的现实是,他根本没有给那么多电影评级。(这个播客的主要目的完全是别的东西;电影评论只是偶尔的奖励。)我仍然有办法查阅过去的目录,但迄今为止,我只收集了大约 125 条影评。
这可能看起来很多,但…不是。差远了。大多数大公司在数千甚至数百万条记录上训练模型,所以 125 条记录与像这样大得多的数据集相比几乎不算什么。因此,在我们进入什么是 k 倍验证之前,让我们快速回顾一下数据科学家通常如何用大型数据集训练他们的预测模型。如果你想继续,你可以在我的 GitHub 库中找到我将在这篇文章中分享的代码,链接在这里。
传统的“训练测试”分裂
为了简单起见,在这篇文章中,我们将使用虹膜数据集。Iris 数据集可以非常容易地用 Scikit-Learn 库直接加载。以下是加载该数据集的代码:
# Importing the necessary Python libraries
import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split, KFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix# Getting the Iris dataset from Scikit-Learn
iris = datasets.load_iris()# Loading the predictor value (y) and remainder of the training dataset (X) as Pandas DataFrames
X = pd.DataFrame(data = iris['data'], columns = iris['feature_names'])
y = pd.DataFrame(data = iris['target'], columns = ['target'])
Iris 数据集是一个非常简单的小数据集,有三个目标类,这意味着这是一个很好的小数据集,可以用来练习创建多类分类模型。虹膜数据集也已经处于这样一个位置,如果我们不想做任何特征工程,我们在技术上不必做任何特征工程。鉴于这篇文章的重点不是创建一个完美的模型,我也不会费心去做任何特性工程。此外,我将使用 Scikit-Learn 的 RandomForestClassifer 算法来创建一个基本的预测模型。因为我不想创建一个完全精确的模型,你会注意到我根本不想调整算法的超参数。
当数据科学家创建预测模型时,他们通常会留出一部分带标签的训练数据集,称为验证数据集。(它有时被称为测试数据集,但由于我个人认为这有点用词不当,因为你有时会在一个模型被创建后传递一个未标记的测试数据集,我认为“测试数据集”术语应该保留给它。)验证数据集通过根据训练数据集训练的模型来计算度量,以确保模型的准确性之类的事情。
现在,不要把验证数据集和训练数据集混在一起是一个绝对的基本规则。这是因为您希望确保模型能够从模型尚未看到的数据集中得出准确的推断。在机器学习领域,我们将外部数据对训练数据集的这种影响称为数据泄漏。
在数据科学家有足够数量的记录进行训练的典型情况下,他们将执行典型的训练测试分割。(再说一次,我并不热衷于这种命名法,但是考虑到 Scikit-Learn 这样的库会进行这种拆分,我们将这样称呼这种拆分。)执行这种训练测试分割的最流行的方法之一是使用 Scikit-Learn 的内置函数train_test_split。下面是我们如何在 X 和 y 数据集上执行该函数:
# Performing a train_test_split on the dataset
X_train, X_val, y_train, y_val = train_test_split(X, y)
现在,我们已经在训练和验证数据集之间执行了拆分,我们准备好执行模型训练和验证。下面是实现这一点的代码:
# Instantiating a RandomForestClassifier model
rfc_model = RandomForestClassifier()# Fitting the X_train and y_train datasets to the RandomForestClassifier model
rfc_model.fit(X_train, y_train)# Generating validation metrics by comparing the inferential predictions (val_preds) to the actuals (y_val)
val_accuracy = accuracy_score(y_val, val_preds)
val_confusion_matrix = confusion_matrix(y_val, val_preds)# Printing out the validation metrics
print(f'Accuracy Score: {val_accuracy}')
print(f'Confusion Matrix: \n{val_confusion_matrix}')
当我打印出这些验证指标时,我在个人电脑上看到的是:

作者截图
老实说,92%并不坏,因为我们既没有特征工程也没有超参数调整,但这也是非常简单的虹膜数据集。我们面临的最大风险是,像这样的小数据集的验证准确率通常要低得多。其原因是,在针对非常小的一组数据进行训练时,我们很可能会面临过度拟合的风险。也就是说,因为模型在训练数据集中没有太多的信息,所以模型倾向于针对狭窄的训练数据集的外观生成非常具体的推断。
这显然是不理想的,那么我们如何确保我们的模型不会过度拟合呢?正如您所猜测的,这就是 k 倍验证的用处所在!
k 倍验证
在上面的例子中,我们对数据集进行了一次训练测试分割。如果您避免数据泄漏,这意味着您的验证数据集将永远不会被视为模型训练过程的一部分。
所以问题是,有没有一种安全的方法来利用完整的数据集,同时小心数据泄漏?答案是肯定的,一种流行的方法是使用 k 倍验证。k-fold 验证所做的是将数据分成许多批次(或折叠),并对数据集进行洗牌,每次留出一个折叠用于验证目的。下图有助于更清楚地说明这一点。

作者创作的图形
在上图中,数据集被分成五个不同的部分,当我们遍历每一行时,我们用所有的浅灰色框进行训练,然后用一个深灰色框进行验证。请注意,我们实际上是以这种方式对模型进行五次不同的训练。虽然这看起来并不理想,但它仍然是有帮助的,因为如果验证度量标准有些不同,我们将能够判断出模型是否被过度拟合。换句话说,如果您的验证度量对于每个折叠都是不同的,这是一个很好的指标,表明您的模型过度拟合了。
因此,让我们从上面的代码开始,对其进行一点重构,以执行 k 倍验证:
# Instantiating the K-Fold cross validation object with 5 folds
k_folds = KFold(n_splits = 5, shuffle = True, random_state = 42)# Iterating through each of the folds in K-Fold
for train_index, val_index in k_folds.split(X):
# Splitting the training set from the validation set for this specific fold
X_train, X_val = X.iloc[train_index, :], X.iloc[val_index, :]
y_train, y_val = y.iloc[train_index], y.iloc[val_index]
# Instantiating a RandomForestClassifier model
rfc_model = RandomForestClassifier()
# Fitting the X_train and y_train datasets to the RandomForestClassifier model
rfc_model.fit(X_train, y_train)
# Getting inferential predictions for the validation dataset
val_preds = rfc_model.predict(X_val)
# Generating validation metrics by comparing the inferential predictions (val_preds) to the actuals (y_val)
val_accuracy = accuracy_score(y_val, val_preds)
val_confusion_matrix = confusion_matrix(y_val, val_preds)
# Printing out the validation metrics
print(f'Accuracy Score: {val_accuracy}')
print(f'Confusion Matrix: \n{val_confusion_matrix}')
当我运行这段代码时,输出如下:

作者截图
如果您还记得,来自原始训练测试分割数据(92%)的准确性分数或多或少与我们从 k 倍验证准确性度量中看到的一致。虽然所有这些可能有一些过度拟合,但没有什么特别明显的迹象表明我们在这里有严重的过度拟合问题。这是一件好事!
现在,这是一个很好的评估过度拟合的技术,但是你可能会发现,这不是一个纠正过度拟合的方法。您必须采取额外的措施来实际纠正过度拟合的情况,无论是以不同的方式设计数据,解决某种目标类不平衡,还是其他什么。这超出了这篇文章的范围,但我可能会在以后写一些更具体的东西。
但是现在,这个帖子就写到这里吧!这次要保持简短甜蜜。希望在处理小数据集时,你们都觉得这很有价值。我知道我个人会在我的电影分级模型项目中使用它!感谢您的阅读,我们将在下一篇文章中再见。
如今的数据分析师是如何聘用的?你只需要知道
原文:https://towardsdatascience.com/how-are-data-analysts-hired-today-all-you-need-to-know-874f42cea97f
业内人士对招聘流程和行业需求的见解

Clem Onojeghuo 在 Unsplash 拍摄的照片
在当今快速膨胀的数据环境中,越来越多的人渴望进入数据科学和分析领域。新毕业生、转行的专业人士以及希望成为主题专家的分析师,在这个数据时代,所有层次的专业知识都汇聚到了一起。
数据和分析工作呈指数级增长,我们只能预测这一趋势将继续下去。每过一天,竞争变得激烈。随着业务需求的不断变化,公司正在努力弥补巨大的技能缺口。随着数据呈指数级增长,企业需要专业人员来理解这些数据。
每个公司门户网站现在都有全年开放的数据角色招聘。当我坐在非常不舒服的宿舍书桌前,从疫情中幸存下来,并申请 2021 年的全职工作时,我希望得到一些关于招聘过程的建议。现在,我从招聘的另一个角度看待问题,在一家医疗保健公司担任分析顾问,并参与招聘决策,这里有一个关于经理如何招聘数据专业人员的全知博客!
第一步:申请
任何招聘流程都是从候选人提交申请并表达对该职位的兴趣开始的。这些申请可能会通过名为 ATS(申请跟踪系统)的黑洞,并且/或者由招聘人员根据职位描述和工作要求进行筛选。
需要知道的事情:
- 只有当候选人满足大多数(如果不是全部的话)T4 要求的资格时,申请才被认为是合适的,如果他们也有首选的资格,会被更好地推荐。
- 你必须包括任何你想让招聘经理知道的你在简历中遗漏的东西——简历中的空白,你在之前的职位中增加的价值,等等。
- 清楚地表明你是否愿意接受调动(如果这个角色不是远程的)。
- 如果你认识公司里的某个人,在你申请这个职位之前,一定要让他们为你做推荐,但这并不保证你能得到面试机会。这份推荐信仅仅是证明你有能力胜任这个角色。
- 充分研究该职位的标准工资,考虑你职位的位置、你的经验水平以及你可能得到的任何其他竞争条件——不要在你的期望工资上虚张声势。
- 只有当你知道你能尽快开始工作时,才申请全职工作(每周工作 40 小时的能力)。在毕业季,公司总是会有空缺职位来吸引新毕业生。你可以避免申请得太早而被拒绝。
第二步:简历回顾
一旦您的申请被接受并被认为适合空缺职位,招聘经理和/或招聘人员将审查您的简历,以确定谁可以参加面试,并拒绝不符合要求的简历。
需要知道的事情:
- 对于仍在上学的人,请附上你的毕业年份和月份。工作职位有一个时间表,他们需要在这个时间之前完成这个角色。根据你的毕业日期,简历的接受或拒绝变得更容易,节省了申请人和招聘人员的时间
- 量化你的经历——展示你如何为你过去的角色增加价值。招聘经理想听听你能拿出来的技能和品质。(我更喜欢展示工作经验的明星技巧——情景、任务、行动、结果。)
- 从最相关到最不相关列出你的经历,最相关的应该是最近的。
- 试着包含与你的经历相关的关键词,而不是无关的流行词,只是为了给 ATS 留下印象。
- 写下认证和领导经验有助于表达你更新技能的意图和主动投入额外工作的意愿。
- 让你的简历一遍又一遍地被同事、导师和行业关系审核(我见过一些最基本的简历不费吹灰之力就开发出了数据角色,同样是这些人抱怨没有获得面试机会是不公平的)。
第三步:初步筛选(电话/视频面试)
疫情改变了世界,传统的面对面也改变了。虚拟面试有一个优势,消除了肢体语言的评估。然而,现在一切只靠口头暗示。
需要知道的事情:
- 理想情况下,你的每一个回答都应该展现出你作为专业人士的一种品质——无论是与数据相关的还是人类行为。
- 面试官通常在面试时做笔记,作为一名候选人,你可能会注意到他们在你的回答中。当他们停止写作时,你可能已经在回复中说得够多了
- 如果你是一个内向的人,练习面试会很有帮助。每一个善于沟通的候选人都有一个优势,因为这会让别人和你自己更准确、更迅速地理解信息。
- 除了询问招聘过程的下一步,准备至少两个关于职位、团队或公司的问题在面试结束时问。
- 许多候选人在面试开始时很强势,但在结束前就变弱了。在整个面试过程中,尽量保持乐观和健谈的语气。
第四步:第二轮及以后——小组或编码
就是这个!
这一轮通常会决定一个候选人能否得到这个职位。
该过程通常因角色、公司和所需的专业知识水平而异。小组讨论通常是一个背景,以获得候选人在紧张、艰苦的条件下如何表现的现实预览。你也可以在家里做一个案例研究,并在面试时提交给一个小组或写代码。
需要知道的事情:
- 花时间了解业务。
- 准备好回答工作描述中列出的关于所需技能的多个问题。
- 试着深入了解小组中的成员(如果他们是数据或业务人员,从他们的介绍中了解),并使答案迎合每个人的理解(当然技术问题除外)。
- 在解释你的背景和经历时,准备好在你的回答中使用的多个例子和轶事。
- 与小组中的每个人互动,而不仅仅是提问者。
- 再次,准备好后续问题。
第五步:面试后的礼仪(可选)
一旦你完成了面试,你可能想和面试官保持联系。
需要知道的事情:
- 你可以随时给你的面试官发一封感谢信——简短而专业。这也是一个机会,让他们知道你正在努力寻找一个你可能不知道的问题的答案。
- 在招聘过程中,永远不要停止找工作或辞职。未来是不可预测的,这是有原因的。
- 在面试过程中,避免在社交媒体上发布任何关于该公司或面试的信息(除非你有过最糟糕的面试经历或被骗)。
- 如果你是由一名现任员工推荐的,你接到了面试通知,并最终获得了工作机会,千万不要忘记感谢这个人(因为他们比任何人都更信任你)。
我个人总是在面试后做一个快速的分析,并记下哪些进展顺利,哪些地方需要改进,作为后续面试的参考。
有了上面的陈述,这就是我这篇博文的结尾。感谢您的阅读!我希望你觉得这个博客很有趣。请在评论中告诉我你对面试过程的体验,你的数据之旅,以及 2022 年你在寻找什么!
如果你喜欢阅读这样的故事,可以考虑从这个 链接 注册成为一名媒体会员。
数据帐篷快乐!
Rashi 是一名来自芝加哥的数据奇才,他喜欢将数据可视化,并创造富有洞察力的故事来传达商业见解。她是一名全职的医疗保健数据分析师,周末喝一杯好咖啡,写一些关于数据的博客……
人工智能如何拯救亚马逊雨林
亚马逊正处于危险之中,人工智能可以帮助保护它

图片由曼迪·崔在 unsplash.com 拍摄
毒贩、淘金者、伐木工、农民和牧场主正在入侵亚马逊雨林。疫情和博尔索纳罗担任总统加剧了本已暗淡的局势。科学和人工智能如何帮助拯救最基本的雨林?
地球的绿肺

图片来自 unsplash.com的迭戈·古兹曼
亚马逊雨林覆盖 500 万公里的雨林,其中大部分位于巴西(60 %)、秘鲁和哥伦比亚。要理解它的重要性,亚马逊雨林代表了现存雨林的 50 %,是最复杂和多样的生物群落之一。亚马逊雨林不仅是数千种不同植物和动物的家园,还居住着 3000 万人(其中 9 %是土著)。
根据一些假说,亚马逊森林开始形成于 5000 万到 3000 万年前。然后,森林慢慢地生长,并蔓延到整个大陆,占据了很大一部分。此外,这是一个复杂而微妙的生态系统。例如,来自撒哈拉沙漠的风通过替换一年中被降雨冲走的磷来肥沃森林。
大约 11000 年前,人类开始在森林中居住。即使在今天,我们对亚马逊地区的人类历史也知之甚少,以至于直到最近才发现了大量的前哥伦布文明的象形文字。

左侧面板是亚马逊雨林的地图,中间面板是哥伦比亚的森林,右侧面板是森林的鸟瞰图。图片来自维基百科(来源:此处)
尽管亚马逊雨林很重要,但它也濒临灭绝。2018 年,估计有 17 %的森林被砍伐。一些研究表明,达到 25 %的森林砍伐将导致灾难性的影响:森林转变为非森林生态系统(一种退化的大草原)。

图片来自维基百科(来源:此处)
非法砍伐森林在 21 世纪初有所下降,然后在 2015 年左右再次上升,在博尔索纳罗担任总统期间,情况急剧恶化。
可以确定几个原因,其中主要有:
- 畜牧业是砍伐森林的主要原因之一。牧民和从事畜牧业的公司经常放火,为放牧牛群腾出空间。
- 农业是森林砍伐的另一个重要原因,农作物要么被用作动物饲料、生物燃料、咖啡等。此外,由于大豆价格上涨,为了腾出土地种植大豆,砍伐森林的行为增加了。
- 伐木是另一个重要原因,具有讽刺意味的是,你砍伐的森林越多,该地区的降雨量就越少,伐木产量也就越低。
- 火灾也是一个越来越重要的原因。在这方面,2019 年是可怕的一年,有 1345 平方公里被烧毁。
- 非法采矿,不仅导致森林砍伐,还导致环境的重金属污染。
- 贩毒、毒枭和准军事组织经常渗透到森林中,种植古柯和其他非法植物。

左图,为了养牛而砍伐森林。中央面板,秘鲁亚马逊地区的非法采矿。右图:哥伦比亚的森林砍伐。图片来源:维基百科(此处)
砍伐森林对生物多样性有影响,习性的丧失事实上是许多已知物种灭绝的主要原因。此外,达到临界点可能会导致大规模的荒漠化,这将带来大规模的灭绝。
砍伐森林也会对气候产生影响。亚马逊雨林吸收大量二氧化碳,调节巴西的温度(它的损失将导致该国气温上升近两度)。此外,这将导致水资源的损失、农业产量和电力(水力发电)的急剧下降。
此外,森林是许多土著部落的家园,他们依靠森林获取食物、住所、水、纤维和药物。非法伐木工和矿工往往对针对土著人民的令人发指的罪行负有责任。虽然多年来通过了保护他们的法律,但博尔索纳罗总统反而减少了这些保护。

图片来自 unsplash.com 的伊藤
那么,为什么很难阻止亚马逊森林的砍伐呢?与此同时,过去几年一直是完美的风暴:政治气候给人一种有罪不罚的感觉,疫情减缓了监测计划和转移注意力。
此外,亚马逊雨林非常广阔,难以到达,而且监测费用昂贵。分析从卫星上获得的海量数据是困难和费力的,尤其是对人来说。无人机和其他传感器的使用将增加更多的数据。那么科学和人工智能能有什么帮助呢?
科学和人工智能在帮助森林

图片由 JakeWilliamHeckey 在 pixabay 拍摄
让我们明确一点,保卫亚马逊的最佳方式是通过政治选择。事实上,巴西政府在博尔索纳罗总统任期内放松监管和控制导致了创纪录的森林砍伐。此外,外国公民和公司做出的选择也会产生影响。例如,当嘉吉公司决定停止购买亚马逊新砍伐地区生产的大豆时,用于种植大豆的森林砍伐量急剧下降。在这篇文章中,重点是理解科学和智慧如何帮助保护亚马逊雨林。
“人工智能不是魔杖。它无法独自拯救地球。但是人类可以”——N . iels wiela ard,Satelligence 的首席执行官
与此同时,科学家的视野发生了范式转变。直到几年前,人们的想法是保护森林(并防止全球变暖),今天人们意识到保护也包括保护亚马逊的土著人民。土著社区、科学家、技术和当局终于朝着一个共同的目标走到了一起。
“政府没有足够的资源在这片土地上巡逻,”阿德里安·福赛思对《自然》杂志说,他指的是秘鲁亚马逊森林
阿德里安·福塞斯(Adrian Forsyth)提出了一个将森林转变为“智能森林”的项目:插入麦克风、相机和无人机等设备,然后用人工智能分析数据。目的是远程监控森林,以免打扰土著居民。事实上,尽管优先考虑保护森林,但必须避免必要的接触:许多部落对各种病原体没有防御能力,因为他们从未接触过。

图片由 eismannhans 在 pixabay 拍摄
卫星图像分析现在是普遍做法。事实上,多年来已经积累了成千上万的图像,使得人们有可能随着时间的推移跟踪一个地方是如何演变的。对 36 年卫星图像的分析显示,尽管该地区在技术上受法律保护,但在博尔索纳罗担任总统期间,非法采矿活动激增。
一方面,我们现在确实有很多图像,另一方面,分析这些图像的人工智能算法越来越复杂。但这些分析只是回顾过去的情况。无人机、摄像机和麦克风可以实现实时监控,甚至干预的可能性,从而阻止非法活动。
对森林的破坏占每年所有温室气体排放的近五分之一。在热带雨林,随着猖獗的伐木业,森林砍伐的速度加快了——高达 90%的砍伐是非法的,而且是在雷达下进行的。—首席执行官雨林(来源
例如,非营利组织雨林连接 (RFCx)在森林里使用回收手机记录非法活动的声音。该系统使用算法来识别噪音,如使用链锯(伐木)、偷猎动物(摩托车)和走私毒品(卡车、车辆),然后通知护林员。声学系统还被用于监测野生动物、濒危鸟类的鸣叫等
将人工智能与众包等项目联系起来已被证明是成功的:全球森林观察(GFH)是一个在线平台,在志愿者的帮助下记录图像,这使得算法更加可靠。这些算法然后被用来计算树木,识别非法采矿区,并警告当局对森林的威胁。
事实上,通过使用卫星图像和雷达数据,人工智能能够实现接近树木的分辨率。人工智能可以用于研究生物多样性如何演变,哪些物种濒临灭绝,通过模拟研究潜在的解决方案等。

图片由 SpaceX 公司在 unsplash.com 拍摄
人工智能算法允许快速分析大量数据。事实上,有几个项目将这些算法与基于云的计算机相结合。例如,MapBiomas 是一个创建森林历史地图的项目,使研究其演变和绘制我们仍然知之甚少的森林成为可能。
此外,机器学习算法可以预测哪里可能发生森林砍伐。事实上,土著代理人使用带有 GPS 和复杂人工智能工具的无人机来预测对他们土地的入侵(该算法由微软和 Imazon 开发)。考虑到威胁的数量和已经被破坏的区域,这些算法也被用作一个系统来研究干预措施,预测新的威胁,并排列优先级。
如今算法的广泛使用使得协会更容易调查公司是否在反对砍伐森林的承诺上撒谎(包括公司本身和供应链层面)。这使得有可能发起已被证明有效的压力运动。
算法也有助于提高可再生能源的使用和生产。亚马逊流域有 1 77 座水电站,184 座正在规划中。这些基础设施不仅导致森林砍伐,而且往往与进一步增加对森林破坏的活动相关联。

图片由 unsplash.com 的德里克·奥扬拍摄
其他正在研究的技术是使用红外线来远程绘制土著人的地图,或者使用带激光的飞机来绘制 3D 森林地图。
例如,不仅有图像和传感器,还有大量关于森林的报告和文件。近年来自然语言处理的迅猛发展使得有效地分析文本成为可能。正在研究关于亚马逊文件的类似项目。伯克利大学希望将这种方法应用于报告、现场笔记、日志、生物标本、通信和人工制品等数据。
离别的思念

图片由pixendfertig在 pixabay 拍摄
过去几年对亚马逊雨林来说是戏剧性的。博尔索纳罗总统放宽了伐木规定,鼓励森林开发,对土著人民的权利不感兴趣。疫情做了剩下的事情,转移了国际社会的注意力,使当局的努力变得困难,并杀害了传统上保卫森林的土著人民。
亚马逊雨林是一个复杂、富饶,但不幸的是,比人们想象的更敏感的环境。失去这样一个生态系统将是毁灭性的,无论是对当地还是全球。
AI 不是银弹,如果没有当局的支持、明确的政策、法律的执行和国际协调,它就不会有真正的影响。事实上,如果不采取有效措施,实时监控或预测风险区域将毫无意义。
另一方面,在巴西上一任总统期间,民主机构不断受到攻击,政客们对土著居民进行威胁。此外,其他邻国的政治也不稳定,哥伦比亚和秘鲁都有一段麻烦的历史,这些项目都与当前的政治气候有关。森林监测,所有可以用人工智能提取的信息都可以作为大规模监控、滥用和土地入侵的武器。
“政府缺乏稳定性是我们测试和部署这类技术的一大障碍”——Forsyth(source)
然而,这些工具真的很有效,例如雨林项目已经确定了一万个风险区域,其他项目也显示出了具体的结果。
微软、英伟达、谷歌和其他公司正在研究帮助参与砍伐森林的协会的计划。今年,气候也回到了国际辩论的中心。此外,随着疫情成为过去,公众舆论也开始关注气候变化。所有这些都给我们带来了对美好未来的希望
如果你觉得有趣:
你可以寻找我的其他文章,你也可以 订阅 在我发表文章时得到通知,你也可以在LinkedIn上连接或联系我。感谢您的支持!
这是我的 GitHub 知识库的链接,我计划在这里收集代码和许多与机器学习、人工智能等相关的资源。
**https://github.com/SalvatoreRa/tutorial
或者随意查看我在 Medium 上的其他文章:
https://medium.com/mlearning-ai/nobel-prize-cyberpunk-e1803aa0e087 **
艺术家如何用生成人工智能重新定义艺术
原文:https://towardsdatascience.com/how-artists-are-redefining-art-with-generative-ai-38b0a620e6d3
人工智能将会像摄影一样影响艺术



本文所有图片均为 AI 生成的图片。提示:画家/照片/艺术的未来——制作于梦
“你不是拍照,而是制作照片。”
—安塞尔·亚当斯
起初,摄影并不被认为是一门艺术。它很快被大众接受,但被认为是一种记录生活中短暂瞬间的机械方式。这是一种技能,一种技术能力,而不是一门艺术。
然而,正如我们所知,它改变了我们与艺术的关系。它将画家从捕捉现实的任务中解放出来。它允许他们在艺术提供的广阔潜在空间中自由活动。他们可以专注于抽象,专注于绘画的想法来传递照片捕捉不到的感觉。他们可以打破规则,探索可能性的极限,在只存在于我们内心的问题中寻找意义。
摄影也使绘画大众化——因为拍摄现实突然变成了几分钟而不是几天的事情。同时,至少在精英们看来,它贬低了手工绘画独特的基于天赋的美。不是每个人都满意,但是技术总能找到方法。摄影留下来了,现在大多数人都会同意上面亚当斯的话:摄影是艺术。
现在轮到人工智能颠覆视觉艺术的世界了,AI 艺术生成器也将推动艺术家重新定义他们与艺术的关系,这不是一个竞争而是拥抱的问题。人类的想象力与人工智能提供的可能性相结合,将带来我们尚未看到的最独特的艺术。
从感知世界到创造艺术
早在 21 世纪初深度学习爆炸之前,计算机视觉就是机器学习最受欢迎的分支。现在语言已经接管了,但人工智能系统从未停止改善他们看待和感知世界的方式。不久前,神经网络还只能勉强对简单的物体进行分类。今天,他们给习语赋予了新的含义“一幅图像胜过千言万语”
在生成模型的帮助下,艺术生成在过去的十年中取得了进展,特别是 GANs(生成对抗网络)。这些网络可以创建与它们接受训练的数据集中的图像相似的图像。研究人员和艺术家意识到,他们可以利用甘斯的能力来创造新奇的图像。他们改进了架构,以寻找人工智能生成的艺术的新形式,但无法找到一种方法来控制模型的最终输出。
如果没有艺术家,艺术就不是艺术。
2021 年,OpenAI 推出了剪辑模型,这是一个在 4 亿个图像/文本对上训练的神经网络。CLIP 可以从描述池中选择最能代表给定图像的文本描述。OpenAI 释放了模型的重量,给艺术家们提供了他们即将完成的拼图中缺失的一块。
人工智能研究人员和艺术家瑞安·默多克和凯瑟琳·克劳森意识到他们可以使用 CLIP 作为“方向盘”来指导生成网络创建符合给定文本描述的图像。默多克把 CLIP 和 BigGAN 结合起来(见大睡眠笔记本),结果如下:


通过将一个短句输入到模型中,他可以使它在图像可能性的巨大潜在空间中找到最能代表其视觉意义的东西。《日落》或《起风了》是一些最受欢迎的作品。你能感觉到风吹动了树(或面纱?)在第二张图中。这是一个突破。
克劳森在默多克工作的基础上,创作了将VQ-甘——2020 年出版的一个更强大的生成架构,利用卷积和变形金刚——与 CLIP 结合的笔记本。与 BigGAN+CLIP 模型相比,这种模型创建的图像具有纹理,几乎是有形的具体性。


“一棵树枝变弱的树,”克劳森问模特。她后来解释说,她打算改为写“哭泣”。然而,该模型无法知道这一点,并提出了一种令人惊叹的“weaping”视觉融合——该模型很可能从其中提取了词根“weap”并将其与“武器”相关联——和分支。这些图像触及了想象力的极限。
默多克和克劳森想出了 GAN 模型和 CLIP 的结合,试图黑进他们的DALL E(open AI 不想开源的高超的文本到图像多模态 AI)。但是他们无法达到 DALL E 输出的惊人精度。相反,正如加州大学伯克利分校学生查理·斯内尔所说,VQGAN+CLIP 系统生成了非常多样的——几乎是“外星人”性质的图像。
介于独立生成网络的非原创输出和 DALL E 的文字-图像配对之间,VQGAN+CLIP 找到了自己的艺术。
一旦人工智能社区知道这是可能的,一个“新兴艺术场景爆发了。人们开始尝试其他 GAN 架构和现有架构的变体。没过多久,人们就意识到提示(他们称之为文本描述)在决定最终输出时很重要。与 GPT-3 一样,你写给模型的内容决定了它“理解”你想要什么的程度。在一次类似的工程技能展示中,人们开始为他们的艺术世代设计风格。
以下是 Dream 在提示“日落”时产生的内容,在每个提示中添加了“巴洛克”、“赛博朋克”和“虚幻引擎”:



提示:日落+巴洛克/赛博朋克/虚幻引擎——制作于梦想
CLIP 的关键优势之一是它具有令人印象深刻的零镜头设置性能。这意味着它不需要看到你想知道如何做它的工作的文本图像对的例子。简单地写一个句子会给你惊人准确的结果。
结合其零射击技能、即时工程和 VQGAN+CLIP 的无限可能性,人工智能生成的艺术工具充斥着互联网。一个吸引了很多注意力的特别例子是 Dream ,这是 Wombo 的一个网络浏览器应用程序,允许用户从多达 20 种不同风格的文本描述中创建无限多的图像。
以下是梦在提示“森林”(黑暗幻想)、“木制自动机”(蒸汽朋克)和“幸福生活”(神秘主义)时给出的内容:



提示:森林(黑暗幻想),木制自动机(蒸汽朋克),生命(神秘)——梦想制造
你在这里看到的所有图像在某种意义上反映了 CLIP 如何“看到”世界,以及它如何“认为”语言代表了我们的视觉世界。然而,CLIP 不为自己考虑任何事情,它被喂以大量的互联网数据(就像与它合作的 GANs 一样)。作为一个比喻,VQGAN+CLIP ensemble 可以被解释为一个来到地球的外星人,看到并记住了互联网,并且只记住了互联网,然后使用其语言-视觉心理表征来绘制这些独特的图片。
结果,毫无疑问,是艺术。
艺术的未来
摄影没有取代画家和艺术家。这让他们移动和适应。它创造了新一代的艺术家,揭示了新发明的潜力。画家和摄影师现在共同生活和创造艺术,让我们对绘画和图片的美感到好奇。
艺术,无论其形式如何,都让我们感受到。新的艺术方面有足够的空间让我们体验新的感觉。人工智能生成艺术家——或者无论他们将被如何称呼——将填补一些空间。他们将会把已经存在的艺术形式稍微推向新的创造性想象,但不会让任何形式消失。很多美工都会很好的利用这些新工具(或者我应该叫他们助手?)并赋予他们的创造力,让他们超越自己的想象。
像 DALL E 或 VQGAN+CLIP 这样的 AI 模型将继续进化成高度复杂的艺术引擎。我不知道未来会发生什么,但我相信人工智能不会像摄影一样,剥夺我们体验艺术引导的丰富情感和感觉的独特能力,这种能力让生活变得值得。
如果你已经读到这里,可以考虑订阅我的免费双周刊 【明天的思想】 !每两周一次关于人工智能和技术的新闻、研究和见解!
您也可以直接支持我的工作,使用我的推荐链接 这里 成为中级会员,获得无限权限!😃
辅助游戏如何让人工智能更安全
原文:https://towardsdatascience.com/how-assistance-games-make-ai-safer-8948111f33fa
以及他们为什么不这样做
人工智能系统正变得越来越强大,并被赋予更多责任,从驾驶汽车到股票交易。因此,很明显,使它们的行为与人类的意图一致是一个关键的安全问题。传统的强化学习方法只允许用户在训练前设计一次人工智能的奖励信号,而要做到这一点非常困难。但是,如果我们重新构建人类和人工智能之间的关系,就像教师和学生之间的关系一样,允许人工智能提问并从人类的行为中学习,会怎么样?在这篇文章中,我将写关于辅助游戏:一个令人兴奋的框架,让人工智能通过与他们互动来了解人类的意图。我将解释辅助游戏的形式主义,将它们与其他奖励学习方法进行比较,并提及该框架目前的一些弱点。

简介:为什么要援助?
受人工智能校准问题的启发,Stuart Russel 在他的书“人类兼容:人工智能和控制问题”中提出了构建安全人工智能的 3 个原则[7]:
- 机器的唯一目标是实现人类的偏好。
- 机器最初不确定这些偏好是什么。
- 关于人类偏好的最终信息来源是人类行为。
遵循这些原则需要改变我们如何设计人工智能的思维。机器学习使该领域发生革命性变化的原因是,它不需要我们给程序如何达到目标的指令。相反,我们告诉它如何学习如何实现既定的目标。既然目标已经变得更加复杂,Russel 的原则建议再退一步,只定义如何学习目标。
辅助游戏(Assistance Games,由哈德菲尔德-梅内尔等人引入,称为合作逆强化学习[4])是根据罗素三原则训练 AI 的框架。这是一种人在回路中的方法,意味着人工智能从人类那里获得关于真正奖励信号的反馈。人工智能代理,通常被称为 R 或机器人,和人类轮流在一个环境中行动,并为他们的行动获得奖励,类似于强化学习。重要的是,人类和机器人分享相同的奖励,但只有人类知道真正的奖励功能。机器人配备了一些关于人类如何实现目标的假设,并且必须从人类的行为中推断出回报。根据环境规范,他们可能会提出一些澄清性问题。
激励的例子:烹饪游戏
Sha 等人的辅助优于奖励学习的优势定义了烹饪游戏,以展示哪些辅助游戏比传统的奖励学习做得更好[9]。在这个游戏中,人类想做一道特别的菜,机器人必须学会帮助他们。gridworld 的特点是几种配料可以相互作用,创造出各种菜肴。例如,面粉可以放在盘子上做成馅饼面团。馅饼面团可以用蓝莓或樱桃填充,最终的馅饼必须烘烤。代理可以询问人类关于他们偏好的问题,例如他们是否喜欢樱桃或蓝莓派。

从帮助比奖励学习的好处来说明烹饪游戏[9]
这个游戏的某些方面对传统的奖励学习是有挑战性的。例如,人可能只能在几个时间步之后接受提问,而传统的奖励学习在人的反馈之前没有行动的空间。我将详细说明援助游戏的好处,但首先,让我正式解释他们如何工作。
援助博弈的形式定义
完全形式化的辅助博弈(AG)是一个元组

这看起来有点类似于强化学习中常见的部分可观察马尔可夫决策过程 (POMDP)。这个定义可能看起来有点吓人,所以让我们一步一步来看
- 像在 POMDP 中一样,存在一组可能的环境状态 S,尽管代理从未看到真实的状态,而是从集合ω中得到一个观察值。
- 因为人类和机器人都在环境中行动,所以有两组状态:A^H 代表可能的人类行动,A^R 代表可能的机器人行动。
- 与 POMDP 类似,环境的真实状态是未知的,相反,机器人和人类从一组ω中接收观察值。观察值通过观察函数 O 与真实状态相关联,观察函数 O 从状态映射到观察值的分布。与动作一样,机器人和人有不同的观察集合和不同的观察功能。
- 描述了环境的动态。它是基于当前状态和人类和机器人的最后动作到下一个状态的非确定性映射。
- γ是贴现率,如普通 RL 中所示。
- θ是可能的奖励函数参数θ的集合。实际参数θ取自 P_θ,并用于参数化真实回报函数 r_θ。如上所述,只有人类知道θ。r_θ根据人和机器人的动作和当前状态给予奖励。
求解辅助游戏
在这个理论公式中,一个 AG 由一对人类和机器人策略来解决,以获得最高可能的回报。然而,在现实生活中,我们可能只想训练机器人,并选择人类的政策作为超参数。然后,通过将人视为环境的一部分,AG 可以被还原为 POMDP。因此,可以使用 POMDP 求解算法或深度强化学习来训练机器人。然而,使用诸如值迭代的传统 POMDP 求解算法有两个缺点。
首先,AG 到 POMDP 的变换指数地增加了状态空间。对于 AG 中的每个状态,必须有相应的 POMDP 状态嵌入可能的报酬函数参数化和先前的人类动作。在烹饪游戏的 POMDP 中,不仅仅是机器人站在瓷砖上的单一状态。这种状态有一种变化,其中代理有很高的置信度应该制作樱桃派,对应于巧克力蛋糕的状态,以及根据 AG 的奖励函数参数空间可能的每一个其他程度的置信度。此外,人类的动作需要嵌入到状态中,以便机器人可以学习人类想要的和随后收到的奖励之间的相关性。
此外,传统的 POMDP 求解算法只返回一个最优的机器人策略,如果人类的策略是完全合理的。显然,这并没有准确地模拟人类的行为。
幸运的是,由于最近的研究,求解对应于辅助游戏的 POMDP 变得更加有效。Malik 等人介绍了一种价值迭代的适应版本[6]。它允许用比传统方法更小的状态空间求解基于辅助博弈的 POMDPs。此外,它还能为更广泛的人类政策产生最优的机器人政策。现在可以使用的一个更好的人类行为模型是玻尔兹曼理性,这意味着人类选择他们的行为是基于行为期望值的玻尔兹曼分布。
在深度学习方面,Woodward 等人在多智能体方法方面取得了成功,在训练过程中,人类被另一个智能体取代[11]。
辅助游戏 VS 奖励学习
在传统的机器学习范式中,在模型被训练之前,奖励被精确地指定一次。相反,奖励学习方法通常在培训的两个阶段交替进行。例如,在从人类反馈 (RLFH)的强化学习中,代理首先完成多个情节或部分情节轨迹【2】。然后,人们会看到这些轨迹对,并陈述他们对这些轨迹的偏好。这个反馈被整合到代理在接下来的几集里使用的奖励模型中。在培训过程中,在环境中行动和收集反馈这两个阶段反复交替进行。
另一方面,辅助游戏在人类和人工智能之间有一个更“细粒度”的交互模式,因为机器人和人类在同一集内轮流表演。因此,机器人可以在每次行动后更新其关于真正奖励的信念。在下一节中,我将使用烹饪游戏的例子来探索这种细粒度方法的优点。
以下流程图说明了普通强化学习、RLFH 和辅助游戏之间的区别:

来源:作者生成
以未来反馈为条件的计划
首先,机器人能够在收到任何反馈之前采取行动是很有用的。在烹饪游戏中,人类可能有几个时间点不在——可能他们还在工作,而烹饪机器人正在想如何有效地利用他们的时间。在 AG 中,它可以学习准备面团总是有意义的,因为任何蛋糕都需要它。这被称为基于未来反馈的计划,因为代理知道它最终会收到如何处理这笔钱的指令。使用 RLFH 不可能制定这样的计划,因为机器人在第一阶段需要人类的反馈。
以未来反馈为条件的计划鼓励代理人的保守行为,这意味着他们试图保持开放的选择,以实现替代的奖励功能。在传统的强化学习中,这可以通过提供一组辅助奖励函数来实现,如果代理对主奖励函数的解决方案使辅助函数更难满足,则惩罚代理[10]。保守代理人试图避免副作用,尽可能保护环境。这使得它们适用于很难或不可行指定代理应该避免做的所有事情的环境。
相关性感知学习
此外,辅助游戏允许机器人在提问时考虑相关性。我们可以想象烹饪游戏的延伸,机器人在苹果或类似的原料中发现虫子。机器人不清楚人类是想把有虫的苹果放进堆肥箱还是垃圾桶。由于蠕虫只是偶尔被发现,这让 RLFH 陷入了两难境地:机器人应该问一个关于可能不会出现的情况的问题吗?在烹饪游戏中,这似乎无关紧要,但在更复杂的环境中,要考虑的情况数量很容易变得不可行。一个足够复杂的机器人可能不仅想知道蠕虫,还想知道食材的大小,它们是否有种子,或者人类的情绪状态是否会影响它们的偏好。另一方面,在 AG 中,机器人可以学习只询问出现的特定情况。
从人类行为中学习
第三个优点是,在辅助游戏中,人类可以采取除回答问题之外的其他动作,机器人可以使用这些动作来推断人类的目标。假设在烹饪游戏中,可以用面团、糖和巧克力制作巧克力蛋糕。面团和糖也用于其他蛋糕,但如果人类抓住巧克力,那么机器人可以很容易地推断出目标是制作巧克力蛋糕。
辅助游戏的缺点
设计先验可能很难
至关重要的是,援助游戏需要合理的优先于人类的偏好。在烹饪游戏中,这可能很容易。如果机器人只能烤苹果、樱桃或蓝莓派,那么它可以从奖励函数的均匀分布开始,奖励制作这些派中的任何一个。或者先验可以基于关于人类偏好的统计。但随着任务变得更加复杂,机器人越来越有能力考虑更多的概念,如何设计先验变得不那么明显。结果,我们可能会试图让机器人对一切更加不确定。不幸的是,这也意味着机器人在没有人类反馈的情况下会受到更多的限制。如果我们的烹饪机器人也是一个管家,他们可能不确定人类是否希望他们在到达之前通过准备面团来制造混乱。因此,一个坏的先验会阻止机器人开发出以未来反馈为条件的好计划。
最近引入的一种被称为“模拟过去的奖励学习”( RLSP)的技术可能会使设计先验变得更容易一些[8]。核心思想是可以从环境的当前状态推断出一些用户偏好。如果房间里有一个易碎的花瓶,机器人可以推断出人类希望它完好无损,因为如果人类愿意的话,打破它会很容易。然而,像这样推断意图需要模拟可能导致当前状态的可能行为。在给定环境下尝试所有人类轨迹很快在计算上变得不可行。相反,深度学习版本的 RLSP 模拟了从当前环境状态向后的轨迹[5]。
在辅助游戏中使用 RLSP 可以帮助机器人推断哪些动作是非常好的,即使它的奖励函数先验不足以做到这一点。一个应该做饭并保持房子清洁的机器人可以通过看到环境中的馅饼之前已经烘烤过并推断这需要制作面团来学习准备面团是没问题的,即使它会制造混乱。
人类的偏好可能会改变
辅助游戏的模型假设存在一个恒定的真实的奖励函数,该函数为人类所知,并且必须由机器人来推断。奖励函数应该代表人类的偏好,因此让它保持不变并不完全准确。不仅偏好会随着时间自然改变,而且一些人工智能应用程序也必然会采取行动,影响与之交互的人类的偏好。在人工智能的奖励与人类反馈相关的任何过程中,这可能会激励人工智能操纵人类的偏好以获得更多奖励。一个臭名昭著的例子是推荐系统,它通过向用户展示更极端的内容来分化用户,因为这使得他们的点击更容易预测。
很容易将推荐系统建模为一个辅助游戏:机器人的动作包括向人类提供视频推荐,人类通过观看他们最感兴趣的视频来提供反馈。在这个简单的模型中,我们将拥有与当前推荐系统完全相同的偏好篡改动态。通过对问题进行不同的建模,有可能避免操纵行为。例如,一个模型不能(仅仅)根据人们使用的推荐来推断他们的偏好。通过考虑不同的偏好,比如关于偏好如何变化的元偏好,这个问题可以被回避而不是解决。
然而,也许确保我们不使用辅助游戏训练操纵型人工智能的唯一方法是彻底检查形式主义,以某种方式考虑到偏好的变化。有人认为,如果我们承认人工智能可以改变人类的偏好,那么试图像 Russel 建议的那样将人工智能与人类的偏好联系起来是徒劳的[3]。人工智能有许多攻击媒介,旨在操纵人类的偏好,如环境或人类的行为。援助游戏只假设行为和环境是偏好的指标,但忽略了它们如何影响行为[1]。最近,人工智能和其他领域的研究人员呼吁进行多学科研究,以更好地了解偏好是如何形成的,以便可以更安全地设计处理人类偏好的人工智能[3]。

图像来自人工智能系统中的行为和偏好操纵问题[1]
结论
我对辅助游戏作为训练安全 AI 的框架感到非常兴奋。它产生保守、务实的代理,表现出令人满意的行为,如以未来反馈和相关性意识学习为条件的计划。该框架还允许代理从比传统的奖励学习更广泛的人类行为中学习,在传统的奖励学习中,人类被限制于陈述偏好或回答问题。然而,挑战仍然存在,例如在奖励函数和准确的人力政策上选择一个好的先验。由于它是积极研究的主题,我相信技术和算法的创新将不断改进这些领域的框架。另一方面,如何处理辅助游戏中偏好操纵的风险尚不清楚。据推测,在人工智能的许多潜在应用中,这不会是一个问题。尽管如此,任何旨在成为训练安全人工智能的通用范式的框架都需要考虑人工智能对人类偏好的影响。
文献学
[1] Ashton 和 Franklin,人工智能系统中的行为和偏好操纵问题,2022 年人工智能安全研讨会会议录,【http://ceur-ws.org/Vol-3087/paper_28.pdf】T2
[2] Chrisiano 等人,从人类偏好进行深度强化学习,ArXiv,2017 年 6 月 12 日,https://arxiv.org/abs/1706.03741
[3] Franklin 等人,认识偏好改变的重要性:在人工智能时代呼吁多学科协作研究,ArXiv,https://arxiv.org/abs/2203.10525v2
[4]哈德菲尔德-梅内尔等,合作逆强化学习,ArXiv,2016 年 11 月 12 日,https://arxiv.org/abs/1606.03137
[5]林德等人,通过模拟过去学习做什么,ArXiv,2021 年 4 月 8 日,https://arxiv.org/abs/2104.03946
[6] Malik 等,一种高效的广义贝尔曼更新的合作逆强化学习,ArXiv,2018 年 6 月 11 日,https://arxiv.org/abs/1806.03820
[7]拉塞尔·s .,人类兼容:人工智能
与控制问题,企鹅出版社,2019
[8] Shah 等人,世界状态中隐含的偏好,ArXiv,2019 年 2 月 12 日,https://arxiv.org/abs/1902.04198
[9] Shah 等人,辅助优于奖励学习的好处,NeurIPS 2020,https://people . eecs . Berkeley . edu/~ Russell/papers/neur IPS 20 ws-Assistance
[10]特纳等人,保守机构通过可获得的效用保全,ArXiv,2019 年 2 月 26 日,https://arxiv.org/abs/1902.09725
[11] Woodward 等人,学会交互式学习和协助,ArXiv,2019 年 6 月 24 日,https://arxiv.org/abs/1906.10187
自动编码器如何在降维方面优于 PCA
自动编码器的应用
使用非线性数据的自动编码器的维数减少

由 Unsplash 上的 Shubham Dhage 拍摄的照片
自动编码器有很多的实际应用。降维就是其中之一。
有这么多的降维技术。自动编码器(AEs)和主成分分析(PCA)在其中很受欢迎。
PCA 不适合非线性数据的降维。相比之下,自动编码器在非线性数据的降维方面做得非常好。
目标
在本文结束时,您将能够
- 使用自动编码器降低输入数据的维数
- 使用主成分分析降低输入数据的维数
- 比较 PCA 和自动编码器的降维性能
- 了解自动编码器如何在降维方面优于 PCA
- 了解 PCA 和自动编码器之间的主要区别
- 了解何时使用哪种降维方法
先决条件
我推荐你阅读下面的文章作为这篇文章的先决条件。
- 深度学习中的自动编码器介绍 (推荐使用,因为你需要在实现之前了解自动编码器的原理)
- 使用 Keras 中的浅层和深层自动编码器生成 MNIST 数字(推荐使用,因为您需要知道如何使用 Keras functional API 构建自动编码器)
- PCA 与降维文章合集 (推荐是因为你需要了解 PCA 的工作原理,如何应用以及降维背后的大致思路)
- 构建 Keras 模型的两种不同方式:顺序 API 和函数 API (推荐,因为您将在这里使用 Keras 函数 API 来构建 autoencoder 模型)
- 获取、理解并准备 MNIST 数据集 (推荐使用,因为您将在此使用 MNIST 数据集构建自动编码器和 PCA 模型)
用主成分分析法进行降维
首先,我们将使用主成分分析对 MNIST 数据(见最后的数据集引文)进行降维,并将输出与原始 MNIST 数据进行比较。
- 步骤 1: 采集并准备 MNIST 数据集。
(作者代码)
- 第 2 步:仅使用两种成分进行 PCA。输入数据的原始维数是 784。
(作者代码)
- 步骤 3: 将 PCA 后的压缩 MNIST 数字可视化。
(作者代码)

PCA 输出(作者图片)
- 步骤 4: 将 PCA 输出与原始 MNIST 数字进行比较。

原 MNIST 数字(图片由作者提供)
正如您在两个输出中看到的,应用 PCA 后,MNIST 数字不清晰可见。这是因为我们只保留了两个组件,这两个组件没有捕获输入数据中的很多模式。
- 步骤 5: 使用两个主成分可视化测试数据。
(作者代码)

使用两个主成分可视化测试数据(图片由作者提供)
所有的数字都没有清晰的独立簇。意味着只有两个分量的 PCA 模型无法清晰地区分测试数据中的九位数字。
使用自动编码器执行降维
现在,我们将构建一个深度自动编码器来对相同的 MNIST 数据进行降维。我们还将潜在向量的维数保持为二维,以便于将输出与 PCA 返回的先前输出进行比较。
- 步骤 1: 如前所述采集并准备 MNIST 数据集。
- 步骤 2: 定义自动编码器架构。

深度自动编码器架构(图片由作者提供,用 draw.io 制作)
(作者代码)

深度自动编码器架构(图片由作者提供)
网络中有超过一百万个参数。因此,这将需要大量的计算能力来训练这个模型。如果您为此使用传统的 CPU,则需要花费大量时间来完成训练过程。不如用一个强大的 NVIDIA GPU 或者 Colab free GPU 来加速 10 倍或者 20 倍的训练过程。
- 第三步:编译、训练、监控损失函数。
(作者代码)

(图片由作者提供)
- 步骤 4: 在自动编码之后,可视化压缩的 MNIST 数字。
(作者代码)

自动编码器输出(图片由作者提供)
自动编码器输出比 PCA 输出好得多。这是因为自动编码器可以学习数据中复杂的非线性模式。相比之下,PCA 只能学习数据中的线性模式。
- 步骤 5: 可视化潜在空间中的测试数据,以查看自动编码器模型如何能够区分测试数据中的九个数字。
(作者代码)

可视化潜在空间中的测试数据(图片由作者提供)
大多数数字都有清晰的独立簇。这意味着自动编码器模型可以清楚地区分测试数据中的大多数数字。有些数字重叠,例如,数字 4 和 9 之间有重叠。这意味着自动编码器模型不能清楚地区分数字 4 和 9。
- 步骤 6(可选):使用相同的自动编码器模型,但在隐藏层中不使用任何激活功能,
activation=None在每个隐藏层中。您将获得以下输出。

隐藏层中没有任何激活功能的自动编码器输出(图片由作者提供)
该输出甚至比 PCA 输出更差。我用这个实验向你展示了神经网络中激活函数的重要性。在神经网络的隐藏层中需要激活函数来学习数据中的非线性关系。如果隐藏层中没有激活函数,神经网络就是巨大的线性模型,其表现甚至比一般的机器学习算法还要糟糕!所以,你需要为神经网络使用正确的激活函数。
PCA 和自动编码器的主要区别
- 架构: PCA 是一种通用的机器学习算法。它使用输入数据协方差矩阵的特征分解或奇异值分解(SVD)进行降维。相比之下,Autoencoder 是一种基于神经网络的架构,比 PCA 更复杂。
- 输入数据集的大小: PCA 通常适用于小数据集。因为 Autoencoder 是一个神经网络,相比 PCA,它需要大量的数据。因此,最好对非常大的数据集使用自动编码器。
- 线性与非线性: PCA 是一种线性降维技术。它只能学习数据中的线性关系。相反,Autoencoder 是一种非线性降维技术,它也可以学习数据中复杂的非线性关系。这就是为什么在我们的例子中,自动编码器输出比 PCA 输出好得多,因为 MNSIT 数据中有复杂的非线性模式。
- 用途: PCA 只用于降维。但是,自动编码器并不局限于降维。它们还有其他的实际应用如图像去噪、图像殖民、超分辨率、图像压缩、特征提取、图像生成、水印去除等。
- 计算资源:自动编码器比 PCA 需要更多的计算资源。
- 训练时间:与自动编码器相比,PCA 运行时间更短。
- 可解释性:自动编码器比 PCA 的可解释性差。
实验(可选)
您可以通过为以下超参数尝试不同的值来构建不同的自动编码器架构。做完之后,在评论区告诉我结果。
- 层数
- 每层中的节点数
- 潜在向量的维数
- 隐藏层中激活函数的类型
- 优化器的类型
- 学习率
- 时代数
- 批量
摘要
考虑下面的图表,它包含了我们之前获得的所有输出。

输出比较(图片由作者提供)
- 第一行代表原始的 MNIST 数字。
- 第二行表示由 PCA 返回的只有两个分量的输出。数字不清晰可见。
- 第三行表示由自动编码器返回的输出,具有比 PCA 输出好得多的二维潜在向量。数字现在清晰可见。原因是自动编码器已经学习了 MNIST 数据中复杂的非线性模式。
- 最后一行表示自动编码器返回的输出,在隐藏层中没有任何激活功能。该输出甚至比 PCA 输出更差。我把这个包括进来是为了向你们展示激活函数在神经网络中的重要性。在神经网络的隐藏层中需要激活函数来学习数据中的非线性关系。如果隐藏层中没有激活函数,神经网络就是巨大的线性模型,甚至比一般的机器学习算法还要糟糕!
今天的帖子到此结束。
如果您有任何问题或反馈,请告诉我。
阅读下一篇(推荐)
- 阅读我的“神经网络与深度学习课程”的全部剧集。
点击图片进入我的神经网络和深度学习课程(作者截图)
支持我当作家
我希望你喜欢阅读这篇文章。如果你愿意支持我成为一名作家,请考虑 注册会员 以获得无限制的媒体访问权限。它只需要每月 5 美元,我会收到你的会员费的一部分。
https://rukshanpramoditha.medium.com/membership
或者,您也可以考虑通过点击本文底部的 给予提示 按钮进行小额捐赠。
非常感谢你一直以来的支持!下一篇文章再见。祝大家学习愉快!
MNIST 数据集信息
- 引用:邓,l,2012。用于机器学习研究的手写数字图像 mnist 数据库。 IEEE 信号处理杂志,29(6),第 141–142 页。
- 【http://yann.lecun.com/exdb/mnist/】来源:
- 许可:Yann le Cun(NYU 库朗研究所)和 Corinna Cortes (纽约谷歌实验室)持有 MNIST 数据集的版权,该数据集在知识共享署名-共享 4.0 国际许可(CC BY-SA)下可用。你可以在这里了解更多关于不同数据集许可类型的信息。
鲁克山普拉莫迪塔
2022–08–19
反向传播的工作原理——Python 实现
原文:https://towardsdatascience.com/how-back-propagation-works-a-python-implementation-21004d3b47c6
本文主要关注 Python 中反向传播的实现。我们已经在下面链接的前一篇文章中讨论了反向传播的数学基础。在这篇文章的最后,你会明白如何从头开始构建神经网络。
数据、神经网络结构和初始参数
我们将使用具有395个数据点和3特征(x1、x2和x3)的数据集来训练3–4–1网络。目标(y)由两个值组成(0表示失败,1表示成功)。

图 1:数据和神经网络架构。我们将实现一个 3–4–1 NN,数据集为 395 个示例,具有 3 个特征和 1 个目标值 y,图中显示的所有参数值都是初始值(来源:https://towardsdatascience . com/how-does-back-propagation-work-in-neural-networks-with-worked-example-BC 59 DFB 97 f 48)。
所有层的初始参数如下所示:

图 2:这些是参数的初始值(权重和偏差)。该图还显示了输入层上的单个数据点(来源:https://towardsdatascience . com/how-does-back-propagation-work-in-neural-networks-with-worked-example-BC 59 DFB 97 f 48)。
我们将使用 NumPy 来执行大多数操作,充分利用它为操作的向量化和数组广播进行了优化这一事实。让我们使用 NumPy 进行一些简单的操作,您会发现它的用处。
使用 Numpy 执行数学运算
假设我们想要同时执行由隐藏层的所有 4 个神经元进行的计算。通过矩阵乘法和加法,NumPy 让事情变得更简单。z=w·x+b其中w·x是使用np.dot(w, x)函数在 Numpy ( np)中实现的矩阵乘法。
import numpy as np w = np.array([[ 0.179, 0.044, 0.01 ], [-0.186, -0.028, -0.035], [-0.008, -0.063, -0.004], [-0.048, -0.131, 0.088]]) print("w shape: “, w.shape) x = np.array([7, 8, 10]).reshape(-1, 1) print(“x shape: “, x.shape) b = np.array([0, 0, 0, 0]).reshape(-1, 1) print(“b shape: “, b.shape) z = np.dot(w, x) + b print(z)
输出: w1 形态:(4,3)
x 形态:(3,1)
b 形态:(4,1)
[[1.705]
[-1.876]
[-0.6]
[-0.504]]
这给了我们所有隐藏层的z-值。接下来,通过矢量化,NumPy 还允许我们为上面生成的所有值应用激活。
sigmoid = lambda z: 1/(1+np.exp(-z)) print(sigmoid(z1))
输出: [[0.84618664]
【0.132849】
【0.35434369】
【0.37660112】]
矢量化属性允许我们将所有 z 值传递到 Sigmoid 激活函数中,并获得隐藏层中所有 4 个神经元的所有输出。然后,这些值可以作为最后一层的输入进行传递。
记号
既然我们现在知道如何通过 NumPy 中的矩阵乘法和加法对给定层中的所有神经元执行操作,我们将采用以下新的符号。
x⁰将表示整个输入数据—一个维度矩阵(特征数量、训练示例数量),wˡ—连接层l-1到l的权重矩阵,bˡ—应用于层 l 中神经元的偏置向量,

l 层权重和偏差的维度(来源:https://towards data science . com/how-neural-networks-actually-work-python-implementation-simplified-a 1167 B4 f 54 Fe)
zˡ—加权输入加偏差。也就是代码中的wˡ·x + bˡ或np.dot(wˡ, x)+bˡ,g—激活功能。我们将对隐藏层和输出层使用 Sigmoid 函数,

乙状结肠激活功能。给定 z 的任意值,函数g输出 0 到 1 范围内的实数。
fˡ—l层输出的向量,即g(wˡ·x+bˡ)=g(zˡ)。这成为下一层(l+1)的输入,yhat—模型的最终输出,y或t—真实值,在我们的例子中是0和1。m——#训练的例子。
我们需要实现反向传播的关键方程
为了在我们的浅层 NN 的代码中实现反向传播,我们需要在以下 3 个部分中简要讨论的 10 个方程:A、B和C(关键方程编号为1到10)。
A .更新方程式,以及成本函数:
参数(权重和偏差)将使用以下等式在每一层进行更新:

更新方程式
其中ϵ是学习率——一个超参数,t是学习步骤,E是成本/误差函数。我们将使用二元交叉熵损失函数作为函数E。它被定义为:

等式 4:二元交叉熵损失函数。
在代码中:
cost = -np.sum(np.multiply(y, np.log(yhat)) + np.multiply(1-y, np.log(1-yhat)))/m(针对 m 训练实例)。
其中t是真值(0或1),而yhat是模型的输出。由于我们在输出端使用 Sigmoid 函数,yhat将在0和1的范围内。我们的参数(权重和偏差)在θ中。
E相对于(wrt) yhat的偏导数可以表示为(此处勾选):

二元交叉熵损失函数的导数。
而 Sigmoid 函数的导数由下式给出(参见本文):

注意关于成本函数E的以下内容。

也就是说:
E是yhat和t的函数(已知),yhat=g(z)表示yhat是z的函数,z =wx+b,暗示,z是w和b(我们的参数)的函数- 实际上,
E是权重(w)和偏差(b)的函数,可以写成E(yhat, t)或E(g(z), t)或E(g(wx+b), t)。
含义:要得到E wrt 对w和b的导数(需要更新参数),我们需要得到

因此(根据链式微分法则),

B.更新输出隐藏层(w 和 b)中的参数所需的关键方程
如果我们需要更新w²和b²,我们需要计算:


因此,

和

在代码中:
方程式 1:
dz2 = yhat-y
方程式 2:dw2 = np.dot(dz2, f1.T)/m
方程式 3:db2 = 1/m * np.sum(dz2, axis=1, keepdims=True)(A.T 是矩阵 A 的转置)
我们现在有了更新w²和b²所需的等式,如下所示,

在代码中:
方程式 4:
w2 = w2-learning_rate*dw2方程式 5:b2 = b2-learning_rate*db2
C.更新隐藏输入层(w 和 b)中的参数所需的重要方程
我们需要计算下面的导数。

如果你求解这些导数,你将得到以下结果(如果有些东西没有意义,请参考主要参考资料)

在代码中:
方程式 6:
dz1 = np.dot(w2.T, dZ2) * (1-f1)*f1
方程式 7:dw1 = np.dot(dz1, X.T)/m
方程式 8:db1 = 1/m * np.sum(dz1, axis=1)
然后,我们可以用以下等式更新隐藏输入端的参数:

代码:
公式 9:w1 = w1-self.learning_rate*dw1公式 10:b1 = b1-self.learning_rate*db1
至此,我们有了10关键方程。让我们把它们放在桌子上。因为我们将用 m > 1 个训练例子来训练我们的模型,我们将使用右边的等式。

在代码中实现反向传播所需的 10 个等式。*注意,当实现 m 个示例的 back-prop 时(右),变量可能是具有 m 个元素的向量。例如,yhat和t将分别包含 m 个示例的模型的所有预测和所有示例的真值。
把一切都放进 Python 代码
为了从头开始构建一个迭代的神经网络,我们需要实现前向传播和后向传播。我们已经在后面的文章中看到了如何实现前向传播。我只粘贴下面的代码;然后,我们添加反向传播组件。该代码在我们的3–4–1 NN 中通过一个训练示例实现了向前传递。
输出:
Input shape (3, 1)
w1 shape: (4, 3)
w2 shape: (1, 4)
w1 shape: (4, 3)
b1 shape (4, 1)
w2 shape: (1, 4)
b2 shape (1, 1)
f1 shape (4, 1)
z2.shape (1, 1)
yhat shape (1, 1)
[[0.521]]
单个数据点x=[7, 8, 10]的单次正向传递输出~0.521 (如预期的那样,见图 1)。
在前向传播之后,我们需要计算近似的成本,执行反向传播,最后,更新参数。为了实现这些步骤,让我们向上面代码中的ForwardPass类添加三个函数,并将该类重命名为OurNeuralNet。
我们根据需要增加了三个功能:compute_cost(args)、backward_propagation(args)和update_parameters(args)。注意,我们的类现在需要我们定义学习率。
训练模型
类OurNeuralNet现在有了实现 NN 操作所需的所有函数——参数初始化、向前传递、损失计算、反向传播和更新参数。这一次,让我们调用上面的类在更大的数据集上训练模型,而不是单个例子。数据在以下链接:【https://kipronokoech.github.io/assets/datasets/marks.csv】T21。
然后我们将调用train_model(args)函数用部分数据训练我们的模型。在395个例子中,我们将使用第一个300来训练模型。我们正在为4500迭代训练模型,学习率为0.2(实际上是任意选择)。在每次迭代中,我们还计算预测yhat的模型精度。
输出:
iteration 0 cost:--> 0.691 accuracy--> 0.67
iteration 1000 cost:--> 0.461 accuracy--> 0.78
iteration 2000 cost:--> 0.203 accuracy--> 0.917
iteration 3000 cost:--> 0.162 accuracy--> 0.933
iteration 4000 cost:--> 0.169 accuracy--> 0.947
iteration 4500 cost:--> 0.108 accuracy--> 0.99
{'w1': array([[ 0.074, -0.349, 1.217],
[-0.05 , -0.167, 1.144],
[-0.265, 0.091, 1.068],
[-0.265, 0.079, 1.077]]), 'b1': array([[-7.196],
[-7.103],
[-6.843],
[-6.818]]), 'w2': array([[2.81 , 2.743, 2.586, 2.573]]), 'b2': array([[-7.392]])}
哇!如您所见,随着模型的训练,预测的成本在下降,训练的准确度在上升,达到了99%的高点。我们的模式是学习!
测试模型
理解:我们已经使用300/395数据例子进行模型训练。这被称为训练集。为了确保我们的模型能够在看不见的数据(通常称为测试集)上进行归纳,我们将使用没有用于模型训练的95数据点进行测试(参见下面的代码片段)。
注意:为了进行测试,我们需要使用我们在前面部分中训练模型后找到的参数对特征数据进行单次正向传播。
输出:
Testing on 95 data points0.9157894736842105
厉害!该模型在测试集上达到了91.6%精度。这意味着该模型可以很好地概括看不见的(测试)数据。
这标志着本文的结束。如果您发现这里的一些概念具有挑战性,请浏览以下参考资料:
- 神经网络的基础知识
- 神经网络如何工作——使用工作示例
- 神经网络的实际工作方式——Python 实现(简化)
- 神经网络实际上是如何工作的——Python 实现第 2 部分(简化)
- 神经网络中的反向传播是如何工作的?【数学基础】(T29)
使用的代码
- 本文中使用的代码可以在我的 git repo 中找到:https://github . com/kipronokech/Neural-Networks-from-Scratch。
请以每月 5 美元的价格注册成为 medium 会员,这样就可以在 Medium 上阅读我和其他作者的所有文章。
感谢您的阅读,下次再见!!!
结论
在本文中,我们从头开始训练一个浅层神经网络(一个只有一个隐藏层的神经网络)。我们已经了解了如何初始化参数、执行特征数据的正向传递、实现反向传播以及更新参数。在接下来的文章中,我们将讨论如何选择学习速率、适当的参数初始化以及改变隐藏神经元的数量对模型性能的影响。
贝叶斯统计如何更新概率
原文:https://towardsdatascience.com/how-bayesian-statistics-works-in-updating-probabilities-625b1b8599ec
实验如何更新知识导致准确的概率估计

掷骰子的人和卖鸟的人聚集在一块石板周围——赌徒的主人——布面油画(公共领域图片来自维基百科)
通过研究一个骗子的赢款,在不知道他的资源的情况下,通过应用贝叶斯定理,有可能找出他得到点数的概率。在这个故事中,我们看到了如何进行一些“实验”,使得正确估计事件发生的概率成为可能,即使我们不知道从中提取的样本的成分。
根据贝叶斯理论,概率是主观的。主观猜测可能会导致有意义的结果,这听起来可能有点奇怪。这个故事的目的是通过一个例子来说明这是可能的。
毕竟概率一定是主观的,因为没有办法估计一个客观的概率,除非你已经知道了,因为你已经以某种方式准备好了系统。
考虑一个里面有 6 个球的骨灰盒。这些球可以是红色(R),绿色(G)或蓝色(B)。只有知道骨灰盒里有几个,才能知道抽到的客观概率,比如一个红球。否则,你只能猜测,在抽球之前,你只能给它分配一个主观概率:换句话说,你可以只根据你的感觉打赌你会在第一次抽中一个红球,这取决于你觉得自己有多幸运。但是,观察别人的下注,你就能对那个概率有个准确的概念。
在我们的例子中,骨灰盒包含三个红色球,两个绿色球和一个蓝色球。然而,假设我们对瓮中之物一无所知。我们只能说有以下几种可能。
- 骨灰盒里没有红色的球。我们将此条件表示为 P(R|0)=0,其中 P(R|0)是在假设有 0 个红球的情况下,抽取红球的概率。P(R|0)称为抽 R 的条件概率,骨灰盒里没有红球。
- 骨灰盒里只有一个红色的球。在这种情况下,P(R|1)=1/6,也就是说,有六分之一的可能性抽到一个红球。
- 如果骨灰盒里有 2 个红球,P(R|2)=2/6=1/3。
- P(R|3)=3/6=1/2 是抽中一个红球的概率,如果骨灰盒里有 3 个红球。
- P(R|4)=4/6=2/3 是瓮中有四个红球的情况下抽到红球的概率。
- 如果红球的数量是 5,P(R|5)=5/6。
- 当然,如果所有的球都是红色的,P(R|6)=1。
以上概率是客观存在的,但是,我们对假设一无所知,对此我们需要进行猜测。根据贝叶斯定理

在这个公式 P(H|x)中,假定事件 x 已经发生,则后验代表更新后的H 为真的概率。它由之前的P(H)和可能性 P(x|H)的乘积除以 P(x)给出,P(x)只不过是一个归一化因子,称为证据。****
在我们的例子中,P(H)是假设 H 为真的(先验)概率。我们的先验概率只能是主观的,我们只能做出有根据的猜测。我们必须相信 P(H)有一个给定值。它被称为“先验”,因为它必须在实验之前进行评估。既然我们不能从一个值中选择另一个值,我们可以设 P(H)=1/7,因为有七种可能的假设,而我们没有选择其中一种的线索。
给定假设 H,可能性 P( x |H)表示从瓮中抽取 x 的可能性。上面列出了 x =R 的 P( x |H),当然,P 取决于 H。比如对于 x =R,H=4,P( x |H)=2/3。
证据 P( x )是在不考虑假设的情况下,抽到一个 x 的概率。它被称为证据,因为它可以作为实验的结果来评估。因为它是一个标准化因子,所以可以通过忽略概率来评估,如下所示。
在第一次抽签后,我们可以根据贝叶斯定理,通过计算后验概率(即实验完成后的概率)来更新我们的知识。换句话说,我们想要评估 P(H| x )假设 H 为真,给定事件 x 发生。
假设我们在第一次尝试中抽到了一个绿色球( x =G)。然后,我们可以构建下表。

第二列中的 P(H)是第一列中列出的假设 H 的概率。为了方便起见,在第三列中示出了可能性 P(R|H)。在我们的例子中,事件 x =G,我们需要计算抽到一个不是红色的球的可能性,即 1-P(R|H)。给定 H,事件 x =G 发生的乘积 P(H)P( x |H)显示在倒数第二列。
倒数第二列中所有概率的总和给出 P( x ),不考虑 h .它是 1/2。将表的最后一列除以这个数,得到后验概率,它作为表的最后一列添加。

如图所示,所有 H 的 P(H)和 P(H|x)之和必须为 1。从表中我们可以看到,由于实验的进行,我们的信念是如何演变的。假设 6(所有的球都是红色的)已经被排除:它的概率为零。实验结束后,每个假设的概率随着投票箱中红球的数量而减少。事实上,如果瓮中的红球数量是 5 个,我们很可能抽到一个红球,然而,如果只有一个球,抽到一个绿球的概率更高。
每次我们做实验,我们都会更新概率。现在,我们的先验是第一次实验后得到的后验。我们更确信瓮中有一个红色的球,而不是五个,并且我们确信不是所有的球都是红色的。然后,让我们重新构建该表。

然后,让我们进行另一个实验,假设我们画了一个红球( x =R)。在这种情况下,贝叶斯定理的分子是乘积 P(H)P(R|H ),并且表格改变为

将每个分子除以 5/18,即分子总数,我们得到后验概率:

值得注意的是,现在后验概率相对于假设 3 是对称的。对称性是由于我们画了一个绿色的球和一个红色的球,在这些实验之后,我们可以得出结论,假设与频率一致,画一个红色的球的概率等于画一个非红色的球的概率。
我们也排除了另一个假设:H=0。其实画了一个红球,H=0 是不可能为真的。
现在,假设 H=3 是最有可能的(实际上,这是真的)。
我们可以多次重复这个过程。每一次,我们都会更新关于骨灰盒内容的知识。有趣的是,将概率的演变绘制成实验次数的函数(我们模拟了 200 次抽签,每次都计算后验概率):

正如我们所看到的,所有的先验最终都趋向于零,除了正确的一个,P(3),它趋向于 1,正如大数定律所预测的那样(即通过频率主义方法)。
在这里,你可以找到一个 jupyter 笔记本,用来计算随机抽取一个球后的后验概率,并迭代这个过程。使用该工具,您可以看到后验概率如何随着实验次数的增加而演变,并理解贝叶斯定理如何从一个主观概率导出一个客观概率。
通过使用这个工具,你甚至可以改变初始的先验,并看到最终的结果独立于初始的猜测。例如,你可以从完全随机的先验 P(H)开始。最终,结果总是 P(3)趋向于 1。
引用 Bruno De Finetti 的话,“概率是不存在的”,因为它绝不是客观的,也就是说,它不是任何真正的实验所固有的。虽然没有客观概率这种东西,但贝叶斯定理导致对它的估计,其值随着我们对系统的了解而演变,并在每次实验后更新,导致尽可能客观的估计。在这个故事中,我们已经说明了更新过程是如何工作的,以及为什么它会导致正确的答案。
这样的故事还要继续看下去吗?不要错过订阅媒体的新故事:https://giovanni-organtini.medium.com/membership
2021 年大数据有多大?
原文:https://towardsdatascience.com/how-big-are-big-data-in-2021-6dc09aff5ced
关于一些最著名的大数据源的大数据“规模”的调查
想过大数据有多大吗?本文试图对一些最著名的数据生成者生成的数据进行最新的比较。

欧洲核子研究中心 0 级数据中心。图片来源: CERN
我们正在见证数字数据的不断增长,以至于我们的时代被称为大数据时代。多种多样的参与者推动了这一增长,从科技公司到标准行业、媒体机构、机构和研究实验室。此外,现在即使是日常物品也可以收集数据,因此数据生产者中也包括普通人。
总的来说,数据生产的现代趋势由两个主要因素驱动:来自不同行业的几个利益相关者提供的数字服务和数百万用户的大规模使用。
尽管由于缺乏官方信息,重建生成数据的数量非常困难,但可以通过整合不同性质的多个来源来尝试。
2021 年的大数据规模

图片由作者提供。互动版请访问:datapane.com/lclissa/big-data-2021/
标题中链接的交互式版本,具有可点击的链接,重定向到所有用于评估的参考来源。
首先映入眼帘的肯定是右上角的巨大气泡。这说明了欧洲核子研究中心https://home.cern/about/who-we-are大型强子对撞机(LHC) 实验的电子设备检测到的数据。一年中,处理的信息量约为 40k EB,即 40 万亿 GB。举个例子,这可能是亚马逊 S3 上存储的数据量的十倍!
然而,并非所有这些数据都令人感兴趣。因此,实际记录的信息缩减到每年数百 PB(真实和模拟数据分别为 160 和 240 PB),并且在即将到来的 高亮度(HL-LHC) 升级中,它将增长近一个数量级。
商业大数据源也经历了类似的量。据估计,谷歌搜索索引的大小不到 PB,而公司的服务伙伴 YouTube 的大小大约是它的 4 倍。
对于 Instagram 和脸书年度照片上传,可以分别重建相同的关系。
关于更合适的存储服务,如 Dropbox,大小增加到几百 PB,类似于 LHC 实验的 HL 升级。
然而,流数据一直占据着大数据市场的份额。像网飞和电子通信这样的服务产生的流量比单纯的数据生产者多一到两个数量级。值得注意的是,科学界在这方面也发挥了重要作用。例如,由于全球 LHC 计算网格(WLCG) 的,来自 LHC 数据流通的流量达到每年数千 Pb。
费米估计过程
...但是这些数字从何而来?
即使有可能,精确重建一个组织产生的大量数据(尤其是大型组织)也是非常困难的。事实上,并不是所有的公司都在第一时间追踪这些信息。即使如此,这些数据通常也不会与公众共享。
尽管如此,一种尝试性的方法可以将数据生产过程分解为其原子组成部分,并进行合理的猜测(https://en.wikipedia.org/wiki/Fermi_problem**))。事实上,当以特定数据源为目标时,检索关于给定时间窗口内产生的内容量的信息更容易。一旦我们有了这些,我们就可以通过合理的猜测此类内容的单位大小来推断数据总量,例如平均邮件或图片大小、1 小时视频的平均数据流量等等。当然,即使很小的错误在大规模传播时也会产生很大的影响。然而,返回的估计值仍然可以指示所涉及的数量级。**
让我们深入了解在评估过程中挖掘的资源。
谷歌。尽管互联网上的网页数量无穷无尽,但最近的迹象表明,并不是所有的网页都被搜索引擎编入索引。事实上,这样的指标应该尽可能小,以确保有意义的结果和及时的响应。因此,最近的一项分析估计,谷歌搜索索引包含300 亿到 500 亿网页(目前的估计见worldwidewebsize.com)。考虑到根据年度网络年鉴 一个平均页面的重量大约为 2.15 MB,截止到 2021 年谷歌搜索索引的总大小应该大约为62pb(PB)。
****YouTube。据 Backlinko 报道,2021 年每天有 72 万小时的视频上传到 YouTube。假设平均大小为 1 GB(标准定义,这使得去年总共生产了大约 263 PB 。
脸书和 Instagram。 Domo 的 数据不眠 9.0 报告估计,2021 年两大社交媒体上每分钟上传的图片数量分别达 240k 和 65k。假设平均大小为 2 MB ,那么总共大约有 252 和68pb。
****Dropbox。虽然 Dropbox 实际上并不产生数据,但它提供了一个云存储解决方案来托管用户的内容。2020 年,公司宣布新增用户 1 亿,117 万,其中为付费订阅。通过推测免费和付费订阅的占用率分别为 75%(2gb)和 25%(2tb),2020 年 Dropbox 用户所需的新存储量可以估计为大约 733 PB 。

图片由作者提供。
****邮件。据 Statista 统计,从 2020 年 10 月到 2021 年 9 月交换了近 131 亿次电子通信(71 亿次电子邮件和 60 亿次垃圾邮件)。假设标准邮件和垃圾邮件的平均大小分别为 75 KB 和 5kb,我们可以估计总流量大约为 5.7k PB 。
网飞。在过去的几年里,公司的渗透率直线上升,这也是为了应对疫情改变了的日常事务。Domo 估计,2021 年网飞用户每天消耗1.4 亿小时的流媒体,假设每小时 1 GB(标准清晰度)时,总计约为 51.1k PB 。
****亚马逊。据亚马逊网络服务(AWS)首席布道者杰夫巴尔(Jeff Barr)称,据报道,截至 2021 年,超过 100 万亿个对象存储在亚马逊简单存储服务(S3)中。假设对于一个普通的存储桶,每个对象的大小为5mb,这使得曾经存储在 S3 的文件的总大小大约等于500 EB(EB)。
LHC。由于受控的实验条件和科学结果的公布,在这种情况下可以获得更详细的信息。
在最近一次运行(2018 年)中,LHC 在四个主要实验中的每一个实验中都产生了大约每秒 24 亿次粒子碰撞——即 ATLAS 、 ALICE 、 CMS 和 LHCb 。这为每次碰撞提供了大约 100 兆字节(MB)的数据,因此预计每年大约有 40000 兆字节的原始数据。**
然而,以目前的技术和预算,存储如此大量的数据是不可能的。此外,只有一小部分数据是真正感兴趣的,所以没有必要记录所有的信息。因此,使用硬件和软件触发选择系统,绝大多数原始数据被直接丢弃。因此,记录的数据量*降低到大约每天 1 PB,这使得在 2018 年的最后一次数据采集期间得到 160 PB** 。***
除了 LHC 收集的真实数据,物理分析还需要将实验结果与根据当前理论模拟的蒙特卡罗数据进行比较。除了实际记录的信息之外,这产生了将近 1.5 倍的数据。
此外,CERN 社区已经在努力增强大型强子对撞机的能力,用于所谓的 高亮度 LHC (HL-LHC) 升级。在这种新的体制下,预计到 2026 年,生成的数据将以系数 ≥ 5 的速度增长,并每年产生约 800 PB 的新数据。
此外,由于全球 LHC 计算网格(WLCG) 的存在,收集的数据被持续传输,以允许世界各地的研究人员进行研究,从而在 2018 年产生了 1.9k PB 的年流量。
关于 LHC 数据产生的更详细的解释见[1]。
结论
尽管官方数据的缺乏阻碍了对单个组织产生的海量数据的准确估计,但对原子数据生产单位及其规模的推理可能会提供有趣的见解。
例如,流数据(例如网飞、电子邮件和 WLCG 传输)已经占据了大数据市场的很大一部分,并且由于能够生成和共享数据的智能日常对象的广泛采用,它们的影响在未来几年可能会继续增加。
然而,最令我震惊的是,科学数据在大数据现象中也发挥着重要作用,其数量堪比一些最知名的商业参与者!
总而言之,数据生产率正处于巅峰状态,并且在未来几年将继续增长。很高兴看到这些估计将如何随着时间的推移而演变,以及这些组织的相对贡献在几年后是否会发生变化。
现在我真的很想知道你怎么看T21什么引起了你的注意!****
你觉得提供的数字合理吗?它们在多大程度上反映了你的个人经历?
有没有你认为应该加入比较的重要大数据源或组织?随意分叉用于可视化的代码并自己集成!
参考文献
[1] L. Clissa,2021 年大数据规模调查 (2022), arXiv
你的样本量应该有多大?
原文:https://towardsdatascience.com/how-big-should-your-sample-size-be-54ab2154c152
每个数据科学家都应该知道的一个方便的小公式

Artturi Jalli 在 Unsplash 上拍摄的照片
你正在与首席执行官和管理团队开会。
产品团队正在推销一个新产品创意。它有很多很酷的功能,可以与公司目前的产品顺利配合。他们认为现有客户会喜欢它。他们认为这是从客户群中增加钱包份额的好方法。他们向首席执行官申请预算来制造产品。
销售团队不太确定。他们认为现有客户没有迫切的理由购买新产品——他们认为这是一种维生素,而不是止痛药。他们认为大多数顾客不会购买。他们认为建造它是浪费金钱。
他们都把目光投向了首席执行官,但她还没有做好决定的准备。她非常精通数据。她想对现有顾客的随机 样本进行调查,看看他们中有多少人想要购买新产品*。
她转向你。你能计算一下数字,让我在今天结束前知道我们应该调查多少客户吗?我希望误差幅度为正负 3 个百分点。
你以闪电般的速度回复:约 1100 个客户。
她被你的反应速度惊呆了。哇,真快。
你尽量显得谦虚:-)。
她继续说道。调查 1100 名客户成本太高。假设我可以有正负 5 个百分点的误差。那么有多少顾客?
你的另一个即时回应: 400 个客户。
这样更好。她求助于营销团队。让我们对 400 名顾客做一个随机调查,结果出来后我们再见面。
首席执行官离开了。会议结束。
人们聚集在你周围。你是怎么做到的?
简单。这就是得心应手的小公式(来源)。

有了这个,你可以使用你的手机计算器快速找到任何误差范围的近似样本大小。
但是一些误差幅度的数字——1%、3%和 5%——在商业世界中是如此普遍,以至于你应该记住这些结果。毕竟,表现出进行闪电般的心算比拿出手机更令人印象深刻;-).

还有一件事。你也可以翻转公式。

现在,您可以处理“反向”问题:我只能调查 250 名客户。在那种情况下,误差幅度是多少?
没问题。拿出手机的计算器,算出 1/(250 的平方根)就是 0.063(即 MOE 正负 6.3)。
不错吧。
就是这样。勇往直前,给人留下深刻印象!😃
这个公式从何而来?
让我们从一个古老的统计问题开始。
我们应该随机抽取多少人的样本,这样我们才能在正负 MOE 的误差范围内,以 95%的置信度**估计人口比例?
在我们的例子中,
- 人口=所有现有客户
- 人口比例= %所有想要购买新产品的现有客户
- MOE =回想一下,CEO 首先要求 3%的误差幅度,后来要求 5%
上面这个老生常谈的问题有一个老生常谈的答案:

p 是样本比例——表示将购买该产品的受访者的百分比。
但是我们还没有做调查,所以我们不知道 p,事实上,这里的重点是要找出 p,对吗?).那么我们将把什么代入 p 的公式呢?
一点数学知识就能拯救我们。
原来,对于 0 和 1 之间的 p ,这总是正确的:

(你可以画出来自己确认或者只是做一点微积分证明)
因为样本大小

最多是还是

原始公式可以近似为:

请注意,由于中没有 p

我们已经解决了“不知道给 p 插什么”的问题。
接下来,请注意,1.96 (0.5) = 0.98 仅略小于 1.0。所以这个

可以近似计算为

将所有这些放在一起:

我们完了!
重要警告:由于我们正在进行简化,这个公式是保守的。 如果 p 的真值远离 0.5,它将推荐一个多余的样本量。
如果您可以从之前的类似调查中猜测出 p 的可能值,您可以在此公式中使用 p 的值。

是的,她知道人们在调查中告诉你的可能并不是他们实际会做的。这里有一个有趣的最近的例子(来源)😗
研究人员询问了 100 个人,一个理智的人是否会解锁他们的手机,并交给实验人员进行搜索。大多数人说没有。然后研究人员让另外 103 个人打开他们的手机,交给他们。其中 100 人照办了。
-
*置信水平不一定是 95%,但有两个原因使用它。
-
这在商界很常见
-
对我们来说很方便的是,相关的 Z 分数 1.96 很好地乘以 0.5,得到一个接近 1.0 的数字,这导致了样本大小的超级简单的公式。
要使用不同的置信水平,您需要用上面公式中的其他值替换 1.96。更。
如果你喜欢这篇文章,你可能也会喜欢这些(我意识到我听起来像一个推荐引擎:-)。
一个有抱负的数据科学家如何找到并从事现实世界的项目?
我在网上上过一些课程。接下来呢?

图片由作者通过 Canva 提供
作为一名有抱负的数据科学家,获得经验和提高技能的最佳方式之一是参与现实世界的项目。这不仅能让你在实际工作中应用所学知识,还能让你学到新东西,开发一个作品集,用来向潜在雇主展示你的技能。
事实是,我们几乎所有人都知道现实世界项目的价值。当你找到一份工作时,你总是会在这些方面努力,但遗憾的是,大多数数据科学职位都要求经验。这让我们陷入了一个令人沮丧的循环:你的第一份工作需要真实世界的经验,而你的第一份工作需要真实世界的经验。那么问题来了,如何打破这个循环?
在我给出建议之前,我想对你说实话。
我要概述的东西都不容易。如果简单的话,我们会让最受欢迎的机器学习课程的所有480 万名学习者都成为数据科学家。不需要对每个人都这样。但是,如果你遵循建议,投入工作,超越在线课程,你可以成长为一名数据科学家。
有了这个坦诚的对话,让我们一步一步地来处理这个问题,假设你刚刚完成了的一系列在线课程,想知道你的下一步是什么。
步骤 0:加入数据科学社区或 meetup 小组
你可以从在meetup.com或eventbrite.com上搜索你所在地区的数据科学聚会团体开始。或者,你可以关注最近的本地礼堂或共同工作空间的社交媒体页面,通常这些聚会都在那里举行。我就是这么做的。
我记得在我早期,一个叫做 Hatch Works 的新合作空间出现了。因为方便,我会参加那里举办的每一次数据科学会议。99%的时候,人工智能行业的高级专业人员会介绍他们的工作,提炼出一个不断发展的话题,甚至讨论他们组织中的工作机会。
我带着新的项目想法离开大多数 meetup 活动,我想把这些想法添加到我的个人项目中,在工作中尝试,或者至少写下来。
成为当地社区/聚会团体的积极成员:
- 将您带入当地数据科学行业的核心。
- 给你提供与你未来工作相关的多个项目想法
- 创建一个同伴支持系统,您以后可以与他们合作
- 打开人际关系网的机会,这可能会带来一份工作
之所以称之为零步,是因为你可以从今天开始…嗯..现在!
步骤 1:在在线数据科学竞赛网站上试试这个
如果你刚刚完成几门在线课程,你还没有准备好现实世界的项目。没有人是。
数据不足以训练机器学习模型。即使你有数据,它要么是混乱的,不平衡的,丢失的,或者有隐私问题。长久以来,这一直是人工智能产业最紧迫的瓶颈。
为什么不满足于对初学者更友好的东西,然后慢慢过渡到现实世界的项目呢?查看在线数据科学竞赛网站,如 Kaggle 和 DrivenData 。
根据你现有的知识选择一个过去的比赛。数据集通常来自真实的公司,但经过清洗和屏蔽以隐藏私人信息。他们有解决方案和指导教程,可以帮助你习惯数据预处理、分析、训练和调优机器学习模型。
大多数初学者直接尝试现有的比赛,当他们在比赛排行榜中无处可去时会感到沮丧。他们开始怀疑自己的技能,并回去做另一个在线课程。
常见的错误。
我们使用 Kaggle 或 DrivenData 的目的只是为了习惯解决机器学习问题。一旦你尝试过一两次过去的比赛,然后再尝试现场比赛。你永远不知道;结果可能会让你吃惊。
第二步:在 AI 为好项目做志愿者
我不是无薪实习的粉丝,但为开源做出贡献或为 AI 的好项目做志愿者是我继续做的事情。
许多组织,如非营利组织和政府机构,需要数据科学家来帮助他们分析他们的数据。自愿花时间为这些组织中的一个项目工作是获得经验并产生积极影响的好方法。
组织的选择和你想要支持的事业完全取决于你自己。我个人曾与 Omdena 合作过,那里从初学者到专家的人工智能实践者致力于解决端到端的现实世界问题。志愿服务很简单,只需一份申请和一次对创始人的简短采访。
除了为 AI 做好事,为开源做贡献还有其他几个好处。他们:
- 允许您与其他经验丰富的数据科学家合作,并向他们学习。这可以帮助你学习新技术,跟上该领域的最新发展。
- 对你的简历是很有价值的补充。许多雇主看重开源贡献,认为这是你能力和对该领域承诺的证明。
你要求真实世界的项目——你已经得到了最好的形式。
步骤 3:在获得认证的同时构建真实世界的数据组合
当你寻找真实世界的项目时,学习不必停止。
当我想同时获得技能和建立投资组合时,Udacity 是我的首选平台。到目前为止,我已经完成了三个纳米学位,不出所料,对数据科学家来说绝对最好的是数据科学家纳米学位(感谢使用我的 Udacity 附属链接,这意味着如果你选择购买,我会得到一小笔佣金,不需要额外费用,但我已经全额支付了我的费用。)你将参与的项目来自共享数据的合作公司,这就是他们要求你签署数据使用协议的原因。
如果你还是学生,或者发现他们的纳米学位很贵,你可能想看看他们的奖学金页面。他们定期举办奖学金项目,有可能你现在就可以申请。
当我透露这一点时,大多数人都感到惊讶:他们在纳米学位中包含的所有项目都在他们的 GitHub 上开源,等待你完成并添加到你的数据组合中。
不相信我?这是给数据科学家纳米学位的。
第四步:通过实习进入人工智能行业
一天结束时,没有什么可以取代你在一份合适的工作中获得的经验。这是事实。
因为你是一个绝对的初学者,考虑从数据科学实习开始,或者从事涉及数据分析和可视化的自由职业者或合同工。几乎我所有的自由职业工作都来自于那些在网上看到我的工作并问我是否能帮助他们的潜在客户。这些经历可以在你没有工作的情况下展示你的技能。
最终,要说服雇主雇用你,你需要展示你的数据科学技能。就这么简单。步骤 0-3 主要用于此目的。我已经写了一个广泛的指南来帮助你获得你的第一份实习。本文长话短说:
- 获得技能(你已经做到了)
- 创建至少一个可论证的项目(你有多个)
- 停止在线申请(阅读为什么
- 获得内部推荐(返回步骤 0)
- 为面试做准备和练习(我需要在以后写这方面的东西,但现在,这里是我最喜欢的频道,作者艾玛·丁
- 面试后向招聘人员寻求反馈(他们也希望你成功)
- 从长计议(稍后会详细介绍)
我知道这在开始时会让人不知所措。最难的部分是没有方向的停滞不前。通过阅读这个,你已经克服了那个。如果你真的喜欢数据科学,你很快就会开始工作。
总结想法:玩长线游戏
最终,作为一名有抱负的数据科学家,积极主动和持之以恒是发现和从事真实项目的关键。
通过加入数据科学会议小组、参加在线竞赛和论坛、自愿花时间解决有影响的问题以及从事个人项目,您可以获得宝贵的经验并建立强大的工作组合,这将有助于您成为一名数据科学家。
找工作的底线在于理解所有的招聘者都在寻找有经验的候选人,与级别无关。
即使在我现在面试的时候,经过 4 年多的经验,我也必须展示我领导团队通过交付可扩展的机器学习系统来解决业务问题的能力。这是一个你不断提升和证明自己的旅程。
玩长线游戏。
对招聘人员来说,给你提供你想要的工作是一件很容易的事情。
要获得更多关于数据科学、真实体验和学习的有用见解,请考虑 加入我的电子邮件好友私人列表 。
如果你很看重这些文章,想支持我这个作家,可以考虑 成为中等会员 。每月 5 美元,你可以无限制地阅读媒体上的故事。
https://arunnthevapalan.medium.com/membership
数据如何帮助识别增长市场和选址?

维塔利·巴拉科夫斯基在 Unsplash 上的照片
本文所表达的观点是我基于公开数据和工具得出的个人观点。
寻求发展的中小型企业有很多事情要做,既要维持当前的运营,又要寻找下一步的发展方向。许多人可能想知道……数据能做什么来帮助识别增长市场和评估网站?
我们认为在选址中使用数据识别增长市场的最大好处是:( 1) 更有效地利用选址时间和(2) 提高选择正确市场/区域/地点的可能性。
更有效地利用你的时间

卢克·切瑟在 Unsplash 上拍摄的照片
识别增长市场是一项耗时的任务。有时一个团队成员的任务是研究不同的市场,所以他们花大量的时间搜索关键指标,试图将它们整合在一起,并整理出它们的含义。或者,也许你和一个房地产经纪人合作,他提供一些数据和网站。
当这种情况发生时,团队可能会陷入熟悉的陷阱。我们自然更有可能寻找我们知道或有联系的地区,无论是以前在那里生活过,认识该地区的某人,还是在那里上学的团队成员。无论这种联系是什么,我们都倾向于熟悉的事物。然而,这也带来了封闭未知区域的风险,而这些未知区域可能更适合你的业务。
数据可以打开你可能没有想到的新区域,仅仅因为你不知道它们的存在。最重要的是,它只会向前推进与您的业务相关的领域,因此您不必为了找到正确的“未经雕琢的钻石”而对几个错误的领域进行排序。
因此,当我们说数据可以帮助团队更有效地利用时间时,我们的意思是它可以:
- 立即消除对你的业务没有意义的领域。
- 确定最有意义的领域(其中一些你以前可能没有注意到)
- 对这些区域进行排序和优先排序
消除对你的业务没有意义的领域意味着你不会浪费时间在对你来说不太可能成功的地区和领域。例如,如果您发现一个城市需要至少 25,000 的人口才能成功,您可以立即排除您所在区域(地区、州、县)中不符合该标准的所有城市。
那么,假设你想要高密度的餐厅和高千禧一代人口。现在,我们可以使用数据来寻找符合这一特征的地区——25,000 多名居民,高餐厅密度,高千禧一代人口。我们可以通过为您的业务添加新的过滤器来继续缩小搜索范围,如家庭收入、人口密度和人口增长。
在此基础上,我们可以选择对您的业务至关重要的内容,并开发一种评分算法。我们可以创建这样的计算:
- 人口规模的 20%权重
- 餐厅密度的 30%权重
- 占千禧一代人口的 15%
- 占家庭收入的 25%
- 人口增长 10%的权重
这一过程的结果是只过滤与您的客户人口统计相关的地理区域,然后对剩余的区域进行评分,这是一个符合您的标准的缩小的城市列表,按照定制的分数排序,优先考虑对您的成功最重要的数据点。
现在,您的团队可以花更多的时间在这个缩小的区域列表(县、城市、邮政编码)中进行辩论,并在该区域内搜索资产,从而更有效地利用您的时间,只关注最有可能成功的区域。
提高你找到正确市场的可能性
为你的企业选择一个新的市场、区域或地点并不是一门完美的科学。数据只是一个复杂难题的一部分,它包括你的产品的市场、适当的可达性(汽车交通/步行交通、街道临街面)、标志、空间的可用性和大小、成本/可负担性等等。
没有人应该承诺或保证数据可以明确地告诉你在哪里定位,或者一个网站会成功(我会厌倦任何人说数据本身就可以做到这一点)。相反,我们的理念是,数据可以提高做出正确决策的可能性,让人们更好地相信,该领域拥有让您的产品取得成功的正确因素。
上面概述的过程是这个过程的第一步。通过确定取得成功需要具备的条件,并寻找这些地点,你已经迈出了增加在正确市场取得成功的可能性的第一步。
现在,想象我们想更进一步。你已经找到了一个你喜欢的市场,并想采取下一步行动在市场中找到合适的位置。
假设我们想在一个城市开一家新的牙医诊所。医疗保健从业者经常瞄准人口统计数据、可识别的竞争和高启动成本,这使得该行业可以从增加对位置数据的访问中受益匪浅,以培养对这些大型投资的信念。
为了扫描市场寻找最佳区域,我们可以将一个区域分成半径不同的重叠圆圈。在每个圆圈中,我们收集与业务类型相关的数据,显示信息,并可以创建一个可定制的评分功能来寻找热点。
看看下面的图片——它将北卡罗来纳州的威克县(罗利及周边城市的所在地)分割成重叠的 5 英里的圆圈。在每个圆圈中,我们显示数据点,如人口、18 岁以下人口、增长、估计家庭收入、就业、竞争等。

区域中重叠圆的示例;作者图片
圆圈的颜色基于一个定制的评分函数,该函数有助于创建数据如何相互作用的单一优先视图,例如,当我们对竞争和收入和就业和人口增长……等等感兴趣时。
在页面顶部,我们可以为我们的评分功能插入输入框。评分函数本质上是一个加权平均值,将每个数据点与其最佳可能结果进行比较。例如,如果屏幕上任何一个圆的最佳人口数为 100,000,而一个圆的人口数为 75,000,则该圆的得分为 0.75。然后乘以用户指定的权重,并添加到等式的其他部分。

自定义评分示例;作者图片
其结果是一个地区细分,帮助企业进一步完善和关注他们应该在市场中的目标。现在,企业可以说“维克县西南部 Apex 和 Holly Springs 之间的一个地方”,而不是说“维克县的一家新牙科诊所”或“罗利的一家新牙科诊所”,因为知道该地区有合适的市场,他们可以取得成功。
更进一步,我们可以选择任何一个地址(比如说,一个潜在的租赁物业)并在我们的地图上画出来,看看周围地区根据我们的评分标准进行比较的情况。我们感兴趣的是,对于给定的数据点(下面的蓝点),周围的区域是否是深橙色的(更有吸引力)。

圆上输入点(蓝点)的示例;作者图片
结论
数据在商业中的主要价值是帮助做出更好的决策,而不是为某人做决定。它通过开放对信息和洞察力的访问来实现更好的决策,这些信息和洞察力与我们自己无法达到的规模或复杂性的决策相关。例如,在上面的牙科例子中,我们可能知道一个城市的人口,但我们不可能在给定点的 x 英里半径范围内计算它,也不可能一次又一次地这样做。
它并不完美,通常也不会回答所有的问题,但很多时候它的信息是以前无法获得的,可以有意义地影响或告知决策。
在我们的工作中,我们帮助企业获取、分析和访问这些信息,这些企业可以从更好地访问位置数据中受益。
想谈谈位置分析或这如何能让你受益?在 jordan@jordanbean.com,通过 LinkedIn 或电子邮件与我联系。
机器学习如何帮助视障人士
原文:https://towardsdatascience.com/how-can-machine-learning-help-visually-impaired-people-4fcdc76816b2
基于 DeepLabv3+的盲人室外障碍物识别方案

作者图片
多年来,我一直是视障人士的志愿者。在刚刚过去的新年前夜,我和一位盲人女士一起出去,这位女士生活了几十年,对她的邻居非常熟悉,但她仍然需要一双眼睛,以防人行道上出现意想不到的障碍:节日后被遗弃的圣诞树,非法停放的汽车,新的工地等。不幸的是,我们的志愿者比需要的少,因此一些盲人不得不等待几次才能有人陪同行走。
因此,我一直在想,当我的视障朋友单独使用机器学习时,我如何建议一种解决方案来帮助他们识别障碍。
在本文中,我提出了一种方法:
- 使用智能手机捕捉实时图像作为用于对象识别的深度学习模型的输入;
- 提供语音向导,让视障人士意识到道路上可能存在的障碍。
我现在将为这个项目的重要部分提供更多细节:具有深度学习的对象识别系统。本文用到的所有代码都可以在这个笔记本里找到。
资料组
物体识别系统可以通过语义分割来实现,即对输入图像中的每一个像素赋予语义标签(比如一棵树,一条人行道)。
准备适当的数据集是这项任务的一个重要步骤。
当我在巴黎做志愿者时,我将在城市景观图像的数据集上训练深度学习模型。原始 cityscapes 数据集可从 cityscapes-dataset.com获得,该数据集免费提供给学术和非学术实体用于非商业目的,如学术研究、教学、科学出版物或个人实验。
它包含带有 2975 个训练图像文件和 500 个验证图像文件的城市街道场景的标记图像。每个图像文件都是 256x512 像素,每个文件都是原始照片在图像左半部分的合成,在右半部分的旁边是标记的图像(语义分割的输出)。
这是一个图像的例子。

数据集中的样本城市景观图像
数据集对不同的物体有不同的颜色,我们可以通过快速浏览来快速识别一些颜色:蓝色代表汽车,红色代表行人,绿色代表树木,灰色代表建筑物,等等。
让我们从图像预处理开始。第一项调查得出的结论是,即使是单个图像蒙版也有不止 10K 种不同的独特颜色,因此我们需要一个“getlabel”函数来查找给定调色板中每个像素的最近颜色和有限的颜色值,并将每个颜色与一个标签关联为一个整数。关于更多信息,这个 Github 库提供了颜色标签和相关对象的完整列表。

作者图片:有 29 个颜色值的调色板
以下函数通过以下方式为模型创建训练和验证数据集:
1.分离输入和输出图像;
2.归一化输入图像;
3.将输出图像中的每个像素关联一个整数作为标签。
train_images=[]
train_masks=[]
val_images=[]
val_masks=[]
def getlabel(img):
*"""
turn a 3 channel RGB image to 1 channel index image
"""* height, width, ch = img.shape
m_lable = np.zeros((height, width, 1), dtype=np.uint8)
for w in range(width):
for h in range(height):
b,g,r=img[h, w, :]
m_lable[h,w,:]=np.argmin(np.linalg.norm(np.array([r,g,b])-color_palette,axis=1),axis=0)
return m_lable
def load_images(path):
temp_img,temp_masks=[],[]
images=glob(os.path.join(path,**'*.jpg'**))
for i in tqdm(images):
i = cv2.imread(i)
img = i[:, :256]
img = cv2.normalize(img, None, 0, 1, cv2.NORM_MINMAX, cv2.CV_32F)
msk = i[:, 256:]
label = getlabel(msk)
temp_masks.append(label)
temp_img.append(img)
return np.array(temp_img),np.array(temp_masks)train_images,train_masks=load_images(train_path)
val_images,val_masks=load_images(val_path)
训练模型
在本节中,我们将在 cityscapes 数据集上使用 DeepLabV3+ 构建一个语义分割模型。

DeepLab 是一个语义分割架构,它基于 DeepLab 和阿特鲁空间金字塔池(ASPP)方案。使用 ASPP 而不是经典池方法的原因是,随着采样率变大,有效过滤器权重的数量变小。
本文给出了 DeepLabV3+的结果,它是 DeepLab 的最新版本,通过添加编码器-解码器结构扩展了它的祖先 DeepLabV3。下面的代码通过构造扩展卷积块来构建 DeepLabV3+,扩展卷积块包含一个卷积层,后跟一个批处理归一化层和 ASPP,后者包含一个平均池、一个 1*1 卷积块、一个上采样层,后跟一系列具有递增扩展速率的卷积块。
def convolution_block(
block_input,
num_filters=256,
kernel_size=3,
dilation_rate=1,
padding=**"same"**,
use_bias=False,
):
x = layers.Conv2D(
num_filters,
kernel_size=kernel_size,
dilation_rate=dilation_rate,
padding=**"same"**,
use_bias=use_bias,
kernel_initializer=keras.initializers.HeNormal(),
)(block_input)
x = layers.BatchNormalization()(x)
return tf.nn.relu(x)
def DilatedSpatialPyramidPooling(dspp_input):
dims = dspp_input.shape
x = layers.AveragePooling2D(pool_size=(dims[-3], dims[-2]))(dspp_input)
x = convolution_block(x, kernel_size=1, use_bias=True)
out_pool = layers.UpSampling2D(
size=(dims[-3] // x.shape[1], dims[-2] // x.shape[2]), interpolation=**"bilinear"**,
)(x)
out_1 = convolution_block(dspp_input, kernel_size=1, dilation_rate=1)
out_6 = convolution_block(dspp_input, kernel_size=3, dilation_rate=6)
out_12 = convolution_block(dspp_input, kernel_size=3, dilation_rate=12)
out_18 = convolution_block(dspp_input, kernel_size=3, dilation_rate=18)
x = layers.Concatenate(axis=-1)([out_pool, out_1, out_6, out_12, out_18])
output = convolution_block(x, kernel_size=1)
return output
def DeeplabV3Plus(image_size, num_classes):
model_input = keras.Input(shape=(image_size, image_size, 3))
resnet50 = keras.applications.ResNet50(
weights=**"imagenet"**, include_top=False, input_tensor=model_input
)
x = resnet50.get_layer(**"conv4_block6_2_relu"**).output
x = DilatedSpatialPyramidPooling(x)
input_a = layers.UpSampling2D(
size=(image_size // 4 // x.shape[1], image_size // 4 // x.shape[2]),
interpolation=**"bilinear"**,
)(x)
input_b = resnet50.get_layer(**"conv2_block3_2_relu"**).output
input_b = convolution_block(input_b, num_filters=48, kernel_size=1)
x = layers.Concatenate(axis=-1)([input_a, input_b])
x = convolution_block(x)
x = convolution_block(x)
x = layers.UpSampling2D(
size=(image_size // x.shape[1], image_size // x.shape[2]),
interpolation=**"bilinear"**,
)(x)
model_output = layers.Conv2D(num_classes, kernel_size=(1, 1), padding=**"same"**)(x)
return keras.Model(inputs=model_input, outputs=model_output)
model = DeeplabV3Plus(image_size=IMAGE_SIZE, num_classes=NUM_CLASSES)
model.summary()
loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=0.001),
loss=loss,
metrics=[**"accuracy"**],
)
history = model.fit(train_dataset,validation_data=val_dataset, epochs=15)
这是 15 个训练时期的训练准确度和验证准确度的曲线图。经过 15 次训练,验证准确率达到 84%。


作者图片:准确性(左)与验证 n 准确性(右)
我们可以用这个模型来识别照片中的物体。本文开头有一个模型预测的图像遮罩,有下图。

作者的图像:作为模型输入的原始图像
后续步骤
为了说明这个想法,我在非常著名的城市景观数据集上训练了一个模型,该数据集取自驾驶车辆,这在实践中可能是不够的,因为视障者以不同的行为行走。为了避免偏见,最好直接从盲人的智能手机上收集数据。
有了深度学习提供的客观识别,我建议在系统中加入语音引导,只要设备检测到障碍物,就向用户发出警告。
此外,对于盲人来说,知道他们离障碍物有多远也是有用的。我们当然可以用标记数据训练另一个深度神经工作。缺少这样的数据集,我给她一个简单的代数计算,作为利用针丨孔丨相机模型对用户与物体距离的第一次估算:即图像上物体的大小与现实生活中物体的大小之比,与焦距和到物体的距离之比相同。因此,我们可以通过焦距*实际高度/图像高度来估计距离。
结论
在这篇文章中,我给出了一个可能非常幼稚的项目建议,关于我们如何通过深度学习来帮助视障人士。
作为一项重要的任务,外出永远不会是盲人的唯一需求,日常生活中的其他活动有时也具有挑战性:阅读电子邮件、购物、医疗访问等。不幸的是,我们与环境的大多数互动都是通过视觉实现的,我相信人工智能至少可以为盲人消除一部分这种限制。我愿意接受更多的建议和讨论。
参考
[1]使用 DeepLabV3+的多类语义分割:【https://keras.io/examples/vision/deeplabv3_plus/
[2]用于语义图像分割的阿特鲁可分离卷积编解码器:【https://arxiv.org/pdf/1802.02611.pdf】T4
[3]复习:DeepLabv3 —阿特鲁卷积(语义分割):https://towardsdatascience . com/Review-DeepLabv3-atrous-卷积-语义-分割-6d818bfd1d74
熊猫如何应对大数据集?
原文:https://towardsdatascience.com/how-can-pandas-cope-with-big-datasets-c5a08446230
管理大量数据的策略

照片由 Kayla S:https://www . pexels . com/photo/a-熊猫-笼子里的熊-4444036/
谈到用 Python 进行数据操作,Pandas 可以说是最受欢迎的模块。它有巨大的效用,包含了大量的特性,并拥有强大的社区支持。
也就是说,Pandas 有一个明显的缺点:它的性能水平随着数据集的增大而下降。
使用 Pandas 处理较大数据集的计算需求会导致长时间运行,甚至可能由于内存不足而导致错误。
虽然追求更擅长处理大型数据集的其他工具可能很诱人,但首先探索可以用来处理 Pandas 大量数据的措施是值得的。
在这里,我们涵盖了用户可以使用 Pandas 来节省内存和处理大量数据的策略。
注:每个策略都将通过由 Mockaroo 生成的假数据集进行演示。
1.加载较少的数据
从数据框中移除列是数据预处理中的一个常见步骤。
通常,在加载数据后,这些列会被忽略。
例如,下面的代码加载模拟数据集,然后省略除 5 列之外的所有列。
虽然在大多数情况下这是一种可行的方法,但这是一种浪费,因为您要使用大量内存来加载甚至不需要的数据。我们可以用memory_usage函数测量模拟数据集的内存使用情况。

代码输出(由作者创建)
一个更好的解决方案是在数据加载过程中省略掉不需要的列。这将确保内存仅用于相关信息。
这可以通过usecols参数来实现,该参数允许用户在加载数据集时选择包含的列。

代码输出(由作者创建)
单独包含该参数会显著降低内存消耗。
2.使用节省内存的数据类型
只要为相关变量选择适当的数据类型,就可以节省大量内存。
如果用户没有为每个变量显式选择数据类型,Pandas 模块将默认为其赋值。

代码输出(由作者创建)
虽然这是一个很方便的特性,但是就内存效率而言,分配给每一列的数据类型可能并不理想。
减少内存使用的一个关键步骤是手动为变量分配最节省内存的数据类型。
数值变量的数据类型
Pandas 模块对数值变量使用 int64 和 float64 数据类型。
int64 和 float64 数据类型提供最大数量和精度的值。但是,反过来,这些数据类型需要最多的内存。
下面是模拟数据集的总内存消耗。

代码输出(由作者创建)
幸运的是,处理较小数值或精度的变量不需要这种消耗内存的数据类型。
例如,在模拟数据集中,较小的数据类型将满足像age、weight、income和height这样的变量。让我们看看在为这些变量分配新的数据类型时,数值数据的内存是如何变化的。

代码输出(由作者创建)
转换数据类型的简单操作可以大大减少内存的使用。
注意:使用不适应变量值的数据类型会导致信息丢失。手动分配数据类型时要小心。
请注意,income列被赋予 int32 数据类型,而不是 int8 数据类型,因为该变量包含更大的值。
为了强调选择正确数据类型的重要性,让我们将数据集中的原始收入值与 int32 和 int8 数据类型的收入值进行比较。

代码输出(由作者创建)
如输出所示,选择错误的数据类型(在本例中为 int8)会改变值,并妨碍任何后续数据操作的结果。
清楚地了解您的数据以及可用数据类型(例如 int8、int16、int32 等)提供的值的范围。)在为感兴趣的变量分配数据类型时是必不可少的。
为了提高内存效率,一个好的做法是在用参数dtype加载数据集的同时指定数据类型。
类别变量的数据类型
通过将分类变量指定为“category”数据类型,也可以节省内存。
作为一个例子,让我们看看在将“category”数据类型分配给gender列之后,内存消耗是如何变化的。

代码输出(由作者创建)
显然,这种转换大大减少了内存的使用。
然而,这种方法有一个警告。当“category”数据类型的列包含大量的唯一值时,它会消耗更多的内存。因此,这种转换不是对每个变量都可行的。
为了突出这一点,我们可以检查这种转换对数据框中所有分类变量的影响。

代码输出(由作者创建)
如输出所示,虽然转换后gender和job列的内存使用较少,但是first_name和last_name列的内存使用较多。这可能是因为数据集中存在大量唯一的名字和姓氏。
出于这个原因,在为列分配“category”数据类型以节省内存时要小心。
3.分块加载数据
对于太大而不适合内存的数据集,Pandas 提供了chunk_size参数,允许用户决定每次迭代应该导入多少行。
当给这个参数赋值时,read_csv函数将返回一个迭代器对象,而不是一个实际的数据帧。

代码输出(由作者创建)
获取数据需要遍历这个对象。通过将大型数据集分割成较小的部分,可以在不超出内存限制的情况下执行数据操作。
在这里,我们遍历数据集的每个子集,过滤数据,然后将其追加到一个列表中。
之后,我们使用concat函数将列表中的所有元素合并在一起,以获得一个完整的数据集。

代码输出(由作者创建)
熊猫的局限性
熊猫可能具有处理大量数据的功能,但在“大数据”面前它们是不够的,这些数据可能包含许多千兆字节或兆兆字节的数据。
该模块在 CPU 的一个核心中执行其操作。不幸的是,一旦内存使用和计算需求达到一定的水平,用一个处理器执行任务是不可行的。
对于这种情况,有必要实现类似并行处理的技术,这需要在一台机器的多个内核上运行一个任务。
Python 提供了像 Dask 和 PySpark 这样的库,它们整合了并行处理,使用户能够以更快的速度执行操作。
也就是说,这些工具主要专注于处理数据密集型任务,可能不会提供与熊猫相同的功能。所以,除非必要,否则最好不要依赖它们。
结论

照片由 Prateek Katyal 在 Unsplash 上拍摄
虽然 Pandas 主要用于中小规模的数据,但对于使用稍微大一点的数据集的任务,不应该避开它。该模块具有帮助容纳更大量数据的特征,尽管程度有限。
Pandas 库经受了时间的考验,仍然是数据操作的首选库,所以除非万不得已,否则不要急于跳到其他解决方案。
我祝你在数据科学的努力中好运!
我们如何弥合公平性研究和真实世界用例之间的差距?
作者聚焦
康纳·奥沙利文反思了沟通、写作和算法公平日益增长的重要性。
在 Author Spotlight 系列中,TDS 编辑与我们社区的成员谈论他们在数据科学领域的职业道路、他们的写作以及他们的灵感来源。今天,我们很高兴与 康纳·奥沙利文 分享我们的对话。

照片由康纳·奥沙利文提供
Conor 是一名数据科学家,拥有银行和电信行业的丰富经验。他最近决定攻读博士学位,重点研究可解释机器学习(IML)。
你进入数据科学的起点是什么,到目前为止,它如何塑造了你的职业道路?
我的第一个数据科学职位是在一家银行的风险分析部门。这是一个研究生项目,我获得了一些很棒的经验。我能够处理大型数据集并构建有影响力的模型,包括用于大规模自动化借贷的信用风险和欺诈模型。在那里的时候,我接触了可解释机器学习和算法公平性。这激发了我对这些领域的兴趣,这也是我为 TDS 写的大部分内容。我还将在 9 月开始攻读博士学位,在那里我将研究可解释的机器学习。
你觉得你在数据科学和 ML 工作中的哪个部分最困难?
总的来说,我发现交流很有挑战性。这包括与您的(非技术)同事交流分析或模型的结果。我认为这是许多数据科学家都在努力解决的问题,因为我们来自技术背景。改善沟通是一项艰苦的工作,也是一个持续的过程。这是我开始写作的主要原因之一。它对我的沟通技巧创造了奇迹。
对于希望更有效地沟通的数据专业人员,您有什么建议吗?
对于展示技巧,你需要尽可能多地抓住机会展示你的作品。开始时可能会很痛苦,但这是改善的唯一途径。事先练习演讲也很重要。它不需要完美。你只需要知道你想说什么。
对于一般的沟通,总是过度沟通。收到信息时,你应该问尽可能多的澄清问题。回答问题时,总是给出比你认为必要的更多的信息。同时,尽量保持事情的清晰和简洁。
另一个策略是,在项目过程中,始终保留一份决策的电子邮件记录。理想情况下,这应该包括决策的合理性和其他团队成员的同意。在一个项目的后期,当你忘记了为什么要做一个决定时,这是一个很大的帮助。更悲观地说,它还能在你做出错误决定的情况下保护你。
你如何决定处理哪些项目?
作为一名数据科学家,了解最新的工具和技术非常重要。这是我在研究生期间发现的难点。为银行工作,你必须处理过时的工具和遗留代码。你也很难控制你能使用什么工具。我意识到我需要积极寻找能让我接触到最新工具的机会。最近,我一直在与一家金融科技初创公司合作。这是一次很棒的经历,因为我在用什么来解决问题上有很大的自由。
在去年的一篇 TDS 文章中,你 讨论了公开撰写数据科学文章的六大好处 。你提到了创造力、网络和货币化等等。你现在也是出于同样的原因写作吗?
是的,这六个原因仍然很重要。随着时间的推移,一些福利变得更加物质化。例如,我的声誉提高了,有人邀请我为其他平台和创业公司写稿。我也不得不承认,赚钱变得更重要了。读博士的时候,我把写作视为我的兼职工作;这是在津贴之外赚取额外收入的好方法。为 TDS 写作更好,因为我可以将我的文章与我的研究兴趣结合起来。我打算在我的整个博士学位期间写作,分享我一路上所学到的东西。
你最近写作的一个主题是机器学习和人工智能中的公平和偏见问题。是什么激发了你对这个话题的兴趣?
在我的研究生项目期间,我有幸与一个专门研究算法公平性的外部团队合作。这给了我很多实用的知识,我想分享一些。算法公平性的研究领域非常活跃,每天都有新的论文发表。然而,我认为这项研究和在工业中实际使用的东西之间有差距。在我最近的文章中,我试图弥合这一差距。我讨论了理论,但同时也完成了公平性分析和代码。希望这能使这项研究更容易应用到其他问题上。
你希望更多地关注这些问题会产生什么样的现实效果?
机器学习正在进入我们生活的方方面面。随着我们自动化更多的决策,我们需要确保这些决策是公平的:这种对公平的关注可以减少 ML 系统造成的伤害。同时,它将有助于在这些系统中建立信任,这将有助于增加 ML 的采用。
无论是在你自己的工作中,还是在更广泛的领域中,你希望在未来一两年内看到什么样的变化?
对于这个领域,我希望看到更多采用可解释的机器学习(IML)方法。我相信更好地理解我们的模型有很多好处。我们可以更确定他们将在生产中表现良好,他们不会造成伤害或不公平的结果。我们可以使用机器学习来自动建模数据中的关系。利用 IML,我们可以了解这些关系,这样 IML 也可以帮助我们产生新的知识。
对我自己来说,我将专注于我的博士学位。我对未来几年感到兴奋,我想尽可能多地了解 IML。在这一点上,我对我的博士方向没有 100%的把握。我想做一个理论上的贡献,也许是通过解决 IML 方法的一个常见的限制——特征独立性的假设。我还想将 IML 应用于气候变化或粮食安全等领域,在这些领域,有效的决策至关重要。
要了解更多关于康纳的工作和探索他的最新文章,请在 Medium 、Twitter 和 YouTube上关注他。您还可以直接从 TDS 档案中了解 Conor 的一些亮点:
- 可解释性与公平性的关系(2022 年 6 月,7 分钟)
- 可解释 vs 可解释的机器学习(2020 年 9 月,7 分钟)
- 特性好的特性(2021 年 11 月 11 分钟)
- 解释预言的艺术(2022 年 5 月,11 分钟)
- 什么是责任 AI?(2021 年 5 月,6 分钟)
想和广大观众分享一些你自己的作品吗?我们很乐意收到你的来信。
这个 Q & A 是为了长度和清晰而稍加编辑的。
Clearcover 如何将 ELT 的质量覆盖率提高 70%
以下是数据可观察性如何帮助一家领先的汽车保险提供商的数据工程团队更快地交付更可靠的数据

随着组织不断从更多来源获取更多数据,维护高质量、可靠的数据资产成为一项至关重要的挑战。这就是 Clearcover 在 ELT 及其他领域实现端到端数据可观察性的原因。以下是方法。
总部位于芝加哥的 Clearcover 是一家领先的技术驱动型保险提供商,他们为自己能够为全美客户提供快速、透明的汽车保险费率而自豪。他们也为自己的数据感到自豪,他们认为这是一种竞争优势,使他们能够兑现对消费者的承诺:节省资金,同时享受快速理赔、轻松支付和卓越服务。
最近,我与高级数据工程经理 Braun Reyes 坐在一起,讨论 Clearcover 在扩展自助服务数据平台的同时保持实现数据驱动任务所需的信任和质量的旅程,以及当数据可靠性问题开始出现时,他们如何应对。
Clearcover 的数据环境
当 Braun 加入 Clearcover 时,他是一个人的数据工程团队,并将数据堆栈描述为“数据用于分析”的方法。他在后端使用 Amazon RDS,将数据复制到 Redshift 的 Alooma,并在 Kubernetes 上运行 Apache Airflow 堆栈。Braun 还负责创建准备好的数据集。

Clearcover 的第一个数据堆栈依靠分析师直接查询来源,由一名数据工程师(Braun)负责清理、处理和存储准备好的数据。这导致了反复出现的瓶颈,减缓了分析速度和洞察时间。图片由 Braun Reyes 提供。
但是,由于他的一个人数据工程团队负责这么多层,瓶颈开始出现。Braun 花费更多的时间维护他的工具,而不是实际使用它们来传输数据。由于这些瓶颈以及缺乏对数据的可访问性(因此也缺乏对数据的信任),许多数据消费者通过直接查询源数据找到了解决方法。
“我在这个数据堆栈上的所有投资都是徒劳的。”
因此,随着数据工程团队的成长,他们迁移到了现代的分布式 ELT 数据堆栈。他们从 Airflow 转向 Prefect,并开始使用 AWS Fargate 来降低他们计算的总拥有成本。该团队还使用了 Fivetran 和 Snowflake,这为他们的需求提供了 Redshift 所缺乏的可访问性。

Clearcover 的“现代数据堆栈”发展到包括雪花、提督、dbt 和 Fivetran,以及独立的分析工程和数据工程层。图片由 Braun Reyes 提供。
现在,数据工程层变得更小,专注于处理原始数据,而独立的分析工程团队则利用他们提供的工具和原始数据来为业务生成准备好的数据,从而帮助消除这些早期的瓶颈。
问题:对源数据缺乏信任
虽然分布式数据堆栈使得将更多数据源集成到雪花中变得容易得多,但 Braun 的团队遇到了一个新问题:数据可靠性。
随着数据源的激增,对于数据工程师来说,跨管道手动扩展数据质量测试变得越来越困难。因此,虽然他们已经获得了对其数据的运营信任,但他们现在必须解决数据质量和信任问题。

当团队开始将数据源复制到雪花以加快分析工程工作流程时,他们遇到了两条路:手动编写数据质量检查(一个耗时且不可扩展的过程)或投资自动化覆盖。图片由 Braun Reyes 提供。
“ELT 很棒,但总有一个权衡,”布劳恩说。“例如,当您将 CRM 中的数据复制到雪花中时,您的数据工程团队不一定是 CRM 或营销系统领域的专家。因此,我们很难对所有这些来源进行量身定制的数据质量测试。”
当出现数据质量问题时,数据工程团队通常会大吃一惊。他们会收到来自数据消费者的 Slack 消息,询问为什么某个表已经几天没有刷新了。
布劳恩说:“你的管道正在运行,一切看起来都很好,但后来你意识到你提供的数据要么不正确,要么根本就没有到达。”“你一直专注于构建管道、交付管道和测试代码的运营方面,可能没有足够的带宽来考虑数据本身的健康状况。”
Braun 和他的团队知道他们需要获得一组基本的常识性检查,以提供建立数据信任所需的覆盖范围。但是,增加覆盖范围在他们的待办事项中不断下移,因为他们正忙于处理业务请求的新数据源。
因此,他们开始探索数据可观察性,这允许用户通过自动监控、警报和沿袭来获得可见性并了解其数据的整体健康状况。对于 Braun 和他的团队来说,通过可观察性的五个支柱(新鲜度、容量、分布、模式和沿袭)来衡量数据健康的概念立即引起了共鸣。
“在数据工程团队中,我们都非常注重简单性,以这种方式处理问题对我们来说意义重大。”
解决方案:跨关键 ELT 管道的自动化覆盖
有了数据可观察性,提供了数据健康问题的自动监控和警报,Braun 和他的团队对他们所有的表都有了即时的基本覆盖。
“我们不再需要为每个特定的数据资产定制特定的测试。”
关键步骤:减少带有 dbt 伪像的报警白噪声
由于 50 多个来源提供了大量数据,Braun 还希望确保他的团队不会因为实际上与业务无关的数据事件而受到警告和干扰。
为了减少来自自动化监控的噪音,他们围绕解析 dbt 工件构建了自动化,以确定准备好的数据包正在使用哪些原始表。然后,他们围绕标记这些表和将与这些关键资产相关的事件转发到专用通道建立了自动化。“我们希望将我们的注意力集中在企业正在使用的那些东西上,”布劳恩说。
“通过将这些关键资产隔离在特定的闲置渠道中,我的团队可以专注于这些特定事件。”
很快,这个监控策略产生了立竿见影的效果。Braun 的团队能够主动识别这些无声的故障,启动与利益相关方的对话,并更快地提前解决问题,而不是从分析或业务团队那里收到关于丢失或不正确数据的恐慌的松散消息。
Braun 和他的团队还能够开始防止数据问题影响业务。
“例如,我们不是 Zendesk 的领域专家,”Braun 说。“但是,如果我们收到警报,该数据源的某些模式从数字更改为字符串,我们可以联系 BI 团队并通知他们,这样当他们准备好的数据包在早上运行时,他们就不会遇到任何停机时间。”
解决方案:端到端沿袭将数据事件的解决速度加快了 50%
数据可观察性还提供了自动化沿袭,使数据团队能够全面了解从接收到 BI 仪表板的上游和下游依赖关系。这有助于数据工程团队理解模式变化或新集成的影响,并使进行根本原因分析和在出现问题时通知相关风险承担者变得更加简单。
Lineage 还有助于数据工程师了解潜在的下游影响,并发现隐藏的依赖关系。然后,他们能够联系到任何可能对该数据进行查询或将其纳入 Looker 报告的人。
解决方案:随着数据生态系统的发展,使用代码来扩展、自动化和定制监控
Clearcover 数据团队利用数据的可观察性来通过代码扩展谱系和监控。Braun 和他的团队可以编写定制的监控脚本,并在其 CI 工作流中轻松构建自动化,以添加更多的关系信息和上下文。
“我们确实有定制的管道和流程,或者像 JSON schema 这样的东西,需要超出开箱即用的机器学习监视器所提供的额外覆盖范围,”Braun 说。“因此,我们可以添加定制的现场运行状况监控器,为我们最重要和最复杂的资产和管道提供更多的上下文,甚至交付 SLA。”
由于这些自定义监视器位于自动化监视器之上,因此数据团队可以轻松设置新的 sli 并密切关注 SLA。“借助这些 JSON 模式监视器,我们能够将常识性的数据质量应用于 JSON 变体,发起对话,并让我们了解任何可能导致停机的潜在事件。”
结果:整个数据湖的质量覆盖率提高了 70%
在实施数据可观察性之后,Clearcover 在所有原始数据资产的质量覆盖率方面看到了 70%的增长。这导致了更主动的对话、更快的根本原因分析以及数据事件的减少。对于团队来说,整合来自 50 多个来源的数据不再是一个问题,他们知道当出现重复或其他异常时,他们会被覆盖。
Braun 说:“现在,我们可以开始进行主动对话,在利益相关方受到影响之前防止停机,而不是在某个东西损坏后才发现,然后匆忙修复它。”。“因此,至少这些数据在今天结束前仍能被公开。”
虽然该团队一直在考虑构建他们自己的根本原因分析和异常检测工具,但由于所需的数据工程资源,他们从未能够对其进行优先排序。有了数据可观察性,他们就有了两者的载体,而不会增加技术债务,也不会减少对定制代码的需求。
Clearcover 数据的下一步是什么?
Braun 希望推动数据可观察性在数据工程团队之外得到更广泛的采用,将其应用扩展到分析工程团队,甚至精明的业务用户。他认为,通过在整个组织中采用数据可观察性,对数据的信任程度只会增加。
好奇数据可观测性如何帮助您的组织实现数据质量覆盖并建立跨团队的数据信任?伸出手去 巴尔摩西 了解更多。
本文由 Will Robins 合著。
数据科学家适应联邦机器学习有多重要?
意见
联邦机器学习:一个新的机器学习婴儿

谷歌在 2016 年引入了联合学习这个术语,以标志着 ML 范式中新的机器学习方法的开始。联合学习解决了集中式和分布式训练方法的许多缺点。如果没有联邦学习的使用,我们就不会看到像谷歌助手中的“嘿谷歌”这样的高度改进的设备上机器学习模型。为了理解联合学习及其在当今物联网世界中的重要性,让我首先描述现有模型的缺点。
集中式/分布式培训
机器学习的概念始于集中训练。你将整个数据集上传到中央服务器,使用中央服务器训练机器学习模型,进行评估/测试,最后将其部署在中央服务器上。然后,客户端需要与远程部署的模型进行通信,以便对其数据进行推断。这种方法有严重的缺点。您需要将全部数据上传到服务器,即使对于中等规模的企业来说,目前的数据量也可能达到数 TB。这导致参与者和云服务器之间的高通信开销。将数据上传到云服务器还会损害数据隐私,从而违反 GDPR(一般数据保护法规)。另一方面,这种方法的优点是参与者从需要大量资源的计算责任中解脱出来。
分布式训练使用专门设计的机器学习算法来解决在大型数据集上操作的复杂算法中的计算问题。与集中训练中使用的算法相比,这些算法是高效的和可扩展的。多个参与者进行独立训练。中央服务器将这些训练集合起来,创建一个最终模型。我们在一个中央服务器上做收敛测试,如果准确度差,我们重复整个过程,直到我们达到可接受的准确度。您会看到整个方法需要大量的云资源。我们在云上部署最后一个模型,客户端必须连接到这个远程模型,以便对其数据进行推断。这种培训方法仍然没有解决数据隐私问题。
所以,联邦学习来了。
联合学习
联合学习采用了一种与我之前描述的传统培训有很大不同的培训方法。在这种方法中,通常从在集中式服务器上创建通用机器学习模型开始。这个初始模型充当所有参与进一步培训的参与者的基线。参与者从中央服务器下载基本模型。每个参与者通过使用其本地数据来改进该模型。作为一个小的集中更新,参与者将更改发送到服务器。通信使用同态加密或任何其他安全传输协议,确保数据隐私。我们不向服务器发送用户数据,我们只发送模型更新(神经网络中的权重)。
然后,服务器汇总所有参与者的学习成果,以改进基本模型。我们立即丢弃更新,以确保绝对的数据隐私。服务器将改进的模型发送给参与者用于进一步的个性化。我们反复运行这个过程来改进模型。在每次迭代中,服务器模型变得更好,对每个参与者来说更加个性化。
现在,让我们试着分析这种方法是如何克服早期模型的缺点的。
联合学习的好处
正如您从联合学习的工作中看到的,所有的训练数据都保留在您(参与者)的设备上。我们不会在云中存储单独的更新。事实上,谷歌为他们的联合学习使用了一个安全聚合协议。它使用加密技术,允许协调服务器解密 100 或 1000 个用户的平均更新。该协议不允许检查单个更新。这为参与者提供了完全的隐私。
显然,该过程本身允许创建动态更新的更智能的模型。随着我们不断与用户分享更新的模型,您将在使用您的设备(例如手机)时看到个性化。传统的分布式算法要求低延迟和高吞吐量。联合学习的本质不会导致这些需求。在服务器上聚集模型所需的功耗和计算资源也大大减少。
一些缺点
仅提一个缺点,在联邦学习中,数据分布高度不均匀。请注意,数百万台设备处理自己的个人数据。这些设备具有高延迟和低吞吐量的连接。不仅如此,这些设备只能间歇性地用于训练。为了解决这些问题,谷歌开发了联邦平均算法,这一领域的其他公司也是如此。另一个挑战是将这项技术部署到数百万台异构设备上。你需要在每台设备上安装一个缩小版的 TensorFlow 或任何类似的机器学习框架。
科技巨头们已经成功地解决了这些问题,这种技术有许多实际的使用案例,我将在下面讨论。
FL 使用案例
正如我前面提到的,谷歌助手使用联邦学习来不断改进“嘿谷歌”。设备上的培训通过不向云共享个性化语音消息来确保数据隐私。雅虎。百度、谷歌和 DuckDuckGo 都使用联合搜索索引来获得更准确的结果。苹果还使用联邦机器学习来改进他们移动设备上的模型,从而保护你的数据隐私。微软研究院推出了 FLUTE (联邦学习实用工具和实验工具)——一个运行大规模离线联邦学习模拟的框架。谷歌在 Android 上的Gboard使用 FL 作为下一个单词预测器。
数据科学家有什么?
跟随这些科技巨头的脚步,数据科学家现在可以将联合学习应用于许多潜在的行业。
例如,医疗保健和健康保险行业肯定可以从联合学习中受益。在这些行业中,数据隐私要求更加严格。联合学习保护敏感数据,提供更好的数据多样性——这通常在这些行业中观察到。数据来自医院、健康监测设备等等。数据多样性有助于诊断罕见疾病,并提供早期检测。
想象一家电子商务公司,如果他们有来自银行的客户消费能力和模式,他们将受益于更好的产品购买预测。当然,银行和电子商务是两个永远不会共享数据的垂直行业。然而,使用联合学习,两者都可以基于他们偏好的特征训练他们自己的 ML 模型;然后,我们可以由第三方管理人汇总模型参数,这最终将使双方消费者受益。
对于自动驾驶汽车来说,联合学习可以为乘客提供更好、更安全的体验。该模型可以利用交通和道路状况的实时数据进行学习。
还有许多行业,如金融科技(金融和技术)、保险以及物联网,都可以从 FL 中受益。数据科学家需要深入这些领域,为自己寻找更多业务。
有几个联合学习平台可供您开始您的 FL 之旅。Google 提供了一个基于 Tensorflow 的联邦学习平台——它被称为 Tensorflow federated 。英特尔发布了一个用于联合学习的开源框架,名为 openfl 。然后是 IBM FL 平台。英伟达克拉拉助力联邦学习。你可以搜索到更多。
结束语
如您所见,联邦学习克服了传统和分布式机器学习的许多缺点。重要的是,它提供用户数据保护,这是当今技术消费者的需求。FL 可以轻松处理数据多样性。它允许实时连续学习,并且对硬件资源不太费力。FL 开辟了许多跨领域的新模型开发机会。那么,你还在等什么?
https://medium.com/@profsarang/membership
信用
Pooja Gramopadhye —文字编辑
交叉验证如何出错以及如何修复
带有示例代码的特性选择用例

在 Unsplash 上拍摄的 ThisisEngineering RAEng
交叉验证是一种重采样过程,用于估计机器学习模型在有限数据集上的性能。该程序通常用于优化模型的超参数和/或评估最终模型的性能。然而,程序设计中有许多细微差别,可能会使获得的结果不太可靠,甚至是错误的。
假设您正在处理包含数百个要素的表格数据的分类问题。您决定根据其对应的带有结果标签的方差分析 f 统计来选择要素。
它是如何出错的——场景 1
首先对整个数据集执行要素选择策略,选择具有最高 f 统计值的前 k 个要素(其中 k 是任意数字)。之后,您决定进行交叉验证,并将带有所选特征的数据输入 CV 循环,以评估模型性能。

在 CV 之前对整个数据集执行特征选择会导致数据泄漏。图片作者。
这里你犯了数据泄露的错误。由于您执行的选择策略涉及了解整个数据集的结果标签,因此模型在训练期间可以使用有关验证集的知识,尤其是结果标签。这给了模型一个不切实际的优势来做出更好的预测,这在实时生产中是不会发生的。
它是如何出错的——场景 2
您希望选择 f 统计的 p 值小于特定阈值的要素,而不是选择任意数量的要素。您认为 p 值阈值是一个模型超参数,您需要对其进行调整以获得性能最佳的一组要素,从而获得性能最佳的模型。
由于 CV 以超参数优化而闻名,因此您可以通过对整个数据集执行该过程来评估一组不同的 p 值阈值。问题是,您使用这个 CV 估计值来选择最佳 p 值阈值(因此是最佳的特征集)和报告最终的性能估计值。

在同一个 CV 循环中将超参数调整与模型评估相结合,会导致对模型性能的乐观偏置评估。图片作者。
当结合超参数调整和模型评估时,用于评估的测试数据不再是统计上的纯数据,因为它们已经被模型在调整超参数时“看见”。超参数设置保留了现在形成测试分区的数据的部分“记忆”。每次在样本集上评估具有不同超参数的模型时,它都会提供有关数据的信息。关于数据集上的模型的这种知识可以在模型配置过程中被利用,以找到数据集的最佳执行配置。超参数可以通过利用样本的无意义的统计特性来调整。换句话说,每当在有限数据样本上评估的泛化性能的 CV 估计被直接优化时,超参数调整中的过拟合是可能的。CV 程序试图减少这种影响,但它不能完全消除,特别是当数据样本很小且要调整的超参数数量相对较大时。因此,您应该期望在以这种方式获得的性能估计中观察到乐观偏差。
如何修复
只有当分类器训练的各个方面都发生在 CV 循环内部时,CV 方法才被证明是无偏的。这意味着训练分类器的所有方面,例如特征选择、分类器类型选择和分类器超参数调整都发生在每个 CV 循环期间没有遗漏的数据上。在某些方面违反这一原则会导致对真实误差的非常有偏差的估计。
在场景 1 中,特征选择应该已经在每个 CV 循环中完成,以避免数据泄漏。
为了避免不希望的乐观偏差,模型评估必须被视为模型拟合过程的一个组成部分,并且每次模型拟合到新的数据样本时都要重新进行。
在场景 2 中,模型性能应该在一个完全不可见的测试集上进行评估,该测试集在超参数优化期间没有被触及。如果你的数据很小,以至于你不能负担一个单独的坚持集,那么应该使用嵌套 CV。具体来说,内部循环用于超参数搜索,外部循环用于通过在几个数据集分割上平均测试集分数来估计泛化误差。

模型性能应在超参数优化过程中未触及的完全不可见的测试集上进行评估。图片作者。

如果你负担不起一个单独的保持测试集,应该使用嵌套 CV。内环用于超参数搜索,外环用于估计泛化误差。图片作者。
嵌套 CV 的代码片段
Scikit-learn 确实有现成的方法来支持嵌套 CV。具体来说,你可以在内环使用GridSearchCV(或RandomSearchCV)进行超参数搜索,在外环使用cross_val_score估计泛化误差。
为了说明嵌套 CV 下发生了什么,下面的代码片段没有使用这些外壳方法。如果您希望实现的评分策略不被GridSearchCV支持,这个实现也会很有帮助。然而,这种方法只有在搜索空间很小的情况下才有效。对于更大的超参数搜索空间,Scikit-learn CV 工具是一种更整洁、更有效的方法。
值得注意的问题 1:如果我们在 CV 循环中应用特征选择策略,在生产模型中使用哪个特征集?
由于训练/测试分割的随机性,当我们在 CV 循环中应用特征选择策略时,很可能为每个外部循环找到的最佳特征集略有不同(即使模型性能可能在运行中几乎相同)。接下来的问题是:在生产模型中应该使用哪一组特性?
要回答这个问题,请记住:
交叉验证测试的是一个过程,而不是一个模型实例。
本质上,我们使用 CV 来估计整个模型构建过程在未来未知数据上的表现,包括数据准备策略(例如插补)、特征选择策略(例如用于单向 ANOVA 检验的 p 值阈值)、算法选择(例如逻辑回归 vs XGBoost)和特定算法配置(例如 XGBoost 中的树数)。一旦我们使用 CV 选择了获胜的过程,我们将对整个数据集执行同样的最佳执行过程,以得出我们的最终生产模型。CV 中的拟合模型已经达到了性能评估的目的,现在可以丢弃。
从这个意义上说,将获胜过程应用于整个数据集所输出的任何特征集都将在最终的生产模型中使用。
值得注意的问题 2:如果我们在生产模型的所有可用数据上训练一个模型,我们如何知道该模型将执行得有多好?
继续问题 1,如果我们将通过 CV 找到的最佳执行过程应用于整个数据集,我们如何知道生产模型实例将执行得有多好?
如果设计良好,CV 会给出性能度量,描述根据所有历史数据训练的最终模型的总体性能。您已经通过使用模型评估的 CV 程序回答了这个问题!这就是为什么确保你的简历程序设计得当是至关重要的。
数据和财务团队如何成为朋友(而不是敌人)
实用数据领导者系列的第一部分

照片记入juv artvia Shutterstock。
最近,我写了一篇关于在整个组织中形成的数据孤岛的文章,这通常是由于缺乏与合作伙伴的合作。这种一致性可能很难实现,但对数据领导者的成功至关重要。事实上,你可以说这种一致性对于经理级别及以上的任何数据科学家或工程师来说都是最重要的任务。
由于要支持一系列内部客户,数据团队可能会倾向于遵循装配线的原则,甚至是麦当劳的油炸厨师。每个人都吃同样的奶酪汉堡,只加两份泡菜。点菜吧。
但是,最好的数据团队能够解决不同合作伙伴(财务、产品、营销等)的问题,在他们所在的地方用定制的数据产品满足他们,这些产品超越了通用的现成解决方案。
这是一个关于与每个部门合作的最佳实践以及他们所有奇妙的怪癖的系列文章的第一篇。
这些挑战和摩擦点往往会超越行业和垂直领域,因为尽管数据类型或特定系统可能会有所不同,但每个部门的主要目标并没有变化(行为在很大程度上受激励因素的影响)。例如,在大多数公司,营销团队需要推动增长,财务团队需要为此做预算,数据团队需要衡量增长。
我们将从财务团队开始,深入探讨数据团队如何在优先级交叉的地方与他们协作。虽然这是为中型公司编写的(大约。1,000 到 5,000 名员工)利用现代数据堆栈,这些项目和技巧中的许多都可以根据您组织的特定需求进行调整。
将赢得您的财务团队的项目
在这里,我将主要关注战略财务或 FP&A 项目,如混合财务和非财务指标,以告知业务增长;策略;和投资。这是我看到与财务团队合作的大部分项目的地方。
另一方面,财务会计(如税务、工资)往往存在于一系列系统中,这些系统大部分都在数据平台之外,这没关系。
财务报告
如果你是一家上市公司或即将进行首次公开募股,数据团队很可能会与财务部门合作,向华尔街提交季度报告,并附带收益电话会议的数据。
为了实现这种报告,数据团队将管理复杂的管道,将来自商务系统的交易数据转换为客户级数据,详细说明特定的客户关系或购买的产品以及相关的收入。
财务团队将首先关注可靠性;没有一个首席财务官愿意重述季度收益。我发现这是少数几个可以精确测量准确性的地方之一,使用总账作为事实的来源。财务团队对准确性有很高的标准,因为他们对定期报告的每一分钱都负有责任——希望他们支持团队的分析数据标准不会降低。
数据应该有多及时?理想情况下,相同的数据可以被查询并用于每天的财务分析和报告。但最好是把准确性放在及时性之上,有可能提供独立的实时销售视图,而不需要精确到一分钱。
推而广之,首席财务官将关注财报中可能推动业务增长的相关数据,如日活跃用户(dau)、应用下载量或浏览量。准确性在这里往往更加主观——依赖于您对“用户”、“活跃”和“视图”的定义定义必须清晰、合理,并且在一段时间内保持严格的一致性,这样你才能对不同时期的趋势充满信心。换句话说,数据应该(至少)是方向准确的。
不言而喻,数据可观察性对于这些指标至关重要。您必须主动检测可能影响输出完整性的输入数据性质的任何变化。季度末的周转时间很紧,您不希望在编译和交付这些报告时发现数据问题。
预测和增长驱动模型
财务团队的真实预测。一旦数据团队支持财务报告,下一个合乎逻辑的步骤就是合作预测未来季度—销售、获得的新客户、客户流失。
数据团队可以提供关于正确建模方法的专业知识,但你可能会发现,你的财务同事更喜欢更简单的经验方法,而不是更精确但更难解释的模型,这使他们更容易调整假设、输入和模型参数。
当一个预测被错过时,你将希望能够快速诊断出原因,并生成广受欢迎的瀑布图。这些图表如此有效的原因是它们可以传达预测中不同类型的不确定性,如环境导致的差异、客户行为导致的差异以及无法解释的或随机的差异。

维基百科中瀑布图的一个例子。
虽然预测是一种操作机制,但它的战略对应部分是增长驱动因素的建模。数据团队应带头进行建模练习,探索与增长相关的最重要的产品和营销杠杆(即客户获取和保留)。
虽然这些模型在本质上是历史性的,但如果做得好,它们会暗示因果关系。例如,分析可能显示,如果我听许多不同流派的音乐,我更有可能保留我的 Spotify 订阅,但这是 Spotify 可以通过干预产品体验来影响的行为吗增加我的参与度和保留的可能性?
将这些模型与后续产品实验配对可以巩固这种因果关系。使用上面的例子,Spotify 可能会试验发现算法的类型多样性,以观察像我这样的客户是否会在算法编程更加类型多样化时增加他们的参与度和保留度。
对于财务团队来说,这些模型在规划业务的长期增长情景、告知如何为产品和营销指标设定目标以逐步实现增长目标方面特别有用。
营销归因和组合
通常,当谈到营销支出问题时,您会遇到营销(确定在哪里以及如何花钱)、财务(确定预算和盈利能力)和数据(确定如何衡量投资回报率)三驾马车。
鉴于平台“围墙花园”和第三方 cookie 的消亡,数据团队是否仍在尝试提供多点触摸属性,或者这已经成为一个不可行的方案?我见过数据团队在高管的命令下追逐完美归属的圣杯,却因跟踪限制而功亏一篑。
营销组合建模(MMM) 一直是我解决支出、渠道组合和投资回报问题的首选方法,使用时间序列模型来提供数字和非数字营销渠道的整体视图,说明如果营销支出从等式中移除,超出预期基数的增量销售额。
然后,您可以专注于每个营销渠道内的单个客户归属,以优化特定的优惠和信息,而无需尝试跨多个外部渠道跟踪客户。
定价、优惠&终身价值(LTV)
在营销团队和财务团队之间,有一些关键的定价决策——不同产品的价格点是什么,可以提供哪些有利可图的折扣,以及何时提高现有客户的价格?
早期的伙伴关系可能是围绕定价实验,将这些决策从行政猜测领域转移到一系列定价实验,在这些实验中,成功的衡量超出了最初的销售,以考虑客户保留和终身价值(LTV)。
通常,财务团队将根据客户保持率的综合假设,针对特定的活动或客户群对这一 LTV 指标进行建模。随着合作关系的巩固,数据团队的一个高影响力项目是将 LTV 的衡量从营销活动或团队层面转移到个人客户层面,纳入您对影响客户流失和追加销售的客户行为的了解。
然后,这些 LTV 分数可以存在于数据仓库中,并容易地应用于未来的实验和分析。一旦他们看到你可以衡量他们的定价策略的粒度,财务团队就会带着更多的假设回来进行测试。
与财务团队合作的成功秘诀
财务团队可能是数据团队最具战略意义的合作伙伴之一。关键是了解他们对数据准确性的存在需求,这种需求如何影响项目交付预期,如何最好地丰富他们记录系统中的数据,以及在这样做的过程中,如何与他们合作进行变革性的数据项目。请记住:
1。准确性和一致性至关重要
财务指标必须符合高标准的准确性,非财务指标必须始终一致,以便在财务建模和报告中有用。
准确性长期以来一直是宝贵的“数据质量维度”之一,但很少有数据产品可以客观地说明数据是准确的还是不准确的。财务数据是一个罕见的例外,在这种情况下,您的收入分析报告可以与总帐进行核对。
这里的关键是围绕金融数据产品的使用设定期望值。如果它用于外部报告,那么您可能需要在指定的时间窗口内精确到总账的每一分钱。另一方面,如果您打算将财务数据产品用于日常分析或建模,那么您的财务合作伙伴可能会接受较低的精确度,而倾向于更精细或及时的数据。
2。需求收集至关重要
你可能需要改变你的敏捷原则,使之更接近瀑布方法,因为在数据可靠性标准得到满足之前,发布是不可能的。
虽然敏捷过程将包括需求收集,但我发现在里程碑日期交付什么存在一定程度的不确定性。另一方面,财务团队要遵守严格的报告窗口,需要高度确定他们可以依赖哪些数据进行报告。
不可避免的是,新的数据产品或财务报告的变化将需要与现有流程并行运行一段时间,以建立对其准确性和可靠性的信心。
出于这些原因,您可能仍然能够运行敏捷流程,但是要准备好设置清晰的时间表和交付预期,以与财务团队的报告节奏保持一致。
3。嵌入优于移交
如果您可以在项目中嵌入一名财务团队成员,这将极大地改进业务规则和指标定义的翻译。
对于数据和财务团队来说,坐在地板的相对角落,来回抛出需求和解决方案,当另一个团队没有按照预期的里程碑交付时抱怨是很有诱惑力的。你可以连续几周坚持不懈地捕捉财务报告的详细要求,结果却错过了一些导致失败的关键细节。
毫不奇怪,更好的方法通常是在项目期间嵌入主题专家。您将看到互惠互利:数据工程师将能够与专家合作,定义业务规则和对数据的期望,财务团队将更好地理解构建可靠和值得信赖的数据产品所涉及的技术复杂性。
4。将数据处理带到上游
Excel 可能已经(很久以前)将其行限制增加到 2 ⁰,但是您可以处理仓库中更重的工作负载,并将财务逻辑从群组级别移动到客户级别。
众所周知,财务团队构建多层电子表格来支持业务运营,从粒度数据开始,嵌入复杂的逻辑来提供每周的业务绩效与预测报告。
数据团队可以与财务部门合作,详细阐述假设、输入和输出,使您能够在数据仓库中向上游运行这些计算,您可以在数据仓库中存储重要的业务逻辑、预计算场景,并开始在流程中引入更多自动化。
这样,您就可以用可配置的仪表板代替电子表格,减轻财务合作伙伴(和笔记本电脑)的负担,并在流程中对数据管道引入更强的质量控制。
5。经验模型可能是首选
在你向财务团队交付一个黑盒模型来预测客户流失之前,确保当他们需要每周调整假设时,这个模型对他们有用。
数据团队通常会发现一个问题,例如预测客户流失,并根据数十或数百个预测因素,匆忙应用高级技术来模拟每个客户流失的可能性。但这是你的财务合伙人想要解决的问题吗?它能满足他们的日常需求吗?
如果他们预测每周将有多少客户流失,那么您最好使用一个更简单的模型,根据任期应用观察到的或预期的流失率,或许还有一两个其他关键预测因素,以便财务团队可以轻松管理和调整预测。
记住这些事情,你会很快成为财务团队的朋友。
关注媒体上的我,了解更多关于数据领导力、数据科学应用和相关主题的故事。订阅,让我的故事发送到你的收件箱。
数据如何帮助我适应 4500 米的高海拔
关于如何利用数据为现实生活决策提供信息的快速、实用的方法

安娜·冈察洛娃在 Unsplash 上的照片
介绍
为了工作,我打算从加拿大温哥华到秘鲁的安塔米纳矿,在秘鲁的瓦拉斯停留 4 天以适应环境。4500 米的上升高度使空气密度下降了近 50%,这比 8000 公里的飞行更让我担心,因为有效氧气几乎是我在海平面所习惯的一半。这种数据很容易在网上找到(我在这里使用的是来自的数据),在下图中直观地显示出来,可以清楚地了解正在发生的事情。

三个主要位置的地图(左)和一个显示空气密度和可用氧气如何随高度降低的图形(右)。作者图片
除了同样的缓慢上升的一般攀岩技巧,这不是我的选择,我在网上找不到太多的建议。处理数据是我最擅长的,所以我决定下载一个心率监测应用程序,并记录我的经验,以帮助其他人寻找适应高海拔的实用技巧。
下面是一个关于我如何使用数据来准备和动态调整到非常高的高度的故事。使用数据为现实生活决策提供信息的一般工作流程也可以应用于其他情况,如准备跳伞或水肺潜水。
准备和方法
我的研究显示,跟踪我的心率将是我整个旅程的关键,因为我的心脏需要更努力地工作,才能将有限的氧气输送到全身。我查看了一名 25 岁男性在我跟踪的三种身体活动状态下的典型心率范围:
- 休息:平躺在床上
- 步行:测量前步行 3min
- 锻炼:测量前做 50 个俯卧撑
如下图所示,我发现了我必须注意的限制。也做了一些测试,测了心跳,检查是否在推荐范围内。

一名 25 岁男性在三种基本活动下的典型心率范围(左)和应用程序在海平面上每次活动的心率轨迹(右)。
首先,我需要测试应用程序,并确保我得到一些可重复的结果。我在三种身体活动状态下测量了四次我的心率,并复制了我的测量结果,看它们如何比较。该应用程序测量约 10 秒钟,并以每分钟心跳数(bpm)为单位报告心率。
如下图所示,这款应用的可重复性非常好,足以满足我的需求,我对结果非常满意。正如预期的那样,可变性随着要求更高的活动而增加,因为有更多难以控制的变量,如行走或锻炼的速度。

app 在海平面上三种不同身体活动状态下的心率测量重复性结果,单位为每搏。
应用
首先,我确认我的心率在海平面的指导范围内,事实上,它比所有活动状态的平均值都要低一点,如下图所示。在每次停车时,如果我感到喘不过气来,我会检查我的心率,每当我超过既定的基线时,我就会停下来休息一下。我不得不在矿井中做一些体力劳动,并定期测量我的心率,我能够安全地这样做,并根据需要休息。

在海平面、海拔 3.0 公里和海拔 4.5 公里处测量的每次活动的心率。25 岁男性每次活动的典型范围已在背景中标出,关于心率测量值超过安全指南的部分用青色圈出。
我越往上走,氧气越少,日子就越难过。从海平面到海拔 4.5 公里,我的平均静息心率增加了近一倍。有时,当我认为我不需要使用我的心率并忽略这些数据时,我会很快感到头晕目眩。最终,我习惯了,对自己的极限有了很好的理解,但是利用这些数据,我能够快速安全地到达那个点。
随着我继续适应,我的心率逐渐下降。不幸的是,我没有测量它是如何在那个高度随时间调整而下降的,但是这些数据也会提供一些清晰的见解。
经验教训在 4500 米高度存活并茁壮成长
适应海拔 4.5 公里的环境仍然是一个挑战,尽管我从心跳数据中获得了有用的信息。研究和阅读其他到过高海拔地区的人的故事是非常有用的,因为我能够从他们的经历中学习并更好地准备。在我住院期间,我一直调整得更好,大约一周后,我完全停止了测量我的心率。
这是一个简短的视频,我在海拔 4.5 公里的安塔米纳矿不仅幸存了下来,而且还茁壮成长,这多亏了一点点数据。
简短的笔记
时刻考虑如何在生活任务中利用数据帮助自己!想出创造性的方法来使用数据并将其应用到决策中是非常有趣的。记录并与他人分享知识也是一种很好的体验,对将来做类似事情的人很有帮助。
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
数据如何帮助我们观察和保护世界
原文:https://towardsdatascience.com/how-data-helps-us-observe-and-preserve-the-world-a2c3de73a2f6
围绕气候变化及其对世界各地社区影响的坏消息铺天盖地而来,令人沮丧。毕竟,没有哪个数据科学家能够单枪匹马解决需要系统性行动和全球协作的问题。
然而,数据专业人员在迈向可持续发展的未来的过程中扮演着重要的角色。他们的技能和创造力使他们处于一个独特的位置,以评估当前的挑战,衡量拟议解决方案的效力,并提请我们注意人类对我们居住的世界的影响。
本周,我们重点介绍最近的一些文章,这些文章帮助我们以具体的、可操作的、绝对不是悲观的方式理解环境。让我们开始吧。
- 获取正确的数据至关重要 。尽管气候数据非常丰富,但玛丽亚·布鲁纳(maría br uner)正确地指出,“一些免费获得的数据可能不像人们想象的那样容易获得。”这个清晰而耐心的教程带领我们通过 R 获取和处理卫星生成的 NetCDF 文件,这是任何以气候为中心的项目至关重要的第一步。
- 见 见【字面】森林。仍以卫星地理空间数据为主题, Sixing Huang 最近发表了一篇文章,介绍了当前监测森林长期健康状况的方法——这可能有助于许多使用案例,如测量森林砍伐和预测野火风险。

丹尼尔·富内斯·富恩特斯在 Unsplash 上的照片
- 如何利用开放数据实现可持续发展 。如果不清楚太阳能等可再生能源满足需求的能力,就很难推广它们。【李昂-连】细致入微的演示展示了我们如何使用开源数据仓库(和几行 Python)来完成估算太阳能电池板输出的复杂任务。
- 另一种衡量可再生能源潜力的方法 。探索了太阳能之后,为什么不仔细研究一下风能呢?Abiodun Olaoye 在他的新文章中就是这么做的,这篇文章涵盖了一个预测风力涡轮机发电量的开源模块。
- 当你需要提醒什么是利害攸关的时候 。当我们置身于大自然中时,气候变化的压力很少是抽象的。不确定如何开始或去哪里?Evan Diewald 的最新项目可能会激发你拿起一瓶水,穿上舒适的鞋子:这是一个开源的徒步旅行规划应用程序和路线优化引擎,Evan 提供了他编写的所有代码,所以你可以在自己的终端上修改和定制应用程序。
如果你正在寻找更多的优秀文章来阅读(也许是在充满活力的远足回来的路上?),以下任何一条都不会错:
- 我们与研究员兼企业家 barrysmyth 聊了聊学术界与工业界辩论中的转变,以及数据科学家应该如何为自己的成功定位。
- 佩吉·张(Peggy Chang)的新作《深度探索》(deep dive)是任何想了解相似性搜索如何大规模运作的人的必读之作。(有多海量?十亿向量数据集规模庞大!)
- 计算机视觉在 Mihir Garimella 的第一篇 TDS 帖子中发现了一个有前途的用例,该帖子解释了基于 MediaPipe 和 Keras 的工作流如何能够实时检测手语字符。
- Sophia Yang 通过对八种流行技术和工具的高层次概述,帮助读者理解当前建模可解释性的方法。
- 对于希望为其公司底线做出贡献的数据科学家,我们在最新一期的月刊中收集了一些我们最喜欢的关于数据业务影响的资源。
如果你想支持我们作者的工作,可以考虑成为一名中级会员——你还可以访问我们的全部档案。
直到下一个变量,
TDS 编辑
数据科学既是一门科学,也是一门艺术
原文:https://towardsdatascience.com/how-data-science-can-be-as-much-an-art-as-it-is-a-science-a6715fc939c

探索不断发展的技术领域中技术含量较低的一面
考虑一下你看过的任何一份数据科学领域的职位招聘信息,比如数据科学家或机器学习工程师。您可能会看到一系列技术要求,包括了解特定的编程语言、拥有统计建模方法的经验等等。当然,鉴于数据科学确实是一个高度技术性的领域,这是有意义的。我个人想不出有哪一份数据科学工作不需要使用计算机,也不需要一些数学背景。
现在对比一下平面设计领域的职位招聘。在成为一名机器学习工程师之前,我认为我想成为一名平面设计师,所以我对这些招聘信息非常熟悉。如果你不熟悉图形设计,实际上有一个相当大的技术要求,因为现在图形设计大部分是在计算机上完成的。这些技术技能主要包括知道如何正确使用软件工具,如 Adobe Creative suite(如 Photoshop、Illustrator)或 Serif 的 Affinity suite(如 Affinity Photo、Affinity Designer)。
正如你可能猜到的那样,平面设计职位和数据科学职位的主要不同之处在于,平面设计职位也非常需要非技术技能。很明显,我指的是需要有一些艺术上的造诣!一个平面设计师可以完全精通如何使用 Adobe Illustrator,但如果他们不知道如何制作好的艺术作品,他们可能不会在这个角色上取得成功。
在继续之前,让我们用我所指的艺术来明确我们的定义,特别是考虑到我可能刚刚用平面设计师的例子把水搅浑了。我指的并不是那种“在画布上作画”的艺术。我更倾向于将这种艺术理念称为创造性地使用工具以独特的方式解决问题的能力。高等教育将这些学位称为“艺术学士”,也可以包括工商管理、领导力和教育等领域。在所有这三个领域,高等教育教授许多技术课程,以更好地为学生未来的工作岗位做准备,但最成功的学生是那些最具创造性地使用他们在大学里学到的知识,以最好地适应他们在职业上的目标的人。不言而喻,并不是每个拥有领导力学位的人都是伟大的领导者。(反之亦然!)
所以我很好奇,数据科学的工作职位往往会掩盖这一领域。不要误会我的意思,我确实认为,鉴于这确实是一个主要的技术角色,所以非常强调技术非常重要,但公司不多强调一点数据科学的非技术方面会给自己带来伤害吗?我认为是的,为了帮助你理解我的想法,以一种你以前可能没有考虑过的方式重新构建数据科学是很重要的。让我们在下一节中探讨这一点。
将数据科学重构为一门艺术
几年前,我在 Coursera 上了一门名为数学思维入门的 MOOC 课程,老师是斯坦福大学教授 Keith Devlin 博士。在最早的一次视频讲座中,德夫林博士将数学描述为“模式科学”,从而改变了我的生活我是认真的。在那之前,我从整体上理解数学的视角基本上不存在。我在这个时候的数学教育并没有真正超越高中数学,尽管我在高中数学上表现很好,但除了模糊的理解,我从来没有一个数学参考框架,嗯,它一定对工程师有好处!德夫林博士的这一见解几乎立刻改变了我的大脑,我对数学的欣赏从不存在变成了近乎崇敬。
您可能已经意识到,数据科学很大程度上是建立在数学原理之上的,而将数学重新定义为“模式科学”有助于巩固这种联系。我们关心数据科学领域的全部原因是为了在数据中发现对人类观察者来说不太明显的模式。数学通过提供“工具”(算法)来帮助人们以多种方式理解数据,从而帮助了数据科学领域。想知道如何正确地将相似的数据分组在一起吗?K-means 或 DBSCAN 聚类算法支持您。想弄清楚一堆不同的数据特征如何预测一个二进制分类目标?只需看看逻辑回归或随机森林分类算法。尽管我们已经在改进如何在现代数据科学中使用数学算法方面取得了很大进展,但我真的很兴奋地认为我们可能只是触及了表面。我非常期待在未来我们能以非常酷的方式看到这些数学算法的新应用!

作者创作的插图
但问题是:数据科学依赖于数据。现在您可能会想,“谢谢你,明显队长,”但这给数据科学界带来了一个严重的问题。考虑上面的插图。我为以前的博客文章制作了这张图,在那里我简要地讨论了物理数据捕获在我们捕获数据的所有地方是如何爆炸的。物联网(IoT)市场在过去的五年里增长了很多,我预计它将继续增长。
让我们从数据上退一步,理解我们真正试图对整个数据科学行业做些什么。我们真正在做的是寻找现实生活活动/现象中的预测模式。无论是了解明天的天气,还是创造一辆自动驾驶汽车,我们人类基本上都在试图了解支撑这些活动的模式,以便我们能够采取适当的行动。如果这些事情没有一个模式,数据科学领域就不会存在。恰好数学算法是帮助我们理解这些模式的最好工具。
因为我们在现代数据科学中使用计算机,这意味着我们必须将现实世界“编码”成电子信息。当我说“电子信息”时,我当然指的是数据。问题是,总的来说,我们作为人类一直在努力以一种恰当地代表现实生活的方式来恰当地整理这个世界。部分问题纯粹是技术性的(例如,数据存储/压缩的发展),但大部分问题来自于试图将语义捕获为数据。作为一个极端的例子,考虑一下这个:你将如何编纂爱?即使是浪漫的约会网站也很难解决这个问题!
因此,虽然物联网行业等行业继续寻求解决“数据不足”的问题,但现实是,我们几乎总是要通过这个我们称为“数据”的小窥视孔来更好地理解现实生活。数学算法无疑将继续成为数据科学领域的福音,但我们将不得不在如何使用数据和数学来创建这些数据科学解决方案方面有所创新。
(你知道我要去哪里了吗?😃)
当我们以创造性的、独特的方式使用工具集来解决不同的问题时,我们叫它什么?
我们称之为艺术。
雇主应如何考虑调整数据科学职位发布
当然,继续专注于技术技能仍然很重要,因为它们绝对是在数据科学职位上取得成功的基础,但我认为数据科学行业如果不专注于数据科学这一更艺术化的方面,就会给自己带来伤害。俗话说,任何老驴都可以踢倒一个谷仓,但它需要一个木匠来建造。同样,一个人完全有可能在计算机科学或数学方面非常倾向于技术,但缺乏创造力,这将抑制他们最大限度地发挥这些技能。(如果你想知道的话,是的,我知道在某些场景中,情况确实如此。)
现在你可能有理由怀疑,“我们如何评估艺术作为一种技能?”这个概念其实很简单。考虑前面提到的平面设计师工作。他们评估一个人艺术水平的方法是检查候选人的作品组合。同样,雇主可以通过要求候选人的作品样本组合来评估候选人在数据科学艺术方面的熟练程度。这是我做这些个人数据科学项目的众多原因之一,你可能已经在我以前的博客文章中读到过。我正在建立一个作品组合,它不仅锻炼了我的技术能力,还展示了我在使用这些技术技能来构建有用和酷的东西时的创造力。
事实上,最好的数据科学候选人已经这样做了。我有幸为我的雇主参加机器学习工程师面试,最成功的候选人会主动与像我一样的面试官分享他们的投资组合。作为我的机器学习工程师同事 Marcin Waz 的大喊,他通过分享一个他完成的关于咖啡拿铁艺术图像分类的个人项目很好地展示了这一点。Marcin 显然能够展示他在该项目中的技术能力,他在一个独特、酷的项目中应用这些技能的独创性给我留下了深刻的印象。和我的其他机器学习工程师同事一样,在迄今为止与我们一起工作的 18 个月中,Marcin 已被证明是一名优秀的雇员。😃
总结想法
让我最后一次重申,让人们觉得我没有轻视它:在招聘数据科学候选人时,技术技能是绝对“必须”的。这个领域的技术技能永远不应该让位于数据科学更具创造性的一面。但是,如果你真的想雇用一名高质量的数据科学候选人,我强烈建议你考察如何评估候选人将数据科学作为一门艺术来应用的能力的机会。如果你发现自己站在面试者一边,可以考虑收集自己的个人作品来帮助展示这一点。显然,做到这一点可能很难,但我几乎可以向你保证,这将使世界变得完全不同。
数据科学如何更快地超越失败
原文:https://towardsdatascience.com/how-data-science-can-fail-faster-to-leap-ahead-ab2921adb98e
企业研究人员需要自由地以一定的速度和规模进行实验和迭代

特雷弗·瓦诺伊在 Unsplash 上的照片
当今数据科学面临的最大挑战之一是找到合适的工具来完成工作。同类最佳选项的快速变化使得这一点尤其具有挑战性——只要看看 R 在新语言出现时失宠的速度就知道了。如果数据科学要在企业中尽可能快地发展,科学家需要工具来快速运行多个实验,丢弃不起作用的方法,并迭代剩余的最佳选项。数据科学家需要一个工作空间,在那里他们可以轻松地进行实验,快速地失败,并在通过认证和部署运行模型之前确定最佳的数据解决方案。
让我感到惊讶的一件事是数据科学生态系统有多么庞大。R 大概有 13000 个包,Python 有几十万个。但是如果你看看 Kaggle 的调查,四年来,使用 R 的数据科学家的比例下降了超过 40 个百分点——从 64%下降到 23%。与此同时,使用 Python 的数据和业务分析师的比例从 61%急剧增加到 87%。去年 Python 跃居编程语言榜首,在 TIOBE 指数上超过 Java 和 C,而 Swift 移动了一点,Julia 和 Dart 节节败退。变化如此之大,很难知道采取什么方法。一个高效的数据科学家不应该必须做出选择,他们应该能够尝试多种方法。
有一点我并不感到惊讶,那就是 it 部门需要多长时间才能推出一个新的更新。我要表扬他们,他们在验证、检查许可和使用权、安排服务器时间、部署集群等方面任务繁重。但是我听到许多客户说,他们需要六个月的时间才能获得 it 团队部署的新 Python 包,所以有些人只是将他们的个人笔记本电脑偷偷带到办公室来运行他们的工作。人们是有创造力的,他们会找到方法,但是数据科学家不应该绕过他们的 IT 部门来完成他们的工作。
这里的最后一个大挑战是,如果数据科学家在他们可以使用的工具方面受到基础设施或 IT 要求的限制,那么他们将把他们的研究、实验和结果框定在该软件框架内,这给可以带来最大进步的创造性思维类型增加了一个人为的限制。就像他们说的,如果你只有一把锤子,所有的东西看起来都像钉子。
解决方案是扩展您的工具集,构建一个沙箱,您可以在其中快速尝试多种方法,这样您只需为最终部署寻求 IT 帮助。如果调配新工具花费太多时间,it 障碍将限制结果、创造力,并排除可能提供更好解决方案的选项。没有更好的软件工具和新框架,数据科学家不得不选择权宜之计而不是洞察力。
当研究人员拥有一个定义良好的沙盒(或 MLOps 平台)时,他们可以通过使尝试新方法比花时间进行细微改进更有效、更便宜来最小化沉没成本。他们可以尝试四种不同的方法,其中一种可能会产生更显著的性能提升,而不是花费一个月的时间来调整超参数以获得 0.25%的改善。
敏捷开发、迭代编程、最小可行产品——这就是今天软件的制作方式,也是聪明的企业的工作方式。这都是关于快速原型,迭代和快速失败。但对于大多数数据科学家来说,他们更担心 IT 没收他们的笔记本电脑,而不是他们如何利用更好的工具做更多的事情。
有了合适的平台,研究人员将有比笔记本电脑更好的选择,他们将有办法旋转集群,部署多个模型,并利用 GPU 加速。它会知道开发人员有他们自己的安全的沙箱,并且受到管理。我不能再强调这种需要了——在 Kaggle 的《2021 年机器学习和数据科学状况报告中,55%的数据科学家向 Kaggle 报告说,他们没有企业机器学习工具。没有更多的结构,我们只能凭感觉飞行。
为什么没有更多的公司采取更结构化的方法?有几个很好的理由,主要集中在遗留和治理问题上。
- 银行、保险和医疗保健等受到严格监管的行业担心,部署不完美的东西会给监管机构带来问题。但是在部署之前进行试验的时间很长,并且在过程结束时花时间对有效的模型进行认证比对每个更新进行认证更有意义。
- 沉没成本理论导致公司坚持使用他们拥有的旧工具,并继续追求同样的方式来完成工作。但是这并没有给数据科学家自由去迅速放弃一种方法,并使用最新的语言。
- 确保您所采用的平台将允许科学家在他们自己的时间(而不是他们自己的笔记本电脑)部署测试项目。他们需要能够启动集群、弃用集群、回滚到早期版本,所有这一切都在一个能够解决 IT 问题的治理环境中进行。
- 不要让完美成为进步的敌人——确保你的利益相关者、团队领导和业务主管理解迭代开发是如何工作的。他们需要明白,一波又一波的改进结果比等待一年的完美模型要好。因为到明年,那个模型,甚至那个语言,可能都不相关了。
通过利用支持快速实验的工作台,数据科学团队可以更快地交付更好的结果,因为他们能够更快地失败并找到更好的途径。
MLOps 平台的一些潜在优势包括:
- 改进了对最新工具的访问——不仅能够使用最新工具,还可以自由地为每个项目使用正确的工具,从而更快地交付有意义的结果。
- 改善招聘—数据科学家热爱自由和创新,不想在研究中受到阻碍。如果一家公司想要吸引最优秀的人才,求职者需要知道他们可以使用最新的工具,在通往成功的道路上可以自由地犯错误。
- 改进的治理—数据科学家确实希望有一个安全网来捕捉这些失败的实验,并需要能够追溯代码更改和不同的包版本,以便通过更容易地跟踪路径来消除快速失败的风险。但是今天大多数团队做不到这一点,所以他们需要更好的治理方式。
- 更好的结果——除了使用最新的软件找到更独特的解决方案之外,更快的失败也使创建基于以前工作的新项目变得更容易,因为实验和结果会被存储起来,供将来搜索。
如今身处数据科学领域确实令人兴奋,我们看到这一学科的价值得到了世界各地公司的认可,数据科学团队对底线的重要性超过以往任何时候。但是,如果公司可以创建一个数据科学基础设施,支持团队更快地失败并获得更好的结果,他们就可以建立一个世界级的数据科学组织。他们的团队将提供最相关的结果。他们的数据科学家将能够使用领先的技术。公司可以鼓励创新,同时保持治理。
我认为这些都是重要的好处,也是推进数据科学的下一步,可以通过更快地失败来实现。
数据科学家如何从细分项目的用户故事映射中获益
在我们的细分或建模中,数据科学家如何从用户故事写作和产品发现映射中受益?

图片来自 Unsplash
在产品开发领域,许多技术被用来区分新想法或新特性的优先级,以改进产品、修复 bug 或更新需求,等等。其中一些技术被用于管理团队冲刺,但是其他的对于特性工程也是有用的。在这种情况下,我想向您展示我是如何使用用户故事写作和映射来开发行为细分的。但是让我们从头开始。
什么是用户故事映射?
用户故事映射是产品发现中使用的技术:概述新产品或现有产品的新功能。它包括一个视觉练习,帮助产品经理和他们的开发团队定义将改善用户体验的工作。
结果有助于保持对大的产品图片的关注,同时还提供所有的细节。
在开发细分市场时,我们的数据科学团队遇到了一个业务问题,即根据客户在平台中的意图来划分客户。但是如何开始呢?
对于一家跟踪数百个前端事件的电子商务公司来说,选择最重要的事件至关重要。我们显然可以使用传统的方法:
- 数据发现
- 数据准备和特征创建
- 模型开发和评估
- 误差分析
- 从头开始重复,以击败性能
但是我们也可以使用用户故事写作来加速这个过程,在这里我们可以关注用户视角的功能和价值。
一个用户故事将会是:
作为一个…(人物角色)我想…(功能)为了…(原因/用户愿望)
现在让我们转到我们的行为细分。想象一下,我们处于一个食品配送行业,我们希望为点餐时有不同意图的客户创建细分市场:

用户故事示例 1 —作者提供的图片
我们在这里看到两个目标相同的场景: 点餐 。但是我们如何找到解释每种行为的最佳特征呢?
作为数据科学家,一些团队在跟踪系统如何在其公司中工作方面比其他团队更有经验,而且很难理解所有可用的功能。在我的例子中,为了避免问题,并确保我可以从我的细分中得到最好的用户故事,我还包括了故事映射。
该过程
首先,我开发了我所有的用户故事(如上图所示),并在文本中提供了足够的上下文,以便它可以映射到我们在平台上的用户旅程。
其次,我在同一间屋子里聚集了一群公司前端跟踪的专家:产品分析师。他们不断地与团队合作来改进跟踪,创建最好的产品报告和仪表板,产品经理可以在其中找到差距或机会来改进产品/功能,或者只是通过 AB 测试来查看他们上一个版本的执行情况。
有了我的故事和人之后,我们为我们的产品定义了用户旅程的主要步骤。示例:

作者图片
接下来,我们包括了用户应该遵循的必要接触点,以便完成主要驱动因素。例如,餐馆发现包含家庭、添加位置、注册、所有可用餐馆列表、搜索、过滤器等。或者像下图,平台包含位置和报名。

用户故事映射示例—按作者分类的图片
根据我们有多少用户故事,将专家分成相同的小组,并将每个小组分配给一个用户故事。他们的目标是:
确定将您的故事映射到您的数据所需的指标
一旦在每个接触点下写下了所有的度量标准(比如用户故事映射示例中的度量标准),那么他们必须在每个流程步骤列中对每个任务进行优先级排序。这个想法是在以后选择我们需要的“最小数量的事件”来解释用户行为。一些小组可能比其他小组有更多的任务,但这没关系。
该练习将通过从不同组的最小值项目中收集所有事件来结束。有了新列表,数据科学家可以开始发现数据并从中创建特征,这将加快细分的特征选择部分。
可能在发现部分,一些数据由于质量差、缺少太多值或任何其他问题而不符合使用条件。但是不要担心,记住在我们的映射中任务是有优先级的,所以如果没有足够的特性,可以在最小值选择之后从各自的列中取出一些。
这也可以应用于我们想要开发的任何模型,以加快我们的特征选择知识。
概述:
- 定义要涵盖的不同场景
- 组建专家小组,以便他们能够涵盖每种情况
- 在我们应用程序的用户旅程中,将每个用户行为映射到事件或数据
- 对每个步骤进行优先级排序,并选择解释用户行为所需的最少事件
- 组合所有事件,供数据科学家用作分段或建模的特征
我希望你觉得有趣,请张贴任何意见或问题,我很乐意帮助你,并根据我的经验提出建议。随时关注我 上媒 或 LinkedIn 连接。
数据科学家如何通过数据集市减少数据争论的时间
什么是数据集市,为什么数据科学家应该使用数据集市

作为一名数据科学家,你可以花多达 80%的时间清理和转换数据,以便生成可操作的见解,并构建机器学习模型来创造业务影响。现在想象一个世界,你可以花更多的时间在分析和模型开发上,而不是清理数据。通过将数据集市定义为为特定用户组或业务单位开发的数据仓库中的数据子集,这可以成为现实。
介绍
当我刚开始做数据科学家时,数据仓库中只有原始数据,没有 ETL 管道来创建一个可以用来查询客户信息的集中式表。每当我需要客户数据时,我都必须将多个表连接在一起,并应用适当的业务逻辑。每次分析都要重新运行,这是很乏味的。最终,我将这些频繁的查询放入 ETL 管道,并创建了一个分析数据集市,帮助我将数据清理和准备时间减少了 50%以上。现在您已经知道了拥有数据集市的好处,让我回顾一下我用来建立数据集市的过程,以及如何在您的公司中应用它。
1。确定数据集市的业务单元和用户
目标用户将使用数据集市来回答业务单元中利益相关者的问题。例如,您可以构建一个数据集市来回答产品经理关于用户行为和参与度的问题。数据集市的用户可以是数据科学家,也可以是产品涉众的数据分析师。
2。创建数据集市将用来回答的问题列表
这将决定数据集市中的数据类型。例如,产品数据集市需要回答关于每日注册数、每周活跃用户数和产品 A/B 测试结果的问题。我建议从一个常见的问题列表开始创建数据集市的初始版本,然后根据需要添加表。
3。数据集市表的文档模式
在模式文档中包含尽可能多的信息,因为如果将来有人对数据有疑问而不是问你,它可以用作参考。添加读入数据时需要应用的任何业务逻辑,如过滤器和转换逻辑,以及记录所需数据的时间范围和更新频率。按照步骤 2 中的产品数据集市示例,我们需要使用与注册、产品行为和用户实验相关的数据源。
下面是一个用户表模式的例子,我指定表应该每天更新。这是一个重要的细节,因为它将允许数据工程师多久调度一次 ETL 作业,并允许查询数据的用户知道数据多久更新一次。
我列出了 5 个字段,包括字段名、字段类型和要应用的业务逻辑(如果适用的话),比如从电子邮件地址中删除空格,并通过从 logins 表中取 login_date 字段的最大值来导出最新的登录日期。注意,最后一个字段是一个名为 update_date 的引用字段,它应该被设置为上次为这个表运行 ETL 的时间,以便让用户知道上次更新数据的时间。有时 ETL 作业可能会失败,如果当天刷新了表,这有助于排除故障。

作者创建的用户表模式示例
数据集市的另一个可能的表是 logins 表,用于报告每周的活动用户。然而,与其只创建一个每周活动用户表,不如创建一个每日用户登录表更灵活,如下所示,用于构建一个包含每周活动用户(WAU)计数的聚合表。请注意, wau 的业务逻辑是不同的用户计数,其中登录日期是当前日期-1 和当前日期-6。我们使用当前日期-1 的原因是因为最近的数据通常来自昨天,用昨天减去 6 天可以得到 7 天的时间来计算 wau 。
在决定数据集市中的表时,时间段越细越好,因为它可以让您更灵活地回答关于任何时间段的问题。

作者创建的登录和 wau 表模式示例
4.根据模式文件创建样表
在记录了表模式之后,就该编写代码来创建示例表了。这些示例表可以由您或数据工程师创建。如果是数据工程师,让他们为您提供生产数据来验证这些表。当数据工程师使用测试数据时,我所能做的就是验证表模式。在样本表通过 QA 检查之后,如果需要,您可以与数据工程师一起回溯任何历史,然后让他们将 ETL 代码投入生产。
最终想法
作为一名数据科学家,拥有一个数据集市极大地提高了我的生产力,因为我可以花更少的时间清理和转换数据,而花更多的时间进行数据分析和开发机器学习模型来推动业务影响。建立一个数据集市可能听起来有点吓人,但是从长远来看,帮助您和您的利益相关者在更短的时间内获得更多的洞察力是值得的。
你可能也会喜欢…
</6-bad-data-engineering-practices-you-shouldnt-apply-as-a-data-scientist-58de5eca14c3> </6-best-practices-i-learned-as-a-data-engineer-9d3ad512f5aa>
数据科学家如何提高他们的编码技能
原文:https://towardsdatascience.com/how-data-scientists-level-up-their-coding-skills-edf15bbde334
进入数据科学职业生涯有很多途径,并不是所有的途径都需要强大的编程背景。当我们听到数据从业者质疑他们自己和他们的能力时,一个反复出现的主题是代码:“如果我不知道如何[插入你自己认为的编码缺点],我甚至不是真正的数据科学家吗?”
嗯,是的,你是!没有人知道一切;我们所能希望的是认识到我们知识上的差距,并找到解决这些差距的有效方法。本周的亮点将在您的编码之旅中为您提供帮助:每个亮点都从不同的角度探讨了数据科学编程的(广阔)主题,并且每个亮点都提供了不同类型的可操作要点。尽情享受吧!
- 到底什么是好代码?Sergey Mastitsky 对编码最佳实践的精彩介绍是全面的、可理解的和详细的。这也是一个有用的提醒,写干净、清晰的代码不是炫耀你的技术实力,而是对你的同事和用户的慷慨和同情。
- 掌握测井要领 。成为一个可靠的队友的另一个重要方面?确保代码中有良好的日志调用,以便易于调试。 Kay Jan Wong 的日志初级读本从基本函数一直到更高级和更专业的函数,涵盖了常见问题,并包括 Python 的完整实现。

照片由 www.zanda .摄影在 Unsplash
- 你的 Python 技能如何简化你的工作流程 。停留在事物的实际方面, Rebecca Vickery 带我们了解了三个 Python 库的来龙去脉——Lux、Pandas Profiling 和 sweet viz——它们自动化了分析数据的常规任务(在应用其他技术之前,这是任何数据科学分析中重要的第一步)。
- 改弦易辙 。 Ken Jee 最近分享了关于学习编码的有益建议,集中在他事后会做出的不同决定上。从他的文章中得到的一个有力的教训是,无论你在数据科学之旅的哪个阶段,你都有时间调整你发展和提高技能的方式。
我们希望你本周能有时间多看几篇我们发表的优秀文章——错过这些将是一种遗憾!
- 作为 TDS 播客的主持人,Jeremie Harris 分享了关于人工智能未来的最后一集。
- 为您的数据科学项目选择正确的视觉类型至关重要。 Semi Koen 的指南将帮助你做出可靠、有效的决定。
- 一部 AI 歌剧听起来是什么样的?尼科·韦斯特贝克的第一篇文章带领我们经历了在德累斯顿森佩罗珀创造追逐瀑布的迷人过程。
- 通过跟随 Rashida Nasrin Sucky 的分步教程,学习如何使用 TensorFlow 的函数式 API预测一个模型的两个输出。
- 出版由迈克尔·布朗斯坦创作的激动人心的新作总是一种特权;他的最新文章(与合著者 Francesco Di Giovanni、James Rowbottom、Ben Chamberlain 和 Thomas Markovich)介绍了梯度流框架(GRAFF),这是一种受物理学启发的绘制神经网络的方法。
一如既往地感谢您花时间阅读我们作者的作品。如果你想以其他有意义的方式表达你的支持,可以考虑成为一名中级会员。
直到下一个变量,
TDS 编辑
深度学习如何实现大规模科学可视化
使用神经网络压缩信息用于交互式渲染

加州大学戴维斯分校 VIDI 小组以前的工作样本。图片由加州大学戴维斯分校 VIDI 小组提供
介绍
作为英特尔的软件架构师和技术传播者,最大的乐趣之一就是有机会看到 oneAPI 卓越中心(CoE)在全球范围内所做的出色工作。最近,加州大学戴维斯分校可视化和界面设计创新(VIDI)实验室分享了他们如何使用深度学习进行高性能、交互式科学可视化。
为什么这很重要?
近年来,科学模拟和建模变得越来越详细。模拟可以轻松生成数百万亿字节的数据。对于生成三维数据表示的仿真模型,理解仿真输出的最佳方式是使用实时渲染器对其进行视觉检查。
可以想象,使用高保真方法渲染万亿字节的数据,如使用最强大的 GPU 的光线行进(想想更高级的光线跟踪)和路径跟踪,是一项挑战。纯粹的强力渲染算法和标准压缩算法无法提供支持这种规模的实时交互所需的性能或压缩率。虽然以每秒 1 帧(fps)的速度查看模拟输出的渲染非常有价值,但以 30fps 的速度提供实际的交互式渲染可以为研究人员提供更有用的体验。
这就是关-刘妈教授和他的团队大卫·鲍尔和吴起所做的工作。他们结合了深度学习和渲染方面的最新研究,提供了一些真正了不起的东西。
用于压缩的即时神经表示
上面提到的最大挑战之一是压缩数据,然后快速解压缩大型数据集,速度足够快,以实现实时、交互式渲染。如果我们以 30fps 的速度渲染,模拟数据的解压缩时间必须少于 33.3 毫秒。
压缩类型和速率
第二个难题是压缩率。压缩算法可能是无损的,这意味着可以完全恢复原始输入数据。它们也可能是有损的,这意味着不可能从压缩的表示中重建原始数据。正如人们所料,一般来说,无损算法往往会导致较小的压缩率。
人们每天使用的典型压缩文件是 zip、mp3 和 JPEG。前者是无损的,可以实现大约 3:1 的压缩率。后者是有损的,通常实现大约 20:1 和 10:1 的压缩率。这意味着这些典型算法的最大压缩比大约是原始数据大小的 1/20。
出于实时渲染的目的,人们将寻求的主要特征是快速解压缩和相对最小的数据丢失。然而,20:1 的压缩率对于许多使用案例来说可能是不够的。
救援的即时神经表现
正如我们在过去 10 年中所看到的,现代神经网络非常擅长编码信息和快速解码信息。这两个特征使得神经网络非常适合作为大规模数据集的压缩方法。
使用神经网络进行压缩的另一个有用特征是,与大多数压缩算法不同,表示的大小不会随着数据集大小的增加而增加。人们可能会认为,随着数据复杂性的增加,静态表示会变得更容易丢失。
然而,给定一个足够大的网络,这种退化不是线性的。由于巨大的模拟模型大小,可以使用大型神经网络,这导致良好的压缩比和随着数据集大小增长的最小信息损失。VIDI 团队报告的结果是“比原始数据小 10-1000 倍,并且使用 MLP 和散列网格编码几乎是即时训练的”

图 1:在相似的压缩率下,即时神经表示(VNR)质量与朴素方法的比较。图片由加州大学戴维斯分校 VIDI 小组提供
在图 1 中,我们可以清楚地看到这种压缩算法相对于传统算法的价值。
创建表示
为了训练模型进行压缩,VIDI 团队必须获取 3D 模拟信息,并将其转换为适合标准机器学习工作流程的东西。从逻辑上讲,这是一个相对标准的机器学习流程:
- 获取 3D 空间中的随机数据样本
- 使用散列网格编码对每个样本进行编码,以创建传递给 DL 模型的张量
- 针对实际样本输出训练样本点的模型
为了尽可能提高性能,VIDI 团队使用了英特尔开放卷内核库(oneAPI OpenVKL 规范的一种实现),从基础事实中为训练阶段生成训练样本。OpenVKL 在这里很有帮助,因为它支持对体数据的高效遍历和采样。
使用正确的配置,训练模型大约 20k 步只需要不到一分钟的时间。这样做的结果是合理的峰值信噪比 (PSNR)在大多数情况下约为 30dB,在一些数据集中约为 49dB 以上。对于那些不熟悉 PSNR 的人来说,它是用分贝(dB)来衡量的。该值越高,图像越接近原始图像。
弥合渲染差距
虽然即时神经表示令人印象深刻,但它本身可能不足以提供高性能的实时交互体验。为了弥合这一差距,加州大学戴维斯分校 VIDI 团队还开发了几种用于即时神经表示数据的采样和渲染算法。
不幸的是,这里的技术超出了本文的范围,但是你可以查看一下即时神经表示和相关渲染优化的细节。
当然,更有趣的事情是看所有这些如何组合在一起,以实现真正的交互体验。你可以在下面的视频中看到加州大学戴维斯分校 VIDI 团队训练即时神经表达的速度和取得的令人印象深刻的结果。
结论
我一直认为 DL 是一种可以解决极其复杂的问题的技术,这些问题需要很大的解决空间;我还没有考虑过如何用“众所周知”的解决方案为问题提供启发性的解决方案。即时神经表示是一个很好的例子,它利用了 DL 模型的力量,并将其用作一些数据的启发式优化,这些数据可以容忍某种程度的有损转换。
像即时神经表示这样的技术能够与日益复杂的模拟数据进行可用的实时交互。为了强调 1fps 交互和 60fps 交互的区别,请看这个有趣的视频。
我很兴奋也很乐观,像这样的新解决方案将继续推动科学发现。支持与仿真模型数据进行 30+ fps 的交互对于科学家来说可能是一个游戏改变者,他们将不再需要与他们的数据进行幻灯片式的交互。
如果你想看看我在看什么科技新闻,你可以在 Twitter 上关注我。此外,一起查看 代码 ,这是我主持的面向开发者的英特尔播客,我们在这里讨论技术。
Tony 是英特尔的一名软件架构师和技术宣传员。他开发过多种软件开发工具,最近领导软件工程团队构建了数据中心平台,实现了 Habana 的可扩展 MLPerf 解决方案。
参考
[1]吴起,大卫·鲍尔,迈克尔·j·道尔,关-刘妈,用于交互式体绘制的即时神经表示,2022,https://arxiv.org/abs/2207.11620v2
深度学习技术如何在教育编码平台上提供动态轨迹——问题陈述
在这个系列中,我将介绍我在鲁汶大学计算机科学系所做的论文的主要发现。这篇博文详细阐述了问题陈述,让你更好地理解为什么适应性学习轨迹是重要的,并给出了一些如何实现它的线索。

学习编程语言的教育平台通常以一种相当静态的方式提供服务,学习者一旦注册了一门课程,他们的轨迹就固定了。然而,这应该被理想地调整,以确保更熟练的学习者不会因为材料太简单而失去动力。对于速度较慢的学习者来说也是如此,他们应该遵循一个有更多重复的轨迹。
因此,本系列的主要目标是开发一个系统,该系统将根据学习者的表现动态地调整他们的轨迹。为了创建这样一个系统,以及评估其性能,需要一个在线学习平台。在这里,E-Systant 前来救援。
电子系统
E-Systant 是一个在线学习平台,由鲁汶大学开发。它被用在计算机科学项目的“声明性语言”课程中,用来教授逻辑编程语言(Prolog)和函数式编程语言(Haskell)。该平台自 2015 年投入使用,已有超过 1500 名学生使用。通过这种方式,它积累了大量有价值的数据,这些数据将被证明对自适应系统的开发是有用的。但是,需要注意的是,只有当学生提交代码进行评估时,才会创建新的数据提交条目。因此,无法获得学生在短时间内的详细进步信息。
适应性学习
1.推荐下一个编程任务
实现自适应学习的方法之一是对下一个应该承担的编程任务提出建议。为了给出这些建议,将使用神经网络模型,根据 E-Systant 的历史数据进行训练。除此之外,我们将调查深度强化学习技术是否可以提高推荐的整体性能。
1.1 基于经典神经网络的模型
在第一阶段,模型将仅使用可用的提交数据作为输入特征进行训练。这里,每次提交都包含时间戳、提交的代码、已经获得的分数以及服务器执行代码所花费的时间..在第二阶段,这些模型将被扩展以附加特征,在一些特征工程之后被创建。这种额外功能的一个例子将是一个创建的技能组合,它捕捉学生对课程的某些概念的掌握程度。
大多数关于电子学习环境中自适应学习的文献要么使用协同过滤,要么使用基于内容的推荐,如[1]中所总结的。然而,自适应学习的深度学习方法目前还不是很常见。在[2]中,提出了基于深度学习的推荐框架,但没有给出具体的实现或实际结果。尽管如此,深度学习推荐模型正在应用于许多其他领域,如文献调查[3]所示。因此,本系列研究如何将这些深度学习模型应用于电子学习环境中。
技能组合
从概念上讲,技能组合最初应该是一个空间中的向量,其维度与课程中的概念一样多。向量在某一维上的长度应该表明学生对这个概念的理解程度。然而,由于概念不会彼此正交,进一步的优化将是使用嵌入空间,其中概念可以彼此相关。之后,嵌入空间应该被投影到更低维度的空间,以便学生的技能组合可以被学生和教师可视化。
我们不希望技能组合的概念是数据驱动的,因为技能组合本身将被用作神经网络中的额外输入特征。相反,我们将用作业中教授的概念来注释编程作业。示例概念可以是相当低级的,如“模式匹配”和“高阶函数”,也可以是更高级的,如“学生能够构建不同的概念”。
[4]和[5]已经完成了建立学习者档案的工作,但是他们更多地关注学习者的态度,而不是他们获得的技能。据我们所知,还没有其他工作基于学生在编程作业中的表现为他们创建技能组合。创建这样一个对已获得技能的概述,以及对用户和教师的可视化,在我们看来是对 E-Systant 平台的一个有价值的补充。
1.2 深度强化学习
除了经典的机器学习技术,还会尝试深度强化学习来给出建议。其思想是,状态应该代表已完成的任务,而动作应该代表下一步应该尝试的任务。奖励是学生在作业中获得的分数。
在[6]中,阐述了如何在电子学习环境中使用强化学习。此外,在[7]和[8]中,正在使用经典的 Q-learning,而\ cite { deep _ reinforcement _ learning _ e _ learning }实际上使用的是深度强化学习。因此,本文将研究他们的结果在我们的环境中复制得如何,以及深度强化学习的结果与经典的深度学习技术相比如何。
审查阶段的建议
学习者可以获得适应性反馈的另一种方式是向学习者提供他们最难理解的概念的见解。此外,在复习阶段(例如,当他们准备考试时),可以向学习者推荐特定的编程作业,以便他们尽可能高效地填补知识空白。这一特点将在很大程度上依赖于前面提到的技能组合,从中可以确定学习者的优势和劣势。
文献学
[1] Shristi Shakya Khanal、P. W.C. Prasad、Abeer Alsadoon 和 Angelika Maag。基于机器学习的电子学习推荐系统。教育和信息技术,25(4):2635–2664,2020。
[2]小王,,,于,刘锡伟,袁勇,费。基于深度学习的网络学习推荐框架。2017 IEEE 系统、人和控制论国际会议,SMC 2017,2017-Janua:455–460,2017。
[3],,,,孙,和易泰。基于深度学习的推荐系统:综述与展望。ACM 计算调查,52(1):1–35,2019。
[4] Alaa El-Halees。挖掘学生数据分析学习行为:教育系统案例研究。工作,(10 月),2008 年。
【5】张怡颖,何,周依林,,
李。基于在线行为分析的智能电子学习学生模型。电气与计算机工程学报,2017,2017。
[6]Hamid r . Tizhoosh、Maryam Shokri 和 Mohamed Kamel。电子学习应用的强化代理。《高级信息和知识处理》, 289 页。2007.
[7]Youness Madani、Hanane Ezzikouri、Mohammed Erritali 和 Badr Hssina。使用新的推荐方法和强化学习在自适应电子学习平台中寻找最佳教学内容。环境智能和人性化计算杂志,11(10):3921–3936,2020。
[8]穆罕默德·布萨克苏、巴德尔·赫西纳和穆罕默德·厄立特里亚塔利。基于 Q 学习算法的自适应网络学习系统。Procedia 计算机科学,170:1198–1203,2020。
DeepMind 如何利用人工智能发现矩阵乘法的新方法

照片由 Gayatri Malhotra 在 Unsplash 上拍摄
上个月,DeepMind 发表了一篇论文,其中他们展示了 AlphaTensor,这是一种人工智能算法,能够找到更快的方法来完成最常见的代数运算之一:矩阵乘法。当然,你可能会问自己一个合理的问题:这和我有什么关系?在这篇文章中,我将解释论文的内容,如果你坚持到最后,你会找到一些例子,说明为什么这是一个如此大的突破,以及它如何 将 影响你未来的日常生活。
为什么矩阵乘法很重要?
也许你还记得我在的上一篇文章中提到,矩阵乘法是最常见的人工智能算法之一:神经网络的训练和部署的重要组成部分。请记住,这不是这个代数运算的唯一用途。它有数以百计的应用(机器人的坐标变换,复杂优化问题的解决),但为了这篇文章,我们将只关注人工智能。
这实际上是一个非常简单的操作:每个矩阵都是一个二维数字数组,在乘法过程中,左边矩阵(维数为[M,N])的每个行元素都与右边矩阵(维数为[N,P])的每个列元素相乘。所得矩阵的维数为[M,P]。然后将每个乘法结果累加在一起。让我们记住一个[2,2]*[2,2]矩阵乘法的小例子:
记住矩阵乘法的工作原理。作者制作的动画。
通过以这种简单的方式计算结果,很容易确定需要多少次乘法来计算输出矩阵的所有元素。给定一个[M,N][N,P]矩阵乘法,我们需要做 MNP 次乘法,以便计算输出矩阵。所以一个[2,2][2,2]矩阵乘法需要 222=8 个单独的乘法。
为什么我们关心我们需要做多少次乘法?好吧,让我们来看看下图:

图片由作者提供。原始数据来自《如何评估深度神经网络处理器》,2020 。
看那个!与相同的位表示加法相比,与某个位表示(8 位、32 位浮点等)的乘法使用更多的能量!当然,我们在这里谈论的是皮焦(0.0000000000001 焦耳),这是非常小的…但乘以一些最先进的神经网络所需的数十亿次运算,然后然后想象这些是 24/7 运行的,你开始得到不可忽略的能耗。
因此,重要的问题是:我们能否用更少的乘法运算来执行相同的代数运算,以节省能量?
什么是张量分解?
嗯,令人惊讶的是,答案竟然是肯定的!方法是使用一种叫做张量分解的技术,这是 DeepMind 在论文中用来表示矩阵乘法运算的技术。
从概念上讲,主要思想是以这样一种方式对矩阵的元素进行分组,即我们需要更少的乘法来实现相同的结果,并且加法的数量略有增加(但是因为这些使用更少的能量,所以没什么大不了的)。听起来违反直觉,对吗?如何用较少的乘法运算得到相同的数学结果?
嗯,事实上很简单:

两个 M=N=P=2 的矩阵相乘的 Strassen 算法。图片由作者提供。
在这个例子中,我们通过使用较少的乘法来计算结果!我们首先组合输入矩阵的元素,并将它们相乘以生成中间结果。最后,在它们之间进行组合,以获得输出矩阵的实际元素(可以使用简单的代数来证明,这种中间结果组合等价于上一个动画中显示的形式)。这就是 Strassen 算法,它能够使用 7 次单独乘法来计算[2,2]*[2,2]矩阵乘法的结果(我们在上一节中看到的 2 个矩阵相乘的简单方法需要 8 次单独乘法)!
这种矩阵乘法运算的分解可以用 3 个矩阵来表示:U、V 和 W。如下面的动画所示,U 和 V 用于组合输入矩阵的元素,W 用于组合中间结果。这被称为秩 7 分解,因为 U、V 和 W 的秩等于 7。
斯特拉森算法动画,但显示矩阵 U,V 和 w。
发现算法如何工作
所以让我们来看看实际的论文提出了什么,好吗?
在本文中,DeepMind 基于其之前非常成功的 AlphaZero 训练了 AlphaTensor,该算法可以为不同的矩阵乘法大小生成这种重组算法。从概念上讲,他们将问题设计为一个强化学习问题,其中一个代理试图通过试图最小化结果矩阵的秩(列)来找到矩阵 U、V 和 W。因为秩与乘法次数直接相关,这有效地最小化了所需的元素乘法。这篇论文的技巧和绝对的 精彩之处 在于他们能够将问题建模为一个游戏,因此一个强化学习算法能够尝试做最少的乘法来得到结果。
在一组不同大小的矩阵乘法上,AlphaTensor 能够找到使用与当前已知解决方案相等甚至更少乘法的算法!他们对 Strassen 算法特别感兴趣,该算法使用 49 次乘法将 2 个 4x4 矩阵相乘,这是自 1969 年发现以来该矩阵大小的最佳解决方案。AlphaTensor 找到了一个更好的算法,只使用了 47 次乘法!
然后,他们在 Nvidia V100 GPU 和 TPU 上比较了使用 Strassen 算法和 AlphaTensor 算法的大矩阵乘法(M=N=P=8192 和更大)的加速。他们表明,与 Strassen 算法相比,alpha 张量发现算法能够实现 1.5%到 4 %的加速。
那么…这跟我有什么关系?
如果你认为这是一些与你的生活无关的深奥的代数,那么…你错了!人工智能算法训练和预测(例如,神经网络)所需的计算都可以(通常)用矩阵乘法来表示。那么,如果我们现在使用更少的乘法来获得相同的数学结果,会发生什么呢?
- 训练将更快,消耗更少的能量,这将允许我们使用相同的硬件来训练更复杂的网络。
- 神经网络将适合更小的设备,为这些算法开辟了一个全新的应用领域。
- 如果硬件也被设计成考虑这些计算矩阵乘法的新方法,则应该实现显著的能量节省。
动手!
你知道这篇论文最精彩的部分是什么吗?你可以在网上免费获得它!如果您对自己分析数据感兴趣,可以看看 AlphaTensor 的 GitHub 资源库。
欢迎在 Twitter 或 LinkedIn 上关注我,让我知道你对这篇文章的看法,或者请我喝杯咖啡,如果你真的喜欢它!
感谢阅读!
参考
原始纸张:
- Fawzi,a .,Balog,m .,Huang,A. 等 用强化学习发现更快的矩阵乘法算法。性质 610 ,47–53(2022)。
强化学习的有用指南:
原始 AlphaZero 文件:
- Silver,d .等一种通用的强化学习算法,精通国际象棋、shogi,并通过自玩。科学 362,1140–1144(2018)
聊天机器人是怎么理解的?
原文:https://towardsdatascience.com/how-do-chatbots-understand-87227f9f96a7
用 Rasa 构建聊天机器人——第四部分

作者图片
在本系列的前几篇文章中,我们已经讨论了构建聊天机器人、插槽和实体以及处理机器人故障的基础。我们现在将讨论 Rasa 如何通过意图实现机器人理解。我们还将基于逻辑回归构建一个简单的定制意图分类器,尽管 Rasa 确实提供了一些现成的好分类器。
目录
- Natural Language Understanding
- Intent Classification
- The DIETClassifier
- A custom intent Classifier
本系列的前几篇文章
第一部分:用 Rasa 构建聊天机器人
第二部分:槽和实体一样吗?
第三部分:处理聊天机器人故障
自然语言理解
自然语言理解,简称 NLU,是研究机器如何进行阅读理解的领域。这是自然语言处理的一个子领域。
虽然 NLP 关注的是理解本身,但是 NLP 可以推导出可能不是直接显而易见的上下文和含义。Rasa 使用意图来帮助机器人理解用户在说什么。
实体用于提取关键信息,这些信息也有助于机器人制定响应。在这篇文章中,我们将关注意图分类。
意图分类
意图分类是我们刚刚讨论的技术之一。您只需为用户输入的每条消息分配一个标签。这个标签代表一个主题,称为一个intent。例如,您可以定义类似于greet、goodbye、supply_contact_info等的意图。
因为我们已经将这些训练数据标记为 nlu 数据的一部分,所以它变成了一个(通常)简单的文本分类问题。我说“通常”是因为你定义意图的方式与它们分类的难易程度有很大关系。
这对于任何分类问题都是正确的:与不同种类的马相比,区分不同的哺乳动物更容易。类似地,更容易使用名为book_flight的意图和实体来提取目的地、日期等。而不是每个用例都有不同的意图:
book_flights_destination_givenbook_flights_date_mentionedbook_flights_budget_mentioned等。
意图分类器
可以采用许多方法对意图进行分类。你可以有一个纯粹基于规则的系统,它会寻找特定的单词和短语来判断用户想说什么。可以想象,这种方法不会工作得太好,尤其是对于更复杂的用例。
机器学习方法在这里真的很好,尤其是随着自然语言处理领域的发展。例如,您可以使用简单的朴素贝叶斯模型来构建自己的意图分类器。
另一方面,您可以使用 DIETClassifier,这是一个基于 transformer 的模型,可以执行实体提取和意图分类,我们稍后将对此进行讨论。
Rasa 提供了一些意图分类器,您可以在config.yml文件中直接使用它们。其中一些是:
- 减肥分类器
- SklearnIntentClassifier :使用 sklearn 的 SVC
- keyworditintentclassifier:匹配字符串和数据(基于规则)
- FallbackClassifier :帮助处理边缘情况和低置信度结果。这在之前的帖子中讨论过。
注
有关回退和处理失败的更多信息,请查看本系列的这篇文章:
让我们看看除了预测意图本身之外,意图分类器通常提供的信息。

意图分类器的典型输出—按作者分类的图像
除了意图之外,这些分类器通常还会返回一个置信度得分(如果是概率模型的话)和一个意图排名。这些在调试你的机器人性能的时候真的很有用。

一些意向分类器如 DIET 也输出意向排名——按作者分类的图片
饮食分类器
DIETCLassifier 是一个基于转换器的模型,既作为实体提取器又作为意图分类器,因此被命名为双重意图实体转换器。由 Rasa 开发。
这是 Rasa 附带的组件之一。让我们讨论一下架构中最有趣的部分。
- 有两种特殊的代币:
_MASK_和_CLS_。 _CLS_令牌通过其他令牌的稀疏嵌入的总和或直接像 BERT 那样的预训练嵌入来表示整个用户消息。它有助于意图分类。_MASK_令牌通过屏蔽随机令牌来帮助一般化模型。它用于计算掩模损耗。- 前馈模块由所有令牌共享,并且默认情况下具有 80%的掉线连接。
- 这些令牌通过前馈层传递到默认情况下有两层的转换器中。
- 然后,这些被传递到使用 Tensorflow 实现的条件随机场模块中。这就是实体提取发生的地方(回想一下,DIETClassifier 能够进行提取和意图分类)。
- 最后,所有三种损失:实体损失、意图损失和屏蔽损失给出了我们试图通过反向传播来减少的总损失。
你可以看到下面的建筑。

饮食分类器——图片来自 Rasa 的论文
为什么饮食分类器如此灵活
Rasa 将 DIETClassifier 设计成非常可定制的。除了你可以在大多数模型中改变的通常的超参数,像时期的数量,隐藏层的数量等等。这些是 Rasa 的 DIETClassifier 提供的功能:
- 添加预训练嵌入:支持 BERT、GloVe 和 ConveRT 等嵌入。这为您提供了使用稀疏嵌入(例如,计数矢量器)和密集嵌入的灵活性。
- 仅将其用作意图分类器或实体提取器:您可以使用 DIET 来完成一项任务,并让其他组件来完成其余任务。
- _ MASK _ variable 标志:这随机屏蔽了某些记号,因此模型有更好的机会进行泛化。
- 修改前馈层的连接密度:默认情况下,DIETClassifier 只保留所有权重的 20%为非零,保持模型轻便,减少过拟合的机会。您可以修改这些超参数来构建越来越复杂的模型。
构建我们的意图分类器
Rasa 使得构建我们自己的组件变得非常简单,从实体提取器、策略和意图分类器一直到拼写检查器和语义分析器。
让我们建立一个基于逻辑回归的意图分类器,它接受我们的 NLU 数据并符合sklearn的LogisticRegression模型。我们将使用和以前一样的聊天机器人,包括 NLU 数据,故事和行动。
蓝图
每个组件都被定义为一个从Component继承的类。有些属性是在类中定义的,还有一组必要的方法,rasa 使用这些方法来训练并最终根据config.yml文件中定义的步骤将数据传递给我们的组件。
我们的意图分类器的高级结构如下所示:
# importsclass LRClassifier(IntentClassifier): *def* __init__(self, component_config: Optional[Dict[Text, Any]] = None) -> None:
super().__init__(component_config) # necessary attributes: eg. name, provides, requires, etc. # necessary methods: eg. train, process, persist, etc.
训练方法
这个方法只是训练我们的分类器。因为我们使用的是 sklearn,所以非常简单。
工艺方法
每次运行 Rasa 的管道时都会执行该方法,这发生在每个用户消息之后。它包含组件的逻辑。在我们的意图分类器的例子中,process方法将包含一个predict调用,它预测一个意图,如果我们需要的话,还有一个意图排名。
持久化方法
这个方法保存了我们的模型供以后使用。我们将使用joblib,因为我们正在使用 sklearn。Sklearn 的文档推荐使用joblib,因为它的模型通常包含许多numpy矩阵。
加载方法
每当您启动聊天机器人时,就会调用load方法。它从保存在persist方法中的文件中加载模型。
评估我们的模型
Rasa 为评估 NLU 和机器人核心提供支持。我们所要做的就是创建一些测试数据并运行rasa test。也支持交叉验证。
为了测试我们的分类器,将测试数据添加到tests/test.yml。它看起来会像这样:
之后,运行:
rasa test
将生成一个results文件夹,您可以通过图表和报告查看分类器的性能。您还将看到DIETClassifier's实体提取的性能。

Rasa 测试支持生成的图表—图片由作者提供
笔记
意图是有限的
你或许可以想象,让一个机器人将一条消息分类到一组排他的类中是非常有限的。Rasa 通过提供对等级意图的支持来帮助解决这个问题,并且正在努力消除所有的意图。
与此同时,我们可以设计一个更好的对话代理,方法是将我们的意图构造得非常通用,然后使用实体或层次意图提取用户消息中更细微的方面。
高级测试
Rasa 提供了许多您可以在测试组件时使用的特性。其中包括:
- 交叉验证
- 比较模型
- 策略测试
还有很多东西,尽管我们不会在这篇文章中讨论它们。
示例代码
https://github.com/Polaris000/BlogCode/tree/main/CustomIntentClassifier
本系列的前几篇文章
第一部分:用 Rasa 构建聊天机器人
第二部分:槽和实体一样吗?
第三部分:处理聊天机器人故障
结论
在这篇文章中,我们讨论了聊天机器人是如何理解用户所说的话的。我们还构建了一个理解简单查询的定制模型,这是通过将用户消息分类到一组固定的意图中来实现的。
我们还谈到了为什么意图是有限的,以及是否有更好的方法来处理意图分类。
希望这篇文章能让你对聊天机器人如何从用户信息中提取含义有所了解。
使用 SAS 研究所的 JMP 软件进行代码和分析验证
当学习一门新的编码语言时,如何验证你的代码和分析是正确的

在 Unsplash 上由Towfiqu barb huya拍摄的照片
介绍
随着许多人开始他们的数据科学之旅,理解和执行编码语言中的代码的能力已经成为对数据集进行分析的先决条件。我个人被各种各样的语言淹没了,人们可以用这些语言来实现代码。我是选择 Python 还是 R?两个都要学吗?Matlab 适合我吗?也许我会用 excel?一旦我选择了一种语言,我如何知道我所做的是正确的?
开始一门新的编程语言可能会非常令人生畏。幸运的是,任何人都可以搜索互联网,在 Coursera 和 Youtube 等网站上学习课程,以帮助加强他们的数据科学教育。一旦掌握了这些基本原理,一个人就可以去 Kaggle,尝试从他们的免费数据集学习,以了解如何执行不同的机器学习技术。虽然这些都是很棒的工具,但是如果有一种简单的方法来验证我所做的分析是否正确,或者至少我得到的答案在可行解决方案的正确空间内,那会怎么样?
嗯…有!
JMP
当我完成运筹学硕士学位并获得数据科学证书时,一个极大地支持了我的 Python 编码教育的应用程序是 T4 JMP 统计软件 T5。JMP 是一个(免费 30 天试用)在线软件,由 SAS 提供,可以为日常用户运行不同类型的分析。没有 JMP,我不得不痛苦地认识到我的分析是错误的(我从来没有失败过一次任务,但如果不是因为 JMP 在我的后兜里,我可能会失败!)。).
特征
你可能想知道 JMP 是如何工作的,它能做什么?虽然我今天不会给出关于 JMP 的完整教程,但我想强调一下它在开始时的一些令人敬畏的特性。

聚类(图片来自作者)
JMP 的聚类部分提供了许多很好的选项,可以通过聚类来查看数据的相似性和差异性。我常用的一种帮助我了解更多数据集的技术是 K 表示集群。

消费者研究(图片来自作者)
JMP 的另一个有趣的产品是消费者研究选项。包括的技术有分类、选择、最大差异、提升、和多因素分析。

多元方法(图片来自作者)
在学习如何用 Python 编程时,我用得最多的部分之一是多元方法部分。今天,我将展示一个主成分(主成分分析(PCA)) 的例子,这是一种降维技术,旨在保持数据集的方差。

预测建模(图片来自作者)
JMP 提供的另一个真正有趣的东西是预测建模部分。它提供的一些技术是当今的热门话题,包括神经网络、Bootstrap Forest、Boosted Tree 和支持向量机。此外,朴素贝叶斯可以为你的预测分析提供很好的基线。

质量和流程(图片来自作者)
JMP 提供的一个附加部分是其质量和流程部分。本节提供的技术包括控制图生成器、测量系统分析、可变性/属性测量图、过程能力、控制图、模型驱动多元控制图、传统控制图、帕累托图、图表、和管理规格限制。

可靠性和存活率(图片来自作者)
JMP 提供的可靠性和生存部分对于事件和未来故障预测非常有用。

放映(图片来自作者)
筛选部分为理解数据集中的异常值以及预测和过程筛选提供了很好的技术。

专业建模(图片来自作者)
最后,今天将概述的最后一个部分是专业建模部分。这一部分非常适合想要对数据集进行预测的数据科学家!
例子
对于这个例子,我们将对威斯康星诊断乳腺癌数据集进行主成分分析(在这里找到它!)。第一步是将数据集加载到 JMP,只需复制并粘贴 excel 或。CSV 文件。

步骤 1:添加新数据集的位置。(图片来自作者)
你会想去文件>新建>数据表>

第二步:复制和粘贴数据。进入 JMP。(图片来自作者)
此时,从 excel 中复制数据。T
然后,在 JMP,进入编辑>和>粘贴列名

JMP 的数据示例(图片来自作者)
对于这个数据集,我们的目标标签是“标签”列,其中“0”表示“良性”,“1”表示“恶性”。在实际的 PCA 中并不使用这个标签,但是我们希望我们的 PCA 图显示两个不同分类的分组。要在 JMP 执行此操作,请转到 index 列并选择红色向下箭头。从选项中选择行选择然后“选择所有行”。

选择所有行(图片来自作者)
一旦选择了所有的行,我们希望通过它们的目标标签来标记它们。在同一选择框中,选择颜色或按列标记。

然后,您将希望转到“标签”列,并选择该列来标记所有数据列。

选择“标签”栏(图片来自其他)
现在,我们可以进行 PCA 了!
主成分分析示例

实现 PCA(图片来自作者)
第一步是去
分析> >多元方法> >主成分

设置 PCA(图片来自作者)
然后,您会想要将所有的特性列输入到 Y 列中。不要将标签列添加到 Y 列中!。添加完列后,点击确定。
度量分析

JMP 的输出窗口(图片来自作者)
一旦你进行分析,上面的窗口是 JMP 给出的输出窗口。

特征值(图片来自作者)
JMP 将首先给出每个主成分的特征值。使用 Kaiser 标准(任何大于 1 的特征值),我们将保留组件 1-6。使用 Jolliffe 的标准(任何大于 0.7 的特征值),我们仍然只保留组件 1-6。

其他指标(图片来自作者)
通过单击主成分:相关性上的向下箭头,可以获取其他模型指标。另一个需要得到的重要图形是碎石图,可通过选择碎石图得到

碎石图(图片来自作者)
Scree 图验证了 Kaiser 和 Jolliffe 的标准,即该数据可由 6 个主成分解释。

PC 1 与 PC2(图片来自作者)
绘制前两个组成部分,两种类型的肿瘤之间有明显的区别(红色=“良性”,蓝色=“恶性”)。第一个成分解释了数据中 63.40%的方差。
用 python 试试这段代码,你会得到同样的结果(如果我得到足够多的请求,以后的帖子!)
结论
在学习如何用 Python(或者你选择的计算机语言)编码时,JMP 是一个很好的工具,可以用来验证你实现的分析。虽然今天讨论了 JMP 的许多应用,但是 JMP 提供的更多分析功能值得您深入研究。你可能会想,如果我有 JMP,为什么还要费事编码呢?对于任何黑盒程序,用户在接受表面答案时都应该保持谨慎。当使用任何不同的算法函数时,一定要研究该函数实际上为该软件做了什么操作。此外,数据科学家可能需要 JMP 之外的许多功能,以及更多计算能力的必要性。使用编码语言允许在构建模型时对方程的设计和超参数调整进行更多的控制。也就是说,我强烈推荐使用 JMP 来帮助加快你的学习过程,并且在编码时多尝试自己学习一门语言,看看你得到的答案是否正确!
请在 LinkedIn 上加我或者随时联系!一如既往,关注我,让我知道你是否希望在未来看到任何内容!感谢阅读!
随机森林和决策树是如何决定的:用 Python 简单解释了一个例子
什么是决策树?什么是随机森林?他们如何决定分割数据?他们是如何在分类任务中预测类别标签的?9 分钟解释一切。

一个由 3 棵决策树组成的随机森林的可视化例子( Source )。
嗨伙计们!我希望你一切都好。我早就想写这个帖子了,所以现在就来了!我们开始吧!
介绍
- 随机森林是一种用于分类、回归和其他任务的集成学习方法[1]。它是一种非常著名的机器学习(ML)算法,被广泛应用!
- 每个随机森林由多个决策树(有道理;一个森林包含许多树!).
- 在分类 任务中,随机森林的输出是样本的类。例如,您可以使用动物图像作为输入(以矢量化的形式)并预测动物种类(狗或猫)。
- 在分类 任务中,我们需要有一个标签为的数据集。这是指知道每个样本(上例中的猫/狗)的标签 / 类别。
在我们了解随机 森林 (RF)如何工作和决策之前,我们需要先了解什么是决策 树以及它们是如何工作的。
决策树
示例 1:理想情况
假设我们有一个标记为 的数据集,总共有 10 个样本。这些样品中的 5 个属于狗类(蓝色),其余 5 个属于猫类(红色)。此外,我们假设我们只有 2 个特征/变量,因此我们的变量空间是 2D。
以下是创建数据集并绘制数据集的一些 Python 代码:
X , y = make_classification(n_samples=10, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, random_state=0)c = ["blue" if i==0 else "red" for i in y]plt.figure(dpi=200)
plt.scatter(X[:,0], X[:,1], c=c)
plt.xlabel("x")
plt.ylabel("y")
plt.axvline(x=0.9, label="split at x=0.9", c = "k", linestyle="--")
plt.legend()
plt.show()

图 1:数据集的例子。作者用 python 制作的图。
决策 树做的事情很简单:它们找到方法分割数据,例如尽可能多地分离类的样本(增加类的可分离性)。
在上面的例子中,完美 分裂将是在 x=0.9 处的分裂,因为这将导致 5 个红色点在左侧,5 个蓝色点在右侧(完美 类 可分离性)。每次我们像这样分割空间/数据时,我们实际上构建了一个具有特定规则的决策树。
决策树将如下所示:

图 2:决策树。在 x=0.9 时分割。作者在 smartdraw 中制作的图。
这里我们最初有包含所有数据的根 节点,然后,我们在 x=0.9 处分割数据,导致两个分支,导致两个叶 节点。由于我们不能进一步分割数据(我们不能添加新的决策节点,因为数据已经完全分割),决策树构造到此结束。
无需在第二特征维度,即 y 轴上分割数据。
进行新的预测:如果我们将传递一个新的 样本(例如,来自测试集),该样本具有一个特征/变量 x=5 ,它将在左叶节点结束,并将被分类为类****红色。
每次我们在一个特定的 x 或 y 坐标上分裂,我们就创建了一个决策节点!
示例 2:使用基尼系数的真实案例
通常,数据不能如此容易地分离,并且需要大量的努力/迭代(这在模型训练/拟合期间完成)来找到最佳分割。
但问题是:
我们如何用数学公式找到这些分裂?
让我们看看另一个例子,现在有 3 个类,每个类有 5 个样本。以下是创建数据集并绘制数据集的一些 Python 代码:
X,y = make_classification(n_samples=15, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, random_state=1,n_classes=3, n_clusters_per_class=1)c = ["blue" if i==0 else "red" if i==1 else "green" for i in y]plt.figure(dpi=200)
plt.scatter(X[:,0], X[:,1], c=c)
plt.xlabel("x")
plt.ylabel("y")
plt.axvline(x=0.9, label="split at x=0.9", c = "k", linestyle="--")
plt.axhline(y=0.4, xmin=0, xmax=0.59, label="split at y=0.4", c = "pink", linestyle="--")
plt.legend()
plt.show()

图 3:数据集的例子。作者用 python 制作的图。
让我们首先使用和以前一样的初始规则(我们在 x=0.9 时分开)。

图 4:决策树。在 x=0.9 处分割。作者在 smartdraw 中制作的图。
我们再次从一个包含所有数据的根 节点开始,然后,我们在 x=0.9 处分割数据,导致两个分支,导致两个叶 节点。右叶包含所有蓝色样本,左叶包含 ref 和绿色样本。
在这里,我们不能停下来,我们需要向前迈进一步。我们现在将在第二特征维度,即 y 轴上分割数据,以尝试从红点中修复绿点。
决策树变成(对于 y=0.4 的分割):

图 5:决策树。第二个 在 y=0.4 时分裂。作者在 smartdraw 中制作的图。
进行新的预测:如果我们将传递一个新的 样本(例如,来自测试集),该样本具有一个特征/变量 x=5 和 y=-2 ,它将在左叶节点结束,并将被分类为类****绿色。
提醒:每次我们在一个特定的 x 或 y 坐标上分割,我们创建了一个决策节点!
基尼不纯与基尼收益
基尼系数背后的原理很简单:
- 假设您在我们的数据集中随机选择了一个样本。
- 接下来,根据数据集中的类分布对其进行随机分类。
基尼杂质告诉我们,我们对数据点分类错误的概率是多少【3】。
在上面的例子中,我们通过目视检查发现了完美的分离水平。然而,在现实世界的问题中,这是不可能的,因为样本和特征的数量很大。为了找到最佳分割级别(在每个特征维度中),决策树选择最大化基尼增益【3】的分割。
可能的最佳基尼系数为 0,它对应于模型当前水平/状态下的最优分割。
数学 公式如下。
对于我们数据中的 C 类, p(i) 是选择属于 i 类的数据样本的概率, Gini 杂质 (G)由下式给出:

作者在 markdown 制作的公式。
现在,让我们回到我们的第一个(最简单的)例子(例 1** ),定义一个新的不良分割并逐步估算基尼杂质和增益!**
首先,让我们估计** p(i)对于每个类 ( 还没有拆分)😗*
- 蓝色 类:我们 10 个样本中有 5 个是蓝色的,所以 p(蓝色)= 5/10=0.5 概率随机挑选一个蓝色样本。
- 红色
现在,让我们估计初始 G(还没有任何分割):
- ****G0**= 0.5 (1–0.5)+0.5 (1–0.5)= 0.5
(50%的机会将其错误分类,因为我们有 4 个可能的事件,只有 2 个是正确的,即选择蓝色,将蓝色分类,选择蓝色,将红色分类,选择红色,将蓝色分类,选择红色,将红色分类)。****

图 6:数据集的例子。作者用 python 制作的图。
现在,让我们估计一下 x=0.2 的“非完美”分割的基尼系数。
- G _ left _ space=(3/3)(1–3/3)(蓝色)+ 0(无红色)= 0 (值不错,因为我们只有蓝点,没有红色,即杂质为 0)。*
- G _ right _ space=(2/7)(1–2/7)(对于蓝色)+(5/7)(1–5/7)(对于红色)= 0.4081 (此处杂质不为 0,因此这意味着分离包含不同类别的样品)。**
通过从原始杂质 G0(无分割)中减去加权杂质(G_left & G_right)来计算最终基尼系数:
- Gini_gain = G0 — (3/10)0(左)— (7/10)0.4081 = 0.5— (3/10)0(左)— (7/10)0.4081 = 0.214****
提醒:基尼系数越高,分割越好。
总之,决策树算法尝试了许多不同的分割,它估计每个分割的基尼系数,并根据最大基尼系数进行分割。因此,我们最终得出基尼系数的最优分割。
任务:现在尝试估算如图 1 所示的完美分割的基尼系数。
提示:你会很容易地发现 G0 = 0.5,G_left & G_right = 0,这样基尼增益为 0.5-(5/10)0-(5/10)0 = 0.5!**
随机森林
既然你已经理解了决策树是什么,以及它是如何找到最佳分裂的(基于基尼增益),那么是时候介绍随机森林了。
随机森林只不过是决策树的集合。这里需要注意的一件重要事情是,对于随机森林中的每个唯一决策树,随机森林通常使用可用变量/特征的子样本,而不是所有变量/特征。
例如参见https://sci kit-learn . org/stable/modules/generated/sk learn . ensemble . randomforestclassifier . html模型中的输入参数“ max_features ”。
最后,随机森林通常通过采取多数 投票或构成森林的个体决策树的平均预测类来决定。
结论
决策树和随机森林是强大的机器学习模型,可用于回归和分类。在分类问题的情况下,如上所述,最佳分割是基于基尼系数进行的。
在不久的将来,我将写一篇纯 python 的文章,展示如何使用 sklearn 和真实数据拟合模型。
请务必订阅我的邮件列表,以免错过!
那都是乡亲们!希望你喜欢这篇文章。有什么问题吗?把它们作为评论贴出来,我会尽快回复。
如果你想在交互式路线图和活跃的学习社区的支持下自学数据科学,看看这个资源:https://aigents.co/learn
敬请关注并支持这一努力
如果你喜欢这篇文章并觉得有用,关注我,确保你订阅了我的邮件列表并成为会员:
- 短短 5 秒我的邮件列表:https://seralouk.medium.com/subscribe
- 成为会员,支持我:https://seralouk.medium.com/membership
参考
[1]https://en.wikipedia.org/wiki/Random_forest
【3】https://en.wikipedia.org/wiki/Decision_tree_learning
和我联系
您可能还喜欢:
如何对 Google Data Studio 图表中的分类数据进行自定义排序?

Maksym Kaharlytskyi 在 Unsplash 上的照片
Google Data Studio 中一个缺失特性的几个变通方法
Data studio 是谷歌的一款免费工具,可以让你构建仪表盘和报告。您可以通过各种来源连接数据,包括 BigQuery、MySQL、PostgreSQL、sheets 甚至上传 CSV 文件。一旦你加载了数据,你就可以创建基本的图表、下拉列表、“大数字”框和文本。外观和感觉是“功能性的”,而不是美观的。
有一些功能限制,它与 Looker(也属于 Google now)或 Tableau 不在一个联盟中。公平地说,这是一个免费的产品(无论是构建还是查看),我必须提醒自己这一点,但它肯定不是我最喜欢的工具。
本周我遇到了一个问题,这个问题本来应该很容易做到,但是我必须找到一个变通办法(这个办法不那么容易找到)。
问题是
在 Google Data Studio 中,没有明显的方法可以改变饼图或条形图中分类数据的顺序。默认情况下,使用响应的数量,这在这些是数据顺序的情况下没有意义。
如果你想改变数据在数据工作室图表中的显示顺序,那么这篇文章就是为你准备的!
目标
我想制作一个条形图,显示按客户关系平衡变化量细分的客户数量。数据已经准备好,分为以下几类:
- 减少 10%以上
- 减少<10%
- Increase <10%
- Increase > 10%
这些数据显然是有顺序的(即它是有序的)。但由于某种原因,Google Data Studio 很难在一个图表中对这些数据进行排序。默认情况下,图表按记录排序。然而,如果“增长> 10%”在图表的底部,阅读图表会容易得多。

作者图片
有两个选项可以解决这个问题,这取决于您希望图表的标签看起来像什么。
选项 1
选项 1 不会改变标签的外观。您需要创建一个新字段,并使用 CASE 表达式根据分类变量的名称创建一个数字。
在“数据”窗格中添加一个新字段:

作者图片
大小写的工作方式与 Excel 中的“IF”相同。它评估第一部分,看它是否为真,如果是,那么它将返回一个数字。您为数据中的每个标签写下“何时”。确保放在“然后”后面的数字是您想要的顺序!
作者代码
您将新创建的字段放到排序中,它应该会工作。有时它可能会因聚合方法的不同而混淆,默认情况下,它通常选择“SUM ”,但如果它不起作用,请尝试另一种聚合方法。我的只能正常工作。
这是最终的结果。现在可以更清楚地看到,对照组的余额不太可能增加,而更有可能大幅减少。

作者图片
选项 2
第二种选择是改变数据的标签方式,在前面加一个数字,然后按字母顺序排序。数据标签将显示这种标记,因为 Google Data Studio 似乎没有在图表中重新标记变量的功能。

作者图片
要更改数据排序的方式,您可以将想要排序的维度放到“辅助排序”上。

作者图片
这是排序后的样子。此选项的缺点是您可以看到图例中的编号。

作者图片
作为一个免费工具,谷歌数据工作室完成了这项工作,但这些繁琐的事情确实让它感到沮丧。
注:此数据是为了说明问题而合成的。
我喜欢为商业用户写关于数据科学的文章,我热衷于使用数据来提供切实的商业利益。
您可以通过 LinkedIn 与我联系,并通过 Medium 关注我,了解我的最新文章。
你如何知道你的分类模型是好的呢?
原文:https://towardsdatascience.com/how-do-you-know-if-your-classification-model-is-any-good-6977ebc87798
确定您的模型在您的目标环境中是否成功的指导
如果你是机器学习的新手,并且开发了一个分类模型,那么恭喜你!你可能会想,“现在怎么办?”
这是一个很好的问题。
有了 auto ML 技术,模型创建比以往任何时候都更容易。困难在于确定这个模型是否好。在本文中,我将探讨如何确定您的模型是否满足您的业务用例(剧透:这不是非黑即白)。
我们谈论的是哪种分类?
在我跳到如何评价你的分类模型之前,我想澄清一下,虽然我在本文中给出的例子都是二元分类,但也有多类分类的问题。不同的是,在二分类中,目标变量只有两个值,而在多类中,它有两个以上的值。
对于多类模型,我在本文后面谈到的许多度量计算都会稍有变化,所以如果您评估的是这种模型,请确保查找正确的公式。
将您的模型与基线进行比较
“机器学习模型的性能是相对的,关于一个好模型可以达到什么分数的想法只有在其他模型的技能分数的背景下才能理解,这些模型也是根据相同的数据训练的。”——杰森·布朗利,【machinelearningmastery.com
由于每个机器学习数据集都是不同的,所以成功是主观的。
让评估机器学习模型真正客观的唯一方法是在同一数据集上比较不同的模型。而且,就像科学实验一样,我们需要一个“对照组”实验中的控制组是没有干预的,并且测量结果。这就是基线模型的用武之地。

来源:https://unsplash.com/photos/gKUC4TMhOiY
你可以认为一个基线模型很少或没有干预。在分类模型中,这将是您对每个观察值猜测出现最多的结果(即模式)的地方。所以…算不上是一个模型。但这是一个有用的基线,因此当您评估您的模型时,假设它检测到欺诈,您可以说,“嘿,我的逻辑回归模型比我随机指定交易为欺诈或非欺诈要好 40%!”(这个随机分配是 ROC 曲线上的“无技能”线,我将在后面更详细地介绍。)
另一种建立基线的方法是,在没有机器学习的情况下,看看你的企业目前在做什么。无论是手动检查某些标准,使用公式(如 if/then 语句),还是其他方式——将该过程的成功率与您的模型进行比较。
确定成功的衡量标准
一旦你有了一个基线模型和与之比较的其他模型选项,我们就可以开始讨论成功度量了。你将如何根据基线给你的模型打分?在我们查看性能指标选项之前,有一些注意事项需要记住。
确定风险承受能力
你对你的模型犯错误有多满意?现实世界的后果会是什么?
当考虑您的用例的风险容忍度时,这些是很好的问题。您的回答可以指导您使用哪些指标来评估模型,以及为它们设置什么阈值。
例如,如果你的模型预测某人是否患有疾病,你就非常厌恶风险。与假阴性相关的后果——告诉某人他们没有生病,而实际上他们没有生病——是很严重的。
当我们谈论假阴性、真阳性等等时,它会变得令人困惑。(这些值的矩阵甚至被称为混淆矩阵——谈谈自我意识。)因此,在我们开始计算性能指标之前,这里有一个快速参考视图,使用与上一段相同的示例:

作者图片
阶级不平衡
在选择度量标准来评估您的模型之前,另一件要确定的事情是等级不平衡。对于目标变量的正实例和负实例,具有平衡类的数据集将包含大约相同数量的观察值。
根据您的用例,拥有平衡的类可能不可行。例如,如果您希望您的模型检测垃圾邮件,那么目标变量的正值将意味着该邮件是垃圾邮件。然而,大多数发送的电子邮件都不是垃圾邮件,所以你的数据集必然是不平衡的。不用慌!当你选择一个指标来评估你的模型时,请记住这一点——选择一个对阶级不平衡不太敏感的指标。

**来源:https://unsplash.com/photos/D2TZ-ashGzc
分类的性能指标
下面是一些用于评估分类模型的指标。这不是一个全面的列表,但它涵盖了最常见的指标:
精度:模型的精度是正确预测与预测总数的比值。
- 何时使用:当你的类是平衡的,并且你想正确地预测两个类的时候。如果您的类不平衡,单独使用准确性会有缺点-如果您的少数类只有很少的观察值,那么即使模型所有这些都是错误的,它仍然可以有很高的准确性分数。
- 例如:如果您有一个模型可以预测图像中是包含一只猫还是一只狗,那么您会对这两个类别的正确预测感兴趣,并且一种类型的错误分类不会比另一种类型的错误分类带来更多的风险。准确性是评估该模型的一个好方法。
精度:模型的精度是真阳性与真阳性和假阳性之和的比值。简单地说,这是正确的目标变量的肯定识别的比例。
- 何时使用:当你想减少误报的时候。
- 示例:对于垃圾邮件预测模型,误报会给电子邮件收件人带来不良后果,该模型会将普通电子邮件识别为垃圾邮件(误报),当该电子邮件确实包含有价值的信息时,它会被发送到另一个文件夹。在这种情况下,您可能希望使用精度来评估模型。
召回:模型的召回率(有时也称为敏感度)是真阳性与真阳性和假阴性之和的比值。
- 什么时候使用:当你想最小化假阴性的时候。
- 例如:对于疾病预测模型,你真的不想告诉某人他们没有生病(假阴性),所以你想用回忆来评估你的模型。
曲线下面积(AUC) :该指标测量 ROC 曲线下的面积,ROC 曲线是不同分类阈值下的真阳性和假阳性的图。
- 何时使用:当您想要确保您的模型优于无技能模型或者您想要查看模型的整体性能时。
- 示例:下图显示了表现不佳模型的 AUC 曲线。虚线描绘了随机猜测(无技能模型)——因此对于这个模型,AUC 为. 54,它的表现仅仅比猜测好一点。

作者图片
F1 分数:F1 分数衡量一个模特在正面课堂上的表现。这是精确和回忆的调和平均值。
- 何时使用:当你对精确度和召回率都感兴趣的时候。它在不平衡数据集上也能很好地工作。
- 例如:对于疾病预测模型,你可能会认为在某人生病时告诉他/她没有病和在他/她好的时候告诉他/她有病都是不好的结果。由于您希望最大限度地减少这两种情况,F1 分数是评估您的模型的一个不错的选择。
过度拟合和欠拟合
在您确定您的模型相对于基线模型表现良好之后,您仍然没有完成!现在,您需要使用测试数据集来评估结果。这通常是通过从训练中拿出一定比例的数据集来完成的,以便您可以使用它来测试您的模型。一种更先进的测试方法是交叉验证——这种技术使用数据子集进行多次迭代训练和测试,减少了测试只进行一次时出现的一些可变性。
如果您的模型在训练数据集上表现非常好,而在测试数据集上表现不太好,那么您就遇到了过度拟合的情况-您的模型与训练数据拟合得如此之好,以至于它无法拟合其他数据集。进行训练、测试和验证分割被认为是最佳实践,有助于防止过度拟合。要了解更多关于测试和验证数据集之间的区别,请查看本文。
如果您的模型在训练或测试数据集上表现不佳,则可能存在拟合不足的情况。在丢弃用例之前,看看其他的模型选项是一个好主意。
结论
我希望现在你已经知道你的机器学习模型是否是一个好模型。如果您已经意识到您的模型不符合标准,请关注我的下一篇文章,在那里我将讨论如果您的模型不能正常运行该怎么办。
特别感谢米内特·波尔西内利、马克·格里斯曼和尼尔·瑞恩。本文原载于【community.alteryx.com】。
Docker 如何在英伟达 GPU、AWS 推理和其他硬件 AI 加速器上运行机器学习
了解 Docker 如何在 Kubernetes 上简化对 NVIDIA GPUs、AWS 推理和缩放 ML 容器的访问

作者插图
如果几年前你告诉我,数据科学家将在他们的日常工作中使用 Docker 容器,我不会相信你。作为更广泛的机器学习(ML)社区的一员,我总是考虑 Docker、Kubernetes、Swarm(还记得吗?)供 IT/运营专家使用的奇特基础设施工具。今天是一个不同的故事,我几乎没有一天不使用 Docker 容器来训练或托管模型。
机器学习开发区别于传统软件开发的一个属性是,它依靠专门的硬件如 GPU、Habana Gaudi、AWS Inferentia 来加速训练和推理。这使得独立于硬件的容器化部署变得非常困难,而这正是容器的主要优势之一。在这篇博文中,我将讨论 Docker 和容器技术是如何发展来应对这一挑战的。我们将讨论:
- 为什么 Docker 已经成为当今机器学习的重要工具,以及它如何解决机器学习的特定挑战
- Docker 如何访问拥有多种类型处理器(CPU + AI 加速器)的异构系统上的专用硬件资源。
- 不同的人工智能加速器如何扩展 Docker 的硬件访问,以 1/NVIDIA GPU 和 NVIDIA 容器工具包以及 2/ AWS 推理和神经元 SDK 对容器的支持为例
- 如何利用硬件加速节点在 Kubernetes 上扩展 Docker 容器
这篇博文的很大一部分是 motiviation 和“它如何在引擎盖下工作”,但我也包括了如何开始使用 NVIDIA GPUs 上的 Docker 容器或 AWS 上的 AWS 推理工具的演练、链接和截图,因此对于学习者和实践者来说都有一些东西。
Docker 和机器学习没有一起长大(但他们现在是最好的朋友)
如今,大多数组织使用 Docker 和容器技术来简化开发和部署过程,因为容器化的应用程序是一致的、可移植的,并且保证可再现性。虽然 Docker 容器应该是硬件不可知的和平台不可知的,但是大多数基于机器学习的软件栈是硬件特定的,并且需要访问主机操作系统上的硬件和硬件驱动程序。为了更好地理解这个问题,让我们仔细看看典型的机器学习软件栈的解剖。
典型机器学习软件堆栈剖析

作者插图
上图所示的软件堆栈看起来非常典型。用蓝色花括号显示的顶部包括你的代码、你正在使用的框架、语言和其他底层库。无论您使用什么应用程序、框架或语言,这一部分看起来都是相似的。栈的其余部分是机器学习开始变得独特的地方。绿框是影响便携性的硬件特定组件,它们的作用如下:
- AI 加速器 ML 库:这些是 ML 框架用来在 AI 加速器硬件上实现机器学习训练或推理例程的低级库。他们实现线性代数和其他计算密集型例程,这些例程可以并行化并在 AI 加速器上运行。
- 人工智能加速器驱动程序:这些是主机操作系统用来识别和支持人工智能加速器硬件的驱动程序。
- AI 加速器:这是一款专用处理器,旨在加速机器学习计算。机器学习主要由矩阵-矩阵数学运算组成,这些专门的硬件处理器旨在通过利用并行性来加速这些计算。你可以在其他博客文章中阅读更多关于 AI 加速器的内容:1/AI 加速器指南2/AI 加速器的演变
拥有一个 CPU +其他类型处理器的系统称为异构系统。异构系统提高了性能和效率,因为有专用于特定任务的处理器,但代价是增加了复杂性。这种复杂性的增加给软件堆栈的可移植性和开发者用户体验带来了挑战。这是 Docker 必须解决的挑战,我们将在下面看到它是如何做到的。
Docker 如何支持主机设备?
默认情况下,Docker 容器不能访问主机操作系统资源,这是设计使然。Docker 容器旨在提供进程隔离,因此用户必须提供对主机资源(如卷和设备)的显式访问。您可以通过使用—-devices参数来做到这一点,但是它带有一些警告。

作者插图
一些硬件设备,如 USB 和串行设备,具有在内核空间运行的驱动程序,Docker 必须依赖主机内核并执行系统调用来与设备硬件交互。使用--device参数并安装设备,可以在 Docker 容器进程中轻松访问这些设备。然而,其他硬件设备,如一些网卡和人工智能加速器,其驱动程序具有用户空间组件和内核空间模块。在这种情况下,您需要在主机操作系统和 Docker 容器中重复安装驱动程序。
假设您想要启动一个容器进程,并且想要公开一个名为device_name0的设备,那么您将运行以下命令:
docker run --device /dev/device_name0:/dev/device_name0 …
如果device_name0同时具有用户空间和内核空间驱动程序组件,那么您还必须在 Docker 容器中安装设备驱动程序,这将复制主机和容器环境中的驱动程序,如本节顶部的插图所示。
这种设置有一些缺点:
- 增加集装箱尺寸:集装箱应该是轻便易携带的,而司机通常很大,占据很大空间。例如,最新的 NVIDIA GPU 驱动程序可以在容器中占用 350 到 500 MB 的额外空间。这增加了容器映像下载和实例化时间,并且会影响应用程序的延迟敏感性和用户体验
- 驱动程序版本不匹配:为了使该解决方案有效,容器环境和主机操作系统中的驱动程序版本必须匹配。如果它们不同,容器进程可能无法与硬件对话。
- 设置复杂性:在容器中安装驱动程序是额外的步骤,你放入容器中的每一个额外的库或软件都会增加额外的复杂性,并且需要进行测试。
- 便携性下降: Docker 容器被设计成轻量级、便携和硬件无关的。容器中的驱动程序使它变得笨重、特定于硬件、特定于平台,并且基本上没有 Docker 容器的所有优点。
至少,目标应该是通过一种解决方案来解决这些挑战,这种解决方案不需要在容器内复制设备驱动程序,并允许 Docker 通过多个加速器来固定访问系统上的一些或所有 AI 加速器。现在让我们来看看 Docker 是如何应对这一挑战的。
我们如何让 Docker 与专门的机器学习硬件一起工作?

作者插图
我们将从快速概括 Docker 如何运行容器开始。当您使用 Docker CLI 通过docker run …启动一个容器进程时,在它最终调用一个非常重要的库runC之前,会发生一系列的步骤。
runC是一个开放容器倡议(OCI)兼容工具,用于生成和运行容器进程,由 Docker、Podman、CRI-O 和其他流行的容器运行时使用。当您使用 Docker CLI 运行一个容器时,Docker 为runC提供了一个符合 OCI 规范的运行时规范文件(在图中显示为“OCI 规范”)和容器的根文件系统,统称为符合 OCI 规范的Bundle,后者runC将其作为创建和运行容器进程的输入。OCI 规范文件提供了额外的选项,比如启动前和启动后挂钩,以便在创建容器处理之前和之后启动其他进程。硬件提供者可以利用这些钩子将硬件访问注入到容器进程中。让我们看看怎么做。

向 Docker 引入 AI 加速器支持的通用模板。作者插图
人工智能加速器提供者可以使用预启动挂钩来扩展runC的功能,以通过外部应用程序挂钩到容器的生命周期中。这个外部应用程序通常是一个库,它与硬件驱动程序对话,并在容器进程中公开硬件。上图中的蓝框显示了如何使用 Docker 和runC特性向容器进程通告专门的硬件。让我们来看看在 Docker 容器中实现专用硬件支持的通用模板中的组件:
- 自定义运行时: Docker 允许你使用
/etc/docker/daemon.json定义一个自定义运行时。使用定制运行时,您可以截取从 Docker 接收的 OCI 规范,添加一个预启动钩子,并将更新后的规范转发给runC。 - 自定义钩子:
runC从自定义运行时接收的规范中读取预启动钩子,并执行自定义钩子。这个定制钩子调用一个或多个特定于硬件的库,这些库可以与硬件驱动程序对话,并在容器进程中公开它 - custom-inject-hardware-library:这个库负责与硬件驱动程序通信,以收集关于硬件和系统中处理器数量的信息。它还负责将硬件设备安装到容器环境中,并使其可用于容器进程中的应用程序。
下面,我们就来看看 Docker 是如何访问 NVIDIA GPUs 和 AWS 推理的。
启动 NVIDIA GPU 和 AWS 推理亚马逊 EC2 实例
首先,我们将启动 Amazon EC2 实例来演示 Docker 如何与专用硬件一起工作。遵循这个指南为机器学习启动一个 EC2 实例。对于 NVIDIA GPUs,选择任意大小的 P 或 G 系列实例类型。如果你需要帮助在 AWS 上选择正确的深度学习 GPU,请阅读我的博客文章:
对于 AWS 推理实例,选择 Inf1 实例类型。在这个例子中,我启动了inf1.2xlarge (AWS 推理)和p3.8xlarge (4 个 NVIDIA V100 GPUs)。
一旦你选择了你的实例类型,你必须选择一个亚马逊机器映像(AMI),并且我们将使用 AWS 深度学习 AMI ,它预装了 GPU 驱动程序、AWS 推理驱动程序、深度学习框架、conda 和其他工具。选择一个具有您工作所需的深度学习框架的正确类型和版本的 AMI,对于这个例子,我将选择 Ubuntu 18.04 的多框架 DLAMI。
启动 Amazon EC2 实例后,您可以在 EC2 控制台上看到它们,并且可以通过 ssh 进入它们来运行您的应用程序。你也可以阅读我在上的博文为什么要使用 Docker 容器进行机器学习开发?了解如何在 EC2 上运行的 Docker 容器中 ssh 和设置 jupyter 服务器。

亚马逊 EC2 控制台截图
在 Docker 容器中访问 NVIDIA GPUs
NVIDIA 提供了 NVIDIA Container Toolkit ,这是一个工具和库的集合,增加了对 Docker 容器中 GPU 的支持。
docker run **--runtime=nvidia --gpus=all** …
当您运行上述命令时,NVIDIA Container Toolkit 会确保系统上的 GPU 在容器进程中是可访问的。由于我们推出了一个带有 AWS 深度学习 AMI 的 Amazon EC2 实例,您不需要安装 NVIDIA Container Toolkit,因为它是预装的。如果您从基础 AMI 开始,请遵循 NVIDIA Container Toolkit 文档中的安装说明。
NVIDIA 容器工具包的工作原理
NVIDIA 容器工具包包括nvidia-container-runtime、nvidia-container-runtime-hook和libnvidia-container。让我们来看看这些是如何工作的。

作者插图
NVIDIA Container Toolkit 通过在/etc/docker/daemon.json中指定来注册自定义运行时。这个定制运行时是一个 shim,它从 Docker 获取运行时规范,将其修改为预启动钩子规范,并将该规范转发给 runC。

显示 Docker 调用的自定义 nvidia 运行时的屏幕截图
NVIDIA 容器工具包还允许您使用基于文件的配置来配置容器运行时。你可以编辑/etc/nvidia-container-runtime/config.toml文件来为你的驱动程序、运行时间、改变默认运行时间、启用调试等指定不同的位置。如果您没有自定义设置,可以保留默认值。

显示 config.toml 的屏幕截图
假设您运行了以下命令
docker run --runtime=nvidia --gpus=2 …
Docker 接受命令行参数,并将其翻译成符合 OCI 标准的运行时规范。nvidia-container-runtime将预启动添加到该规范中,并将其传递给runC。接下来,runC在修改后的规范中看到预启动挂钩,并在启动容器进程之前调用nvidia-container-runtime-hook。nvidia-container-runtime-hook查看容器运行时配置,以确定您请求在容器进程中公开什么 GPU 或多少 GPU。接下来,它调用libnvidia-container库,该库与 NVIDIA 驱动程序对话,以确定所请求的 GPU 数量(在本例中我们说--gpus=2)是否可用,如果可用,它将这些 GPU 设备注入容器。
为了测试 GPU 访问,我将从亚马逊 ECR 上亚马逊托管的深度学习容器列表中下拉一个 Pytorch 容器。按照该页面中的说明登录 Amazon ECR 并运行docker pull <IMAGE_NAME>。然后运行下面的命令来启动容器。
docker run -it --rm --runtime=nvidia — gpus=all <IMAGE_NAME/ID> nvidia-smi
从输出中我们可以看到,我可以运行nvidia-smi这个工具,它查询并显示这个 EC2 实例上所有可用的 4 个 GPU,并且可以从容器内访问。
注意:如果你使用的是最新版本的 Docker 和 NVIDIA 容器工具包,那么--runtime=nvidia是可选的

显示在 Docker 容器内运行的 nvidia-smi 输出的屏幕截图,该容器显示所有 GPU
如果您想在容器中只暴露 2 个 GPU,那么您可以简单地指定–-gpus=2或枚举您想在容器中使用的两个:
docker run -it — rm — runtime=nvidia — gpus=2 <IMAGE_NAME/ID> nvidia-smi# ORdocker run -it — rm — runtime=nvidia — gpus=’”device=0,1"’ <IMAGE_NAME/ID> nvidia-smi

显示 nvidia-smi 在 Docker 容器中运行的输出的屏幕截图,仅显示 2 个 GPU
在 Docker 容器中访问 AWS 推理加速器
要准备带有 AWS 推理的 Inf1 Amazon EC2 实例,您可以按照 AWS 神经元文档中的步骤安装神经元驱动程序、神经元运行时和一个名为[oci-add-hooks](https://github.com/awslabs/oci-add-hooks)的帮助程序库,它有助于添加 OCI 神经元预启动挂钩。

作者插图
Docker 如何支持 AWS 推理
安装 Neuron SDK 并遵循 Docker 环境设置步骤后,您的系统应该有 oci-neuron-runtime、oci-neuron-hook。让我们来看看它们是如何工作的。

显示神经元运行时的屏幕截图
与 NVIDIA 容器工具包类似,Neuron SDK 通过在/etc/docker/daemon.json中指定来注册自定义运行时。从下面的截图可以看出,自定义 Docker 运行时只是一个 shell 脚本。回想一下,定制运行时的作用是简单地拦截对runC的调用,修改它以包含一个预启动钩子规范,并用更新后的规范调用runC。

显示神经元挂钩垫片的屏幕截图
咱们打开打开oci_neuron_hook_wrapper.sh看看它在干什么:
- 指定到
oci_neuron_hook_config.json位置的路径,这个 JSON 文件定义了预启动钩子应该调用什么库 - 获取
runC库的位置 - 使用
[oci-add-hooks](https://github.com/awslabs/oci-add-hooks),这个工具可以从一个名为oci_neuron_hook_config.json的文件中获取预启动钩子定义,并生成一个更新的运行时规范,并将其传递给runC
我们可以打开oci_neuron_hook_config.json,你可以看到oci_neuron_hook,它是在创建容器进程之前由 runC 调用的库。

显示挂钩配置的屏幕截图
oci_neuron_hook库与 AWS 推理驱动程序对话,以确定请求数量的 AWS 推理设备是否可用,如果可用,它将这些设备注入容器。要在 Docker 中测试 AWS 推理支持,下载下面的 Docker 文件并运行:
docker build . -f Dockerfile.app -t neuron-testdocker images
你应该会看到一个神经元测试图像

显示测试 neuron 的 docker 图像的屏幕截图
启动集装箱
docker run — env — runtime=oci-neuron AWS_NEURON_VISIBLE_DEVICES=”0" neuron-test neuron-ls

显示在 Docker 容器中运行的 neuron-ls 的输出的屏幕截图
您可以看到,neuron-ls 的输出显示了 Neuron 设备 0,它是在容器进程内部执行的。注意:–-runtime=oci-neuron是可选的,因为 neuron 是默认的运行时,如下所示。

显示神经元运行时为默认运行时的屏幕截图
Kubernetes 支持 NVIDIA GPUs 和 AWS 推理
到目前为止,我们已经看到 Docker 如何在一个容器内提供对专门硬件(如 NVIDIA GPUs 和 AWS 推理)的访问,这允许更可移植的机器学习代码。下一步自然是弄清楚如何在像 Kubernetes 这样的编排系统上运行这些 Docker 容器,这样就可以运行大规模部署。这个主题值得在博客中详细讨论,但是为了完整起见,我将快速总结一下如何访问 Kubernetes 中的 AI 加速器资源。
对于 NVIDIA 和 AWS 推理,每个 Kubernetes 节点的主机操作系统都必须包括相关的硬件驱动程序、自定义容器运行时和我们之前讨论过的其他库,以便在 Docker 容器中实现专门的硬件支持。启动亚马逊 EKS 集群最简单的方法是使用[eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) CLI 工具。
- 对于 NVIDIA GPUs 节点,指定一个 Amazon 深度学习 AMI 作为
eksctl中节点的 AMI,因为它预装了 NVIDIA Container Toolkit。 - 对于 AWS 推理节点,
eksctl工具将自动检测到您有一个带有 AWS 推理的节点,并将使用预装了 Neuron SDK、驱动程序和 Docker 支持库的 Amazon Linux AMIs。
接下来,为了使这些 AI 加速器作为系统资源在 Kubernetes 中可用,你需要部署一个特定于硬件的 Kubernetes 设备插件。NVIDIA 和 AWS 都提供设备插件,您可以按如下方式应用:
AWS 推理:
kubectl apply -f k8s-neuron-device-plugin.yml
您可以从 Neuron SDK 文档中下载这个设备插件,它作为一个daemonset运行,并在 pods 中公布要包含的硬件,您可以在清单中的资源下指定 AWS 推理硬件,如下所示:
resources:
limits:
aws.amazon.com/neuron: 1
NVIDIA GPUs:
kubectl apply -f [https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.12/nvidia-device-plugin.yml](https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.12/nvidia-device-plugin.yml)
该 NVIDIA 设备插件也作为daemonset运行,并向 pods 通告硬件,您可以在清单中的资源下指定 NVIDIA GPU 硬件,如下所示:
resources:
limits:
nvidia.com/gpu: 1
你可以在亚马逊 EKS 文档页面上找到更多关于如何开始使用 AWS 推理和 NVIDIA GPU 的详细说明。
闭幕(对,还有视频!)
希望您喜欢了解 Docker 如何在专用硬件上运行以及如何使用它。如果你喜欢这篇博文,我最近做了一个关于相同主题的演讲,你可能会感兴趣。
关于 Docker 如何在人工智能加速器上运行机器学习的 YouTube 视频
谢谢你看完!
如果您觉得这篇文章很有趣,可以考虑在 medium 上关注我,以便在我发布新文章时得到通知。也请查看我在 medium 上的其他博客帖子,或者在 twitter ( @shshnkp )、 LinkedIn 上关注我,或者在下面留下评论。想让我写一个特定的机器学习主题吗?我很想收到你的来信!
反向传播在神经网络中是如何工作的?
用一个例子演示背景如何在神经网络中工作
神经网络在训练阶段通过参数(权重和偏差)的迭代调整来学习。开始时,参数由随机生成的权重初始化,偏差设置为零。随后,数据通过网络向前传递,以获得模型输出。最后,进行反向传播。模型训练过程通常需要前向传递、反向传播和参数更新的几次迭代。
本文将关注反向传播如何在前向传递之后更新参数(我们已经在的前一篇文章中介绍了前向传播)。我们将研究一个简单而详细的反向传播的例子。在我们继续之前,让我们看看我们将在这篇文章中使用的数据和架构。
数据和架构
本文中使用的数据集包含三个特性,目标类只有两个值— 1表示通过,而0表示失败。目标是将数据点分类到这两个类别中的任何一个,这是一种二元分类的情况。为了让这个例子容易理解,我们将在这篇文章中只使用一个训练例子。

图 1: 我们将使用的数据和神经网络架构。我们的训练示例突出显示了其对应的实际值 1。这个 3–4–1 NN 是一个密集连接的网络——当前层中的每个节点都连接到前一层中除输入层以外的所有神经元。然而,我们已经消除了一些连接,使图形不那么杂乱。向前传递产生 0.521 的输出(来源:作者)。
理解:正向传递允许信息沿一个方向流动—从输入层到输出层,而反向传播则相反—允许数据从输出层反向流动,同时更新参数(权重和偏差)。
定义:反向传播是一种监督学习方法,由神经网络用来更新参数,使网络的预测更加准确。参数优化过程是使用一种叫做梯度下降的优化算法实现的(这个概念在你阅读时会非常清楚)。
正向传递产生目标(y)的损失预测(yhat),该预测由成本函数(E)捕获,该成本函数定义为:

等式 1: 成本函数
其中m为训练样本数,L为模型预测yhat而非实际值y时产生的误差/损失。目标是最小化成本E。这是通过相对于(wrt)参数(权重和参数)对 E 求微分并在梯度的相反方向上调整参数来实现的(这就是为什么优化算法被称为梯度下降)。
在本帖中,我们考虑在1训练示例(m=1)上的反向传播。考虑到这一点,E减少到

等式 2: 一个训练示例的成本函数。
选择损失函数 L
损失函数L是基于手头的任务定义的。对于分类问题,交叉熵(也称为对数损失)和铰链损失是合适的损失函数,而均方误差(MSE)和平均绝对误差(MAE)是回归任务的合适损失函数。
二元交叉熵损失是一个适合我们二元分类任务的函数——数据有两类,0或1。二元交叉熵损失函数可以应用于图 1 的中的前向传递示例,如下所示

等式 3:应用于我们例子的二元交叉熵损失。
t=1是真值标签,yhat =0.521 是模型的输出,ln是自然对数——以 2 为底的对数。
你可以通过下面的链接了解更多关于交叉熵损失函数的信息。
既然我们现在理解了神经网络结构和我们将使用的成本函数,我们可以直接讨论反向传播的步骤。
数据和参数
下表显示了3–4–1 NN 所有层的数据。在3-神经元输入端,显示的值来自我们提供给模型用于训练的数据。第二/隐藏层包含我们希望更新的权重(w)和偏差(b)以及在正向传递期间每个4神经元的输出(f)。输出包含参数(w和b)和模型的输出(yhat ) —该值实际上是模型训练的每次迭代的模型预测。一次顺传后, yhat=0.521。

图 2 数据和参数初始化(来源:作者)
A.更新方程和损失函数
重要提示:回想一下上一节:E(θ)=L(y, yhat)其中θ是我们的参数——权重和偏差。也就是说,E是y和yhat和yhat=g(wx+b)的函数,= > yhat是w和b的函数。x是数据变量,g是激活函数。实际上,E是函数w和b,因此可以对这些参数进行微分。
每一层的参数用以下公式更新

等式 4:更新等式
其中t是学习步骤,ϵ是学习速率——由用户设置的超参数。它决定了权重和偏差的更新速率。我们会用ϵ=0.5(任意选择)。
根据等式4,更新量变为

公式 5:更新金额
如前所述,由于我们正在处理二元分类,我们将使用二元交叉熵损失函数,定义为:

等式 6:二元交叉熵损失
我们将在所有层中使用 Sigmoid 激活

等式 7: Sigmoid 函数。
其中z=wx+b是神经元的加权输入加上偏置。
B.更新输出隐藏层的参数
与正向传递不同,反向推进从输出层向后工作到层1。我们需要针对所有层的参数计算导数/梯度。为此,我们必须理解微分链法则。

微分链式法则
让我们以更新w²₁₁和b²₁为例。我们将遵循如下所示的路线。

图 3: 反向传播信息流(来源:作者)。
B1。计算重量的导数
根据微分的链式法则,我们有

记住:当计算上述关于 w·₁₁的导数时,所有其他参数都被视为常数,即 w·₁₂、w·₁₃、w·₁₄和 b·₁.常数的导数是0,这就是为什么在上面的导数中删除了一些值。
接下来是 Sigmoid 函数的导数(参见本文

接下来,交叉熵损失函数的导数(参考资料

输出层上其他三个权重的导数如下(您可以确认这一点)

B2。计算偏差的导数
我们需要计算

从前面的章节中,我们已经计算了∂E和 ∂yhat,剩下的是

我们使用与之前相同的论点,即除了 b ₁之外的所有其他变量都被视为常数,因此当微分时它们减少0。

到目前为止,我们已经计算了关于输出-输入层的所有参数的梯度。

图 4: 输出-输入层的梯度(来源:作者)。
此时,我们已经准备好更新输出-输入层的所有权重和偏差。
B3。更新输出隐藏层的参数

请用同样的方法计算其余的,并在下表中确认它们

图 5: 隐藏输出层的更新参数(来源:作者)
C.更新隐藏输入层的参数
和以前一样,我们需要 E 关于这些层上所有权重和偏差的导数。我们总共有4x3=12个权重要更新,还有4个偏差。例如,让我们研究西₄₃和₂.请参见下图中的路线。

图 6: 隐藏输入层的反向传播信息(来源:作者)。
C1。重量梯度
对于重量,我们需要计算导数(如果下面的等式令人生畏,请遵循图6中的路线)

当我们讨论上述每个衍生工具时,请注意以下要点:
- 在模型输出(当找到
E相对于yhat的导数时),我们实际上是在对损失函数进行微分。 - 在层输出 (
f)(这里我们对 wrtz进行微分),我们找到激活函数的导数。 - 在上述两种情况下,对给定神经元的权重或偏差进行微分会产生相同的结果。
- 加权输入 (
z)与我们希望更新的参数(w或b)不同。在这种情况下,除了感兴趣的参数外,所有参数保持不变。
进行与第B节相同的过程,我们得到:
- 层的加权输入
1

- 应用于第一层的 Sigmoid 激活函数的导数

- 输出层的加权输入。
f-值是隐藏层的输出。

- 应用于最后一层输出的激活函数。

- 二元交叉熵损失函数的导数 wrt 到
yhat。

然后,我们可以把所有这些放在一起

C2。偏差梯度
使用和以前一样的概念,检查一下,对于₂,我们有

隐藏输入的所有梯度值如下表所示

图 7: 隐藏输入层的渐变(来源:作者)。
此时,我们已经准备好计算隐藏输入端的更新参数。
C3。更新隐藏输入的参数
让我们回到更新方程,继续更新₁₃和₃

那么,我们需要更新多少参数呢?
我们在隐藏输入层有4x3=12权重和 4x1=4偏差,在输出隐藏层有4x1=4 权重和1偏差。总共有 21 个参数。它们被称为可训练参数。
隐藏输入层的所有更新参数如下所示

图 8: 隐藏输入层的更新参数(来源:作者)。
我们现在已经使用误差反向传播获得了图 8 和图 5 中所有层的更新参数。用这些更新的参数运行一个正向传递产生一个模型预测,从0.521上升到0.648的yhat。这意味着模型正在学习——经过两次迭代训练后,接近1的真实值。其他迭代产生0.758、0.836、0.881、 0.908、0.925、…(在下一篇文章中,我们将为许多训练示例和迭代实现反向传播和正向传递,您将会看到这一点)。
定义
- 历元 —一个历元是指整个数据集通过网络一次。这包括正向传递和反向传播的一个实例。
- Bath size 是同时通过网络的训练样本数。在我们的例子中,我们有一个训练的例子。在我们有一个大数据集的情况下,数据可以通过网络批量传递。
- 迭代次数 —使用设定为批量的训练样本,一次迭代等于一次通过。一次传递是正向传递和反向传播。
例: 如果我们有 2000 个训练例,设置批量为 20 个,那么 i t 需要 100 次迭代才能完成 1 个历元。
结论
在本文中,我们通过一个例子讨论了反向传播。我们已经看到如何使用微分链规则来获得不同方程的梯度——损失函数、激活函数、加权方程和层输出方程。我们还讨论了如何使用损失函数的导数来更新每一层的参数。在下一篇文章(附后)中,我们用 Python 实现了这里学到的概念。
请以每月 5 美元的价格注册成为 medium 会员,以便能够阅读我和其他作者在 Medium 上的所有文章。
你也可以订阅,当我发表文章时,你可以把我的文章发到你的邮箱里。
感谢您的阅读,下次再见!!!
你可能会发现这些文章很重要
线性回归到底是怎么工作的?
原文:https://towardsdatascience.com/how-does-linear-regression-really-work-2387d0f11e8
普通最小二乘法背后的数学和直觉(OLS)
你知道线性回归如何在“保持其他一切不变”的情况下衡量效果吗?或者它如何最小化误差平方和?在这篇文章中,我们将讨论如何,以及更多。

照片由 Datingscout 在 Unsplash 上拍摄
我们将利用矩阵代数和 python 来理解正在发生的事情。可能的话,我们会深入。但是,由于主题的复杂性,我们还会链接更多信息的外部资源。
这篇文章的主要来源是斯坦福大学统计课的课堂笔记。
事不宜迟,让我们开始吧…
技术 TLDR
普通最小二乘(OLS)线性回归通过最小化残差的平方来拟合数据。为此,我们…
- 用公式表示线性回归方程的残差。
- 求残差平方和的导数。
- 求解上面导数为零的β系数值。
通过平方误差,我们的误差曲线变成一条向上的抛物线。因此,如果我们求解最优解,我们保证会求解全局最小值。
1 —但是实际上发生了什么呢?
好了,我们将放慢速度,浏览一些演示,以便真正理解幕后发生的事情。
1.1 —线性回归的目的
在本帖中,我们将寻找熊猫宝宝的体重模型(照片用于科学目的)。

我们的自变量的一些例子包括age(数字)、amount of bamboo eaten(数字)和whether they had siblings(布尔)。我们还将添加常量值1来计算 y 截距。
甚至在开始之前,为了建立weight ~ predictors模型,我们必须做一些基本的假设,比如线性、正态性和同方差。这里有一个关于 OLS 的假设的非常深入的资源,但是为了简洁,我们不打算覆盖这些假设。
1.2 —数学目标
现在有许多方法来拟合我们的 X 和 y 之间的关系。普通最小二乘法(OLS)是最简单和最常用的方法。它寻求最小化残差平方和。
残差是我们的线性回归线和数据点之间的距离,如图 1 中的红线所示。

图 1:残差的可视化(红色)。图片作者。
平方残差是一种测量模型拟合的常用方法,因为它简单,易于数学处理,并且保证为正。在某些情况下,我们可能希望将高估(正残差)与低估(负残差)区别对待,但这本身就是一个完整的主题。
总之,OLS 的目标是找到使残差最小化的直线的斜率。

图 2:2D 超平面的例子— src 。图片作者。
在我们的例子中,我们有多个预测器,所以我们将拟合一个高维超平面,如图 2 所示。很难想象三维以外的任何东西,但希望这个有 3 个轴(独立变量)的例子可以在概念上进一步外推。
太好了!有了这个设置,让我们进入数学。
2—OLS 的矩阵代数
我们将假设没有矩阵代数的先验知识。此外,因为许多读者可能熟悉代码,我们将利用 python 来理解矩阵符号。
在开始之前,这里是这篇文章的所有源代码。如果需要,请随意使用。
步骤 0:设置我们的数据
我们将创建上面提到的独立变量。为了确保一定程度的线性,我们将使用这些来创建我们的因变量baby_panda_weight。
接下来,让我们绘制age对baby_panda_weight(图 3)来看看我们做得如何。

图 3:使用虚假数据绘制的年龄与体重图。图片作者。
总的来说,剧情上似乎有一种比较线性的关系。
接下来让我们用数学符号做同样的事情(不实际创建真实数据)…

图 4:自变量(X_ij)和因变量(Y_i)的矩阵符号。图片作者。
在图 4 中,每行对应一个独特的观察,每列对应一个变量。矩阵Y有一列对应于baby_panda_weight,矩阵X有 4 列对应于我们的 4 个自变量。
在继续之前,先简单说明一下。python 中的 Pandas 数据框使用相同的结构-列是要素,行是唯一的观察值。然而, numpy 数组的默认实现是相反的。
import pandas as pda, b = [1,2,3], [4,5,6]numpy_arr = np.array([a, b])
pandas_df = pd.DataFrame(dict(a=a, b=b))numpy_arr.shape # (2,3)
pandas_df.shape # (3,2)
在 numpy 中工作时,转置数据以返回到一个行 x 列形状通常很有帮助。
步骤 1:定义优化问题
现在我们有了用矩阵表示的小熊猫数据,让我们用简单的矩阵符号定义 OLS…

图 5:线性回归的最简单公式。作者图片
这里,我们有四个术语。y和X同上——它们分别是因变量和自变量的向量。但是,我们也添加了两个新术语:beta ( β)和 epsilon ( ε)。β是我们自变量的线性系数矩阵——它显示了 X 的一个单位变化对 Y 的影响程度。ε是一个误差矩阵——它显示了我们的预测有多错误。
现在不要担心翻译。我们稍后再来。
第二步:制定残差
酷毙了。现在我们已经定义了我们的术语,让我们开始寻找最好的测试集。
如上所述,贝塔需要最小化残差平方和。但是,我们如何计算残差呢?
让我们从 python 开始,然后转到矩阵符号…
beta = 1.0true_value = baby_panda_weight
fitted_value = (age * beta)resid = true_value - fitted_value
如 python 代码所示,残差就是我们的 真实值减去拟合值。相当简单。**

图 6:剩余公式。图片作者。
如图 6 所示,残差也可以写成 OLS 公式,其中误差项被隔离。Xβ是我们的拟合值,我们的模型预测的值,而y是我们的真实值。
第三步:平方残差并求和
现在,我们已经得到了我们的残差,让我们平方和求和。平方的目的是让我们能够轻松求解贝塔系数的最佳值,我们将在第 3 节中讨论这一点。
sum_of_squares_python_style = np.sum(resid ** 2)
在上面的 python 代码中,我们首先对残差求平方,然后求和。这很完美,但是线性代数有另一种方法。
任何时候你把一个向量乘以它自身的 转置 ,你就在计算平方和。让我们看一个例子…

图 7:矩阵符号中残差平方和。图片作者。
如图 7 所示,向量乘法要求我们转置第一个向量,将其转换为“行”而不是“列”然后,通过等号右边的数学公式,我们得到这个向量的平方和。这个符号可以简化为图 8 中的值。

图 8:残差平方和的矩阵符号,即转置(误差)*误差。图片作者。
第四步:求导
到目前为止还好。我们有一个强大的数学方法来确定我们的平方和。
下一步是公式化我们的平方和项相对于β的导数。我们将在接下来的步骤中了解为什么这是相关的。
term_1 = matmul(-2 * x.T, y)
term_2 = matmul(matmul(2 * x.T, x), beta)
derivative = term_1 + term_2
上面的 python 代码显示了我们的残差平方和导数的公式。如果你想知道我们是如何得到这个公式的,看看下面的矩阵符号…

图 9:我们的 SSQ 残差的导数。图片作者。
出于实用目的,我们不需要知道如何求导,所以我们要移动下一节。但是,你需要知道的是导数代表什么。导数是直线在给定点的瞬时斜率。
如果你想了解更多,这里有一个很好的教程,作者是 YouTubers 上最好的数学专家之一。
第五步:简化和解决
最后一步,为了找到使误差平方和最小的β值,我们将上述导数设置为零,并求解β(图 10)。

图 10:求解最佳 beta。图片作者。
为了简洁起见,代数步骤被省略了,但是最后一行显示了获得任何 OLS 模型的贝塔系数的公式——就这么简单。
让我们一步一步地完成这个计算…
a = matmul(x.T, x)
b = inv(a)
c = matmul(b, x.T)
best_betas = matmul(c, y)best_betas_one_line = matmul(matmul(inv(matmul(x.T, x)), x.T), y)
a是方差/协方差矩阵。协方差在对角线上,方差在非对角线上。b是这个矩阵的逆矩阵——它本质上允许我们进行除法。c是我们的自变量“除以”方差/协方差矩阵。best_betas是c缩放到我们的 y 值。
这种计算背后的直觉是,我们实际上是取 X 和 Y 的协方差,然后除以 X 的方差。我们分离出 Y 因 X 而变化的程度。
现在你知道了!使用上面的 python 代码,您可以求解任何 beta 系数。
3—OLS 的直觉
现在我们已经理解了数学,让我们更深入地了解它为什么会起作用。
3.1-为什么我们知道残差平方和是凸的?
在上面的步骤 5 中,我们求解β,其中导数等于零。通过平方误差,我们保证有一个全局最小值,所以只要导数为零,我们就能最小化误差。
有两种不用证明的方法。
首先,通过对我们的残差求平方,我们产生一个二维抛物线。函数形式为y=a(x²),其中a为比例参数。根据定义,抛物线只有一个最优值(最大值或最小值)。
朝下的抛物线要求上式中的a为负。然而,因为我们平方所有的残差,T3 就是 T4,我们保证对于β的某个值有一个全局最小值。
其次,让我们用简单的代码做一个简单的线性回归的例子。
import numpy as npdef ssq(x, y, beta):
return np.sum((y - x * beta)**2)x = np.array([4,3,2])
y = np.array([3,2.2,1])betas = np.arange(-2, 2, 0.05)
errors = [ssq(x, y, b) for b in betas]
在上面的代码中,我们创建了两个向量,然后为我们的回归系数 beta 尝试了很多可能的值。如果我们绘制不同β值的误差图(图 11),我们会得到一个向上的抛物线。

图 11:简单的可视化显示 ssq 误差是凸的。图片作者。
在本例中,误差实际上为零,但这并不总是有保证的。但是,通过利用 OLS 有单个最优值(在这种情况下是最小值)的事实,我们知道我们的最小值的位置是我们的 SSQ 的导数为 0 的地方。
3.2—你应该如何看待贝塔系数?
解释 OLS 系数非常困难。我们来分解一下…
- 每个自变量系数的大小给出了该变量对因变量影响的大小。
- 系数(正或负)上的符号给你效果的方向。
但是,这里有一些细节,所以我们来看一下每种系数类型的系数解释。
3.2.1 — Y 轴截距(β0)
Y 截距系数(β0) 是 Y 的平均值,所有其他预测值为零。
你可以把β0 当做基线值。请注意,预测值为 0 并不总是有意义——如果我们将year作为一个特征包括在内会怎样。我们肯定没有 0 年的熊猫宝宝数据,所以考虑 y 截距是否有解释意义很重要。
示例解释:y 截距系数 400.0 意味着当熊猫的age、amount of bamboo eaten和siblings为 0 时,我们数据集中熊猫的平均体重为 400.0。
3.2.2 —连续自变量
连续可变系数是在其他因素保持不变的情况下,X 变化一个单位时 Y 均值的预期变化。
连续变量的系数代表X一个单位的变化,我们的Y应该变化多少。如上所述,数值越大,Y相对于X的变化就越大。如果符号为正,Y将随X增加,反之,如果符号为负,Y将随X减少。
示例解释:age上的系数 10.0 表示在其他因素保持不变的情况下,熊猫每年平均生长 10.0 个单位。
3.2.3 —二元独立变量
二进制可变系数是在其他因素保持不变的情况下,X 变化一个单位时 Y 均值的预期变化。
二进制变量可以用与连续变量相同的方式解释。它们只有两个值:0 或 1。还要注意,我们经常使用一种叫做一键编码的方法,通过几个二进制变量来表示分类变量。
举例解释:系数-4.0 表示如果熊猫宝宝有兄弟姐妹,它的体重平均会减少 4 个单位。
互动
变量之间的相互作用是一个更复杂的话题,我们不会涉及,但有很好的资源。这里有一个可靠的[堆栈溢出 post](http://If you would like to go deeper into interpreting coefficients, here's a good stackoverflow post that discusses interactions.) 。
3.3——为什么它保持一切不变?
对于我们的最后一部分,让我们来谈谈“保持其他一切不变”的概念
OLS 的一个关键优势是通过控制所有其他独立变量来隔离给定变量的影响。
思考这个问题的一个很好的方法是使用残差的概念。实际上,每个预测值在所有其他预测值上回归,只留下残差作为因变量的预测值。让我们看一个例子…
假设我们正在寻找一个模型来确定age对baby_panda_weight的影响,保持amount_of_bamboo_eaten不变。为此,我们可以创建以下模型…
baby_panda_weight ~ age + amount_of_bamboo_eaten
然而,我们也可以执行以下步骤,并为age获得相同的回归系数。
- 拟合
age ~ amount_of_bamboo_eaten并计算残差。残差,姑且称之为R_x,对应于age中无法用amount_of_bamboo_eaten解释的趋势。 - 安装
baby_panda_weight ~ amount_of_bamboo_eaten。残差,姑且称之为R_y,对应于baby_panda_weight中无法用amount_of_bamboo_eaten解释的趋势。 - 安装
R_y ~ B3*R_x。
我们剩余值的贝塔系数( **B3** )将等于我们上面完整模型中 **age** ( **B1** )的贝塔系数。这里有一个 python 中的例子…
这就是 OLS 保持物质不变的方法。数学中隐含的是将所有其他预测值相对于感兴趣的预测值进行回归的过程。然后,它会寻找与该回归过程的残差相匹配的系数。
很酷吧?
顺便说一下,这就是为什么多重共线性是这样一个问题——如果我们将一个变量与另一个非常相似的变量进行回归,残差中就不会留下多少信号。
最后,你可能想知道这种“剩余化”是如何工作的。嗯,我也是所以我写了一个关于栈交换的问题。如果你能为线性代数公式如何“剩余化”描述一个直观的解释,那将是惊人的。我也会相应地更新这个帖子。
4 —摘要
普通最小二乘回归是最常见的线性建模技术。它速度快,实现简单,易于解释。然而,很少有人真正了解幕后发生的事情。
为了找到最佳β系数,我们将误差公式化为平方和(SSQ),从而产生一个向上的抛物线。然后,我们求解β的值,其中 SSQ 的导数为 0,表示拐点。该拐点处的β系数保证使平方误差最小。
建立这个模型后,我们可以将系数解释为自变量的一个单位变化引起的因变量的变化,其他一切保持不变。
感谢阅读!我会再写 14 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。
R 如何处理向量?
原文:https://towardsdatascience.com/how-does-r-handle-vectors-fb6a2412ffcf
R |幕后|向量
R 如何处理向量?
当然是简单而神奇的爱!

戴安娜·波莱希娜在 Unsplash 上拍摄的照片
r 是一种非常容易掌握的语言。这是它成为数据科学领跑者的一个原因:人们可以快速启动并运行。向量是 R 帮助事情变得简单快捷的方式之一。但是幕后到底发生了什么呢?
什么是向量?
向量是 r 中许多数据科学操作的支柱。与的或的循环相比,它们的速度快得令人难以置信。速度的提高是因为向量只能存储单一类型的数据。这意味着如果你想创建一个向量,你不能把字符和数字变量都放进去。
向量对于数据的存储和交互非常重要。如果我们有一组数字,我们可以把它们放在一个向量中,以便于计算。表格数据通常存储在数据框中,其中每一行是一个观察值,每一列是一个包含观察值特定属性的向量。
矢量化运算
编程中操作多个对象的一种常用技术是对它们进行循环。我相信你对循环中的很熟悉。你告诉它从哪里开始和停止,它将从开始到停止一遍又一遍地运行一些代码。
让我们看一个使用cars数据集的例子。它包括汽车的速度(英里/小时)和停车距离(英尺)。如果我们想计算数据集中的平均速度,我们可以使用作为循环。我们创建speed_sum作为一个数字来跟踪我们的速度变量的总和,然后我们在cars数据帧的speed列中循环每个观察值。最后,我们将speed的总和除以我们的答案的数据集中的行数:15.4。
speed_sum <- 0
for (i in 1:nrow(cars)) {
speed_sum <- speed_sum + cars$speed[i]
}
speed_sum / nrow(cars)[1] 15.4
这里有一个关于向量的很酷的事情:许多函数被优化来对它们执行操作。这意味着矢量化函数有可能比循环的快得多。
就拿mean函数来说吧。它计算我们给它的任何数字向量的平均值。对于cars的speed列,这又是 15.4。
mean(cars$speed)[1] 15.4
与使用矢量化的mean函数相比,使用 for 循环获得平均值要快多少?写一个循环需要的时间可能很多,这取决于任务。甚至我们快速的 for 循环求平均值也占用了 5 行。我们添加的代码越多,我们的任务就越复杂,我们就有越多的机会出错并花时间调试。有了矢量化的函数,我们可以节省很多时间,因为我们知道函数需要向量并进行计算。
与矢量化函数相比,计算循环的时间呢?嗯,在我的电脑上(Ubuntu 20.04,R 3.6.3,锐龙 5 5600G,16GB 内存,256GB 固态硬盘,RTX 3090),向量化这个相当简单的操作可以导致执行速度的巨大提高。我们可以看到用rbenchmark包可以快 185 倍!
library(rbenchmark)benchmark(
"Loop" = {
speed_sum <- 0
for (i in 1:nrow(cars)) {
speed_sum <- speed_sum + cars$speed[i]
}
speed_sum / nrow(cars)
},
"Vectorized" = {
mean(cars$speed)
}
) test reps elapsed relative user.self sys.self user.child
1 Loop 100 0.185 185 0.185 0 0
2 Vectorized 100 0.001 1 0.001 0 0
标量运算
我们还可以用向量做其他很酷的事情。如果你熟悉矩阵代数,你可能还记得标量运算。这是当你把一个向量加、减、乘或除以一个数的时候。因此,不用创建一个循环来对向量中的每个数字进行操作,我们可以在计算中使用我们的向量,R 会将我们的标量操作应用于向量的每个元素。
还是关于cars的数据集,也许你来自一个使用公制的合理国家。speed变量以英里每小时记录。不用创建一个循环来将向量中的每个数字乘以 1.609 以转换为千米每小时,您只需将向量乘以该数字,R 会处理剩下的事情。
cars$speed * 1.609# Note: only the first 5 numbers from the output are shown here[1] 6.436 6.436 11.263 11.263 12.872 ...
想要组合更多的标量操作吗?去吧!作为一个来自我们用华氏温度来测量温度的疯狂国家的人,摄氏数据对我来说没有多大意义。beaver1数据集(内置于 R 中)有以摄氏度为单位的海狸体温记录。通过一些标量运算,我可以把这些转换成我更好理解的单位。
(beaver1$temp * (9/5)) + 32# Note: only the first 5 numbers from the output are shown here[1] 97.394 97.412 97.430 97.556 97.790 ...
哇,那是一只热海狸!🦫
2 个向量
如果两个向量长度相同,计算起来就很简单。想象一下我在找一辆 1974 年的车。mtcars数据集有当年 32 辆汽车的一些统计数据。我想要力量大的东西,但不要太重。我可以计算出马力(hp)和重量(wt)的比值,通过将这两个向量相除。
mtcars$hp / mtcars$wt# Note: only the first 5 numbers from the output are shown here[1] 41.98473 38.26087 40.08621 34.21462 50.87209 ...
很简单,对吧?我们才刚刚开始,两个长度相同的向量。由于这些向量来自数据帧的列,我们可以使用相同的概念来过滤我们的数据帧。我们来筛选一下 6 缸以上的车。这一次,我们的结果将包括所选行的所有数据。
mtcars[mtcars$cyl >= 6 ,]
过滤器利用向量的力量来得到我们想要的东西。首先,它创建一个TRUE和FALSE的向量。我们前面说的标量运算也可以是逻辑语句!所以这条语句实际上是将向量mtcars$cyl的每个元素与标量 6 进行比较,并给出一个向量的结果。
mtcars$cyl >= 6# Note: only the first 5 numbers from the output are shown here[1] TRUE TRUE FALSE TRUE TRUE ...
为了过滤数据集,我们可以使用括号和相同大小的向量TRUE和FALSE值来选择我们想要的。在我们的例子中,我们需要 true/false 向量表明柱面数量大于或等于 6 的行。
让我们用这些数据来看看另一个向量技巧。我想知道这些汽车中有多少是 6 缸或 6 缸以上的。为了做到这一点,我可以利用这样一个事实,即在引擎下,R 将TRUE表示为 1,将FALSE表示为 0。
如果我对我们的真/假向量使用 sum 函数,它将对真值求和,并告诉我有多少辆车符合标准。结果,32 辆车中有 21 辆有 6 个或更多的汽缸。所有这一切都需要一些向量知识来帮助解决这个问题!
sum(mtcars$cyl >= 6)[1] 21
两个不同长度的向量
这是事情开始变得棘手的地方,也是 R 真正开始展示它在处理向量时所做的神奇和简化的地方。标量运算是两种不同长度的向量的特例。本质上,你是在告诉 R 用你的向量和一个长度为 1 的向量做一个运算。正如我们已经讨论过的,R 将重用单个值,并对向量的每个元素执行操作。但是如果我们让第二个向量长一点呢?
这个例子会更抽象一些。它可以帮助你理解 R 在向量运算中使用的魔法。让我们回到我们的cars数据集中的speed列。这次我们来除以一个长度为 2 的向量:c(2, 4)。我将包括来自speed列的前 5 个数字,这样您就可以知道发生了什么。
cars$speed[1:5][1] 4 4 7 7 8cars$speed / c(2, 4)# Note: Only the first 5 numbers of the output are shown here[1] 2.00 1.00 3.50 1.75 4.00 ...
…那么到底发生了什么?基本上,当你使用长度为 1 的标量或向量时,会发生同样的事情。r 将重用向量的每个元素,直到它计算出整个speed列的操作。让我们看一下这些操作:
speed的第 1 个元素 4 被c(2, 4)的第 1 个元素 2 除。这给了我们 2。speed的第 2 个元素 4 被c(2, 4)的第 2 个元素 4 除。这给了我们 4。speed的第 3 个元素 7 被c(2, 4)的第 1 个元素 2 除。这给了我们 3.5。- 依此类推,直到
speed列的其余部分。
这在现实世界中可能不是最实用的,但是只要较小向量的长度是较大向量长度的倍数,这就可行。但是如果长度不是彼此的倍数呢?
继续尝试这段代码。speed列的长度为 50。这个新向量的长度为 3。因为 50 不是 3 的倍数,所以 R 做两件事:
- 它试图完成操作。它遵循与上一个示例相同的模式。
- 它会生成一条警告消息,告诉我们较长的向量不是较短向量的倍数。
cars$speed / c(3, 6, 9)# Note: only the first 5 numbers from the output are shown here[1] 1.3333333 0.6666667 0.7777778 2.3333333 1.3333333 ...
Warning message:
In cars$speed/c(3, 6, 9) :
longer object length is not a multiple of shorter object length
啊,神奇的向量处理 R 做到了。它会进行计算,但会给出一点警告信息,这样我们就知道有些东西看起来不太对劲。
结论
那么我们学到了什么?向量很快。它们通常允许我们比类似的循环更快地编写性能更好的代码。我们可以用向量和一个数字来计算。有一些函数对整个向量进行运算以得到结果,我们可以对多个向量进行运算,即使向量大小不同。r 对向量的处理也让我们知道什么时候事情看起来不太对,比如我们的向量长度不是彼此的倍数。
https://realdrewdata.medium.com/membership
科学是如何工作的?都是关于克隆的!
原文:https://towardsdatascience.com/how-does-science-work-its-all-about-clones-1046b4d045ae
因果推理和统计推理在科学中的作用
每一个好的科学实验都是关于制造克隆体的,这些实验旨在确定某样东西是如何工作的,而不仅仅是它确实在工作。
啊?
请原谅我。

图片来源: Pixabay 。
科学思考
让我们掰手腕吧!为了准备,你喝一点力量药水,而我喝过滤水。那你不费吹灰之力就打败了我。你赢了是因为药剂,对吗?
不,如果我们妄下结论,我们会冒犯科学本身。毕竟,我们是不同的人,有不同的手臂。既然我们可以为你的胜利想出一千种没有药剂的解释,那么声称我们对药剂的功效有所了解就显得很愚蠢了。
但是如果我和我的基因克隆体掰手腕呢?她喝了药水,而我没有。然后她毫不费力地赢了。是魔药吗?

肖像权归作者所有。
现在,力量药剂在我一败涂地中的作用开始看起来更可信了(我们已经 控制了 的基因差异),但我可能仍然会抱怨这是多么不公平,她是在实验室里喝着蛋白奶昔长大的,而我是在一个大幼儿园里喝着咖啡长大的。毕竟我们是不同的,所以我们先不要责怪魔药。
如果她是一个神奇的克隆体——我的一个精确的复制品在魔药之前眨眼就出现了呢?在这种情况下,药剂的因果效应似乎更加可信。然而,如果我戴上吹毛求疵的帽子,我会指出她和我坐在不同的位置…也许她有优势,因为椅子的高度不同?
这就是科学思维!为了预测最可怕的吹毛求疵者,你必须成为你自己最糟糕的批评家,并尽可能设置最严格的条件,以便提前排除所有替代解释,治疗和控制条件之间的唯一差异是治疗本身(在这种情况下,是力量药剂)。只要还有其他的解释,你的实验就是软弱的,你的科学对手可以把它遗忘。你还没有获得在礼貌话语中使用“因为”这个词的许可。
为了预测最可怕的吹毛求疵者,你必须成为你自己最糟糕的批评家。
那么,我们能做些什么来了解药水是否有效呢?也许我们应该克隆我和椅子?
因果推断
由于实际的克隆仍然稳固地处于科幻领域,让我们退而求其次,使用随机化来解决我们的问题:我们将进行多轮实验,我们将抛硬币决定每次谁得到哪把椅子,从而在统计上控制椅子的效果。
大型随机选择的群体本质上是彼此的统计克隆。
大的随机选择的组本质上是彼此的统计克隆,其思想是它们之间唯一的(统计)差异是治疗。如果结果有差异,我们可以归咎于治疗。哒哒!因果推断达成!
这是科学家可以获得的最干净版本的 因果推理 (对什么导致什么做出可靠断言的能力)背后的核心逻辑。其他的都有点过了。*
谨慎的推论
但是要小心。我们可以得出结论,这种差异是由于我们的实验性治疗,但如果我们误解了我们的治疗呢?
在我和我的克隆体经过无数次随机试验后,你可能会开始认为这种药剂确实很特别。沉住气!我们没有分离出治疗的哪个方面起作用。也许和药水本身的有效成分无关,一切都和混合物的含糖量有关。或许我的克隆人胜过我的真正原因是,一想到要和一个刚刚狂饮所谓“神奇药水”的人竞争,我就感到动力不足。
科学就是排除替代解释。科学家的工作是思考和检验所有可能会带来麻烦的替代解释。他们不得不津津有味地攻击他们最喜欢的理论,而不是捍卫它。
我们无法知道,除非我们用更好的安慰剂进行实验——除了活性成分以外的一切。然后你会找到别的东西来吹毛求疵,我将不得不修改这个实验来排除你聪明的替代解释。欢迎来到科学!
但是等等!即使我们把这种特定的饮料分离出来作为让我的克隆体比我更强大的魔法药剂,也不要急着去买这家力量药剂公司的股票!
从我和我的克隆人的较量中,你所知道的就是这种药剂对我有效(可能对你无效),而且在掰手腕时有效(可能对我最讨厌的运动:俯卧撑没有帮助)。不要举一反三;你没有证据证明它对任何人或任何事有效。
为了将这一发现推广到普通人群,你必须随机抽取代表人类的大量样本,并进行同样的实验。(不是,我重复一遍,不是,一群彼此住得很近的白人男性,大量药物已经被“测试”的误导方式。如果你想声称某样东西对每个人都有效,你需要代表样本中的每个人。)
不能为你的随机参与者制造物理克隆体来战斗吗?然后你需要更大的样本量来模拟与药剂无关的可变性,这样你就可以分离出药剂的特殊效果。
想把你的发现延伸到掰手腕之外,并声称你有一种“力量药水”?然后你必须定义一种普通力量药剂的标准。增强通常由人类执行的所有体力任务的性能?好吧,那么你需要观察人类来获得他们通常执行的任务的列表,随机选择一大组,并对每个任务再次运行这些大样本量的实验。或者你可以保留之前的小组,让每个人用不同的任务进行多天的药剂/非药剂试验。
我甚至不会陷入剂量正确的问题(更多的试验!)并计算出魔药的持续时间(真的是一天就排出你的系统了吗?).
科学是美丽的,艰难的,令人沮丧的。尤其是涉及到了解人类的时候。
所以你开始明白为什么科学很难。我们从一个非常简单的问题开始——这种药剂真的能让人变得更强壮吗?——最终得到了一个实验性的设计,其价格可以养活一个小国。可以理解的是,社会可能会停止资助这种强力药剂的防弹结论。我们科学家将不得不要求我们尊敬的同事 假设 我们未能控制的因素无关紧要,但那是另一篇博文的主题(你可以在下面找到)。
https://kozyrkov.medium.com/why-do-we-trust-scientists-98c24e3b9f0e
科学是美丽的,艰难的,令人沮丧的。尤其是涉及到了解人类的时候。
如果我是我(或我的克隆体),我会相应地设定我的期望。留意每项研究的警告,提醒自己不要在测试结果之外妄下结论。如果你懒得去读实际测试的细节,不要把你读到的总结版本看得太重。
总结:简单地说,因果推理
科学实验都是关于制造可信的克隆——两个相同的项目(或者,更典型的是,两个统计上相同的组)——然后对它们应用两种不同的治疗方法(像药水对没有药水)。或者,如果我们想一下子研究多个因子,我们会使用两个以上的组和处理。
如果我们发现表现有所不同,我们可以将其归咎于治疗。简而言之,这就是经验(基于证据)科学的工作方式。这都是关于克隆的,它依赖于我们能够宣称我们已经分离了它们之间唯一的区别。要接近这样的要求需要技巧和对细节的极度关注。
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。
脚注
*当然,在统计学中有一个完整的领域,试图在随机实验不可能的情况下补充一些因果结论,但它们都足够深入,不是每个人都会被它们说服,就像他们被适当的实验说服一样。无论数学有多奇特,反对者总会有所争议,所以玩高级因果推理方法需要厚脸皮。
伯恩斯坦-瓦齐拉尼量子电路是如何工作的?
原文:https://towardsdatascience.com/how-does-the-bernstein-vazirani-quantum-circuit-work-f69cb037f40f
打破密码术的量子算法的第一个例子
当彼得·肖尔提出能够有效分解数字的算法时,量子计算变得很有名。
它在 It 安全领域引起了轩然大波,因为现代非对称加密认为分解大数实际上是不可能的。因此,这种算法威胁到我们今天使用的加密技术,使我们所有的秘密都变得脆弱。
然而,Shor 的算法并不是第一个破解加密的算法。这就是伯恩斯坦-瓦齐拉尼算法。而且,这是理解 Shor 算法的一个至关重要的前提和基础。
Bernstein-Vazirani 算法可以在一次传递中识别一个秘密的二进制字符串(参见本文)。对于这个问题,一个经典算法需要 n 个步骤,其中 n 是字符串中的位数(见本文)。
如下图所示,Bernstein-Vazirani 算法由五部分组成:
- 在|+⟩状态下叠加的一组量子位,每个量子位代表一个数字。
- |−⟩.态中的一个辅助量子位
- 代表秘密密钥的量子预言
- 使量子比特脱离叠加
- 量子位的测量

作者图片
如果你是量子计算的新手,第一部分可能已经很难理解了:一系列叠加的量子位。但它是你掌握任何量子电路都需要了解的基本概念。
量子位是一个二维系统,如下图所示。可视化的极点代表|0⟩和|1⟩.这两个基本州箭头是量子态矢量。接近极点(基态)表示振幅,其平方是量子位被测量为 0 或 1 的概率。简单来说,量子态向量越接近|1⟩基态,量子位被测量为一的概率就越高。

作者图片
量子位基态向量对|0⟩和|1⟩的近似的线性组合表示量子叠加。
在 Bernstein-Vazirani 算法的例子中,我们把量子位放在一个特定的状态:|+⟩.在这种状态下,两个基态的接近度是相等的。因此,测量两个结果之一的概率是 0.5。

作者图片
我们通过在|0⟩.态的量子位上应用哈达玛门来达到这个状态
第二部分是|−⟩.状态下的辅助量子位这个态几乎等于|+⟩态,因为到两个基态的接近度也是相等的。因此,测量两个结果之一的概率也是 0.5。
但是如果我们用图形来看量子位状态,我们会看到它指向|+⟩状态向量的相反方向。

作者图片
我们通过将哈达玛门应用于|1⟩态的量子位来实现|−⟩态。
顺便说一句,我们已经确认了哈达玛门对量子位元的重要影响。它把|0⟩国家变成了|+⟩,把|1⟩变成了|−⟩.而且,这在第 4 步中会变得很重要,它会自我反转。因此,如果我们在|+⟩态的量子位元上加上哈达玛门,它就会回到|0⟩态。最后,将它应用于|−⟩态的量子位,它就处于|1⟩态。
如果我们现在跳过第 3 步,直接看第 4 步,我们看到我们再次将哈达玛门应用于所有的量子位。所以我们把他们从他们的|+⟩和|−⟩州转移出来,让他们回到|0⟩和|1⟩的基地州。如果我们在第五步中测量它们,当它们处于这样的基态时,就不再有随机性了。如果我们在|0⟩态测量一个量子位,我们总是得到 0。如果我们在|1⟩态测量一个量子位,我们总是得到 1。
现在让我们回到步骤 3。这里我们使用一个量子预言机来实现我们想要识别的秘密字符串。例如,假设我们的秘密二进制字符串是 101(从右向左读)。
我们对二进制字符串中代表 0 的量子位不做任何处理。相反,我们为二进制字符串中的每个 1 添加一个受控非门。这里,我们用代表数位的位置上的量子位作为控制量子位,辅助量子位作为目的量子位。
受控非门有两种作用。首先,它反转目标量子位元的状态向量的振幅。因为在辅助位的|−⟩态中,两个基态的振幅相等,所以我们可以忽略这种影响。
第二,它将目标量子位的相位复制到控制量子位。这被称为相位反冲。这个阶段将|+⟩国家与|−⟩国家区分开来。即使这些状态具有相同的状态振幅,它们仍然是不同的。
我们已经在上面了解了这种差异是如何发生的。哈达玛门把|+⟩变成了|0⟩,把|−⟩变成了|1⟩.
因此,由于用作目标位的辅助位处于|−⟩状态,受控非门将控制位从|+⟩翻转到|−⟩.
因此,第四步中的哈达玛门将控制量子位元从|−⟩翻转到|1⟩.但是他们没有对这些留在|+⟩.的量子位做任何事情这些又变成了|0⟩。
当我们最终测量量子位时,它们揭示了秘密的二进制串。
伯恩斯坦-瓦齐拉尼算法没有像肖尔算法那样受到重视。然而,它第一次展示了量子计算机如何加速秘密字符串的发现,例如用于加密的字符串。
https://pyqml.medium.com/membership
不要错过下一集,订阅我的子栈频道。
量子机器学习要不要入门?看看 动手量子机器学习用 Python 。

在这里免费获得前三章。
Twitter 对《口袋妖怪传奇:阿尔宙斯》有什么看法?
原文:https://towardsdatascience.com/how-does-twitter-feel-about-pokemon-legends-arceus-3efa86da3331
使用 spaCy 和谷歌云的自然语言 AI API 理解关于游戏的推文
神奇宝贝社区快乐!或者这是我得到的印象。2022 年 1 月 28 日,名为神奇宝贝传奇:阿尔宙斯,的最新神奇宝贝游戏发布。社区接受了这个游戏。他们称之为多年来最具创新性的神奇宝贝,评论是该系列多年来最好的,我在一个月内积累了超过 100 个小时。所以,是的,我印象不错。但是其他玩家喜欢这个游戏吗?此外,他们对此有什么看法?我用数据来回答这些问题。
几年前,神奇宝贝社区很不安。在宣布该系列的前一部《神奇宝贝剑与盾》时,开发商游戏狂报告说,他们不会在游戏中包括所有现有的神奇宝贝。粉丝们不喜欢这样。他们愤怒、悲伤、失望。为了量化这种不适,我收集并分析了一系列推文,包括与游戏相关的标签,结果发现,平均而言,推文略有负面。所以现在,我想抵消那个实验的负面感觉。
我的直觉告诉我粉丝们喜欢这个新游戏。但是我想要更多的证据。所以,我又一次收集了与游戏相关的推文,调查它们的内容是否积极。在这个新的实验中,我使用了自然语言处理(NLP) Python 库 spaCy , Google Cloud 自然语言 API ,和 R 语言来发现推文中最常用的名词和形容词,推文的情绪,以及最常提到的神奇宝贝。在这里,我将展示我的调查结果。
你可以在:https://github.com/juandes/pokemon-legends-tweets找到调查的源代码。

我的游戏副本。我拍的照片。
关于数据
我的数据集有 173296 条我从 2022 年 2 月 4 日到 2022 年 2 月 27 日收集的推文,标签为#PokemonLEGENDS 或#PokemonLegendsArceus。大多数推文都是转发,所以我清理了数据集,最终得到了 40282 条唯一的推文。尽管如此,你还是会发现类似的垃圾信息,只是有几个词不同。(我本可以使用其他技术来找到这些案例,但最终却违背了它)。
我使用 Python 库 Tweepy 收集数据,您可以在链接的存储库中找到我使用的脚本。
顶级名词和形容词
spaCy 的功能之一是词性 (POS)标注,这是一项为文档的每个标记分配语法类别的任务。这些类别的例子——也是我使用的那些——是名词和形容词。作为复习,名词是命名物体(例如,一棵树)、人、动作、感觉以及我们通常称之为“事物”的任何事物的单词,而形容词描述名词,例如,句子“the large tree”中的单词“large”使用 Python 和 spaCy,我写了一个脚本,遍历每条推文,标记它们的术语并统计它们的出现次数。然后,我选择了前 15 名,并在下面的两个图表(图 1 和图 2)中显示出来。

图 1:最常用的 15 个名词。
前 15 个名词是一个不同的组,其中包括一些游戏的机制。其中之一是“阿尔法”,指的是阿尔法神奇宝贝,一种新的红眼神奇宝贝,比通常的同类更大更强。提到的其他机制是“爆发”,即在特定位置产生一群相同的神奇宝贝的事件,以及“闪亮/闪亮”,这是一种罕见的神奇宝贝变种,颜色与其常规版本不同。推特用户经常在同一条消息中提到这三种机制,以庆祝和分享他们最近难以捉摸的闪亮阿尔法神奇宝贝,这是一种罕见的神奇宝贝,在爆发期间出现率会增加。在正常情况下,找到闪亮神奇宝贝的机会是 1/4096,但在爆发期间(可能会产生阿尔法神奇宝贝),这一机会增加到 1/158.2。所以,是的,我可以理解为什么人们会在 Twitter 上展示他们的低概率生物。

图 2:使用最多的 15 个形容词。
最上面的形容词(见上文)是积极的。像“好的”、“可爱的”、“快乐的”、“不错的”和“棒极了”这样的术语传达了一种模糊的温暖感觉。还有“闪亮的”,我们可以用它作为形容词来描述闪亮的神奇宝贝,例如,“神奇宝贝是闪亮的”,而不是用“闪亮的神奇宝贝”这个名字但是在这些快乐的话语中,有一个词很突出——那就是“坏”为了知道到底什么是坏,我搜索了包含这个词的推文。然而,我发现了更多模糊而温暖的评论,而不是仇恨,因为他们没有使用这个词。一些推文惊呼他们多么想要这款游戏或抓住一个闪亮的神奇宝贝,其他人说,“我太差劲了”(在游戏中),还有一条在庆祝它如何击败了“大坏老板之战”。恭喜你,我的朋友!

一把普通的镰刀(左)和它闪亮的变体(右)。注意粉红色的脖子和较暗的绿色。我拍的照片。
情感分析
从上面的形容词,我可以得出结论,人们喜欢这个游戏。但这是一个主观的结论——一个受到我对什么是积极形容词的想法(我在这里有些夸张,但我想找个借口来介绍我的下一个方法)和我在阅读一些推特后所看到的影响的结论。为了解决这种主观性,我使用了一种名为情感分析的自然语言处理技术。这种方法用一个数字来衡量每条推文的情绪态度,让我们可以确定它的感觉是消极的、中立的还是积极的。我用来做情绪分析的服务,谷歌云的自然语言 API ,给每条推文打分,分数在-1 到 1 之间,其中-1 表示总体负面情绪,0 表示情绪低落或混合,1 表示积极情绪。例如,句子“我恨你段落”的得分为-0.9,“爆发中闪亮的长尾怪手”的得分为 0.0,以及“我喜欢这个游戏中的表情 XD ”的得分为 0.9。
tweet 样本的平均情感值为 0.141 。因此,我们可以很快得出结论,许多推文传达了一种积极的感觉——我的直觉是这么说的。(我说“样本”是因为我从数据集中随机选择了 3000 条推文,以加速分数收集过程,还因为我使用的服务不是免费的)。得分中位数为 0.100 (也偏向正),第 25 百分位为 -0.100 ,第 75 百分位为 0.5 ,标准差为 0.483 。在下面的图表中(图 3),您会发现分数分布的直方图。它显示大多数值落在 0.0 和 0.9 区域,这解释了 0.483 的高标准偏差。或者,简单地说,我们可以说有许多中立和积极的推文,但没有多少负面的。

图 3:推文情感得分直方图。
在进入下一部分之前,我需要说人工智能,因此,NLP 算法,可能会有偏差。因此,我不能肯定地说这些推文确实是积极的。此外,由于许多人工智能系统是在来自维基百科等普通文本的语料库上训练的,而不是来自关于神奇宝贝的推特,我预计会有不准确的情感分数。下表有十条推文和他们的情绪得分;做评委,让我知道你对分数的想法。

一些推文和他们的情绪得分。

一个愤怒的阿尔法·卡比兽看起来并不乐观。我拍的照片。
最受欢迎的神奇宝贝
这最后一节是纯粉丝服务。我不会介绍另一种 NLP 技术,也不会提到感受。没有。在这里,我将列出所有推文中被提及次数最多的前 15 个神奇宝贝。跟着我看图 4。

图 4:提到神奇宝贝的前 15 名。
推特上最受欢迎的神奇宝贝是阿尔宙斯,有 2131 次提及——几乎是其继任者 Eevee 的六倍。但是,考虑到这款游戏是以阿尔宙斯命名的,人们还是认为它会名列榜首。从列表中删除同名的神奇宝贝会产生一个图表(图 5 ), Eevee 以 170 次以上的提及率位居第一,而第二名是 Typhlosion。

图 5:前 15 名被提及的神奇宝贝(不包括阿尔宙斯)。

我的性格和阿尔宙斯。我拍的照片。
最后的话
《神奇宝贝传奇:阿尔宙斯》已经上市,大家一致认为这是一款不错的游戏。它目前的 Metascore 是 83(满分 100),用户评分是 8.3(满分 10)。与之相比,前一个标题的 Metascore 为 73,用户评分为 5.4。除了收视率之外,这款游戏的反响也很积极。这是我在 Reddit、Discord 和 Twitter 上得到的印象。为了检验我的直觉是否正确,我收集了一个推特语料库,并用 NLP 技术对其进行分析,以发现人们对游戏的看法以及他们是如何表达的。
结果是积极的。人们大多在谈论游戏的新功能,并炫耀他们闪亮而巨大的神奇宝贝,使用令人愉快的词语“好”、“可爱”和“快乐”。然后,我使用情感分析服务来量化信息的情感态度,结果再次倾向于积极的一面。
看到社区这么开心真好。
ELT 计划如何改进数据工程师的根本原因分析
贝叶斯网络和数据停机时间的未来

图片由 Pixabay 提供。
随着现代数据管道复杂性的增加,准确而快速的根本原因分析(RCA)对于解决生产问题变得至关重要。最近,人们对数据工程的 RCA 兴趣大增。然而,这项工作可用的最佳工具和技术仍处于萌芽状态,尚未成形。本文讨论了一种流行的技术——分段分析的局限性。
捕捉现代数据管道的结构是超越这种幼稚方法的关键。一种新的方法是将 ELT DAGs 转换为贝叶斯网络,允许我们以条件概率查询的形式对网络提出因果归因问题。像这样的开发是更强大和可扩展的数据工程 RCA 工具的前沿。
“相关性并不意味着因果关系,但它确实暗示性地摇着眉毛,并在嘴里发出‘看那边’的时候偷偷做手势。”——兰道尔·门罗
数据工程和根本原因分析
“根本原因分析”(RCA),一个定义问题的基本解释的过程,在软件世界里是一个有点神圣的术语。
在根本原因确定之前,持续的问题不会真正结束。无论您是在处理一个中断的 API 调用、一个无法加载的网站,还是一个出错的指标,确定根本原因始终是解决过程中的基础。在这一点上,工程师可以解释失败的原因,努力发布修复程序,并在未来减轻问题。
在数据可观测性的新领域,RCA 同样重要。让坏数据变好的最快方法是首先理解为什么它变坏。毕竟,一旦我们检测到数据是坏的,我们首先想知道的是为什么。
为什么在非常重要的营销支出表中,10%的行突然被空值填充?为什么customer_uuid字段在应该是唯一的时候突然显示出大量的重复项?
然而,我们数据专业人员开始使用“RCA”来指代在 RCA 工作流中协助的工具,而不是自己执行任何实际 RCA 的工具。这听起来可能微不足道,但差别是显著的。例如,许多数据质量 RCA 方法使用分段分析:识别为事件提供更好背景的负责任的数据段。

细分分析,以揭示某个客户 ID 在重复事件中被过度代表。有帮助?是的。但是它应该与其他异常分辨率分析结合使用。图片由蒙特卡洛提供。
细分分析是一项出色的关联功能,可为数据事件提供更多背景信息。通常,细分分析可能会向您指出问题的根本原因。
这可能发生在以下情况:
- 随叫随到的工程师有很多关于问题表的上下文。
- 分割分析是稀疏的——也就是说,它只返回人类可以合理解析的选择相关性。
- 细分分析是有意义的——也就是说,返回的相关性具有实际意义并讲述了一个故事。
在上述案例中,几个客户数据源上的 ELT 作业的上游变化导致我们的机器学习模型的一个重要指标明显偏离基线。分割分析使我们能够将漂移归因于特定的上游变化。
请注意,在细分分析本身中没有任何东西可以识别根本原因——一个了解变化的工程师在现场将这些点连接起来。具体来说,请注意,1 个ACCOUNT_ID出现在 4%的所有记录中,但是在 38%的记录中出现了异常importance_scores.,这个问题只发生在三个具有相同边缘情况集成设置的客户身上,因此我们可以快速回滚到这些环境的最近更改。
相关性被打破的地方
但是让我们考虑一个稍微不同的问题。如果不仅仅是这三个客户的 ELT 变更,而是我们的失败影响了整个 ELT 管道,那会怎么样?
如果一个表更新失败,一个错误的 SQL LEFT JOIN可能导致几十个下游列同时转向NULL。如果下游表中的所有内容都着火了,细分分析对我们没有任何帮助。
我们可能会看到数百个通知,如“字段 X 与字段 Y 100%相关!”——也许这些关联中的一个暗示了真正的根本原因。更有可能的是,你将面对无数的相同上游症状的共病。
然而,这里缺少了更深层次的东西。细分分析假设只看一个表就构成了足够的 RCA。然而,在任何现代云数据基础设施中,没有一张表是孤立的。
表格很少包含自身数据停机的根本原因。ELT 管道超时,模式被无意中更改,API 功能被弃用。我们在自己关于数据可观测性的数据中看到了这一事实。我们发现我们的“高相关性洞察”功能仅适用于我们捕获的约 4.4%的异常。
数据质量问题发生在环境中,我们依靠数据工程师来了解环境。
使用像细分分析这样的方法,我们将很少的负担转移到 RCA 工具本身,即使我们可以这样做,节省了我们自己的时间和过程中的麻烦。
这就是为什么数据工程团队在缩短解决数据停机时间时需要超越细分分析的原因。
案例研究:针对数据停机的上下文 RCA
是时候认真对待数据停机的 RCA 了,这意味着认真对待数据停机的结构。
现代数据管道是复杂的、相互依赖的系统,具有上游和下游依赖性。这包括软件、数据和进度依赖,换句话说,就是血统。
当数据出错时,管道上游的某些东西——软件、数据或时间表——也会出错。在处理令人烦恼的实时数据问题时,我们经常忘记数据环境是高度结构化的。当谈到对损坏的数据系统进行 RCA 时,我们可以——也应该——利用这一点。
为了具体说明我的观点,让我们看看现代数据管道中的一个具体支柱: ELT jobs 。ELT 平台,如 dbt,使用调度 Dag—DdirectedAcyclicGraph 运行数据转换。

DAG 示例,展示了 dbt 如何在单个作业中模拟上游和下游依赖关系。
Dag 不是任意的数学结构。它们表现出许多简洁的性质(传递闭包、拓扑排序等)。)极大地降低了许多图形算法问题的复杂性(比如寻找最短路径)。
它们也是贝叶斯网络的结构,强大的计算设备,我们可以用于(真实的)数据停机 RCA。事实上,贝叶斯网络模型的结构比一般的贝叶斯网络更简单!让我们通过一个例子来说明这一点。
示例 DAG
让我们通过一个简单的数据停机问题来演示如何操作。下面是一个简化的 DAG,展示了在蒙特卡洛运行的 ELT 计划的一部分:

这项工作将一些特征聚合步骤与一个模型训练步骤相结合,然后是一些导出步骤。这是更大的机器学习管道的一部分。注意,_rs、_sf和_bq分别指从红移、雪花和大查询环境中收集的预处理指标。
这是一次运行的相应甘特图:

显示 DAG 中所有作业运行时间的甘特图,从 DAG 启动的那一刻开始。
注意到什么有趣的结构了吗?
- 在
preprocessing_步骤的所有完成之前features_agg不能运行,因为那些预处理步骤是 DAG 中的上游依赖项。尽管preprocessing_sf很早就完成了这一轮,DAG 的进展仍然受到瓶颈的制约,直到preprocessing_rs结束。 features_snapshot比metrics_train运行的时间长,但是它不会阻碍thresholds_loader的开始,因为它不是上游依赖。
计算 DAG 的运行时间
通常,数据工程师希望预测整个 DAG 的运行时间,无论是设置 SLA 还是确保指标以一定的节奏更新。如果我们想知道整个 DAG 运行需要多长时间,我们不能只对所有单个作业的运行时间求和。我们也不能取最大运行时间。相反,我们不得不求助于 DAG 的特性。哪些工作是其他工作的上游?哪些工作是瓶颈?
在这种情况下,运行时间将始终作为作业运行时间的函数给出:
time(DAG) = MAX(time(preprocessing_rs),
time(preprocessing_sf),
time(preprocessing_bq)) +
time(features_agg) +
MAX(time(features_snapshot),
time(metrics_train) + time(thresholds_loader))
也许这个等式令人望而生畏,但创建它的规则很简单:
- 如果进程并行发生,取其运行时间的最大值()
- 如果流程按顺序(或“系列”)发生,则取它们运行时间的总和
有了这两条规则,您就可以使用任何 ELT DAG 并构建一个计算其总运行时间的等式。
使用调度相关性解决数据新鲜度异常
当 DAG 按时完成时,一切都很好。当然,有趣的情况是当它不。
许多团队定义 SLO 来保证特定的过程在特定的时间完成。我们系统中的这个特定 DAG 每 6 小时运行一次。有时,它会失败或停止,在某些情况下,数据(来自thresholds_loader)将在 7 或 8 小时后到达。在这些情况下,我们希望了解根本原因—为什么我们的 DAG 表现不如预期?我们需要改变什么来保证更新如期进行?
具体来说,突破 SLO 的 DAG 运行的甘特图可能如下所示:

显示花费超过 6 个小时完成的 DAG 运行的甘特图。
或者看起来像这样:

显示不同 DAG 运行时间超过 6 小时的甘特图。有什么不同?
从数学上来说,我们如何说 DAG 用了太长时间是乔布斯的错?
输入贝叶斯网络。我们将再次转向 ELT DAG。我们已经给出了上面time(DAG)的等式,它告诉我们总运行时间是作业运行时间的函数。如果我们知道我们感兴趣的特定 DAG 运行的运行时间,这很好。但是一般情况下呢?从概率上来说,我们预计 DAG 要花多长时间?
为了进行概率性思考,我们应该求助于贝叶斯网络,这意味着我们需要从我们的 DAG 中创建一个新的 DAG。(不要慌!贝叶斯网络也是 Dag 的一种类型——旨在使用统计和因果推理来回答概率查询的特殊网络。)
为了将我们的 ELT DAG 转化为贝叶斯网络,我们需要将每个作业运行时间不再视为离散值(比如,“43 秒”),而是视为从运行时间的分布中提取的变量。

计算过程— ,尤其是处理数据的过程——通常需要某种一致的时间来完成,但会有差异。也许你的负载平衡器今天过得很糟糕,或者也许有人用请求轰炸了你的 API。也许红移、雪花或 BigQuery 中的一个有独立的性能问题。
因此,让我们从使所有的运行时间具有概率性开始。现在,每个节点elt_job代表一个随机变量,其中P(elt_job < t)代表该作业在不到t秒内完成的概率。

贝叶斯网络…?
好的…这就是我们的贝叶斯网络?它看起来是不是和我们之前的 ELT DAG 一模一样?
嗯,这个是一个合法的贝叶斯网络,但是它根本不是我们 DAG 的恰当表示。为什么?我们实际上已经抛出了一些非常有价值的信息——也就是我们之前发现的关于运行时的两条规则。他们又来了:
- 如果进程并行发生,取其运行时间的最大值()
- 如果流程按顺序(或“系列”)发生,则取它们运行时间的总和
我们能在贝叶斯网络中解释这些规则吗?剧透警告:我们可以,这大大降低了我们网络的复杂性。为此,我们需要发明两种具有简单概率分布的“特殊”节点。首先,对于并行流程,我们将有一个“最大”节点,其概率分布如下:

对于顺序流程,我们也有一个“+”节点,概率分布如下:

这是否过于学术迂腐?是的。我们是否扩大了“随机”变量的定义?也许吧。但是真正重要的是消除这里的缺乏的随机性,因为它使得生成的贝叶斯网络在计算上简单得多。
这是一个使用我们刚刚定义的两个特殊节点的转换贝叶斯网络:

代表 DAG 实际运行时间的贝叶斯网络。
最终节点 DAG 是一个随机变量,其值完全取决于所有作业的概率运行时间(例如变量features_agg, metrics_train,等)。)连同所有的求和与最大化。更准确地说,我们知道:
P(DAG) = MAX(P(preprocessing_rs),
P(preprocessing_sf),
P(preprocessing_bq)) +
P(features_agg) +
MAX(P(features_snapshot),
P(metrics_train) + P(thresholds_loader))
这个方程看起来很像离散运行时的方程,除了离散运行时(time)已经被每个运行时的概率(P)所取代。但是,求和与最大化保持不变,这使得这个方程非常容易处理。
当然,像P(preprocessing_rs)这样的发行版不会神奇地从天而降。您必须根据 DAG 本身的有限运行次数来估计这些。这里也有一个完整的兔子洞,但是现在让我们假设您可以将正态分布拟合到 ELT DAG 中每个作业的运行时。

观察到的运行时间(蓝色数据点)的有限集合的拟合正态分布。
所以现在让我们具体点。我们可以看到,我们想问的许多关于 DAG 的问题都可以被公式化为对我们新的贝叶斯网络的查询。
问:DAG 刚刚运行了 7 个小时。这不正常吗?
答:P(DAG < 7 hours)值多少?如果这个数字很高——假设是 99%——那么是的!变态!7 小时 DAG 运行时间的可能性为 1%。

问:features _ snapshot 作业运行时间是否过长?
答:说features_snapshot任务及时运行t。什么是P(features_snapshot < t)?如果这个数字“高”——假设是 80%——那么是的!t是一个相当变态的运行时。
问:(RCA 问题):features _ snapshot对 DAG 运行 7 小时负责吗?到什么程度?
答:什么是P(DAG < 7 | features_snapshot = t)?如果这个数字很高,那么即使 features_snapshot 花费t秒,DAG 也很可能在 7 小时内完成。如果它很低,那么 DAG 似乎更有可能被这一个作业所瓶颈。如果P(DAG < 7)和P(features_snapshot >= t)低就更有可能了。尤其可能的是,如果
P(DAG < 7 | features_snapshot = E[features_snapshot])
很高,这表示如果features_snapshot花费了预期的时间,DAG 可能会在不到 7 个小时内完成。

正如我们所看到的,这里要探索的因果织锦是丰富的,即使没有冒险对字段级异常进行因果推断,例如零利率的意外上升或一些关键指标的急剧下降。更重要的是,贝叶斯网络和因果推理允许我们提出关于实际 RCA 和数学的问题,而不是浮现相关的暗示,即人类工程师必须将它们缝合成一个故事。
在我看来,像这些这样的领域是数据质量问题 RCA 的真正前沿:深入数据基础设施的独特结构,利用血统,并将软件、数据和调度依赖项视为数据因果推理的一等公民。
数据团队有潜力自动化和扩展大部分数据停机根本原因分析,基于每个表的细分分析不会让我们达到这一目标。
在此之前,祝您没有数据宕机!
除特别注明外,所有图片均为作者所有。
专家分析师如何看待时间
原文:https://towardsdatascience.com/how-expert-analysts-think-about-time-6ae59573fe64
成为“真正的”数据分析师的旅程
当我开始在会议上谈论分析的重要性时,我发现让听众相信它的价值是容易的部分。当我解释这个陷阱时,情绪发生了变化:分析是对时间的投资……而且,和所有投资一样,你有可能什么回报也没有。
分析是一项时间投资……和所有投资一样,它有可能让你空手而归。
只有在分析师不会因为空手而归而受到惩罚的组织中,分析文化才能茁壮成长。

由 Alexander Sinn 在 Unsplash 上拍摄
这篇文章是一系列文章的一部分,涵盖了业余分析师和专业分析师之间的 10 大区别。我们在我以前的文章【2】【3】【4】中详细讨论了前 8 个,现在我们将在这里继续我们的旅程。
专业数据与业余数据的区别之九——对时间的不同思考
数据分析有两种形式:
- 反应式分析:查找回答团队特定问题的数据。
- 主动分析:探索数据,激发你的团队考虑新的方向。
分析师能做出的最有价值的贡献是激励决策者考虑他们不知道需要考虑的行动方案。换句话说,做探索性数据分析(EDA) 来成功搜寻值得了解的未知的未知。这就是主动分析。

现在准备好一些不适吧!一个分析师所能做出的最有价值的贡献……也恰好包含了没有保证结果的时间投资。啊哦。
有经验的分析师选择以正确的方式思考分析的老板。
与外行不同,专业分析师理解这种残酷的并列关系 ,他们寻找同样理解这种关系的老板 : 有勇气做出不可收回的投资并为此负责的老板。
不幸的是,这样的老板很少,而分析师兴旺的组织更是少之又少。建立无附加条件的分析文化需要勇气。
*顺便说一句,这就是无用的仪表板是如何诞生的。它们来自于经理们,他们坚持认为分析师总有一些东西值得展示。
专业分析师如何看待时间
一个经验丰富的分析师知道他们的工作不是一件有保证回报的确定的事情,而是在灵感、创新和早期威胁检测方面的时间投资。

照片由 Ahmad Ossayli 在 Unsplash 上拍摄
如果他们在为一个精明的组织工作,他们的团队相信他们会最大限度地利用分配给他们的时间,所以他们会不断地考虑他们行动的投资回报(ROI ):
- 专业分析师系统地工作,优先考虑最有希望的调查领域,并对他们走向死胡同的迹象保持警惕,以便他们能够尽早转向。
- 专业分析师反复工作,先从大图开始,然后深入(最有希望的)杂草。他们还与他们的决策者反复沟通,让他们了解进展,以便他们可以在需要时重新定向分析工作。
- 专业分析师工作迅速,以最大化 每分钟灵感 的风格编码。这通常看起来与软件工程师的生产就绪代码非常不同……但这是他们做得对的标志。(虽然他们明智地采取草率的一次性方法,但他们会以软件工程师的风格编写频繁重用的代码,以节省以后的时间。)
- 专业分析师聪明地工作,投入适当的时间去了解他们正在处理的数据的质量,这样他们就不会把时间浪费在探索垃圾上。他们知道和领域专家在一起的时间通常是值得的。
- 专业分析师整体工作,从多个数据源拼凑线索,包括数据文档和与各利益相关方的真实对话。
- 专业分析师积极工作,预测他们的决策者的问题,并提出新的数据来源进行探索。
- 专业分析师的工作是战略性的,他们明白分配给他们的时间来自他们的决策者,所以他们的重点应该是最大化决策者的整体时间投资回报率(而不是只考虑分析师的个人效率)。
很少有角色像激光一样专注于时间的投资回报率。正如我们将在本系列的最后一篇文章中看到的,对速度有一个细致入微的观察是释放你作为一名分析师的优势并迈向职业巅峰的关键。
专业数据与业余数据的差异#1-#3
软件技能;轻松处理大量数据;不受数据科学偏见的影响。包含在第 1 部分中。
专业数据与业余数据的差异# 4 –# 6
了解职业;拒绝成为数据江湖骗子;对确认偏差的抵抗力。包含在第 2 部分中。
专业数据与业余数据的差异#7
对数据的现实预期。包含在第三部分的中。
https://kozyrkov.medium.com/how-to-form-realistic-expectations-about-data-622e85ab62cb
专业数据与业余数据的差异#8
知道如何增加价值。包含在第 4 部分中。
专业数据与业余数据的差异#9
这篇文章!
专业数据与业余数据的差异#10
https://kozyrkov.medium.com/analytical-excellence-is-all-about-speed-6881c848c09c
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格联系。
GPU 计算能有多快
原文:https://towardsdatascience.com/how-fast-gpu-computation-can-be-41e8cff75974
Python 和 PyTorch 在 CPU 和 GPU 中的矩阵运算比较
GPU 计算增益比 CPU 快多少?在本文中,我将使用 Python 和 PyTorch 线性变换函数来测试它。
以下是我的一些测试机器规格:
- CPU:英特尔 i7 6700k (4c/8t)
- GPU: RTX 3070 TI (6,144 个 CUDA 内核和 192 个张量内核)
- 内存:32G
- 操作系统:Windows 10
NVIDIA GPU 术语解释
CUDA 是计算统一设备架构的缩写。可以用 CUDA 直接访问 NVIDIA GPU 指令集。
不像 DirectX 和 OpenGL 是为了构建游戏引擎而特意设计的,CUDA 不需要用户理解复杂的图形编程语言。
张量核是加速矩阵乘法过程的处理单元。
例如,使用 CPU 或 CUDA 将两个 4×4 矩阵相乘涉及 64 次乘法和 48 次加法,每个时钟周期一次运算,而张量核可以在每个时钟周期执行多次运算。

来源:nvidia.com
在 Nvidia 开发者的 YouTube 频道的这个视频中有更多关于张量核的介绍。
CUDA 核和张量核是什么关系?张量核心内置于 CUDA 核心中,这些神奇的核心将在满足特定条件时被触发。
测试方法
GPU 计算只在某些典型场景下比 CPU 快。其他情况下,GPU 中的计算可以比 CPU 慢!
由于 CUDA 在并行矩阵乘法和加法方面的独特优势,它被广泛用于机器学习和深度学习。

来源:https://developer.nvidia.com/
在数学等式中:

PyTorch 的线性函数torch.nn.Linear做完全相同的操作。例如,您可以通过以下代码将 2x2 矩阵转换为 2x3 矩阵:
import torchin_row,in_f,out_f = 2,2,3
tensor = torch.randn(in_row,in_f)
l_trans = torch.nn.Linear(in_f,out_f)
print(l_trans(tensor))
CPU 基线
在测量 GPU 性能之前,我需要从 CPU 设置一个基准性能。
为了减轻芯片的负担,延长运行时间,我增加了 in_row 、 in_f 和 out_f 的数量,还设置了循环操作10000 次。
import torch
import torch.nn
import timein_row, in_f, out_f = 256, 1024, 2048
loop_times = 10000
现在,让我们看看 CPU 完成 10,000 次转换需要多少秒:
s = time.time()
tensor = torch.randn(in_row, in_f).to('cpu')
l_trans = torch.nn.Linear(in_f, out_f).to('cpu')
for _ in range(loop_times):
l_trans(tensor)
print('cpu take time:',time.time()-s)
结果:
cpu take time: **55.70971965789795**
我 i7 6700k 用时 55 秒左右,说实话结果还不错。
在 GPU 中计算
为了让 GPU 的 CUDA 执行相同的计算,我只需将.to(‘cpu’)替换为.cude()。此外,考虑到 CUDA 中的操作是异步的,我还需要添加一个同步语句,以确保在所有 CUDA 任务完成后打印所用时间。
s = time.time()
tensor = torch.randn(in_row, in_f)**.cuda()**
l_trans = torch.nn.Linear(in_f, out_f)**.cuda()**
for _ in range(loop_times):
l_trans(tensor)**torch.cuda.synchronize()**
print('CUDA take time:',time.time()-s)
代码更改突出显示,下面是运行结果:
CUDA take time: **1.327127456665039**
几乎比运行在 CPU 中的快 42x 倍。一个模型在 CPU 需要几天的训练,现在在 GPU 可能只需要几个小时。这真的很快。
启用张量核心
CUDA 已经很快了,启用 RTX 3070Ti 的 197 个张量核怎么样?根据这个视频,在 PyTorch 中,要启用张量核,我需要做的就是把浮点精度从 FP32 降低到 FP16。
s = time.time()
tensor = torch.randn(in_row, in_f).cuda()**.half()**
layer = torch.nn.Linear(in_f, out_f).cuda()**.half()**
for _ in range(loop_times):
layer(tensor)torch.cuda.synchronize()
print('CUDA with tensor cores take time:',time.time()-s)
结果:
CUDA with tensor cores take time:**0.5381264686584473**
另一个 2.6 倍的性能提升。
结论
在本文中,我通过在 CPU、GPU CUDA 和 GPU CUDA +张量核中调用 PyTorch 线性变换函数来比较线性变换操作。下面是一个总结结果:

图片作者:安德鲁·朱
NVIDIA 的 CUDA 和 Tensor 内核确实让矩阵乘法性能提升了不少。
参考链接
联合学习如何推进新冠肺炎诊断
原文:https://towardsdatascience.com/how-federated-learning-advanced-covid-19-diagnosis-6e16b9ecc21f
新冠肺炎人工智能诊断成功案例研究

安妮·斯普拉特在 Unsplash 上的照片
最近,联合学习被用于大规模优化用于新冠肺炎诊断的机器学习模型。2021 年 12 月,一篇题为推进新冠肺炎诊断与人工智能中的隐私保护合作的论文在同行评审期刊《自然机器智能》上发表。本文通过结合全球多个地理位置的新冠肺炎诊断数据,对 Covid 阳性或阴性患者的分类进行了显著改进。**
关键发现证实了联合学习如何大规模提高新冠肺炎诊断的灵敏度、特异性和曲线下面积(AUC)值。该出版物的最大成就之一是联合学习如何让中国和英国的机构合作,同时保持其数据的私密性和受保护性。
以聚合酶链式反应测试为基准
用于诊断新冠肺炎的最常见和最依赖的测试之一是逆转录聚合酶链式反应(RT-PCR),通常被称为聚合酶链式反应测试。尽管大量使用,检测灵敏度范围从 0.60 到 0.71(60-71%)。这导致了大量的假阴性,促使全球的研究人员寻找更准确的替代方法。
在将 PCR 测试与不同的机器学习模型和方法进行比较时,灵敏度和特异性是需要考虑的重要值(参见期刊论文,了解关于灵敏度、特异性和准确性的更深入的解释)。灵敏度通过以下公式获得:

作者图片
在哪里,
TP =真阳性
FN =假阴性
则特异性通过以下公式获得:

作者图片
换句话说,敏感度值越高,模型就越有可能预测出真正的正值。特异性越高,模型就越有可能预测真正的负值。
如果一个模型具有很高的准确性,但实现的特异性或敏感性很低,那么该模型将产生不希望的假阴性或假阳性。
为什么联合学习是必要的

照片由 Shubham Dhage 在 Unsplash 拍摄
除了 PCR 测试,计算机断层扫描(CTs)也用于肺部疾病检测。据报道,冠状病毒患者在 CT 扫描中表现出放射性特征,这允许机器学习模型对新冠肺炎阳性患者的分类进行训练。
然而,包括来自多个位置的一整套 CT 的数据集似乎是必要的,以在新冠肺炎分类模型中实现更高的保真度。我想到的第一个解决方案是共享所有数据,并根据 CTs 数据集将单个模型训练到新冠肺炎的分类中(在理想情况下,这可能行得通)。
然而,隐私问题是阻止这种情况发生的主要障碍之一。英国的 18 家合作医院和中国的 5 家医院之间的联合计划同意在本地训练他们的模型,并将模型的权重共享到共享的联合模型中。
联合学习方法的结果
在四个不同的位置收集多个数据集,并用于生成四个模型,用于训练,然后与联合学习方法进行比较。现有的模型能够实现高值的敏感性或特异性,但不能两者兼而有之。这意味着一些模型可以产生良好的阳性结果,但也会将许多阴性 COVID 测试标记为阳性。而其他模型擅长发现阴性,但也会将许多阳性测试标记为阴性(假阴性)。这四个模型是用来自中国和英国的数据集训练的
对于中国数据集,联合模型的特异性、敏感性和 AUC 分别达到 95%、97%和 98%。这优于所有四个单独模型的单独结果。此外,对于英国数据集,联合模型的特异性、敏感性和 AUC 分别为 73%、94%和 89%,优于所有本地训练的模型。
下面的图片显示了每个独立模型和联合模型之间的比较。可以看出。只有模型 4 与英国数据集的联邦模型相匹配。对于其他模型,我们永远无法同时获得与联邦模型相匹敌的敏感性和特异性。

作者图片:联邦模型与模型 1

作者图片:联邦模型与模型 2

作者图片:联邦模型与模型 3

作者图片:联邦模型 vs 模型 4
结论
相对于孤立的机器学习模型,联合学习已经显示出改进。此外,我们观察到比聚合酶链式反应测试更高的灵敏度。中国和英国数据集为 0.97 和 0.73,而 PCR 测试的范围为 0.61 和0.71。
尽管联合学习很有效,但我们需要记住什么时候需要使用这种方法。当不同的数据提供者必须遵守严格的隐私政策时,联合学习可以允许一个大型团队与其模型的数据进行协作。我们还需要考虑跨不同位置的数据集是否会为联邦模型提供额外的健壮性。简单来说,如果训练数据集过于相似,我们将不会改进我们的模型。
最后,我想留下一篇题为《大规模联合学习:系统设计的论文的链接。
感谢您的阅读,感谢您对本文的任何反馈。你可以在我的 GitHub 页面上看到我在机器学习方面的公开工作,并随时关注我或通过 LinkedIn 与我联系。
关注我的 LinkedIn 页面: AI 创客
你的数据来源有多新鲜?
原文:https://towardsdatascience.com/how-fresh-are-your-data-sources-e8db53cf4653
测试表的新鲜度,并通过 Slack 设置监控

数据的新鲜度是数据质量的一个重要方面。如果数据不是最新的,那么它就是陈旧的。如果你的企业认为它是从最近的数据中获得洞察力,但实际上它是在看一个月前的数据,那就有问题了。
这些见解并不准确。
您的数据模型只有在数据新鲜时才具有洞察力。那么,您如何确保您的数据总是被及时接收?
我最喜欢的方法是对我的数据模型使用 dbt 新鲜度测试,特别是对我的源数据进行测试。当您关注最上游的数据源时,您会在源头而不是下游发现问题。它更容易调试,可以节省您的时间。
因此,让我们讨论一下如何在源代码中设置新鲜度测试,以及如何将这些消息发送给 Slack。
设置 dbt 新鲜度测试
dbt 使得测试任何表的新鲜度变得非常简单。虽然测试模型的新鲜度可能很重要,但最重要的是确保每天都在获取原始数据源。我遇到过这样的问题,我的数据连接器显示数据已成功获取,但当我执行手动检查时,数据却是陈旧的。
设置提醒将使您不必手动检查数据列中的最新日期。dbt 测试将根据您设置的阈值给出一个警告,然后给出一个失败。
要设置 dbt 源新鲜度,只需导航到 src.yml 文件,在该文件中定义 dbt 源。与description或columns块类似,在您希望测试新鲜度的源代码下添加一个freshness块。您可以在数据库下添加这个块,它会将测试应用到该数据库中的所有表。

src.yml(图片由作者提供)
或者,如果不希望对每个表都运行测试,可以直接在表名下定义它。

src.yml(图片由作者提供)
如果您想使用不同的warn_after和error_after阈值,您也可以为每个单独的表定义它。
warn_after指定在运行 dbt 测试时收到警告之前可以等待的天数。该警告不会出错,但会让您知道在出错之前检查表的新鲜度。
error_after指定在失败前可以经过的天数。如果您在数据管道中运行这些测试,此故障将导致您的管道失败。
理想情况下,我们希望知道 dbt 测试何时警告我们表的新鲜度。这样我们就可以在表失效之前采取行动。没有“简单”的方法可以通过 dbt 做到这一点,除非您使用 dbt 云运行您的模型。
最后,您还需要在与freshness块相同的缩进位置包含一个loaded_at_field块。这告诉 dbt 将哪个日期与测试运行的日期进行比较。如果您使用 Fivetran 来获取数据,您可能希望使用_FIVETRAN_SYNCED列。这只是数据连接器最后一次将数据接收到仓库中的日期。
使用提督发送时差警报
如果你不熟悉perfect,它是一个利用 Python 编写数据管道的数据编排工具。我在 Prefect 内建的dbt_task()函数中运行我的 dbt 模型和任何命令。我的新鲜度测试是这样进行的:
dbt_source_freshness = dbt_task(command='dbt source freshness', task_args={"name": "dbt tests: source freshness"})
我还在任何数据同步时为这些任务设置上游依赖关系。这样,直到我所有的数据连接器都被 Fivetran 同步后,新鲜度测试才会运行。在 Prefect 中设置依赖关系如下所示:
dbt_source_freshness.set_upstream(shopify_sync)
为了发送 Slack 消息,您需要创建自己的 Python 函数。提督让它变得容易,有一个简单的已经为你建立了。
[@task](http://twitter.com/task)(trigger=all_finished, checkpoint=False, log_stdout=True)
def send_slack_alert_on_test(output):
SlackTask(message=output).run()
按照trigger=all_finished的规定,当所有上游依赖项都已运行完毕时,该功能将被触发。根据您的使用情况,还有其他触发选项。这个函数将把输入函数的输出作为 Slack 消息发送到您指定的通道。你可以在这里阅读更多关于建立一个完美的网页钩子的内容。
为了让这个函数适合我的用例,我必须对它进行一些定制。首先,我想在输出的每一行中重复一遍,而不是将整个输出作为一条消息发送。我还想只发送警告消息,而不是那些已经通过和失败的消息。为了做到这一点,我遍历了邮件的每一行,只发送了包含“警告新鲜度”的邮件。
[@task](http://twitter.com/task)(trigger=all_finished, checkpoint=False, log_stdout=True)
def send_slack_alert_on_test(output):
for line in output:
if "WARN freshness" in line:
SlackTask(message=line).run()
我不想发送“失败刷新”消息,因为如果测试失败,完美的任务无论如何都会出错,我已经收到了不同的通知。
我确实遇到了一个需要记住的重要问题。如果您没有在您的DbtShellTask()中指定return_all=True,那么只有最后一行作为任务的输出返回。最后一行看起来像这样:

作者图片
您希望输出如下所示,这样就可以遍历每一行:

作者图片
添加了这些内容后,您的 shell 任务将如下所示:
dbt_task = DbtShellTask(profile_name='madison',
log_stdout=True,
profiles_dir=DBT_REPO_PATH,
environment='prod',
return_all=True)
现在您已经准备好使用提督部署您的 dbt 新鲜度测试和 Slack alert 了!
结论
为数据表设置监控是创建可靠数据堆栈的首要步骤之一。这将有助于你在火灾发生前进行扑救,做到积极主动,而不是被动反应。如果你认为一切都会按计划进行,那你就错了。你需要准备好能让你成功的工具,即使你预期会更糟。
对于那些利用 dbt 并且在您的数据堆栈中没有复杂的数据质量或监控平台的人来说,这是一个很好的解决方案。任何人都可以设置这些测试,只要他们已经在使用 dbt。像这样的步骤只需要很少的前期工作,但是从长远来看,会为你节省很多工作。
要了解更多关于使用 dbt 和改进数据堆栈的技巧,订阅我的 Learn Analytics 工程简讯。
阅读更多关于数据摄取的信息最佳实践。
学习使用免费的 dbt 包设置数据量警报。
GANs 如何学习创造力——理解生成性对抗网络的优化功能
原文:https://towardsdatascience.com/how-gans-learn-creativity-478fc1e4cc79
解释流行的 GAN min-max 游戏和模型的总损失

Joshua Woroniecki 在 Unsplash 上的照片
G 生成对抗网络 (GANs)最近在人工智能领域变得非常流行,尤其是在计算机视觉领域。随着 Ian J. Goodfellow 等人[1]的科学文章“生成对抗网络”的介绍,一种用于开发生成模型的强大的新策略出现了,并且自那时起,许多研究和研究项目随之出现,开发了我们现在看到的新应用,例如最新的DALL-E 2【2】或GLIDE【3】(这两种应用都是使用扩散模型开发的,这是生成模型的较新范式。然而,GAN 今天仍然是一种广泛使用的模型,能够解决多种问题
但由于一切总是从头开始,在本文中,我将展示大家听说过的的原始 GAN 优化函数的含义和推理,以及它与模型的总损失函数的差异(您必须知道,根据模型的目的,后来还创建了许多其他变体)
目录
1.甘斯简介
生成对抗网络是一类深度学习框架,被设计为生成模型,目的是生成新的复杂数据(输出),如在之前从未存在过的图像或音频。****
为了训练 GAN,我们只需要一组我们想要复制或模仿的数据(图像、音频……),网络将找出创建新数据的方法,这些数据看起来像我们数据集的例子。
换句话说,我们给模型一些例子作为输入来“获得灵感”,并给它产生新输出的完全自由
这种训练过程称为无监督学习,在这种过程中,我们只向网络提供 X 输入,而不附带任何标签(或期望的输出)。
GAN 架构由两个相互竞争的网络组成(因此得名“敌对网络”)。通常我们将这些网络称为发生器****【G】和鉴别器(D)** 。生成器的任务是学习从随机噪声开始生成数据的函数,而鉴别器要决定生成的数据是否“真实”(这里“真实”是指数据属于我们数据集的例子),这样我们就可以衡量模型的性能,调整参数。两个网络同时被训练和学习。**

为了说明生成器-鉴别器游戏,我们可以把伪造者想象成试图愚弄侦探或鉴别器的生成器(右图由 Ahnaf Piash 在 Unsplash 上拍摄)
甘培训
GANs 训练有许多不同的变化和修改。然而,如果我们遵循原始论文[1],普通 GAN 训练循环如下:
****为训练迭代次数做:
- 从样本分布(即随机噪声 z )中生成 m 个样本(图像、音频……),我们将其表示为: G(z)
- 从训练数据集中取 m 个例子: x
- 将所有示例(生成的和训练的数据集)混合,并将其馈送给鉴别器 D 。D 的输出将在 0 和 1 之间,意味着 0 这个例子是假的,1 这个例子是真的
- 测量鉴频器损耗函数并调整参数
- 生成新的 m 实例 G'(z)
- 将 G'(z) 送入鉴别器。测量发电机损耗函数并调整参数。
结束
****注。最近的 GAN 训练方法测量发生器损耗,并在第 4 步中连同鉴别器一起调整其参数,跳过第 5 步和第 6 步,从而节省时间和计算机资源。
2.最优化和损失函数(最小-最大游戏)
如果您阅读 GAN 的原始论文,您将获得以下函数,该函数为模型定义了优化函数。

GAN 优化功能。截图自原论文《生成性对抗性网络》[1]
****注。上面的公式是优化函数,即两个网络(生成器和鉴别器)都试图优化的表达式。在这种情况下,G 希望最小化它,而 D 的目标是最大化它。但是,这不是模型的总损失函数,它告诉我们它的性能。
为了理解 mix-max 游戏,我们必须考虑用什么来衡量我们模型的性能,这样网络就可以优化它。由于 GAN 架构由两个同时训练的网络构成,我们必须计算两个指标:发电机损耗和鉴别器损耗。
鉴别器损失函数
根据论文[1]中描述的训练循环,鉴别器从数据集接收一批 m 个示例,从生成器接收其他 m 个示例,并且输出一个数字∈ [0,1]** ,这是输入数据属于数据集分布的概率(即数据为“真实”的概率)。**
在将示例输入鉴别器之前,我们已经知道哪些示例是真实的,哪些是生成的(来自数据集的示例 x 是真实的,生成器的输出 G(z) 是生成的),因此我们可以给它们分配一个标签:y = 0(生成的),y = 1(真实的)。

图 1 。GAN 模型的工作流程。注意:k 是指鉴别器的输入,它可以是生成的图像或数据集的一个例子。作者图片
现在,我们可以使用二进制交叉熵损失函数将鉴别器训练成普通的二进制分类器:

****n = 2m 时鉴别器(D)的二元交叉熵公式。yi 表示标签,k 表示输入(生成的和真实的输入)
但是,由于这是一个二进制分类器,求和交替出现:
-当输入为实数时,标签 y = 1 →求和 ∑ = log(D(k)) -当输入生成时,标签 y = 0 →求和 ∑ = log(1-D(k))
因此,我们可以用更简单的形式重写表达式:

现在 xi 是来自数据集的真实例子,而 G(z)是由生成器(G)生成的输出。因此,我们不是给函数一个单一的输入,而是同时引入两个:D(Xi)和 G(z)。此外,n = m
优化功能
我们知道,鉴频器想要最小化它的损耗,因此,它想要最小化上面的公式( argmin Dloss )。然而,我们可以通过去掉负号来修改公式。现在,我们必须最大化它,而不是最小化表达式:

以前,要获得 Dloss = 0,我们必须将其最小化。但是现在我们改变了表达式符号,我们必须最大化它以获得- Dloss = 0
最后,我们可以操作这些条款:

- Dloss 的最终表达式。Ex~p(x)表示期望值
并重写表达式:

鉴别器优化功能
另一方面,生成器的目标是伪造鉴别器。然后,发生器必须执行与鉴别器相反的操作,并且找到 V(G,D)** 的最小值。**

发电机优化功能
现在我们可以将两个表达式(鉴别器和生成器优化函数)相加,并获得最后一个表达式:

最小最大游戏
( Tadaa!)我们终于得到了优化函数。然而,正如我之前说过的,这不是总损失函数,它告诉我们模型的整体性能。但在此之前,我们需要首先计算发电机损耗:
发电机损耗函数
再回头看优化函数,我们看到生成器只参与表达式E(log(1-D(G(z)))】的第二项,而第一项保持不变。因此,试图最小化的发电机损耗函数为:

然而,我们还没有完成。正如原论文 中所解释的,“在学习的早期,当 G 很差的时候,D 可以以很高的置信度拒绝样本,因为它们与训练数据明显不同。” 即在训练的初期,鉴别器很容易区分真实图像和生成的图像,因为生成器还没有学会。这种情况下,log(1D(G(z))会饱和,因为 D(G(z))∞0
为了避免这种情况,研究人员提出如下: “与其训练 G 使 log(1d(G(z))最小化,我们可以训练 G 使 log D(G(z))最大化” 。 这就等于说,不是训练生成器最小化图像是假的概率,而是要最大化图像是真的概率。
从本质上讲,两种优化方法是相同的,正如我们在图表中看到的:

在[0,1]范围内最小化 log(1-x)与最大化 log(x)是一样的。作者图片
因此,出于我们的目的,我们将使用的发电机损耗函数为:

**非饱和发电机损耗功能**。重要的是要记住,现在 G 想要最大化这个函数
****注。实际中,在对发电机损耗函数进行编码时,通常使用上述公式的负形式,这样,目标不是使函数最大化,而是使其最小化。从而便于用诸如 Tensorflow 之类的库来调整参数。这对于理解下一节的总损耗函数也很重要。
3.总损失函数
文中给出了各部件(发生器和鉴别器)的损耗公式,以及模型的优化功能。但是,我们如何衡量型号的整体性能呢?
只看优化函数并不是一个好的衡量标准,因为正如我们已经看到的,优化函数是鉴频器损耗函数的修改,因此它并不反映发电机的性能(尽管发电机损耗函数是从它派生出来的,但我们只是在该函数中考虑了鉴频器的性能)
另一方面,可以考虑增加两个损失函数(鉴别器和发生器),虽然这是一个很好的直觉,但我们需要考虑一些细微差别:
****1。两个损失函数都必须以最小化或最大化为目标。
否则,相加将反映比应该的误差更高或更低的误差。
举个例子,让我们来看看想要通过 D 最大化的优化函数:

和旨在通过 G 最小化的第一发电机损耗函数:

当 D 做得很差(低误差)而 G 做得很好(低误差)时,整体性能将产生低误差,这意味着两个网络(G 和 D)都做得很好,尽管我们知道其中一个不是。
此外,如果一个损失的目标是最小化,另一个是最大化,我们就不知道高误差是好是坏。
****注。如果我们使用以最大化为目标的损失函数,称之为“误差”可能听起来违反直觉,因为“误差”越高,性能越好。然而,我们也可以使用对数标度来转换它,例如 log(1+“误差”)
2。为了建立总损失函数,单个损失必须在相同的数值范围内
现在让我们以我们讨论的第一个鉴别器损耗(二元交叉熵)为例:

以及在最后一点中使用的先前的发电机损耗函数:

现在两个函数都满足目标最小化的条件。然而,鉴频器损耗在[0,+∞]范围内,而发电机损耗输出值在(-∞,0)范围内。将这两个函数相加等同于减去发生器损耗,因此我们说总损耗是没有发生器影响的鉴频器损耗(即 E(log(D(xi)),其中 E 表示期望值),这是不正确的。
然而,我们还有另一个加法组合。如果我们加上第一个鉴频器损耗和修正发电机损耗的负形式会怎么样?****

****GAN 模型的总损失函数。这个函数告诉我们模型的整体性能
(万岁!)这是 GAN 总损耗函数。然而,万一你不相信我,让我们检查它是否满足性质。
✅ 1.我们知道,Dloss 旨在最小化,负形式的修正发电机损耗也旨在最小化。
✅ 2.Dloss 输出范围[0,+∞)内的值,结果是负的修正发电机损耗也将值映射到相同的范围内。
因此,我们增加了相同类别的误差,并因此计算了我们模型的总损失函数。
4.结论
总结本文的主要要点:
- 甘优化函数(也叫极小极大博弈)和模型的总损失是不同的概念:
极小极大优化≠总损失 - 优化函数的来源来自于二进制交叉熵(其反过来是鉴别器损耗),并且还从其导出发电机损耗函数。
- 发电机损耗函数在实践中被修改,使得对数不饱和。并且这种修改对于计算模型的总损失函数也是有用的。
- ****总损失函数= Dloss +光泽度。然而,并不是所有的公式都可以使用,我们需要考虑两个关键点:
-两个单独的损失函数都必须以最小化或最大化为目标。
-各项损失必须在相同的数值范围内
我希望你喜欢这篇文章,它对你有所帮助。请不吝赐教。欢迎任何反馈或更正
5.参考
生成性对抗性网络 。伊恩·古德菲勒等人,2014 年
【2】层次文本——有条件的图像生成带剪辑潜影 (DALL-E 2 纸) 。OpenAI 2022
【3】GLIDE:利用文本引导的扩散模型实现真实感图像生成和编辑 。
在当前的十年中,人工智能将如何颠覆一切
许多人会感到惊讶

稳定扩散的作者图像
最近几个月,Midjourney、DALL-E、Stable Diffusion、LaMDA 和 PaLM 等人工智能系统在图像和文本生成等领域取得了长足进步。这些系统的能力令人印象深刻:它们产生极具暗示性的图像,为广告创造有效的销售文案,等等——所有这些都来自描述用户想要得到什么的简单“提示”。
这一切都是用生成式 AI 完成的。
“生成式人工智能”指的是由深度神经网络驱动的系统,这些网络实现大型语言模型 (LLM),以便创建某种内容。这里我说“创造”,意思是它不是已经存在的东西的复制,不是在哲学意义上(到底什么是“创造”?).
在这个勇敢的新世界里,新的大公司正在涌现,像 Jasper(杰士邦)这样的公司提供销售拷贝和广告图片:Jasper 现在的估值超过 10 亿美元,成为一夜之间的独角兽。
第一个真正产生影响的生成式人工智能平台是几年前发布的 GPT-3!在那之后,该领域的几个玩家(OpenAI、Google、StableDiffusion、Google、DeepMind 和其他人)以惊人的速度发布了一系列产品,以至于很难保持最新。
但是,除了在中途花点时间根据我们的提示创建图像是多么有趣和美妙之外,许多技术爱好者还在努力理解这种生成性 IA 浪潮。
生成式 IA 是一种稳固的趋势,还是仅仅是一种时尚?
整个十年的趋势
我会选“固体趋势”,因为它将在这十年的范围内改变成千上万的专业和休闲活动。让我从一个例子开始。
我是个超级网球迷(至少在电视上是这样)。但网球直播比赛需要几个小时才能结束,我还有其他活动和兴趣,所以我通常会看回放,或者只看比赛中最有趣的 4 分钟左右的精彩视频。
但是如果不是 4 分钟的视频,而是 10 或 15 分钟的呢?或者我想把每一分都包括在加时赛中?我目前运气不好。
现在让你的生成式人工智能帽子发挥作用:生成式人工智能体育视频生成器将根据你非正式地放入如下文本提示中的规范,为你创建一个视频:
"大约 15 分钟的视频,介绍了 2022 年巴黎贝尔西网球赛拉法·纳达尔 vs 汤米·保罗比赛中最精彩的部分,包括完整的抢七局(如果有的话),以及转换的每个断点"
就是这样。你得到了一个你的个性化视频的链接,不同于世界上任何人观看的视频。这种视频服务在经济上与 DALL-E 和 Midjourney 一样可行。
从研究到创新
研究不同于创新。前者关注的是已发表的原创成果,后者更多的是从这些成果中寻找如何建立一个企业:创新不在乎原创性,而是关注增长性、防御性、投资回报等。
事情往往变得令人困惑,因为研究是由谷歌这样的公司进行的,原则上它们是为了盈利——但它们明白自己的业务是高科技的,没有研究就没有高科技。因此,他们参与资助研究,并接近学术界——他们的许多顶级研究人员都是从学术界聘请的。作为一名研究人员,几年前我应邀参加了他们在山景城总部举行的教师峰会,他们让我住在四季酒店的一个套房里——无论如何都要给学术界留下好印象!
两层软件体系结构
但是,即使很难——甚至是人为地——明确区分研究和创新,这种差异也是至关重要的,因为在生成式人工智能的情况下,这两者将由不同的行为者开发,并且它们将与软件堆栈中的两个不同层相关联——正如 J. Currier 指出的:
- 底层软件层是深度学习模型,围绕大型语言模型(LLM)或等效内部表示的实现而构建。模型提供了开发应用程序的基本构件。
- 顶层软件层是应用层,它建立在深度学习模型的基础上,以完成特定的任务,例如,从文本提示中输出图像。
这种双层架构将催生一个加速创新的新时代,因为一旦底层由 Google、OpenAI 和其他超大型公司开发,较小的公司将提供应用层——当然,会给底层提供商一部分利润。
目前,较低层已经得到了快速的改进——通常,它是与顶层的应用程序一起发布的。例如,LaMDA 和 PaLM 提供开箱即用的对话功能,而 DALL-E 和 Midjourney 则提供图像提示服务。但很快,底层开源替代方案的激增将使开发顶层应用层并将其插入已有的底层成为可能。当然,说起来容易做起来难,但事实是底层比顶层复杂几个数量级。
未来的影响
我认为,生成性 IA 将渗透到几乎每一项知识工作和休闲活动中,因为它将提供工具,从以前困难的活动中摆脱复杂性,因为它可以提供一个全新层次的个性化,我称之为“生成性个性化”
你可以从上面的体育视频例子中看到什么是“生成性个性化”:每个用户都有一个全新的独特的精彩视频,而不仅仅是两三个选项之间的选择。
所有生成式 IA 应用程序的累积影响难以夸大:
- 使用 DALL-E、Midjourney 和 Stable Diffusion 等工具,非专业人士已经可以轻松创建图形,至少对于简单的实用目的来说是如此,比如为这篇文章获取标题图像。在今年之前,我完全不能画自己的图像,博客专家建议不要浪费时间在你自己的故事的平面设计上。
- 照片编辑用户不需要忍受艰难的学习曲线来掌握 Photoshop 或 Affinity Photo 的复杂工具(我使用后者,它太复杂了,我不得不查阅 YouTube 教程来了解如何进行大多数调整)。有了生成式人工智能,用户只需要求软件执行给定的转换,瞧!图像会被修复。如果 Adobe 未能通过他们的工具提供生成性人工智能,他们将被提供这些工具的新创业公司所颠覆,并将走上 Blockbuster 的道路。
- 像 PowerPoint 这样的演示工具,不再像现在一样只提供模板,而是从大纲想法中生成并微调整个专业级演示。目前,专业和业余演讲之间的差异是巨大的——这种情况不会再发生了。
- 文本写作将是一个由生成性人工智能工具高度增强的过程。许多形式的写作已经得到了 Grammarly 等复杂工具的帮助,但生成式人工智能将通过,例如,生成一个完整的第一版博客,给作家一个质的新水平的帮助。写作将是人类和人工智能工具之间的合作过程。
- 任何面向最终用户的软件都必须易于使用文本或语音提示。用户手册和教学视频将成为过去,一旦用户习惯了使用软件的新的简单方式,一切都将不得不提供它以保持相关性。
- 语言学习将主要在语音助手的帮助下完成,语音助手将由——你猜对了——生成性人工智能提供支持。语音助手就像个人语言教练一样,将使用其惊人的自然语言对话能力,首先见于谷歌的 LaMDA 等系统,来指导人类语言学习者,以获取词汇和表达,改善发音等。语言教学语音助手不是一个未来的幻想——它只是从目前来看有经济意义。
- 甚至硬件产品(如汽车)也会有生成式人工智能对话式帮助系统。你有没有尝试过在现代汽车中进行像调节显示屏这样的复杂操作?不容易,我可以告诉你。你不用去钻研复杂的手册,只需要让语音助手给出指示或者直接完成调整。
许多职业将会变得面目全非。平面设计师已经感受到了这种颠覆带来的痛苦。整个职业将会消失,其他职业将会被创造出来。强大的公司将会破产,新的公司将会占据主导地位,这取决于它们如何处理由生殖式人工智能带来的技术颠覆。
所有这些都将在十年内发生。
最后的想法
我可能是错的,但在我看来,即使是经验丰富的技术专家,也很难预测当前图像和文本生成器的巨大能力:几年前,庞大的模型和训练集将导致质的不同的能力还不明显。
我甚至可以说这是一个幸运的、几乎是随机的发现。但现在我们确实有了生成工具,大门向创新公司敞开,这些公司将快速开发一个又一个应用程序:主要问题是找出哪些可以从根本上改进,并找到合适的商业模式,以从生成式 IA 想法中赚钱。
几年前,似乎其他技术趋势,如自动驾驶汽车、虚拟现实或区块链,将很快接管,但自动驾驶技术受到立法障碍的限制,区块链受到经济衰退的打击,虚拟现实的采用受到硬件高成本的限制。相反,生殖人工智能还没有受到立法的限制(嘿,润色 PowerPoint 演示文稿或生成体育视频不是生死攸关的事情),也不需要用户购买昂贵的硬件。
我们没想到创造性活动会这么快被打断。但是他们是。
我们正在进入一个新的、有时甚至是怪异的时代,在这个时代,人类的创造力与机器的新能力混合在一起,以至于很难区分它们。正如 J. Currier 指出的:
“今天和未来几年,这将令人感到惊讶,在许多方面也令人害怕。因为那些从零到最初想法的创造性时刻总是让人感觉如此独特,因为它是如此神秘。”
Git 的真实工作方式
原文:https://towardsdatascience.com/how-git-truly-works-cd9c375966f6
深入了解 Git 的内部知识并掌握它

#简介
Git 无疑是现代软件开发的主要基石之一。它是协调开发人员工作的必备工具箱,并成为多年来开源运动的基本引擎。简单来说,截至 2021 年 11 月,Git 的主要存储库管理器 GitHub 报告称有超过 7300 万开发人员和超过 2 亿个存储库。
有几个程序员每天都和 Git 打交道,并且共同应用关键概念。在本次讲座中,我们将 进行下一步 ,深入探究 Git 的内部结构和基本基础。什么是分支?什么是头?合并一个分支意味着什么?今天,我们将回答这些问题和其他问题。
在我们开始之前,我要特别感谢拉朱·甘地,他通过精彩的讲座“Git next steps”帮助我完成了这篇文章,该讲座可以在O ' Reilly上找到。他清晰完整的解释是我灵感的源泉。
#基础
Blobs、树和提交是 Git 数据结构的主要组成部分。正如一所房子是由砖块建造的,或者一个图形是由边和节点组成的,这些元素构成了 Git 的基础。
为了理解这些,让我们从一个例子开始。假设我们创建了一个空的存储库。当我们启动命令 git init 时,git 会自动创建一个名为的隐藏文件夹。git 用于存放内部零件。
斑点
现在,假设我们创建一个名为 myfile.txt 的文件,并使用命令 git add myfile.txt. 将其添加到我们的存储库中
当我们执行这个操作时,Git 创建一个 blob ,一个位于子文件夹中的文件。git/objects 存储 myfile.txt、的内容,不包含的任何相关元数据(如创建时间戳、作者等)。因此,创建 blob 就像存储文件内容的图片。
blob 的名称与其内容的散列相关。一旦内容被散列,前两个字符用于在中创建一个子文件夹。git/objects ,而散列的剩余字符构成了 blob 的名称。
总之,当向 Git 添加文件时,会发生以下步骤:
- Git 获取文件的内容并对其进行哈希处理
- Git 在中创建一个 blob。git/objects 文件夹。哈希的前两个字符用于在该路径中创建子文件夹。在其中,Git 创建了一个 blob,其名称由哈希的剩余字符组成。
- Git 将原始文件的内容(它的压缩版本)存储在 blob 中。

创建 blob 时 Git 执行的过程的描述(图片由作者提供)
请注意,如果我们有一个名为 myfile.txt 的文件和另一个名为 ourfile.txt、的文件,并且这两个文件共享相同的内容,则它们具有相同的散列值,因此它们存储在同一个 blob 中。
还要注意,如果我们稍微修改 myfile.txt 并将其重新添加到存储库中,Git 会执行相同的过程,因为内容发生了变化,所以会创建一个新的 blob。
树
假设现在我们在存储库中创建了一个名为子文件夹的子文件夹。我们还可以在这个子文件夹中创建一个名为 yourfile.txt 的文件,并将其添加到存储库中。这样做的时候,Git 根据我们在上一段中定义的过程为 yourfile.txt 创建一个新的 blob。

Git 散列第二个名为 yourfile.txt 的文件,该文件存储在文件夹中。git/objects(图片由作者提供)
此时,我们用命令 git commit 提交 myfile.txt 和 yourfile.txt 。这样做时,Git 采取了两个步骤:
- 它创建了存储库的根树
- 它创建了提交
让我们专注于第一步。那么,什么是根树呢?一个根树存储了整个库的文件和文件夹的结构。它是一个文件,包含对存储库中包含的每个 blob 或子文件夹的引用,以递归方式构建。
根树的每一行引用一个斑点或其他子树,这些子树又以相同的方式引用其他斑点或其他子树。因此,树相当于目录:正如我们可以从目录中访问文件和子文件夹一样,我们也可以从树中访问blob 和子树。

与 mysubfolder 相关的根树和子树的内容(图片由作者提供)
一旦 Git 创建了根树和所有相关的子树,它就执行我们上面描述的相同的散列和存储操作。更准确地说,它对每棵树进行散列,并使用前两个字符在中创建一个子文件夹。git/objects 而剩余的散列字符形成保存文件的名称。因此,从这个过程中,我们得到了与数据结构中树的数量一样多的新文件。

Git 散列根树和与 mysubfolder 相关的子树,两者都存储在文件夹中。git/objects(图片由作者提供)
犯罪
当运行命令 git commit 时,第二步是创建提交。提交内容存储在一个文件中,该文件包含与根树、父提交(如果有)相关的信息,以及一些元数据,如提交者的姓名和电子邮件以及提交消息。

提交文件包含对根树的散列、作者和提交者、提交时间戳(在本例中为 163267988)、父提交(在本例中为空,因为这是我们的第一次提交)和提交消息(作者的图像)的引用
一旦创建了提交文件,Git 就对其内容进行散列,并使用散列名称将内容存储在一个新文件中,与上面完全一样(前两个字符构成了中的子文件夹名称)。git/objects ,而哈希的剩余部分构成了实际的名称)。

到目前为止所有树、提交和 blobs 的结构(图片由作者提供)
那就是。恭喜你,你刚刚意识到 Git 是如何构造的。现在,有了这些概念,定义 branch、tag、head 和 merge 的概念就非常简单了!
#砖块
分支
分支被命名为提交的引用。例如,当创建一个名为 mybranch 的新分支时(以命令 git checkout -b mybranch 为例),Git 在路径中生成一个新文件。git/refs/heads 命名为 mybranch。这个文件的内容是创建分支的提交的散列。

最初,master 和 mybranch 都指向同一个提交(作者图片)
然后,当我们在 mybranch 上提交时,Git 执行之前定义的操作(它创建根树并提交文件),然后用新的提交散列更新分支的文件。

执行新的提交,并且用文件 mybranch 的内容对其进行更新。文件 mybranch 现在指向新的提交(作者图片)
因此,分支是跟踪提交的文件,并且这些文件的内容在我们执行的每次提交时都被更新。
标签
标签是对特定提交的永久引用。例如,当我们创建一个名为 mytag 的新标签时(使用命令Git tag mytag),Git 在路径中生成一个新文件。git/refs/tags* 命名为 mytag。和分支的情况一样,这个文件包含创建标签的提交的散列。*
然而,当我们继续我们的工作并在同一个(或其他)分支上提交时,标记文件没有更新,并且继续指向从创建它的特定提交。与分支文件不同,标签在执行新提交时不会移动。

执行了新的提交,但文件 mytag 没有更新(作者图片)
头
HEAD 在 Git 中执行一些任务:
- 这是 git 如何知道哪个提交被检出的,所以当我们执行 git 分支时,Git 查看 HEAD 以知道我们在哪个分支上。
- 它引用下一个提交的父提交,所以 HEAD 指向的提交将是下一个提交的父提交。回想一下,当我们执行提交时,父提交存储在提交文件中。
如果我们在主分支上,HEAD 引用这个分支。如果我们打开头文件,我们会看到“ref: refs/heads/master”。相反,如果我们切换到分支 mybranch 并打开中的头文件。git* 文件夹我们看到:“ref: refs/heads/mybranch”。因此,HEAD 并不直接指向一个提交,而是指向一个分支,该分支又指向那个分支上最近的提交。通过这种方式,Git 跟踪哪个提交当前被签出。*

我们在树枝上。HEAD 指向文件 mybranch,它又指向一个特定的提交。与分支主文件相关的文件主文件指向另一个提交文件(作者图片)
当我们在一个分支上执行提交时,Git 读取头文件的内容,而写入作为父提交引用的提交。从这个意义上说,HEAD(间接)提供了下一个提交的父提交。

提交文件的内容。HEAD(间接)提供父提交(图片由作者提供)
现在,在 Git 中,我们可以检查到以前的提交,并从那里开始进行更改。这种模式称为“分离模式”。在这种情况下, HEAD 直接指向提交,而不是指向分支。请注意,这可能很危险,因为我们有丢失新提交的风险。事实上,在执行了提交之后,如果我们检查到一个分支,我们就不能再回到这个新的提交,因为它没有被任何分支引用!这就是为什么当我们处于分离模式时,在提交任何变更之前创建一个新的分支总是一个好的实践的原因!
合并
Merge 允许连接两个或多个提交。有两种类型的合并:
- 第一种发生在两个分支分叉的时候。Git 创建了一个有两个父母的孩子。第一个父级是我们所在的分支,而第二个父级是将要合并的分支。提交文件将有两个父节点,HEAD 被移动到新的子节点。
- 第二种情况发生在两个分支没有分叉,但实际上一个分支是另一个分支的延续。在这种情况下,合并被称为快进合并,它不是真正的合并,因为没有冲突。在这种情况下,Git 只是将 HEAD 和当前分支移动到从要合并的分支指向的同一个提交。
就是这样。恭喜你走了这么远!希望你喜欢这篇文章!到目前为止,您应该已经很好地理解了 Git 是如何工作的。有问题请随时评论!
回头见,保持黄金!😃
GitHub Copilot 如何简化我作为数据科学家的生活
一个你至少应该尝试一次的人工智能代码编写助手

如果你一直关注最近的科技新闻,你可能听说过 GitHub Copilot ,这是一款基于人工智能的编程助手。如果你已经在使用它,那很好,如果还没有,请继续阅读!
我现在已经使用 GitHub Copilot 几个月了,我绝对喜欢它。在这篇文章中,我将尝试做出令人信服的声明,以便您给副驾驶一个机会。你可能也会坠入爱河!
先决条件

GitHub 副驾驶(来源)
不幸的是,注册过程是等待上市,因为推出仍然是在技术预览模式。当您尝试注册时,将会收到以下消息:

GitHub Copilot 等候名单
在 Copilot 刚刚推出的早期,我就加入了候补名单。我记得很快就获得了访问权限,我可以试试 Copilot。所以请加入等候名单吧。
在注册 Copilot 的过程中,我是 JupyterLab 的狂热用户,我了解到它只能通过 Visual Studio 代码、Neovim 和 ide 的 JetBrains 套件访问。我很犹豫要不要换成新的 ide 来试用新的 AI 助手,它持续了几个星期,最后,我让步了,安装了 VS 代码和 Copilot 扩展。
测试副驾驶
我可以很容易地将 anaconda 环境(我正在 JupyterLab 上使用它)集成到新的 VS 代码中。
是时候测试一些简单的东西了。我首先想到的是进口陈述,所以我用副驾驶试了一下。安装扩展后,它会提示您登录 GitHub 帐户。

导入语句(作者 Gif)
一旦你完成了所有的手续,你就可以开始试用了。你所要做的就是开始打字,副驾驶会尝试“智能地”填写下一部分代码。在上面的 gif 中,可以看到它是如何预测和显示后续的 import 语句的。如果您在某一点进行了修正,它将相应地重新调整下面的代码预测。你点击tab按钮接受 Copilot 提出的自动填充建议。

KNN 测试(作者 Gif)
在接下来的测试中,我只写了一个函数def knn():,副驾驶会自动填充下一部分代码。我需要给出一些背景,助理做了所有的重活。我印象深刻的是,它是如何让我建立一个 KNN 模型并准确地自动填充代码的。
我们可能不会使用 Copilot 来编写完整的代码,但了解助手的局限性以及它可以帮助我们的所有方式是有好处的。
在我典型的工作流程中,我会编写代码,就好像我不需要助手一样,每当我感到陷入困境或迷失在想法中时,我会看到自动填充建议并相应地修改我的代码。有几次,自动填充提示让我很恼火,尤其是当提示不是我想要的时候。我只是接受了它是一种必要的邪恶。这让我的生活更轻松,但有时也让我感到烦恼。
我大多用副驾驶来做很长的清单和打字很累的事情。我目前正在处理大量的时间序列数据,我必须不断地制作列表,例如
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
打字很累;有时候,无法逃避,不得不去做。使用 Copilot,我输入months =,它会自动填充整个内容。事实上,我复制粘贴了上面的副驾驶建议,而不是键入它。您可以对代码做一些小的调整,它会很快跟上。
就像你把第一个月编辑成完整的长度—
months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
它会以类似的方式自动修正其他月份。我发现这非常有帮助,随着时间的推移,你会明白如何给副驾驶适当的上下文,使你的工作流程更加顺畅。
在其他情况下,我使用 Copilot 来识别方法的参数,例如
plt.savefig('plots/iris.png',dpi=300,bbox_inches='tight',
pad_inches=0,facecolor='w',edgecolor='w')
我不会试图记住plt.savefig()的所有论点,Copilot 在提示方面做得很好,这使得完成代码变得更加容易,不需要太多的谷歌搜索。
结论
在我看来,副驾驶永远不会取代从事编码工作的人。它依赖于人类的背景,并开始在此基础上发展。如果你给副驾驶一张白纸,并要求自动填充,它可能会写下你不想要的东西。使用 Copilot 作为辅助工具来编写和自动填充数据输入类型的工作(就像我之前提到的列表和参数)是一个好主意。
当我在没有 Copilot 的情况下使用 JupyterLab 时,我错过了许多可以让我的生活更轻松的事情。VS 代码有一个类似于 JupyterLab 的界面,带有一个浏览器来查看你所有的项目,还有一个集成的终端。所以它给我带来了 JupyterLab + Copilot 的所有便利。在 JupyterLab 中看到 Copilot 的实现可能也会很有趣。哦,好吧,我们可能要等一等。
就这样,我祝你编码愉快。
感谢阅读,干杯!
**Want to Connect?**Reach me at [LinkedIn](https://www.linkedin.com/in/rohithteja/), [Twitter](https://twitter.com/rohithtejam), [GitHub](https://github.com/rohithteja) or just [Buy Me A Coffee](https://www.buymeacoffee.com/rohithteja)!
回归基础如何让我成为更好的数据科学家
原文:https://towardsdatascience.com/how-going-back-to-basics-made-me-a-better-data-scientist-10b686b3301a
意见
不要让自我阻碍了你

迭戈·PH 在 Unsplash 上的照片
像最近大多数数据科学家一样,我在工作中学习了(并且仍在学习)这些技术。早在 2014 年,我获得了科学学位,这让我学会了数据分析、统计和可视化的基础。在那之后,我迷上了数据科学,并获得了我的第一份工作,成为一名数据科学家。可能对其他人来说也是一个熟悉的故事?
在没有直接相关资格的情况下获得“数据科学家”的头衔对我来说很奇怪。我知道一些概念,使用过关系数据库,涉猎过少量代码,但仅此而已。那时我也不像现在这样专注于学习,所以我所学的大部分主题都是由我当时从事的项目决定的。
我意识到我被落下了...
几年过去了,数据科学作为一种职业道路越来越受欢迎。随着越来越多的在线资源变得可用,数据专业人士被专门的数据科学项目淘汰,我意识到自己被落在了后面。我的编码技能不够发达,我的统计学知识生疏了,坦白地说,我解决问题的分析方法非常原始。
现在,你可能会想,我对几年前的自己太苛刻了。好吧,考虑到不努力发展你的技术技能会让你一事无成,我决定改变一切。我需要变得更好。我需要更加熟练。我需要付出真正的努力,才能跟上数据科学市场的步伐。
这不是一个笔直向前的旅程。坦白地说,作为一个成年人,学习如何再学习,糟透了。很快,我遇到了这样的问题:哪门网络课程适合我?我应该读硕士学位吗?我应该放弃靠抱猫为生吗?*

在我的学习之旅中,大约一年后,我找到了一个我喜欢的在线学习平台,我开始学习并把我的新技能应用到日常工作中,并从中获益。我对自己感觉好多了。一会儿。
我会遇到在线测验或论坛,在那里我仍然不知道他们在谈论什么,提到 python 编程概念或统计实践,这些似乎是基本的,但我不知道它们是什么或如何使用它们。我会在工作中接受新项目的任务,但我甚至不知道从哪里开始。这怎么可能?所有这些致力于学习的时间,我仍然吸?!
我所面临的挑战是由一种叫做自我的伟大的人类情感引起的。
幸运的是,大约在意识到这一点的同时,我正在使用的在线学习平台更新了我注册的课程,一些我以前从未见过的新模块出现了。它们的标题有“介绍……”和“学习……的基础”等等。起初我想,‘真无聊!我不需要复习熊猫的基本知识,也不需要介绍统计学,这些我都已经学会了!。然而,我现在必须完成这些新课程,以完成整个项目。
这正是我所需要的。
我遇到的真正问题不是我缺乏技术知识或学习能力。任何人都有能力学习。我所面临的挑战是由一种叫做自我的伟大的人类情感引起的。我的问题是认为我不需要复习基础知识,因为我认为我已经知道了。我假设,由于我作为数据科学家工作了几年,掌握了新发现的技能,并以机器学习技术的形式学习了一些“新奇的东西”,因此我一定已经理解了所有的基础知识。
不对。
这是迄今为止数据科学家可能犯的最严重的错误之一。
假设你仅仅因为你的职称或你任职的年数就对一个主题有了坚实的理解,这可能 1)使学习其他主题的经历变得更加困难,因为你没有拼图的所有先验知识,2)仅仅因为你不理解细微差别和核心数据概念,就导致你在应用和解释模型时犯严重的错误。

由 Vardan Papikyan 在 Unsplash 上拍摄的照片
学习那些针对完全初学者的课程是我职业生涯中做过的最好的事情。我有如此多的“啊哈”时刻,能够对我以前试图学习但无法完全掌握的其他复杂主题有更全面的理解。
结果,我变得更加自信了。我在工作中变得更加大胆。我会要求利益相关者真正深入研究数据,并与他们一起提出问题和进行分析。我们的目标是获得他们认为不可能从数据中获得的见解。我不会害怕学习新的分析技术,因为我有更强的基础,所以学习过程更快。
随着我对统计学的理解越来越全面,我能够向利益相关者解释为什么结果是重要的或不重要的,使用真实世界的轶事来辅助我的解释,导致对我工作的更多参与和信任。再加上一门关于数据讲故事和如何撰写有效演示文稿的课程(我认为在此之前我从未花时间学习过),我可以以一种有效的方式分享我的结果和建议,让我的观众参与进来。简单的东西,大不同。
我的外卖;保持谦逊确保自己了解基本知识。
如果你不知道,那就去读一读这个理论,或者上一两门课,直到你有足够的信心告诉所有人神经网络背后的工作原理或者你刚刚学到的任何东西。如果你能与不是数据人员的人就数据科学主题的基础进行对话,但他们能跟上你的描述和解释,那么你就是赢家(前提是你不是为了看起来超级酷而编造的)。
哦,如果你想知道抱猫问题后面的星号是什么?
*这一选择仍有待讨论:)
Google PaLM 的翻译有多好?
原文:https://towardsdatascience.com/how-good-is-google-palm-at-translation-f4a40c2ce562
不太好,但我们正在努力

图片来自 Pixabay
自 GPT-3 发布以来,机器翻译中已经引入并评估了其他几种大型语言模型。
但是与标准的机器翻译编码器-解码器方法相比,大型语言模型在翻译方面有多好?
很遗憾,我们不能轻易回答这个问题。
用于翻译的大型语言模型的评估通常过于草率或不完整而无法得出可信的结论。
为了得到一个明确的答案,谷歌的一个研究团队提出了第一个广泛的评估,将一个大型语言模型与最先进的机器翻译系统进行比较。
这项工作已于 arXiv(11 月 28 日)公开发布,由大卫·维拉、马库斯·弗莱塔格、科林·切里、罗家明、维莱什·拉特纳卡和乔治·福斯特提出。
在这篇博客文章中,我回顾了他们的工作,分享了我的评论,并总结了他们的发现。我还指出了为什么我认为这项工作中进行的评估是杰出的,并呼吁对语言模型进行更好的评估的主要原因。
语境
GPT-3、FLAN 以及最近出现的 PaLM 等语言模型都展示了令人印象深刻的翻译能力。
GPT-3 和 PALM 甚至声称其翻译质量与一些标准的机器翻译系统不相上下。
然而,这些声明仅仅基于机器翻译的标准自动评估指标 BLEU 的改进。众所周知,蓝色与人类判断的相关性很差。
需要使用更好的自动指标和/或手动评估进行评估,以确认语言模型和标准机器翻译系统实现了相似的翻译质量。
对大型语言模型的良好评估还应该全面报告提示是如何设计和选择的。
什么是提示?
让我们定义一个提示是作为语言模型的输入给出的文本。它可以包含我们希望模型完成的任务的描述和/或任务的例子,例如翻译。
在 PaLM 和 GPT-3 论文中,没有公开用于机器翻译实验的提示,以及用于少量提示的翻译示例的选择策略,尽管众所周知,这些模型的性能会根据提示而显著变化。
什么叫少拍才貌双全?
大型语言模型通常不是为特定任务而训练的。由于预先训练,我们可以通过简单地包括一些任务的例子来教他们一个任务。例如,在这部作品中,PaLM 提示了 5 个翻译示例。
在他们的工作中,Vilar 等人首先评估了制作和选择提示的不同策略。
他们选择最有前途的,然后使用 BLEURT 作为自动评估指标,使用 MQM 框架(Lommel et al .,2014) 进行人工评估,来评估语言模型 PaLM 和标准机器翻译系统的翻译质量。
什么是 BLEURT?
BLEURT的知识库给出了如下定义:“ BLEURT 是一个自然语言生成的评价度量。它将一对句子作为输入,一个参考和一个候选,并返回一个分数,该分数指示候选人的流利程度并传达参考的意思。
这是一种最先进的神经度量,与机器翻译评估的 BLEU 相比,它与人类判断的相关性更好。
机器翻译的提示
他们使用以下提示设计:
*[source]: X₁
[target]: Y₁
...
[source]: Xₙ
[target]: Yₙ
[source]: X
[target]:*
其中【源】和【目标】是英语中的语言名称,Xₙ是要翻译的【源】语言中的句子的一些示例,Yₙ是它们在【目标】语言中的相应翻译,x 是我们想要翻译的当前句子。有了最后一行“【target】:”,我们期待语言模型生成 x 的翻译。
Vilar 等人假设提示的设计对于少镜头提示是“不重要的”。他们没有引用任何以前的工作来支持这个假设。它可能来自于他们在初步实验中的观察,尽管我相信它强烈依赖于所使用的语言模型。
假设提示设计不重要,也有助于使文章更简洁,以专注于更关键的方面,如少数镜头提示的翻译示例的选择。
这些例子的来源是翻译数据集,在本文的剩余部分,我将把它们称为池。
他们探索了不同的策略来从给定的库中选择样本:
- 随机选择
- **k-最近邻(kNN)搜索
k NN 搜索从池中检索 k 个句子的例子,以及它们相应的翻译,也就是最接近我们想要翻译的句子的。**
为了衡量句子的接近程度,他们使用了两种不同的模型来嵌入句子:
- 单词袋(蝴蝶结)
- 罗伯塔
他们通过使用 ScaNN 保持了 k NN 搜索的高效性。
在他们的评估中,他们发现 RoBERTa 的 NN 比 BOW 检索到更多有用的例子。
注意:为了使本文简洁,我不会进一步详述他们这方面的工作。
提示池

翻译示例选自 3 种不同类型的资源库:
- 混合了多个领域和风格的百万翻译的大数据集,表示为 WMT 全集。
- 一个由几千个翻译组成的小数据集,其领域和风格与我们要翻译的数据相同,标为 WMT 开发。
- 包含不到 200 个段落翻译的微小数据集,手动选择,但在域和风格上可能与要翻译的数据不匹配,称为高端。
基于使用这三个库的实证实验,作者发现选择高质量的翻译是最重要的。尽管风格和领域不匹配,从高端池中选择例子的结果接近于从 WMT 开发池中选择例子的结果。
出色的评价

图片来自 Pixabay
他们主要使用由 WMT21 发布的评估数据集对德语-英语和汉语-英语语言对进行评估。
它们还显示了英语-法语的结果,但是使用了可能已经包含在被评估的机器翻译系统的训练数据中的旧得多的评估数据集。作者公开评论了这个问题,并提供了该数据集的结果,只是为了遵循在 PaLM 论文中提出的原始评估设置。他们没有从英法的结果中得出任何明确的结论。
让我们看看他们如何展示他们的主要成果:

David Vilar、Markus Freitag、Colin Cherry、Jiaming Luo、Viresh Ratnakar 和的表格(谷歌)
那可是一大堆数字啊!
但是我认为它们都是需要的,并且是相关的,以便从实验中得出结论。
正如我们之前讨论的,他们分别用 MQM 和来报告人工和自动评估。BLEU 在这里只是为了与 PaLM 论文中给出的结果进行一些比较。他们评论说,BLEU 是误导性的,如果他们的评估仅仅基于 BLEU,他们的结论就会改变。
有趣的是,作者没有自己建立任何机器翻译系统,而是选择了提交给 WMT21 的公开翻译。这种选择使得他们的结果具有再现性。
他们也评价谷歌翻译。通常,我会认为对这种黑盒系统的评估是不可信的,因为我们不知道它是否是根据评估数据进行训练的(即,可信的数据泄漏)。作者考虑了这个可能的问题,并通过直接咨询谷歌翻译团队确认没有任何数据泄露。这似乎是评估中显而易见的一步,但这实际上很少被评估商业系统的研究人员所证实。
我还注意到,他们没有从以前的工作中复制任何数字,即所有的分数都是由作者计算的,这与 PaLM 论文中报告的评估相反,确保所有的分数都是可比的。
这是我在一篇机器翻译研究论文中看到的最科学可信的评价之一(相信我,我研究了 900+的机器翻译评价)。总而言之,我们有:
- 使用最先进的框架(MQM)和详细的翻译错误计数进行人工评估
- 使用最先进的度量标准(BLEURT)进行自动评估
- PERM-BOTH 的统计显著性检验
- 确认不存在数据泄漏
- 为了更好的再现性,评估了一些翻译的可用性
- 确认分数都是可比较的,即使用相同的指标、符号化等进行计算。
- 使用 SacreBLEU 进行 BLEU 评分,以及相关签名,以确保评分的可重复性,从而能够在未来的工作中进行比较。
他们得出了什么结论?
SOTA 系统比最好的 PaLM 结果有 1 到 3 个 BLEURT 点的显著优势,这一差距反映在他们低得多的 MQM 分数上。
换句话说,标准的机器翻译系统明显优于 PaLM。
即使我们只看报告的 BLEU 分数,PaLM 和 WMT21 系统之间的差异似乎是突出的。
这一发现与 PaLM 论文(第 6.5 节)中进行的评估相矛盾,该评估发现 PaLM 优于以前的最佳系统。不同之处在于,PaLM 中的评估仅基于已为旧机器翻译系统计算的 BLEU 分数和/或使用的不可比较的标记化…
限制
这项工作的主要限制,也是作者承认的,是 PaLM 实际上不是在独立的句子上训练,而是在文档上训练。
可以有把握地认为,如果 PaLM 翻译较长的文本以获得更多的上下文,PaLM 和标准机器翻译系统之间的翻译质量差距将不会那么明显。
另一方面,标准的机器翻译系统是在独立考虑的句子上训练的。
因此,在句子级别运行和评估系统会使评估偏向机器翻译系统。注:PaLM paper 中进行的原始评估也是在句子级别进行的。**
评估还遗漏了对使用自动度量计算的结果的统计显著性测试。它们在 BLEU 中显得很重要,但很难一眼就判断 BLEURT 中的差异是否真的很重要。注:鉴于布鲁分数和 MQM 分数之间的差距,我想说它们是显著的,但还需要进一步证实。**
*https://pub.towardsai.net/yes-we-need-statistical-significance-testing-927a8d21f9f0
据我所知,作者没有发布 PaLM 生成的用于评估的提示和翻译。我希望他们会。这将允许研究社区研究它们,并促进在未来的工作中使用不同的指标进行比较,类似于 Meta AI 为 No Language Left Behind 所做的工作。
这是特别需要的,因为 MQM 评价是昂贵的和难以复制的。他们似乎还使用了一种定制的 BLEURT 模型,这种模型还没有(还没有?)公开提供,防止了 BLEURT 乐谱的复制。*
结论
标准的机器翻译系统仍然优于大型语言模型。
事实证明,PaLM 比 FLAN 和 GPT-3 等其他同类机型在翻译方面更胜一筹。我们可以预期 Vilar 等人得出的结论可以扩展到这些其他模型。
尽管如此,重要的是要记住,机器翻译系统和语言模型不是在相同的数据上训练的,并且具有非常不同的计算成本。
PaLM 是一个 5400 亿参数的模型,但是可以翻译,不需要经过翻译方面的直接训练。另一方面,机器翻译系统具有低得多的计算成本,但是需要训练大量的翻译。
如果你喜欢这篇文章,支持我工作的最好方式就是使用我的链接成为一个媒体成员:
*https://medium.com/@bnjmn_marie/membership
如果你已经是会员,想要支持这项工作, 就在 Medium 上关注我吧。*
电动汽车能有多热?
原文:https://towardsdatascience.com/how-hot-can-ev-motors-get-6894b2e1ff2
使用帕德博恩大学 LEA 部门收集的试验台测量数据的数据驱动方法

卢克·切瑟在 Unsplash 上的照片
电动汽车是未来,而电动汽车是未来的重要组成部分。
世界各地的工程师旨在提高效率,降低电动汽车的成本。与此同时,电机设计者的主要目标是在提高功率输出的同时减小电机尺寸和成本。
不幸的是,在这些参数之间有一个权衡。
能够对转子温度进行强有力的估计有助于汽车工业用更少的材料制造电机,并使控制策略能够最大限度地利用电机。
精确的扭矩估算有助于更准确、更充分地控制电机,减少功率损耗并最终减少热量积聚。
推动更大的电流会增加的功率,但是电机内部的温度也会同时升高,导致组件失效,效率降低。
这就是为什么要实时监控电动机中的温度升高,而这不容易实现,尤其是在电动机的旋转侧。为了克服这一困难,制造商倾向于采用超大电机或利用具有巨大安全裕度的电机来确保安全运行,即使在过载情况下。

迈克尔·福塞特在 Unsplash 上拍摄的照片
如果我们能够在各种负载条件下估计关键部件的温度,我们就能够更好地优化电动机的参数,以最大限度地利用电动机,这最终意味着提高性能和降低最终用户的成本。
我将使用帕德博恩大学 LEA 部门 从永磁同步电机(PMSM)收集的 180 个小时的数据。
请点击链接获取原始数据和相应的CC BY-SA 4.0(attribute-share like 4.0 International)以及相关出版物。
希望我能够回答下面的问题,
- 有哪些不同类型的驾驶概况?
- 电动机的哪个部分温度最高?
- 哪些因素与温度上升有密切关系?
- 用一个简单的线性回归模型,我们能多好地预测关键部件的温度?
第一部分:有哪些不同类型的驾驶模式(电机发动机速度特性)?
数据集中有 81 种不同的驱动配置文件,每种都有独特的发动机转速特征。尽管如此,我们还是可以根据测试期间发动机转速基于变化的相似性对曲线进行分组,如下所示:
- 18 个配置文件在整个会话期间保持恒定的发动机转速

恒定发动机转速曲线示例—图片由作者提供
- 14 个配置文件在发动机转速上有步进

发动机转速步进的配置文件示例—图片由作者提供
- 剩余的 49 个配置文件随机增加和降低发动机转速,以更好地代表真实世界的驾驶循环

引擎速度随机上升和下降的配置文件-图片由作者提供
第二部分:电动机的哪个部分温度最高?
发动机温度在测试期间在定子轭、定子齿、定子绕组和永磁体位置进行测量,这些位置标记为定子轭、定子齿、定子绕组和 pm 。

恒定发动机转速曲线中的温度累积—图片由作者提供

恒定发动机转速曲线中的温度密度图—图片由作者提供

阶梯式发动机转速曲线中的温度累积—图片由作者提供

阶梯式发动机转速曲线中的温度密度图—图片由作者提供

随机加速时温度升高,发动机转速降低——图片由作者提供

发动机转速随机上升和下降时的温度密度图——图片由作者提供
以下是从上述图表中得出的观察结果:
- 定子绕组达到最高温度约 140℃
- 温度与发动机转速呈高正相关。
- 当发动机励磁停止时,永磁体冷却最慢,发动机绕组冷却最快。
- 具有随机速度变化的曲线显示温度的正态分布,而其它曲线分别具有许多局部峰值。
第三部分:哪些因素与电机中的温度升高密切相关?
发动机转速和扭矩(记为电机转速和扭矩)是驾驶条件的结果。电机控制器通过调节提供给电机的电压水平(表示为 u_q,u_d,i_q,i_d )来驱动电机,以将车辆保持在期望的速度水平。
借助相关矩阵,我们可以看到定子温度与发动机转速正相关。我们还可以清楚地看到发动机转速与电压和电流高度相关,这实际上是有意义的,因为它是由电压和电流控制的。

恒速剖面的相关矩阵—图片由作者提供
随着发动机转速的随机上升和下降,这种相关性在曲线中恶化。可以看出,与恒速条件相比,在这种驱动模式下,发动机冷却剂和环境温度与温度具有更高的相关性。

随机速度曲线的相关矩阵——图片由作者提供
第四部分:我们能多好地预测关键部件的温度?
您可以在下图中看到定子绕组的预测温度,以及在顶部绘制的特定曲线的相应实际测量值。


预测误差的密度图—作者提供的图片
观察结果是:
- 一般来说,我们的模型可以预测定子温度,平均绝对误差为 1.2°c。
- 50%的预测准确无误,误差为 0.7–0.2℃
- 具有随机速度变化的曲线具有比恒定和步进速度曲线更大的预测误差。
- 当电机速度发生剧烈变化时,预测会变得更糟。
- 在极端情况下,预测误差为 30–35°C。
关键要点和结论
- 在恒定、逐步和随机速度变化的数据中观察到 3 种不同的行驶曲线。
- 定子绕组达到最高温度约 140℃
- 总的来说,我们的模型可以预测定子温度,平均绝对误差为 1.2°C,50%的预测准确无误,误差为 0.7–0.2°C。
我希望这篇文章对你有用,完整的代码可以在 Github 中找到。
巨大的蛋白质语言模型如何破坏结构生物学
Meta 的 ESM-2 和 ESMFold 模型用于蛋白质结构预测
结构预测的准确性与 AlphaFold 相似,但速度快 60 倍,并且在此过程中开发了新的人工智能方法。

作者的 Meta 宏基因组图谱的一个区域的截屏,放大以解析单个蛋白质模型。正如在https://esmatlas.com/about#license所解释的那样,esmatlas.com 大学用于创建本文中显示的数字的这些资源和所有其他资源都可以在 CC BY 4.0 许可下用于学术和商业用途。
T 现代生物学的两个标志是:( I)预测蛋白质结构的 ML 模型的出现,导致了该领域的一场真正的革命,( ii)这场革命是由私营部门的研究实验室而不是学术界带来的(幸运的是,这些私营部门开放了所有代码和模型,因此学术界可以在它们的基础上进一步发展)。
我所说的这场革命的明星和种子是 DeepMind 及其用于蛋白质结构预测的 AlphaFold 2 模型。在此基础上,新的 ML 模型发展起来,主要是在学术实验室,可以进行蛋白质设计,预测相互作用表面,等等:
(更多信息,查看我所有关于 CASP、AlphaFold 2 和相关技术的文章的摘要)
然后在相邻的化学领域,我介绍了 DeepMind 和谷歌如何加速量子计算。甚至抖音似乎也有计划用最大似然法来帮助量子计算,因为它最近正在雇佣这些领域的人员。
梅塔,原名脸书,几年来一直致力于生物学的一些新东西,现在有了成果:开发一种“知道”蛋白质结构的蛋白质语言模型。正如我将在这里描述的,Meta 创造并发展了一系列方法,这些方法现在形成了一套完整的蛋白质结构预测、设计和突变评估,所有这些都完全基于语言模型。
正如我在最近这篇文章的中解释的那样,将语言模型应用于蛋白质结构预测可以帮助克服 AlphaFold 等依赖于多序列比对的工具的限制,还可以大大加快蛋白质结构预测的速度。
概述什么是蛋白质结构建模,它如何演变,以及蛋白质语言模型的潜在影响
简而言之,“蛋白质结构建模”是关于从氨基酸序列预测蛋白质如何在 3D 空间折叠,以及各种相关问题,如设计折叠成所需 3D 结构的氨基酸序列。这两个问题都是生物学的核心:基础和应用生物学的结构预测,因为科学家需要知道蛋白质的结构,以便了解它们的功能和设计新的药物;以及应用生物技术的蛋白质设计,例如创造新的酶或稳定现有的酶。
通过实验确定蛋白质的三维结构非常昂贵和耗时,甚至可能在多年的工作后仍然不成功。因此,计算方法的相关性,以预测三维结构,理想地尽可能准确和快速。事实上,蛋白质结构预测的问题对生物学来说是如此重要,如此难以破解,以至于自 1994 年以来,预测者之间的竞争每两年进行一次。这个竞赛被称为 CASP ,传统上是研究这个问题的学者的竞技场。经过多年的无进展和缓慢的改进,DeepMind 用他们的 AlphaFold 2 程序破解了 CASP14 (2020)部分的蛋白质结构预测问题(AlphaFold 1 之前赢得了 CASP13,但它几乎没有将学术界已经知道的一切都推到极限,没有真正解决问题)。
现在我们来看看 AlphaFold 的局限性,以及语言模型是如何帮助我们的。为了从蛋白质的序列中建模蛋白质,AlphaFold 2 首先建立与查询相关的多个蛋白质序列的比对。这种比对由基于 BERT 的语言模型处理,该模型专门用于蛋白质,然后将从比对中处理的数字输入网络的核心,该网络预测结构作为其输出。
Meta 开发的新方法(正如我之前举例说明的那样,一些学者最近也在探索这些方法)使用了比 BERT 更先进的语言模型。这些模型了解了如此多的蛋白质序列和将序列与功能联系起来的进化模式,以至于它们根本不需要序列比对就可以折叠它们。最新的这类方法来自 Meta,名为 ESM-2 和 ESMFold,它们似乎可以像 AlphaFold 2 一样预测蛋白质结构,但预测速度更快,而且不需要计算比对,我将在下一节解释和演示。
但在继续解释之前,让我通过提醒读者 AlphaFold 2 的结果关键取决于建立多序列比对的大量序列的可用性,来强调 Meta 新方法的相关性。因此,AlphaFold 2 对所谓的“孤儿”蛋白质的效用有限,即那些因为数据库中没有多少序列而无法检索到比对的蛋白质。通过不使用比对,基于语言模型的方法原则上可能比 AlphaFold 和类似的方法更好地模拟孤儿蛋白,从而假设现代蛋白质结构预测的潜在改进——剧透:新方法有一点帮助,但不是显著的。
此外,由于不需要编译比对,使用语言模型的方法比 AlphaFold 等常规方法运行得快得多,因此允许在单位时间内处理更大量的序列——正如我稍后描述的那样,Meta 确实利用这种方法在短短两周内处理了超过 6 亿个序列。
Meta 的蛋白质语言模型如何预测蛋白质结构
这太迷人了。为了开发以 ESM-2 和 ESMFold 为顶点的蛋白质语言模型,Meta 尝试训练神经网络不直接从序列预测蛋白质结构(如 AlphaFold 和其他方法),而是预测蛋白质序列中隐藏的氨基酸。这与 GPT-3 等语言模型的训练方式非常相似:算法屏蔽令牌,训练程序旨在预测它们。不知何故,ESM-2/ESMFold“只是另一个”巨大的语言模型,但对蛋白质来说超级专业。
像任何其他神经网络一样,这些蛋白质语言网络包含大量的权重(从数百万到数十亿),这些权重在训练过程中得到微调,在这种情况下,预测屏蔽的残基。Meta 发现,当网络训练有素,能够预测数百万天然蛋白质序列中的屏蔽氨基酸时,其内部权重实际上是在捕捉或“理解”蛋白质结构。明白我为什么说这很有趣了吧?
让我用不同的词再解释一下。ESM-2 的训练只针对序列,包括输入和输出。关于被建模的结构的信息在网络中发展,因为其权重描述了将输入(屏蔽)序列连接到输出(完整)序列的结构模式。当网络处理输入序列时,从网络内部激活的模式中“在侧面”预测蛋白质结构。
不知何故,为了预测序列,网络必须在训练序列中学习进化模式,这确实是有意义的。众所周知,这些模式与蛋白质结构中成对的残基之间的接触直接相关——这一概念在 CASP 和结构生物信息学中已经记录了近十年,在 DeepMind 与 AlphaFold 1 进入游戏之前,它就已经对 CASP12 中的蛋白质结构预测产生了影响。
再深入一点细节,Meta 已经从以前的工作中知道,被训练来模拟屏蔽蛋白质序列的变压器模型开发了与蛋白质的残基间接触图相对应的注意模式。Meta 教 ESM-2 如何从其内部知识中推导出一个结构(从而创建了 ESMFold)的方法是将注意力模式投射到从输入序列的实验结构中获得的已知残基-残基接触图中。因此,当 ESMFold 处理输入序列时,它会立即激活一系列注意模式,然后将其转换为接触模式,然后将这些模式馈送到结构网络,最终计算符合预测结构的实际坐标集。
Meta 是如何到达 ESM-2 和 ESMFold 的
Meta 的蛋白质和语言模型工作始于他们在 PNAS 发表的 2019 年论文中提出的内容:在蛋白质序列上训练的语言模型在内部学习与结构和功能相关的蛋白质属性的证据。然后在 2020 年,Meta 发布了 ESM1b,这是一种蛋白质语言模型,已经帮助科学家直接从蛋白质序列中对蛋白质结构和功能进行了一些具体的预测和发现。Meta 随后将其放大,创建了 ESM-2,其 15B 参数是迄今为止最大的蛋白质语言模型,并为 Meta 用于蛋白质结构预测和蛋白质设计的现代工具奠定了基础。在开发 ESM-2 和 ESMFold 的过程中,Meta 观察到,随着模型从 800 万个参数扩大到 150 亿个参数,序列预测变得更好,从网络的注意力模式中提取的有关蛋白质结构的信息变得更丰富、更准确,从而有效地允许通过将权重与已知结构匹配来模拟蛋白质结构。
此外,Meta 发现,ESM-2 的蛋白质结构预测比 AlphaFold 2 快 60 倍,在不需要任何比对的情况下,达到了非常相似的准确性(对一些目标来说只是低了几个点),对于孤儿蛋白质来说,结果略好于 alpha fold 2-尽管没有语言模型的预期那么引人注目。
运行 ESMFold 进行结构预测的多种方法
原则上,Meta 的 ESM-2 可用于折叠蛋白质,设计蛋白质,以及预测突变对蛋白质的影响等其他任务。迄今为止,Meta 发布的主要应用程序是 ESMFold,这是一个从蛋白质序列中折叠蛋白质的工具,以及一个预计算模型图集(下一节将介绍)。
给定一个序列,ESMFold 输出模型和置信度,就像 AlphaFold 2 一样,即 1D pLDDT 图估计每个残基建模的准确性,2D PAE 图估计每个残基相对于所有其他残基的建模程度。
Meta 使得 ESMFold 可以通过多种方式访问。最简单的,直接从他们的网站,允许您提交一个序列建模使用“折叠序列”功能在这个页面:
https://esmatlas.com/resources?action=search_structure
网络服务运行速度非常快;例如,我在不到 4 秒的时间内预测出了这个结构:

请注意,模型结构被着色以显示每个残基的精度,即通过 pLDDT。蓝色意味着高度准确,随着你跟随彩虹的颜色,准确性下降,直到红色被认为可能是错误的。
为了进行更丰富的结构预测,我建议你使用由 so 氪和同事们整理的 Google Colab 笔记本,它提供了完整的输出,包括 1D (pLDDT)和 2D (PAE)急需的模型置信度指标(虽然运行起来需要一点时间):

上图:在 ColabFold 的笔记本中运行 ESMFold 的结果,该笔记本可以在麻省理工学院的许可下访问,包括商业用途。下图:叠加到实际结构中的模型,该图由作者从上面运行 ESMFold 生成的模型中生成。
与 pLDDT 着色的 ESMfold 模型相比,该图底部的图以绿色显示了该蛋白质在 PDB 中可用的实际结构(蓝色是高 pLDDT,即高确定性,红色是低 pLDDT,即不确定性)。你可以看到,仅有的两个不匹配的部分确实被 ESMfold 预测为低置信度(一个粉红色有点不匹配,一个红色非常差)。
通过 API 直接调用 ESMFold
当您使用我在上面第一次介绍的 Meta 的服务时,您实际上正在访问一个非常简单的网页,该网页将您的查询序列发送到一个 API,Meta 将该 API 组合在一起以运行程序。
这在提交预测时调用的 URL 的格式中很明显:
https://esmatlas.com/resources/fold/result?fasta_header=Example&sequence=MSGMKKLYEYTVTTLDEFLEKLKEFILNTSKDKIYKLTITNPKLIKDIGKAIAKAAEIADVDPKEIEEMIKAVEENELTKLVITIEQTDDKYVIKVELENEDGLVHSFEIYFKNKEEMEKFLELLEKLISKLSGSGGGSGGGSGGGGSSGGGGGSGGGGSGGGGMSGMKKLYEYTVTTLDEFLEKLKEFILNTSKDKIYKLTITNPKLIKDIGKAIAKAAEIADVDPKEIEEMIKAVEENELTKLVITIEQTDDKYVIKVELENEDGLVHSFEIYFKNKEEMEKFLELLEKLISKL
这意味着原则上你可以在你正在开发的任何程序或 web 应用中进行这样一个简单的 API 调用,然后在你自己的程序中处理获得的模型!
超过 6 亿种蛋白质的模型数据库
鉴于 ESMFold 运行的速度,Meta 可以做一些生物学上前所未有的事情:他们在短短两周多的时间内模拟了 6.17 亿个蛋白质,这些蛋白质的序列是从宏基因组项目中获得的!那是连 AlphaFold 2 都达不到的,alpha fold 2 擅长建模但比 Meta 的新系统慢很多。
宏基因组计划需要对大量生物体的 DNA 进行测序。但是,如果没有蛋白质结构,或者至少是可靠的模型,那么所有这些大量的信息都无法被充分利用,因此,除了 DeepMind 和欧洲生物信息学研究所发布的 2 亿个结构的数据库之外,Meta 的新模型数据库——称为 ESM 宏基因组图谱——也具有相关性。
Meta 的模型图集可以像本文的主图一样图形化浏览,这很有美感,但实际上并没有任何实用价值。当与搜索引擎结合时,图谱的真正力量是:你可以通过 MGnifyID (MGnify 是来自宏基因组数据集的蛋白质序列数据库)、氨基酸序列(试图找到已经为该序列或类似序列计算的模型)或蛋白质结构(寻找数据库中存储的结构相似的模型)来搜索图谱。
结束语
当我认为最好的蛋白质结构预测已经发生时(AlphaFold 2),Meta 推出了这个迷人的方法、工具和数据库。随着 CASP15 的科学摘要刚刚出炉,没有来自 DeepMind 的消息,但有来自 Meta 的消息,我想知道我们可能会有什么惊喜。一方面,初步评估似乎显示相对于 CASP14 没有大的改进,但另一方面,AlphaFold 2 模型已经非常好,几乎没有改进的空间,正如我所讨论的,CASP15 正在朝着新的目标前进。对孤儿蛋白的预测至少会受到 Meta 的 ESMFold 的一点影响,但这种蛋白通常不会在 CASP 中大量存在。我们很快就会知道,就在 CASP15 结果发布的 3 周后,语言模型(不仅是 Meta 的,还有学术界正在开发的其他模型)是否能进一步推动这场革命。
参考
ESM-2 主网络、ESMFold 和 ESM 地图集的预印本:
https://www.biorxiv.org/content/10.1101/2022.07.20.500902v2
提供 ESM-2 工具和图集的主要网站:
https://esmatlas.com/resources?action=fold https://esmatlas.com/explore?at=1%2C1%2C21.999999344348925
早期的相关工作是关于语言模型如何帮助预测蛋白质突变的影响,以及如何设计蛋白质:
https://www.biorxiv.org/content/10.1101/2021.07.09.450648v2 https://www.biorxiv.org/content/10.1101/2022.04.10.487779v2
www.lucianoabriata.com我写作并拍摄我广泛兴趣范围内的一切事物:自然、科学、技术、编程等等。 成为媒介会员 访问其所有故事(我免费获得小额收入的平台的附属链接)和 订阅获取我的新故事 通过电子邮件 。到 咨询关于小职位 查看我的 服务页面这里 。你可以 这里联系我 。
作为一名记者,我是如何从研究生院毕业并获得数据科学硕士学位的
史蒂夫·乔布斯曾经说过编码是一门自由艺术;在没有计算机科学或数学背景的情况下,我对乔布斯的解释进行了终极测试。

瓦西里·科洛达在 Unsplash 上的照片
2019 年,随着对数据科学家的需求和薪水都呈指数级增长,我决定,刚毕业两年的我,报名参加一个硕士学位项目,目标是在 15 个月内成为一名成熟的数据科学家。
这是我经历过的最严峻的学术挑战之一。
分享我的故事的目的不是为了沾沾自喜,也不是建议我的道路应该被效仿。事实上,我建议任何考虑进入数据行业的人至少要掌握计算机科学、数据库架构的基础知识,并参加一两门统计学课程。
相反,我的目标是揭开进入研究生院和整个数据科学领域的障碍。在这个领域,近 50%的数据科学家拥有博士学位,职位通常将硕士学位列为最低要求,甚至想申请学校都可能令人生畏,更不用说追求数据驱动的职业了。
通过利用先前的领域知识、参与结构化自学时间和完成独立项目来构建强大的投资组合,积极向数据科学过渡的个人可以取得成功。
下面,我将分享如何最终通过蛮力,我做到了毕业那天,以及你,跨学科数据科学的希望,如何也能做到。
我放下书,阅读文件
虽然我认可书的深度和可及性,但说到编程,我并不是那样学的。别误会,我还是读了很多书。我阅读文档,更重要的是,阅读附带的代码片段。虽然堆栈溢出提供了具体情况具体分析的修复方法,但是没有什么可以替代通过阅读文档就可以完成的全面学习。与其在谷歌上搜索如何在 Pandas 中创建数据透视表,你可以通过做这些工作和阅读文档来节省更多的时间。甚至在毕业后,在开始我目前的角色之前,我花了两周时间阅读 BigQuery 文档,并一个功能一个功能地学习。

像书一样,你读的文档越多,你就越能认识到什么是编程语言、库或应用程序的高质量和直观的指南。作为一名数据工程师,我可以告诉你,特别是在 API 文档方面,有一个清晰的光谱。我原有的阅读理解技能帮助我记住信息和实现概念。
如果你是英语、历史或新闻专业的学生,你会惊讶于批判性思维技能如何转化为解释和编写代码。学校里的指定阅读为你将来成为数据分析师、数据科学家或数据工程师做准备。此外,在评论代码、与同事合作或向未来的关系和雇主展示自己时,来自一个你已经学会或利用了沟通技巧的背景可能会被证明是一个优势。
我在我的专业领域研究数据集
如果你现在是数据科学或数据分析的学生,你可能会证明 Kaggle 数据集或教科书数据源是多么平凡。只有这么多方法你可以预测泰坦尼克号的存活率或者对花卉种类进行分类。到了选择学期项目的时候,我尽最大努力寻找与我先前的知识相符的数据集。我发现,从我热爱的行业中挑选数据给了我可信度和灵感。拥有领域知识也使我能够更好地将我的发现联系起来并进行展示,从而带来更好的展示和更充实的学习体验。在学校,我是新闻专业出身,我优先考虑我的数据工作的原因,这种技能你也可以通过阅读我以前的故事来学习。
我最喜欢的数据科学项目之一是利用各种分类方法在 Python 中构建假新闻检测模型。回过头来看,这种方法相当简单,也不太新颖,但我能够彻底阐明这种模型试图解决的问题。该项目也是我第一次扩展到 Python 和 r 等语言的原生数据集之外。毕业后,我继续通过抓取 web 数据和访问 API 来寻找和创建新的数据集。
我学到的最重要的一课是,完成一个充满激情的项目比完成一项任务要容易得多。
因此,每当你有机会挑选自己的项目时,尽可能使它们有趣并适用于你的专业技能。
我参加了(甚至更多)课程
尽管我每学期选修两到三门课程,但我很快就发现了所呈现的材料和我自己的理解之间的差距。在我的第二个学期,我发现了一些平台,它们提供免费或大幅折扣的课程,主题非常具体,比如高级 Tableau 函数。如果您进入数据世界时还没有彻底了解计算机科学或数据结构,我建议您查看以下资源:
- edX
- 自由代码营
- W3 学校
- 乌德米
- 数据营
数据科学是一个巨大的领域,即使是大学课程也有需要解决的差距。正如我提到的,我非常支持自学。在一个不断变化的行业中,在有限的时间内自学一个概念的能力将是无价的。在以数据为导向的职位或任何其他技术职位上,你不仅需要学习公司使用技术工具的方式,还需要参与持续学习计划或努力获得认证,比如谷歌云提供的认证。你还不如在学校的时候就开始学习如何自学。
我请求帮助
除了会见我的教授,我还得到了两位了不起的 Python 导师的帮助。如果你像我一样,入学时几乎没有技术背景,个性化的帮助可以强化概念,帮助建立信心。我参加了一个为期 10 周的数据挖掘课程,后来被一位院长描述为“博士级别”,我每周见两次导师,翻译伪代码,简单地维持下去。这是一个紧张而有压力的夏天,也是我获得的最满意的 B。然而,能够与教授之外的人讨论和完成作业有助于减轻压力,可以使主题和概念不那么令人生畏。辅导的另一个好处是,对于编程来说,辅导反映了敏捷的结对编程模型。很可能,作为一名新毕业生,你将向高级数据分析师、首席数据科学家或高级数据工程师报告。在主管面前变得足够自在来编码,更重要的是,犯错误,这本身就是一种技能。和导师一起工作可以帮助你接受这样的想法:当你以一种建设性的和高效的方式编码时,有人在你身后看着你。
我练习过
几个学期后,我认识到,仅仅通过做学校作业,我永远也不会精通编程和数据工作。学习编码就像学习一种乐器。如果你只是去练习,你是不会精通的。
确定数据职业是否适合你的一个很好的试金石是你在学校或工作之外投入了多少工作;真正的好奇心和学习的意愿可以提供动力来完成困难的概念。
就我个人而言,即使是一份朝九晚五的数据工程师工作,这个领域仍有一些方面令我着迷。例如,我对如何使用数据工程来改善或自动化我的生活感兴趣,就像我如何创建个人财务跟踪管道一样。
练习不仅仅是磨练技能。它能建立自信。根据我的经验,你更有可能通过消除对犯错误或产生错误输出的恐惧来解决问题。根据你的轨迹和选择的语言,我强烈推荐 HackerRank ,一个提供大量实践机会的网站;额外收获:雇主利用该网站进行技术面试。
不要走我的路——但要考虑我的建议
虽然我能够从一个重文科背景转到数据工程,但我的道路是非典型的,坦率地说,在开始时,非常困难。然而,我相信团队和组织受益于来自各种背景的技术工人。即使你可能是一名数据科学家,你也可能从事或专攻某个行业。来自跨学科背景可以帮助你确定哪些行业符合你以前的经验、领域知识和热情。如果你正在考虑探索数据科学或与数据科学相关的道路,请知道有大量的资源可供你自己学习——甚至在你申请那个硕士项目之前。
如果你愿意支持 Pipeline 和我的媒体写作,请随时使用我的推荐链接让成为媒体会员(我从每个加入的个人那里获得一小笔佣金)。
我如何使用数据科学分析我自己的驾驶行为
车辆远程信息处理数据可以揭示很多关于你驾驶技术的信息

我自己开车收集车辆远程信息数据的照片(图片由作者提供)
你是一个好司机吗?对这样一个问题的回答一直不是很客观。分析这一点的一种方法是听取与你一起旅行的乘客的意见,或者简单地计算你支付的超速罚单!但是,这些都是非常原始的判断驾驶行为的方式。在这篇博客中,我将展示我如何使用数据来客观地分析我的驾驶行为。
驾驶行为分析也被企业用于用例,如设计数据驱动的保险单或车队管理。
在这篇博客中,我将介绍有助于测量驾驶行为的数据科学技术,例如
- 超速行驶
- 硬加速
- 希望
- 机器学习来看看糟糕的驾驶是否会影响车辆状况
数据收集
分析一个人如何开车的第一件事就是收集数据。大多数车辆都有传感器,可以测量各种东西,如速度、温度、加速度等等。这是使用车辆远程信息处理设备完成的。有许多供应商提供这种设备。

车辆远程信息处理设备(图片由安装在车上的设备的作者提供)
该设备获取传感器记录的数据,然后将其传输到供应商数据库。这些数据可以用来理解驾驶行为。您还可以要求您的供应商提供对数据的访问,以便您可以更详细地分析它。

车辆远程信息处理数据收集(图片由作者提供)
在这篇博客中,我将使用我在印度卡纳塔克邦旅行期间收集的数据作为例子。收集的数据截止到 2022 年 8 月 21 日。我们将试图找出我的驾驶技术是否好。收集的数据包含如下所示的信息。

从车辆远程信息处理设备收集的样本数据(图片由作者提供)
该数据具有识别远程信息处理设备的设备 ID。它包含数据记录的时间戳,以及各种需要测量的内容,例如,车辆的位置,测量为纬度、经度和海拔。车速以 KMPH 或英里/小时为单位
现在让我们来分析驾驶行为。
超速行驶
为了理解驾驶行为,超速是可以测量的第一件事。这里显示的是我在 2022 年 8 月 21 日走的路线。用于进行该分析的数据基于时间戳、纬度和经度的远程信息处理数据。
行程是从 Udipi 到 Holekattu。所走的路线是沿着印度西海岸的 66 号公路。

车辆行程可视化(作者使用谷歌地图和 Javascript 制作的图片)
你也可以观察一个标记,它是最高时速 92 KMPH 的记录位置。66 号国道上汽车的限速是 100 KMPH。所以车辆一直在限速范围内,我们可以给超速行为开绿灯。

超速驾驶行为是可以的(图片由作者提供)
急加速
急加速是指车辆的加速器或制动系统受到比正常情况下更大的力。有些人可能会把这称为“铅脚”综合症,它可能是侵略性或不安全驾驶行为的一个指标。
现在让我们来测量一下我旅途中的硬加速。这里显示的是在达到最大速度 92 之前的一些其他标记,它显示的速度是 73,然后到 85,然后达到最大速度 92。

最高速度前的标记(作者使用谷歌地图和 Javascript 制作的图片)
我们可以将这些车速放在一个时间透视图中,并绘制如下图所示的线图。X 轴是时间,Y 轴是车速。这条曲线对应于加速度。我在 14:43:21 开始加速,当时速度是 71,然后在 14:43:49 达到最大速度 92。于是我在 28 秒内把速度提高了 21 公里/小时。

时间与速度(图片由作者提供)
为了看看这个加速度是不是剧烈的加速度,我们需要把它转换成重力,也叫做 g 力,它由于加速度而作用在汽车上。28 秒内 21 公里/小时的速度增加相当于 0.208 米/秒 2 加速度的重力。下图显示了重力与加速度水平之间的映射。

加速度或制动映射到重力(重力)(图片由作者提供)
0.28 的重力被认为是安全的,不是硬加速。所以,我们可以给硬加速一个绿色勾号。

急加速的驾驶行为没问题(图片由作者提供)
期待
驾驶中的预判意味着阅读你的周围环境,并通过睁大你的眼睛和耳朵来保持警觉。这意味着提前做好计划,并准备采取必要的行动。为了预测和计划他人的行动,你应该不断地检查你周围正在发生的事情。
现在让我们检查一下我的预测技能。为了看我的预判技能,可以分析一下我加速后做了什么。看下面显示的曲线,我们可以观察到速度突然降低。

可视化减速(图片由作者提供)
从时速 92 公里,我在 24 秒内减速到 1 KMPH。这相当于-0.3 的重力,相当于紧急制动。原因可能是什么?
让我来揭示这个秘密,因为我确切地知道在我开车时发生了什么。如果我们观察最大速度点之后的路线,我们会看到一座被称为 Heroor 桥的河桥。这座桥降低了速度限制,这就是我不得不减速的原因。

可视化减速(作者使用谷歌地图和 Javascript 制作的图片)
从 92 KMPH 的高速降低到 1 KMPH 的极低速度是我没有预料到的明显迹象。所以让我们为期待而欢呼吧!

预期驾驶行为不正常(图片由作者提供)
驾驶行为影响车辆健康
现在让我们看看驾驶行为是否会影响车辆?。远程信息处理设备收集与车辆发出的任何警报相关的数据。零表示没有问题,而 1 表示车辆有问题。
还有 50 多个传感器值,如车速、加速度、氧气、油门、气温等等。
我们可以使用机器学习决策树来找到传感器值和警报之间的任何关系。这将有助于我们了解哪些因素会影响车辆健康。

使用决策树查找传感器值和警报之间的关系(图片由作者提供)
下图是一个决策树,将不同的传感器作为决策节点,将报警作为输出节点。您可以看到,导致车辆报警的主要因素是电池、加速度和速度。
因此,不良驾驶行为不仅会影响驾驶员的安全,还会影响车辆的健康。

影响车辆健康的主要因素(图片由作者提供)
结论
这里有一些有趣的结论
- 使用远程信息处理设备收集数据是数据驱动驾驶行为分析的关键
- 分析超速要求您将车速数据与限速数据相结合
- 硬加速和预期可以使用时间序列函数来计算。但是,需要从路径分析的角度来看待它们
- 不良驾驶行为对驾驶员和车辆都不安全
如果你喜欢我通过数据和使用数据科学技术分析我自己的驾驶行为的迷你项目,请用我的推荐链接加入 Medium 。
https://pranay-dave9.medium.com/membership
请订阅每当我发布一个新的故事时,请随时关注。
https://pranay-dave9.medium.com/subscribe
额外资源
网站(全球资讯网的主机站)
你可以访问我的网站进行零编码分析。https://experiencedatascience.com
在网站上,您还可以参加即将举行的虚拟研讨会,体验有趣和创新的数据科学和人工智能。
Youtube 频道
这是我的 YouTube 频道
https://www.youtube.com/c/DataScienceDemonstrated的链接
我如何将持续集成应用到机器学习项目中
CI 在软件项目中非常有用,也可以为 ML 项目带来好处。
介绍
持续集成(CI)已经被证明是软件开发中的一个极好的实践。然而,当涉及到机器学习(ML)项目时,由于工作的不同性质,CI 并没有被应用(甚至没有被提及)太多。
从我的经验来看,CI 在软件项目中非常有用,我确信它也能给 ML 项目带来好处。因此,我尝试使用开源工具为一个 ML 项目构建一个简单的 CI 工作流。在这篇文章中,我将分享它的样子以及我是如何做到的。
什么是持续集成?
持续集成和交付(CI/CD)是一种软件开发实践,在这种实践中,在相同代码基础上工作的软件开发人员将代码集成到主分支,并定期交付他们的产品,以便对系统所做的更改更易于管理。CI/CD 已经成为软件产品开发的核心,因为如果处理得当,它可以确保软件质量并以可持续的方式提高生产率。此外,CI/CD 与敏捷方法学也相处得很好,这使得它在软件行业中更受欢迎。
CI/CD 的工作流程从开发人员在他的本地环境中修改代码开始,直到它满足验收标准。然后,他必须通过运行测试来确保他所做的更改不会破坏现有的功能。一旦通过,开发者将把新代码提交给 CI/CD 服务器,CI/CD 服务器将在中立环境下再次运行测试,以确保可再现性。如果一切正常,新代码将被合并到主分支,这样新版本就可供参与同一项目的其他人使用,并在需要时交付。

简单的持续集成工作流(图片由作者提供)。
机器学习项目中的 CI/CD 挑战
机器学习的采用在过去几年中增长迅速。通常,这是通过将 ML 模型嵌入到作为系统一部分的应用程序或数据管道中来实现的。这一趋势给 CI/CD 带来了新的挑战,因为与传统软件不同,ML 应用程序不仅会受到代码变化的影响,还会受到模型训练所依据的数据的影响。
另一个关键挑战是质量控制。在软件项目中,单元/集成/回归测试确保集成和交付变更是否安全。如果所有的测试都通过了,它就通过了,否则就没有通过。由于几个原因,这不适合 ML 模型。首先,输入和输出之间的映射可以是动态的,因为某些类型的 ML 模型具有不确定的行为。第二,ML 模型的输入可以是极其复杂的格式,例如高维向量或图像。像开发人员编写测试时通常所做的那样生成输入将是非常低效和令人疲惫的(如果可能的话)。
为 ML 项目构建 CI 工作流
先决条件
上一节提到了两个必须解决的关键挑战。对于数据版本控制,有一些开源工具可以用来解决这个现成的问题。我选择的这个叫做数据版本控制 (DVC),主要是因为它的功能可以通过命令行界面获得,不需要任何代码。另外,DVC 被设计成可以直观地与 Git 一起工作,并且还提供了其他一些不错的特性,比如 ML pipeline。
质量控制更加棘手,因为它不再是一个通过或失败的问题。两个 ML 模型可以对相同的数据进行预测,问题是哪一个更好(以及好多少)。准确性、损失和 R 分数等性能指标似乎是更合适的标准。
开发团队责任
使用评估度量代替测试既解决了问题,同时也产生了问题。一方面,它使标准更加合适。另一方面,正确的度量标准是特定于问题的,只有开发团队能够选择它们。所以不能标准化。
新的职责必须添加到开发团队中,以避免这个问题。由于评估指标将被用作质量关口,ML 管道不仅要生成模型,还要生成性能报告。此外,报告应该遵循一个预定义的约定,这样它就可以跨分支进行比较。例如,它必须是 JSON 格式,位于名为model的文件夹下,文件名为performance.json,如下所示。
{
"accuracy": 0.9219429016113281,
"precision": 0.9634803263573233,
"recall": 0.9050901747682986,
"iou": 0.8753447772456544
}
通过这种方式,团队可以自由地为他们的应用选择正确的度量标准,并通过在他们的 ML 管道中添加一些额外的工作来增加过程的透明度。
工作流程
综合所有因素,设计的工作流程如下:
- 开发人员从 main 分支。
- 开发人员在本地机器(或远程服务器)上进行更改和运行实验,直到得到想要的结果。
- 开发人员创建一个针对主要分支机构的 PR。
- CI 服务器重新运行实验分支以确保再现性。
- CI 服务器将性能指标与主分支进行比较,并报告给 GitHub 上的 PR 页面,以便其他成员可以查看。
- 如果获得批准,代码将被合并到 main 中。
- CI 服务器再次重新运行该实验,但这一次模型被推送到远程存储以供将来部署,并提供性能报告以供比较。

ML 项目的持续集成工作流(图片由作者提供)。
履行
工作流是用 GitHub 动作实现的。它包含如下两个关键阶段:
实验再现
再现性工作包括检验数据集和运行整个 ML 管道(预处理、训练和评估)。这些是使用两个 DVC 命令完成的:dvc pull和dvc repro。
dvc repro运行 ML 管道并输出训练好的模型和性能报告(在一个简单的项目中,这可能等同于运行train.py脚本)这是 GitHub 操作中的样子:
报告生成
报告应该显示主分支和实验分支之间的性能比较,以便评审者可以看到变更如何影响模型。DVC 通过dvc metrics diff提供了这一功能,在这里您可以将当前变更的指标与任何公共分支进行比较。输出是这样一种人类可读的格式:
使用 GitHub Actions Marketplace 上的 Create or Update Comment 操作,该输出被保存到一个文件中并在 PR 页面上可见。
如果你感兴趣,完整的 GitHub 动作配置可以在这里找到。下图显示了创建请购单时的工作流程:

创建 PR 时,工作流程开始(图片由作者提供)。

CI 服务器重现实验并比较性能(图片由作者提供)。

工作流执行完成时会生成报告(图片由作者提供)。
结论
ML 项目就像软件行业中的一种新型动物。将 CI/CD 应用到他们身上代表了与传统软件项目不同的挑战,因此需要不同的方法。本文提出的方法提供了一种将 CI/CD 应用于数据科学的方法。然而,它远非完美,有很大的改进空间。尽管如此,它仍然说明了 CI/CD 对 ML 作品是多么有用。
我如何用 Python 自动完成一项乏味的任务
原文:https://towardsdatascience.com/how-i-automated-a-tedious-task-with-python-3c48f492575
仅使用内置模块

(图片由作者提供)
Python 让你的生活更轻松。对于各种各样的任务,从构建高度复杂的机器学习管道到组织计算机中的文件,都有一个实用的 Python 解决方案。
所以我愿意称 Python 为“每个人的语言”。
回到 Python 这次是如何帮助我的,我有一个包含不同对象图像的文件夹列表。

(图片由作者提供)
有超过 100 个文件夹,每个文件夹都有不同数量的图像。我需要做的是将每个对象的图像分成训练(75%)和验证(25%)文件夹。
新的结构如下:

(图片由作者提供)

(图片由作者提供)
作为第一步,我创建了培训和验证文件夹。然后,我将所有的子文件夹(如手风琴、飞机等)复制到这两个文件夹中。
完成任务的步骤
任务是从训练文件夹中移除 25%的图像,从验证文件夹中移除 75%的图像。重要的是不要删除相同的文件夹,这样训练和验证文件夹中的图像就不同了。
不太友好和繁琐的方法是手动删除这些文件夹中的图像。这是绝对不可能的。我肯定有几种不同的实际方法来完成这项任务,但我们将使用 Python。
我们可以将任务分为以下三个步骤:
- 获取图像的文件路径
- 确定要删除的内容
- 删除它们
让我们从第一步开始。
文件路径
我们将使用 Python 的 os 模块来处理与路径相关的任务。listdir 函数返回给定路径下文件夹中所有文件的列表。我们提供 train 文件夹的路径,并获得其中所有子文件夹的列表。
import os
train_base_path = "Data/train/"
train_object_list = os.listdir(train_base_path)print(train_object_list[:5]) # check the first 5
**# output**
['gerenuk', 'hawksbill', 'headphone', 'ant', 'butterfly']
为了访问这些子文件夹中的图像,我们需要创建每个子文件夹的路径,这可以使用 join 方法来完成。让我们为训练对象列表中的第一个文件夹执行此操作。
folder_path = os.path.join(train_base_path, train_object_list[0])print(folder_path)
**# output**
Data/train/gerenuk
下一步是访问该文件夹中的图像,这可以使用 listdir 函数来完成。
image_list = os.listdir(folder_path)
确定要删除的图像
上一步中创建的图像列表包含指定文件夹中所有图像的名称。
image_list[:5]**# output**
['image_0019.jpg',
'image_0025.jpg',
'image_0024.jpg',
'image_0018.jpg',
'image_0020.jpg']
下一步是确定将从训练和验证文件夹中删除哪些图像。根据文件名的不同,有不同的方法来处理这个步骤。
在我们的例子中,所有的图像文件都用一个从 0001 开始的 4 位数来命名,但是它们没有被排序。我们可以通过以下步骤完成这项任务:
- 用 Python 的 len 函数求图片数。
# find the number of images
number_of_images = len(image_list)
- 通过将图像总数乘以 0.75 并将其转换为整数,计算要在训练文件夹中使用的图像数。我们可以使用 int 函数,但它会截断浮点数(即 24.8 到 24)。如果要对浮点数进行四舍五入(即 24.8 到 25),可以使用数学库中的 ceil 函数。
# number of images in train
number_of_images_train = int(number_of_images * 0.75)# to round up
import math
number_of_images_train = math.ceil(number_of_images * 0.75)
- 使用内置排序功能对图像列表中的图像名称进行排序。
image_list.sort()
- 使用序列中的图像数量确定要从序列文件夹中删除的图像,以对图像列表进行切片。
remove_from_train = image_list[number_of_images_train:]
如果序列中的图像数量为 20,则“从序列中移除”列表包含图像列表中前 20 个项目之后的项目。因此,前 20 个项目将在 train 文件夹中。我们也可以使用这个值从验证文件夹中删除图像。
从训练和验证文件夹中删除图像
我们已确定要从训练和验证文件夹中删除的图像。为了移除它们,我们需要首先构建到图像的路径。然后,可以使用操作系统模块的删除功能删除该映像。
对于 remove from train 列表中的每个图像名称,可以按如下方式创建图像的文件路径:
for image in remove_from_train:
file_path_to_remove = os.path.join( train_base_path,
train_object_list[0],
image )
以下是图像文件路径示例:
'Data/train/metronome/image_0024.jpg'
最后一步是删除该路径下的图像:
os.remove(file_path_to_remove)
把它放在一起
所有这些步骤都将针对训练和验证文件夹中的每个子文件夹进行。因此,我们需要将它们放入一个循环中。
train_base_path = "Data/train/"
validation_base_path = "Data/validation/"train_object_list = os.listdir(train_base_path)for subfolder in train_object_list:
if subfolder != ".DS_Store": print(subfolder)
subfolder_path = os.path.join(train_base_path, subfolder) image_list = os.listdir(subfolder_path)
image_list.sort() number_of_images = len(image_list)
number_of_images_train = int(number_of_images * 0.75) remove_from_train = image_list[number_of_images_train:]
remove_from_validation = image_list[:number_of_images_train]
# remove from train
for image in remove_from_train:
file_path_to_remove = os.path.join(
train_base_path,
subfolder,
image
)
os.remove(file_path_to_remove)
# remove from validation
for image in remove_from_validation:
file_path_to_remove = os.path.join(
validation_base_path,
subfolder,
image
)
os.remove(file_path_to_remove)
我把 if 条件换成一个看不见的文件夹名”。DS_Store”。即使我检查了隐藏文件,我也找不到它。如果你知道如何解决这种情况,请告诉我。
让我们检查前 5 个对象的训练和验证文件夹中的图像数量:
for subfolder in train_object_list[:5]:
subfolder_path_train = os.path.join(train_base_path, subfolder)
subfolder_path_validation = os.path.join(validation_base_path,
subfolder)
train_count = len(os.listdir(subfolder_path_train))
validation_count = len(os.listdir(subfolder_path_validation))
print(subfolder, train_count, validation_count)**# output**
gerenuk 25 9
hawksbill 75 25
headphone 31 11
ant 31 11
butterfly 68 23
看起来我们的脚本已经准确地完成了工作。
Python 在自动化日常任务方面非常有效,比如组织文件和文件夹、发送电子邮件等等。如果您经常做这样的任务,我强烈建议让 Python 为您做这些工作。
你可以成为 媒介会员 解锁我的全部写作权限,外加其余媒介。如果你已经是了,别忘了订阅https://sonery.medium.com/subscribe如果你想在我发表新文章时收到电子邮件。
感谢您的阅读。如果您有任何反馈,请告诉我。
我如何成为一名数据科学家
原文:https://towardsdatascience.com/how-i-became-a-data-scientist-7f5b10606612

我的经济学博士之旅
作为一名拥有经济学博士学位的数据科学家,我总是会收到很多关于我为什么选择成为数据科学家的问题,以及我的旅程是怎样的。我认为这是一个很好的机会来分享我的经验,特别是我做对和做错的事情,以帮助任何对数据科学感兴趣但来自不同背景的人。
为什么是经济学博士
早在 2015 年,我很兴奋地获得了经济学博士学位,并开始了在美国的研究生学习。我在大学期间曾是美国的交换生,这里的教育质量给我留下了深刻的印象,因此我决定在这里继续我的研究生学习。对于专业的选择,我没有想太多。我本科主修经济学,我对经济学家解释世界规则的方式非常着迷。当时继续学习经济学是一个自然的选择。当我申请这些项目时,我表达了我对教学的热情,我决心进入学术界,因为我的梦想是成为一名教授。我知道这将是一个艰难的旅程,但我已经准备好迎接挑战。
为什么不是学术界
当我作为本科生直接进入博士项目时,我对什么是研究有着模糊的、可能是错误的印象。我受到了许多不同领域的研究人员的启发,他们决心扩展某些领域的知识前沿,但很快就发现了在不断研究没有正确答案的事物时处理模糊性的困难。我真的很难想出研究想法,并用值得信赖的方法来实现它们。渐渐地,我意识到我想从事快节奏的项目,在我进入“修改和改进”的兔子洞之前,我可以在早期阶段收到反馈并看到我的影响。因此,我把目光放到了学术界之外,开始在这个行业寻找潜在的机会。
为什么选择数据科学
该行业有许多经济博士的潜在职位,因为我们在学校解决的问题和培养的技能与公司在许多领域的需求相吻合。我的研究背景是实证研究,即使用数据驱动的方法解决问题。面对一个问题,如何获取相关数据,如何清洗数据,如何从数据中驱动洞察来回答问题,是我每天在完成论文时练习的内容。我在一个章节的数据分析过程中遇到了 Python,并参加了在线课程,以了解更多关于 Python 的知识,并了解数据科学。当我发现我的技能已经部分符合成为一名数据科学家的要求后,我对数据科学的兴趣开始出现并持续增长。
我是如何成为数据科学家的
参加 Python、机器学习基础和其他数据科学技术的在线课程是第一步。利用 Python 来完成我论文中的数据分析过程确实给了我征服这种语言的良好开端。然后我在我的一篇论文章节中得到了一个使用机器学习算法的想法,并与另外两位有相同兴趣的同事一起实现了它。在这种背景下,我申请并获得了为期八周的数据科学训练营的奖学金,这是我真正涉足各种项目并发展相关技能的时候。训练营还提供职业指导、求职帮助和校友小组,帮助我更多地了解数据科学家每天都在做什么,并增强了我申请数据科学家职位的决心。关于训练营的更多细节,你可以在这里阅读文章:
https://pub.towardsai.net/how-to-benefit-from-attending-a-data-science-bootcamp-289db43e2d7c
作为一个在提高数据科学技能的同时从动手项目中受益的人,我想回馈社会,我正在开发一门数据科学课程,其中包含时间序列预测中的动手项目,面向那些有兴趣学习时间序列分析并接触行业最佳实践的人。不幸的是,该课程目前只有中文版,但我会有一系列的博客帖子来提供与该课程相关的教程和有趣的实践。如果你有兴趣参加这个课程,请在这里或在 LinkedIn 上给我发短信。
申请数据科学家职位
对于那些跟踪我一段时间的人来说,你可能知道我的求职之旅并不容易。这是一个长达七个月的过程,一路上有很多拒绝。这是对自信的不断挑战,让我多次怀疑自己是否做出了正确的选择。当我回头看时,我很感激自己没有轻易放弃,继续为下一次面试做准备。终于有了回报。我还写了一篇文章来分享整个经历,你可以在这里查看:
在漫长的求职过程中,我真正受益的不仅是宝贵的面试经验,还有我写的总结每次面试准备的文章,许多人发现这些文章对准备自己的面试也很有用:

数据科学面试准备
View list5 stories


我作为两家公司的数据科学家的旅程
时光飞逝,现在我已经做了一年半多的数据科学家。中间换过公司,也许以后会分享更多关于如何边应聘边准备面试的细节。在这里,我想重点谈谈我作为一名数据科学家所做的工作。
基本上,我在这两家公司所做的事情都符合我的期望。作为一名博士,我可能会在研究和建模方面承担更多的责任,我在探索和应用新方法方面得到了同事和经理的信任。我也一直从事端到端的项目,这意味着我负责一个项目从收集数据到交付最终产品的整个过程。我的第一份工作是以项目为基础的,在这份工作中,我和我的同事参与不同的项目,解决不同的问题。我现在的职位有一个固定的目标,就是做时间序列预测。虽然目标是相同的,但为了提高预测的准确性,我们需要不断调整我们的模型和方法,以应对不断变化的宏观经济形势。这两个职位都具有挑战性,但也是有益的,在那里我可以看到我的工作是如何投入生产的,或者我的预测是如何被上游采纳的。反馈,不管是积极的还是消极的,都显示了我工作的影响,这是激励我不断改进的动力。
数据科学是一个具有挑战性的职位,需要不断学习,因为世界在快速变化,技术变化更快。它有如此多的潜在用例,并且它一直在塑造所有公司做出数据驱动决策的行业。我担任这一角色的时间越长,我就越意识到数据科学不仅仅是我所认为的花哨的数据分析、高级建模或复杂的编码,而是与不同团队的合作、揭示和交流见解以及数据故事有关。在下一篇文章中,我将讨论如何成为一名优秀的数据科学家,以及我根据自己的经验遵循的七条原则:
总而言之,我从经济学博士到数据科学的旅程包含了很多快乐、挑战、拒绝、满足等等。我很高兴能在一个既有激情又有技能的岗位上工作。希望这篇文章给那些处于职业生涯或任何人生十字路口的人一个参考点,如果它能以某种方式激励任何人,我会很激动。感谢您的阅读!如果感兴趣,请查看我的其他文章:
https://zzhu17.medium.com/my-blog-posts-gallery-ac6e01fe5cc3
订阅我的电子邮件列表:
https://zzhu17.medium.com/subscribe
注册成为中级会员:
https://zzhu17.medium.com/membership
或者在 YouTube 上关注我:
https://youtube.com/channel/UCMs6go1pvY5OOy1DXVtMo5A
我如何成为一名真正自学成才的数据科学家:我的故事
我从没有数据科学经验到现在已经在这个行业工作了 5 年的历程

Mikhail Nilov 在 Pexels 拍摄的照片
我是一名自学成才的数据科学家,在科技行业工作了 5 年。
我一直对编程感兴趣,但从未接受过任何正式培训。我对学习的热爱和对事物如何运作的好奇让我找到了利用业余时间自学新技能的方法。
这篇博文将讨论那些帮助我成为自学成才的数据科学家的途径!
我上大学不是为了数据科学
你看,我没有去学数据科学,我去学了经济学,我没有用那个学位做任何事情。所以,当我找工作的时候,我发现在我的领域没有任何机会。
现在,尽管就业市场总体不景气(至少在我居住的地方),但有很多大数据职位空缺,但像许多雇主一样,他们希望有学位或经验的人,因为当时没有人知道这些角色在公司会有多大作用。
因此,考虑到这一点,为什么会有雇主愿意冒险聘用一个没有经验的人呢?
即使有这种想法,我仍然对学习这个领域感兴趣,所以我在大学结束时开始自己做一些机器学习。我喜欢学习机器学习,我决定认真对待它,并更认真地进入数据科学。
所以我是这样做的…
我参加了 30 多门在线课程
我从在 coursera 和 edx 上找到的一些在线课程开始。Coursera 很棒,因为他们有很多来自微软、IBM、硅谷数据科学院(SVDSA)等公司的数据科学专门课程。
SVDSA 是我上的第一堂课,它真的让我有兴趣学习更多关于数据科学的知识,这是我很长一段时间以来的热情所在,所以很自然地,参加他们的课程是有意义的。它帮助我走上了今天的道路。
这些课程做的另一件事是让你进入论坛,在那里世界各地都有其他相关领域的人。
你可以问问题,获得反馈,从和你做同样事情的人那里学到新的东西。
这些课程确实帮助我学习了数据科学的基础知识以及如何应用它们。我能够看到其他人在做什么,他们是如何解决问题的。
我注册了黑客马拉松
在参加了 30 多门数据科学相关课程后,我决定开始尝试黑客马拉松。黑客马拉松是指你与其他人一起为一个项目(数据科学相关)工作大约 24 小时的活动。你不睡觉,目标是想出一些很酷的东西。
我发现这很棒,因为它帮助我学会了如何将我所有的新数据科学知识付诸实践,并结识了志同道合的人,他们也有兴趣了解更多关于数据科学的知识,或者已经了解了很多。
你看,黑客马拉松不仅仅是用来认识其他人的,实际上在构建公司可以使用的项目时,它们非常有用,这正是我们想要的,对吗?
因此,每当别人有某种想法,但没有时间/资源去做任何事情时,我就自愿去做,因为我总是在寻找可能帮助我获得经验的机会。
这就是我如何开始与公司合作的附带项目,这些项目真的很有帮助,因为你可以与已经在该领域的人密切合作,他们可以给你很好的反馈,教你新的东西,如果足够好的话,甚至可以指导/赞助你自己的项目。
我做了一些个人项目
我开始为自己做项目来帮助建立我的投资组合。通过这种方式,雇主会知道我有能力自己学习新东西,而且我有机器学习或数据科学相关主题的经验,即使我没有学位。
这也帮助我更多地了解现实世界的问题以及人们如何解决这些问题,这是你在网上课程中学不到的,因为这些类型的课程的全部目的是教你幕后发生的事情,所以当试图在实际场景中应用这些知识时有时会很困难,除非它就像课堂上给出的例子一样。
因此,每当有任何问题我无法在网上找到答案,而不是等待别人为我做,我试图找到一种方法来自己做。这在开始时肯定是困难的,但是随着时间的推移变得容易了。
现在,我并不是说在线课程或黑客马拉松不好,它们实际上很棒,真的可以帮助你开始,特别是如果你不知道从哪里开始,但我想说的是,做个人项目可能非常有益,因为你可以更多地了解如何解决问题,公司如何工作以及他们在寻找什么。
我的第一份数据科学工作
这样做了大概 1 年左右,我申请了一个大数据的岗位,得到了!
该公司实际上对我的自学能力印象深刻,并说他们以前从未见过这样的事情。
团队很棒,工作很有趣,我的经理在教我新东西或给我工作反馈时也很有帮助。
我现在在哪里
如今,我是一家国际咨询公司的数据科学家,最近甚至被评为我所在地区的最佳年轻专业人士之一。
我非常感谢我选择走这条路,因为它让我能够做大多数人永远无法体验的事情,但真正酷的是,任何人都可以开始做这样的事情,如果他们也愿意的话。
我曾无数次地想"没人会雇佣没有学位的人",但现在回想起来,一切似乎都一清二楚,你必须不断鞭策自己,不管它看起来有多么困难或令人沮丧。
成为数据科学家不需要学位
所以如果你和我有类似的情况,不要担心。没有任何正规教育或经验,完全有可能成为一名数据科学家。
最重要的是你有学习的动力,有解决问题的动力。如果你能找到一个能帮助指导和支持你学习的导师或社区,那就更好了!
但是也不要害怕开始自己学习,因为外面有大量的资源。
与 5k+人一起加入我的邮件列表,免费获得《2023 年如何学习数据科学 cheat sheet》
如何构建实时 BigQuery 管道以节省成本和规划容量
BigQuery 中的成本和资源管理

摩根·豪斯尔在 Unsplash 上的照片
C 当数据工程师使用基于云的大数据堆栈时,成本和资源控制是一个重要问题。如果没有这方面的知识,您可能很容易面临极高的云服务账单,或者收到组织对缓慢环境的投诉。除了包含节省成本的技巧和诀窍的备忘单之外,另一个最佳实践是实施监控和警报,以实现以下目标:
- 发现组织中任何人执行的昂贵/繁重的查询。数据仓库可以在整个组织中共享,包括那些不一定理解 SQL 但仍然试图寻找信息的人。一个警告是警告他们低质量的查询,数据工程师可以帮助他们良好的 SQL 实践。
- 在早期阶段发现昂贵/繁重的预定查询。如果一个预定的查询是非常昂贵的,这将是有风险的。有适当的警报可以防止月底的高额账单。
- 了解资源利用率,更好地进行容量规划。
每个云提供商都有不同的规则,在本文中,我们将重点关注 BigQuery。我将讨论如何评估查询作业以及如何在 GCP 建立实时警报系统。无论你是管理资源的工程师还是收到账单的经理,这都是适合你的文章!
三个维度—成本、时段、持续时间

BQ 查询的 3 个维度
我们从三个角度评估查询——成本、时段和持续时间。
成本
大多数组织,尤其是初创公司,都在节约成本上下了很大功夫。相信我,这本身就是一个有趣的话题。每次我通过优化查询来省钱时,我都会超级兴奋,就好像我从谷歌赚了钱一样。如果查询是一个预定的查询,好处甚至会被放大。值得注意的是,BigQuery 提供了 2 个定价模型不同的成本节约策略。Google 有一篇文章可以帮助你选择定价模式。
按需定价:你为每个查询处理的字节数付费(每 TB 5 美元)。您可以通过减少查询处理的字节数来直接降低成本。成本监控和警报对于按需定价模型非常重要,因为技术上没有成本上限。
按需定价适用于数据量可预测的工作负载(例如报告工作负载)。这里有一些示例警报规则,用于查找昂贵的计划作业和不可预测的昂贵的临时请求。如果临时请求的成本太高,您可能希望将临时请求转移到具有统一费率定价的项目中。
-
X 美元/查询
-
X 美元/用户/天
-
X 美元/工作/天
-
X 美元(特别/月)
- …..
统一价格:您需要为专用的查询处理能力付费,以槽位为单位(2000 美元/月/100 个槽位)。这里监控成本不太重要,因为每个月都是一样的。但是您可以通过使用更少的槽来提高查询的运行效率,从而降低成本。在这种情况下,监控您的插槽使用情况更有意义。
统一费率定价适用于具有 SLA 或临时请求的工作负载,这些工作负载需要成本可预测性和容量保证。通过 BigQuery Reservations ,可以在组织之间共享插槽。例如,具有高服务级别协议的项目 a 保留 1000 个时隙,具有临时请求的项目 b 保留 300 个时隙。如果目前没有太多的特别请求,projectA 可以从 projectB 借用插槽,反之亦然。但是当 projectA 运行时,BigQuery 会自动且无中断地抢占已经与其他项目共享的槽。并且您不关心临时请求扫描了多少数据。
资源—时间段和持续时间
无论您选择哪种定价模式,插槽数量都将是固定的。(2K 用于按需定价模式,X 用于统一费率定价,具体取决于您购买的插槽数量)。那么什么是插槽,为什么我们需要监控它呢?
BigQuery 槽是 BigQuery 用来执行 SQL 查询的虚拟 CPU。BigQuery 根据查询的大小和复杂程度,自动计算每个查询需要多少个槽。
如果同时运行太多复杂的查询,查询需求将超过您承诺的槽。BigQuery 不会对额外的槽收费,但是您的单个工作单元会排队。您可以在查询作业的执行细节中找到它们的性能。每个作业都分为几个阶段:等待、读取、计算和写入。等待阶段的高峰时间意味着 BigQuery 可能会耗尽存储槽。

容量规划需要监控插槽使用情况。如果你看到太多的查询在排队,你可能会想改变你的定价模式,或者购买更多的插槽,或者考虑如何让你的查询更有效。值得从 BigQuery 查看优化查询计算页面。
好,我们知道什么是插槽。但是我们应该如何设置警报规则呢?我们可以从简单的东西开始—基于插槽容量的硬编码值。假设我们固定了 1000 个插槽。如果一个查询使用超过 500 个槽,那么它肯定是一个危险信号,需要进一步调查。
然而,这可能会导致许多误报,因为我们需要另一个维度:时间。如果一个查询平均使用 600 个槽,但是只运行了 10 秒,我们要不要报警?而 vice visa,如果一个查询运行 30 分钟却平均只用了 50 个槽呢?
这完全取决于你的团队的 SRE 战略。我推荐谷歌 SRE 图书学习 SRE 原则和最佳实践。经验法则是警报应该是可操作的。
在这个图中,我可视化了 3 个查询及其时间/时隙使用情况。绿色查询使用了很多槽,但是运行速度很快。黄色查询需要很长时间,但只使用了几个时间段。红色查询介于两者之间。

具有不同资源使用的查询(由高创建)
比方说,我的警报策略是找出占用太多空间太长时间的查询,因为它们可能会妨碍关键工作负载。找到阈值的一个技巧是对历史作业及其时间和插槽信息有一个整体的了解(我将在下一节讲述如何做到这一点)。在下面的例子中,我的阈值是(持续时间> 30 分钟,时间段> 500)。一个保守的团队也可能会考虑黄区。

BQ 资源阈值(由高创建)
查看阈值的另一个方法是使用查询的区域,,即 totalSlotMs=durationslot。*这是查询在其整个执行时间内消耗的槽总数,以毫秒为单位。

基于 totalSlotMs 的 BQ 资源阈值(由高创建)
好吧!我们已经学习了如何从三个不同的维度衡量一个查询,以及如何定义阈值。接下来,我们将看到如何从 BigQuery 中检索信息。
监控 BigQuery 作业的实时管道

接收 BQ 警报的实时系统(由高创建)
BigQuery 为监控查询提供了不同的选项,例如通过 INFORMATION_SCHEMA 或 BigQuery 监控图表。本文关注的是 BigQuery 审计日志,它是实时管道的最佳数据源。流水线包含 3 个阶段。
LogsRouter —将 BigQuery 数据访问日志路由到 PubSub
云审计日志是一个日志集合,提供对与您使用包括 BigQuery 在内的 GCP 服务相关的运营问题的洞察。每个数据访问作业都流入审计日志。

BigQuery 数据访问日志示例(由高创建)
你可以通过接收器将日志路由到不同的目的地,比如云存储、发布/订阅和大查询。其中,发布/订阅是最好的选择,因为它天生适合实时用例。在接收器中,您可以包含一个与您想要包含的日志条目相匹配的过滤器。否则,发布/订阅主题将被不相关的消息过载。
接收器过滤器示例

接收器过滤器示例
PubSub—将日志路由到云函数进行处理
PubSub 本质上是一个队列。我们需要像 cloud function 这样的订阅者来消费日志并处理它们。创建主题后,可以点击“触发云函数”按钮,用任何编程语言创建云函数。这多容易啊!

创建云功能的按钮
云功能—处理日志并发送警报
每个过滤后的日志都会触发一个云函数,日志以 JSON 格式呈现,如上例所示。您可以在这里查看最新的审计日志模式。我们将利用JobStatistics部分进行警报。

作业统计示例
下面是一段解析 BigQuery 审计日志的示例代码。
解析 BigQuery 审计日志的示例代码(由高创建)
根据阈值,警报区域中的作业将被发送到您在团队中拥有的任何通信渠道。在我的团队中,我们使用 Sentry 作为集中的问题跟踪和监控平台。每个有问题的作业都被发送给 Sentry,然后 Sentry 会以更好的格式发送给 Slack。这是我们最终的结果!

通过哨兵(由高创建)在空闲时收到的示例警报
结论
一如既往,我希望这篇文章对你有用,并能给你启发。一旦有了合适的基础设施,您就有很大的空间来尝试不同的监控和警报策略。干杯!
参考
https://cloud.google.com/blog/products/data-analytics/bigquery-audit-logs-pipelines-analysis
我如何建立自己的实时停车可用性预测模型
使用机器学习帮助我日常生活的简单方法。

斯文·米克在 Unsplash 上的照片
在这个时代,机器学习(ML)被广泛应用于几乎每个行业,解决一些最复杂的挑战。它用于疾病的医疗诊断、欺诈检测、自动驾驶汽车、面部识别、推荐系统等。在大多数应用中,ML 的使用产生了大规模的影响并使大众受益。
但是,一定要这样吗?我们能在日常生活中保持小规模,以我们自己的方式使用 ML 吗?当然啦!在这篇文章中,我写了一个自己发起的项目,我就是这样做的——使用 ML 来预测我的住宅区的停车位可用性。
附注:请在此GitHub repo查看该项目的源代码。
目录
问题陈述
在我住的公寓楼周围,停车位总是有限的。住在几个相邻公寓楼的居民共用这些房间。更多的时候,我会在晚上回家,在我的街区附近找不到任何停车位。
结果,我不得不把车停在几百米远的地方。如果我一个人的话,这很好,但这让我感到沮丧,尤其是当我要从车上把很重的东西搬到我的公寓时,同时还要管理一个活泼好动的小孩和一个婴儿!
一天,我有了一个想法💡!为什么不自己收集一些数据,并使用 ML 来预测我是否能够找到离我的公寓楼最近的停车位?我心想,如果一个 ML 模型可以帮助我做到这一点,那么也许我可以提前计划我的旅程,以避免这种情况。我甚至可以决定乘坐公共交通工具,根本不开车。
数据收集
将我的想法变为现实的第一步当然是开始收集一些数据。在这样做之前,我把我家的所有停车位分成了四个区域:1、2、3 和 4 区。我尽我所能绘制了图 1 中的布局。

图 1:按区域划分的停车位布局(图片由作者提供)
我住在 A 座,所以 1 区的车位最近,其次是 2 区、3 区、4 区的车位。我妻子和我总是害怕在 4 区停车,因为这意味着要走最远的路才能到达我们的街区。
按区域划分停车位后,我就准备收集数据了!我需要记录的只是:
- 停车的日期和时间;和
- 我找到停车位的地方。

GIF 展示了我如何在智能手机上手动将我的停车数据记录到 Google Keep 应用程序中
我发现记录数据最简单的方法是,我一停好车,就拿出我的智能手机,输入我的谷歌 Keep 应用。我使用了以下格式:
YYYY-MM-DD HH:MM, Zone X
逗号分隔约定的基本原理是,我可以将 Google Keep on 浏览器中的数据复制并粘贴到记事本中,然后轻松地将其保存为逗号分隔值(CSV)文件(参见图 2)。

图 2:将我在 Google Keep 上的停车数据以 CSV 文件的形式保存到记事本中(图片由作者提供)
将数据保存为 CSV 文件后,我就可以将它作为熊猫数据帧加载到 Python 中了。

我收集了从 2021 年 4 月 19 日到 2021 年 12 月 20 日总共 8 个月的数据,数据包含 312 行。当然,我收集的数据越多越好,但我认为我可能能够得到一个有 312 行数据的像样的 ML 模型。
特征工程
在熊猫数据帧df中,我只有两列,date_time和parking_zone,后者是我们用来训练监督分类模型的目标标签。目标是从date_time列中提取不同的特性,比如月、日、小时和分钟。为此,我首先需要使用pd.to_datetime()将这个列转换成一个datetime列。

现在,我可以通过使用.dt访问器从date_time列中提取一些潜在有用的特性。我还将month、day_of_week和hour转换成有序分类变量,这将有助于我随后的探索性数据分析。

我还想知道停车位的可用性是否会受到某个特定日期是公共假日还是公共假日前夕的影响。例如,如果是在除夕夜,居民是否倾向于待在外面,很晚才回家,从而比平时有更多的停车位?
考虑到这一点,我使用了来自 data.gov.sg 的公共 API 来获取与新加坡公共假期相对应的日期列表。列表中的每个日期都被解析为一个datetime对象。为了获得公共假日前夕的解析日期列表,我只需从每个解析的公共假日日期中减去timedelta(days=1)。

有了这两个列表,我在 DataFrame df中创建了另一个特性ph_eve。该特征指示df中的特定行是否对应于公共假日(值为ph)、前夕(值为eve)或两者都不对应(值为nil)。

探索性数据分析
我从一个单独的date_time专栏中创建了总共 9 个不同的特性。然而,并不是所有的方法都有助于预测停车位。我进行了探索性数据分析(EDA ),以帮助我确定哪些特征是停车位可用性的更有用的预测因素。
阶级分布
首先,让我们看看停车区的频率分布(见图 3)。不出所料,1 区是最常见的,因为我们总是试图找到一个离我的公寓最近的停车位。这种分布也暗示了一种阶级不平衡,这是在建立和评估一个 ML 模型时需要考虑的。
图 3:停车区的频率分布(图片由作者提供)
一天中的某个时刻
接下来,让我们按停车区查看一天中不同时间的停车时段的百分比(见图 4)。我回家越晚,就越不可能在 1 区找到停车位。这是常识,但是很高兴知道我收集的数据证实了这个观察。根据图 4,似乎hour也是预测停车可用性的有用特征。
图 4: 100%堆积条形图,显示了停车区停车时段的分布情况(图片由作者提供)
星期几
我也问自己,“一周中是否有几天不太可能在 1 区找到停车位?”根据收集的数据,是的!在 1 区获得停车位的概率在周一最高(83%),在工作日逐渐下降,在周四最低(59%)和周日最低(~61%)。因此,day_of_week也可以是停车可用性的有用预测值。
图 5: 100%堆积条形图,按停车区显示一周中各天的停车时段分布情况(图片由作者提供)
公休日,前夜,还是都不是?
在整个数据收集期间,人们感觉在公共假日更难在 1 区找到停车位。我猜这是因为第二天可能是工作/上学日,居民倾向于呆在家里。公共假日前夕则相反,这意味着居民可能不会早回家,因为第二天是公共假日。
图 6: 100%堆积条形图,显示了公共假日、前夕或平日停车区的停车时段分布情况(图片由作者提供)
图 6 验证了我的直觉!在公共假日前夕,很有可能在 1 区找到一个停车位,而在公共假日不可能找到,这表明ph_eve也可能是停车位可用性的一个决定因素。
构建基线模型
我也考虑了其他特征,但是day_of_week、hour和ph_eve似乎是更有用的预测因素。我没有使用hour,而是使用了hour_min,以便考虑到某个小时过去的分钟数。
此外,我把车停在 2 区、3 区还是 4 区对我来说并不重要。它们都意味着我要走比停在 1 区更远的距离。我更关注的是我是否能在 1 区找到停车位。我将区域 2、区域 3 和区域 4 分组为“其他区域”,从而将问题转化为二元分类任务!

我现在混合了数字和分类特征来训练一个二进制分类模型。在这种异构数据类型的场景中,我们可以使用 scikit-learn 的ColumnTransformer,它允许我们对不同数据类型的特性应用不同的预处理和特性提取管道。
有关ColumnTransformer的更多信息,请查看下面的 scikit-learn 文档:
https://scikit-learn.org/stable/auto_examples/compose/plot_column_transformer_mixed_types.html
我创建了一个包含preprocessor对象和一个分类器的Pipeline对象。我选择了LogisticRegression作为基线分类器。接下来,我拆分数据集(80%用于训练;20%用于验证),将训练数据拟合到Pipeline对象,并根据验证数据对其进行评估。

验证数据的预测结果也可以使用混淆矩阵进行总结,如图 7 所示。

图 7:总结预测结果的混淆矩阵(图片由作者提供)
总的来说,考虑到这只是一个基线模型,验证数据的结果看起来很有希望——准确度为 0.90,精确度为 0.91,召回率为 0.95。我对分类性能很满意,也很高兴使用这个基线模型来生成预测。
使用 Streamlit 创建 web 应用程序
如果我没有部署和使用它,培训一个 ML 模型有什么用呢?因此我用创建了这个叫做公园的网络应用。
在引擎盖下, ParkWhere 使用我训练过的基线模型,预测在给定的日期和时间内,我是否会在 1 区找到停车位。
一旦 web 应用程序启动,它会立即向我提供启动应用程序时的预测。从用户体验的角度来看,这非常方便,因为默认情况下,我只需启动应用程序,无需输入任何内容。
当然,如果我想预测不同时间的停车位,我仍然可以输入任何日期和时间。请随意查看 ParkWhere 这里!

展示 ParkWhere web 应用程序如何工作的动画 GIF
包装它
所以,我有了一个实时停车可用性预测模型!概括地说,在预测找到离我的公寓最近的停车位的可能性时,该模型考虑了一周中的某一天、一天中的某个时间以及是否是公共假日(前夜)。
现在,我可以随时随地从我的移动网络浏览器方便地启动 ParkWhere ,并让模型为我生成预测。有了这样的预测洞察力,我可以提前计划我的旅程,以避免在很远的地方停车。如果我只是需要快速处理一些事情,我甚至可以决定乘坐公共交通工具,而不开车。

这是我在日常生活中利用 ML 的简单尝试。问题陈述非常具体地针对我的环境和偏好,因此我构建的解决方案的好处可能并不广泛或适用于大众。
仍有改进的余地。我还需要试验不同的分类器,进行定量特征选择,执行超参数调整以找到更优的模型,进行交叉验证以减轻过度拟合的问题,等等。我甚至可以继续收集更多的数据,偶尔重新训练模型。
“谁拥有数据,谁就拥有力量”——蒂姆·奥莱利
然而,在这个阶段,我对我所拥有的基线原型很满意。事实上,我很自豪能够从零开始构建和部署一个 ML 解决方案——实际上,是使用我自己收集的数据😄。我相信任何有意愿收集数据和一些 ML 知识的人也可以做类似的事情!
目前就这些。感谢阅读这篇文章!如果你觉得它很有见地,请在评论中告诉我。我也欢迎的讨论、问题和建设性的反馈。欢迎在媒体上关注我,或者通过 LinkedIn 或 Twitter 联系我。祝您愉快!
我是如何在 FAANG 破解商业智能工程师面试的
我最近面试了亚马逊的商业智能工程师,并成功通过了面试

克里斯蒂娜@ wocintechchat.com 在 Unsplash 上的照片
FAANG 的面试被大肆宣传,因此人们在面试前会感到恐慌。我记得我在网上搜寻任何关于面试过程中会发生什么的帮助或指导。所以,我分享我的经验,希望对你的旅程有所帮助。
如果你要参加面试并有问题,请给我留言,我会尽力回答。
我会尽量涵盖事件的顺序、结果和时间表,以帮助缓解你的焦虑。相信我,我也经历过!😃
我是怎么接到面试电话的?
招聘经理在 LinkedIn 上找到了我,告诉我这个职位,并问我是否有兴趣加入这个团队。尽管我没有主动寻找,但我还是追求了这个职位,因为对我来说这似乎是一个非常有趣的机会,而且目前雇主的工作变得越来越乏味,我想当你在同一家公司工作了 7 年,一切都唾手可得时,这种情况肯定会发生。
所以,在与招聘经理打完第一个电话,询问我目前的角色和对这个工作机会的兴趣后,我被告知招聘人员会主动联系安排面试。
在打电话之前的几天,当我在等招聘人员打电话时,我收到了一封自动回复的电子邮件,上面填写了我是否可以参加电话面试。填完之后,我收到了招聘人员发来的电子邮件,确认了面试的日期和时间。他们所有的采访都是通过 Amazon Chime 进行的,这是一种可以让你见面、聊天和打电话的通信服务。
在我与招聘经理的第一次通话中,他简要提到了面试过程,但我不太确定在这个阶段会发生什么,而且到目前为止还没有任何口头交流。
面试是什么样的?
1.第一次面试/初步电话筛选—
面试那天,我加入了亚马逊 Chime 上的通话。在最初的介绍之后,面试官给我发来了三份作业 Excel、SQL 和 Python 各一份。我应该下载文件,分享我的屏幕,并在相机上完成任务。一个小时的面试结束后,我不得不把我的文件副本发邮件给他。
你可以在我接下来的文章中找到这一轮提问的细节。
这是一个星期五。在接下来的周一,我收到了招聘人员发来的另一封电子邮件,内容是安排第二天,也就是周二,与招聘经理进行下一轮面试。
2.复试—
在这一个小时里,我和招聘经理就我目前从事的项目进行了非常详细的讨论。到目前为止我所面临的挑战以及我是如何解决工作中的冲突的?我的优势和抱负是什么?我还询问了他的角色和团队的工作。所有的问题都基于亚马逊的领导原则,他们希望以明星的方式得到答案。你可以在谷歌和亚马逊网站上找到更多关于 STAR 方法的信息。
这是一个非常有成效的一个小时,在整个讨论过程中,我没有感到害怕或威胁。
同一天晚上,另一名招聘人员打电话给我,告诉我他们想和我安排下一轮面试,并询问我是否有空。
3.循环采访—
在亚马逊,循环/现场面试是一系列连续的面试,然后是当天或第二天的酒吧招待面试。我的循环面试安排在下周一(根据小组和我的空闲时间)。它包括四个连续的访谈,每个访谈之间有一个小时的休息时间。我联系了招聘人员,她帮助我了解了哪个面试官将测试我的什么技能。这真的帮助我在心理上做好准备,组织我的想法,让我的回答有条理。他们要面试我的技能是——分析技能、可视化技能和指标创建、基于领导原则的表格和行为问题。
在亚马逊,领导技能受到高度重视,并被用作各级商业决策的指路明灯。如果你觉得自己具备这个职位所需的技能,你需要关注的只是领导原则。我怎么强调它们的重要性都不为过。
酒吧聚会安排在第二天。亚马逊的调酒师是你将被雇佣的团队之外的有经验的面试官。他们也是决胜局的决定者,拥有决定雇佣或不雇佣候选人的否决权。
循环结束后,三天后我接到了亚马逊另一位招聘人员的电话,告诉我他们想从我这里了解一些细节。我被要求通过电子邮件发送一些个人信息以及一些财务文件,如工资单、奖金/加薪函和股票支付函等。到目前为止,还没有说什么神奇的话,比如“祝贺你!你成功了!”。但这意味着我扫清了障碍,我有点高兴(尽管小心翼翼),也有点松了口气。
一周后,另一名招聘人员打电话给我,讨论他们提供给我的 CTC,在我接受后,聘书随之而来。最后,我真的相信我被录取了!
四天后,我收到了一封电子邮件,提供了我背景调查的细节。
这就是我如何在 FAANG 公司的面试中胜出的。我希望你能找到你要找的信息。如果你有任何问题,请不要犹豫来找我。
感谢阅读!
直到下一次…
更新: 更多 excel 部分面试信息,请点击 此处 或以下链接。
我是如何破解元机器学习工程面试的
编码、设计和行为回合的实用技巧

由 Pablo Heimplatz 在 Unsplash 上拍摄的照片
最近,我得到了 Meta 的一份机器学习工程师(MLE)的工作,相对于我之前的工作,我的总薪酬增加了 20%,并被晋升为高级职位。在这篇文章中,我将概述面试结构,我如何准备,以及如何搞定 MLE 面试的实用技巧。尽管我的经历是在 Meta,但我相信这份指南对其他科技公司的 MLE 面试也是有用的。祝你好运!
面试结构
实际上,我没有亲自申请,而是一名招聘人员通过 LinkedIn 联系了我。这是一个很好的提醒,让你的 LinkedIn 个人资料保持润色和更新。我做了一个电话屏幕和一个虚拟现场:
- 手机屏幕持续了一个小时,包括两个编码问题。
- 虚拟现场活动持续了 2 天。第一天包括一次编码面试、一次行为面试和两轮设计:系统设计和 ML 系统设计。第二天最初包括一轮编码和一轮行为,但是后者在最后一分钟被取消了,所以我在第二天只做了一轮编码。
编码面试
我一共做了 3 次编码,一次在电话屏幕上,两次在现场。每轮编码有 2 个 Leetcode 中等问题,我需要在大约 1 小时内解决,总共有 6 个编码问题。典型地,一次面试有一个非常普通的问题(在 Leetcode 脸书标记的 10 大问题中)和一个更加模糊的问题(在前 300 名中)。
我在 Leetcode 上研究了过去 6 个月中最常见的脸书标记问题(这一功能是购买 Leetcode Premium 的一个很好的理由)。我关注的不是数量,而是质量:我试图真正理解解决最常见问题的不同方法,以及为什么不同的方法有效,为什么我的第一次尝试没有成功。总的来说,我练习了 137 / 350 个 Leetcode 问题。
👉一些提示:
- 清晰地传达你的思维过程。在准备过程中,通过在解决问题时自言自语来练习。推动对话。让面试官尽可能轻松。大纲不应该再令人惊讶了:(1)用几个测试用例来确认你对问题的理解是正确的,(2)在高层次上描述算法和复杂性,(3)实现,以及(4)测试。
- 找到自己的 bug。如果你的代码有 bug,只要你自己能够发现它们,这是没问题的。完成代码后,总是用测试用例一行一行地手工运行算法。在我的面试问题中,至少有两个我发现了代码中的错误,但是没有时间去修复它们了。那很好。
- 偏爱速度。如果在(2)中,你可以选择实现一个次优解决方案或者头脑风暴一个更优的解决方案,我会偏向于速度,先写下次优解决方案。拥有一个不是最优的完整解决方案比没有解决方案要好的多。至少在一个问题中,我知道(并且交流过)我的解决方案不是最优的,这是可以的。
- 边学习边记笔记。在准备过程中,我发现在一个简单的减价文件中做笔记很有用。我创建了自己的“课程”,包含最重要的问题和解决方案描述,并随着时间的推移进行编辑和完善。这帮助我把所有重要的问题都集中在一个地方。
- 购买 Leetcode Premium 。能够看到你面试的公司最常被问到的问题是非常有用的。
设计面试
有 2 轮设计,系统设计和 ML 系统设计。系统设计面试是关于如何用分布式系统解决一个问题,ML 设计面试是关于如何用 ML 解决一个问题,比如如何建立一个分类系统或者推荐系统。以下是我推荐的准备材料:
- 教育性的'摸索系统设计面试'。虽然总体来说非常有用,但这门课程也是一个大杂烩:一些课程质量很高,另一些则不太好(可能是因为不同的课程由不同的作者编写)。我更多地关注于学习基础组件,比如 REST API、负载平衡、通信模型等,而不是记忆特定系统的设计。
- 教育性的'摸索机器学习面试'。本课程也是一个大杂烩,有些课程很精彩,有些则不太精彩,但总体来说,它是一个很好的 ML 系统设计入门课程。
- Alex Xu 的系统设计 YouTube 频道, ByteByteGo 。
- Chip Huyen 的“设计机器学习系统”一书。如果你不想买这本书,可以看看她的网站,里面有很多和这本书相同的内容。
- 我自己的电子书,“地面上的机器学习:现实世界的 ML 应用的设计和操作”,可以在 Gumroad 上找到。这本书是我在过去几年里写的关于 ML 设计和操作的文章的集合,聚合成一个 50 页的 pdf。
- 研究论文:我经常参考的一个很好的资源是尤金·严的策划论文列表。特别是,这里有几篇我认为颇有见地的论文:
亚马逊搜索:产品排名的喜悦
LinkedIn 搜索系统的深度自然语言处理 脸书搜索中基于嵌入的检索 推荐系统的深度学习:网飞案例研究 [广&推荐系统的深度学习](http://Wide & Deep Learning for Recommender Systems) YouTube 推荐的深度神经网络 神经协同过滤
👉一些提示:
- 推动对话。如果你等着面试官来主导谈话,这只会显示出你缺乏主动性,而你总是想表现出相反的一面:你是被驱动的,是主动的。你应该大部分时间都在说话。两轮设计的大致轮廓如下:(1)阐明问题,(2)提出高层次的设计,(3)画出设计(总是方框和箭头),(4)放大设计的某些部分。
- 练习画画。面试前练习在 Excalidraw 上画几张设计图。这会让面试变得简单一点:如果你能省下几秒钟去弄清楚如何画一个圈,那你就能多花几秒钟来进行头脑风暴。
- 学习的时候记笔记。在准备过程中,总是记下你所学到的东西。不要只是复制粘贴,用你自己的话来写东西,以此来探索你的理解。
行为面试
我在虚拟现场进行了一轮行为测试,持续了 1 个小时。以下是我准备的问题:
- 你最引以为豪的项目是什么?
- 你如何处理与同事的冲突/分歧?
- 告诉我你采取主动的一次经历。
- 告诉我你开始跨团队协作的一次经历。
- 告诉我你有竞争优先权的时候。
- 告诉我一个业务需求发生变化而你不得不适应的时候。
- 告诉我你接受经理反馈的一次经历。
- 告诉我你解决的问题不明确的时候。
👉一些提示:
- 跟随明星法:****Situation/T问:有什么问题,Aaction:你采取了什么主动?你的推理是什么?你是怎么说服别人的?, R 结果:例如,“我将业务指标 X 提高了 Y%”,“我解决了影响 N 个客户的 bug”等等。
- 回答前花点时间想一想。没关系。你不是机器。
- 重复使用。可以在多个问题中使用相同的情况,并强调情况的不同方面。
- 合理内夸大。夸大是可以的,只要你的故事有一点真实性(否则你将无法回答试探性的问题)。重点不在于获得真实发生的历史记录,而是面试官想知道你的个人价值观是什么。
- 写。通过写下来准备你的故事。面试时把它们放在你面前作为提醒也是可以的(只是不要在屏幕上读它们)。

我的 Leetcode 提交的可视化。(图片由作者提供)
最后的想法
我对 Meta 面试过程的总体印象是,很公平。我从一开始就被清楚地告知要准备什么,要期待什么。这种经历非常像在学校准备考试。要明确的是,这是一个很大的材料来涵盖。我个人光是 Leetcode 就花了几个月的时间,你可以在上面的截图中看到。
话虽如此,科技面试也包含了运气的重要成分。有可能在同样的准备下,我会因为不同的面试官和问题而失败,就像神经网络用不同的随机种子达到不同的潜在最小值一样。这就是为什么我一般会建议同时面试不止一家,而是几家公司,这取决于你有多少空闲时间。
最后,如果我想让你从面试中学到一件事,那就是:从你开始打电话的那一刻起,就要有动力,表现出主动性。不要等着面试官指示你下一步该做什么,而是自己来引导对话。比方说“”接下来,我将放大标签是如何生成的。可以吗?”,而不是“下一步该怎么办?”。作为一个组织中的个人贡献者,你应该主动解决问题,而面试环境,尤其是设计阶段,是你展示这种主动性的绝佳机会。
让我们保持联系…
确保点击“ 关注 ”和“ 订阅 ”按钮,这样你就不会错过网上一些最好的 ML 内容。 成为中等会员 ,如果你还没有,那么你可以无限阅读文章。请务必在LinkedIn和/或Twitter上关注我!
我如何使用简单的复制和粘贴来减少 92%的数据处理时间
了解您的工具非常重要

把你的数据变成一辆微调过的赛车!照片由苏拉夫·米什拉拍摄:https://www.pexels.com/photo/grey-coupe-on-road-3136673/
我很想说标题是点击诱饵,但在这种情况下,它实际上是真实的。让我解释一下。
背景
几个月前,一位我多年前合作过的首席技术官在 LinkedIn 上找到了我。他在一家新公司工作,需要一些帮助。
“嘿,布拉德——我记得你对 Postgres 很有经验。如果您的日程安排中有时间,并且您对此感兴趣,您是否有兴趣打个电话?”
这是一条简单的信息,没有真正的细节,但似乎很有趣。我们安排了一次会面,他解释道。
他的公司通过供应商管理的托管解决方案推送大量数据。问题是,有一些性能和稳定性问题正在蔓延,使他的客户保证成为一个主要的苦差事。他希望有人能充当翻译,以确保所提供的信息是可靠的,并翻译深奥的技术内容。
这听起来很容易,为什么不呢?
我正在正式提名这个假设为年度轻描淡写。
当我终于进去看到我到底在处理什么的时候,我有点震惊。数据库已经增长到 80TB 左右,一些单独的表(和索引)超过了 15TB。汪汪。
通常,当我突然接到一个电话,要求进入这样一个场景时,我会认为是“正常”大小的数据库。大约在 0.5-2TB 的范围内。当一家公司拥有如此规模的数据存储库时,通常会有团队来管理它,以保持一切正常运行。
这次不会。我不得不成为主题专家,与一些在不同领域拥有专业知识的非常有才华的人争论,以了解他们面临的数据挑战。
从哪里开始?
第一个合乎逻辑的步骤是确保系统实际上是半调优的,以处理数据的大小和运行它的硬件。
波斯特格里斯是一只有趣的野兽。它对用户非常友好,但对朋友很挑剔。它将愉快地允许管理员和用户做各种各样的坏事,并将尽可能地适应。
这造成了一个相当大的问题。对于如何调整数据库以应对如此规模的存储中的海量数据,目前还没有太多的指南或建议。
如果你有一个数据库容量为几百 GB 的 web 应用程序,搜索一下,有大量的指南可以让你在附近找到合适的位置,并让你以相当不错的性能运行。您需要通过一个非最优的数据模型来获得您的结果——您可以通过 stackoverflow 中的一个示例来获得您需要的结果。你大概不会有太多问题。
Postgres 会尽力满足你。它有一个伟大的计划者和一个伟大的引擎来执行这些计划。
不利的一面是,与 MySQL / MariaDB 或类似的更加自我配置的数据库相比,您可能会看到显著的改进。
如果你拨对了,Postgres 可以成为你梦寐以求的印第车。即使大数据贯穿其模式。
所以,我的第一步是把它拿到附近。也许不能成为一级方程式赛车,但至少可以成为一辆普通车。
我花了很多时间寻找共享缓冲区、工作内存和维护工作内存的最佳值。我还调整了真空和自动真空设置,以保持东西干净整洁。
不久,该系统的规模就适合数据和硬件。它不再有可靠性问题,并且它的资源使用情况开始变得更好。
虽然这不是本文的主旨,但我确实想提到,在上下文中,性能和可靠性稳定性是需要检查的主要项目。仅此一项就能帮助业务部门让客户满意。如果顾客不高兴,没有人会高兴。
大问题
随着我对这些问题的深入研究,另一个令人烦恼的问题出现了,那就是总体性能不佳。
尽管数据量很大,但运行查询的时间比我预期的要长。有些是设计,有些只是活动,但有些东西似乎不对劲。
我想花一秒钟解释一下最后一句话。在我长期与各种系统打交道的过程中,无论是网络、操作系统还是数据库,我都喜欢称之为系统管理员第六感。这是一种经验的功能,既有一般的,也有你正在处理的系统的特殊功能。你开始凭直觉知道什么时候事情表现不好。
这不是真正的魔法或任何神秘的东西。只是观察不同的系统,理解在特定的条件下特定的输入可能会产生什么。你可能不会立即知道什么是错的,但你通常可以知道什么时候是不对的。都是关于对细节的关注。
利用我的蜘蛛感应,我知道有一个问题。
对于阅读这篇文章的有经验的人来说,你可能会想,“好吧,废话。”然而,我面临的更大的挑战是,我正在使用一个包含高度机密和受保护信息的数据库。虽然我有权限使用系统,但我没有权限使用数据本身。
做顾问的另一个乐趣。
因此,为了探索这个问题,我需要与内部团队合作,为我提供一些匿名的查询样本。在看到查询后的 10 分钟内,我意识到了问题所在。
揭秘
如果你不需要等待消息的披露,那么一个类似点击诱饵的标题有什么用呢?
通过系统上的主要查询,我看到了 Postgres 性能的死亡之吻。可怕的选择独特。
在一群愤怒的数据库管理员和数据分析师拿着干草叉和火把来到我的住所之前,让我为自己辩护一下。
简单地说,Postgres 根本不能很好地处理 DISTINCTs。这不是一般陈述,而是后置陈述。
我喜欢 Postgres 的一点是它符合 SQL 标准。它倾向于默认一个标准,而不是创造自己的语言风格。这也意味着,在某些情况下,虽然系统会符合您的要求,但实现并不完美——或者在这种情况下,很好。
其他数据库引擎如 SQLServer、Oracle、MySQL 等。,处理很好,对性能影响最小。Postgres 没有。这是一个例外,一个让一切都不同的例外。
你看,简单地说,其他 RDBMS 引擎允许索引可以很容易地跳过,以提取唯一的值。它是高效和有效的。
另一方面,Postgres 必须首先检索整个集合,然后对集合进行二次扫描,以识别并返回唯一值。这看起来并不多,但在数据世界里,这很重要。开始向查询中添加列,最终会有多次查询。
因此,对于像这样的使用一个关键字的大型数据库上的每个查询,仅返回集合就需要花费大量的时间和资源。
我们如何绕过它?
有多种方法。首先,如果模型正在开发中,我个人会努力确保数据的存储方式能够正确地返回唯一值,而不需要使用 DISTINCT。有时会有例外,但大多数数据模型都可以用这种方式构建。
第二,如果我的第一个偏好不可行,我将尝试使用其他构造来提供有问题的查询的唯一集合。这可能是视图的战略性使用,甚至是集合返回函数,允许减少不确定性和构造更好的查询。不利的一面是,这通常需要花费更多的时间和精力在数据库及其使用上,以确定在哪里以及如何使用它们。
第三,通常还有其他方法来编写查询。
在我们现代的开发世界中,我们经常倾向于将快速开发置于快速性能之上。如果你在云中,资源是无限的(对吗?)所以只要某个东西有点快,我们总是可以给这个实例更多的信任,然后强行使用它。我是在开玩笑,但不完全是。
通常有一种方法可以优化性能,只需以稍微不同的方式考虑数据。只需要一点点创意。
简单的方法
删除 DISTINCT 的最快、最简单的方法就是将 SELECT 子句复制到 GROUP BY 子句中。
在我提到的其他数据库上,如果您运行查询分析来查看计划,您将经常看到一个不同的和一个等价的 GROUP BY 具有几乎相同的查询计划。这是由计划者进行的优化,以注意到这些大多是等价的功能。
Postgres 不是这样的。DISTINCT 和 GROUP BY 将有非常不同的计划,并且在大多数情况下最终会导致非常不同的执行时间。对于针对大型数据集的复杂查询,这可能会产生重大影响。
我将注意到有例外和警告。什么时候没有?但作为一般指导,我个人认为这是真的。考虑到变更的简单性,用代码测试和实现通常影响不大。
证明
说了这么多,还是说证明吧。
我的客户有一个正在运行的查询,要将大量数据从一个位置移动到另一个位置。从本质上说,他们从数据库中提取交易数据,并将其转移到一个进行更多分析和报告的位置。
这是一个夜间过程,在我开始之前,平均需要 25 个小时才能完成。它回避了这样一个问题,如果花费超过一天的时间,这是否是真正的每日报告,但这是一个完全不同的语义讨论。
环境的稳定和配置的更改产生了一些较小的平均影响,但实际上花费在此操作上的时间始终保持在 25 小时。
通过将 SELECT DISTINCT 修改为 SELECT … GROUP,将该过程缩短为 2 小时。
这个简单的改变将花费的时间减少了 92%。它只是将 SELECT 子句复制并粘贴到 GROUP BY 子句中。
结论
正如我一直试图指出的那样,不仅对我的客户,而且在这篇文章中——这篇文章对一个简单的概念进行了冗长的解释——这一切都归结于了解您的系统。
仅仅知道系统如何工作是不够的。你还需要知道它的细微差别和古怪之处。它在哪里出类拔萃,又在哪里奋斗?有什么地方不符合传统智慧吗?
如果你用一套特定的技术工作足够长的时间,你会慢慢学到这些经验。如果你像我一样,碰巧做了很多这种类型的咨询,你只需要进入每一个新的环境,知道堆栈中的每一项技术都有一些令人头痛或拯救者的东西。
密切关注,做你的研究,你会发现有时甚至 ctrl+c / ctrl+v 也能给你意想不到的结果。
我如何设计我的数据科学产品组合
原文:https://towardsdatascience.com/how-i-designed-my-data-science-portfolio-f05f51ebfd9b

(图片作者)
有一个好的作品集对于突出你的作品和你讲述故事的能力是很重要的。精心挑选你的项目是展示你的专业知识和分享你的经验的最好方式。
我个人在整合我的项目和找出分享我的激情的最佳方式方面遇到了挑战。数据科学和工程项目通常很模糊,很难表达,在我的例子中,有两种味道,代码和内容。我把我的源代码放在我的 github 页面上,把我的文章放在我的媒体上或网上的某个地方。
所以我建立了一个个人的五部分投资组合。以下是我对每个部分的思考过程:
简介部分:

kathleenlara.com:简介部分
我设计了这个部分,想象我正在给某人一个关于我是谁和我做什么的电梯推销。我添加了 gif 作为我自己的表现,并给人一种互动的感觉。(我想我可以加一张我自己的 gif,但是现在,我的自信还没有达到!)
至于背景,最初是白色的。我通常在几乎所有的视觉效果中使用最少的白色,因为这种颜色看起来很安全。但是,我不能总是习惯的动物,所以我决定冒险,用柔和的渐变。
快速介绍之后,访问者下一步会做三件事。类似于现实世界中给你的选择——当你遇到某人时,你要么主动给他们你的联系方式或代表发送邮件按钮的名片(我知道我说这很主动,但无论如何给我发一封也完全没问题,我喜欢阅读电子邮件!),你可以直接进入主题,通过查看简历来挖掘更多细节,或者继续进行“了解对方”的对话,通过向下滚动更多文件夹来了解对方。
项目部:

kathleenlara.com:项目部分
在关于我自己和我的兴趣的小型电梯推销之后,我设计了这个部分来分享更多关于我所做的事情。在这个部分中,我对我的项目进行了分类。第一个是特色类别,这是我选择和展示我最喜欢的作品。其他类别与编码、我写的文章和我的数据可视化有关。
*免责声明:我参与的大部分项目都是保密的,不打算共享,这也解释了为什么我现在只列出了有限的项目**。 我目前正在努力找时间做更多的个人研究工作。
我加入了紫色标签,以便快速了解项目的内容。我还在底部添加了“了解更多”链接,如果你注意到了,点击这些链接会打开一个新标签。我对这个外部选项卡非常挑剔,因为我希望查看者将投资组合放在另一个选项卡中,这样他们可以在了解特定项目后轻松切换回我的页面,并进一步探索投资组合。
我合作过的公司:

kathleenlara.com:我合作过的公司版块
我用一行总结了我合作过的公司类型的话开始了这一部分。我的目标是突出我以前的角色,并引导浏览者下载我的简历。我不想让信息淹没他们,这就是我跳过 JD 要点的原因。
再介绍一下我:

kathleenlara.com:关于我
你可能想知道——为什么把这个放在底部,而不是在最开始强调更多关于我自己的信息?在现实生活中,我注意到人们在社交活动中交流和互动的模式。(我应该在这里放一些华而不实的行为统计,但是我没有,所以是的,这是基于我的个人经验😀)。首先,你询问工作,他们做什么,然后经过一点交谈交流,最终你会变得更加个人化,这就是为什么我把这部分放在底部。
那么,我是如何决定分享哪些私人物品的呢?这实际上是最难写的部分之一,因为我不习惯分享关于我的事情,我觉得我在工作之外所做的活动并不都是独一无二的。我包括了人们会问的最基本的问题,包括我在哪里工作,我的爱好是什么。我还添加了一张厚脸皮的照片,与其他部分相比可能有点不专业,但它给了页面更多的个性(我也想展示我有趣的一面)。
我写下了我的技能和我最常用的工具,让我对自己的日常工作有一个大致的了解。这也是一个挑战,因为我不想表现得像一个什么都懂的人,从数据工程到全面的数据分析,但我认为这些是一个强大的数据科学家应该拥有的一些技能和工具,以提高工作效率和生产力——一个人必须知道如何认真对待和处理数据。我也是一个进步中的人,但我总是试图学习新的东西。
取得联系部分:

kathleenlara.com:保持联系
有两种方法可以联系我,要么复制我的电子邮件地址,要么填写表格。是的,我公开的电子邮件只针对我的公共账户(我有不同的电子邮件地址给更多的私人账户)。
投资组合改进:
我不太擅长网页开发,我希望我有更多的时间来研究如何真正提高我的作品集——但是网页设计不是我的专长,我的主要目标只是展示我的作品。我开始使用 webflow 来节省开发时间,我只是添加了自己的 css 和 javascript 代码块来实现额外的功能。Webflow 也让我更容易让网站设备做出响应。它有一些相关的成本,并且需要一点 UI / UX 开发知识,但是还有其他选项,比如 SquareSpace 或 Wix,对于没有编码或开发经验的用户来说可能更友好。
总的来说,我花了一个周末的时间来建立网站,内容和草图都已经准备好了。我还没有优化我的投资组合的单个元素,以提高加载速度,特别是在移动设备上。我仍然需要添加更多的项目,或者选择更好的项目来展示——但总体来说,我对目前为止所做的很满意。
建立投资组合的方式没有对错之分,一条建议是开始思考你想如何讲述你的故事,然后从那里开始创建一个框架。
快乐观影:https://www.kathleenlara.com/
在推特上关注我:https://twitter.com/itskathleenlara
我用来创建投资组合的工具:https://webflow.grsm.io/rp5ql946twqd
我如何设计自己的数据科学组合网站?
原文:https://towardsdatascience.com/how-i-designed-my-own-data-science-portfolio-website-3d146ea6b6cd
用最少的 HTML 编码技巧创建网站的简单说明。

作品集网站(作者照片)
很长一段时间,我想创建自己的作品集网站来展示我的技能和经验。我在 LinkedIn 和 GitHub 等基本应用上做得很好。唯一缺少的是把我所有的职业社交整合到一起的东西——投资组合网站!
看看我给自己做的这个网站——链接。如果你喜欢它的样子,你会喜欢读这篇文章:)
因此,我知道 GitHub Pages 是许多数据科学家创建和托管其投资组合的首选网站。我总是避免它,认为我必须学习 HTML-CSS,我不太热衷于投入这方面的努力。最后,我有了一些空闲时间,浏览了不同的互联网文章和 YouTube 视频,学到了很多关于如何创建一个网站,而实际上并不具备强大的 web 开发技能。
我发现了一些有趣的网站创建方法,列举如下:
- 取一个 HTML-CSS 模板,并根据你的喜好编辑它,以托管 GitHub 页面。
- 使用wix.com,这是一个免费的网站建设者(如果你想摆脱广告并获得一个自定义域名,有溢价选项)。
我玩了一会 Wix 网站,我很喜欢它。你不需要太担心 HTML 编码,直接修改他们选择的网站模板。但由于我不想从 Wix 获得任何付费订阅,我选择了 GitHub Pages(目前),它不运行任何广告,是免费的。
入门—概述
并非所有的配置文件都是相同的。如今,数据科学家的个人资料保持了很大的多样性,并且充满了所有重要的方面。让我们列出一些要包含在作品集网站中的重要功能(来自我的观点) :
- 介绍自己 —这是显而易见的,通常,作品集网站的第一部分是专门介绍你自己的。你可以保持简单,或者通过添加一张照片来增加趣味(就像我一样)。一个只有几行字的段落,读者会对你有一个大概的了解。
- 简历——应该放在网站的一些容易找到的地方。在我看来,通过赞美你过去的经历来展现自己的正式方式是必不可少的。
- 额外的部分——这是你向读者展示你自己一些令人敬畏的东西的部分。可能是你的数据科学项目、YouTube 视频、技术社交活动、过去的一些显著成就等等。
我喜欢极简主义的方法,这是我网站模板选择和设计的主要基础。
所以我计划在主页上简单介绍一下我自己,当你滚动的时候,你会看到更多的细节。在你对我有了一点了解之后,下一个计划是展示我做过的最引人注目的事情(目前,这些是我发表在 Medium 上的文章)。像简历和数据科学项目等其他部分都在主页后面。
首先,我觉得如果你决定在你的个人资料中展示什么样的东西会很棒。对我来说,是三件事——我的媒体文章、我的简历和项目。这样,概览就完成了。
注:我按照这个 YouTube 教程得到了网站的初始框架并开始运行,然后根据自己的喜好进行了修改。
网站模板
这个网站有很多免费使用的 HTML 模板,我选择了一个叫做的流行模板。从网站上下载 zip 文件就可以了。
接下来,转到 GitHub 并创建一个与您的用户名同名的存储库。然后,将存储库克隆到您的计算机上,并将其添加到您最喜欢的代码编辑器中(为此我使用了 VSCode)。如果你对这一步感到困惑,请查看本教程。
打开 VSCode 并将模板内容解压缩到 GitHub 存储库中。它应该看起来像这样—

GitHub 回购概述(作者照片)
index.html、generic.html和elements.html是你最常编辑的三个文件。
不要让 HTML 吓倒你。很容易征服!
你应该知道的 HTML
你需要理解一些简单的 HTML 命令来按照你的要求编辑文件。我花了很多时间学习这些东西,下面是一些可能对你有帮助的重要提示
- HTML 元素使用看起来像
<this>的标签。这些标签成对出现,每一个开始<tag>都有一个结束</tag>。 - 大多数标签都是不言自明的,如
<title>、<article>、<header>等。 <div>是一个 division 标签,用于在网站中制作不同的版块。你会在代码中看到很多。- 标题标签表示为
<h1>到<h6>,其中<h1>是最大的标题,<h6>是最小的标题。 - 使用
<ul>标签创建列表,列表中的每个元素都使用<li>标签。对于编号列表,使用<ol>。 - 使用
<a href=”[https://rohithteja.github.io/](https://rohithteja.github.io/)”>标签添加超链接。 - 使用
<p>标签添加段落。
上面提到的 HTML 元素将帮助您编辑存储库中的.html文件。
来到 CSS,就把它当成 HTML 的帮手吧。你用 HTML 编写网站,CSS 负责网站的布局、字体和一般表现。HTML 和 CSS 携手合作,使网站建立和运行。
我没有修改太多的.css文件,但是我使用了一个叫做 Flexbox 的特殊项目,它基本上将网站的一个较大的部分分成较小的子部分。想象一下,一个大的集装箱箱装着多个较小的集装箱——这就是 Flexbox。我用它将我的照片和文字并排放在关于我的部分。
.image-txt-container {
display: flex;
align-items: center;
flex-direction: row;
gap: 40px;
@media (max-width: 500px) {
#wrapper {
flex-direction: column;
}
#right-content {
display: flex;
}
section {
flex: 1;
}
}
}
上面显示的代码片段被添加到main.css文件中,在.html文件中,您使用了<div class=”image-txt-container”>标签。
HTML 嵌入
您可以将外部链接(如博客、视频或其他来自不同网站的内容)嵌入到您的作品集网站中。我在媒体上写文章,这是我想在我的网站上展示的东西。不幸的是,如果不经过复杂的过程或使用一些付费服务(为您策划外部嵌入),我无法轻松嵌入媒体文章。
幸运的是,我通过使用 Twitter 找到了一个解决方法。每次我在 Medium 上发表一篇文章,我都会在推特上发布。而且嵌入一条推文是非常容易的,只需点击下面照片中的</> Embed Tweet 选项就简单了:

Twitter 嵌入(作者照片)
然后,将提供的嵌入代码直接复制到.html文件中。我使用了嵌入在<article>标签中的 Twitter,将它们显示为网站上的方形部分。
包装它
使用最基本的 HTML 知识,您现在能够编辑存储库中的.html文件。我忘了说,你可以改变网站的背景图片。您需要用您选择的图像替换images/bg.jpg,这样才能工作。
一切设置好后,提交并推送回购到 GitHub。现在该网站将被部署到https://your-username.github.io/
恭喜你。您已经成功部署了您的作品集网站。
如果你希望使用和我一样的网站模板,你可以下载我的库并根据你的喜好进行修改。我目前的作品集网站看起来不错,但我承认仍有改进的空间。欢迎给我任何改进网站的建议。
感谢阅读,干杯!
**Want to Connect?** You can reach me on [LinkedIn](https://www.linkedin.com/in/rohithteja/), [Twitter](https://twitter.com/rohithtejam), or [GitHub](https://github.com/rohithteja).
我如何使用 Python 开发一个全功能的采购应用程序
输入采购订单,将其发送给供应商,并在您的仓库中接收产品

克里斯蒂安·柯普克在 Unsplash 上拍摄的照片
谈到数据,Python 是最著名的语言:从数据集成到分析再到预测。考虑到它是开源的,开发者正在开发新的库,引入新的功能。其中一种能力是开发新的应用程序。
在本文中,我将解释如何使用 Python 开发一个全功能的采购应用程序。
在我们深入研究应用程序开发组件之前,让我们了解一下购买流程的总体流程。
- 贵公司输入采购订单
- 它将采购订单发送给公司的供应商。同一采购订单的副本被发送到您公司的仓库。
- 供应商将货物运送到公司的仓库。仓库根据他们在上述步骤中获得的采购订单接收货物。

图:采购流程
采购应用程序至少需要以下组件:
- 用于输入新采购订单和查询现有采购订单的采购应用程序。
- 发送给供应商和仓库的采购订单报告
应用开发
在开发 python 应用程序时,有许多可用的库和框架。下图显示了基于应用程序类型的可用 python 框架列表。

Python 库和应用程序开发框架
如果你是 Python 新手,我建议使用 Tkinter 框架。它易于使用,并且正是您开发桌面应用程序所需要的。我用它来开发采购应用程序。
我的采购应用程序有一个包含三个选项卡的屏幕
- 采购订单查询:在此页签查询已有的采购订单。在以下字段中输入任意值,并在同一屏幕上显示匹配的 PO 详细信息。
- 采购订单编号(PO#)
- 供应商编号(供应商编号)
- 采购订单日期
- 供应商名称

采购订单查询屏幕(图片由作者提供)
2.PO 题头:在此标签中输入采购订单题头详细信息。采购订单标题详细信息包含以下字段。
- 采购订单编号(PO#)
- 采购订单日期(PO 日期)
- 供应商编号(供应商编号)
- 供应商名称
- 交货地址详细信息
- 供应商地址详细信息

采购订单标题屏幕(作者图片)
3.PO 行:输入采购订单行详细信息。采购订单行包含以下详细信息。
- 项目
- 量
- 单价
- 数量
以及其他细节。
让我们来看一下开发这个带有选项卡的屏幕的代码。
以下代码片段包含用于开发 PO 查询屏幕的 Python 代码。
让我们来理解代码。
下面几行是从 Tkinter 框架导入所需的库。

我正在 Oracle 数据库上开发这个应用程序。下面一行代码将应用程序与 Oracle 数据库连接起来。

如果您想了解更多关于连接 python 应用程序和 Oracle 数据库的信息,请参考下面的文章。
下面一行代码创建一个标题为"采购订单申请的窗口,并在该窗口上创建三个标签:采购订单查询、采购订单标题、采购订单行

下面一行代码将采购订单编号、采购订单日期、供应商编号、供应商名称字段添加到采购订单查询选项卡中。

添加 window.mainloop()以显示您的窗口。

从参考列表中提到的 Github 位置获取完整的代码。
拟定报告
Python 提供 reportlab,用于开发图片完美的专业报表。下面是使用 reportlab 库开发的采购订单报表的图像。

采购订单报告(作者图片)
下面的代码片段显示了该报告背后的代码。
让我们来理解开发报告的代码。
前几行代码导入 reportlab 库和 cx_Oracle 以连接数据库。

在这里,连接到 Oracle 数据库并打开两个游标:一个包含采购订单标题信息,另一个包含采购订单行详细信息。

接下来,创建一个变量徽标,并指定徽标图像在计算机上的存储路径。

现在用采购订单标题信息打开一个循环。使用报告文件名(podcname+调用 SimpleDocTemplate。pdf)以及带有边距细节的报告的大小。在我的例子中,报告文件名由供应商编号——采购订单编号——报告创建的日期组成。
下面代码片段中的最后一行打开了一个空的数组故事。

报告数据将被添加到该空数组中,并且该空数组将作为段落添加到报告中。
在代码行下面,将日志添加到报告的右上方。

下面几行代码创建了一个包含送货地址详细信息的数组,然后将该数组数据添加到 Story 数组中。

同样,下面一行代码将 PO 行细节添加到 polintab 数组中。

下面几行代码用 polintab 数组数据在报表上创建一个表。
注意:与 python NumPy 数组不同,reportlab tab 先有列,后有行。因此,“ALIGN”,(3,0),(5,-1),“RIGHT”表示从第 3 列到第 5 列右对齐数据。

最后,下面一行代码将 polintab 表添加到 Story 数组中,并在报表上显示该表。doc.build(Story)用故事数组数据构建报告。

结论
使用 Python 在 Oracle 数据库上开发应用程序和报告非常有趣。Python 是一种具有无限可能性的语言,我们正在探索这些潜力的旅程中。
虽然本文展示了如何开发采购应用程序,但是这些步骤也可以用于使用 Python 开发任何类型的数据库应用程序。
期待您的反馈!
参考
https://www.reportlab.com/docs/reportlab-userguide.pdf
https://github.com/srssingh/Purchase-Order-Application.git
如何使用 Python 开发企业文档管理应用程序
客户发票管理应用程序

卡罗琳娜·加西亚·塔维森在 Unsplash 上的照片
Python 是数据科学和机器学习领域最著名的语言。然而,它的魔力并不止于数据科学和机器学习相关的应用。它一直让我惊叹我们可以用它实现什么。这篇文章是关于 Python 的一个惊人的应用。
要求
作为一名系统集成专家,我从事过各种 IT 领域的工作——有些看起来过时了,有些则是世界顶级的——打包过 ERP 和商业智能应用程序。我的大部分时间都在获取需求,并将它们与这些打包应用程序提供的内容相匹配。
最近,我遇到了一个非常有趣的挑战。
我们把这个概括为一个虚构的公司。这家公司有许多后台应用程序。
- 一些办公室使用 SAP ERP
- 当地子公司使用 Oracle ERP
- 其服务机构使用 e-Automate
这些应用程序都有内置的订购、运输、服务和发票功能。这些应用程序都可以生成发票并将其发送给客户。问题是,客户从同一家公司获得了来自不同应用程序的不同产品和服务的单独发票。客户希望一张发票列出公司的所有产品和服务。
体系结构
当这个需求来到我面前时,它让我想知道我是否可以使用 Python 来做这件事。
答案是一个大大的“是”。
我们是怎么做到的?
我们要求每个应用程序的所有者将 XML 格式的发票发送到中央计算机。我们编写了一个基于 python 的应用程序,运行在这台中央计算机上,扫描这些文件。它每隔几分钟扫描一次文件,将每个客户的文件整合成一个 XML 文件,创建 pdf 格式的发票,将整合后的发票通过电子邮件发送给客户,还将发票的副本发送给公司的文档管理应用程序。
以下流程解释了整体系统架构和解决方案。

文档来源到存储和流通(图片由作者提供)
构建这个应用程序我们需要什么?
a.读取单独的 XML 文件:每个应用程序都在发送 XML 格式的文件。我们需要一个文档对象模型(DOM)接口来读取这些 XML 文件。Python 最小 DOM 实现 minidom 完美地满足了这一需求。
b.创建合并的 XML 文件:在读取来自不同应用程序的 XML 文件后,下一个任务是将它们合并到一个文件中。用于创建统一 XML 文件的 Python 框架。
c.创建 pdf 格式的发票:到目前为止,我们读取了不同的 XML 文件,并将它们合并成一个 XML 文件。下一个任务是创建 pdf 格式的专业发票。Python 框架 reportlab 完成了这项工作。如果你想知道什么是 reportlab,这里有来自网站的描述。
ReportLab 是久经考验的超级强大的开源引擎,用于创建复杂的数据驱动的 PDF 文档和自定义矢量图形。 它是免费的 ,开源,用 Python 写的。
d.通过电子邮件发送发票:创建了 pdf 格式的发票后,就可以通过电子邮件将它们发送给客户了。python 框架 smtplib 和 email 通过公司的 SMTP 服务器将发票通过电子邮件发送给客户。
设计
在上面列出的四项主要任务中,最耗时的是创建 pdf 格式的发票。该公司对发票布局和发票上打印的信息量有非常严格的指导原则。一些关键的设计限制。
- 客户帐单寄送地址和送货地址应该只在第一页打印一次。
- 小字应该只印在最后一页。
- 发货产品的序列号应与产品发货和发票明细一起打印在发票行上。
- 根据收货地址、省份和税码,会有所不同。应相应地打印明细税码和税额。
- 生产线上的任何特殊说明都应打印在生产线部分。
与此类似,几个要求使得整个发票布局成为一项困难的任务。
下面是发票的整体布局。

文档示例(图片由作者提供)
发展
现在您已经理解了需求和总体设计,是时候更深入地研究组件开发了。让我们来看看这个应用程序的主要组件。
步骤 1:读取 XML 文件
第一步是扫描每个应用程序的 XML 文件被发送到的文件夹。
- Python 库操作系统可用于监控文件夹中的传入文件。
- 文档对象模型接口 xml.dom 的 Python minidom 模块可以用来解析每个文件中的 xml 数据。
下面是扫描文件夹下的文件,然后解析文件中的 xml 标记值的示例代码。
步骤 2:编写 XML 文件
读取 XML 文件后,下一步是将数据合并到一个 XML 文件中。Python 包 yattag 非常适合创建 XML 文件。
下面是使用 yattag 包创建 XML 文件的代码片段。
步骤 3:发票创建
这是项目的核心,也是最耗时的任务。这项任务包括读取 XML 文件以及创建 pdf 格式的发票布局。
创建发票的第一步是导入 reportlab 的 pdfgen 包并实例化一个 Canvas 对象。创建对象时提及页面大小和文件名。一旦创建了 canvas 对象,您就可以像画家在画布上绘画一样开始构建内容。
在向画布添加内容时,确保选择合适的字体并提到 x 和 y 坐标。下面是创建对象和创建上述发票的前几行的代码片段。
从文件中选择徽标,并通过 canvas 对象 invcanvas 的 drawImage 方法将其分别放置在画布上的 x 和 y 坐标 20 和 760 处。
到目前为止,一切顺利。当你不得不把价值放在画布上的特定位置时,乐趣就开始了,但是内容和它们的总大小可能会随着每张发票而变化。例如,打印买方地址和收货地址。
reportlab 的 getSampleStyleSheet 包最适合此类任务。将内容放在 ParagraphStyle 中,将它们放在一起并打印到画布上所需的位置会变得更容易。
下面是示例代码。
同样,发票的所有其他内容都是在发票画布上创建的。关键的部分是将它们放置在正确的坐标上,没有任何重叠。
第四步:发电子邮件
Python 电子邮件模块可用于通过电子邮件发送发票。下面的代码显示了自定义函数 psendmail,它使用 Python 电子邮件模块和 MIMEmultipart 模块来编写电子邮件主题、正文并以附件形式发送发票。
结论
Python 是一种多用途的开源编程语言,可以与数据科学和机器学习一起用于应用程序开发。使用 Python 开发文档管理应用程序非常有趣。
我期待您对本文的反馈,以及您在工作中是如何使用 Python 的。
参考资料:
https://docs.python.org/3/library/email.html
https://www.reportlab.com/opensource/
【https://www.reportlab.com/docs/reportlab-userguide.pdf
我是如何发现数据科学中有效沟通的力量的
发现新事物时学到的经验教训

2021 年 4 月,我决定辞职。我离开了一家大公司,希望有机会在一家小公司担任新的职务。当时,我知道这是一个冒险的举动。我清楚地记得那一天。我坐在椅子上,面对着我的大窗户,打开了我的变焦电话相机。那个星期四,我和我的经理进行了 1:1 的会谈。当我等待他进入焦点时,一千个想法在我眼前嗡嗡作响。“早上好,你好吗?”他以他惯常的、风度翩翩的方式说。当我盯着镜头时,我笨手笨脚地寻找着这些词,当它们出现在我面前时,我看着他睁大了眼睛。他靠在椅子上,手捂着嘴。这是他最不希望我说的话。老实说,这是我在 1:1 会谈中最不想说的话。我心存疑虑,忧心忡忡,刚刚辞掉工作。到了 10 月份,我又在转换角色了。我受雇工作的原始合同即将结束,我决定是时候继续前进了。
寻找新的目标
回顾四月的那一天,令人不安,但也令人宽慰。一个月前,我和我的经理一起制定了推进职业发展的计划。我想进入管理角色,接管一个团队的领导权,并指导人们。所有这些事情听起来都很棒,我仍然想去做,但是代价是什么?没有一个很好的计划就快速前进并不总是最好的选择。我决定后退一步,更深入地探索我的技术技能,而不是强行进入管理角色。
在将近两年的时间里,我从一名与数据密切合作的数据科学家变成了一名团队领导,专注于保持我们的工具和 ML 平台的运行。正如我习惯的那样,我是我们团队的负责人,也是团队领导。在团队领导下,我为其他人分类问题、分配任务和分解问题。作为 MLOps 工程师,我负责自动化流程、了解工作流,并验证我们是否拥有解决问题的正确数据。但是随着这一切的发生,我觉得我不再做数据科学了。
越接近四月,我越觉得我的角色缺少了什么。当我想要开发分析和分析时,优先级将我推向其他需要我专注于 MLOps、工具开发和编排的项目。每当我试图进入机器学习和 NLP 时,另一个问题需要我的注意。没有学到自己想要的技能,反而变得停滞不前,很无聊。
在为期六个月的数据科学合同期间,我感受到了同样的 meh 感。我意识到我最喜欢的工作是在数据工程和数据科学团队之间。我喜欢从更广阔的视角看问题,理解端到端的流程。我喜欢在数据科学平台上工作,而不是直接从事数据科学。我在之前的工作中并不是因为我认为我想要发展的技能而沮丧,而是因为没有被听到。
在这个转变中,我意识到领导力并不意味着拥有团队领导或经理的头衔。
- 领导力意味着你可以在个人的旅程中影响和引导他们。
- 领导力有助于设定方向,推动愿景向前发展,从而改变你的团队或组织。
- 领导力在一个项目中步步为营,并承担更多责任推动项目向前发展。
我学到的是领导力不是一个头衔。这是一种你可以以多种不同方式运用的技能。我没有找到完美的头衔,而是在我的角色中找到了成为领导者的新方法。
重新学习沟通
换成六个月的合同让我明白了领导力和沟通有多种形式。我参与的项目由 3 个人组成,与我一起工作的 13 人数据科学家团队和更多的数据和软件工程师有很大的不同。我不再写工作说明书给顾问去执行。相反,我是执行这项工作的顾问。当我转行做咨询时,我学到的主要东西是沟通的重要性。
根据业务目标和为业务提供的价值来交流技术工作是一件很难掌握的事情,但却是一项需要掌握的关键技能!
在我的上一份工作中,沟通极大地帮助了将数据科学和数据工程团队聚集在一起。向利益相关者传达结果和方法是非常不同的。我不再与工程师谈论本质细节,而是为商业人士、研究人员和分析师量身定制我的讨论。
这些人对我的工作很感兴趣,他们希望我为他们解决一个问题,同时也了解如何解决的细节。他们想知道我的工作将如何转化为他们的业务目标,并为团队提供他们所寻求的价值。我注意到,对于一些数据科学领域的人来说,这是一项复杂的技能。能够做技术工作是极好的,但是学习交流是困难的。
我在这次经历中学到的一些重要经验包括:
- 如果你发现你目前报告结果的方式不起作用,寻求反馈并调整你的方法。例如,如果你正在展示度量标准,确保它们是你的涉众想要看到和理解的。确定与其业务需求和兴趣相关的最佳指标。
- 尝试不同的沟通方式,并根据您的使用案例混合您的风格。你可以使用电子邮件、PPT 演示、技术讲座、办公时间、调查等方式与你的业务伙伴合作。通过反复试验,你会知道什么对你的人最有效。再次,寻求反馈。这是学习和提高沟通技巧的好方法。
- 练习。这听起来像是常识,但通常我们可以跳过它。尽可能多的练习你的沟通技巧。如果你不经常有演讲的机会,自愿去做报告或演示。尽你所能利用这些机会继续提高。如果可能的话,请别人听你的演讲或演示,并在最后提供反馈。
最后的想法
生活以一种有趣的方式告诉我们何时何地需要我们。当我们进入新的一年时,请记住:
- 没有一个很好的计划就快速前进并不总是最好的选择。花些时间慢下来,想想你的职业发展。你要的是什么你错过了什么?
- 领导并不意味着拥有特定的头衔。通过与个人沟通、影响决策并引导他们沿着自己的道路前进,你可以在自己的角色中找到领导力。领导力不是一个头衔。这是一种技能。
- 有效的沟通是一项具有挑战性但很有价值的学习技能。花时间去理解你的业务目标,以及你的工作提供了什么价值。找时间练习你的沟通技巧,包括书面和口头的。
你最近有没有职业上的变动?关于你自己和你的旅程,它教会了你什么?
感谢阅读!我希望你喜欢阅读我所学到的东西。如果你愿意,你可以通过这个链接成为一名灵媒来支持我的写作。
我是如何在没有全职工作经验的情况下找到我的第一份数据分析工作的
学习永远不会太晚&忘掉那份被书签标记的工作吧!

大家好,我是 Rashi, 蓝十字蓝盾 的 数据分析师 ,来自芝加哥,这里有一个关于我在没有全职工作经验的情况下获得第一份工作和其他工作机会的故事。
在当今不断扩展的技术世界中,每天都有新的工作职位发布在公司门户网站上,在向终点线的赛跑中,候选人被迫申请任何一个工作职位,希望能够获得一个职位。这对刚毕业的学生或转行的人来说尤其困难。
商业书籍期望新员工从第一天起就开始为组织增加价值,而没有人会给你一份没有经验的工作,没有工作你就无法获得经验。现在,如果你正在考虑一个大的职业改变或者毕业后找工作,如果你想知道:我有机会被雇用吗?
简单的回答是肯定的。雇主(如果不是全部的话)将会对雇佣你持开放态度,即使你之前没有任何工作经验。这篇博客就是我的故事,来解释这是如何可能的——帮助我获得这份工作的东西!
1.从事(许多)不同的项目
当我在 2018 年开始学习数据科学时,我转向了一次培养一项技能,现在作为一名全职的数据专业人员,我可以说,掌握任何数据的最有效方式是通过跨技能进行大量项目。如果您正在学习 Python,那么在此之后学习 SQL,然后是 R,然后是 Tableau,当您继续学习更多技能时,在项目中学习添加到您的个人资料中的技能。
深入学习概念、它们的用例、它们的实现以及问题的故障排除。还有什么比在学习数据科学的同时建立一个惊人的投资组合更好的呢?从情绪分析到复杂的 Tableau 仪表板,从图像识别到预测建模,做任何您感兴趣的事情!任何东西都不会浪费。
考虑认证,你有一个顶点项目就在那里!你可以学习技能,磨练重要的数据分析技能。接触你的网络、企业或从事自由职业项目,做一些接近真实世界的分析工作。
最重要的是用企业需要的技能来武装自己,而不是一边找工作一边学习课程。
2.实习经历
实习无疑是获得现实世界数据分析经验的最佳途径。没有一个项目或证书能像实习一样让你做好全面的准备。获得好的实习机会的最大好处是你在实习结束时得到了一份全职工作(对大多数公司来说),即使他们不能承诺给你一份全职工作,这种经历也是值得的。
我在百事可乐实习了一个夏天,然后在研究生院实习了两个学期(2020 年秋季和 2021 年春季)。商业头脑,将数据与业务相结合,组织行为,团队建设,沟通技巧,实习为我做好了准备。
实习确实是填补数据技能缺口的最佳方式之一,一旦你开始全职工作,你就会意识到数据分析领域可转移技能的价值。
我知道许多同龄人和朋友没有获得实习机会,原因是没有提前开始准备。最终,每个人都会在一两天后找到一份工作。如果你问我,倒计时从你决定以数据为职业的那一天开始。认证、编码实践、从事新项目、发表论文或沉迷于与数据相关的活动(如写博客)——这些为你建立了基调,甚至在你的全职工作面试时也能帮助你。
3.建立关系网和有一个导师
关于网络的看法是胡说八道(废话的更好的说法)。对大多数人来说,人际关系网是关于获得推荐或打开更多工作的大门,与招聘经理联系,但人际关系网是关于获得行业期望的知识,招聘经理在理想的候选人身上寻找什么,参加谈判课程。你交往的人总是会给你一两条建议。
我总是专注于与和我未来 5 年想成为的人相似的专业人士建立关系网,并问一些问题来帮助我转向正确的方向。
有一个导师是你明确目标的下一步。你可能相信也可能不相信他们所有的价值观,但导师真的可以帮助你导航,并为残酷的工作世界做好准备。这个人可以是任何人——你的教授、实习经理、学校的同事,或者你在参加了同一个聚会后通过 LinkedIn 联系的人。
我从来没有感觉到被外力推动,然而,人们说的事情一直伴随着我,在我实习期间与某人的一次随机联系中,我的导师说了这样的话—
“企业每天都会遇到新问题,但作为一名数据专业人员,了解自己喜欢做什么很重要,更重要的是,了解自己不喜欢做什么”
4.确定你的激情
根据导师给我的建议,我在实习快结束时开始探索我喜欢做什么,并确保通过简历表达出来。不是每个人都适合做数据科学家,只是因为每个人都在做,并不意味着你也必须这样做——我申请的 90%的工作申请都是数据分析师的角色。
我倾向于担任一个角色,在这个角色中,我可以将数据用于业务——用于更明智的决策,虽然这些话听起来像行话,但请相信我,当我说你真的可以在工作中用数据讲述一个故事。**
从做项目,获得认证,实习,人际关系网,到阅读新的技术(聚光灯下的数据),让你更好地理解工作角色的需要和要求,10000%将你从拒绝的沮丧中解救出来。
你不需要申请 500 个角色!
经验教训
如果你想开始一份新工作,动手实践和应用实际接触是脱颖而出的精髓。这相当于你从真实工作经历中获得的自信。
- 你必须学习并适应至少一种编程语言
- 理解不同的机器学习算法及其使用案例
- 以 盐海 作为职位描述
- 去那些你的工作能产生重大影响的成长型公司,而不是在一家影响不大的大公司工作
这就是我的博客的结尾。感谢您的阅读!请在评论中让我知道你的数据之旅以及 2022 年的目标!
如果你喜欢看这样的故事,可以考虑从这个 链接 注册成为一名中等会员!
数据帐篷快乐!
Rashi 是一名来自芝加哥的数据奇才,他喜欢将数据可视化,并创造富有洞察力的故事来传达商业见解。她是一名全职的医疗保健数据分析师,周末喝一杯热巧克力,写一些关于数据的博客……
调整人工神经网络:使用 KerasTuner 和其他基本数据分析技术优化多类文本分类器
探索如何通过将简单数据和/或 NLP 技术与使用 KerasTuner 超波段算法的人工神经网络超参数调整相结合来提高基于文本的模型的性能

在我之前的一篇关于使用 Keras 预测情绪的多类文本分类的文章中,我比较了使用 skipgrams 为深度文本分类器提供预测情绪的学习单词嵌入的结果,以及另一个从零开始学习嵌入的深度文本分类器的结果。从零开始学习嵌入的人工神经网络分类器比另一个稍微好一点,在本文中我将把它作为我的基线。
在这里阅读上一篇文章:
在这次重新访问相同的数据集时,在 Kaggle 这里和拥抱人脸数据集这里,上公开可用,我将尝试改进模型,在未见过的数据集上的加权平均召回率为 81%。
在下图中,报告了模型在测试集上的性能。这里,模型 1 是指经过训练的带有 word2vec 嵌入的模型,模型 2 是指经过训练的没有 word2vec 嵌入的模型。回忆那次回忆😏在这个用例中很重要,因此得出结论,第二个模型表现稍好,因此,模型 2 是本文的基线。

我上一篇关于测试数据集的文章中的两个模型的性能
让我们从列出模型改进的 5 大推荐技术开始:
- 追加更多的数据,最终给一个 ML 模型更多的例子来学习和归纳。
- 特征工程用于从给定数据中提取有用的信息,使模型能够轻松有效地找到预测模式……以及特征选择用于处理 GIGO 问题。基本上,这允许模型只使用一些有用的特征,去除噪声,并节省计算时间和资源。
- 尝试多种算法找到最适合预测的算法。
- 使用交叉验证获得一个稳健且通用的模型。使用交叉验证,您可以在数据集的多个块上训练和测试模型的性能,获得平均性能,并确定模型是否处于最佳状态。
- 调整超参数以识别适合数据集的最佳组合,因为它们对模型训练过程的结果有着关键的影响。
现在…让我们开始编码吧!😄
1。修改了数据策略 —在前一个中,我使用了 2/3 的数据进行训练,并保留了 1/3 的数据进行验证。在这一次,我使用整个 train.txt 进行训练,并在模型训练期间使用验证集来验证和改进模型性能。
2。文本清理和规范化 —以前,我直接使用文本数据,没有清理和规范化它。在这一次,我删除了停用词,并使用波特斯特梅尔获得了词干。它将 vocab 的大小降低到 10375。
3。作为引子,我重新设计了模型,降低了辍学率,并增加了两个 LSTM 层的单元数量。此外,由于前一步骤中的清洗,vocab 大小从 15000 变为 10000。此外,除了 LSTM 之外,我还试用了 SimpleRNN 和门控循环单元。
…并告诉模型应该关注哪些指标。
之前,该模型是使用度量标准''编译的。由于我们正在处理一个不平衡的数据集,准确性不是正确的衡量标准。精度和 / 或召回更好。我之前选择了查全率而不是查准率,但是无论如何我都想提高两者,所以我将它们指定为评估模型的度量标准。还要注意的是,F1-score 在 Keras 中不是现成的指标,所以为了简单起见,我在列表中直接使用了 precision 和 recall。
修正模型性能评估:
当我更新这些配置时,模型性能有了显著的提升。看看下面 LSTM 模型的性能

使用更新的超参数和 LSTM|作者图片对训练、验证和测试集的性能进行建模
回想一下我们的加权回忆😉基准模型在测试数据上的准确率为 81%,而在相同数据上的准确率提高到 89%。测试数据中实例数量最多的三个类的召回率等于或高于 90%。
接下来,我想尝试简单和 GRU 以及其他 RNN 层。GRU 在测试数据上的性能与 LSTM 相似,对测试数据的召回率为 90%,而 SimpleRNN 为 81%,相当于基线模型!

使用 SimpleRNN 和 GRU 的更新超参数在测试集上建模性能|图片由作者提供
SimpleRNN 的性能很差,因为模型明显过拟合。这是模型的训练验证损失曲线-

蓝色曲线是训练损失,红色曲线是验证损失|作者图片
注意,重叠发生在时段 4,并且验证损失在时段 7 之后继续改善。之后,验证损失开始变得不稳定,时有增减。早期停止算法使用耐心 5,并且由于验证损失的这种不稳定性,模型继续训练,最终挑选时段 19 作为最佳时段。这也是由于我在代码epochs=20中设置的限制。如果我设置了超过 20 个时期,模型将会多训练 5 个时期。显然,这个模型不能对测试集或任何由分类报告显示的看不见的数据进行归纳。
此外,模型的训练时间如下:
- LSTM—6 分钟
- 简单神经网络—19 分钟
- GRU—8 分钟
显然,简单神经网络的训练时间较长,但 LSTM 和 GRU 模型的训练速度较快。
最后,这是 LSTM 模型在测试数据上表现的混淆矩阵:

LSTM 模型在测试数据上表现的混淆矩阵|图片由作者提供
这个模型仍然会在愤怒和悲伤、快乐和爱之间,以及在快乐和悲伤之间有点混淆!但是每类错误分类的百分比已经显著降低。
重温 5 大推荐技术:
- 追加更多 data✅ —自从我在训练时使用单独的验证集来验证模型性能以来,训练集现在有了更多数据。
- 特征工程和特征选择 ✅— I 清理并规范化了文本,并且 vocab 大小也从 15k 减少到 10k。
- 多种算法和改变的超参数✅ —我修改了模型的网络配置,并将改进的重点从准确度更新为精确度和召回率。我还测试了 SimpleRNN 和 GRU。
- 使用交叉验证❌
- 调整超参数❌
在测试数据上,这三个变化将模型的性能从 81%提高到 89% (LSTM)和 90% (GRU)。所以,是时候探索交叉验证和超参数调整了,看看会发生什么。
介绍 Keras-Tuner
Keras-tuner 是一个为您的神经网络模型找到最佳超参数集(或调整超参数)的库。
使用以下命令安装 Keras Tuner:
pip install **-**q **-**U keras**-**tuner
现在,在将文本数据准备成填充序列之后,使用 LSTM 进行调谐的模型构建过程如下:
KerasTuner 允许我们在构建模型时内联定义超参数。比如我用' vector size '作为超参数进行调优,指定它应该是一个整数 (hp。 Int ),其最小值为 100,最大值为 500。它将在搜索空间中以 100 的步长递增。
在 model_builder 函数中,我定义了五个超参数-
- vector _ size-Integer |范围 100 到 500,步长:100
- dropout_rate — Float |范围为 0.6 到 0.9,步长为 0.1
- lstm_units1 —整数|范围 32 到 512,步长:32
- lstm_units2 —整数|范围 16 到 512,步长:32
- learning _ rate-Choice | 1e-2、1e-3、1e-4
超参数类给出了一些设计搜索空间的选择。我们可以指定一个超参数是否是布尔( hp。布尔型、整型(hp.Int |第 3、16、21 行)、浮点型( hp)。Float | line 11 ,几个选项中的一个选择( hp)。选择|第 27 行),或者一个固定值等等。
现在,我们已经定义了超参数搜索空间,这意味着 超模型 已经准备好开始调优了。为了找到最佳的超参数,首先我使用下面的代码实例化了调谐器:
为了实例化 Hyperband 调谐器,我为超级模型指定了以下参数:
- 超级模型:model_builder 函数
- 目的:超模型中描述的模型的损失函数。我在这个用例中使用了验证召回。
- max_epochs:训练一个模型的最大次数
- factor:一个整数,用于定义每个括号中模型和时期数的缩减系数。一个括号中训练的模型数计算为
rounded to nearest(1 + log**base**=factor(max_epochs)) - 目录/项目:在超参数调整期间记录每个试验的配置、检查点和分数
在第 11 行中,我添加了一个提前停止配置来监控验证召回。因此,在一个时期中实现最佳验证召回之后,该模型继续为接下来的 5 个时期进行训练,以进行任何进一步的改进。最后我在第 21 行开始了最佳超参数搜索。
超波段调谐器算法是如何工作的?
超波段调谐器是连续减半算法(SHA)的扩展,用于提前停止的自适应资源分配。
用于自适应资源分配的连续减半算法的工作原理可以概括为:
- 将所有资源统一分配给超参数集,并使用一半的资源/时间对它们进行调优。当运行调谐器时,这种策略就显现出来了。请注意,初始模型训练了大约 3 或 4 个时期,这远远低于指定的最大时期数。
- 性能最好的上半部分超参数集随后被“推进”到下一阶段,在该阶段,使用分配给它们的更高资源/时间来训练结果模型。在运行调谐器时,接近尾声时,这就是 epochs 数较高的原因。
- 重复直到只有一个配置。
这种算法被调整了一点,使其更灵活的超波段调谐器。它使用η,η是消除率,其中只有 1/ η的超参数集前进到下一个括号用于训练和评估。η由算法的这个 Keras 实现中的公式rounded to nearest (1 + log **base**=factor ( max_epochs))确定。
在原文的中阅读更多相关内容。
现在…回到代码上来
我用两个因子进行了实验:3 和 5,这里是最佳超参数值的结果。

使用因子 3 和因子 5 的优化模型的最佳超参数值|作者图片
接下来,使用最佳超参数来构建最终模型( line 2 ),我再次使用相同的旧 ANN 回调和训练代码来训练它。
结果如下:

在训练、验证和测试集上使用因子 3 和因子 5 的最佳表现模型的结果|图片由作者提供
这两个模型的性能相似,但是,在未知数据集上,整体性能比基线模型提高了 11%,尽管从最后一个模型来看,只有微小的提高。
和...我还使用 GRUs 重复了这个过程
以下是 model_builder 函数的更新代码:
超参数和模型对测试数据的性能是:

请注意,加权平均召回率与调整后的 LSTM 相同,而宏观平均召回率略有不同。然而,调整后的 GRU 模型的向量大小是因子为 3 的调整后的 LSTM 的两倍,是因子为 5 的的四倍。此外,GRU 网络单元比 LSTMS 的大,这表明如果与两个调整的 LSTM 模型相比,该模型将占用更多的内存。
这些模型不会过度拟合吗?
过度拟合是指模型从训练数据中学到了太多东西,无法对看不见的数据进行归纳,而欠拟合是指模型没有学到足够的东西,无法从新数据中得出有效的结论。
这是最终模型的训练和验证损失图。在这两个图中,我们可以看到随着时代的增加,训练损失越来越低,模型变得过度拟合。

使用因子=3 调整的模型|图片由作者提供

使用因子=5 调整的模型|图片由作者提供
因子=3 的调整模型的验证损失在 0.25 和 0.28 之间波动,而另一个模型的验证损失停滞在 0.22 左右。如图所示,模型的过度拟合确实会影响验证损失。在第一种情况下,在两个损失相同的第 4 个时期之后,训练损失减少,而验证缓慢增加。然而,该模型被训练到第 8 个时期,在该时期验证损失最低,即模型的概括能力最高。然而,在第 8 个时期的模型具有过度拟合的风险,因为验证损失不遵循增加的模式,并且在最佳时期的值是突然下降的(因此基本上它就像一个异常值)。
如果我不得不选择… 放弃调整后的 GRU 模型,因为它对未知数据具有相同的性能,但对计算使用了更多的内存,我宁愿选择 LSTM 模型之一,如果我专注于资源和计算方面,最好是因子为 5 的模型。召回的宏观和加权平均值在测试集上对于系数为 5 的 LSTM 来说是高的,因此我会选择这个。此外,最佳历元处的训练损失和验证损失之间的差异对于该模型来说更低(…并因此降低过拟合的机会),为 0.05(0.21-0.16),而对于另一模型来说为 0.09(0.23-0.14)。此外,对于系数为 5 的调谐 LSTM,交叉点处的训练损失与最佳时期之间的差异也较低。
然而……在所有的调整、搜索和提炼之后,最好的模型仍然对 love❤️和乔伊感到困惑😄如下图所示:

使用因子=3 调整的 LSTM 模型的性能|图片由作者提供

使用因子=5 调整的 LSTM 模型的性能|图片由作者提供

调谐 GRU 模型的性能|图片由作者提供
…但是与我们基线的热图相比,后者看起来肯定更丰富多彩,这表明错误分类率更高:

基线模型的性能|作者提供的图片
结论:
最后,回顾一下模型改进的前 5 个最常用的方法,我现在是 4.5/5。
- 追加更多 data✅
- 特征工程和特征选择 ✅
- 多重算法和被改变的 Hyperparameters✅
- 交叉验证❌验证✅
- 调整超参数✅
结果是,在测试数据集上,宏召回率从 74%提高到 86%,加权召回率从 81%提高到 90%。
列表中唯一遗漏的是交叉验证,但是,一个验证集已经用于验证模型在训练时的性能。与 Sklearn 的超参数调优实现不同,KerasTuner 没有实现 CV,我在文档中找不到任何关于它的内容。此外,为了执行交叉验证,我可能必须混合训练和验证数据,以使用 K-fold 交叉验证(CV)技术。KerasTuners 中的 Sklearn 调谐器提供了该选项,但要调谐的型号应该是 sklearn 型号。希望在另一个博客中探讨这个问题!💡

在 Unsplash 上由Courtney hedge拍摄的照片
资源和代码:
本博客使用的笔记本: 车型改进笔记本 | 使用 Keras 调谐器的车型改进 (LSTM)| 使用 Keras 调谐器的车型改进(GRU)
使用的参考资料和进一步阅读:
- https://www.tensorflow.org/tutorials/keras/keras_tuner
- https://keras.io/api/keras_tuner/tuners/hyperband/
- https://jmlr.org/papers/volume18/16-558/16-558.pdf
- https://analyticsindiamag . com/speed-up-hyperparameter-tuning-in-deep-learning-with-keras-hyperband-tuner/
- http://www.argmin.net/2016/06/23/hyperband/⭐
- https://blog . ml . CMU . edu/2018/12/12/massively-parameter-optimization/⭐
- https://machine learning mastery . com/learning-curves-for-diagnostic-machine-learning-model-performance/
数据集引用:
[1]萨拉维亚,刘,洪春涛,黄,杨海红,吴,陈永胜(2018)。 Carer:用于情绪识别的情境化情感表征。在2018 自然语言处理经验方法会议论文集(第 3687–3697 页)
hugging face 上的许可证:未知|ka ggle 上的许可证:CC BY-SA 4.0
感谢光临!
我如何在 4 个月内找到一份数据分析师的工作
原文:https://towardsdatascience.com/how-i-landed-a-data-analyst-job-in-4-months-96ee08944ea2
通过数据分析师面试指南

图片来自 Unsplash 上的 LinkedIn 销售解决方案
在疫情的鼎盛时期,我找到了第一份数据分析师的工作。作为一个没有什么经验的应届毕业生,这绝对是一个挑战。但是经过四个月的申请、面试和准备,我收到了多份工作邀请。在本文中,我将解释在这些面试中你可以期待什么,以及你如何才能最好地准备获得你的第一份数据分析师工作。
技术评估(SQL、R、Python)

图片由卡斯帕·卡米尔·鲁宾在 Unsplash 上拍摄
大多数数据分析师面试都包括一项技术评估,以测试你在相关语言(如 SQL、Python 或 r)方面的编码能力。评估要么现场进行——在面试官面前解决问题——要么通过带回家的作业进行。我经历了更多的现场采访,这是一种不同于作业的体验(稍后会有更多的介绍)。
SQL
在大多数数据分析师角色中,SQL 技能是必需的,因为您需要它来从数据库中检索数据。如果您不能提取数据,那么您就无法完成工作—没有数据,就没有分析。我面试的几乎每家公司都给了我一份 SQL 评估,通常是在初步筛选之后。那么,我到底是怎么准备 SQL 评估的呢?对我来说,解决 SQL 练习题是最有用的。 HackerRank 和 Leetcode 都是很棒的资源。HackerRank 上的简单级问题非常适合学习基础知识(即加入、聚合、过滤等)。).Leetcode 问题有点复杂。我发现,一旦我能够始终如一地解决 Leetcode 上的简单问题(目标是在 15 分钟内解决),我在 SQL 评估方面就没有问题了。我建议你在回答这些问题时大声思考,因为这在现场编码面试中是有望的。很多时候,面试官更感兴趣的是你如何表达你的思维过程,而不是你如何得出完美的解决方案。此外,如果你沟通清晰,面试官通常会提供提示,或者在你遇到困难时给你指明正确的方向。
除了帮助我通过 SQL 评估,花时间解决这些挑战对我目前的数据分析师角色来说也是无价的。虽然 Leetcode 问题的背景与我在工作中面临的不同,但我从解决这些问题中学到的技巧在工作中也是适用的。
Python/R
虽然我的技术评估中没有包含 Python 或 R,但我为它们准备了很多,因为这些工具对于任何数据分析师都是必要的。我喜欢网站数据营,因为它的游戏化学习方式。虽然像 Datacamp 这样的网站帮助我学习基本概念,但我只在从事项目工作后才对自己的编码能力感到满意,因为它让我能够在现实环境中应用这些概念。这就是为什么如果你是这个领域的新手,参与项目是很重要的原因之一(见下一节)。
建立投资组合

图片来自作者的作品集
对于那些几乎没有经验的人来说,建立一个投资组合是必要的。
拥有相关项目组合的一个好处是,它能让你的简历脱颖而出。因为数据分析是一个热门领域,所以你要和一大群候选人竞争。如果你是这个领域的新手,许多候选人会比你更有经验,所以建立一个作品集是让你的申请更有竞争力的一种方法。事实上,有一家公司主动联系我,因为他们对我的投资组合印象深刻,并希望讨论我的项目。
拥有作品集的另一个好处是它会在面试中给你更多的弹药。作为一名应届毕业生,我没有什么专业经验,所以有一个作品集让我在面试时有更多话题可谈。这也证明了我有能力解决问题,尽管我缺乏工作经验。
你应该做什么样的项目?我建议做一些原创的东西。所谓原创,我指的是一个项目,在这个项目中,你定义自己的问题,提取自己的数据,清理数据,然后分析这些数据——分析 Kaggle 的泰坦尼克号数据集不会让你脱颖而出。一个原创的项目不仅表明你有能力解决分析问题,还表明你对这个领域感兴趣,并且干劲十足。我已经联系了我的投资组合作为例子。此外,这篇文章可以帮你开拓项目思路。
对你的项目有深入的了解

准备好详细谈论你的项目。
在每次面试中,我都被要求谈论我参与的一个项目。大多数时候,面试官让我选择项目。在这些情况下,我选择了我最引以为豪的项目。首先对你的项目做一个高层次的概述(动机、目标、方法、结果等)。).面试官会问一些后续问题(你从哪里得到的数据,你面临的最大挑战等等。),所以要做好准备。能够回答后续问题将表明你是一个有效的沟通者,是数据分析师的一项重要技能,能够从头到尾承担一个分析项目。了解你工作的细节也能让你提供更详细的答案。例如,面试官可能会问你是否了解任何数据可视化工具。如果你能谈谈你利用 Tableau 构建仪表板的那段时间,而不仅仅是说是,会更有影响力。
行为问题

最后,不要忘记准备行为问题。根据我的经验,我面试的每家公司都会问我行为问题,而且通常是多轮。
为了做准备,我研究了面试中常见的行为问题,并大声练习我的答案。很明显,你不想记住一个脚本,但是,通过练习,你不太可能在面试中出错。试着想出与数据分析相关的回答,并提供例子来支持它们(参见 STAR 方法)。
结论

通过在上述领域做好准备,你应该能在几个月内找到一份数据分析师的工作。我再怎么强调准备的重要性也不为过,尤其是对那些缺乏工作经验的人来说。现实是,如果你缺乏经验,你将不得不提交许多申请才能获得成功——这就是我的经验。有鉴于此,你必须充分利用每一次面试机会。面试愉快,祝你好运!

图片由 Katrina Wright 在 Unsplash 上拍摄
我是如何在没有计算机科学学位的情况下获得亚马逊 SDE 实习机会的
或者解决数百个黑客排名问题…

皮奥特·奇霍斯在 Unsplash 上拍摄的照片
经过近 3 个月的实习,上周是我在亚马逊实习软件开发工程师的最后一天。这是一次很棒的经历,当我在一个令人兴奋的部门与一些伟大的人一起工作时,我学到了很多。由于签署了许多 NDA,我不能说太多我做了什么,但我可以说我开发了一个新工具,我希望我的团队在未来继续使用它。我做到了这一切,却没有一个 CS 学位,甚至没有参加一个编码训练营!
那么我是怎么得到这个实习机会的呢?在我申请之前,我是否解决了 500 个 HackeRank 或 Leetcode 问题?不要!事实上,在实习前的一年里,我总共只解决了 6 个黑客问题。在面试之前,我是否把所有的业余时间都用来学习数据结构和算法了?不要!在采访之前,我确实接触了一些数据结构,包括 Python 中的基本数据结构和一些抽象数据类型,但我并不完全了解它们,也不深入了解许多算法。我以前在亚马逊有没有熟人可以帮我说好话?不要!我甚至不认识任何在亚马逊工作的人,至少据我所知,所以我还没有一个“入”。让我告诉你我是如何得到实习机会的。
应用程序
不得不承认,当初向亚马逊申请,是以“我有什么损失”为前提的。我没有传统的计算机科学背景,因为我没有计算机科学学位,我甚至没有参加过编码训练营。我的本科学位是土地经济学(经济学、地理学和法学的混合体),离计算机科学很远,我当时甚至没有接触过 excel 中的宏。然而,从那时起,我继续完成了智能城市和城市分析的硕士学位,在那里我学习了地理数据科学的 Python、SQL 和 Javascript 的基础知识,我开始了高级空间分析的博士学位,使用 Python 为英国的杂货零售商构建重力模型。这意味着我能够在受教育期间发展一些编码和软件工程技能,但我不认为这足以让我在亚马逊获得一个角色。
考虑到这一点,在申请中,虽然我提到了我的教育背景,表明我已经学会了一些编程概念,但我不得不强调我的课外活动和一些“软”技能。这包括我作为我的一个硕士项目的团队的一部分建立的一个网站,在提交后,我将其转移到 AWS 。然后,我将这与后来的一份自由职业工作联系起来,那份工作是我和一个朋友一起为一个大学部门的校友网站构建后端工作流程。作为我的数据科学博客的一部分,我还强调了我在这里所做的大量工作,以及我作为 UCL 数据科学协会第一年代表和去年科学负责人的工作。这意味着我有许多实际的应用程序和项目,我可以指向它们,以表明我实际上可以做软件工程师的工作,或者至少我希望如此。
编码挑战
在一个月没有收到亚马逊的任何消息后,我放弃了,开始寻找其他实习机会。然而,又过了一个月,我收到一封电子邮件,说我被邀请去完成一项编码挑战,如果我愿意的话。我很惊讶收到这封邮件,但再次想到我没有什么可失去的,所以我留出两个小时来完成它,不可否认几乎没有准备,并尽我所能。
编码挑战本身由两个短挑战和一个长挑战组成,前者可以在 20 分钟内解决,后者需要 40 分钟左右才能解决。前两个是相对容易的 HackerRank 挑战,仍然需要考虑一些问题,以确保所有的边缘情况都被发现。在这一点上,他们声明他们不太关心代码质量,只要它能工作,这就是我尽最大努力实现的,通过所有提供的给定和隐藏的案例。然而,更大的问题要困难得多。我怀疑这是有史以来最干净的代码,我相信它可以用一种计算效率更高的方式来完成。我设法通过了所有给定的案例,但没有通过一些隐藏的案例,因为我没有时间来完成挑战。我按时提交了我的解决方案,心想虽然我做得不错,但可能没有达到要求的高标准,所以我就等着。如果我多练习,多了解,我能做得更好吗?可能是的,但是我现在对此无能为力。我只能等待。

面试
像编码挑战一样,我又等了一个月没有联系,所以我认为我失败了。我再次向前看,寻找其他机会,甚至在那段时间接受了另一份实习。然而,又过了一个月(总共两个月),我收到了一封电子邮件,邀请我参加面试,并在下周选择一个时间。下周!我没有为此做好准备,而且当我还在全职攻读博士学位时,我肯定不会在一周内做好充分准备。所以我定了一个日期,做了一些黑客问题,阅读了一些领导原则,然后接受了采访。
我现在认为,面试本身就是典型的亚马逊结构,首先询问领导原则,然后执行编码任务。我认为我在回答领导原则问题上做得相当好,我以星形形式给出了我的答案,并就每个问题谈了大约 15 分钟。然而,编码问题有点难。当我第一次听到我应该做什么的时候,我不知道从哪里开始。我没有惊慌,因为我知道那将是结束,所以我将任务分解成不同阶段需要做的笔记,同时向面试官解释我认为我必须做的事情。我确保对我不太确定的事情提出一些澄清性的问题,仔细检查我的逻辑,然后开始编码。
当我开始的时候,我解释每一句台词,大声地回顾我的思考过程。我的面试官在这段时间里大多很安静,有时会问我为什么要做我正在做的事情,但不会过多地影响代码。当我认为我已经完成时,面试官问了我几个关于代码或不同场景的问题,然后引出一些小的改进和调整,以达到最终的产品。在这一点上,我相信我提出了一个有效的解决方案,但不相信它是正确的,所以我认为我不会得到一个报价,下一次联系将是一个拒绝。
要约
一周后,我接到招聘人员的电话,说我收到了一份实习工作的邀请!我很惊讶!在大多数阶段,我都认为我失败了,但我很高兴收到了邀请。甚至有人告诉我,面试官想知道我是否想加入他们在另一个城市的团队!我对此很感兴趣,但由于我已经在伦敦扎下了根,并希望长期留在伦敦,我说我希望这次留在伦敦实习,但我对这份工作感到受宠若惊。他们说我想留在伦敦没问题,他们可以在那里找到适合我技能的部门。下一个问题是我什么时候开始,因为我已经有一个实习机会,我的博士资助伙伴只同意了一个实习机会,我必须连续实习 3 个月。我很幸运,因为我的博士资助机构说我可以同时实习,亚马逊对开始日期很灵活,我在利物浦的一次会议上发表演讲后,在开始第二次实习前只有三个月的时间。我将成为亚马逊的 SDE 实习生!

安德烈·亨特在 Unsplash 上的照片
关键要点
虽然我不能说我知道所有的答案,事实上每个面试和申请都是独一无二的,但我认为有几件事帮助我得到了这份工作:
- 我在各种不同的领域有一个项目组合。这展示了我可以从零开始创建一个项目,并经历完整的软件开发周期,尽管不可否认规模要小得多。我建议任何没有计算机学位的人做一些类似的事情来表明他们没有完成认证。
- 我学会了一门语言的全部基础知识。这意味着我有信心用一种语言编写代码,不会对语法问题感到困惑。在大多数情况下,公司并不太关心你在实习中能使用的语言,只关心你能编码和解决问题。一开始就试图学习太多的语言可能会导致混乱或全面缺乏理解,这可能会妨碍完成对面试过程至关重要的编码挑战。我建议人们在尝试学习另一种语言之前,先学习一种语言的来龙去脉。
- 我没有慌张,解释了我的逻辑。虽然我可能没有找到解决问题的最佳方案,但我解释了我的思考过程,如何用我有限的知识最好地解决问题,并分解了问题。这表明,尽管知识有限,我仍能提出合理的解决方案并分解问题。在软件工程中,这是一项至关重要的技能,如果我没有展示出来,只是想出一个解决方案,我可能就不会得到这份工作。如果你不能解决某件事,不要惊慌,尽你最大的努力,把它分解成可管理的小块!
我还会改变一些事情,以增加下次获得聘用的机会:
- 我会用亚马逊的首选语言(Java)和亚马逊业务的一部分(如网站或应用程序)创建项目。大多数公司都有一种他们倾向于用于大多数事情的语言,即使你确实有一些自由,并且知道这种语言可以在你的应用中给你一个促进。
- 我应该多温习一下数据结构和算法。这确实让我失望,我很幸运地得到了一个可以用 Python 中内置的基本数据结构来解决的问题。否则,这肯定会使我出错,这也是我将来要努力改进的地方。
这些都是任何处于类似情况的人,无论是为亚马逊还是其他大型科技公司面试,都可以借鉴的经验。
结论
这意味着我可以在没有计算机科学学位的情况下获得亚马逊 SDE 的实习机会。我认为这与在正确的时间得到正确的问题的运气有关。然而,与此同时,我认为这很大程度上也与实践经验和我在业余时间做的项目有关,这些项目证明了我可以在现实世界的软件工程环境中编码和解决复杂的问题。尽管没有计算机科学学位。我建议任何处于类似情况的人,想在 FAANG 公司获得 SWE 瑞典实习机会,但没有 CS 学位的人去做,记录并发表。开始建立你自己的项目,在你做的时候记录下过程,并在某个地方发布结果或过程,比如在媒体上。祝你好运!
如果你喜欢你所读的,并且还不是 medium 会员,请使用下面我的推荐链接注册 Medium,来支持我和这个平台上其他了不起的作家!提前感谢。
https://philip-wilkinson.medium.com/membership
或者随意查看我在 Medium 上的其他文章:
我如何做出我的第一个科学贡献
原文:https://towardsdatascience.com/how-i-made-my-first-scipy-contribution-d8c376ff7ac2
或者说,两个样本测试的微妙之处。
I)为流行的存储库做出贡献
向受你所在领域从业者欢迎的著名开源库投稿是展示专业知识的一个好方法。例如,能够说:“如果你在 SciPy 中使用这个方法,你就是在使用我的代码”肯定会引起注意,让你脱颖而出(我们将使用 SciPy 作为例子,但这适用于任何流行的库)。此外,你会发现从人工智能到分布式计算等领域的许多顶尖研究人员在他们的简介和简历中提到了这些贡献。但是如果这么做很容易,每个人都会这么做。例如,SciPy 总共有大约 1000 名投稿人。这包括对文档、评论等的贡献。如果你只包括触及核心功能的贡献者,你可能只剩下几百个。这对于一个几千万人使用的图书馆来说。
I-A)“伟大”的过滤器
就像解决费米悖论的“伟大过滤器”框架一样,我们可以想到一系列障碍或过滤器来解释为什么只有少数人贡献这些代码库,而有那么多人使用它们。

向开源库贡献代码的伟大过滤器。图片作者。
首先,仅仅是在 GitHub 上浏览的源代码就可能令人生畏。
下一步是在本地下载代码,并从源代码编译它。分叉‘代码本地就够简单了。但是构建它需要安装 C 和 Fortran 编译器,因为许多代码将输入传递给这些语言的方法,这些语言比 Python 快得多。此外,从线性代数到统计学的许多基本算法都已经在这些语言中实现,可以追溯到 60 年代。
在您的系统上设置这些编译器可能是一项非常耗时且令人沮丧的工作,尤其是如果您以前从未处理过它们的话。但是在这里你可以像我一样走捷径。我找到了一部分纯 Python 的代码,把它复制到本地,然后只在上面工作。
现在,您必须找到代码中需要改进的地方。实现这些算法的人不是傻瓜,他们会知道最著名的实现,如果不是直接插入它们的话。这可能是最难的部分。为文档做贡献可能是缩短这一艰难步骤的一种方式,因为这是一个总是需要更多手指的领域。我在这方面很幸运,因为我使用的一种方法(一种称为二项式测试的假设测试)是在向它传递大量输入时抛出内存异常。很明显,这种行为是由于执行不力。所以,我知道去哪里找。
最后,如果你通过了所有这些,对这些存储库的审查过程将会非常严格。维护人员可能不会接受您的代码更改,即使您确信这是一个显著的改进。如果他们这样做了,他们会彻底测试你的代码,并提出许多修改建议。这个过程可能需要几个月的时间(至少对我来说是这样)。
现在我们将具体讨论我的贡献。我改进了一个叫做二项式检验的假设检验的实现。因此,我们现在将进入变化本身,并需要建立一些背景。
对于高层次的动机,考虑一个赌场的老丨虎丨机。当你玩的时候,你要么赢要么不赢。你有一些关于机器的一些拉的数据,想要决定是否玩它。
二项分布
你掷一枚硬币,正面朝上的概率为 p , n 次。你会看到多少个头?这是一个随机变量,因为你可能会看到在 0 和 n 头像之间的任何东西。我们姑且称这个随机变量, H 。这个随机变量取某个值的概率, h (在 0 和 H 之间)是:

等式(1):二项式分布 PMF。图片作者。
举个例子,掷三次硬币,两个正面,我们可以得到 HHT,HTH 或者 THH。这些序列中的每一个都有一个概率 p (1-p) 。而这三个序列必须乘以 3 ,解释(n \选择 h) 项。
脚注 1:随机变量用大写字母表示。
III)二项式检验
在这个游戏的一个更现实的变体中,我们并不真正知道硬币的 p 参数。在这种情况下,问题被颠倒了。我们知道在 n 次投掷中得到的人头数,并想利用这一信息对 p 进行一些推断。这就是二项式检验的用武之地。因为这是一个假设测试,所以让我们快速覆盖一些基础知识(基于抛硬币)。
III-A)假设检验速成班
在假设检验中,我们从一些假设开始,然后根据收集的数据检验那个假设。我们从这个假设开始,并根据对数据的一些观察进行检验,这个假设被称为“零假设”或简称零假设。在我们的例子中,空值是硬币正面的概率值, p 是某个特定值(比如说 p_0 ,可能是 .5 )。从这里,我们执行以下操作:
- 将所有数据汇总成一个数字。这个数字被称为“测试统计”。这应该是我们在空值下很容易推理的东西。在我们的例子中,这是我们在第次次投掷硬币中观察到的正面数。
- 得到原假设下检验统计量的分布。请注意,这种分布完全考虑了它所计算的数据的大小,随着我们收集的数据越来越多,它在单个值处变得越来越峰值化(反映出我们对所得出的结论有更高的信心)。在我们的例子中,假设我们在空值下投掷硬币 n 次(正面的概率是 p_0 ,那么正面数量的分布是一个参数为 n 和 p_0 的二项式分布。
- 在假设为空的分布下,找出比计算的测试统计值(从数据中)更极端的概率。在定义“极端”的含义时,我们有三种测试。大于、小于和双面。
III-B)回到二项式
让我们通过回到二项式检验来使事情具体化。我们示例中的零假设是 p = 0.5 。假设这是一个赌场的老丨虎丨机,p 是你赢的概率。你只有在 p > 0.5 的情况下才想玩。所以,当这不是真的(当 p < 0.5 时)时,你想要得到提醒,所以你知道要远离那台机器。现在最好用一张图片来显示“as 或更极端”。下图中的蓝条是检验统计量的概率质量函数(PMF), H (考虑到收集的数据量)。这只是一个参数 n 和 p=0.5 的二项式分布。
绿线是测试统计的实际值, h 由数据计算得出。绿色区域是 PMF 中必须求和才能获得 p 值的部分。

在单侧假设检验中,您只对一侧的面积求和,在这种情况下是在观察检验统计量的右侧。图片作者。
如果是“大于”测试,绿色区域延伸到绿线的右侧,如果是“小于”测试,则延伸到左侧。
第三种测试是双边的。在这里,如果数据显示参数 p 明显不同于其在空值下的假设值,我们希望得到警告。因为我们现在关心两边的偏差,我们需要对两个区域求和来得到 p 值。这些在下面以绿色和红色显示。绿线是根据之前的数据计算出的测试统计的实际值。

在像二项式检验这样的双边假设检验中,必须取两边的面积来得到 p 值。一方面,您已经有了测试统计数据(绿色)。但接下来你要找到另一边“一样极端”的点。图片作者。
但是我们在哪里划红线呢?我们知道它会在模式的另一边(黄线)。本着比实际观察“更极端”的精神,我们需要找到一个和绿点一样极端的点,但在另一边。这一点在图中用红色标出。在这里,“极端”意味着“不太可能”。我们采用观察绿点的概率,并在模式的另一侧找到具有相同或“等于或略低于”概率的点。
在上图中,由于 p 为 0.5 ,所以分布关于模式是对称的。所以,我们可以很容易地利用对称性找到红点。但是如果 p 不是 0.5 的任何值,对称性将会打破,我们又回到明确地寻找红点。
IV)原始代码
在双边测试的情况下,原始代码是非常低效的。具体地说,在红点“在另一侧的极端”将被定位的步骤中。从该模式到另一个极端的值首先存储在一个数组中(在下图中以灰色显示)。

“模式的另一边”的概率质量函数值被存储在一个数组中。当传递给二项式检验的 n 很大时,这个数组变得非常大。图片作者。
然后,在那个阵列上有一个环,识别红点。这就是 O(n) 空间和 O(n) 时间复杂度!当传递了较大的值 n 时,会导致内存不足异常。
五)改进
V-A)消除内存占用
第一个改进是针对将数组保存到内存中所带来的内存占用。这就是当大的值 n 被传递时导致该方法彻底失败的原因。实际上没有必要将概率质量函数的值保存到数组中。人们可以很容易地在循环中计算它们,将它们存储在一个变量中(覆盖循环的每次迭代),并继续下去,直到识别出红点。
这样, O(n) 内存占用就消除了。如果修复如此明显,为什么首先要使用数组呢?我很确定我知道答案。
“在数组中存储东西”让人想起 R 编程语言中的矢量化运算。这里的明确指导是更喜欢向量化的东西,而不是编写循环。这是因为向量被传递给非常高效的 C 代码。
许多统计方法实际上是从 R 开始的。有人可能把函数从 R 翻译成 Python,但做得有点过了,没有注意到不需要数组。
V-B)通过二分搜索法降低时间复杂度
通过消除数组,我们把空间复杂度带到了 O(1) ,但是时间复杂度仍然是 O(n) 。这可以通过观察我们搜索的概率质量函数值总是被排序(以升序或降序)来进一步改进。这意味着二分搜索法可以用来搜索红点在 O( log n) 时间内的位置。当然,二分搜索法必须在一个函数上,而不是在一个数组上,以避免带回 O(n) 内存占用。
VI)拉取请求
你可以在这里看到拉动请求和围绕它的讨论。在下面的截图中,您可以看到在旧版本的代码中,通过“np.arange”方法创建了占用 O(n) 内存的数组。这是由二分搜索法取代。

放在代码中 SciPy 创建数组的地方,这是不必要的,会导致内存问题。图片作者。
这是改造后的二分搜索法本身:

新的二分搜索法方法,作用于函数而不是数组。图片作者。
与传统的二分搜索法不同,它所操作的参数是一个函数而不是一个数组。这样,我们保留了内存足迹 O(1) ,同时仍然占用了 O( log n) 时间。
结论:向你所在领域的热门图书馆投稿是展示专业知识的好方法,同时也能学到很多你想毕生从事的领域的知识。有许多阻碍会使这变得困难,但是你必须留意机会。此外,尝试通过走捷径来缩短一些困难的部分。在产生积极影响的同时,为文档做贡献是一个让你有所收获的好方法。
如果你喜欢这个故事,成为推荐会员:)
https://medium.com/@rohitpandey576/membership
我如何组织我的雪花数据仓库
原文:https://towardsdatascience.com/how-i-organize-my-snowflake-data-warehouse-996965fe51dc
存储数据的数据库、模式和表

娜娜·斯米尔诺娃在 Unsplash 上的照片
您的数据仓库是您现代数据堆栈的中枢。数据通过像 Airbyte 这样的数据摄取工具流入其中,确保原始数据可用。数据在其中使用 SQL 和现代数据转换工具(如 dbt)进行转换。然后,数据从 it 流向业务用户和数据可视化平台。
所有数据都存在于您的仓储解决方案中。
这是一个强大的工具。你需要确保你做得对。您数据的完整性取决于制定此解决方案的分析工程师、数据工程师和数据分析师。考虑到不同的因素,如开发和生产、安全性和业务用例,必须正确地完成。
在本文中,我解释了如何组织我的雪花数据仓库,以便尽可能少出错。我将介绍如何决定您的数据仓库解决方案,确定您的数据库、模式和不同类型的表。
为什么选择雪花作为你的数据仓库?
在整篇文章中,我将特别提到雪花作为我的数据仓库解决方案。我认为雪花是市场上最好的数据仓库。雪花是专门在云上构建的,这意味着您和您的团队可以随时随地访问它。Snowflake 速度很快,允许您根据预算轻松扩展或缩减计算能力。雪花也使得在许多用户之间共享数据变得容易。
在我们开始对您的数据仓库架构做出所有决策之前,让我们讨论一下雪花数据仓库的组件。雪花数据仓库架构由不同的数据库组成,每个数据库都有自己的用途。雪花数据库包含模式来进一步分类每个数据库中的数据。最后,最细粒度的级别由表和视图组成。雪花表和视图包含您熟悉的典型数据库表的列和行。
组织您的雪花数据库
您的数据仓库有三个主要组件。您接收原始数据的位置。数据转换发生的位置(通常使用 dbt)。以及存储报告和实验的位置。

作者图片
存储原始数据
先说第一个地点。您将在哪里将原始数据导入到雪花中?我建议创建一个雪花数据库来接收所有的原始数据。这应该是任何数据首先到达的地方。
重要的是始终保存一份原始数据的副本,以防出现问题。拥有一个原始副本将允许您在发现其中一个错误时重新运行您的数据模型。
唯一可以完全访问它的系统必须是您的摄取工具。在我的例子中,它是 Airbyte,一个开源数据摄取工具,您可以使用它从任何可用的源连接器将数据加载到雪花中。Airbyte 会将所有原始数据转储到您专门为摄取而创建的“原始”数据库中。除非使用另一个摄取工具,否则其他任何人都不应该将数据转储到这个位置。

作者图片
存储转换后的数据
现在,数据仓库中有几种类型的转换。首先,也是最简单的,是基本模型。这些是对原始数据进行的基本转换,以便分析师和分析工程师在数据模型中使用它们。我写了另一篇关于为这些基本模型创建 dbt 风格指南的文章。
在设计雪花架构时,避免从原始数据库中读取转换是一个最佳实践。您的数据模型应该总是从包含这些基础模型的另一个雪花数据库中读取。
这本质上是一个类似于“原始”数据库的数据库,但有一些基本的转换,如数据类型转换和字段名更改。为了简单起见,我称我的为“基础”。dbt 通常称之为“分期”。
“基础”数据模型也是视图,而不是表。这在您的雪花仓库中节省了成本,因为您没有存储底层数据的完整副本。相反,你正在创建一个生活在它上面的层。
因为这些数据总是相同的,无论是在开发还是生产中,都不需要创建单独的环境。视图不需要每天自动化和部署,因为它们只是从原始数据中读取。
与您的其他转换一样,这些将是您使用 dbt 构建的更复杂的模型。这些都需要开发和生产环境。您不希望一个数据库同时包含开发和生产模型,所以最好为每个模型创建不同的数据库。
我把我的叫做“数据集市开发”和“数据集市产品”。

作者图片
这两个数据库都从“基本”数据库的表中读取数据,但一个用于测试数据模型的创建,另一个由业务部门验证、编排和依赖。您的“DATA_MART_PROD”表应该每天创建一次,或者使用编排解决方案更频繁地创建。
请记住,使用 dbt 在雪花中创建的表是 瞬态表 。这些表类似于永久表,只是它们在 Snowflake 上没有完整的历史。这有助于节省存储成本,但也是为什么总是保留所有原始数据的副本很重要的另一个原因。
为报告和实验存储数据
出于报告和实验的目的,分析师通常希望编写更长的一次性查询。随着查询的编写,有了一个地方来存储这些查询,以便业务用户和可视化工具可以访问它们。
因为这些通常只编写一次,不需要每天自动运行,所以您不希望在开发或生产中存储它们。我们在 BI 工具中完成大部分报告,使用生产中内置的数据模型,而不是在雪花中。
然而,如果您在雪花中自动化您的报告,在“DATA_MART_PROD”中创建这些报告可能是一个更好的主意。
在我的雪花环境中,我为这些数据创建了一个名为“RDA”的数据库。在这里,分析师可以从他们的查询中创建表,然后供其他人使用。
您可能想知道,如果这些是一次性的分析,为什么我首先需要存储它们?如果这些查询非常复杂,您不会想要在可视化工具中直接使用它们。你会想要利用雪花的速度和力量来运行它们。此外,通过这种方式,您将能够方便地引用以前的报告代码,以便将来查询。

作者图片
在这里,您可以看到我的数据库的雪花架构是什么样子的。注意还有“UTIL_DB”、“雪花”和“DEMO_DB”。这些是默认情况下用任何雪花帐户创建的。“雪花”主要用于内部雪花设置,涉及权限、账户使用和账户历史。“UTIL_DB”和“DEMO_DB”可以删除。
一旦确定了要创建的数据库,就可以在雪花工作表中运行下面的命令来实现这个目的:create database [database_name]
组织您的雪花模式
既然已经创建了数据库,就可以确定需要在每个数据库中构建的模式了。雪花模式作为一种更细粒度的方式来组织数据库中的表和视图。它们应该帮助您更快地编写查询,确切地知道在哪里可以找到某些数据。
原始数据和基本模型
您的“原始”和“基础”数据库应该由完全相同的模式组成。“BASE”本质上只是原始数据库的副本,但是应用了基本的转换。在这两个数据库中,我建议为每个数据源创建一个新的模式。

作者图片
例如,如果您从 Google Ads、脸书、Bing Ads 和 Mailchimp 获取数据,您将为其中的每一个创建不同的模式。您的数据库将如下所示:

作者图片
每个雪花数据库都包含默认模式“PUBLIC”和“INFORMATIONAL_SCHEMA”。虽然我建议删除“PUBLIC”,但“INFORMATIONAL _ SCHEMA”包含描述每个模式内容的视图。这个可以派上用场,留着也无妨。
当您添加新的数据源时,您可以轻松地为每个数据源创建一个新的模式。现在,当访问原始数据或基本模型时,您知道在哪里可以找到您需要的每一个数据。
开发和生产模型
类似于“RAW”和“BASE”,“DATA_MART_DEV”和“DATA_MART_PROD”应该具有相同的模式。它们是彼此的精确副本,除了一个用于开发目的,另一个由业务团队验证和使用。其中,我只使用了两种模式:“中间”和“核心”。

作者图片

作者图片
这些术语通常在 dbt 文档中使用。中间模型是介于基础模型和最终产品之间的模型,或者核心数据模型。它们是 SQL 文件的输出表,不一定用于分析,但却是构建最终模型的重要一步。唯一真正需要访问它们的人是分析工程师,或者是编写它们的人。
核心模型是数据模型的最终产品。它们是代码序列中最后一个 SQL 文件产生的表。这些是数据分析师和业务用户需要在您的生产环境中访问的。所有分析、仪表板和报告都将基于这些数据模型构建。
组织雪花表和视图
在决定如何命名表和视图之前,需要决定何时使用它们。如果您不熟悉的话,视图充当表,但不是数据的物理副本。它是一个位于底层表之上的 SQL 查询,如果您正在寻找一个安全的解决方案或省钱的方法,这是一个很好的选择。
就我个人而言,我在 Snowflake 中为我所有的基础和中间模型使用视图。因为基本模型只包含原始数据的基本转换,所以实际上不需要存储另一个完整的副本。至于中间模型,因为分析师不直接查询,所以没必要在上面浪费存储空间。
但是,我的原始数据和核心数据模型总是表。您的原始数据需要以表格的形式存储为物理副本。这对您的核心数据模型也很重要,因为这些模型通常每天都在运行,并且经常被访问。你希望历史记录存在。
表和视图的命名约定
雪花表和视图的名称与 dbt SQL 文件的名称相同。dbt 自动生成与代码所在的文件名同名的表和视图。因此,正如我在上一篇文章中所分享的,创建一个一致的、强大的 dbt 风格指南是非常必要的。
如果您在 dbt 中查看我的 SQL 文件的名称,您将会看到在我的雪花模式中作为表生成的那些确切的文件名。例如,我有 fb_ads.sql 、 fb_campaigns.sql 和 fb_ad_actions.sql 作为 sql 文件,它们包含我的基本模型的代码。如果您查看我的“BASE”数据库和“FACEBOOK”模式,您可以将这些确切的文件名视为表格。

作者图片

作者图片
结论
确保通过规划和设计数据库、模式和表/视图来开始构建雪花架构的过程。在你知道你的整个数据生态系统是什么样子之前,你不想创造任何东西。
我建议记录您的雪花数据仓库架构的每一部分及其背后的目的。在决定最适合您的体系结构之前,请与您的团队一起多次查看此文档。
记住,这个过程不是一劳永逸的。随着新的业务用例的出现,您将添加新的数据库、模式和表。而且,如果你觉得有些东西不适合你,不要害怕去改变它。
有许多不同的方法来组织您的雪花数据仓库架构。我见过在数据库中通过模式分离环境的团队,在生产环境中自动化报告的团队,以及拥有多个开发和生产数据库的团队。这完全取决于什么对你的用例有意义。
我的团队只有一名分析工程师,就是我。所以我不知道这个架构如何与在 dbt 中编写数据模型的多个分析工程师一起工作。
作为唯一一个用 dbt 写作的人,它工作得很好,创造了一种非常简化的做事方式。请关注第二部分,了解如何在雪花数据仓库中设置用户、角色和权限。
更多关于分析工程、现代数据堆栈和雪花的信息,订阅我的免费每周简讯。
我是如何通过 TensorFlow 开发者证书考试的
原文:https://towardsdatascience.com/how-i-passed-the-tensorflow-developer-certificate-exam-501cefa728f6
张量流
值得吗,如何准备

莎伦·麦卡琴在 Unsplash 上的照片
在经历了 TensorFlow 开发人员证书考试的准备和通过过程后,我认为给其他人一个概述可能是有用的,可以使用的最佳准备资源,考试中需要注意的事项,以及关于它是否对你特别有用的建议。
注意:本文不会透露实际考试的任何问题/答案。虽然这可能会让一些人失望,但维护考试的完整性是非常重要的。这是为了确保当你最终得到你的证书时,它是有价值的。
什么是 TensorFlow 开发者证书?
TensorFlow 证书网站非常简洁地描述了这一点:
TensorFlow 开发中的此证书旨在作为学生、开发人员和数据科学家的基础证书,他们希望通过使用 TensorFlow 构建和训练模型来展示实用的机器学习技能。
…所以这是一个实践考试,要求你建立实际的张量流模型来预测结果(分类和回归)。
我建议的参考框架
现在你知道什么是证书了,我认为在我继续之前了解一下我的背景和经历是很重要的。这可能有助于一些人为他们的准备制定一个攻击计划,也可以判断我的建议与他们的相关性如何。
- 在日常工作中,我是一名“传统”工程师(即机械工程师、土木工程师等)。),而不是软件开发人员或数据科学家/数据分析师。
- 我在日常工作中有软件开发和数据分析的经验(许多传统的工程工作都是某种数据分析)。
- 在过去的 5 到 6 年里,我一直在努力扩展和提高我的软件开发/数据分析技能。这既是因为它对我的工作有益,也是出于对这个主题的兴趣。
- 虽然我有一个硕士学位,但不是在软件开发领域(航空工程)。
- 我花了相当多的业余时间从事各种软件/分析项目。
上面的内容会给你一个很好的衡量标准,让你知道你的经验水平和我相比会如何,并允许你采纳下面的建议。
值得做吗?
这是一个非常有效的问题,在我解释我推荐什么资源之前,我想先回答这个问题。
费用
办证花了我美元T2【100】T3。这对一些人来说可能没问题,但我认为这对一些人来说是一个很大的障碍。
幸运的是,如果你符合标准,有一个津贴项目,所以在某些情况下,这可以帮助降低成本。
同样值得注意的是,付款是从我的卡上以美元支付的,我不是美国人。在考虑您自己的银行/提供商的汇率费用时,请记住这一点。
就业前景
如果成本没有让你却步,那么主要的问题是:
这个证书会改善我的工作前景吗?
在我看来,这都取决于你目前的状态。如果你有一个计算机科学学位,并且目前是一名有多年经验的数据科学家,那么这不会给你的简历增加多少价值。然而,随着你剥离技能,这个证书的等级将会更高:
- 有 CS 学位但没有数据科学经验?
- 没有 CS 学位,有一些数据分析师经验?
- 以上都没有?
- 大学刚毕业?
在上述所有情况下(以及其间的许多变化),可以清楚地看到该证书可以增加一些价值。这是一个非常具体的技能能力的证明。
然而,我认为需要记住的最重要的因素是可见度。
如果这份证书的唯一作用是让你的简历一开始就受到关注,那么它是值得的。
申请工作时,最初扫描你简历的人(他们确实只是扫描了简历)可能会根据关键标准进行检查,如果其中一项是 TensorFlow,那么你就有了明确的能力证明。如果这个证书的唯一作用是让你的简历最初被注意到,那么它是值得的。这甚至可以适用于非常有经验的数据科学家,因为最初在大公司浏览简历的人可能没有重要的领域知识。
那么值得吗?我觉得大多数情况下,是的。如果你能承受这个费用。
很难吗,我需要知道什么?
要了解考试需要哪些知识,最好从考生手册开始。
它在五个主要部分详细说明了你应该知道的主题,甚至将每个部分分解成具体的技能。这五个部分是:
- TensorFlow 开发人员技能
- 使用 TensorFlow 2.x 构建和训练神经网络模型
- 图像分类
- 自然语言处理
- 时间序列、序列和预测
如果你能仔细阅读这份清单,并勾掉大部分,如果不是所有的要求,那么你应该对考试有好处。如果没有,那么你需要做一些准备工作…

我们很快就会谈到这一点!
困难
即使你有经验,或者从事数据科学家的工作,你也可能需要为这次考试做一些准备(尽管总有例外!).如果你认为你不准备就能通过这次考试,我想你可能会大吃一惊。
这是因为真的很难吗?没有。但这也不是在公园散步,你需要知道比基本知识更多的东西。
如果你是一名数据科学家,你可能会有一套非常特殊的技能(也许是对象检测/分类?),而且这个测试还涵盖了自然语言处理(NLP)等你可能生疏的内容。所以你可能需要提神。
总而言之,这不是你可以毫无准备就投入进去的事情。如果你对这个主题相对较新,你将需要适当地学习,如果你有经验,你可能需要对一些你可能有一段时间没有使用的领域进行更新。
我该怎么准备?
必需品;要素
在我开始学习我推荐的备考课程之前,我只想提一下,我假设您熟悉 Python 编程语言。这是必不可少的。如果没有,你应该首先学习 Python。

由 David Clode 在 Unsplash 上拍摄的照片
此外,我还建议您在尝试此证书之前熟悉以下内容:
- Python 库:pandas,numpy,matplotlib,scikit-learn。
- 有些人使用机器学习算法进行练习——这不是必需的,但给你一个坚实的基础,并且通常提供对 scikit-learn 等库的详细介绍,而没有 TensorFlow 的额外复杂性。
课程
有一些很棒的课程可以帮助你,而且根据你的经验水平很容易调整。
我推荐两门课程,这两门课程都旨在帮助您获得认证:
- Coursera:深度学习。AI TensorFlow 开发者职业证书
- Udemy:2022 年 TensorFlow 开发者证书:零到精通
上面的两个课程在方法上有很大的不同,我会根据你的经验推荐下面几节详细介绍的方法。
就一切情况而论
我将向您推荐我认为最适合您技能水平的资源。然而,我需要首先强调一个特殊的项目:
不管你是使用我建议的课程,还是书籍,还是 YouTube 视频来准备考试。通过自己编码来练习是很重要的。在大多数情况下,仅仅看视频/阅读是不够的。
经验:中级到专家
如果你相当熟悉 TensorFlow 和舒适的构建、测试和调试模型,那么我会推荐你参加 Coursera 的课程。
该课程被列为需要“大约 4 个月完成”,但这不是真的。如果你已经有了这方面的经验,你可以很容易地在几天内完成课程内容。
内容简明扼要,大量解释了为什么要以某种方式做事。您还可以访问编码示例和代码演练。
它涵盖了考试所需的所有主要领域。
还需要注意的是,本课程是 TensorFlow 网站上官方列出的课程。
体验:很少或没有
如果你在 TensorFlow 或机器/深度学习方面的经验非常少,我会建议你从 Udemy 的课程开始。
虽然 Coursera 的课程简明扼要,但 Udemy 的课程要长得多。看完所有的视频需要一段时间,但是如果你坚持下去,你会对这个主题有一个很好的总体理解,而不仅仅是针对考试的高度集中的内容。
该课程以非常以代码为中心的方式教授,教师在整个视频中进行编码。有趣的是,老师在编写代码时会犯错误(很可能是故意的),并教你如何快速解决问题。这些错误通常是初学者所忽略的,所以这是视频的一个非常有用的功能。
然而,如果你有经验,过一会儿你可能会发现这些视频重复和烦人,因此我认为如果你有更多的经验,Coursera 课程是更好的。
我还应该注意到,这门课提供的朱庇特笔记本内容广泛,是非常有用的参考资料。
一旦你完成了 Udemy 课程,我仍然强烈建议你完成 Coursera 课程。它涵盖了一些你在 Udemy 课程中看不到的内容,是一个很好的通用复习工具,可以相对较快地完成。
其他课程
Udacity 也有一个课程,但是我没有看到内容,所以不能评论它是不是一个好课程。或许值得一查。
考试是什么样的?
基础知识:
- 它是开卷的,所以你可以在整个考试中使用所有你需要的资源
- 它是定时的(5 小时)。您可以随时完成,但如果过了 5 个小时,测试将自动提交。
- 你在模型上被测试。模型由你上传,并返回满分为 5 分的分数。在测试过程中,您可以提交任意数量的模型,但每个部分只能提交一个最终模型。
- 您必须使用特定版本的 TensorFlow 和 Python 在 PyCharm IDE 中进行测试。

设置
您必须使用特定版本的 PyCharm 来完成测试,然后安装特定的“TensorFlow 测试”模块。该模块创建测试环境,并提供完成和提交测试所需的界面和按钮。
当您“购买”测试时,您将收到一份 pdf,其中详细说明了您需要设置的内容,以及您必须使用的 PyCharm 和 Python 版本,以及它将在环境中安装的软件包。
你可以点击查看最新的环境设置指南。
我强烈推荐在 PyCharm 中建立一个测试环境,使用 Python 的精确版本和指南中详细描述的包。这应该会减轻你在考试中可能遇到的任何潜在问题。这一点很重要,因为测试是定时的(5 小时),所以您不希望在测试时钟运行时浪费时间调试您的环境!
开始测试
一旦你设置好并点击“开始测试”,你将拥有包含完成测试每个部分所需的所有内容的文件夹/文件。关于您需要做什么的说明包含在您将要编写代码的文件中。显然,我不能在这里详细说明,但一旦你在这一点上,你只需阅读说明和去!
分阶段
你是根据你生成的模型来评分的。这些模型使用插件上传(你只需点击一个按钮),然后你提交的模型被测试。在整个测试过程中,您可以提交尽可能多的模型,因此您有足够的机会在整个测试过程中改进您的模型。
当您提交一个模型时,您收到的提交模型的等级为 5。例如,您可能提交了一个模型,结果显示为 3/5。因此,在结束测试之前,你可能想要尝试改进模型以得到 5/5,否则时间就用完了。
在这一点上,我应该指出,我不知道你需要达到什么样的考试分数才能通过考试。我在每个部分都以 5/5 的成绩完成了测试,但这可能是不必要的。我无从得知。
推荐
需要记住的一点是,这是一次开卷考试。在考试过程中,你可以使用任何对你有帮助的资源,所以准备好你认为有用的资源,并且随时可以使用。
如果您的计算机中没有用于测试的 GPU,那么您需要记住,您的一些模型(取决于您在测试中的策略和选择)可能需要一点时间来运行。实际上,5 个小时的测试时间已经考虑到了这一点,而且你需要建立的模型是合理的,所以这不是一个大问题。然而,如果可能的话,使用 GPU 会更好,并节省你一些时间。
如果 GPU 访问不可行,一个好的选择是使用 Google Colab 来运行您的测试,然后在您的最终模型运行时将您的代码转移到 PyCharm。这是完全正确的,甚至在“设置”文档中也有提及:
在考试期间,欢迎您使用 GCP、AWS、Jupyter 笔记本或 Google Colab 来试验训练模型,但您仍需要在 PyCharm 内的考试环境中定义、训练和保存您的模型,以便提交评分
这允许您利用 Colab 环境中提供的免费 GPU,这应该有助于您在微调模型时更快地迭代。
问题
总的来说,测试进行得非常顺利。然而,我确实对我的最终模型有疑问。当我在 PyCharm 中运行模型代码时,它不会保存模型,而是给出一个错误。

由 Unsplash 上 Elisa Ventur 拍摄的照片
最后,我不得不在 Colab 中运行代码,并将模型传输到 PyCharm 进行上传。幸运的是,这样做很好,但是由于 Python 等特定版本的要求。我不能保证这永远有效。因此,在可能的情况下,我会尽量坚持在 PyCharm 环境中运行您的模型。然而,如果您像我一样遇到了技术问题,知道有一个潜在的替代方案是很好的。
我怎么知道我是否通过了?
一旦您提交了您的最终模型的测试,您应该会收到一个确认您完成了测试。
就我而言,在那之后不久,我收到一封电子邮件,说我通过了。完成后大约 5 分钟内。同样,我不能保证这种情况会发生在你身上,但这就是发生在我身上的事。
最后你得到了什么?
证书
你基本上是通过谷歌的合作伙伴服务认证颁发的证书。
通过您的可认证帐户上的界面,您可以做各种事情,如下载证书、创建 Gmail 签名、outlook 签名和各种网页嵌入选项。
证书有效期为 3 年,3 年后:
要在那时更新您的认证,您需要再次完成注册和认证过程。
措辞略显模糊,但我认为这意味着你需要重新做一次检查。
TensorFlow 证书网络
除了实际证书之外,您还被添加到 TensorFlow 证书网络(如果您选择加入)。
这基本上是所有通过 TensorFlow 认证的人的在线可搜索目录。你可以按姓名、国家、经历等进行过滤。因此,对于雇主或潜在客户来说,找到当地的“专家”非常有用。
同样,这可能会也可能不会为你个人增加价值,这是不可能说的,但它仍然是额外的可见性。
结论
总而言之,我认为 TensorFlow 开发者证书是对机器学习/深度学习前景的积极补充。
它催生了大量的在线课程,这些课程旨在让你对主要问题(自然语言处理(NLP)、图像分类、时间序列预测等)有一个广泛的理解。)目前在工业中用于解决大量现实世界的问题。
这为初学者提供了一种结构化的方法,以获得对机器学习/深度学习主题的良好感觉。它还允许更有经验的从业者检查或提升他们的技能。即使是业内经验丰富的老手也可能受益于获得深度学习领域最大的参与者之一谷歌的认证。
无论你是否有经验,如果你遵循我在这篇文章中提出的建议,我相信没有什么可以阻止你将 TensorFlow 开发者证书添加到你的投资组合中。
祝你好运!
如果你觉得这篇文章有趣或有用,记得关注我,或者注册我的简讯获取更多类似的内容。
如果你还没有,你也可以考虑订阅媒体。你的会员费不仅直接支持我,也支持你所阅读的其他作家。你还可以完全不受限制地访问媒体上的每个故事。
使用我的推荐链接注册会给我一点回扣,对你的会员资格没有影响,所以如果你选择这样做,谢谢你。
https://medium.com/@maclayton/membership
我是如何在英伟达获得一个数据科学家的实习机会的

克里斯蒂安·威迪格在 Unsplash 上拍摄的照片
英伟达是一家为游戏玩家以及深度学习和人工智能目的制造图形处理器(GPU)的公司。它最近涉足人工智能领域,正在为无人驾驶汽车、医疗应用和推荐系统构建计算平台。它目前是世界上第八大最有价值的公司,其股票和收入都在稳步增长。
在 NVIDIA实习可能会很艰难,尤其是在毕业期间成为一名数据科学家实习生。一个人必须在这个过程中付出巨大的努力,并且展示出这个行业最需要的技能。确保雇主和招聘人员认可你的才能的最好方法之一是建立有趣的工作组合,展示你的技能和优势。进入英伟达还有其他方法,要么去一所好大学,确保你保持良好的 GPA。
以下是我作为数据科学家在英伟达获得实习机会的一些步骤。
- 坚持练习
这是我非常强调的最重要的提示,这就是我如何能够建立一个可靠的项目组合,同时不断学习机器学习所需的最新技能和工具。当一个人坚持不懈地工作时,通常情况下,与一次做完所有事情而不停顿相比,他不需要付出太多的努力。因此,我建议做的一件事是坚持不懈地研究数据科学,比如阅读博客、文章、听视频、构建有趣的项目以及其他许多事情。确保你定期进行所有这些活动,以便通过努力,你学会在该领域取得进展,并对深度学习和数据科学领域的主题和进展建立良好的理解。

罗伯特·鲁杰罗在 Unsplash 拍摄的照片
2。养成阅读他人代码的习惯
虽然练习编程和学习用正确的编程技能单独解决一些复杂的任务是很好的,但应该考虑到阅读别人的代码也有助于你成为更好的程序员,并培养数据科学家实习所需的正确技能。在学会编码并养成每天阅读他人代码的习惯后,你的编码技能将会有显著的提高,你也将能够在许多领域学习和应用你的知识。因此,学习如何编码和阅读他人的代码是明智的,因为这会让你成为一名更好的程序员。

图多尔·巴休在 Unsplash 上的照片
3。建立一个强大的作品集
这是在许多顶尖科技公司获得实习或全职工作的最重要的一步。进入数据科学职位的竞争非常激烈。在统计、数据挖掘、数据分析、数据科学和计算机科学等各个领域攻读硕士学位的人争夺这些职位。更糟糕的是,这些职位通常需要机器学习和数据科学方面的丰富经验。因此,必须做一些工作,让你从竞争中脱颖而出,这可以借助于展示你在该领域的工作和经验的坚实的投资组合。在面试中,展示你的工作并向他们解释,而不是仅仅说你的经历,这总是一个好主意,这样他们也知道你做了大量的工作,他们会愿意给你这份工作。
请随意看看我的作品集,我在里面突出了我在机器学习和数据科学领域的所有技能。下面是链接。
你也可以在 GitHub 上关注我,这样你就可以了解我在账户中定期更新的最新变化和提交。

乔安娜·科辛斯卡在 Unsplash 上拍摄的照片
4。浏览在线课程
虽然直观地看,参加在线课程可以增加获得实习的机会,但只有少数人会不断地浏览课程并修改课程,以至于他们可以在面试中解释相同的信息。因此,我建议你可以重温那些你在机器学习和数据科学领域已经学过的课程。之后,你可以重温和修改这些主题,这样你就对这些主题有了一个坚实的概念,你也可以用它来建立一个好的文件夹。

5。学习所有重要的 ML 和人工智能库
假设您将使用 Python 作为您的机器学习语言,我建议您熟悉这些库,因为它们在大量项目中使用。一些库包括 Seaborn、Pandas、Matplotlib、Numpy 和许多其他库。熟悉这些库可以确保它们可以用于各种深度学习应用。因此,使用 ML 的正确库和工具,人们将能够轻松地执行数据可视化以及数据处理和建模。

6。在 ML 和数据科学方面有很强的理论基础
由于互联网上有大量用于数据科学的库和工具,很容易认为仅仅学习使用这些库就足以成为一名优秀的机器学习工程师。然而,重要的是要注意,拥有强大的理论基础可以确保尽管用于机器学习的库或方法有所改变,但人们也可以学习实现这些库,而不需要从头开始学习一切。这确保了即使在升级库或者废弃旧库的时候,一个具有良好理论知识的人也可以毫不费力地实现它们。

斯科特·布雷克在 Unsplash 上拍摄的照片
7。开始质疑事物并寻找替代方法
当你阅读传达 ML 概念的文章或博客时,如果你质疑为什么一种特定的方法有效而其他方法却失败了,这将是一个很好的习惯。通过这种方式,你将能够解释在 ML 中工作的事实,并且学习其他方法以及它们对于手头问题的缺点。因此,你倾向于提高你的分析方法,并开始在工艺上变得更好。

照片由 Tamanna Rumee 在 Unsplash 上拍摄
结论
总而言之,这些是我想强调的一些重要提示,它们帮助我在一家享有盛誉、极具价值的公司(NVIDIA)获得了数据科学家实习生的实习机会。这些是我会向那些期待在机器学习和数据科学领域的顶级科技公司工作的人建议的一些步骤。
如果你正在寻找建立一个有趣的作品组合,并且正在寻找最好的 ML 项目,请随意看看我的另一篇文章,在那里我强调了当你通过建立你的网站或使用 GitHub 来建立一个组合时可能会考虑的各种想法。下面是文章的链接。谢谢!
机器学习作品集最佳展示项目|作者:Suhas Maddali | mlearning . ai | Medium
如果你想进一步了解我的工作,下面是我们可以联系的细节,你也可以查看我的工作。
GitHub:https://github.com/suhasmaddali
领英:https://www.linkedin.com/in/suhas-maddali/
https://www.facebook.com/suhas.maddali脸书
我如何在 2022 年将我的 MacBook Pro 设置为 ML 工程师
原文:https://towardsdatascience.com/how-i-set-up-my-macbook-pro-as-a-ml-engineer-in-2022-88226f08bde2
让您的 MacBook 为 ML 开发做好准备的指南

尼基塔·卡恰诺夫斯基在 Unsplash 上的照片
[ 更新 2022 年 7 月 3 日 :增加了关于 Chrome 扩展的章节】
更新 2022 年 7 月 5 日 :增加了 TunnelBlick、黑曜石、矩形和 kubectx/kubens
更新 2022 年 8 月 2 日 :增加了画中画 Chrome 扩展
作为一名工程师,个性化的开发环境对于生产力是绝对必要的。这些是我作为 ML 工程师在设置 MacBook 时所做的事情——请随意挑选你认为可能对你的工作流程有用的内容!
这篇文章的灵感来自 vini cius——请点击这里查看他的文章!
目录
[**MacOS System Preferences**](#1a08)
- [Remap Caps Lock key to Esc key](#fa4a)
- [Remove apps from Dock](#7ca4)
- [Trackpad](#b572)[**Command Line Tools**](#5fe5)
- [Homebrew](#67e2)
- [iTerm2](#73ea)
- [Ohmyzsh + Powerlevel10k theme](#3431)
- [Ohmyzsh plugins](#9b2b)
- [Shell aliases](#3122)
- [Other applications to install using Homebrew](#79e2)[**Python Environment**](#79f0)
- [pip](#1a05)
- [conda](#0aff)
- [pyenv](#8ab2)[**VSCode Setup**](#d925)
- [Extensions](#dcee)
- [Ohmyzsh compatibility](#abf7)
- [Themes, Icons and Fonts/Ligatures](#b0e0)[**3rd Party Apps**](#6f50)
- [Magnet [Paid] / Rectangle [Free]](#09c1)
- [Postico](#c335)
- [Postman](#77f5)
- [TunnelBlick](#5603)
- [Others](#8731)[**Accessories**](#5dcc)
- [MX Master 3S](#4b62)[**Chrome Extensions**](#2ae4)- [Video Speed Controller](#13d8)
- [Vimium](#f208)
- [Dark Reader](#73f0)
- [Authenticator](#3293)
- [Picture-in-Picture](#1d4f)
MacOS 系统偏好设置
将 **Caps Lock** 键重新映射到 **Esc key**
我为我安装的每一个键盘都这样做,即使是内置的 MacBook 键盘。要重新映射,请转到**System Preferences > Keyboard > Modifier Keys**。因为 VIM 使用Esc来退出一个模式,把你的手指移到Esc键实在是太没效率了,因此我用Caps Lock代替了它。相信我——这将改变我的一生。

如何将 Caps Lock 键重新映射到 Esc (GIF by Author)
从 dock 中移除所有不必要的应用程序并隐藏起来
来吧伙计们,Spotlight ( **⌘ space**)可以打开你需要的一切。没必要点击你的 dock。这是我的极简 dock 的样子。

我的 MacBook Pro Dock(图片作者提供)
触控板
我的偏好是将我的跟踪速度保持在离最右边(最快的)选择大约 2 个标记处。您可以从**System Preferences > TrackPad > Point & Click**调整这些设置。

我的跟踪速度设置(图片由作者提供)
命令行工具
自制
我不能强调获得 MacOS 的这个包管理器有多重要。它管理(安装、更新、删除)你需要的所有苹果没有为你预装的软件包。
要安装它,打开终端并运行:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
安装后,您现在可以使用brew install <pkg_name>安装软件包。要升级软件包,使用brew upgrade <pkg_name>,最后要删除软件包,使用brew uninstall <pkg_name>。
我们将使用brew来安装下面的一些包。
iTerm2
Vinicius 在他的文章中提到 iTerm2 是 Mac 内置终端的可选替代品。老实说,对我来说这是强制性的替换。查看不同之处:


左:终端;右图:iTerm2(作者图片)
我不知道你怎么想,但是右手边的终端看起来更性感,更不用说它的使用了。
要安装,在终端中运行以下程序:
brew install --cask iterm2
从此以后, iTerm2 将永远取代终端应用。向终点站告别。
你一定在想——“嘿,我已经安装了 iTerm2,但它没有你的性感,大卫。”别担心,我的孩子,这是你接下来要安装的。
哦我的 Zsh+power level 10k主题
哦我的 zsh 有 147k 颗星是有原因的。这对任何开发者来说都是绝对必要的,因为它包含数百个插件和主题来配置你的 zsh。
要安装 oh my zsh,请在 iTerm2 中运行以下命令:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
接下来,安装 powerlevel10k 主题。(是的,我知道有很多主题,但我非常非常非常推荐这一个!)在你的终端上使用漂亮的字体和图标,非常容易设置,非常性感。

“p10k 配置”后我的 iTerm2 外壳
为了安装它,我们将再次使用brew(git repo 上列出了许多其他安装选项):
brew install romkatv/powerlevel10k/powerlevel10k
echo "source $(brew --prefix)/opt/powerlevel10k/powerlevel10k.zsh-theme" >>~/.zshrc
要配置 p10k 以实现上述效果,请在 iTerm2 中运行以下命令,并按照安装向导进行定制:
p10k configure
哦,我的 Zsh 插件
oh my zsh 的强大之处在于所有可以添加到 shell 体验中的插件。以下是我最少安装的内容:
**zsh-autosuggestions** —我们每天在命令行上发布数百条命令。这个插件有助于自动建议您以前使用过的命令,您可以使用→键接受建议。当您不记得一个确切的命令或者您有一个想要修改的长命令时,这特别有用。要安装:
git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
**zsh-syntax-highlighting** —这个插件给你输入的命令添加色彩。使用以下方式安装,告别枯燥的白色文本:
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
安装自定义插件后,我们可以通过将其添加到$HOME/.zshrc中要加载的插件列表来启用它们:

在 zshrc 中修改插件(GIF 由作者提供)
注 :自定义插件安装在
*$HOME/.oh-my-zsh/custom/plugins*。
外壳别名
为了加快终端上的命令,我们总是需要别名。它减少了击键次数,提高了开发人员的效率。对我来说,我在$HOME/.local/include中写下我所有的别名,并在$HOME/.zshrc中包含这个片段。
# .zshrc
for file in $HOME/.local/include/*;
do source $file
done
在文件夹$HOME/.local/include中,您可以在别名中包含 shell 脚本。举个例子:
# File: my_aliases.sh# Apple system related
alias turnonbt='blueutil --power 1'
alias turnoffbt='blueutil --power 0'
alias turnoffsleep='sudo pmset -a sleep 0; sudo pmset -a hibernatemode 0; sudo pmset -a disablesleep 1'
alias turnonsleep='sudo pmset -a sleep 1; sudo pmset -a hibernatemode 3; sudo pmset -a disablesleep 0'# Git
alias gpom='git pull origin master'
alias gmo='git merge origin'
alias gc='git checkout'
alias gs='git status'
alias gcm='git commit -m'
alias ga='git add'
alias gb='git branch'
alias gf='git fetch'
alias gp='git pull'
alias gr='git restore'
alias push='git push origin'
alias pull='git pull origin'
alias stash='git stash'
alias sapply='git stash apply'# Docker
alias di='docker images list'
alias dcp='docker container prune -f'
alias di='docker images'
alias dpa='docker ps -a'
alias dp='docker pull'
alias drf='docker rmi -f'
alias dsp='docker system prune -f'# Other examples
alias tf='terraform'
alias kcl='kubectl'
...
奖金:如何在不连接电源适配器的情况下,在屏幕盖关闭的情况下将 MacBook 连接到外部显示器:
我不知道你们是否尝试过在没有电源适配器的情况下将闭合的笔记本电脑连接到外部设备,但我确实尝试过。这个命令是真正的救命稻草:
sudo pmset -a sleep 0; sudo pmset -a hibernatemode 0; sudo pmset -a disablesleep 1
这里的诀窍是禁用睡眠。这样做会模糊睡眠笔记本电脑的选项,允许您关闭笔记本电脑并将其连接到外部显示器:

为了让您的生活更简单,让我们将它变成一个别名,以便在您需要时禁用和启用它:
# to disable sleep
alias turnoffsleep='sudo pmset -a sleep 0; sudo pmset -a hibernatemode 0; sudo pmset -a disablesleep 1'# to enable sleep
alias turnonsleep='sudo pmset -a sleep 1; sudo pmset -a hibernatemode 3; sudo pmset -a disablesleep 0'
使用自制软件安装的其他应用程序
- Docker :
brew install --cask docker(苹果硅 MAC 请从这里下载) - Git :
brew install git - 库贝克 :
brew install kubectl - kube txx&kubens:
brew install kubectx
一款超级好用的工具,你绝对应该和kubectl一起手动安装。kubectx允许您轻松管理 K8s 上下文,而kubens对您的名称空间做同样的事情。
# Get current context and lists all contexts
**kubectx**# Switch context
**kubectx <context_name>**# Switch back to previous context
**kubectx -**# For namespaces, simply replace `kubectx` with `kubens`
- VScode :
brew install --cask visual-studio-code。现在可以使用code <dir>从命令行打开 VSCode。例如,要打开当前目录中的 VSCode,使用code .。 - 这个漂亮的工具可以帮助你通过命令行界面管理你的蓝牙系统!如果你像我一样想通过键盘做任何事情,你肯定需要这个。
- 这是一个交互式进程查看器,允许您查看系统上正在运行的进程。它显示你的 PID,内存,cpu 的使用和更多!

htop 窗口(作者截图)
Python 环境
点
pip (Python 的包管理器)应该已经安装在你的系统上了。要更新它:
pip install -U pip
康达
我也喜欢安装conda,因为其他一些项目使用conda来管理依赖关系。要安装,去它的官方网站这里,因为它包含了英特尔和苹果硅 MAC 的不同版本。
Pyenv
由于我们不想使用系统内置的 Python2,我通常会安装另一个 Python 环境管理器,比如pyenv。但是要小心,因为安装多个这样的程序会试图修改你的$PATH变量。
brew update
brew install pyenv
如果你不确定,一定要检查你正在使用的 Python 解释器。
which python
要安装特定版本的 Python,请使用:
pyenv install <py_version>
pyenv global <py_version> # set global version
VSCode 设置
扩展ˌ扩张
以下是我在日常工作中必须安装的扩展的非详尽列表:
- Docker[ms-azure tools . vs code-Docker]
- git lens[eamodio . git lens]
- 金贾
- Jupyter
- Kubernetes[ms-Kubernetes-tools . vs code-Kubernetes-tools]
- 皮兰斯[ms-python . vs code-皮兰斯 ]
- 远程-ssh[ms-vs code-Remote . Remote-ssh]
- 远程容器[ms-vs code-Remote . Remote-containers]
- 迅雷客户端[rangav . vs code-迅雷客户端 ]
- VIM[vscodevim . VIM
- YAML[red hat . vs code-YAML]
- hashi corp terra form[4 ops . terra form
- autoDocstring — Python 文档字符串生成器[njpwerner . autoDocstring]
与 Oh My Zsh 的兼容性
因为我们使用 zsh 作为默认 shell,所以我们必须对设置进行一些更改,以便在 VSCode 终端上查看字体和图标。
打开文件→首选项→设置 (PC)或代码→首选项→设置 (Mac),在设置选项卡顶部的搜索框中输入terminal.integrated.fontFamily,将下面的值设置为MesloLGS NF【3】。见下面的 GIF 快速指南。

如何修改 VSCode 字体设置(GIF by Author)
主题、图标、字体/连字
- 一暗亲[ 庄同发. material-theme ]
- 素材主题[equinuscio . VSC-material-Theme——我用这个!
- 材质主题图标[equinuscio . VSC-material-Theme-Icons—我用这个!
- Fira 代码字体(附带连字!)作为编辑器字体系列。看看下面是什么样子:

Fira 代码字体(及其连字)的外观(作者提供的 GIF)
要安装 Fira 代码,请运行以下命令:
brew tap homebrew/cask-fonts
brew install --cask font-fira-code
之后,通过以下方式在 VSCode 上启用该字体:
- 启用连字—将 settings.json 中的
editor.fontLigatures修改为true - 将
editor.fontFamily修改为Fira Code

如何把字体改成 Fira 码(作者 GIF)
第三方应用
磁铁【付费】 / 长方形【免费】
你在苹果电脑上唯一需要的付费应用,它改变了你的生活。它只是简单地将窗口固定到位。是的, Windows 有这个功能是免费的但是嘿,我们是苹果用户。必须支付保险费。
编辑 :我被告知事实上有一个等价的免费应用叫做 Rectangle!这里下载。
现在,让我们看看它是如何工作的。

行动中的磁铁(作者 GIF)
波斯蒂科
我的 PostgreSQL 数据库客户端。在这里安装。
隧道步行者
这是 OpenVPN 的必备 VPN 连接器,免费且易于使用。它很神奇,因为它允许你同时连接到多个 VPN。
邮递员
除了 Thunder 客户端(作为 VSCode 扩展安装在上面),我的另一个客户端用于 API 测试。在这里安装它并选择你的 Mac 版本。
其他人
配件
MX 大师 3S
我平时根本不做硬件推广,但是我用了 MX 主鼠系列大概 5 年了(没错,我用 2S 用了那么久!)这绝对改变了生活,尤其是如果你有一台苹果电脑的话。
如果有一个硬件你必须得到伴随你的 Mac,它必须是这个。
三个手指滑动——左/右,四个手指滑动,两个手指滚动和其他触控板手势——这太麻烦了,尤其是当你的 MacBook 连接到显示器并使用外部键盘/鼠标时。

Marios Gkortsilas 在 Unsplash 拍摄的 MX Master 系列照片
使用 MX Master,可以将所有 Mac 手势分配给鼠标。以下是我如何定制我的:
- 使用后退和前进按钮在桌面窗口之间切换
- 使用手势按钮刷走现有窗口
- 连接到多台机器/设备以传输文件(光标也从一台机器移动到另一台机器!又名流

当然,还有其他超级时尚的功能,包括自由旋转滚动和逐行滚动之间的无障碍切换,几乎可以在所有表面上工作,水平滚动等等。
我肯定会期待从 MX Master 2S 升级到 MX Master 3S 。
Chrome 扩展
视频速度控制器
作为工程师(也是为了休闲🙂),看视频能让我们快速学习。这个扩展允许你使用键盘控制视频在浏览器(包括 YouTube)上播放的速度。
d:视频加速 0.1
s:视频减速 0.1
Vimium
对于 Vim n3rds 伙伴来说,这是必备的。请注意,在某些网页上(例如 Google Docs),您可能需要禁用此扩展,方法是将其添加到排除列表中。
黑暗阅读器
这个扩展允许你把任何网页变成黑暗模式。谁不喜欢黑暗模式是吧?
认证者
在浏览器上方便地访问您的验证器应用程序上的代码。
画中画
如果你像我一样喜欢通过 YouTube 学习东西,或者只是喜欢狂看 YouTube 视频,那么你现在可以在多任务处理的同时这样做了!画中画创建了一个无干扰的浮动 YouTube 窗口,你可以自由移动。再见了,YouTube 视频的尴尬的单标签窗口。

写这篇文章时我是如何观看 YouTube 视频的例子:)(图片由作者提供)
最后的话
安装新的 MacBook 时,有哪些必须做的事情?请在评论中告诉我!
大声喊出来莱米·卡里姆回顾并分享了他的一些技巧和诀窍!
支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我在这里的推荐链接订阅 ( 注意:你的一部分会员费将作为推荐费分摊给我)。否则,留下一个👏🏻鼓掌或💬注释也有助于算法!
参考
[1] Sourabh Bajaj — Mac 设置
【2】如何在 2021 年为 Web 开发设置您的 Mac—
vini cius De Antoni
【3】power level 10k GitHub 安装指南
我如何为编程和数据科学设置我的新 Macbook Pro

目录
- 简介
- 软件安装一个为什么
- 矩形—排列窗口
- iTerm 和 zsh —终端和外壳
- Brew —安装包
- VS 代码
- oh-my-zsh->zsh 的插件
- 数据科学相关
- Github
- 其他
- 操作系统相关
- 总结
- 免责声明
- 关于
介绍
每次我拿到一台新的 Macbook,我都会按照相同的步骤来设置它,以适应我的工作体验。我想我会收集我的想法,并展示我安装的应用程序,以充分利用我的工作设置。我用的是 Macbook Pro。你也可以使用一些关于 Windows 安装的技巧和想法,但是,我主要关注 Mac。原因是我用过这两种系统,我发现 Mac 总是更容易使用。
要安装的软件及其原因
矩形->排列窗口
首先,我将安装矩形

来自官方文件;作者截图
这样做的原因是用快捷键重新安排窗口大小。我使用哪种桌面设置并不重要。多显示器、扩展坞等。我总是需要排列窗口的快捷方式。在当前虚拟桌面中,将它们放在一边、居中或最大化。
安装后,只需在安全和隐私设置中添加它的可访问性。然后就可以用了。
iTerm 和 zsh ->终端和外壳
iTerm ->更好的终端
iTerm2 — macOS 终端更换

来自官方文件;作者截图
iTerm 基本上是一个具有可配置选项的更好的终端。在他们的官方文档中可以找到一个特性列表:https://iterm2.com/features.html
然后,我更改了一些设置:
- 在 General > Closing:我删除了结束 iTerm 的确认。它总是阻止重启,我没有任何确认保存任何东西的用例。
- 在 Appearance > Panes 中:我将边距值都改为 60。这使得一切更具可读性。
- 在 Profiles > General 中:我创建了自己的配置文件,并将工作目录改为“重用以前会话的目录,以避免总是从主目录开始。
- 在配置文件>颜色:我改变背景颜色为深蓝色
- 在配置文件>窗口:我添加透明度和模糊
- 在 Profiles > Keys > Key Mappings:我用预置的“自然文本编辑”替换了标准的,以便像使用其他编辑器一样使用命令和控制键
请随意探索更多选项!
zsh ->更好的外壳

https://ohmyz . sh;来自官方文件;作者截图
你可以在这里找到插件的概述:https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins-Overview
请遵循官方指南进行安装。只需在你的终端输入$ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"。
暂时就这样了。
自制->安装包
Homebrew 是“macOS(或 Linux)缺失的软件包管理器。”
只需按照他们的安装指南将/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"粘贴到终端上
之后,确保也执行终端提到的两个命令,即echo 'eval ....和eval " ...,它们将 bin 导出到您的路径中。你将需要这个来通过终端执行brew命令。
VS 代码->神奇的编辑器

来自官方博客:https://code.visualstudio.com/blogs/2021/10/20/vscode-dev,来自官方文档;作者截图
我总是选择使用 VS 代码作为我的轻量级编辑器。它有如此多的选项可以定制,其基本形式是处理代码的最佳环境之一。
它可以通过多个(开源)扩展进行定制和供电:2017 年我写了一篇关于我最喜欢的扩展的文章。也可以随意查看->https://medium . com/free-code-camp/favorite-vs-code-extensions-2017-786 ea 235812 f
我也使用 Pycharm 开发我的大部分代码,但是我仍然使用 VS 代码作为我的选择。有时候我只想改变几个文件,而不需要整个 Pycharm 初始化。那就是我用 VS 代码的时候。也适用于减价写作。就像我写文章一样。
下载 VSCode 并放入 Applications 文件夹后,用快捷键⇧⌘P打开命令面板,选择"Install 'code' command in PATH"。这样,你只需在你的终端上输入修复前的代码就可以打开文件。我们将在下一步中使用它。
哦,我的-zsh-> zsh 插件

https://ohmyz.sh/,来自公文;作者截图
终端的主题
有多个主题可以选择:https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
我总是用 robbyrussell

来自官方文件;作者截图
它简单明了,给了我处理代码时需要的所有信息。这是默认设置。但是,如果你想改变它或查看文件,请按照说明操作。
为了设置主题,我参考了以下文档:
要启用主题,请在~/中将 ZSH 主题设置为主题名称。zshrc,之前采购哦我的 Zsh 例如:ZSH _ 主题=robbyrussell 如果你不想启用任何主题,只需将 ZSH _ 主题设置为空白:ZSH _ 主题= " "因此我只需键入代码~/。用 vs 代码打开我的 zsh 配置文件。
之后重启 iTerm 重新加载你的主题,它应该看起来像截图中的样子:

来自官方文件;作者截图
终端的语法突出显示
这个包为 shell zsh 提供了语法高亮。当命令在 zsh 提示符下输入到交互式终端时,它可以突出显示命令。这有助于在运行命令之前检查它们,尤其是在捕捉语法错误方面。

来自官方文件;作者截图
安装它只需遵循安装指南:zsh-syntax-highlighting/install . MD
我们通过从下载zsh-syntax-highlighting来做到这一点
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
并将其添加到.zshrc file的插件列表中。
重启 iTerm 或者打开一个新的会话,你就可以开始了。
终端的自动完成

https://github.com/marlonrichert/zsh-autocomplete,来自公文;作者截图
它会根据历史记录和完成情况,在您键入命令时给出建议。
同样,安装时,只需遵循他们文档中的说明:https://github . com/zsh-users/zsh-auto suggestions/blob/master/install . MD
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
并将它添加到您的.zshrc 文件的插件部分。
重启 iTerm 或者打开一个新的会话,你就可以开始了。
数据科学相关
蟒蛇
这种安装的主要原因是它的包管理系统。对于大多数事情和概念验证来说,这是为您的数据科学相关工作创建合适环境的良好开端。特别是用不同的 python 版本来管理它可以成为救命稻草。我尝试了多种其他方法,直到现在,Anaconda 仍然是管理环境/包最轻松的方法。
您只需下载所需操作系统的版本,并附带安装包。
(舞台上由人扮的)静态画面
当我的团队使用 Tableau 并且购买了桌面许可时,我安装了 Tableau 桌面版来完成我的大部分 Tableau 工作簿。这是因为直到今天撰写本文时,Tableau Server 仍然缺少一些处理大型商业智能分析的关键功能。在我看来,桌面版本价格昂贵。然而,这是一个好产品。
数据科学工作的 Pycharm

来自官方文件;作者截图
查看他们的官方主页,浏览为什么它很适合你的需求:https://www.jetbrains.com/pycharm/
JetBrains 使用 Pycharm 的原因是,在我的整个工作经历中,它向我展示了这是处理大型数据科学项目的最佳一体化解决方案。即使您可以定制用于大型项目的 VS 代码,我认为 Pycharm 仍然比其他的有优势。
用于连接数据库和处理查询的 Datagrip 扩展非常好用,让我的生活变得更加轻松。
从调试、构建项目、执行代码等等。,得到你目前能得到的最佳体验。它不仅处理数据库部分,还允许 web 开发集成和其他东西,如 Jupyter 笔记本。我仍然使用 Jupyter notebook 来获得详细的探索代码(查看我在 Juypter notebooks 上的文章),但总的来说,这是我的首选软件,也是我的程序员笔记本电脑上的必备软件。
开源代码库
为了使用 Github,安装 Github CLI 是非常好的。
遵循他们文件上的说明。通过简单地执行brew install gh用自制软件安装它
在克隆存储库之前,您需要设置身份验证。
这是通过gh auth login完成的。只需遵循所有说明。然后你可以直接用
gh repo clone REPO_NAME
其他的
微软办公
使用微软 office 的主要原因是 Excel。许多公司都经常使用 Excel,但就功能而言,它仍然是无可匹敌的。由于客户经常发送带有各种功能的 excel 表格,我也需要使用 Excel。更多关于它的官方文件:https://www.microsoft.com/en/microsoft-365
操作系统相关
夜班
几年前,我用各种软件帮助我减少电脑屏幕上的蓝光。现在你可以很容易地使用 macOS nigh shift 功能。
点击这里了解:【https://support.apple.com/en-us/HT2
本质上,它让你的屏幕在夜间更“橙色”。原因是研究表明蓝光会妨碍良好的睡眠。随着许多程序员工作到深夜,这对我来说是一个游戏规则的改变。这对我帮助很大。这就是为什么我总是把它设置成暖色调。对于一个设计师来说,这是行不通的,但是对于一个程序员来说,这不是问题。只需注意更强烈的橙色调。
码头
当你得到一台新的 Mac 电脑时,你会发现屏幕底部有一个 Dock,里面有很多垃圾应用程序。所以,我做的是
- 去掉所有不必要的东西。除了经常使用的应用程序,我什么都不用。比如 pycharm,iterm,chrome,finder。就是这样。由于 spotlight 功能是在 mac 上推出的,因此不需要在 Dock 中放置任何应用程序。它们只会让景色变得杂乱
- 将 Dock 移动到右侧。现代的屏幕总是比高的长。我们不想因为这个停靠栏自动隐藏停靠栏而失去更多的高度空间。正如我所说,我们不想失去屏幕尺寸。
包裹
就是这样。这是我开始在工作中使用的每一台 Macbook 的设置。除了这些变化,当然还有各种特定软件的设置变化,但这些将在另一篇文章中讨论。如果你喜欢这篇文章,请留下一些掌声,如果你有任何意见,请发表评论。
你可能喜欢的其他文章
放弃
我与本文中使用的任何服务都没有关联。
我不认为自己是专家。除了做其他事情,我只是记录事情。因此,内容并不代表我的任何专业工作的质量,也不完全反映我对事物的看法。如果你觉得我错过了重要的步骤或者忽略了什么,可以考虑在评论区指出来或者联系我。
这是 2022 年 2 月 23 日写的。我无法监控我的所有文章。当你阅读这篇文章时,提示很可能已经过时,过程已经改变。
我总是乐于听取建设性的意见以及如何改进。
关于
丹尼尔是一名艺术家、企业家、软件开发人员和商业法毕业生。他的知识和兴趣目前围绕着编程机器学习应用程序及其所有相关方面。从本质上说,他认为自己是复杂环境的问题解决者,这在他的各种项目中都有所体现。

连接到:
直接:
艺术相关:
- 公海
- Instagram/art_and_ai
- 稀有
- 已知产地
- 中等/最先进的
- 魔鬼艺术
我如何使用米托加速我的数据分析过程
原文:https://towardsdatascience.com/how-i-sped-up-my-data-analytics-process-using-mito-f3a2a80e0bc8
数据分析| PYTHON |编程
使用这个了不起的 Python 包,用更少的时间做更多的事情

马修·施瓦茨在 Unsplash 上的照片
作为数据专业人员,我们每天都要花费大量精力处理数据,并提供关键见解。数据分析过程极其耗时且详尽,但同时,它也是整个实验的基础。但是我们如何改进这个过程呢?
进入米托,这是我最近发现的新开发的 Python 工具,它将我们的分析过程提升到了一个新的水平。米托是一个免费使用的软件包,它消除了所有复杂的数据处理,并把它们塞进一个易于使用的界面。最棒的是。它会根据您的操作自动生成相应的 Python 代码!
那么,让我们一起跳进水里去探索米托,好吗?
安装米托
首先,安装米托。米托集成在 Jupyter 实验室环境中。要开始使用它,我们首先必须通过 pip 安装米托软件包,如下所示:
python -m pip install mitoinstaller
其次是,
python -m mitoinstaller install
一旦安装过程完成,Jupyter 实验室标签将自动为您打开,我们可以开始玩米托。
将数据输入米托
在整篇文章中,我将使用来自Kaggle 知识库的新冠肺炎临床试验数据集。
在启动时,我们被要求登录(免费),然后迎接我们的是以下代码块:
# Run this cell to render a mitosheet
# See mito's documentation here: [https://docs.trymito.io/how-to/creating-a-mitosheet](https://docs.trymito.io/how-to/creating-a-mitosheet)
# Join our Discord for support here: [https://discord.gg/XdJSZyejJU](https://discord.gg/XdJSZyejJU)import mitosheet
mitosheet.sheet()
米托通过电子表格工作。那么,我们如何导入数据集呢?
选项 1: Pandas 整合
我们可以将熊猫数据帧直接传递给工作表对象。
df = <<SOME DATAFRAME>>import mitosheet
mitosheet.sheet(df)

从熊猫数据框创建米托表—作者图片
选项 2:导入功能
米托提供了一个打开文件查找器的 UI 按钮,允许我们直接导入任何本地存储的数据集。

从导入功能创建米托表单—按作者排序的图像
和米托一起玩耍
因此,我们只是将数据集加载到米托工作表中。现在怎么办?
米托的力量来自其敏捷的思维。米托使我们能够快速执行数据操作,如任何数据处理任务和数据可视化。这些操作都是通过它的电子表格 UX 处理的。然而,通过 UI 处理的每一个操作都会在下面的单元格中自动生成 Python 代码。
因此,米托允许我们快速分析和研究我们的数据集,但也为我们提供了相应的代码来扩展我们的实验。
米托提供的一些基本操作包括:
- 添加新列
- 删除一列
- 重新排序栏目
- 过滤列值
- 删除重复项
我们可以快速处理我们的数据。对于电子表格中的每一列,我们能够进行过滤和排序,还可以查看值的汇总。

汇总统计—按作者分类的图像
米托还允许我们在电子表格中直接使用 Excel 函数。例如,让我们创建另一个列,将男性的性别值替换为 1。我们可以通过以下方式简单地做到这一点:
=SUBSTITUTE(Gender, "Male", 1)

Excel 函数-作者图片

Excel 函数结果-作者图片
我们甚至可以与另一个数据集合并,或者从现有的数据集创建一个数据透视表。
让我们举一个简单的例子。让我们将数据集转换成一个数据透视表,以了解每个性别每个状态的研究结果。为此,我们只需点击旋转按钮,并设置我们想要的结果。

数据透视表示例—作者图片
我们可以很快观察到我们的结果有 3 行 13 列(从工作表的右下角开始)。我们还可以调整我们希望对我们的值使用哪种聚合—在本例中,我选择了计数。对于我们选择作为转换一部分的每个选项,米托都在后台生成相应的 Python 代码,并在下一个单元格中显示。米托为上述透视转换生成了以下 Python 代码:
我喜欢的米托的另一个令人敬畏的特征是动态视觉化。让我们快速绘制一个性别与 covid 相关干预的柱状图。

条形图示例—作者提供的图像
目前,米托允许我们将数据可视化为条形图、柱状图、散点图或箱线图。
再一次,我们在一瞬间就有了这种分裂:
所以,让我们通过一系列的步骤来想象米托到底有多强大。
在本例中,我进行了以下操作:
- 在位置 4 创建了一个新的空列
- 删除了新创建的列
- 透视数据以显示每个性别的状态计数
- 丢弃任何重复项
- 创建了状态计数的下图
- 将原始表与数据透视表合并

状态计数示例的箱线图—按作者分类的图像
这个过程花了我最多 30 秒的时间来完成——没有写一行代码!米托提供了以下代码:

所有步骤后的结果—作者提供的图片
米托还列出了整个过程中采取的步骤。

步骤历史-按作者分类的图像
缺失功能
米托肯定不是完美的,在我玩这个工具的整个过程中,我确实注意到了一些限制,如果有这些限制会很酷。例如,我发现在不同列之间执行计算分析的过程,比如计算 z 值,是不必要的复杂。
另一个我认为应该成为这个工具一部分的特性是执行 python 代码的能力。没错,米托的全部意义在于消除实际编写代码的开销;然而,在许多情况下,能够访问其他 Python 包是可取的。每当我想在同一个列上执行多个聚合时,情况尤其如此。在这种情况下,Excel 功能的相似性并不能解决问题。
不管它是什么,米托绝对是一个神奇的工具,可以快速检验我们的假设,并对我们正在处理的事情有所了解。我将米托作为我最初数据调查的一部分,并立即感受到分析时间的重大影响。米托的 Github 可以在这里找到。
你喜欢这篇文章吗?如果是的话,也许你可以考虑成为会员来支持我和你其他喜欢的作家。
https://david-farrugia.medium.com/membership
想给我买杯咖啡吗?
https://paypal.me/itsdavidfarrugia?country.x=MT&locale.x=en_US
想联系吗?
我很想听听你对这个话题的想法,或者任何关于数据和人工智能的东西。如果你想联系我,请给我发电子邮件至 davidfarrugia53@gmail.com。
Linkedin — Twitter
我如何开始写数据科学博客:克服恐惧和拖延
坦白地说,我不是一个成功的作家——甚至也不是一个特别成功的博客作者——所以如果你打算靠写文章谋生,这可能不适合你。然而,如果你是一个忙碌的数据科学家、机器学习工程师或软件工程师,有一段时间一直想开始写博客,但一直没有时间,希望这能帮助你开始。
在我本科学位的最后一年,我清楚地记得我的导师对我说了这样的话:
“虽然我很虚伪,但我认为你能做的最好的事情之一就是开一个博客。不幸的是,我自己从来没有做过,但我希望我做过”
我回应道:
"我很乐意,但我想我没有什么可写的"。
毕竟,有人知道的比我多得多,而且谁有兴趣听我说呢?
这种态度一直伴随着我,并阻止我这样做,直到许多年后,我从我的同事那里听到了同样或类似的说法。最近,在不止一个场合,这之后是一个关于我是如何开始的,以及我如何找到要写的东西的对话。
这篇文章的目的是详细描述我克服这种心态的思维过程和实践,希望它能引起处于类似位置的其他人的共鸣。如果你以前读过我写的任何东西,这是完全不同的。这完全是主观的,你可能不同意它的全部或任何部分。希望它对你有用,但可能不是对每个人都有用。

照片由 Unsplash 拍摄
寻找可以写的东西
让我们从最大的障碍开始,找到一个合适的话题来写。尽管从大学到整个职业生涯,我每天都在处理具有挑战性的问题,但我为此挣扎了很长时间。我用过的最大的借口之一,甚至在某种程度上仍然如此,就是它需要有突破性和原创性。在我目前的角色中,我与许多不同的客户合作,在进入下一个项目之前,一次做一个项目,即使在这些情况下,由于客户的保密问题和竞争优势,我们通常也不允许公开写下这样的披露!
从我记事起,我就留出特定的时间来研究和学习我感兴趣的科目——数学、机器学习、编程语言,甚至阅读历史书。通常,我会记录我对这些领域的探索和思考,如果我觉得它可能对我有用,我会把它作为参考。有几次,当朋友或同事评论说他们有兴趣探讨其中的一个话题时,我会与他们分享这些笔记。
让我大开眼界的时刻是,在分享了一份我用来主持客户设想会议的指南后,一位同事对我说,我应该把它发表在某个地方。在这一点上,我意识到——尽管以前尝试坐下来从头开始写博客失败了——在这些情况下,我已经完成了大部分工作,除了最后的发布。因为我早就打算开始写作了,所以我给自己设定了一个挑战。每次我花大量的时间在工作或学习新的东西时,我都会把它变成一篇博文。老实说,大部分都没有出版——也许我仍然是一个苛刻的批评家——但偶尔,它会很好地工作。
对我来说,一篇好的博客文章能节省我的时间。这不一定是什么原创,可以是我一直想读的一篇论文或一本书的总结。它可能是我以前读过的东西的展示,但以稍微不同的方式展示或解释,所以它只是“点击”;这方面的一个很好的例子是杰伊·阿拉玛的《变形金刚》。或者,它可以是一个解释清楚的教程,引导我解决一个问题,这样我就不用自己花时间去解决它。
当你觉得自己在奋斗了一段时间后真正完成了某件事情时——无论是在你使用多年的编程语言中找到一个让你震惊的新功能,在花了几个小时阅读一篇研究论文后终于理解了它,还是在彻底剖析源代码后终于使用一个文档有限的库完成了一项任务——这都可能是一篇博文的绝佳候选对象。你将为别人节省你自己获取知识所花费的时间。我建议问问你自己:这是不是对其他人有用的东西,否则他们会花时间去学习?如果你只是按照现有的教程学习,答案可能是否定的。但是,如果你花了几个小时阅读了大量冗长的文档,并将其汇总成一个简短的演示,那绝对是!
我发现完成一篇博文的最佳时间是尽可能接近这种成就感的时候;在最初的兴奋消退后,很难找到回头做某事的动力。
我为谁写作?
我从非常成功的博主那里听到的一件重要的事情是彻底了解和研究你的读者;你应该一直记在心里,尽全力去满足他们。总的来说,我认为这是一个很好的建议。然而,我认为,对于刚刚入门的人来说,你应该完全忽略这一点。

我面临的主要精神障碍之一是持续的想法:谁想听我说?我不认为自己是任何特定主题的权威,因为我的兴趣非常广泛,我不认为我与数据科学社区的任何特定子集有强烈的一致性。简而言之,我不知道谁是我的目标受众,这阻止了我开始行动。
使我能够克服这个障碍的是写博客时只考虑一个受众——我自己。更具体地说,我是几周前的自己,在我花时间研究我正在写的东西之前;我是几周后的自己,那时我已经有足够的时间去忘记那些更好的细节。
现在,当我开始着手一项我觉得可能是一个很好的候选人的任务时,我会问自己以下问题:如果现在有一篇关于这个主题的博客帖子在我面前,我会想知道什么?这个思考过程有助于我确定自己的目标,并关注我应该探索的领域。
完成探索后,我问自己另一个问题:如果我需要在未来的某个时候再次做同样的任务,我需要记住哪些细节?这有助于我确保我包含了做出某些决定背后的所有理由,并概述了任何需要的背景。
如果你不再担心你在为谁写作,而是专注于发布你自己觉得有用的内容,你永远不知道——你的读者可能会找到你。
如果没人看我的帖子怎么办?
我担心的另一个问题是,如果我花时间创作内容,但是没有人阅读,我会有什么感觉;那不就意味着我花的时间浪费了吗?

当与他人一起工作时,尤其是与初级团队成员一起工作时,我们经常会发现自己处于这样一种情况,即我们被要求向他人解释我们有经验的事情;这是团队合作的自然组成部分。如果你提供的答案能让提问者相信你对特定领域很了解,他们可能会推荐其他人和你谈论相同的话题。随着这种情况越来越多,你可能会发现自己成了某个特定主题的关键人物。想象一下,在一个问题被问了几次后,你记录下了你的解释;下次有人问你时,你可以向他们提供那份文件——这是你的第一个读者。
如果现有的博客帖子或教程已经提供了解决某个特定问题所需的一切,那么您不太可能需要投入大量的时间或精力来找到解决方案。然而,我通常发现有许多资源,每个资源都提供一些所需的信息,这些信息必须为手头的任务进行聚合。
我相信,如果阅读我是如何解决问题的,可以防止一个人花时间去执行与我相同的步骤来找到解决方案,或者帮助他们解决不同的问题,那么它就值得出版;如果两个人都经历了同样的问题,那么很可能还会有其他人!
就我个人而言,我很少关注浏览量或读者统计数据,甚至很少关注 LinkedIn 上强制性状态更新之外的帖子推广——为我网络中可能感兴趣的人——并将它们推荐给面临类似挑战的同事。
总的来说,我的建议是不要过多考虑谁会阅读你的内容。通过正式化你的思想,你强迫自己对你正在学习的主题更加严谨。此外,万一您遇到了一个对任何人都没有用的完全独特的问题,一个写得很好的已发布的解决方案将成为您将来需要它时的一个很好的参考!
一般写作建议
虽然没有两种写作体验是完全相同的,但这里有一些我认为有用的通用提示。
- 当我准备花大量时间调查一个问题时,我会带着这样的观点来处理它——如果我觉得我的知识有用——我会写一篇关于这个问题的博客。甚至用这种心态处理问题也鼓励我更加努力地让我的探索有条不紊。
- 如果我使用 Python,我选择的探索工具是 Jupyter 笔记本;这是一个探索性的环境,在这里我可以进行实验,也可以记录我的思考过程。然而,我的主要焦点是逻辑地记录实验过程,以及所采取的步骤;在 word 文档中混合使用文本和代码截图可以达到同样的目的。
- 从一开始就跟踪你的消息来源。这包括您阅读的任何书籍或博客,以及您借用和修改的任何代码。我喜欢把网址贴在我的笔记本上;这使得以后正确地确定事物的属性变得容易,并确保我引用了我使用的所有东西。
- 我总是从一个目标开始,并在笔记本的顶部明确地写下来。这可能非常宽泛,例如,“如何使用 Azure 机器学习运行 PyTorch 分布式培训作业”。
- 当用笔记本工作时——甚至在博客之外——我总是发现让想象我正在写一篇教程给其他人阅读会很有帮助;在代码单元之间记录我在做什么,为什么。当事情可能会改变时,这些可能会非常短,甚至不是完整的句子,稍后再详述。
- 没有什么比一个凌乱的笔记本更糟糕的了,我发现一个很好的指标是,如果你发现自己跳来跳去地乱序执行细胞。在这些情况下,我倾向于复制单元格,这样它就可以按顺序运行,然后将任何重复的部分重构为函数或类。
- 一旦我觉得我已经完成了我的目标,我发现按顺序浏览笔记本很有帮助,并且想象我正在向坐在我旁边的人展示我的工作。每次我觉得需要解释什么的时候,我都会把它写下来。这也是对代码和笔记本结构进行最后清理的好机会。
- 你出版的时间越长,怀疑就会开始蔓延。一旦你觉得你已经完成了,校对几次,移植到你选择的平台,然后发布!你错过的任何小错误都可以在以后改正。
最后的想法
相对来说,我还是个新手,但我真的相信写博客对我的整个学习过程有着不可思议的帮助,当人们要求我分享我一直在探索的领域的学习成果时,它给了我指引方向的资源。
虽然这仍然让我感到惊讶,但在很少的情况下,有人接近我——无论是亲自还是通过信息——让我知道我写的东西可以帮助他们,这感觉非常值得!
如果写博客是你已经思考了一段时间的事情,或者如果你对它是否适合你持观望态度,我会彻底建议你暂停所有的怀疑,至少尝试一次;毕竟,最坏能发生什么?
克里斯·休斯上了LinkedIn。
参考
- 建立成功的机器学习项目|作者克里斯·休斯|微软数据科学| Medium
- 图解变压器——Jay alam mar——一次可视化一个概念的机器学习。(jalammar.github.io)
- 使用 Azure 机器学习和 PyTorch 加速技术对 PyTorch 模型进行轻松的分布式培训|由克里斯·休斯| 2021 年 12 月|迈向数据科学
我是如何用本福德定律测试匈牙利选举的舞弊行为的
我使用本福德定律测试了几个数据集,了解了其中的优势和缺陷。

根据本福特定律分配第一位数。除非另有说明,所有图片均为作者所有
我最近偶然发现了一个叫做本福德定律的概念。我正在听一个丹麦的播客——主持人介绍了一个概念,如果你对数据集中每个数字的第一个数字求和,每个数字的出现应该遵循一定的分布。他说,这可以被用作检测税务欺诈和标记虚假社交媒体简介的一种方式。

这里用红色标记的是一个数字的第一个数字。
什么是本福德定律?
定律基本上表明,任何自然产生的数据集的第一个数字的总和应该遵循这种分布:大多数数字,30%以 1 开头,17 %以 2 开头,依此类推,如第一幅图所示。
“这听起来不太对,”我起初想。我在学校学过中心极限定理,也只是直觉上觉得不对。
在结束播客后,我立即测试了 BL 关于自 1970 年以来世界上所有国家的年度军费开支(因为我当时是出于其他原因而查看这些数据)。脱离政治背景,这些数字看起来是随机的,因此应该是一个完美的测试数据集。结果成功了!

BL 第一位数分布与世界军事预算第一位数分布的比较
至少上图中第一个数字的分布看起来非常相似。为了进一步测试,我做了卡方拟合优度测试。
对于α = 0.05 的显著性水平,与本福特分布的比较支持预测分布和观察分布之间无差异的零假设(χ 2 = 0.970,df = 8,p = 0.9984)。
也就是说1970 年以来世界各国军费预算的第一位数字都遵循本福特定律。我还是觉得很诡异,就一头扎进了背后的逻辑。
原来这是简单的数学,这种类型的数据往往符合对数正态分布,第一个数字的概率可以表示如下:

我不打算解释它工作的更深层次的数学原因,但是如果你感兴趣,你可以在这里阅读,在这里阅读,在这里阅读。
它如何检测欺诈?
好的,播客主持人说商业智能可以用来检测欺诈。这是怎么回事?
数据集符合 BL 的条件之一是数据必须是随机生成的,如果 1)它们不受最大值和最小值的限制,2)它们没有被分配数字,那么它们就是随机生成的。
我认为假设世界上河流的长度是随机分布的是安全的。世界各国的军事预算似乎也是如此。
选举数据
那么选举数据呢?如果一个特定的候选人在特定的投票站获得 1000 或 999 张选票,我们会认为这是随机的。这意味着,如果没有发生操纵,选举数据应该遵循 BL。
首先,我想测试一次合法的选举,与匈牙利的选举进行比较。在丹麦,我假设选举欺诈的概率非常低,所以我测试了 2019 年丹麦上次选举的数据。这里的数据是免费提供的。
从这个国家的所有投票站得到每个政党的所有选票,我得到了一个 18714 个投票号码的列表。

本福特分布和丹麦投票站数据的第一位数分布进行了比较。
对于α = 0.05 的显著性水平,与本福特分布的比较支持预测分布和观察分布之间无差异的零假设(χ 2 = 0.046,df = 8,p = 0.9999)。
所以投票站的投票数据绝对符合 BL。
让我们花点时间想想这意味着什么。我们期望数字的随机分布符合 BL,但是当然这些数字可以根据 BL 被操纵,欺诈或不公平也可能以不影响第一个数字的方式发生。因此 BL 不能证明*不存在欺诈。*****
所以丹麦选举中没有明显的舞弊——正如预期的那样——但是匈牙利人呢?
匈牙利选举数据
欧盟成员国匈牙利刚刚在 2022 年 4 月 3 日再次选举其总理维克托·欧尔班。由于乌克兰战争和欧尔班与俄罗斯总统普京的密切关系,一些猜测选民的反弹,但欧尔班的青年民主党/KDNP 联盟赢得了议会 199 个席位中的 135 个席位的压倒性多数。
虽然欧尔班确实受到了大量匈牙利公众的青睐,但一些组织一直在关注匈牙利的民主状况:媒体偏见和选举欺诈。
这场巨大的胜利,以及对匈牙利民主的所有担忧,让这场选举成为一些选举辩论的绝佳候选。
我没有找到可供下载的公开的投票站数据集——但我在匈牙利官方公投网站上找到了选区投票号码。为了获得数据,我写了一个小的 scraper 脚本,可以在我的 GitHub 页面上找到,还有用来创建本文中所示图表的分析笔记本。你可以自己尝试一下!scraper 给了我 663 个数据点的选区投票数据集

这次我们看到了实质性的差异,零假设被拒绝(p 值为 0.004 < 0.05).
So in this case the data does not conform to Benford’s distribution. I was so excited when I saw this result. It shows that Victor Orbans win was not genuine. Or what?
对本福特选举取证定律的批评
在发现匈牙利选举的数据不符合 BL 后,我做了更多的研究。2020 年,当像我这样的互联网人用本福德定律来“证明”美国总统选举存在欺诈时,用本福德定律测试选举受到了几位专家的严厉批评。严厉的批评可能也是因为这一次前总统唐纳德·特朗普(Donald Trump)试图抹黑选举结果,所以每个人都在担心是否会正确。
在本文中,路透社事实核查小组联系了本福德法律和选举取证方面的几位专家。他们都同意 BL 不能作为证据,而仅仅是一个可以促使进一步调查的危险信号。在美国 2020 年总统选举的具体案例中,投票站的小规模使数据集违反了数据跨越几个数量级的规则。他们还表示,如果您想使用 BL,您需要进行第二位数字分析,因为它对选区大小不太敏感。
了解到这一点后,我在匈牙利选举中测试了 2BL,即本福特第二位数定律。2BL 的工作方式与 BL 类似,但数字分布略有不同。结果是:2BL 分析与匈牙利的投票数据非常吻合。

所以当你这样看的时候,匈牙利的选举很符合基本法,这表明没有理由在这个问题上发出任何危险信号。
第一个数字不工作的原因
那么为什么 BL 测试对第一位数字不起作用呢?看看在议会中获得席位的三个政党之间的票数分布。我们可以看到,在 20K 和 40K 之间有很多选票,这将解释第二和第三位数字的超额代表。下一次,这是我要做的第一个图,看看 BL 测试是否可行。

进入议会的三个政党的投票数分布。很明显,有很多数字的第一个数字是 2 和 3——因此给出了倾斜的第一个数字 BL 测试
结论:
本福德定律是一个有趣而令人惊讶的概念——但当用它来检测选举欺诈时,你需要小心——数据集可能会因为操纵以外的其他原因而偏离本福德分布,即使这样,它也只能被用作发出危险信号的方法——而不是证明欺诈。
一路上我玩得很开心,也学到了很多东西!在 LinkedIn 和 GitHub 上随意联系,谈论更多关于选举舞弊、数据科学或任何介于两者之间的事情!
我是如何将 Excel“怪物”转化为 BI“美女”的
原文:https://towardsdatascience.com/how-i-transformed-excel-monster-into-power-bi-beauty-c7ba8395959c
在 Power BI 中,从 18 个 Excel 表格中的 380 个表格到单个报告页面中的一个表格,您认为如何?!魔法?奇迹?
查看计算组如何帮助您实现(im)可能性!

作者图片
亲爱的读者,在你继续之前,请记住下面的例子是一个真实的用例! 当然,本文中的数字和指标进行了调整,以避免丢弃真实的客户数据,但其结构和整体思想与现实中 100%相同!
就在最近,我正在处理为一个客户改进报告的任务。当前的设置如下:Excel 报表,构建在一个巨大的 CSV 文件之上(从其中聚合数据),有 18 个选项卡,每个选项卡中有 21 个表格!大概是这样的:

作者图片
如您所见,主表单上有 21 个表格。每个表只包含一个指标(按年度和零售与公司细分)…这同样适用于营销表,它包含完全相同的指标,唯一的区别是数字经过过滤,只包含与营销部门相关的数据。而且,您猜怎么着:每个后续的表都包含相同的度量组,与特定的业务线相关。主工作表合并了其他工作表中的数据,显示整个公司的总计。
现在,如果你问我,这是一个可怕的解决方案,因为大多数数据都是冗余的,很难找到任何见解,更不用说在部门之间进行基本的比较了!在 18 个单独的表格中上下滚动,同时试图对齐数字——不要误解我的意思,但这必须是一个更好的方法!
搭建舞台—介绍 Power BI
正如我在之前的一篇文章中所描述的,设计高效分析解决方案的第一步也是最重要的一步是了解业务问题!一旦您确定了需要回答的关键业务问题,您就可以将注意力转移到寻找最佳工具和技术上。
经过最初的讨论,我们得出结论,Power BI 应该是首选工具,而不是 Excel。好吧,我们检查了一个框,但是下一个明显的问题是:向消费者呈现相同数据的最佳方式是什么?我们应该利用哪种技术或功能来充分利用现有的数据?我的意思是,我们可以简单地将 Excel 中的逻辑复制/粘贴到 Power BI 中,也许还可以在这个过程中添加一些很酷的可视化效果……但是,这是最适合我们用户的吗?
如果我告诉你,最终的解决方案只有一个报告页面,上面只有一个表格,那会怎么样? 让我给你算一下:而不是 18 张,每张 21 个表格(这是 ca。总共 380 个表),我们将在一个报告页面上使用一个表来实现相同的结果!不信任我?!只要继续读下去…
为工作选择正确的工具—计算组
经过一些修补,我决定尝试计算组。对于那些不知道的人来说,这是表格模型的一个非常强大的特性(因此,它不是 Power BI 独有的特性,因为您也可以在 Analysis Services 表格中利用它)。
解释计算组及其工作方式超出了本文的范围,但是我强烈建议查看马尔科和阿尔贝托关于该主题的文章,或者查看由来自埃斯布林纳的伯纳特·阿古罗撰写的许多精彩帖子中的一篇,在那里您还可以找到一些超出基础的计算组实现。
因此,想法如下:由于我们基本上在每个 Excel 表中使用相同的计算集(本年度值、上一年度值、本年度和上一年度之间的比较),为什么不创建一个计算组来处理所有必要的计算,然后让用户可以选择应用计算的指标(收入、成本、准备金等)。).根据用户的选择,相应的指标及其所有计算项目将显示在表格中…听起来很混乱?相信我,这比你想象的要容易…
构建解决方案
如果你想使用计算组,你需要的第一件东西是表格编辑器,因为目前还不能从 Power BI Desktop 创建计算组。我真诚地希望您了解表格编辑器,并且正在使用它,这不仅仅是因为计算组,还因为许多其他非常有用的特性,这些特性使 Power BI 开发人员的生活变得更加轻松:)
一旦我们打开表格编辑器(我在这个演示中使用免费版本的表格编辑器),第一步是创建一个新的计算组。右键单击表并选择创建新的计算组:

作者图片
我将我的计算组命名为“时间智能”,现在我们开始在计算组中定义我们的计算项。右键单击计算组,选择添加新的计算项:

作者图片
下一步是定义所选计算的当前值。这里,我将简单地使用下面的语法:
SELECTEDMEASURE()
让我停下来解释一下这个 SELECTEDMEASURE()是什么意思。这将被用作对当前上下文中的度量的引用。它可以是销售额、订单数量等等…在我们的场景中,这将是总收入、总成本、供应等等。
接下来,我们要计算前一年范围内的度量值。因此,我将使用以下公式创建另一个名为 Previous 的计算项:
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR('Date'[Date])
)
我们在报告中需要的第三个计算项目是当前值和前一年的比较:
SELECTEDMEASURE() - CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR('Date'[Date])
)
最后,我们还想将这一差异显示为百分比,因此让我们创建第四个计算项:
DIVIDE (
SELECTEDMEASURE (),
CALCULATE ( SELECTEDMEASURE (), SAMEPERIODLASTYEAR ( 'Date'[Date] ) ),
0
) - 1
对于这一项,我们还需要确保它的格式正确,因此在“格式字符串表达式”属性下,我将对其进行设置以显示百分比:

作者图片
还可以通过设置 Ordinal 属性的值来重新排列组内项目的顺序。在上图中,您可以看到“+/- %”项目的序号值为 3,而前面的项目分别被指定为 0、1 和 2,这意味着“+/- %”项目将在组中最后显示。
现在,由于我们希望用户能够选择在表中显示哪个指标,我将创建一个额外的计算组,并将其命名为 Measure Selector。然后,我将为每个指标定义计算项,如下所示:

作者图片
您可以在这里看到我们的所有指标,因此我现在将保存对数据模型的更改,关闭表格编辑器并返回 Power BI Desktop 以构建报告:

作者图片
正如您可能注意到的上图,我已经将 Name 从 Time Intelligence 计算组拖到我的 matrix visual 上作为列,将我的总收入度量作为值,并将 Calendar Year 和 Corporate/Retail 放在行上。
此外,上面的切片器(是的,这是一个常规切片器可视格式,用于提醒按钮)包含度量选择器计算组中的所有计算项。

作者图片
在左侧,我已经创建了一个切片器窗格,用户可以在其中轻松地在部门或公司与零售之间切换。用户还可以从日历切片器中选择特定的年份。
最后,让我们看看如果我在切片器中选择不同的指标会发生什么:

作者图片
这太棒了。
正如您所看到的,一旦我在切片器中选择了不同的指标,表格中的数字就会发生变化(在演示文件中我省略了其他的视觉效果)。如果仔细观察,切片器中有 21 个项目,每个 Excel 表中的每个表都有一个项目。所以,我们只有一张桌子,而不是 21 张!
左侧的过滤器取代了创建单独表格的需要,因为现在可以在当前报告页面的范围内对数据进行切片和切块!
结论
从 21 张表格中的 380 个表格到单个报表页面上的一个表格 你怎么称呼?!魔法?奇迹?
通过利用表格模型中的计算组功能,我能够构建一个显著降低复杂性的解决方案,并使报表用户能够快速轻松地从底层数据中获得洞察力。
更不用说可伸缩性了,想象一下我们需要添加 10 个新指标或添加一个新过滤器(即部门),而不是在每个表中创建 10 个额外的表,或为新部门引入额外的表,我们可以简单地扩展现有的计算组,并继续使用我们的单页报告解决方案!
感谢阅读!
我如何从学术界过渡到数据科学行业
一天,我意识到是时候开始新的冒险了。以下是持续不断的小努力如何为我的下一个角色打下基础。

https://pxhere.com/en/photo/1284568
我想分享我从学术界过渡到数据科学的经历,因为这可能会让许多有类似经历的人受益。更广泛地说,我的经历也有助于为实现你的目标打下坚实的基础——过渡到一个完全不同的领域。
大概从 10 岁开始,我就一直想成为一名科学家。因为许多近亲都是学术界的科学家——获得博士学位,然后是博士后,最后成为教授是我的目标。这个目标在很多年里都是遥不可及的,因为我在学校是个糟糕的学生。但是,当我开始从解决高等物理和微积分问题中获得乐趣,而我的朋友们更关心分数而不是科目时,这一切都改变了。我在大学时下定决心要追寻我的梦想,成为一名物理学家。
从那以后,通过努力工作和奉献精神的结合,以及我寻找解决研究问题的天生的创造性倾向,事情相对顺利。我在印度著名的 IIT 获得硕士学位,在埃默里大学获得博士学位,在佐治亚理工学院获得博士后学位。所有的迹象都表明我走在正确的道路上。在我读博士期间。我被埃默里大学物理系授予了最佳研究生奖,在 PNAS 发表了一篇第一作者论文,并有许多其他合著出版物。在我博士后期间,我在 GeorgiaTech 博士后研讨会上被授予机器人相关研究的最佳演讲人,我的工作在 Forbes 、 BBC 等媒体上被广泛报道。我给出这个背景来说明我是如何专注于学术界的,以及为什么享受你此刻正在做的事情是重要的。
最后,我在佐治亚·格温纳特学院找到了一个教职——这是一所位于亚特兰大地区的本科学院。我很享受在那里的时光,可以自由地教授我自己设计的课程,选择研究项目,并拥有自己的大部分时间。在 GGC 的第三年快结束时,我决定是时候改变一下了。一个月后,我找到了一份高级数据科学家的新工作。然而,这并不意味着我只准备了一个月。在这里,我谈谈我过去三年的努力是如何成为我人生旅程的垫脚石的。
使用数据进行研究
我一直对理解世界上的模式非常感兴趣。因此,当我作为博士后有时间开发一个独立的研究项目时,我想把交通模式作为一个物理问题来探索。最终,我们对网络攻击后交通模式将如何瓦解做出了初步估计。为了这个项目,我研究了大量交通数据——包括来自谷歌、HERE API、纽约市出租车数据、开放街道地图等的数据。我还开发了一个简单的算法,通过本地摄像头追踪车速。
虽然我在这些项目中使用的数据科学方法没有一个是突破性的,但它让我在现实世界的背景下获得了数据提取、清理和一些基本机器学习的实践经验。
数据孵化器奖学金
我参加了为期 8 周的远程数据科学研究。当时我对学术更感兴趣,但如果我找不到学术职位,我希望数据科学成为下一个选择。我得到了一堆奖学金项目的面试机会,几乎是一份工作邀请。我的顶点项目也在推介之夜得到了强调。最终,我决定不去芝加哥的一家公司实地考察,因为几天前我的妻子刚刚生下我们的双胞胎,我也刚刚在 GGC 大学找到了一份学术教授的工作。这项奖学金最重要的一点是,它让我接触到了同龄人,其中大多数人在获得奖学金后选择了数据科学,并让我大致了解了入门级数据科学家的技术技能和要求。另一个不能轻描淡写的方面是它给我带来的心理优势。
在 TDI 之前,我感觉自己像一个精通 python 的物理学家。在 TDI 之后,我感觉自己像一个数据科学家。
这是在 2019 年,但这种心态此后一直存在。
博客
我在 Medium 上的第一篇文章是在 2019 年 10 月——如果下一次大规模黑客攻击涉及到你的车辆而不是你的安全摄像头,会怎么样?这一个月来,它的表现令人沮丧,获得了大约 20 次浏览。但是那时我不知道向更大的出版物投稿。一位来自初创公司(当时 Medium 最大的出版物)的编辑联系我,让我发表这篇文章。从那以后,我一直在顶级媒体出版物上发表文章,尤其是在数据科学方面。
与更大的数据科学社区发布和分享我的工作帮助我在求职面试过程中脱颖而出。
咨询、辅导、指导
我开始阅读人们如何在像 Fiverr 和 Upwork 这样的平台上销售数据科学服务的故事。与此同时,我在读博士期间也尝试过在公共辅导平台上创建导师账户——尽管我从未真正跟进过。
当我在在线平台上做实验时,我偶然发现了对数据科学辅导的巨大需求。因此,许多大学和学院已经开始提供数据科学硕士课程和本科生专业。我有几个好学生,他们重视我的辅导课,给了我很好的评价。随着时间和收视率的增加,我增加了每小时的费用。令人惊讶的是,我发现当我提高速度时,请求并没有显著减少。事实上,我收到了来自哈佛、哥伦比亚、伯克利等顶尖大学的学生。我甚至给一个人辅导了一个学期,这个人的父亲是一家财富 500 强公司的首席执行官。我还获得了一个长期客户,他就开发图像对象检测平台向我提供咨询。

塞犍陀·维韦克
我在 Fiverr 上也取得了一些成功。

塞犍陀·维韦克
咨询和辅导帮助我通过学习先进的机器学习技术和帮助客户实现目标而获得报酬。
面试,面试,面试…
当我决定转型时,我的数据科学咨询和辅导经历让我有点紧张。我想肯定的是,就业市场上肯定有大量的申请者——因为每个学院或大学似乎都在开设 DS 课程。

德国科隆:科隆南桥(klner süDBRücke)的一群牧羊狗和一只黑羊
然而,只有在 2022 年 3 月至 4 月的采访中,我才意识到两件事:
A.那段时间有创纪录数量的职位空缺(通货膨胀还不是一个问题)
B.每个自称是数据科学家或者有数据科学学位的人都是不称职的。
后者其实事后来看是显而易见的。我辅导了很多顶尖大学的学生,他们根本不知道自己在做什么。
与招聘人员的一次偶遇让我明白面试就像在健身房做练习。做得更多,你会做得更好。面试是求职过程中最重要的部分。你在面试中变得更好的唯一方法就是做更多的面试!
不要害怕失败
在你觉得准备好之前,不去面试是很自然的。但是如果你像我一样,你可能永远不会觉得自己 100%准备好了。这就是危险所在——陷入舒适区,为现在不是合适的时机找借口。
我几乎失声,因为一种不相关的流感在我的孩子们的日托所里传播。我申请了简历上有错误的工作。但我还是去面试了,尽管有时我的喉咙不配合。当我一周没有得到面试机会时,我修改了我的简历,让它更有吸引力。之后,招聘人员找到了我。
我发现的最糟糕和最具道德破坏性的工具之一是 Jobscan。我没有听到任何人对 Jobscan 说负面的话——但它对我不起作用。Jobscan 会扫描您的简历和职位发布,并给出匹配分数。我从未在求职扫描系统中获得过 20%或 30%以上的分数——他们建议只有当你的分数达到 70%或更高时才申请。如果我那样做了,我会把我的简历裁剪到今天!现在我得到了这份工作,我打赌我会从 Jobscan 得到更高的分数,因为我的简历上有这份工作(非常感谢 Jobscan…)。
记录下你不写博客的所有事情
如果你关注阿里·阿布达尔的 Youtube 频道,你会发现他在医学院非常成功,同时也成为了 Youtube 上的名人。他的生产力工具之一是使用概念做笔记。我使用概念来巩固我的 DS 知识;尤其是在工作面试的时候。它不是很有条理,但确实有用。

我的数据科学概念数据库|塞犍陀·维维克
结束语
成为新领域的“专家”不仅仅是有一个特定的目标,并实现它。至少对我来说,旅程比最终目的地重要得多。想一想——如果你决定了一个目标并实现了它,一旦实现了你会做什么?更有可能的是,在没有未来计划的情况下,你可能会崩溃和筋疲力尽。此外,大目标每天都在变化。如果你突然决定下一年的目标,然后明天又改变主意,会怎么样?
反之,如果你在不断的旅程中,享受每一刻;任何目的地都是前进道路上的一步。创造积极的习惯更有可能经受住不断变化的思想。如果你决定每周写博客并坚持 9 周,那么你不太可能在第十周就放弃。你可能会休息一会儿——但之后更容易回到状态。写了 30 篇博客后,招聘人员可能会联系你,你会得到一个面试机会,在那里你可以谈论你的博客,并得到一份理想的工作。
相比之下,我们的目标是一年后转到数据科学工作,而不是持续努力。这可能是一个不切实际的目标,尤其是如果你不能向别人展示你有相关的经验。许多成功人士也以其他方式表达这种巧妙的心理转变。
正如玛丽亚·莎拉波娃所说:
“我执行的任务非常不同。这并不是说我有或者没有必要成为冠军。我正在学习,成长为一名更好的网球运动员。”— 玛丽亚·莎拉波娃
Ravikanth Naval 说:
"对行动不耐烦,但对结果有耐心."— 海军拉维坎特
在《微小的习惯》一书中,B.J .福格讨论了专注的日常小活动如何对你的生活产生巨大的积极影响。
最后,如果你对自己的转变持积极态度,并做出必要的努力——无论是写博客、发表研究、咨询、写书、在社交媒体上发帖、花时间发挥创造力等等。你正在做出最好的投资决定——投资于你的健康和成功,无论你是否到达了最初的目的地,或者发现了你想象不到的更棒的东西。
如果你还不是中会员,想支持我这样的作家,可以通过我的推荐链接随意报名:https://skanda-vivek.medium.com/membership
关注我 如果你喜欢这篇文章——我经常在数据科学、安全、物理和社会的界面上写作。
每周数据透视 订阅此处 !
我如何在数据科学访谈中使用 Python 中的日期时间特性
使用 Python Pandas 的日期时间功能概述

作者在 Canva 上创建的图片
在本文中,我们将研究 Python Pandas 中 DateTime 库的一些不同应用。就上下文而言,每当您必须在 Python 中操作表格数据时,您通常可以使用 Pandas 库来完成。就像您可以使用 Excel 或 Google Sheets 一样,Pandas 为您提供了更多处理结构化数据的能力。你可以在这里找到更多关于熊猫生态系统的信息,也可以在这里阅读它的大量文档。强大的熊猫技能是 Python 数据科学面试中最常见的期望之一。
Python Pandas 中的日期时间特性
日期时间操作是最常被问到的数据科学面试问题之一。DateTime 数据集的普遍性和人们可以用看起来简单的数据实现的一系列复杂性使它成为一个流行的数据科学测试领域。Pandas 有许多 DateTime 函数,涵盖了广泛的 DateTime 用例,你可以在这里阅读关于它们的官方文档。
DateTime 函数最常见的一个用例是在清理数据时获取正确的日期格式。在许多情况下,您的日期时间数据太复杂,需要简化到一周中的某一天或一天中的某个小时。在其他情况下,您的数据没有日期或时间,您需要使用 DateTime 库为您的计算添加合理的日期。
为了实现这种格式化和丰富,Pandas 中的 DateTime 函数允许您将字符串或列解析为 DateTime 格式,生成定期的 DateTime 信息,从 DateTime 对象中提取日期或时间信息的子集,等等。
展示这些 Panda DateTime 函数如何工作的最佳方式是通过示例,因此我们将涵盖一些需要使用 DateTime 函数的 Python 面试问题。
需要 Python Pandas DateTime 函数的访谈示例

作者在 Canva 上创建的图像
如何使用 today()方法丰富日期时间数据
我们要看的第一个例子有助于解决优步数据科学采访中的一个问题。

截图来自 StrataScratch
问题链接:https://platform . stratascratch . com/coding/2046-已达到最大员工数
这个问题要求我们查看在优步工作的每一位员工,并确定优步员工在任职期间的最大数量以及这个最大数量出现的第一个日期。
当谈到理解我们为什么必须使用日期时间函数时,我们通常必须首先分析数据集。在这个问题中,我们只有一个表 uber_employees 可供查看。

截图来自 StrataScratch
以下是一些示例数据:

截图来自 StrataScratch
拥有像雇佣日期和终止日期这样的日期时间列是不够的,我们需要调用日期时间库。相反,由于该数据包括仍在优步的雇员的 termination_date 列,我们不得不假设当前雇员的该列为空。这很重要,因为我们需要插入他们结束日期的实际数据,以计算雇佣范围并得出我们的解决方案。
为了丰富内容,我们将遍历表,如果存在终止日期,则将结束日期指定为终止日期,如果不存在终止日期,则将终止日期指定为今天。
import pandas as pd
import datetime as dt
for i in range(uber_employees.shape[0]):
if uber_employees.at[i, 'termination_date'] is pd.NaT:
end_date = dt.datetime.today()
else:
end_date = uber_employees.at[i, 'termination_date']
注意 datetime 库最初是如何用别名 dt 导入的。我们使用这个库的模块 datetime 以及它的 today()方法将任何当前雇员的结束日期指定为今天的日期。
由于该解决方案有些复杂,我们不打算详细介绍它的其余部分,但是,它看起来是这样的:
import pandas as pd
import datetime as dt
hired_dates = pd.DataFrame(uber_employees['hire_date'].rename('date'))
hired_dates['value'] = 1
terminated_dates = pd.DataFrame(uber_employees['termination_date'].
rename('date'))
terminated_dates['value'] = -1
terminated_dates = terminated_dates.dropna()
all_dates = pd.concat([hired_dates, terminated_dates], ignore_index=True)
all_dates = all_dates.groupby('date').sum().reset_index()
all_dates = all_dates.sort_values('date')
all_dates['emp_count'] = all_dates['value'].cumsum()
for i in range(uber_employees.shape[0]):
if uber_employees.at[i, 'termination_date'] is pd.NaT:
end_date = dt.datetime.today()
else:
end_date = uber_employees.at[i, 'termination_date']
start_date = uber_employees.at[i, 'hire_date']
max_emp_count = all_dates[all_dates['date'].between(start_date, end_date)]
['emp_count'].max()
uber_employees.at[i, 'max_emp'] = max_emp_count
earliest_date = all_dates[(all_dates['emp_count'] == max_emp_count)
& (all_dates['date'].between(start_date, end_date))]['date'].min()
uber_employees.at[i, 'min_date'] = earliest_date
result = uber_employees[['id', 'max_emp', 'min_date']]
如果你对详细的演练感兴趣,请参考本文→ 优步数据科学家面试问题演练。
如何使用工作日和小时访问器解析日期时间数据
我们要分析的第二个例子有助于回答关于送货司机平均收入的 Doordash 问题。

截图来自 StrataScratch
问题链接:https://platform . stratascratch . com/coding/2034-平均每工作日每小时收入
我们看到问题要求我们返回基于一周中的小时和天的平均收入,所以我们已经有一些迹象表明我们将必须进行某种形式的日期时间操作。
该问题仅使用了具有以下字段的 doordash_delivery 数据集:

截图来自 StrataScratch
示例数据如下所示:

截图来自 StrataScratch
同样,仅仅在我们的数据集中有日期时间列还不足以得出我们需要调用日期时间库的结论。相反,这里的关键信息是必须基于小时和天进行计算,我们可以看到没有一个列只隔离小时或天。
我们首先需要从 customer_placed_order_datetime 字段中提取星期几和小时。首先,我们使用. dt.weekday 属性获取星期几。查看文档,得出星期一为 0,因此,由于问题提示我们从星期一的 1 开始,我们在提取的日期的结果上加 1。
*# Import your libraries*
import pandas as pd
*# Keep relevant fields*
dd_df = doordash_delivery[['customer_placed_order_datetime', 'order_total']]
dd_df['weekday'] = dd_df['customer_placed_order_datetime'].dt.weekday + 1
提取一天中的小时与. dt.hour 属性类似。
dd_df['hour'] = dd_df['customer_placed_order_datetime'].dt.hour
最后,你所要做的就是根据一周中的每一天和一天中的每一个小时进行合计。解决方案最终看起来是这样的:
*# Import your libraries*
import pandas as pd
*# Keep relevant fields*
dd_df = doordash_delivery[['customer_placed_order_datetime', 'order_total']]
*# Get the day of the week (add 1 to keep have Monday = 1)*
dd_df['weekday'] = dd_df['customer_placed_order_datetime'].dt.weekday + 1
*# Hour of the day*
dd_df['hour'] = dd_df['customer_placed_order_datetime'].dt.hour
dd_df.groupby(by = ['weekday', 'hour'], as_index = False).agg({'order_total': 'mean'})
查看上面的代码,我们的聚合函数需要根据提取的工作日和小时数据进行分组,以便计算每个工作日和小时的平均收入。
如何将格式化字符串转换成特定的日期时间数据
第三个例子来自一个关于用户增长率的 Salesforce 面试问题。

截图来自 StrataScratch
问题链接:https://platform . stratascratch . com/coding/2052-user-growth-rate
此问题要求我们计算 Salesforce 中每个帐户从 2020 年 12 月到 2021 年 1 月的活跃用户增长率,并列出它们。
我们只有一个单一的 sf_events 数据集,看起来相当简单。

截图来自 StrataScratch
数据看起来像这样:

截图来自 StrataScratch
查看我们的示例数据,我们可以看到,当我们真正需要将其缩小到月份和年份时,我们得到了诸如日期和时间之类的信息。我们可以使用日期时间库中的唯一方法。strftime(),它根据所需的格式将日期时间数据转换为字符串。
*# Import your libraries*
import pandas as pd
*# Create the Year - Month indicator*
sf_events['month'] = sf_events['date'].dt.strftime('%Y-%m')
注意我们是如何在?strftime()方法只提取年份和日期。接下来,我们将月份限制在 2020 年 12 月和 2021 年 1 月。请记住,字符串过滤器需要匹配 strftime()方法中指定的格式。
summ_df = sf_events[sf_events['month'].isin(['2020-12', '2021-01'])]
现在,我们使用数据透视表汇总这几个月的数据,计算增长率,并将输出限制在相关的列中。这是最终的解决方案:
*# Import your libraries*
import pandas as pd
*# Create the Year - Month indicator*
sf_events['month'] = sf_events['date'].dt.strftime('%Y-%m')
summ_df = sf_events[sf_events['month'].isin(['2020-12', '2021-01'])].pivot_table(
index = 'account_id', columns = 'month', values = 'user_id', aggfunc =
'nunique').reset_index()
*# Calculate growth rate and output relevant columns*
summ_df['growth_rate'] = summ_df['2021-01'] / summ_df['2020-12']
summ_df[['account_id', 'growth_rate']]
同样,在增长率计算中对月份和年份的任何引用都必须与我们之前调用的 strftime()方法保持格式一致。
如何使用访问器和字符串到日期时间的方法来比较和过滤日期时间数据
最后一个例子同样来自 Salesforce 数据科学访谈。

截图来自 StrataScratch
问题链接:https://platform . stratascratch . com/coding/2053-留存率
它要求我们比较两个月内的保持率,而不是增长率。虽然我们只需要比较两个月的数据,但很明显,我们必须查看 12 月和 1 月之后的月份的保留数据。
该问题再次使用了具有以下字段的 sf_events 数据集:

截图来自 StrataScratch
这里有一些数据示例:

截图来自 StrataScratch
这个问题需要的日期时间函数与我们之前的问题完全不同,因为我们必须找到保持而不是增长。我们可以首先在 12 月和 1 月激活账户。在这两种情况下,我们都可以使用 dt.year 和 dt.month 属性来指定我们需要引用哪一年 2020 或 2021 或 12 月或 1 月。请记住,对于月份,我们将 1 月作为 1,将 12 月作为 12 进行筛选。
*# Import your libraries*
import pandas as pd
*# Get Accounts active in Dec 2020*
dec2020 = sf_events[(sf_events['date'].dt.year == 2020) & (sf_events
['date'].dt.month == 12)].drop_duplicates(subset = ['account_id', 'user_id'])
dec2020['in_dec'] = 1
*# Get Accounts active in Jan 2021*
jan2021 = sf_events[(sf_events['date'].dt.year == 2021) & (sf_events
['date'].dt.month == 1)].drop_duplicates(subset = ['account_id', 'user_id'])
jan2021['in_jan'] = 1
接下来,我们必须计算每个月之后的活跃客户。在这两种情况下,我们都必须对日期进行比较。我们首先调用. dt.date 属性只获取日期,排除时间。接下来我们调用。to_datetime()函数将相应月份的最后一天的字符串转换为 datetime 对象,然后与日期进行比较。
*# Get accounts active after December and January*
aft_dec2020 = sf_events[sf_events['date'].dt.date > pd.to_datetime
('2020-12-31')].drop_duplicates(subset = ['account_id', 'user_id'])
aft_dec2020['aft_dec'] = 1
aft_jan2021 = sf_events[sf_events['date'].dt.date > pd.to_datetime
('2021-01-31')].drop_duplicates(subset = ['account_id', 'user_id'])
aft_jan2021['aft_jan'] = 1
在这些日期时间操作之后,我们可以继续合并数据集,并使用标准 Python 和 Pandas 代码计算保留率,因此解决方案如下所示:
*# Import your libraries*
import pandas as pd
*# Get Accounts active in Dec 2020*
dec2020 = sf_events[(sf_events['date'].dt.year == 2020) & (sf_events
['date'].dt.month == 12)].drop_duplicates(subset = ['account_id', 'user_id'])
dec2020['in_dec'] = 1
*# Get Accounts active in Jan 2021*
jan2021 = sf_events[(sf_events['date'].dt.year == 2021) & (sf_events
['date'].dt.month == 1)].drop_duplicates(subset = ['account_id', 'user_id'])
jan2021['in_jan'] = 1
*# Get accounts active after December and January*
aft_dec2020 = sf_events[sf_events['date'].dt.date > pd.to_datetime
('2020-12-31')].drop_duplicates(subset = ['account_id', 'user_id'])
aft_dec2020['aft_dec'] = 1
aft_jan2021 = sf_events[sf_events['date'].dt.date > pd.to_datetime
('2021-01-31')].drop_duplicates(subset = ['account_id', 'user_id'])
aft_jan2021['aft_jan'] = 1
*# Merge the datasets to get December and January retention numbers*
dec_merged = pd.merge(dec2020, aft_dec2020, on =
['account_id', 'user_id'], how = 'left')
dec_summ = dec_merged.groupby(by = ['account_id'], as_index = False).sum()
dec_summ['dec_retention'] = dec_summ['aft_dec'] / dec_summ['in_dec']
jan_merged = pd.merge(jan2021, aft_jan2021, on =
['account_id', 'user_id'], how = 'left')
jan_summ = jan_merged.groupby(by = ['account_id'], as_index = False).sum()
jan_summ['jan_retention'] = jan_summ['aft_jan'] / jan_summ['in_jan']
*# Merge the Dec20 and Jan21 datasets, calculate the relative retention rate*
*# and output.*
final_merge = pd.merge(dec_summ, jan_summ, on = 'account_id', how = 'left')
final_merge['retention'] = final_merge['jan_retention'] / final_merge['dec_retention']
final_merge[['account_id', 'retention']]
我们在这个解决方案中看到了日期时间属性的重要性,因为我们必须将日期时间对象的年、月和日期数据从日期时间对象中分离出来。在这之后,我们有了一个很好的机会用。to_datetime()函数
结论
在本文中,我们能够探索 Python Pandas DateTime 库的几种用法。大多数时候,您将利用其中一个访问器来隔离日期、时间或日期时间数据的其他组成部分。但是,在其他时候,您可能需要利用这个库来填充一些日期时间数据,所以您将利用它提供的函数。
如果你真的想在你的数据科学职业生涯中使用 Python,拥有良好的熊猫技能是一个非常必要的条件。幸运的是,我们能够在这里展示一些实际的例子,这些例子反映了优步、Salesforce 和 Doordash 等顶级公司的实际数据科学面试问题。在我们的平台上,你可以练习回答更多的熊猫面试问题,通过自己或在我们文章的帮助下交互式地构建这些问题的解决方案。您还可以访问其他用户的大型社区,他们可以在您查看他们的解决方案以获取灵感时对您的解决方案进行评论。
最初发表于T5【https://www.stratascratch.com】。
我如何使用 Python 的 Tkinter 来运行算法
原文:https://towardsdatascience.com/how-i-use-tkinter-python-library-to-run-algorithms-6be85f8f4e5b
如果您正在为您的 ETL 任务或算法运行几个 python 脚本——Tkinter 是一个可以支持构建 GUI 的 python 库。

来自像素的图像
为什么使用 Tkinter 库
我们每天或每周都要完成一些任务,这些任务涉及到运行多个 python 脚本,在大多数情况下,会占用我们大量的时间。通过自动化我们的一些日常流程,始终找到最大限度提高生产力和工作效率的方法是很重要的。
拥有一个 GUI,通过一个允许你点击一个按钮就可以运行脚本的界面,让日常工作更有效率。它可以被转换成一个可执行文件,使你自己或不太懂技术但想自己运行脚本的团队成员运行 python 脚本更加流畅。
在本文中,我将分享我如何设计一个简单的 GUI 来运行 python 脚本算法。为了这篇文章,我创建了一个简单的 GUI 代码。
示例 GUI 项目概述:下面的分配算法 GUI 是一个 UI,您可以在其中从 Oracle 数据库读取和写入一个表。Allocate 按钮在后端有一个算法,该算法根据不同的指标计算应该将多少产品分配给不同的商店。summary 部分让您快速了解运行算法后整个分配的情况,完整的结果/输出表被发送回 Oracle 数据库。
构建 GUI: MyWindow 类

作者图片
这个窗口是通过一个名为 myWindow 的类(也称为容器)构建的。这个类很好地组织了函数,有助于避免全局名称空间的混乱。在 myWindow 类中有两个主要的函数,第一个是让你创建用户界面窗口的函数,第二个是主要的算法函数(还有几个与之相关的函数),它驱动整个代码。
用户界面功能:
MyWindow 函数的语法非常简单,可以添加标签、按钮和名称字段。(我不会看代码,但我会在下面分享我的 github 源代码。)
单个元素的示例代码块如下所示:
创建按钮元素
正如您所看到的,在上面的代码块中,您可以定制按钮元素,并通过调整 x 和 y 将它放置在窗口中的特定位置。
该窗口中的小部件或元素连接到主算法函数中的特定变量——在上面的示例代码中,它是通过 command=self.algorithm 连接的。
算法功能
您可以创建一个或多个包含特定任务的函数,例如连接到数据库或运行特定的计算。这些函数使用户界面小部件变得可用。他们运行整个应用程序并产生输出。
在上面的示例中,有几个正在运行的算法函数,第一个是连接到数据库,以便您可以从数据源中读取和写入表,其他函数用于执行数据清理、操作、计算以及将输出表写回数据库。
Tkinter 类调用方
这几行代码调用 MyWindow 类,并根据您希望看到的维度或您希望为其添加的标签对其进行定制。
调用 MyWindow 类
用 Tkinter 做更多
上面的示例项目只是一个例子,展示了如何使用 Tkinter 通过点击按钮来轻松运行 python 算法。您可以使用这个库做一些其他的事情,比如构建一个接口,您可以通过一个接口连接多个 python 脚本。可能是这样的:

作者图片
还可以完全定制和添加不同的功能,如错误处理、成功或失败消息、打印输出等。
总的来说,tkinter 是一个非常棒的库,可供数据科学家和工程师用于日常 ETL 任务、自动化脚本或构建可供非技术用户使用的应用程序。
样本源代码:【https://github.com/kathleenlara/tkinter-scripting-gui
【https://twitter.com/itskathleenlara】我们来连线:
我如何用人工智能重新想象 10 幅著名的风景画
原文:https://towardsdatascience.com/how-i-used-ai-to-reimagine-10-famous-landscape-paintings-3e2924e03f79
这是我和 GPT 3 号、Midjourney 的合作成果。

图片由作者通过 Midjourney 提供
如果你关注我的工作,你可能已经注意到我已经开始使用人工智能创建的封面图像。
对于那些不知道它的人来说, Midjourney 是一个独立的研究实验室,几个月前秘密成立,目的是“探索新的思维方式[和]扩展人类的想象力。”Midjourney 也是我用来创建图像的文本到图像模型的名字。
几个星期以来,我一直在寻找新的想法,用人工智能视觉生成器来探索。这个实验提供了一种方法,可以在视觉上对比历史上一些最优秀的人类画家的创造性掌握与这些人工智能模型的能力。我用 GPT 3 号和 Midjourney 创建了一个几乎自动化的端到端流程——尽管我也在帮助他们沟通。
我选择著名的山水画有三个原因。它们非常容易辨认,GPT-3 可以很容易地提供视觉描述来设计提示,Midjourney 擅长画风景。
一旦我选定了画,我必须提示 GPT-3 给我描述。我使用了一个通用的简单提示:“用一段文字描述[作者姓名]的视觉细节[画作名称]。”即使我知道 GPT 3 号漏掉了一些元素,我还是未经编辑就完成了第一或第二个版本。
然后,我将描述修改为 Midjourney 可以理解的提示。除了 GPT 3 号的描述之外,我在所有的提示中添加了四个元素。在开始的时候,我包括了媒介(如布面油画)、风格(如印象主义)、流派(如风景)。最后我加上了原作的长宽比,以便更清晰的对比。
我没有提示作者或画的名字来迫使 Midjourney 只从原作中获取间接的灵感——正如 GPT 3 所设想的那样。
我公开了提示让你自己试试。我意识到不公开提示已经成为数字艺术家(以及文本到图像模型的用户)的普遍做法。我不打算出售这些画,也不打算保留用人工智能创作艺术所需的技能,所以我分享了未经编辑的提示。
如果你想了解更多关于提示的知识,我推荐从提示狂开始。如果你想在不学习提示技巧的情况下创造伟大的提示,试试这个位于拥抱脸的提示生成器。
如果你想提高更多,你必须练习和实验。我远远没有达到一些人工智能艺术家的水平,这些艺术家从这个新的人工智能艺术场景开始就一直在磨练他们的技艺。
向 Midjourney 发送提示后,它给了我四张图片供我选择。我升级了那些让我想起原版的,然后选择了一个。
下面的每个部分包括左边的原始风景画和右边的中途再创作。在图片上方,我写下了 GPT 3 号对原画的描述和我对中途的语法正确提示的翻译。
尽情享受吧,并在评论中告诉我你的想法!
文森特·梵高的《星夜》(1889)
描述:
这幅画以夜晚为背景,天空中有一轮明月。群星闪耀,风景沐浴在蓝光中。天空衬托出远处的树木和房屋的轮廓,整个场景宁静而梦幻。
提示:
布面油画+后印象主义+云景+夜晚+天上的明月+闪亮的星星+沐浴在蓝光中的风景+远处的树木和房屋在天空的映衬下形成轮廓+一种宁静的梦幻般的品质,— ar 5:4。


左图:文森特·梵高的《星夜》(公共领域)。右图:作者在中途拍摄的图片
约翰·康斯太勃尔的《干草堆》(1821)
描述:
这幅画描绘了一辆干草马车,由两匹马拉着过河。这个场景以山、树和云为背景。这幅画以其对英格兰乡村生活的简单而田园般的描绘而闻名。
提示:
布面油画+浪漫主义+风景+两匹马拉着干草过河+背景中的山脉、树木和云彩+对英格兰乡村生活简单而田园诗般的描述,— ar 30:21。


左图:约翰·康斯太勃尔的《干草围脖》(公有领域)。右图:作者在中途拍摄的图片
印象,克洛德·莫内的日出(1872)
描述:
这幅画是太阳刚刚从地平线上露出来,天空是美丽的橙色和红色。海水是深蓝色的,远处有一些小船。笔触厚重而有质感,使这幅画看起来几乎像一张照片。
提示:
布面油画+印象主义+城市景观+地平线上的太阳+美丽的橙红色天空+深蓝色的水+远处的小船+厚重而有质感的笔触,— ar 21:16。


左:印象,克洛德·莫内的日出(公共领域)。右图:作者在中途拍摄的图片
老彼得·勃鲁盖尔的《雪地猎人》(1565)
描述:
这幅画是一幅冬季风景画,描绘了一群打猎归来的男人。男人们累了,他们的狗在叫。大雪纷飞,树木被白雪覆盖。男人们把他们死去的猎物扛在肩上。
提示:
油画+北方文艺复兴+风俗画+冬季风景画+一群打猎归来的男人+疲惫的男人+狂吠的狗+下雪+树木被雪覆盖+男人把他们死去的猎物扛在肩上,— ar 34:25


左图:老彼得·布鲁格尔的《雪地猎人》(公共领域)。右图:作者在中途拍摄的图片
卡斯帕·大卫·弗里德里希的《海雾之上的流浪者》(1818)
描述:
这幅画是一幅风景画,画中一名男子背对观众站在露出地面的岩石上。这个人正在眺望远处群山环绕的雾蒙蒙的山谷。这幅画有一种忧郁的色调,传达出一种孤独感。
提示:
布面油画+浪漫主义+寓言画+风景画+一个站在岩石露头上的人+后视图+这个人正在眺望一个雾蒙蒙的山谷+远处的群山+忧郁的色调+一种孤独感,— ar 63:79。


右图:卡斯帕·大卫·弗里德里希《海雾之上的流浪者》(公共领域)。右图:作者在中途拍摄的图片
埃尔·格列柯(1596-1600)的托莱多全景
描述:
在这幅画中,远处是托莱多市,可以看到一些建筑和山脉。天空是深蓝色的,光线反射在前景中的河流上。色彩非常鲜明和明亮,使这幅画看起来几乎是超现实主义的。
提示:
布面油画+矫饰主义+文艺复兴晚期+城市景观+风景+远处的托莱多市+一些建筑和山脉+深蓝色的天空+前景中的河流+近乎超现实主义的绘画,— ar 70:63。


左图:埃尔·格列柯的托莱多视图(公共领域)。右图:作者在中途拍摄的图片
安德烈·德朗的《国家》(1905 年)
描述:
这幅画的背景是法国马赛附近的埃斯塔克镇。这个城镇建在一座小山上,房子被漆成各种颜色。屋顶是红色的,墙壁是白色的,门窗是蓝色的。天空是深蓝色的,阳光灿烂。这幅画色彩非常鲜艳,很有动感。
提示:
布面油画+野兽派+风景+法国马赛附近的 Estaque 镇+该镇建在山上+涂有各种颜色的房屋+红色屋顶+白色墙壁+蓝色门窗+深蓝色天空+阳光照耀+色彩非常鲜艳的绘画+大量运动,— ar 99:80


左图:安德烈·德朗(美国公共领域)的作品。右图:作者在中途拍摄的图片
保罗·塞尚设计的圣维克多山(1904-1906)
描述:
在《圣维克多山》中,保罗·塞尚描绘了一座耸立在法国乡村的大山。这位艺术家简化了画中的形式,将场景浓缩到其本质。结果是一个传达了山的宏伟和静止的作品。柔和的色彩和柔和的光线给这幅画增添了平静和安宁的感觉。
提示:
布面油画+后印象主义+风景+坐落在法国乡村上方的一座大山+简化的形式+山的宏伟和宁静+柔和的颜色+柔和的光线+平静和安宁的感觉,— ar 5:4


左图:保罗·塞尚的圣维克多山(公共领域)。右图:作者在中途拍摄的图片
克洛德·莫内的睡莲(1897-1899)
描述:
克洛德·莫内的《睡莲》是一幅美丽的画,画的是池塘里的百合花。百合花是深浅不同的粉红色和白色,它们被绿叶包围着。水面风平浪静,天空倒映在池塘水面上。
提示:
布面油画+印象主义+花卉绘画+池塘中的百合花+百合花是粉红色和白色的阴影+被绿叶环绕+水是平静的和静止的+天空反映在池塘的表面,— ar 4:2


左图:克洛德·莫内的《睡莲》(公有领域)。右图:作者在中途拍摄的图片
伦勃朗的《加利利海上的风暴》(1633)
描述:
在《加利利海的风暴》中,伦勃朗描绘了圣经故事中的门徒在加利利海的一艘小船上被风暴吓坏了。门徒们在船上挤在一起,他们的脸上充满了恐惧。海浪冲击着船,天空布满了乌云。
提示:
布面油画+巴洛克风格+宗教绘画+圣经故事中的门徒在加利利海的一艘小船上+被风暴吓坏了+门徒在船上挤成一团+脸上充满恐惧+海浪冲击着船+天空布满了黑暗、险恶的云,— ar 4:5


左图:伦勃朗《加利利海上的风暴》(公共领域)。右图:作者在中途拍摄的图片
结论
总的来说,我不得不说,大多数画虽然画得很好,但远不是原作的再现。一个原因是,GPT-3 无法给出精确的细节,除非这些细节非常有代表性(它往往是通用的)。
如果我使用人为的绘画细节描述,我会得到更好的结果。尽管如此,文本到图像的模型在组合性方面通常相当糟糕。这意味着他们很难理解“X 在 Y 之上”或“X 在 Y 的右边”。他们不知道元素的相对位置,而这些往往是艺术品的关键区别特征。
另一个原因是,我在这个实验中限制了 GPT 3 号和中途。GPT-3 的提示很简单,我选择了第一代或第二代。在中途,我从第一批结果中选择了这幅画,没有进行编辑或修补。
这个实验的一个重要收获是,GPT-3 和 Midjourney 都可以给你令人印象深刻的结果,只要你不打算引导他们达到预定的结果。它们很适合一般的作品,但不适合特定的作品(DALL E 2 在这方面更好)。
总之,我想看看 GPT-3+中途组合——我也在其中——将如何重新想象最初的人造艺术品。这是人类和人工智能之间的交流实验。
作为最后的提醒:这不是一个证明这些人工智能能力的实验。这只是为他们原本不透明的头脑打开了一扇门。
订阅 算法桥 。弥合算法和人之间的鸿沟。关于与你生活相关的人工智能的时事通讯。
您也可以直接支持我在 Medium 上的工作,并通过使用我的推荐链接 这里 成为会员来获得无限制的访问权限! 😃
我如何用人工智能将哈利波特角色重新想象成日本动画
用文字到图像的人工智能激发你的创意之旅

作者中途生成的霍格沃茨城堡
把一幅字画得如此生动,我甚至不用画。
我相信你看过一个犯罪系列,在那里目击者描述了一个艺术家眼中的罪犯。
然后,艺术家根据一张陌生面孔的零星描述信息拼凑出一幅素描。
而且,我很难相信这位艺术家仅凭这些描述就能画出如此精确的草图。
但是想象一下如果那个艺术家是艾!
这类似于我本周在访问中途时所做的实验——给人工智能发送文本并从中获取图像。
对于那些还没有听说过它的人来说,Midjourney 是一个研究实验室及其人工智能程序的名称,该程序从描述性的 ext 创建图像。《经济学人》用它制作了他们 2022 年 6 月的封面图片。
它作为一个机器人在你的不和谐服务器上工作。你必须登录并获得不和谐邀请。然后,您也可以将机器人添加到您的服务器。他们有一个关于如何开始的简明教程这里。
在这篇文章中,我尝试了一些独特的——使用 Midjourney 将 哈利波特角色重新制作成日本动漫 。
这篇帖子旨在激励你,引导你进入创造性人工智能的迷人世界,并分享我学到的经验。
因此,我已经将我使用过的所有提示和生成的图像一起发布了。您可以自由尝试相同的提示或使用不同的提示。
对于每个提示,AI 会生成 4 幅图像——你可以根据自己的选择创建不同的图像,也可以放大你喜欢的图像。这很简单。
所以请坐好,享受这些图像吧!
“重新想象”的人物
首先,简单介绍一下我在图片中使用的艺术风格。我使用了一种叫做 的日本门艺术风格 来生成所有的图像。
这是通过在所有提示中使用 moe art 来完成的。我敢肯定,即使你没有听说过这种艺术风格,你也一定会从一些流行的动漫中认出它!
注意 —所有中途的提示都是以命令想象开始的,就像这样:
**/imagine** *prompt*
因此,在下面的所有例子中,我只提到了提示,以避免重复命令。
让我们从我们的英雄开始!
1.[文学作品]哈利波特
是世界上最知名的虚构人物之一。因此,即使没有太详细的提示,人工智能也能很好地工作。我选择了我认为最合适的一张(以下所有图片都一样)。
提示:
**harry potter face + moe art style + anime --ar 16:9 --uplight**

由作者通过 Midjourney 生成
2.赫敏·格兰杰
就像哈利一样,我不需要对赫敏做任何更详细的描述。
提示:
**hermione granger + Moe art style + anime --ar 16:9 --uplight**

由作者通过 Midjourney 生成
3.罗纳德·韦斯莱
在这种情况下,我不得不使用相同的提示生成更多的变体,以正确获得 Ron。最后,我选定了下图。
提示:
**ronald weasley + Moe art style + anime --ar 16:9 --uplight**

由作者通过 Midjourney 生成
4.西弗勒斯·斯内普
我给斯内普用了几个更详细的提示,但是简单的一个似乎产生了最好的结果。
提示:
**snape + moe art style + anime --ar 16:9 --uplight**

由作者通过 Midjourney 生成
5.阿不思·邓布利多
邓布利多是这个系列中我最喜欢的角色。所以我想创造一个更详细的他的动漫版。但是由于某种原因,邓布利多很难像哈利那样用简单的提示来生成。每次 AI 把胡子弄得一团糟(我想不通为什么)。所以我在这里尝试了一个更详细的,得到了一个比较满意的结果。
提示:
**old wizard, dumbledore, benign, smiling, long white beard and hair + moe art style + anime --ar 16:9 --uplight**

由作者通过 Midjourney 生成
6.伏地魔
在那个不能说出名字的人的例子中,我使用了几个额外的细节来得到一个更恐怖的图像。在我最终选择下面这一个之前,有许多生成。
提示:
**voldemort + moe art style + anime + scary scarlet eyes + slit pupils + forked tongue + symmetrical bald face --ar 16:9 --uplight**

由作者通过 Midjourney 生成
这个实验的收获
1.文本到图像的工具令人印象深刻
最近几个月,图像生成人工智能出现了爆炸式增长。我不禁为之折服!
- 无论是 Dall-E 2 还是 Midjourney,我发现它们都能根据提示快速生成令人惊叹的图像。
- 人工智能非常擅长交叉授粉和叠加艺术风格。比如(自己试试)——梵高风格的写实埃菲尔铁塔画像。****
- 人工智能很好地创建了一个图像,可以在以后进行微调和修改。
- 你可以使用人工智能来生成超现实的场景和景观——你可以用它们作为创作视频游戏甚至电影场景的灵感!
尽管有这些优势,我必须承认这一点:虽然我在这篇文章的开始称它们为创造性的人工智能,但我认为这样称呼是误导的,至少在目前的水平上是这样。
这让我想到了我的下一个外卖。
2.AI 图像生成很难
尽管在本文中看起来非常简单,但至少可以说,生成所有这些图像非常耗时!
不经过反复试验,你永远不可能得到一个完美的提示。即使有相同的提示,人工智能也不会每次都生成相同的图像。
仔细观察以上所有图片,你会发现它们并不完全正确。 好像有什么东西掉了——好像眼睛不太对,总体看起来有点诡异。
在这种情况下,真正的艺术是正确地得到提示!
这也是人类仍然统治的领域——创造力。
因此,即使图像生成技术有所进步,人类的思维仍然处于主导地位。
我相信我们还需要几年时间才能让人工智能自己创造出真正有意义和鼓舞人心的图像!
3.人工智能图像生成是昂贵的
哦!我还没有提到人工智能图像生成是昂贵的吗?
有了 Dall-E 2,你最初可以免费获得 35 张图片,然后每月减少到 15 张。如果你需要生成更多的图片,你需要花费近 15 美元来获得 100 张左右的图片。
对于 Midjourney,你最初只能免费获得 25 张图片(我很快就用完了),然后你必须每月支付 10 美元来获得大约 200 张图片(按 GPU 分钟数计算)。
你觉得还不错?
光是提示的反复试验就足以像饥饿的袋獾一样吃掉你的美元!
所以你真的需要明智的判断。我花了将近 10 美元终于得到了我贴在这里的图片!
有鉴于此,我将留给你一些值得一提的我的试用图像(因为我为花了 10 美元却不能使用所有生成的图像而感到内疚😉):

由作者在中途使用提示生成:阿不思邓布利多+莫伊艺术风格+动漫+古代办公背景+机械仪器— ar 16:9 — uplight

由作者在中途使用提示生成:西弗勒斯·斯内普+ moe 艺术风格+动漫+带化学背景的货架— ar 16:9 — uplight

由作者在中途使用提示生成:伏地魔+ moe 美术风格+动漫+恐怖— ar 16:9 — uplight

由作者在中途使用提示生成:伏地魔+ moe 美术风格+动漫+恐怖+大蛇— ar 16:9 — uplight

由作者在中途使用提示生成:哈利波特脸+ Moe 艺术风格+日本动漫+漫画— ar 16:9 — uplight

作者在中途为赫敏产生的变化(同样的提示)

作者在中途为 Ron 生成的变体(相同的提示)
****感谢阅读到最后!我希望你喜欢这篇文章,就像我喜欢为你创作它一样。
那么,你喜欢我最后挑选的图片吗?
或者你认为我应该从这些变体中选择一些其他的版本?
这里的哪些图片是你最喜欢的?
你现在有没有受到启发,想尝试一下生成图像的人工智能?
你想知道更多关于人工智能如何工作的细节吗?
我很想听听你的看法!
在那之前,祝阅读愉快!
鳍。
资料来源及注释:
- 这篇文章的灵感来自创作共用的哈利波特艺术。
- 生成的图像仅用于教育目的。
我如何利用数据科学创造五个稳定的收入流
用数据科学赚钱的成熟方法

新年快乐
当我们进入 2022 年,我相信你们中的许多人已经想到了一些你想要实现的决心和目标。其中一些目标可能需要增加你的收入,无论是通过升职还是增加新的收入来源。
为了给你另一个视角,我想和你分享我是如何利用我的数据科学知识创造五个持续收入流的。但在此之前,我想让你知道我不是一夜之间做到的。事实上,在我从这些渠道中获得任何实质性的东西之前,大多数渠道至少花了一年时间来建立。
记住这一点,让我们开始吧!
务必 订阅此处 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!
1.数据科学家的职业生涯
第一个似乎是显而易见的,但这是我想说的第一个,因为它很可能会占你收入的最大比例。这意味着,从这个角度来看,这应该是最高优先事项。
最重要的是,你从数据科学家的职业生涯中获得的经验将有助于你开发其他收入来源,如咨询,因为你将获得更多的声誉和知识。
因此,你的主要目标应该是学习有助于你在职业生涯中提升自己的概念和主题。
2.咨询
我想谈的第二个收入来源是我的咨询业务。这是一个有趣的问题,因为数据科学咨询并不局限于构建 ML 或 DL 模型。事实上,我的项目都与建筑模型无关。我今年参与的一些项目包括:
- 我回顾了一家公司创建的 Python 包,并就其简单性、实用性和直观性提供了反馈。
- 我与一家安全公司合作,提出了一种方法来比较两组不可比的数据(苹果和橙子),并编写了一个脚本来自动化 100 多份个性化报告。
- 我为一家食品配送公司提供高级数据策略方面的建议,帮助他们定义和建立关键 KPI,并构建简单的决策框架。
我的观点是,有很多方法可以“咨询”数据相关的知识,所以要对自己想承担什么样的项目保持开放的心态。
现在你可能想知道我是如何找到我的客户的,这让我想到了我的下一笔收入:
3.中等
如果你写关于编码或数据科学的文章,Medium 尤其是一个巨大的收入来源,因为有一些成熟的出版物,如 TDS 和 Better Programming,有助于拓展业务。
如果你想了解更多关于我如何建立一个成功的数据科学博客的信息,请查看我下面的文章:
[## 我写一篇成功的数据科学博客的秘密
towardsdatascience.com](/my-secrets-to-writing-a-successful-data-science-blog-b2597b2553c6)
媒体不仅是一个巨大的收入来源,也是一个伟大的营销工具。因为有了媒介,我才能够…
- 从硅谷和多伦多的创业公司获得几个工作机会
- 与数据社区中一些最大的世界领导者建立我的网络,包括谷歌的数据和分析主管
- 为我的咨询实践和技术写作实践寻找客户。
这让我想到了我的第四个收入来源:
4.技术和内容写作
信不信由你,我们非常需要技术过硬、会写作的数据科学家!通过 Medium,我找到了几个客户,他们希望我撰写与数据科学相关的教程、内容和文章。
这种工作的报酬各不相同。一开始,我一个字只能赚 10 美分。现在,每件作品可以赚 100 到 500 美元。我的一些工作包括:
- SQL 收入群组分析指南
- 一篇关于什么是统计偏差以及偏差类型的文章
- 学习高级 SQL 的综合课程
想了解更多关于我如何从技术写作中获得收入以及如何找到客户的信息吗? 订阅此处 从没错过我的另一篇文章。
5.子堆栈
我最后的收入来源是 Substack。我最近才开始做,所以现在还不重要,但我看好这个平台。
如果你问我是用 Substack 还是 Medium,我无法回答,因为这就像你在拿苹果和橙子做比较。我为 Medium 写的内容和读者与我的 Substack 时事通讯有很大不同。
我希望让我的 Substack 简讯更有个性,更小,更频繁(至少这是我的目标)。
如果你想订阅我的个人时事通讯,请在这里注册。
感谢阅读!
一定要 订阅此处 千万不要错过另一篇关于数据科学指南、诀窍和技巧、生活经验等的文章!
不确定接下来要读什么?我为你选了另一篇文章:
还有一个:
-特伦斯·申
- 如果您喜欢这个, 订阅我的媒体 获取独家内容!
- 同样,你也可以 跟我上媒
- 报名参加我的个人简讯
- 跟我上LinkedIn其他内容
我如何使用 Python 和 SQL 找到世界上最贵的手表
从使用 Python 抓取网页,到构建数据集,再到编写分析性 SQL 查询,这就是我如何找到在 1996 年至 2021 年的一场奢侈品拍卖会上售出的最昂贵的手表。

约翰·托尔卡西奥在 Unsplash 上拍摄的照片
上周,在我的出版物Pipeline:A Data Engineering Resource中,我写了一篇关于奢侈品手表拍卖市场趋势的文章,并提到我将继续使用我的方法。从获取数据到获取、清理数据,最后用 SQL 查询数据,我将带您了解我创建最新数据驱动故事的过程,并说明如何构建一个端到端数据分析项目。
由于这是一个端到端的数据工程和数据分析项目,以下是各个阶段的划分:
- 数据来源和摄取
- 数据清理
- 创建数据集和表并加载到数据库中
- 分析查询
- 可视化见解
数据来源和摄取
除了在谷歌上搜索“昂贵手表列表”,这个过程的第一步是确定一个高质量和可访问的数据集,以便摄取和稍后格式化进行分析。
我在维基百科页面上找到了“拍卖的最贵手表清单”。原始数据表如下所示:

截图由作者提供。
从数据整洁的角度来看,有几个问题立即困扰着我,比如“Ref”在分析中有些无用的列。我一消化完数据就放弃了那个专栏。Pandas 的 read_html 功能令人难以置信,它消除了一些通常与 BeautifulSoup 抓取网页文本和数据的方法相关的手工工作。
base_url = '[https://en.wikipedia.org/wiki/List_of_most_expensive_watches_sold_at_auction'](https://en.wikipedia.org/wiki/List_of_most_expensive_watches_sold_at_auction')watches = read_html(base_url, attrs={'class': 'wikitable sortable'}, header=1)watch_df = pd.DataFrame(watches[0])watch_df.rename(columns={'.mw-parser-output .tooltip-dotted{border-bottom:1px dotted;cursor:help}M.Y.': 'Model_Year', 'Watch model': 'Watch_Model', 'Inflation-adjusted': 'Inflation_Adjusted',
'Auctiondate': 'Auction_Date', 'Auctionplace': 'Auction_Place', 'Auctionhouse': 'Auction_House'}, inplace=True)
watch_df = watch_df.drop(['Ref.'], axis=1)
这里要注意的另一件事是,因为我们正在获取类‘wiki table sortable’的所有实例,所以将会返回多个表。为了获取第一个结果,即“Top 77”表,我从索引位置 0 开始:
watch_df = pd.DataFrame(watches[0])
虽然我可以遍历每个索引值,但是由于每个表都需要自己独特的格式,所以我认为我最好分别抓取和格式化它们。
数据清理
我的转换都不是特别复杂,但是我想指出,如果您必须从 wiki 表中删除括号或括号表达式,这是一段非常有用的代码:
for col in watch_df.columns:
watch_df['Watch_Model'] =
watch_df['Watch_Model'].str.replace('[Note 4]', '')
watch_df['Watch_Model'] = watch_df['Watch_Model'].str.replace(r'\[.*\]', ' ')
结合使用 str.replace 方法和一点 regex 语法可以去掉维基百科引用周围的括号。
对于最后一个表,我合并了三个返回的 wiki 表。我还考虑了 NA 值,并使用 Pandas 的 sort_values()方法过滤掉重复的。
watch_all = pd.concat([watch_df, watch_second_half_df, watch_third_df], ignore_index=True)
watch_all = watch_all.sort_values(by=['Manufacturer'], ascending=True).reset_index(drop=True)
watch_all['Original'] = watch_all['Original'].fillna(0)
watch_all['Inflation_Adjusted'] = watch_all['Inflation_Adjusted'].fillna(0)
watch_all['Price_USD_Millions'] = watch_all['Price_USD_Millions'].fillna(0)
watch_all_df = pd.DataFrame(watch_all)
创建数据集/表并加载到数据库中
这是目前为止数据框的外观(减去 Price_USD_Millions 列,未显示):

截图由作者提供。
我对这个输出很满意。由于我更喜欢 SQL 进行数据分析(对不起熊猫),我将把这个上传到我的 BigQuery 数据库。

截图由作者提供。
下面是模式,我在 BigQuery 的 UI 和代码中都定义了它(为了安全起见)。尽管 BigQuery 会自动检测 CSV 文件的模式,但我过去在使用自动检测功能时遇到过问题,所以我尝试总是包含一个模式。

截图由作者提供。
这是表格预览的样子:

截图由作者提供。
分析查询——也就是有趣的部分
在这个阶段从表中查询和获得洞察力确实使这个项目成为一个端到端的项目。这也令我兴奋,因为我的工作往往局限于数据科学过程的管道和 ETL/EL 阶段。因此,当我能够在我的个人项目中做一些数据分析时,我很开心。
因为我的职业是数据工程师,所以我能从表格中提取见解而不用太费力,这对我非常重要。这意味着,即使在我获取了数据帧之后,我也要做一些更改,以便更好地为我未来的分析服务。
我做的第一个更改是将“Style”列从字符串转换为布尔值。如果我需要在后面的分析阶段引用它,这将使计算值和使用该度量作为分类变量变得更加容易。
SELECT
EXTRACT(DATE
FROM
Auction_Date) AS Auction_Date,
Manufacturer,
Watch_Model,
Model_Year,
CASE
WHEN Style = 'Wrist' THEN 0
ELSE
1
END
AS Style
FROM
`ornate-reef-332816.watches.auction_prices`
我也不喜欢原始数据框中美元值与无关值一起出现的方式,所以为了可读性,我将每个值四舍五入到两位小数。
SELECT
EXTRACT(DATE
FROM
Auction_Date) AS Auction_Date,
Manufacturer,
Watch_Model,
Model_Year,
CASE
WHEN Style = 'Wrist' THEN 0
ELSE
1
END
AS Style,
ROUND(Original, 2) AS Original_Price_Millions,
ROUND(Inflation_Adjusted, 2) AS Inflation_Adjusted_Millions,
ROUND(Price_USD_Millions, 2) AS Price_USD_Millions
FROM
`ornate-reef-332816.watches.auction_prices`
我也意识到有几行的定价有出入。原始数据集包括多个具有美元值的列。原始数据包括原始价格和虚高价格。这使得数据有点不清楚。为了找到给定手表的实际价格,我取了各列的最大值(使用最大函数),因为这可能是手表的售价。
SELECT
EXTRACT(DATE
FROM
Auction_Date) AS Auction_Date,
Manufacturer,
Watch_Model,
Model_Year,
CASE
WHEN Style = 'Wrist' THEN 0
ELSE
1
END
AS Style,
ROUND(Original, 2) AS Original_Price_Millions,
ROUND(Inflation_Adjusted, 2) AS Inflation_Adjusted_Millions,
ROUND(Price_USD_Millions, 2) AS Price_USD_Millions,
ROUND(GREATEST(Inflation_Adjusted, Price_USD_Millions, Original),2) AS Actual_Price,
Rank
FROM
`ornate-reef-332816.watches.auction_prices`
最后,因为我知道轴上的字符串值会变得多么混乱,所以我通过大写和截断字符串值来创建城市的缩写。我还删除了“等级”一栏,因为这对我来说有点武断。
SELECT
EXTRACT(DATE
FROM
Auction_Date) AS Auction_Date,
Manufacturer,
Watch_Model,
Model_Year,
CASE
WHEN Style = 'Wrist' THEN 0
ELSE
1
END
AS Style,
ROUND(Original, 2) AS Original_Price_Millions,
ROUND(Inflation_Adjusted, 2) AS Inflation_Adjusted_Millions,
ROUND(Price_USD_Millions, 2) AS Price_USD_Millions,
ROUND(GREATEST(Inflation_Adjusted, Price_USD_Millions, Original),2) AS Actual_Price,
UPPER(LEFT(Auction_Place, 3)) AS Auction_Place,
Auction_House
FROM
`ornate-reef-332816.watches.auction_prices`
下面是最终的干净表格的一个片段,其中包含调整后的列:

截图由作者提供。
项目的其余部分包括针对这个表编写查询。由于其中一些有点基础(但仍然是必要的),我将分享一个更有趣的片段。这是一段 SQL 代码,用于查找哪个制造商销售了最多的库存(以百万美元计)。
SELECT * EXCEPT(row_num)
FROM(
SELECT Manufacturer, MAX(Actual_Price) AS Actual_Price_Millions, ROW_NUMBER() OVER(PARTITION BY Manufacturer) AS row_num
FROM clean_tab
GROUP BY 1
)
WHERE row_num = 1
ORDER BY Actual_Price_Millions DESC
除了查找实际价格之外,该查询还包含一行消除重复值的内容,以确保我们获得准确的数据。下面是作为数据帧的输出(我使用 Python 的 BigQuery API 进行查询):

截图由作者提供。
可视化见解
就像我喜欢干净的数据一样,我也喜欢简约、干净的可视化。由于我已经在 Jupyter 笔记本上工作,我决定使用 Matplotlib 和 Seaborn 来可视化我从这个数据集获得的见解。
下面是一个简单的例子:

图表由作者提供。

图表由作者提供。
从这里,我可以结合可视化来建立一个仪表板,这样我就知道我要为我的梦想手表存多少钱了。
如需额外的可视化和完整的分析,请随意阅读全文:
如果你对这个项目的范围感到好奇,你可以在 my GitHub 上查看代码。
我如何使用跟踪和数据科学来学习 Redux 与糟糕的应用程序性能有关
为什么减少 redux 大小是值得的

图像来源:像素
几年前,我是 Slack 前端性能团队的创始成员之一。目标是了解什么影响 Slack 的前端性能。该公司想要了解的一个指标是从一个频道切换到另一个频道所需的时间,即什么导致频道切换缓慢?
该项目的开始只是为了跟踪不同的数据,以便我们可以了解频道切换期间发生了什么。例如,我们跟踪了频道切换期间发生的所有 redux 动作以及它们花费的时间;后来,我们跟踪反应渲染以及。我们使用的工具是一个与 OpenTelemetry 具有相同 api 的 tracer,以及一些数据分析软件,包括 Honeycomb 。如果您不熟悉跟踪,请阅读我以前的文章关于如何使用跟踪来测量应用程序性能的文章。
https://blog.devgenius.io/measuring-react-performance-with-opentelemetry-and-honeycomb-2b20a7920335
我们还用关于用户和团队的信息来标记每个跟踪。这些信息包括他们使用哪种电脑,他们来自哪个地理区域,他们有多少渠道,他们的团队有多少人,他们的 redux 商店有多大,等等。
下面是通道切换跟踪的样子:

作者用 Honeycomb.io. Image 可视化频道切换轨迹。
注意:我划掉了可能被认为是专有的信息。
主父跟踪测量从单击一个频道到该频道完成呈现最近消息列表所用的时间。子跨度是 redux 动作、thunks 和 react 组件的呈现。
添加痕迹或多或少是这个项目中比较容易的部分。实现一个健壮的、可伸缩的、其他开发人员可以轻松使用的系统仍然存在技术挑战。然而,这是很简单的工作。困难的部分来自于确定应该测量什么以及如何分析跟踪来理解性能瓶颈。
本文的大部分内容是关于我用来分析前端性能的技术,以及我在团队工作时学到的经验。
分析应用性能的基本工具和技术
我使用 Jupyter notebook 和几个 python 库来创建可视化并进行分析。
有几种方法可以获得跟踪数据。你可以直接从 Honeycomb 下载一个 CSV 文件(但我认为有 1000 行的限制)。你也可以通过他们的 API 查询蜂巢的数据。Slack 将跟踪数据存储在自己的数据库中,所以我查询了 Slack 的数据库来进行数据分析。
下一步是使用pandas python 库从 CSV 文件或 api 数据创建一个数据帧。在完成了创建数据帧的所有预处理之后,就可以开始分析轨迹了!
相关热图
关联热图是了解哪些标签可能与频道切换时间相关的一种简单而有见地的方式。
在 Jupyter notebook 中,使用seaborn和matplotlib用几行代码制作热图。
import seaborn as sns
import matplotlib.pyplot as pltcorrelations = dataframe.corr()heatmap = sns.heatmap(correlations, vmin=-1, vmax=1, annot=True, cmap='BrBG')heatmap.set_title(f'Correlation Heatmap for {dataframe_name}')plt.show()
最终的热图将会是这样。

关联热图—标记的编辑名称。图片作者。
整个热图显示了所有标签之间的相互关系。我们最感兴趣的行是最后一行,即这些标签的系数与频道切换是否可容忍(即不慢)的关系。
从热图中,我可以识别与频道切换是否缓慢最相关的标签。接近 0 的数字表示给定的两列之间没有相关性。接近 1 的数字表示强正相关,接近-1 的数字表示强负相关。
与is_tolerable最不相关的标签与 redux 商店规模有关。换句话说,这是我第一次暗示 redux 存储大小与应用程序性能相关。
散点图
我进一步用散点图研究了 redux 商店规模对频道切换性能的影响。
为此,我在 x 轴上存储了 redux 存储大小。在 y 轴上,我查看了该时段内被视为“慢”的频道切换的百分比

Redux 大小与慢速通道切换百分比的关系。图片作者。
如您所见,redux 存储大小越大,慢速频道切换的百分比就越大。
我还查看了每个时段内频道切换时间的 p50(中值)。趋势与预期相似。redux 商店规模越大,p50 值越高。

Redux 尺寸与通道切换时间 p50 的关系。图片作者。
对于这两个图,我使用了[matplotlib.pyplot.scatter](https://matplotlib.org/3.5.1/api/_as_gen/matplotlib.pyplot.scatter.html)。
我根据不同的标记值进一步分解了样本数据。例如,我观察了企业与非企业的性能,我观察了硬件能力如何影响性能,等等。
redux 动作和 thunks 呢?
使用像 Honeycomb 这样的工具很难分析子跨度的存在或属性如何影响其父跨度。例如,并非所有通道开关都触发相同的 redux 动作集,但是您不能比较包含 redux 动作“A”的通道开关轨迹与不包含 redux 动作“A”的通道开关轨迹。您也不能在子跨度和主通道开关跨度之间进行相关性分析。也许蜂巢最终会有这个功能,但目前还没有。这意味着进行子跨度分析的唯一方法是将关于这些跨度的信息作为父跨度上的标签添加到父跨度中。您还可以编写复杂的查询和预处理脚本来提取子 span,并通过parent_id将它们绑定到主通道交换机 span。这是一个很大的努力,最终,我们没有决定去那个方向。
为什么 redux 大小与应用程序性能相关,以及注意事项
相关性并不意味着因果关系。虽然 redux 存储大小与通道切换速度(以及我们测量的其他几个指标)密切相关,但这并不意味着因果关系。
一般来说,redux 存储大小与应用程序的复杂性有关。应用程序越复杂,应用程序拥有的组件和信息越多,redux 就越大。性能退化通常是应用程序复杂性的一个症状。这是因为低效率往往被埋在各处。例如,在我在 Slack 的团队通过引入 lint 规则解决这个问题之前,我在mapStateToProps看到过许多创建新对象(例如新数组)的案例。我见过不必要的道具被传递到组件中,导致组件不必要地重新呈现。应用程序越大,redux 大小越大,这些反模式就变得越有症状。
因此,如果您做了其他所有正确的事情,redux size 本身可能不会对性能产生太大的影响。然而,软件在生产中并不是完美的,至少我没见过。因此,更大的 redux 大小会导致更多的渲染和更长的处理时间,从而导致更差的性能(在 mapStateToProps、选择器、reducers 等中)。).
挑战和经验教训
总的来说,这是一个极具挑战性的项目,涉及许多未知因素和反复试验。它原本应该是一个调查通道切换性能的短期项目。然而,它演变成了一个多季度的计划,导致在 Slack 创建了一个独立的性能工程部门!我和一个由 4-5 名前端工程师组成的小组在这个性能可观察性项目上工作了将近 1.5 年。
团队的目标不时改变,但想法是找到性能回归的大贡献者,并为开发人员创建容易看到他们的项目的性能影响的方法。
我在可观察性团队中最大的收获是工具问题。很多。不同的分析产品适合不同的使用案例。试错法中的部分“错误”来自对大量数据的追踪,这些数据最终并没有带来多少可操作的见解。正如我之前提到的,很大一部分原因是用我们现有的工具很难分析一些数据,如儿童跨度。
因此,在实现跟踪(或任何软件特性)之前,您应该对如何分析数据有一个很好的认识,并弄清楚您收集信息的方式对于手边的工具是否理想。
另一个重要的收获是,当处理一个你没有受过训练的领域时,有一个容易接近的结对编程伙伴,或者更好的是一个导师。
我的背景是前端。为了这个项目,我走进了数据科学的世界,之前没有任何培训或指导。我自学了 python 和它的许多数据科学库,并且在伯克利和斯坦福上了统计学和数据科学课。
尽管我在学习我必须学习的内容方面足智多谋,我有空闲的渠道可以提问,我也向数据科学家咨询过几次寻求帮助,但缺乏适当的指导仍然导致了可以避免的障碍。
我认为一个软件工程师应该具备的最重要的技能之一是多才多艺。拥有一个成长的心态会有所帮助。在过去的几年里,我学到了很多关于跟踪、可观察性、性能、数据科学和机器学习的知识!
我将如何学习编码(如果我必须重新开始)
原文:https://towardsdatascience.com/how-i-would-learn-to-code-if-i-had-to-start-over-607428f14266
学习如何为现实世界的数据科学编码的有力建议

作者图片
目录
我最近得到了一个惊人的机会,一个朋友提出教我柔术,作为交换,我教他如何编码。我很快意识到,从零开始教别人如何编码,比我想象的要困难得多。毕竟,距离我自己写第一行代码已经快 10 年了。这篇文章是关于我为我的朋友写的非常具体和详细的计划,教他数据科学编码的基础知识。因为我为他做了所有的工作,我想我也应该在这里和你分享所有的细节!
关于如何开始编码,有很多类似的资源。这些都很棒,但我认为这有点不同,因为它更专注于数据编码,并使用了非常具体的真实案例研究。此外,我建议使用各种免费的在线资源来进一步简化初学者编程技巧的自学。最后,我强调了任何新程序员都应该知道的 3 件最重要的事情,所以你肯定想看看。
如果您更喜欢视频格式,请考虑以下内容以了解有关该主题的更多信息:
r 还是 Python?
让我们从选择的语言开始学习。我知道,如果您正在处理数据,通常有两种选择,Python 或 r。让我们快速比较一下这两种语言的数据科学家风格。
当查看堆栈溢出开发者调查时,我们发现大约 48%的受访者使用 Python,而只有大约 5%的人使用 r。在工业中,Python 是一种更常见的语言。现在让我们更具体地看看数据科学家,而不仅仅是所有的堆栈溢出用户。
在我最喜欢的数据科学学习和项目平台 Kaggle 上,我们可以在这个笔记本中看到,大约 84.2%的受访者使用 Python,而只有 20.5 %的人使用 r。由于这些加起来超过 100%,我们可以假设一些数据科学家正在使用两种语言。

图片来自 Kaggle (阿帕奇 2.0)
最后,让我们来看看这两种语言的发展历程。我们可以在的另一个笔记本中看到,从 2020 年到 2021 年,Python 的采用有所增加,而 R 的使用有所减少。

图片来自 Kaggle (阿帕奇 2.0)
这对我来说是显而易见的。我觉得应该选择学习 python 那种语言更受欢迎,而且还在增长。这并不是说 R 不好。然而,我认为 Python 正在成长,对于就业市场来说,它将是一项更有价值的技能。我个人也觉得比 r 更直观灵活一点。

作者图片
第一步:建立环境
既然选择了 Python,那么我的朋友应该先学习哪些编码技巧呢?变量,逻辑,函数,算法,类?我的脑子在打转。这花了我一秒钟的时间,但我对我学习编程的第一天有一个奇怪而混乱的闪回。我甚至不知道从哪里开始在我的电脑上安装 Python。我对教授编程的功能部分感到非常兴奋,我完全忘记了为成功建立环境的基础。
我做的第一件事是给我的朋友一些我最喜欢的关于选择环境和在他的计算机上获得正确版本的 Python 的资源。我实际上有点纠结:他应该使用什么 IDE?他知道 IDE 代表什么吗?对于新手来说,IDE 代表集成开发环境。这实际上只是您用来编写代码的文本编辑器。
如果你在写一篇文章,你可以选择使用微软 Word、谷歌文档、记事本,或者甚至是纸和笔。就像这些都是你写最后一分钟论文的媒介一样,数据科学家和软件工程师也需要写代码的地方。这些地方是理想之地。就像 Microsoft Word 有拼写检查和格式设置来确保您不会犯语法错误一样,许多 ide 可以帮助您确保代码中有正确的语法。从技术上来说,微软 Word 可以被认为是一个 IDE,但是我绝对不推荐这样使用它,除非你是霍马理工大学的。
这是数据领域中最常用的 ide 列表。如您所见,Python 的常见 ide 有 VSCode、Jupyter Notebook、PyCharm 和 Spyder。
在做任何事情之前,我想让我的朋友对开发环境如何工作有一个很好的理解。这是我完全困惑的事情。当我学习编码时,我从 Python 开始,在一个叫做 IDLE 的 IDE 中进行。IDLE 对于学习来说很棒,但是我真的从来没有在为工作或数据项目编写代码时使用过它。我想确保他使用的东西能够代表他在现实世界中使用的东西。
对于这个特定的朋友,我推荐他从 freeCodeCamp 的以下视频开始学习基础知识。在视频中,他们向您展示了如何设置 PyCharm 环境并轻松使用它。我认为 PyCharm 是可靠的,如果你熟悉它,你可以很快地学会 VScode、Jupyter 笔记本或 Spyder。同样,我不认为你开始使用的 IDE 有那么重要。更重要的是,你使用的是那些真正将 Python 代码投入生产的人使用的工具。

作者图片
7 个编码基础
好了,接下来是编码基础。令人惊讶的是,我认为这可能是整个过程中最简单的部分之一。你看,有一种普遍的误解,认为编码是试图欺骗你。有这样一个阴谋,学习编码应该是非常困难和可怕的。我认为事实恰恰相反。编码语言,尤其是 Python,实际上被设计得尽可能直观。它们被设计成在创造良好效果的同时尽可能易于使用。如果你改变你的视角,把它们看成是直观的,编码会变得更加有趣和轻松。这并不是说你不会再被困住了;这是说,当你陷入困境时,几乎总是有一个合乎逻辑的原因和一个合乎逻辑的解决方案来解决它。
符合简约的主题。在最基本的层面上,初学者编码可以分为 7 个概念。我将在这里给出一个非常高层次的概述。
1.首先,我们从数据类型开始。在 Python 中,你可以处理数字、文本、布尔值、列表或大量数据结构。首先很好地理解这些是很重要的。

作者图片
2.接下来,我认为熟悉一下变量如何工作是有意义的。这可能因语言而异,所以只要确保您知道如何在 Python 中分配和更改变量。

作者图片
3.变量之后,你应该看看逻辑运算符是如何工作的。这些在你最初的几个项目中非常方便。 If 和 else 语句是最重要的一个,但是你肯定可以为其他人找到用例,尤其是当你处理数据的时候。

作者图片
4.你需要了解的第四件事是循环是如何工作的。计算机最擅长的一件事就是一遍又一遍地做一件简单的事情。你会惊讶地发现这些对你未来的编程是多么有用。

作者图片
5.之后,你应该学习一下的功能。这为您在编程之旅中所做的几乎所有事情奠定了基础。函数允许你封装代码并重用它。如果你真的仔细想想,好的编码就是尽可能多的重用比特。这才是真正的开始。

作者图片
6.至此,您已经对 Python 的关键构建模块有了很好的理解。现在你应该对一些基本数据结构的工作原理有了更多的了解。我建议更深入地研究列表、字典和元组。这些将为您以后的大部分数据工作奠定基础。

作者图片
7.最后,你应该开始学习使用库。最重要的有熊猫、NumPy、Scikit-learn 和 Matplotlib。这些都为您提供了分析、可视化和操作数据的额外工具。Pandas 和 NumPy 还引入了一些新的数据结构,如数组、序列和数据帧。如果你了解 python 中更基本的数据结构是如何工作的,你应该能够很快学会这些!

作者图片
就是这样。有了这 7 样东西,你就有了处理数据所需的编码基础。如果你是一名软件工程师,你可能会认为我遗漏了一些东西。我在这个列表中有意省略的是对类的解释。类是面向对象编程的基础。面向对象编程是一种围绕对象而不是功能或逻辑组织代码的编程模型。面向对象的编程非常强大,但是老实说,对于处理数据的初级阶段来说,它并不太适用。在你很好地学习了这些其他概念之后,这是你绝对应该自己去探索的事情!
下面的链接是学习所有这些概念的一些很好的资源。其中大多数都是免费的,但如果你正在寻找一种资源,让你超越编码,获得更多切实的数据科学技能,我还提供了 365 数据科学课程的折扣链接。
- freeCodeCamp:学习 Python —初学者全教程【教程】
- Python 教程:Python 教程和入门部分
- 🌟365 数据科学课程(57%的年折扣;这是一个联盟链接)
- 初学 Kaggle 练习册

作者图片
基于项目的学习
我喜欢我链接的所有课程的一点是,它们在课程工作中融入了一些小项目。我认为基于项目的学习是在获得基本基础后学习技术概念的唯一最有效的方法。我强烈建议你考虑如何使用代码来构建对你有用的东西。
对于我的朋友,我让他做的第一个项目是使用 Python 创建一个柔术随机发生器。对于任何训练来说,强化你的技能是很重要的,但是每天做同样的基础训练会很无聊。我让他制定一个计划,从一个更大的列表中随机选择 2-3 个我们应该在训练中进行的训练。这是一个简单的项目,但对我们的工作直接相关和有用。在下面评论一个你想做的 Python 项目,让自己负起责任!

作者图片
数据轨道的细节
好了,你已经学习了 Python 的基础知识。现在怎么办?如果你有兴趣学习更多关于数据的知识,我强烈建议你做一个与数据相关的项目。最好的地方是卡格尔。如果这有点太吓人,你可以跟着一起做我做过的一个项目或者其他人在 Kaggle 上做过的成千上万个项目中的一个。
很多人在这一步失去了动力。他们看到其他人已经完成的伟大工作,感到沮丧。老实说,我记得我也有这种感觉。我建议做的是浏览一些基本的笔记本,比如泰坦尼克号数据集,然后复制代码,在你自己的电脑上一行一行地运行。许多人认为这是“作弊”,但实际上这是一种很好的学习方式。更好的是,当您运行它时,对代码进行一些修改,看看会发生什么。也许可以试着将图表上的颜色从蓝色改为红色,或者将线条变粗。

作者图片
还记得我们谈论 IDEs 时提到的 Jupyter 笔记本吗?Kaggle 使用类似的东西,让你在线使用它。如果您对资源的访问权限有限,这将是一种强大而免费的计算能力。如果您想在笔记本电脑或台式机上处理数据,我建议您下载 Anaconda,这是一个软件包,它将所有相关的 Python 库和数据科学 ide 集成到一个包中。

作者图片
对新程序员最重要的提示
最后,我有 3 个建议送你上路。这些可能是新程序员可以学习的最重要的东西。
- 使用 Google 和栈溢出。如果你有一个问题,几乎可以保证之前有人在网上问过。善于通过搜索自己找到答案可能是数据科学家或软件工程师最重要的技能。
- 使用错误。你的代码不会运行,会崩溃,你会难过。不要沉溺于自怜之中。阅读错误消息;他们会告诉你什么是错的。谷歌的错误,这将节省你很多时间和头痛。
- 放松点。唯一不会编程的人是那些从不尝试或过早放弃的人。
感谢您阅读这篇文章。如果您喜欢这篇文章,请记得在 Medium 上关注我以获取更多类似内容,并注册我的简讯以获取我的内容创作和数据科学行业其他学习资源的每周更新!此外,考虑通过注册会员来支持我和成千上万的其他作家。
下次再见,祝您的数据科学之旅好运!
ML 驱动的系统有何独特之处?—了解为什么需要 MLOps 以及需要 ML 基础架构的哪些组件
原文:https://towardsdatascience.com/how-is-an-ml-driven-system-unique-4b52ae4aed03
更深入地解释为什么需要 MLOps,以及 MLOps 试图解决什么问题来使 AI 在现实世界的生产环境中工作
对于任何已经建立了 ML 解决方案或者甚至处于开发 ML 模型的 PoC 阶段的组织,我确信 MLOps 已经成为一个话题。事实上,为了以可靠、安全和高度可用的方式在生产环境中开发和部署 ML 解决方案,需要 MLOps。
在今天的博客中,我想退一步解释一下:
- 为什么 MLOps 是必要的和必需的?
- 更重要的是,MLOps 到底想解决什么问题?
- 为了解决这个问题,需要 ML 基础设施的哪些组件?
希望通过了解原因,您可以就做出更明智的决定,如果您的组织需要 MLOps,如果需要,为了解决阻止 AI 在您的组织中工作的问题/挑战,MLOps 的哪些组件是必要的。
首先,我想解释一下 ML 驱动系统的独特性,以及这种独特性需要 MLOps 解决方案的原因。

ML 驱动系统有何独特之处
为了理解为什么 MLOps 是必要的,并评估您的组织需要建立哪些与 MLOps 相关的能力,我们需要首先理解 ML 驱动的系统是如何独特的。我将 ML 驱动系统的“独特性”总结为以下四个方面:
- 以数据为中心 —以数据为中心不仅意味着 ML 驱动的解决方案的成功取决于数据的质量和数量,而且数据本身的内在特征决定了需要什么样的 MLOps 功能。
- 多团队和多技能组合协作 —在大多数组织中,构建和运行一个 ML 驱动的系统通常需要多个团队的努力,包括数据科学家、数据工程师、ML 工程师、DevOps 工程师等等。我将很快解释团队结构如何影响 MLOps 工作流和流程的设计。
- 动态生态系统 —对于 ML 和 AI 来说,有一个极其丰富且快速增长的生态系统。比如 ML 和深度学习(DL)算法的开源库也不少,像 Scikit Learn,Tensorflow,Keras,PyTorch,Fast.ai,抱抱脸。此外,还有各种各样的人工智能应用可以从 ML 中构建,包括监督、半监督、自我监督、非监督、强化学习等等。根据您的 ML 系统构建的算法和应用,所需的 MLOps 功能也有所不同。
- 连续变化 —从数据中建立和学习 ML 驱动系统。当底层数据发生变化时,ML 模型和算法也需要相应更新。ML 驱动的系统总是处于持续变化的状态,而且真的没有尽头。因此,监控数据变化和模型性能变化变得非常必要。商业环境和数据变化越快,就越有必要对 ML 模型进行“再训练”和“再学习”。因此,您确实需要了解您的业务需求和数据环境变化,然后确定在您的 MLops 工作流中构建监控解决方案的重要性。
让我们深入探讨上述 4 个方面如何影响您选择整体 MLOps 解决方案的设计。
以数据为中心
当我们谈论以数据为中心的 ML 系统时,显而易见的解释是 ML 模型的性能很大程度上取决于数据的质量和数量。的确,这是真的。但是,我认为“以数据为中心”在 MLOps 方面有更多含义:
- 首先,数据总是变化。数据总是在变化,这就需要一种监控解决方案来检测数据漂移,包括关键统计数据的变化,如最小值、最大值、标准差变化和数据分布变化。一旦底层数据发生变化,基于该数据训练的 ML 模型的性能也很可能发生变化(通常是以坏的方式)。还需要监控模型性能。因此,如果您的数据更改非常频繁,则绝对有必要在您的整体 MLOps 基础架构堆栈中构建监控功能。
- 第二,数据几乎总是脏的。众所周知,数据科学家花了相当多的时间清理数据并将数据转换为干净的状态。了解您自己的数据科学家在清理脏数据上花费了多少时间是值得的。如果时间很长,那么了解您的整个数据管道现在是如何运行的,并包括一些数据质量检查和模式实施以提高整体数据质量和可靠性,可能会很有用。
- 第三,数据并不总是可用的。原始数据很少能被输入最大似然算法进行即时学习。数据科学家经常必须将原始数据转换成特征,以帮助最大似然算法更快更准确地学习。这个转换过程被称为特征工程。特征工程通常需要数据科学家投入大量时间和精力。因此,功能也是组织的资产,就像数据本身一样。如果您的组织有多个数据科学家团队,并且他们处理相似的原始数据,那么他们很有可能会生成相似甚至相同的要素。在这种情况下,为数据科学家构建一个中心要素库来发布、共享他们的要素以及发现和重用由其他数据科学家创建的要素,可以显著增加价值并加快 ML 模型的开发时间。当然,除了特征发现和特征重用,特征库还有其他功能。我很快会有另一个关于“特色商店”的深度博客。如果您想在特色商店的博客发布时收到通知,请随时关注我的 Medium。
以上是“ML 是以数据为中心”这一事实所带来的影响。这些暗示需要你的 ML 基础设施的不同组件来处理,比如数据和模型监控,以及特征存储。
多团队多技能协作
构建端到端的 ML 解决方案,需要多个团队的不同技能。在我之前的文章— 了解 MLOps 的核心—构建机器学习(ML)管道中,我提到为了构建一个端到端的 ML 解决方案,至少需要以下 3 个关键管道:
- 数据和特征工程管道,通常由数据工程团队开发。
- ML 模型培训和再培训管道,通常由数据科学团队开发和拥有。
- ML 模型推理/服务管道,通常由 ML 工程师或生产工程师团队开发和拥有。
为了以可靠的方式自动化这三个管道,还需要其他关键组件—持续集成/持续培训/持续部署(CI / CT / CD)和基础设施即代码(IaC)。这些组件通常归基础架构团队或开发运维团队所有。
通常这些团队使用非常不同的服务和工具集。例如,数据科学家主要使用 Jupyter notebook 进行 ML 模型培训和实验,数据工程师使用 Python、SQL 和 Spark 开发数据管道,而 ML 工程师不仅需要了解 ML 模型如何将数据科学家的笔记本转换为模块化和可测试的代码,他们还必须了解底层基础设施(如 Container 和 Kubernetes 和 DevOps),以及 DevOps 管道(如 Github actions 和 Azure DevOps 管道)。
使用不同的工具、服务和框架,通常会在这些团队之间产生更多的差距。团队不得不花费更多的时间来集成不同的服务和框架,这可能会重复一些工作,并可能造成不一致。如果这些场景在您的组织中经常发生,那么考虑一个可以支持各种工作负载(数据工程、ML 培训和部署、ML 管道、功能存储、工作流编排、DevOps 集成、数据和模型监控)的单一平台将是非常有价值的,以便这些不同的团队可以在同一个平台上工作。我知道 Databricks 有这样一个数据和 AI 统一的平台,支持上面提到的各种工作负载。
有了这样一个统一的平台,管理您的 ML 基础设施和建立您的端到端 MLOps 工作流程将变得更加容易,因为您可以避免将不同提供商的许多不同服务“缝合在一起”。
如果团队花费相当多的时间集成不同的平台,由于这些集成导致不一致,(甚至错误),或者由于这些平台差异导致团队成员交流(甚至争论),也许是时候考虑迁移到统一的平台,从基础设施层解决这些问题了。
动态生态系统
ML 生态系统的所有方面都在快速发展,包括 ML 模型算法、分布式培训、数据和模型监控、ML 生命周期管理、ML 管道框架、ML 基础设施抽象、工作流程编排,以及用于共享数据见解和 ML 模型结果的网络应用。此外,人工智能和人工智能可以应用的各种商业用例也在蓬勃发展——例如计算机视觉、自然语言处理(NLP)、音频、表格数据、重新通知学习和机器人,以及多模型任务。
下面,我总结了这些 ML 方面的几个顶级开源库:
- ML 模型算法— Scikit Learn、Tensorflow、Keras、Pytorch、fastai、拥抱脸变形金刚、XGboost
- ML 分布式培训— Ray、Horovod、Dask
- 数据和模型监控—显然,arize、whylabs、Deepchecks、
- ML 生命周期/管道管理— mlflow、ZenML
- ML 基础设施抽象——元流、库贝流
- 用于共享数据和 ML 结果的 Web 应用程序— Streamlit、Gradio
- 工作流程编排— Metaflow、kubeflow、ZenML、Argo、Luigi、Dagster、Prefect
- 用例—计算机视觉(图像分类、图像分割、对象检测)、自然语言处理(会话、文本分类、问答、摘要)、音频(音频分类、语音检测)、表格(分类、回归)、强化学习和机器人技术
这个动态的生态系统无疑鼓励并创造了 AI 和 ML 社区中的许多创新。但是,如果每个团队都有自己的数据和 ML 栈和库,那么在整个组织中建立标准化和一致的 ML 工作流也会面临挑战。
如果您的组织拥有分散到不同职能部门的各种数据科学和 ML 团队,评估和推荐跨团队的一组一致的开源堆栈和库,并将它们作为整体 ML 基础架构的一部分,将会非常有用。在这种情况下,团队的工作可以重用,知识可以共享,ML 工作流/ MLOps 实践可以标准化。
连续变化状态
与普通软件不同,ML 驱动系统的迭代可以非常快,因为 ML 模型是从数据中学习的,而不是用定义的和固定的规则编程的。事实上,我们知道数据可能会很快改变。结果,ML 驱动系统的性能会显著改变(通常以恶化的方式)。为了应对这些挑战并确保 ML 驱动的系统始终保持高性能和可靠性,有两个方面非常关键。一个是监控,一个是自动化。
- 监控 — 一般来说,ML 监控包括数据监控、特征监控和模型监控。数据监控是指了解数据的汇总统计、分布和趋势是否发生了变化。与数据监控类似,特征监控是为了了解用于训练模型的特征如何随时间而变化。模型监控侧重于关键指标的性能退化,并在未知问题对您的产品和业务造成真正损害之前将其暴露出来。如果我们以分类模型为例,这些关键指标将包括分类准确度、精确度、召回率、F1 和混淆矩阵。对于可能对特定群体产生偏见和不公平的 ML 驱动的系统,深入了解模型如何跨特定群组得出结果也是至关重要的。用多维比较根除和减轻潜在模型偏差对边缘群体的影响。
- 自动化 — 由于 ML 驱动系统的迭代可能非常快,要求任何人通过重新开发新功能、重新训练 ML 模型和重新部署模型来手动响应变化是不现实的,特别是当您有数百个 ML 模型在生产中运行时。首先,这种手动方法非常耗费人力,您必须不断发展您的数据科学和 ML 团队来应对这些变化。第二,这种方法是不可测试的,如果 ML 驱动的系统没有经过充分的测试和验证,可能会产生更多的错误。第三,这种手动方法可能需要几天的时间来完成,并且可能永远不够快来处理变更并部署 ML 模型的最新更新版本。因此,有必要将这种模型重新训练和重新部署过程自动化。强大的监控加上有力的持续集成/持续培训/持续部署(CI / CT / CD)可以实现这种自动化。这就是为什么 MLOps 是非常必要的,特别是对于在生产中有许多 ML 模型或者有非常复杂和关键的系统使用 ML 模型作为基本部分的组织。
摘要
对于许多 ML 驱动的系统,MLOps 是必要的。希望通过解释为什么 ML 系统是独特的——以数据为中心、多团队和多技能组合、动态生态系统和持续变化状态——您可以更好地理解为什么 MLOps 是必要的。更重要的是,您可以了解 MLOps 试图解决什么问题,以便您可以做出更明智的决策,如您的组织是否需要 MLOps,如果答案是“是”,那么 MLOps 的哪些组件是必要的,以及您应该如何构建您的数据和人工智能基础设施以真正收获人工智能的价值。
我希望你喜欢阅读这篇博客。如果你想在有新博客发表时得到通知,请随时关注我。我一般每周都会发表 1-2 篇关于数据和 AI 的文章。
如果你想看到更多围绕现代高效数据+AI 栈的指南、深度潜水、见解,请订阅我的免费简讯— 高效数据+AI 栈 ,谢谢!
注:以防万一你还没有成为一个媒体成员,并希望获得无限制的媒体,你可以使用我的推荐链接注册!我可以免费给你一点佣金。非常感谢你的支持!
线性代数在机器学习中是如何应用的
原文:https://towardsdatascience.com/how-is-linear-algebra-applied-for-machine-learning-d193bdeed268
从使用矩阵和向量来表示数据开始

用于机器学习的线性代数(图片来自作者的网站
说实话,线性代数在机器学习中的作用一直困扰着我,因为我们大多是在数学背景下学习这些概念(如向量、矩阵),而放弃它们在机器学习环境中的应用。事实上,线性代数在机器学习中有几个基本的用例,包括数据表示、维数约简和向量嵌入。从介绍线性代数中的基本概念开始,本文将构建一个如何将这些概念应用于数据表示的基本视图,例如求解线性方程组、线性回归和神经网络。但是,如果您想了解更多关于主成分分析(PCA)的线性代数,您可能会发现这篇文章更有帮助。
对于机器学习线性代数的视频演练,我在本文底部包含了我的 YouTube 视频。
标量、向量、矩阵和张量的定义
首先,让我们解决线性代数的构建模块——标量、向量、矩阵和张量。

标量、矢量、矩阵、张量(图片由作者提供)
- 标量:单个数字
- Vector:一维数字数组
- 矩阵:数字的二维数组
- 张量:多维数组的数字
为了实现它们,我们可以在 python 中使用 NumPy 数组np.array()。
scalar = 1
vector = np.array([1,2])
matrix = np.array([[1,1],[2,2]])
tensor = np.array([[[1,1],[2,2]],
[[3,3],[4,4]]])
让我们看看上面生成的向量、矩阵和张量的形状。

向量、矩阵、张量形状(图片由作者提供)
矩阵和向量运算
1.加法、减法、乘法、除法

矩阵运算中的加减乘除(图片由作者提供)
类似于我们对数字的运算,同样的逻辑也适用于矩阵和向量。但是,请注意,对矩阵的这些操作对两个大小相同的矩阵有限制。这是因为它们是以元素方式执行的,这与矩阵点积不同。

矩阵运算(图片作者提供)
2.点积
点积经常与矩阵元素乘法混淆(上面已经演示过);其实是对矩阵和向量比较常用的运算。
点积通过将第一个矩阵的每一行与第二个矩阵的每一列一次一个元素地迭代相乘来操作,因此j x k矩阵和k x i矩阵之间的点积是一个j x i矩阵。这是一个 3x2 矩阵和 2x3 矩阵之间的点积的例子。

矩阵点积(图片由作者提供)
点积运算需要第一个矩阵中的列数与第二个矩阵中的行数相匹配。我们用dot() 来执行点积。运算中矩阵的顺序至关重要——如下所示,matrix2.dot(matrix1)将产生与matrix1.dot(matrix2)不同的结果。因此,与逐元素乘法相反,矩阵点积是不可交换的。

矩阵点积(图片由作者提供)
3.使再成形

矩阵整形(图片由作者提供)
一个向量通常被视为一个只有一列的矩阵,通过使用reshape()指定列数和行数,它可以被重新整形为矩阵格式。我们也可以将矩阵改变成不同的布局。例如,我们可以使用下面的代码将 2x2 矩阵转换为 4 行 1 列。

矩阵整形(图片由作者提供)
当矩阵的大小未知时,reshape(-1)常用来降低矩阵维数,将数组“展平”成一行。整形矩阵可广泛应用于神经网络中,以使数据适合神经网络结构。

矩阵整形(图片由作者提供)
4.移项

矩阵转置(作者图片)
转置交换矩阵的行和列,这样一个j x k矩阵变成了k x j。为了转置一个矩阵,我们使用matrix.T。

矩阵转置(作者图片)
5.单位矩阵和逆矩阵

矩阵求逆(图片作者提供)
逆矩阵是矩阵的一种重要变换,但是为了理解逆矩阵,我们首先需要解决什么是单位矩阵。单位矩阵要求列数和行数相同,并且所有对角元素都为 1。此外,矩阵或向量在乘以其对应的单位矩阵后保持不变。
为了用 Python 创建一个 3×3 的单位矩阵,我们使用了numpy.identity(3)。

身份矩阵(图片由作者提供)
矩阵本身(下面表示为 M)和矩阵的逆矩阵的点积是单位矩阵,它遵循以下等式:

关于矩阵求逆,有两件事需要考虑:1)矩阵和矩阵求逆的顺序无关紧要,即使当顺序改变时,大多数矩阵点积是不同的;2)并非所有矩阵都有逆矩阵。
为了计算矩阵的逆矩阵,我们可以使用np.linalg.inv()。

矩阵求逆(图片作者提供)
在这个阶段,我们只涉及了线性代数中支持数据表示应用的一些基本概念;如果你想更深入地了解更多的概念,我发现 Deisenroth,Faisal 和 Ong 的书《机器学习的数学》特别有帮助。
感谢您远道而来。如果你想阅读我更多关于媒介的文章,我将非常感谢你的支持,注册成为 媒介会员 。
线性代数在 ML 中的应用
我们将从向量和矩阵在解线性方程组中最直接的应用开始,并逐渐推广到线性回归,然后是神经网络。
1.线性代数在线性方程组中的应用
假设我们有下面的线性方程组,计算 a 和 b 的值的典型方法是一次消除一个元素,这对于两个变量来说需要 3 到 4 个步骤。
3a + 2b = 7
a — b = -1
另一种解决方案是用矩阵和向量的点积来表示。我们可以将所有系数打包成一个矩阵,将所有变量打包成一个向量,因此我们得到如下结果:

矩阵表示给了我们一种不同的心态,一步解决方程。如下所示,我们将系数矩阵表示为 M ,变量向量表示为 x 和输出向量 y,然后将方程的两边乘以矩阵 M 的逆矩阵。由于矩阵的逆矩阵和矩阵本身之间的点积是单位矩阵,我们可以将线性方程组的解简化为系数矩阵 M 的逆矩阵和输出向量 y 之间的点积。

我们使用下面的代码片段一步计算变量 a 和 b 的值。

以矩阵形式求解线性方程组(图片由作者提供)
通过用矩阵表示线性方程组,这大大提高了计算速度。假设我们使用传统的方法,它需要使用几个 for 循环来一次消除一个元素。对于这样一个简单的系统来说,这似乎是一个小小的增强,但如果我们将其扩展到机器学习,甚至是由大量像这样的系统组成的深度学习,它会大大提高效率。
2.线性代数在线性回归中的应用
在求解线性方程系统中示出的相同原理可以被推广到机器学习中的线性回归模型。如果你想刷新你对线性回归的记忆,请查看我的文章“线性回归实用指南”。
假设我们有一个包含 n 个特征和 m 个实例的数据集,我们通常将线性回归表示为这些特征的加权和。


如果我们用矩阵的形式来表示一个实例的公式呢?我们可以将特征值存储在一个1 x (n+1)矩阵中,权重存储在一个(n+1) x 1向量中。然后我们将相同颜色的元素相乘,将它们相加得到加权和。

线性回归矩阵表—一个实例(图片由作者提供)
当实例数量增加时,我们自然会想到使用 for 循环一次迭代一个条目,这可能会很耗时。通过以矩阵格式表示算法,线性回归优化过程归结为通过线性代数运算求解系数向量[ w0,w1,w2 … wn] 。

线性回归矩阵表单—多个实例(图片由作者提供)
此外,流行的 Python 库(如 Numpy 和 Pandas)建立在矩阵表示的基础上,并利用“矢量化”来加快数据处理速度。找到了文章《告别 Python 中的循环,欢迎矢量化!“在 for-loop 和矢量化的计算时间比较方面很有帮助。
3.线性代数在神经网络中的应用
神经网络由多层互连的节点组成,其中来自前几层的节点的输出被加权,然后被聚合以形成后几层的输入。如果我们放大神经网络的互连层,我们可以看到回归模型的一些组件。

神经网络中的隐藏层(图片由作者提供)
举一个简单的例子,我们从一个神经网络中可视化出隐藏层 I(具有节点 i1,i2,i3 )和隐藏层 j(具有节点 j1,j2 )的内部过程。 w11 代表馈入节点 j1、的输入节点 i1 的权重, w21 代表馈入节点 j1 的输入节点 i2 的权重。在这种情况下,我们可以将权重打包成 3x2 矩阵。

矩阵形式的神经网络—一个实例(图片由作者提供)
这可以推广到数千甚至数百万个实例,形成神经网络模型的大规模训练数据集。这个过程类似于我们如何表示线性回归模型,除了我们使用一个矩阵来存储权重,而不是一个向量,但是原理是一样的。

矩阵形式的神经网络—多个实例(图片由作者提供)
更进一步,我们可以将此扩展到深度学习的深度神经网络。这就是张量在表示二维以上数据时发挥作用的地方。例如,在卷积神经网络中,我们对图像像素使用 3D 张量,因为它们通常通过三个不同的通道(即,红色、绿色、蓝色通道)来描述。
正如你所看到的,线性代数在机器学习和深度学习算法中起着构建模块的作用,这只是线性代数在数据科学中的多个用例之一。希望在未来的文章中,我可以介绍更多的应用,如线性代数降维。要阅读更多我关于媒体的文章,我将非常感谢你的支持,注册成为媒体会员。
带回家的信息
线性代数在机器学习中的重要性似乎是不言而喻的,然而,它在数据表示等方面发挥着重要作用。在本文中,我们首先介绍一些基本概念,例如:
- 标量、矢量、矩阵、张量
- 加法、减法、乘法、除法、点积
- 整形、转置、反转
此外,我们讨论了这些概念如何应用于数据科学和机器学习,包括
- 线性方程组
- 线性回归
- 神经网络
更多这样的文章

机器学习实用指南
View list10 stories


开始学习数据科学
View list8 stories


原载于 2022 年 12 月 28 日【https://www.visual-design.net】。
您的数据是如何分布的?Kolmogorov-Smirnov 检验的实用介绍
初学者 KS 测试介绍

数据科学家通常需要评估数据的适当分布。我们已经看到了正态分布的夏皮罗-维尔克检验,但是非正态分布呢?还有一个测试可以帮助我们,那就是科尔莫戈罗夫-斯米尔诺夫测试。
需要检查分布情况
数据科学家通常面临检查他们的数据分布的问题。他们处理样本,需要检查样本是否来自正态分布、对数正态分布,或者两个数据集是否来自同一分布。当你在机器学习中执行训练测试分割时,这很常见。
例如,您可能希望查看从总体中抽取的样本在统计上是否与总体本身相似。或者从同一人群中抽取几个样本,想看看彼此是否相似。
所有这些问题都有一个共同的因素:将样本的分布与另一个样本的分布或已知的概率分布进行比较。
接下来是 Kolmogorov-Smirnov 测试。
科尔莫戈罗夫-斯米尔诺夫试验
KS 测试有两个版本,每个版本都有自己的零假设:
- 样本是根据给定的概率分布生成的
- 从相同的概率分布中生成了两个样本
前者是单样本 KS 检验,后者是双样本 KS 检验。
两种测试都将样本的累积分布函数与给定的累积分布函数进行比较。从数学上来说,计算这种分布之间的距离,并将其用作可用于计算 p 值的统计值。
这些测试非常强大,尽管它们在计算 p 值时存在一些近似值,并且存在异常值。但是,是一个非常有用的工具,必须放在数据科学家的工具箱中。
让我们看看它们在 Python 中是如何工作的。
Python 中的一个例子
让我们分别从正态分布和均匀分布创建两个数据集。它们不需要具有相同的尺寸。
import numpy as np
x = np.random.normal(size=100)
y = np.random.uniform(size=200)
现在,我们可以执行 KS 检验来评估第一个样本是来自正态分布还是均匀分布。为了执行这个测试,我们需要从 SciPy 导入我们想要检查的分布的累积分布函数和一个执行测试的适当函数(“ks_1samp”函数)。
from scipy.stats import ks_1samp,norm,uniform
现在,我们可以运行测试,将“x”数据集的分布与正态累积分布进行比较。
ks_1samp(x,norm.cdf)
# KstestResult(statistic=0.05164007841056789, pvalue=0.9398483559210086)
正如所料,p 值相当大,我们不能拒绝零假设,即数据集是由正态分布生成的。
如果我们对均匀分布进行同样的检查,结果会非常不同:
ks_1samp(x,uniform.cdf)
# KstestResult(statistic=0.5340516556530323, pvalue=3.580965283851709e-27)
一个非常小的 p 值可以让我们拒绝零假设,即样本是由均匀分布产生的,这实际上是我们所期望的。
双样本测试非常简单。我们必须从 SciPy 导入“ks_2samp”函数,并将两个样本作为参数传递。
from scipy.stats import ks_2samp
ks_2samp(x,y)
# KstestResult(statistic=0.53, pvalue=9.992007221626409e-16)
正如预期的那样,p 值非常低,因为我们从非常不同的分布中人工构建了这些数据集。
因此,Kolmogorov-Smirnov 测试证实了我们的假设。
结论
Kolmogorov-Smirnov 测试是数据科学家工具箱中非常强大的工具,每次我们想要查看我们的数据是否来自给定的分布或者两个数据集是否共享相同的分布时,都必须正确使用。然而,p 值的计算可能会受到一些近似值的影响,必须正确处理,就像任何 p 值一样。
我是 Gianluca Malato,意大利数据科学家、作家和企业家。我通过我的在线课程和书籍帮助人们成为专业的数据科学家和分析师。看看我的在线课程 这里 。
原载于 2022 年 11 月 14 日 https://www.yourdatateacher.comhttps://www.yourdatateacher.com/2022/11/14/how-is-your-data-distributed-a-practical-introduction-to-the-kolmogorov-smirnov-test/。
知识图表如何让人工智能理解我们的世界
原文:https://towardsdatascience.com/how-knowledge-graphs-are-making-ai-understand-our-world-666bc68428e2
基于逻辑的计算方法的成功与失败

萨拉·库菲在 Unsplash 上拍摄的照片
你可能听说过谷歌的知识图,它为用户在搜索引擎上的查询提供文字答案。
这些知识图表在计算机科学中有很长的历史。研究人员在 70 年代就已经试图建立一个通用的数据库来回答任何可能的问题。但是这种方法很快就在可伸缩性和理解能力方面达到了极限。
今天,这些数据结构在企业数据库、市场情报和推荐算法中找到了第二次生命。让我们看看这些知识体系的好处和局限性。
专家系统的历史

斯坦福启发式编程项目的霉素实验封面,1984 年
在 20 世纪 70 年代,一些人工智能研究人员怀疑计算系统能否形成对事物的全局理解。所以他们决定让他们研究狭窄的、定义明确的问题。
通过向算法提供特定专业领域的知识,他们认为自己会做出比人类专家更好的决策。他们称之为基于计算机的专家系统有三个部分。
首先,一个知识库,里面装满了与当前主题相关的“如果-那么”规则(例如,如果一个动物有羽毛,它就是一只鸟)。其次,包含当前断言和信息的运行记忆系统(“这种动物有一层毛”)。第三,推理系统,用不同的规则对案例进行推理,并给予它们或多或少的权重(“这种动物没有羽毛,因此它不是鸟”)。
研究人员已经用成千上万条规则构建了专家算法,并对结果感到非常惊讶。在某些情况下,他们发现他们几乎可以击败人类专家的判断。
例如,斯坦福大学的一个团队试图创建一个专家系统,对血液疾病进行准确的诊断。这个名为 MYCIN 的系统是由真正的医生的知识提供的,这些医生把他们的一生都奉献给了这个课题。随着案件变得越来越复杂,该算法还包括概率因素,以评估决策的不确定性。
多亏了这个复杂的数据库,霉素可以在同一病例中提供等同于或优于人类医生的诊断。这为许多其他处理类似狭窄主题的专家系统铺平了道路。
但是,尽管有这些说法,这些系统可能显示出真正的局限性,这取决于所研究的主题的性质。其中之一就是很难提取出复杂话题背后的所有显性规律。
通用信息库的诱惑

一个本体工程图的例子【https://en.wikipedia.org/wiki/Ontology_engineering
受基于符号的人工智能成功的激励,研究人员在 80 年代提出了越来越雄心勃勃的项目。
他们中的一个,道格拉斯·莱纳特,设想了一个计算系统,它包含足够的知识来建立我们世界的智能。他所谓的 Cyc 项目。
为了实现这样一个项目,Lenat 和他的团队试图描述每一个让我们了解我们环境的明确规则(例如,扔进池塘的石头会下沉,或者飞机需要推力才能飞行)。
但在解释规则之前,研究人员必须首先教给系统一些基本概念,以便能够思考(什么是一个事物,它与其他事物有什么关系……)。他们必须试图构建他们所谓的工程本体论,即共同理解的基础。在这个结构基础上,团队经过大量努力,历时十年创建了一个极其庞大的知识图谱。
计算机科学的先驱 Vaughan Pratt 被他们的项目迷住了,他决定严格评估他们系统的智能。在几次演示中,Pratt 用认知练习测试了对 Cyc 的理解。一项是分析一个人放松的照片。Cyc 的反应是展示一张人们拿着冲浪板的照片,将冲浪与海滩和放松的环境联系在一起,这显示了很好的推理。然而,在检查系统思维链时,普拉特也意识到它依赖于不太必要的逻辑推理(就像人类有两只脚一样)。
这不是 Cyc 的唯一缺陷。在更复杂的常识性问题上,它也表现不佳。当被问及面包是否是一种饮料时,系统没有给出任何可理解的答案。同样,虽然 Cyc 知道许多死亡原因,但他不知道饿死。演示因此以悲观的基调结束:Cyc 似乎总是被侵蚀其全球一致性的知识缺口所绊倒。
尽管如此,Douglas Lenat 继续从事这个项目,为建立知识库带来了新的方法。而且他可能仍然对某些东西感兴趣,因为知识系统现在正在寻找新的有趣的应用。
使用知识图促进数据理解

谷歌上“星球大战中的绿色怪物是什么”的搜索结果。作者制作的标题。
自从 80 年代的实验以来,智能知识系统已经找到了更具体的商业应用。
最具标志性的例子是谷歌将知识图表应用于其服务的方式。2012 年,该公司推出了一个系统,可以掌握互联网上的知识结构,为其搜索引擎提供信息。基于用户的意图,谷歌的算法可以将一个词与一个概念联系起来,并解开单个词背后的不同含义。
例如,人们键入类似“泰姬陵”的查询,既可以查找关于印度纪念碑的信息,也可以查找关于同名艺术家的新闻,还可以找到街角的印度餐馆。这完全取决于用户输入它的意图。
为了做出正确的回应,谷歌正在构建一个知识系统,这个系统能够比字面上的关键词查询匹配更深入地理解信息。它可以从文本中提取一般规则,并对事实进行逻辑推理。例如,当你寻找“星球大战中的绿色怪物”时,谷歌可以从链接中判断出你正在寻找贾巴小屋,说明它是“一个巨大的,类似鼻涕虫的外星人”。所以它可以把“外星人”这个概念和查询“绿怪”联系起来,相对准确。
但是除了搜索模型之外,知识图也被用于其他人工智能模型。例如,在卫生部门,研究公司收集了大量没有任何标签或结构的数据。这些数据是一个巨大的错过的机会,以获得对药物开发和治疗可能性的更好的见解。
通过自动注释和使用人类的洞察力,自然语言处理模型为研究数据提供意义,在疾病和治疗之间做出推断。基于精心构建的知识,这种模型可以通过准确、有根据和透明的推理将疾病或已知的健康状况与科学研究联系起来。
这种模型也越来越多地用于投资和商业发展决策。大公司需要市场情报,而不仅仅是基于无意义的数据搜集。他们希望捕获与其特定业务问题相关的信息。
他们还希望能够监控所有关于该公司的新闻和评论,以评估他们的声誉。基于知识图表,智能数据处理软件可以帮助发现新的见解,并收集关于公司的深层反馈。
换句话说,人类知识和数据智能之间的协作从未如此激烈。而这仅仅是人类和机器之间漫长而富有成效的对话的开始!
线性回归、时间序列分析和箱线图如何帮助我们理解制造过程
关于如何在不了解流程的情况下,查看制造数据并尝试理解是否可能存在系统性制造问题的一些想法

乔希·比奇在 Unsplash 上的照片
说到制造业,数据变得越来越重要。我研究了不同种类的制造过程,我可以说,我们可以通过分析数据来了解过程中是否存在一些制造问题;当然,在分析之后,如果我们认为某些制造问题可能存在,则必须在制造生产环境中调查该过程。
在继续之前,我必须说,这种方法已经在真实的案例研究中得到测试和验证,但我在本文中展示的图表是根据模拟数据生成的。当然,即使这些数字是模拟的,这也不会影响过程,它仍然是有效的:显示的数字只是理解过程的参考。
首先要知道的是,我只分析了由人类操作员实现的制造过程:我从未(直到现在)分析过由机器人或以某种方式自动化的制造过程(我认为,这项研究必须以不同的方式进行)。这种分析制造数据的方式可以在许多手工制造过程中给出好的结果;它们可以是:焊接、装配、功能测试、钣金弯曲等。
因此,假设我们有一个在“x”制造阶段实现的产品。“x”的值是多少并不重要,因为这种方法是通用的,每次研究一个阶段是有用的。
假设我们已经注册并存储了产品的生产数据。我们拥有的数据是每个阶段制造产品所需的时间,我们甚至知道是什么时候制造的(日期,用日、月和年表示)。
最后,我们将“周期时间”定义为每个阶段制造产品所需的时间。
现在,假设我们已经导入并清理了我们的数据(“周期时间”),我们希望看到每个月的周期时间,用回归线分布。让我们称我们的数据框架为“阶段”。
首先,我们希望从“日期”列中提取“月份”,并添加“月份”作为数据框的新列;我们可以这样做:
#pandas as pd already importedphase[‘month’] = pd.DatetimeIndex(phase[‘date’]).month
现在,我们可以用回归线绘制每个月的周期时间散点图:
import seaborn as sns
import matplotlib.pyplot as plt#plotting the time series analysis with a regression line
sns.regplot(data=phase, x="month", y="time",
line_kws={"color": "red"})#labeling
plt.title(f"LINEAR REGRESSION OF THE TIME SERIES ANALYSIS", fontsize=25) #plot TITLEplt.xlabel("MONTH", fontsize=20) #x-axis label
plt.ylabel("CYCLE TIMES [m]", fontsize=20) #y-axis label
这是结果:

周期时间的时间序列的线性回归(红线)。图片由作者提供。
因此,从 4 月(第 4 个月)到 10 月(第 10 个月),平均周期时间增加了,因为回归线具有正斜率。我们只能说这些吗?能不能稍微深入分析一下这个阶段?
可以试试箱线图分析,看能不能帮到我们。让我们创建箱线图:
#boxplot
sns.boxplot(data=phase, x='month', y='time')#labeling
plt.title(f"BOXPLOT", fontsize=16) #plot TITLE
plt.xlabel("MONTH", fontsize=14) #x-axis label
plt.ylabel("CYCLE TIME[m]", fontsize=14) #y-axis label#adding an horizotal line to the mean cycle time
plt.axhline(mean, color="red") #horizontal line of mean cycle time
red_line = mpatches.Patch(color="red",
label=f"mean value: {mean:.1f} [m]")#handling the legend
plt.legend(handles=[red_line],prop={"size":12})
这是结果:

周期时间的箱线图。图片由作者提供。
箱线图似乎更有帮助。事实上,我们可以看到,从 4 月到 6 月,盒子有一点“波动”,这是正常的;但是,从 7 月到 10 月,箱子的周期时间明显变长了!
当然,我们不知道是什么导致了这种转变,但既然转变是明显的,即使根据回归线,周期时间也有所增加。
这种分析为我们提供了进入细节的输入,试图理解是什么导致了周期时间的增加,以及是否可以消除它。因为,因为我们是在制造业,周期时间的增加可能是因为需要提高产品的质量(例如,我生产得更慢,提高质量和减少错误)。
结论
我认为这种方法真的有助于理解是否存在“系统性制造问题”,分析我们拥有的数据。当然,在此分析之后,必须在生产环境中分析制造流程,以了解为什么会出现这种系统性的制造问题,这是什么问题,以及是否必须消除这种问题。
我们一起连线吧!
https://federicotrotta.medium.com/
LINKEDIN(向我发送连接请求)**
如果你愿意,你可以 订阅我的邮件列表这样你就可以一直保持更新了!**
考虑成为会员:你可以免费支持我和其他像我一样的作家。点击 这里成为会员。****
机器学习如何推动零信任革命
原文:https://towardsdatascience.com/how-machine-learning-powers-the-zero-trust-revolution-6953bfc0c14c

图片来源: Pixabay
零信任正在安全领域掀起风暴。这是一种新的模式,在提高现代分布式 It 环境的安全性方面具有巨大的潜力。然而,零信任需要先进的技术来评估计算机网络上的活动,动态确定风险,并自动分配策略。
在本文中,我将解释零信任系统的这些复杂要求,以及机器学习如何使它们成为可能。
什么是零信任?
零信任是一种安全模型,旨在保护网络免受内部威胁。它包括实施安全措施,执行“永远不信任,永远验证”的方法。常见的零信任安全措施包括微分段、粒度访问控制策略和第七层威胁防御。
Forrester Research 的 John kinder vag构思了这个安全模型。他意识到传统的安全模型天真地假设网络中的一切都是可信的。因此,这些网络不会怀疑用户身份遭到破坏,假设所有用户都负责任地行动。
零信任模型将信任视为一个漏洞,因为它使内部人员(无论恶意与否)能够在网络中横向移动,访问用户允许的任何数据和操作。
机器学习如何推动零信任安全
启用基于风险的安全策略
安全领导者正在从传统的以合规为中心的安全方法转向风险驱动的方法。不同之处在于,在传统方法中,组织对已知的法规遵从性要求做出反应,而在基于风险的方法中,组织不断评估威胁形势并采取主动措施来防止威胁。
组织可以依靠机器学习技术来实时评估用户请求,评估设备、网络和相关行为数据等安全环境,并生成风险评分。访问控制策略可以包括这种动态风险分值,以允许访问、拒绝访问或要求更严格的身份验证。
机器学习驱动的风险评分可以考虑各种因素来识别和应对风险:
- 试图访问的位置。
- 设备特征,包括固件类型、浏览器类型和操作系统。
- 设备健康,包括安全补丁、软件更新和反恶意软件保护。
- 角色、资历和历史访问日志等用户属性。
- 日、月、年的时间。
- 最近对权限或权限请求的异常更改。
- 异常命令或对资源的访问。
大规模实施安全策略
在大型组织中,可能有数百个应用程序和云服务以及数千个用户。需要在这个复杂的环境中实施标准化的策略,并可靠地检测违规行为。
机器学习可以通过根据行为模式的实时分析自动调整访问策略来提供帮助。这可以根据组织定义的中央策略自动完成,而不是让 IT 和安全团队不断审查访问请求并手动授予访问权限。
从最终用户的角度来看,这也提供了更好的体验,因为如果用户的请求是合法的,他们将获得快速访问,而无需等待手动批准。
改善用户体验
传统上,在改进的安全性和积极的用户体验之间有一个缺点。更安全的系统通常令人沮丧且难以使用。组织现在认识到安全性应该是透明的,对用户来说是非侵入性的,这将鼓励用户采用安全的身份验证机制,并将提高整体安全性。
早期的多因素身份认证(MFA)对用户体验有负面影响,并受到用户和员工的反对。许多组织倾向于不采用 MFA,或使其成为自愿的,以避免吓跑用户。然而,新一代零信任技术正在改变这一点。
基于机器学习技术的现代认证将用户的安全环境考虑在内,可以实现更简化的用户体验。一个例子是无密码认证系统,它可以通过组合动态认证因素来认证用户。另一个例子是,从办公室使用公司工作站登录的用户可能使用 SSO 身份验证令牌登录,甚至不需要提供密码。相反,如果用户试图远程登录或在不正常的时间登录,身份验证系统可以传达登录尝试不正常,需要额外的身份验证。
这种类型的差别认证是有意义的,并且将会得到用户的支持,尤其是当他们的日常登录过程是积极的时候。基于 ML 风险评分的差异认证可以将用户转变为组织安全工作的合作伙伴。
AI/ML 在零信任技术中是如何使用的?
几项安全技术在零信任部署中起着关键作用:
- 下一代防病毒(NGAV) —用于验证最终用户设备的健康状况,并使零信任系统能够阻止被入侵设备的访问。
- 扩展检测和响应(XDR) —用于跨越孤岛,从混合环境中收集数据,以检测和响应复杂的威胁。
- 用户和事件行为分析(UEBA) —用户和服务帐户行为分析背后的引擎,它是零信任访问方法的基础。
人工智能在下一代反病毒中的应用
NGAV 通过检测与已知文件签名不匹配的新攻击来改进传统防病毒软件。它可以抵御零日攻击、无文件攻击和改变源代码以避免被传统防病毒软件检测到的规避恶意软件。
NGAV 利用几种机器学习技术来检测未知威胁:
- 静态特征 —将单个二进制代码或汇编文件与已知恶意软件的代码片段进行比较。
- 字符串分析 —分析来自可执行程序的可打印字符串,这些字符串可能出现在 URL、文件路径、菜单、API 命令、配置文件或命令行输出中。
- N-grams 分析 —分析从可疑二进制文件中提取的字节序列。
- 熵 —分析代码的统计方差,识别加密或混淆代码。
- 可视化二进制内容 —将恶意软件的二进制代码转换为图像格式(其中每个字节都是图像中的一个像素),并使用计算机视觉技术对其进行分析。
- 控制流图(CFG) —使用控制流图来比较可疑恶意软件和已知恶意软件。
扩展检测和响应(XDR)中的人工智能
XDR 是一种新的安全技术,它关联和分析来自各种来源的数据,以识别规避的威胁。这有助于在零信任环境中检测和主动搜寻高级威胁。
XDR 解决方案利用机器学习技术将来自网络日志、端点和云日志的数据点缝合在一起,以检测攻击并实现更简单的调查。该数据具有很高的维度(通常一次攻击的行为维度超过 1000)。对组合攻击数据的分析利用了:
- 自动化数据预处理 — XDR 解决方案从许多来源聚合数据,将其标准化并自动清理,以便在机器学习算法中使用。从某种意义上来说,XDR 解决方案是一个“盒子里的数据科学家”,从 IT 系统中提取实时数据,并将其转化为标准化的数据集,可以馈入无监督和有监督的 ML 算法。
- 无监督机器学习 — XDR 解决方案使用无监督算法来创建用户和设备的基线行为,并识别对等组,这有助于确定特定实体的正常行为。然后,它可以比较过去的行为、当前的行为和对等行为,以检测恶意软件、命令和控制(C & C)通信、横向移动和数据泄漏。
- 监督机器学习 — XDR 解决方案识别网络上的各种实体,如 Windows 电脑、电子邮件服务器或 Android 手机。然后,它可以使用已知的可疑事件作为训练集,对与一类实体相关的流量和事件进行大规模监督算法训练。然后,该算法执行推理以在运行时识别可疑事件。这种方法可以极大地减少误报。
用户和实体行为分析中的人工智能(UEBA)
UEBA 是许多安全系统的基础,这些系统试图通过将当前行为与已知的行为基线进行比较来识别未知的威胁。
UEBA 系统的输入是日志数据。这些数据被处理成事件,被摄取到机器学习算法中,输出是每个事件的风险分数。商业 UEBA 系统在非常大的规模上这样做,以低延迟推理对实时大数据进行操作。
自动 UEBA 的一个重要部分是其自动化数据预处理。它执行统计分析以查看哪些数据字段适合进行分析,提取对安全分析有用的变量或特征,并确定哪些可用算法最适合数据。
UEBA 使用非监督和监督方法来分析安全数据,动态决定哪种算法最适合每种类型的数据:
- 监督算法 —当 UEBA 拥有预先标记的数据时,它会利用监督算法。例如,如果安全系统提供已确认事件的历史日志,则该日志被标记为恶意活动数据。UEBA 系统可以根据这些数据进行训练,并分析任何类似的数据来检测相同类型的恶意活动。UEBA 系统中常用的算法有逻辑回归、线性回归和深度神经网络。
- 无监督算法 —在许多情况下,UEBA 没有带标签的数据集可供使用。在这种情况下,它使用像 K-means 聚类这样的算法,可以学习数据点之间的相似性。例如,聚类算法可以查看访问日志的大型数据集,识别统计属性,如频率、直方图和时序结构,并将它们分组为具有明显相似性的聚类。通常,异常行为将被分组到最小的群集中,这是系统可以发现可疑或恶意访问尝试的地方。
结论
在这篇文章中,我解释了零信任的基础,以及机器学习如何影响组织中零信任的采用。我介绍了三个案例研究,展示了机器学习是如何在零信任技术中使用的:
- 下一代防病毒(NGAV) —利用各种技术来分析被怀疑为不安全的二进制文件,并识别新的和未知的恶意软件中的恶意属性。
- AI in eXtended Detection and Response(XDR)—执行自动化数据预处理,创建与多个 IT 系统相关的海量数据集,并使用监督和非监督方法将相关事件缝合在一起并识别攻击。
- AI in User and Entity Behavioral Analytics(UEBA)——收集网络中实体的数据,动态决定对其应用哪种机器学习算法,并基于标记或未标记的数据集计算风险分值。
在未来几年,我们可以期待看到人工智能和机器学习在安全行业变得更加普遍。很快,强大的 ML 基础将成为任何零信任安全技术的关键部分。
有多少个集群?
原文:https://towardsdatascience.com/how-many-clusters-6b3f220f0ef5
选择正确聚类数的方法
简介
聚类是一种无监督的机器学习方法,可以从数据本身识别相似数据点的组,称为聚类。对于一些聚类算法,如 K-means,需要事先知道有多少个聚类。如果没有正确指定簇的数量,那么结果的信息量就不大(见图 1)。

图 1 :不同簇数的聚类,k=4,6,& 8。具有 6 个集群的模拟数据。图片作者。
不幸的是,在许多情况下,我们不知道我们的数据中有多少聚类。事实上,弄清楚有多少个集群可能是我们首先要执行集群的原因。当然,数据集的领域知识可以帮助确定聚类的数量。但是,这是假设你知道目标类(或者至少知道有多少个类),而这在无监督学习中是不成立的。我们需要一种不依赖于目标变量就能告诉我们聚类数的方法。
确定簇的正确数量的一个可能的解决方案是强力方法。我们尝试用不同数量的聚类来应用聚类算法。然后,我们找到优化聚类结果质量的幻数。在本文中,我们首先介绍两个流行的度量标准来评估集群质量。然后,我们介绍三种方法来寻找最佳的集群数量:
- 肘法
- 轮廓系数的优化
- 差距统计
聚类结果质量
在讨论确定最佳聚类数的不同方法之前,我们先来看看如何定量评估聚类结果的质量。想象以下场景。相同的数据集被分成三个集群(见图 2)。如您所见,左边的分类定义得很好,而右边的分类却很难识别。

图 2 :基于同一数据集的定义明确的聚类(左)和定义不明确的聚类(右)的例子。箭头指示数据点与其聚类中心之间的距离。图片作者。
这是为什么呢?请记住,聚类的目标是将数据点分组为簇,以便(1)簇内的点尽可能相似,(2)属于不同簇的点尽可能不同。这意味着,在理想的聚类中,类内变化较小,而类间变化较大。因此,一个好的聚类质量度量应该能够定量地总结(1)和/或(2)。
一个这样的质量度量是惯性。这是通过数据点和它们所属的聚类中心之间的平方距离之和来计算的。惯性量化了集群内的变化。
另一个流行的指标是轮廓系数,它试图总结集群内和集群间的变化。在每个数据点,我们计算到该数据点所属聚类中心的距离(称为 a ,以及到第二好的聚类中心的距离(称为 b )。这里,第二最佳聚类是指不是当前数据点的聚类的最接近的聚类。然后基于这两个距离 a 和 b ,该数据点的剪影 s 计算为 s=(b-a)/max(a,b)。
在理想的聚类下,距离 a 与距离 b 相比非常小,导致 s 接近 1(见图 3,左侧)。如果聚类不是最理想的,那么距离 a 和 b 可能不会有很大的不同(见图 3,中间)。在那种情况下, s 接近于 0。如果聚类更差,那么距离 a 实际上可能大于距离 b (见图 3,右侧)。在这种情况下, s 变为负值,接近-1。

图 3 :聚类最优(左)、次优(中)、更差(右)的场景。星星表示星团中心。图片作者。
一旦在所有数据点计算了 s ,则 s 的平均值确定了轮廓系数。可以分别为每个聚类或所有数据点计算轮廓系数。轮廓系数接近 1 表示聚类算法能够将数据划分为分离良好的聚类。
肘法
惯性是群集数量 k 的递减函数。然而,它的减少率在高于或低于最佳聚类数 K 时是不同的。对于KK<KK来说,惯性下降很快,而对于KK>KK来说,惯性下降很慢。因此,通过在 k 的范围内绘制惯性图,可以确定曲线在 k 处的弯曲位置,图 4 显示了图 1 示例中的惯性图。我们可以清楚地看到在 k =6 处有一个弯曲,或者说是肘部。
然而,这种方法有些主观,因为不同的人可能在不同的位置识别肘部。在我们图 4 的例子中,有些人可能认为 k =4 是肘。此外,正如我们将在后面看到的那样,肘部可能并不总是很明显。

图 4 :不同 k 下的惯量图,为图 1 所示的数据集。图片作者。
肘方法的用例可以在一个自然语言问题中看到,使用 KNIME 分析平台确定社交网络中的最佳主题数量(参见博客主题提取:使用肘方法优化主题数量)。因为没有 KNIME 节点来计算惯性,所以在本例中使用了一个 Java 片段节点来计算惯性。下面是用来计算惯性的代码片段。
// Initializing the sum of squares
out_sum_squares = 0.0;
/*
The first half of columns belong to features of the origin.
The second half of columns belong to features of the terminus.
The groups of columns have to be in the same order.
*/
int col_count = getColumnCount();
int no_dimensions = col_count / 2;// Loop over the feature columns
for(int i=0; i < no_dimensions; i++){
/*
Checking if the feature i from the origin and
the feature i from the terminus (i.e., i+no_dimensions)
are not missing, and have similar column names
*/
if(!isMissing(i) && isType(i, tDouble)
&& !isMissing(i+no_dimensions) &&
isType(i+no_dimensions, tDouble) &&
getColumnName(i+no_dimensions).contains(getColumnName(i))){
// Calculating the squared distance and adding it to the sum
out_sum_squares += Math.pow(getCell(i, tDouble) -
getCell(i+no_dimensions, tDouble), 2);
}
}
剪影法
轮廓系数可以提供更客观的手段来确定最佳的聚类数目。这是通过简单地计算 k 范围内的轮廓系数,并将峰值确定为最佳 K 来实现的。一个 KNIME 组件优化的 K-Means(剪影系数)正是这样做的。它在 k 的范围内执行 K 均值聚类,找到产生最大轮廓系数的最优 K ,并基于优化的 K 将数据点分配给聚类。图 5 显示了来自图 1 所示示例数据的轮廓系数图示例。可以看出,轮廓系数在 k =6 处达到峰值,因此被确定为最佳 k

图 5 :不同 k 的剪影系数图,为图 1 所示的数据集。图片作者。
差距统计
为了讨论间隙统计,让我们考虑一个没有任何聚类组织的随机数据集的聚类。假设一个随机数据集被聚类成 k 个聚类,然后根据聚类结果计算惯性(见图 6)。尽管缺乏基本的聚类组织,但随着 k 的增加,聚类的随机数据产生稳定减少的惯性(惯性的复数)。这是因为聚类中心越多,数据点到聚类中心的距离就越小,从而产生衰减惯性。相比之下,正如我们在图 4 中已经看到的,在具有聚类组织的数据集中,无论 k 低于还是高于最优聚类数 K ,惯性下降的速率都会变化。当观察到的惯性和随机数据一起绘制时,差异变得明显(见图 7)。通过比较来自(有希望的)聚类数据集和覆盖数据空间中相同范围的相应随机数据集的惯性来计算缺口统计量(Tibshirani 等人,(2001))。

图 6 :均匀分布的随机数据聚类成 k=4(左)、6(中)、15(右)个聚类。图片作者。

图 7 :原始数据(来自图 1)相对于 k. Image 范围内的随机数据,惯性如何降低。
在间隙统计的实际计算中,会生成一些随机样本,然后在 k 的范围内进行聚类,并记录所得的惯性。这为随机情况提供了一些惯性。原始数据集也在范围 k 上聚集,产生一系列惯性。在 k 簇上的间隙统计量计算如下

其中,Wk(i)是来自第 i 个随机样本(i=1,2,…,B)和第 k 个个聚类的惯量,Wk 是来自第 k 个个聚类的原始数据的惯量。我们还计算其标准偏差为

然后我们找到最优的 K 作为满足条件的最小的 k

间隙统计的计算涉及模拟。我们调用 R 中的函数,通过 KNIME 工作流中的一些 R 脚本来计算 gap 统计数据。具体来说,调用 clusGap()函数来计算不同 k 处的间隙统计量,maxSE()返回满足上述条件的最优 K 。图 8 显示了我们在图 1 中的示例数据集的间隙统计图,基于在每个 k 处 B =100 次迭代。红线代表满足上述条件的最佳 K 。

图 8 :基于 B=100 次迭代的缺口统计及其标准差图。满足条件的最佳 k=6 由红线表示。图片作者。
需要注意的是,间隙统计法确定的最优 K 可能不一致。例如,当缺口统计方法多次应用于我们的玩具数据时,得到的最优 K 可能会不同(见图 9)。

图 9 :缺口统计图示例。最佳 k 可能不一致,这取决于模拟结果。图片作者。
示例:MNIST 手写数字数据
现在让我们在具有集群组织的真实数据集上检查上述三种方法。MNIST 数据集由从 0 到 9 的手写数字的灰度图像组成。在这个例子中,我们使用 8×8 像素的 n=1797 个图像。图 10 显示了数据集的一些例子。上述三种方法用于确定最佳聚类数。由于该数据集中有 10 个不同的数字,因此有理由假设有 10 个聚类,每个聚类对应于其中一个数字。然而,人们可能有多种方式来书写某些数字。因此,实际上集群的数量不一定是 10。数据的 2D 散点图(由 tSNE 投影到 2D 空间,见图 11)显示,一些集群可能与其他集群分离良好,而一些集群可能接触或重叠。这个例子的工作流程可以在 https://kni.me/w/ACjm92qCUGbXsCX6 的 KNIME Hub 上找到。

图 10 :手写数字数据的例子,以 8×8 像素下采样。图片作者。

图 11 :用 t-SNE(t-distributed random neighbor embedding)投影到 2D 空间的数字数据散点图。图片作者。
肘方法的结果是不确定的,因为图中没有明显的肘(图 12,左)。在图中有一些细微的弯曲(例如,9、12、20、24,仅举几个例子),并且这些中的任何一个都可以被选择作为聚类的数量。

图 12 :由手指数据生成的肘部图(左)和轮廓系数图(右)。图片作者。

图 13 :基于 B=100 次迭代,从数字数据生成的间隙统计图。红线表示最佳 k=12。图片作者。
轮廓系数在 k =12 处有一个峰值(图 12,右)。根据间隙统计法,k=12 也被确定为最佳聚类数(图 13)。我们可以直观地比较 k=9(根据肘方法最优)和 k=12(根据剪影和间隙统计方法最优)的 k 均值聚类(参见图 14)。

图 14 : K-Means 在 k=9,k=12 的数字数据中找到的聚类,用 t-SNE 投影到 2D 空间。图片作者。
结论
我们展示了选择最佳聚类数的三种不同方法,即肘方法、轮廓系数和间隙统计。虽然肘图的解释是相当主观的,但是轮廓系数和间隙统计方法都可以精确地确定聚类的数量。然而,间隙统计涉及模拟,它可能不总是产生相同的解决方案。
与许多机器学习方法一样,这里描述的方法并不是在所有情况下都适用。由于这些方法量化了聚类中心和数据点之间的距离,因此它们适合于寻找凸聚类,例如在 K-Means 聚类中找到的聚类。
参考
- 罗伯特·蒂布拉尼,根特·瓦尔特,特雷弗·哈斯蒂。通过间隙统计估计数据集中的聚类数。皇家统计学会杂志,B 辑,63:411–423(2001)。
微软和 OpenAI 是如何从 GPT-3 中挤出精华的
原文:https://towardsdatascience.com/how-microsoft-openai-are-squeezing-the-best-out-of-gpt-3-ad0990a66cbe
μ转移使 GPT-3 模型比以前认为的更好

艾伦·沃伯顿/英国广播公司/AI/Plant/CC 的更好图像-由 4.0
μTransfer 将允许公司廉价地从最大的模型中获得最佳性能。
大型神经网络显示出仅在几年前还不可想象的性能。像 GPT-3、Gopher 或 AlphaCode 这样的模型已经证明了基于大型变形金刚的模型会随着规模的增大而改进。然而,一个限制阻碍了它们在实践中的表现——由于它们巨大的体型,它们只能被训练一次。
GPT-3 175B(家族中最大的)花费了几百万(具体数字没有透露)要求“在预训练期间,需要几千万亿次/秒-天的计算。” AlphaCode 接受过一次训练,尽管再训练对于正确评估表现的变化至关重要。即使研究人员犯了通常会迫使他们重新训练模型的错误,他们也宁愿牺牲性能来避免无法承受的成本。
再培训不仅仅是为了避免错误。当神经网络初始化时,研究人员定义了一组超参数(HPs)。这些 HPs 限制了训练的边界,并引导下降过程以最小的损失收敛。有时,研究人员可以应用足够好的启发法来定义 HPs。然而,在大型神经网络的情况下,他们必须做出假设——通常是基于一组次优的惠普,因为他们无法预测行为如何随着规模的增加而变化。
尽管 GPT-3 在各种任务中的表现令人印象深刻,但由于超参数对模型来说不是最好的,因此它明显是次优的。现在,这将不再是一个问题。微软与 OpenAI ( 论文)合作,开发了μ参数化(μP),这是一种允许跨模型大小进行稳定训练的新技术。这种技术允许他们找到较小模型的最佳 HP 集,然后将它们转移(通过μTransfer)到较大的模型,以较小的计算成本获得更好的版本。
此外,为了帮助开发人员将新技术引入他们的模型,他们发布了 PyTorch 包。您可以通过运行以下命令来使用μP:
pip install mup
利用μP 和μ转移优化模型
当训练不同大小的相似模型时,一个关键问题是训练不一致——至少对于通常的参数化是不一致的。128 宽度型号的最佳 HP 不一定与 2048 宽度型号的相同,尽管它们共享一个公共架构。
通过μP(最大更新参数化),研究人员可以缩放模型大小,保持他们的行为稳定,以便他们"收敛到一个理想的极限,我们称之为特征学习极限该极限是模型能够达到的最佳状态。
他们提出,如果模型共享相同的训练动态,它们也将共享最佳的 HP。他们可以为较小的模型找到最佳的 HPs,并简单地将它们转移到较大的模型上,这将需要大量的计算来进行调整。转移过程称为μ转移(图 1、2)。

图 1:μ传输算法

图 2:μ转移的图示
μ学习率在宽度上的转移
为了证明他们的假设,他们训练了多层感知并绘制了跨模型宽度的损失-学习率曲线,同时改变了参数化(图 3,4)。它们表明μP 下的模型在宽度上共享最小损失点。
这意味着,对于所有宽度,在μP 下,而不是在任何其他参数化下,对于相同的学习率值(本例中选择的 HP ),实现了最小的训练损失。


图 3、4:在左边,训练损失相对于学习率绘制。不同的曲线是模型的不同宽度。在右侧,它们绘制了不同的参数化(图 3 中的 PyTorch 默认值和图 4 中的μP)。当参数化为默认值时,最佳学习率会在整个模型宽度内发生不可预测的变化。当参数化为μP 时,曲线共享具有最优学习速率→特征学习极限的最小损失。你可以在这里看到的动画情节。
不同超参数上的μ转移
他们使用变压器展示了μ转移如何在不同的 HPs 上同时发生(图 5)。

图 5:训练损失相对于学习率、交叉熵温度、初始化规模和学习率时间表绘制。以μP 参数化的变压器同时显示了不同超参数的相同值在宽度上的最小训练损失。
这些结果证明,较大模型的 HP 可以很容易地从较小模型的 HP 中预测出来,这对于具有成本效益的 HP 调整过程具有深远的意义。
不同维度间的μ转移
但他们并没有就此止步。模型不仅仅在宽度上变化,它们也在深度、批量、序列长度上变化。研究人员表明,除宽度外,μ转移也可能发生在其他维度上(图 6)。

图 6:训练损失与学习速度的关系图。以μP 为单位参数化的变压器显示,对于相同的学习率值,在宽度、深度、批量和序列长度上的训练损失最小。
值得注意的是,μ在宽度方向上的转移有很强的理论基础,而在其他方向上的结果则完全是经验性的。这并没有降低这些见解的有效性,但需要进一步的理论基础来建立这些发现。
超参数分类
你可能认为宽度和学习率都是 HP 的类型。为什么作者转移了一些而改变了另一些?其他像退学的 HPs 呢?
他们建立了一个分类,根据它们在μP 和μ转移中的作用来划分 HPs。不是所有的 HP 都能同样好的转移,其他的转移没有意义,等等。他们设计了三个类别:
- 可转让:有三个子类别。1)优化(学习速率、动量、LR 时间表),2)初始化和 3)参数乘数。
- 不可转移:正规化(辍学,体重下降)
- 通过传输的:宽度、深度、批量、训练时间和序列长度。
除了深度、批量大小、训练时间和序列长度之外,所有这些都有理论依据,这些都是使用 transformers 经验验证的。
一个实际的场景——μ转移 GPT 三号
由于模型越大,HP 调整的成本越高,研究人员预计最大的模型从使用μP 和μTransfer 中获益最多。
因为更大的模型需要更多的计算资源来调整,所以研究人员通常会在计算成本和惠普优化之间进行权衡。OpenAI 用一组次优 HPs 训练了 GPT-3,并实现了足够高的性能水平,而不是调整模型。
为了展示μTransfer 的潜力,微软和 OpenAI 的研究人员合作,将最初的 GPT-3 与μP 版本的模型进行了比较。他们调整了一个 40M 参数的代理模型,μ将最好的一组高性能处理器转移到 6.7B 版本的 GPT-3(大 168 倍)。
他们发现μ转移的 GPT-3 在所有任务中都优于相同大小的原始版本(图 7)。μ转移模型改进如此之大,以至于它显示出与 13B GPT-3 模型相当的性能。两倍大!

图 7: GPT-3 6.7B + μP 比它的原始对手更好,甚至比两倍于它的原始 GPT-3 更好(13B)。
如果我们推广到其他模型,GPT-3 达芬奇+ μP 将表现得像一个 350B 模型。威震天 NLG 530B 将实现+1T 高密度模型的性能——目前还没有公司制造出这种产品。
更重要的是,他们发现调整成本仅占总预调整计算预算的 7%。这意味着惠普调整现在对于任意大尺寸的型号完全可行,只需多花一点钱。相对于它们提供的性能提升,这些钱可能是最值得花的。
我们可以得出结论,对μP 中参数化的模型进行调优要优于目前可用的其他两种可能性:对更大的模型进行 HP 调优和不进行 HP 调优。
在第一种情况下,它更好,因为在实现类似性能的同时,它要便宜得多;在第二种情况下,它更好,因为虽然稍微贵一些,但性能改善是显著的。
对于给定的模型,p 和 Transfer 以最低的成本提供了最好的性能。
结论
p 提供了一种新的方法来调整大型神经网络的成本效益的方式。有了 Transfer,以前没有探索过的将最大的语言模型优化到它们的特征学习极限的可能性现在变成了现实。
像 GPT 家族这样的模型可以通过廉价的训练达到以前只有体型两倍的模型才能达到的性能水平。超参数调优的痛苦终于结束了。我预测 P 将在深度学习世界中像火一样传播,并将成为任何未来模型的默认功能——就像 ReLU、dropout 和 batch norm 一样。
如果你已经读到这里,考虑订阅我的免费双周刊简讯https://mindsoftomorrow.ck.page/!每两周一次关于人工智能和技术的新闻、研究和见解!
您也可以直接支持我的工作,使用我的推荐链接 这里 成为中级会员,获得无限权限!😃
我们如何利用设计思维来推动数据科学项目
你如何像设计师一样思考,做出更有用、更有影响力、更创新的数据驱动产品

威尔·麦克马汉在 Unsplash 上的照片
首先,你可能会想,“设计思维和数据科学有什么关系?!"我们先来定义一下设计思维,然后看看大家如何将设计思维方法应用到数据科学中。
设计思维的早期先驱之一,他们将设计思维定义为:
设计思维是一种以人为中心的创新方法,从设计师的工具箱中汲取灵感,整合人们的需求、技术的可能性和商业成功的要求。
一些事情跳出来。首先,这是一种以人为本的方法,这意味着你设计的解决方案是为人服务的,而不是技术。每个数据科学家和分析师都应该首先考虑用户!第二,它采用设计师的工具,并将它们应用于普遍的商业成功。设计思维不仅仅是设计师的,当然也不仅仅是软件用户界面(UI)的!
作为一名数据科学家,有许多方法可以将设计思维融入到工作中来帮助解决问题,例如:
- 利益相关者管理
- 确定要解决的最重要的问题
- 确定工作优先级
- 得到深思熟虑的批评
- 确定解决方案的可用性
- 在构建之前,构建一个启动计划
在开始之前,我们先来看看设计思维的几个基本要素。
双菱形
我首先要讲一下双钻石的概念。双菱形是设计思维中的一个核心概念,帮助你构建如何思考解决问题和开发解决方案的框架。这个概念是,你从左边开始,做两组发散和收敛练习,帮助你确定要解决的问题,然后探索解决方案周围的广阔空间,最后得出解决方案。设计思维中你会经常听到的两个词是发散和收敛。
- 发散型:向广泛的可能性敞开你的心扉。正如我的朋友兼导师在开始一个疗程时所说的:
驯服一个疯狂的想法比放大一个微弱的想法更容易。
- 收敛:将可能性的范围缩小到单一的一个。
双菱形以及发散和收敛思维被应用到不同的设计思维方法中,以帮助开发解决方案。

作者图片
我们怎么可能
你可能听说过这个短语,我们怎么可能,通常缩写为 HMW 。这三个强有力的词帮助我们以一种强有力的、包容的方式构建一个问题陈述。
- 如何:暗示我们还不知道解决方案。
- 可能:暗示一个解决方案是可能的,并且可能有几种实现它的方法。
- 我们:把大家召集起来帮助解决问题。
在练习设计思维时,你会经常看到这一点,我建议你亲自尝试一下,看看它是如何邀请合作来帮助你从新的角度展开问题陈述的。让我们看一个简单的例子:
来自
构建流媒体音乐推荐系统
至
我们怎样才能让用户喜欢的音乐排队,让他们听上好几个小时?
注意到区别了吗?更具启发性,同时也给用户带来了问题。
设计思维方法
你可以利用许多不同的设计思维方法,可能有成百上千种。不同的组织已经策划了设计思维方法的“系统”,并为你选择了这些方法,例如 IDEO 的设计工具包、 Google Design Sprints ,或者我所认证的 LUMA Institute 的方法。
这是他们网站上亮度方法的完整列表。我们将在这篇文章中讨论其中的几个,但实际上,每一个都可以在某个时间点应用于数据科学。如果你想了解更多,他们的网站上记录了每种方法。

图片作者来自亮度研究所
我们开始吧!
设计思维工具
设计思维的核心工具通常是便利贴、夏普斯、投票点和画架垫。这些极其简单的项目可以帮助你在一个房间里进行会议,产生惊人的结果。
在过去的几年里,令人惊讶的事情之一是数字工具的激增,这有助于促进虚拟设计思维会议。Figma 的壁画、米罗、谷歌 Jamboard 和 FIGJAM 等工具都是很好的帮助工具。每个都有一个免费的选项让你开始你的旅程。
我选择的工具是壁画。我也经常把它作为个人生产力工具。
其中一些甚至加载了模板,让你更快上手。

作者图片
利益相关者管理
当开始一个项目时,你要考虑谁是你的用户或利益相关者。您的利益相关者可能是销售、服务或工程部门的内部成员,也可能是高管或外部客户。每个利益相关者都有不同的需求和愿望;这就是利益相关者管理的用武之地。
在开始一个新项目之前,我喜欢做的第一个方法是运行一个 利益相关者映射 练习,如果可以的话,这是一个和你的团队一起做的很好的练习。这有助于对谁是最重要的人达成共识。我喜欢从树状结构开始,最重要的人物在顶层,然后从那里开始建立。然后根据每个参与者在项目中的参与程度绘制他们的地图。
确定所有关键人物后,您可以将他们映射到一个简单的两两矩阵,以影响力和兴趣/可用性为轴。利用这些象限,你可以为他们确定你的参与模式,如保持满意、积极参与、保持知情和监督。一个简单的模型,让您在参与过程中保持结构化。

作者图片
接下来,基于我的利益相关者地图,我喜欢思考我的 面试 策略。我应该与谁交谈,以确保我正确理解客户的需求。面试是一个简单的过程,但是有一些最佳实践:
- 如果你为了以后使用而记录面试,确保你得到了对方的同意。
- 确保您有一套一致的问题来比较不同的受访者。从简单的问题开始,然后越来越具体。
- 确保你是一个好的倾听者,而不是引导别人得到你想要的答案。
确定要解决的最重要的问题
当你开始一个项目时,你必须确保你正在解决正确的问题。我们从识别和采访我们的利益相关者开始,但是我们如何解决最重要的问题呢?确定什么是最重要的工作的一个很好的方法是把你的利益相关者召集在一起开一个引导式会议,让他们实时产生想法。我经常使用的两个活动是一个叫做创意矩阵的发散活动和一个叫做可视化投票的收敛活动的组合。
创意矩阵 包含行和列,允许你在合适的地方给你的参与者一些帮助。这些行通常代表一些使能器,例如技术、环境、地点、游戏等等。这些列通常代表个人或一个问题陈述。对于人来说,可以是销售、服务、工程等角色,也可以是任何问题陈述。通常,如果你使用问题陈述,你可能想在开始这个练习之前和你的小组一起集思广益,想出那些问题陈述。
设置一个 5-10 分钟的计时器,鼓励人们用想法填满所有的矩阵框。甚至指出缺少内容的区域,并引导他们填充这些框。

作者图片
当你在创意矩阵中产生想法后,你可以通过让参与者用一种叫做 的技术对最有影响力的事情进行投票来缩小这些想法的范围。将投票 可视化。给每人几个投票点(贴);4-5 人通常效果很好,让他们静静地回顾并把它们放在黑板上。完成后,您可以提取投票最高的想法,并进一步发展它们。
像壁画这样的电子工具内置了投票机制!
确定工作优先级
通常,当您有大量工作积压时,您需要额外的帮助来选择处理它们的最佳顺序。有很多区分工作优先级的技巧,但是如果你想合作完成,有一些有趣的技巧,比如购买功能和重要性难度矩阵。
购买功能 是一个工具,让您的参与者为投票的各种功能赋予一个加权值。您首先要为您拥有的每一个特性分配一个美元值,这个值应该基于特性的相对工作量或实现量。一项大规模的任务可能价值很高,而你一天左右就能完成的事情可能价值较低。
给你的参与者有限的钱花。然后他们将被迫选择在每个功能上的花费。你可以指示他们按照他们希望的任何方式进行分割,包括把所有的钱都放在一个单一的功能上。
这种技术的一个很酷的技巧是让一个非常昂贵的特性无法用他们的钱来实现。例如,购买它可能需要 200 美元,但参与者只收到 100 美元。然后告诉他们,他们可以共同努力,作为一个团体来筹集资金,以资助这些更昂贵的功能。
接下来是 重要性/难度矩阵 — 团队合作的绝佳工具。两个轴代表两个不同的值。你首先把一个想法放在黑板的底部。然后拿出你的下一个想法,确定它是比中间那个更重要还是更次要。继续这个过程,直到它们都沿着底部展开,如下图所示。
接下来,把一个想法垂直移动到棋盘中间。然后重复这个过程,直到所有的想法都被排序。这个练习的一个关键提示是,每个音符应该只占据棋盘上的一行或一列,迫使小组不要把所有的东西都放在一个象限中。每一个想法对对方来说都是相对重要和困难的。根据重要性和实现的难易程度,你最终会得到四个象限,分别代表速赢、最佳选择、登月和低优先级。

作者图片
得到深思熟虑的批评
在我的职业生涯中,获得正面反馈很容易;得到批评(不是批评)可能非常困难。人们通常不想说一些他们可能认为是负面的话。在公司里,不能给出批评是一个糟糕的文化问题,但我一次又一次地看到了这一点。克服这一点的一个奇妙方法是利用技术https://www.luma-institute.com/rose-thorn-bud/,它提供了一种便捷的方式来带来以下类型的想法:
- 玫瑰:积极的东西
- 刺:消极的东西
- 萌芽:有潜力的东西
有了这些类别,你的参与者很容易给你各种类型的反馈。想法产生后,你们分组讨论。你会发现,这种方法在提供反馈方面非常有效,让你超越了通常收到的“一切都很好”的反馈。

作者图片
确定解决方案的可用性
因此,您已经构建了最新的仪表板、流失预测工具或惊人的预测模型。你如何获得对其可用性的反馈?我们可以使用产品开发中常用的技术来评估我们的数据科学项目,这与任何其他产品没有什么不同。在我的团队中,我们一直在对我们的数据产品和仪表板进行可用性研究。
我喜欢用第一种手法, 将经验用图表表示 。这种方法让用户走完你的工具之旅,然后指出他们一路上的体验如何。从一条水平线开始,在上面有正面经历,在下面有负面经历。然后让用户写下通过工具的流程。每一个过程步骤都被放置在这条线的上方或下方,从用户的角度来看,表明什么是有效的或者无效的。

作者图片
如果你想要一个更系统、可重复的可用性测试,可以使用 系统可用性量表 或者 SUS。SUS 是一种经过验证的确定可用性的方法,它是一个简单的 10 个问题的调查,会问一些问题:
- 我想我会经常使用这个系统。
- 我发现这个系统不必要的复杂。
- 我认为这个系统很容易使用。
- 我认为我需要技术人员的支持才能使用这个系统。
- 我发现这个系统中的各种功能整合得很好。
- 我认为这个系统中有太多不一致的地方。
- 我想大多数人会很快学会使用这个系统。
- 我发现这个系统用起来很麻烦。
- 我对使用这个系统很有信心。
- 在进入这个系统之前,我需要学习很多东西。
你可以在这里了解更多关于的信息。你甚至可以使用像 Survey Monkey 或 Question Pro 这样的数字调查工具来进行管理。
在构建之前构建一个发布计划
最后,您已经准备好启动您的数据科学项目。你不必等到所有的工作都完成了才开始考虑你的发布,你可以在你的产品启动时就开始考虑。
第一种方法是开发一张 概念海报 。这个框架使得考虑构建和启动解决方案的一些实际问题变得简单。在概念中,你填写你试图解决的问题,关键利益相关者,大想法,它可能失败的原因,如何原型化和测试,最后,你将如何衡量成功。你也可以用一个例子来说明你的想法。

作者图片来自壁画样本
最后但同样重要的是 封面故事模型 。这种方法类似于为你的产品发布写一篇新闻稿,但是可以帮助你讲述从项目开始你将会产生的影响。通过创建封面故事或新闻稿,你会发现项目团队成员会更好地理解你想要创造的客户价值,因为故事是以你的客户为中心的。玩得开心点。根据您希望收到的反馈类型,包括有关所创造价值的详细信息,甚至是虚假的客户报价。

作者图片来自壁画样本
结论
设计思维是一种以人为中心的创新方法。它可以把人们聚集在一起,形成新的想法,这在你开始之前可能都不会想到。我介绍了识别和优先考虑如何与项目中的利益相关者互动的方法——产生一系列不同的想法,然后将它们缩小到最重要的想法。我介绍了几种通过包含利益相关者来确定工作优先级的方法。当你准备好接受反馈时,玫瑰-荆棘-花蕾法是征求意见的一个很好的方法。我介绍了两种不同的方法来确定您的解决方案的可用性,可以帮助您微调您构建的内容。最后,我分享了一些在产品发布前考虑产品发布的方法。本文只是对如何将设计思维融入数据科学工作的一个高度概括。我鼓励你学习更多,并开始利用一到两种技术!
如果你喜欢阅读这样的故事,并想支持我成为一名作家,考虑注册成为一名媒体会员。每月 5 美元,可以无限制地访问数千篇文章。如果你使用 【我的链接】 注册,我将免费获得一小笔佣金。
编码训练营要花多少钱?
原文:https://towardsdatascience.com/how-much-do-coding-bootcamps-cost-8df82d8ccb88
以及你真正想问的问题的答案:“编码训练营值得吗?”

亚历山大·密尔斯在 Unsplash 上拍摄的照片
我马上给你一个快速的答案:根据 BestColleges 收集的数据 ,编码训练营平均花费 13500 美元。在这个范围的高端,编码训练营的成本超过 20,000 美元。一些不太贵的营地也就几千美元。当我写这篇文章的时候是 2022 年,所以在此期间这些数字可能会增加更多。
编码训练营的价格取决于几个不同的因素:你是在校园里还是在网上(网上通常便宜 500 美元左右);无论你是全职还是兼职(兼职有时会更便宜,但不总是如此);无论是单一编码语言还是全栈 bootcamp(更全面的编码 boot camp 成本更高)。
一些编码训练营在你找到工作后会收取你一份收入分成协议。虽然这份协议一开始对你有利,但毕业后总成本可能会飙升——让你欠下数万美元。这也取决于质量——最好的在线编码训练营价格更高。
如果这就是你所需要的,我可以完成这篇超级短文,然后送你上路。但是当人们问一件东西多少钱的时候,他们通常问的是别的东西。
你可能想知道:
- 编码训练营的成本值得吗?
- 我准备为此支付 10,000 美元——这对我有什么好处?
- 为什么我要在这上面花费数千美元,而不是一个替代品?
让我们来回答这些问题。
编写训练营的费用只是大学学位的一小部分。
最有用的比较之一是将编码训练营视为软件工程或计算机科学学位的替代方案。要想在数据科学或工程领域找到一份工作,不再需要获得学位。许多入门级的计算机科学工作只需要证明你可以用 Javascript 编码。你的技能比你的文凭更重要。
虽然你不需要去哈佛获得计算机科学学位,但它仍然很贵。普通的计算机科学大学学位总共花费大约 40,000 美元,更不用说你要花四年时间去获得它。相比之下,13500 美元和 16 周的紧张工作听起来相当不错。
编写训练营代码需要几个月的全职工作。
编码训练营的费用大约是 13500 美元,是的。时间成本也很高。编码训练营是专门为在尽可能短的时间内获得尽可能多的编码知识而设计的。但是浓缩理论、基础和实践技能会产生一个极其密集的知识模型。你会以极快的速度学习。至少,你一周需要 40 个小时才能跟上工作量。你更有可能一周工作 50-60 个小时。
即使你是兼职模式,许多编码训练营期望每周 20-25 小时的时间承诺,通常在晚上和周末填满。
全职编码训练营至少运行 12 周,但有时在全职模式下长达 20 周。即使你认为价格是值得的,也一定要考虑时间成本。
编码训练营比其他选择花费更多。
将训练营的编码成本与特定课程的成本进行比较也是值得的。例如,如果你要上 Coursera,你可以找到一门由密歇根大学开设的 Python 基础课程,并附有证书。Coursera 的Python for every one specialization费用为 49 美元/月。他们估计你会在八个月内完成。那是 400 美元。
Coursera 的曲目每月售价在 39-79 美元之间。即使你每月只做 79 美元的曲目,每一首都花了你一年的时间,你也能以和普通的编码训练营一样的价格做 13 首。
拥有大学文凭是很强大的,但是我之前说的仍然有效:许多雇主根本不在乎。如果你能证明你有技能,他们会很高兴让你加入,不管你有没有文凭或证书。
与编码训练营的成本相比,在线课程或社区非常便宜。
编码训练营伴随着大量的实践。
支付 13,500 美元参加编码训练营的真正好处是,从精神上来说,你已经投资了。(很难随便在某件事情上掉几千块钱,然后不承诺。)就像健身房会员或私人培训一样,你花的钱越多,你就越有可能坚持到底。
除了财务承诺,这些课程还旨在帮助你阅读课程材料,并给你一个完成任务、家庭作业和项目的期限。
但是,如果你不需要那种外部压力来完成事情,也有完全免费的替代方案来代替编码训练营。你可以在 YouTube 上观看教程,在上阅读免费在线教材。你可以将它与像 FreeCodeCamp 这样的免费在线编码平台配对,以获得一些指导。
他们没有相同的承诺水平,他们周围的社区很少,他们更加自我导向。但是如果免费是你正在寻找的,你可能会得到和编码训练营一样的技能——只要你有动力和动机。
编写训练营代码可以保证得到一份工作。
要记住的一个重要方面是,许多编码训练营都有工作保证或退款。
编码训练营通常在软件工程行业人脉很广,他们不会羞于代表你好好利用他们的网络。特别是对于提供收入共享协议的编码训练营,确保你在训练营“毕业”后很快被雇佣是对他们最有利的。
然而,知道完成这份工作的要求非常严格也是件好事。许多要求你接受提供给你的第一份工作——即使它不是你想要的,或者它是一份兼职或合同角色。他们可能还需要每周提交一定数量的工作申请。
如果你对这些条件感到满意,那就把它算作编写训练营代码的一个优势吧。
简而言之:编码训练营平均花费 13500 美元左右,但只有你知道它值不值。
编写训练营代码的成本——13500 美元左右——无论如何都不是一个小数目。对于一个普通的两居室来说,这相当于十个月的租金,或者将近 2000 块牛油果面包。
根据单一的价格数据,很难说一个编码训练营是否值得。你需要添加一些背景。贵吗?是的。但是比大学文凭便宜。如果你是那种需要外部压力来完成目标的人,那么学习编码是一个很小的代价,特别是如果你在那之后找到了一份高薪工作。
最后,我不能告诉你是否要花钱参加编码训练营。但是有了这个额外的背景,你应该知道你的选择,你应该知道这对你个人来说是否是正确的选择。
澳大利亚在 2020 年的森林大火中损失了多少绿色?—使用 Landsat-8 图像进行计算
用 Landsat-8 图像计算澳大利亚森林火灾后某一地区健康自然植被的变化

一定区域内健康自然植被的变化。按作者分类的图像(根据数据集创建)。
摘要——自从欧洲人定居后,澳洲正经历大规模的森林砍伐,危及其野生动物,并为气候危机打开了新的大门。大约 16%的澳大利亚被森林覆盖,但是由于森林砍伐,森林覆盖面积也在迅速减少。从 2019 年 6 月到 2020 年 5 月,大规模的丛林大火摧毁了澳大利亚大面积的森林和其他健康的自然植被。这场丛林大火在 2019 年底至 2020 年初造成了最大的破坏,成为了世界范围内的重大新闻。因此,对这场森林大火造成的破坏进行分析,对于计算有多少森林和健康的自然植被损失以及需要恢复非常重要。Landsat 级数据的增加为分析人员轻松检测和计算生物量的变化提供了新的机会。Landsat 计划已经连续 40 多年提供地球观测。凭借易于获取的高分辨率 Landsat 8 数据,观测者越来越容易直观地识别城市地区、水体、健康和不健康的植被、农田甚至云层。在这项研究中,我们使用了 2019 年 1 月 20 日和 2020 年 1 月 23 日我们在澳大利亚选择的特定地区的卫星图像,并计算了这一时期健康的自然植被的变化。来自 Landsat 8 的 11 个不同光谱波段的图像为 ArcGIS 中的非监督或监督分类提供了足够高分辨率的数据,然后用于对植被进行分类并计算与之相关的面积。使用卫星数据大大有助于减少误差和更准确地探测土地覆盖变化。
关键词 —林火、野火、对地观测、陆地卫星、森林监测。
一.导言
澳大利亚是世界上第七大洲和第六大国,完全被水包围,是唯一占据整个大陆的国家。尽管澳大利亚是世界上最干燥的国家之一,但它却是世界上最发达的国家之一。最近森林砍伐率有所上升,野火使得澳大利亚健康的植被状况更加糟糕。澳大利亚最严重的自然灾害可能是 2009 年 2 月 7 日的黑色星期六丛林大火[1]。但最近从 2019 年 6 月到 2020 年 5 月的丛林大火可能是其中最严重的一次。这场大火造成 34 人直接死亡,400 多人间接死亡,9300 多所房屋被毁。在全球生态系统中,野火和丛林大火扮演着非常重要的角色,因为它们威胁着生命和植被等自然资源。有必要单独确定火灾事件,以便更好地了解火灾事件如何影响当地和全球环境[3,4]。发现被烧毁的森林和健康的植被并计算总的受灾面积也很重要。通过这种方式,我们将能够估计野火或丛林大火对自然资源的破坏程度。我们的研究工作集中在这个问题上,并利用卫星图像对火灾前后的健康植被进行无监督分类和计算来解决这个问题。植被覆盖变化的计算依赖于不同日期的两幅图像之间的数据驱动属性的比较[6]。在[7]中,研究人员计算了 1967 年至 2007 年间多类土地覆盖分类图的变化,并分析了非洲马里植被覆盖的变化和变异。最近可以找到更多的实验方法,例如基于神经网络和决策树的方法。
由于最近开展的研究工作,人们越来越认识到生物质燃烧在全球碳循环中的重要作用。通过燃烧消耗的生物质数量的估计通常基于下面提到的简单关系[10]。
M = ABc …(1)
这里,在给定的时间间隔内燃烧的植被的质量用 M 表示,在相同的时间间隔内,燃烧的面积用 A 表示,B 是生物量密度,描述燃烧完全性的因子用 c 表示[10]。不过在我们的研究中,我们使用了其他更简单的技术来更快地了解被烧毁植被的规模。
地球表面被 Landsat 卫星传感器系列连续观测了四十多年[8]。在当前和过去的 Landsat 任务中,有 4 种不同类型的传感器用于收集 EO 数据,表 1 [8]提供了每种传感器的特性。
为了探测热异常,在许多研究中使用了 Landsat 级数据。为了研究火山活动,Landsat-5 专题成像仪数据被广泛使用。为了给火灾管理系统提供信息,卫星遥感主动火灾数据已经被广泛使用了十多年[14]。采用免费数据政策和发射新仪器有助于增加大地卫星级数据的可用性,但单个大地卫星级传感器提供的空间和时间覆盖范围相对保持不变。在我们的研究中,我们使用了来自 https://usgs.gov 的陆地卫星数据。我们使用 2019 年 1 月 20 日和 2020 年 1 月 23 日澳大利亚东南部特定地区的 Landsat 影像来进行我们的研究。Landsat-8 图像在 11 个不同的光谱带中下载以进行我们的研究,而我们仅使用前 7 个光谱带图像的不同组合进行我们的研究。
二。相关研究
2010 年,Roger A. Pielke Jr .和 Katharine Haynes 做了一项关于建筑对气候影响的历史研究[1]。该研究还涵盖了 1925 年至 2009 年澳大利亚丛林火灾的影响,重点是 2009 年维多利亚州的黑色星期六火灾。2013 年发表的一项研究报告了通过光谱分析进行火灾严重性研究的应用[15]。这项研究的重点是澳大利亚北部热带稀树草原的火灾严重性分析,描述了火灾后受火灾影响的植被的即时光谱响应。对于火灾严重程度分类,该论文提出了一套候选模型,其中包括中分辨率成像光谱仪的第 2、5、6 和 7 通道。L. Giglio 等人在 2005 年进行了一项类似的研究,该研究使用 MODIS [10]对烧伤面积进行了全球估计。2016 年发表的一项研究重点关注如何利用卫星数据来确定森林火灾的着火点及其可能的日期[2]。2015 年发表了一篇专注于 Landsat-8 数据在主动火灾探测中的意义的论文[14]。他们算法关注的技术之一是从卫星图像中探测地表,并探测潜在的火灾和烟雾。在多种多样的训练和验证场景下,本文提出了一种误差非常小的算法。M. Schmidt 等人在 2015 年发表的一项研究介绍了多分辨率时序图像在澳大利亚森林干扰和生长监测领域的使用情况[11]。Grahame Douglas 等人提出在森林火灾概率检测中使用极值分析[12]。在他们的研究中,广义极值法被扩展到确定森林火灾危险指数(FFDI ),用于设计森林火灾探测。
三。陆地卫星数据和分类方法
表 1 提供了用于收集陆地卫星任务中的地球观测数据的 4 种不同传感器的特性。从 1972 年到 1992 年,多光谱扫描仪(MSS)获取了 Landsat 1–5 的数据。MSS 收集数据的空间分辨率约为 80 米,辐射测量覆盖 4 个光谱带。这 4 个光谱带从可见绿色到近红外(NIR) [8]。Landsat 4-5 使用了专题成像仪,空间分辨率在 30 米至 120 米之间。从 1984 年到 2012 年,使用了专题制图仪。7 个光谱带用于收集数据。大地卫星 7 号正在使用增强型专题制图仪(ETM+),其空间分辨率约为 30 米,分 8 个不同的光谱带。实用陆地成像仪(OLI)和热红外传感器(TIRS ),分辨率在 15 米至 100 米之间,有 11 个不同的光谱带。它从 2013 年开始运作。表 2 列出了 Landsat 1–8 中使用的所有光谱带的波长和用途。
数据集和许可:
Landsat 数据访问页面指出,“美国地质调查局档案馆保存的 Landsat 数据产品可以从各种数据门户网站免费搜索和下载”[17]。
图像选择
我们选择了 2019 年至 2020 年澳大利亚森林大火事件影响最严重的地区之一。图 1 显示了我们研究的选定区域。我们的研究将仅限于这一领域。我们选择的面积大约是 33,300 平方公里。所选区域在图 1 中用深色阴影示出。我们下载了前面提到的两个日期的 11 个不同光谱波段的 Landsat 8 图像。我们选择了这两个特定的日期,牢记最低陆地云量(LCC)的图像将给出最好和最准确的结果。2019 年 1 月 20 日,LCC 为 0.15%,2020 年 1 月 23 日,LCC 为 1.79%。

图一。选定的研究领域。来源:图片来自[16]。
我们使用地理信息系统(GIS)ArcGIS 来使用不同的波段组合并对 Landsat 图像中的不同区域进行分类,如森林、城市地区和水体等。,基于不同的颜色。

表 1。Landsat 传感器及其特性[13]。
*在 Landsat 5 上的 TM 传感器出现故障之后,MSS 传感器在卫星退役之前被重新激活了一小段时间[8]。

表二。Landsat 1–8 中使用的不同光谱波段及其用法[13]
分类
不同的波段组合为目视检查和监督分类提供了不同的结果。这也有助于无监督分类。表 3 列出了不同波段组合及其用途。

表 3。Landsat 8 的波段组合。图片作者。
我们使用表 3 中的第 9 个波段组合来目视检查我们的研究区域。图 2 和图 3 分别显示了我们在 2019 年 1 月 20 日和 2020 年 1 月 23 日的“植被分析”波段组合中的研究区域。从目测来看,差异非常明显,我们将执行更多的步骤来获得被森林火灾事件砍伐的确切面积。

图二。2019 年 1 月 20 日“植被分析”波段组成中的研究区域。按作者分类的图像(根据数据集创建)。

图 3。2020 年 1 月 23 日“植被分析”波段组成中的研究区域。按作者分类的图像(根据数据集创建)。
我们在 ArcGIS 中使用了非监督分类,以不同的配色方案对影像中的不同区域进行分类。我们用颜色标记了被归类为健康植被的浅绿色区域。根据 2019 年和 2020 年的数据对健康植被进行正确分类后,森林砍伐区变得很容易看到。包含 2019 年 1 月 20 日和 2020 年 1 月 23 日影像中健康植被的分类区域如下所示。

图 4。2019 年 1 月 20 日影像中健康植被的分类。按作者分类的图像(根据数据集创建)。

图 5。2020 年 1 月 23 日影像中健康植被的分类。按作者分类的图像(根据数据集创建)。
在无监督分类过程中,分类的准确性取决于我们对图像不同区域进行分类的类的数量。类别数量过多或过少都会导致分类不准确。在我们的研究中,在对分类图像和原始图像进行视觉检查时,使用 7 个类别给了我们最好的结果。分类后,我们计算了被分类为健康植被的面积。
四。结果和讨论
我们研究的总面积约为 33,300 平方公里。根据两个日期计算出健康植被的面积后,我们得到了表 4 中的结果。

表 4。不同日期包含健康植被的计算面积。图片作者。

图 6。不同日期包含健康植被的计算区域的图形表示。图片作者。
根据这一计算数据,在我们进行研究的地区,有 3522.27 平方公里的森林或健康植被因森林火灾或其他原因被砍伐。这里森林砍伐如此严重的主要原因是 2019 年 6 月开始的丛林大火爆发。从 2019 年 1 月 20 日到 2020 年 1 月 23 日,近 22.46%的现有森林在这一年中被烧毁。
检测和计算森林火灾后的损失对于土地利用规划和建设实践是非常重要的。随着易于获得的卫星图像数量的增加,研究人员使用这些数据和估计森林火灾事件的后果变得更加有效。在我们的研究中,我们使用了 ArcGIS 中非常常用的分类技术,即非监督分类技术,并使用它来计算两个不同日期包含健康植被的面积。无监督分类通常用于对河流和湖泊等水体进行分类,但在这里我们将其用于不同的目的。这种方法既适用于大洲范围的监测,也适用于小范围的监测。它开辟了使用 Landsat 数据计算森林火灾后果的新方法,这将有助于政府、企业和环境研究人员在未来创建生态可持续的基础设施。
动词 (verb 的缩写)结论
Landsat 系列卫星传感器是运行时间最长的地球观测项目之一,它仍在监测地球。自从 2008 年实行大地遥感卫星数据的免费和公开分发政策以来,大地遥感卫星数据是森林管理和分析中使用最多的数据之一,而且由于大地遥感卫星数据具有空间、光谱和时间分辨率,因此非常适合这种情况。
本文描述了用于根据 Landsat 8 数据计算健康植被分布的方法,但该方法可以灵活地用于计算其他要素的分布,如城市地区、水体、农田等。
来自卫星的数据可以大大有助于火灾探测,通过准确的信息和我们的方法,在火灾发生后监测森林和自然资源变得更加容易。这将有助于自动燃烧区域测绘系统和火灾强度分析系统。
我希望你喜欢阅读这篇文章。如果你有,请成为灵媒的一员。只要每月 5 美元,你就可以阅读 Medium 上的任何文章(不仅仅是我的文章,任何文章)。单击下面的链接。
https://samratduttaofficial.medium.com/membership
https://samratduttaofficial.medium.com/membership
这篇文章是我,萨姆拉特·杜塔和我的朋友吉妮娅·帕尔文写的。我们双方的信息如下。
萨姆拉特·杜塔:
Github:https://github.com/SamratDuttaOfficial
领英:https://www.linkedin.com/in/SamratDuttaOfficial
请我喝杯咖啡:https://www.buymeacoffee.com/SamratDutta
吉妮亚·帕尔文:
领英:https://www.linkedin.com/in/jinia-parvin-9a2b06211/
Github:【https://github.com/jiniaparvin】T22
参考
[1] RP Crompton,KJ McAneney,K Chen,RA Pielke Jr,K Haynes .位置、人口和气候对澳大利亚森林火灾造成的建筑损坏和死亡的影响:1925-2009 年。天气、气候和社会。2010;2, 300-10.
[2] A .贝纳利、A .鲁索、AC Sá、R .平托、O .普莱斯、N .库特西亚斯、J .佩雷拉。用卫星数据确定火灾日期和定位着火点。遥感。2016;8, 326.
[3]LB lantie,ZA Holden,AM Smith,MJ Falkowski,AT Hudak,P . mor gan,SA Lewis,PE Gessler,NC Benson。评估现行火灾特征和火灾后影响的遥感技术。国际荒地火灾杂志。2006;15, 319-45.
[4] L .吉廖,法学博士肯德尔,首席法官。用模拟 AVHRR 红外数据评估全球火灾探测算法。国际遥感杂志。1999;20, 1947-85.
[5] EA 莱曼,JF 华莱士,PA Caccetta,SL Furby,K 兹杜尼奇。澳大利亚大陆时间序列陆地卫星数据的森林覆盖趋势。国际应用地球观测和地理信息杂志。2013;21, 453-62.
[6] P .科平,I .琼克希尔,K .纳卡耶茨,B .穆伊,E .兰宾。生态系统监测中的数字变化检测方法。国际遥感杂志。2004;25, 1565-96.
[7]D . Ruelland,F . Levavasseur,A . tribo TTé。1960 年代以来马里三个试验区土地覆盖变化的模式和动态。国际应用地球观测和地理信息杂志。2010;12、S11-7。
[8] A 班斯科塔,N 卡亚斯塔,MJ 法尔科夫斯基,MA Wulder,RE Froese,JC White。利用 Landsat 时间序列数据进行森林监测:综述。加拿大遥感杂志。2014;40, 362-84.
[10] L .吉利奥、g .范德维尔夫、JT·兰德森、GJ·科拉茨、P .卡西布哈特拉。使用 MODIS 主动火观测对燃烧区域的全球估算。大气化学和物理学,2006;6, 957-974.
[11] M .施密特、R .卢卡斯、P .邦廷、J .韦贝尔塞尔、J .阿姆斯顿澳大利亚昆士兰州森林干扰和再生监测的多分辨率时间序列图像。环境遥感。2015;158, 156-68.
[12] G .道格拉斯,Y .何,Y .向,EC .莫里斯。极值分析在确定森林防火设计年超越概率中的应用。消防安全科学。2014;11, 1379-92.
[13]陆地卫星任务,可在:http://landsat.usgs.gov获得,2020 年 11 月访问。
[14] W .施罗德,P .奥利瓦,L .吉利奥,B .奎尔,E .洛伦茨,F .莫雷利。使用 Landsat-8/OLI 数据的主动火灾探测。环境遥感。2016;185, 210-20.
[15] AC Edwards,SW Maier,LB Hutley,RJ·威廉姆斯,J . Russell-Smith。澳大利亚北部热带稀树草原火灾严重程度的光谱分析。环境遥感。2013;136, 56-65.
[16]陆地卫星任务,可在 http://landsat.usgs.gov获得,2020 年 11 月访问。
[17]陆地卫星任务,可在 https://www.usgs.gov/landsat-missions/landsat-data-access获得,2020 年 11 月访问。
我的物理学学位如何帮助我成为一名更好的数据科学家

我有理论物理的硕士学位优等生。当我开始我的数据科学之旅时,我发现它对这种工作非常有用。
我的背景
我在罗马的“Sapienza”大学学习物理,并于 2008 年获得了学士学位。然后开始攻读理论物理硕士,2010 年获得。我的重点是无序系统和复杂性理论。
自从我获得学士学位以来,理论物理一直是我的最爱。我讨厌去实验室,用激光和旧电脑工作,它们都没有更新的 Windows 98 系统,不能读取 USB 笔驱动器(我不是在开玩笑)。相反,我喜欢编程和软件开发实验室。我记得有一门关于计算物理学的课程,在这门课程中,我学习了蒙特卡罗模拟和优化算法。一切都是用纯 C 语言完成的(Python 没有现在这么有名,Matlab 也很贵)。对我来说很有趣。不幸的是,对我的大多数同事来说并不是这样。
然后我自学了其他编程语言,像 R 和 Python。我记得从 Python 2 过渡到 Python 3 有多难。
我可以说,这 5 年是刺激和美好的。以下是我学到的一些东西,我后来在工作中用到。
科学方法
在我的学术研究中,我被训练成对问题有很强的科学态度。找到原因并排除它。这在软件编程和科学中非常普遍,甚至在数据科学中也变得非常重要。试图从数据中提取信息实际上是一个你不得不面对的非常困难的问题。你发现了问题,然后回到问题的根源去寻找解决方案。它总是以这种方式完成,数据科学强烈地利用了这种方法。
不要害怕近似值
不是所有的解都必须精确。物理学告诉我,如果你能控制它们,并能给出它们需要的明确理由,近似法会被很好地接受。在科学领域,永远没有足够的时间来获得可能的最佳结果,因此科学家们经常使用近似值来发布一些部分结果,同时继续努力找到更好的解决方案。数据科学与这种工作方式非常相似。你总是需要估算一些东西(去掉那个变量,简化那个目标等等)。如果你追求完美,你永远得不到任何好的东西,而其他人会用一个近似且更快的解决方案赚钱。不要害怕近似值。相反,把它们作为讲故事的工具。“我们从这个近似值开始,这是结果,然后我们移到另一个近似值,看看会发生什么”。这是执行分析的好方法,因为近似值可以让您更清楚地了解发生了什么以及如何设计接下来的步骤。物理学告诉我,只要你能控制它们的误差,近似值是可以接受的。记住:你接受近似的风险,所以你必须管理它。
基本统计工具
在我本科的第一年,我已经学会了最常用的统计工具来分析数据。概率分布,假设检验和标准误差。我永远也不会把重点放在计算标准误差的需要上。任何人都讨厌物理学家,因为他们专注于测量中的误差,这是正确的,因为没有误差估计的测量不会给我们任何信息。无论如何,这些年来我在文章中提到的大多数统计工具都来自于我获得学士学位的第一年。只有 bootstrap 出现在第三年,随机过程出现在我的 MS 的第二年。物理学家生活在数据和分析中,所以这是他们教你的第一件事。即使是理论物理学家也必须分析数据,因为他们使用蒙特卡罗模拟,这是一种模拟实验。所以,物理学给了我正确的统计工具来分析每一种数据。
数据就是一切
专业数据科学家知道,数据就是一切,如果与数据质量相比,算法并不那么重要。当你在实验室进行实验时,实验返回的数据就是圣经,必须得到尊重。你不能对噪音进行任何分析,而是必须从噪音中提取信号,这是数据分析中最困难的任务。物理学教会我如何尊重数据,这是数据科学家的基本技能。
所以,下面是物理学教会我如何成为一名更好的数据科学家的原因。当然,物理并不适合每个人,也不是一项必要的技能,但我认为它对开始这个美好的职业真的有帮助。
原载于 2022 年 1 月 17 日【https://www.yourdatateacher.com】。
大自然如何启发人工智能算法
原文:https://towardsdatascience.com/how-nature-is-inspiring-ai-algorithms-f52261abb75f
大自然是聪明的,我们来复制吧!

图片来源 (Unsplash 许可证)
观察大自然错综复杂的运作方式可以给我们提供大量相关的想法来开发解决我们自身问题的方案。人工智能的范围很远,其影响者也很远,自然有助于推动该技术的发展。
许多算法已经模拟了自然现象,如动物如何组织它们的生活,它们如何利用本能生存,世代如何进化,人脑如何工作,以及我们人类如何学习。
计算机科学家甚至用机器模仿人类的智能,设计了很多 AI 算法。
在这篇文章中,我们将深入探讨几种受自然启发的不同人工智能算法。
群体智能
群体智能(Swarm intelligence)一词由 G. Beni 和 J. Wang 于 1989 年首次提出,描述了一组个体相互作用并与其环境相互作用而形成的自组织系统。
群体中的每个个体都充当一个简单的代理,遵循一小组规则,在没有集中控制的情况下,代理一起工作以做出明智的决策。
群体智能算法的开发者基于蚂蚁、蜜蜂和鸟类等动物的行为。

鸟类的群体智能(图片来源,Unsplash 许可)
这些不同的动物在独处时智力水平都很低,但是在一起工作时,它们都能建立复杂的组织系统并生存下来。
工程师们已经将这种算法应用于机器人技术,创造出能够独立执行简单任务并与其他机器人合作解决复杂问题的机器人。
一些群体智能算法受到蜜蜂等特定类型动物的启发,如下所示:

蜜蜂的群体智能(图片来源,Unsplash 许可
蚁群优化算法
蚂蚁使用一种群体智能来生存。虽然每只蚂蚁都有一个非常小的大脑,但它们成功地合作来支持它们的蚁群。
特别是,一些种类的蚂蚁会在地面上沉积信息素,以标记其他蚂蚁遵循的最佳路径。
受这些蚂蚁智能的启发,研究人员开发了有效的通用https://ieeexplore.ieee.org/abstract/document/4129846蚁群优化算法。
人工蜂群算法
****IDervis Kara boga 在他的论文中介绍了一种基于蜜蜂群进行数值优化的思想,“人工蜂群算法是一种基于蜜蜂行为的优化算法。
在蜂群中,不同的个体有不同的角色,例如受雇的蜜蜂,它们从特定的来源收集食物,和失业的蜜蜂,它们寻找新的食物来源(侦察员)或在蜂箱里等待(旁观者)。
细菌觅食优化算法(BFO)
另一种受自然启发的群体智能优化算法 BFO 模仿细菌的觅食行为,在搜索过程中获得最大能量。
蝙蝠算法
2010 年,杨新社基于微型蝙蝠的回声定位和生物声纳能力推出了蝙蝠算法。微型机器人利用声音来探测猎物、躲避障碍物和感知周围环境。
萤火虫算法
萤火虫算法是一种元启发式算法,灵感来自萤火虫的社会行为和它们通过生物发光闪光的交流。

图片来源 (Unsplash 许可证)
集体动物行为
CAB 算法从动物身上获得灵感,这些动物组成群体以受益于群体的优势。
在群体中工作的动物在寻找食物时通常会提高效率,优化长距离迁移模式,并更好地躲避捕食者。
CAB 算法模拟一群遵循基于集体行为的规则的动物。
粒子群算法
许多研究人员也开发了受人类行为启发的算法。例如,粒子群算法模拟人类社会如何处理知识。
作为一种优化算法,它试图通过评估个人知道什么和他们的邻居知道什么来改进候选解。
受自然启发的优化算法
除了受群体行为启发的优化算法,研究人员还开发了其他基于自然生物、物理和化学系统的优化算法。
这些算法统称为自然启发优化算法(NIOAs) 。我们来看几个通俗的例子。
引力搜索算法
论文 GSA:一种引力搜索算法提出了一种基于牛顿引力定律的启发式优化算法;
“宇宙中的每一个粒子都以一种与它们的质量乘积成正比、与它们之间距离的平方成反比的力量吸引着其他每一个粒子”。
引力搜索算法
布谷鸟搜索算法
布谷鸟搜索算法是由杨和 Deb 在 2009 年为解决全局优化问题而引入的,其灵感来自布谷鸟物种中鸟类的繁殖寄生现象。
通过将蛋留在其他鸟类的巢中,某些布谷鸟发展出模仿其他物种蛋的颜色和图案的能力,因此宿主无法识别外来的蛋。
进化算法
进化算法(EA)是基于达尔文的进化论,并模仿生物的自然选择过程。
该算法从随机群体开始,评估群体解决某个问题的适应度(解决方案有多好),并选择最佳个体进行繁殖。
这种循环在群体中继续,直到算法达到最优解。
遗传算法
作为进化算法的一种,遗传算法通过受基因突变、杂交和自然选择启发的方法来解决优化和搜索问题。
首先,一个突变被引入一个群体以创造多样性。接下来,杂交将群体中的两个个体结合在一起产生一个新的后代。
然后,在每次迭代之后,一个适应度函数评估新一代并选择最佳候选。
神经网络
神经网络或人工神经网络(ann)是模仿人类神经元相互通信方式的机器学习算法。
神经网络拥有几个不同的层,包括输入层、一个或多个隐藏层和输出层。
神经网络中的每个节点代表一个人工神经元,它以特定的权重连接到其他节点。当被激活时,人工神经元将数据发送到网络的下一层。
强化学习
动物和人类通过惩罚和奖励的反复试验来学习。例如,当一个孩子学习走路时,如果摔倒,他们就失败了(惩罚),如果不摔倒,他们就成功了(奖励)。
如果他们摔倒了,他们会站起来再试一次,直到他们最终能正确行走。这是强化学习的一个例子。
在机器学习领域,强化学习算法在特定环境中执行一系列任务,目标是最大化奖励和最小化惩罚。
在每次迭代中,该算法都会学习在给定的环境条件下什么工作得最好。强化学习不同于监督学习,因为训练数据不提供与输入相关联的答案。
相反,程序员制定奖励和惩罚的规则,强化代理计算出如何执行给定的任务并获得最多的奖励。
包扎
自然执行许多复杂的功能,科学家们仍在努力理解。通过模仿某些动物的行为,我们可以找到解决生活中问题的方法,也可以更好地了解自然。
例如,理解大脑如何工作有助于改进人工神经网络,并且,通过在神经科学研究中利用人工神经网络,我们可以发现有助于我们更好地理解大脑的模式。
向大自然学习,我们可以开发高效的解决方案来解决各种复杂的问题。
你对自然如何影响人工智能算法有什么看法?请在评论中告诉我们!
神经网络如何看待一只猫
原文:https://towardsdatascience.com/how-neural-network-sees-a-cat-1eab7d19a751
使用目标输出的梯度下降优化可视化卷积神经网络
作为人类,我们知道猫长什么样。但是神经网络呢?在这篇文章中,我们揭示了猫在神经网络大脑中的样子,也谈到了对抗性攻击。

真实而理想的猫。左边的图片是来自 Unsplash 的
卷积神经网络非常适合图像分类。有许多预先训练的网络,如 VGG-16 和 ResNet,在 ImageNet 数据集上训练,可以将图像分类到 1000 个类别中的一个。他们的工作方式是学习不同对象类别的典型模式,然后通过图像识别这些类别并做出决定。它类似于人类,用他/她的眼睛扫描一张图片,寻找熟悉的物体。
AI 初学者课程
如果你想了解更多关于卷积神经网络和一般神经网络的知识,我们建议你访问微软 GitHub 提供的 AI for 初学者课程。这是一个学习材料的集合,分为 24 节课,学生/开发人员可以用来学习人工智能,教师也可以在课堂上找到有用的材料。这篇博文基于课程材料。


图片来自 AI 初学者课程(在麻省理工学院许可下分发)
因此,一旦经过训练,神经网络在它的大脑中包含不同的模式,包括理想的猫的概念(以及理想的狗、理想的斑马等)。).然而,将这些图像可视化并不容易,因为模式分布在整个网络权重中,并且以分层结构组织。我们的目标是将一个神经网络在其大脑中拥有的一只理想的猫的形象可视化。
图像分类
使用预先训练的神经网络对图像进行分类很简单。使用 Keras ,我们可以用一行代码加载预训练模型:
model **=** keras.applications.VGG16(weights**=**'imagenet',include_top**=**True)
对于每个大小为 224x224x3 的输入图像,网络会给我们 1000 维的概率向量,这个向量的每个坐标对应不同的 ImageNet 类。如果我们对噪声图像运行网络,我们将得到以下结果:
x **=** tf.Variable(tf.random.normal((1,224,224,3)))
plot_result(x)

你可以看到有一个类的概率比其他类高。其实这个类就是蚊帐,概率在 0.06 左右。事实上,随机噪声看起来类似于蚊帐,但网络仍然非常不确定,并给出了许多其他选项!
为猫优化
我们获得理想猫图像的主要想法是使用梯度下降优化技术来调整我们原始的噪声图像,以使网络开始认为它是一只猫。

优化循环以获得被分类为猫的图像
假设我们从原始噪声图像 x 开始。VGG 网 V 给我们一些概率分布 V(x) 。为了与一只猫的期望分布进行比较,我们可以使用交叉熵损失函数,计算损失L =cross _ entropy _ loss(c,V(x)) 。
为了尽量减少损失,我们需要调整我们的输入图像。我们可以使用用于优化神经网络的梯度下降的相同思想。也就是说,在每次迭代中,我们需要根据以下公式调整输入图像 x:

这里η是学习率,它定义了我们对图像的改变有多激进。下面的函数将完成这个任务:
target **=** [284] *# Siamese cat*
**def** **cross_entropy_loss**(target,res):
**return** tf.reduce_mean(
keras.metrics.sparse_categorical_crossentropy(target,res))
**def** **optimize**(x,target,loss_fn, epochs**=**1000, eta**=**1.0):
**for** i **in** range(epochs):
**with** tf.GradientTape() **as** t:
res **=** model(x)
loss **=** loss_fn(target,res)
grads **=** t.gradient(loss,x)
x.assign_sub(eta*****grads)
optimize(x,target,cross_entropy_loss)

如你所见,我们得到了非常类似于随机噪声的东西。这是因为有很多方法可以让 network 认为输入图像是一只猫,包括一些视觉上没有意义的。虽然这些图像包含许多猫的典型图案,但没有什么可以限制它们在视觉上与众不同。但是,如果我们试图把这只理想的吵猫传到 VGG 网,它会告诉我们,吵的其实是一只概率相当大的猫(0.6 以上):

敌对攻击
这种方法可用于在神经网络上执行所谓的对抗性攻击。在对抗性攻击中,我们的目标是稍微修改一点图像,以欺骗神经网络,例如,使狗看起来像猫。一个经典的对抗例子摘自本文作者伊恩·古德菲勒看起来是这样的:

图片来自报纸古德菲勒,国际法院;施伦斯,j。解释和利用对立的例子。arXiv 2014, arXiv:1412.6572
在我们的例子中,我们将采取稍微不同的路线,而不是添加一些噪声,我们将从一只狗的图像(它确实被网络识别为一只狗)开始,然后稍微调整它,但使用与上面相同的优化程序,直到网络开始将其分类为一只猫:
img **=** Image.open('images/dog.jpg').resize((224,224))
x **=** tf.Variable(np.array(img))
optimize(x,target,cross_entropy_loss)
下面可以看到原图(归类为意大利灰狗概率为 0.93 )和优化后的同图(归类为暹罗猫概率为 0.87 )。


一张狗的原始图片(左边来自 Unsplash)和一张被归类为猫的狗的图片(右边)
理解噪音
虽然对抗性攻击本身就很有趣,但我们还无法想象神经网络拥有的理想猫的概念。我们获得的理想猫看起来像噪音的原因是我们没有对正在优化的图像 x 施加任何约束。例如,我们可能希望约束优化过程,以便图像 x 的噪声更少,这将使一些可见的图案更加明显。
为了做到这一点,我们可以在损失函数中加入另一项。一个好主意是使用所谓的变化损失,这是一个显示图像的相邻像素有多相似的函数。对于图像 I,它被定义为

TensorFlow 有一个内置函数tf.image.total_variation,可以计算给定张量的总变差。利用它,我们可以按如下方式定义出总损失函数:
**def** **total_loss**(target,res):
**return** 0.005*****tf.image.total_variation(x,res) **+**\
10*****tf.reduce_mean(sparse_categorical_crossentropy(target,res))
注意系数0.005和10——它们是通过反复试验来确定的,以在图像的平滑度和细节之间找到一个良好的平衡。你可能想尝试一下,找到一个更好的组合。
最小化变化损失会使图像更平滑,并消除噪声,从而显示出更具视觉吸引力的图案。以下是这种“理想”图像的一个示例,这些图像很可能被归类为猫和斑马:
optimize(x,[284],loss_fn**=**total_loss) *# cat* optimize(x,[340],loss_fn**=**total_loss) *# zebra*


理想的猫,概率=0.92(左边)和理想的斑马,概率=0.89(右边)
外卖食品
这些图像让我们对神经网络如何理解图像有了一些了解。在“猫”的形象中,你可以看到一些类似猫的眼睛的元素,还有一些类似耳朵的元素。但是,有很多,而且遍布图像。回想一下,神经网络本质上是计算其输入的加权和,当它看到许多猫的典型元素时,它变得更加确信它实际上是一只猫。这就是为什么一张照片上有很多只眼睛比只有一只眼睛给了我们更高的概率,尽管它看起来不太像人类的“猫”。
玩代码
“理想猫”的对抗性攻击和可视化在 AI 初学者课程的迁移学习部分有描述。我在这篇博文中提到的实际代码可以在这里找到。
原载于 2022 年 6 月 7 日 https://soshnikov.com**。



浙公网安备 33010602011771号