如何合并与熊猫“不匹配”的时间序列
如何使用 merge_asof 函数
时间序列数据有许多定义,所有这些定义都以不同的方式表示相同的含义。一个直截了当的定义是,时间序列数据包括附加到连续时间戳的数据点。
Pandas 由 Wes Mckinney 创建,旨在提供一个高效灵活的工具来处理时间至关重要的财务数据。因此,Pandas 是处理时间序列数据的一个非常好的选择。
金融数据通常包括在非常短的时间内(例如在秒级)进行的测量。因此,当我们合并两个由时间序列数据组成的数据帧时,我们可能会遇到测量值相差一两秒的情况。对于这种情况,熊猫提供了一种由 merge_asof 完成的“智能”合并方式。
假设我们正在合并数据帧 A 和 B。如果左侧数据帧(A)中的一行在右侧数据帧(B)中没有匹配的行, merge_asof 允许获取其值接近左侧数据帧(A)中值的一行。
左和右是根据函数中参数的顺序定义的。pd.merge_asof (A,B,…)表示 A 是左边的那个。
“亲近”是有一些限制的。根据“on”参数指定的列进行比较,右数据帧(B)中的值必须小于左数据帧(A)中的值。简单解释一下,merge_asof 的意思是:
没有匹配的,取前面的。
当我们看一些例子时,它会更有意义。
样本 A 和 B 数据帧如下:
我们想按“名称”列合并“时间”上的这些数据帧,但一些时间值不匹配。例如,在第二行中,A 中的时间比 b 中的时间晚一秒,假设我们可以容忍 2 秒的延迟。
在这种情况下,可以使用 merge_asof :
- 第一行:时间匹配,因此根据行索引取值。
- 第二行:左侧数据帧(A)上的时间为 00:00:03,但右侧数据帧(B)此时没有值。因此,merge_asof 会查看前面的步骤,如果在指定的时间间隔(2 秒)内有一个值,它会将最后一个值放入合并的数据帧中。在时间 00:00:00 只有一个先前值,它落后 3 秒,因此不在指定的时间内。因此,values_b 列这次用 NaN 填充。
- 第三行:左侧数据帧(A)上的时间是 00:00:06。右数据帧(B)在这一秒没有值,但它在 00:00:04 有一个值,该值在指定的内部时间内,因此 merge_asof 获取该值并放入合并的数据帧中。
- 第四行:这一行很重要,所以请密切注意。左侧数据帧(A)上的时间是 00:00:09。右侧数据帧(B)此时没有值,但在指定时间间隔内的 00:00:08 时有值。但是,“名称”列也必须匹配,因为我们是按“名称”列合并的。由于名称不同,merge_asof 不接受该值,因此 values_b 列用 NaN 填充该行。
- 第 5 行:两个数据帧都有时间值 00:00:12,并命名为 FFF。
如果我们不指定时间间隔,merge_asof 将查找前一个时间间隔,而不考虑时差。
当时间间隔为 2 秒时,values_b 为 NaN。如果没有指定的时间间隔,则用之前的值 5 填充。
Merge_asof 还提供了一个排除精确匹配的选项。如果 allow_exact_matches 设置为 False,merge_asof 仅在右侧数据帧中查找以前的值,匹配行中的值不会放入合并的数据帧中:
测量时间的方法是无限的,因为我们可以精确到纳秒。根据不同的任务,我们可以选择最佳的测量频率。Merge_asof 允许我们在匹配时间序列或者有序数据时有一定的余地。
感谢阅读。如果您有任何反馈,请告诉我。
如何不挖而挖金子
卡尔曼滤波器
估计黄金暴露量的随机模型和统计方法
迪翁·比森在 Unsplash 上拍摄的照片
黄金通常被视为避险资产或对冲市场动荡、货币贬值和其他经济或政治事件的工具。例如,在信贷危机期间,道琼斯和标准普尔 500 指数下跌了约 20%,而黄金价格从每金衡盎司 850 美元上涨到 1100 美元。然后今年,S&P500 经历了急剧下降,最近才回到 COVID 之前的水平。与此同时,黄金 ETF (GLD)自 2020 年 2 月以来上涨了 25%以上。
在 2020 年 2 月 18 日至 2020 年 8 月 17 日(6 个月)期间,S&P500 ETF(绿色间谍)经历了大幅下跌,然后才回到 covid 之前的水平。与此同时,黄金 ETF(蓝色 GLD)涨幅超过 25%。
为了获得黄金投资,有许多相关产品,包括黄金交易所交易基金(ETF)、杠杆交易所交易基金(LETFs)、黄金期货和黄金矿业股票。
然而,黄金价格并不存在于真空中。黄金必须被开采,而从事这一开采过程的公司本身就是上市公司。这为投资者提供了另一种投资黄金的途径,同时允许他们通过标准的股票研究技术来决定投资决策。
除了现货黄金,还有许多单名金矿股票和(L)ETF 可供交易。尽管普通股票类 ETF 是目前市值最大的 ETF,但黄金矿业 ETF 是市场上最受欢迎的短期交易工具之一。另一方面,在 AUM 的排名中,没有一只黄金矿商 ETF 进入前 20 名,这表明最近对黄金和黄金矿商股票的主要兴趣在很大程度上是由寻求类似黄金风险的投机交易者驱动的。因此,了解黄金矿商 ETF 回报的潜在因素动态对于分析流行的交易策略(如 pairs trading)非常有用。
黄金矿商股票是实物黄金的杠杆投资。
标准股票市场研究已经建立了几个经验法则来理解投资金矿和黄金本身的区别。尽管从长期来看,金价和矿商股价之间存在明显的相关性,但价格差异并不罕见。例如,金矿公司的短期业绩对市场贴现率和未来股息支付非常敏感,这是由一般股票市场决定的。此外,在单个公司层面,管理层可以通过高超的投资技能、矿山的开矿和关闭、成本削减或市场时机选择对股本回报产生重大影响。然而,从长远来看,淘金者赚钱的唯一途径是从地下挖出黄金,然后在公开市场上出售。
因此,在我们最近的论文中,我们提出了一个模型来描述黄金和矿业股票之间的联系。这是一个易处理的结构模型,通过一个组合的最优控制和停止问题的 T2,直接将黄金价格与黄金矿商权益的价值联系起来。这种实物期权模型要求黄金矿商设定一个内部生产函数,当黄金价格下跌超过一定水平时,清算公司资产。特别是,我们的模型表明,实物黄金的动态投资组合将与黄金开采者的实际投资组合表现相同。
我们的模型给出了企业资产价值、企业权益价值的显式解析表达式,并精确地识别了影响企业杠杆的参数。事实上,我们检查了我们的实物期权模型的预测,发现黄金矿业公司的杠杆的一个重要部分可以在实物期权框架内解释!
此外,我们使用我们的结构模型的见解开发了一种方法来复制黄金矿业股票,仅使用实物黄金和市场股票组合,这可以解释黄金矿业股票回报约 70%的变化。我们的主要经验表明,金矿股票有类似看涨期权的回报,这导致相对于实物黄金的更高的 隐含杠杆和负 alpha 。
Barrick Gold (ABX)、Gold Corp (GG)、Gold Miners ETF (GDX)、Junior Gold Miners ETF (GDXJ)的模型隐含黄金杠杆(原始)与隐含黄金杠杆的卡尔曼滤波时间序列(红色)和简单移动平均线(绿色)的曲线图。
在本文中,我们解释了如下所示的卡尔曼滤波过程:
参考
K.郭,T. Leung,B. Ward,**如何在不挖矿的情况下开采黄金,**国际金融工程杂志,2019 年第 6 卷第 1 期[ PDF
如何用 R 建模一个社交网络
网络理论实用介绍
由 Unsplash 上的 Clarisse Croset 拍摄的照片
使用网络来表示我们的数据给了我们一个视角,通过这个视角,问题往往变得更容易解决。当我们有兴趣了解更多关于连接对象之间的交互时,网络特别有用。一些典型的用例包括通信渠道的分析,流行病传播的建模,或者一群人内部的社会互动的研究。
在本文中,我们将看看我们通常如何表示网络数据。
什么是网络?
资料来源:剑桥大学,通信原理课程材料(2010-11),网络理论介绍,幻灯片 2
图形是抽象的数学结构。当我们将现实世界的场景映射到这个结构上时,我们称之为网络。您可能会听到“图形”和“网络”这两个词可以互换使用。
这是一个用来展示人与人之间长期互动的网络示例:
在建立网络模型时,我们会考虑三个主要因素:
- 节点
- 链接
- 以及它们的属性
节点
节点是网络中的点(在图论中也称为顶点)。它们代表了我们想要建模的实体。让我们以一个社交网络为例,其中每个节点模拟一个人。
样本社交网络中的节点
链接
链接是连接节点的线(在图论中称为边)。它们代表了我们想要在网络中的实体(节点)之间建模的连接。我们可以画出链接来显示在这个网络上谁是谁的朋友。
示例社交网络(节点+链接)
属性
属性给了我们更多关于网络的信息。在我们的社交网络中,节点属性描述了系统中的个体,包括年龄、姓名、性别等细节。
链接属性描述了两个人之间的联系。例如,它可以显示关联的强度,或者表明人与人之间的关系类型。
我们可以用不同的颜色或尺寸在网络上显示这些属性。
带有属性的示例社交网络。在这个例子中,链接的大小表示个体之间关联的强度。
我们如何代表一个网络?
既然我们已经介绍了网络的基础知识,那么让我们来看看几种常见的表示网络数据的方法。
邻接矩阵
邻接矩阵是二维正方形阵列,其中行和列由图中的节点索引。矩阵的元素不是零就是一…
简单地说,邻接矩阵是一种在表格中表示网络的方式。我们的社交网络中的每个人(节点)都在表格的一行和一列中表示。我们对行和列保持相同的顺序。例如,如果我们的第一行是“卡内拉,那么我们的第一列也将是“卡内拉”。
示例(空)邻接矩阵-由节点名称索引的列和行
表中的条目显示两个节点之间是否存在链路:
- 行 Ghassan 中的 1 ,列 Canela 表示这两者之间有联系。
- 0 表示两个节点之间没有链接。
让我们假设我们想要指出人们相互交往的频率。我们可以将此视为链接属性(它告诉我们关于两个节点之间的连接的一些信息)。在网络上,我们可以用链接的相对粗细来表示这一点,其中较粗的链接意味着更频繁的交互。
我们可以通过在网络中使用除 1 以外的数字在邻接矩阵中显示这一点。在我们的例子中,数字越大,那对人之间的互动越有规律。当表中的值不是二进制(不是 1 或 0)时,我们说我们的矩阵是“加权的”。
加权链接-网络的邻接矩阵表示,上面呈现了链接属性。注意重量为 2 的连杆被画得更粗。
邻接矩阵是一个受欢迎的选择,因为它使大型图形易于分析。举以下例子:
悲惨世界人物网络
在这种情况下,我们可以对网络的邻接矩阵进行简单的计算,以快速识别网络的属性。
然而,在 IDE 中创建这些网络时,更常见的选择是用两个单独的表来表示网络。
单独的表格
在创建要显示的网络结构时,我们通常使用两个表的格式——一个用于节点,另一个用于边。
两个独立的表用于描述一个网络。链接表和节点表。
节点表:
- 包含网络中所有唯一节点的列表
- 第一列通常是每个节点的唯一标识符
- 我们可以为节点属性添加其他列
节点表,带有性别属性(男性/女性)
链接表:
- 包含网络中所有链路的列表
- 一列显示每个链接从哪个节点开始
- 一列指示链接在哪个节点结束
- 我们可以为链接属性添加其他列
具有“链接类型”属性的链接表
现在我们已经介绍了基础知识,让我们看看如何在 r 中创建一个网络。
用 R 创建一个网络
我们将尝试复制上面创建的示例。我们的目标是创建一个由九个人组成的小型社交网络,他们随机连接在一起。对于本例,我们将采用使用两个单独的表来创建网络的方法。在添加属性时,两个表为我们提供了更大的灵活性。在我们开始之前,让我们将任务分解成一步一步的组成部分。
- 加载所需的库。
- 创建一个随机节点列表。我们将使用该名称作为每个节点的唯一 id。
- 创建一个链接表。我们将从节点列表中随机选择每个链接的起点和终点。
- 绘制我们的网络。
- 向图中添加属性。
加载库
在开始之前,我们需要加载所需的库。这些功能使我们能够创建自己的网络。在我们的例子中,我们将使用以下内容:
- tidy verse**😗*这是一个用来操作和绘制数据的包的集合——R 开发者工具包中的一个标准。
- ggraph :我们将要用来绘制我们的网络的库。
- tidy graph**😗*用于创建一个“表格图形”对象,一种我们可以很容易转换成网络的格式
- 婴儿名字 :库包含了 SSA 提供的 1980 年到 2017 年间的婴儿名字列表。我们将使用它来为网络中的节点选择随机名称。
library(tidyverse)
library(ggraph)
library(tidygraph)
library(babynames)
创建节点表
我们想从我们放入环境的婴儿名字数据中得到 9 个随机的名字。我们首先看一下数据的结构,如下所示:
head(babynames)
这将返回婴儿姓名表的前 6 行。我们利用这一点来了解数据的结构:
这里我们可以看到,我们有一个名字、性别和一些其他变量的列表,这些变量可能不会直接应用到我们的用例中。这种结构表明,名称每年重复出现,并且 prop ( proportion)和 n (number) 的值不同。
我们想确保我们随机抽取的名字是唯一的。快速检查显示,婴儿姓名表中有 1,924,665 行。虽然两次抽中同一个名字的几率很低,但还是有可能的。这告诉我们,我们的解决方案将需要包括一些东西,以确保我们在最后的抽签中没有重复。
要获得一个唯一的随机名称列表,最好是编写一个小函数,我们可以重用它来生成一个大小为 n 的节点列表(我们将来可能想要绘制一个更大的网络)。
下面是我们可以采取的步骤的概要:
- 过滤表格以删除任何重复的名称
- 从 1 到我们过滤后的表中的行数之间随机选择一个 n 的数字样本(没有替换——意味着一旦一个数字被抽取,就不能再被抽取)
- 从过滤后的表中,取出由我们选择的随机数索引的行
- 返回这些行—这将是我们的节点表
下面是我们如何在 R 中实现这一点:
get_random_names <- function(n) {
unique_babynames <- distinct(babynames, name, .keep_all = TRUE)
index <- sample(1:nrow(unique_babynames), n, replace = FALSE)
names <- unique_babynames[index, ]
names
}nodes <- get_random_names(9)
创建链接表
为了创建链接表,我们将首先分别考虑源列和目标列。从 source 列开始,我们得到一个从 1 到 9 的随机数字样本(因为只有 9 个节点)。这一次,我们用替换的对进行采样,因为每个节点可以连接多个链接。我们对目标列重复相同的过程。在 R 中:
source <- sample(1:nrow(nodes), nrow(nodes)*2, replace = TRUE)
target <- sample(1:nrow(nodes), nrow(nodes)*2, replace = TRUE)
这给了我们一对列表,如下所示:
随机生成的源向量和目标向量
然后,我们将这两个列表粘在一起,得到我们的链接表(或数据框):
links <- data.frame(src, target)
看起来是这样的:
一旦我们有了这张桌子,就该稍微清理一下了。在绘制我们的网络之前,我们需要考虑几个案例。
- 将节点连接到自身的链接——这在某些用例中有意义,但在我们的社交网络中没有意义。这里,我们可以通过过滤掉链接表中源值和目标值不匹配的行来实现。
- 重复链接—我们不希望在相同的两个节点之间绘制两次链接,因为如果我们决定将链接属性添加到我们的图形中,这可能会导致一些麻烦。在它继续绘制我们的网络之前,我们可以很容易地解决这个问题。
links <- data.frame(src, target) %>%
filter(!(src == target)) links <- unique(links[c("src", "target")])
关于我们应该画多少个链接,这将取决于你希望你的网络的连接程度。在本例中,我们在删除冗余链接之前,任意创建两倍于节点数量的链接。
用图形绘制网络
准备好节点和链路表后,我们就可以开始绘制网络了。在将表传递给创建列表的函数之前,我们还需要完成最后一步。
在我们将这些表格传递给绘图函数之前,我们只需要确保它们的格式正确,以便 ggraph 包进行解释。这里,我们将独立的表转换成一个名为 tbl_graph 的对象。
social_net_tbls <- tbl_graph(nodes = nodes,
edges = links,
directed = FALSE)
现在,我们准备开始绘图。ggraph 包遵循与其他流行绘图包相同的图形语法原则。基本的想法是,我们建立我们的图形层。 这篇文章 很好地解释了这个概念。在我们的示例中,我们按照以下顺序对网络进行分层:
- 我们从数据开始(我们刚刚创建的 tbl_graph 对象)
- 选择我们图表的布局
- 指定属性——被称为美学映射的一部分
- 添加节点,名称为文本,然后链接层-称为几何
- 修改主题(改变背景颜色)
在 R 中:
social_net <- ggraph(social_net_tbls, layout = "stress") +
geom_node_point(size = 2) +
geom_node_text(aes(label = name), nudge_y = 0.05, nudge_x = 0.2)+
geom_edge_link() +
theme_void()
将所有这些整合在一起:
奖金👀
干得好,文章写到这里。关于这个话题,我还有一件事要分享。
虽然 ggraph 在渲染网络时提供了简单性和灵活性,但在视觉美学方面,还有另一个包值得一提— networkD3 。networkd 3 包将一些 Java Script D3 的功能扩展到 R 程序员。我们可以使用与上图相同的链接和节点表来生成这个网络。
网络 3 的几个优点是:
- 它是交互式的——你可以放大和缩小,拖动节点,在悬停时添加显示/隐藏选项,等等
- 与图形网络相比,它们开箱后看起来更好
主要的缺点是不容易定制。为了充分利用 networkD3 的定制选项,需要精通 JS。
有用的链接
- 你可以在 github 这里 查看完整的项目。
- 这篇文章包含了一个动画网络的例子,它是用 ggraph 和 ganimate 包创建的。
新冠肺炎会压垮我们的医疗系统吗?
towardsdatascience.com](/will-covid-19-overwhelm-our-healthcare-systems-f5bc49bc77a2)
- Github 回购。对于简单的动画图形这里的。
参考
- 剑桥大学。(2010–11).网络理论导论。【在线】。可用:https://www . cl . cam . AC . uk/teaching/1011/princcom/slides/graph _ theory _ 1-11 . pdf
- 麻省理工学院。乌勒、布雷斯勒。数据科学和大数据分析:做出数据驱动的决策:网络和图形模型;代表一个网络。访问时间:2020 年 6 月 21 日。【在线】。
如何通过 SARIMA 模型对时间序列建模
季节性时间序列建模教程。
来自 Pixabay 的openclipbart-Vectors
在本教程中,我将向你展示如何通过 SARIMA 模型对季节性时间序列进行建模。
在这里你可以下载本教程中描述的代码的 Jupyter 笔记本。
入门指南
将数据集转换为时间序列
在这个例子中,我们将使用到达意大利的游客数量。数据摘自欧洲统计:旅游业年度数据。首先,我们导入与 2012 年至 2019 年 10 月抵达意大利的外国游客相关的数据集,然后将其转换为时间序列。
为了执行到时间序列的转换,需要两个步骤:
- 包含日期的列必须转换为 datetime。这可以通过函数
to_datetime()
来完成,该函数将字符串转换成日期时间。 - 将 dataframe 的索引设置为包含日期的列。这可以通过应用于数据帧的函数
set_index()
来完成。
import pandas as pddf = pd.read_csv('../sources/IT_tourists_arrivals.csv')
df['date'] = pd.to_datetime(df['date'])
df = df[df['date'] > '2012-01-01']
df.set_index('date', inplace=True)
通过describe()
函数,我们可以得到一些与时间序列相关的有用的统计数据。
df.describe()
初步分析
绘制时间序列以检查季节性
初步分析包括对时间序列的直观分析,以了解其总体趋势和行为。首先,我们创建时间序列,并将其存储在变量ts
中。
ts = df['value']
然后,我们绘制出ts
趋势。我们使用 Python 提供的matplotlib
库。
import matplotlib.pylab as plt
plt.plot(ts)
plt.ylabel('Total Number of Tourists Arrivals')
plt.grid()
plt.tight_layout()
plt.savefig('plots/IT_tourists_arrivals.png')
plt.show()
计算模型的参数
调整模型
我们建立了一个 SARIMA 模型来表示时间序列。SARIMA 是季节性自回归综合移动平均线的缩写。它由 AR 和 MA 两个模型组成。该模型由三个参数定义:
- d =所涉及的一阶差分的程度
- p = AR 部分的顺序
- q =移动平均部分的阶数。
p 的值可以通过 ACF 图来确定,ACF 图显示了测量观察值与其前一个观察值之间关系的自相关。d 的值是积分的阶数,可以计算为使时间序列稳定所需的变换次数。q 值可以通过 PACF 图来确定。
为了确定d
的值,我们可以执行 Dickey-Fuller 测试,该测试能够验证时间序列是否平稳。我们可以使用包含在statsmodels
库中的adfuller
类。我们定义一个名为test_stationarity()
的函数,如果时间序列为正,则返回 True,否则返回 False。
from statsmodels.tsa.stattools import adfullerdef test_stationarity(timeseries):
dftest = adfuller(timeseries, autolag='AIC')
dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
for key,value in dftest[4].items():
dfoutput['Critical Value (%s)'%key] = value
critical_value = dftest[4]['5%']
test_statistic = dftest[0]
alpha = 1e-3
pvalue = dftest[1]
if pvalue < alpha and test_statistic < critical_value: # null hypothesis: x is non stationary
print("X is stationary")
return True
else:
print("X is not stationary")
return False
当时间序列变得稳定时,我们通过diff()
函数对时间序列进行多次变换。
ts_diff = pd.Series(ts)
d = 0
while test_stationarity(ts_diff) is False:
ts_diff = ts_diff.diff().dropna()
d = d + 1
为了计算 p 和 q 的值,我们可以分别画出 ACF 和 PACF 图。我们可以使用statsmodels
库中的plot_acf()
和plot_pacf()
函数。p 值对应于 ACF 图中置信区间之外的最大值(以浅蓝色显示)。在我们的例子中,正确的 p = 9。
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(ts_trend, lags =12)
plt.savefig('plots/acf.png')
plt.show()
类似地,q 的值对应于置信区间之外的 PACF 图中的最大值(显示为浅蓝色)。在我们的例子中,q 的正确值= 1。
plot_pacf(ts_trend, lags =12)
plt.savefig('plots/pacf.png')
plt.show()
建立萨里玛模型
如何训练萨里玛模型
现在我们已经准备好构建 SARIMA 模型了。我们可以使用statsmodels
库提供的SARIMAX
类。我们拟合模型,通过get_prediction()
函数得到预测。我们还可以通过conf_int()
函数检索置信区间。
from statsmodels.tsa.statespace.sarimax import SARIMAXp = 9
q = 1
model = SARIMAX(ts, order=(p,d,q))
model_fit = model.fit(disp=1,solver='powell')
fcast = model_fit.get_prediction(start=1, end=len(ts))
ts_p = fcast.predicted_mean
ts_ci = fcast.conf_int()
我们绘制结果。
plt.plot(ts_p,label='prediction')
plt.plot(ts,color='red',label='actual')
plt.fill_between(ts_ci.index[1:],
ts_ci.iloc[1:, 0],
ts_ci.iloc[1:, 1], color='k', alpha=.2)plt.ylabel('Total Number of Tourists Arrivals')
plt.legend()
plt.tight_layout()
plt.grid()
plt.savefig('plots/IT_trend_prediction.png')
plt.show()
计算一些统计数据
检查模型的性能
最后,我们可以计算一些统计数据来评估模型的性能。我们通过scipy
库提供的pearsonr()
函数计算皮尔逊系数。
from scipy import stats
stats.pearsonr(ts_trend_p[1:], ts[1:])
我们还计算了 R 平方度量。
residuals = ts - ts_trend_p
ss_res = np.sum(residuals**2)
ss_tot = np.sum((ts-np.mean(ts))**2)
r_squared = 1 - (ss_res / ss_tot)
r_squared
吸取的教训
在本教程中,我已经演示了如何通过 SARIMA 模型对时间序列进行建模。概括地说,你应该遵循以下步骤:
- 将数据框转换为时间序列
- 计算 p、d 和 q 的值以调整 SARIMA 模型
- 用计算出的 p、d 和 q 值建立 SARIMA 模型
- 测试模型的性能。
对拟议模型的改进可以包括将时间序列分成两部分:训练集和测试集。通常,训练集用于拟合模型,而测试集用于计算模型的性能。
文献学
- 时间序列分解分析的可视化指南
- 时间序列的一个例子
- ARIMA 模型 Python 示例—时间序列预测
- ARIMA 模型预测不丹布姆唐的国际游客量
- Python 中的增强 Dickey-Fuller 测试
- 汽车 ARIMA 使用金字塔 ARIMA Python 包
- Python 中 t 检验的置信区间(均值之间的差异)
- 从数据中提取季节性和趋势:使用 R 分解
- 如何用 Python 创建时间序列预测的 ARIMA 模型
- 如何使时间序列平稳?
- 如何用 Python 中的差分变换去除趋势和季节性
- 如何在 Python 中调优 ARIMA 参数
- 非季节性 ARIMA 车型
- 解读偏自相关函数(PACF)
- 使用扩展的 Dickey-Fuller 测试进行平稳性测试
- 信号和噪音
- 时间序列分解
- 时间序列预测:使用 Python 的基本介绍。
- Python 中的时间序列分析—包含示例的综合指南
- Python 时间序列预测案例研究:波士顿每月武装抢劫案
- 使用 SARIMAX 的时间序列预测
- 了解 ARIMA 并调 P、D、Q
如何对黄金价格建模
现实世界中的数据科学
利用领域知识和监督学习模型理解和预测黄金价格
在本文中,我将通过依次介绍以下内容,向您展示一个非常简单但功能强大的黄金价格模型:
- 黄金的历史和当前用途;
- 理论上影响黄金价格的因素;
- 用于预测黄金价格的回归模型:
- 回归模型在投资决策中的应用。
对于忙碌的读者,文章还提供了 TL;附录中的博士,连同免责声明,浓缩 Jupyter 笔记本,和源列表。
1.我们为什么需要黄金?
公元前 3600 年左右,古埃及首次冶炼出黄金。300 年后,第一枚金币在土耳其西部的一个古代王国铸造,从此被强大的王国作为一种实物货币。
在现代,黄金已经从实物货币演变为货币储备。1819 年,英国通过将其货币与黄金挂钩,正式采用了有史以来第一个金本位制。到 1900 年,除了中国,大多数国家都采用了金本位制。然而,当第一次世界大战开始时,由于许多国家需要印刷钞票来支付战争费用,金本位最终消失了。
今天,黄金在我们的生活中有多种用途,如造币、珠宝、电子和牙科治疗。然而,货币政策和金融需求的影响会对黄金价格产生更大的影响。
2.有哪些因素可以影响金价?
理论上,有很多基本面、宏观面和情绪因素会影响金价。在基本面方面,央行、珠宝买家和交易所交易基金对实物黄金有需求,而在宏观空间,则有通胀、利率、货币供应和美元走强。此外,一些交易员跟踪 CFTC 净头寸数据,以判断投机者的情绪。
每个因素理论上如何影响金价?
基本面因素的影响是最容易理解的。政府和人民购买的黄金越多,市场上的黄金就越少,价格就会攀升。
在宏观空间中,通货膨胀(通货紧缩)率是衡量一篮子商品和服务价格上涨(下降)的指标。如果通货膨胀率上升,我们的午餐和黄金价格也会上涨。相反,如果利率上升,作为投资工具的黄金相对于美国国债就变得没有吸引力了。就像巴菲特说的,黄金是不下蛋的母鸡。
“如果你永远拥有一盎司黄金,那么你还拥有一盎司黄金。”—沃伦·巴菲特
最重要的因素之一是货币供应量,它衡量一个经济体中可用的货币总量。让我们举两个例子来解释为什么货币供应量的增加会提高黄金价格。
- 想象一下,你和你的朋友们组成了一个小型经济体,他们同意用你的垄断资金互相买卖黄金。如果你开始在你的车库里印大富翁的钱,并开始从你的朋友那里购买所有的黄金,那么相对于你的大富翁的黄金价格将会攀升。换句话说,如果美联储开始印刷成吨的美元,黄金相对于美元的价格可以攀升。
- 再想象一下你和你的朋友们使用美元进行贸易的小型经济体。如果你印钱并给每个人免费的钱,商品和服务的价格会上涨,因为免费的钱会被用来购买额外的商品和服务。货币供应量的增加最终会导致通货膨胀率的上升,因此黄金价格会上涨。
最后但同样重要的是,美元的强势会影响黄金和任何其他以美元计价的商品的价格。如果美元变弱,其他国家可以购买更多的美元,然后购买更多的黄金,推高金价,以及其他商品,只要它们以美元报价。
3.我们如何对黄金价格建模?
为了对黄金价格建模,我们首先收集输入数据并应用数据转换。利用转换后的数据,我们使用线性回归模型来解释预测因素和黄金价格之间的关系。为了验证模型,进行样本外回测,并计算 R 值来衡量模型的性能。
3.1 数据收集
为了准备分析和模型开发,收集并清理了自 1981 年以来的以下数据:
- XAUUSD:黄金现货价格以美元计价。
- 美国 CPI:该指数跟踪城市消费者支付的商品和服务价格的变化(即通货膨胀率)。
- 美国 M2:货币供应包括现金、支票存款和容易兑换的货币。
- 美国 GDP:这一特色指标衡量美国经济产出的规模。
- 美元指数:追踪美元相对于一篮子外币价值的指数。
输入数据和来源
数据的一个显著挑战是,这些因素在不同的频率下被观察到。为了调整频率,这些值按季度分组,然后取平均值。
3.2.数据转换和特征工程
3.2.1.目标变量
该模型的目标变量是经通胀调整后的黄金现货价格。为了通过通货膨胀来调整黄金现货价格,我们通过美国 CPI 来紧缩黄金现货时间序列。今后,这个经通胀调整的黄金时间序列将被称为“黄金现货价格”、“黄金价格”或“XAUUSD”。
3.2.2.预言者
这个回归模型有两个预测指标:货币供应量与国内生产总值(M2/国内生产总值)的比率和美元指数。虽然美元指数可以保持不变,但我们需要用美国 M2 除以美国 GDP 来得出这个比率。货币供应量与 GDP 的比率比货币供应量更受青睐,因为它是衡量经济中过剩货币供应量的指标。
3.2.3.对数变换
在两次转换之后,我们对目标变量和预测值应用对数转换,因为所有值都是正的,并且表现出很高的正偏度。这将有助于任何线性模型更容易找到模式。
相关矩阵表明预测值和目标变量之间有很强的关系。
使用转换后的变量,我们绘制了一个相关矩阵,以了解黄金价格和预测之间的线性关系。如图所示,黄金现货价格与货币供应量占 GDP 的比例高度相关,与美元指数有一定的负相关关系。
黄金价格与货币供应量和 GDP 之比:正相关
更重要的是,这两个预测值几乎不相关,相关度为 -0.08 。这表明,尽管美元指数的相关性小于货币供应量与 GDP 比率的相关性,但美元仍然有用,因为它可以添加非重叠信息。
黄金价格与美元指数:负相关
3.3.模型训练和回溯测试性能
现在使用预测值和目标变量,我们使用两个预测值和一个线性回归方程来拟合黄金价格。
黄金价格线性回归模型
请注意,添加 L1 和 L2 正则化参数以减少过度拟合不太可能增加该模型中的值,因为预测值数量较少,预测值之间的相关性也较小。不管怎样,其他算法包括随机森林和 XGBoost 也可以被训练。
样本外回测结果表明不需要复杂的模型。
为了评估该模型,通过使用 100 个季度的滑动窗口重复训练该模型,并预测下一季度的平均黄金价格,来进行样本外回测。最终,将预测值与实际值进行比较以计算 R,R 大约为 92% 。
r 是决定系数,代表模型可以解释的总变异的百分比。因此,这个简单的模型可以解释黄金价格总体变化的巨大差异。
4.我们如何使用这个模型?
使用这个模型,我们可以通过将我们对货币供应量对 GDP 、美元强势和通货膨胀率的看法转化为对黄金价格的影响来预测黄金价格。
在我看来,货币供应量与 GDP 的比率在短期和长期内都会增加,因为各国政府将继续印钞,以分别抵消全球封锁和信贷市场担忧的影响。
然而,美元指数可能会因避险需求而走强。当市场出现抛售时,对美元等避险资产的需求增加,从而推高美元。
综合这些因素,我预计金价在短期内仍将保持相当大的波动,因为这两个预测因素可以相互抵消。然而,从长期来看,我相信期待已久的牛市将会回归。
附录
TL;速度三角形定位法(dead reckoning)
在疫情和货币战争中,黄金可以成为意外通货膨胀、极端货币贬值和经济增长缓慢的完美对冲。数据分析表明,黄金价格主要受以下因素驱动:
- 通货膨胀率
- 相对于经济规模的货币供应量
- 计价货币的强势和弱势
其他可能影响金价的基本面和情绪因素有:
- 利率
- 中央银行要求
- 黄金 ETF 需求
- 珠宝需求
- CFTC 职位
放弃
这篇文章的唯一目的是通过表达作者的个人观点来教育读者。内容仅反映作者在写作时的观点,不构成任何财务建议,也不反映作者附属组织的任何观点。
源代码
来源
- https://fred.stlouisfed.org/
- https://www.investing.com/
- https://articles . royalmintbullion . com/a-history-of-gold/
- https://www.econlib.org/library/Enc/GoldStandard.html
如何通过偏斜正态分布模拟意大利新冠肺炎疫情
本教程使用 Python 分析与意大利新冠肺炎趋势相关的数据。数据由意大利公民保护组织发布。在下面的文章中描述了这个预测器背后的一般概念:https://medium . com/@ angelica . lo duca/predicting-the-end-of-the-coronavirus-epiderations-in-Italy-8da 9811 f 7740。在我的上一篇文章中,我使用线性回归来逼近数据,在本文中,我们通过偏斜的正态分布来逼近 EPI,这似乎比线性回归更好。
您可以从 my GitHub repository 下载笔记本,在那里您也可以找到线性模型的实现。
入门指南
导入数据并计算 EPI
首先,我们从意大利 Protezione Civile 的 Github 库导入数据,然后计算流行病进展指数(EPI)。我们提取列totale_casi
,其中包含自疫情开始以来的新冠肺炎感染总数,以及tamponi
,其中包含自疫情开始以来的新冠肺炎拭子总数。我们将 EPI 存储在y
变量中。最后,我们打印所有有数据的日期列表(data[‘data’]
)。
import pandas as pd
data = pd.read_csv(“[https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-andamento-nazionale/dpc-covid19-ita-andamento-nazionale.csv](https://raw.githubusercontent.com/pcm-dpc/COVID-19/master/dati-andamento-nazionale/dpc-covid19-ita-andamento-nazionale.csv)")
data.head()
然后,我们计算要分析的指标:流行病进展指数(EPI)并将其存储在y
变量中。我们还定义了X
来存储天数。最后,我们跳过前 15 天,来考虑限制法的影响。
tc = data['totale_casi']
tt = data['tamponi']
y = []
tt_increase = []
for i in range(1, len(tt)):
current_epi = (tc[i] - tc[i-1])/(tt[i]-tt[i-1])
tt_increase.append(tt[i]-tt[i-1])
y.append(current_epi)X = []
for i in range(1, len(y)+1):
X.append(i)skip = 15
X = X[skip:]
y = y[skip:]
现在我们可以绘制 EPI 趋势。
import matplotlib.pyplot as plt
import matplotlib
import numpy as npdef my_plot(X,y):
plt.plot(X, y, color="black", linewidth=1)plt.grid()
plt.xlabel('Number of days')
plt.ylabel('EPI')
plt.show()my_plot(X,y)
提取样本
在训练集和测试集中拆分数据
为了测试模型,我们将X
和y
拆分成X_train
和y_train
。我们将在训练变量上训练模型,并将在测试变量上进行测试。
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
模型定义
通过偏斜正态分布近似数据
我们可以通过偏斜的正态分布来近似计算数据。我们将X
和y
转换成 numpy 数组,并定义了一个名为skewnorm()
的函数,它包含了偏斜正态分布的公式。我在这里找到了公式。查看这里的了解更多关于偏斜正态分布的细节。或者,我们可以使用函数scipy.stats.skewnorm
,这里定义,这里定义,这里定义。
import numpy as np
import math
from scipy.optimize import curve_fit
import scipy.special as spX = np.array(X)
y = np.array(y)def skewnorm(x, sigmag, mu, alpha, c,a):
normpdf = (1/(sigmag*np.sqrt(2*math.pi)))*np.exp(-(np.power((x-mu),2)/(2*np.power(sigmag,2))))
normcdf = (0.5*(1+sp.erf((alpha*((x-mu)/sigmag))/(np.sqrt(2)))))
return 2*a*normpdf*normcdf + c
现在我们能够通过scipy
函数curve_fit()
用训练数据拟合模型。曲线拟合是构建曲线或数学函数的过程,它对一系列数据点具有最佳拟合。curve_fit()
函数将样本和初始参数作为输入。该函数返回最佳参数popt
和协方差矩阵pcov
作为输出。
popt, pcov = curve_fit(skewnorm, X_train, y_train, p0=(1./np.std(y_train), np.mean(y_train) ,0,0,0))
拟合后,我们绘制训练集的结果。我们通过简单地调用函数skewnorm()
并使用函数curve_fit()
返回的参数来计算预测y_train_pred
。
y_train_pred = skewnorm(X_train,*popt)plt.scatter(X_train, y_train, color="black", linewidth=1, label='train')
plt.scatter(X_train, y_train_pred, color="red", linewidth=1, label='model')
plt.grid()
plt.legend()
plt.xlabel('Number of days')
plt.ylabel('EPI')
plt.show()
模型评估
我们在X
的剩余部分,即X_test
上测试模型。我们将函数skewnorm()
应用于X_test
。
y_pred = skewnorm(X_test,*popt)
我们将预测值与实际值进行比较。
df = pd.DataFrame({'Actual': np.array(y_test).flatten(), 'Predicted': y_pred.flatten()})
df
我们计算所有的评估指标。请看:https://www . data Vedas . com/model-evaluation-regression-models/了解更多详情。
我们希望 RMSE 值尽可能低,RMSE 值越低,模型的预测就越好。
from sklearn import metrics
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
我们还计算皮尔逊相关系数,以确定实际值和预测值之间是否存在相关性。我们使用包含在stats
库中的pearsonr()
函数。该函数返回皮尔逊相关系数作为第一个参数,p 值作为第二个参数。
皮尔逊相关系数
完美:如果值接近 1,那么它就是完美的相关性:随着一个变量的增加,另一个变量也会增加(如果为正)或减少(如果为负)。
高度:如果系数值介于 0.50 和 1 之间,则称之为强相关。中度:如果该值位于 0.30 和 0.49 之间,则称之为中度相关。低度:当值低于+ .29 时,则称之为小相关。无相关性:当值为零时。相关页面:https://www . statistics solutions . com/pearsons-correlation-coefficient/
p 值
我们想让它尽可能小。相关页面:https://it.wikipedia.org/wiki/Valore_p
from scipy import statsstats.pearsonr(y_test, y_pred)
将模型扩展到全体人口
将模型应用于所有可用数据
整个种群由X
和y
组成。我们通过将skewnorm()
函数应用于X
来计算y_pred
。然后我们绘制结果。
y_pred = skewnorm(X,*popt)
plt.scatter(X_train, y_train, color="gray", label='train')
plt.scatter(X_test, y_test, color='green', label='test')
plt.plot(X, y_pred, color='red', linewidth=2, label='prediction')
plt.legend()plt.show()
未来趋势预测
将模型应用于未来的日子
现在我们试着预测未来 50 天的趋势。我们从包含在X
中的最后一天+ 1 开始构建一个列表X_future
。然后,我们将函数skewnorm()
应用于X_future
,并绘制结果。
X_future = []
n_start = skip+len(X)
for i in range(n_start, n_start + 50):
X_future.append([i])y_future = skewnorm(X_future,*popt)plt.scatter(X_train, y_train, color="gray", label='train')
plt.scatter(X_test, y_test, color='green', label='test')
plt.plot(X_future, y_future, color='red', linewidth=2, label='prediction')
plt.legend()
plt.grid()
plt.show()
现在,我们可以预测新冠肺炎疫情的结束。当 y 的值等于偏移c
时,就会发生这种情况,偏移在 skewnorm 公式(y[i] = c
)中定义。由于c
是一个浮点数,我们在移动逗号后将其转换为 int。c
的值包含在curve_fit()
返回的popt
变量中。通过应用与c
相同的技术,我们也将y_future
转换为 int。最后,我们使用函数np.where()
找到索引i
,使得y[i] = c
。
c = int(popt[3]*10**9)
y_search = np.array([int(i*10**9) for i in y_future])
i = np.where(y_search == c)
我们获得两个索引,我们取第一个并将其存储在x0
中。
x0 = i[0][0] + n_start
y_future[i[0][0]]
将天数转换为日期。数据从 2020 年 2 月 24 日开始。那我们已经跳过了 15 天。
from datetime import datetime
from datetime import timedelta
data_eff = datetime.strptime(data['data'][skip], '%Y-%m-%dT%H:%M:%S')
现在我们能够计算新冠肺炎疫情的结束时间,只需将x0
转换成日期。根据这一模型,疫情不会在 2020 年 6 月 13 日登记任何病例。
def n_to_date(n):
return data_eff + timedelta(days=n-skip)n_to_date(int(x0))
最后,我们实现了一个函数来预测某个通用日期的 EPI 值。
def date_to_n(my_date):
initial_date = datetime.strptime(data['data'][0], '%Y-%m-%dT%H:%M:%S')
return (my_date - initial_date).days + 1my_date = datetime.strptime("2020-04-25", '%Y-%m-%d')
n = date_to_n(my_date)
predict = skewnorm([[n]],*popt)
predict
摘要
对所吸取教训的简短总结
在本教程中,我们学习了以下概念:
- 在为数据集选择模型之前,重要的是绘制数据,以便了解数据是否具有特定的形状;
- 许多不同的模型可以用来表示数据。因此,评估模型的表现非常重要。在本教程中,我们使用了不同的度量来评估模型:平均绝对误差、均方误差、均方根误差、皮尔逊相关系数和 p 值;
scipy
库提供了函数curve_fit()
,该函数允许对任何形状或曲线进行建模。困难在于定义表示曲线的数学方程。
如何用线性回归对时间序列数据建模
探索时间序列建模
用 Python 代码进行时间序列建模
在 Unsplash 上 tangi bertin 拍摄的照片
欢迎回来!这是专栏的第 4 篇文章,探讨用 Python 代码分析和建模时间序列数据。在前三篇文章中,我们已经介绍了单个时间序列变量的分析 和 多个时间序列变量的分析 。从这篇文章开始,我们将进一步探索使用线性回归建模时间序列数据。
1.普通最小二乘法(OLS)
我们在学校都学过线性回归,线性回归的概念似乎很简单。给定因变量 y 对自变量 x 的散点图,我们可以找到一条与数据非常吻合的直线。但是等一下,我们如何衡量一条线是否很好地符合数据?我们不能只是将图形可视化,然后说某条线比其他线更符合数据,因为不同的人可能会做出不同的评估决策。如何才能量化评价?
普通最小二乘法(OLS)是一种量化评价不同回归线的方法。根据 OLS,我们应该选择使观察到的因变量和预测的因变量之间的差的平方和最小化的回归线。
OLS 回归图解
2.高斯-马科夫假设
根据 OLS 的评价标准,我们可以找到一条最符合观测数据的直线。该行的一般格式是:
在这里,μᵢ是剩余的术语,是 yᵢ的一部分,xᵢ.无法解释我们可以根据 OLS 的要求找到这条最好的回归线,但是我们能肯定 OLS 产生了最好的估计量吗?一个例子是,当存在异常值时,根据 OLS 计算出的“最佳”回归线显然不符合观察到的数据。
OLS 没有生成描述数据的最佳回归线的情况
2.1 截面数据的高斯-马尔可夫假设
事实证明,只有当某些假设得到满足,OLS 计算出最好的线性无偏估计量(蓝色),很好地估计人口参数。对于横截面数据,高斯-马科夫假设有六个假设,确保使用 OLS 计算的估计量是蓝色的。当任何一个高斯-马科夫假设被违反时,使用 OLS 计算的样本参数不再能很好地代表总体参数。
- 参数的线性。这个假设要求参数β是线性的。然而,对自变量的线性没有要求。yᵢ=α + βxᵢ +μᵢ和 yᵢ=α + βIn(xᵢ) +μᵢ都有线性β。
- 自变量 x 和因变量 y 都是随机变量。值得一提的是,如果 x 和 y 都是随机变量,则余项μ不会自相关。
- 多个独立变量 x₁和 x₂.之间不存在完美的共线性如果存在完美的共线性,线性回归结果将是随机的,因为它不能区分 x₁和 x₂.的贡献通常,当 R 结果很好,但每个独立变量的 t 检验很差时,这表明存在共线性。
- 剩余项μ是内生的。要内生性,μᵢ不随 xᵢ.而变它可以表达为 cov(μᵢ,xᵢ)=0.内生性可能产生于反向因果关系或 x 中的测量误差,导致 cov(μᵢ,xᵢ)!=0.
- 剩余项μᵢ.的同方差性它要求μᵢ的方差不随 xᵢ.而变
- 剩余项μᵢ.没有自相关它可以表达为 cov(μᵢ,μⱼ)=0.μᵢ的自相关可由遗漏的独立变量、错误指定的回归函数、独立变量中的测量误差和聚类误差引起。
时间序列数据的 2.2 高斯-马尔可夫假设
时间序列数据与横截面数据略有不同。对于横截面数据,我们从总体中获取样本,高斯-马尔可夫假设要求自变量 x 和因变量 y 都是随机变量。对于时间序列数据,我们是从同一个过程中得到样本,不能再假设自变量 x 是随机变量。因此,高斯-马尔可夫假设对于时间序列数据在内生性、同方差性和无自相关性方面更为严格。由于 x 不再是一个随机变量,需要满足所有时间点的所有 xₖ的要求,而不仅仅是剩余项μᵢ.在该时间点的 xᵢ
3.线性回归的假设检验
3.1 Python 中的线性回归
这里,我们继续使用从雅虎财经获得的历史 AAPL 价格和间谍价格。我们先把 AAPL 价格和间谍价格分开。然后,为了发现 AAPL 价格在多大程度上可以由整体股票市场价格来解释,我们将建立以 SPY 价格为自变量 x 和 AAPL 价格为因变量 y 的线性回归模型
使用 Python 中的 statsmodels 库可以轻松完成线性回归。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as smAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
SPY_price = pd.read_csv('SPY.csv',usecols=['Date', 'Close'])X = sm.add_constant(SPY_price['Close'])
model = sm.OLS(AAPL_price['Close'],X)
results = model.fit()plt.scatter(SPY_price['Close'],AAPL_price['Close'],alpha=0.3)
y_predict = results.params[0] + results.params[1]*SPY_price['Close']
plt.plot(SPY_price['Close'],y_predict, linewidth=3)plt.xlim(240,350)
plt.ylim(100,350)
plt.xlabel('SPY_price')
plt.ylabel('AAPL_price')
plt.title('OLS Regression')print(results.summary())
连同可视化 OLS 线性回归结果的绘图,我们可以打印一个汇总表,如下所示:
我们为什么要做这些复杂的假设检验?我们如何解释这些假设检验结果?我们将在接下来的会议中回答这些问题。
3.2 为什么要对线性回归进行假设检验?
由于我们使用样本来估计总体,我们需要评估样本参数估计总体参数的效果。对样本参数进行假设检验,需要知道样本参数分布。
根据中心极限定理,当样本量足够大时,β的样本分布为正态分布:
然而,我们不知道确切的总体剩余方差(σ)。我们可以用样本残差方差(σʰᵃᵗ)来估计总体残差方差,但这样样本β分布就不再是正态分布了。它变成了 t 分布:
****
β的样本分布服从 t 分布,因为我们不确切知道总体残差方差的方差。标准误差是样本参数的方差。
3.3 如何解读 OLS 统计摘要?
现在是时候回到 OLS 回归结果表,并尝试解释汇总结果。
汇总表的第一部分有 R 和 F 统计量,它们衡量自变量对因变量的总体解释能力。
r 是解释的误差平方和除以误差平方和。R 介于 0 和 1 之间,R 越大,说明自变量能更好地解释因变量。R =解释的误差平方和/误差平方和。自变量越多,得到的 R 将越接近 1,但同时,自变量越多可能导致过拟合。通过惩罚多余的自变量,调整后的 R 偏好较少的自变量。
独立变量联合效应的统计检验。F 统计检验的低 p 值表明自变量不能很好地解释因变量。
汇总表的第二部分是 t 统计量,对每个独立变量进行测试。同时使用 F 统计量和 t 统计量有助于检查自变量中是否存在共线性。好的 F 统计量和差的 t 统计量表示共线性。
Durbin-Watson 和 Jarque-Bera 在第三次会议的汇总表中报告了残差项的平稳性和正态性,这将在下面的会议中详细讨论。
4.线性回归残差
剩余项很重要。通过使用残差项检查高斯-马科夫假设是否成立,我们可以推断线性回归的质量。
样本β的期望值
样本β的方差
4.1 常态测试
检验残差是否正态分布是很重要的。如果残差不是正态分布的,则残差不应用于 z 检验或任何其他从正态分布导出的检验,如 t 检验、f 检验和 chi2 检验。
import pandas as pd
import statsmodels.api as sm
from scipy import statsAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
SPY_price = pd.read_csv('SPY.csv',usecols=['Date', 'Close'])X = sm.add_constant(SPY_price['Close'])
model = sm.OLS(AAPL_price['Close'],X)
results = model.fit()residual = AAPL_price['Close']-results.params[0] - results.params[1]*SPY_price['Close']print('p value of Jarque-Bera test is: ', stats.jarque_bera(residual)[1])
print('p value of Shapiro-Wilk test is: ', stats.shapiro(residual)[1])
print('p value of Kolmogorov-Smirnov test is: ', stats.kstest(residual, 'norm')[1])
输出:
雅尔克-贝拉检验的 p 值为:0.0
夏皮罗-维尔克检验的 p 值为:9.164991873555915e-20
科尔莫戈罗夫-斯米尔诺夫检验的 p 值为:1.134826980654097 e-55
如果我们选择 0.05 的显著性水平,那么所有三个正态性检验都表明残差项不遵循正态分布。
4.2 同质性测试
三种常用的异方差统计检验是 Goldfeld-Quandt 检验、Breusch-Pagan 检验和 White 检验。在同样的序列中,检验更一般的同质性。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
import statsmodels.stats.api as smsAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
SPY_price = pd.read_csv('SPY.csv',usecols=['Date', 'Close'])X = sm.add_constant(SPY_price['Close'])
model = sm.OLS(AAPL_price['Close'],X)
results = model.fit()residual = AAPL_price['Close']-results.params[0] - results.params[1]*SPY_price['Close']print('p value of Goldfeld–Quandt test is: ', sms.het_goldfeldquandt(results.resid, results.model.exog)[1])
print('p value of Breusch–Pagan test is: ', sms.het_breuschpagan(results.resid, results.model.exog)[1])
print('p value of White test is: ', sms.het_white(results.resid, results.model.exog)[1])
输出是:
Goldfeld–Quandt 试验的 p 值为:2.3805273535080445 e-38
breus ch–Pagan 试验的 p 值为:2.599557770260936e-06
白色试验的 p 值为:1.0987132773425074e-22
如果我们选择 0.05 的显著性水平,那么所有三个正态性检验都表明残差项不遵循正态分布。
4.3 平稳性测试
Durbin-Watson 测试检测滞后为 1 的残差项的自相关,而 Breusch-Godfrey 测试检测滞后为 N 的残差项的自相关,具体取决于测试中的设置。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as smAAPL_price = pd.read_csv('AAPL.csv',usecols=['Date', 'Close'])
SPY_price = pd.read_csv('SPY.csv',usecols=['Date', 'Close'])X = sm.add_constant(SPY_price['Close'])
model = sm.OLS(AAPL_price['Close'],X)
results = model.fit()import statsmodels.stats.api as sms
print('The Durbin-Watson statistic is: ', sms.durbin_watson(results.resid))
print('p value of Breusch-Godfrey test is: ', sms.acorr_breusch_godfrey(results,nlags=1)[3])
输出:
德宾-沃森统计量为:0.06916423461968918
布氏-戈弗雷检验的 p 值为:4.6463126097712 e-150
Durbin-Watson 和 Breusch-Godfrey 检验都表明滞后为 1 的剩余项存在自相关。当德宾-沃森统计量为 2 时,不存在自相关。当德宾-沃森统计量趋向于 0 时,存在正自相关。
5.解决违反高斯-马科夫假设的问题
5.1 违反高斯-马科夫假设
当违反高斯-马科夫假设时,从样本计算出的估计量不再是蓝色的。下表显示了违反 Gauss-Marcov 假设如何影响线性回归质量。
5.2 加权最小二乘法(WLS)
为了解决异方差误差,可以使用加权最小二乘法(WLS)。WLS 变换自变量和因变量,因此 OLS 在变换后保持蓝色。
5.3 广义最小二乘法(GLS)
为了考虑异方差误差和序列相关误差,可以使用广义最小二乘法(GLS)。GLS 转换自变量和因变量的方式比 WLS 更复杂,因此 OLS 在转换后仍为蓝色。
摘要
在这篇文章中,我们了解到只有当高斯-马科夫假设成立时,OLS 才能产生好的估计量。因此,线性回归后,检查残差项以确保不违反高斯-马科夫假设总是很重要的。幸运的是,使用 Python 中的 statsmodels 库,在线性回归过程中会自动进行许多统计测试。OLS 线性回归汇总表的简单打印使我们能够快速评估线性回归的质量。如果违反了高斯-马科夫假设,WLS 和 GLS 的进一步解决方案也可用于转换自变量和因变量,使 OLS 保持蓝色。
希望您喜欢使用线性回归学习时间序列数据建模!
如何用 Python 建模时间序列
理解随机游走模型和移动平均过程
在本文中,我们引入两个模型来开始建模时间序列:
- 随机游动
- 移动平均过程
这篇文章旨在实践。所以,一定要开始你的 Jupyter 笔记本,并遵循!
完整的笔记本可以在这里找到。
我们开始吧!
深入时间序列分析,应用高级模型,如 SARIMAX、VARMAX、CNN、LSTM、ResNet、自回归 LSTM 等,并使用 Python 中的应用时间序列分析。
随机行走模型
随机行走模型由以下公式表示:
随机游动
换句话说,这意味着当前时间 t 的位置是先前位置和噪声之和,用 Z 表示。这里,我们假设噪声是正态分布的(均值为 0,方差为 1)。
当然,我们从 0 开始随机行走,我们可以说任何时间点都是到那时为止所有噪声的总和。数学上:
从 0 开始的随机漫步
让我们用 Python 模拟一次随机漫步。
首先,我们将导入本文这一部分和下一部分所需的所有库:
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.arima_process import ArmaProcess
from statsmodels.tsa.stattools import acfimport matplotlib.pyplot as plt
import numpy as np%matplotlib inline
然后,我们生成一个包含 1000 个数据点的数据集。起点为 0,我们将随机噪声添加到上一个点,以生成下一个点:
steps = np.random.standard_normal(1000)
steps[0]=0
random_walk = np.cumsum(steps)
绘制数据集时,我们看到以下内容:
plt.figure(figsize=[10, 7.5]); # Set dimensions for figure
plt.plot(random_walk)
plt.title("Simulated Random Walk")
plt.show()
模拟随机行走
现在,你的随机游走可能与上面的图不同,因为噪声是完全…随机的。因此,也许你的随机漫步实际上是在时间中向上移动。
现在,让我们来看看随机游走的自相关图(或相关图):
random_walk_acf_coef = acf(random_walk)
plot_acf(random_walk, lags=20);
随机游走的相关图
不管你的随机漫步看起来像什么,你应该得到一个非常相似的相关图。如你所见,即使有 20 的滞后,相关性也是非常重要的。因此,该过程不是静止的。
现在,一切都表明我们的数据集中存在一种趋势。有可能消除这种趋势吗?
是啊!
知道一个随机游走给前一个点增加了一个随机噪声,如果我们取每个点和它前一个点的差,就应该得到一个纯随机的随机过程。
让我们用 Python 来验证一下。为了区别对待,我们做到了:
random_walk_diff = np.diff(random_walk, n=1)
然后,我们绘制结果,我们应该得到:
plt.figure(figsize=[10, 7.5]); # Set dimensions for figure
plt.plot(random_walk_diff)
plt.title('Noise')
plt.show()
噪音
如你所见,上面的图在趋势和方差上没有系统的变化,也没有季节性。因此,我们肯定有一个纯粹的随机过程。
查看差异的相关图:
plot_acf(random_walk_diff, lags=20);
随机过程的相关图
我们看到这是一个纯随机过程的相关图,自相关系数在滞后 1 时下降。
移动平均过程
让我们从什么是均线过程的直觉开始。
假设你将一块石头扔进一池水中,并且随着时间的推移,你正在追踪水面上单个水滴的位置。当然,当岩石撞击表面时,会形成波纹,所以我们的水滴会上下移动。现在,让我们假设表面上的波纹只持续两秒钟,之后表面就完全变平了。
那么,我们可以说,我们的水滴的位置可以表示为:
二阶移动平均过程
上式表示,时间 t 的位置 X 取决于时间 t 的噪声,加上时间 t-1 的噪声(具有一定权重θ),加上时间 t-2 的一些噪声(具有一定权重)。
这称为二阶移动平均过程,也可以表示为 MA(2)。
广义的符号是 MA(q)。在上面的例子中,q = 2。
让我们用 Python 来模拟这个过程。
具体来说,我们将模拟以下过程:
这又是一个 2 阶移动平均过程,但是我们指定了权重。您可以随意更改它们并试验参数。
我们从指定滞后开始。这里,我们使用的是滞后 2。
ar2 = np.array([2])
然后,我们指定权重。在本例中,权重为[1,0.9,0.3]。
ma2 = np.array([1, 0.9, 0.3])
最后,我们模拟该过程并生成一千个数据点:
MA2_process = ArmaProcess(ar2, ma2).generate_sample(nsample=1000)
现在,让我们想象一下这个过程及其相关图:
plt.figure(figsize=[10, 7.5]); # Set dimensions for figure
plt.plot(MA2_process)
plt.title('Moving Average Process of Order 2')
plt.show()plot_acf(MA2_process, lags=20);
二阶模拟移动平均过程
同样,由于噪声是随机产生的,您的图形可能与我的不同。然而,相关图应该类似于下图:
MA 的相关图(2)
正如你注意到的,在滞后 2 之前,相关性是显著的。之后,相关性不再显著。这是有意义的,因为我们指定了一个滞后为 2 的公式。
这意味着你可以使用相关图来推断时间序列的滞后。如果您发现在特定的滞后 q 之后,相关性不显著,那么您可以将您的时间序列建模为 MA(q)过程。
就是这样!你现在了解了什么是随机漫步以及如何模拟它。此外,您还学习了移动平均线过程,如何对它们建模,最重要的是,如何确定移动平均线过程的顺序。
通过以下实践课程了解有关时间序列的更多信息:
干杯!
如何削减 Db2 但保留您的代码
蒙特·兹韦本,吉恩·戴维斯和卡罗尔·皮尔森
资料来源:BillionPhotos.com/Adobe
这是一个关于由 DB2 支持的遗留应用程序现代化的故事。它描绘了一个将应用程序迁移到云并使用人工智能扩展它的旅程——无需更改该遗留应用程序中的任何应用程序或 SQL 代码。
背景
我们最近与埃森哲合作,会见了世界上最具标志性的金融服务公司之一,该公司意识到,为了快速进入新兴市场,它需要使其企业业务系统更加灵活。该应用程序运行其业务的重要部分。它管理多个企业和国家的客户、接触点、产品、合同和支付/支出。几十年来,该公司在应用程序的业务逻辑和底层 SQL 代码上投入了大量资金,不想丢掉这一极具竞争力的资产。
来源:拼接机
该公司面临的问题是,它希望迅速扩张到新兴市场。为了最大限度地加快上市速度,该公司需要在创纪录的时间内实施这一全面的应用程序,使用新配置的产品和服务来满足当地需求和新市场的法规。不幸的是,这传统上需要在每个地区建立一个新的数据中心,但这限制太多了。
此外,该公司向全球其他公司推出了新的 SaaS 商务产品。随着他们获得新的 SaaS 客户,他们现在面临着快速扩展应用程序的实施和运营的需求。
解决方案:云迁移
资料来源:ktsdesign/Adobe
基于云的架构将使企业能够根据本地需求配置其产品和服务,从而实现显著加快上市时间的目标。对于 IT 组织来说,迁移到云的好处也是显而易见的。它希望避免供应商锁定并保持云主权,即时提升存储和计算资源而无需采购新硬件,并从各种即时可用的服务中进行选择。通过迁移到云,该公司将拥有基于消费的定价的可预测性和灵活性,因此它可以避免扩大 it 预算。
基于云的架构可以独特地解决业务和 IT 问题,而无需在每个市场都建立新的数据中心。
扩展应用:注入人工智能
但该公司有更大的抱负,不仅仅是云敏捷性。他们希望在实时业务应用中直接使用机器学习(ML)。他们已经投资了人工智能和人工智能,并建立了几个预测模型,在检测欺诈、个性化营销报价、风险定价等方面与人类团队相媲美。但是由于体系结构的限制,他们不能将这些模型直接操作到企业业务系统中。
大多数 ML 部署都有独立的计算阶段。通常,原始运营数据是从交易系统中提取的,通过分析引擎转化为客户和相关数据的摘要,然后发送到统计机器学习框架来训练模型。这本来就是一个缓慢的过程,并且由于通常与业务应用程序分离的模型部署的延迟而加剧。有时这个过程可能太长,以至于运行数据变化太快,模型无法准确预测。
该公司有更广阔的视野。如果您可以将预测模型直接注入到业务应用程序中,以便在第一次通知损失时直接预测索赔欺诈,或者在客户就计费问题致电呼叫中心时向他们提供非常及时和个性化的报价,情况会怎样?
为此,他们想探索一种新的方法。称之为“应用程序翻新”。云迁移将为他们带来灵活性,但也可能成为一个新的可扩展平台的基础,该平台可以支持内嵌智能,而 ML 是业务应用的原生产品。
所以他们的问题是,是否有现代数据库可以促进这种云和人工智能的旅程。
从 DB2 到云
几十年来,DB2 数据库在行业中占据了至高无上的地位,这是有充分理由的:DB2 为应用程序提供了可靠的、符合 ACID 的性能和强大的动力。架构师和开发人员喜欢它的可靠性、全面的 SQL 和低延迟操作。
该公司意识到,如果它想利用多样化数据、人工智能和云可用性的结构性转变,可能还有其他现代数据库选项。除了不是云原生解决方案之外,扩展 DB2 的成本可能很快变得难以承受。即使对于能够承担这些成本的公司来说,他们仍然需要在可操作的 DB2 实例、分析性 DB2 实例和独立的 ML/AI 框架之间构建和维护 ETL 管道。在一个独立的平台上构建 ML 模型会使其操作化变得很麻烦,并妨碍其大规模采取即时行动的能力。
云锁定问题
除了这些功能需求,该公司不希望被一家云基础架构供应商所束缚。每个云供应商都提供无数的计算和存储原语,他们引诱公司将它们组合在一起,直到他们意识到他们只是陷入了专有水泥中。他们留下了大量集成脚本和连接专有云服务的延迟,用于运营、分析和机器学习工作负载。该公司想要一个多云解决方案,即他们的新“智能”业务系统可以在任何云上轻松灵活地配置、操作和维护。
评估现代解决方案:拼接机
该公司的战略技术咨询合作伙伴埃森哲向该公司引入了 Splice Machine 的横向扩展 SQL 数据库,作为一种全新的现代解决方案,它可以:
- 运行最初为 DB2 设计的企业业务应用程序,几乎不做任何修改;
- 支持多种云;
- 弹性伸缩。
作为一个额外的奖励,Splice Machine 的 ML Manager 可以让他们直接将人工智能注入到他们的应用程序中,使其更加智能,或许可以使整个数据科学过程更加高效。
因此,该公司与埃森哲和 Splice Machine 合作,对云迁移和应用程序现代化进行了技术评估。
考虑到修改原始遗留应用程序的成本和风险,该公司希望在不做任何修改的情况下运行企业应用程序。
我们认为任何其他数据库都可能需要大量重写。
概念验证
为了最大限度地降低任何严重阻塞的风险,该公司使用拼接机进行了概念验证(POC)。POC 的目标是验证 Splice Machine 作为现有 DB2 平台的可行替代方案,为某些应用程序提供支持。该公司为其企业应用程序提供了测试数据库的 DB2 备份,以及大约 5,000 个最常见的 SQL 查询的执行查询日志,这些查询涉及创建用户、合同和更新客户信息等。他们还提供了一些绩效目标。
Splice Machine 使用其数据迁移工具来提取模式、数据、索引、触发器、键等。进入我们的平台。这代表了数百个表和数千个索引。在某些情况下,在此过程中发现了一些缺口,并为此创建了解决方法。我们将在下面更详细地讨论这些。
一旦拼接机数据库创建完毕,该公司就可以对其进行 5000 次查询。这些查询中的大多数具有“事务”性质,并且由拼接机的事务引擎处理,尽管当拼接机的基于成本的优化器基于统计认为合适时,一些由分析引擎处理。请参考下面拼接机的双引擎架构。我们将开源组件与由独特的分布式 ACID 事务引擎包围的优化接口无缝集成。
来源:拼接机
POC 揭示了我们需要调整查询以简化性能的几个地方。例如,团队分析并改进了涉及连接的语句中最昂贵部分的性能。有时系统会将查询误认为是分析性的,并选择了错误的连接算法。POC 团队使用了一种变通方法,即暗示使用嵌套循环连接,这对于快速执行 OLTP 风格的操作至关重要。他们还创建了额外的索引,并向优化器提供提示,以实现某些查询的特定连接顺序。
在调优这些查询之后,Splice Machine 能够在除了一个查询之外的所有查询上达到或超过性能目标。该测试数据库的数据量相对较小(约 1.5TB),因此测试没有展示 Splice Machine 在较大数据集(5TB-PB)上的横向扩展架构,我们认为我们在这方面的性能远远优于传统数据库。
但是,我们必须用额外的索引、语法重写和提示来修改应用程序代码。
由于 POC 的成功,该公司要求我们解决已确定的差距,并展示 Splice Machine 可以在没有额外索引、语法重写和提示的情况下运行其应用程序。
如果这个后续的“launchpad”项目成功,我们将有可能在新兴市场甚至大型现有运营实体中推动他们的应用。这是一个巨大的挑战,但非常值得去做。
无需修改即可启动应用——真正的考验
资料来源:Mariusz Blach/Adobe
“launchpad”项目比 POC 更具挑战性,因为该公司要求在不更改应用程序中任何 SQL 的情况下运行应用程序。
在概念验证期间,Splice Machine 被允许修改一些查询,甚至在极少数情况下提示优化器正确执行或实现目标性能。但在项目实施阶段,这些选项不再适用于拼接机。
如前所述,在概念验证期间,Splice Machine 的团队发现了平台中的许多差距。其中包括:
- SQL 语法的简单扩展(例如,某些内置函数、标识符中的特殊字符)
- 完全外部连接支持
- 尚不支持更复杂的触发处理功能(条件逻辑、信号、每个触发多个动作等)。)
- 错误代码支持匹配遗留数据库错误代码和处理
“launchpad”项目的第一阶段解决了 Splice Machine 数据库引擎中的这些缺口。
在这个阶段,Splice Machine 从公司数据库的最近备份开始,并再次应用其数据库迁移工具来创建托管在 AWS 中的新 Splice 数据库。数据库迁移包括映射全套外键、触发器和值约束,因为维护应用程序内的引用完整性至关重要。
该客户的应用程序是一个“富客户端”Windows 应用程序,这意味着填充表单和创建用户选择选项所需的大部分数据也存储在数据库中,并且需要在应用程序正常运行之前进行检索。
“不改变应用程序”的要求引发了额外的挑战,因为该团队遇到了 Splice Machine 当时不支持的新 SQL 语法,并且在最初的 POC 中没有公开。例如,这需要特定的查询简写,以便在 UNION 语句中为多个子查询指定别名。拼接机解决了遇到的这些异常情况。在将应用程序配置为使用 Splice Machine 作为数据存储后不到三周的时间内,应用程序无需修改即可成功运行。
为了验证功能等效性,该公司确定了 22 个反映其核心业务功能的多步骤测试场景。然后,他们执行这些复杂的多语句工作流,包括值约束、多个触发器和外键,而无需更改应用程序中的一行 SQL 语句。这些场景都被公司成功验证。
虽然应用程序现在运行在 Splice Machine 上而没有进行任何更改,但仍有一些工作流运行速度明显慢于运行版本。这并不奇怪,因为 Splice Machine 现在正在执行许多超出原始 POC 中所见的新查询,并且这些查询是在考虑现有数据库优化器的情况下编写的。在一个例子中,有一个应用程序广泛使用的涉及左外连接的查询模式。原始数据库可以在不到一秒钟的时间内运行这个查询模式,而 Splice Machine 需要 60 秒或更长时间。但是 Splice Machine 优化团队很快就为这类查询更新了优化器的解决方案搜索逻辑,也实现了亚秒级时间。此时,一些查询的执行速度仍然比最初的查询稍慢,但是性能通常被认为很容易在以后的优化器中进行调整。此外,Splice Machine 将全外连接查询提高了 50 倍以上的能力让该公司相信,以后的性能调优(必要时)应该不成问题。
来源:拼接机
下一阶段:运营准备
"发射台"项目如期成功交付,尽管项目有所发展,需求和实施优先事项也有所调整。该公司现在正与我们讨论一个新项目,以使拼接机在操作上做好准备,部署在他们选择的地点和时间。这将需要在真实的环境条件下对应用程序进行广泛的测试和跟踪,并执行操作程序,如备份、复制、故障转移和升级。
扩展应用程序:整合实时人工智能
将某些应用程序迁移到可扩展的分布式云原生平台将加速公司扩展到新的高增长市场的主要业务目标。但故事并没有就此结束:在将其应用程序迁移到 Splice Machine 平台后,该公司将能够利用它已经建立的 ML 模型,并在数据库中执行它们,从而大大减少阻止这些模型在应用程序中运行的数据延迟。它将能够在廉价的基于云的环境、内部环境或混合环境中,无限扩展为这些模型存储和使用的数据量。使用 Splice Machine 的触发器和存储程序,该公司将能够立即采取行动来检测欺诈性交易,交叉销售/追加销售个性化产品和服务,所有这些都基于实时信息,等等。在运营就绪项目的同时,我们计划与该公司的数据科学团队合作,将他们的 ML 模型直接注入业务系统,以证明这一点,然后在稍后阶段使其投入运营。这是拼接机器 ML 管理器的描述和演示,将在项目中发挥作用。
来源:拼接机
摘要
这只是应用程序现代化之旅的一个例子。在这里,我们展示了将遗留数据库应用程序迁移到 Splice Machine 并使其无需修改即可运行的初始步骤。
要获得 Splice Machine 的演示或您自己在云上的试验,以调查您的现代化之旅,请单击此处。
如何赚钱足球
按目标
足球协会开始意识到数据科学的潜力,以及国际象棋大师的选择
利物浦赢得欧洲冠军联赛——世界上最负盛名的足球赛事之一
利物浦足球俱乐部不仅仅赢得了英格兰超级联赛。他们完全绝对地控制着它。
在前 25 场比赛中取得了 24 场胜利和一场平局,他们是顶级足球 133 年历史上最快达到 70 分的球队。唯一一支在英超联赛中保持不败的球队在整个 38 个赛季中取得了 26 场胜利。简单来说,他们现在的表现是没有先例的。
所有这些对于热情的球迷群体来说都是非常受欢迎的,他们的球队在 30 年内没有赢得过联赛冠军——对于足球鉴赏家来说更是如此,他们在这个过程中享受到了一些真正出色的足球。
欧洲足球史上最伟大的比赛之一…
鉴于利物浦相对节俭,他们最近的成功或许更令人惊讶。当然,“相对”是一个关键词——足球是一项充斥着金钱的运动,许多欧洲顶级球队都被极其富有的财团所拥有,这些财团为他们注入了大量资金。例如,利物浦最接近的竞争对手曼城足球俱乐部(Manchester City FC)归阿布扎比王室成员所有,价值至少 170 亿英镑。在过去的十年里,曼城在球员净值(即买入球员的成本减去出售给其他俱乐部的球员的价格)上花费了令人眼红的 10.7 亿英镑。
利物浦在同一时期的花费减少了 70%,甚至在过去五个赛季中的三个赛季在球员转会上实现了净利润。在有史以来最昂贵的 50 次转会中,利物浦只占了三次(他们过去两个赛季的最佳射手穆罕默德·萨拉赫甚至没有出现在名单中,他曾经被英格兰对手切尔西以微不足道的 1350 万英镑卖掉)。Trent Alexander-Arnold 和 Andy Robertson,可以说是目前世界上最好的边后卫,他们两人的身价只有 810 万英镑。他们现在被认为价值 1 . 71 亿英镑。
那么利物浦是如何做到这一点的呢?正如 Bruce Schoenfeld 为《纽约时报》撰写的精彩文章所详述的,该俱乐部最近的成功至少部分归功于数据和分析的广泛使用。
利物浦主帅于尔根·克洛普——AMA/盖蒂图片社
这方面的一个早期例子是收购了尤尔根·克洛普,利物浦神秘的经理和他们高效的“葛根普斯”踢球风格的设计师。带着多特蒙德在他的祖国德国获得德甲荣誉后,克洛普的股票在 2014-15 赛季下跌,当时球队获得了相对较低的第七名——这是八年来最差的成绩。
尽管这个明显的失败,他在从多特蒙德辞职后的几个月内被钦点为利物浦的新经理。利物浦的共同所有者(约翰·w·亨利,他的芬威体育集团也拥有波士顿红袜队)没有依靠公众声誉来做出招聘决定,而是求助于剑桥物理学家伊恩·格雷厄姆。格雷厄姆建立了一个广泛的世界足球数学模型,并发现多特蒙德令人失望的赛季远没有受到糟糕管理的影响,而是运气不好的结果。
足球是一项靠一点运气就能左右比赛的游戏。得分通常很低(3-3 平局是“高分”),只有 10-15%的射门得分。因此,一场比赛的最终得分可能并不代表一支球队的实际表现。格雷厄姆回忆起 2014 年的一场比赛,克洛普的多特蒙德队以 2 比 0 输掉了比赛,尽管他们在其他各方面都占据了比赛的主导地位——他们在 64%的时间里控制着球,角球次数是他们的七倍,射门次数是他们的两倍多。
当然,数据和体育的最初联姻是《T2 金钱球》(Moneyball ),这本书讲述了奥克兰运动家队(Oakland Athletics)2001 年棒球赛季的故事,奥克兰运动家队的经理比利·比恩组建了一支由廉价的“不适应”球员组成的非常成功的球队,并提供了吸引人的基本统计数据。后来芬威体育集团的约翰·w·亨利找到了比恩,他热衷于在波士顿红袜队复制这种方法(红袜队继续赢得了 2004 年世界系列赛——这是他们自 1918 年以来的第一次——使用了比恩开创的许多方法)。
虽然统计数据可以帮助职业球队在体育史上占有一席之地,但热情的业余爱好者也开始受益…
12 月 16 日,有史以来最伟大的国际象棋大师之一芒努斯·卡尔森,发现自己在一个拥有 750 多万棋手的全球联赛中名列榜首。不过,不是象棋联赛,而是梦幻超级联赛。
梦幻超级联赛(又名 FPL,或梦幻足球)是一款在线游戏,跟随现实世界的超级联赛赛季。给定 1 亿虚拟英镑的预算,每个球员(或“经理”)必须召集一个现实世界的球员团队,然后根据他们在现实生活游戏中的表现获得 FPL 积分(例如,前锋每进一个球将获得 4 分 FPL 积分,后卫每不失球将获得 4 分,守门员每 3 次扑救将获得 1 分,以此类推)。
在赛季的第一周,我自己的团队(严重不足)
问题是不同的球员有不同的价格——像穆罕默德·萨拉赫这样的明星球员可能要 1250 万英镑,而在一个较小的球队相对不知名的球员可能只要 400 万英镑。因此,不可能让你的球队充斥着每周都占据头条的超级巨星。
作为一个额外的复杂因素,经理们可以每周从他们的团队中换出一名球员(当然,保持在预算之内),带来一名替代球员,他可能状态更好,或者有更轻松的比赛。通常在几周前计划这些转会“步骤”以获得这样的球员,这使得这项运动被比作国际象棋(尽管卡尔森坚持认为运气也起了很大的作用)。
因此,成功的 FPL 经理人最能发现基本面良好的廉价球员,他们有潜力每周“在雷达下”获得 FPL 积分。显然,这是一个赚钱时机已经成熟的游戏。
这就是我的新项目的全部内容。计划是建立一个分类算法(可能是一个神经网络)。它将获取关于一名球员的基本表现,以及他们将要比赛的球队的表现的数据。然后它会告诉我们他们是否会是 FPL 队的好选择。
每周玩家 FPL 积分的热图,以及他们在游戏中的价格(按玩家位置)。
初步分析确实表明这应该是可能的——上面的热图显示,价格较低的玩家完全有能力获得大量积分(见每个图左上角的彩色斑块)。当然,视觉效果也显示,许多更便宜的玩家在每场比赛中得分很少(见左下角更暗的补丁)。
没人说赚钱容易——这就是利物浦的首席数据科学家拥有哈佛大学粒子物理学博士学位的原因。
这是一个新的博客系列’的第一篇,在这个博客系列中,我将尝试为梦幻英超建立一个模型。我很乐意听到关于这个博客的任何评论,或者这篇文章涉及的任何概念。欢迎在下面留言,或者通过 LinkedIn 联系我。
如何使用 HyperDash 远程监控和记录您的机器学习实验
培训需要很长时间才能完成,但你需要去洗手间休息一下…
动机
你有没有发现自己在训练一个机器学习模型的时候,眼睛长时间盯着笔记本电脑屏幕?尤其是在 Google Colab 上训练深度学习模型的时候,你想知道训练什么时候完成,这样你就可以在失去连接之前在笔记本电脑前。
史蒂夫·哈拉马在 Unsplash 上拍摄的照片
如果实验需要几个小时才能完成,想象一下在这段时间里你能做什么?散步、做饭、上厕所时不要把笔记本电脑带进浴室。如果有一种工具可以帮助你远程监控实验,那岂不是很神奇?
超破折号
幸运的是,有了 Hyperdash ,你可以远程监控你的训练(网络、iOS 和 Android)。你可以看到进度并且在实验完成时得到通知。更好的是,记录你实验的结果和超参数!
装置
$ pip install --upgrade pip && pip install hyperdash
注册 Hyperdash 帐户
$ hd signup
你可以选择注册电子邮件或 GitHub。然后使用您刚刚创建的帐户登录
$ hyperdash login
如果你决定用电子邮件联系。这是你将会看到的
在您的手机上安装
Hyperdash 在 Appstore 和 Google Play 中都有。您可以下载并登录您的帐户。
一旦您登录,您在笔记本电脑上的实验将会显示并保存到您的手机上!让我们通过运行来确保它有效
$ hd demo
你可以看到程序同时在终端和你的应用程序中运行
酷!那么我们如何利用这一点呢?Hyperdash 的伟大之处在于它非常易于使用和入门。让我们看看如何在您的数据科学项目中使用它。
监控你的机器学习实验
我将使用来自 Kaggle 的心脏病数据集。我们的任务是预测病人是否有心脏病。为了快速了解 Hyperdash 是如何工作的,你可以在这个资源库中运行笔记本,观察你手机上的 Hyperdash 应用程序是如何变化的!
首先将数据分成训练集和测试集
使用 Hyperdash 记录你的实验
使用超级破折号的步骤:
- 名称:用
Experiment(name)
声明你每次运行的实验对象 - 参数:用
exp.param('name', value)
记录任意超参数的值 - 指标:用
exp.metric('name', score)
记录您希望看到的任何指标的值 - 结束:用
exp.end()
结束实验
就是这样。当运行上面的代码时,您应该能够看到在您的手机上运行的实验
在指标选项卡中,您可以看到您在exp.metric()
中记录的指标
观察超参数
在日志中,您还可以看到有关用于训练的模型的更多信息,如大小、形状以及有关原始数据的信息。这些信息被写入。json 格式。
室内装饰实验
用上面的方法,你的实验不会在没有代码exp.end().
的情况下停止运行。你可以通过将你的实验包装在一个函数中来避免记住这个代码的麻烦
当你运行这段代码的时候,这个实验已经在你的手机上完成了!
你还能用这些指标做些什么?
您还可以通过记录每个迭代中的度量来观察每个迭代的度量
您会看到一个漂亮的图表,其中显示了精度和损耗函数随时间的变化
结论
Hyperdash 确实是一个很酷的 app,但是除非你使用它,否则它不会有用。当你想远程监控实验并快速保存你得到的结果和度量时,我推荐你使用它。但是为了记录更多关于实验的复杂信息,我推荐使用 Mlf flow或 W eights 和 bias。如果你对如何使用这些工具感到好奇,请关注我关于这些神奇工具的下一篇教程。
我喜欢写一些基本的数据科学概念,并尝试不同的算法和数据科学工具。你可以在 LinkedIn 和 Twitter 上与我联系。
如果你想查看我写的所有文章的代码,请点击这里。在 Medium 上关注我,了解我的最新数据科学文章,例如:
美国之于加拿大,就像汉堡之于 _?
towardsdatascience.com](/how-to-solve-analogies-with-word2vec-6ebaf2354009) [## 如何找到和 Python 很好的搭配
给定个人偏好,如何匹配使得总偏好最大化?
towardsdatascience.com](/how-to-match-two-people-with-python-7583b51ff3f9) [## 如何用 Faker 创建假数据
您可以收集数据或创建自己的数据
towardsdatascience.com](/how-to-create-fake-data-with-faker-a835e5b7a9d9) [## 凸包:包装数据的创新方法
如何利用包装算法实现数据可视化
towardsdatascience.com](/convex-hull-an-innovative-approach-to-gift-wrap-your-data-899992881efc) [## 如何用 Altair 创建交互式剧情
在 5 行简单的 Python 代码中利用您的数据分析
towardsdatascience.com](/how-to-create-interactive-and-elegant-plot-with-altair-8dd87a890f2a)
如何在 Docker 容器中挂载目录
专注于编写代码,无需担心环境管理
马克斯·威廉姆斯在 Unsplash 上的照片
它在我的机器上工作;那么让我们运送你的机器吧!简而言之,那就是码头工人。它允许我们通过使用容器化技术在任何计算机上运行 Docker 映像中的应用程序。Docker 容器是一个基础 OS ( alpine 、 ubuntu 等)的包。)和其他必要的软件依赖项,您可以在 docker 映像中定义它们。现在,您可以使用该映像创建一个容器,在不同的机器上运行您的应用程序,甚至在云平台上运行( AWS 、 GCP 、 Azure 等)。)而不用担心环境管理(开发、测试和生产)。
Docker 因其可移植性、安全性和性能而成为 DevOps 的流行工具之一。在这篇文章中,您将学习 Docker 的一些基本概念和命令,它们将教您如何在 Docker 容器中挂载一个目录。我几乎每天都使用 Docker 进行本地开发——例如,你可以在这里看到我是如何为一个个人项目Docker 化一个 Ruby on Rails 应用程序的。
设置
首先,你需要安装 Docker 。出于演示的目的,我们将使用预先构建的 Ruby 和 macOS 的官方映像。
- Docker Image: 这是一个包含创建容器指令的模板。
- **Docker 容器:**容器是图像的运行实例。
docker run
命令用于从图像运行容器。这里我们使用 ruby 映像创建容器,但是您也可以使用自己的映像。如果主机上不存在 ruby 映像,Docker 将从 Docker Hub 中获取该映像。一旦下载到本地机器上,Docker 将使用相同的映像来连续创建容器。要装载一个卷,只需在终端中运行以下代码:
docker run -v /host/directory:/container/directory
现在,您将在容器的脚本文件夹中挂载脚本文件夹。这是最佳实践,因为您不必担心不同机器上的环境管理。
docker run -it --rm -v $HOME/Desktop/scripts:/scripts --name scripts ruby bash
标志-i -t
(通常写为-it
)用于以交互模式访问容器。--rm
标志(可选)在您退出或停止容器以释放系统资源(CPU、内存)时移除容器。如果您在停止或退出容器后不使用它,如果您想释放磁盘空间,必须手动删除它。-v
标志用于挂载一个主机文件夹,它由冒号分隔的两个字段组成。第一部分是主机中的路径。第二部分是容器中的路径。
-v /host/directory:/container/directory
--name
标志(可选)用于给容器一个特定的名称。如果你不想提供一个,Docker 会随机分配一个名字,所以如果你想更容易地跟踪你的容器,你可以选择一个。ruby
命令用于加载图像。如果你想使用 Ruby 的2.5
版本,使用ruby:2.5
命令。
docker run -it --rm -v $HOME/Desktop/scripts:/scripts --name scripts ruby:2.5 bash
最后但同样重要的是,bash
命令用于获取容器内部的 bash shell。
在 Mac 上运行
要运行 python 代码,请使用 Python 映像。
docker run -it --rm -v $HOME/Desktop/scripts:/scripts --name scripts python bash
停止和移除容器
正如我在上面解释的,如果您想要释放系统资源和磁盘空间,您需要停止并删除容器。您可以在主机上运行docker ps
命令来查看正在运行的容器列表。要停止容器,使用带有容器 id 或容器名称的docker stop
命令。您可以使用-a
标志来查看所有停止或退出的容器。
docker stop d61f09eb42ad
# or
docker stop scripts
docker ps VS docker ps -a
要手动删除容器,请使用以下命令之一。
docker rm d61f09eb42ad
# or
docker rm scripts
移除图像
如果您想要删除一个图像来释放磁盘空间,例如,您刚刚创建的 Ruby 图像,使用docker rmi
命令。但是首先,让我们试着去理解引擎盖下到底发生了什么。为此,我们将使用docker images
和[docker system df](https://docs.docker.com/engine/reference/commandline/system_df/)
命令来显示 Docker 守护进程的磁盘空间使用信息。docker images
命令列出您机器上的所有图像。
在这种情况下,我的机器上有三个图像
一个活动容器正在使用一个活动图像
[docker system df](https://docs.docker.com/engine/reference/commandline/system_df/)
命令告诉我,我只能要求 65%的磁盘空间,因为我仍在运行脚本容器,而该容器正在使用 ruby 映像。如果您添加剩余的两个映像,您将获得 65%的可回收磁盘空间。
933MB (python) + 643MB (java) = 1.576GB (65%)
好了,通过在停止容器后运行[docker system df](https://docs.docker.com/engine/reference/commandline/system_df/)
命令,告诉我们现在可以要求 100%的磁盘空间。
没有活动容器和活动图像
请注意,如果您试图删除一个容器正在使用的图像,您会得到以下错误。
Error response from daemon: conflict: unable to delete 121862ceb25f (cannot be forced) - image is being used by running container d61f09eb42ad
最后,我们可以使用带有图像 id 的docker rmi
命令来删除图像。
docker rmi 121862ceb25f
# remove multiple images by putting a space between them
docker rmi efdecc2e377a d23bdf5b1b1b
包裹
现在您知道了如何在 docker 容器中挂载一个目录。Docker 极大地帮助了我在多台机器上轻松创建本地开发环境,而无需任何额外的努力和时间。这是一项你想放在包里的技能,无论是为了个人还是工业目的。我希望这能帮助你开始接触 Docker 的神奇世界。
GIF by GIPHY
根据吴恩达的观点,如何在机器学习的职业生涯中导航
约瑟夫·巴里恩托斯在 Unsplash 上拍摄的照片
报告的
了解如何在机器学习领域取得成功
“找一份你不会厌倦的工作”
介绍
今天,许多人都希望以某种形式参与人工智能(AI)。你不能责怪他们。AI 是很多行业的未来。
对许多人来说,进入人工智能领域的直接途径是在机器学习(ML)领域寻求职业生涯。
因此,这篇文章涵盖了 YouTube 上众多斯坦福讲座之一吴恩达的教导。
更具体地说, Andrew 为你如何在机器学习的职业生涯中成功导航提供了极好的建议。
在本文中,我将为您提供以下内容:
- 如何在机器学习领域找到工作
- 招聘人员和员工在他们的理想候选人身上寻找什么
- 成功人工智能实践者的模式
- 如何选择工作
- 导航机器学习职业的错误方法
这篇文章与大多数处于职业生涯不同阶段的机器学习从业者相关。
方向
在完成学术研究后,机器学习学生通常会从事机器学习工作,或者以博士的形式进行进一步的研究。
拿我来说,在获得机器学习硕士学位后,我很快就进入了一个 ML 角色。通常情况下,人工智能角色存在于两种类型的公司中:要么是大型科技公司,如脸书、谷歌,要么是年轻、令人兴奋的初创公司。
安德鲁提到的一件事是,无论你选择哪个方向,你都必须确保你进行的是重要而有意义的工作。我将在本文后面详述安德鲁提到的重要而有意义的工作。
但是首先,让我们先弄清楚如何找到一份工作。
如何找到工作
机器学习领域的工作竞争非常激烈,但你已经知道了。
你可能没有意识到招聘人员和员工在他们理想的候选人身上寻找的品质和技能。
Andrew 拥有多年在人工智能团队中工作的经验,并领导过大大小小公司的团队。
“作为谷歌大脑团队的创始领导者,斯坦福人工智能实验室的前主任,以及百度约 1200 人人工智能团队的总领导者,我有幸培养了许多世界领先的人工智能团队,并开发了许多人工智能产品,供数亿人使用。”—吴恩达
现在,安德鲁建议招聘人员在招聘人工智能角色时应该寻找什么:
1.编码/技术技能
机器学习研究工作要求个人至少具有已经获得的平均水平的技术技能。
你一般的程序员都懂两到三种编程语言,都是中级水平。
机器学习从业者往往拥有编程技能,并被期望能够理解一套常用的编程语言,如 Python 、 Java 、 JavaScript 和 R 。
你可能会问,为什么你需要掌握这么多种语言的实用知识。
嗯,作为一名计算机视觉工程师,我在三种不同的编程语言之间周旋。我用 Python 实现模型( TensorFlow ),写脚本;我还使用 javascript 来实现模型( tfjs ),最后,我将模型和计算机视觉技术集成到 iOS 应用程序中,因此我利用 Swift 语言来开发 iOS 应用程序。
2.回答技术问题的能力
在你的简历被审核后,你就进入了面试的下一阶段,接下来的阶段通常是电话面试和现场面试。
在两个面试阶段,你都可以期待被问到机器学习相关的话题。期望解释梯度下降变量之间的差异;或者新颖的神经网络结构的独特特征是什么。
3.理论知识的实际应用
你可能已经在某种形式的学术机构呆了几年或更长时间,习惯了大学和学院采用的基于理论的考试方法。
另一方面,招聘人员正在寻找优秀的候选人,他们不仅理解机器学习中的主题理论,而且可以适当地应用概念、技术和想法。
例如,确保你在概念层面上理解批量标准化的描述和好处,但是为了在招聘人员面前脱颖而出,一定要准备好 Jupyter 笔记本或 GitHub repos,记录你使用批量标准化的地方。
方项目
证明你理论知识应用的一个实用方法是在你的文件夹里有两个或更多的副业项目。兼职项目是你展示技术、创造力和解决问题能力的为数不多的机会之一。
4.不断学习的能力
一些传统的角色不需要你更新你所在领域或行业的知识。
在机器学习中,这是完全相反的,新技术每天都在开发,更多的工具和库每周都在更新,大量的研究论文每月都在发表。
在机器学习中,你永远不会停止学习。我目前参与了深度学习领域,并利用了研究和开源项目中的技术。然而,通常情况下,有一种新的闪亮的神经网络似乎已经推动了特定计算机视觉任务的前 5 名精度,并且现在是最新的艺术技术。
招聘人员和雇主希望看到你不会满足于一个角色而停止求知。机器学习从业者通常处于人工智能行业新兴技术的前沿。
成功人工智能实践者的模式
照片由 Iswanto Arif 在 Unsplash 拍摄
人工智能是一个包含其他子领域的领域,如机器学习、自然语言处理、语音识别、神经网络、计算机视觉、图像处理和许多其他子领域。
根据 Andrew 的说法,工作角色的最强候选人和成功的人工智能实践者都有一个跨越人工智能子领域的“T”形学习方法。
这意味着他们在人工智能的大多数子领域都有广泛的知识,在少数领域有深入的知识。
以我自己为例,我从事了机器学习、计算机视觉和机器人学方面的高级研究。通过学习,我获得了人工智能一些关键子领域的基础知识。通过我的论文、个人项目和职业道路,我专注于三个主要领域,即计算机视觉、自然语言处理和深度学习。
学术机构将通过引入跨子领域的基础知识来进行机器学习的教学。他们将为学生提供通过选修课、论文和课程作业获得深入知识的能力。
下面是我大学毕业后,开始我的 pwn 项目和职业生涯后,我的 T 形知识路径的例子。
在完成了我在 ML,CV 和机器人学硕士学位的所有必修课程后,我获得了人工智能主要子领域的基础知识。
大学毕业后的 AI 领域知识
随着我完成论文并在职业生涯中继续前进,我的学习道路已经成型为你在下面看到的 T 形路径。
我的专业是深度学习,这是计算机视觉的一个子领域。
碰巧你在神经网络,机器学习,NLP(图像字幕)和图像处理方面学到了更多的知识,这是子领域重叠和有相关主题的结果。
就个人而言,在我认为自己是深度学习和计算机视觉专家之前,我还有很长的路要走。
AI 领域知识完成后的学位论文和职业生涯开始
深入的知识
我已经多次提到“深入的”知识,但是它意味着什么和包含什么。根据 Andrew 的说法,深入的知识由以下因素指导和定义:
- ✅项目
- 开源捐款✅
- 研究✅
- 实习✅
再说一次,在特定的子领域从事个人项目会加深你的知识和专长。这不仅会让你成为一名成功的人工智能实践者,而且你更有可能被考虑担任更多的人工智能角色。
如何选择工作
塞萨尔·阿布纳·马丁内斯·阿吉拉尔在 Unsplash 上的照片
安德鲁认识到这样一个事实,即具有机器学习专业知识的个人是有需求的。
这一事实可能会使大量的选择对一些人来说是一种相当紧张的经历,而对另一些人来说,这可能会导致做出错误的决定。
下面的陈述和列表来自安德鲁对他的学生的建议,关于他们应该如何选择工作来拥有一个快乐而有意义的职业生涯。
在一个好的团队中工作
在他的讲座中,Andrew 专注于他认为个人在选择工作角色时需要考虑的具体要点和提示,他关注的一个特定领域是选择优秀的团队。
在选择团队时,您需要考虑一些因素,它们是:
- 互动
- 沟通
- 成长。
安德鲁建议,你应该在一个团队中工作,在那里你可以很容易地与其成员互动。通常,这样的团队包含(10-30)个人。他建议你应该关注团队有多努力,以及他们的个性和职业道德是否能对你产生积极影响。
团队中的个人往往是你大部分时间与之相处的人。根据行为研究,你最终是和你相处时间最长的五个人的平均值。
了解你的角色
在决定接受一个提供的角色之前,确保你了解你将要从事的工作。
通常情况下,职位公告栏上的职位描述并不能反映实际工作中的角色和职责。
有时候,工作岗位上的责任被过分夸大了,这会导致失望。
其他时候,招聘广告低估了新员工被期望承担的工作量,这可能会导致职业生涯过早耗尽精力。
避免失望和筋疲力尽的最好方法是直接与你的上司交谈,了解对任务和交付时间的期望。
此外,与类似角色的团队成员交谈,询问他们日常活动中的问题。
忽略公司
当安德鲁第一次提到忽略你正在考虑工作的公司时,我有点困惑。但是经过进一步的澄清,这个信息变得清晰了。
公司拥有外部声誉和认可度,这通常被称为公司的品牌。公司的品牌一般是公司如何向外界传达自己。这样做的问题是,你通常只会向外界展示你最好的一面,这让你在选择公司时的决定有点偏差。
正如 Andrew 所说,从一般经验来看,一家公司的品牌与你在该公司的个人经历的相关性很弱。
在选择人工智能的角色时,团队的考虑比公司的选择更重要。在选择工作行业时,也可以这么说。
简单来说,石油公司和医疗中心的图像分类机器学习项目之间的差异只是用于训练 ML 模型的数据集及其应用的问题。ML 技能可以跨行业转移。
对工作机会感到兴奋,并考虑长期目标。
卢克·斯塔克波尔在 Unsplash 上拍摄的照片
人类是受到内部和外部因素激励的生物,当两者都缺乏时,我们就会开始后悔、担忧,在某些情况下,会进入抑郁状态。
安德鲁直截了当地说:
在找一份你不会厌倦的工作。
我真的很喜欢安德鲁关于为什么过早扮演一个角色不一定是最好的主意的演讲。
利用他学生的个人轶事和经验,使他所有的观点和关注非常相关。
在我找工作的时候,我拒绝了几份看起来不错的工作,但是需要一定程度的个人牺牲,这是我不愿意接受的。
此外,我拒绝的一些角色可能在短期内听起来很棒,但看看我在未来十年的职业生涯中想要达到的目标,它们并不是最佳选择。
我渴望成为一家成功公司的人工智能领导者,这要求我比平常更快地投身其中。因此,在一个大团队中,我的知名度很低,没有明显的影响,对我来说不是最好的选择。然而,在一家为我提供自主权和学习环境的初创公司工作(更像是)意味着我的职业发展和成长会加快。
一般来说,选择一个最适合你个人目标和长期发展的角色。
机器学习生涯的错误导航方式
做一个万事通
人工智能是一个不一定值得成为“万金油”的领域,这意味着在人工智能的所有子领域都拥有浅薄的知识并不是确保你在人工智能或机器学习领域拥有长期成功职业生涯的最佳方法。
从长远来看,注意获得深入的知识是有回报的,尤其是在像人工智能这样的领域,规范往往是首选。
没有耐心
我为没有耐心而感到内疚,但老实说,在机器学习这样一个快速发展的领域,你几乎会觉得自己吸收信息的速度不够快。
但是,通过对拥有长期成功职业生涯的个人进行更深入的观察,我意识到,在任何人工智能子领域中建立真正的技能、专长和知识都需要时间。
也就是说,我们这一代人习惯于即时满足,获取知识的速度也是我们渴望看到快速、切实结果的受害者。
没有真正的实质性项目
在整篇文章中,拥有一个辅助项目的要求被认为对你的机器学习生涯有很多好处。兼职项目的问题在于,它们必须足够强大,以展示打动外部评审所需的技能水平。能够创建具有这种影响力的附带项目需要大量的努力和时间。
因此,拥有 10 个平庸的副业项目并不比完成 2-3 个真正有影响力的项目更好,并能很好地展示你的技术能力。
安德鲁认为,在这件事上,质量胜于数量。
结论
Andrew 的讲座以关注有助于个人在机器学习领域获得成功和长期职业生涯的关键要素而结束;它们是:
- 确保在促进学习的环境中工作
- 确保你正在以一种积极的方式从事对他人的生活有意义的项目和任务。一般而言,在提高他人生活质量的领域内开展业务。
- 做出有助于你个人目标的决定,这将为你的长期成功奠定基础。
我在看讲座和写这篇文章中学到了很多,我希望你能从这篇文章中得到一两个可操作的项目。如果你有任何其他的提示和建议想分享,那么我邀请你使用评论区。
[## 根据吴恩达(斯坦福深度学习讲座),你应该如何阅读研究论文
关于如何通过知名人士发表的研究论文获取知识的指导。
towardsdatascience.com](/how-you-should-read-research-papers-according-to-andrew-ng-stanford-deep-learning-lectures-98ecbd3ccfb3) [## AlexNet 给深度学习世界带来了什么
花一分钟来了解琐碎的技术和神经网络架构,革命性的如何深入…
towardsdatascience.com](/what-alexnet-brought-to-the-world-of-deep-learning-46c7974b46fc)
我希望这篇文章对你有用。
要联系我或找到更多类似本文的内容,请执行以下操作:
- 订阅我的 YouTube 频道 了解即将推出的视频内容
- 跟着我上 中
- 在 LinkedIn 上连接并联系我
如何中和量子安全威胁
随着量子计算的加速,我们可能会面临对当今安全协议的巨大威胁。为了找到解决办法,我们需要迅速行动。
如果我们想免受量子计算机的攻击,我们需要快速行动。在 Unsplash 上拍摄的 ThisisEngineering RAEng
一种新型计算机有可能打破当今的安全协议,不管它有多复杂。量子计算机正处于成熟的边缘,它们非常强大,可以在几分钟内解决复杂的数学问题,而传统计算机需要几千年才能解决。
解决这些问题有助于在人类努力的每个领域取得巨大进步,从揭开宇宙的奥秘到改进金融工具到在癌症研究中找到突破。不幸的是,它们也是今天的加密方法所依赖的那种问题。如果量子计算机能够解决这些问题,它们也可以侵入互联网上的任何账户。
专家们一致认为,量子计算达到这一点还需要几年时间,甚至可能超过十年。这些新机器将需要能够部署数百万个量子位来破解今天的密码。在这种情况下,谷歌最近在 2019 年末建造的具有 53 个量子位的量子计算机听起来微不足道。
谷歌机器的量子体积为 32,量子体积是衡量量子计算能力的指标。到 2020 年 6 月,霍尼韦尔宣布已经将他们自己机器中的量子容量增加了一倍,达到 64。两个月后, IBM 也达到了那个里程碑。
有了这些进步的迹象,专家预计量子用例,如医学、金融或其他领域的研究模拟,最早将于 2022 年出现。成熟的应用程序应该在 2026 年投入使用,量子计算的商业应用应该在 2030 年普及。
这些预测还意味着,到这个十年结束时,我们今天使用的几乎任何加密技术都可能是无用的。在最糟糕的情况下,一个不负责任的量子计算先锋可能会闯入政府、企业或全球组织的系统,造成严重破坏。
在这种情况下,人们生活所依赖的 IT 系统,如电力网络、医院资源、物流供应链和许多其他系统可能会在几秒钟内停机。尽管这样的未来仍需数年才能实现,但我们必须现在就开始努力,防止这一威胁成为现实。我们需要考虑建立比量子计算机更聪明的加密技术,这样我们就可以获得这些机器的好处,而不会让它们危及我们的安全。
在技术成熟的边缘,初创公司正在将量子计算推向下一个阶段。但这是一场革命还是泡沫?
towardsdatascience.com](/will-we-see-a-quantum-computing-revolution-a16b6d677308)
当今的安全协议
自达芬奇密码时代以来,加密的基本原理就没有改变过:在算法的帮助下,一条信息被转换成胡言乱语。当消息到达它的目的地时,它通过反向使用相同的算法被解密。
例如,我可以通过将字母表中的每个字母向后移动四位,并转换大写和小写来加密短语“达芬奇密码”。由此产生的乱码将是“高清 zMRGM GSHI。”为了确保接收者理解消息,我需要告诉他们解密密钥是什么:再次转换大写和小写,并将字母表中的每个字母上移四位。
当然,这是一把非常简单的钥匙,一个 10 岁的孩子只要有足够的雄心就能打开它。今天的 IT 系统使用复杂得多的数学公式。这些密钥以位的形式存储,就像传统计算机上的任何东西一样。有了这些复杂的公式,即使是今天的超级计算机——已经比今天的量子计算机慢了数万倍——也无法破解你在手机上发送的无聊短信。更重要的是,他们无法破解你的银行账户和其他所有可能存储敏感数据的地方的密码。
使用量子计算机,今天的加密密钥可以更快地被破解。 LinkedIn 销售导航员在 Unsplash 上的照片
量子威胁
如果你想破解私钥,你需要尝试每一种可能的位组合。由于每一位都可以取两个值,要么是 0,要么是 1,所以一个比另一个长一位的键将有两倍多的可能值。因此,有了一把多一点的钥匙,你将需要两倍的时间来尝试所有的可能性,直到你找到正确的。
Grover 的算法是量子密码术的重要元素,它预测量子计算机破解私钥的时间将是经典计算机的一半。但这意味着反应很直接。只要将所有私钥的长度增加一倍,您就恢复了旧的安全级别。
真正的问题是,您可以使用公钥从数学上计算私钥。公钥是公开的。对于经典计算机来说,如果公钥很长,例如 2048 位,执行这种计算就非常困难。但是未来的量子计算机可以在几个小时内从公共密钥中获得私人密钥。肖尔的算法提供了一个可能的途径,原因很简单,量子计算能力如此强大。
想象一下,如果一个外国特工计算出美国政府系统的密钥,会发生什么。使这个问题变得更糟的是,今天的 IT 系统经常依赖于共享架构。因此,当黑客侵入一个系统时,他们可能会进入更多的系统。
在亚原子水平上,我们所知道的关于经典物理学的每一件事都破裂了,不仅仅是小幅度的破裂,而是大规模的破裂…
towardsdatascience.com](/quantum-computing-explained-a114999299ca)
迄今为止的反应
美国政府意识到了量子计算对密码学造成的威胁。2018 年,白宫发布了量子信息技术的国家战略,其中包括关于量子安全的目标。国会随后通过了国家量子倡议法案,该法案要求总统也要了解该领域的发展。此外,该法案让国家标准与技术研究所(NIST)负责检查量子开发,特别是量子网络安全。
NIST 认真对待自己的角色:到 2022 年,它的目标是为后量子密码术发布一套新的标准。这些标准将包括甚至量子计算机都无法破解的算法。幸运的是,我们已经知道许多不同的可能有效的方法。来自不同公司的研究人员,如 IBM 、微软和谷歌,已经提交了他们的算法,现在正在审查中。一旦这套标准公之于众,量子安全密码术将需要包含在网络浏览器、应用程序以及企业和政府部门的所有 IT 系统中。
这一发展听起来好像美国正在为量子计算时代的到来做准备。但是这种反应越早越好:在医疗保健、卫星、运输和工业控制等领域,IT 系统的寿命可以持续几十年。在最后一刻更新这些系统以实现后量子安全既昂贵又危险。这就是为什么在量子计算到来之前准备好这些标准是至关重要的。
我们需要在开发量子安全加密技术上有所创新。照片由克里斯蒂娜@ wocintechchat.com在 Unsplash 上拍摄
政府仍然需要做什么
向总统和其他政府官员提供量子安全方面的建议,让 NIST 负责安全协议,无疑是迈向安全未来的极其重要的步骤,但我们不能止步于此。与人工智能一样,成立全球委员会监督技术的发展,并制定一系列指导进一步发展的原则,将是一项重要举措。这一战略还将加强国际合作,并激励所有参与者不要利用未来的安全漏洞。
正如世界经济论坛建议的那样,我们还需要在政府官员中建立所谓的量子素养。这种培训会让他们减少对持续建议的依赖,并让他们更快地做出根本性的决定。然而,这一指导方针不仅仅适用于政府。企业领导人也应该精通量子技术。
最后,像 NIST 那样建立一套标准是不够的。即使政府和企业领导人意识到了这一威胁,他们也可能很晚才采用后量子加密,甚至可能为时已晚,因为这在他们的优先事项列表中还不够高。因此,我们需要考虑为早期采用新的安全协议设置激励措施,例如通过税收优惠或美国政府的特别拨款。
企业需要做什么
对于企业来说,除了培训领导和采用安全协议之外,还有一些重要的准备步骤。企业应该致力于让他们的整个基础设施和他们的产品加密敏捷,也就是说,一旦新的安全协议可用,就能够采用它们。
实现这一点的一个方法是使用一个证书管理平台,提醒用户证书即将到期,并帮助实施新的证书。记录你的努力将有助于你和你的员工了解你在后量子安全的学习曲线上的位置。此外,您应该检查任何合作企业是否也保持最新的安全性。
如果你的软件有很长的生命周期,投资量子安全的硬件安全模块也是值得的。这些模块是特殊的硬件部件,即使在面临量子攻击时,也能保证加密密钥的安全。一些已经可以从像 Ultimaco 和 ISARA 这样的公司买到。
此外,公司应该接受 SSL 永远在线的原则,即使没有量子威胁。这意味着,除了别的以外,员工只能访问 HTTPS 的网站,并确保你的通信更难被破解。这一过程最终不会防止量子威胁,但它会让量子计算机更难拦截你的连接。
最后,确保您定期测试您的安全策略,并在必要时进行调整。这包括在白帽黑客试图闯入的虚拟环境中定期测试您的 IT 系统。这在短期内可能看起来昂贵且不必要,但它是值得的,因为可以提前发现并修复安全风险。
了解量子计算,它背后的物理和数学,基本量子电路的基础,以及更多…
towardsdatascience.com](/the-ultimate-beginners-guide-to-quantum-computing-and-its-applications-5b43c8fbcd8f)
不要惊慌,做好准备
和大多数最坏的情况一样,量子安全末日并不是所有情况中最有可能发生的。美国政府在后量子安全领域投入巨资,顶级科技公司参与新协议的开发,这一事实令人欣慰。尽管如此,你不应该假装威胁对你来说不存在。
根据 TechRepublic 的调查,71%的全球组织将量子计算视为主要威胁,95%的组织表示他们正在讨论至少一种策略来保护自己免受危险。超过一半的组织,确切地说是 56 %,已经开始投资后量子加密技术。
他们这样做是对的。即使破解密码的量子计算机还有几年的时间,如果我们现在不采取行动,其影响可能是相当灾难性的。
本文原载于 内置 。
如何不部署 Keras/TensorFlow 模型
以及如何使用模型服务器来实现智能化
火箭发射失败—www.pikist.com
虽然大多数关于深度学习的文章都集中在建模部分,但关于如何将这种模型部署到生产中的文章也很少。他们中的一些人说“生产”,但是他们经常简单地使用未优化的模型并将其嵌入 Flask web 服务器。在这篇文章中,我将解释为什么使用这种方法不能很好地扩展并且浪费资源。
“生产”方法
如果您搜索如何将 TensorFlow、Keras 或 Pytorch 模型部署到生产中,有很多好的教程,但有时您会遇到非常简单的例子,声称生产就绪。这些例子经常使用原始的 keras 模型,一个 Flask web 服务器,并将其封装到 docker 容器中。这些例子使用 Python 进行预测。这些“生产”Flask 服务器的代码如下所示:
from flask import Flask, jsonify, request
from tensorflow import keras
app = Flask(__name__)
model = keras.models.load_model("model.h5")
@app.route("/", methods=["POST"])
def index():
data = request.json
prediction = model.predict(preprocess(data))
return jsonify({"prediction": str(prediction)})
此外,他们经常展示如何封装 Flask 服务器,并将其与您的模型捆绑到 docker 中。这些方法还声称,它们可以通过增加 docker 实例的数量来轻松扩展。
现在让我们回顾一下这里发生了什么,以及为什么它不是“生产”级的。
没有优化模型
首先,通常模型按原样使用,这意味着示例中的 Keras 模型只是由 model.save()导出。该模型包括所有参数和梯度,这些参数和梯度是训练该模型所必需的,但不是推断所必需的。此外,该模型既不修剪也不量化。因此,使用未经优化的模型会有更高的延迟,需要更多的计算,并且文件也更大。
B5 Efficientnet 示例:
- h5 keras 型号:454 兆字节
- 优化的张量流模型(无量化):222 兆字节
使用 Flask 和 Python API
下一个问题是使用普通 Python 和 Flask 来加载模型和提供预测。这里有很多问题。
首先让我们看看您能做的最坏的事情:为每个请求加载模型。在上面的代码示例中,当调用脚本时使用模型,但是在其他教程中,他们将这一部分移到了预测函数中。这就是每次你做预测的时候都要加载模型。请不要这样做。(这里的比较不能与那种方法相比)
话虽如此,我们还是来看看 Flask。Flask 包含一个强大且易于使用的 web 服务器用于开发。在官方网站上,你可以读到以下内容:
虽然轻量级且易于使用, Flask 的内置服务器不适合生产,因为它没有很好的扩展性。
也就是说,你可以在谷歌应用引擎中使用 Flask 作为 WSGI 应用。然而,许多教程并没有使用 Google App Engine 或 NGIX,他们只是照原样使用它,并将其放入 docker 容器中。但是,即使他们使用 NGIX 或任何其他 web 服务器,他们通常也会完全关闭多线程。
让我们更深入地研究一下这个问题。如果您使用 TensorFlow,它会为您处理计算资源(CPU、GPU)。如果加载模型并调用 predict,TensorFlow 将使用计算资源来进行这些预测。发生这种情况时,资源正在使用中,也就是被锁定。当您的 web 服务器当时只服务于一个请求时,您就没事了,因为模型是在这个线程中加载的,predict 是从这个线程中调用的。但是一旦您同时允许多个请求,您的 web 服务器就会停止工作,因为您无法从不同的线程访问 TensorFlow 模型。也就是说,在这个设置中,您不能一次处理多个请求。听起来不像是可扩展的,对吧?
示例:
- Flask 开发 web 服务器:1 个并发请求
- TensorFlowX 模型服务器:并行度可配置
用 docker 扩展“低负载”实例
好吧,web 服务器不能扩展,但是扩展 web 服务器的数量呢?在很多例子中,这种方法解决了单个实例的伸缩问题。没什么好说的,它确实有效。但是以这种方式扩展会浪费金钱、资源和能源。这就像有一辆卡车,放入一个包裹,一旦有更多的包裹,你会得到另一辆卡车,而不是更聪明地使用现有的卡车。
延迟示例:
- 长颈瓶服务如上所示:每张图片约 2 秒
- Tensorflow 模型服务器(无批处理,无 GPU):每个图像约 250 毫秒
- Tensorflow 模型服务器(无批处理,GPU):每个图像约 100 毫秒
不使用 GPU/TPU
GPU 使深度学习成为可能,因为它们可以大规模并行进行操作。当使用 docker 容器将深度学习模型部署到生产中时,大多数例子都没有利用 GPU,他们甚至没有使用 GPU 实例。每个请求的预测时间在 CPU 机器上要慢得多,所以延迟是一个大问题。即使使用强大的 CPU 实例,您也无法获得与小型 GPU 实例相当的结果。
只是一个旁注:一般来说,如果主机安装了正确的驱动程序,在 docker 中使用 GPU 是可能的。Docker 完全可以放大实例,但是要放大正确的实例。
成本示例:
- 2 个 CPU 实例(16 核,32gb,1.4x 大):0,816 美元/小时
- 1 个 GPU 实例(32G 内存,4 个内核,Tesla M60,g3s . xlarge):0.75 美元/小时
已经解决了
如您所见,加载训练好的模型并将其放入 Flask docker 容器并不是一个优雅的解决方案。如果你想在生产中进行深度学习,从模型开始,然后考虑服务器,最后考虑扩展实例。
优化模型
不幸的是,优化推理模型并不像它应该的那样简单。但是,它可以轻松地以倍数减少推理时间,所以毫无疑问是值得的。第一步是冻结重量,去除所有的训练开销。这可以通过 TensorFlow 直接实现,但如果您来自 Keras 模型,则需要将您的模型转换为估计量或 Tensorflow 图(保存的模型格式)。TensorFlow 本身对此有一个教程。为了进一步优化,下一步是应用模型修剪和量化,其中不重要的权重被移除,模型大小被减小。
使用模型服务器
当你有一个优化的模型时,你可以查看不同的模型服务器,这意味着生产中的深度学习模型。对于 TensorFlow 和 Keras,TensorFlowX 提供了 tensorflow 模型服务器。还有其他像 TensorRT,Clipper,MLFlow,DeepDetect。
TensorFlow 模型服务器提供了几个特性。同时为多个型号提供服务,同时将开销降至最低。它允许您对模型进行版本化,在部署新版本时无需停机,同时仍然能够使用旧版本。除了 gRPC API 之外,它还有一个可选的 REST API 端点。吞吐量比使用 Flask API 高很多,因为它是用 C++编写的,并且使用多线程。此外,您甚至可以启用批处理,在这种情况下,对于非常高的负载设置,服务器会将多个单个预测批处理为一批。最后,您可以将它放入 docker 容器中,并进一步扩展。
提示:tensorflow_model_server 在每个 AWS-EC2 深度学习 AMI 映像上都有,有了 TensorFlow 2 就叫 tensorflow2_model_server。
使用 GPU 实例
最后,我建议在推理环境中使用 GPU 或 TPU。这种加速器的延迟和吞吐量要高得多,同时节省了能源和资金。请注意,只有当您的软件栈能够利用 GPU(优化模型+模型服务器)的能力时,它才会被利用。在 AWS 中,您可以查看弹性推理或只使用 Tesla M60 (g3s.xlarge)的 GPU 实例。
最初发布于 digital-thnking.de
如何不预测和防止客户流失
学习生存分析技术,预测客户是否以及何时可能流失,以及预期的潜在损失
奥斯汀·凯梅尔在 Unsplash 上的照片
顾客是任何企业的面包和黄油。无论是 B2B 商业模式还是 B2C,每个公司都在努力争取一个流失最小的粘性客户群,以确保持续的、经常性的收入流。
但是,如何确定确保客户长寿的具体客户特征呢?如何识别“风险”客户,即那些可能流失的客户?给定客户流失的概率,我们什么时候能期待他流失?更重要的是,我们能在“风险”客户身上投资多少来留住他们?
如果一个企业对最大限度地减少客户流失感兴趣,这些都是理想情况下应该回答的问题。我会尽力帮你找到这些问题的答案。
分析非合同环境(如零售)中的客户流失是一项重要的工作,因为这里无法对流失进行单独定义。到目前为止已经购买了 X 次的顾客可以再次购买,也可以永远不再购买。已经提出了各种方法来解决这个问题,包括异常检测和寿命价值(LTV)分析。我曾在的另一篇文章中以非合同的形式报道过 LTV 分析。
然而,合同或基于订阅的模型更容易分析,因为在这些场景中,客户流失是在给定时间点的二元分类问题。如果一个客户不更新他的订阅,那么他毫无疑问已经发生了变化。对此不可能有两种选择:要么客户是活跃的,要么客户已经变得活跃。在本帖中,我们将介绍适用于订阅模式的客户流失分析。
传统的客户流失建模方法利用逻辑回归、随机森林或梯度下降推进来分析和预测客户流失。但是,我们将利用生存分析技术来获得与客户流失相关的更多信息。这将有助于我们回答本文开头提出的进一步的问题。
但是什么是生存分析呢?
生存分析是统计分析的一个分支,它解决诸如“特定事件发生前多久”的问题,即,它是一个“事件发生时间”模型(与事件发生的概率相比)。传统上,生存分析大量用于医学和生命科学领域,以确定个体或其他生物有机体的预期寿命。
生存分析适用于我们可以定义的情况:
- “诞生”事件:对我们来说,这将是客户与公司签订合同
- “死亡”事件:对我们来说,“死亡”发生在客户不再续订时
虽然逻辑回归和决策树适用于二元分类问题(客户是否会流失?),生存分析不止于此来回答客户什么时候会流失。如果我们不希望客户马上流失,这并不意味着他永远不会流失。如果不是现在,他以后很有可能会流失。在这种情况下,生存分析可以通过预测他们在未来不同时间点的生存(或流失)来揭示这些“被审查”的客户。
这种处理数据“审查”的能力使生存分析成为优于其他回归和基于树的模型的技术。
经过检查的数据
在传统意义上,审查是指在观察期内失去对个人的跟踪,或者在此期间没有观察到感兴趣的事件。这些数据被“审查”,因为每个人都会在未来某个时间点死亡或离开/取消订阅;我们只是错过了那个信息。仅仅因为我们没有观察到他们取消联系或订阅并不意味着他们永远不会。我们不能等到他们取消订阅才开始分析。这就是所谓的权利审查。
其他类型的审查包括左审查和间隔审查。前者是指我们不知道一个人何时成为我们的客户,因为他的“出生”事件发生在我们的观察时间段之前。相比之下,间隔-审查发生在数据以特定的时间间隔收集,不构成一个连续的观察期。因此,一些生命/死亡事件可能会在数据中被遗漏。
术语
- 事件时间:感兴趣的事件发生的时间——在我们的例子中是订购的流失或不续订
- 起始时间:客户开始服务/订阅的时间
- 事件发生时间:事件发生时间和起源时间之差
- 生存函数:这给出了我们感兴趣的事件在时间
t
之前没有发生的概率。换句话说,它为我们提供了事件发生时间值大于t
的人口比例 - 危险函数:这给出了我们感兴趣的事件在特定时间发生的概率。生存函数可以从风险函数中导出,反之亦然
- 风险比是我们感兴趣的事件在两个不同协变量组(如已婚或未婚)中发生的概率比。例如,风险比为 1.10 意味着协变量的存在会使风险事件的概率增加 10%
- 协变量是指生存分析中的预测因子、变量或特征
生存分析技术被设计成通过两个主要的数据点来识别生存函数:持续时间或事件发生的时间,以及一个二元标志,即对于每个观察,我们感兴趣的事件是否已经发生。生存分析并不真正关心事件发生的时间或起源的时间。相反,事件信息的时间是最重要的。
生存分析和信用风险分析
已经进行了几项研究来确定生存分析是否也可以预测客户违约的概率和预期时间。但是,相对于传统的逻辑回归方法,没有观察到显著的改善。此外,银行监管机构和巴塞尔协议要求一种易于理解和解释的信贷决策方法,这一事实使得逻辑回归在这些情况下成为更好的选择。
生存/风险函数估计
我们将涵盖两个最完善的,有文件证明的,实践中的模型,通过观察到的数据来估计生存和风险函数。
卡普兰-迈耶生存分析
虽然我们没有人口的真实生存曲线,但我们可以通过一种称为 Kaplan-Meier 估计量的强大的非参数方法,根据观察到的数据来估计人口的生存函数。KM 存活曲线在 x 轴上绘制时间,在 y 轴上绘制估计的存活概率。
KM 生存分析只需要两个输入来预测生存曲线:事件(搅动/非搅动)和事件发生时间。请注意,KM 没有使用其他特征或预测因子来评估生存函数。
考克斯比例风险(CPH)模型
在现实生活中,除了事件和持续时间数据,我们还有人口中个体的各种其他协变量(特征或预测因素)。很有可能这些额外的协变量也会影响我们感兴趣的事件在未来特定时间点不发生的概率(称为生存概率)。例如,在电信环境中,这些附加特征可以包括性别、年龄、家庭规模、月费等。CPH 模型既可以处理分类协变量,也可以处理连续协变量。
CPH 模型决定了协变量的单位变化对观测值生存概率的影响。CPH 是一个半参数模型,由两部分组成:
- 基线风险函数是模型的非参数部分。回想一下,危险函数显示了未来某一事件发生的风险或概率。基线风险函数在协变量的“基线”水平(通常是平均值)估计这种风险,通常类似于 KM 曲线
- 协变量与基线风险函数的关系,是模型的参数部分。这种关系表现为一个不随时间变化的因素(或系数),直接影响基线危害。
半参数模型的真正本质在于它允许我们拥有两个世界的最佳部分:一个可解释和可操作的模型(参数部分),同时仍然提供真实生活数据的公平表示,而不做任何与其函数形式相关的假设(非参数部分)。
然而,CPH 模型有一个很强的假设,叫做比例风险假设。这一假设表明,协变量的相关风险可能会随着时间的推移而变化,但风险比率会随着时间的推移保持不变。考虑一下二元协变量:已婚个体死亡的风险可能会随着时间而改变。但是下面两者的比率被假定为随时间保持不变:
- 已婚个体在时间
t
死亡的风险 - 未婚个体死亡的风险
t
我们将在本帖后面的实际例子中详细讨论这一假设,以及在实际应用中是否可以容忍任何偏差。
生存分析案例研究——客户维系
理论讲够了,现在让我们转向一个实际的案例研究,我们将利用电信客户数据集上的生存分析技术来预测特定客户何时会流失,以及我们能够支付多少费用来留住他们。
所有相关的生存分析技术都包含在 Python 可用的lifelines
包中。我们将使用电信客户的公开可用的数据集,除其他协变量外,该数据集还包含个人在公司的任期/持续时间信息,以及一个二进制标志,该标志表示在数据收集之日他是否有过不愉快经历:
我们最初的数据研究揭示了以下内容:
- 除了一个协变量之外,所有协变量都是
object
数据类型,这意味着我们需要对它们进行一次性编码 TotalCharges
属于object
数据类型,而不是float64
。原因似乎是一些用于特定观察的空白- 对于模型训练,唯一标识符(在本例中为
customerID
)通常会被删除。然而,我们在这里的最终目标也是确定和规划客户层面的策略,以减少我们当前未流失客户的流失。因此,我们将把活跃的和被审查的个人的customerID
&MonthlyCharges
划分到一个单独的数据框架中,以便以后在设计客户层面的策略时使用 - 连续变量的 KDE 图描绘了偏态分布
然后,我们将执行以下特征工程步骤,为生存分析准备数据:
- 用
MonthlyCharges
列的值替换TotalCharges
中的空格,并将其转换为数值数据类型。 - 分别用 1 和 0 替换目标
Churn
列的 Yes 和 No 值。 - 同样,对于其他特定功能,将“是”替换为 1,将“0”替换为其他值(例如,否,无互联网服务)。
- 创建剩余分类特征的虚拟变量。
注:对于每个虚拟变量,我们通常会删除其中一个编码特征,以消除多重共线性的风险。但是,我们将手动删除一个特定的虚拟变量,该变量通常代表我们的订户群体。当我们删除一个虚拟列时,该删除列的值会在基线危险函数中出现。手动控制应该删除哪个虚拟变量可以确保我们的基线风险函数代表典型的订户。其他一切都偏离了这个公认的基线,从而被业务直观地理解。因此,我们将去掉样本中出现频率最高的虚拟变量。
生命线中的 CPH 模型实施不适用于高度共线的协变量,因此让我们通过热点图来检查是否存在多重共线性:
由于上面的热图没有显示任何高的成对相关性,我们将继续我们的生存分析。
除了可视化和数据浏览之外,到目前为止执行的步骤的代码如下:
注意:我们很幸运,因为我们的数据已经有了一个持续时间或任期列。通常,您可能会遇到每个观察的开始和结束时间,而不是这些持续时间。lifelines
有一个方便的实用函数,可以将开始和结束日期转换成一个表示持续时间的 NumPy 浮点数组和一个事件观察的布尔数组:[datetimes_to_durations](https://lifelines.readthedocs.io/en/latest/lifelines.utils.html#lifelines.utils.datetimes_to_durations)
KM 曲线
我们将通过首先绘制样本的 KM 曲线来开始我们的生存分析,该曲线向我们显示了在特定时间点平均客户的历史生存概率。请记住,协变量的存在对 KM 曲线没有影响,因为它只与持续时间和事件标志有关。通常,在实践中,在通过 CPH 模型进行更深入的分析之前,首先会查看 KM 曲线以了解我们的数据。
我们针对所有客户的第一条 KM 曲线,置信区间为 5%,如下所示:
以上应该让我们对客户有了一些基本的直觉。正如我们对电信业务的预期,客户流失率相对较低。即使过了 72 个月(我们数据中的最大期限),公司也能留住 60%或更多的客户。
图底部的行显示了一些要解释如下的附加信息:
- 有风险:观察到的期限超过该时间点的客户数量。例如,532 名客户的租期超过 70 个月
- 已审查:任期等于或小于该时间点且未被搅动的客户数量。例如,3,860 名客户的租期为 60 个月或更短,但他们当时并未流失
- 事件:任期等于或小于该时间点的客户数量,该时间点之前已经发生了变动。例如,1,681 名客户的租期为 50 个月或更短,到那时已经流失了
在这一点上,我们不知道我们的哪些协变量对我们客户的生存机会有实质性的影响(CPH 模型将在这方面帮助我们)。然而,凭直觉我们知道,更长的定期合同会影响客户的生存概率。为了检验这种潜在影响,我们将为合同列的每个唯一值绘制 KM 曲线:
我们这里有本质上不同的生存曲线,如预期的那样,月合同客户的生存概率随时间急剧下降。即使在三年后(准确地说是 40 个月):
- 2 年合同的客户几乎有 100%的生存概率
- 一年期合同的客户有超过 95%的生存概率
- 月合同的客户只有大约 45%的生存概率
CPH 模型
现在更有趣的事情来了,我们将分析数据中生存曲线和其他协变量之间的相互作用。拟合 CPH 模型就像 scikit-learn 中的任何其他 ML 模型一样。下面的模型摘要是通过模型的print_summary
方法访问的:
上面的模型总结列出了 CPH 模型分析的所有一次性编码协变量。让我们看看这里提供的关键信息:
- 模型系数(
coef
列)告诉我们每个协变量如何影响风险。协变量的正coef
表明具有该特征的客户更有可能流失,反之亦然 exp(coef)
是危害比,解释为变量每增加一个单位的危害风险的标度,1.00 为中性。例如,StreamingMovies
的 1.332 风险比意味着订阅了流媒体电影服务的客户取消服务的可能性增加了 33.2%。从我们的角度来看,exp(coef)
低于 1.0 是好的,这意味着客户在有协变量的情况下不太可能取消订单- 模型一致性 0.929 的解释类似于逻辑回归的 AUROC:
— 0.5 是随机预测的预期结果
—越接近 1.0 越好,1.0 显示出完美的预测一致性。
因此,我们的模型的 0.929 的一致性是一个非常好的一个!
但是什么是和谐指数呢?
0.929 的一致性基本上意味着我们的模型在未经审查的数据的 100 对中正确预测了 92.9 对**。它基本上评估了模型的区分能力,即它在区分活着的和被搅动的受试者方面有多好。比较两种不同的模型是有用的。然而,concordance 并没有说我们的模型校准得有多好——这是我们稍后将评估的内容。**
这里的一对指的是我们数据中所有可能的客户对。考虑一个例子,其中我们有五个未经审查的客户:A、B、C、D & E。从这五个客户中,我们可以有总共十个可能的对:(A、B)、(A、C)、(A、D)、(A、E)、(B、C)、(B、D)、(B、E)、(C、D)、(C、E)和(D、E)。如果 E 被删截,则一致性指数计算将排除与 E 相关的对,并将考虑分母中剩余的八对。
确认比例危险(PH)假设
回想一下上面解释的 CPH 模型的比例风险假设。PH 值假设可以使用基于缩放舍恩菲尔德残差的统计测试和图形诊断进行检查。该假设由残差和时间之间的非显著关系(例如,p > 0.05)支持,并由显著关系(例如,p < 0.05)反驳。
我不会深入许多技术细节,而是只关注实际应用。可以通过lifelines
’check_assumptions
方法在拟合的 CPH 模型上检查 PH 假设。执行此方法将返回不满足 PH 假设的协变量的名称、关于如何潜在地纠正 PH 违反的一些通用建议,以及对于违反 PH 假设的每个变量,缩放的舍恩菲尔德残差相对于时间变换的可视化图(一条扁平线确认 PH 假设)。更多详情请参考本。
在检查我们模型的 PH 假设时,我们发现 3 个协变量不符合它。然而,就项目的目的而言,我们将忽略这些警告,因为我们的最终目标是生存预测,而不是确定推断或相关性来理解协变量对生存持续时间和结果的影响。关于我们为什么可以安全地忽略这些偏差的更多细节,请参考和。
CPH 模型验证
lifelines
library 有一个内置函数,可以对我们拟合的模型进行 k 重交叉验证。使用和谐指数作为评分参数运行它,结果在十个折叠中平均和谐指数为 0.928。
和谐指数没有说任何关于模型校准的事情,例如,预测的概率与实际的真实概率有多远?我们可以绘制一条校准曲线来检查我们的模型在任何给定时间正确预测概率的倾向。现在让我们使用sklearn
的calibration_curve
函数绘制 t = 12 时的校准曲线:
考虑到我们的数据在被搅动和未被搅动的客户之间的偏斜分布,我们将calibration_curve
的strategy
参数设置为‘quantile’
。这将确保基于第 12 个月的预测流失概率,每个箱将具有相同数量的样本。这是可取的,否则,我们将有等宽的仓,这在搅动的/未搅动的客户之间不平衡的类别分布下是不具有代表性的。
上述校准图表明,对于绘制的前七个十分位数,我们的 CPH 模型低估了流失风险,而对于后两个十分位数,我们的模型高估了流失风险。
总的来说,校准曲线看起来不算太差。让我们通过计算 Brier 分数来确认一下,我们发现它是 0.17 (0 是一个理想的 Brier 分数),一点也不差!
我们还可以绘制每个月的 Brier 分数,如下所示:
我们可以看到,我们的模型在 5 到 20 个月之间进行了合理的校准,然后随着我们开始预测更远的时间而恶化。
CPH 模型可视化
现在让我们将 CPH 模型中分析的所有协变量的系数和风险比可视化:
通过该图,我们可以快速识别对预测客户流失至关重要的特定客户特征。
可能导致流失的协变量:
- 流媒体电视和电影订阅
- 多条电话线
- 设备保护订阅
- 独居的人
- 邮寄支票付款
可能有助于留住客户的协变量:
- 有 1 年或 2 年的合同期限(非常明显)
- 自动支付方式
- 没有网络和电话服务
- DSL 互联网服务
现在让我们绘制并想象在特定水平下改变生存曲线上的协变量以及基线生存曲线的效果:
很明显,总支出接近零的客户比总支出接近 3000 英镑或更多的客户更有风险(他们的生存曲线急剧下降)。此外,拥有长期合同提高了客户的生存概率。
与 CPH 建模、验证和可视化相关的所有代码如下:
流失预测和预防
因此,现在我们知道我们可以关注哪些协变量来降低现有右删失客户的流失风险,即那些尚未流失的客户。让我们首先绘制出Contract
、PaymentMethod
、InternetService
和PhoneService
的分类 KM 曲线:
见解:
- 鼓励客户通过银行转账或信用卡设置自动支付
- 与客户签订 1 年或 2 年的合同是非常明确的
- 关于互联网服务,首先,我们应该分析拥有 DSL 或光纤互联网订阅的客户流失率相对较高的根本原因,可能是服务质量差、价格高、客户服务不足等。我们还应该对互联网服务进行盈利能力分析。最佳行动方案将取决于这一分析
- 有或没有电话服务的客户的生存曲线似乎没有太大的统计差异
分析被审查的客户
现在,我们将把我们的重点放在审查和仍然活着的客户,以确定未来的一个月,他们可能会与我们一起做些什么来增加他们的保留机会。
在对所有客户的数据进行过滤后,我们将使用[predict_survival_function](https://lifelines.readthedocs.io/en/latest/fitters/regression/CoxPHFitter.html#lifelines.fitters.coxph_fitter.SemiParametricPHFitter.predict_survival_function)
方法预测这些客户的未来生存曲线,给出他们各自的协变量。也就是说,估计我们客户的剩余寿命。
predict_survival_function
的输出将是一个矩阵,包含每个剩余客户在特定未来时间点的生存概率,直到我们数据中的最大历史持续时间。因此,如果我们数据中的最大持续时间是 70 个月,predict_survival_function
将预测从今天开始的未来 70 个月。该方法还允许我们通过times
参数计算未来特定月份的生存概率(有助于回答我们希望在未来 3 个月和 6 个月结束时保留多少客户等问题)。
两个特定客户的predict_survival_function
输出示例:
列 15 中的客户在从现在起的 73 个月后预期有 99.9%存活,而列 16 中的客户在仅 4 个月后预期有 74.4%存活的概率。
计算预期损失
我们可以使用这些生存概率来确定每个客户的生存可能性低于某个阈值的具体月份。根据用例,我们可以选择任何百分比,但是对于我们的项目,我们将通过median_survival_times
方法使用中间值。qth_survival_times
可用于任何其他百分位数。
median_survival_times
方法的输出是代表未来一个月的单行,在该月中,每个被审查/存活客户的存活概率低于中值存活概率:
inf
基本上意味着这个客户几乎肯定是活着的。
接下来,我们将执行以下操作:
- 将
median_survival_times
的转置输出与 CustomerID 和相应的 MonthlyCharges 连接起来(我们在最开始时将其放在一边)。这将使我们能够将我们的预测与每个特定客户及其每月费用联系起来 - 计算每个客户的预期损失,如果他们今天流失,用他们每月的费用乘以他们预期流失的月份
- 对于预期流失月份为
inf
的客户,将inf
替换为启发式的,可能是 24,对应于 2 年的合同。这将使我们能够估计这些客户的相关预期损失,如果他们今天离开我们,假设他们将与我们在一起至少 24 个月
我们的数据,按照预期损失的降序排列,现在看起来像这样:
我们现在已经确定了如果客户今天离开我们,会给我们带来最高货币风险的客户。
计算预计收入提升
我们能做什么来留住他们?来自我们的 CPH 模型和相关的知识管理生存曲线的系数表明我们需要关注什么特征来留住我们当前的客户。但是,现在让我们尝试估计一下,如果我们能够说服客户注册这些防止客户流失的特定功能(如果他们还没有订阅这些功能的话),将会带来多大的经济效益。
因此,如果我们能让一个没有以下内容的客户订阅/注册这些功能,我们将估计以下功能的潜在收入提升。
- 一年的合同
- 两年的合同
- 数字式用户线路
- 通过银行转账自动支付
- 通过信用卡自动支付
我们现在将通过假设情景下的嵌套for
循环计算上述每个协变量和每个客户的潜在提升。例如,如果他签订了一年的合同,而他没有签订一年的合同,我们可以计算修改后的预期流失月份。
我们最初的隆起分析得出如下结果:
现在,如果我们可以注册一个特定的功能,其他条件不变,我们就有了每个客户的预期流失月。例如,如果我们能让客户 7590-VHVEG 与我们签订一年的合同,在其他条件不变的情况下,我们可以期望他再与我们合作 11 个月。或者,如果他建立了自动支付系统,在其他条件不变的情况下,预计他会再呆 4 个月。
如前所述,我们有一些非常好的客户,他们的流失风险很低,表现为基准月份的inf
值。我们暂时不需要把我们的营销努力集中在他们身上。所以我们将它们排除在进一步的分析之外。
让我们更进一步,看看每个潜在升级对客户的财务影响超过预期的修改寿命,而不仅仅是预期的额外月份。这是一个简单的计算方法,我们将每个协变量的基线和修订流失月之间的差异乘以每月费用。
现在我们知道了客户 7590-VHVEG 的以下信息:
- 如果他签订一年期合同,在其他条件不变的情况下,他的预期寿命将增加 328.35 美元的收入
- 如果他签订了 2 年的合同,在其他条件不变的情况下,他的预期寿命将增加 925.35 美元的额外收入
- 如果他转换为自动支付方式之一,在预期寿命增加的情况下,他将获得 119.4 美元的额外收入其他条件不变
与流失预测和预防分析相关的所有代码如下:
结论
现在,我们不仅对哪些客户面临流失风险有了一些可操作的见解,而且对客户流失的预期时间和通过引入客户特定策略可能带来的收入增长也有了一些可操作的见解。
完整的 Jupyter 笔记本可以在 GitHub 这里找到。
一如既往,如果您想讨论任何与数据分析、机器学习、金融和信贷风险分析相关的问题,请随时联系 me 。
下次见,继续!