联合学习:一种新的人工智能商业模式
联合学习不仅是一项有前途的技术,也是一种全新的人工智能商业模式。事实上,作为一名顾问,我最近受命就一家医疗保健公司如何通过创建联合学习框架与一些竞争对手建立“数据联盟”提出建议。这篇文章的目标是向你解释 FL 将如何产生一个新的数据生态系统和创建数据联盟。
什么是联邦学习(FL) ?
在不涉及太多技术细节的情况下,FL 可以被定义为一个分布式机器学习框架,它允许从分布在数据所有者之间的数据构建一个集体模型。
AI 项目需要的数据涉及多个要素。我会说,我们创造伟大的人工智能项目的能力总是有限的。对外部数据的访问非常受限,这是构建高级人工智能应用程序的一个现实问题。更糟糕的是,由于行业竞争、隐私安全和其他管理程序,即使是同一公司不同部门之间的数据集成也是一个挑战。
总的来说,集中式 ML 远非完美。事实上,训练模型需要公司积累大量相关数据到中央服务器或数据中心。在一些项目中,这意味着收集用户的敏感数据。
因此,大多数企业往往无法实现集中式机器学习。不用说,收集项目所需的所有数据的“简单”任务是相当昂贵和耗时的。
在从事 ML 项目时,我经常会遇到两个问题:
根据项目的不同,您需要的数据的所有者可能只是不想与您的公司共享这些数据。当涉及竞争敏感数据或受法律保护的医疗数据时,情况就是如此。
其次,大量有价值的训练数据是在缓慢且不可靠的网络边缘的硬件上创建的,例如智能手机或工业设施中的设备。我意识到,对于公司来说,使用这样的设备进行沟通可能会很慢,而且成本很高。
联合学习为与传统机器学习相关的大多数问题带来了答案。事实上,算法训练转移到了网络的边缘,因此数据永远不会离开设备,无论是手机还是医院分支机构的服务器。一旦模型从数据中学习,结果被上传并与来自网络上所有其它设备的更新相结合。改进后的模型将在整个网络中共享。(1)
新的商业模式?
云计算模式正受到前所未有的挑战。公司不能再忽视数据隐私和数据安全日益增长的重要性。而且一个公司的利润和它的数据之间的关系在 AI 时代越来越明显。然而,联合学习的商业模式为利用数据的应用提供了一个新的范例。
联合学习的目标是,当每个公司使用的独立数据集无法创建准确的模型时,联合学习的机制使公司可以共享统一的模型,而无需直接的数据交换。企业将有可能获得更多数据,更好地训练它们的模型。
公平的数据共享可以通过从每一方建立的子模型建立一个元模型来实现,以便只传输模型参数,或者通过使用加密技术来允许不同方之间的安全通信。区块链技术也有助于加强数据控制。
简而言之,联合学习使不同的数据所有者在组织层面上协作和共享他们的数据成为可能。在最近的一篇论文中,研究人员(杨强等人)设想了发生这种情况的不同配置。
纵向和横向联合学习
让我们以来自同一个国家的两家银行为例。尽管它们有不重叠的客户群,但是它们的数据将有相似的特征空间,因为它们有非常相似的业务模型。在水平联合学习的例子中,他们可能会走到一起合作。
在垂直联合学习中,两家提供不同服务(如银行和电子商务)但拥有大量客户的公司可能会在他们拥有的不同特征空间上找到合作空间,从而为双方带来更好的结果。
在这两种情况下,由于区块链技术等原因,数据所有者可以在不泄露各自客户隐私的情况下进行协作。他们都将获得更多数据,以更好地改善他们的人工智能计划。
现在,联合学习似乎非常适合医疗保健和银行业。对于银行,我们可以想象一个系统,其中多家银行可以训练一个通用的强大的欺诈检测模型,而无需通过联合学习相互共享敏感的客户数据。关于医院和其他医疗保健机构,如果他们同意以保护隐私的方式共享用于模型训练的患者数据,他们可能会受益。
建立数据联盟
当我负责围绕联合学习框架建立数据联盟时,我注意到公司通常对数据隐私非常怀疑。事实上,他们都不想通过分享他们的数据来帮助竞争。主要的挑战将在这里…如何说服公司打开他们的数据战箱,并与他人分享?
我的观点是,这种基于联合学习的新商业模式必须得到工业数据联盟的支持,否则注定会失败。联盟可以有几个实体,通过加入联盟,实体可以在联邦学习框架下使用数据进行合作。
我正在研究的数据联盟将是这样的:
它将是一个多方系统,由两个或两个以上的组织组成联盟,通过联合学习在各自的数据集上训练共享模型。将鼓励选定的公司和组织加入该联盟,该联盟将有明确的激励机制。
我认为,为了将不同组织间的联合学习完全商业化,需要开发一个公平的平台和激励机制。
联盟成员享有权利和利益,也履行责任。在我看来,联盟必须利用区块链来建立各方的共识,在一个永久的数据记录机制中记录各方的贡献,并奖励做出突出贡献的各方。
“保持数据私有是每个参与实体实现共同目标的联合学习的主要附加值。”(2)
我建议依靠中立的第三方。他们可能负责“提供基础设施来聚合模型权重,并在联盟中的公司之间建立信任”。(3)
此外,数据结构和参数通常是相似的,但不需要相同,但在每个客户端需要大量预处理来标准化模型输入。一个中立的第三方可以完美地处理项目的这一部分。
目前,数据孤岛和对数据隐私的关注是人工智能的重要挑战,但联合学习可能是一个解决方案。它可以为多个组织建立一个统一的模型,同时保护本地和敏感数据,以便他们可以共同受益,而不必担心数据隐私。
联合学习的挑战
将联合学习从概念过渡到生产并非没有挑战。事实上,在联邦学习的效率和准确性方面已经取得了很多成就,在我看来,更重要的挑战与安全性有关。
联合学习的关键因素是保护与数据相关的隐私。似乎即使没有公开实际数据,也可以利用重复的模型权重更新来揭示不是对数据全局的而是对单个贡献者特定的属性。( 4
这种推断既可以在服务器端执行,也可以在客户端执行。一个可能的解决方案是使用“差别隐私”技术来降低这种风险。
结论
联合学习使得在监管和竞争行业中应用机器学习变得更容易、更安全、更便宜。通过 FL,公司可以改进他们的模型,增强他们的人工智能应用。在医学领域,FL 可能是更好的治疗和更快的药物发现的同义词。
我认为,当前大公司为了竞争优势而集中汇总数据和创建孤岛的思维模式将是推动采用联合学习的主要障碍。大多数公司最近才开始他们的人工智能之旅……我们将需要有效的数据保护政策、适当的激励措施和围绕分散数据的商业模式,以解决这些问题并开发联合人工智能生态系统。
简而言之,我期望在许多垂直市场中看到更多的工业数据联盟,例如,金融行业可以形成金融数据联盟,而医疗行业可以形成医疗数据联盟。从长远来看,我们还可以期待来自不同行业但拥有相同人工智能愿景的公司之间的数据联盟。
如果你有兴趣有更多的技术细节,我推荐这个 网站 。
联合学习和隐私保护人工智能
通过联合学习,保护用户隐私安全,并使您的模型训练有素。
上个月,我在寻找一些在我的新项目中使用的技术,然后,我发现了一些关于从保持隐私的人那里获得训练数据的东西。我了解到这被称为“联合学习”,这是机器学习保持数据隐私的最佳方式。但是它是如何工作的呢?请继续阅读,寻找答案!
from slideshare.net
联合学习与一个设备网络一起工作,这些设备能够在没有中央服务器的情况下进行自我培训,因此我们可以将联合学习定义为分散式学习,我们用作培训平台的设备是我们的智能手机,足够智能来做到这一点。使用这种技术,我们不仅可以保护用户的隐私,还可以改善用户的体验。
那么它是如何工作的呢?设备只有在有资格参与时才能参与(空闲状态),但开发人员正在努力将对性能的影响降至最低。然后,符合条件的设备只从自身获取有用的数据,并将其放入数据集,利用该数据集训练模型,然后将其发送到服务器,服务器只获取加密数据,而不使用密钥。然后,服务器可以在没有数据本身的情况下读取经过训练的模型。
但是服务器怎么区分我最近的搜索是不是例外呢?也许有人有对模型没有用的独特数据,所以我们需要通过限制手机对模型的贡献来排除这些数据,并添加噪声来掩盖罕见的数据。这被称为差分隐私,当共享模型的参数受唯一数据影响太大时非常有用。
如果设备忙于训练,我们如何测试模型?我们可以使用其他设备来测试我们的模型!通过这种方式,我们可以在每天使用模型的用户手中测试模型。然后我们就有了一个由同型号的训练员和测试员私下组成的网络,没有任何侵犯隐私的地方!
一个真实的例子是在医疗保健行业,由于严格的隐私保护法律,组织不能获取患者的数据并使用它们来训练一个可以有效帮助他们的模型。联合学习可以保护患者的隐私,同时也可以利用数据。英特尔与宾夕法尼亚大学生物医学图像计算和分析中心成功演示了联合学习如何应用于医学成像,要了解更多信息,请点击此处。
最后,联合学习是训练一个完美模型的最好方法,我认为几年后它将无处不在,但它也是现在。使用联合学习的应用程序的一个例子是我开始写这篇文章的 Gboard,在这种情况下,键盘可以建议你输入单词,分析你以前在网上做过的任何事情。
如果你想了解更多关于联邦学习的知识,我推荐你访问 https://federated.withgoogle.com/。
前馈神经网络简介
深度前馈网络或者也称为 多层感知器 是大多数 深度学习 模型的基础。像CNN和 RNNs 这样的网络只是前馈网络的一些特例。这些网络主要用于 监督机器学习 任务,其中我们已经知道目标功能,即我们希望我们的网络实现的结果,并且对于实践机器学习极其重要,并且形成了许多商业应用的基础,这些网络的存在极大地影响了诸如 计算机视觉 和 NLP 等领域。
前馈网络的主要目标是逼近某个函数 f*。例如,回归函数 y = f *(x)将输入 x 映射到值 y。前馈网络定义了映射 y = f(x;θ)并学习导致最佳函数逼近的参数θ的值。
这些网络被称为前馈网络的原因是,信息流发生在正向,因为 x 用于计算隐藏层中的某个中间函数,该中间函数又用于计算 y。在这种情况下,如果我们将最后一个隐藏层的反馈添加到第一个隐藏层,它将代表一个递归神经网络。
这些网络由许多不同功能的组合来表示。每个模型都与描述功能如何组合在一起的非循环图相关联。例如,我们可能有三个函数 f (1)、f (2)和 f (3)连接成一条链,形成 f (x) = f(3)(f (2)(f (1)(x))。其中 f(1)是第一层,f(2)是第二层,f(3)是输出层。
输入层和输出层之间的层称为隐藏层,因为训练数据不会显示这些层的预期输出。网络可以包含任意数量的隐藏层和任意数量的隐藏单元。一个单元基本上类似于一个神经元,它接受来自前几层单元的输入,并计算自己的激活值。
现在出现了一个问题,当我们有线性机器学习模型时,为什么我们需要前馈网络,这是因为线性模型仅限于线性函数,而神经网络不是。当我们的数据不是线性的时,可分离的线性模型在逼近时会遇到问题,而对于神经网络来说却很容易。隐藏层用于增加非线性并改变数据的表示,以便更好地概括函数。
对于设计任何前馈神经网络,有一些事情你需要决定,大多数网络需要一些成分,其中一些对于设计机器学习算法是相同的。
【计算机】优化程序
优化器或优化算法用于最小化成本函数,这在每个训练周期或时期之后更新权重和偏差的值,直到成本函数达到全局最优。
优化算法有两种类型:
一阶优化算法
这些算法使用成本函数相对于参数的梯度值最小化或最大化成本函数。一阶导数告诉我们函数在特定点是减少还是增加,简而言之,它给出了与曲面相切的线。
二阶优化算法
这些算法使用二阶导数来最小化成本函数,也被称为 Hessian 。由于二阶导数的计算成本很高,所以二阶导数并不常用。**二阶导数告诉我们一阶导数是增加还是减少,这暗示了函数的曲率。**二阶导数为我们提供了一个二次曲面,它触及误差曲面的曲率。
有许多算法用于优化,例如:
The architecture of the feedforward neural network
网络的架构
网络的架构是指**网络的结构即隐藏层数和每层中隐藏单元的数量。根据通用逼近定理具有线性输出层和至少一个具有任何“挤压”激活函数的隐藏层的前馈网络可以从一个有限维空间到另一个空间以任何期望的非零误差量逼近任何 Borel 可测函数,只要网络被给予足够的隐藏单元。**这个定理简单地陈述了无论我们试图学习什么函数,总有一个 MLP 能够代表这个函数。
我们现在知道总会有一个 **MLP 能够解决我们的问题,但是没有特定的方法来确定这个架构。**没有人可以说,如果我们使用 n 个层和 M 个隐藏单元,我们将能够解决给定的问题,找到这种没有试凑法的配置仍然是一个活跃的研究领域,目前只能通过试凑法来完成。
找到正确的架构很难,因为我们可能需要尝试许多不同的配置,但是即使我们有了正确的 MLP 架构,它仍然可能无法代表目标功能。发生这种情况有两个原因,首先是优化算法可能无法找到对应于所需函数的参数的正确值,另一个原因是训练算法可能由于过度拟合而选择错误的函数。
价值函数
成本函数在训练的任何一点都显示了我们的模型得出的近似值与我们试图达到的实际目标值之间的差异并且总是单值的,因为它的工作是评估网络作为一个整体如何。就像机器学习算法一样,也使用基于梯度的学习来训练前馈网络,在这种学习方法中,使用像随机梯度下降这样的算法来最小化成本函数。
整个训练过程在很大程度上取决于我们的成本函数的选择,对于其他参数模型,成本函数的选择或多或少是相同的。
在我们的参数模型定义分布 p(y | x;𝛳),我们简单地使用训练数据和模型预测之间的交叉熵作为成本函数。我们还可以采取另一种方法,通过预测以 x 为条件的 y 的一些统计量,而不是预测 y 上的完整概率分布。
为了将函数用作反向传播算法的成本函数,它必须满足两个特性:
成本函数必须能够写成平均值。
成本函数必须不依赖于输出层之外的网络的任何激活值。
成本函数主要是 C(W,B,Sr,Er)形式,其中 W 是神经网络的权重,B 是网络的偏差,Sr 是单个训练样本的输入,Er 是该训练样本的期望输出。
一些可能的成本函数是:
二次成本
quadratic cost function
这个函数也被称为均方误差、最大似然和平方和误差。
交叉熵成本
Cross-entropy cost function
这个函数也被称为伯努利负对数似然和二元交叉熵
指数成本
Exponential cost function
海灵格距离
Hellinger distance cost function
这是一个也被称为统计距离的函数。
输出单位
输出单元是存在于输出层的那些单元,它们的工作是给我们期望的输出或预测,从而完成神经网络必须执行的任务。输出单位的选择与成本函数的选择紧密相关。神经网络中任何可以作为隐单元的单元也可以作为输出单元。
可供选择的输出单位有:
线性单位
最简单的输出单元是用于高斯输出分布的线性输出单元,这些单元基于仿射变换,其不会给输出层带来非线性。给定 h 特征,线性输出层产生矢量:
linear unit function
对于线性图层,最大化对数似然相当于最小化均方误差,最大似然使得更容易获得高斯分布的协方差。
这些线性单元的优点是它们不会饱和,即它们的梯度总是保持不变,永远不会接近零,因此这些单元不会给基于梯度的优化算法带来困难。
乙状结肠单位
sigmoid unit function
为了解决二元分类问题,我们将 Sigmoid 输出单元与最大似然相结合。一个 Sigmoid 输出单元有两个组件,一个是使用线性层计算 z = w*h+b,然后使用激活函数将 z 转换为概率。当使用其他损失函数时,例如均方误差,损失可以在任何时候饱和,即梯度可以收缩得太小而对学习无用。因此,最大可能性是首选。
Softmax 单位
Softmax 单元用于众多输出分布,它用于具有 n 个可能值的离散变量的概率分布,这也可以看作是代表二元变量概率分布的 sigmoid 函数的推广。Softmax 函数由下式定义:
Softmax unit function
像 Sigmoid 函数一样,Softmax 函数也可以饱和,即梯度可以收缩得太小,对学习没有用处。在 Softmax 的情况下,由于它有多个输出单元,只有当输入值之间的差异变得极端时,这些单元才会饱和。
这些单元受赢家通吃原则支配,因为总概率总是 1 且不能超过,其 1 的值越接近 1,则其他输出单元的输出值肯定越接近 0。
隐藏单位
选择隐藏单元的类型也是积极的研究,没有特定的单元可以保证它在每个问题上都优于所有其他单元,但我们仍然有一些单元在开始时是默认选择,例如,校正线性单元或通常称为 Relu 的单元是最常用的,这是由于直观的原因而不是实验性的,在现实中,通常不可能预先预测哪一个将工作得最好。选择隐藏单元需要反复试验,凭直觉判断某种隐藏单元可能工作良好,然后进行测试。
隐藏单元的可能选择有:
整流线性单位
这些函数使用由 g(z)定义的激活函数
Relus 易于优化,因为它们类似于线性单元,它们之间的唯一区别是它们一半域的输出为 0。它们如此著名的原因是,每当单位活动时,它们总是有一个恒定的大梯度。与引入二阶效应的激活函数相比,方向的梯度对学习更有用。
ReLU 有一个缺点,即它们不能通过基于梯度的方法学习,因为它们的激活是零。
Relu 有很多概括,这些是;
绝对值整流
泄漏继电器
参数 ReLU
最大输出单位
最大输出单元应用元素式函数 g(z),最大输出单元将 z 分成 k 个值的组。然后,每个最大输出单元输出这些组之一的最大元素。最大输出单元被认为是 ReLU 的最佳概括,因为它们具有冗余,这是由于每个单元都由多个过滤器驱动而导致的,这些过滤器帮助它们抵抗灾难性遗忘,在这种遗忘中,神经网络忘记如何执行它们被训练的任务。
逻辑 sigmoid 和双曲正切
逻辑 s 形由下式给出:
Logistic sigmoid
双曲正切由下式给出:
Hyperbolic tangent
这些单元密切相关,如:
The relation between the hyperbolic tangent and sigmoid
在 **ReLU、**之前,这些是神经网络最著名的选择,但现在它们的使用被忽略了,因为当 z 非常大时它们饱和到一个高值,当 z 非常小时饱和到一个低值,并且只有当 z 接近 0 时对它们的输入非常敏感。s 形单位的普遍饱和会使基于梯度的学习变得非常困难。
2019 年 CVPR 的少数镜头学习
TL;全民博士(?)来自 CVPR 2019 的几篇论文。这些是我最初为自己写的笔记,所以不要全信。有些论文我有幸在海报会议上与作者讨论过,有些我读过,有些我只是浏览了一下。如果我做错了什么,请让我知道。
背景
少镜头物体识别最近成为热门话题(从 CVPR18 的 4 篇少镜头论文到 CVPR19 的 20 篇左右)。通常的设置是你有许多例子的类别,你可以在训练时使用;然后在测试的时候,给你一些新奇的类别(通常是 5 个),每个类别只有几个例子(通常是 1 或 5 个;称为“支持集”)并从相同的类别中查询图像。
接下来,我试着把少拍法分解到不同的家庭。虽然这些族没有被很好地定义,并且许多方法属于不止一个族。
“较老的”建议方法基于度量学习,其目标是学习从图像到嵌入空间的映射,在嵌入空间中,来自相同类别的图像靠在一起,而来自不同类别的图像相距很远。希望它能适用于看不见的类别。
随后,出现了元学习方法。这些是以当前任务为条件的模型,因此使用不同的分类器作为支持集的函数。想法是找到模型超参数和参数,使得它将容易适应新的任务,而不会过度适应可用的少数镜头。
与此同时,数据增强方法也非常流行。我们的想法是学习数据扩充,这样我们就可以从少数可用的例子中生成更多的例子。
最后,基于语义的方法正在兴起。它受零触发学习的启发,零触发学习只基于类别名称、文本描述或属性进行分类。这些额外的语义问题在缺少可视例子时也会有所帮助。
本文涉及的论文
度量学习方法
【李】等.al; 现实场景中本地化的少镜头学习 ,Wertheimer 等。al; 【密集分类与植入】用于少镜头学习 ,Lifchitz 等。al; 变型原型-编码器:用原型图像一次性学习 ,Kim et al .艾尔。
元学习方法
元学习与可微凸优化 ,李等人。al; 边缘标记图神经网络用于少拍学习 ,Kim 等。al; 少镜头学习的任务不可知元学习 ,Jamal et al .al; 元迁移学习对于少投学习 ,孙等。al; 用 GNN 去噪自动编码器生成分类权重进行少拍学习 ,Gidaris et。al;【李】等。铝
数据扩充方法
LaSO:多标签少拍学习的标签集运算网络 ,Alfassy et。al;【张】等。al;【Spot and Learn:一个用于少镜头图像分类的最大熵面片采样器 ,Chu 等。al; 图像变形元网络的一次性学习 ,陈等。铝
基于语义的方法
婴儿迈向多语义少镜头学习 ,Schwartz 等。al; 通过对齐的变分自动编码器 、Schonfeld et。al; 网:面向低镜头学习的任务感知特征嵌入 ,王等。al; 大规模少投学习:知识随班级等级转移 ,李等。铝
面目全非(其他任务的少量学习)
RepMet:用于分类和少镜头对象检测的基于代表的度量学习 ,Karlinsky 等人。al; CANet:具有迭代求精和专注少拍学习的类不可知分割网络 ,张等。铝
mini-ImageNet 基准测试的性能
只有相关的和被报道的报纸;根据单镜头性能排序
度量学习方法
****再论基于局部描述子的图像到类的度量用于少镜头学习,李等。铝
在这项工作中,作者感到有点怀旧,回到了单词袋时代的本地描述符,但特征是用 CNN 提取的,一切都是端到端学习的。结果在基准的低端。
在现实环境中进行局部化的少镜头学习,Wertheimer 等人。铝
他们理所当然地声称标准的少量测试基准不现实,因为他们人为地平衡了类和测试 5 路任务,他们建议了一个新的数据集/基准。该模型学习同时定位和分类;明显的缺点是需要带有边界框注释的数据集。分类器基于原型网络,但是所使用的特征向量是聚集的前景和背景表示的串联。
针对少镜头学习的密集分类和植入,Lifchitz 等。铝
密集地执行分类,即,代替最终的全局平均汇集,所有空间位置都需要被正确分类。此外,他们不是在测试时微调最后一层,而是通过添加神经元来加宽每一层,并对其进行微调(只训练额外的权重,旧的被冻结)。
变型原型-编码器:用原型图像进行一次性学习,Kim 等人。艾尔。
这更像是一次性分类在标识或路标分类中的具体应用。在这种情况下,他们将图形图像(与野外的标识/标志形成对比)视为原型。并且他们通过学习将野外徽标/标志图像映射到原型图像的元任务来学习良好的表示。
元学习方法
****可微凸优化元学习,李等。铝
这项工作是基准测试中的佼佼者之一(对于不使用语义信息的方法而言)。该方法非常简单,一个强大的骨干加上 SVM 分类器训练端到端。他们表明,即使只是使用主干网和原型网络也能达到很高的精度。SVM 使用也提高了性能。特征维数(分类器输入)保持得相当高,我想知道 SVM 是否能更好地处理这种高维度,这就是提升的原因。
边缘标记图神经网络用于少拍学习,Kim 等。铝
图形神经网络以前曾被用于少镜头学习。基本思想是,每个图像可以表示为图中的一个节点,并且信息(节点表示)可以根据它们的相似程度在它们之间传播。虽然通常根据节点之间的距离表示隐式地进行分类,但是这里作者建议每条边具有描述其节点之间相似性的显式特征。
用于少量学习的任务不可知元学习,Jamal 等人。铝
在这项工作中,为了避免元学习模型对训练任务的过度拟合,将正则化项添加到输出预测中。正则化或者迫使预测具有更高的熵(即,预测的概率不表现得像独热向量),或者迫使模型在任务之间具有更低的不平等(即,在不同的任务上表现得同样差或好)。显然,拥有一个强正则化对于少炮是重要的,但是我没有一个好的直觉为什么这些特殊的正则化项是需要的。他们在 MAML 上测试了这种方法,结果显示它的性能更好,看看在其他方法上使用这种方法是否也有帮助将会很有趣。
少镜头学习的元迁移学习,孙等。铝
该方法有两个主要元素:1 .微调预训练模型,其中权重被冻结,并且仅学习每层的比例和偏移 2。硬任务挖掘。如果我没有弄错的话,在 MAML,finetune 被应用于批处理规范层,它的效果不就和学习缩放和移位一样吗?当应用于 MAML 之上时,硬批量挖掘(从先前任务中精度较低的类组成一个任务)似乎也是有益的。
使用 GNN 去噪自动编码器生成分类权重,用于少量拍摄学习,Gidaris 等人。铝
此处,模型再次预测了未知类别的分类器权重。此外,所有分类器权重都经过去噪自动编码器(基本和任务新颖类),该编码器被实现为图形神经网络,因此 1。允许分类器适应当前的任务类别。从基本分类器向新分类器传播知识。使用去噪自动编码器是有意义的,因为它可以帮助固定预测的分类器,这些分类器是基于仅仅几个例子预测的并且明显有噪声。
【通过类别遍历寻找少镜头学习的任务相关特征】李等。铝
这项工作是基准测试中的佼佼者之一(对于不使用语义信息的方法而言)。给定特征提取器,该模型基本上预测特征向量上的注意力图。“集中器”查看每个类(或图像?我不确定),而“投影仪”将任务中所有类别的信息结合起来,生成注意力地图。“集中器”和“投影仪”都是作为一个小 CNN 实现的。我喜欢它是一个简单的模块,当在几个已知的基于度量的方法上使用时,它们显示出持续改进的性能。
数据扩充方法
LaSO:多标签少镜头学习的标签集运算网络,Alfassy et。铝
为这篇处理多标签少镜头分类的很酷的论文向我的同事们欢呼吧。这里,模型被训练为在嵌入空间中对多标签样本的标签集执行集合运算(并、减和交)。例如,通过对一只狗和一只猫的图像应用联合操作,我们得到了一个同时包含一只狗和一只猫的图像的表示。然后,这些操作用于扩充数据并提高分类性能。
显著性引导的样本幻觉少镜头学习,张等。铝
使用预先训练的(不相交类别上的)显著性模型来分割前景与背景。训练两个特征提取器,一个用于前景和背景,第三个模型用于组合它们。明显的缺点是,你需要一个预先训练好的显著性模型。我认为这是增加数据的一种很酷的方式,但是我不确定背景的增加对于正确分类(不同于检测)有多重要,如果你已经能够分割前景,那么只使用前景进行分类不是更好吗?
Spot and Learn:一种用于少镜头图像分类的最大熵面片采样器。铝
这里,不是学习整个图像的表示,而是使用 RNN 对每个片计算该表示,并且使用增强学习模型预测片上的最优轨迹(即,接下来应该使用哪个片的决定)来聚集该表示。我猜想,与简单的注意力模型相比,它更好,因为数据增加了(在同一张图像上使用不同的轨迹)。然而,基准测试的结果还可以。我想知道仅仅使用随机轨迹的增强效果是否会很好。
图像变形一步学习元网络,陈等。铝
一种非常酷的数据扩充方法。类似于“混合”,但是图像根据网格划分,并且对于每个单元使用不同的(预测的)混合系数。训练是端到端的,同时学习分类器和最优混合(在更好的分类意义上的最优)。它们与 mixup 相比较,但我想知道当系数是预测的而不是随机的时,mixup 对整个图像的作用有多好,即每个单元不同的 mix 有什么影响。
基于语义的方法
婴儿迈向多语义少镜头学习,Schwartz 等人。铝
不要脸的插上我在 CVPR 语言和视觉研讨会上发表的作品。我们建立在 AM3 模型的基础上。al,2019]并将其概括为使用多种语义。我们使用类别的简短文本描述(这些描述是 ImageNet 的一部分,但到目前为止还没有用于少数镜头)来提高性能。我们从视觉原型开始,用一系列语义嵌入迭代更新它们。通过这样做,我们在 miniImageNet 上观察 SOTA 结果。
通过对齐的变分自动编码器进行的广义零次和少次学习。铝
训练两个 vae,一个用于视觉特征,一个用于语义特征。目标是能够从潜在的视觉特征中重建语义特征,反之亦然。我以为这就足够了,但是他们表明,迫使两个潜在空间有相同的分布也有帮助。
****-Net:面向低镜头学习的任务感知特征嵌入,王等。铝
在这项工作中,标签嵌入(手套)用于预测视觉特征提取器模型的权重。他们提出了一个分解权重的好技巧,因此只需要预测一个较低维度的权重向量。此外,语义嵌入和视觉嵌入之间的对齐是通过“嵌入损失”来强制的。这篇论文很有趣,因为它结合了两种方法——元学习(基于任务预测模型)和使用语义信息(标签)。然而,对于少杆任务,结果似乎低于 SOTA。
【大规模少投学习:知识转移与班级层级,李等。铝
据称,目前的方法在大规模的少数镜头上失败,即在 imagenet 上进行预训练,而不是在 mini-imagenet 中的 64 个基类上,并且不比朴素基线好。这里,再次使用了语义标签。他们使用标签嵌入来无监督地建立类层次结构,这是一种有趣的方法,据说学习以这种层次方式分类有助于模型捕捉在看不见的类上表现更好的特征。一个警告是,看不见的类标签被用来构建类的层次结构,这是不是有点欺骗?
面目全非(其他任务的少量学习)
RepMet:用于分类和少量拍摄对象检测的基于代表的度量学习,Karlinsky 等人。铝
不要脸的塞,再一次,塞到我合著的一部作品里。我们是第一批研究少量拍摄物体检测的。我们的解决方案是将基于度量的方法(如原型网络)扩展到检测。我们使用现成的检测器架构(FPN-DCN)并用基于度量的分类器代替(线性)分类器头,其中基于到已学习的类代表的距离来完成对每个提议区域的分类。我们提出了一个新的少数镜头检测基准,并显示了竞争方法的改进。
CANet:具有迭代细化和专注的少数镜头学习的类别不可知分割网络,张等人。铝
将度量学习扩展到少量镜头分割的密集情况。将查询图像中的所有局部特征与支持集中的对象上的所有局部特征进行比较是非常昂贵的。因此,他们选择将查询中的局部特征与支持集图像的全局表示进行比较。
收集数据时可以使用的一些技巧
在为我最新的 DS 项目收集数据时,我是如何解决一些问题的
几周前,我花了大量的时间从互联网上为我最近的项目收集数据(网络抓取、API 调用等等)。我将在以后的帖子中分享一个总结。第一天非常令人沮丧,因为我的代码总是失败,或者我没有得到预期的结果。在我的任务中遇到的问题的解决是由于几个小的修复。下面几段我和大家分享四个。
1-组织你的脚本
I consider each scripts executing specific tasks separate to keep my Jupyter Notebook clean and neat…
收集数据时保持有条理是很重要的。这有助于轻松找到你的错误所在。编写一段代码没有任何帮助。我建议养成两个习惯:保留代码注释和在笔记本上写代码(我用 Jupyter 笔记本,很少去其他 IDE 写 Python 代码)
一边写代码一边写注释是跟踪交付成果的一种方式。想象一下,两年后回到你的旧剧本,却不记得你以前想要达到的目标。清晰的评论真的很有帮助。此外,我们还为其他数据科学家编写代码(记住,Python 是一种‘免费’的编程语言)。通过注释我们的代码,我们使我们的同行变得容易。
关于 Jupyter 笔记本的意见有分歧,一些数据科学家不喜欢它,更喜欢使用其他 IDE。你的电话。在一天结束时,审查和执行短代码比长代码更可取。我在使用 Jupyter 时发现的主要优点是,我可以有几个脚本,而不是一个完整的块。我可以打印我的变量;检查我的数据帧的描述或很容易找到我的列表的长度。
在检查错误或调试时,对每一小块代码进行注释可以节省大量时间。同样,将执行特定任务的脚本放在同一个区域可以让我的 Jupyter 笔记本保持整洁。
2-使用功能
The function is only written once. It can be used multiple times to produce different outputs depend on the input.
函数是避免重复和更有效的好方法。在我的例子中,一旦我知道我的函数起作用了,我就有信心在数据收集过程的不同阶段使用它。我不用再写步骤了,远离了错误。例如,我不得不从同一个网站的不同部分或者去不同的页面收集一些数据。在那种情况下,我的数据收集结构并没有真正改变。我必须确定我将不得不多次执行的任务,并使用一个函数来使它对我来说更容易。
3-按需保存
在我第一次尝试抓取一些数据时,几分钟后我的脚本失败了。我丢失了所有被废弃的东西,因为我只是添加了一个收集到的数据列表。大错特错。想象一下,如果 2 或 3 个小时的数据收集没有了,我会有多沮丧。
我不得不经历的一个简单的解决办法是保存我得到的每一组新数据。在一个“for 循环”中,我正在 Pickle…Pickle 和 Json 在这方面非常有用。pickle 的主要优点是你可以保存任何东西:列表、Pandas 数据框、字典作为一个 pickle,并在以后使用初始数据类型中保存的项目。Json 格式只要求您稍后通过它来获取数据。
让我分享我在最近的项目中使用的一个脚本。客观地说,我从 Spotify 上收集歌曲。我在一个用于 API 调用的列表中有一个歌曲/艺术家的初始组合。出于什么其他原因,我应该在获得歌曲功能时保存它们?首先,Spotify 上可能找不到歌曲/艺术家的组合。这会导致错误并终止请求。其次,请求可能会超时。保存迄今收集的所有数据变得很重要。如果我遇到任何问题,我知道从哪里着手。
After each songs, my list containing all features had been appended and saved
4-用 try 捕捉错误…除了
在我的数据收集之旅中,我不得不求助的一个最佳解决方案是用‘Python try…except’处理错误。这个想法是让 Python 评估代码,根据某些条件处理错误,并根据评估和错误处理来执行代码。“尝试…例外”的三个步骤通过以下方式实现:
测试代码块错误的try
块;不管 try- and except 块的结果如何,except
块处理错误,而finally
块执行代码。当错误发生时,或者我们称之为异常时,Python 通常会停止并生成一条错误消息。这些异常可以使用“try”语句来处理。
在数据收集过程中,我如何使用异常?基本上,我没有等待错误来破坏我的代码,而是让 Python 捕捉错误并继续收集数据,即使没有找到请求的歌曲。
使用 Python 收集数据时,有不同的方法来处理类似的问题。我分享了一些与我的情况相关并且非常有帮助的例子。如果你有任何其他建议,欢迎在评论中与我分享,或者在 LinkedIn 或 Twitter 上与我联系,我们可以讨论。
FGO·斯泰尔根:这种英雄精神并不存在
Sample outputs from FGO StyleGAN. Also here is a the link to view it for free
当我第一次看到 Nvidia 的 StyleGAN 的结果时,我觉得它看起来像一堆黑色的魔法。我在 GANs 领域的经验不如深度学习的其他部分,这种经验的缺乏和我真的缺乏 GPU 火力来培养自己的风格的想法阻碍了我更快地投入进来。对于规模,在 StyleGAN github 上,Nvidia 列出了 GPU 规格,基本上是说在 8 个 GPU 上从头开始训练需要大约 1 周时间,如果你只有一个 GPU,训练时间大约为 40 天。因此,运行我的一个 GPU 设备 40 天,从时间和我的电费来看,听起来很可怕。有了这些限制,我暂时放下了培养一名时尚达人的雄心。
FGO StyleGAN outputs
信仰的飞跃:自定义 FGO StyleGAN
虽然我和其他人一样喜欢黑魔法,但我也喜欢理解正在发生的事情,尽可能地揭开事物的神秘面纱,并构建自己的事物版本。
几周前,我的一个队友在 LinkedIn 上给我发了一些视频,视频中时装模特以一种视频风格相互变形,我认为这是 StyleGAN 的一种应用。深入调查后,我发现自从我上次查看以来,在 StyleGAN 周围的社区中已经进行了很多工作。就我个人而言,这些天我在 Pytorch 中做了很多工作,但是我认为当你试图将研究应用到你自己的项目中时,通常最简单的方法是使用研究中使用的任何工具。在这种情况下,虽然有一个 Pytorch port 看起来功能相当不错,但最好的做法是使用基于 Tensorflow 的代码,这项研究是用 Nvidia 的开源的代码完成的。
然而,是一个名叫 Gwern Branwen 的人制作了一个网站这个外服并不存在。坦率地说,如果我没有看到 Gwern 关于他们如何走过他们的 S tyleGAN 的帖子,并好心地为一个以 512x512 分辨率训练的基于动漫的 StyleGAN 提供预训练的重量,我就不会真的花时间和资源来训练 StyleGAN。
Gwern 展示了基于动画的 StyleGANs,他们使用自己提供的重量训练或由他人训练。虽然我的项目与那里的项目相似,但社区中有人训练了一个“剑脸”StyleGAN,这篇文章中的 StyleGAN 是一个普通命运大令 StyleGAN。
GAN 背景简介
生成对抗网络(GAN)是深度学习的一个有趣领域,其中训练过程涉及两个网络:生成器和鉴别器。生成器模型开始自己创建图像,它从随机噪声开始,而鉴别器通过查看训练示例和生成器输出来给出反馈,并预测它们是“真”还是“假”。随着时间的推移,这种反馈有助于生成器创建更真实的图像。
StyleGAN 是对英伟达之前一款名为 ProGAN 的型号的改进。ProGAN 经过训练可以生成 1024x1024 的高质量图像,并通过实施渐进的训练周期来实现这一点,在该周期中,它以低分辨率(4x4)开始训练图像,并通过添加额外的层来随着时间的推移提高分辨率。训练低分辨率图像有助于使训练更快并提高最终图像的质量,因为网络能够学习重要的较低水平特征。然而,ProGAN 控制生成图像的能力有限,这正是 StyleGAN 的用武之地。StyleGAN 基于 ProGAN,但增加了生成器网络,允许控制三种类型的功能。
- 粗糙:影响姿势、一般发型、脸型等
- 中:影响更精细的五官、发型、眼睛睁开/闭上等。
- 精细:影响配色方案(眼睛、头发和皮肤)和微观特征。
这只是对 StyleGAN 的简单描述,更多信息请查看论文或其他关于媒体的文章。
This one shows a few male faces. However a lot of them turn into super evil looking images? Maybe guys are just evil? who knows. This one also shows a number of lower quality generated images probably due to me not removing low resolution images properly when I created the dataset.
数据集构建和准备
为了让 StyleGAN 运行起来,最困难的部分是决定我想如何处理这个问题,并获得一个格式正确的数据集。我在前进的道路上犯了一些错误,我也将走过这些错误。根据最初的论文和我看到的许多其他风格,我决定制作一个头像数据集。至于话题,我手头仅有的足够大的数据集与《FGO》有关。
I used a previously built Tensorflow Object detector to crop out the heads from around 6K FGO wallpaper/fan art images.
我使用的 FGO 数据集由大约 6000 张不同尺寸的壁纸、游戏图片、粉丝艺术等图片组成。我通过一个基于 Tensorflow 的 FGO 调谐头部检测器在这个数据集上提取了大约 8K 个头部。完成后,我用手快速检查并清理了数据集,将最终数据集削减到大约 6K 头。我学到的一个教训是,我应该在过程的这一部分花更多的时间,因为有许多质量较低的图像,还有背景、盔甲、非人物图像的图像留在数据集中,这导致生成的图像中出现奇怪的伪影或只是质量较低的图像。
像其他 Tensorflow 网络一样,StyleGAN 依赖于使用 tfrecord 文件,并且可以由 StyleGAN repo 中的 dataset_tool.py 文件生成,用于训练。训练 StyleGAN 的一个重要注意事项是,数据集中的图像需要与用于预训练权重的 StyleGAN 具有相同的大小和相同的颜色格式。所以对我来说,使用 1024x1024 的原始网络很困难,因为找到那个尺寸的动漫头像有点困难,我的 GPU 可能无法处理它。这使得 Gwern 训练的 512x512 网络非常有吸引力,因为它更容易找到我可以获得接近该分辨率的头部的图像,并且我的 GPU 可以更容易地处理它。我把所有的图片都转换成 sRGB 图片,并把它们的尺寸调整到 512x512。
为了调整大小,我使用了 Python 的 PIL 库进行处理和重新格式化。一旦完成,我就准备开始漫长而艰苦的过程,根据我的 FGO 用例对 StyleGAN 进行微调。
培养
虽然从预训练的重量开始很有帮助,但训练绝不是一个短暂的过程。毕竟,在我的 1080 卡上花费了一周多一点的 GPU 时间(约 180 小时)后,我停止了训练,这相当于约 85 个“滴答”,这是 StyleGAN 用作纪元的 30K 图像周期……因此它生成了 250 万张 FGO 图像。
Images generated during training for 85 ticks. A few boxes were based on low quality of non headshot images so they just never developed well. However it is interesting to see the model trying to generate headgear (to varying success) as well as a few male characters who show up and I think have cool overly dramatic facial features and hair
StyleGAN 的体能训练过程由 Nvidia repo 中的 2 个脚本控制。为此,我主要遵循了 Gwern 在他们的博客中提出的建议。
培训/training_loop.py
要调整的代码的主要区域从第 112 行开始。本节设置了许多默认参数,因为 StyleGAN 不接受命令行参数,所以必须在这里设置它们。
要设置的主要参数之一是 resume_kimg 参数。如果它被设置为 0,那么 StyleGAN 将在看似随机的初始化开始训练。因此,我将它设置为 resume_kimg=7000 在这个级别,斯泰勒根能够利用预训练的重量,并在一个比其他情况好得多的点开始。
我遇到了 OOM 问题,并最终追踪到它与第 266 行的度量行有关,所以我最终只是注释掉了它。到目前为止,我还没有遇到其他问题。
Train.py
有两个地方需要调整,第一个是指定使用哪个数据集的地方。为此,我添加了我准备好的名为“脸”的数据集。
desc += '-faces'; dataset = EasyDict(tfrecord_dir='faces',resolution=512); train.mirror_augment = True
第二个方面是详细说明培训过程。因为我有 1 个 GPU,所以我将 GPU 的数量设置为 1,并指定每个迷你批次应该有 4 个图像。之后是一些未调整的学习率调度和总数为 99000K 的图像。这实质上设置了模型将训练多长时间。
未来的改进
对于这一个,我认为我可以在两个方面改进我的工作流程。一个是硬件,这是一个非常耗时的项目,如果我决定做更多的 GAN 工作,我认为升级到我的主 GPU 装备将是一个很好的生活质量改善。其次是数据集质量。我没有彻底清理我的数据集,并为此付出了代价,我认为这是一个很好的警示故事。
五金器具
这个项目是我经历过的时间更密集的项目之一,所以坦率地说,它让我考虑是否值得升级我的计算资源。为此,我可以采取两条主要路线,要么使用更多的云资源,如 AWS,要么物理升级我的 GPU。
虽然 AWS 可能是更容易的方法,但我认为通过我所做的大量培训,我会很快产生足够的 AWS 费用,让我希望我升级了我的 GPU。社区中的人们提到,构建自己的 GPU 平台比使用 AWS 等资源大约便宜10 倍。
对我来说,花数百美元来测试一种风格似乎很可怕。
因此,我目前的主要想法是升级到 1080 ti ~ $ 800–1000,或者如果我真的想全押,一次性成本约$1300 的 2080TI 卡应该会有收益。如果任何人对此有想法,请随时告诉我!
两者都应该有助于减少所需的训练时间,因为它们比我目前的主 1080 GPU 快得多。
More selected outputs
数据集质量
与数据科学中的所有事情一样,数据集的初始质量和清理工作可以决定一个项目的成败。为了这个项目,我加快了清洁过程,以便快速训练初始风格。我觉得这很好,但也是我的一个错误。如果我花更多的时间来清洁,结果可能会好得多。
在我的辩护中,我第二天要飞去参加一个咏春研讨会,我想早点开始练习咏春,而不是失去我离开时可以得到的 48 小时的训练时间。
一些初步想法,去除低质量图像,去除非头像图像,去除重复。
去除低质量图像的一个简单过程是删除低于某一分辨率的图像或者没有高于某一截止值(比如 300 像素)的边的图像。
去除非头部图像有点复杂,但可以用 CNN 和一个相当简单的标记头部和非头部图像的过程来完成。但是它需要额外的时间来构建。
重复的图像可能对这个过程没有太大帮助,但我也不确定这会有多严重?我为这个项目建立了一个数据集,使用了 google image pulls 来收集一些与 FGO 相关的术语和字符。这个过程会产生大量的副本。例如,如果我搜索类似“FGO 军刀”的东西,这将会给我“军刀类”或通常被称为“军刀”的 FGO 人物。接下来,如果我搜索“for 阿尔托莉亚·潘德拉贡”,他通常被称为“军刀”,我会得到很多重复的图像。
我可以使用感知哈希之类的东西对数据集进行重复数据删除,使用 ImageHash 库,这是我为工作或 CNN 做的,效果也很好。
到目前为止,我认为最重要的事情是确保图像的质量足够高,StyleGAN 将学会制作好的 512x512 图像。希望对高分辨率数据集进行仔细的手动修剪可以去除大多数非头部图像,复制可能会使 GAN 倾向于制作更多的这些字符,但目前对我来说这似乎不是最糟糕的问题。
One of the things I was happy about is that the GAN learned to generate Jeanne’s head piece that you can see appear for a bit in both of these examples
结束语
正如我之前所说,这是我参与过的计算量更大的项目之一,但结果非常有趣,我想再做几个。从最初训练 from 斯泰勒根中学到的经验应该有助于理顺这些过程。
在看这些的时候,我有一个有趣的想法,那就是我是否可以在计算机视觉问题中使用 StyleGANs 进行数据增强。Gwern 指出,其他人已经在小于 5K 样本的训练模型上取得了相当大的成功,而 FGO·斯泰勒根也取得了类似的成功。这对于样本相对较少的领域非常有用,并且可以通过 NVIDIA 添加到 StyleGAN over ProGAN 中的功能控件来控制样本的生成。虽然这种方法的可行性还有待观察,但至少它可能很酷,而且可能会被宣传为 R&D 的工作项目。谁知道呢?
与此同时,我将享受为这个 FGO 风格产生更多的输出样本和图像。我目前有第二个 StyleGAN 训练,我使用动画重量作为人物照片数据集的起点。我不确定结果会如何,但我会在适当的时候分享这些结果。
随意查看 Git 回购这里
Both of these showcase some of the issues I had where low resolution or non head images were in the dataset so it rotates through some weird/creepy stages.
虚拟自我游戏
强化学习向自我游戏迈进了一步
Photo by Markus Spiske on Unsplash
更新:学习和练习强化学习的最好方式是去 http://rl-lab.com
介绍
在零和游戏中使用强化学习需要一些比标准的虚拟游戏更复杂的方法。标准虚拟游戏用于不考虑时间的标准形式游戏。要将强化学习应用于零和游戏,需要另一种方法。这篇文章是基于约翰尼斯·海因里希&大卫·西尔弗的论文“广泛形式游戏中的虚拟自我游戏”。
扩展形式游戏
正常形式的游戏被建模为一个表格,其中每个玩家的行动(称为策略)是行和列的标题,每个单元格的内容是每个玩家采用的策略的收益。
这种形式的问题是它没有捕捉到序列或时间。出于这个原因,扩展形式游戏使用树状表示,其中每个节点是玩家,每个边是策略,并且可以清楚地看到从一个节点到另一个节点的顺序。
请注意,对于每个扩展形式的游戏,我们可以找到一个正常形式的游戏,产生相同的结果。
学问
学习的目的是找到该玩什么策略才能达到纳什均衡,这样我们才不会输(平均而言)。
换一种方式说同样的话,学习的过程就是找到使用每一个策略(或行动)的概率(或概率分布),这样我们平均起来就不会输。
ε-最佳对策
在标准的虚拟游戏中,每个玩家都将寻求对对手行动的最佳反应。
最佳对策是指在当前情况下能带来最佳价值或回报的策略。认为 R 是对最佳反应的奖励。我们将ε-最佳反应定义为导致奖励 r 使得 r ≥ R-ε 的反应集合。
广义弱化虚拟游戏
广义的弱化虚拟博弈是一个迭代过程,使用当前策略计算混合策略∏ ,ε-最佳对策 bɛ ,以及其他一些扰动 m
从这种方法中得到的重要收获是它在两人零和游戏的情况下收敛。这种方法的原因稍后会更清楚。
莱斯利·柯林斯写的一篇论文中可以找到广义弱化虚拟游戏的细节。
广泛形式的虚拟游戏(XFP)
广泛形式的虚拟游戏采用广义弱化虚拟游戏的概念来迭代计算纳什均衡,因此在两人零和游戏中,XFP 收敛。
但是,有一个问题。
XFP 饱受维度诅咒之苦。在每次迭代中,游戏的所有阶段都需要进行计算。这将导致指数计算。
为此,强化学习开始发挥作用,以创造虚拟的自我游戏。
虚构的自我游戏(FSP)
考虑一个扩展形式的游戏。在他们的论文中,Heinrich 和 Silver 证明了扩展形式的博弈是由马尔可夫决策过程(MDP)定义的,因此它适合于强化学习方法。我们称之为虚构的自我游戏(FSP)。
请记住,XFP 使用最佳对策和策略更新的计算,但这种计算是指数级的。FSP 所做的是用机器学习方法取代这两种计算,如下所示:
- 最佳反应:FSP 使用强化学习方法逼近最佳反应。顾名思义,近似意味着最佳响应不是计算出来的,而是与之接近的东西,即ε-最佳响应。
- 策略更新:FSP 将平均策略更新为一项监督学习任务,每个玩家学习自己行为的转换模型。
重要细节:
确定 FSP 符合广义弱化虚拟对策(记住我们需要收敛性质)。已经证明,数据的采样应该是这样的,即以概率η从最佳响应中采样,以(1η)从当前策略中采样。
这可以从下面算法的generated data方法中看出:
σ←(1η)π+ξβ
算法解释
- 游戏的情节是从代理人的策略中模拟出来的,使用生成数据的方法。
- 数据以当前状态、动作、下一个奖励、下一个状态的过渡元组集的形式存储。
- 由此产生的经验或数据存储在两种代理大小受限的 FIFO 存储器中:
- Mʀʟ存储代理对手行为的经验。换句话说,它模拟了代理人面对的“环境行为”。这就需要使用强化学习算法来学习最佳对策。
- Msʟ存储代理自己的行为,并用于监督学习以更新代理策略。
- 每个代理通过从 Mʀʟ.学习偏离策略来计算近似最佳响应
- 每个智能体通过监督学习记忆 Msʟ.来更新自己的平均策略
实验
在两个参数化零和不完全信息博弈中对这两种算法进行了评估。Leduc 德州扑克和 River poker。
在两人零和游戏中,策略组合的可利用性π被定义为δ = R1 + R2
其中 R1 是参与人 1 的最佳对策的报酬,R2 是参与人 2 的最佳对策的报酬。
理想情况下,纳什均衡的δ应该趋于零。
图 2 显示,在 6 张牌和 60 张牌的 Leduc Hold’em 扑克中,XFP 的表现明显优于 FSP。
在图 3 中,在两次河牌游戏中,FSP 改进其平均策略的速度比全宽策略快得多。在扑克游戏中,FSP 在 30 秒后获得 0.11 的可利用性,而 XFP 在 300 秒后获得 0.26 以上的可利用性
结论
Heinrich & Silver 认为,XFP 是一种虚拟游戏算法,它保持了在具有虚拟游戏属性的游戏中保证的收敛性。然而,它遭受了维数灾难。
FSP 是一种基于样本的方法,在机器学习框架中实现广义弱化虚拟游戏。在每次迭代计算预算有限的情况下,能否保证收敛仍然是一个悬而未决的问题。
相关文章
战斗行动预测者(又名 FAP)
Be water, my friend
对于那些没有打过太多次仗的人来说,了解对手是至关重要的。如果你做得好,你几乎肯定会赢。但是如果你做错了,你可能会发现你在地上的速度比你打字的速度还快(“Hello World”)。
本文将介绍我用来创建卷积神经网络模型的方法,该模型可以检测战斗动作并在以后预测它们。
模型的输入是几个人挥拳的简短视频(这个简化的模型只使用了刺拳和左钩拳,尽管可以很容易地添加更多的动作)。
1.采取的方法
首先,我必须收集一个视频数据集,其中包括我想要的武术动作(考虑到我必须为特定动作编辑每个视频,这并不太容易)。在花了相当多的时间在网上找到几个视频并对它们进行剪辑后,我选择从不同的角度拍摄自己的每个动作(别担心,我是专业的)。对于这个危险的任务,我用手机的摄像头记录下来,我女朋友的猫作为观众。如你所见,这只猫很享受。
A thrilled cat
2.使用 Python 的魔力来编辑视频
我用 Jupyter Notebook 给文件重新命名(给 Jab0,Jab1… Hook0…),把它们放在相应的文件夹里,并把它们整理成框架。由于我的电脑没有我需要的那么快,我在建模项目的剩余部分使用了 Google Colab。
3.Google Colab
我安装了我的驱动器(没有双关语的意思),并使用了谷歌的神话般的 GPU。然后,我采取了 CNN 通常的步骤——导入库,标记类,为训练/评估进行分割。、定义模型、创建生成器、设置一些参数(提前停止等。),最后拟合模型。
我运行了 25 个时期的模型,并获得了以下结果。
Don’t you just love graphs?
4.预言;预测;预告
正如你所看到的,这个模型惊人的准确。
4.思想
最初我计划在这个数据集上使用 Inception V3 模型来节省一些时间。Inception V3 模型是一个非常好的图像识别模型,在 ImageNet 数据集上进行了训练。然而,在看到 25 个周期后的结果后,我意识到这可能有点过头了。
5.未来的改进
这个项目只是我今天早餐前做的一个有趣的活动。有很多方法可以改进它,增加它,并用它创造出真正奇妙的东西(或危险的东西)。
What would you do?
6.谢谢
感谢女友的猫对我的表现评价很大(一如既往),鼓励我远离他珍贵的安息之地。还要感谢把猫借给我,鼓励我运动的女朋友。
完整的代码可以在我的 GitHub 上找到,还有许多其他适合全家人的有趣活动。
直到下一次,
山猫。
用数据应对客户流失
到底是怎么做到的
用数据推动客户参与和保持
Fighting Churn With Data?
这篇文章是关于使用数据和分析技术减少客户流失,提高客户参与度和忠诚度的系列文章的第一篇。该系列基于我正在写的一本书的内容,书名也是用数据对抗流失:我将从这本书中提取这些帖子的关键要点,并为这本书留下细节,包括代码。(如果你想了解更多细节,这本书已经在*有了电子版,完整的印刷手稿将于 2020 年初出版。本书完成部分的代码在 github 上有。)*
1.什么是客户流失,你为什么反对它?
任何产品或服务的主要目标都是增长。当通过营销和销售增加新客户时,增长就会出现,但当客户离开时,增长就会抵消,甚至会导致收缩。对于提供此类服务的企业而言,客户退出服务被称为“流失”。大多数服务提供商专注于收购,但要取得成功,服务还必须努力减少流失。如果客户流失得不到解决,一项服务将无法发挥其全部潜力。
术语“流失”实际上起源于“流失率”:流失率是指在给定时期内离开的客户的比例,这将在下面更详细地讨论。这导致客户或用户群随着时间的推移而变化,这就是为什么术语“搅动”是有意义的:因为单词“搅动”最初的意思是“剧烈地移动”,就像搅动黄油一样。但在商业语境中,术语“客户流失”现在也用作动词:“客户正在流失”;“客户搅动了”;作为一个名词:“客户是一个客户流失者”。如果你更愿意看到半满的杯子,没有从某项服务中流失的客户也可以从积极的角度来看待。在这种情况下,人们谈论“客户保留”。
下面的草图总结了应对客户流失的典型情况:
Schematic of How Fighting Churn With Data Works
这些是关键组件:
- 通常(但不一定)在订阅基础上提供的产品或服务
- 与产品交互的订户(或用户)
- 订户通常签订订阅以接收产品或服务。订阅通常(但不总是)会产生金钱成本。替代方案包括应用内购买和添加支持的产品。
- 订阅可以终止或取消,称为流失。一些订阅必须定期更新,而另一些则只是持续到用户选择流失。
- 订阅(或其他购买)的时间、价格和付款正在某种数据库中被捕获。
- 当用户使用产品或服务或与之交互时,这些事件被跟踪并存储在数据仓库中。
考虑到这些因素,数据流失的应对方式通常是这样的:
- 订阅数据用于识别客户流失和创建客户流失指标。流失率是流失率指标的一个例子。流失数据库还允许识别流失和更新的订户的例子以及他们这样做的确切时间,这些都是进一步分析所需要的。
- 事件数据仓库用于创建总结与每个订户相关的事件的行为指标。行为度量是允许数据仓库中的事件被解释的关键步骤。
- 已识别的流失和更新的行为指标在流失分析中一起使用。流失分析以严格的方式识别订户的哪些行为是更新的预测,哪些是流失的预测,并且可以为每个订户创建流失风险预测。
- 基于他们的特征和风险,用户被分成组合了他们的风险水平、他们的行为和任何其他重要特征的组或段。这些细分的目的是针对他们进行干预,旨在最大限度地延长用户寿命和服务参与度。干预措施可以包括电子邮件营销、电话营销、培训和折扣。另一种类型的长期干预是对订阅产品或服务本身的改变,并且来自流失分析的信息对此也是有用的。
2.为什么流失很难对抗
有那么难吗?如果你已经是一个数据科学家,你可能会看到这是怎么回事,并认为这应该是小菜一碟。嗯,有几件事让你变得与众不同。
2.1 客户流失难以预测
即使使用最新的机器学习技术,客户流失也很难预测。如果你考虑一下自己上次取消订阅的行为,就很容易理解为什么预测客户流失很难:你可能很长时间没有充分利用订阅,但你花了这么长时间取消订阅,因为你太忙了,或者你花了一些时间研究替代方案,或者你只是忘记了。如果数据人员或分析系统在这段时间观察你的行为,它会将你标记为风险,并在你下定决心并找到时间取消计划的整个时间内都是错误的(从你没有流失的意义上来说)。变动的时刻是由太多无法预测的外部因素决定的。
更一般地说,对于那些希望减少客户流失的人来说,许多重要的方面通常是不可知的。考虑以下附加信息,如果您知道这些信息,它们将有助于预测客户流失,但您可能永远也不会知道:
- 顾客的支付能力通常是未知的。同样,对于免费(feed 或广告支持)产品,用户在这类内容上花费的时间和注意力是未知的。
- 与用户已经采用的任何替代解决方案(包括但不限于竞争产品)一样,到替代服务或实现相同目的的手段的转换成本也常常是未知的。)
- 服务的效用或享受是一种基本的主观体验,因人而异,即使在完全相同的情况下也是如此。这对于消费者服务尤其重要,因为消费者服务的流失率很难预测。当决定更新或取消服务时,企业倾向于使用更合理的成本效益分析,但即使这样也会受到主观因素的影响。
如果你在一个项目中预测到了客户流失,并且发现很容易预测到很高的准确度,那么你可能预测客户流失太晚了,因为这是不可能停止的——我将在以后的文章中讨论这个问题。
2.2 流失更难预防
准确预测客户流失很难,但防止客户流失更难。原因很简单:为了以长期可靠的方式防止客户流失,服务必须实际提高服务带来的收益,或者降低使用服务产生的成本。想一想,怎样才能让你不再重复使用你过去用过但现在不再使用的产品:更好的内容和功能会让你不再重复使用吗?也许吧。更低的价格会让你停止生产吗?也许吧。一个改进的用户界面怎么样——这会让你停止鼓捣吗?可能不会,除非用户界面一开始就很糟糕。来自该产品的更频繁的电子邮件和通知会让你停止搅拌吗?肯定不是!
因此,要减少用户流失,你确实需要增加用户获得的价值,但这比让人们首先注册一项服务要困难得多。因为这些人已经确切地知道服务是什么样的,所以通过营销或销售代表做出的承诺不太可能获得很大的吸引力。正如稍后将详细讨论的,可用的最佳选项之一是试图确保订户利用已经可用的服务的所有最佳方面,但是这有局限性。
作为数据人员,你可能需要“银弹”来减少流失,但坏消息是:
没有减少客户流失的灵丹妙药
当然,另一种选择是降低服务成本。但降低货币成本是付费服务的核心选择——收入流失或降价销售可能比完全和全部流失要好,但它仍然是流失。
警告降价是对付流失的“钻石子弹”:它总是有效的,但你负担不起。
3.如何应对客户流失
3.1 防止客户流失是企业的工作
防止流失并不是数据人员的工作,或者至少不是数据人员一个人能够完成的。过去几年,人工智能和数据科学取得了显著进步,但在很大程度上,防止流失需要与客户或用户进行人性化接触。考虑以下能够真正减少流失的角色示例:
- 产品经理和工程师(针对软件)以及制作人、人才和其他内容创作者(针对媒体)通过改变产品功能或内容来提高用户从服务中获得的价值或乐趣,从而减少客户流失。这是减少客户流失的最主要或最直接的方法。软件中的一个相关方法是试图增加“粘性”,这大致意味着通过提供难以复制或设计为难以转移的有价值的功能,修改产品以增加客户转向替代产品的转换成本。
- 营销人员通过精心策划有效的大众传播,将用户引向最受欢迎的内容和特色,从而减少用户流失。这实际上更多的是一种营销教育功能,而不是销售功能:记住,用户已经有了访问权限,知道服务是什么样的,所以承诺不会有帮助。尽管如此,这一职能通常由市场营销人员承担,因为他们有能力打造有效的大众传播。
- 客户成功和支持代表确保客户接受产品,并在他们无法接受时给予帮助,从而防止客户流失。客户支持是传统上帮助客户的部门,但客户成功在许多组织中是一个新的独立职能,其明确设计为比客户支持更主动。当客户寻求帮助时,客户支持会帮助客户,而客户成功会尝试监控客户,发现客户何时需要帮助,并在客户请求帮助之前联系客户。“客户成功”还负责“接纳”客户或确保他们采取一切必要措施开始利用订阅。因此,如果有一个客户成功团队,它通常是数据人员每天最密切合作的团队。数据人员通常会帮助设计指标或模型,客户成功代表将使用这些指标或模型来检测陷入困境的客户。此外,当营销教育活动通常与客户成功紧密配合时,客户成功部门可能会为此设计内容,而营销的角色将只是使其看起来不错,并管理分发内容的电子邮件活动(等等)。**
- 销售部门的客户经理(如果有的话)可能是阻止客户流失的最后手段,假设这项服务有金钱成本的话。客户经理是实际上可以降低价格或更改订购条款的人,他们管理着客户降售更便宜版本的过程。在没有销售部门的付费消费者服务中,这一角色通常由拥有类似权限的高级客户支持代表承担。虽然我们将销售的角色描述为防止客户流失的“最后手段”,但在许多组织中,更主动的方法是首先“确定合适的销售规模”,这意味着更好地销售最适合客户的产品版本,而不是销售最昂贵的版本。这可能会损害每次销售对服务的短期收益,但如果处理得当,将会减少客户流失,并最终提高每个客户的平均终身价值。这也可能损害客户经理的销售佣金,因此可能需要调整销售补偿系统(这是一个复杂的主题,超出了本书的范围。).
这些角色因产品和组织的类型而异,我的描述只是概括。但关键是,最终减少客户流失取决于采取行动影响客户,而这些行动通常是由不同业务部门的专家采取的,而不是由争论数据的程序员采取的。
这些角色显然非常多样化,由于没有更好的术语,我将所有这些功能称为“业务”。这并不意味着数据人员不是公司的一部分,但数据人员通常对具体的业务成果(如收入)没有直接的责任,而其他角色的人通常有。从数据人的角度来看,“业务”是流失分析结果的最终用户。
3.2 数据在支持业务中的作用
由于上面提到的所有因素,业务人员需要帮助他们对抗客户流失的是一套简明的事实或规则来理解客户参与。这些规则需要对业务具有可操作性,这意味着它们知道如何根据调查结果减少客户流失。这反过来要求你发现的事实是客户流失和参与的真正原因或驱动因素。这些事实通常表现为客户行为与流失或保留之间的关系。举个简单的例子,您可能会发现这样的业务规则:“每月使用(查看)功能 X 超过五次的客户流失率是每月使用不到两次的客户的一半”。像使用或查看某个特定功能的更多部分这样的事情可能看起来并不复杂,但是只要它是对数据的正确读取,它就真的很有用。企业的每个部分都可以不同地使用这样一个事实:产品创造者将知道 X 提供的价值,并改进它或使它更像它。营销部门可以设计一个活动来吸引用户使用该功能。当客户成功/支持人员与客户交谈时,他们可以询问客户是否正在使用该功能,如果没有,鼓励客户尝试一下。
这种类型的分析不是当今媒体和大学教育中最受关注的那种人工智能算法。这可能会让一些读者失望:为了减少流失,部署一个能够赢得数据科学预测竞赛的“人工智能”系统是不够的。如果你试图交付一个预测客户流失的分析,而没有用具体的规则来解释它,企业将不能容易地使用它,所以他们可能根本不会使用它。虽然有一些技术可以使黑盒机器学习模型更具可解释性,但我将向您展示,您可以通过更直接的方法得出更好的结论。
通过使用简单的方法,您可以真正地让业务人员成为调查过程的一部分,获取他们更多的领域专业知识,并给予他们对结果更大的信心和更好的解释能力。客户流失的预测模型可能是有用的,但是当预测是从数据团队到企业的调查和知识转移计划的自然延伸时,它们更有用。
4.案例研究:重要的度量标准(对抗流失的武器)
在本节中,我将介绍
4.1 Klipfolio 的活跃用户和许可证使用情况
Klipfolio 是一款数据分析云应用,用于构建和共享实时业务仪表盘。这些指示板可以由多个用户创建,对于允许多个用户使用一个订阅的任何产品,一个通用指标是活动用户的数量。下图展示了 Klipfolio 客户每月活跃用户数量与客户流失之间的关系。
Behavioral Cohort Churn vs. Klipfolio’s Active Users
上图使用了一种称为行为群组的技术来显示行为和流失之间的关系。你将在下面和书中看到很多这样的图,并学习如何创建它们,现在我将简要解释它是如何工作的:给定一个客户池和一个行为指标,如每月活跃用户数,客户根据他们对该指标的测量被组织成群组。通常使用十个群组,因此第一个群组包含该指标下的 10%客户,第二个群组包含接下来的 10%,直到最后一个群组包含该指标下的前 10%客户。一旦群体形成,你就可以计算出每个群体中有百分之多少的顾客流失了。结果显示在类似上图的图中:图中的每个点对应于一个群组,该点的 x 值由群组中所有客户的指标平均值给出,该点的 y 值由群组中客户流失百分比(即流失率)给出。
关于群组图,我应该提到的另一件事是,它没有显示实际的流失率,只显示了群组之间的相对差异。这是因为流失率是一个非常重要的运营指标,在案例研究中揭示公司的真实流失率是不合适的。类似地,书中没有一个行为群组流失率图用 y 轴上的标签显示实际流失率。但是,行为群组图的底部总是被设置为零流失率,因此这些点与群组图底部的距离可用于比较相对流失率。例如,如果一个点与另一个点之间的距离是图底部的一半,这意味着该群组中的流失率是另一个点的一半。
转到流失群组图的细节,它显示最低群组每月有不到一个活跃用户(多个月的平均值),最高群组每月有超过 25 个活跃用户。每月活跃用户最少的群组的流失率大约是活跃用户最多的群组的 8 倍。同时,流失率的大部分差异发生在每月 1 到 5 个活跃用户之间。
虽然衡量活动用户的数量是应对客户流失的一个很好的指标,但下图显示了一个更好的指标:这是通过将活动用户的数量除以用户购买的座位数量计算出来的许可证利用率指标。许多 SaaS 产品是按“座位”销售的,这意味着允许的最大用户数(这称为许可座位数)。如果活动用户数除以许可的席位数,则得出的指标衡量客户对席位许可证的利用率百分比。
Behavioral Cohort Churn vs. Klipfolio’s License Utilization (active users per seat)
上图中的结果显示,许可证利用率是一个非常有效的应对客户流失的指标:许可证利用率最低的群组的平均利用率略高于零,而最高群组的许可证利用率约为 1.0。最低群组的流失率大约是最高群组的 7 倍,并且不同群组之间的流失率或多或少是连续变化的——与活跃用户群组数量的流失率相反,实际上不存在更高利用率不再产生影响的水平。这使得它比单独的活跃用户更有效地区分流失风险。正如后面的帖子和本书将进一步解释的那样,每月活跃用户的原因实际上合并了两个不同的与流失相关的潜在因素:向客户出售了多少座位,以及典型用户活跃的频率。利用率是衡量用户活跃度的指标,与售出的座位数量无关,通常对于根据客户参与度和流失风险对客户进行细分非常有用。
4.2 广义的促进者和贬低者的数量和比率
广义而言是一项在线服务,帮助中小型企业(SMB)管理他们的在线状态,包括评论。对 wide 的客户来说,一个非常重要的事件是该业务获得正面评价或推广的次数。下图显示了广泛客户每月的推广人数与客户流失之间的关系。(有关群组图的详细说明,请参见最后一节的开头。)在下图中,每月具有最少启动子的群组(平均略高于零个启动子)的流失率比具有最多启动子的群组高约 4 倍;流失的减少主要发生在每月 0 到 20 名推广人员之间。这是一个重要事件的明确关系,很容易理解为什么拥有更多在线推广人员的客户更有可能继续使用 Broadly service,因为收到积极的评论是客户使用 broad 的主要目标之一。
Behavioral Cohort Churn vs. Broadly’s Customer Promoters (per Month)
对 wide 的客户来说,与推广者数量相关的另一个重要事件是诋毁者的数量,或业务被负面评价的次数。下图显示了广泛客户每月的批评者数量与流失率之间的关系:每月批评者最少的群体(略高于零)的流失率比批评者最多的群体(平均每月不到 5 名批评者)高出约 2 倍;流失率的降低通常发生在每月 0 到 1 个批评者之间。
虽然这种关系看起来很像上面显示的客户促销员之间的关系,但这里是不是有点不对劲?获得负面评价是一件坏事,大概也不是 browide 的客户所期待的结果——那么为什么负面评价与客户流失减少有关呢?
Behavioral Cohort Churn vs. Broadly’s Customer Detractors (per Month)
为了理解为什么更多的坏事,如贬低者,可能与更少的客户流失有关,看看另一个更好的衡量标准会有所帮助:如果你用贬低者的数量除以评论的总数(推广者加贬低者),那么结果就是贬低者的百分比,我称之为贬低率。下图显示了流失率和贬损率之间的关系——这可能更像是您预期的对客户不利的产品事件的关系:贬损率越高,流失率越高,而且非常显著。
Behavioral Cohort Churn vs. Broadly’s Detractor Rate
那么,为什么单从贬低者数量来看,贬低者越多越好,而从贬低率来看,贬低者越多越不好呢?答案是,中的贬损者总数实际上与中显示的推广者总数相关,因为总体上收到大量评论的客户很可能会收到更多的好评和差评,这仅仅是因为有大量的评论。因此,当你以简单的方式查看对批评者数量和流失之间关系的影响时,它合并了驱动该指标的两个潜在因素:有大量评论(这是好的),以及有高比例的差评(这是坏的)。当单独分析差评的比例时,你会得到更有用的结果。
4.3 Versature 的通话和每次通话成本指标
Versature 为企业提供电信服务。作为统一通信提供商,他们许多最重要的事件都是语音呼叫,其持续时间存储在与每个事件相关的字段中。下图显示了 Versature 客户拨打的语音电话数量与客户流失之间的关系。就本地通话而言,最低群组实际上没有通话,流失率比每月有数千次本地通话的客户群组高三倍左右。
Behavioral Cohort Churn vs. Versasture’s Local Calls
当试图理解客户流失时,重要的是不仅要考虑客户使用服务的数量,还要考虑他们支付的费用。每月经常性收入(MRR)是计算客户为使用订阅服务而支付的金额的标准指标:它是客户每月为使用服务而支付的总额,但不包括任何安装费或不定期费用。(我在书中更多地谈到了 MRR 以及如何计算它。)也可以使用行为群组方法分析客户支付的金额,以寻找与流失的关系,如下所示。
Behavioral Cohort Churn vs. Versature’s Customers Monthly Recurring Revenue (Score)
下面的行为群组图做了一些新的事情:它没有直接显示群组的平均 MRR,而是显示了每个 MRR 测量值被转换为分数后的平均 MRR。如果你熟悉“曲线分级”的概念,那么度量分数也是同样的概念:度量从一种尺度转换到另一种尺度,但顺序保持不变。因此,如果将指标转换为分数,某个特定群组(如指标中倒数 10%的群组)仍然是同一组客户,并且该群组具有完全相同的流失率。这意味着将指标转换为分数只会影响群组沿群组图横轴的分布,而不会影响点的垂直位置,即流失率。当水平访问上的重新缩放使结果更容易理解时,指标被转换成分数。我在书中更多地说了度量分数以及如何计算它们。
群组流失率表明,MRR 也与流失率相关,尽管没有打电话那么强烈:不同群组中的流失率并不完全一致,最低群组流失率仅比最高流失率群组少大约一半或三分之一。但这是另一个例子,它让你停下来想想它在说什么:支付更多的人流失更少。这是你所期望的吗?这可能令人惊讶,但实际上很常见,尤其是在商业产品中。这是因为大客户的商业产品售价更高,而大客户流失更少的原因有很多:他们有更多的员工,所以当涉及到打电话或使用软件等产品使用时,为产品支付更多费用的客户通常也使用得更多。因此,支付较高 MRR 的客户流失率较低,实际上与上面显示的通话次数较多的客户流失率较低有关。
但是,我们可以从另一个角度来看客户支付金额与客户流失的关系:MRR 指标除以每月通话次数。这将产生一个指标,即客户每次通话的成本。我称之为“价值衡量”,因为它解释了顾客花了多少钱得到了多少服务。就像 MRR 的数字一样,每次通话的成本数字显示的是群组平均得分,而不是美元。每次通话成本的行为群组流失率图显示,当根据所消费的服务量来衡量付费时,付费更多的客户确实会流失更多。每次通话成本最高的群组的流失率比每次通话成本最低的群组高 6 倍左右。像这样的价值衡量标准是理解客户流失原因的重要武器,也是将在后面章节中全面探讨的重要主题。
Behavioral Cohort Churn vs. Versature’s Customers Cost per Call
5.未来的战斗
这个系列将不同于许多关于数据科学的文章,因为我不会告诉你你需要一些闪亮的新技术或复杂的算法。相反,我强调使用你的大脑(通过科学方法)和以下领域:
- 全栈分析:从原始数据开始,经过特性工程和分析,一直到向企业解释结果。
- 度量设计也称为“特征工程”受到关注,因为这些是成功的最重要的活动
- 节俭和敏捷:正确地做,快速地做,因为你将不得不一遍又一遍地做
- 可解释性和沟通:如果你不能向人类解释,客户流失就是一个失败的领域(我会在下面解释原因……)
用深度学习对抗污染
A brick kiln spewing smoke. Photo by koushik das on Unsplash
每年 11 月,新德里都会被厚厚的烟雾笼罩。作为回应,政府采取了一些照本宣科的措施,比如偶尔关闭学校,实施臭名昭著的单双号限行计划,迫使一半城市的汽车离开街道。德里的污染有几个原因:邻近邦的季节性残茬燃烧、车辆排放、以及发电厂和遍布首都地区的砖窑排放的烟雾。抗击污染需要多管齐下的方法——仅靠政府政策是不够的,它们需要与实地行动相结合。
照片不会说谎
我们以砖窑为例。在我们解决它们造成的污染之前,我们需要确切地知道有多少这样的窑和它们的位置,它们的数量是在增加还是在减少,以及有多少按照法律的要求采用了减少排放的技术。卫星图像与深度学习相结合可以回答这些问题,增强问责制并推动实地成果。这篇博文描述了我们如何做到这一点。
砖窑
随着快速城市化,对砖的需求不断增加。在亚洲的许多地方,制砖是一项非常庞大的传统产业。印度的制砖业虽然没有组织,但规模巨大。印度是世界上第二大砖块生产国——中国以 54%的份额占据主导地位[1]。
Brick kilns are a major contributor to air pollution in North India. Photo by Ishita Garg
砖窑是印度北部空气污染的主要原因。生产砖块会导致有害气体和颗粒物质的排放,包括一氧化碳和硫氧化物(SOx)等有毒化学物质。接触这些排放物对健康极其有害,并会影响儿童的身体和智力发育。
印度的大多数砖窑都是固定烟囱公牛沟窑 (FCBTK)型。然而,有一种更新的窑炉设计,被称为之字形窑炉,它更节能,造成的空气污染更少。旧设计的窑炉可以转换成之字形设计,从而提高效率——但是,改造需要成本,这导致这项技术的采用速度较慢。
Source: Towards Cleaner Brick Kilns in India by Sameer Maithel
中央污染控制委员会(CPCB)于 2017 年 6 月发布了一项 指令 ,强制要求全印度所有的砖窑转换成锯齿形设计。该指令明确指出未经许可的砖窑将被关闭[2]。尽管有指令,仍有许多砖窑没有按照规定的设计规范运行。
在卫星图像中,FCBTK 窑看起来是椭圆形的,而新设计的锯齿形窑是矩形的(只有空气以锯齿形流动!)这可以用来从航空/卫星图像中识别窑的类型。
We can identify Zigzag (left) and FCBTK kilns (right) from their layout, as seen in satellite imagery.
在这篇文章中,我们描述了我们如何使用深度学习来检测德里周围的所有砖窑,绘制它们的地图,并根据它们的设计进行分类。这将有助于发现那些没有遵守政府指令的窑炉,并在执法方面大有作为,同时增加问责制和透明度。
使用 ArcGIS 进行深度学习
深度学习是一种久经考验的卫星图像对象检测方法。我们使用以下步骤对砖窑进行检测和分类:
- 使用 ArcGIS Pro 收集训练数据
- 使用 arcgis.learn 训练深度学习模型
- 使用 ArcGIS Pro 部署训练好的模型
最后,我们创建了一个 ArcGIS Operations 仪表盘来传达分析结果。
我们使用 ESRI 世界影像图层来训练模型,为了进行对比分析,我们使用了 2014 年的同一图层(此历史影像可在 Esri 的 Living Atlas 上找到,可使用 wayback 影像工具 进行浏览)。
收集培训数据
我们使用 ArcGIS Pro 在 Esri World 影像上标记了两种砖窑的位置。我们创建了一个表示砖窑位置的点要素类,并设置了一个指示砖窑类型的属性字段(0=FCBTK/Oval design。1 =锯齿形/矩形)。为了简化我们的工作,我们只标记了窑的中心位置——我们只对它们的位置感兴趣,而不是精确的大小。
Marking locations of brick kilns and their types (red=FCBTK, blue=Zigzag) using ArcGIS Pro. This served as training data that our AI model learnt
from.
导出培训数据
这些数据被用来训练深度学习模型,以检测图像中的砖窑。我们使用了 ArcGIS Pro 中提供的“导出深度学习训练数据”工具来导出包含多个砖窑示例及其在每个芯片中的位置的图像芯片。
我们选择每个窑炉位置周围的缓冲半径为 75 米,因为每个窑炉大约是该尺寸的两倍(即大约 150 米长)。
需要根据将要训练的模型类型来选择元数据格式。在这种情况下,我们必须训练一个对象检测模型。“Pascal 可视对象类”格式是一种用于对象检测任务的流行元数据格式。
在“环境”选项卡中,我们可以调整“单元大小”参数,以便每个芯片可以容纳两到三个砖窑。对于这个项目,我们使用不同的单元大小参数值导出芯片。这个技巧使我们能够通过从相同数量的标记数据引导中创建更多的训练芯片来增加训练数据。此外,它还帮助我们的模型学会为砖窑创建更合适的边界框。如果我们只输入一个单元大小的模型数据,它将总是为每个窑预测相同的大小(大约 150m ),因为这是它已经看到的所有数据。
砖窑检测人员培训
我们使用 Jupyter 笔记本和 ArcGIS API for Python 中的arcgis.learn
模块来训练模型。arcgis.learn
模块建立在 fast.ai 和 PyTorch 之上,只需几行代码就能训练出高度精确的模型。安装和设置环境的详细文档可在此处获得。
我们训练的模型类型是 SingleShotDetector,之所以这样叫是因为它能够一眼找到图像(芯片)中的所有对象。
**from** **arcgis.learn** **import** SingleShotDetector, prepare_data
数据扩充
我们使用prepare_data()
函数对训练数据进行各种类型的转换和扩充。这些增强使我们能够用有限的数据训练更好的模型,并防止模型过度拟合。prepare_data()
取 3 个参数。
path
:包含训练数据的文件夹路径。
chip_size
:与导出培训数据时指定的相同。
对于这个项目,我们在 11GB 内存的 GPU 上使用了 64 个的批处理大小。
此函数返回 fast.ai 数据束,在下一步中用于训练模型。
**from** **arcgis.learn** **import** SingleShotDetector, prepare_datadata = prepare_data(path=r'data\training data 448px 1m',
chip_size=448,
batch_size=64)
从您的训练数据中可视化一些样本
为了理解训练数据,我们将在arcgis.learn
中使用show_batch()
方法。show_batch()
从训练数据中随机选取几个样本,并将其可视化。
data.show_batch(rows=5)
Some random samples from our training data have been visualized above.
上面的图像芯片标出了砖窑的边界框。标有 0 的方框是椭圆形(FCBTK)砖窑,标有 1 的是锯齿形砖窑。
加载单发探测器模型
下面的代码实例化了一个SingleShotDetector
模型——它基于一个流行的对象检测模型,它的缩写形式“SSD”更为人所知。该模型返回检测到的特征的类型和边界框。
model = SingleShotDetector(data)
找到一个最佳的学习速度
一个新初始化的深度学习模型就像一个刚出生的孩子的大脑。它不知道从什么开始,并通过查看它需要学习识别的对象的几个示例来学习。如果它学习的速度非常慢,它需要很长时间才能学会任何东西。另一方面,如果孩子很快就下结论(或者,在深度学习术语中具有“高学习率”),它将经常学习错误的东西,这也不好。
类似地,深度学习模型需要用学习率来初始化。这是一个重要的超参数,其值应在学习过程开始前设置[3]。学习率是一个关键参数,它决定了我们如何根据损失梯度调整网络的权重[4]。
arcgis.learn
利用 fast.ai 的学习率查找器为训练模型找到最佳学习率。我们可以使用lr_find()
方法来找到能够足够快地训练我们的模型的最佳学习速率。
model.lr_find()
根据上面的学习率图,我们可以看到 lr_find()为我们的训练数据建议的学习率大约是 1e-03。我们可以用它来训练我们的模型。在最新发布的arcgis.learn
中,我们甚至可以在不指定学习率的情况下训练模型。它在内部使用学习率查找器来查找最佳学习率并使用它。
符合模型
为了训练模型,我们使用fit()
方法。首先,我们将使用 10 个纪元来训练我们的模型。Epoch 定义了模型暴露于整个训练集的次数。
model.fit(epochs=10, lr=0.001)
fit()
方法的输出给出了训练集和验证集的损失(或错误率)。这有助于我们评估模型对未知数据的泛化能力,并防止过度拟合。在这里,只有 10 个时期,我们看到了合理的结果-训练和验证损失都大幅下降,表明模型正在学习识别砖窑。
下一步是保存模型,以便以后进一步训练或推断。默认情况下,模型将保存到本笔记本开头指定的数据路径中。
保存模型
我们将把我们训练的模型保存为’深度学习包’('。dlpk’格式)。深度学习包是用于在 ArcGIS 平台上部署深度学习模型的标准格式。
我们可以用save()
的方法来保存训练好的模型。默认情况下,它保存在我们的培训数据文件夹中的’模型’子文件夹中。
model.save('ssd_brick-kiln_01')
加载一个中间模型来进一步训练它
为了重新训练一个保存的模型,我们可以使用下面的代码再次加载它,并按照上面的解释进一步训练它。
*# model.load('ssd_brick-kiln_01')*
可视化验证集中的结果
查看模型 viz-a-viz 地面真相的结果是一个很好的实践。下面的代码选取了随机样本,并向我们并排展示了基本事实和模型预测。这使我们能够在笔记本中预览模型的结果。
model.show_results(rows=8, thresh=0.2)
Detected brick kilns, ground truth on left, and the predictions on the right.
在这里,来自训练数据的地面实况的子集与来自模型的预测一起被可视化。正如我们所看到的,我们的模型运行良好,预测与地面实况相当。
砖窑模型部署与检测
我们可以使用保存的模型,使用 ArcGIS Pro 和ArcGIS Enterprise中提供的“使用深度学习检测对象”工具来检测对象。对于该项目,我们使用 ESRI 世界影像图层来检测砖窑。
Detected brick kilns in ArcGIS Pro. See the web layer with the detected kilns
该工具返回一个地理要素图层,可使用定义查询和非最大值抑制工具进一步细化该图层。该图层也已在线发布并作为托管要素图层共享。
一旦我们有了一个经过训练的模型,我们就可以用它来以完全自动化的方式检测感兴趣的对象,只需查看图像即可。为了进行对比分析,我们使用相同的模型在 2014 年的旧版本 ESRI 世界影像图层上检测砖窑,该图层是使用 wayback 影像工具找到的。
Web map showing the detected brick kilns.
使用 ArcGIS Dashboard 交流结果
数据科学可以帮助我们从数据中获得洞察力,但将这些洞察力传达给利益相关者和决策者或许同样重要,如果不是更重要的话。
以仪表板的形式显示结果可以回答关键问题,提高透明度和问责制,并推动实地成果。我们使用 ArcGIS Operations Dashboard 创建了以下仪表盘来传达我们的分析结果:
Online Dashboard showing growth in number of brick kilns and very poor (less than 14%) compliance with order mandating conversion to Zigzag design
从仪表板上可以明显看出,砖窑的数量在过去几年中有所增加,我们在将它们改造成新设计方面还有很长的路要走。不到 14%的人转向了污染更少的锯齿形设计。像这样有真实数据支持的信息产品可以增加透明度、分配责任和推动实地成果。
参考
[1]谢赫·阿费法。(2014).砖窑:大气污染的原因。
[2]https://www.cseindia.org/content/downloadreports/9387
[3]https://en . Wikipedia . org/wiki/Hyperparameter _(机器学习
加入我们吧!
在新德里的 **ESRI 研发中心,**我们正在应用前沿的人工智能和深度学习技术来革新地理空间分析,并从图像和位置数据中获得洞察力。我们正在寻找数据科学家和产品工程师。在线申请这里!
对抗气候危机:深度学习使 6 个未来游戏规则改变者成为可能
Figure 1: A Deep Learning algorithm predicts, localizes, and simulates tropical cyclones and their precursors [1].
想象你自己在一个关键的、高风险的气候研究和发展部门/工业综合体中,忍受着详尽的分析,只找到大环境数据中的几个趋势。你的气候研究部门负责每天完成数千个最新观察到的趋势和预测。因此,你和你的部门处理数百万个数据点,等待下一个“重大突破”的发现和结果。更重要的是,你要明白,收集、预处理和利用这些趋势对于预测来年的下一次自然灾害、干旱、飓风或高强度气旋是至关重要的。在过道的另一边,您的研究同事正在使用一种经典的、处理速度缓慢的化学发现算法,来潜在地锁定和优化最可持续和最节能的太阳能燃料分子。你突然意识到——你和你的同事正试图使用经典、传统的数据科学方法来揭示数十亿种环境数据的排列。
气候 R&D 设施的呆滞记录遵循现场实地测试和卫星数据可视化的习惯路线。按照惯例,气候科学家手动处理和分析卫星和野外数据库,以识别/预测离散的天气模式和现象。通过对这些数据的逐步逐块大规模解释,工程师和科学家有了有用的全球气候信息。在发现可持续能源的环境工程和材料科学领域,工程师必须在初始阶段考虑成百上千的现有能源材料。相比之下,**深度学习(DL)提供了一个以监督、半监督和非监督的方式从气候数据中分析和推断关键模式的机会。**从新的太阳能燃料分子的发现到更好的能源管理,机器学习有能力解释和重建大量数据,以便更好地可视化、预测和解决正在出现的气候危机。
1.新型节能材料的发现
在某些方面,我们可以将高度优化的分子能量结构的搜索与深度学习和药物发现的持续发展进行比较。更具体地说,强化学习(RL)、生成/预测网络和递归神经网络(RNN)的使用可以作为基于属性的化学设计的垫脚石。结合起来,RNNs 和生成模型能够制造新颖的文本副本,同时仍然保留周围角色的上下文。以长短期记忆(LSTM)网络的文本生成为例,这是一种 RNN,可以解析顺序数据,将数据存储在存储单元中,并学习在数据序列中传输数据。进一步,我们可以看一下文本生成的类比
Figure 2: Sentence Generation via predictions by an LSTM network.
LSTM 网络可以使用示例输入句子,并提取上下文中的单词种子,以提供下一个预测单词。这种句子的递归和连续生成只有通过首先向网络输入上下文中可理解的和结构化的句子才是可能的。网络能够将单词的种子序列存储到其存储器状态中,以提供下一个预测单词的预测,直到短语结束。现在,考虑到这一点,用一个包含数百万节能化学配方的数据库来取代这个包含数百万个句子的数据集。在药物发现中,这种类似的“完成句子”的方法被用于完成化学式的下一个字符。这种中央堆叠 RNN 可以由数百层构成,更重要的是,它包括一个强化学习(RL)网络,该网络基于结果预测优化对架构进行奖励和折扣。
Figure 3: RNN sequence prediction and optimization of drug SMILES, finally converted into molecular structures.
合成的节能复合物,如太阳能燃料中发现的那些,在所用化合物的配方中具有特定的物理和化学性质。理论上,研究人员将能够优化和放大,例如,在可持续能源中发现的光电化学电池或太阳能电池的特性。通过定位和表达这些离散的化学属性,研究人员可以将高效材料的搜索和验证范围缩小十倍以上。
2.自然灾害预测
Figure 4: Comparison of Acoustical data and Time to Failure in Kaggle’s 2019 Earthquake prediction challenge
另一方面,通过对大数据的预测和解释,防止自然灾害的间接和破坏性影响至关重要。事实证明,预测股票走势的相同预测算法也有可能预测地震活动、飓风前兆等。预测和预报高强度飓风、气旋和地震可以节省数十亿美元的经济成本,并保护分散在高风险地区的不发达地区的生计。大气气象数据的非线性和异常性造成了一种不稳定的局面,弱势群体中的科学家不知道会发生什么。然而,Sheila Alemany 等人题为**“使用递归神经网络预测飓风轨迹”**的研究论文利用完全连接的 RNN 来模拟飓风行为。作者基本上使用 RNN 自动回归和预测潜在飓风影响的轨迹和方向路线。以下轨迹揭示了模型预测的网格位置:
预测的 RNN 轨迹和验证轨迹之间的地面事实比较强调了深度学习的潜力,特别是完全连接的 RNNs-它们有能力根据之前训练的记忆状态预测数据中的输入序列。理论上,气候科学家可以将先前存在的气候数据专门化并扩展到更强大的存储库中,以巩固一个考虑到全球发生的自然灾害的模型。通过优化自然灾害预测的 rnn,人们可以在天气现象影响他们所在地区的几小时甚至几天前得到警告。此外,下一个序列的相同 RNN 预测可以用于从地震预测地震活动。
3.可扩展的农业设计和监测
Figure 6: Segmentation and highlighting of crop regions to predict their respective yields.
通过利用可追溯到 20 世纪晚期的实时哨兵卫星图像数据集,可训练模型可以部署到超精确水平上监测作物条件和特征。尽管已经实施了传统的作物监测方法,但卷积神经网络(CNNs 计算机视觉的使用可以分割负面的作物结果、干旱或破坏。更重要的是,一种称为“类别激活映射”(CAM)的方法可以用来监控给定田地中作物状态的强度,这种方法使用高度集中的特征对图像区域进行热图绘制。下面演示了航空影像上的类激活映射示例。网络的全局平均池层可防止过度拟合,并允许将多种图像输入尺寸输入到模型中,它采用每个传入特征地图的平均值,以给出网络聚焦位置的“某种”热图样式的可视化:
Figure 7: A Global Averaged neural network reveals localized “areas of trouble” on aerial satellite imagery
4。森林砍伐模式的空中追踪
Figure 8: Detection and Segmentation of Deforestation Patterns
森林砍伐占全球温室气体排放的近 10%,然而,人工追踪的古老方式可以被部署的计算机视觉应用程序所取代。最近的经济开发和森林砍伐的增加造成了一个关键的跷跷板,在这个过程中,一些地区的土地被置换、再利用或彻底毁坏。归根结底,森林砍伐是一个大规模的成本效益问题,需要自动化系统的密切监控。由于公共/私人毁林过程涉及多个部门和行业,计算机视觉可以被用来通过地面传感器和实时航空图像了解树木覆盖的损失,所有这些都在一个不断的反馈回路中相互连接。此外,可以利用机器学习来检测链锯的声音,以自动向当地执法部门发出非法砍伐森林活动的警报。通过实施分割算法(例如 UNET ),甚至可能是实时对象检测技术,可以实时检测森林砍伐区域的裸露斑块,并且可以通过算法按比例计算消除的森林面积。
5。创建更高效的基础设施
自从注入工业冷却、加热、通风、照明和电气维护的基础设施出现以来,由于对周围环境的不适当响应/敏感性,建筑物已经使用了过量的能量。换句话说,建筑中的物联网系统无法有效应对外部气候波动,从而相应地调整其能耗。通过使用天气预报、环境因素和一般建筑占用的聚合,机器学习-物联网主干可用于调整室内建筑温度,并进一步与电网通信以减少广泛的电力消耗,这取决于在给定时间低碳电力供应是否稀缺。理论上,建筑物可以使用 RNN 预测,并创建一个反馈回路,对 RNN 算法预测的阈值做出响应。一旦预测超过特定的敏感度阈值,建筑物就可以相应地调节其温度和能源效率,从而减少对电网的电力依赖。
Figure 9: Predictive/Analytical features of A.I. in Power Systems
6.可视化区域气候变化的影响
Figure 10: A Cycle-Consistent Style-Transfer GAN predicts Streetview images before and after extreme weather events.
传统的气候预测模型通常使用可量化的严重程度和轨迹来了解天气模式的风险。然而,对于土地所有者和公众来说,想象极端天气事件的后果可能很难理解或者难以理解。仅仅看图表上的轨迹和数字并不能告诉普通人潜在损害的程度。可视化预计的财产损失可以为房主、保险公司和城市承包商提供在高风险地区做好准备的更好的概念。Schmidt 等人的题为“使用周期一致的对抗网络可视化气候变化的后果”的研究论文利用周期一致的生成对抗网络(CycleGANs)在遭受破坏的房屋和正常的街景房屋之间转移风格,以预测极端天气的表面后果。
生成对抗网络(GANs)是一种特殊的生成模型,它使用对抗过程来匹配输出结果和输入分布。粗略地说,这个网络由两个竞争的极小极大模型组成——生成器和鉴别器。生产者可以被认为是一个欺诈性的伪造者,生产训练数据的虚假副本,而鉴别者是“执法人员”,识别和承认这些数据的虚假模仿。最终,鉴别器使用与发生器反向相关的损失函数。因此,如果鉴别器变得善于区分这些错误的分布副本,生成器就会自我改进。下图描述了 GAN 模型。
Figure 11: General Schematic of a GAN distinguishing the distribution probability of A (fake, generated) vs B (real).
在研究论文中,Schmidt 等人更进了一步——他们实施了周期一致损失/方法。循环一致性通过映射分布 A 和 B 来实现。如研究论文中所述,分布 A 可以是正常房屋的数据输入,而 B 被定义为毁坏的属性。通过领域适应(两个数据集之间特征的映射和连接),生成器学习如何将风格从一个被破坏的房子对抗性地转移到一个正常的房子。这种周期一致的风格转换过程可以帮助想象一个正常的房子如何承受极端天气模式的后果的高分辨率图像。下面的示意图是从最初的 CycleGan 论文中提取的,该论文的标题为“使用循环一致的对抗网络进行不成对的图像到图像的翻译”,该论文描述了映射函数和对抗鉴别器之间的映射函数。
Figure 11: Schematic of associated mapping functions and adversarial discriminators in a CycleGAN
结论
随着气候科学家在气候变化的环境中以更大的分析“马力”和更紧迫的条件前进,深度学习在大环境数据的监督-非监督操纵和解释中的出现是一个关键因素。从表面上看,气候变化是一种复杂且相互依存的过渡力量,它会根据农业、工业使用和能源效率水平等因素影响几代人。变化的环境不是一个具有连续变量的统一系统,而是一个具有不同变量以不同速率变化的无序系统。通过在高能材料创造、自然灾害预测、农业和森林砍伐监测以及基础设施物联网电力系统等用例中利用深度学习,效率的前沿可以在未来十年得到优化。
文献学
Alemany,S. (2018 年)。用递归神经网络预测飓风轨迹。 *Arxiv,*1–8。检索于 2019 年 6 月 30 日,来自 https://arxiv.org/pdf/1802.02548.pdf.
Cho,R. (2019)。人工智能——气候变化和环境的游戏规则改变者。检索自https://blogs . ei . Columbia . edu/2018/06/05/人工智能-气候-环境/
郝,k .(2019 . 6 . 20)。以下是人工智能帮助对抗气候变化的 10 种方式。检索于 2019 年 6 月 30 日,来自https://www . technology review . com/s/613838/ai-climate-change-machine-learning/
恩迪库马纳,E. (2018)。使用法国 Camargue 的多时相 SAR Sentinel-1 进行农业分类的深度循环神经网络。*遥感,*1–16。检索时间 2019 年 6 月 30 日。
鲁斯托维茨河(未注明日期)。多时相卫星图像的作物分类。斯坦福。检索自http://cs 229 . Stanford . edu/proj 2017/final-reports/5243811 . pdf
张,x(未注明)。通过深度学习方法用地震台网络定位地震。*语义学者,*1–14。检索时间 2019 年 6 月 30 日。
用数据科学的方法计算出一辆二手车的合理价格
使用 DS 方法计算二手车合理价格的整个过程。
介绍
计算二手车价格的一般方法是什么?你搜索类似的车辆,估计大致的基线价格,然后根据当前的里程、颜色、选择数量等进行微调。你使用领域知识和当前市场状态分析。
如果你深入了解,你可能会考虑在该国平均价格较高的不同地区销售该车。你甚至可以调查汽车在目录中列了多长时间,并检测定价过高的样品,以做出更明智的决定。
Original ad of late 1990s VW Passat estate in “Rosso corsa” color, which turned out to be the “average car” in Belarus according to dataset statistics
所以有很多要思考的,我在这里面对的问题是“有没有可能使用数据科学的方法(收集和清理数据,训练 ML 模型等。)能在痛苦的决策过程中节省你的时间和脑力?
我打开笔记本电脑,创建了一个新项目,并打开了计时器。
第一阶段。收集数据
不涉及太多细节:我已经设法在两天内收集了一个数据集,包含大约 40,000 个汽车广告,有 35 个特征(大部分是分类的)。收集数据本身并不太难,但是以一种有组织的方式来组织它需要一点时间。我用过 Python,Requests,Pandas,NumPy,SciPy 等。
关于这个特定数据集有趣的是,大多数分类特征没有以任何方式编码,因此可以很容易地解释(如engine _ fuel =“diesel”)。
第二阶段。着眼大局,处理不良数据
最初的数据分析很快发现了可疑的样本,包括 800 万公里里程表状态、10 升引擎掀背车、600 美元的混合柴油汽车等。我花了大约 6 个小时编写脚本来检测和处理这些问题。
可视化数据(我已经使用了 MatPlotlib 和 Seaborn )让我对整个市场形势有了很好的认识。
Odometer_value distribution (it is a distance traveled by a vehicle in kilometers)
大多数汽车都被频繁使用,平均里程数为 250,000 公里,这是一个很大的数字!我还注意到,人们更喜欢给里程表值分配一个好听的数字,比如 250,000 公里、300,000 公里、350,000 公里等等。一堆车有一百万公里里程表 _ 数值如果你看数值分布就没什么意义了。我可能认为 100 万公里更像是一种说法“这辆车见过很多,我真的不知道它的确切公里数。”
汽车定价背后的总体趋势非常直观:车越旧,价格越低。我希望车的年龄是整体特征层次中的第一特征。
此外,一般来说,车越老,里程表值越高,这是合理的。
为了构建价格 _ 美元散点图,我将最高汽车价格限制在大约 50,000 美元,并移除了几个百万级别的公里数里程表 _ 价值异常值。
实际上,价格低于 50,000 美元的汽车占目录的 99.9 %,因此散点图可以很好地反映价格趋势。
关于车龄:大部分车已经使用了一段时间,平均年 _ 产值为 2002。我认为,生产年份的分布(如下图所示)受从国外进口汽车的关税政策影响很大。
Distribution of the cars in the catalog by their production year.
价格分布( price_usd 将是模型训练期间该项目的目标值)高度向右倾斜,相应的平均价格和中间价格分别为 7,275 美元和 4,900 美元。
price distribution
像 up_counter (广告被手动推广的次数)这样的一些功能根本不能反映汽车的参数,但是既然这个数据已经有了,我决定把它包含到项目中。这种分布是如此的偏斜,以至于正确绘制的唯一方法就是使用对数标度。
distribution of up_counter metric
品牌受欢迎程度的分布对我来说并不意外,目录中最受欢迎的车型是大众帕萨特,白俄罗斯交通工具的传奇来源。
我还使用了 Tableau 来更好地显示制造商的市场份额和每个品牌的平均价格。
汽车拥有的照片数量的分布形状类似于价格 _ 美元分布(分布向右倾斜)。
Distribution of number of photos that listed cars have
也许汽车的价格越高,照片的数量就越多?
我做了一个联合图,它显示了轻微的相关性,但更重要的是,它清楚地表明,大多数汽车都很便宜,照片少于 15 张。
一些功能,如传动系统只是有趣的探索。在下面的柱状图中,你可以看到后轮驱动汽车的比例在过去 30 年中是如何下降的。
Histogram that illustrates the migration from rear-wheel drive to front- and all- wheel drive over the past years
数据集的整个相关矩阵如下所示(数据集中的大多数特征都是不言自明的,除了feature _ 0…feature _ 9:这些是布尔列,表示汽车具有合金车轮、空调等特征。)
Correlation matrix for the whole dataset
我不打算在这里发表完整的探索性分析,你可以在内核中查看。我花了大约 6 个小时(我还需要 60 个小时来修复数据集中有问题的样本)来挖掘数据和工程特征,直到那时我才进入模型训练。
第三阶段。模特培训
由于我已经清理了数据集,并应用了一些未来机器学习的特征工程,因此构建和训练基线模型轻而易举。
为了以最少的努力获得最大的结果,我使用了(Yandex 开发并开源的具有全面分类特征支持的决策树库上的梯度提升)。我已经在这个项目上花了太多时间,所以我只是将数据扔进模型中,调整学习率、树深度和系综中的数量树,训练几个模型,并开始用 SHAP (由斯科特·伦德伯格等人开发)探索模型决策。总时间:4 小时。
有趣的事实:在最初的预测探索阶段,我对模型的性能感到失望,开始探索错误,并发现我的数据集中的价格列被错误地解析,一些价格使用美元货币,一些价格使用白俄罗斯的国家货币:BYN。我已经修复了解析器的代码,再次收集数据,然后运行清理、特征工程和分析工作,并开始训练模型,结果好得多。
为了训练和评估第一个模型,我过滤掉了价格超过 30,000 美元的汽车(在探索阶段,我发现这些样本需要一个单独的模型)。
第四阶段。模型评估
我没有时间和计算资源来运行适当的网格搜索和顺序特征选择(SFS)作业,所以我只是调整了几次树的数量和学习速率,并使用 5 重交叉验证来评估模型的性能(检查完整的内核)。
Plot illustrates model training: number of trees on X-axis and MAE $ on the Y-axis
第一个像样的 CatBoost 模型让我达到了大约 1000 美元(平均绝对误差),这是 price_usd target 平均值的 15 %。准确地说,得分是:
**Best validation MAE score: $1019.18 on iteration 6413 with std $12.84**
我还使用 early_stopping 参数在验证分数停止变好时跳过进一步的训练。在没有试图以任何方式改进模型的情况下,我进入了预测分析。
Distribution of errors
查看真实值和预测值的误差分布和 2d 直方图不会告诉您太多关于预测质量的信息。
2d histogram plot for true and predicted values. You can notice the dense region below $3000 threshold
除了里程表 _ 值要素位置较低之外,数据集中要素的 SHAP 值等级(仅显示前 20 个要素)对我来说并不奇怪。你可以在类似和的文章中找到关于非参数模型解释的很好的解释。**
Summary_plot for top 20 features
车龄、品牌、车身类型、发动机容量和动力传动系统都是最重要的,这看起来非常合理。
**陈述事实证明这是一个有趣的特征:绝大多数汽车都是“被拥有的”,但也有一小部分“新”汽车(它们很贵)和一些“应急”车辆被损坏。
受损汽车的问题是显而易见的:该列是布尔型的,没有这种“紧急状态”的程度(稍后将详细介绍)。
第五阶段。使用领域知识探索个人预测,并找出模型的局限性
探索个人预测很快让我意识到模型和数据的局限性。我将列出一些样本,以便更好地理解模型的决策过程。
样品 0: 大众 T5 Caravelle,2009,机械变速箱,28.7 万公里,柴油。标价为13600 美元。** 预测值低 1,200 美元(该模型的 MAE 约为 1,000 美元,因此这是一个相当典型的情况)。****
Prediction interpretation (force_plot) for T5 Caravelle
你可以看到大众品牌和小型货车 body_type 做出个人贡献,使得一个样品的预测价格更高。**
Prediction interpretation (decision_plot) for T5 Caravelle
使用 SHAP,我们可以通过使用“决策图”功能以更好的方式绘制决策解释。
决策图最近被添加到库中,并提供了模型内部工作的更详细的视图。
与力图相比,决策图的主要优点是它们能够清楚地展示更多的特征。
你可以在这里阅读更多关于这种类型的剧情。
样本一: 奔驰 E270,2000,机械变速箱,46.5 万公里,柴油。标价为4999 美元。** 预测高出 198 美元。那一点也不坏!****
Prediction interpretation for E270 Mercedes
样品二: Jeep 大切诺基,2007,自动变速箱,16.6 万公里,柴油。标价是14500 美元。** 预测低 2796 美元。差预测,一看就是,但是车型已经列入目录 498 天了!感觉这个样品的价格定得太高了。也是在全国最穷的地区上市,那里的车一般都比较便宜,上市时间也比较长。****
Prediction interpretation for Jeep Grand Cherokee
样本三: 大众帕萨特,2012,自动变速箱,10.2 万公里,汽油。上市价格为11499 美元。** 预测低 64 美元。****
Prediction interpretation for VW Passat
样本四: VAZ 2107(俄罗斯车),1987 年,机械变速箱,12 万公里,汽油。标价是 $ 399 。 预测高出 34 美元。这是一个从价格范围的低端。
Prediction interpretation for VAZ 2107
我们可以看到这个样本的所有特征值是如何对预测价格产生负面影响的。
样本五:大众帕萨特 ,1992 年,机械变速箱,39.8 万公里,汽油。标价是750 美元。** 预测高出 721 美元(几乎是挂牌值的两倍)!为什么?****
Prediction interpretation for emergency VW Passat
Actual image of the “emergency” VW Passat sample
如果我们仔细观察模型解释,我们可以看到状态=紧急状态是预测价格的重要因素。对这一特殊情况的进一步人工调查显示,一辆汽车被倒下的树损坏。**
这显然是现有数据的局限性:布尔 T20 状态列根本不能反映损害程度的总体范围。我相信这个问题可以通过应用另外两种机制来“容易地”解决:使用某种预训练的深度 CNN 进行图像分析,以及使用 RNNs 从样本描述中提取实体。
我将以一辆豪华宝马 3 系结束这次样品挑选。
样本六:宝马 316 ,1994 年,机械变速箱,32 万公里,汽油。标价为1650。**** 预测高出 55 美元。我们可以清楚地看到,作为一个奢侈品牌给样本加分。****
Prediction interpretation for BMW 316
我花了大约 3 个小时研究模型的预测,并手动探索样本。
技术结论
我在整个数据集上使用 CatBoost 回归器获得了大约 1,000 美元的 MAE。但我也尝试对不同的型号使用相同的方法,并立即将误差减半至 500 美元。我相信,如果我们根据 year_produced 特征将数据集划分为子数据集,并在这些子数据集上训练多个模型,模型的性能会更好。
我也一直在想, duration_listed 特性可以用来惩罚数据集中的样本权重。例如,如果汽车上市一年,这可能意味着价格设置得太高,因此我们可以使用池功能将该样本的权重设置得较低。
总的来说,我觉得我训练的模型表现得相当不错,但是还有很大的改进空间。
关于这个项目中使用的技术:CatBoost 似乎是正确的选择,因为它提供了很好的开箱即用的分类特性支持。在 2019 年的 MacBook pro 上进行 5 重交叉验证的训练需要大约 13 分钟,但如果我在一个数据集中有数百万个样本,这不是问题,因为 CatBoost 支持在 GPU 上进行训练。它还具有非常快的预测时间,这有助于模型进入生产。
总体结论
在这次冒险中,我试图回答的问题是“如果你打算出售自己的汽车,使用数据科学方法是否合理?”*这个问题的明显答案是否:如果你只是在网上手动搜索类似的车辆,你会更容易算出价格。我花了几天时间以一种简单的方式完成了这个项目,我还可以做很多事情来提高模型的性能,如应用适当的特征选择、网格搜索等。*****
同时,如果你有成百上千辆车要卖,答案肯定是是的。使用 Python 和丰富的数据科学包生态系统,您可以自动化收集数据、构建分析和训练预测模型的工作。你还可以发现趋势,预测市场的未来。您可以将模型隐藏在一些 API 之后,这样它们就可以以可靠和方便的方式服务于业务。****
还有更多。如果你经营从国外进口二手车的业务,你可以训练单独的 ML 模型,根据它们对公司的盈利能力对样本进行排序。你也可以预测这些样品在实际交易前的上市时间。你甚至可以选择合适的地区进行销售。如果你有足够的数据,可能性是无限的。
但如果你只是为自己做这种兼职项目,你会像我一样获得巨大的乐趣!
感谢阅读,我希望你喜欢这篇文章,你可以检查我的内核和一个数据集。如果您有任何反馈,可以通过 LinkedIn 联系我。
最终确定:棒球是精英中的精英
今天看迈克·特劳特就相当于看…不穿鞋的乔·杰克逊?
Hank Aaron (https://baseballhall.org/discover/hank-aaron-715-hr-ticket)
棒球迷喜欢将现在的球员与过去的传奇进行比较。迈克·特劳特和米奇·曼托一样有天赋,比利·汉密尔顿可以和里奇·亨德森一起大步奔跑,或者哈维尔·贝兹的电动风格可以和杰基·罗宾逊相媲美。年长的粉丝会做这些比较,但是对于像我这样的年轻粉丝,我怎么知道他们让终身粉丝想起了谁?我没有看到汉克·亚伦的进攻优势。皮特罗斯铁路捕手在本垒板。雷吉·杰克逊无可匹敌的力量。旧视频可以展示这些职业生涯的精彩时刻,但不能真实地反映这些球员每天都在做什么。
更不用说也许我们的祖父母也不知道他们在说什么。据我所知,你不能在 MLB 的电视节目上看 27 年的扬基队或 55 年的道奇队。我们都偏向于我们最喜欢的球员,并认为他们比生活更重要。米奇·曼托被认为是一代人中最伟大的中外场手,但他是最受欢迎的球队中最好的球员。有没有可能他所有的炒作都是因为人们太喜欢他了?
但是如果我们能更进一步呢?与其拿球员相互比较,不如拿单个球员赛季相互比较,看看哪个单个赛季的表现是相称的。
今天我会给大家上一堂课,告诉大家我们如何比较 MLB 历史上最伟大的常规赛进攻表现,并对有史以来最好的进攻赛季和球员进行排名。
对于任何对数据集和代码感兴趣的人,你可以在我的 GitHub 上看到我的项目:https://GitHub . com/anchor p34/MLB-Clustering/blob/master/MLB % 20 Clustering % 20 analysis . ipynb
进攻统计细目
首先,让我们从提供的攻击性统计数据中看一个例子。我最喜欢的球员,科罗拉多洛矶队的诺兰·阿雷纳多,有 2013-2018 年的比赛。
Offensive statistics from Nolan Arenado’s seasons in the MLB
这显示了他进攻赛季的基本统计数据,如比赛,击球,跑垒,安打,本垒打,打点等。凭借我的棒球背景,我知道一些用于评估进攻表现的其他指标。
Baseball statistics that are common in evaluating a player’s performance
随着新的变量的加入,有一个完整的进攻分解,这应该给一个球员一个赛季的进攻表现足够的洞察力。
进攻性百分位数
为了比较不同赛季的球员,直接比较原始数据是没有效率的。例如,这是一个赛季中击球次数超过 50 次的球员的平均联盟击球率的时间序列:
League average of batting averages from players with more than 50 at bats.
如果一名球员在 1975 年打出了 0.300 的胜率,这将比一名球员在 2000 年打出 0.300 的胜率更令人印象深刻。所以,我们应该从每个进攻类别的那个赛季的球员中抽取百分位数,并在从 0 到 1 的范围内对他们进行排名。在 1975 年达到 0.300 的人可能在 0.9 百分位(或 90 百分位),在 2010 年达到 0.300 的人可能在 0.75 百分位。
做了这些调整后,阿雷纳多现在每个进攻类别的百分位数是:
Offensive percentiles of Nolan Arenado for each season.
下面是诺兰每一季表现的快速分析:
- 2018 年,诺兰在打点的第 99 个百分点,这意味着只有 1%的 MLB 人比他有更多的打点
- 他的 OBP 每年都增加或保持不变,显示了他在进攻方面的进步
- 2015 年,他的击球率、全垒打和打点都排在第 99 位,这表明他是一个非常强大的击球手
但这是否意味着诺兰·阿伦纳多在 2015 年是一个有价值的击球手?
诺兰是在大多数进攻类别的上百分位数,但这些是正确的类别被认为是一个有价值的击球手吗?MVP 候选人在这些类别中也很普遍吗?聚类算法可以帮助识别这些字段。
但是,我们不希望聚类算法将每个聚类分成相等的部分。我们希望真正有价值的球员都聚集在一起,并与其他人分开,与其他人相比,这应该是一个较小的百分比。
聚类后,应该有三组玩家:
第一组:平均或低于平均水平的玩家
第二组:高于平均水平的玩家
第三组:该赛季的最佳球员
在对标准化数据进行一些分析后,我们得到了以下细分:
- 平均或低于平均水平的玩家:MLB 人口的 40%
- 高于平均水平的玩家: 35%的 MLB 人口
- 那个赛季的最佳球员: 25%的 MLB 人口
这种分布有点太均匀了。4 个球员中有 1 个被认为是联盟最好的?要真正得到我们感兴趣的顶尖选手,需要更少的钱。再做一个调整,无论那个球员在那个赛季的进攻类别中是否在前 5 个百分点,数据都可以被解释为更多的二进制:
Data converting data into binary outputs depending on whether Nolan Arenado was in the top 5 percentile of that offensive category for that season.
现在我们可以看到,在 2015 年,诺兰在我们感兴趣的 18 个类别中的 13 个类别中都位于前 10%。运行与以前相同类型的聚类算法,新的细分变成
- 平均或低于平均水平的玩家: 82%的 MLB 人口
- 高于平均水平的玩家:MLB 人口的 10%
- 给定赛季的最佳球员:MLB 人口的 8%
完美!这将大多数 MLB 球员的脂肪切除,以确保最佳赛季被确定。为了仔细检查,我们可以查看 2015 赛季所有顶级球员:
Some players who were in the top group for the 2015 season
2015 赛季的 MVP 乔什·唐纳森和布莱斯·哈珀以及阿雷纳多都被列入其中。算法正如我们预期的那样工作。
在确定最佳球员时,哪些进攻类别最具优势?
随着球员现在每年被分配到一个集群,我们可以看到有百分之多少的球员在那个赛季的进攻类别。下面的热图对此进行了分解。
Cluster 2 is considered the best players in the MLB. We can see that offensive categories like RBI, OPS, and HR/G are the values that separate them from the rest of the pack
浏览图表,聚类 0 属于低于平均水平的玩家,聚类 1 属于高于平均水平的玩家,聚类 2 属于最高水平的玩家。从 RBI 类别开始,第 2 组中 86%的球员在他们的赛季中处于该类别的前 5 个百分点。就 OPS 而言,83%的集群 2 玩家在该赛季处于前 5%的位置。
总的来说,分类 RBI、HR、OPS、SLG 和 HR/G 是将集群 2 与其他分类区分开的字段。所有这些领域都与幂数有关。当确定谁是联盟中最好的球员时,你首先应该看的是实力数字。
季节对比
有些赛季是由个别明星的影响力决定的,有些则是由主流球队决定的。下面的线形图显示了集群 2 中的普通玩家有资格参与的进攻类别的数量。例如,在 2001 赛季中,第 2 组的玩家平均在大约 12 个类别中处于前 5%的位置。
This line chart shows the average number of offensive categories a player in cluster 2 has in each season. The high points show the dominance of them in a season, low points show that the season was more evenly distributed throughout the league.
从图中可以看出,自 2003 赛季以来,随着波动性的平息,背靠背的几年中有很多起伏。20 世纪 80 年代和 90 年代,棒球的类固醇时代每年都在创造新的超级明星,这种趋势越来越明显。
那么,谁是有史以来排名第一的人?
The best individual offensive seasons in MLB history
但是谁拥有有史以来最具统治力的进攻赛季呢?当谈到最具统治力的球员时,人们通常会想到汉克·亚伦、巴里·邦兹和贝比·鲁斯这样的球员;然而,左边的图表有一些其他的想法。首先,圣·穆萨尔和卢·格里克分别三次名列前茅,这很了不起。许多人都认为迈克·特劳特是下一代伟大的天才,这是有道理的。在过去的 15 年里,他是唯一一个拥有真正统治性赛季的球员。甚至三冠王米格尔·卡布雷拉的 2012 赛季也以总共 16 个赛季结束,显示了这些赛季是多么不可思议。
能够看到迈克·特劳特与泰德·威廉姆斯在 1946 年或格赫里希在 1927 年的统治地位,这是一种理解这些赛季有多不可思议的惊人方式。
最后,我们可以看看那些在 MLB 排行榜上拥有至少 5 年职业生涯的球员。
Players with the highest career Top Tier Percentage who played at least 5 years in the MLB
这个数据集表明,弗兰克·罗宾逊,按照聚类标准,在他 20 年的职业生涯中有 19 年是顶级球员,是有史以来接触棒球场最具攻击性的巨头。就我个人而言,我看着汉克·亚伦和巴里·邦兹的黄金标准,他们都有着惊人的数据,是我玩过这个游戏的最顶尖的两个玩家,但是算法说不是这样。最后,今天比赛中最好的球员,迈克·特劳特,以这种速度将不得不成为有史以来最好的球员之一。到目前为止,谁是他最好的对手?不是别人,正是臭名昭著的赤脚乔·杰克逊。
像威利·梅斯这样被人们认为是有史以来最伟大的球员呢?上面的图表显示了在给定的赛季中,他们被认为是联盟中最好的球员之一的次数除以职业生涯赛季总数。由于他在联盟的最后几年,梅斯在这个排名中受到了惩罚。在他 22 年的大联盟生涯中,有 16 年他被认为是伟大的,这让他获得了 73%的顶级百分比。
通过聚类算法,我们能够跨赛季比较游戏中的球员,以给出当今哪些球员与棒球不朽者匹配的真实视角。理解像 RBI,HR,OPS,SLG 和 HR/G 这样的进攻类别是这些球员在一个赛季中被认为是精英的驱动力,可以更准确地描述是什么让球员成为 MVP 候选人和全明星。
对于那些因为自己最喜欢的球员没能上榜而感到沮丧的人,我很抱歉。我还在想怎么让 Arenado 也来。
但是坚持住,坚持住!杰夫·巴格韦尔榜上有名,但德瑞克·基特榜上无名?皮特·罗斯在哪里?他们不被认为是令人讨厌的坏男孩吗?一定是哪里出了问题,对吗?还是……他们不应该属于这一类?这可能需要另一次深度潜水…
财务分析—股票数据的探索性数据分析
随着分析越来越多地渗透到我们生活的方方面面,金融业无疑是最早抓住这一趋势的行业之一。鉴于金融科技和金融领域的市场规模不断扩大,传授一些金融技能将是一件好事!
注意:这篇文章旨在教你一些操作股票数据集的基础知识,而不是让你成为一个定量分析师/股票经纪人/算法交易员。为了在这些领域取得进步,你肯定需要更多的交易、金融和计算方面的知识。
1。导入数据
你需要的大部分金融数据都可以在雅虎财经上轻松找到!你只需要输入股票数据,点击历史数据
source: https://sg.finance.yahoo.com/quote/FB?p=FB&.tsrc=fin-srch
之后,设置合适的时间段,记得点击应用!(见鬼,当我第一次开始时,我一直想知道为什么我下载的 csv 没有给我正确的时间框架)
source: https://sg.finance.yahoo.com/quote/FB/history?p=FB
对于本教程,我将使用脸书 2019 年 6 月 18 日至 6 月 16 日的数据。下面是我将用来操作数据的库
import pandas as pd
import numpy as np
from scipy.stats import norm
像往常一样,在我们做任何进一步的分析之前,我们应该总是检查数据并理解数据帧
df = pd.read_csv('stock data/FB_16June18_16June19.csv')
df.head()
接下来,我们将使用 df.info()检查数据帧的数据类型
在这里,我们可以看到“日期”列显示为对象,而不是日期时间数据类型。当我们绘制直方图/折线图时,这可能会有问题,所以我们首先将其转换为日期时间对象
df['Date'] = pd.to_datetime(df['Date'])
现在让我们再次检查数据类型
不错!我们现在已经将“日期”列变成了日期时间对象!
2.测绘
是时候进口神奇的东西了
import matplotlib.pyplot as plt
%matplotlib inline
matplot 库给了我们制作强大图表的能力,让我们对股票有了更深入的了解
plt.figure(figsize=(20,8))
plt.plot('Date','Close',data=df)plt.xlabel('Date')
plt.ylabel('Close Price')
plt.xticks(rotation=45)
如果你一直关注财经新闻,你会知道 7 月份的大幅下降是因为脸书没有达到他们的收入目标,而 1 月份是因为隐私问题。
3.创建列
现在,让我们创建一些有用的列来对股票进行一些有趣的推断
首先,我们将创建“每日滞后”列,它基本上只是将“收盘”价格向后移动一天。(注意:我们通常可以使用各种指标,但为了方便起见,我选择了“接近”)
df['Daily Lag'] = df['Close'].shift(1)
df.head()
创建“每日滞后”的原因是为了让我们创建“每日回报”列
source: http://www.crsp.com/products/documentation/crsp-calculations
每日回报告诉我们在股价收盘后一天内获得的回报(咄!)
df['Daily Returns'] = (df['Daily Lag']/df['Close']) -1
df.head()
4.更多绘图
现在,让我们看看“每日收益”
我们意识到,如果我们使用默认 bin=10,就很难辨别形状。让我们把它增加到 20。在此之前,让我们找到均值和标准差。
mean = df['Daily Returns'].mean()
std = df['Daily Returns'].std()
print('mean =',mean)
print('Std deviation =',std)
哎哟,一般来说回报是负的,但是请记住,这只考虑了每天的回报,所以它只是告诉你,一般来说,如果你在同一天买入和卖出,你将会亏损。
df['Daily Returns'].hist(bins=20)
plt.axvline(mean,color='red',linestyle='dashed',linewidth=2)
#to plot the std line we plot both the positive and negative values
plt.axvline(std,color='g',linestyle='dashed',linewidth=2)
plt.axvline(-std,color='g',linestyle='dashed',linewidth=2)
最后,我将向您介绍峰度值。
source: https://community.plm.automation.siemens.com/t5/Testing-Knowledge-Base/Kurtosis/ta-p/412017
峰度告诉你尾部的“肥度”,这很重要,因为它告诉你这些值能有多“极端”。
在我们的例子中,该值为正,因此这表明出现“极端”值的可能性很小。(注意:实际确定这一点的正确方法是使用 Z 值,我将在另一个单独的教程中展示它!)
5.结论
这是一个非常简单的演练,对股票数据的一些操作进行探索,并发掘一些简单的见解!肯定还有更多要发现,但我认为这是一个教程已经很多了!
我将在以后的教程中使用 python 写更多关于进一步的统计分析,甚至一些交易技术,如快慢线和布林线。
所有代码都来自我自己的 Jupyter 笔记本,我可能会很快上传到我的 github,所以保持警惕!
金融机器学习第 0 部分:棒线
前言
最近,我拿到了一份由马科斯·洛佩兹·德·普拉多撰写的金融机器学习进展。洛佩兹·德·普拉多是著名的量化研究员,在他的职业生涯中管理了数十亿美元。这本书对任何对数据科学和金融感兴趣的人来说都是一个惊人的资源,它提供了关于如何将先进的预测技术应用于金融问题的宝贵见解。
本文是致力于将 Lopez de Prado 介绍的方法应用于真实(有时是合成)数据集的系列文章的第一篇。我的希望是,通过写这些帖子,我可以巩固我对材料的理解,并分享一些经验教训。
事不宜迟,让我们继续这篇文章的主题:酒吧。
wrong kind of bar
什么是酒吧?
构建一个好模型的第一步是将数据聚集成一种方便的格式,以便进一步分析。条指的是包含金融资产价格变动最基本信息的数据表示。典型的棒线可能包含时间戳、最高价、开盘价和收盘价等特征。
HLC bar chart (stockcharts.com)
条形图通常是用于训练和测试 ML 预测器的输入数据格式。很容易想象,原始数据的聚合方式会对整个模型产生重大的下游影响。
动机
尽管以固定的时间间隔(例如每天/每小时/每分钟等)进行价格观察似乎很直观。,这不是一个好主意。通过市场的信息流在一段时间内不是均匀分布的,并且在某些时段会有较高的活动,例如在开市后的一个小时内,或者就在期货合约到期之前。
我们的目标必须是一个条形图,其中每个条形图包含相同数量的信息,但是基于时间的条形图会对慢速时段进行过采样,而对高活动时段进行欠采样。为了避免这个问题,这个想法是抽样观察作为市场活动的一个功能。
设置
使用交易账簿数据集,我们将为实际金融工具构建多种类型的棒线。我将使用在 BitMex 上市的比特币永久掉期合约的数据作为 XBT ,因为谈论比特币是这些天令人兴奋的事情,也因为交易账簿数据在这里可用。我们将比较时间棒线和分笔成交点棒线、成交量棒线、美元棒线和美元不平衡棒线。提供了 Python 3 片段以供参考。
首先,做一点设置:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime# raw trade data from [https://public.bitmex.com/?prefix=data/trade/](https://public.bitmex.com/?prefix=data/trade/)
data = pd.read_csv(‘data/20181127.csv’)
data = data.append(pd.read_csv(‘data/20181128.csv’)) # add a few more days
data = data.append(pd.read_csv(‘data/20181129.csv’))
data = data[data.symbol == ‘XBTUSD’]
# timestamp parsing
data[‘timestamp’] = data.timestamp.map(lambda t: datetime.strptime(t[:-3], “%Y-%m-%dD%H:%M:%S.%f”))
时间条
我们现在已经为 BitMex 上的 XBTUSD 股票载入了几天的交易数据。让我们来看看以 15 分钟为间隔计算的成交量加权平均价格是什么样的。如前所述,这种表示与市场信息流不同步,但是,我们将使用它作为基准进行比较。
def compute_vwap(df):
q = df['foreignNotional']
p = df['price']
vwap = np.sum(p * q) / np.sum(q)
df['vwap'] = vwap
return dfdata_timeidx = data.set_index('timestamp')
data_time_grp = data_timeidx.groupby(pd.Grouper(freq='15Min'))
num_time_bars = len(data_time_grp) # comes in handy later
data_time_vwap = data_time_grp.apply(compute_vwap)
XBT time bars
请注意,我们在最后一个系列中保存了小节数。为了比较不同的方法,我们希望确保我们有大致相同的分辨率,以便比较是公平的。
刻度条
分笔成交点背后的想法是每 N 个交易采样一次观察值,也称为“分笔成交点”,而不是固定的时间段。这允许我们在很多交易发生时获取更多的信息,反之亦然。
total_ticks = len(data)
num_ticks_per_bar = total_ticks / num_time_bars
num_ticks_per_bar = round(num_ticks_per_bar, -3) # round to the nearest thousand
data_tick_grp = data.reset_index().assign(grpId=lambda row: row.index // num_ticks_per_bar)data_tick_vwap = data_tick_grp.groupby('grpId').apply(compute_vwap)
data_tick_vwap.set_index('timestamp', inplace=True)
这与时间条系列相比如何?
XBT time and tick bars
将两者放在一起,你可能会注意到时间条(蓝色)中隐藏了约 10%的暴涨和暴跌(黄色)。根据你的策略,这两个事件可能意味着巨大的交易机会(均值回归)或交易成本(滑点)。
音量条
分笔成交线的一个缺点是,不是所有的交易都是平等的。考虑购买 1000 份合约的订单作为一个交易执行,100 份合约的 10 份订单将计为 10 个交易。考虑到这种有些武断的区别,不管发生了多少交易,对每 N 份交易合同进行抽样观察可能是有意义的。由于 XBT 是 BTC 掉期合约,我们将以 BTC 来衡量交易量。
data_cm_vol = data.assign(cmVol=data['homeNotional'].cumsum())
total_vol = data_cm_vol.cmVol.values[-1]
vol_per_bar = total_vol / num_time_bars
vol_per_bar = round(vol_per_bar, -2) # round to the nearest hundreddata_vol_grp = data_cm_vol.assign(grpId=lambda row: row.cmVol // vol_per_bar)data_vol_vwap = data_vol_grp.groupby('grpId').apply(compute_vwap)
data_vol_vwap.set_index('timestamp', inplace=True)
XBT time and volume bars
请注意,成交量图显示了比分笔成交点更剧烈的上涨和下跌(4100+对 4000+的峰值和 3800-3900+的低谷)。到目前为止,为条形选择的聚合方法会影响数据的表示方式,这一点应该已经很明显了。
美元吧
即使这里使用的数据集很小,您可能会注意到,当 BTC 相对于美元的价值在短短 3 天内移动超过 20%时,作为 BTC 交易数量的函数对数据进行采样是没有意义的。在 11 月 27 日上午买入 1 BTC 和在 11 月 29 日晚上买入 1 BTC 是一个截然不同的决定。这种价格波动是美元棒线背后的基本原理——作为美元(或你选择的货币)交换函数的采样,理论上应该使频率对价值波动更加稳健。
# code omitted for brevity
# same as volume bars, except using data['foreignNotional'] instead of data['homeNotional']
XBT dollar bars
请注意,BTC 成交量棒线在 11–28 00 和 11–29 00 附近显示了几乎相同的跳跃,但是美元棒线在 11–28 00 的初始峰值与后者相比看起来相对温和。
dollar bars vs BTC volume bars
这是由抽样引起的差异的一个主要例子——尽管许多比特币在 01 年 11 月 28 日左右易手,但当时它们的美元价值相对较低,因此该事件被描述为不太严重。
不平衡条
不平衡棒是 MLDP 称之为“信息驱动”的那种棒。这些扩展了替代酒吧的想法,以更先进的方法。不平衡棒线特别试图在买卖活动异常不平衡时取样,这可能意味着市场参与者之间的信息不对称。基本原理是,消息灵通的交易者要么大量买进,要么大量卖出,但很少同时做两件事。当不平衡事件发生时,取样可以让我们关注大的波动,忽略不太有趣的时期。
实施美元失衡杠
实现不平衡棒保证了更详细的解释。给定每个分笔成交点的美元数量和价格,流程如下:
- 计算签名流:
- 计算分笔成交点方向(价格变化的标志)。
- 将分笔成交点方向乘以分笔成交点体积。
2.累积不平衡棒线:
- 从第一个数据点开始,遍历数据集,跟踪累积的带符号流量(不平衡)。
- 只要不平衡的绝对值超过预期的不平衡阈值,就取样。
- 当您看到更多数据时,更新不平衡阈值的期望值。
让我们进一步展开这些步骤。
1.1 计算滴答方向:
给定一系列 N 分笔成交点{ ( p [ i ],v[I]},其中I∈1……N的 p [ i 是相关价格, v [ i 是美元交易量,我们首先计算变化
δp[I]:=p[I-p[I-1]
b[I]:= b[I-1]如果δp[I]= 0
b[I]:= sign(δp[I])否则
幸运的是,在我们的数据集中,刻度方向已经给了我们,我们只需要将它们从字符串转换成整数。
def convert_tick_direction(tick_direction):
if tick_direction in ('PlusTick', 'ZeroPlusTick'):
return 1
elif tick_direction in ('MinusTick', 'ZeroMinusTick'):
return -1
else:
raise ValueError('converting invalid input: '+ str(tick_direction))data_timeidx['tickDirection'] = data_timeidx.tickDirection.map(convert_tick_direction)
1.2 计算每个节拍的符号流:
签约流量[I]:=b[I]*v[I]为第 i 步的美元成交量
data_signed_flow = data_timeidx.assign(bv = data_timeidx.tickDirection * data_timeidx.size)
2。累积美元不平衡棒线
为了计算美元不平衡棒线,我们通过数据向前推进,跟踪自上一个样本以来的不平衡,并在不平衡的幅度超过我们的预期时取样。该规则详述如下。
样品栏何时:
|不平衡| ≥预期不平衡
哪里有
实验。不平衡:=(每根棒线的预期分笔成交点数)* |每笔分笔成交点的预期不平衡|
我们将 t 分笔成交点子集的不平衡定义为θ[t]:=∑b[I]** v*[I]对于 i∈1…t
让 T 表示每根棒线的分笔成交点数量,它不是常数。然后,Eₒ[ T 是每根棒线的预期分笔成交点数量,我们将其估计为先前棒线的 T 值的指数加权移动平均值。
最后,我们估计每一个分笔成交点的预期不平衡,eₒ[b * v*,*为先前棒线的 b[i]*v[i]值的指数加权移动平均值。
综上所述,我们必须逐步迭代数据集,每隔 T* 个节拍采样一次,定义如下
t := arg min(t)s . t . |θ[t]|≥eₒ[t]** |eₒ[b * v|
本程序的重要注意事项:
- 开始时,我们没有任何先前的棒线作为我们估计的基础,所以我们必须为计算第一个阈值提供初始值。
- 随着算法累积越来越多的条,EWMA 估计“忘记”初始值,取而代之的是更新的值。确保您设置了足够高的初始值,以便算法有机会“预热”估计值。
- 该算法对用于 EWMA 的超参数非常敏感。因为没有直接的方法来获得与前面演示中相同数量的条形,所以我们将只选择最方便/合理的超参数。
记住这一点,让我们把逻辑放到代码中。我使用来自 stackexchange 的 EWMA 的快速实现。
from fast_ewma import _ewmaabs_Ebv_init = np.abs(data_signed_flow['bv'].mean())
E_T_init = 500000 # 500000 ticks to warm updef compute_Ts(bvs, E_T_init, abs_Ebv_init):
Ts, i_s = [], []
i_prev, E_T, abs_Ebv = 0, E_T_init, abs_Ebv_init
n = bvs.shape[0]
bvs_val = bvs.values.astype(np.float64)
abs_thetas, thresholds = np.zeros(n), np.zeros(n)
abs_thetas[0], cur_theta = np.abs(bvs_val[0]), bvs_val[0] for i in range(1, n):
cur_theta += bvs_val[i]
abs_theta = np.abs(cur_theta)
abs_thetas[i] = abs_theta
threshold = E_T * abs_Ebv
thresholds[i] = threshold
if abs_theta >= threshold:
cur_theta = 0
Ts.append(np.float64(i - i_prev))
i_s.append(i)
i_prev = i
E_T = _ewma(np.array(Ts), window=np.int64(len(Ts)))[-1]
abs_Ebv = np.abs( _ewma(bvs_val[:i], window=np.int64(E_T_init * 3))[-1] ) # window of 3 bars return Ts, abs_thetas, thresholds, i_sTs, abs_thetas, thresholds, i_s = compute_Ts(data_signed_flow.bv, E_T_init, abs_Ebv_init)
我们来绘制|θ[ t ]|和不平衡阈值(eₒ[t]* |eₒ[b * v]|)看看是怎么回事。
Threshold vs. magnitude of imbalance
似乎在上升趋势加快的地方和同一趋势反转的地方附近,采样频率较高。在我们可视化条形之前,我们需要相应地对分笔成交点进行分组。
根据计算出的边界将分笔成交点聚集成组
n = data_signed_flow.shape[0]
i_iter = iter(i_s + [n])
i_cur = i_iter.__next__()
grpId = np.zeros(n)for i in range(1, n):
if i <= i_cur:
grpId[i] = grpId[i-1]
else:
grpId[i] = grpId[i-1] + 1
i_cur = i_iter.__next__()
综合来看:美元不平衡棒线
data_dollar_imb_grp = data_signed_flow.assign(grpId = grpId)
data_dollar_imb_vwap = data_dollar_imb_grp.groupby('grpId').apply(compute_vwap).vwap
Dollar imbalance bars
我们看到,当趋势发生变化时,DIB 倾向于采样。它可以被解释为包含相同数量的关于趋势变化的信息的 DIB,这可以帮助我们开发趋势跟踪的模型。
摘要
我们已经使用了一个交易账簿数据集来计算 BTC 掉期合约的时间、价格点、美元、成交量和美元不平衡棒线。每种替代方法讲述了一个略有不同的故事,每种方法都有优势,这取决于市场微观结构和特定的用例。
为了进一步探索这一点,考虑测量每个条形序列的统计属性,如峰度和序列相关性,以查看哪些条形更容易用 ML 算法建模。我希望你喜欢这个演示,如果你发现错误或有任何问题,请联系我们!
金融机器学习第 1 部分:标签
设置监督学习问题
介绍
在的上一篇文章中,我们探讨了几种为金融工具收集原始数据的方法,以创建被称为棒线的观察值。在这篇文章中,我们将关注机器学习管道的下一个关键阶段——标记观察。提醒一下,机器学习中的标签表示我们想要预测的随机变量的结果。
就像本系列的其余部分一样,这篇文章中显示的技术是基于 金融机器学习的进步 由 马科斯洛佩兹德普拉多 。我推荐你去看看这本书,它对这个问题有更详细的论述。话虽如此,是时候跳进水里游一游了。
标记观察
在金融环境中,解决监督学习问题的一个简单方法是尝试预测某个工具在未来某个固定时间范围内的价格。请注意,这是一个回归任务,即我们试图预测一个连续的随机变量。这是一个很难解决的问题,因为价格是众所周知的嘈杂和序列相关的,并且所有可能的价格值的集合在技术上是无限的。另一方面,我们可以将此视为一个分类问题—我们可以预测离散化的回报,而不是预测精确的价格。
大多数金融文献使用固定范围标记方法,即根据未来某个固定步数的回报来标记观察值。标签由利润和损失阈值离散化:
这种标记方法是一个良好的开端,但它有两个可解决的问题。
- 阈值是固定的,但波动性不是——这意味着有时我们的阈值相距太远,有时又太近。当波动性较低时(例如,在夜间交易时段),我们将获得大部分的 y= 0 标签,即使低回报是可预测的且具有统计显著性。
- 标签是路径独立的,这意味着它只取决于地平线上的回报,而不是中间回报。这是一个问题,因为标签没有准确反映交易的现实——每个策略都有止损阈值和止盈阈值,可以提前平仓。如果中间回报触及止损阈值,我们将实现亏损,持有头寸或从中获利是不现实的。相反,如果中间回报达到获利阈值,我们将关闭它以锁定收益,即使回报为零或为负。
计算动态阈值
为了解决第一个问题,我们可以将动态阈值设置为滚动波动率的函数。我们假设在这一点上我们已经有了 OHLC 酒吧。我使用 BitMex:XBT 的美元条,这是上一篇文章中的比特币永久互换合约——如果你是从零开始,这个代码片段将帮助你赶上。
在这里,我们将估计每小时的回报率波动,以计算利润和损失的阈值。下面你会发现一个直接来自 Lopez De Prado 的稍加修改的函数,为了清楚起见还添加了注释:
def get_vol(prices, span=100, delta=pd.Timedelta(hours=1)):
# 1\. compute returns of the form p[t]/p[t-1] - 1 # 1.1 find the timestamps of p[t-1] values
df0 = prices.index.searchsorted(prices.index - delta)
df0 = df0[df0 > 0] # 1.2 align timestamps of p[t-1] to timestamps of p[t]
df0 = pd.Series(prices.index[df0-1],
index=prices.index[prices.shape[0]-df0.shape[0] : ]) # 1.3 get values by timestamps, then compute returns
df0 = prices.loc[df0.index] / prices.loc[df0.values].values - 1 # 2\. estimate rolling standard deviation
df0 = df0.ewm(span=span).std()
return df0
添加路径依赖:三重屏障法
为了更好地结合假设交易策略的止损和止盈场景,我们将修改固定范围标记方法,以便它反映哪个障碍首先被触及——上限、下限或范围。因此得名:三重屏障法。
Triple-Barrier Label y=0 | Source: quantresearch.org
标签模式定义如下:
y= 1 :首先碰到顶部护栏
y= 0 :先击中右侧护栏
y= -1 :首先碰到底部护栏
赌的一方呢?
上面的模式适用于只做多的策略,但是当我们同时考虑多头和空头时,事情就变得复杂了。如果我们做空,我们的盈利/亏损与价格走势相反——价格下跌时我们盈利,价格上涨时我们亏损。
“Because I was inverted” — Maverick | Top Gun
为了说明这一点,我们可以简单地将侧表示为长 1,短-1。因此,我们可以将我们的收益乘以边数,所以每当我们做空时,负收益变成正收益,反之亦然。实际上,如果侧 =-1,我们翻转 y =1 和 y =-1 标签。
让我们试着实现一下(基于 MLDP 的代码)。
首先,我们定义了获取视界屏障时间戳的程序:
def get_horizons(prices, delta=pd.Timedelta(minutes=15)):
t1 = prices.index.searchsorted(prices.index + delta)
t1 = t1[t1 < prices.shape[0]]
t1 = prices.index[t1]
t1 = pd.Series(t1, index=prices.index[:t1.shape[0]])
return t1
现在我们有了我们的水平障碍,我们定义一个函数,根据前面计算的波动率估计值设置上限和下限:
def get_touches(prices, events, factors=[1, 1]):
'''
events: pd dataframe with columns
t1: timestamp of the next horizon
threshold: unit height of top and bottom barriers
side: the side of each bet
factors: multipliers of the threshold to set the height of
top/bottom barriers
''' out = events[['t1']].copy(deep=True)
if factors[0] > 0: thresh_uppr = factors[0] * events['threshold']
else: thresh_uppr = pd.Series(index=events.index) # no uppr thresh
if factors[1] > 0: thresh_lwr = -factors[1] * events['threshold']
else: thresh_lwr = pd.Series(index=events.index) # no lwr thresh for loc, t1 in events['t1'].iteritems():
df0=prices[loc:t1] # path prices
df0=(df0 / prices[loc] - 1) * events.side[loc] # path returns
out.loc[loc, 'stop_loss'] = \
df0[df0 < thresh_lwr[loc]].index.min() # earliest stop loss
out.loc[loc, 'take_profit'] = \
df0[df0 > thresh_uppr[loc]].index.min() # earliest take profit
return out
最后,我们定义一个函数来计算标签:
def get_labels(touches):
out = touches.copy(deep=True)
# pandas df.min() ignores NaN values
first_touch = touches[['stop_loss', 'take_profit']].min(axis=1)
for loc, t in first_touch.iteritems():
if pd.isnull(t):
out.loc[loc, 'label'] = 0
elif t == touches.loc[loc, 'stop_loss']:
out.loc[loc, 'label'] = -1
else:
out.loc[loc, 'label'] = 1
return out
将所有这些放在一起:
data_ohlc = pd.read_parquet('data_dollar_ohlc.pq')
data_ohlc = \
data_ohlc.assign(threshold=get_vol(data_ohlc.close)).dropna()
data_ohlc = data_ohlc.assign(t1=get_horizons(data_ohlc)).dropna()
events = data_ohlc[['t1', 'threshold']]
events = events.assign(side=pd.Series(1., events.index)) # long only
touches = get_touches(data_ohlc.close, events, [1,1])
touches = get_labels(touches)
data_ohlc = data_ohlc.assign(label=touches.label)
元标记
在概念层面上,我们的目标是在我们预计会赢的地方下注,而不是在我们预计不会赢的地方下注,这就归结为一个二元分类问题(其中失败的情况既包括下注方向错误,也包括在我们应该下注的时候根本没有下注)。下面是我们刚刚生成的标签的另一种查看方式:
二进制分类问题提出了 I 型错误(假阳性)和 II 型错误(假阴性)之间的折衷。增加真阳性率通常以增加假阳性率为代价。
为了更正式地描述这一点,让我们首先定义:
ŷ ∈ {0,1,-1} : 观测的主模型预测
r:观察的价格回报
然后在预测时,主模型的混淆矩阵如下所示。
我们不太担心假阴性——我们可能会错过一些赌注,但至少我们没有赔钱。我们最担心的是假阳性,这是我们损失金钱的地方。
为了反映这一点,我们的元标签 y* 可以根据图表来定义:
y=* 1 : 真正
y=* 0 :
实际上,主模型应该有高的回忆——它应该以许多假阳性为代价,正确地识别更多的真阳性。第二模型然后将过滤掉第一模型的假阳性。
元标记实现
首先,我们创建一个主模型。在我们这样做之前,一个重要的预处理步骤是确保我们的训练数据有平衡的标签。
原始数据集中的标签在很大程度上受 0 值支配,所以如果我们在这些标签上训练,我们会得到一个每次都预测 0 的退化模型。我们通过应用合成少数过采样技术来创建标签计数大致相等的新训练数据集,从而解决这一问题。
from imblearn.over_sampling import SMOTE
X = data_ohlc[['open', 'close', 'high', 'low', 'vwap']].values
y = np.squeeze(data_ohlc[['label']].values)
X_train, y_train = X[:4500], y[:4500]
X_test, y_test = X[4500:], y[4500:]
sm = SMOTE()
X_train_res, y_train_res = sm.fit_sample(X_train, y_train)
接下来,我们将逻辑回归模型拟合到重新采样的训练数据中。注意,在这一点上,我们不应该期望我们的模型做得很好,因为我们还没有生成任何特征,但是当在基线模型上使用元标记时,我们仍然应该看到 F1 分数的提高。
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression().fit(X_train_res, y_train_res)
y_pred = clf.predict(X_test)
我们可以看到,我们的模型比我们的测试数据预测了更多的 1 和-1。最左和最右列的蓝色部分代表假阳性,我们打算通过元标记和训练二级模型来消除假阳性。
让我们将三重障碍预测映射到前面介绍的二元正/负元标签中,并检查混淆矩阵:
def true_binary_label(y_pred, y_test):
bin_label = np.zeros_like(y_pred)
for i in range(y_pred.shape[0]):
if y_pred[i] != 0 and y_pred[i]*y_test[i] > 0:
bin_label[i] = 1 # true positive
return bin_labelfrom sklearn.metrics import confusion_matrix
cm= confusion_matrix(true_binary_label(y_pred, y_test), y_pred != 0)
primary model
正如所料,我们没有看到假阴性和大量的假阳性。我们会尽量减少假阳性而不增加太多的假阴性。
.
.
# generate predictions for training set
y_train_pred = clf.predict(X_train)
# add the predictions to features
X_train_meta = np.hstack([y_train_pred[:, None], X_train])
X_test_meta = np.hstack([y_pred[:, None], X_test])
# generate true meta-labels
y_train_meta = true_binary_label(y_train_pred, y_train)
# rebalance classes again
sm = SMOTE()
X_train_meta_res, y_train_meta_res = sm.fit_sample(X_train_meta, y_train_meta)
model_secondary = LogisticRegression().fit(X_train_meta_res, y_train_meta_res)
y_pred_meta = model_secondary.predict(X_test_meta)
# use meta-predictions to filter primary predictions
cm= confusion_matrix(true_binary_label(y_pred, y_test), (y_pred * y_pred_meta) != 0)
secondary model
二级模型中的结果表明,我们引入了一些假阴性,但是我们从初级模型中消除了超过 30%的假阳性。虽然这并不总是一个有价值的交易,但记住交易的背景——我们错过了一些交易机会(假阴性),但这是减少许多在我们面前爆炸的交易(假阳性)的廉价代价。分类报告证实了我们的直觉,即通过 F1 分数测量,分类器的效率提高了。
# WITHOUT META-LABELING label precision recall **f1-score** support
0 1.00 **0.66** **0.79** 1499
1 0.14 1.00 **0.24** 81
micro avg 0.67 0.67 **0.67** 1580
macro avg 0.57 0.83 **0.52** 1580
weighted avg 0.96 0.67 **0.76** 1580# WITH META-LABELING label precision recall f1-score support
0 0.97 **0.76** **0.85** 1499
1 0.12 0.59 0.20 81
micro avg 0.75 0.75 **0.75** 1580
macro avg 0.55 0.68 **0.53** 1580
weighted avg 0.93 0.75 **0.82** 1580
虽然这两个模型都不太好,但请记住,我们只是在演示一种提高分类器效率的技术,这种技术可以在更大的数据集、更好的模型和更强大的功能上很好地工作。
元标记:定量方法
总的来说,元标注+二级模型的解释就是预测一级模型的置信度。在我们的例子中,主模型和次模型都是数据驱动的,但是并不总是这样。
除了提高 F1 分数,元标记还有另一个极其强大的应用——它可以在非 ML 模型之上添加一个机器学习层,包括计量经济学预测、基本面分析、技术信号,甚至是酌情策略。这提供了人类直觉/专业知识和数量优势的强大组合,因其可解释性和稳健性而受到许多资产经理的青睐。
摘要
标注观察值是监督学习的重要组成部分。在这个演示中,我们开发了一种标记金融资产观察结果的方法,以及一种元标记技术,以帮助在分类问题中获得更好的 F1 分数。我鼓励您将这些标注技术与其他数据集和参数相结合,并分享您的结果。感谢您的阅读,欢迎您随时提出意见/建议!
金融机器学习从业者一直在使用错误的烛台:原因如下
在本文中,我们将探讨为什么传统的基于时间的蜡烛图是一种低效的价格数据汇总方法,特别是在以下两种情况下:(a)高度波动的市场,如加密货币;(b)使用算法或自动交易时。为了证明这一点,我们将分析比特币-美元历史价格的行为,我们将研究为什么市场不再遵循阳光周期,以及为什么我们使用的数据类型可以成为竞争对手的优势。最后,我们将简要介绍替代和最先进的价格汇总方法,如成交量或分笔成交点不平衡棒线,旨在减轻传统烛台的缺点。
高度波动市场中的过采样和欠采样
加密货币市场极其不稳定。价格变化很快,在几分钟内价格下跌或下跌 5-20%之前,价格横向移动几个小时是很常见的。虽然长期交易策略可能在忽略日内波动的情况下仍然有利可图,但任何中期或短期策略(更不用说高频交易)都必须以某种方式解决波动问题。
在下面的图中,我们使用 5 分钟蜡烛图分析了 Bitfinex 交易所自 2013 年 3 月至 2019 年 4 月的比特币-美元对的波动性(数据从 CryptoDatum.io 获得)。具体来说,我们显示:(1)绝对价格变化直方图(计算为收盘价相对于开盘价的变化百分比),(2)直方图右侧特定点的蜡烛线比例(红线)以及(3)右侧蜡烛线产生的价格变化总量的比例(绿线)。
因此,我们可以观察到:
- 大多数 5 分钟蜡烛线(约 70%)的价格变化低于 0.25%,其中大部分几乎没有价格变化(第一个直方图峰值在 0.00–0.05%)。
- 20% (0.2049)的烛台解释了近 67% (0.6668)的价格变化总量。
- 2%的烛台解释了 21%的价格变化总量,表明在 2%的 BTC-美元烛台中,巨大的价格变化发生在 5 分钟的短时间内(高波动性)。
从第 1 点我们可以得出的结论是,基于时间的烛台显然对低活动期(活动被理解为价格变化)进行了过采样。换句话说,在 70%的蜡烛中,没有任何事情真正发生,所以问题是:如果我们想训练一个基于 ML 的算法,我们需要所有这些没有观察到变化的蜡烛吗?找到一种移除或丢弃大多数无意义蜡烛的方法对丰富我们的数据集有用吗?
基于时间的蜡烛图过采样低活动期和欠采样高活动期
另一方面,第 2 点和第 3 点表明,大多数价格变化发生在几个百分比的烛台上,这表明基于时间的烛台低于样本高活动期。这意味着,如果价格在 5 分钟内变化 10%,并且我们使用 5 分钟蜡烛线,我们的算法将无法看到基于时间的蜡烛线在开盘和收盘之间发生的任何事情,可能会错过一个良好的交易机会。因此,理想情况下,我们希望找到一种方法,在市场活动增加时多取样一些蜡烛,在市场活动减少时少取样一些蜡烛。
市场可能不再遵循人类的日光周期
我们使用基于时间的烛台的主要原因是因为我们人类生活在时间中,因此,时间是我们组织自己和同步我们的生物节律的非常方便的东西。此外,阳光周期对人类至关重要,因为它决定了清醒-睡眠周期,这与我们的生存有着生物学上的相关性。作为白天周期的结果,传统的证券交易所仍然在上午 9:30 开门(这样真正的人可以在醒着的时候交易)在下午 4 点关门(这样交易者可以安心睡觉——但是……他们会吗?).
随着技术的出现,自动交易机器人已经开始取代真正的人类交易员,特别是在加密货币领域,市场不再遵循白天周期,因为它们仍然全天候开放。在这种情况下,继续使用基于时间的烛台,一个纯粹的标准,人类便利的结果,有意义吗?洛佩兹·德·普拉多在他的书金融机器学习的进步中对此做了很好的总结:
尽管时间条可能是从业者和学者中最受欢迎的,但还是应该避免。[……]市场不会以固定的时间间隔处理信息。[……]作为生物,人类根据阳光周期组织自己的一天是有意义的。但是今天的市场是由算法操作的,这些算法在松散的人工监督下进行交易,对这些算法来说,CPU 处理周期比时间间隔更重要
每个人的数据都不是任何人的优势
为什么大多数好的交易算法是一个很好的秘密,因为当从一个不平衡的情况下,我们可以预测到另一个平衡时,钱就赚了。一般来说,平衡意味着每个人都已经意识到发生了什么,并且有足够的积极和消极的力量来保持新达到的平衡。
为了预测均衡的变化,我们必须反向而行,同时又是正确的:也就是说,我们必须知道一些其他人不知道的事情,并且我们的断言是正确的。我们必须找出大多数交易者不知道的失衡,否则我们就又回到了平衡状态。它通常被称为“零和”游戏,尽管我并不特别喜欢这个定义。
每个人的数据都不是任何人的优势
为了成为反向投资者,我们必须用新的创造性方法来看待和分析数据,让我们在尊重他人的基础上获得一定的优势。这就是我们用来训练算法的数据类型等小细节能够产生重大影响的时候。实际上,这意味着如果每个人都使用基于时间的蜡烛棒,为什么我们要和其他人一样使用呢?如果有更好的替代物存在,为什么我们还会使用基于时间的烛台?
另类烛台
很少有比读完德·普拉多的《金融机器学习的进步》一书的前几章更让我感到受启发的了。在他的书中,这位经验丰富的基金经理揭示了他 20 多年来一直用来管理千万富翁基金的常见做法和数学工具。特别是,他从第一手资料中知道,这些年来市场的行为发生了巨大的变化,与交易机器人竞争是一种规则而不是例外。在这种情况下,de Prado 介绍了一些替代类型的烛台,旨在取代传统的基于时间的烛台,并为金融领域带来必要的创造性和新颖性。
以下是德普拉多推荐的一些替代烛台或烛台的例子:
- 分笔成交点:每次预定数量的交易发生时,我们对一根棒线进行采样。例如,每次在交易所进行 200 笔交易,我们通过计算 OHLCV 棒线的开盘价-盘高-收盘价来取样。
- 音量条:每次交换预定音量时,我们都会对音量条进行采样。例如,我们在交易所中每交易 10 个比特币就创建一个条形。
- 不平衡棒线:我们分析交易顺序的不平衡程度,每次不平衡超过我们的预期时,我们就取样一根棒线。
在以后的文章中,我将分析书中描述的每一种可供选择的烛台。我们将了解如何构建它们,将它们的统计属性(如正态性和序列相关性)与传统烛台进行比较,并分析这些条形如何克服传统烛台的缺点。
感谢阅读,更多内容即将推出,敬请关注!
您愿意自己尝试一下我们在文章中提到的另类酒吧吗?在 CryptoDatum.io,我们努力提供最先进的加密货币数据集,以插入您自己的基于 ML 的交易算法。在 查看我们 https://cryptodatum . io。
所提供的信息仅用于教育目的。它绝不代表任何财务建议,信息必须“按原样”采用,没有任何形式的保证。