什么是加密数据?
数据科学从业者实用指南
美国宇航局在 Unsplash 拍摄的照片
在我的上一篇帖子中,我认为随着越来越多的消费者加密应用获得关注,越来越多的公开加密数据将从根本上改变下一代产品的竞争和运营方式。有效利用数据资产对于实现这一未来至关重要,而数据科学将发挥关键作用。在这篇文章中,我想提供更多关于加密数据的背景知识——它们在加密应用程序中代表什么,它们看起来像什么,以及如何使用它们[1]。如果你还没有阅读我的上一篇文章,请考虑这样做,因为它将为这篇文章提供有用的背景。
Web 2.0 -> Web 3.0
在深入研究数据之前,了解一下分散式加密(有时称为 web 3.0)应用程序是什么样子以及它与 web 2.0 应用程序有什么不同是很有用的。在传统的 web 2.0 应用程序中,用户通过浏览器与应用程序前端进行交互。前端将用户请求翻译成对后端 API 的查询。后端执行必要的计算来满足请求,并将相关数据保存到存储中。
Web 2.0 与 web 3.0 架构的对比—作者图片
在 web 3.0 应用程序中,前端或多或少以相同的方式工作,增加了软件钱包的要求,该软件钱包有助于向区块链网络唯一地标识用户。然而,后端服务器被一个功能类似于分布式虚拟机的分散式区块链网络所取代。用高级语言如 Solidity 编写的智能合同存在于这个虚拟机上,充当后端 API。借助区块链网络上的节点(通常通过节点即服务提供商访问),前端以事务的形式向这些智能合约广播用户请求,智能合约在虚拟机上执行调用的逻辑。完成后,交易细节和状态变化以可加密验证的方式保存在区块链分类帐中。
在一个公认的简化视图中,人们可以将区块链虚拟机视为后端服务器,智能合约视为后端 API,区块链总账视为存储[2]。然而,在 Web 3.0 架构中有两个关键的区别值得强调
- 与传统的后端 API 不同,智能合约是分散的,可以公开访问。网络上的任何人都可以看到代码,并在其上构建新的智能合约或前端。没有哪家公司能像脸书那样控制对智能合约的访问。这有时被称为智能契约的可组合性。
- 每一个后端 API 调用(即交易)都以可验证和有效不变的方式发布在区块链账本上。每个事务记录都包含关于特定请求和结果状态变化的详细元数据。这种级别的透明性代表了 web 2.0 应用程序的范式转变,也是加密数据如此引人注目的原因。
交易的剖析
事务对于加密应用程序的工作方式和创建的数据至关重要,因此准确定义它们的工作方式非常重要。在更广泛的区块链网络环境中,事务是改变区块链虚拟机状态的原子活动单元。有 3 种不同类型的交易:
- 一个外部拥有的账户(EOA)以基础货币形式向另一个账户转移价值,例如 Emily 在以太网上向 Bob 3 ETH 汇款
- 由 EOA 创建智能合约,例如,Emily 向区块链上的地址提交代码,创建智能合约,使用户能够与 BTC 交换 ETH
- 通过 EOA 调用智能合约,例如,鲍勃调用艾米丽的智能合约以用 15 个以太网交换 1 个 BTC
所有交易必须由外部拥有的账户(EOA)发起,该账户是唯一的区块链地址,由私钥控制。这通常代表人类用户,但有时也可能是机器人。智能合约一旦创建,也只是拥有唯一区块链地址的账户。智能合约帐户和 EOA 之间的唯一区别在于,智能合约帐户由合约代码控制,而不是由私钥控制。
交易的一个显著特点是,它们需要向网络(或者更准确地说是矿工节点)支付称为天然气费的费用。对于区块链网络上的气体,一个有用的类比是实际的汽油。正如汽车需要汽油作为动力一样,区块链网络也需要汽油来运行代码。汽油的数量是以公升等体积单位来衡量的,而单位价格是以美元等法定货币来衡量的。以太坊气是以称为气的数量单位来计量的,而每单位的价格是以卫来计量的,这是以太坊的 1/10^18th。当发起交易时,EOA 必须指定它愿意为执行交易向网络支付的天然气量。如果指定的数量不足,则事务将失败,所有分段状态更改将被还原。这有两个主要功能
- 激励 miner 节点参与并在网络上运行代码。天然气价格根据计算能力的供应和需求而波动,类似于乘车共享中的激增定价概念
- 打消那些想要向网络发送垃圾邮件的不良分子的动机
当用户在加密应用程序中发出请求时,会发生以下情况:
- 与用户相关联的 EOA 发起指定目标智能合同地址、目标功能、该功能的自变量、交易支付(如果有的话)以及它愿意支付的燃气费的交易
- 交易被广播到网络,并由执行目标智能合约中的指定功能的有意愿的矿工拾取
- 如果执行成功,智能协定将发出标志着某些里程碑完成的事件。由此产生的事件数据结构称为日志。
- 目标智能合约可以启动对其他智能合约的内部事务(附加调用)。这些内部事务创建称为跟踪的数据结构,并且还可能在它们各自的执行过程中发出额外的日志事件。
智能合同交易-作者图片
为了更具体地说明这一点,让我们仔细看看在 Opensea 交易所智能合约上购买无聊猿 NFT 的交易示例
一笔交易以 40.4 ETH(约 14.4 万美元)的价格购买了一只无聊的猿 NFT——图片由作者提供
在此交易中:
- 买方 EOA 通过调用 Opensea 交易所智能合约中的
atomicMatch_
函数来启动交易 - 交换合同验证订单出价与卖方的要价相匹配,然后发出表示订单被确认的
OrderMatched
事件 - 交换合同启动 Bored Ape NFT 合同的内部交易,将 NFT 从卖方转移到买方,交易完成后,该交易又发出一个
Approval
和一个Transfer
事件 - 交换合同然后启动另一个内部交易,以将由买方 EOA 在启动原始交易时支付的资金转移到卖方 EOA
在此序列完成后,事务处理、内部事务处理的跟踪以及事件的日志都将保存到区块链分类帐中。正如这个例子所希望阐明的那样,来自交易的数据耗尽提供了关于加密应用程序内部工作方式及其促进的经济活动的非常精细的细节。
数据结构
现在我们已经了解了加密应用程序创建的数据元素,以及它们在现实中代表的内容,让我们来看看这些数据是什么样子的。事务和跟踪数据结构包含智能合约函数调用的细节,特别是
hash
:交易的唯一标识from_address
:起始 EOA 地址to_address
:目标智能合约地址input
:目标函数和该函数参数的十六进制编码表示value
:交易价值或付款
示例交易
**hash**: 0xfdf4e500eeefa5b12d773fb74d55c4bbfc92a4297cddc8f85b937978a3fc6477**nonce**: 232**transaction_index**: 19**from_address**: 0xfc7396fc573e916dc0d7203b0f087ffc46882c17**to_address**: 0x7be8076f4ea4a4ad08075c2508e481d6c946d12b**value**: 0E-9**gas**: 74902**gas_price**: 52545827339**input**: 0xa8a41c700000000000000000000000007be8076f4ea4a4ad08075c2508e481d6c946d12b000000000000000000000000fc7396fc573e916dc0d7203b0f087ffc46882c170…**receipt_cumulative_gas_used**: 1242267**receipt_gas_used**: 74902**receipt_contract_address**: None**receipt_root**: None**receipt_status**: 1**block_timestamp**: 2021–08–10 04:18:55**block_number**: 12995203**block_hash**: 0x7ca2ff7158d7a40997a5230e39f8d96ad17cf59ced6b27a3288653f9c94ce7a3**max_fee_per_gas**: None**max_priority_fee_per_gas**: None**transaction_type**: None**receipt_effective_gas_price**: 52545827339
日志数据结构包含在执行智能合同功能期间发出的事件的细节,特别是
transaction_hash
:事件所属事务的 IDaddress
:发出事件的智能合约的地址topics
:发出事件的函数data
:事件元数据
示例日志
**log_index**: 260**transaction_hash**: 0x2ac3648d5a0a7c1dd58685fabb5c5602add36f1555b1001cb900ea0410ab23db**transaction_index**: 131**address**: 0xff64cb7ba5717a10dabc4be3a41acd2c2f95ee22**data**: 0x000000000000000000000000000000000000000000054e0ee097e3dbdbde51b2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011d65da6b52d881dd**topics**: [‘0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822’,‘0x00000000000000000000000003f7724180aa6b939894b5ca4314783b0b36b329’,‘0x000000000000000000000000e83df6e24de6d5d263f78ad281143f184a6c95eb’]**block_timestamp**: 2021–08–04 06:40:42**block_number**: 12957113**block_hash**: 0x3ea06d9b495dffb2804a5f62ee0182949afac9f82d6ba922567fa3a95efc3d86
敏锐的读者会注意到,许多长十六进制的领域对人类并不友好。为了解析出编码信息,我们需要使用一种叫做应用程序二进制接口的东西来解码这些信息。我将在下一篇文章中详细讨论这个问题。
用于访问和使用加密数据的工具
既然我们已经很好地理解了加密数据代表什么以及它看起来像什么,那么我们实际上如何访问和使用它呢?幸运的是,有一系列很好的工具可以帮助我们做到这一点。
块浏览器
块浏览器是在给定区块链上检查单个事务细节的绝佳资源。block explorers 的创建者已经提取并索引了整个区块链分类账,并创建了快速网络界面来帮助用户轻松查找任何交易。请看下面的截图示例。所有主要的区块链都有探险者——突出的例子包括以太扫描、多边形扫描、 BSCScan 、索拉纳海滩
以太网扫描上的交易示例 —图片来自以太网扫描. io
虽然块浏览器非常适合询问区块链分类帐中的单个记录,但它们不适合回答需要聚合或转换数据的问题。例如,如果您想知道在过去 3 个月中有多少 NFT 通过 Opensea 交易所售出,那么仅用 block explorers 很难回答这个问题。为此,您需要直接访问数据。
获取数据
直接访问数据的一种方法是自己查询区块链。Python 和 Javascript 中提供了各种开源实用程序包来帮助简化这一过程。例如
使用这些实用程序库,您将能够以编程方式与感兴趣的区块链进行交互,以查询数据、提交事务,甚至部署智能合同。
也有一些开源项目将上述构件打包成完整的 ETL 管道,帮助您将所有粒度数据下载到自己的环境中。此外,这些项目的所有者还将许多原始数据集发布到 Google cloud 上的公共数据集,Google cloud 提供了一个相对易用的 SQL 接口来查询数据。
以太坊上的谷歌公共数据集——谷歌大查询
最后但同样重要的是, Dune analytics 是访问和分析区块链数据的另一个重要资源。在撰写本文时,它同时拥有以太坊、多边形、乐观和 BSC 的原始数据和解码数据。与 Google 上的公共数据集相比,这是一个非常不同的产品,因为解码使得十六进制编码的数据字段可读。它提供了一个 Postgres 界面来查询数据集,并提供了一个简单的点击界面来在查询结果上创建简单的仪表板。Dune 上的用户社区也非常活跃,并且已经生成了大量可供学习的示例查询和仪表盘库。这里有几个我在 Dune 上创建的例子分析
关键要点
- 加密数据是 web 3.0 应用程序架构的废气
- 它包含加密应用程序中所有“后端 API 调用”的完整历史,以事务、日志和跟踪的形式
- 这些数据结构包含用户请求和应用程序状态变化的粒度细节
- 有各种免费的工具可以帮助我们访问和分析这个数据宝库
希望这是一个有用的讨论,我已经帮助你对什么是加密数据,它看起来像什么以及如何使用它有了更好的直觉。在我的下一篇文章中,我将提供一个关于如何解码加密数据并使它们更易于阅读的教程,作为对 Opensea 和 Uniswap 等流行加密应用程序进行更深入研究的前奏。如果你想在帖子发布时得到通知,请务必点击电子邮件图标进行订阅。
感谢您的阅读,如果您有任何问题或意见,请随时联系我们。Twitter|Linkedin
[1]本次讨论将使用以太坊区块链作为主要参考架构。具体情况可能会有所不同的其他区块链一样,索拉纳,但许多概念将普遍。
[2]这是一个 web 3.0 应用程序的简化示意图,它掩盖了一些实现细节。为了更彻底的回顾,鼓励用户研究这个优秀的深潜。
编程中的 Currying 是什么?
用奉承给你的代码增添情趣
在学习函数式编程时,我发现了许多新概念,比如纯函数、高阶函数和 currying。奉承真的引起了我的注意,我很惊讶我从来没有听说过它。
在本文中,我将尝试解释 currying 的概念、它的用例,以及如何用 JavaScript 和 Python 实现它。
什么是 Currying?
首先,让我澄清一些事情。 库里这个词来源于数学家**哈斯克尔库里*** 的名字,而不是香料。很好。*
Currying 是将具有多个参数的函数转换成一系列单参数函数。这意味着将一个像这样的函数转换成一个像这样的函数。
如果你知道 Python 的functools.partial
,那么这个和它很像。这等同于对所有参数连续应用偏导数。
例子
如果我们考虑以下函数:
我们可以通过给它传递两个参数来调用它:
这个函数的“简化”版本是这样调用的:
我们可以这样从头定义它:
我们甚至可以做一个很棒的一句俏皮话:
这相当于:
或者我们可以使用函数包装器:
但是我们为什么要这么做呢?
奉承在许多情况下都很方便。它可以帮助代码更加易读和简洁。
示例 1:频繁的函数调用
当你需要频繁调用一个带有固定参数的函数时,Currying 是很有用的。
例如,考虑下面的函数:
如果我们想要定义函数error
、warn
和info
,对于每种类型,我们有两个选项。
Currying 提供了一个更短、更简洁、可读性更强的解决方案。
示例#2:累积和
假设我们想得到一个数组的累加和。
***input:** [5, 23, 6, 8, 34]
**output:** [5, 28, 34, 42, 76]*
使用 curry,我们可以使用带有 curry 函数的map
方法。
cumSum(sum)
将value
加到sum
上并返回。为了更好地理解这是如何工作的,让我们将它分解到每一个呼叫。在cumSum(0)
调用之后,sum
的值(为 0)被更改为5
。在调用数组中的第二项时,使用cumSum(5)
,依此类推。
在这个例子中,cumSum 是一个可定制的函数。
如何实现任何功能
涂抹包装纸
这是一个 curry 包装器,它将func
转换成一个curred函数。**
这个包装器的工作方式很简单。curried
功能有两种情况。
- 如果
args.length >= func.length
:传递的参数个数大于或等于func
的参数个数。在这种情况下,我们只调用带有参数的func
。 - 否则,递归地返回一个调用
curried
函数的新函数,同时连接传递的参数和它的参数。
这个定义的一个副作用是可以不依赖或部分依赖地使用函数。以下调用都是有效的:
这是类固醇上的偏激*。*
Lodash 和下划线
如果你用lodash
或underscore
工作,那么涂抹很容易使用。简单用_.curry(func)
。仅此而已。它们也支持上面例子中的部分 currying。
Python 中的 Currying
我们可以用 Python 定义一个curry
包装器。
并把它作为一个装饰。
虽然奉承在很多情况下是有帮助的,但是注意它的局限性是很重要的。在上面的实现中,currying 要求函数有固定数量的参数。这在某些情况下可能是个问题。
Currying 只是函数式编程的一个概念。你可能会对其他概念感兴趣,比如纯函数和高阶函数(包括 currying)。
大多数机器学习和数据科学库大量使用面向对象编程,我认为数据科学家尝试函数式编程会很有趣。函数式编程有助于代码的可维护性和组织,并使并行化成为世界上最容易的事情。
什么是 Dask,它是如何工作的?
作者原创作品
Dask 是一个开源的 Python 库,它可以让你在任意大的数据集上工作,并显著提高你的计算速度。
本文将首先说明 Dask 的特殊之处,然后更详细地解释 Dask 是如何工作的。那么:是什么让达斯克与众不同?
- 熟悉的界面
- 需要时的灵活性
- Python 一直往下
熟悉的界面
达斯克没有多此一举。
Python 拥有丰富的数据科学库生态系统,包括数组的 numpy、数据帧的 pandas、nd-data 的 xarray 和机器学习的 scikit-learn。Dask 匹配那些库。
这意味着:
- 你不必学习一组新的参数来传递给
read_csv
- 开始使用 Dask 时,您不必进行大规模的代码重组。
需要时的灵活性
有时,您的数据不能整齐地放入数据帧或数组中。或者可能你已经写了一整段管道,你只是想让它更快。这就是dask.delayed
的作用。用dask.delayed
装饰器包装任何函数,它将并行运行。
Python 一直往下
这个很简单。Dask 是用 Python 写的,为想用 Python 写和用 Python 排错的人运行 Python。
它是如何工作的?
有三个主要部分组合在一起,让 Dask 以最少的工作量有效地运行分布式代码。
- 逐块算法在数据碎片上并行运行
- 任务图组织任务并实现优化
- 调度器决定潜在的多节点集群中的哪个工作者获得哪个任务。
分块算法
Dask 数组可能看起来像 numpy,Dask 数据帧可能看起来像熊猫,但是每个方法的实际实现都被重写以并行工作。这意味着:
- 您的数据不一定要放入内存。
- 你可以同时操作它的不同部分——这样更快。
它是如何工作的
在内部,Dask 数组是一组特定模式的 numpy 数组。Dask 实现了分块操作,因此 Dask 可以单独处理每个数据块,然后将结果组合起来。
让我们考虑一个 4x4 的数组,从 1 到 16,分成 4 个 2x2 的块。
当您获取数组的总和(a.sum()
)时,Dask 首先获取每个块的总和,只有在每个块都完成之后,才获取每个块的结果总和。
从区块到组合再到聚合的数据聚合的表示
通过让每个工人分别做一道算术题,然后最后合并,Dask 的运算速度比只有一个工人独自完成的情况快了大约 4 倍。
任务图
除非你告诉它,否则 Dask 不会做任何事情——它很懒。
当你在一个 Dask 对象上调用方法——比如a.sum()
——时,Dask 所做的只是构造一个图。调用.compute()
使 Dask 开始处理图表。
等到你真正需要答案的时候,Dask 就有机会优化图表。所以 Dask 只需要读取需要的数据就可以得到你想要的结果。由于懒惰,达斯克做的工作越来越少!这通常比 Dask 必须在调用原始函数时进行所有计算要快。
它是如何工作的
每个块上的每个操作都表示为一个任务。这些任务连接在一起形成一个图表,这样每个任务在运行之前都知道必须发生什么。
这是上面描述的a.sum()
操作的任务图。
使用 a.sum()用 graphviz 创建的任务图形绘制。visualize()
Dask 通过向图中添加层来将操作串在一起。该图被表示为一个类似 dict 的对象,其中每个节点包含一个到其依赖项的链接。
在计算图表之前,有一个优化步骤,可以将许多任务合并成一个任务(fuse
,丢弃不再需要的任务(cull
)。您甚至可以定义自己的自定义优化。
调度程序决定谁得到什么
按需分配……—卡尔·马克思
触发任务图上的计算告诉 Dask 将图发送给调度器。在那里,每个任务被分配给一个工人。根据您的设置,您的个人电脑上可能有 4 名员工,或者您的 HPC 系统或云上可能有 40 名员工。调度程序试图最小化数据传输,最大化每个工作人员的利用率。
这是调度程序(这里显示为紫色)向每个工人(显示为橙色和黄色)发送a.sum()
操作的样子。
dask dashboard 中的集群图—在 4 个工作集群上运行“a.sum()”。
由于有 4 个工人,每个块上的sum
并行发生。这是最终让 Dask 如此快速的原因。每个工作人员每次只需要接收一小部分数据,并且可以在其他工作人员处理其他数据时对其进行操作。
至关重要的是,这意味着任何一个工作线程都不会读取整个数据集。因此,您的数据可以任意大,但仍有可能使用它。
结论
有时你的数据是一个合理的大小,你可以愉快地使用普通的 numpy 和 pandas。其他时候不是,你也不能。这就是达斯克的用武之地。
在 dask.org 了解更多信息。
免责声明:我在 土星云 工作,为 Dask 的维护做贡献。其他公司也参与维护 Dask,包括 Anaconda、Capital One、Coiled、Nvidia、Prefect 和 Quansight。
原载于 2021 年 4 月 27 日https://www . Saturn cloud . io。
什么是数据浓缩?
入门
小的合成数据集足以训练模型。
数据高效学习的主题是数据科学中的一个重要主题,也是一个活跃的研究领域。在大数据上训练大型模型可能需要大量的时间和资源,因此问题是我们能否用较小的数据集替换大型数据集,而较小的数据集仍然包含来自大型数据集的所有有用信息,使我们能够在这个小型数据集上训练模型,这将在真实数据上很好地推广。这里我们想要的是从大数据集中提取一个包含大部分信息的小数据集。
一个显而易见的方法是从现有数据中选择例子。这种方法的问题是,信息通常分散在多个示例中,因此很难或不可能选择这样的示例来让模型根据它们进行训练,并根据看不见的数据进行归纳。另一种方法是学习数据所在的流形。然后你可以通过从这个流形上取样来生成数据。这种方法是困难的,因为我们正在讨论多维空间(对于计算机视觉来说,这是宽度乘以高度乘以 3),在多维空间上流形学习是困难的。
如果我们可以生成不在流形上的信息丰富的示例,但仍然能够使基于这些示例训练的模型在真实数据上很好地推广,会怎么样?这种方法首先在《数据集提炼》一文中进行了探讨:
数据提取这一名称是对知识蒸馏一个引用,它是一种教授小型学生模型和大型教师模型的方法。我将在本文中回顾的一篇论文中对这种方法进行了改进:
这篇论文被 ICLR 2021 会议接受:
来源:https://arxiv.org/abs/2006.05929
这些论文的主要思想是生成合成数据集,然后在合成数据上训练模型,并确保模型在真实数据上概括。生成合成数据的过程让我想起了生成白盒模型的对立示例:反向传播错误,但对输入层而不是模型参数应用调整。
来源:https://arxiv.org/abs/2006.05929
为了生成良好的合成数据,我们需要解决一个具有双重目标的任务:确保基于合成数据训练的模型能够推广到真实数据。这可以表示为几个等式:
来源:https://arxiv.org/abs/2006.05929
这里 T 表示训练集,S 表示合成集。右边的方程是神经网络对合成数据的训练过程,左边的方程表示我们对合成数据训练的模型也最小化了训练数据的损失函数。
天真的方法是嵌套循环,效率非常低。为了帮助训练过程的收敛,建议 S 模型的权重接近 T 模型的权重(假设两个模型的架构相同)。这是上述左侧等式的一个充分条件。如果在参数空间中定义度量 D(),那么训练任务将变成:
来源:https://arxiv.org/abs/2006.05929
这个条件要求两个网络具有相同的初始参数θ0。为了确保合成数据集可以与具有任何参数初始化的神经网络一起工作,我们可以对初始参数θ0 的所有可能值的距离进行平均,或者更精确地说,最小化相对于初始权重θ0 的分布的期望距离 D。
来源:https://arxiv.org/abs/2006.05929
另一个收敛改进是在优化过程中不仅最小化最终权重的期望距离,而且最小化权重的一些中间值:
来源:https://arxiv.org/abs/2006.05929
这里,opt-alg 可以是 SGD、Adam 或任何其他有效的优化算法,ς是步骤的数量,t 是迭代的数量。这种方法有时被称为课程学习,其中教师网络指导学生网络实现匹配的性能。
最后,为了最小化两个网络的参数之间的距离,在每次迭代中最小化梯度之间的距离就足够了:
来源:https://arxiv.org/abs/2006.05929
因此标题中的渐变匹配。并且我们可以在网络训练过程中计算梯度。
所以整个算法可以总结如下:
来源:https://arxiv.org/abs/2006.05929
让我来解释一下这个算法。第 1 行说合成的例子最初只是噪音。通过从初始权重的分布中抽取大小为 K 的样本来估计期望值。内环有 T 个步骤,在每个步骤上,我们计算 T 和 S 及其梯度的损失函数,使用优化算法更新合成数据和模型参数。所提出的距离函数是基于分层余弦相似性的度量:
来源:https://arxiv.org/abs/2006.05929
来源:https://arxiv.org/abs/2006.05929
实验结果
这里一个有趣的问题是信息合成数据集的最小大小是多少。成效显著!例如,在每类只有一个样本的 MNIST 数据集上,他们可以达到 91.7%的准确率!所以大部分信息可以被压缩到每个类的一张图片中!其他结果也令人印象深刻,只要每类有 10 张图像,他们就可以获得相当好的模型性能。作者还发现,使用合成图像,他们可以成功地训练一个不同架构的神经网络。例如,在 AlexNet 上生成的合成数据可以用于训练 ResNet 模型,该模型将正确地对真实图像进行分类。
这是理论玩具吗?
一个问题可能是我们为什么需要它?因为无论如何,为了生成合成数据集,我们需要在所有数据上训练一个模型(以便能够进行梯度匹配)。所以问题是:这种方法能有任何实际应用吗?
这种方法的一个应用是持续学习。持续学习的目标是在几个不同的任务上连续训练模型。持续学习的主要问题是灾难性遗忘:当模型在接受任务训练时,会忘记所有之前的任务,这意味着模型在所有之前的任务中的准确性都会下降。
对持续学习的一个很好的类比就是我们的大脑是如何处理信息的。当我们经历新的事物时,我们将新的经验与先前的经验进行比较,并基于新的经验和先前的经验更新我们的世界模型。我们不必再次经历所有先前的经历。必要时,我们的大脑会产生过去经历的浓缩记忆,这使得在不忘记先前经历的情况下基于新的经历进行学习变得容易。因此,我们的头脑总是在一种生成模式下工作。以类似的方式,为了使持续学习成功,我们可以使用浓缩的合成数据作为一种手段来帮助模型学习新任务,而不会忘记以前的任务。
数据压缩的另一个应用是用于神经架构搜索,并且通常用于模型选择。如果您可以在小得多的合成集上训练模型,则可以节省时间和资源,为每个候选架构和超参数组合在整个训练数据集上重新运行训练。
结论
我经常看重大会议上接受的论文,以跟上研究。这仍然是很多信息,但比试图在 arxiv 中找到一些有趣的东西要好。我在本文中回顾的论文是关于我一直感兴趣的主题,特别是作为对持续学习过程的帮助。我认为有许多数据压缩领域可以进一步探索。例如,该方法对对抗性攻击有多敏感。合成数据是否会包含敌对信息,并导致经过训练的模型做出敌对预测?如果数据包含偏见(性别、种族等)怎么办?)?合成数据会放大偏倚还是减小偏倚?这种方法可以用作隐私保护机制吗?此外,该技术能否应用于计算机视觉领域之外,例如,表格数据?既然表格数据通常是有噪声的,那么合成数据如何处理这个问题呢?
最后,本文没有官方源代码。算法和实验都描述得很好,所以这是一个邀请写算法的非官方实现。
从网站和 API 收集 CSV、JSON、XML 和 SQL 格式数据的指南
关于如何为您的数据科学和机器学习投资组合收集不同格式数据集的指南
图片由 Gerd Altmann 从 Pixabay 拍摄
数据收集和提取包括从不同来源提取数据,并将其转换为有用的格式,以便进一步处理或分析。它是数据工程过程中提取-转换-加载管道( ETL )的第一步。
作为一名数据科学家,您可能需要组合多种文件格式的数据,如 JSON、XML、CSV 和 SQL。
在本教程中,我们将使用 python 库,如 pandas、JSON 和 requests 来读取不同来源的数据,并将它们作为 pandas 数据帧加载到 Jupyter 笔记本中。
1.CSV 文件
这指的是“逗号分隔值”文件,用于以表格格式存储数据,类似于电子表格。文件中的每一行都是一个观察(或记录),每个记录都有一个或多个用逗号分隔的属性。
文本编辑器中 csv 文件的图像
通常,但不总是,第一行代表特性(列)名称。
我们将从 data.gov 网站下载数学成绩数据并保存在我们的工作目录中。推出新的 Jupyter 笔记本。
在我们从数据中创建熊猫数据帧之前,首先使用 python 的内置读取库来查看文件是很重要的。下面的代码显示了下载文件的前 5 行。
需要注意的事项:
- 如果第一行包含列名,使用不带附加参数的
pd.read_csv(file)
,这假定第一行包含列标题。如果没有,我们就用pd.read_csv(file, header=None)
。在这里,Pandas 为您创建了索引列名,您可以稍后使用df.columns = <list_of_names>
添加名称。 - 如果顶部有任何空行,我们需要使用
pd.read_csv(file, skip_rows=n)
跳过它们。
下面的代码直接从网站下载文件并创建一个熊猫数据框架。
file_link = '[https://data.cityofnewyork.us/api/views/7yig-nj52/rows.csv'](https://data.cityofnewyork.us/api/views/7yig-nj52/rows.csv')
df_csv = pd.read_csv(file_link)
2.XML 数据
可扩展标记语言,简称 XML,是一种与 HTML 非常相似的标记语言。您可以识别 XML 格式的数据,因为它是由特定于数据的唯一标签标记的,不像 HTML 的预定义标签。
我们将继续使用来自 data.gov 网站的数学结果数据,该网站提供了一个下载 XML 格式数据的选项。
在 Jupyter 笔记本中运行下面的代码将打印前 20 行。
代码编辑器上 XML 文件的图像
为了提取 XML 数据,我们使用一个名为 BeautifulSoup 的 python 库。要安装 BeautifulSoup,请将下面的代码粘贴到 Jupyter 笔记本中。
!pip install bs4
然后导入库,打开文件并将其内容加载到 BeautifulSoup 中。
from bs4 import BeautifulSoupwith open("math results.xml") as f:
soup = BeautifulSoup(f, "lxml")
从收集的 XML 数据中,我们将使用 BeautifulSoup 的find_all()
方法,该方法将标签作为列表返回。
作者查找全部的图片
对于我们的例子,感兴趣的标签是‘district’, ‘grade’, ‘number_tested’, and ‘mean_scale_score’.
然后我们将遍历这些行,对于每个标记,使用get_text
方法检索其中的值。
名为“数据”的列表代表我们所有的记录。
按作者排列的前 5 条记录的图像
下一步是创建一个 pandas 数据框架,并传递将用于数据的列。
df_xml = pd.DataFrame(data, columns=['district', 'grade','number_tested', 'mean_scale_score'])
3.JSON 数据
JavaScript Object Notation,或称 JSON ,以字典风格的格式压缩数据。数学结果的 JSON 文件可以在这个链接中找到。下面是使用代码编辑器的文件截图。
作者的 json 文件截图
JSON 是在 XML 之后开发的,但是随着时间的推移,它变得越来越流行了。这两种格式经常用于通过 web APIs 发送数据,这将在下面的第 5 点中讨论。
Pandas 库提供了一种简单的方法来读取 JSON 文件;pd.read_json()
。您可以根据数据的格式传递‘orient’
选项。熊猫文档解释了‘orient’
选项。
我们的 JSON 数据格式不同,pd.read_json()
返回一个错误。它有很多元信息;920 行。实际数据从第 921 行开始。
作者 json 文件的折叠元和数据标签的图像
下图显示了使用记事本++ 代码编辑器的数据的截图。注意每行的前 8 个字段是没有用的。
我们将使用 json 库,它将 json 数据作为字典加载。
import jsonwith open('math results.json') as f:
json_data = json.load(f)type(json_data)
###dict
在我们的例子中,将有两个字典条目;元数据和数据。因此,我们可以使用dict.get(key).
获得数据信息
data = json_data.get('data')
data = [x[8:] for x in data]
下图显示了我们的数据列表。右图使用列表理解只返回每个列表中第 8 个元素的项目。
下一步是创建一个熊猫数据框架。根据我们对数据集的了解,我们将把列名作为参数传递。
4.SQL 数据库
结构化查询语言,或 SQL,使我们能够访问和操作数据库。您可以使用 Pandas 库从 SQL 文件和数据库中收集数据。这是通过打开数据库或运行 SQL 查询实现的。
根据数据库的类型,可以使用两个 python 库来建立连接; sqlite3 库或 sqlalchemy 库。
出于我们的目的,我们有一个 SQLite 数据库文件,其中包含我们一直在处理的数学结果。SQLite 为个人应用和设备提供本地数据存储。点击阅读更多关于何时使用 SQLite 的信息。因此,我们将使用 sqlite3 库。数据库文件只有一个表。
import sqlite3
import pandas as pd# connect to the database
conn = sqlite3.connect('maths_results.db')# run a query
data_sql = pd.read_sql('SELECT * FROM maths_results', conn)# display 5 rows
data_sql.head()
当使用大型客户端/服务器 SQL 数据库如 MySQL 和 PostgreSQL 时,使用 sqlalchemy 库。查看 SQLAlchemy 文档,了解如何加载不同的数据库,包括我们将使用以下代码实现的 SQLite 。
import pandas as pd
from sqlalchemy import create_engine#create a db engine
engine = create_engine('sqlite:///maths_results.db')#run query
df_sql = pd.read_sql("SELECT * FROM maths_results", engine)
5.使用 API 从 web 中提取数据
应用编程接口,或称 API,为脸书、威特、谷歌等公司提供了一种与用户共享数据的方式。这阻碍了构成法律灰色地带的网络抓取。
这些公司提供面向公众的 API 的网址,开发者可以从这些网址访问数据,并将其用于分析或创建自己的应用程序。有些在发送请求时需要登录凭证,而有些则是公开的。它们还提供了如何格式化 URL 请求的文档。
在本节中,我们将从世界银行数据目录中提取数据。该网站不需要登录凭据。API 文档可在这里获得。
该页面有一个指示器列表,带有使用 API 下载的选项。我们将关注“女性企业主的数量”,它显示了每个国家每年的结果。
向下滚动到您想要的指标数据,然后单击“API”访问选项。
截图来自世界银行目录
这将把您重定向到一个包含原始 JSON 数据的新网页。从地址栏复制网址,打开一个新的 Jupyter 笔记本。编写下面的代码,并用复制的文本替换url
文本。
Python 有一个请求库,用于使用 python 发送 HTTP 请求。下面的代码返回一个响应对象。
import requests
import pandas as pdurl = '[https://api.worldbank.org/v2/en/country/all/indicator/IC.WEF.LLCO.FE?format=json&per_page=20000&source=14'](https://api.worldbank.org/v2/en/country/all/indicator/IC.WEF.LLCO.FE?format=json&per_page=20000&source=14')r = requests.get(url)
由于数据是 JSON 格式的,我们将调用response.json()
返回提取的 JSON 数据。
r.json()
这将返回一个包含两个字典部分的列表。第一部分包含元信息。第二部分保存实际数据。
要创建数据框,请使用 list[1]来索引列表的第二个元素。
data_api = pd.DataFrame(r.json()[1])data_api.head()
结论
在这篇文章中,我们探索了数据收集,并提取了 5 种不同格式的数据,将其加载到熊猫的数据框中。完整的代码可以在 Github 的这里找到。
对于希望提取和分析真实世界数据集的数据科学家来说,收集数据的技能非常有价值。提取后的下一步是将数据转换为结构化和有组织的格式。
下面的资源列出了可用于项目的公共数据集。
- Github 上令人惊叹的公共数据集列表
- 一个 Quora 问题
- elite data science 的这篇博客文章
大数据摄取
简要概述什么是大数据以及数据收集解决方案的第一层
艾蒂安·吉拉尔代在 Unsplash 上拍摄的照片
介绍
你使用导航软件从一个地方到另一个地方吗?你在亚马逊上买过书吗?你看了网飞频道的《奇异事物》吗?你在 YouTube 上找搞笑视频了吗?
如果你对这些问题中的任何一个回答是肯定的,那么恭喜你!你是大数据生产者。事实上,即使你对我的任何问题都没有回答“是”,你可能仍在为大数据做出贡献——在当今世界,我们每个人都至少有一部智能手机、笔记本电脑或智能手表、智能汽车系统、机器人吸尘器等等,我们在日常活动中产生了大量对我们来说似乎微不足道的数据。
什么是大数据?
当我们说大数据时,我们通常指的是特别大的数据,速度快且结构不同,以至于很难或无法用传统工具进行分析。
通常用“三个 v”来定义大数据的概念:
- 卷—数据的大小
- 速度——数据采集的速度
- 变化——不同类型的数据
为了解决大数据世界带来的复杂问题,该解决方案分为五层:
- 数据源
- 数据摄取
- 数据存储
- 数据处理——准备和培训
- 服务
作者提供的大数据层架构/图像
数据摄取
数据接收是大数据架构中的第一层— 这一层负责从各种数据源(物联网设备、数据湖、数据库和 SaaS 应用程序)收集数据,并将其存储到目标数据仓库中。这是流程中的一个关键点,因为在这个阶段可以理解数据的大小和复杂性,这将影响架构或我们今后做出的每个决策。
作者图片
为什么我们需要数据摄取层?
- 可用性—数据可供所有用户使用:BI 分析师、开发人员、销售人员和公司中的任何其他人都可以访问数据。
- 一致性—高质量的数据摄取过程可以将不同类型的数据转化为统一的数据,便于读取和执行统计和操作。
- 节省资金和时间—数据摄取流程节省了工程师收集所需数据和高效开发的时间。
数据接收面临哪些挑战?
- 复杂性—由于数据的速度和多样性,编写数据接收流程可能会很复杂,有时开发时间会耗费大量的时间和资源。
- 数据安全性—将数据从一个地方转移到另一个地方时,敏感数据存在安全风险。
- 不可靠性—在此过程中,数据的可靠性可能会受到损害,从而导致数据毫无价值,或者在最糟糕的情况下,根据不真实的数据做出不正确的决策。
数据接收类型
有三种常见的数据接收方式,使用方式将根据产品需求而定——实时收集数据重要吗,还是可以以定时方式偶尔收集一次?
实时数据摄取
这是从各种数据源实时收集和处理数据的过程,也称为流,当收集的数据对时间敏感时,我们将使用这种方法。
例如,在发生泄漏的情况下,来自油罐传感器的数据将至关重要。
在实时情况下,数据的速度会很快,因此解决方案将包含一个队列以避免丢失事件。我们将尽快提取、处理和保存这些数据。
批处理数据摄取
批处理数据接收意味着数据按照预定的时间间隔从数据源移动到数据目标。
当公司需要每天收集数据时,批量接收非常有用。
结论
虽然数据摄取不是一个简单的编写过程,并且随着时间的推移,建立基础设施和维护的成本会很高,但是一个编写良好的数据摄取过程可以帮助公司做出决策并改进业务流程。
此外,这一过程使处理大量信息源变得更加容易,并允许工程师和分析师等轻松访问。
什么是数据网格?你也应该把它网格化吗?
企业数据架构的这种范式转变会颠覆数据格局吗?
每个从事数据分析或与数据分析相关的人都一定听说过像野火一样迅速流行的术语——数据网格。
什么是数据网格?
数据网格是目前数据分析中最热门的话题之一。它已经找到了进入趋势的方式,这些趋势预计将在 2021 年颠覆并主导数据市场。
但是数据网格到底是什么,为什么越来越多的公司希望实现数据行业的最新趋势?下面,我们将探讨什么是数据网格,以及你是否应该将它网格化(标题参考巴尔·摩西的文章 什么是数据网格——以及如何不将它网格化 )。
在作为一等公民的数据时代,每个企业都努力成为数据驱动型企业,向数据平台和支持者投入大量投资。然而,不断增长的数据需求无法满足实时流能力有限的传统数据仓库或数据湖的需求。
对数据管道民主化和可扩展性的需求,是遗留系统的缺陷和相互冲突的业务优先级的基础。幸运的是,一种新的企业数据架构正在兴起,为庞大而脆弱的数据管道带来了新的希望。数据网格引入了一种方式,将数据视为分散的独立数据产品,而不是副产品。
软件开发实际上是第一个从单片应用过渡到微服务架构的。我们现在看到数据行业纷纷效仿,从优先考虑集中、单一数据湖和数据库的大规模数据团队转向优先考虑数据域和数据产品的一等公民。
数据架构中的这种 范式转变 意味着数据团队必须提供网格内所有数据资产的共享、发布、可发现性,以及更重要的互操作性。但更重要的是,这个支点驱动团队始终优先考虑他们交付给业务的结果和产品;而不是纠结于底层技术或使用的堆栈。
ThoughtWorks 顾问兼 Data Mesh 的最初架构师 Zhamak Dehghani 将这一概念定义为数据平台架构,通过利用面向领域的自助式设计来拥抱企业中无处不在的数据。然而,Zhamak 强调说,她对面向领域方法的支持并不意味着她“提倡分散的、孤立的面向领域的数据,这些数据通常隐藏在操作系统的内部;难以发现、理解和消费的孤立的领域数据”,她也没有“提倡多个分散的数据仓库,这些数据仓库是多年积累的技术债务的结果。”但她认为,对这些不可及的数据的意外孤岛的回应不是创建一个集中的数据平台,由一个集中的团队拥有和管理来自所有领域的数据,因为它没有规模。
取而代之的是,Zhamak Dehghani 发现范式转换对于解决架构失效模式是必要的。这种范式的转变位于大规模构建现代分布式架构的技术交叉点上;技术行业普遍加速采用并取得成功的技术。Dehghani 对下一个企业数据平台架构的想法存在于 分布式领域驱动架构、自助式平台设计、用数据进行产品思考 的融合中。
数据网格的前景和前提
尽管数据网格得到了很多关注,但其基本思想实际上并不新鲜。许多前瞻性的组织已经实施了它。Daniel tid strm 是 Data Edge 的合作伙伴&管理顾问,至少在相当长的一段时间内,他一直在与 it 部门合作。
丹尼尔认为,当公司快速扩张时,数据网格变得至关重要。
“随着数据源和数据消费者的激增,让一个中央团队来管理和拥有数据接收、数据转换以及向所有潜在的利益相关者提供数据,将不可避免地导致扩展问题,”Daniel 说。“鉴于数据在我们的组织中日益重要,为可扩展的团队和可扩展的平台进行设计至关重要。在软件工程的其他领域,这是一个公认的问题,所以我不明白为什么数据还必须存在于一个整体中。”
另一种选择是通过雇用更多的数据工程师来扩大团队规模,但业内每个人都知道,找到优秀的数据工程师和技能真的很难。因此,大规模采用分布式数据架构是非常明智的。
Daniel 解释说,此外,在实施领域驱动开发和微服务架构的公司中,考虑将数据所有权转移到领域中也是有意义的。
Daniel Tidströ目前正在为一个客户工作,该客户实施了一个将所有域绑定在一起的 Kafka 基础架构。为了处理数据,他们需要能够管理服务级别协议,知道发布了什么,了解模式是什么样子的,以及模式是如何发展的。
丹尼尔和他的团队正在做的所有这些事情都指向数据网格方向,尽管他们不一定称之为数据网格。然而,至关重要的是,数据产品所有者和域需要将数据视为一等公民,并将数据作为产品交付。
蒂姆·范德奎普在 Unsplash 上拍摄的照片
数据网格的挑战
数据网格不仅仅是一个即插即用的解决方案。随之而来的是公司必须应对的一系列挑战。丹尼尔说,许多人可能会发现自己对如何实现它感到力不从心。
建立如何接收数据的契约可能是数据网格实现中最具挑战性的事情之一。“实现数据网格不是一个纯粹的技术项目,你可以脱离业务的其他部分单独实现,”他解释说。这不是你可以一开始就做,然后第一次尝试就能成功的事情,而是你必须与它一起成长和发展。"
然而,最大的挑战不是技术上的,而是获得组织在数据网格环境中良好工作所需的数据成熟度。“对于许多组织来说,这是一种文化转变,让产品所有者真正考虑数据,并将其视为一种产品。因为这是传统软件工程的转变,所以这不是一件容易的事。”
当然,对许多人来说这将是一个挑战,但它需要得到解决,因为不解决它只会将复杂性推向下游的数据工程师和中央团队,他们需要整理所有的混乱,Daniel 继续说道。
“这是当今数据团队面临的问题之一,他们有太多相互竞争的优先级。很难建立一个长期的可扩展的东西。许多团队只是处理来自每个人的无限的、永无止境的积压请求。这也不管用。所以需要做点什么。对 it 来说,数据网格可能是最有趣的场景。”
Data Mesh 离数据民主化和让整个组织将数据视为战略资产又近了一步。这种转变在许多方面引入了一种新的工作方式。“这就是软价值观和文化特征是最重要因素的地方,只要确保数据得到应有的对待。如果你真的想成为一家数据驱动的公司,数据不能只是一两个中心团队的事情。”
丹尼尔·科尔派在 Unsplash 上拍摄的照片
何时开始考虑数据网格
尽管丹尼尔说,公司在前进的道路上会遇到技术挑战,但这不应该阻止他们实施数据网格,因为技术解决方案总是可以找到的。
“关于数据网格,最重要的事情是开始讨论数据的分布,因为数据创建本质上分布在所有公司中。”随着数据源的数量每天都在增长,许多组织可能至少应该考虑一下他们的扩展选项。
丹尼尔建议,如果你有领域驱动的开发,开始使用微服务,或者如果你做云迁移,这是考虑数据网格的好时机。
数据架构和数据仓库团队会发生什么
分布式域驱动架构是否意味着中央数据团队的终结?Daniel 安抚道,仍然有地方对跨域的核心数据资产进行集中管理。
“我不认为数据网格会消除对数据仓库团队的需求,相反,它会在某种程度上使他们的工作更容易,”Daniel 说。他承认,他经常被问到,当数据架构变得分布式时,它会发生什么。
“在大多数公司中,你可能有一个糟糕的数据架构师,他走进架构师论坛,试图成为整个组织的数据代言人,常常感到非常孤独。相反,如果您拥有数据的分布式所有权,并将其作为产品来管理,那么它在桌面上的位置会明显得多。因此,我认为这将引发许多有益和有趣的讨论,开始时可能会有点痛苦。但这个问题会得到解决,而且会不断改善。"
Daniel 建议不要忘记集中式团队,因为他们在分布式架构中仍然有作用。“展望未来,我认为为数据消费者提供良好的自助工具非常重要。让中央数据团队作为数据访问的把关人或瓶颈,对任何人都没有好处。现在有许多好的框架,比如数据构建工具(dbt ),它解决了数据消费者和数据平台之间的许多问题。所以这是我鼓励每个人都去研究的事情。这是一个神奇的工具,可以做很多事情。
哈尔·盖特伍德在 Unsplash 上拍摄的照片
数据网格和数据操作的关系
作为一种有待公司测试和实施的范式转变,好奇的头脑可能会问它如何适应更为人所知的数据运营环境。丹尼尔说,他看不出数据操作和数据网格共存有什么明显的问题;他还没有遇到任何阻碍数据运营和数据网格良好合作的直接障碍。
一般来说,跨分布式管道的数据可观察性可能有点挑战。但这是一个已经存在于大多数组织中的挑战,这些组织有某种形式的交接,甚至没有正式化。丹尼尔说,数据网格并没有消除这一挑战,但它以更好的方式解决了这一问题。
原载于 2021 年 1 月 25 日 Hyperight.comhttps://hyperight.com/what-is-data-mesh-and-should-you-mesh-it-up-too/。
什么是数据挖掘?
快速历史和实用介绍
数据挖掘就是它所说的:挖掘数据。尽管这经常涉及到从数据库中访问数据,但这只是一个步骤。数据挖掘最终寻求从具有潜在价值的数据中提取不明显的模式。换句话说,数据挖掘从数据中提取信息。在过去几十年中,生成和记录的数据量呈爆炸式增长。数字存储和传输成本的降低允许以多种形式收集越来越多的数据,如图像、视频和文本。但是,有用的信息量可能要小得多。在数据中寻找信息可以看作是在碳的海洋中寻找钻石。如何评估数据的价值?一种方法是利用信息论。
什么是信息?这是你还不知道的。如果一条数据没有揭示任何新的东西,或者是确定的,它就不包含任何信息[1]。克劳德·香农于 1948 年在他的论文《交流的数学理论》中提出了这种信息测量方法。为了衡量信息,数据被认为是一个更大的集合的一部分,但不是一个万能的集合。例如,英文字母是一组 26 个符号中的一部分(仅考虑小写)。有些符号,如字母 e,比其他符号出现得更频繁。出现的概率表明一个符号或一段数据有多少信息。如果符号总是发生,它的概率为 1,包含 0 信息。这可能看起来有点违背直觉,但经过一番思考后还是有道理的。如果你正在读一篇文章,并且知道下一个字母是什么,你没有获得新的信息。如图 1 所示,概率与信息量或不确定性之间存在反比关系。数据项的概率越低,信息量就越大,信息量以比特为单位。
图 1 从对数概率(1/p)获得的数据项中的信息。不经常出现的数据项的概率接近于 0,不确定性更大,如果出现,信息也更多。信息量是用比特来衡量的。如果数据项的概率为 0.1,那么它大约有 3.3 比特的信息(图片由作者提供)。
图 2 显示了前五个字母 a、b、c、d、e 的信息内容。字母“e”最常见,信息量最少。所有字母的平均信息给出了字母表的熵,估计大约为 1.8 比特/字母[2]。
图 2 a、b、c、d、e 的信息内容,使用每个字母相对于一个更大的字母表的概率来计算。字母“b”最不可能包含大约 6 位信息(图片由作者提供)。
熵是香农对信息的度量,用字母 h 表示。熵给出了 N 个数据项集合中的平均信息量。项目 n 的发生概率为 pn。
一位也用来指二进制数字,1 或 0。然而,在这种情况下,比特指的是信息量,具体来说,它与确定出现什么数据项所需的是/否问题的数量有关。一个二进制数字可以携带一位或更少的信息。像文件或图像这样的数据项的大小只是粗略地给出了其中的信息量。
数据挖掘可以被认为是提取信息。例如,在预测中,目标是将数据项分类到一个类别中,或者使用该项的特征预测连续值。如果 Y 是项目的类别,X 是项目的特征,则信息增益 H(Y|X)给出 X 给出关于 Y 的多少位信息。它等于原始熵 H(Y)减去 X 和 Y 之间的互信息。互信息 I(Y,X)是熵公式对两个变量的直接概括。
决定在某一天打高尔夫球的任务给出了一个简单的问题,在参考文献[3]中有进一步的解释。图 3 显示了这组数据有 1 个目标变量,用于判断是或否,以及 4 个特征或预测因子。这是一个目标已知的训练集。任务是使用这个集合来制作一个模型,该模型预测如果只给出 4 个特征,是否打高尔夫球。如果你不是高尔夫爱好者,也许你的配偶是。决策树是一种简单、直观的模型,可以给出这样的预测。如图所示,树组织特征以决定是或否。使用信息增益给出了训练树的有用方法。训练过程通常如下进行。
1.计算初始目标熵 H(打高尔夫球)= 0.94 比特
2.选择给出最大信息增益的预测器作为第一个决定因素。
a.Outlook:给出 0.247 位信息,并选择“Outlook”功能。
b.温度:给出 0.029 位
c.湿度:给出 0.152 位
d.Windy:给出 0.048 位
3.仅考虑剩余的预测值,并对所选预测值的每个值重复步骤 2。
图 3 用于决定是否打高尔夫球的决策树。用来决定玩的最重要的特征是前景,是雨天、晴天还是阴天。经http://saedsayad.com/decision_tree.htm许可的图片
虽然这是一个简单的例子,但它很好地展示了在分类中使用信息论的整个过程。从特征中提取比特信息来决定结果。一点值多少钱?以美元计算,存储在存储器中的数据和以美元计算的传输数据都有一定的成本。据估计,擦除 1 位信息所需的最小能量约为 kTlog2,其中 T 为温度,k 为玻尔兹曼常数[2]。该值取决于上下文。
总之,数据挖掘试图从数据中提取有趣的、潜在有用的模式。它与机器学习或数据科学等其他领域没有明显区别[4]。量化提取的模式值的一种方法是使用香农的信息度量。尽管对于某些应用程序来说,原始数据包含的信息可能要少得多,但如果可能的话,应该保留原始数据。一般的期望是,收集所有这些数据可以产生已知的知识,并用于以前没有预见到的目的。
参考文献
[1] Gershenfeld《信息技术物理学》,剑桥大学出版社 2000。
[2]斯通《信息论》。教程介绍》,Sebtel 出版社 2015 年。
[3]http://saedsayad.com/decision_tree.htm
[4]扎基和梅拉《数据挖掘与分析》。基本概念和算法》,剑桥大学出版社 2014 年。
什么是数据建模?
业务价值不在您的数据中,而是在转换层中
数据建模工具竞赛—图片来自 Castor 的网站
今天,每个公司都收集数据并试图利用它。问题是,原始数据不会让你获得深刻的见解和有用的预测,只是因为它的结构方式不利于数据分析。你通常必须转换你的数据和变量,以使其分析就绪。我们经常听说数据转换,因为它是 ETL/ELT(提取—加载—转换)过程中的一个关键步骤,是最广泛使用的数据集成方法。今天,我们深入到转换过程,并试图解开数据转换/数据建模生态系统。
什么是数据转换?
简单地说,数据转换是改变变量的格式、结构或值的过程。结构化和重新格式化数据的目的是将它转换成一种数据模型,从中你可以学习洞察力并获得商业智能。
很多时候,转换步骤包括将事务性数据与运营性数据集成在一起,以便数据可以用于业务分析和 BI。例如,转换平台可以将业务运营中使用的名称、地点和定价数据与交易数据相结合,例如零售或医疗保健索赔,如果最终用户需要这种结构来进行数据分析的话。因此,转换主要是由寻求用数据解决精确业务问题的分析师的特定需求决定的。
转换数据有多种优势:
✅ **更好的组织:**转换后的数据对人和计算机来说都更容易处理。
✅ **数据质量:**原始数据通常意味着质量差的数据:缺少值、空行、格式不好的变量等等。转换数据以提高其质量可以改善数据用户的生活,使他们能够提高工作效率并从数据中获得更多信息
✅ **可用性:**太多的组织坐在一堆不可用的、未经分析的数据上。标准化数据并将其置于正确的结构下,可以让您的数据团队从中产生业务价值。
数据转换工作流
数据转换工作流程—图片由 Louise de Leyritz 提供
- **数据发现和分析:**转换工作流程的第一步是识别和理解原始来源中的数据。这一步允许您决定数据应该经过哪些操作才能达到所需的格式/结构。
- **翻译和映射:**这包括在源和目标字段之间建立清晰的对应关系。
- **工作流创建:**这一步包括编写代码来执行转换任务。代码通常是使用特定的数据转换平台生成的。
- **工作流程执行:**数据被转换成所需的格式。
- **数据检查:**检查转换后的数据,确保其格式正确。
数据转换工具的发展
我们区分了三代数据建模解决方案:
**第 1 代:**数据转换由 ETL (Extract-Transform-Load)工具操作,大多使用 python 和 airflow。
第二代: EL-T(提取-加载-转换)流程取代了传统的 ETL。转换现在在数据仓库中操作。一个模糊的时代,没有专门用于数据转换的工具。
**第三代:**数据仓库中专门用于数据转换的工具的出现。dbt 的出现建立了一种新的转换范式。
数据建模 1.0:ETL 时代的转换
在研究第一代转换工具之前,有必要了解一下过去的数据转换是如何进行的。
数据转换是更广泛的数据集成过程的一部分,该过程包括将来自多个来源的数据集成到一个真实的来源,通常是**数据仓库。**建立一个唯一的事实来源的目的是让数据用户能够比分散在几十个应用程序和来源系统中更容易地找到数据。
在 20 世纪 90 年代,ETL(提取-转换-加载)过程是最广泛使用的数据集成方法。将来自多个来源的数据放入数据仓库包括三个关键步骤:首先从源系统中提取数据,然后根据我们上面描述的过程转换数据,然后将数据加载到数据仓库中。要记住的关键点是,在 ETL 过程中,数据在被装载到仓库之前被转换。原因是在 20 世纪 90 年代,当存储和带宽非常昂贵时,在数据仓库中加载未转换的、原始的、不可用的数据是愚蠢的。分析师必须定义特定的数据项目和业务用例,以便数据可以相应地转换,然后加载到数据仓库中。因此,ETL 过程的提取和加载步骤是紧密耦合的,ETL 管道一起执行这两个步骤。
ETL 流程—图片由 Louise de Leyritz 提供
ETL 管道由数据工程师设计,涉及大量使用 Bash、Python、C++和 java 等脚本语言的定制代码。用于转换数据的工具与执行数据集成的提取和加载步骤的工具是相同的:优秀的旧式 ETL 工具。
数据建模 2.0:数据在仓库中转换
在过去的几十年里,存储和计算成本下降了数百万倍,带宽成本下降了数千倍。这导致了云的指数级增长,以及云数据仓库的到来,如亚马逊红移或谷歌 BigQuery。云数据仓库的独特之处在于,它们比传统数据仓库具有无限的可扩展性,能够容纳几乎任何数量的数据。
这些新的云数据仓库要求在数据集成过程中进行彻底的变革。现在,存储和带宽限制已经消失,在云数据仓库中加载大量未转换的数据不再是问题。这意味着在提取和加载数据之后,转换步骤可以在云数据仓库中轻松完成。EL-T(提取-加载-转换)过程因此取代了传统的 ETL,因为转换层被移动到了工作流的末端。这种新的数据集成方法更加省时,因为数据管道变得不那么复杂了。
EL-T 过程—图片由 Louise de Leyritz 提供
这标志着进入了一个相当模糊的时代。转换步骤是在云数据仓库中处理的,这是一个很大的变化。然而,没有建立标准,或者规定如何进行转换的规则。在 ELT 流程变得司空见惯之后的几年里,使用 SQL、python,有时使用 airflow 来执行转换。我们没有真正找到一种广泛的、统一的数据转换方式。缺乏专用的数据建模工具导致整个云数据仓库缺乏可见性。这是一个大问题。企业需要处理数千甚至数百万个数据集。由于没有数据团队可以学习和应用的清晰的转换标准,它很快变得混乱。
数据建模 3.0:转型的新范式
2016 年, Dbt ,一个你肯定听说过的平台,开创了第三代数据建模解决方案。
Dbt 是一个专门致力于数据转换的平台,只关注 EL- T 过程中的 T。现在,Dbt 为数据转换设立了一个新标准,这一点已被广泛接受。有了 Dbt,转换不再像在 ETL 范例下那样用复杂的脚本语言编写。数据建模现在发生在 SQL 中,这是一种由 BI 专业人员、数据分析师和数据科学家共享的语言。这意味着,过去只属于数据工程师的转换,现在可以由分析师和技术含量较低的人员来处理。转换也是协作操作的。
Dbt 实验室建立了一个由 15,000 名数据人员组成的社区,共享和交换 dbt 包以及如何最好地标准化和建模数据以进行分析的技巧。Dbt 统一了转换的操作方式,产生了期待已久的新范式。在这个新的范例中,每个懂 SQL 的人都可以动手构建转换管道。数据工程师看到了他们的角色转变,越来越关注提取和加载阶段,将转换步骤留给技术含量较低的部分。
这既有很大的影响,也有不太大的影响:
✅ 伟大的
数据科学家和数据分析师比软件工程师更了解数据的战略影响。因此,让他们负责数据转换是有意义的,因为他们比任何人都更清楚为特定的业务目的构建数据的最终目标。另一个伟大的成果是,数据科学家和数据分析师可以访问原始数据并进行自己的转换,而无需提交票证并等待数据工程师来领取。
❌ 不太好
数据分析师大多受短期目标驱动,因为他们在运营受限的情况下工作。他们的仪表板和 BI 报告预计明天发布,而不是下个月。他们只关心快速获得洞察力。现在,他们可以学习在不需要工程支持的情况下转换数据,从而可以更快地获得业务洞察力。在实践中,事情是这样的:数据分析师为一个精确的用例创建一个新表,称之为“客户流失 _2021”,获得见解,构建一份报告,提交给他的经理,继续他的一天。这张桌子放在哪里?哪儿也不去。它留在仓库中,与其他 200 个表具有相同的名称,并被其他分析师遗忘。
结果呢?完全混乱。显然,分析师创建的表只能用于单一用例,因为它们是为单一用例构建的。这导致了混乱的数据仓库,有不可用的和文档记录不良的表。它会无用地占用大量存储空间,并需要大量的监控工作来处理数据质量问题。随着每个人都参与数据转换时创建的数据集的数量,如果您不想最终淹没在未标记、记录不良的数据海洋中,您最好有一个可靠的数据记录解决方案。
数据工程师根据不同的逻辑转换数据。他们的目标是构建可靠的数据基础架构,为自助分析提供干净可靠的数据。数据工程师寻求以一种使数据对业务分析有用的方式来转换和构造数据,但这也使数据可以在不同的用例中重用。他们的抽象能力和长期思维导致了结构良好的数据仓库,一个表服务于几十个分析师的用例。
现在,天空不全是灰色的。我们正在见证一个新角色的出现:解决这些问题的 分析工程师 。分析工程师有足够的业务背景和数据工具经验来构建可重用的数据模型。他们基本上将软件工程最佳实践应用到数据分析中,并将面向业务的思维方式引入数据工程工作中。当分析工程师负责数据转换时,组织生活在尽可能好的世界中:出色的数据基础架构、自助式配置中构建良好且可重复使用的数据库,以及跨数据仓库的完美可见性。
哪种转型工具适合您的组织?
下面是数据转换解决方案的概况,希望可以帮助您为组织选择合适的平台。
数据转换工具的演变 Louise de Leyritz 的图片
点击此处查看更详细的数据建模生态系统基准:https://notion.castordoc.com/catalog-of-data-modeling-tools
更现代的数据堆栈基准?
点击此处,了解更多关于现代数据堆栈的性能指标评测和分析。我们写了利用数据资产时涉及的所有过程:从现代数据堆栈到数据团队的组成,再到数据治理。我们的博客涵盖了从数据中创造有形价值的技术和非技术方面。如果你是一名数据领导者,并希望更深入地讨论这些话题,请加入我们为此创建的社区!
在 Castor,我们正在开发一个数据文档工具 Figma,Slack generation。或者对 Fivetran,Looker,Snowflake,DBT 的狂热爱好者来说是数据方面的。我们把我们的目录设计成易于使用、令人愉快和友好。
想去看看吗?联系我们,我们会给你演示。
最初发表于https://www.castordoc.com。
dbt 是什么?
您的分析工程指南和创建它的工具
兰迪·法特在 Unsplash 上的照片
一年多以前,我在公司的另一个部门担任了一个新的数据工程职位。我知道,进入 it 行业后,我将会比以前工作时使用更多的 Python 和 SQL。作为数据和分析的爱好者,这令人兴奋。我在那家公司的工程岗位上从未真正使用过 SQL,现在是提高我技能的机会。
几周之后,我的经理向我介绍了一个工具,这个工具刚刚开始实施,叫做 dbt (代表数据构建工具,也就是构造封面图片)。起初我并不真正理解它的用途以及我们为什么要使用它。但是当我开始探索它的特性时,我变得着迷了,说得轻一点。现在,我在另一家公司担任分析工程师,帮助构建以使用 dbt 为中心的整个数据堆栈。
事实真相
Dbt 是一种数据建模工具,它使分析师和工程师的工作变得更加容易。它帮助您以一种不必担心依赖性的方式编写 SQL 查询。我喜欢把它看作是把查询分成容器化的代码块。它允许您以一种不必重复已经编写的查询部分的方式编写 SQL 代码。
照片来自 dbt
例如,查看这个 DAG,您可以看到 orders 模型依赖于两个模型,base_orders 和 base_payments。如果要运行模型订单,它还会运行两个依赖关系基表。但是,这些基本模型完全独立于订单,也可以被其他模型使用。这保持了 SQL 代码的模块化和跨模型可重用性。
它是如何组织的
虽然有几种不同的方法可以在 dbt 项目中组织文件夹,但是创建该工具的公司建议这样做。在项目的“models”目录中,您可以创建三个目录——一个用于基本模型,另一个用于中间模型,还有一个用于您的 mart。
基本目录包含所有直接从数据源读取的模型,数据源通常是数据仓库中的一个模式。在 dbt 中,使用以下符号表示源:
{{ source('campaigns', 'channel')}}
该源引用您的。yml 文件。这些源模型类似于它们所读取的原始数据文件。但是,这里的最佳实践需要清除列名,并根据需要转换为不同的数据类型。
接下来是中间目录。这些模型总是引用我们刚刚谈到的基础模型,而不是来自某个来源。您可以把他们看作是您的分析师将要查询的基础模型和最终模型之间的中间人。此处的引用将始终使用这种符号:
{{ ref('base_campaign_types')}}
这些中间模型通常用于多个基础模型之间的连接。
最后,mart 目录是分析团队使用的“最终”模型被配置的地方。它们使用相同的参考符号来指代中间模型,而不是基础模型。这是可能发生任何计算以及任何其他微调以准备要查询的模型的地方。
其他功能
Dbt 还包括其他一些很酷的特性,比如种子、测试和标签。种子是 csv 文件,您可以将其添加到 dbt 项目中,以便上传到数据仓库。如果您有一个在分析中可能需要的唯一代码或员工 id 的列表,但当前数据中没有这些代码或 id,这将很有帮助。在我之前的角色中,我们使用这些来帮助测试我们的代码。
测试允许您检查数据源的某些功能,以确保您的数据符合标准。两个最常见的测试是检查表的主键是否唯一,并确保它不为空。还可以测试表之间的主键和外键,以确保一个值不在一个表中,而在另一个表中。这对于希望遵循强大的数据治理实践的团队非常有帮助。
我喜欢利用的另一个 dbt 特有的特性是标签。这正是它听起来的样子——你可以用某些关键词来标记你的模型。最棒的是,您可以使用它们的标签运行一组模型。例如,假设我有几个想要每天运行的关键模型。我可以安排以下命令在每天早上 6 点运行,它将每天执行带有标签的所有模型。
dbt run --models tag:daily
如果您希望在某个业务领域运行模型,这也很有帮助。你可以给他们贴上营销、财务、销售等标签。
随着我对 dbt 的深入研究,我将在这里分享我的发现。请务必阅读关于命名 dbt 模型、将 dbt 与雪花一起使用以及文档最佳实践的文章。
关于分析工程、现代数据堆栈和 dbt 的更多信息,订阅我的免费每周简讯。
什么是深度分析?
以及为什么我们需要重新思考商业智能
去潜水。乔·波勒从拍摄的照片。
作为数据分析师,我们浪费了太多时间为他人制作仪表盘,而没有足够的时间来回答关于关键业务问题的深层问题。这对个人是资源的浪费,对企业也是资源的浪费。
有关该业务的真正实质性问题,比如:“是什么促成了上个月收入的突然增长?”无法通过具有收入和流量数字的通用仪表板来回答。你需要对这个问题进行一次式的深入探究。你需要把问题分解成具体的问题。
- 按月查询过去 12 个月的收入
- 以 12 个月为间隔,通过交叉检查每月收入来检查季节性模式
- 查询营销支出数据
- 查询营销流量数据
- 查询产品使用数据,并根据用户采取的不同操作进行切割
- 寻找所有用户采取的不同产品行动
- 寻找不同用户群采取的不同产品行动
结论可能是存在季节性效应(人们在一年中的特定时间购买更多),有一次成功的营销活动增加了产品的流量,或者一群用户极大地影响了收入。无论它是什么,都有一种深刻的探索性去寻找一个看似简单问题的答案。这个工作流程还有第二个方面:组织和分享这些发现。我将这整个过程称为“深度分析”(与“浅层分析”相反,浅层分析更侧重于构建通用指标和通过仪表板共享见解——这是一种更生硬的工具,如果不是更通用的话)。
深度工作流:被遗忘的孩子
深层工作流的一个例子。图片由 Hyperquery 提供
问题是,更广泛的商业社区并没有重视这些深层的工作流程,尽管这恰恰是推动最大数量业务成果的工作类型。真正伟大的、独特的见解不会在盯着仪表盘时实现。它们来自于以新颖、不明显的方式来看待业务及其数据。从定义上来说,这不能以一刀切的方式进行。
事实是甚至分析社区也不重视这些深层工作流。缺乏关心会导致缺乏标准和工具。一个明显的例子是:SQL IDE 已经几十年没有重新设计了。共享和组织分析查询是事后才想到的。在发现和选择用于分析的不同版本的分析数据方面没有标准。
呼唤工具:工具定义工作流
优秀的工作流工具不仅仅使工作流更加高效。他们定义工作流程。Github 为代码定义了版本控制和协作。Figma 定义的协同界面设计。Ableton Live 定义了电子音乐制作。我们需要一个定义深度分析的工具。
传统的 BI 工具就是不能满足它。它们旨在帮助分析师为普通业务受众构建自助服务数据工具(例如仪表板)。SQL IDEs 也没有削减它——它们是为事务而构建的,而不是为探索而构建的(标签太多了!).Jupyter 笔记本非常适合 Python 中的数据科学工作流,但不适合分析。数据发现工具对于一般的可观察性非常有用,但是没有集成到查询编写工作流中。像 concept 和 Confluence 这样的 Wiki 工具是共享信息的通用场所,但不是专门为共享分析见解而构建的。这是一个不相交的工作流,工具并不专注于完成工作。
呼吁关注:深度分析至关重要
通过给工作流命名,我们给概念带来了生命。我们可以用简洁的方式来指代一个细微差别的概念。我们给数据科学这个学科起了个名字。我们将深度学习称为预测模型的一个变革类别。我们发明了商业智能这一术语,以表明通过自助服务工具进行数据驱动的决策的重要性。最近,我们发明了一个全新的职业:分析工程师。我们需要关注深度分析这一类别。我们需要工具来帮助我们更有效地工作。
Joseph 是 Hyperquery 的创始人兼首席执行官,该公司正在建立一个深度分析平台。通过 joseph@hyperquery.ai 和 Twitter @josephmoon_ai 联系 Joseph。
什么是深度强化学习?
详细的介绍
深度强化学习是我作为工程师使用过的最酷的工具之一。一旦完成,你所要做的就是告诉代理你想要完成什么,然后看着人工智能找出令人难以置信的创造性方法来完成这项任务。
理解神经网络(这里解释)是深度 RL 的前提。此外,如果你对列表强化学习感到舒服,深度强化学习可以更容易理解,我在这里深入解释了。
列表 RL 和深 RL 之间的差异
列表 RL 的快速总结如下。
- 代理从环境接收状态
- 使用ε贪婪策略(或一些其他的状态探索策略),代理或者进行随机动作,或者选择将导致具有最高值的状态的动作
- 在这一集的结尾,代理将所有访问过的州存储在一个表中。然后,代理回顾该集访问的州,并根据收到的奖励更新每个州的值
所以,如果我们从一开始就知道每个州的真实值;这很容易。我们只是让代理总是移动到具有最高值的状态。主要问题是找到这些正确的状态值。
deep RL 做的是;我们不是保存我们遇到的每个状态的所有值的表格,而是使用神经网络实时地近似所有下一个可能状态的值。
假设我们已经有一个神经网络,我们可以将当前状态作为输入,输出将是一个数组,其中填充了我们可能处于的所有下一个状态的值(如果有 n 个可能的动作,那么通常我们可能处于 n 个下一个可能的状态)。说我们的环境是雅达利游戏‘突围’,我们的代理处于开始状态(游戏第一帧)。在突破中,我们可以做三件事;保持不动,向左移动,或向右移动。这些行为中的每一个都会带来一个独特的新状态。我们将把当前状态输入到神经网络中,并接收一个数组,告诉我们采取每个动作后的状态值。然后,我们采取导致最高价值的行动。
下图是在只有 2 个可用动作的环境中的神经网络。输入是当前状态,输出是下一个状态值。
如果有 N 个可用动作,那么将有 N 个输出到神经网络*****作者的图像***
关于代理内存的快速说明
在我们学习如何训练我们的神经网络之前,重要的是要了解我们是如何存储从玩游戏中获得的信息的。大多数时候,我们处于状态 S,我们收到奖励 R,我们采取行动 A,我们转移到下一个状态 S '。我说大部分时间是因为如果我们处于结束一集的终结状态,我们只是收到一个奖励 R(因为没有下一个状态和采取的行动)。
实际上,我们所做的是将这些值组合成一个 4 元组,并将它们存储在一个列表中。所以,它会看起来像这样。
如果状态是终端,那么 A 和 S’将是 Nan
现在,我们已经准备好了这些信息,以便在需要培训我们的代理时使用。
训练神经网络
所以,我们知道我们希望我们的输出是每一个动作产生的状态值。为了在我们的神经网络中找到使这成为可能的所有权重,我们需要确定我们想要最小化的损失函数。首先,
我们希望我们的神经网络的输出和观察到的下一个状态值之间的差值为 0 。
如果我们使用均方误差损失函数,我们得到:
不要让索引绊倒你,V^ai 是采取行动所带来的状态的价值。如果在一个索引上有一个索引让你感到害怕,它可能应该,那么就用 I 代替 ai
现在从列表 RL 中回忆一下,
或者下一个状态的值正好是那个状态收到的奖励+之后那个状态的值。为了找到 V(t+2)真,我们可以继续说,
然后用同样的方法求 V(t+3)真,然后 V(t+4)一直真,直到我们达到一个终态。但这是不切实际的,坦率地说也是不必要的。
实际上我们可以说:
或者,V(t+1)true = R(t+1) +我们从输入下一个状态 S(t+1)到我们的 NN 中得到的最高输出。
这可能看起来有点奇怪,因为对于未经训练的网络,V(t+2)预测将是不准确的废话。这是真的,但是经过多次权重更新,准确的信息 R(t+1)足以最终使 V(t+2)预测值准确。我的想法是这样的,
但是告诉 NN R(t+1)可以让它稍微提高预测的V(t+1)的准确性,从而在多次迭代后,V 预测值变得准确。
如果我刚才说的没有意义,不用担心。你真正需要知道的是我们使用的损失函数是这样的:
*Vmax 是最大预测值。或者神经网络的最大输出。R^ai 是采取行动的奖励。请注意,我们只知道采取其中一项行动所获得的奖励。我称之为部分信息训练,这是下一个话题。*图片作者
部分信息培训
作为一个视觉,想象下面的 NN 在一个有 2 个动作的环境中。当我们的代理人处于这种状态时,他采取了行动 a1,并在下一个状态中获得奖励 R(a1,t+1)。现在我们不知道自从我们采取行动 a1 后,采取行动 a2 所产生的状态值是多少。我们训练需要这个!
图片作者
我们所做的是假设神经网络预测了这个动作的正确值,所以差变成 0。不是很优雅,但它的工作!所以,我们最后得到:
*如果你想实验,我从未探索过的一个想法是假设神经网络一开始预测完全错误,然后随着时间的推移慢慢改变假设,假设它是准确的。如果你尝试这样做,请在回复中告诉我效果如何!*图片作者
理论部分总结
这个理论可能有点复杂,这取决于你想深入细节到什么程度。我学习的方法是坐下来,拿着纸和铅笔,手动画出 3 或 4 个代理的时间步,看看我如何训练这些时间步。如果你想深入了解是怎么回事,我建议你也这样做。从状态 St 开始,在那里你得到奖励 rt。现在画一些虚构的输出值到 NN,然后选择一个动作并在内存中记录(S,A,R,S’)元组。现在再做 2 到 3 个时间步,假设你到达了一个终态。现在,随机选择一个时间步长,试着写下在这个时间步长上训练神经网络的损失函数。下面是我为理解这一点所做的一个例子:
*我决定采取的行动用绿色圈出。不是说上面的动作是 0,下面的动作是 1。*图片作者
如果所有的理论都有点模糊,不用担心。如果你第一次看到这一切时就能完全理解,我会认为你是外星人。但是现在我们已经了解了这个理论,真正学习它的唯一方法就是应用它。顺便提一下,我的第一个深度 RL 项目花了我几个星期才弄明白。这个项目教会了我代码漂亮和可读是多么重要。所以,如果没有马上得到,也不要气馁。如果我能做到,那么你也能。
下面是一个帖子的链接,我们实现了这个来让一个代理玩 Atari Pong。看看吧!
感谢您的阅读!如果这篇文章在某种程度上帮助了你,或者你有什么意见或问题,请在下面留下回复,让我知道!此外,如果你注意到我在某个地方犯了错误,或者我可以解释得更清楚一些,那么如果你能通过回复让我知道,我会很感激。
什么是嵌入,你能用它做什么
作者图片
W ord2vec(由托马斯·米科洛夫领导的谷歌研究团队发表)作为自然语言处理领域的“突破性技术”,至今已有八年历史。他们开创了单词嵌入的概念,作为技术的基础。
到目前为止,嵌入的使用已经被应用到广泛的分析中,并且产生了显著的影响。机器学习或深度学习中的许多概念都是建立在彼此之上的,嵌入的概念也不例外。对嵌入有一个坚实的理解将使学习许多更高级的 ML 技术变得容易得多。
因此,在今天的博客中,我将引导您浏览以下主题,以帮助您彻底理解嵌入的定义和应用:
- 外行人解释:一个特定任务的字典
- 直观解释:正在行走的点
- 为什么我们想要嵌入
- 嵌入的各种应用
- 汇总
外行人的解释:特定任务的字典
从 Google 的机器学习速成班中,我找到了关于嵌入的描述:一个嵌入是一个相对低维的空间,你可以将高维向量平移到其中。嵌入使得在大量输入上进行机器学习变得更加容易,比如表示单词的稀疏向量。理想情况下,嵌入通过在嵌入空间中将语义相似的输入放在一起来捕获输入的一些语义。嵌入可以跨模型学习和重用。
太棒了!这可能是我在网上能找到的关于嵌入的最精确和简洁的描述。尽管如此,它仍然有点令人费解和模糊。那么,在假装对机器学习只有初步了解的情况下,又该如何通俗易懂地解释呢?
作者图片
这里有一个例子:当应用于文本挖掘项目时,嵌入可以帮助我们通过研究一个词经常出现在什么其他词旁边来学习这个词的语义。然后我们可以产生一个嵌入列表,可以把它当作 一个任务专用字典 。如果你想了解语料库中某个特定单词的更多信息,去“字典”里查一下。然而,它并没有为你提供人类语言的定义,而是返回 一个数值向量来反映它的语义 。此外,这些向量之间的距离度量了项目中术语之间的相似性和关系。
从 word2vec 的名字可以看出——“单词到向量”,它将单词转换成数字的向量。换句话说, 嵌入是一串数字,作为唯一标识符 。我们可以使用嵌入技术为一个单词、一个人、一个声音、一幅图像等分配一个唯一的数字 ID。在你的研究中。科学家利用这种想法,创造了许多有趣的 2vec 风格的模型,以促进机器学习过程。
直观解释:行走的点
通常,嵌入被保存为向量。矢量的定义是“一个有方向和大小的量,特别是确定空间中一点相对于另一点的位置。”由于嵌入被假定为在空间中具有方向和大小,直观地,我们可以将每个矢量视为步行点的路线图。我们可以想象,所有的嵌入大概都是从同一点出发,它们会开始沿着自己的方向和权重在空间中行走。**在行走之后,每个嵌入将到达不同的端点,并且相邻点彼此更加相似,因此应该被分类到相同的组中。**因此,我们倾向于借助余弦相似度使用嵌入进行社区检测或群组聚类。它通常也用于分类任务。
为了说明上面提到的想法,我们可以做的是使用维度演绎技术(主成分分析,UMAP 等)。)将高维向量的大小缩小到 2D/3D,并在图上画出点。这里有一个博客专门向你展示如何在 3D 空间中实现这一点:
为什么我们要嵌入
以下是我们希望在项目中包含嵌入的几个原因:
首先,当前的机器学习模型继续倾向于将数值作为输入。他们类似于数学书呆子,当输入数字时,他们可以快速捕捉重要信息,但对离散的分类变量反应迟钝。然而,当研究计算机视觉或语音识别等时,我们不太可能能够收集或仅收集我们的目标/因变量的数字数据。将这些离散的分类变量转换成数字有助于模型拟合。
作者图片
第二,它有助于减小尺寸。有人可能会说,一次性编码技术是我们处理分类变量的方式。然而,在今天的数据科学世界中,它被证明是非常低效的。
当处理一个有四种不同类型的变量时,我们通常会创建四个新的虚拟变量来处理它。此外,它以前运行良好。
然而,考虑以下场景:我们正在研究三种产品的消费者反馈。对于每个观察,我们只有一个变量——评论内容。我们可以建立一个术语-文档矩阵,然后将其放入分类器或其他算法中。然而,让我们假设每个产品有 5 万条评论,语料库中的唯一单词总数是一百万。那么我们最终会得到一个形状为(150K x 1M)的矩阵。对于任何模型来说,这都是一个大得离谱的输入。这就是我们需要引入嵌入概念的时候。
假设我们将维度减少到 15(每个产品有一个 15 位数的 ID),取每个产品嵌入的平均值,然后根据数值给它们着色;这是我们得到的:
作者图片
即使没有人类语言呈现,我们仍然可以感知到客户对产品 A 和 B 的感知彼此更相似,而对产品 C 的感知不同。而这个矩阵的形状只有(3×15)。
这是另一个在谷歌机器学习速成班上讲过的例子,讲的是如何为一个电影推荐系统使用嵌入:嵌入:分类输入数据。
第三个原因是为了降低复杂度。这有点像第二个原因的延伸。嵌入还有助于将非常复杂的信息转化为数字向量。下面是一个社交网络分析的例子:
作者图片
最初,我们从社交媒体收集数据,并将其转换为社交网络分析图。在图中,我们可以使用节点之间的距离和纽带的颜色来解释节点之间的相似性。但是,它很复杂,很难读懂。现在,我们在图中只有 14 个节点,而且已经很乱了。你能想象如果我们调查 100 个节点会发生什么吗?这被称为复杂(高维)数据。然而,通过使用某些技术来帮助降维,我们可以将图转换成嵌入列表。结果,我们现在有了一个新的、干净的节点“字典”,而不是杂乱的图。我们可以使用“字典”来制作一个人类可读的可视化。
T he 嵌入的各种应用
在发现了嵌入是什么以及我们为什么需要它之后,您一定很兴奋地看到了它在实践中的一些应用。因此,我选择了一系列有趣的应用程序,这些应用程序使用了嵌入的思想以及一些相关的文献或用法演示。
自然语言处理:
word2vec:
- 论文:https://papers . nips . cc/paper/5021-distributed-presentations-of-words-and-phrases-and-they-composition ity . pdf
- 解说:https://jalammar.github.io/illustrated-word2vec/
sent2vec:
doc2vec:
- 论文:https://cs.stanford.edu/~quocle/paragraph_vector.pdf
- 演示:https://towards data science . com/detecting-document-similarity-with-doc 2 vec-f 8289 a 9 a 7 db 7
图像分析:
Img2vec:
- 解释和示范:https://becoming human . ai/extract-a-feature-vector-for-any-image-with-py torch-9717561 d1d 4c
社交网络分析:
node2vec:
- 论文:https://arxiv.org/abs/1607.00653
- 案例分析&代码:https://medium . com/analytics-vid hya/analyzing-disease-co-occurrence-using-networkx-ge phi-and-node 2 vec-53941 da 35 a 0 f
总结:
在机器学习的背景下,嵌入的功能相当于特定任务的字典。它用一系列数字对我们的目标进行编码,作为一个唯一的 ID。我们喜欢使用嵌入,因为它可以帮助将离散的分类变量转换成模型可读的数据,还可以帮助降低数据的维度和复杂性。我还列举了几款精选的 2vec 风格的车型。
本月晚些时候,我可能会写另一篇文章来演示嵌入的一种用法。上面的算法只是 2vec 风格模型的一小部分。如果你感兴趣,我想这个网站可能会帮助你。
请随时与我联系LinkedIn。
什么是 ETL?
三代 ETL/ELT 工具,以及生态系统如何发展
图片来自 Castor 的网站
ETL (Extract-Load-Transform)是最广泛的数据集成方法,即整合来自不同源系统的数据以改善数据访问的实践。故事还是老样子:企业有海量数据要处理,理解这些数据有助于提高企业绩效。ETL 在这一探索中扮演着核心角色:它是将原始的、杂乱的数据转化为干净的、新鲜的、可靠的数据的过程,从这些数据中可以获得业务洞察力。这篇文章试图阐明这个过程是如何进行的,ETL 工具是如何发展的,以及当今对您的组织可用的最佳工具。
什么是 ETL?
如今,组织从多个不同的业务源系统收集数据:云应用程序、CRM 系统、文件等。ETL 过程包括汇集来自这些不同来源的数据,以构建唯一的真实来源:数据仓库。 ETL 管道是数据管道,它有一个非常具体的作用:从它的源系统/数据库中提取数据,转换它,并将其加载到数据仓库中,数据仓库是一个集中式的数据库。数据管道本身是数据基础设施的一个子集,该层支持整个组织的数据编排、管理和消费。
ETL 管道—图片由 Louise de Leyritz 提供
ETL 不只是移动数据:杂乱的数据是从其原始源系统中提取出来的,通过转换变得可靠,最后装载到数据仓库中。
提取
数据集成过程的第一步是数据提取。在这个阶段,数据管道从多个数据源和数据库中提取数据,并将其汇集到一个暂存区。
ETL 流程—图片由 Louise de Leyriyz 提供
临时区域的用途如下:
- 通常不可能同时从所有源系统中提取所有数据。staging area 允许在不同时间将数据集合在一起,这是一种不会淹没数据源的方法。
- 它避免了同时执行提取和转换,这也会使数据源负担过重。
- 最后,当将数据加载到集中式数据库中出现问题时,临时区域非常有用。这允许根据需要回滚和恢复同步。
改变
数据集成的第二步是转换数据,将数据转换成适合分析的格式。使数据符合目的有两个部分。
- 在原始的源系统中,数据通常是杂乱的,因此很难解释。转换的一部分在于提高数据的质量:清除无效数据,删除重复数据,标准化测量单位,根据类型组织数据,等等。
- 在转换阶段,数据也被结构化和重新格式化,以使其适合特定的业务目的。很多时候,事务数据与运营数据集成在一起,这使得它对于数据分析和商业智能非常有用。例如,ETL 可以将业务运营中使用的名称、地点和定价数据与交易数据结合起来,例如零售或医疗保健索赔,如果最终用户需要这种结构来进行数据分析的话。因此,转型主要由寻求用数据解决精确业务问题的分析师的特定需求决定。
负荷
数据集成的最后一步是将经过转换、格式正确的数据加载到数据仓库中。数据可以一次全部加载(全加载),也可以按预定的时间间隔加载(增量加载)。这通过使用批次或流装载来实现。批量加载是指 ETL 软件从源系统中提取批量数据,通常基于一个时间表(例如每小时)。流式 ETL,也称为实时 ETL 或流处理,是一种替代方法,在这种方法中,一旦数据源系统提供了信息,数据管道就会接收这些信息。特定的业务用例决定了处理的选择。例如,当你进行高频交易时,你通常更喜欢获得实时数据,并获得一个支持流处理的工具。
为什么我们需要 ETL?
ETL 可以在多个方面为您的组织带来好处:
✅ ETL 将数据库和各种形式的数据组合成一个单一的、统一的视图。这使得查找数据和进行有意义的业务分析变得更加容易。
✅ ETL 提高了数据人员的生产力,因为它整理并重用了移动数据的过程。
✅ ETL 提供了深刻的历史背景,这培养了对数据的信任。
✅ ETL 允许源系统和目标系统之间的样本数据比较
有哪些可用的工具?
ETL 工具已经存在有一段时间了,但是在过去的几年中,作为他们努力跟上数据基础设施发展的一部分,它们已经有了很大的发展。数据集成过程最重要的演变是从 ETL(提取-转换-加载)工具到 EL-T(提取-加载-转换工具)的转变。这基本上是过程顺序的改变,有着有趣的应用。
我们区分了三代 ETL/ELT 工具:
第一代:标准 ETL(提取-转换-加载)工具。它们遵循 20 世纪 90 年代特有的严格的存储、带宽和计算约束所决定的过程
第二代 : ELT(提取-加载-转换)流程源于云数据仓库的到来以及存储和带宽限制的解除。
**第三代:**第三代 ETL 工具提供了更多的连接器,因为它们能够标准化连接器并利用它们的社区。
ETL 1.0:构建数据仓库
数据集成(ETL)的标准方法可以追溯到 20 世纪 70 年代,当时企业开始使用中央数据存储库。但是专门用于帮助将数据加载到数据仓库中的工具只出现在 20 世纪 90 年代早期,当时数据仓库占据了中心位置。
传统的 ETL 工具从孤立的系统和数据库中提取数据,根据所需的结构进行转换,然后将其加载到集中式数据库中。这是根据以下过程实现的:
- 定义数据项目及其所对应的业务需求
- 确定项目的相关数据源
- 定义分析师解决特定业务问题所需的数据模型/结构。
- 构建 ETL 管道(提取、转换和加载功能)
- 进行数据分析并获得业务洞察力
传统 ETL 工具的主要特征是执行过程的顺序。具体来说,数据在被加载到数据仓库之前被转换**。原因很简单:在 20 世纪 90 年代,存储、计算和带宽极其稀缺和昂贵。因此,在将数据加载到仓库之前减少数据量至关重要。**
这个过程发生的特定顺序是与第一代 ETL 工具相关的大多数障碍的根源。
首先,它导致了重要的可伸缩性问题。ETL 管道不仅仅从数据库中提取数据,还执行复杂的转换,以满足终端用户的特定需求。这涉及到大量的时间和定制代码。当数据用户想要进行业务分析,需要尚不存在的配置中的数据时,数据工程师需要为新的用例重写转换代码。当数据量增加时,就不可能构建和维护高度定制的数据管道。
将转换步骤放在加载步骤之前的第二个问题是,这会导致 ETL 管道的持续维护。因为管道一起提取和转换数据,所以一旦数据源系统中的模式改变,它们就中断;例如,当删除或添加字段时。这使得用于将数据转换为预定义模型的代码失效,需要由数据工程师重新编写。
这个可伸缩性问题没什么大不了的,因为传统的本地数据仓库基础设施无论如何都无法容纳和处理这么多数据。
ETL 2.0:云计算时代
在过去的几十年里,存储和计算成本下降了数百万倍,带宽成本下降了数千倍。这导致了云的指数级增长,以及云数据仓库的到来,如亚马逊红移或谷歌 BigQuery。云数据仓库的独特之处在于,它们比传统数据仓库具有无限的可扩展性,能够容纳几乎任何数量的数据。不仅如此,云数据仓库还支持大规模并行处理(MPP),能够以令人难以置信的速度和可扩展性协调大量工作负载。
这些新的云数据仓库要求对 ETL 过程进行彻底的改变。传统的 ETL 适用于传统的数据仓库。既然组织已经有了可伸缩的基础设施,是时候获得可伸缩的 ETL 管道了;可以处理和转换任何数量的数据。传统 ETL 工具的性能在云中并没有提高,因为可伸缩性问题是在仓库中移动数据的过程所固有的。因此,在使用传统 ETL 工具的同时投资一个云数据仓库,会给你留下与旧数据仓库相同的瓶颈。
ETL 过程必须改变,它确实改变了。值得注意的是,数据集成技术不再受到存储、计算和带宽的限制。这意味着组织可以在仓库中加载大量未转换的数据,而不用担心成本和限制。你猜怎么着,他们确实这么做了。
这就是提取-加载-转换(ELT)过程取代传统 ETL 的原因。这里的想法是从源系统中提取数据,并直接将数据加载到云数据仓库中,而不进行转换。我们现在谈到 ELT **连接器,**ELT 工具的组件,它们建立到数据源的连接,构建管道,并允许提取和加载步骤发生。连接器不处理特定业务用例的转换;一旦数据被加载到数据仓库中,就会通过 dbt 之类的工具对其进行处理。
EL-T 过程—图片由 Louise de Leyritz 提供
在工作流程的最后移动变换层有几个主要优点:
✅将加载和转换步骤分离开来,这意味着数据管道不再是高度定制的、耗时的过程。事实上,使用 ELT,管道只是将数据从源移动到目的地,除了数据清理/规范化之外什么也不做。不再为最终用户定制转换。这意味着 ELT 的提取和加载阶段可以自动化,并且可以根据需要放大或缩小。
✅在云数据仓库中,转换过程本身要简单得多。转换不再用复杂的语言编写,比如 Python。转换和数据建模发生在 SQL 中,这是一种由 BI 专业人员、数据分析师和数据科学家共享的语言。这意味着曾经由数据工程师专有的转换**,现在可以由分析师**和技术人员处理。
✅将转换层从提取和加载中分离出来还有另一个好处:转换层的故障(当上游模式或下游数据模型改变时)不会阻止数据被加载到云数据仓库中。相反,随着数据继续被提取和加载,分析师可以重写转换。实用。
ETL 和 ELT 因此在三个层次上有所不同:当转换发生时,在哪里发生,以及由谁执行。转换步骤是 ETL 过程中最复杂的步骤,这解释了为什么拥有云数据仓库的组织现在使用 ELT 工具。
❌第二代工具是对传统 ETL 过程的巨大改进,但是它们仍然不能完全解决数据集成问题。事实上,市面上大多数 ELT 工具**都没有破解过连接器外壳。**性能最好的 ELT 工具建议数据源和数据目的地之间最多有 150–200 个连接器。这已经很好了。问题是,全球组织使用的营销/技术工具超过 5000 种。这些组织是做什么的?嗯,他们要么不使用任何工具,而是使用 Airflow 或 Python 来构建连接器(是的,人们仍然这样做!或者他们在购买诸如 Stitch 或 Fivetran 等 ETL 工具的基础上构建和维护自己的定制连接器。不理想?我们知道,但整合游戏并不容易。
ETL 3.0:连接器的商品化
第三代 ETL 工具面临着一个严峻的挑战:如果他们想给客户带来价值,他们需要在连接器和维护工作方面达到预期。解决方案在于连接器的商品化,但如何实现呢?
连接器标准化
ETL 工具不建议使用 150/200 以上的现成连接器的原因是,构建这些连接器确实很痛苦。因此,第三代工具在**中投入了巨大的努力,使得构建新的连接器变得很简单。**但是,如何使连接器易于构建呢?您需要标准化连接器的工作方式。这意味着构建连接器的核心,数据工程师只需调整这个核心就可以获得他们需要的定制连接器。
这相当于为 ETL 工具构建 Dyson 吹风机。戴森彻底改变了头发护理,这要归功于一个小装置,你可以根据你的头发情绪,在其上插上卷发器、吹风机、加热刷、直发器和其他新奇的东西。开发这款设备花费了 7100 万美元,还有数百名工程师,但是顾客很高兴他们不必根据他们想要的发型购买 6 种不同的设备。对于 ETL 工具来说,这是同样的挑战:寻找、构建和提供定义**连接器核心的东西。**这样就可以根据具体的使用情况轻松定制,就像开关吹风机的末端一样。
定制 ETL 连接器的最后一部分,而不是从头开始——图片来自 Dyson
在一个连接器没有标准化的世界里,构建 Tableau 的连接器需要很长时间。您需要访问源/目标文档、测试帐户、使用最适合任务的语言、定义输入等。这需要时间,而且令人厌倦。使用标准化连接器,您只需访问“分析”连接器核心,它本身是通过丰富为所有连接器设计的核心而构建的。在这种配置中,构建 Tableau 连接器需要几个小时,而不是几天。
开源:利用社区的力量
比构建连接器更难的是什么?**维护连接器。**谢天谢地,开源 ELT 工具可能已经解决了这个问题。ELT 工具有一个特别之处:它们是由使用它们的同一批人构建的:数据工程师。因此,开源 ELT 工具和发展一个强大的数据工程师社区可以带来巨大的成果。一个工程师需要造一个不存在的连接器?多亏了连接器的标准化,他花了两个小时。更好的是,整个社区,根据定义,所有其他客户都将受益于这种新的连接器。一个连接器有问题?检测到它的工程师为每个人修理它。简化维护:分担负担。
哪个 ETL/ELT 工具适合您的组织?
下面,你会发现一个 ETL 工具的场景,它可以帮助你选择一个适合你公司需求的解决方案。
ETL/ELT 工具前景—图片由 Louise de Leyritz 提供
点击这里查看完整的 ETL 工具和更多标准。
在选择 ETL 工具时,有各种各样的考虑因素。您希望确保选择适合您业务的工具。我们建议关注以下几个方面:
- **内置集成:**或者更准确地说,工具是否提出了您所关心的集成。最先进的 ETL 工具为 150–200 种最常用的应用程序提供了现成的连接器。如果您需要与一个特定的应用程序集成,请确保您选择了一个提供这种集成的工具。很可能你的 ETL 工具不能与你所有的应用程序/数据库集成。在这种情况下,请确保您选择的工具能够与其他具有所需连接器的 ETL 工具集成,连接到可以充当原始数据源和 ETL 工具之间中介的 S3 桶,或者从手动编码的管道中获取数据。
- **维护:**在寻找数据处理解决方案时,不要忘了维护对流程有多关键。如果您需要一个全职的工程团队来保持 ETL 管道正常运行,也许您应该考虑另一个解决方案。
- **可扩展性:**根据您是企业客户还是中小型公司,您选择的工具会有所不同。如果您是一个企业客户,您应该选择一个 ETL 工具,它可以轻松扩展,具有高可用性基础设施和每天处理数百万个表的能力。
- **支持:**无论你使用哪种工具,你最终都会需要帮助。如果您得不到所需的帮助,您的团队将无法开展其关键的数据处理活动,这将严重影响您的业务。
更现代的数据堆栈基准?
点击此处,了解更多关于现代数据堆栈的性能指标评测和分析。我们写了利用数据资产时涉及的所有过程:从现代数据堆栈到数据团队的组成,再到数据治理。我们的博客涵盖了从数据中创造有形价值的技术和非技术方面。
在 Castor,我们正在开发一个数据文档工具 Figma,Slack generation。或者对 Fivetran,Looker,Snowflake,DBT 的狂热爱好者来说是数据方面的。我们把我们的目录设计成易于使用、令人愉快和友好。
想去看看吗?联系我们,我们将向您展示一个演示。
什么是特征工程?
一个非常宽泛的机器学习概念的简要介绍
对于“特征工程”具体指的是什么,很难找到任何一种共识。我这篇文章的目标是为新的和有抱负的数据科学家提供一个关于构建成功的机器学习(ML)模型的非常广泛而基本的方面的介绍。我们将讨论变量和特性之间的区别,为什么特性工程是重要的,以及什么时候你可能想要设计特性。在以后的文章中,我将介绍一些如何使用 Python、Pandas 和 NumPy 来设计特性的基本示例。
凯文·Ku 通过 Unsplash 拍摄的图片
那么什么是特征工程呢?
有些人认为特征工程包括数据清理,将数据转换成机器学习(ML)算法可用的格式。这包括处理缺失值或空值、处理异常值、删除重复条目、编码非数字数据以及转换和缩放变量。我倾向于认为这些事情是重要的预处理步骤,但是大部分是与特征工程分开的。我说“大部分”是因为(像数据科学中的大多数其他事情一样)探索、清理和工程特性应该被视为迭代过程的一部分。这些步骤中的每一步都会通知其他步骤。
对我来说,特征工程专注于使用你已经拥有的变量来创建额外的特征,这些特征(希望是)更好地表示你的数据的底层结构。特征工程是一个创造性的过程,非常依赖于领域知识和对数据的彻底探索。但是在我们继续深入之前,我们需要后退一步,回答一个重要的问题。
什么是特性?
要素不仅仅是数据集中的任何变量。特征是一个变量,对于预测您的特定目标和解决您的特定问题非常重要。例如,在许多数据集中常见的变量是某种形式的唯一标识符。该标识符可以代表唯一的个人、建筑物、交易等。唯一标识符非常有用,因为它们允许您过滤掉重复的条目或合并数据表,但是唯一 id 不是有用的预测器。我们不会在我们的模型中包含这样的变量,因为它会立即过度拟合训练数据,而不会为预测未来的观察提供任何有用的信息。因此,唯一 ID 是一个变量,而不是一个特征。
所以一个特征可以被认为是一个潜在有用的预测因子。
特征工程的目的是什么?
当你拿到一个数据集时,你很少会觉得你已经得到了解决问题可能需要的所有信息。那么,如果你不能收集更多的数据或测量额外的变量,你能做什么呢?你可以设计特征。
这实际上意味着应用领域知识来弄清楚如何以新的方式使用您所拥有的信息来提高模型性能。直到你开始探索你的数据,你才会完全理解你所拥有的信息。这就是为什么很难找到涵盖特性工程主题的非常具体的资源。它是如此依赖于
- 你工作的领域,
- 您在该领域中的具体问题或任务,
- 你已经拥有的变量,
- 以及你产生额外信息的能力。
没有人能给你一步一步的指导,告诉你应该设计哪些功能以及如何设计。抱歉。
创建能够更好地强调数据趋势的附加要素有可能提高模型性能。毕竟,任何模型的质量都受到输入数据质量的限制。仅仅因为这些信息在技术上已经存在于你的数据集中,并不意味着机器学习算法能够识别它们。在大的特征空间中,重要的信息可能在噪声和竞争信号中丢失。因此,在某些方面,特征工程就像试图告诉模型数据的哪些方面值得关注。这是您作为数据科学家的领域知识和创造力真正发挥作用的地方!
什么时候应该设计功能?
当您浏览已有数据时,请记住以下几个问题:
- 用不同的方式表示同一个变量,有可能获得信息或减少噪音信号吗?
- 是否有任何变量具有重要的阈值,而这些阈值没有明确地反映在变量当前的表示方式中?
- 可以将任何变量分解成两个或更多的变量来提供有用的信息吗?
- 有没有任何一个变量可以以某种方式组合起来,变得比它们各部分的总和更能提供信息?
- 您是否有信息可以让您收集或以其他方式获得有用的外部数据?
如果你对这些问题中的任何一个回答“是”,花一些时间来设计功能可能是一个有益的尝试。
最后
与数据科学中的许多事情一样,特征工程是一个迭代过程。调查、试验和返回进行调整是至关重要的。您将获得的对数据结构的洞察以及对模型性能的潜在改进通常非常值得付出努力。此外,如果您对这一切还比较陌生,那么特征工程是练习使用和操作数据框架的好方法!因此,请继续关注未来的帖子,这些帖子涵盖了如何做到这一点的具体示例(,代码为)。
关于特征工程的更多信息:
什么是特征工程——机器学习的重要性、工具和技术
用于机器学习的特征工程技术是机器学习中的一个基本主题,但也是一个经常被忽视或看似简单的主题。
作者图片
特征工程是选择、操作原始数据并将其转换为可用于监督学习的特征的过程。为了让机器学习在新任务上工作得更好,可能有必要设计和训练更好的功能。如您所知,“特征”是可以在预测模型中使用的任何可测量的输入,可以是某个对象的颜色或某人的声音。简而言之,特征工程是使用统计或机器学习方法将原始观察结果转换成所需特征的行为。
在本文中我们将看到:
- 什么是特征工程,
- 特征工程的重要性,
- 机器学习的特征工程技术,
- 几个最好的特征工程工具。
什么是特征工程
特征工程是一种机器学习技术,它利用数据来创建训练集中没有的新变量。它可以为监督和非监督学习产生新的功能,目标是简化和加速数据转换,同时提高模型准确性。使用机器学习模型时需要特征工程。不管是数据还是架构,一个可怕的特性都会对你的模型产生直接的影响。
现在为了更容易地理解它,让我们看一个简单的例子。以下是 x 市的房价。它显示了房子的面积和总价。
抽样资料
现在,这些数据可能有一些错误或可能不正确,并不是互联网上的所有来源都是正确的。首先,我们将添加一个新列来显示每平方英尺的成本。
抽样资料
这项新功能将帮助我们了解更多关于我们的数据。因此,我们有了一个新的列来显示每平方英尺的成本。有三种主要的方法可以找到任何错误。你可以利用领域知识联系物业顾问或房地产经纪人,向他展示每平方英尺的价格。如果你的律师说每平方英尺的价格不能低于 3400 英镑,你可能会有问题。数据可以通过可视化。
当你绘制数据时,你会注意到一个价格与其他价格有很大的不同。在观想方法中,你可以很容易地注意到这个问题。第三种方法是用统计分析你的数据,发现什么问题。特征工程由各种过程组成
- 特征创建:创建特征包括创建对我们的模型最有帮助的新变量。这可以是添加或删除一些功能。正如我们上面看到的,每平方英尺的成本。英国《金融时报》专栏是一个特色创作。
- 转换:特征转换就是将特征从一种表示转换成另一种表示的功能。这里的目标是绘制和可视化数据,如果某些东西与新特征不符,我们可以减少使用的特征数量,加快训练速度,或提高某个模型的准确性。
- 特征提取:特征提取是从数据集中提取特征以识别有用信息的过程。在不扭曲原始关系或重要信息的情况下,这将数据量压缩为便于算法处理的可管理数量。
- **探索性数据分析:**探索性数据分析(EDA)是一个强大而简单的工具,可以通过探索数据的属性来提高对数据的理解。当目标是创建新的假设或在数据中发现模式时,经常应用该技术。它通常用于大量以前没有分析过的定性或定量数据。
- 基准测试:基准测试模型是最用户友好的、可靠的、透明的和可解释的模型,你可以用它来衡量你自己的模型。运行测试数据集,看看你的新机器学习模型是否优于公认的基准,这是一个好主意。这些基准通常用作比较不同机器学习模型(如神经网络和支持向量机、线性和非线性分类器,或者不同方法(如 bagging 和 boosting)之间的性能的衡量标准。要了解关于特征工程步骤和过程的更多信息,请查看本文末尾提供的链接。现在,让我们来看看为什么在机器学习中需要特征工程。
特征工程的重要性
特征工程是机器学习中非常重要的一步。特征工程是指将人工特征设计成算法的过程。然后,该算法使用这些人工特征来提高其性能,或者换句话说,获得更好的结果。数据科学家大部分时间都在和数据打交道,让模型准确变得很重要。
作者图片
当特征工程活动正确完成时,产生的数据集是最佳的,并且包含影响业务问题的所有重要因素。作为这些数据集的结果,产生了最准确的预测模型和最有用的见解。
机器学习的特征工程技术
让我们看看一些你可以使用的特征工程最佳技术。列出的一些技术可能更适合某些算法或数据集,而其他技术可能在所有情况下都有用。
1。插补
在为机器学习准备数据时,缺失值是最典型的问题之一。人为错误、数据流中断、隐私问题和其他因素都可能导致丢失值。不管什么原因,缺失值都会对机器学习模型的性能产生影响。插补的主要目标是处理这些缺失值。有两种类型的插补:
- 数字插补:为了计算出当前人口中应该分配多少数字,我们通常使用已完成的调查或人口普查的数据。这些数据集可以包括关于有多少人吃不同类型的食物,他们是否生活在气候寒冷的城市或国家,以及他们每年挣多少钱的信息。这就是为什么当某些信息缺失时,数字插补被用来填补调查或普查中的空白。
#用 0 填充所有缺少的值
data = data.fillna(0)
- **分类插补:**处理分类列时,用列中的最高值替换缺失值是一个聪明的解决方案。但是,如果您认为该列中的值是均匀分布的,并且没有占主导地位的值,则输入类似“其他”的类别将是一个更好的选择,因为在这种情况下,您的插补更有可能收敛到随机选择。
#分类列的最大填充函数
数据[‘列名’]。fillna(data[‘column_name’]。value_counts()。idxmax(),inplace=True)
2。处理异常值
异常值处理是一种从数据集中移除异常值的技术。这种方法可用于各种规模,以产生更准确的数据表示。这对模型的性能有影响。根据型号的不同,影响可能很大,也可能很小;例如,线性回归特别容易受到异常值的影响。该程序应在模型训练之前完成。处理异常值的各种方法包括:
- 删除:从分布中删除包含异常值的条目。然而,如果在众多变量中存在异常值,这种策略可能会导致数据手册的大部分内容丢失。
- 替换值:或者,异常值可作为缺失值处理,并用适当的插补替换。
- 封顶:用任意值或变量分布的值来代替最大值和最小值。
- **离散化:**离散化是将连续的变量、模型、函数转化为离散的过程。这是通过构建一系列连续的区间(或箱)来实现的,这些区间跨越了我们期望的变量/模型/函数的范围。
3。日志转换
对数变换是数据科学家使用最多的技术。它主要用于将偏态分布转化为正态分布或不太偏态的分布。我们取一列中值的对数,并利用这些值作为这个转换中的列。它用于处理混乱的数据,数据变得更接近正常的应用程序。
//日志示例
df[log _ Price]= NP . log(df[’ Price '])
4。一键编码
独热编码是一种编码类型,其中有限集合的元素由该集合中的索引来表示,其中只有一个元素将其索引设置为“1”,并且所有其他元素被分配范围[0,n-1]内的索引。与二进制编码方案相反,在二进制编码方案中,每个比特可以表示 2 个值(即 0 和 1),该方案为每个可能的情况分配唯一的值。
5。缩放比例
特征缩放是机器学习中最普遍和最困难的问题之一,但它是正确处理的最重要的事情之一。为了训练一个预测模型,我们需要具有一组已知特征的数据,这些数据需要适当地放大或缩小。这篇博文将解释特征缩放是如何工作的,为什么它很重要,以及一些关于开始特征缩放的提示。
在缩放操作之后,连续特征在范围方面变得相似。尽管许多算法不需要这一步,但这样做仍然是个好主意。另一方面,k-NN 和 k-Means 等基于距离的算法需要缩放的连续特征作为模型输入。有两种常见的缩放方式:
标准化:通过标准化(或最小-最大标准化),所有值在 0 和 1 之间的指定范围内缩放。这种修改对要素的分布没有影响,但是由于标准差较低,它会加剧异常值的影响。因此,建议在标准化之前处理异常值。
标准化:标准化(也称为 z 分数标准化)是在考虑标准偏差的同时缩放值的过程。如果特征的标准偏差不同,这些特征的范围也将不同。结果降低了特征中异常值的影响。为了得到一个平均值为 0、方差为 1 的分布,所有数据点都要减去它们的平均值,结果再除以分布的方差。
了解更多关于 特征工程技术
少数最佳功能工程工具
有许多工具可以帮助您自动化整个特征工程过程,并在短时间内为分类和回归任务生成大量特征。让我们来看看工程工具的一些特性。
功能工具
Featuretools 是一个执行自动化特征工程的框架。它擅长将时态和关系数据集转换为机器学习的特征矩阵。Featuretools 与您已经拥有的机器学习管道构建工具相集成。只需手动操作的一小部分时间,您就可以加载 pandas 数据框架并自动构建重要要素。
功能工具摘要
- 易于上手,良好的文档和社区支持
- 它通过将原始数据与您对数据的了解相结合,帮助您为机器学习和预测建模构建有意义的特征。
- 它提供 API 来验证只有合法的数据被用于计算,防止你的特征向量中的标签泄漏。
- Featuretools 包括一个低级函数库,可分层生成要素。
- 它的 AutoML 库(EvalML)可以帮助您构建、优化和评估机器学习管道。
- 擅长处理关系数据库。
了解更多关于 功能工具 。
自动吃饭
AutoFeat 有助于通过自动特征工程和选择来执行线性预测模型。AutoFeat 允许您选择输入变量的单位,以避免构建物理上无意义的特征。
自动汇总
- AutoFeat 可以通过一个热编码轻松处理分类特征。
- 该包中的 AutoFeatRegressor 和 AutoFeatClassifier 模型具有与 scikit-learn 模型相似的界面
- 不擅长处理关系数据的通用自动特征工程。
- 它在物流数据中很有用
了解更多关于 自动调整 。
TsFresh
tsfresh 是一个 python 包。它自动计算大量的时间序列特征。此外,该软件包包括在回归和分类任务中评估这些性状的解释力和显著性的方法。
t 最新摘要
- 它是时间序列分类和回归的最佳开源 python 工具。
- 它有助于提取峰值数量、平均值、最大值、时间反转对称性统计等信息。
- 它可以与 FeatureTools 集成。
了解更多 TsFresh 。
OneBM
OneBM 直接与数据库的原始表交互。它慢慢地连接表,在关系树上选择不同的路径。它识别联合结果中的简单数据类型(数字或分类)和复杂数据类型(一组数字、一组类别、序列、时间序列和文本),并对提供的类型应用预定义的特征工程方法。
- 关系数据和非关系数据都受支持。
- 与 FeatureTools 相比,它可以生成简单和复杂的特征。
- 它在 Kaggle 比赛中接受了测试,并超过了最先进的模型。
了解更多关于 OneBM
ExploreKit
ExploreKit 基于这样一种想法,即极其丰富的功能通常是操作基本功能的结果,它确定了常用的操作符来独立地改变每个功能或组合多个功能。元学习用于对候选特征进行排序,而不是对所有已开发的特征进行特征选择,这可能非常庞大。
了解更多关于explore kit
对比
结论
特征工程是从原始数据开发新的数据特征。通过这种技术,工程师分析原始数据和潜在信息,以提取新的或更有价值的特征集。特征工程可以被看作是数学优化的一种概括,它允许更好的分析。希望你了解了特征工程,它的技术和工程师使用的工具。如果你对这篇文章有任何疑问,你可以发表评论。
保持安全和愉快的体验!!
参考文献及推荐阅读:
- https://www . omni sci . com/technical-glossary/feature-engineering
- https://a cuvate . com/blog/the-what-why-and-how-of-feature-engineering/
- https://neptune.ai/blog/feature-engineering-tools
- https://www . analyticsvidhya . com/blog/2021/03/step-by-step-process-of-feature-engineering-for-machine-learning-algorithms-in-data-science/
- https://analyticsindiamag . com/guide-to-automatic-feature-engineering-using-autofat/
- https://medium . com/analytics-vid hya/automated-feature-engineering-tools-44d 00 be 56 e3a
- https://neptune.ai/blog/ml-from-research-to-production
什么是 GPT-3,为什么它如此强大?
理解这种生成类似人类文本的语言模型背后的宣传
帕特里克·托马索在 Unsplash 上的照片
GPT-3(预训练生成变压器 3)是一种语言模型,由旧金山人工智能研究实验室 OpenAI 创建。这个拥有 1750 亿个参数的深度学习模型能够产生类似人类的文本,并在拥有数千亿个单词的大型文本数据集上进行训练。
“我对拥有 302 个神经元的蠕虫是有意识的这一想法持开放态度,因此我对拥有 1750 亿个参数的 GPT-3 也是有意识的这一想法持开放态度。”—大卫·查尔莫斯
自去年夏天以来,GPT-3 已经成为头条新闻,整个创业公司都是使用这个工具创建的。然而,重要的是要了解 GPT-3 背后的事实以及它是如何工作的,而不是迷失在围绕它的所有宣传中,并将其视为可以解决任何问题的黑匣子。
在这篇文章中,我将为您提供 GPT-3 如何工作的高级概述,以及该模型的优势和局限性,以及您自己如何使用它。
GPT 3 号是如何工作的
在其核心,GPT-3 基本上是一个变压器模型。Transformer 模型是序列到序列深度学习模型,可以在给定输入序列的情况下产生一系列文本。这些模型是为文本生成任务设计的,例如问答、文本摘要和机器翻译。下图展示了在给定英语输入序列的情况下,transformer 模型如何迭代生成法语翻译。
在机器翻译任务中,转换器反复预测下一个单词。图片由作者提供。
Transformer 模型的操作与 LSTMs 不同,它使用多个被称为注意块的单元来学习文本序列中哪些部分值得关注。单个转换器可以具有几个独立的注意块,每个注意块学习从词类到命名实体的语言的独立方面。对于变压器如何工作的深入概述,你应该看看我下面的文章。
GPT-3 是由 OpenAI 创建的第三代 GPT 语言模型。GPT 3 号与之前型号的主要区别在于它的大小。GPT-3 包含 1750 亿个参数,是 GPT-2 的 17 倍,大约是微软图灵 NLG 模型的 10 倍。参考我在上面列出的前一篇文章中描述的转换器架构,GPT-3 有 96 个关注块,每个关注块包含 96 个关注头。换句话说,GPT 3 基本上是一个巨大的变形金刚模型。
基于介绍该模型的原始论文,使用以下大型文本数据集的组合来训练 GPT-3:
- 普通爬行
- 网络文本 2
- 书籍 1
- 书籍 2
- 维基百科语料库
最终的数据集包含了很大一部分来自互联网的网页、大量的书籍和所有的维基百科。研究人员使用这个拥有数千亿单词的数据集来训练 GPT-3 生成其他几种语言的英语文本。
为什么 GPT 3 号如此强大
自去年夏天以来,GPT-3 已经成为头条新闻,因为它可以执行各种各样的自然语言任务,并生成类似人类的文本。GPT-3 可以执行的任务包括但不限于:
- 文本分类(即。情感分析)
- 问题回答
- 文本生成
- 文本摘要
- 命名实体识别
- 语言翻译
基于 GPT-3 可以执行的任务,我们可以认为它是一个可以在接近人类的水平上执行阅读理解和写作任务的模型,只是它看到的文本比任何人一生中阅读的文本都多。这正是 GPT 3 号如此强大的原因。整个创业公司都是用 GPT-3 创建的,因为我们可以把它想象成一把通用的瑞士军刀,用来解决自然语言处理中的各种问题。
GPT 新协议的局限性
虽然在撰写本文时,GPT-3 是最大的,也可以说是最强大的语言模型,但它有自己的局限性。事实上,每一个机器学习模型,无论多么强大,都有一定的局限性。这个概念是我在下面关于没有免费的午餐定理的文章中详细探讨过的。
考虑下面列出的 GPT 协议-3 的一些限制:
- GPT 3 号缺乏长期记忆——该模型不像人类那样从长期互动中学到任何东西。
- 缺乏可解释性——这是一个影响极其广泛和复杂的问题。GPT-3 是如此之大,以至于很难解释或说明它产生的输出。
- 有限的输入大小 —变压器有固定的最大输入大小,这意味着 GPT-3 可以处理的提示不能超过几句话。
- 缓慢的推断时间——因为 GPT 3 号太大了,模型产生预测需要更多的时间。
- GPT-3 遭受偏见——所有的模型都只和用来训练它们的数据一样好,GPT-3 也不例外。例如,这篇论文表明 GPT-3 和其他大型语言模型包含反穆斯林偏见。
虽然 GPT-3 很强大,但它仍然有局限性,这使它远远不是一个完美的语言模型或人工通用智能的例子(AGI)。
如何使用 GPT-3
目前,GPT-3 不是开源的,OpenAI 决定通过商业 API 提供该模型,你可以在这里找到。该 API 处于私人测试阶段,这意味着您必须填写 OpenAI API 等待列表表单才能加入使用该 API 的等待列表。
OpenAI 还为希望使用 GPT-3 的学术研究人员提供了一个特殊的项目。如果你想使用 GPT-3 进行学术研究,你应该填写学术访问申请。
虽然 GPT 3 不是开源或公开的,但它的前身 GPT 2 是开源的,可以通过拥抱脸的变形金刚库访问。如果你想使用这个更小但仍然强大的语言模型,请随意查看拥抱脸的 GPT-2 实现的文档。
摘要
自去年夏天以来,GPT-3 受到了很多关注,因为它是目前为止在撰写本文时创建的最大的、可以说是最强大的语言模型。然而,GPT-3 仍然受到几个限制,使它远远不是一个完美的语言模型或 AGI 的例子。如果你想将 GPT-3 用于研究或商业目的,你可以申请使用开放人工智能的 API,它目前处于私人测试阶段。否则,你总是可以直接使用 GPT 2,这是公开可用和开源的,这要感谢 HuggingFace 的变形金刚库。
加入我的邮件列表
你想在数据科学和机器学习方面变得更好吗?您想了解数据科学和机器学习社区的最新图书馆、开发和研究吗?
加入我的邮件列表,获取我的数据科学内容的更新。当你注册的时候,你还会得到我免费的解决机器学习问题的逐步指南!
来源
- T.布朗,b .曼,n .赖德等。语言模型是少量学习者,(2020),arXiv.org。
- A.Abid,M. Farooqi 和 J. Zou,大型语言模型中持续的反穆斯林偏见,(2021),arXiv.org。
- 维基百科,人工通用智能,(2021),维基百科免费百科。
- G.Brockman,M. Murati,P. Welinder 和 OpenAI, OpenAI API ,(2020),OpenAI 博客。
- A.瓦斯瓦尼,n .沙泽尔等人。al,注意力是你所需要的全部,(2017),第 31 届神经信息处理系统会议。
IMU 是什么?
IMU(惯性测量单元)是以时间序列格式提供运动数据的常用传感器之一。在本帖中,我们来回顾一下。
简介
IMU(惯性测量单元)传感器提供时间序列数据,用于人类活动识别问题、跟踪和导航问题等。在人工智能时代,这种廉价而可靠的传感器可以提供大量数据,因此人们可能会使用机器/深度学习将其推广到各个领域的许多有用的见解。
我们在哪里可以找到 IMU 传感器?
实际上,几乎到处都是!先说我们的智能手机。大多数智能手机设备内部都配备了 IMU 传感器,这是一种 MEMS(微机电系统)技术。很多平板设备里也有。IMU 在汽车和航空工业中非常常见,因为它可以更好地确定车辆的位置和方向。
总体描述
惯性测量单元是导航领域常见的传感器之一(但不是唯一的)。它包含一个加速度计和陀螺仪(有时也有一个磁力计,很少也有一个气压计)。第一个负责加速度测量,第二个负责角速度测量。每一个度量都在三轴坐标系中表示,所以一般来说,它们一起产生 6 维度量时间序列流。
作者图片
它是如何工作的?
因此,让我们针对 4 种不同的传感器将讨论分为 4 个部分:
1.加速度计是一种测量特定力的传感器(身体质量将力归一化)。它在其局部框架中提供 x、y 和 z 轴上的加速度。
2.陀螺仪是一种传感器,在其局部坐标系中测量围绕 x、y 和 z 轴的角速度。一般来说,对测量结果进行积分会得到角度本身。
3.磁力计是一种测量地球磁场并提供航向的传感器(指南针就是这样一种设备)。如果它包含在 IMU 中,我们通常称之为“9 轴 IMU”
4.气压计是一种测量气压的传感器,可以提供海拔高度。
阿波罗 11 号惯性测量单元
跟踪关系及主要缺点
IMU 的一个主要缺点是当为了找到位置而单独将它们与导航方程结合时会产生累积误差。例如,噪声加速度的双重积分导致不准确的位置解,最终导致巨大的漂移。因此,许多跟踪/导航应用使用额外的传感器,例如 GNSS 接收器和照相机。这些传感器以较低的频率提供位置信息,并提供累积误差的复位。
作者图片
利用 IMU 传感器数据解决 HAR 问题
其中一个著名的时间序列数据集是 2014 年发布的包含记录的 IMU 信号的人类活动识别。以 50[Hz]的频率对一些活动的集合进行标记和存储。它被广泛用于评估最先进的时间序列分类算法。要了解更多,可以参考原论文。建立了许多算法来仅基于 IMU 信号识别人类活动,因为它可以被公式化为分类问题。与图像/视频等相比,将 IMU 信号用于 HAR 的主要优势。,就是数据量小。这个优点允许 HAR 分类器的紧凑表示。
总结和个人笔记
IMU 是世界范围内常见的传感器之一,几乎在任何地方都被用于各种任务。2021 年,我创办了阿尔玛理工。LTD 仅提供 IMU 导航解决方案。我邀请你关注我们的 LinkedIn:【https://www.linkedin.com/company/alma-tech-ltd/】T4。感谢你阅读这篇文章。
进一步阅读
[1]一些生产和销售 IMU 的伟大公司有 VectorNav 、 WIT-motion 和 Sparton 。
[2] Anguita,Davide 等,“使用智能手机进行人类活动识别的公共领域数据集。”埃桑。第三卷。2013.
— — — — — — — — — — — — — — — — — — — — — — — —
关于作者
Barak 获得了以色列理工学院的航空工程学士学位(2016 年)、硕士学位(2018 年)以及经济和管理学士学位(2016 年,成绩优异)。他曾在高通工作(2019-2020),在那里他主要研究机器学习和信号处理算法。巴拉克目前正在海法大学攻读博士学位。他的研究兴趣包括传感器融合、导航、深度学习和估计理论。
什么是 Isomap?
如何借鉴和减少复杂高维的形状?
介绍
我们无法将 3 维以上的高维数据可视化。那么,当我们面对这种几乎在每个数据科学应用中都很常见的情况时,我们该怎么办呢?像 PCA 这样的降维技术经常失败,因为这些方法有一个简单的假设:数据可以线性减少。然而,对于大多数类型的高维数据,可能存在非线性关系,因此我们需要在降维时保持这种形状。这就是像 Isomap 这样的多种学习技术发挥作用的地方。
注意:我将在后续文章中讨论许多其他多样的学习技巧,所以也要留意这一点!
你可以把流形想象成一个形状或曲面。这意味着 Isomap 正在尝试学习数据的形状。从高层次来看,这比看起来要简单。然而,理解这项技术试图做到这一点的细微差别可能需要一些时间。
Isomap
Isomap 是 等距映射的简称。 该映射的目标是保持两点之间的测地线距离。测地线更正式的定义是表面上的最短路径。通过了解成对测地线距离,Isomap 的目标是在将数据向下投影到指定的维度之前近似数据的几何。Isomap 分 3 个主要步骤运行:【1】
- 构建一个邻域图,通常通过 k-最近邻
- 通过 Dijkstra 算法或 Floyd-Warshall 算法计算两点之间的最短路径。
- 通过部分特征值分解构造 d 维嵌入(即取核的 d 个最大特征值。
以下是 Isomap 如何在两个用于流形学习可视化的基础数据集上操作,即 S 曲线和瑞士卷。
s 曲线:
首先,使用sklearn.datasets
,我们将在s-curve
上生成 1000 个点。
现在我们已经生成了 S 曲线,让我们利用 Isomap 尝试将其降低到二维。
就像在k-Nearest Neighbors
中一样,邻居的数量是一个需要调整以获得理想性能的参数。虽然我用 35 向您展示了实现流形学习过程的最佳可能方式,但是使用这段代码并调整n_neighbors
参数来看看这如何影响最终的形状。
正如我们所看到的,S 曲线的黄色部分距离 3d 图中的深紫色/蓝色最远,这意味着我们希望流形的这些部分彼此相距最远,这是在最短路径构造过程中实现的。
瑞士卷:
现在,使用相同的模块,我们将在一个swiss_roll
上生成 1000 个点。
现在,使用 Isomap,我们也将尝试从这个形状中学习。
同样,我们能够像s-curve
一样“展开”形状。在我们能够区分和分离彼此相距较远的形状段的情况下,上述相同的性质也成立。此外,由于上面列出的第 2 步和第 3 步,我们还允许相互靠近的形状段能够在距离上更近。
最后的想法
到目前为止,对于 Isomap 如何尝试从不同的形状中学习,我们应该有了一个坚实的直觉。虽然这些数据集通常用于获得关于这些类型的算法如何执行的直觉,但尝试从非常高维的数据中创建和学习以很好地理解这如何在大规模下工作是很重要的。
如果有什么问题,欢迎在下面留言!感谢您的阅读。
所有图片均为作者所有,除非另有说明。
参考
***【1】***特南鲍姆,J.B 德席尔瓦五世;非线性降维的全局几何框架。理科 290 (5500)
NLP 模型和圣经中的名字有什么关系?
不同 NER 模型的比较及其检测不同命名实体的能力。
GIF via giphy——来源:http://www.amc.com/shows/breaking-bad
这篇博客文章强调了 spaCy 和其他命名实体识别模型无法准确检测人名的问题,特别是如果他们是圣经中的名字。常规名字和圣经名字之间的检测差异是相当大的。
你会看到,对于我们能想到的最简单的例子,“我的名字是 X”,圣经中的名字几乎从来没有被发现是人名。
我试图弄清楚这件事,并相信我有一个答案。但首先,让我们用两个 spaCy 模型(使用 spaCy 版本 3.0.5)做一个简短的实验。
比较圣经名字和其他名字的检出率
为什么一开始就有区别?不同检测率的原因可能是:
- 事实上,圣经中的名字有时更老,更不常见(因此在模型被训练的数据集中可能不太常见)。
- 周围的句子不太可能与原始数据集中的特定名称同时出现。
- 数据集本身的问题(例如人为的错误注释)。
为了(简单地)测试这些假设,我们将圣经中的名字与新旧名字以及三个模板进行比较,其中两个模板来自圣经:
- “我的名字是 X”
- " X 说,你为什么连累我们?"
- 她又怀孕,生了一个儿子。她叫他的名字 x。”
让我们从创建名单和模板开始:
运行空间模型并检查是否检测到“人”的方法:
模型 1: spaCy 的en_core_web_lg
模型
- 该模型使用原始(不基于变压器)空间架构。
- 它在on notes 5.0数据集上进行训练,并在命名实体上具有 0.86 F-measure。
加载模型:
让我们运行它:
以下是我们得到的结果:
Model name: en_core_web_lg
Name set: Biblical, Template: "My name is {}"
Recall: 0.25Name set: Other, Template: "My name is {}"
Recall: 0.94Name set: Biblical, Template: "And {} said, Why hast thou troubled us?"
Recall: 0.67Name set: Other, Template: "And {} said, Why hast thou troubled us?"
Recall: 0.94Name set: Biblical, Template: "And she conceived again, a bare a son; and she called his name {}."
Recall: 0.58Name set: Other, Template: "And she conceived again, a bare a son; and she called his name {}."
Recall: 0.94Detailed results:
{('And she conceived again, a bare a son; and she called his name {}.', 'Biblical'): {
'Abraham': True,
'David': True,
'Isaac': False,
'Jacob': False,
'Jesus': False,
'John': True,
'Judas': False,
'Mary': True,
'Matthew': True,
'Moses': False,
'Samuel': True,
'Simon': True},('And she conceived again, a bare a son; and she called his name {}.', 'Other'): {
'Ariana': True,
'Barack': True,
'Beyonce': True,
'Bill': True,
'Charles': True,
'Coby': False,
'Donald': True,
'Frank': True,
'George': True,
'Helen': True,
'Joe': True,
'Katy': True,
'Lebron': True,
'Margaret': True,
'Robert': True,
'Ronald': True,
'William': True},('And {} said, Why hast thou troubled us?', 'Biblical'): {
'Abraham': True,
'David': True,
'Isaac': True,
'Jacob': False,
'Jesus': False,
'John': True,
'Judas': False,
'Mary': True,
'Matthew': True,
'Moses': False,
'Samuel': True,
'Simon': True},('And {} said, Why hast thou troubled us?', 'Other'): {
'Ariana': True,
'Barack': True,
'Beyonce': True,
'Bill': True,
'Charles': True,
'Coby': False,
'Donald': True,
'Frank': True,
'George': True,
'Helen': True,
'Joe': True,
'Katy': True,
'Lebron': True,
'Margaret': True,
'Robert': True,
'Ronald': True,
'William': True},('My name is {}', 'Biblical'): {
'Abraham': True,
'David': False,
'Isaac': False,
'Jacob': False,
'Jesus': False,
'John': False,
'Judas': False,
'Mary': True,
'Matthew': True,
'Moses': False,
'Samuel': False,
'Simon': False},('My name is {}', 'Other'): {
'Ariana': True,
'Barack': True,
'Beyonce': True,
'Bill': True,
'Charles': True,
'Coby': False,
'Donald': True,
'Frank': True,
'George': True,
'Helen': True,
'Joe': True,
'Katy': True,
'Lebron': True,
'Margaret': True,
'Robert': True,
'Ronald': True,
'William': True}}
所以圣经名字检测和其他名字有很大的区别。
模型 2:斯帕西的en_core_web_trf
模型
spaCy 最近发布了基于 huggingface transformers 库的新模型en_core_web_trf
,也在 OntoNotes 5 上进行了训练。
让我们试试这个模型:
这次我们得到了:
Model name: en_core_web_trf
Name set: Biblical, Template: "My name is {}"
Recall: 0.50Name set: Other, Template: "My name is {}"
Recall: 1.00Name set: Biblical, Template: "And {} said, Why hast thou troubled us?"
Recall: 0.00Name set: Other, Template: "And {} said, Why hast thou troubled us?"
Recall: 0.11Name set: Biblical, Template: "And she conceived again, a bare a son; and she called his name {}."
Recall: 0.00Name set: Other, Template: "And she conceived again, a bare a son; and she called his name {}."
Recall: 0.50Detailed results:
{('And she conceived again, a bare a son; and she called his name {}.', 'Biblical'): {
'Abraham': False,
'David': False,
'Isaac': False,
'Jacob': False,
'Jesus': False,
'John': False,
'Judas': False,
'Mary': False,
'Matthew': False,
'Moses': False,
'Samuel': False,
'Simon': False},('And she conceived again, a bare a son; and she called his name {}.', 'Other'): {
'Ariana': True,
'Barack': True,
'Beyonce': True,
'Bill': False,
'Charles': False,
'Coby': False,
'Donald': True,
'Frank': True,
'George': False,
'Helen': False,
'Joe': True,
'Katy': True,
'Lebron': False,
'Margaret': False,
'Robert': False,
'Ronald': True,
'William': False},('And {} said, Why hast thou troubled us?', 'Biblical'): {
'Abraham': False,
'David': False,
'Isaac': False,
'Jacob': False,
'Jesus': False,
'John': False,
'Judas': False,
'Mary': False,
'Matthew': False,
'Moses': False,
'Samuel': False,
'Simon': False},('And {} said, Why hast thou troubled us?', 'Other'): {
'Ariana': False,
'Barack': True,
'Beyonce': True,
'Bill': False,
'Charles': False,
'Coby': False,
'Donald': False,
'Frank': False,
'George': False,
'Helen': False,
'Joe': False,
'Katy': False,
'Lebron': False,
'Margaret': False,
'Michael': False,
'Robert': False,
'Ronald': False,
'William': False},('My name is {}', 'Biblical'): {
'Abraham': False,
'David': True,
'Isaac': True,
'Jacob': False,
'Jesus': False,
'John': True,
'Judas': False,
'Mary': True,
'Matthew': True,
'Moses': False,
'Samuel': True,
'Simon': False},
('My name is {}', 'Other'): {
'Ariana': True,
'Barack': True,
'Beyonce': True,
'Bill': True,
'Charles': True,
'Coby': True,
'Donald': True,
'Frank': True,
'George': True,
'Helen': True,
'Joe': True,
'Katy': True,
'Lebron': True,
'Margaret': True,
'Robert': True,
'Ronald': True,
'William': True}}
虽然数字不同,但我们仍然看到两组之间的差异。然而,这一次似乎老名字(如海伦、威廉或查尔斯)也是该模型正在努力解决的问题。
这是怎么回事?
作为我们在 Presidio (数据去识别工具)上工作的一部分,我们开发了检测 PII 实体的模型。为此,我们从现有的 NER 数据集中提取模板句子,包括 CONLL-03 和 OntoNotes 5。这个想法是用额外的实体值来扩充这些数据集,以便更好地覆盖姓名、文化和种族。换句话说,每当我们在数据集上看到一个带有标记人名的句子,我们就提取一个模板句子(例如The name is [LAST_NAME], [FIRST_NAME] [LAST_NAME]
),然后用多个样本替换它,每个样本包含不同的名字和姓氏。
当我们手动检查模板结果时,我们发现在新的模板数据集中仍然有许多名字没有转换成模板。这些名字大部分来自于 OntoNotes 5 中包含的圣经句子。因此,OntoNotes 5 中的许多样本不包含任何个人标签,即使它们包含名称,这是 OntoNotes 数据集声称支持的一种实体类型。看起来这些模型实际上学习了数据集中的错误,在这种情况下,如果名字符合圣经,就忽略它们。
显然,在训练集和测试集中都会发现这些错误,所以一个知道圣经中的名字并不是真正的名字的模型在类似的测试集中也会成功。这是另一个例子,说明为什么 SOTA 的结果不一定是展示科学进步的最佳方式。
只是空间吗?
对两个 Flair 模型的类似评估显示,在 OntoNotes 上训练的 a 模型在该测试中取得的结果明显较低。基于 CONLL 的模型实际上做得很好!
基于 CONLL-03 的模型结果:
Model name: ner-english (CONLL)
Name set: Biblical, Template: "My name is {}"
Recall: 1.00
Name set: Other, Template: "My name is {}"
Recall: 1.00
Name set: Biblical, Template: "And {} said, Why hast thou troubled us?"
Recall: 1.00
Name set: Other, Template: "And {} said, Why hast thou troubled us?"
Recall: 1.00
Name set: Biblical, Template: "And she conceived again, a bare a son; and she called his name {}."
Recall: 1.00
Name set: Other, Template: "And she conceived again, a bare a son; and she called his name {}."
Recall: 0.94
基于本体注释的模型结果:
Model name: ner-english-ontonotes
Name set: Biblical, Template: "My name is {}"
Recall: 0.50
Name set: Other, Template: "My name is {}"
Recall: 1.00
Name set: Biblical, Template: "And {} said, Why hast thou troubled us?"
Recall: 0.00
Name set: Other, Template: "And {} said, Why hast thou troubled us?"
Recall: 0.83
Name set: Biblical, Template: "And she conceived again, a bare a son; and she called his name {}."
Recall: 0.00
Name set: Other, Template: "And she conceived again, a bare a son; and she called his name {}."
Recall: 0.00
结论
spaCy 是当今 NLP 中发生的最令人兴奋的事情之一,它被认为是世界上最成熟、准确、快速和记录良好的 NLP 库之一。如 Flair 示例所示,这是 ML 模型中的固有问题,尤其是 ML 数据集。
总结三个相关要点:
- 吴恩达最近认为ML 社区应该更加以数据为中心,而不是以模型为中心。这篇文章是另一个证明这一点的例子。
- 这是另一个关于主要 ML 数据集的问题的例子。
- 像清单这样的工具确实有助于验证你的模型或数据不会遭受类似的问题。一定要去看看。
这篇博文的 Jupyter 笔记本可以在这里https://gist.github.com/omri374/95087c4b5bbae959a82a0887769cbfd9找到。
关于作者: Omri Mendels 是微软首席数据科学家。
什么是无似然推理,它有哪些用例?
探索数据科学
无似然推理和元学习的进步让亚瑟·佩萨(UCL 大学量子计算专业的博士生)和安托万·韦汉高(比利时国家科学研究基金会的博士生)感到好奇:“我们能否建造一台机器,它将可调整的模拟器和真实数据作为输入,并返回最符合一些真实数据的模拟器版本?“阅读这篇令人大开眼界的文章,了解他们的发现。它提供了多种 gif 和图表,以方便您探索这些复杂的概念。
什么是线性回归?
线性回归是数据科学家和机器学习实践者的基本工具之一
概观
本教程是关于线性回归的基础。这也是机器学习入门文章“什么是机器学习?”,可以在这里找到。
那么什么是线性回归呢?
线性回归是数据科学家和机器学习实践者的基本工具之一。我们引用“什么是机器学习?”中的等式y = mx + b
post,可以认为是线性回归的基础。线性回归模型具有高度的可解释性,训练速度快,可以提供对数据的洞察,并进一步优化以做出更好的预测。如果您刚刚开始学习数据科学或机器学习,深入线性回归以了解如何使用函数来估计数据是一个好主意。
线性回归和 y = mx + b 方程有什么关系?
公式很像!对于线性回归,我们通常将等式写成:
线性回归方程
或者没有乘法符号:
线性回归方程图 2
不要担心,它没有看起来那么复杂!
让我们来看看这个等式
y 是什么?
我们仍然有y
,就像在y = mx + b
中一样,这是输出。这是您所关心的 y 轴值,并希望找到影响它的列或特性。
β0 是什么?
我们也有β0,读作“Not ”,并认为这是 y 截距,在y = mx + b
中是b
。
βx 的东西呢?
既然你知道我们有来自y = mx + b
的y
和b
,那么我们还有mx
。如果你猜对了,这就是我们看到的βx 或βx 对应的 x。贝塔就像y = mx + b
中的斜坡或m
。x 是来自数据的输入。x
的一个例子可以是你在一个项目中投入的营销资金,然后你想让y
告诉你大概从中获得了多少收入。因为在线性回归和机器学习中,我们通常有不止一个x
或一列数据来帮助我们确定它与y
的关系,所以我们也有许多 Betas 来与那些众多的x
配对。这就像你的y = mx + b
等式中有多个mx
一样。
那么贝塔到底是什么?
至于β,这就是所谓的系数。这些非常重要,从本质上解释了你的模型。这些是来自线性回归的权重和学习值,可告诉您每个要素或列对预测或 y 轴变量的影响程度。
好吧,那最后一个希腊字母ε是什么?
那个希腊字母是 epsilon。这实质上意味着你的模型中会有一些无法解释的误差。另一种说法是,你可能无法用这个简短的等式解释数据中发生的所有事情,所以我们在最后加上ε,表示只是发生了一些我们现在无法解释的错误或噪声。
让我们看一个例子
对于这个例子,我们真的只需要 Scikit Learn。如果你不熟悉 Scikit Learn,它是最流行的运行机器学习算法的 Python 库之一。我将创建一些关于房价的假样本数据。我将创建卧室数量,浴室数量,平方英尺的列,然后是房子的价格。在本例中,将房屋价格视为 y 轴或y
,所有其他列视为等式中的倍数x
。通过线性回归模型运行数据后,我们应该看到它们是如何影响房价的。
注意:我将生成一些样本数据,并使用 Numpy 将数据存储在一个对象中。这并不是运行线性回归所特别需要的,只是为了举例而使用。
进口
这里我们导入库 Numpy 和 Scikit Learn。Numpy 用于创建数据结构,而 scikit learn 用于许多机器学习用例。
*# Import numpy to create numpy arrays*
**import** **numpy** **as** **np***# Import Scikit-Learn to allow us to run Linear Regression*
**from** **sklearn.linear_model** **import** LinearRegression
创建一些示例数据
我们在这里创建的数据是一些关于房价及其各自特征的虚假样本数据,这些特征与卧室、浴室的数量及其面积相关联。
注:这些价格以 100k 为单位。所以 150 实际上意味着 150,000 美元,而不仅仅是 150 美元。
*# Creating sample data*
*# Price is represented in 100k dollars*
price = np.array([150, 500, 225, 975, 735, 950, 325, 680, 220, 330])
beds = [2, 4, 3, 5, 4, 5, 3, 4, 2, 3]
baths = [1, 2, 2, 3, 2, 3, 2, 2, 1, 2]
sq_ft = [1100, 2800, 1500, 4800, 3500, 5000, 2200, 3100, 1650, 2000]
结构化数据
这两行用于正确地形成数据,以便与 scikit learn 一起使用。我们将多个数组(或 x)堆叠成一个 numpy 对象。同时还指定价格数组的“形状”。
*# Combining the multiple lists into one object called "X"*
X = np.column_stack([beds, baths, sq_ft])*# Reshaping the price list to work with scikit learn*
y = price.reshape(-1, 1)
创建线性回归模型
现在,我们可以使用下面这条线创建线性回归模型的外壳。
*# Instantiating the model object*
model = LinearRegression()
一旦我们创建了外壳,我们需要用数据来拟合模型。这就是我们如何获得 Beta 值,并找到一些函数,可以近似一所房子的价格,给定它的卧室,浴室的数量,以及它的平方英尺。
*# Fitting the model with data*
fitted_model = model.fit(X, y)
我们训练了一个线性回归模型!现在让我们看看这些系数,并解读它们的含义。
The coefficient, or the beta one value, for number of bedrooms = 115.55210418237826The coefficient, or the beta two value, for number of bathrooms = -112.47160198590979The coefficient, or the beta three value, for square footage = 0.18603883444673386The y-intercept, or the 'beta not' value =
-184.8865379117235
解释模型及其系数
那么这些β值或系数意味着什么呢?
先说 y 截距 a.k.a β0 或者“Not”。
这个值大约是-184.89,那么这意味着什么呢?这意味着,如果我们有 0 间卧室,0 间浴室,0 平方英尺(所有的都是 0 ),我们最终会得到-184k 的负价格。显然这是不现实的,但是请记住,这样的模型并不了解房价是如何运行的。真的就把这当成 y 轴截距,不管它在这种情况下是否有意义。
接下来让我们看看其他系数。
从卧室数量开始,系数值约为 115.56。这意味着,如果卧室的数量增加一间(而其他投入没有变化),房屋的价格将平均增加约 11.5 万美元。这与平方英尺系数相同,只是如果平方英尺增加 1 平方英尺,价格将平均增加 0.19 万美元。将系数视为斜率值或y = mx + b
中的m
。随着x
的增加,在卧室的情况下,斜率约为 115.56,并使 y 轴增加这个数值。
负系数和浴室是怎么回事?
这是一个很棒的问题。这意味着浴室数量每增加一个,模型预计价格会下降 11.2 万美元。这就是为什么我们看到一个负值。这有道理吗?不完全是。然而,这是一个很好的示例问题,展示了你可以有负系数,以及我们如何解释它们。在机器学习中,我们还必须警惕共线性,或者当多个特征彼此高度相关时。此外,更多的数据有助于欠拟合机器学习模型。
接下来你会怎么做?
关于如何使您的模型更好的一些后续步骤包括:
- 添加更多行数据
- 规范化您的数据。在 0 和 1 之间或-1 和 1 之间缩放每一列以帮助建模。当您不缩放数据时,模型的学习会变得很困难,因为它可能会对自然值较高的要素进行加权,比其他要素更高。
- 使用套索或岭回归进行正则化(尝试使用对模型影响较大的要素或输入,同时降低其他要素或输入的权重)。
- 查找更多要使用的功能或列。
- 研究加法模型或其他回归模型。
结论
我希望这篇教程是有启发性的,你可以学到关于线性回归的知识。线性回归是任何数据科学家工具箱中的基本工具。您可以查看系数,并尝试了解哪些数据会影响您的模型。您可以使用线性回归作为基线工具来确定其他模型是否可能更好。线性回归训练速度快,不需要大量数据。虽然,在很多情况下可能太简单了。所以,不要把更复杂的方法或者额外的方法算出来,让你的线性模型更好!