用 GgPlot2 预测足球比分
使用泊松帮助可视化足球正确的分数在 R
胡闹
在我之前的一篇帖子中,我提到一场足球比赛的比分可以用泊松分布来近似计算,但我没有过多地谈论这个话题。好吧,你今天很幸运…我们将看看这个主题,在这篇文章的最后,我们将有 Ggplot2 可视化说明一场足球比赛的可能比分,这真的很棒。
首先,讲一点泊松分布的根。这种概率分布的发现归功于十九世纪的法国数学家西蒙·丹尼斯·泊松。像他同时代的许多人一样,他主要研究它的理论。直到俄罗斯统计学家 Ladislaus Bortkiewicz 于 1898 年出版了他的书《大数定律》,泊松分布才在实践中得到广泛应用。
众所周知,Bortkiewicz 获得了普鲁士军队 20 年来的一组数据,记录了被马踢死的士兵人数。冷酷无情。
总之,他证明了这些死亡可以用泊松分布来近似,剩下的,正如他们所说的,都是历史了。
现在…一个人如何从普鲁士骑兵到足球比分?
愚弄你和我
让我们先来看看满足泊松过程的基本假设:
- 事件在给定时间间隔内发生的概率不随时间变化
- 事件随机发生
- 事件独立发生
现在把进球想象成足球比赛中的一个事件。如果我们有一个指标可以表达一支球队在 90 分钟内的得分率/强度,我们可以说第一个假设得到了满足。这很难定义,但谢天谢地,体育迷们(我应该补充一句,他们比我聪明一百倍)已经为此提出了预期目标 (xG)。今天谢谢你!
下一个问题-足球比赛中进球是随机出现的吗?也就是说,在一场比赛中是否有一个特定的时间点更容易进球?这个家伙说不,许多其他的文章和研究也表明进球确实在足球比赛中随机发生。在实践中,目标可能不像人们想象的那样随机,但是…我们有足够的证据证明它们是随机的,所以让我们打勾,现在继续。
现在是最后一个假设——目标是相互独立的。如果一支球队落后,球员们肯定会更加努力地回到比赛中去,以扳平比分。或者,如果一个队已经领先 5 个球,球员可能会因为自满而放松油门,让一个人进入。无论哪种方式,你都必须说目标不是彼此独立发生的,使用基本泊松过程来模拟足球比分在这里开始失效。
有一些技术可以调整比赛中的目标依赖性,但我们都有白天的工作——所以让我们把它留到另一天……现在同意三分之二并不坏(而且,我正在努力在 it 中生成有用的内容,所以我们在这里)。为了进一步阅读,我建议看看这篇精彩的博客文章,它基本上为足球做了一个 Bortkiewicz,表明你可以用泊松分布近似一个赛季的进球数。
蹄
在我之前关于 xG 的帖子中,我创建了一个简单的泊松模型来帮助预测 r 中一场足球比赛的结果(主场胜利、平局、客场胜利)。我们将在这里使用类似的东西,但更侧重于获得正确得分的概率作为输出。
r 已经从它的基础热图库中走了很长一段路,这些热图库还不太成熟。Ggplot2 是一个神奇的软件包,它允许构建各种图形和图表。为了使用它们,我们必须首先在 RStudio 中安装一些依赖项:
*install.packages('tidyr')
install.packages('dplyr')
install.packages('scales')
install.packages('ggplot2')library('tidyr')
library('dplyr')
library('scales')
library('ggplot2')*
酷,现在让我们回到我们最初的假设之一——在一场足球比赛中,球队在 90 分钟内有恒定的得分率。我们将使用取自 FiveThirtyEight 的模型的基于镜头的 xG,用于巴塞罗那和拜仁慕尼黑之间的冠军联赛四分之一决赛(哦,天哪……)。让我们构造并获取一个ScoreGrid
:
我们创建了一个 11 列 11 行的数据框,每个条目代表一个正确的分数。因此[ 行 i ,列 j 中的条目将是得分 i,j ,其中 i 为主场得分, j 为客场得分。因此,entry [ 1,2 ]将会是客场队以 2-1 获胜。给定homeXg
和awayXg
,dpois
有助于为每个分数 i 生成随机泊松概率。最后,我们将个人得分限制在 9 分,一旦我们达到 10 分,我们将把概率加在一起,并将它们分组为一个条目。这只会让事情变得更简单。
让我们快速旋转一下。在 RStudio 控制台中,键入
*ScoreGrid(1.7,1.1)*
你应该知道这个:
足球正确得分网格。作者图片
网格不错,但不太好看。
罗伯特·莱万戈尔斯基
让我们现在建立正确的分数视觉。我们将在 Ggplot2 中使用geom_tile()
,它会在最后生成一个漂亮的热图。代码如下:
Ggplot2 要求输入数据为tidy
数据帧,因此从基数 R data.frame
的转换发生在第 10 行的pivot_longer
处。接下来,我们需要将所有的vars
转换为factors
,并按照正确的顺序对等级进行排序(记住 10+ 是一个因子,使用as.numeric
只会使它变成一个NA
)。我们希望它是列表中的最后一级)。这在第 14 行用~forcats::fct_relevel
完成。除此之外的所有内容都只包含 Ggplot2 图的常见构件。
好了,我们开始吧。启动 R 控制台,输入团队名称和 xG 输入,无论您来自哪里:
*ScoreHeatMap("Barcelona", "Bayern_Munich", 1.2, 5.6, "FiveThirtyEight")*
巴塞罗那 vs 拜仁慕尼黑正确的比分可视化。作者图片
在这场比赛中,男人对男孩,只要看看可视化/热图,你就可以看到根据 xG,拜仁慕尼黑最有可能的比分是 5-1。事实上,拜仁实际上以 8 比 2 获胜。罗伯特·莱万戈尔斯基的确。
再举一个例子来说明一场势均力敌的比赛,昨晚巴黎圣日耳曼和拜仁慕尼黑之间的冠军联赛决赛:
*ScoreHeatMap("Paris_SG", "Bayern_Munich", 1.4,1.6,"FiveThirtyEight")*
巴黎圣日耳曼 vs 拜仁慕尼黑正确比分可视化。图片作者。
一场激烈得多的比赛,1-1 是最有可能的比分,拜仁慕尼黑实际上以 1-0 获胜。
稳定的模型
和往常一样,有几个警告,其中一个我们已经讨论过了——即目标不是相互独立的,所以这个模型值得重新审视。此外,如果这些 xG 机会中的任何一个有不同的结果(即射门击中门柱或偏出而不是进入),我们可能今天就不会在这里谈论这个问题 …让我们不要忘记 xG 本身是一个有缺陷的指标,它没有捕捉到一场足球比赛中的许多细微差别。
尽管如此,这些视觉效果很好地展示了一场比赛的结果——如果有什么不同的话,这是一次很好的使用一些令人印象深刻的 R 库进行图形和可视化的练习。
和往常一样,如果我想不通的话,你可以在我的 Github 仓库里找到所有这些。为今天干杯…
其他文章
使用 Python、R 和预期目标的英超联赛 2019/20 回顾
towardsdatascience.com](/did-liverpool-deserve-to-win-the-premier-league-eda7a4e1b9ca)
足球正确比分可视化 R 码
博客文章的存储库。在 GitHub 上创建一个帐户,为我们的 andy/blog-repo 开发做出贡献。
github.com](https://github.com/ourandy/blog-repo)*
公共政策中的地理空间机器学习
实践教程
预测费城的中产阶级化,为经济适用房政策提供信息
简介
在过去的八年里,费城的房地产市场已经从衰退中复苏,并准备加速复苏。与此同时,数以千计的贫困租户努力寻找和维护价格合理的住房。负担得起的住房倡议并非没有对新住房项目的布局提出批评,特别是在新开发项目集中在低收入地区的情况下。虽然有人可能会说,在这些地区建设经济适用房项目会让租户靠近他们现有的社区,但这也会让他们远离可能的经济增长和社会流动性。
中产阶级化是街区变化的主要来源,也是理解房价随时间变化的关键。为了吸引高收入居民,公共部门努力提供更高标准的生活设施和休闲。对中产阶级化地区的关注将资金从其他低收入地区抽走。然后,这些社区会经历投资减少或社区衰落的时期。随着城市中心的扩张和周围土地价值的增加,投资不足的地区开始为未来的中产阶级化周期做准备。这一过程在费城很明显,仅从 2008 年到 2016 年就损失了 13,000 个低成本单元,而增加了 6,000 个高端单元。
很明显,随着中产阶级化正反馈循环的继续,越来越多的人因为租房合同价格过高而被迫搬迁。这种效应通过收入阶层逐级传播,从而需要更多的经济适用房。
经济适用房项目是保持经济领域公平感的一个重要因素,这些项目的位置对这一空间的形成至关重要。在目前主要由低收入或无投资地区占据的地区进行开发,可以确保那些有需要的人能够获得租金控制的住房,这种住房对开发商来说相对便宜。此外,如果该地区要中产阶级化,租金价格保持不变,而与中产阶级化相关的便利设施和机会给该地区带来了经济机会。因此,中产阶级化的预测措施将很好地指导经济适用房的安置。
数据
费城有一个强大的开放数据平台,opendatahilly,有超过 350 个来自政府组织的公共数据集可供梳理。我选择的数据集主要是基于列举整个城市的便利设施,包括公园、学校、医院、高等教育和公共交通站。此外,我收集了犯罪点的位置数据,以代表潜在房主考虑的一个常见的不利因素。还收集了 2014 年至 2020 年每个地块(建筑)的市场估值。
和往常一样,这些数据并不完美。例如,如果有过去几年公交站点扩展的可访问日志,则该模型可以将公共交通使用的增加解释为远离中心城市的地区价格发生某些变化的原因。另一个例子是,学校质量和集水区数据不包括特许学校,特许学校是费城学校景观中不断增长的一部分,将导致更准确的学校质量数据表示。尽管如此,通过一些清理,合并这些数据集创建了丰富的空间和时间数据集以进行特征化。
收集和清理数据并非易事。以下是一些在特殊化之前进入项目的数据工程工作的例子:
- 我使用了东南宾夕法尼亚交通管理局(SEPTA) API 来提取整个城市的交通可达性。然而,API 只返回离给定的经纬度坐标最近的 50 个公交站点。为了创建一个横跨整个城市的点级公交站点数据集,我以网格方式迭代查询了整个城市的坐标,每个坐标之间的距离为 0.1 英里。这给了许多副本,但彻底涵盖了费城的所有过境站。我删除了重复的点,并将结果位置修剪到城市的边界。
- 属性评估数据集详细描述了目标时间段内的宗地值和内部特征,其中有几十行的值不一致。例如,在许多情况下,房间数是 0,而卧室数是 2。在此基础上,我删除了 num_rooms 和类似的不一致列。
- 我用从属性的描述性数据中提取的值替换了一些不一致的列。数据集中的每个住宅宗地都有一个描述,包括车库的存在和建筑物在描述性文本字段中的层数。使用正则表达式,我在数据集上提取了这些信息,添加了两列,分别表示车库的存在和房间的真实数量。
- 在地产评估数据集中,宗地值的分布呈明显的右尾分布:
费城包裹市场价值直方图【作者图片】
为了缩小预测范围,我剔除了估价高于 150 万美元的地块。估价为 1 美元或 0 美元的包裹也被移除。98.5%的宗地保留在数据集中以供考虑。
快速查看每个街区的平均市场估值,可以让我们很好地了解整个城市的分布情况:
每个街区的平均价格【图片由作者提供】
从图像上看,这里有一个高密度、高价格的城市核心区和低价格的郊区。费城西北部和东北部的郊区往往也有较高的值。费城南部和西南部的机场周围地区和工业区的值较低,而东侧的中心城市滨水区的平均值较高。
2014-2020 年每个街区的百分比变化【作者图片】
这种视觉化更深入地挖掘了城市核心周围明显的中产阶级化过程。就在高物价中心城市的北部和南部,是一些平均价值快速增长的街区。这个项目的目标是预测这个过程扩展的具体位置。
特色工程
特征分为静态或动态,以及外源性或内源性。
- 静态特征假定在给定的时间段内不会改变(例如:公园、医院和公交车站的位置)
- 动态特征每年都会发生变化(例如:犯罪事件、学校质量)
- 内生特征是每个地块的内部特征(例如:总宜居面积、卧室数量、浴室数量)
- 外源特征是地块的外部特征,由周围环境引起(例如:到不同设施的距离、平均社区价格)
考虑到这些分类,我构建了以下特征:
完整功能列表【图片由作者提供】
请注意,一些特征后的数字表示平均 k-最近邻中的 k 。我在这里更深入地讨论这个版本的 k-最近邻算法。简而言之,对于每个宗地,我计算了给定要素的 k 个最近位置,并对这些最近点的特征值进行平均。
我尝试用不同的 k 值来衡量平均值。例如,对于最近的犯罪,如果某个犯罪仅在一年内发生在房屋附近,则该要素在该时间步长内将会非常倾斜。每个特征都有不同的 k 值,并且在模型构建过程中为每个特征选择了最具信息性的 k 。
请注意,平均邻域价格要素是在预定义的费城邻域上生成的。当给定的边界没有正确地在住房类型和价格的集群之间划分时,这可能会导致问题。这就是所谓的可变面积单位问题。在其他房价分析中,不同形式的聚类被用于根据具体特征对地理区域进行分组,而不是使用邻居边界。在本文中,我进一步研究了地理聚类,但是总的来说,创建定制聚类的尝试并没有比预定义的邻域更加同质。而是使用原始邻域。
建模
手头有几十个特征,我比较了线性、非线性和基于树的方法来预测整个城市的房价。
普通最小二乘法,或 OLS,经常被用于房价的享乐模型,但空间自相关的存在破坏了这一测试的统计假设。空间自相关是指房价数据在空间上并不独立,因为它们受到许多相同空间因素的影响。这个项目的目标不是优化统计推断,而是做出准确的预测。因此,准确性和普遍性更为重要。在整个特性工程过程中,OLS 预测是确定新特性质量的重要基准。
我还使用了被称为弹性网的惩罚回归作为基线估计。LASSO 的目的是将系数小的变量推向零,从而提供一种伪特征选择的方法,由于回归方程中有大量可用的特征,这一点尤其重要。岭回归还可以最小化系数,尤其有助于存在多个相关预测值,因为空间模型中存在自相关。具有混合因子的组合版本适合当前模型,因为它可以与相关变量和特征选择一起工作。
主成分回归,或 PCR,能够降低数据集的维度,也与其他模型进行了比较。PCR 首先使用主成分分析提取解释最大差异的主成分或特征向量。这个新空间的主成分将比特征少,从而降低了输入的维数。然后,可以将系数拟合到包含主成分的新特征空间中,该主成分在使用较少特征的同时解决了原始数据中的差异。这种降维在预测房价时可能很重要,因为有许多潜在的相关特征需要解释。
除了回归,我还使用了随机森林和梯度推进机器。随机森林是基于原始数据的不同自举样本的许多决策树的集合。由于在随机森林中使用了许多随机决策树,这个模型容易受到离群值的影响。随着训练的完成,它还会自动选择更多相关的功能。
最后,我测试了梯度推进机器。该算法包括连续计算决策树,以适应前一个模型的残差,按学习率缩放。随着连续树数量的增加,由于考虑了残差,模型变得更加适合训练数据。这样,GBM 能够很好地拟合已知数据,尽管它们对异常值很敏感。代表性的训练样本是这种技术有效工作的关键。
为了评估和比较这些模型,我使用平均绝对百分比误差(MAPE)和平均绝对误差(MAE)进行 10 倍交叉验证和空间交叉验证。10 倍交叉验证简单地将训练数据随机分成 10 倍。对于 10 次迭代,其中一个折叠作为测试集,其余的用于训练模型。空间交叉验证以类似的方式工作,但是折叠是在费城随机选择的邻域。以这种方式调查误差将暴露模型中未考虑的邻域级别的空间自相关。
模型结果【图片由作者提供】
预测
在所用的模型中,随机森林迄今为止表现最好。这可能是由于从许多随机树中抽取平均结果时所表现出的固有变量选择过程。随着更具预测性的预测者出现,不重要的预测者最终被排除在连续的树之外。请注意,对于所有模型,与随机交叉验证相比,计算空间交叉验证时会增加误差。这表明残差中仍存在某种程度的空间自相关,这种自相关在邻域级别上表现出来。
确定了最准确的房价模型后,我使用随机森林模型来预测未来几年的市场价值。这些预测是通过使用特定年份的训练数据来预测未来年份的目标市场价值。由于数据集最多可以使用描述 2014 年城市状态的数据进行训练,并预测 2020 年的已知值,因此最大的未来预测也是未来六年的预测。一旦经过训练,这些模型可以外推至 2020 年以后。
邻域变化预测的热图【图片由作者提供】
上图显示了 2025 年的模型预测。左图显示的是未来五年内宗地密度较高且价格预计会下降的区域,右图显示的是价格预计会上升的区域。此外,两个地图都显示了当前经济适用房项目的位置,其大小基于可用单元的数量。总体而言,该市的平均单户家庭房价预计将从 2020 年的 136,860.90 美元升至 2025 年的 138,848.80 美元,这解释了房价上涨更频繁、更密集的地区。事实上,在预测的 275,347 宗地块中,121,342 宗预计升值超过 10%,而 36,231 宗预计下降相同的幅度。
推荐
在经济适用房方面,热图为未来的安置提供了一个指标。费城北部和南部围绕中心城市的区域有着高密度的快速升值的地块,这为这些区域的经济适用房需求做好了准备。这些结果与直觉一致,即经济快速增长的地区位于城市中心的外围,这可能导致这些地区的流离失所和住房需求增加。
费城市已经认识到了这种需求,制定了“住房换权益”计划(T1),计划在未来十年内新建 25,000 个家庭。为了评估过去住房单元的位置,我计算了每个开发项目四分之一英里半径内地块的当前和预测未来平均值。宗地价值的增长率被定义为时间跨度开始和结束时的平均宗地价值之间的比率。
经济适用房开发和社区增长率【作者图片】
如上图所示,周边社区增长最快的经济适用房项目位于市中心,尤其是在西北、东北和南部。那些离中心城市较远的地方,附近的房价涨幅较小。
高增长地区的经济适用房【作者图片】
放大高增长区域的集群,发现项目所在的社区在每个时间段的平均值都翻了一番以上。根据该模型,在接下来的五年中,预计社区增长将向北扩展。形成鲜明对比的是,在显示的两个时间段中,只有一个当前项目所在的区域的价值有望翻倍。尽管南费城的价值有了显著的增长,但预计未来几年不会有同样的增长。
在预计未来平均社区价值至少翻一番的 20 个项目中,只有 4 个项目是在 2010 年代建造的。在快速发展的地区缺乏近期的经济适用房使得这些地区经济适用房的前景不稳定。资助这些开发项目的低收入住房税收抵免(LIHTC)允许开发商在 15 至 30 年后将经济适用房开发项目转化为市场价格单位。由盈利性公司开发和拥有的经济适用房项目更有可能在期限结束时将其项目改造为市场价格单位,特别是在如上所示的高增长地区。
在 2015 年至 2020 年高增长地区的 27 个项目中,有 10 个由营利性开发商所有。在 2020 年至 2025 年预计高增长地区的 20 个项目中,一半由营利性开发商所有。根据提供租金补贴住房的 15 年合同,即使需求增加,这些关键地区的负担得起的住房存量预计也会大幅下降。
因此,特别是在中产阶级化地区,随着私人拥有的负担得起的住房单元转变为市场价格单元,可用的租金控制单元预计将会减少。这种住房短缺可能导致长期租房者流离失所。正如议员 Green 早些时候提出的,预测这些变化的一种方法是提前两年宣布低收入租金状况的变化,以便给城市规划者和居民时间准备搬迁。
鉴于对宗地价值的预测,对费城未来经济适用房的建议应考虑到预计增长最快的地区。这些领域目前的项目如下
预测高增长地区的经济适用房项目【作者图片】
如果不延长经济适用房期限,这些高增长地区的营利性开发商很可能会在他们的 15 年合同到期时驱逐低收入租户,从明年的 Nellie Reynolds Gardens 开始。考虑到对高增长地区的预测,建议采用三种方法来帮助抑制迁移的影响:
- 要求从补贴租金到市场租金的变化提前两年公布
- 延长警察局公寓、Raymond Rosen 公寓或 Nellie Reynolds Gardens 的租金控制住房的期限
- 将住房券的重点放在这些地区的租户身上,这些租户在未来一年可能会面临租金上涨
像这样的意识和基于地区的策略在规划费城经济适用房投资的未来时非常重要。
备件业务中的预测
有句话说,未来就在我们眼前一寸。永远在附近,但永远在前方。
丹尼尔·塞勒在 Unsplash 上拍摄的照片
在这个例子中,一个 R 预测管道用几种统计方法创建,每天为每个零件运行,以支持自动补货系统。像加法霍尔特-温特斯、指数平滑、克罗斯顿和脸书预言家这样的方法被组合起来,以输出每个零件和下一个需求周期的需求预测。作为未来的工作,其他方法,如 LSTM,可以实施和分析,以改善预测,如果适用。
业务背景和现状
备件业务有其自身的挑战:
- 客户非常迫切,要求立即供货(他们的客户大多是车主,还记得你上次去汽车修理厂吗?这通常不是一件愉快的事。)
- 大多数零件在单位时间内销量很小(甚至没有销量)——间歇性需求
- 该企业拥有庞大的产品组合(在多品牌零件批发商中甚至更多),每个品牌拥有超过 200,000 种不同的零件
这三个问题增加了库存积压和低库存周转率的问题,并且与批发商规模成反比:小型零件企业更容易受到这些问题的影响。
除了这些挑战之外,其他挑战也确实存在,但对其他企业来说更为普遍:
- 需求可变性:更好或更便宜或两者兼而有之的替代产品,客户偏好的变化(如配件市场备件份额的增加)或季节性(保险杠和其他车身部件在冬季的销量增加,而不是在夏季之前的过滤器和其他维护)
- 上游供应链的变化和中断 : PSA 整合了批发商的数量,并收购/合资了其他品牌,如欧宝和菲亚特集团,采购集团整合,非欧盟基金收购大型欧洲公司,黑天鹅事件,如 COVID global issue
- 电子商务和市场:永久的“沉睡的巨人”一直潜伏在一个迄今为止仍然是传统的市场中,对于一个迫切需要整合的市场来说,参与者的数量仍然太多
预测简介
我先讲一个关于未来的故事:它不会完全是你预测的那样!你越想在粒度的基础上预测,你能得到的误差就越大。
在商业方面,这并不意味着你应该忽略它。平均而言,你只需要比竞争对手做得好一点,从长远来看,你将拥有的竞争优势**。**
对于这个业务问题,我使用了 4 种方法:
- 指数平滑法
- 加法霍尔特-温特斯
- 克罗斯顿
- 脸书先知
其他城市(ARIMA、LSTM)也可以加入进来,但为了简洁明了,我们选择从这些城市开始。
预测方法
指数平滑法
指数平滑法是由 Charles C. Holt 在 20 世纪 50 年代末引入的。基本概念是在移动平均窗口的序列中构建时间序列,然后将最近的窗口置于旧窗口之上。加权方法是指数产生良好的预测。
指数平滑是一种使用指数窗口函数平滑时间序列数据的经验法则。在简单移动平均中,过去的观察值被同等地加权,而指数函数被用于分配随时间按指数递减的权重。
加法霍尔特-温特斯
这种方法是对霍尔特之前工作的改进。它是由 Peter R. Winters 加上季节性开发的,也被称为三重指数平滑法。
克罗斯顿
该书于 1972 年出版,书名为“间歇需求的预测和库存控制”,它解决了指数平滑积压的问题,方法是仅在发生的时间段内对发生的情况进行平均,然后乘以发生的概率。
需要注意的是,它不能处理负销售额(如果总额为负,则向客户进行发票贷记)。在预测特定备件时,您必须意识到这一点。
脸书先知
Prophet 是一种基于加法模型预测时间序列数据的过程,在该模型中,非线性趋势与每年、每周和每天的季节性以及假日影响相适应。它最适用于具有强烈季节效应的时间序列和几个季节的历史数据。Prophet 对缺失数据和趋势变化非常稳健,通常能够很好地处理异常值。
这种方法发表于 2017 年(比我们使用的前三种方法更近),我们研究它的原因是,除了完全自动化的之外,它还考虑了日历效应**(像假期)。**
不利的一面是,数据接收与前三种不同,迫使开发另一种数据提取过程。此外,对于我们的业务案例,它比其他的要慢得多,迫使我们重建/升级一些服务器软件组件。它在生产中的实现有更大的障碍。****
预测的准备工作
替代
备件业务有很多替代品。一个零件从 sku A 开始,变化到 B,到 C(或回到 A)…对任何想要一个干净方法的人来说都是一团糟。
替代用于:
- 用一部分代替另一部分
- 由于工程变更,需要用新版本替换的过时零件
因此,我们需要一个函数,它可以为一个零件获取它的替代链。由于使用了递归公共表表达式,它可以获得链中的所有部分:
从替代的表格视图中,我们可以得到一个列表:
提前期和预测期
这也许是一个更难解决的问题。对于由多个供应商供应(具有不同的交付周期)的每个零件,有必要评估主要供应商(如果存在多个供应商)并相应地进行预测。
例如,假设供应商 A 的补货提前期为 1 周(从订单到进货后的库存可用性),我们可以预测 n 个周期,每个周期 1 周。另一方面,如果供应商 B 的零件需要一个月才能交货,那么它的预测期也应该是一个月。
为了本文的简洁,所做的分析将假设 1 个月的时间(生产方法在每个供应商/品牌的基础上有可变的交付周期)。
将表格销售数据转换为时间序列
几乎每个销售数据源都以表格的形式出现。你会得到这样的结果:
出于预测目的,有必要将此结构更改为时间序列(例如,使用月度时段的单个 sku 注意 2018 年 9 月出现的负值):
****
要从表格转换为序列,只需在数据库中“分组”时间段:
用于预测的最低可行产品
现在,使用数据,我们需要设置它的预测方面。为此我们使用了 R(感谢非凡的库 forecast ),但是你也可以使用 Python 或者其他解决方案。
添加所需的库并连接到数据库:
从数据库中获取数据:
根据数据创建时间序列:
尝试第一次预测(仅在没有负面事件发生时适用于克罗斯顿):
即使如此,如果您选择使用 Croston,您可以将负面事件归零(请在比较预测方法时考虑,因为您正在更改其中一种方法的数据):
****
看着图表,我们倾向于选择前面的霍尔特-温特斯(其他的似乎“太平”)。但是,对于这个用例,只有对“下一个时期”的预测是重要的,因为我们将重复地做它。
所有方法都导致类似的结果,2020 年 1 月平均售出 4 或 5 台,并且“Hi 95”区间达到 18 或 13。
先知呢?
正如我提到的,Prophet 数据摄入有点不同。首先,它需要每日数据,头必须是’ ds 和’ y 【T3 ':
因此,我们需要改变我们的数据源 SQL。类似这样的事情会发生:
(如果你注意到了,我们正在将负面事件归零。模型中还有一个我们可以使用的特性,叫做“饱和最小值”。)
获得下一期的预测只是跟踪预测:
解决生产预测问题
现在我们有了一个工作的 MVP,是时候把它投入生产了。对于那些仍在内部使用 IT 基础设施的人来说,计算相对便宜。服务器已经在那里了,大部分时间都在闲置,乞求做一些有用的事情。
对于我们的数据集(+50.000 sku),对每个 sku 进行 4 次预测很容易就需要一整天以上的时间。我给你一个提示:先知应该为此负责😊
但是有一些策略可以用来减少花费的时间:
1.并行计算
这是减少时间的最佳选择。按照仓库、品牌或任何其他标准来划分工人。请注意,组的基数相等通常意味着它运行得更快(结束得更快),因为它避免了一个延迟的组拥有比其他组更多的 SKU。
你可以使用的另一种方法是将 Prophet 与其他人分开。这样,由于数据采集是不同的,其他的将会很快结束。请注意,一些 Prophet 预测是长期运行的,数据库连接/事务可能会在数据库端关闭。
另一方面,并行计算有两个问题需要解决:
- 如果您的方法是让工作器在没有任何顺序的情况下获取数据块,那么有必要强制执行一些数据库锁。
- 当最后一名选手结束时,你需要给这个项目的合奏部分发信号(下一章会有更多的介绍)。
2.仅对前一天销售或购买的零件进行每日计算
该选项是另一种快捷方式😊。如果您的补货订单每天都有,前一天未售出/未购买的零件“可能”会减少他们的库存预测(请对此持保留态度,因为当季节性等其他问题生效时,这在数学上是不正确的)。
这种解决方案的优点是还减少了与每天售出的不同零件(平均)数量相关的因素所做的计算。如果你有 50,000 个 SKU,而你平均每天只卖出/买入 5,000 个,那么你就减少了 90%的计算量。
如果你选择使用这种策略,我建议每周/每月进行一次全面跑步。
对于给定日期的给定备件,使用哪种预测方法
现在,我们有一个渠道在每个零件上运行 4 个不同的预测,我们应该选择哪一个?
有几个概念可以帮助你选择(我不能在这里说得太详细):
- 库存不足比库存过多更贵吗?也就是说,利益相关者更重视缺失的部分还是过多库存的成本?这个问题的答案有助于你选择更保守的方法。在这一点上,克罗斯顿往往做得很好。
- 选择返回较低 MAPE(平均绝对百分比误差)或 MSE(均方误差)的方法。平均而言,ETS 表现最差。
- 通过使用 MAPE 对库存不足进行+20%的惩罚(如果实际值减去预测值为负)来综合前两种方法。
这也许是这个项目更商业的一面。这实际上取决于你试图预测的潜在原因是什么:是数学准确性还是商业优势。👍
总结
从所做的工作来看,克罗斯顿和霍尔特-温特斯都做得很好。ETS 是表现最差的模型,而 Prophet 的计算强度更大,没有为 7 天、15 天或 30 天的预报提供足够的优势。
在自动订单管道上完成工作后,预测方将估计的销售额反馈给它,并允许一个完整的自动化库存管理。
就是这样!全部完成!新的挑战在别处等待着我们!!!👏
电力商业智能预测
数据科学/电力 BI 可视化
使用 Power BI 进行预测的直观分步指南。
在本帖中,我们将介绍在 Power BI 中创建预测的过程。
获取数据
你可以在这里下载我用的数据集。它包含了 1959 年加利福尼亚每天的女性出生人数。关于其他时间序列数据集的列表,请查看 Jason Brownlee 的文章。
机器学习可以应用于时间序列数据集。在这些问题中,数值或分类值必须…
machinelearningmastery.com](https://machinelearningmastery.com/time-series-datasets-for-machine-learning/)
让我们将数据加载到 Power BI 中。打开 Power BI 并点击欢迎屏幕上的“获取数据”,如下所示。
作者截图
接下来,您将看到另一个面板,询问我们想要获取什么类型的数据。选择如下所示的“文本/CSV”并点击“连接”
当“文件打开”窗口出现时,导航到我们保存数据集的位置,然后单击右下角的“打开”按钮。
当预览出现时,只需点击“加载”
我们现在将看到 Power BI 的主要工作区域。前往“可视化”面板,寻找“折线图”
。作者截图
这是折线图图标的外观:
接下来,将出现一个可视占位符。拖动占位符右下角的热角标记,并将其对角向下拖动到主工作区的右上角。
截图由作者
接下来,打开“字段”面板。
在折线图占位符仍处于选中状态的情况下,找到“日期”字段,然后单击方形框以选中它。
我们现在将看到轴下的“日期”字段。点击“日期”右侧的向下箭头,如下所示。
截图由作者
选择“日期”而不是默认的“日期层次结构”
截图由作者
然后,让我们在“出生”字段打上勾号。
我们现在将看到一个类似下图的线形图。在可视化面板和图标列表下,找到如下所示的分析图标。
作者截图
向下滚动面板,找到“预测”部分。如有必要,单击向下箭头将其展开。
接下来,单击“+Add”在当前可视化中添加预测。
我们现在将看到一个实心的灰色填充区域和一个位于可视化右侧的线图,如下图所示。
让我们把预测长度改为 31 点。在这种情况下,一个数据点相当于一天,所以 31 大致相当于一个月的预测值。单击预测组右下角的“应用”以应用更改。
让我们将度量单位改为“月”,而不是点,如下所示。
单击“应用”后,我们将看到可视化效果的变化。下图包含 3 个月的预测。
截图由作者
如果我们想比较预测与实际数据的对比情况会怎样?我们可以通过“忽略最后一个”设置来做到这一点。
对于这个例子,让我们忽略过去 3 个月的数据。Power Bi 将使用数据集预测 3 个月的数据,但忽略过去 3 个月的数据。这样,我们可以将电力 BI 的预测结果与数据集最近 3 个月的实际数据进行比较。
如下所示,完成设置更改后,我们单击“应用”。
下面,我们可以看到功率 BI 预测与实际数据的对比。黑色实线代表预测,而蓝色线代表实际数据。
预测上的实心灰色填充表示置信区间。其值越高,面积就越大。让我们将置信区间降低到 75%,如下所示,看看它对图表的影响。
截图由作者
实心灰色填充变小,如下所示。
截图由作者
接下来,让我们考虑季节性。下面,我们把它设定为 90 分相当于 3 个月左右。输入这个值将告诉 Power BI 在 3 个月的周期内寻找季节性。用根据数据有意义的东西来玩这个值。
结果如下所示。
作者截图
让我们将置信区间返回到默认值 95%,并向下滚动该组以查看格式选项。
让我们将预测线更改为橙色,并通过将格式更改为“无”来使灰色填充消失
就是这样!只需点击几下鼠标,我们就能从数据集中得到一个预测。
感谢您的阅读。如果你想了解更多关于我从懒鬼到数据科学家的旅程,请查看下面的文章:
我的无学位数据科学之旅。
towardsdatascience.com](/from-slacker-to-data-scientist-b4f34aa10ea1)
如果你正在考虑改变方向,进入数据科学领域,现在就开始考虑重塑品牌:
给我们其他人的固执己见的建议。热爱数学,选修。
towardsdatascience.com](/the-slackers-guide-to-rebranding-yourself-as-a-data-scientist-b34424d45540)
敬请期待!
你可以通过推特或 LinkedIn 联系我。
[1]机器学习掌握。(2020 年 6 月 21 日)。机器学习的 7 个时间序列数据集。https://machine learning mastery . com/time-series-datasets-for-machine-learning/
利用 Streamlit 和 sktime 预测可再生能源发电量
开发 Streamlit web 应用程序,提供欧盟国家可再生能源发电预测
尼古拉斯·多尔蒂在 Unsplash 上拍摄的照片
气候变化无疑是人类面临的最大挑战之一。过去十年是有记录以来最热的,2019 年结束时,全球平均气温比工业化前水平高 1.1 摄氏度。全球气温上升对人类福祉的各个方面都有重大影响,如健康和粮食安全。近年来,许多人死于热浪,而其他人则因气候多变和极端天气事件而遭受饥饿。
科学家们不断做出与全球变暖有关的惊人发现。例如,最近有报道称,自 1994 年以来,地球已经失去了 28 万亿吨冰,这表明到本世纪末,全球平均海平面可能会显著上升。根据政府间气候变化专门委员会(IPCC)的说法,世界必须在 2050 年实现碳平衡才有希望将全球变暖限制在 1.5 摄氏度以内,并避免气候变化的最恶劣影响。联合国秘书长安东尼奥·古特雷斯表示,我们目前离实现这一目标还很远。
可再生能源
科学界一致认为,人为气候变化是由人类活动排放的二氧化碳和其他温室气体(GHG)造成的。因此,降低大气中的 GHG 浓度来缓解这一问题至关重要。化石燃料发电站要对很大一部分温室气体(GHG)排放负责,这使得向低碳替代能源的过渡比以往任何时候都更加重要。在过去几年中,可再生能源发电的成本大幅下降,使其成为一种可行且具有成本效益的选择,即使我们忽略了环境保护方面。不幸的是,最近的一项研究表明,只有 10%的电力公司优先考虑可再生能源,这表明这种转变非常缓慢。另一方面,这也表明可再生能源行业具有巨大的增长潜力。
图表由我们的数据世界
预测可再生能源发电
有许多可再生能源可用于发电,如太阳能、风能、水电、生物质能和地热。大多数国家都把重点放在太阳能和风能上,因为替代能源有很大的局限性。例如,水力发电站和地热发电站只能建在特定的地区。太阳能和风能更灵活,但它们的输出取决于天气条件和其他因素,所以它们被称为可变可再生能源(VRE)。由于 VRE 电站的输出功率波动较大,将它们并入电网是一项挑战。准确的预测可以帮助我们克服这一障碍,并改善电力调度和长期系统规划。
sktime Python 库
时间序列预测通常是用统计模型来完成的,比如 ARIMA。然而最近几年,机器学习算法也被使用。利用滑动窗口方法,时间序列预测可以很容易地转化为一个监督学习问题。在这个方法中,每个值被认为是一个标签 y ,前面的 n (窗口长度)值是 x 特征。产生的数据集可用于训练我们偏好的回归模型。您可以在下表中看到这样的示例(窗口长度为 n = 10)。
[ 0 1 2 3 4 5 6 7 8 9] [10]
[ 1 2 3 4 5 6 7 8 9 10] [11]
[ 2 3 4 5 6 7 8 9 10 11] [12]
[ 3 4 5 6 7 8 9 10 11 12] [13]
[ 4 5 6 7 8 9 10 11 12 13] [14]
[ 5 6 7 8 9 10 11 12 13 14] [15]
[ 6 7 8 9 10 11 12 13 14 15] [16]
[ 7 8 9 10 11 12 13 14 15 16] [17]
[ 8 9 10 11 12 13 14 15 16 17] [18]
[ 9 10 11 12 13 14 15 16 17 18] [19]
Sktime 是一个 Python 库,基于机器学习算法,为时间序列预测提供了有用的工具。它自动对时间序列应用滑动窗口方法,同时也与 scikit-learn API 兼容。这意味着它可以很容易地与每个 scikit-learn 回归器或其他兼容的库(如流行的 XGBoost 算法)一起使用。要深入了解 sktime,您可以查看这篇文章,或者阅读由其开发人员撰写的研究论文。
简化框架
Streamlit 是一个 Python 框架,可以让您非常快速地为数据科学项目构建 web 应用。您可以用几行代码轻松创建一个包含各种小部件的用户界面。此外,Streamlit 是一个很好的工具,可以将机器学习模型部署到 web 上,并增加数据的可视化效果。Streamlit 还有一个强大的缓存机制,可以优化应用程序的性能。关于 Streamlit 的详细介绍可在这里获得。
开发 Renewcast 网络应用程序
Renewcast 是一款网络应用,提供欧盟国家可再生能源发电预测。我决定开发这个应用程序有几个原因。首先,我非常关注气候变化,我想探索机器学习可以帮助缓解气候变化的各种方式。第二,我总是试图提高我的技能,开发这个应用程序是熟悉 Streamlit 和 sktime 的一个很好的方式。我现在将描述源代码的功能,从app.py
文件开始。
这是主要的 Streamlit 应用程序。首先我导入了 Streamlit 库,还有一些我自己创建的函数。之后,我使用相关的 Streamlit 函数为应用程序添加了一个标题和描述。然后,我继续创建一个基本的用户界面,在标准的 Streamlit 侧边栏上添加小部件。用户可以选择一个国家和回归算法,以及修改预测范围和窗口长度。最后,我使用了area_chart()
和line_chart()
函数来绘制总发电量,以及可再生能源发电量(太阳能和风能)的预测。让我们继续讨论entsoe_client.py
文件。
get_energy_data()
功能与 ENTSOE-E API 接口,下载每个欧盟国家的必要能源生成数据。在定义函数之前,我插入了@st.cache
装饰器来使用 Streamlit 的缓存机制。我这样做是为了让 ENTSOE-E API 不会在我们每次需要使用这些数据的时候被调用,而是只在需要更新的时候被调用。这将优化我们的应用程序的性能,并显著减少运行它所需的时间。现在让我们继续,检查最后一个主要源代码文件forecast.py
的功能。
select_regressor()
函数只是将用户界面的回归算法选项映射到相关的 scikit-learn 类。我已经包含了一些典型的 scikit-learn 回归算法,比如线性回归、随机森林和梯度推进,但是任何与 scikit-learn API 兼容的回归器都应该可以工作。generate_forecast()
函数负责应用程序的主要功能,即预测能源生产时间序列的未来值。我用ReducedRegressionForecaster
类实现了这一点,它将滑动窗口方法应用于时间序列,然后用该数据训练一个回归模型,这是前面讨论过的一种技术。最后,我还创建了calculate_smape()
函数,它返回对称平均绝对百分比误差(SMAPE ),这是一个有用的指标,可以帮助我们评估预测的准确性。
结论
我希望读完这篇文章后,你会被鼓励开发自己的 Streamlit 应用程序,甚至 fork renew cast(Github 存储库在这里可用)。也许你会受到启发,获得更多关于气候变化的知识,以及用机器学习减轻气候变化的许多方法。欢迎在评论中分享你的想法,或者在 LinkedIn上关注我,我会定期在那里发布关于数据科学、气候变化和其他主题的内容。你也可以访问我的个人网站或者查看我最新的一本书,书名是用 PyCaret 简化机器学习。
参考
[1] M. Joos,I. Staffell,可变可再生能源的短期整合成本:英国和德国的风电削减和平衡 (2018),可再生和可持续能源评论
[2] D. Rolnick,P. L. Donti,L. H. Kaack,K. Kochanski,A. Lacoste,K. Sankaran,等.用机器学习应对气候变化 (2019),arXiv:1906.05433
[3]m . lning,F. Király,用 sktime 进行预测:设计 sktime 的新预测 API 并应用它来复制和扩展 M4 研究 (2020),arXiv:2005.08067
预测生存指南:避免 PoC 诅咒的 4 个专业建议
我从野外预测项目中学到的经验将帮助您从一开始就获得更好的结果,并将您的模型投入生产。
埃里克·麦克林在 Unsplash 上的照片
很多机器学习模型都没有投入生产。有些人甚至称之为 PoC 魔咒:概念证明显示出有希望的结果,但从来没有人使用它们。
然后,数据科学家经常抱怨数据质量、破损的数据管道或 MLops 有多难。然而,我认为很多模型在被训练之前就注定要失败。
正如任何其他项目一样,范围和目标可以决定预测项目的成败。当开始一个新项目时,有时我们在这些重要步骤上花费的时间太少。尤其是与未来用户有一定距离的团队(如数字创新团队、数据实验室等跨职能部门),必须意识到这种危险。
让我分享一些如何在项目早期避免 PoC 诅咒的技巧。
思考来自于决定
预测项目的目标在项目开始时似乎非常明确。在一些项目中,你被要求预测客户流失,在下一个项目中,你应该预测零售销售,在另一个项目中,他们被要求预测实验室中某个过程的能耗。
然而,在大多数情况下,你的项目发起人不会因为做预测而得到报酬。她因取得商业成果而获得薪水。你将要做的预测模型应该会帮助她获得更好的结果。问她将根据预测模型的结果采取什么措施:
- 可以采取什么行动?
- 谁将决定要采取的行动?
- 你如何根据预测做出这些决定?
- 你还需要什么来做决定?
- 这些决定通常在什么时候做出,多久做出一次?
为什么这很重要?您可能会遇到这样的情况,人们在谈论公司使用预测模型可能获得的优势,但没有人真正做出决策来实现这一点。这些优势很可能只是虚幻的,不会实现。
史蒂夫(项目成员):“如果我们知道哪个客户将要离开,我们就可以给他们打折。那就太好了!”
你:“谁来决定一个顾客是否得到折扣以及折扣的金额?”
史蒂夫:“哦,那是客户经理。让我们看看莎拉是否能加入我们的讨论。”
你:“嗨,Sara,我们考虑了一个可以支持你的新应用程序。它将能够预测即将离开的客户,你可以为他们提供折扣!”
萨拉(客户经理):“嗯。我们的客户通常会因为功能缺失而离开。一旦上船,他们很少要求打折。我们没有那么多顾客。我已经知道那些不快乐的人和原因。”
这并不一定会使你的客户流失预测模型变得无用(Sara 可能并不像她认为的那样了解她的客户),但你需要获得更多关于你的模型将支持的决策的见解。
在评估模型的准确性和精确度时,了解要采取的决策可能是有益的。它甚至可以彻底改变必要的机器学习模型。
利益相关者可能会告诉你,他们需要一个回归模型来预测 6 个月内的原材料消耗。然而,他们真正需要的决策(购买更多或更少的原材料)可能是一个分类模型,该模型指示下个月的消费量是否大致相同,比上个月的消费量低 20%还是高 20%。
这就是为什么你应该总是从决定中思考。
让所有相关人员都参与进来并做出承诺
一旦你知道了相关的决策,你应该让相关的决策者参与进来,并致力于这个项目。从决策者那里获得项目承诺的最好方法之一是在设定项目目标时让他们参与进来。
其他相关人员包括拥有可以为您的模型提供数据的系统的人员、通常处理分析和 BI 项目的团队、制定 IT 标准的架构师或负责模型运营的团队。
有些人可能在开始时不能做出很多贡献,但是一旦你需要他们的支持,如果他们已经了解你和你的项目会更好。早期的反馈也有助于避免以后出现各种不愉快的问题,比如这个:
彼得(数据所有者):“这是我们的数据。你不能用它。”
你:“但这是公司的数据。我们的模式依赖于此。”
彼得:“人们从未想到这些数据会被用于自动预测。我还需要三个职位来保证数据的质量。我会在人员成本规划中考虑这一点。我们可以明年再谈。”
尽早澄清所有相关干系人的要求。另一个例子:立即开始使用 Python 比以后发现运营团队甚至不会考虑部署 Julia 应用程序要容易得多。
根据项目的不同,您还应该与负责数据保护和安全的人员交谈,例如数据保护官员。
预测项目的潜在利益相关者
先问你如何能改善人们的生活,模型其次
避免过早进入白板建模和特征工程。相反,问问你的解决方案如何改善你的股东、他们的客户和你未来的用户的日常生活。
如果你的模型对他们没有好处,为什么有人要用呢?如果只是他们的老板告诉他们使用它,你可以肯定他们会在你的模型中发现最小的怪癖和不一致。
人们不会在意更好的 R 或者牛逼的 F1 成绩。他们确实关心他们的工作&时间,也许还有地位。对他们中的一些人来说,这将是使用一个花哨的人工智能应用程序的足够动力,但对其他人来说,你必须提供更多实质性的改进。它远没有你想象的那么深奥。询问您的利益相关者和未来用户:
你和你的同事如何注意到我们的项目是成功的?
这会如何让你的工作生活变得更轻松?
每个人都在谈论客户亲密度,为什么不也想想他们呢:
您的客户将如何注意到我们的项目是成功的?
这将如何让他们的生活更轻松?
问这些问题并得到答案可能需要几个小时,但这比两周的超参数调优要有益得多。
口头说明风险和要求
一旦你得到了所有利益相关者的承诺,你知道要支持的决策以及如何改善每个人的生活,预测项目仍然有一点复杂:预测未来真的很难。
虽然我们正在取得进展,但许多机器学习项目仍然更像是一个研究项目,而不是一些商业应用程序的开发项目。
从一开始就乐观地开始这个项目,但是老实说,很多进展会是这样的:“太好了,现在我们知道消费者信心指数对于预测销售是而不是有用的。”
此外,不要从太少的数据开始。许多公司刚刚开始考虑成为一家数据驱动型公司,没有包含几十年数据的数据湖,许多初创公司甚至还没有存在足够长的时间。
如果你想预测原材料的消耗,并且你的生产过程遵循一个年度模式,用一年半的数据是不会成功的。
如果你想预测零售额,而你的典型产品生命周期是七年,三年的数据是不够的。
说出风险和需求将有助于管理涉众的期望,并使您的生活更轻松。
我希望这些见解对你有用。感谢您的阅读,我期待您的评论和预测体验!
用自回归预测特斯拉的股价
了解如何使用 Python 将基本的时间序列建模技术应用于 Tesla 的股票价格。
资料来源:Bram Van Oost via Unsplash。
过去几个月里,特斯拉一直在金融市场兴风作浪。此前被评为美国最被卖空的股票[1],特斯拉的股价此后飙升至 2780 亿美元的市值[2]。其最新的季度业绩表明,它现在可以加入标准普尔 500 了,尽管它是美国第 12 大公司,但它目前还不是其成员[3]。
在市场波动、各种交易策略和“FOMO”(害怕错过)感的背景下,预测特斯拉股票的回报是一项艰巨的任务。但是,我们将使用 Python,使用自回归来预测特斯拉的股价回报。
探索数据
首先,我们需要导入数据。我们可以使用从雅虎财经下载的历史股票价格数据。我们将使用“接近”价格进行分析。
import pandas as pddf = pd.read_csv("TSLA.csv", index_col=0, parse_dates=[0])
df.head()
来源:雅虎财经。
来源:雅虎财经。
为了确定 ARMA 模型的阶数,我们可以首先绘制一个偏自相关函数。这给出了因变量和其自身滞后之间的相关量的图形解释,未通过所有低阶滞后的相关来解释。
从下面的 PACF 中,我们可以看到滞后的显著性在滞后 1 之后消失,这表明我们应该使用自回归(AR)模型[4]。
# Plot PACF
from statsmodels.tsa.stattools import acf, pacf
plt.bar(x=np.arange(0,41), height=pacf(df.Close))
plt.title("PACF")
有限&滞后 1 后截止,所以 AR。
当绘制自相关函数时,我们会得到一个稍微不同的结果。该系列是无限的,并慢慢衰减,这表明 AR 或 ARMA 模型[4]。考虑到 PACF 和 ACF,我们将使用 AR 模型。
#Plot ACF
plt.bar(x=np.arange(0,41), height=acf(df.Close))
plt.title("ACF")
无限和阻尼所以 AR/ARMA。
数据预处理
在运行模型之前,我们必须确保我们使用的是静态数据。平稳性是指数据移动的方式不会随时间而改变的特征。查看本文前面看到的原始股票价格,很明显该序列不是平稳的。我们可以看到,随着时间的推移,股票价格以看似指数的方式上涨。
因此,为了使数列平稳,我们差分数列,这实质上意味着**从明天的值中减去今天的值。**这会导致序列围绕一个常数均值(0)旋转,从而给出股票收益而不是股票价格。
我们还将使差分序列滞后 1,这**将昨天的值向前推至今天。**这样我们就可以得到我们的 AR 期限(Yt-1)。
将这些值放入同一个数据帧后,我们将数据分成训练集和测试集。在代码中,数据被大致分成 80:20。
# Make the data stationary by differencing
tsla = df.Close.diff().fillna(0)# Create lag
tsla_lag_1 = tsla.shift(1).fillna(0)# Put all into one DataFrame
df_regression = pd.DataFrame(tsla)
df_regression["Lag1"] = tsla_lag_1# Split into train and test data
df_regression_train = df_regression.iloc[0:200]
df_regression_test = df_regression.iloc[200:]tsla.plot()
差分序列。来源:雅虎财经。
形成 AR 模型
现在,我们应该用多少个值来预测下一个观察值呢?使用所有过去的 200 个值可能不会给出很好的估计,因为直观上,200 天前的股票价格活动不太可能对今天的价值产生重大影响,因为自那时以来许多因素可能已经发生了变化。这可能包括收入、竞争、季节等等。因此,要找到用于回归的最佳观察窗口,我们可以使用的一种方法是使用*扩展窗口运行回归。*下面的代码详细介绍了这种方法,它使用一个过去的观察值进行回归,记录 r 平方值(拟合优度),然后重复这一过程,**每次将过去的观察值扩展 1。**从经济角度来看,我将窗口期限制在 30 天。
# Run expanding window regression to find optimal windown = 0
rsquared = []while n<=30:
y = df_regression_train["Close"].iloc[-n:]
x = df_regression_train["Lag1"].iloc[-n:]
x = sm.add_constant(x)model = sm.OLS(y,x)
results = model.fit()rsquared.append(results.rsquared)n +=1
查看每次迭代的 r 平方图,我们可以看到它在 1–5 次迭代附近较高,并且在 13 个过去值处也有一个峰值。在 1 和 5 之间选择一个值似乎很诱人,但是,非常小的样本量可能意味着我们的回归在统计上有偏差,所以不会给我们最好的结果。因此,让我们选择 13 次观察的第二个峰,因为这是一个更充分的样本量,它给出了大约 0.437 的 r 平方(即模型解释了数据中 43%的变化)。
r 平方图。
对训练数据运行 AR 模型
下一步是使用我们过去 13 次观察的窗口来拟合 AR(1)模型。我们可以使用 statsmodels 中的 OLS 函数来实现这一点。以下代码:
# AR(1) model with static coefficientsimport statsmodels.api as sm
y = df_regression_train["Close"].iloc[-13:]
x = df_regression_train["Lag1"].iloc[-13:]
x = sm.add_constant(x)model = sm.OLS(y,x)
results = model.fit()
results.summary()
AR(1)模型的回归输出(训练数据)。
正如我们在统计摘要中看到的,常数和第一个滞后的 p 值在 10%的显著性水平上是显著的。查看系数的符号,常数上的正号表明,在其他条件相同的情况下,股票价格回报应该为正。此外,第一个滞后上的负号表明,在其他条件相同的情况下,股票回报的过去值低于今天值,这也维持了股票回报随着时间推移而增加的说法。
很好,现在让我们使用这些系数来找到特斯拉股票回报的拟合值,这样我们就可以根据原始数据绘制模型。我们的模型现在可以指定为:
我们的 AR(1)方程。
绘制残差图(实际-拟合)
残差(训练数据)
残差表明模型在 2019 年表现更好,但在 2020 年随着波动性增加,模型表现相当差(残差更大)。这很直观,因为 2020 年 3 月抛售经历的波动对美国股市产生了巨大影响,而科技股尤其感受到了快速而可观的反弹。这一点,加上 Robinhood 等平台上的散户投资者加大了对特斯拉股票的押注,加剧了价格波动,从而加大了预测难度。
考虑到这些因素,以及我们之前 43%左右的 r 平方,我们不会期望我们的 AR(1)模型能够预测准确的股票回报。相反,我们可以通过计算其“命中率”来测试模型的准确性,即当我们的模型预测为正值而实际值也为正值时,反之亦然。总结真阳性和真阴性的实例,我们的模型的准确性达到 55%左右,对于这个简单的模型来说,这是相当好的。
根据测试数据拟合模型
现在,让我们将同样的方法应用于测试数据,看看我们的模型如何执行样本外的*。*
实际值与拟合值(测试数据)。
# Calculate hit rate
true_neg_test = np.sum((df_2_test["Fitted Value"] <0) & (df_2_test["Actual"] <0))
true_pos_test = np.sum((df_2_test["Fitted Value"] >0) & (df_2_test["Actual"] >0))accuracy = (true_neg_test + true_pos_test)/len(df_2_test)
print(accuracy)# Output: 0.6415
在将模型应用于测试数据时,我们的命中率提高到了 64%,这是一个很有希望的改进!提高其准确性的下一步可能包括运行滚动回归,其中系数随着每次迭代而变化,或者可能将移动平均(MA)元素并入模型。
感谢阅读! 如果你有什么见解,欢迎随时留下评论。包含我用来做这个项目的源代码的完整 Jupyter 笔记本可以在我的 Github 资源库 中找到。
参考
[1]卡门·赖尼克(2020)。特斯拉再次成为美国(TSLA)被卖空最多的股票。市场内幕。可在:https://markets . business insider . com/news/stocks/Tesla-stock-most-shorted-us-beats-apple-higher-short-interest-2020-1-1028823046
[2]雅虎财经,截至 2020 年 8 月 6 日。
[3]史蒂文斯,皮帕(2020)。“特斯拉可能很快就会加入标准普尔 500 指数,但这并不是自动的,即使全年都有盈利”。见:https://www . CNBC . com/2020/07/21/Tesla-not-a-guarantee-for-s-p-500-even-with-year-of-profits . html
[4]约翰逊法官,迪纳多法官(1997 年)。《计量经济学方法》,第四版。
免责声明:本文表达的所有观点均为本人观点,与任何金融实体无关。我不是一个交易者,也没有用本文中的方法赚钱。这不是财务建议。
用 Prophet 预测铜生产者价格指数
利用 Prophet 预测商品价格
来源:图片由 Pixabay 的 papazachariasa 提供
免责声明:本文是在“原样”的基础上编写的,没有担保。它旨在提供数据科学概念的概述,不应被解释为投资建议或任何其他类型的专业建议。
即使在最好的情况下,预测资产价格也可能是一件棘手的事情。首先,资产价格受高度随机性(或随机影响)的影响,这使得预测未来变得困难。
也就是说,脸书的先知时间序列模型的一个有用的特性是能够识别变点,或者时间序列中重大结构变化的时期。准确识别这些点反过来可以改进时间序列预测。让我们看看 Prophet 如何预测铜的生产者价格指数。数据来源于弗雷德经济数据使用 Quandl。
背景
铜生产者价格指数从 1985 年 9 月到 2020 年 7 月进行分析。由于这是一个金融时间序列,因此该序列被转换为对数格式,以平滑数据并确保模型考虑了百分比基础上的回报。
这是一张数据图表:
资料来源:弗雷德经济数据
从 1985 年 9 月到 2017 年 1 月的数据作为训练数据。截止到 2020 年 7 月的剩余月份用作测试数据——这些数据用于与模型预测进行比较,以评估准确性。
以下是对该系列的分解:
来源:Jupyter 笔记本输出
我们可以看到,在这种情况下,该系列有一个强大的上升趋势。然而,没有证据表明该系列具有季节性。
也就是说,数据中确实出现了几个结构性突变。从这个角度来看,Prophet 模型在预测测试数据的价格时可能会产生很好的预测能力。
模型结构
数据集定义如下:
train_dataset= pd.DataFrame()
train_dataset['ds'] = train_df['Date']
train_dataset['y']= train_df['Value']
train_dataset.head(10)
标准 Prophet 模型与数据集的拟合如下:
prophet_basic = Prophet()
prophet_basic.fit(train_dataset)
以下是使用该模型生成的预测:
forecast=prophet_basic.predict(future)
fig1 =prophet_basic.plot(forecast)
来源:先知
如上所述,特别令人感兴趣的是变化点,或者时间序列中的重大结构突变。
from fbprophet.plot import add_changepoints_to_plot
fig = prophet_basic.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), prophet_basic, forecast)
来源:先知
从上图可以明显看出,模型已经识别出 12 个变化点。现在在此基础上进行预测。
pro_change= Prophet(n_changepoints=12)
forecast = pro_change.fit(train_dataset).predict(future)
fig= pro_change.plot(forecast);
a = add_changepoints_to_plot(fig.gca(), pro_change, forecast)future_data = pro_change.make_future_dataframe(periods=43, freq = 'm')
#forecast the data for future data
forecast_data = pro_change.predict(future_data)
pro_change.plot(forecast_data);
Prophet 生成了详细的预测:
来源:先知
准确(性)
现在让我们根据以下内容评估模型的准确性:
- 平均定向精度: 95%
- 均方根误差: 0.1948
- 平均预测误差: 0.1839
下面是测试集的预测价格与实际价格的对比图:
来源:Jupyter 笔记本输出
整个测试集的平均值为 5.93(以对数表示),相比之下,RMSE 和 MAE 相当低(大约为平均值的 3%),表明该模型在预测方面表现良好。由于我们使用的是月度数据,因此不清楚当使用较短的时间范围(例如每小时或每天)时,该模型的表现如何。从这个角度来看,模型预测在预测短期波动方面可能是有限的,但在捕捉总体趋势方面似乎做得相当好。
此外,由于 MDA 为 95%,这表明该模型能够在 95%的时间内预测特定月份的价格方向,这相当不错。
请注意,变点配置对预测准确性有直接影响。例如,当预测中的变点数降低到 4 时,RMSE 达到 0.2840 。虽然这与平均值相比仍然很低,但仍然是用 12 个变点计算的 RMSE 的近两倍。
限制
一般来说,预测资产价格(或任何种类的经济数据)都很棘手。
这是因为资产价格天生受制于反馈回路。例如,假设一个预言家模型在预测铜价方面带来近乎完美的准确性。在这种情况下,更广泛的市场最终将开始使用该模型——假设市场在长期内保持有效——此时,就预测能力而言,竞争优势不再能够获得。
例如,不像天气这样的时间序列——它不能通过人为干预来改变——基于预测的后续交易具有改变价格本身的效果——这意味着以前准确的预测不再准确。
此外,金融时间序列可能会受到干预,这些干预在以前的数据中可能没有被捕捉到。例如,2008 年之前的时间序列数据不会捕捉到美联储将美国利率降至零的情况,因此时间序列本身无法解释如此重大的结构性变化。
当涉及到具体的干预建模时,更有效的方法可能是通过使用因果影响包。这里有一个的例子,说明如何使用这样的工具来模拟利率变化对货币波动的影响。
结论
在这个例子中,我们已经看到,在预测资产价格的长期趋势时,Prophet 可以非常有效,并且在识别重大结构变化点以通知此类预测时特别有效。
非常感谢您的阅读,非常感谢您的任何问题或反馈。
更新:如果你感兴趣,这里有一篇关于这个主题的更新文章,我在其中讨论了如何使用 CNN(卷积神经网络)预测铜价!
预测时间序列数据-股票价格分析
时间数列预测法
重点介绍了使用不同的平滑方法和 Python 中的 ARIMA 对时间序列数据进行预测。
在本文中,我们将浏览某家公司的股票价格。**然而,本文并不鼓励任何人仅仅基于这种预测进行交易。**股票价格取决于各种因素,如供求关系、公司业绩、投资者情绪等。
什么是时间序列?
时间序列由定期捕获的观察值组成。时间序列数据集具有很强的时间依赖性。它可以用来根据以前的观测结果预测未来的观测结果。
分解时间序列:
时间序列可分为以下几个部分:
趋势: 数据值的增减。这可以进一步分为全球趋势和局部趋势。
实际观察值=全球趋势+当地趋势(来源:UpGrad)
季节性: 系列中可见的是重复模式。数据值的这种上升或下降是固定频率的。例如,圣诞树的销量在 12 月份总是较大,而在其他时间则较少。
周期性: 它是数据的值的上升和下降,不是固定的频率。它可以被看作是经济条件或其他外部因素的结果
噪声: 它只是我们从时间序列中提取趋势和季节成分后得到的一些随机数据。
时间序列的组成部分可以是加法或乘法版本。当季节性模式的幅度随着数据值的增加或减少而增加或减少时,乘法模型是优选的。当季节模式的幅度与数据值不相关时,最好使用加法模型。
加法和乘法季节性——资料来源: kourentzes
在加法版本中,季节性模式的幅度仍然与上升趋势无关,而在乘法版本中,它随着时间序列趋势的增加而增加。
如何获取股价数据?
我们可以通过使用请求包创建一个 API 请求来获取股票价格。我们也可以使用 quandl 包,它被设计用来提供金融和经济数据。
我们将通过创建一个 API 调用从 alphavantage 网站提取美国股票的价格。使用下面的代码片段,我们提取了 IBM 的每日股票价格。您可以参考此链接来更改您的请求需求。
为了使用 quandl 包将数据导入 python,您可能需要安装 quandl 包。输入命令**!pip 将 quandl** 安装到您的 Jupyter 笔记本中,您就可以开始了。我们已经导入了 Infosys (BOM500209)的价格,并将使用这些价格进行进一步的分析。关于 quandl 以及如何充分利用它的更多文档可以在这里找到。
对于这两种方法,您都需要创建一个 API 键,用于获取数据。你可以通过点击这些链接轻松获得你的 API:alpha vantage和 quandl 。
现在我们已经得到了数据,我们需要绘制它来获得趋势的概貌。
趋势会像股票一样经历一些起伏。这不是季节性的,因为季节性因素并不能提供更清晰的情况。除了一些观察结果,残差的方差似乎保持不变。
检查平稳性
对于 ARIMA,必须使时间序列静止以便进一步分析**。**对于一个平稳的时间序列,它的统计特性(均值、方差等)在整个序列中都是相同的,与你观察它们的时间无关。平稳的时间序列没有长期可预测的模式,如趋势或季节性。时间图将显示序列大致具有恒定方差的水平趋势。
滚动统计
我们可以绘制滚动平均值和标准偏差,以检查统计数据是呈上升趋势还是下降趋势。如果这些统计数据随时间变化,那么时间序列很可能是非平稳的。
ADF 和 KPSS 试验
为了检验时间序列的平稳性,我们还将使用 ADF (增广的 Dickey-Fuller) 检验和 KPSS **(科维亚特科夫斯基-菲利普斯-施密特-辛特斯)**检验。ADF 检验的零假设是时间序列不是平稳的,而 KPSS 的零假设是平稳的。
时间序列的平稳性检验
我们可以看到,随着股票价格的上涨和下跌,滚动平均线会随着时间的推移而上升和下降。ADF 检验的 p 值大于 0.05,这意味着我们不能排除零假设。KPSS 检验的 p 值低于 0.05,这意味着我们拒绝零假设。所有这些检验的结论是,时间序列不是平稳的。
时间序列如何去趋势化?
**求差:**通过对当前时间与其前一时间的实际观测值求差,计算当前时间的值,构造新的序列。
值(t) =实际观察值(t) -实际观察值(t-1)
**转换:**使用乘方、平方根、对数等转换数值有助于数据线性化。例如,记录这些值有助于获得具有指数趋势的序列的线性趋势。 log(exp(x))=x
**季节差异:**时间序列的值是通过一个观测值与其前第 n 个观测值之间的差异来计算的。这有助于消除这种趋势
值(t) =实际观察值(t) -实际观察值(t-N)
**拟合模型:**我们可以用线性回归模型来拟合时间序列。它将符合时间序列的线性趋势。通过用模型预测的值减去实际观测值,可以计算出去趋势时间序列的值。
值(t) =实际值 _ 观察值(t) -预测值(t)
时间序列去趋势化后,ADF 和 KPSS 检验表明时间序列是平稳的。部分自相关函数(PACF)图表明,相关性存在于某些滞后。
分割数据集
列车测试分离
模型结构
为了预测价格,我们可以使用平滑法和 ARIMA 法。平滑方法可用于非平稳数据,而 ARIMA 要求时间序列是平稳的。我们还可以利用 auto_arima ,它使序列平稳,并确定 arima 模型的最佳阶数。
对于每一种方法,我们将对超参数的优化进行多次拟合,并将最优值用于最终模型。
简单指数平滑
当数据不包含任何趋势或季节性时,使用简单指数平滑或 SES。level (α)的平滑因子为观测值的影响提供了权重。α值越大,意味着越重视最近的过去观测,而值越小,表明预测时考虑的过去观测越多。
简单指数平滑
简单指数平滑片段
简单指数平滑预测
霍尔特指数平滑法
霍尔特的指数平滑法在预测时间序列时将趋势考虑在内。当数据中有趋势而没有季节性时使用。它计算平滑值(第一个等式),该值与 SES 中用于预测的值相同。趋势系数(β)为后续平滑值和之前的趋势估计值之间的差异提供权重。预测是平滑值和趋势估计的组合。
霍尔特指数平滑法
霍尔特的指数平滑片段
霍尔特指数平滑预测
霍尔特-温特斯指数平滑法
霍尔特-温特斯指数平滑法在预测时间序列时考虑了趋势和季节性。它使用用于计算时间序列中的水平分量、趋势分量和季节分量的公式来预测这些值。根据数据的季节变化,要么使用加法,要么使用乘法。
加法(来源: otexts
乘法(来源: otexts
自回归综合移动平均(ARIMA)
ARIMA 模型是自回归模型和移动平均模型的结合,并结合了差分法。自回归模型确定了一个观测值和一定数量的滞后观测值之间的关系。积分部分是实际观测值的差值,以使时间序列平稳。移动平均确定观测值和残差之间的关系,残差是通过对滞后观测值使用移动平均模型获得的。
自回归§ - >模型中滞后观测值的个数。也称为滞后订单。
积分(d) - >实际观测值的平稳性差值的次数。也称为差异程度。
移动平均线(q)——>移动平均线窗口的大小。也称为移动平均的顺序。
ARIMA 片段
ARIMA 天气预报
摘要
为了评估模型的性能,我们将使用均方根误差(RMSE)并比较哪个模型的性能优于其他模型。
RMSE 摘要
在这三个模型中,表现较好的模型是霍尔特的指数平滑法,它获得的 RMSE 最小。
在本文中,我们了解了时间序列及其组件,使用 API 调用和包获取数据,检查时间序列的平稳性,对时间序列进行去趋势化,用不同的类型对时间序列建模,以及最后对其进行评估。
你可以在这里找到笔记本供你参考。
用自回归预测模型预测印度新冠肺炎确诊病例总数
使用自回归预测 COVID 的全部确诊病例
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
作者图片
作为我之前关于新冠肺炎数据端点及其可视化的文章的续篇,这里有一个快速的方法可以让你建立一个简单的时间序列预测模型
对于那些不熟悉什么是时间序列预测的人来说:时间序列是按时间顺序索引(或列出或绘制)的一系列数据点。最常见的是,时间序列是在连续的等间隔时间点取得的序列。在预测设置中,我们发现自己在时间 t,我们对估计 Y(t+h)感兴趣,只使用时间 t 可用的信息。
我个人用过自回归预测模型。自回归是一种时间序列模型,它使用以前时间步长的观测值作为回归方程的输入,来预测下一个时间步长的值。这是一个非常简单的想法,可以导致对一系列时间序列问题的准确预测。
- 和往常一样,我们从导入所需的模块开始
import requests
import pandas as pd
from statsmodels.tsa.ar_model import AR
然后,我们从相应的端点获取所需的数据,并用它来训练自回归模型。
x = requests.get('https://api.covid19api.com/total/country/india/status/confirmed').json()
df = pd.DataFrame.from_dict(x)
model = AR(df['Cases'][:-1])
model_fit = model.fit()
在这里,为了进行培训,我只使用了截至 2020 年 4 月 17 日的数据,以便我可以用它来预测 2020 年 4 月 18 日的确诊病例总数,并将其与实际值进行比较。
现在,为了预测 18–04–2020 的值(即数据列表中的第 87 个值,因此预测值旁边的数字是 87),我已经将开始和结束索引参数作为输入数据的总长度传递给预测函数,这将给出所需预测的索引(即,如果我有 87 个值,则最后一个输入值的索引将是 86,作为开始和结束参数传递的值将是 87,告诉它预测第 87 个值)。
prediction_for_18_04_2020 = model_fit.predict(start=len(df['Cases'][:-1]), end=len(df['Cases'][:-1]))
prediction_for_18_04_2020
这给了我一个大概的预测。15879,非常接近实际值 15722
作者图片
供你参考:
传递自回归模型索引的数据时,将数据作为“[‘Cases’][:-1]”传递,以便仅传递数据帧的已确认病例列,并且“:-1”用于跳过最后一个值,即日期 18–04–2020 的值。
当你训练一个模型来拟合它时,拟合一个模型意味着在数据中找到一个模式。这就是我在培训过程中使用 model.fit()的原因。
开始和结束参数:这些参数用于定义要预测多少个值。在我的例子中,我为它们传递了相同的数字,因为我只想预测一个值。但是,如果您想让我们预测未来 4 天的确诊病例总数,那么在“开始”中,您将传递从预测开始的时间点的索引,在“结束”中,您将传递到需要预测值的时间点,即,由于您的列表在 86 索引处结束,您可以静态地传递“开始”作为 87,传递“结束”作为 90,或者如果您想要传递它 动态地在“开始”发送数据的长度,然后在“结束”传递总长度+ 3,这将会给你相同的结果
关于 statsmodels AR()库需要注意的一点是,它很难以“在线”方式使用(例如,训练一个模型,然后在新数据点出现时添加它们)。您需要根据添加的新数据点重新训练您的模型,或者只保存模型中的系数并根据需要预测您自己的值。
你可以在这里找到我的代码:
[## nischalmadiraju/新冠肺炎-用印度数据进行自回归预测
通过创建一个帐户,为 nischalmadiraju/新冠肺炎-用印度数据进行自回归预测的发展做出贡献…
github.com](https://github.com/nischalmadiraju/COVID-19-Autoregression-forecasting-with-indian-Data)
请随意浏览,如果您想让我介绍其他内容,也请在评论中告诉我
预测战争:经典预测方法与机器学习
我们将使用来自 kaggle 竞赛的数据 M5 预测-准确性。
任务是尽可能精确地预测沃尔玛在美国销售的各种产品的单位销售(需求)。
更准确地说,我们必须预测未来 28 天的日销售额。该数据涵盖了美国三个州(加利福尼亚州、德克萨斯州和威斯康星州)的商店,包括商品级别、部门、产品类别和商店详细信息。
数据是巨大的,对于这个演示,我将使用其中的一个子集,一个来自销售数据集中的产品。
我们的目标是将经典的时间序列分析技术与机器学习算法进行比较。
所有代码都可以在 GitHub 上获得。
谁会更好地预测未来?
竞争对手:
- 简单指数平滑
- 双指数平滑
- 三重指数平滑
- ARIMA
- 萨里玛
- 萨里马克斯
- 光梯度增强
- 随机森林
- 线性回归
下注吧!
加载要使用的包。
读取数据。
数据集的前 5 行。
要预测的目标变量是需求(该产品在该日期将售出多少件)。
日期从 2011 年 1 月 29 日到 2016 年 5 月 22 日,总共 1941 天。后 28 天是竞赛 _ 测试集,按照竞赛的指示,所以我们不知道需求(等于 0)。
为了训练和验证模型,我将数据分成两部分:训练和测试。测试装置不应与竞赛测试装置混淆。
测试集将具有与测试 competition_test 相同的长度,以模拟相同的条件。因此,它将由 2016 年 3 月 27 日**和 2016 年 4 月 24 日(28 天)**之间的日期组成。训练集将是所有其他先前的值。
从初始数据中分离出训练测试。
时间序列(训练-测试)线图。
我们有很多训练数据,过去 28 天是测试集。我们的目标是使用以前的值来预测它们。
接下来,我将创建一个预测数据帧来存储所有模型的预测。每个模型将是该数据框架中的一列。另外,一个 stats dataframe 存储每个模型的性能和执行时间。
训练和评估模型
我们将从简单的传统预测模型开始。不要低估他们。
简单指数平滑
这是简单移动平均的一种变体,称为指数加权移动平均(EWMA)或简单霍尔特-温特斯法。用于将其加载到 Python 的包称为 SimpleExpSmoothing。我们必须定义一个名为 span 的参数,它将等于数据集的季节周期。
自相关。
每个值与多达 60 个以前的滞后进行比较。
从自相关图中,我们可以清楚地看到,每 7 个滞后就有一个相关性峰值。这意味着当天的值和之前 7 天的值具有很高的相关性。我将设置 span 等于 7。经过训练,使用*。预测(x)* ,x=28 天,模型预测未来 28 天。将使用均方根误差进行评估。
简单的指数平滑。
简单指数平滑的性能。
那些投票支持简单指数平滑的人确实会失望。然而,让我们以 RMSE 为基准。
双指数平滑
简单指数平滑仅使用一个平滑因子α (alpha ),而双指数平滑添加了第二个平滑因子β (beta ),用于处理数据趋势。我们必须定义季节周期。
双重指数平滑。
双指数平滑的性能。
比 SES 好,但还是直线。我们能做得更好吗?
三重指数平滑
与霍尔特-温特斯最密切相关的三重指数平滑法增加了对数据中趋势和季节性的支持。
三重指数平滑。
三重指数平滑的性能。
现在我们正在做一些事情!TES 很好地捕捉到了数据的季节性,并且几乎总是接近测试数据。缺点是我们必须输入季节周期的数量。如果这个数字不是 7,性能会变差。
ARIMA
一个 ARIMA 模型由三部分组成:p,d,q
- p 是 AR 项的阶数。它是指用作预测值的 Y 的滞后数。
- q 是 MA 项的阶数。它是指应该进入 ARIMA 模型的滞后预测误差的数量。
- d 是使时间序列平稳所需的差分次数
自动选择 ARIMA 参数
我们将使用优秀的 auto_arima 包,它会自动发现 arima 模型的最佳订单。
让我们忽略季节性。如果我们加上季节性,这个模型将是 SARIMA,这将在后面讨论。
arima 的 auto_arima 结果。
ARIMA。
ARIMA 的表演。
这里使用的简单 ARIMA 模型没有考虑季节性。这是一个(5,1,3)模型。这意味着它使用 5 个滞后来预测当前值。涉及滞后预测误差数量的移动窗口的大小等于 1。使时间序列平稳所需的差值为 3。
该模型的性能比三重指数平滑法差。
萨里玛
它是 ARIMA 的扩展,接受一组额外的参数,专门描述模型的季节组成部分。
与 ARIMA 相比,我们将使用 2 个额外的参数:季节性=真实值和 m=7 。我们现在考虑季节性,并对模型说它等于 7。Auto_arima 运行的时间要长得多。
SARIMA 的 auto_arima 结果。
萨里玛。
萨里玛的表演。
这比简单的 ARIMA 好得多,事实上也比三重指数平滑法好得多!
萨里马克斯
使用以前的方法,我们唯一可以使用的数据是以前的历史数据。带有外生回归的季节性自回归综合移动平均引入了外部特征可以影响时间序列的思想。
我们将添加数据集的另一个特征,即 sell_price ,以帮助模型,并有望做出更好的预测。
萨里麦克斯。
SARIMAX 的 auto_arima 结果。
SARIMAX 的性能。
SARIMAX 运行时间更长。额外的功能减少了误差!
机器学习
机器学习模型,不能仅仅通过它本身以前的值来预测目标。他们需要特色。这就是我们将要做的,构造一些特征。
目标先前值的所有信息都将丢失。我们将创建要素来维护这些信息。
史上最大的 github gist。
数据集的前 5 行。
我将创建的功能相对较少且简单。
- 滞后 7:提前 7 天的需求值
- 滚动平均值 7_7:在滞后 7 上,计算前 7 天的滚动平均值。这意味着我们现在回到了 14 天前。
当滞后 7 捕获一天时,滚动平均 7 在单个特征中捕获关于 7 天的信息。
有人可能会想,哦,那么我们为什么不为每个滞后创建一个特征呢?滞后 1,2,3,…1885,…?我们可以创建一些,如滞后 6 和 8(我们看到它们在自相关图中很强),或滞后 14,30。然而,增加数据集的维度将是一个严重的问题。RAM 过载、巨大的执行时间、过拟合、相关性。
创建的其他功能包括:
- 每月需求平均值,最大值,最大值到最小值差值。这捕获了信息:该产品在 12 月、4 月等的平均销售额是多少。
- 每天每周平均值、中值、最大值
创建特征的函数。
为 ML 准备数据。
适合模型
适合三个 ML 模型。
使用滑动窗口通过模型进行预测
这部分需要更多的关注。我会解释的。
测试集由 28 天组成。假设是第 1,2,3…,28 天。还记得我们为训练集创建的特性 lag_7 吗?显然,我们将为测试集创建相同的特性。当我们为测试集的第一天创建这个特性时,它被创建得非常好。它提前 7 天(在训练集中)并复制该值。如果我们在第 10 天创建这个特性,它会提前 7 天。这是测试的第三天。我们不知道它的价值!
所以我们做了一个滑动窗口,一次向前移动一天。在每次迭代中,我们预测今天的价值。所以我们用我们的预测来填充测试集。当我们到达测试集中的第 10 天时,我们将具有先前的值,并且可以计算 lag7。
等等,你为什么使用长度为 15 的滑动窗口(max_lags=15)?功能 lag 7 需要至少提前 7 天的样本。特征滚动平均 7_7 需要提前 14 天。因此,为了成功创建要素,最小窗口大小应为 14。如果我们增加窗口的大小,它不会影响这些功能。他们不使用早期的值。但如果我们增加它,那么它将影响其他功能(每月平均需求等)。我尝试过增加它,但 rmse 减少了一点,执行时间增加了一点。
预测未知未来的滑动窗口技术。
光梯度增强
我调整了算法的参数以获得更好的性能。
光梯度增强。
光梯度增强的性能。
啊,LightGB…它从不让人失望。(但是,不要盲目的用在每个问题上。)
随机森林
我调整了树的最大深度以获得更好的性能。
随机森林。
随机森林的性能。
随机森林的表现也很好。
线性回归
线性回归。
线性回归的性能。
好老线性回归在这里是极好的!
所有竞争者的执行时间和 RMSE。
传统的预测方法要慢得多。
每个模型的均方根误差。越低越好。
在我们分析的最后,我可以说这只是一个基线实验。当然,可以创建更多的特征,然后通过特征选择技术来选择最佳数量,可以进行更多的超参数调整,这样的例子不胜枚举。
那么 ML 方法是否优于经典的时间序列预测方法呢?
也许是
这当然取决于问题。机器学习方法需要特征。如果我们只有时间序列的值,那么我们能够创建的唯一特征就是基于它们。这些将是滞后,移动平均线等,所以我们可以包括尽可能多的信息,而不需要做太多的栏目。只有 6 个特征的线性回归优于所有经典方法。通过特征工程使 ML 方法变得更好是数据科学家的职责。突出算法的不一定是模型,而是提供给算法的数据。
所以带 LightGB 的 ML 机型赢了战斗,但没打赢战争。
用 Python 和 Google Analytics 预测网络流量
实践教程
向业务经理展示未来:一步一步地创建 web 流量的时间序列预测,绘制成 GIF 图。
最终的结果是:一个美丽的图表描绘了我的 12 月份的交通会有多糟糕。
SolarPanelCompany 决定雇佣他们的第一个数据科学家:我。我对从零开始构建一切的挑战感到非常兴奋。我的目标是获得第一场速战速决的胜利,向车队展示我的价值。
第一周,一位营销经理惊慌失措地来到你的办公桌前:“你看!”他指着笔记本电脑的屏幕说,“在谷歌分析上,我看到我们的流量在上个月下降了!你的预测数据学习材料能做些什么来拯救企业吗?”。
“好吧,”我想“这不是真正的问题。”所以我换了一种说法:“你是在要求我证明我们是有下降趋势,还是只是季节性效应?”。他茫然地凝视着。“你是在问我,我们什么时候能希望它回升?—是的!正是如此!我明天和市场总监有个会议。我让你在那上面工作!”
如果这种情况发生在你身上,或者如果你想创建自己的网站流量的可视化预测,你就在正确的页面上!下面是的一步一步的指导,根据你的谷歌分析数据预测你网站的访客数量,作为奖励,让它成为商业人士喜欢的 GIF。简而言之,我们将使用 Prophet 包创建一个时间序列模型。
本指南包括 3 个步骤:
- 用 Python 调用您的 Google Analytics API 数据
- 使用 Prophet 构建您的模型
- 制作你的预测的 GIF 图(因为它很有趣)
1.连接到您的 Google Analytics API
这一步需要:谷歌分析帐户的管理员权限。如果你没有,你可以用一个 演示谷歌分析账号 然后简单的导入 csv 格式的数据。
这不是一个容易的步骤,但是 Google 创建了很多文档来帮助你完成。我将在这里提出一步一步的指南来获取流量。如果你对其他指标感兴趣(比如目标、浏览量等。)你需要看一看内容广泛的官方 Google 的管理 API 文档。
让我们导入我们的包:
第一个包裹是我们永远的朋友熊猫。最后两个包来自 Google,允许您调用 Google Analytics API。
如果你还没有访问 Google API 的权限,你需要在你这边激活它。下面的视频解释了这样做的所有步骤。
所以让我们开始开心吧。我们的第一段代码是调用键和右视图。请注意,您可以在谷歌分析账户的“设置>查看”中找到查看次数
在上面的部分中,第一行没有改变,但是第二行和第三行必须用你自己的访问键来改变。
现在我们将使用 Google API 文档中的代码。如果你不完全理解,没关系:如果你适当地修改了上面的段落,复制粘贴就可以了。
我们可以看到上面提到的“度量标准”。在我这边,因为我想做一个时间序列,所以我只关心流量维度,但也导入页面视图供以后分析。
这些代码块是谷歌为愿意获取他们数据的人提供的标准代码。
好了,现在你的数据在数据框中了。恭喜你!你成功调用了 Google API,第一步就实现了。
2.预测你的网络流量
所以我们有数据。这已经花了一些时间,但现在是有趣的部分:预测 SolarPanelCompany 的网络流量。
迈克尔·威尔森在 Unsplash 上的照片
为了开始预测谷歌分析流量,我们需要开始导入我们的包。我们将在这里使用脸书的先知。这个伟大的工具非常容易使用,因为它使用了与软件包 scikit 相同的语法。脸书自己使用他们所有的时间序列预测,无论是网络流量或其他。
让我们先探索一下,并检查我们的数据是如何做的。一个简单的情节就完成了任务。
我们已经可以在数据中看到很强的季节性。的确,这是关于太阳能电池板的数据。因此,季节性是可以预料的:随着阳光越来越强烈,它从 2 月到 7 月平稳生长。然后,到了八月,人们知道享受阳光已经太晚了,队伍就下降了。
回到我们的代码,让我们看看先知说了什么。脸书的先知要求你改变你的两个专栏的名字:
- 值列需要称为**‘y’**
- 时间戳需要是**‘ds’**并且是一个日期时间变量。
2.1 缺失数据
尽管脸书声称 Prophet 对缺失数据和异常值有很好的抵抗力,但去掉它们也未尝不可。尤其是在我们这种情况下:假设网站的跟踪崩溃了一两天,你不希望这个影响。
如果你有一些丢失的数据,就像我一样,你将把它们输入到一个新的数据框架中。您还需要给它赋值。我个人用的是 7 天均线。
然后我们把框架连接在一起,放上一个盖子和一个地板。楼层是“0 ”,因为你知道你不会有负流量。另一方面,cap 纯粹是“人在回路中”的工作,所以基于你的良好判断。这个顶部和底部将有助于创建模型的边界。
2.2 EDA
那会很快,因为我们没有那么多的功能;只有观察本身的价值。
我们看到,丢失的数据中不再有离群值,我们可以继续保留。
2.3 预测我们的网络流量:培训
用 Prophet 训练模型真的很简单。该团队复制了 scikit 软件包所使用的机制:。fit()和。预测()
创建模型
所以首先我们创建模型。有许多变化可以添加。下面我会解释我的选择。
- Changepoint_prior_scale:应对欠拟合。增加使趋势更加灵活(因此在视觉上扩大了终端漏斗)
- Changepoint_range:默认情况下,Prophet 只改变前 80%数据的趋势斜率。我在这里将它设置为 0.9,以包含 90%的数据。
- 季节性模式= '乘法’作为参数,因为季节性的影响越来越大。我们清楚地看到,我们的业务正在呈倍增趋势增长,而不是呈线性增长。
- 每年.季节性= 20。它是 10,但我想要更多。这个数字代表傅立叶级数。
如果你想在不同的标准下改编你的模型,我推荐看看脸书的先知 Github。
2.3.2 构建预测时间戳集合。
到目前为止,我们已经根据以前的数据训练了我们的模型。为了预测未来的 web 流量,我们首先需要创建未来的时间戳。在这里我将创造 60 天,也就是未来的两个月。
2.3.3 预测未来
开始了。在接下来的两行中,我们将通过 Google Analytics 预测我们的网站流量。
瞧!11 月和 12 月可以看到我的交通跳崖之美。
分析组件
现在 Prophet 有了另一个伟大的功能:它可以在一个图形中显示不同的组件。
已经有了一些有趣的结论:
- 总趋势是下降。要知道,我的增长是成倍增长的,因此 2020 年秋季将趋势大幅向下推。
- 每周趋势:周四到周六是最糟糕的时刻。如果我想做广告,周日是个好时机。
- 年度:非常有见地。我们可以在八月一日看到顶峰。另外,我们可以看到圣诞节搜索并没有带来多少收入。所以硕果累累的时期是 4 月到 10 月底。
这已经是一些很好的见解,我可以反馈给营销经理。我不仅可以建议他们应该花更多的广告预算,而且我还可以确认,是的,看到我们的流量下降是正常的。而且要到二月份才会恢复。
同样有趣的是将总体趋势与数据进行比较。我们可以在这里看到趋势的变化。
红线横线是趋势。红色虚线是趋势改变的点。
2.4 测试模型
太好了,现在我们已经完成了预测谷歌分析流量的大部分工作。但作为严谨的数据科学家,我们也想测试模型。
时间序列的测试与传统模型略有不同。我们需要使用滚动窗口:滚动窗口意味着使用 60 天的数据,并评估它对未来 30 天数据的预测能力。
例如,在上面的图表中,红色部分用于预测绿色部分。在交叉验证后,红色部分将向前移动,以适应下一个 60 天,并再次预测下一个 30 天。这就是滚动窗户的概念。关于滚动窗口的文章已经够多了,所以我就不再赘述了。
就编码而言,它是这样写:
RMSE 在地平线上密谋
我们在这里。我们现在有了白天地平线上的 RMSE。我们可以看到,视野越远,误差越大。
现在为了你自己的工作,你可以玩模型的超参数来试着把这个推下去。因为我们使用这个图表是为了营销目的,而不是为了工程目的,这样的 RMSE 已经足够好了。
3.形象化
所以在第一部分,我获取了我的数据,在第二部分,我创建了模型。现在,是时候让它变得更好,让营销经理和 CMO 对此感到兴奋了。人类真理:有令人愉快的东西看会使它更有价值,所以是时候让我的工作有价值了。
纯粹为了吸引注意力,我创造了一个 GIF 图片。这种动画真的可以吸引人们的注意力,从而引起利益相关者对我的项目的兴趣。
3.1 数据绘图
让我们从导入包开始:
我们希望它朗朗上口,所以我们将直接从一个时尚的元素开始:深色背景。
黑色背景上的网络流量数据
非常好的效果。现在让我们画出我们的预测。
3.2 将预测绘制成 GIF
我们首先需要创建一个包含数据和预测的数据框架。
好了,这是容易的部分,现在我们将有大块来创建我们的 GIF。要在这里继续,一定要安装 PillowWriter 或 Imagemagick,它们可以将你的图像转换成 GIF 格式。
经典的 fig,ax matplotlib 操作的不同之处在于,我们需要创建函数来为图表制作动画。
ax.clear()操作超级重要。如果你像我一样没有把它放进去,动画会在之前的图形上创建一个新的图形。不可怕,除非…每个新图都有一种新的颜色。最终的动画将是一个快速闪烁的图形,每四分之一秒改变一次颜色。足以杀死癫痫患者。
一个艺术上的失败:我丢失了 90%的数据,创建了一个“派对”图,让人看了恶心。
请注意,如果您在笔记本中工作,您将不会在图表中看到动画。你必须下载创建的“animation_video.gif”才能真正看到动画。
你在这里,为你的长时间工作感到自豪,并准备好用你令人惊叹的动画震撼舞台。你现在可以知道你的企业的未来是什么样子了!
结论
从 Google Analytics API 获取数据后,我可以在 GIF 中绘制未来网络流量的时间序列。
这个视觉上吸引人的结果帮助营销经理和 CMO 明白,是的,如果流量在冬天下降是正常的。是的,它会在春天重新生长,那时太阳会回来,人们会考虑太阳能投资。
猜猜哪家公司开始加大对其数据团队的投资。
更进一步
你的业务经理不明白预测是如何工作的,也不明白你是如何工作的?你可能对如何向经理们解释预测建模感兴趣
附录
Jupyter 笔记本:https://github . com/Arthur mro/Prediction _ marketing/blob/master/Prophet _ GA _ cs _ info . ipynb
从多个数值天气预报预测风力
数据科学技术在可再生能源领域的应用。
随着美国和整个欧洲对风能生产重新产生兴趣,现在是重新审视可再生能源的可变性和可预测性等重要因素的时候了。
在本文中,我将讨论以下内容:
- 风能的可变性和可预测性
- 使用多种天气预测的挑战
- 处理混乱天气数据的技巧
- 特征工程
- 风电功率预测的非时间序列方法
风能的可变性和可预测性
可靠的能源需要具有低可变性和高可预测性。虽然适度的变化是可以容忍的,但不良的可预测性是不可接受的,并可能导致巨大的收入损失。
风能的可变性是由于对天气的强烈依赖,而天气在一天中会随季节而变化。因此,准确的天气预报对于实现有用的风力预测是必要的。
众所周知,天气预报的准确性随着预报范围的缩短而提高。此外,结合使用不同数值技术的模型预测可能是有益的。因此,风电场依赖于在一天或一周的不同时间生成的模型中的多种天气预测来源。
虽然天气无法控制,但风能行业可以利用人工智能技术的进步来提高能源的可预测性。
使用多种天气预测的挑战
我们来讨论一下在风力发电预测中使用多种天气预测时遇到的一些挑战。
- 不同高度可预测变量 :
风速随高度变化。不同的模型可能提供不同高度的速度数据,这使得在没有额外的风电场特定参数或公式的情况下,很难推断出跨模型的缺失值。 - 推断时间大量缺失数据 :
天气数据可能由不同时间生成的不同模型的预测组成。每一列可能有几个缺失的数据,因为在风力发电预测时并非所有的天气预测都是可用的。这种缺失数据不能通过简单的已知策略来估算,例如所有观察值的列平均值或行删除。
样本训练和测试数据中缺失的值在下面以黄色显示。
作者图片
作者图片
处理杂乱天气数据的技巧
下面概述了一些处理来自多个模型和不同时间的天气数据的技巧。
- 用来自同一模型的最近可用预测的平均值填充缺失值(按列,比如最近三个小时内)。
- 从最近可用的预测开始,用模型间的平均值填充其他缺失值。
- 如果仍然有更多的缺失值,使用风电场特定的参数和标准公式将风速从一个已知高度映射到另一个缺失速度的高度。
- 在一天的不同时间获得的天气预测可以由模型聚合,以减少特征空间和缺失值的数量。
- 为了生产中机器学习模型的健壮性,在数据管道中实现至少两个上述技巧是很重要的。
- 最后,如果剩余任何缺失值,则可以应用标准的行移除过程。
特征工程应该为每个模型计算这个变量。
添加不同高度的速度大小的标准偏差等特征可以提高预测精度。此外,根据来自多个风电场的一次性编码数据训练模型可能会比根据来自每个风电场的较少数据集单独训练产生更好的结果。
与风电场运行相关的重要特征,如在用涡轮机的比例,可以提高预测性能。该特性不适用于本文中的预测示例。因此,即使在风力发电场似乎要关闭时,也能获得一些电力预测。
Sweetviz 库用于探索变量分布和变量之间的关系。分布可以在这里找到,变量之间的关联如下所示:
图片由作者使用 sweetviz 库提供
速度幅度显示了与目标变量(产生的功率)的最强关联,如基于流体动力学领域的科学知识所预期的。这强调了在将数据驱动的解决方案应用于工程问题时,物理学的重要性。
预测风力发电的非时间序列方法
虽然从涡轮机或风电场产生的风力发电是具有一些季节性的时间序列,但是可以在不使用来自目标变量的滞后特征的情况下进行预测。此外,这种方法是稳健的,比时间序列方法更容易实施。
对应于测试集的功率生产不可用。因此,根据训练数据创建验证集来评估模型性能。新的训练集是原始训练数据的 80 %,数据中的每个观察值代表一个由名为 ID 的特征索引的每小时报告。
XGBoost 算法用于预测六个风电场的每小时风力发电量。累积绝对百分比误差(CAPE)用于评估模型性能。
def cape_func(y_true, y_pred):
return 100*np.sum(np.abs(y_pred-y_true))/np.sum(y_true)
六个不同风电场的风力(MW)与 ID(每小时产生的风力指数)的曲线图如下所示。
作者图片
作者图片
作者图片
作者图片
作者图片
作者图片
模型的性能在不同的风力发电场之间有明显的差异,这表明有一些特定于风力发电场的变量可能会改善预测。此类变量的示例包括预测时正在使用的风力涡轮机的比例和总装机容量。
风电场 6 获得了最佳性能,其 CAPE 值为 21.7%。这个预报例子的 Jupyter 实验室代码包括混乱的天气数据清理可以在这里找到。
接下来的步骤
将使用此处描述的非时间序列方法实施人工神经网络算法,并与 XGBoost 结果进行比较。此外,将研究使用长短期记忆(LSTM)算法的时间序列方法。此外,时间序列和非时间序列方法的所有模型都将使用 CAPE 指标进行评估。
结论
讨论了风能的可变性和可预测性以及在风力发电预测中使用多种数值天气预测的基础。
需要小心处理大量缺失数据和预测变量高度的不匹配,并提供了一些应对挑战的技巧。
此外,在将数据驱动的解决方案应用于工程问题时,相关物理学知识也至关重要。
最后,在不使用基于目标的滞后特征的情况下,使用数值天气预测和风电场特定变量来预测风力。
什么更有趣?你可以通过我下面的推荐链接订阅 Medium 来获得更多我和其他作者的启发性文章,这也支持我的写作。
阅读 Abiodun Olaoye(以及媒体上成千上万的其他作家)的每一个故事。您的会员费直接支持…
aolaoye.medium.com](https://aolaoye.medium.com/membership)
资源
- Bertrand,f ., 强大的 EDA(探索性数据分析)只用两行代码使用 Sweetviz
- 数据来源:https://challengedata.ens.fr/participants/challenges/34/
用随机模型预测
使用 ARIMA 模型预测沃尔玛的销售数据
我们都想知道未来。想象一下,如果我们知道未来会发生什么,我们会拥有多大的力量,我们可以改变它以获得更合适的结果,为财务收益打赌,甚至更好地制定预算。虽然我们不能完全确定未来会发生什么,但我们可以对未来可能发生的事情建立某种直觉。
我们经常从自我提升的倡导者那里听到,通过反思我们过去的行为,我们可以区分我们是如何到达我们现在的人生阶段的。因此,在某种程度上,我们可以预测我们的生活轨迹,如果我们继续在特定的道路上。这是时间序列分析的精髓。如 Adhikari,R .和 Agrawal,R. (2013)所述。*关于时间序列建模和预测的介绍性研究,“*时间序列建模的主要目的是仔细收集和严格研究一个时间序列的过去观测值,以开发一个描述该序列内在结构的合适模型。然后,该模型用于生成序列的未来值,即进行预测。因此,时间序列预测可以被称为通过了解过去来预测未来的行为
“现在是过去决定的积累”——未知
一个流行的和经常使用的随机时间序列模型是 ARIMA 模型。它假设时间序列是线性的,遵循特定的已知统计分布,如正态分布,并具有其他模型的子类,如自回归(ar)模型、移动平均(MA)模型和 ARIMA 模型所基于的自回归移动平均(ARMA)模型。在有效地将 ARIMA 模型应用于一个问题之前,我们应该了解一些关于我们的数据的事情,你会在这篇文章结束时明白的。
需要知道的事情——时间序列的 4 个主要组成部分:
趋势 →一个时间序列在很长一段时间内增加、减少或停滞的倾向。
季节性 →一年内有规律且可预测的波动。
周期性 →周期性重复的系列中期变化。
不规则性 →不可预测的不规则影响,不会以特定模式重复。
数据
要下载数据,点击此链接并按照说明进行操作。
我将在本文中使用的数据来自 Kaggle 上的 M5 预测准确性竞赛,该竞赛目前仍在进行中(在撰写本文时)。这场比赛向竞争对手提出了挑战,他们已经获得了来自 3 个不同州(加利福尼亚州、德克萨斯州和威斯康星州)的分层销售数据,以预测未来 28 天的销售情况。要访问本文中生成的代码,可以在我创建的 Kaggle 笔记本上找到,可以在这里或下面的链接中找到。
使用 Kaggle 笔记本探索和运行机器学习代码|使用来自 M5 预测的数据-准确性
www.kaggle.com](https://www.kaggle.com/kurtispykes/a-look-at-arima-model-for-forecasting)
下面是我们必须导入的框架,以执行手头的任务。
import numpy as np
import pandas as pdimport matplotlib.pyplot as plt
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacffrom statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.stattools import adfuller
我对数据做了一些预处理,以利用它的层次结构。
# store of the sales data columns
d_cols = full_df.columns[full_df.columns.str.contains("d_")]# group columns by store_id
df= full_df.groupby(full_df["store_id"]).sum()[d_cols].T
df.head()
图 2:按 store_id 分组的数据
本次竞赛基于 RMSE(均方根比例误差)进行评估,RMSE 源自 MASE ( 平均绝对比例误差),MASE 设计为不变且对称,您可以在此处了解更多关于预测准确度指标(本次竞赛的不同之处在于,MASE 中的 **A(绝对)**替换为均方差的 S(平方),我们取 RMSE 的根)。
平稳性概念
理解平稳性的概念是很重要的,因为它对我们可以用数据来预测未来值的模型类型有很大的影响。当一个时间序列的性质不依赖于该序列被观察的时间时,我们称之为平稳的。平稳性的一些标准如下:
- 时间序列中的常数均值
- 时间序列中的恒定方差
- 没有季节性
简而言之,从长期来看,一个稳定的时间序列没有可预测的模式。对于数学家来说,当联合分布在一段时间内保持不变时,就知道随机过程是平稳的。让我们看看数据中的一些随机项目,看看它们是否是平稳的。
ARMA 模型是自回归模型和移动平均模型的组合。这种传统方法要求数据是静态的,然而,在现实世界中,事情并不总是像我们预期的那样发展。事实上,在现实世界中,数据更有可能是非平稳的,因此诞生了 ARIMA,它使用一种称为差分的巧妙技术来使非平稳数据平稳。
区别
差异计算原始序列中连续观测值之间的变化,这有助于稳定平均值,因为它消除了序列水平的变化,这具有消除(或减少)季节性和趋势的效果。这种技术广泛用于非平稳数据,如金融和经济数据。ARIMA 模型采用差分技术将非平稳时间序列转换为平稳时间序列。我们可以用数学方法表示差分数列,如图 2 所示。
图 2:第一个区别
当差分数据看起来不稳定时,我们可以进行第二次差分——在实践中几乎不需要超过第二阶——这可以用数学方法表示在图 3 中。
图 3:二阶一阶差分公式。
我们还可以得到同一季节的一个观测值和另一个观测值的差异。这种现象被称为季节差异。
图 4:一级季节性差异公式
有时,我们可能需要取普通的差值*(这是我们在图 2 中讨论的差分技术。被称为第一差异,意思是滞后 1)和季节差异,使我们的数据平稳。*
图 5:第一差异和季节差异的公式
在 python 中,我们可以使用可视化和/或单位根测试来确定我们的数据是否需要差分——没有其他方法来确定平稳性。有许多不同的单位根检验有不同的假设,但我们将使用迪基-富勒。下面我将想象一个商店,并在你看 dickey-fuller 测试的结果之前,尝试确定你是否认为它是稳定的。
图 6:每个商店的总销售额——注意,我已经照亮了商店“CA_1”。在笔记本中,你可以点击任何一家你想照亮的商店,或者同时想象它们。
# Dickey-fuller statistical test
def ad_fuller(timeseries: pd.DataFrame, significance_level= 0.05):
non_stationary_cols= []
stationary_cols= []
for col in timeseries.columns:
dftest= adfuller(df[col], autolag="AIC")
if dftest[1] < significance_level:
non_stationary_cols.append(
{col:{"Test Statistic": dftest[0],
"p-value": dftest[1],
"# Lags": dftest[2],
"# Observations": dftest[3],
"Critical Values": dftest[4],
"Stationary": False}})
else:
stationary_cols.append(
{col:{"Test Statistic": dftest[0],
"p-value": dftest[1],
"# Lags": dftest[2],
"# Observations": dftest[3],
"Critical Values": dftest[4],
"Stationary": True}})
return non_stationary_cols, stationary_colsnon_stationary_cols, stationary_cols= ad_fuller(df[stores])
len(non_stationary_cols), len(stationary_cols)
>>>> (10, 0) non_stationary_cols[0]
图 7:商店 CA_1 的扩充 DIckey-Fuller 结果。
p 值大于我们设定的显著性水平(0.05),因此我们不拒绝数据中存在单位根的零假设。换句话说,我们的数据是不稳定的——它不符合我们上面描述的平稳性标准,因此我们必须做一些差分来使我们的数据变得稳定。熊猫有一个很酷的功能DataFrame.diff()
为我们做到这一点——你可以在这里的文档中读到更多。
# making the data stationary
df["lag-1_CA_1"]= df["CA_1"].diff().fillna(df["CA_1"])
ACF 和 PACF 图
ARIMA 模型具有必须定义的超参数 p、d 和 q。自相关函数(ACF)和偏自相关函数(PACF)图使确定模型的 p 和 q 阶变得更加容易。
ACF 图显示了时间序列的自相关性,这意味着我们可以测量 y_t 和 y_{t-k}之间的关系。最简单的方法是把它作为一个时间序列和它本身的滞后之间的相关系数。
注:“y_t”表示下标。
PACF 图显示了消除滞后效应后 y_t 和 y_{t-k}之间的关系。如果我们想到相关性,就是变量的相互依赖。“部分”相关性指的是它们之间的相关性,这种相关性不能用它们与一组特定的其他变量的相互相关性来解释。当我们对自相关进行调整时,我们说的是时间序列和滞后本身之间的相关性,这种相关性不能用较低阶滞后的相关性来解释。
这是了解 ACF 和 PACF 地块的绝佳资源。
让我们看看我们的一些可视化…
_, ax= plt.subplots(1, 2, figsize= (10,8))
plot_acf(df["lag-1_CA_1"], lags=10, ax=ax[0]), plot_pacf(df["lag-1_CA_1"], lags=10, ax=ax[1])
plt.show()
图 8:lag-1 _ CA _ 1 的自相关函数和偏自相关函数;正如在确定 ARIMA 模型中 AR 和 MA 项的阶次中所述,仅通过检查 PACF,您就可以确定需要使用多少 AR 项来解释时间序列中的自相关模式:如果偏自相关在滞后 k 处显著,而在任何更高阶滞后处不显著——即,如果 PACF 在滞后 k 处“截止”——那么这表明您应该尝试拟合 k 阶的自回归模型;
这表明我们应该尝试用 AR(8)模型来拟合我们的数据,我已经在下一节中这样做了。
滞后/后移符号
滞后/后移记数法是一种非常有用的记数方法。不同的来源使用不同的符号来表示滞后 L 或后移 b。
图 9:后移运算符符号
自回归 AR§模型通过使用变量的过去变量的线性组合来生成预测。我们可以认为自回归是变量对自身的回归。
图 10:自回归模型(没有滞后/后移符号)
另一方面,移动平均 MA(q)模型在类似回归的模型中使用过去的预测误差而不是过去的值。因此,我们可以把每个预测值看作是过去几个预测误差的加权移动平均。
图 11:移动平均模型(没有后移符号)
ARIMA 模式
条条大路通这一点。如果我们结合差分,我们的自回归模型和移动平均模型,我们得到 ARIMA(p,d,q)。
图 12: Arima 公式。资料来源:Hyndman,R.J .,& Athanasopoulos,G. (2018) 预测:原则与实践,第二版,OTexts:澳洲墨尔本。OTexts.com/fpp2.2020 年 9 月 6 日访问
注意,用滞后符号来表示 ARIMA 模型通常要容易得多。你可以在这里了解更多关于如何做这件事的。
p =模型的自回归部分的阶
d =我们的模型中的一阶差分的程度
q =模型的移动平均部分的顺序
图 13:ARIMA 的特殊情况。资料来源:Hyndman,R.J .,& Athanasopoulos,G. (2018) 预测:原则与实践,第二版,OTexts:澳大利亚墨尔本。OTexts.com/fpp2。于 2020 年 9 月 6 日访问
# fitting the model
model= ARIMA(df["lag-1_CA_1"], order=(8,1,0))
results= model.fit(disp=-1)# visualizing the fitted values
fig= go.Figure(data=
[go.Scatter(x= df["date"],
y= df["lag-1_CA_1"],
name= "original",
showlegend=True,
marker=dict(color="blue"))])
fig.add_trace(
go.Scatter(x= df["date"],
y=results.fittedvalues,
name= "fitted values",
showlegend= True,
marker=dict(color="red")))
fig.update_layout(
title="Fitted values",
xaxis_title="Dates",
yaxis_title="Units Sold",
font=dict(
family="Arial, monospace",
size=14,
color="#7f7f7f"
)
)
fig.show()
图 14:ARIMA 模型的拟合值。
我们可以仔细看看…
# a closer look
_, ax= plt.subplots(figsize=(12,8))
results.plot_predict(1799, 1940, dynamic=False, ax=ax)
plt.show()
图 15:实际值与预测值的对比
为了了解我们如何与实际预测进行对比,我们必须首先回到数据的原始规模进行比较。我们可以在 pandas 中使用一个有用的cumsum()
函数— 文档。
compare_df= pd.DataFrame({"actual": df["CA_1"],
"predictions": pd.Series(results.fittedvalues.cumsum(), copy=True),
"d": df["d"]}).set_index("d")
compare_df.loc["d_1", "predictions"]= 0
然后我们绘制这个…
图 16:模型的实际与预测。
我参加这个比赛有点晚,但仍然有足够的时间来改善这个结果(我将与大家分享)。
有用资源:工作流程指南
Rob Hyndman 在《预测:原则与实践》一书中提供了一个非常有用的流程图。在线书籍的链接将在下面的其他资源部分。
图 16:ARIMA 流程图。资料来源——hynd man,R.J .,& Athanasopoulos,G. (2018) 预测:原理与实践,第二版,OTexts:澳大利亚墨尔本。OTexts.com/fpp2.2020 年 09 月 06 日访问
一锤定音
感谢您花时间阅读这篇文章。我是一名自学成才的数据科学家,来自英国伦敦。可以通过 LinkedIn 和 https://www.linkedin.com/in/kurtispykes/的联系到我。请不要犹豫联系我,认识新朋友是很棒的。
其他资源:
利用 web 流量数据进行预测
不使用时间序列的预测
介绍
通常,当您访问时间序列数据时,在这种情况下,我们将查看一个例子,其中我们有一周的 web 流量数据,本能地应用时间序列模型。然而,情况并不总是如此,我将在这篇博文中进一步说明原因。
在这篇文章中,你将学会如何:
- 设置您的分析数据集以预测未来的事件,即网络用户是否会在第二天成为销售线索
- 创建辅助预测的附加要素
- 识别并绘制特征重要性
- 利用强大的分类技术进行时间序列预测
数据概述
**数据问题:**预测某网站用户第二天是否会成为 lead?
**数据集:**提供了一个为期一周的网站流量样本数据集,包括三个变量:用户 id、事件(“查看”、“搜索”或“引导”)和时间戳(日期和时间)
**建议方法:**为了预测用户第二天是否提交线索的可能性,我们需要了解用户前一天或前几天的活动以及网站上的聚合活动。为此,我们需要创建功能。
R 中的建模
加载库和导入数据集
library(data.table)
library(dplyr)
library(padr)
library(xgboost)
library(Matrix)
library(RcppRoll)
library(zoo)
library(readr)
library(sqldf)data_interactions<-read_csv("C:\\Users\\srivastavas\\Downloads\\data-interactions\\data-interactions.csv")
数据询问
一旦数据集被加载,查看数据集以确保它被正确读入总是有帮助的。如下所示,我们可以看到数据集由四列组成:事件类型(“查看”、“搜索”或“潜在客户”)、用户 id(唯一标识符)、时间戳(用户访问网站的时间和日期)以及日期。
# A tibble: 6 x 4
event userid utc_timestamp date
<fct> <chr> <dttm> <date>
1 view 4c02df98-fee3-43dd-8582-4192180a52c8 2019-01-17 03:49:36 2019-01-17
2 search bcc02079-d9d6-461a-bb7a-6ad679dc3ddb 2019-01-19 22:33:14 2019-01-19
3 search 4443b108-11aa-44e8-9934-a9c75e7a5b2e 2019-01-20 06:54:42 2019-01-20
4 search a8513b28-c94b-49b4-9260-07f9ce8a24aa 2019-01-17 23:33:44 2019-01-17
5 search 261eb70e-af13-4d0c-a2d8-7c2095586b2d 2019-01-20 01:28:01 2019-01-20
6 search 7d670d0a-f815-4ce1-955a-f026f478ebb5 2019-01-17 22:42:44 2019-01-17
时间变量和唯一标识符是我喜欢称之为“垃圾”的变量。它们对模型的预测没有帮助。然而,在我们的案例中,时间是一个重要的特征,因为我们想知道用户是否会在第二天成为销售线索。个人用户 id 也很重要。那么,我们如何还能利用这些信息。
这让我想到了建模的下一个部分——特征工程。
特征工程
由于用户每天可能会查看或搜索一个网站一次或多次,因此有必要汇总这些信息,以减少每个用户的记录数量,同时能够创建每日数据集,即每个用户每天一条记录。这可以用 R 的 dplyr 包或者 sqldf(用 R 写 SQL 代码)来完成。
在下面的代码片段中,我按照日期和用户 id 对数据集进行了分组,以计算每个用户每天的查看次数、搜索次数和线索数。
sql_str<-"select userid, date
, SUM(CASE WHEN event = 'leads' THEN 1 ELSE 0 END) AS num_leads
, SUM(CASE WHEN event = 'view' THEN 1 ELSE 0 END) AS num_views
, SUM(CASE WHEN event = 'search' THEN 1 ELSE 0 END) AS num_searches
FROM unique_data_interactions
GROUP BY userid, date"df1<-sqldf(sql_str,stringsAsFactors = FALSE)
接下来,为了有意义地使用日期变量,我们可以创建与时间相关的变量,如访问网站的日期、访问时间、访问月份和访问周。因为我们只有一周的时间,所以只有访问日(即星期日与星期一)可能有用。下面的代码可以用来创建与时间相关的变量。
df1$day<-as.numeric(as.factor(weekdays(as.Date(df1$date))))
现在,因为我们希望预测某个用户第二天是否会成为潜在客户,所以我们希望了解该用户以前的活动。例如,用户是在前一天还是前一天、三天前浏览网站的?他们以前也搜索过网站吗?
为了使用以前的活动来预测未来的活动,我们需要创建滞后变量。因为我们想要预测某个用户第二天是否会成为销售线索,所以我们使用前一天的活动来预测第二天的活动。
首先,你需要按日期排列数据。然后,您希望按 userid 对数据进行分组,因为您希望预测给定用户是否会在第二天成为销售线索。
为了预测用户第二天是否成为潜在客户,我们需要知道客户前一天是否是潜在客户(滞后 num _ leads 1),他们前一天是否查看和搜索了网站(滞后 num_views 和 num _ searches 1),以及到目前为止的查看和搜索总数(cum_sum_views 和 cum_views_searches)。
df1<-df1[order(df1$date),]#Create lag variablesdf2<-df1 %>%
group_by(userid) %>%
mutate(lag_leads_1 = lag(num_leads,1) #lag target variable by 1
, cum_sum_views = cumsum(num_views)
, cum_sum_searches = cumsum(num_searches)
, lag_views_1 = lag(num_views,1) #lag num_views by 1 day
, lag_searches_1 = lag(num_searches,1)#lag num_searches by 1 day
)
在时态数据中,通常会创建一些变量,如滚动平均值、滚动中值平均值和各种滞后变量,但由于我们只能访问一周的数据,这些变量似乎并不合理。
现在,如果我们有用户前一天的信息,我们只能预测用户第二天是否会成为潜在客户。例如,如果用户仅在周末(第 7 天)出现在数据集中,则很难测试该用户的模型准确性,因为我们没有关于该用户是否成为销售线索的信息。因此,此类记录已从数据集中删除。
#remove users who don't have previous day records as can't predict next day lead for them
df3<-df2[!is.na(df2$lag_leads_1),]
第二件要做的事情是决定一个模型。由于问题是确定用户 a 是否在第二天成为销售线索,这是一个二元问题,也是一个分类问题,即用户成为销售线索= Success = "1 ",用户没有成为销售线索= Failure = "0 "。为了对这个问题建模,我们需要如下对这个目标变量进行特征工程。
df3$lead_flag<-ifelse(df3$num_leads>=1, 1, 0)
准备分析数据集
我们已经删除了重复的记录,创建了每个用户每天一条记录的每日数据集,并创建了时间相关变量和我们的目标变量(我们希望预测的变量)。
下一步是现在决定我们如何训练和测试我们的模型。在大多数情况下,随机拆分数据是有意义的,即随机的行子集成为训练集,其余的成为测试集。通过这种方式,您的模型在数据集上接受训练,然后在从未见过的数据上测试准确性。
但是,当您拥有时态数据时,您预测的是未来的某个时间,因此数据集应根据时间进行拆分,即数据集的前 75%用于训练(即周一至周四),其余部分用于测试(周五至周日)。由于我们的数据集只有一周,这种划分似乎不合理。
在我们的示例中,我们希望预测某个特定用户是否会成为潜在客户。因此,按用户 id 分割数据集是有意义的,其中模型针对一组特定的用户进行训练,然后针对从未遇到过的用户进行准确性测试。为了以这种方式分割数据,编写了以下代码。
#Subset data into training and test sets - split on different users
user_ids<-as.data.frame(unique(df3$userid))
names(user_ids)<-"user_ids"
train_user_ids<-sample_frac(user_ids,0.75)
names(train_user_ids)<-"user_ids"
train <-df3[df3$userid %in% train_user_ids$user_ids,]
test <- anti_join(df3, train, by = c("userid" = "userid"))
一旦你有了训练集和测试,你就可以开始建模了!😃
运行模型
对于二进制分类,您需要一个分类模型。基于树的方法通常用于二元分类。一种流行的基于树的方法是 xgboost,它从每一棵新树(迭代)中学习,试图减少错误的百分比。与最终结果是一组树或平均加权树的随机森林不同,最终的 xgboost 决策树是所有回合中错误率最低的一个。
众所周知,randomforest 和 xgboost 在试图改进之前的迭代时会过度拟合数据;然而,由建模者决定提供给模型的变量是否独立(不相关),是否能提供信息,是否以任何方式影响结果。
R 中的 xgboost 模型需要一个矩阵和定义的参数,如下面的代码片段所示。
xgboost 模型需要以下步骤:
- 定义目标变量—“标签”
- 删除 NAs
- 创建一个包含要包含在模型中的变量的矩阵(当数据集中有标称/分类变量时,使用 contrasts.arg)
- 为您的模型设置参数—使用二元逻辑函数,因为这是一个分类问题,不需要非常深的树(导致过度拟合,所以只指定了四个级别;当你有一小组变量时,2 和 3 通常是好的)
set up model
label <- train$lead_flag
#returns object unchanged if there are NA values
previous_na_action<-options('na.action')
options(na.action='na.pass')#build matrix input for the modeltrainMatrix<- sparse.model.matrix(~num_views+num_searches+day+lag_leads_1+cum_sum_views+cum_sum_searches
+lag_views_1+lag_searches_1
, data = train,
, contrasts.arg = c('day')
, sparse = FALSE, sci = FALSE)
options(na.action=previous_na_action$na.action)#create input for xgboosttrainDMatrix <- xgb.DMatrix(data=trainMatrix, label = label) #set parameters of model# Define the parameters for binomial classificationparams <- list(booster = "gbtree",
objective = "binary:logistic",
eta=0.3,
gamma=0,
max_depth=4,
min_child_weight=1,
subsample=1,
colsample_bytree=1)
当您的模型正在训练时,您可以使用一种叫做 交叉验证的方法来测试它的准确性。 在交叉验证中,你运行多个不同的训练测试拆分,然后平均结果,而不是完全依赖单个特定的训练集。最常见的交叉验证类型是 K 重交叉验证,最常见的是将 K 设置为 5 或 10。例如,为了进行五重交叉验证,将原始数据集划分为大小相等或接近相等的五个部分。这些部分中的每一个都被称为“褶皱”。然后训练一系列五个模型,每个折叠一个。第一个模型:模型一,使用折叠 2 至 5 作为训练集进行训练,并使用折叠 1 作为测试集进行评估。第二个模型:模型 2,使用折叠 1、3、4 和 5 作为训练集进行训练,使用折叠 2 作为测试集进行评估,以此类推。当这个过程完成时,我们有五个精度值,每个折叠一个。通常取准确度分数的平均值。
您可以为交叉折叠验证设置您的模型,如下所示。在这里,我们指定了五轮交叉验证,告诉模型运行 1000 次迭代,但如果它不再显示任何准确性的提高,就提前停止(在第 20 轮)。
最后一行告诉我们,在哪个迭代中,模型生成的树具有最低的误差。在我们的例子中,输出是第 40 次迭代。
xgbcv <- xgb.cv( params = params, data = trainDMatrix, nrounds = 1000,
nfold = 5, showsd = T, stratified = T,
print_every_n = 10, early_stopping_rounds = 20, maximize = F)
num_iterations = xgbcv$best_iteration
现在,我们可以使用这些信息在训练集上运行我们的模型,并让它在第 40 次迭代时停止。我们还告诉我们的模型使用内置的错误度量来评估树以及 logloss 度量。
model <-xgb.train(data=trainDMatrix
, params=params
, nrounds = num_iterations
, maximize = FALSE
, eval.metric = "error", eval.metric = "logloss")
模型评估
功能重要性图告诉我们,模型中的变量是如何用来预测用户是否会在第二天成为潜在客户的。
在这里,我们可以看到当天的浏览量和搜索量是预测客户当天是否会成为销售线索的最重要的预测因素。我们还可以看到,尽管创建了滞后和累积变量,但它们并不十分有用。然而,这是意料之中的,因为数据集覆盖了一周的很短的时间范围。
importance<-xgb.importance(feature_names=colnames(trainDMatrix), model=model)
xgb.ggplot.importance(importance_matrix=importance)
下一步是测试模型的准确性。这需要将测试数据集设置为矩阵,并使用训练好的模型对测试集运行命令“预测”。
为了测试模型的准确性,我们在这里比较有多少 lead_indicator 值被模型正确分类为“0”或“1”。“预测”数据集在模型输出概率时被重新编码。任何大于 0.5 的概率都转换为“1”(是销售线索),任何小于 0.5 的值都转换为“0”(不是销售线索)。我们对测试集(testMatrix$label)中预测值(“预测”)等于原始值的所有实例求和,然后除以测试集的大小。
这里,我们得到 97.53%的准确率,或者 0.03 的错误率,这意味着测试集中所有用户的 97.53%被正确分类为他们是否会在第二天成为销售线索。
testMatrix<- sparse.model.matrix(~num_views+num_searches+day+lag_leads_1+cum_sum_views+cum_sum_searches
+lag_views_1+lag_searches_1
, data = test,
, contrasts.arg = c('day')
, sparse = FALSE, sci = FALSE)
options(na.action=previous_na_action$na.action)pred<-predict(model,testMatrix)
prediction <- as.numeric(pred > 0.5)
print(head(prediction))
err <- mean(as.numeric(pred > 0.5) != testMatrix$label)
print(paste("test-error=", err)) #average error is 0.03 very low so model is good result = sum(prediction==test$lead_flag)/length(test$lead_flag)
print(paste("Final Accuracy =",sprintf("%1.2f%%", 100*result))) #97.53%
如果你和我一样无法相信自己的眼睛,那么将测试集和预测结合起来,并排查看如下信息会很有帮助。在下图中,您可以看到,对于 2019 年 1 月 15 日,并非所有用户都在这一天成为销售线索,这些用户的预测值为“0”(非销售线索)。
如果我们的模型显示精度降低,我们可以使用 xgboost 参数,比如树深度、轮数、用于树分支分裂的最小行数。然而,在这种情况下,以如此好的精度,这是不需要的。
希望您现在已经很好地理解了如何对分类性质的时间序列数据建模!如有疑问,请在下方评论。
完整的代码文件可以在这里找到:
https://gist . github . com/shedoedasdatascience/fbdd 1b 52 c 5089 d3b 80 ba 512 f 969 e 704 c