TowardsDataScience 博客中文翻译 2020(七百零八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

在学习 PyTorch 基础知识的同时预测英雄联盟中的比赛

原文:https://towardsdatascience.com/predict-matches-in-league-of-legends-while-learning-pytorch-basics-3dd43cf8d16f?source=collection_archive---------48-----------------------

在 PyTorch 中为一个很酷的独特用例场景构建一个简单的逻辑回归模型的演练

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者理查德·索

《英雄联盟》是我一直以来最喜欢的游戏之一,尽管我真的很不擅长。LOL 是一个极具竞争力的 MOBA,两个 5 人的队伍*(蓝队和红队)*相互对抗,以摧毁对方的基地(nexus)。获胜通常需要大量的团队合作、协调,或者对于一个倾斜的玩家来说需要“运气”。不管怎样,对于一个联盟玩家(即使他们是相当新的)来说,根据游戏记录的死亡人数和许多其他数据来判断哪个队可能会赢并不太难。机器学习模型可以预测的东西…… (这应该是这篇文章执行得不好的铺垫)

我也开始用 PyTorch 学一点机器/深度学习(通过这个py torch Zero to GANs课程)。其中一个课程作业是用 PyTorch 为一些用例场景建立一个回归模型,因此,我们现在就在这里!当然,我们可以使用 *scikit-learn* 并称之为完成,但是对我(和你)来说,重点是学习构建 PyTorch 模型的基本原理。 这将是我通过构建一个简单的英雄联盟比赛预测器来学习 PyTorch 的过程中的一次演练,该预测器将合理准确地确定任何一队获胜的机会。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

xkcd

数据集

首先,我使用了大约 1 万场英雄联盟排名赛的 Kaggle 数据集。每场比赛的数据都是在开始的 10 分钟内收集的。所有的比赛都是由高钻石到低大师级别的玩家参加的。幸运的是,我没有需要填充的缺失值,也没有需要一次性编码的非数字数据。总而言之,不需要太多的数据操作。

首先,我们将导入所有必需的库:

我们会看到数据是什么样的:

df.read_csv('high_diamond_ranked_10min.csv')

这个数据集有 40 列,但其中一些实际上是多余的。例如,如果你知道蓝队(blueKills)的杀戮,这几乎直接转化为红队(redDeaths)的死亡。基于这个推论,我们只需要这两个中的一个。

df.drop(['gameId','redFirstBlood','blueTotalGold','redTotalGold','blueTotalExperience','redTotalExperience','redGoldDiff','redExperienceDiff','redKills','redDeaths'], axis=1, inplace=True)

这使得我们只剩下 30 列,包括标签列。这个数据集的标签*(我们想要预测的)*是列blueWins,0 或 1 表示蓝方是否在游戏的剩余时间内获胜。最后,我们将标签与功能分开…

targets = df[['blueWins']].values #only the `blueWins` column
features = df.drop('blueWins', axis=1).values #all the other columns

…拆分数据(80/10/10 拆分用于培训、验证和测试),并将它们转化为 PyTorch 张量…

test_size = int(.10 * 9879) *# 10% of the total size of the dataset*
val_size = test_size
train_size = 9879 - test_size*2
train_size , val_size, test_sizedataset = TensorDataset(torch.tensor(features).float(), torch.from_numpy(targets).float()) # turning arrays into tensorstrain_ds, val_ds, test_ds = random_split(dataset, [train_size, val_size, test_size]) # doing an 80/10/10 split on the data

…并用批处理大小128从它们中生成 DataLoader 对象。

batch_size = 128#making data loader objects out of the splits
train_loader = DataLoader(train_ds, batch_size, shuffle=True)
val_loader = DataLoader(val_ds, batch_size)
test_loader = DataLoader(test_ds, batch_size)

模型

好吧,这就是“有趣”的开始!是时候用 PyTorch 做 logistic 回归模型了。以下是我在构建这个过程中的思路:

  • 一个逻辑回归模型在我们的 PyTorch 模型中只需要一个nn.Linear层,接受 29 个输入,输出 1: nn.Linear(29, 1)
  • 因为我们预测的值是从 0 到 1,使用nn.Sigmoid()会将模型的输出缩小到这个范围。
  • 除了一个可能不可微的精度指标*(这将意味着梯度无法确定,而这是模型在训练期间改进所必需的)*,我们将如何计算模型的“错误”程度?快速浏览一下 PyTorch 文档可以得到成本函数:binary_cross_entropy
  • 因为准确性度量不能用于模型训练,并不意味着它不应该被实现!在这种情况下,准确性将通过阈值来衡量,如果模型预测和实际标签之间的差异低于该阈值,则进行计数。
  • 我们希望跟踪每个历元后的验证损失/精度,每次这样做时,我们必须确保梯度没有被跟踪。
  • 我们希望打印出每隔几个时期的平均验证损失和精确度。

综上所述,实现如下:

定义一些变量供以后使用。

我们的模型“LOLModel”的 python 类。

精度函数。

然后,我们需要做一个训练循环,并决定使用哪个优化器。对于优化器,在首先尝试 SGD 之后,我选择了 Adam:

定义训练循环,由“fit()”函数定义。

我们定义了一个evaluate()fit()函数,后者是主训练循环,它:

  1. 将一批数据输入模型
  2. 以设定的学习率应用渐变
  3. 根据验证数据测试模型,得出验证损失/准确性
  4. 将数据追加到数组history中进行绘图

训练&最后的揭示

总之,对于超参数,我训练了750个时期,学习率为0.0001:

model = LOLModel() #initiate the model

让我们首先确保数据正确地通过模型。

最终验证损失和精度分别为0.54940.7209(该模型中精度从 0 到 1 测量)

在这里,我们可以看到模型在每个时期迭代时验证准确性的变化。大约在公元 150 年有一个急剧的增长,并且在.8 accuracy since.附近徘徊

现在,在过去的 10%分割中测试模型(请击鼓!):

忽略’ val_loss ‘和’ val_acc '!

使用evaluate(),我们发现该模型在预测 LOL 比赛结果时的准确率约为 74.5%,不算太差!

结论

总而言之,我认为这是我的一次成功。我学到了很多关于在 PyTorch 中制作模型的基础知识,即使模型很简单。更酷的是:我很开心地看到我做的一些事情最终得到了很好的解决!希望你能像我做模型一样喜欢阅读这个过程。无论如何,快乐编码(或继续玩联赛)!

如果你想知道这个迷你项目使用的 jupyter 笔记本的来源,请看这里:https://jovian.ml/richardso21/lol-logistic

预测数据集中缺失的值

原文:https://towardsdatascience.com/predict-missing-values-in-the-dataset-897912a54b7b?source=collection_archive---------10-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

弗兰基·查马基在 Unsplash 上拍摄的照片

了解如何使用机器学习模型及其实现来预测数据集中的缺失值

真实世界的数据通常有很多缺失值。丢失值的原因可能是数据损坏或未能记录数据。在数据集的预处理过程中,缺失数据的处理非常重要,因为许多机器学习算法不支持缺失值。

有多种策略可以处理数据集中的缺失值,包括缺失值的预测。本文将介绍如何理解和实现通过使用机器学习算法预测缺失值来处理缺失值。

缺少值的列的类别:

  1. 分类(数字,对象)
  2. 连续变量(数值)

分类变量:

分类变量是一个变量,它可以取有限的、通常是固定的可能值。分类变量可以是字符串或数字类型。分类变量的一些可能的例子是:

  • 产品评级:1、2、3、4、5
  • 分类评级:差、满意、好、优秀
  • 性别:男,女

连续变量:

连续变量是可以取不可数的一组值的变量。例如,在实数的非空范围内的变量是连续的,如果它可以取该范围内的任何值。

为了预测分类变量,需要分类机器学习算法,如逻辑回归、SVM、朴素贝叶斯等。

要预测连续变量,需要回归机器学习算法,如线性回归、SVR 等。

[## 机器学习中处理缺失值的 7 种方法

处理数据集中缺失值的常用策略

towardsdatascience.com](/7-ways-to-handle-missing-values-in-machine-learning-1a6326adf79e)

准备数据集以预测缺失值:

使用的数据是来自 Kaggle泰坦尼克号数据集

若要预测数据集中缺失的值,请创建一个新的数据集,以便:

***new_data**: columns except the column with missing values
**target_class**: column with missing value*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),泰坦尼克号数据集样本

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),泰坦尼克号数据集的信息

在上面的样本数据集图像中,列 Age,Cabin,Embarked 包含空值或缺失值。

*如果我们首先要估算列 **Age 的缺失值,*用于训练模型以预测缺失值的新数据集将为:

***new_data**: columns except the column "Age"
**target_class**: column "Age"*

现在我们需要将数据分为训练数据和预测数据,在列年龄中没有缺失值的行将被声明为训练数据。从以上形成的数据集训练的模型可用于预测年龄列中的缺失值。

***training_data**: rows from new_data where column "Age" does not have missing values
**predict_data**: rows from new_data where column "Age" have missing values
**target_class_traing**: non-missing values in column "Age"*

栏目关联:

我们是否需要在具有所有剩余列的数据集上训练模型?有时,使用所有剩余列的训练模型比某些列更好地预测缺失值,但有时某些高度相关的列,由选择性高度相关列训练的模型往往会给出更好的结果。

如何找到列之间的关联?

Pandas 库有一个简单的单行实现来查找数据帧中所有列的相关性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供),Titanic 数据集中列之间的皮尔逊相关结果

*data.corr()*

上图显示了每列之间的皮尔逊相关系数值。PCC 测量两个变量 XY 之间的线性相关性。它的值介于+1 和-1 之间。值+1 表示完全正线性相关,0 表示没有线性相关,1 表示完全负线性相关。

计算列年龄和其他列之间的相关性,以找到与列年龄相关的列。从上表中可以看出,有 3 列与列年龄相关。

这些列是Pclass(PCC:-0.369226)SibSp(PCC:-0.308247)Parch(PCC:-0.189119)。

将数据集拆分成训练和预测数据:

选择与列年龄相似的 3 列,形成总共 891 行的数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分隔具有空值或缺失值的行以进行预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传**外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过对 X_train 数据集进行定型并预测 column Age 中缺少的值来准备机器学习模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实施:

(作者代码)

结论:

每个数据集都有需要智能处理的缺失值,以创建稳健的模型。在本文中,我讨论了预测缺失值的实现。没有以特定方式或使用特定模型来处理缺失值的经验法则,这种方法可以获得具有最佳性能的健壮模型。可以使用整个数据集来预测丢失的值或一些删除的列。了解数据集的领域知识非常重要,这有助于了解如何预处理数据和处理缺失值。

感谢您的阅读

预测 NBA 比赛,赚钱——机器学习项目

原文:https://towardsdatascience.com/predict-nba-games-make-money-machine-learning-project-b222b33f70a3?source=collection_archive---------22-----------------------

过去的表现并不能说明未来的表现…除非…我们能获得 136%的回报…?😉

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

mfw 我的深度学习模型编译//photomosh.com 制造

下注者和庄家没有太多的共同之处——人们可以把他们的关系描述为竞争。但在睡梦中,他们对同一个幻想垂涎三尺:一个历史表现如此完美的模型,它以精确的预测未来游戏的结果。有了深度学习,这可能成为可能——或者至少比以前的数据科学技术更容易。

我阅读了许多**好的和坏的期刊文章,看看这是否可能,下面是一些好的文章:
利用机器学习开发体育博彩市场
(2018)* 情绪偏差和资产价格:来自体育博彩市场的证据(2016) 美国国家篮球协会博彩中的情绪偏差***

潜在的假设是,NBA 市场是无效率的(价格或投注线并不反映游戏的所有可用信息)——并且可能比大多数市场更无效率,因为铁杆球迷的偏见只是押注于他们最喜欢的球队。如果你能赌赢市场的无效率,你就能赚钱。我们可以识别低效率的方法之一是分析硬数据。

尽管尝试这一挑战的许多模型都是精确的,但是大多数都离盈利还差得很远。原因很简单:博彩公司也非常准确。即使你匹配了庄家准确率,你也会因为 5%的投注费/房子边缘而输。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://www . football-data . co . uk/blog/NBA _ pinnacle _ efficiency . PHP

左边的图表是 bet365 资金线与实际获胜百分比。一个成功的模型必须从完美回归中预测庄家的微小波动。

*我的模型是用 Python 和 Tensorflow 构建的,分析了过去的 11 个 NBA 赛季,在许多方面,它与其他试图解决这个问题的深度学习模型相似,但有一个关键的不同——它使用一个定制的损失函数来**与博彩公司去相关。*我们正在挑选博彩公司虚报了实际百分比的游戏。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

去相关损失公式——这非常重要!!!!!!!

Da 代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

模型架构

我使用 nba_api Python 库抓取了盒子得分历史。数据存储在 MongoDB 集合中。在过去的 11 个赛季中,每个球员的每场比赛总共有 42 个数据被存储,从罚球命中率到防守等级到抢断次数。投注数据是从的 betexplorer 上刮下来的。找到高质量的投注线比训练模型要难得多。向斯洛文尼亚卢布尔雅那大学的 trumbelj 教授寻求一些建议。

对于每场比赛,样本是用每个球员从赛季开始的最后 8 场比赛的平均值计算的。根据平均游戏时间选择前 8 名玩家。

型号:

该模型是 Conv2D 和密集层的组合,有很多漏失。该模型的独特之处在于去相关损失,我提到的第一篇论文对此进行了概述。尽管 Keras 本身不支持带有神经元值的损失函数,但是将函数包装在函数中是一种有用的解决方法。我在 GTX 1660Ti 上训练网络 20 个纪元,直到网络收敛。

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 10%的余额模型置信度的非常原始的下注策略,并且仅在模型置信度> 0.6 的游戏上赌博,我们生成一个向上的余额趋势。有趣的是,该模型只对全部游戏的大约 10%下注。除了整个 2017-18 赛季的灾难性连败之外,我们的模型表现非常好,初始投资为 100 美元,最高为 292 美元。*

学习与未来:

这只是这种模式的开始。随着令人鼓舞的结果,我想制定一个更有活力的投注策略。如果你想嘲笑/怜悯我写的 Jupyter 笔记本的 1k 行,完整的未删节未编辑的笔记本可以在这里找到:https://github . com/calebcheng 00/NBA _ predictions/blob/master/NBA . ipynb
唯一有用的东西大概就是投注刮码和模型了。

使用 NoSQL 是一个错误,我应该坚持使用 SQLite,但学习一项新技术是很好的。编写自定义损失函数是一次非常有价值的经历,在未来的深度学习项目中会派上用场。

用蒙特卡罗模拟预测 NBA 球员阵容

原文:https://towardsdatascience.com/predict-nba-player-lines-with-monte-carlo-simulation-58a1c006a6e2?source=collection_archive---------24-----------------------

我们能利用数据科学在体育博彩市场中发现价值吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TJ·德拉戈塔在 Unsplash 上的照片

我绝不鼓励赌博。我不鼓励使用我的模型,事实上,我积极劝阻它。这是纯粹的教育用途,不应该使用或依赖任何真正的钱。说真的。

我以前作为职业体育赌客的经验非常依赖有效市场假说。这表明资产价格反映了所有可获得的信息。在体育博彩术语中,在自由市场(如 Betfair exchange 这样的交易所)中,任何事件的价格都准确地反映了该事件发生的几率。

这个理论起源于 20 世纪初(直到几十年后才流行起来),有一个故事很好地解释了这个理论。1906 年,伟大的统计学家弗朗西斯·高尔顿在一个乡村集市上观察了一场猜公牛体重的比赛。八百人参加了。高尔顿就是这样的人,他对这些数字进行了统计测试。虽然有些人的猜测过高,有些人的猜测过低,但他发现平均猜测值(1197 磅)与公牛的实际体重(1198 磅)非常接近。这个故事是詹姆斯·苏洛维耶茨基在他有趣的书《群体的智慧》中讲述的。我强烈推荐。

但是使用这些假设来发现价值和下注存在几个困难:

  • 这一假设只有在市场流动性充足的情况下才有效。许多市场都缺乏流动性。这意味着我们不能确信价格是正确的(我们只有很少的人群)。因此,像玩家线这样不太受欢迎的市场不能使用这种技术。即使是现在,当我写这篇文章时,一场德国德甲比赛有 150,000 场胜利/平局/客场比赛,只有 2500 场超过/低于 3.5 个进球。这一行缺乏流动性意味着我们不能假定它的价格是正确的。
  • 我以前使用的技术完全依赖于击败市场价格,这意味着人们不能在这些交易所交易。大多数庄家限制使用这种技术的人,因此为了持续的利润,必须开发不同的技术。除此之外,最有用的技术是可以在交易所获利的技术。
  • 有专业的体育博彩者和交易者,他们只通过交易所就能持续盈利。虽然他们可能是少数,但这意味着至少有可能比大众更明智。

这些限制促使我探索开发不依赖大众智慧的预测体育赛事结果的技术。

蒙特卡罗模拟是一种广泛的工具,它依靠重复采样来获得数值结果。当很难使用其他方法时,它们经常在物理或数学中使用。在预测随机性起重要作用的事件(如体育事件)时,它们尤其有用。

这是因为蒙特卡罗模拟不是像大多数典型的机器学习算法那样给出具有一定程度不确定性的确定性结果,而是反转这一点。它只使用一系列概率来解决确定性问题。它不是简单的给我们结果,而是会输出所有潜在结果的概率分布。这对体育博彩来说太棒了。如果我们设法精确地模拟一场游戏,就有可能创造一套赔率,或建立公平的线。然后可以将这个结果与市场和各种博彩公司进行比较,我们可以决定我们是否有价值。

体育包含了大量的随机性和变化,除此之外,可处理的数据量也是有限的。阵容经常变化,上赛季表现好的球队下赛季可能表现不佳。由于这个原因,历史数据在很大程度上是不相关的。

游戏中有如此多的随机性,以至于看一个游戏结果的预测并没有特别大的帮助。就像看轮盘赌的一次旋转没有太大帮助一样——赌场不关心一次旋转会发生什么。他们甚至不关心 100 次或 1000 次旋转后会发生什么。他们只关心理解他们的游戏如何在赌场一生中发生的数百万次旋转中产生优势。这限制了我们训练传统机器学习模型的能力。

赌场通过理解他们的优势是长期实现的来赚钱,所以敏锐的体育赌徒也应该这样做。然而,NBA 每个赛季每支球队只有 82 场比赛,由于冠状病毒,本赛季甚至更少,我们只有有限的数据来进行预测。因此,我们希望能够大量模拟游戏,即使不是数百万次,也是数千次,以建立一个准确的结果和概率范围。

当应用于体育时,我们基本上可以做的是从几个已知分布(以前的比赛结果)中取样,并产生一个新的未知分布(新的比赛结果和概率分布)。

我用的数据是从https://www.basketball-reference.com刮来的。它提供了 NBA 每名球员的每场比赛统计数据,我使用的是 2013 年以来的数据。

在探索数据的早期,我发现了一些见解,这些见解将影响我设计模型的方式。首先,不同位置的球员平均得分不同。其次,每个位置的得分都有主场优势。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图表显示每场比赛的平均分数,带有置信区间

这一点都不奇怪,因为这是一个即使是最基本的体育迷都会做出的假设。然而,在考虑如何构建游戏模拟时,检查它们是很重要的。假设存在主场优势,并且会出现位置差异,我们需要在任何模拟中包含这些信息。

我检查的另一个相对简单的假设是上场时间对得分的影响。这是有道理的,球员在场上的时间越长,他们得分的时间就越多。下面的回归图显示了这种关系的本质,因为很难看到分散点的密度。这种相关性延续到其他指标,这是有意义的——更多的时间,更多的助攻,抢断,盖帽,得分,等等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PTS 对 MP 的回归图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

球员表现指标和上场时间的相关性

所以总结一下:

  • 有主场优势
  • 得分与上场时间有关
  • 得分上存在着位置上的差异,这种差异通过主场优势得以延续。

这是我用来构建我将从中取样的分布的信息。我对这些指标做了一个很大的假设,那就是它们通常是正态分布的。

下面是尼克·杨的上场时间分布,虽然不完全是正态分布,但对我来说已经足够接近了。

得分当然更多的是一种延伸,这当然应该被认为是一种限制,以后再考虑调整。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尼克·杨主场上场时间直方图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在家得分的尼克·杨积分直方图

潜在的方法

我考虑了几种方法来构建可重复采样的发行版:

Bootstrapping :从这些已知分布中重复采样,进行替换。如果我们从上面的得分分布中反复取样,就不会有一个模拟显示尼克·杨得了 35 分。在过去,他得了大约 29 分和 38 分,所以这种情况显然是可能的,我们想反映这一点。

**建立泊松分布:**我考虑的另一个选择是建立泊松分布。它强制所有数字都是大于零的整数,这对我们的目的很有帮助。然而,在泊松分布中,均值和标准差是相同的数。然后我可以从这个人工构建的分布中取样

**构建一个调整后的正态分布:**我的选择是使用球员统计数据的均值和标准差生成一个正态分布,并从中重复采样。然后我强制数字为整数,负数为零。这有助于克服上述方法的局限性。

我用一个玩家的历史数据生成了他游戏结果的分布。这允许我建立一个数以千计的游戏的分布,而不仅仅是现有的有限的历史数据。

新的分布如下所示。虽然与原来的不同,但它有效地解决了上述问题,并且形状大致相似。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尼克·杨在家模拟得分直方图

模拟

现在终于到了有趣的部分。

我构建了几个函数来执行模拟。

第一个函数只是找到最近一个赛季的球队阵容(因为我们不关心不在球队中的球员),并返回一个字典,其中包含他们的位置,以便以后参考。

def get_player_position_dict(team):

    # This function collects all the players names of the team, and       inputs it into
    # A dictionary, along with each player prospective position.home_team_lineup = df.loc[(df['Tm'] == team) & (df['Date'] >= '2017-10-17 00:00:00')][['Player','Pos']]
    home_team_lineup = home_team_lineup.drop_duplicates().sort_values(by = 'Player')
    home_team_lineup_list = list(home_team_lineup['Player'])
    home_team_position_list = list(home_team_lineup['Pos'])
    team_player_position_dict = dict(zip(home_team_lineup_list, home_team_position_list ))

    return team_player_position_dict

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一个函数包含了很多代码,所以我会用文字解释,可以随意跳过。它也在我的 Github 上。

对于所要求的模拟次数,以及对于单个玩家,该函数从我为他们构建的分布中随机抽取样本。它需要一个他们玩了多长时间的样本,乘以一个他们每分钟得分多少的样本,再加上一个对方球队在那个位置上让出的分数的样本。这整个过程是一个游戏的模拟

这个数被 2 除,所以进攻和防守统计都考虑进去了,那个分数被输入一个列表。

def score_sim(mp_mean, scoring_rate_mean, mp_std, scoring_rate_std, away_PTS_conceded_mean, away_PTS_conceded_std, ns): 

    score_list = []

    for i in range(ns):
        # How long an individual home team player plays at home
        home_minutes_played = np.random.normal(mp_mean,
                                          mp_std)# How effective they are at scoring points at home
        home_player_scoring_effectiveness =  np.random.normal(scoring_rate_mean, scoring_rate_std)# How often does the team that is away concede when they are away, broken down by location
    # Note here location is also technically 'home' because we are looking at them as an Oppaway_positional_conceding = np.random.normal(away_PTS_conceded_mean, away_PTS_conceded_std)# Force negatives to be 0
        parameters = [home_minutes_played, home_player_scoring_effectiveness, away_positional_conceding]
        parameters = [0 if x<= 0 else x for x in parameters]# Convert to integer as we cannot score 0.5 points
        try:
            home_player_score = int((((parameters[0] * parameters[1]) + parameters[2])/2))
        except:
            home_player_score = 'NA'

        score_list.append(home_player_score)return score_list

在一个特定的球员(斯蒂芬·库里)对猛龙队的比赛中运行这个结果,给出了下面的结果(为了更容易查看,我已经将列表转换成了直方图。这显示了他在 10,000 场比赛中的预期分数分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

斯蒂芬·库里对托尔

所以从本质上来说,我建立的是斯蒂芬·库里得分能力的新分布,但根据对方球队的防守能力进行了一些调整,即他们防守斯蒂芬·库里位置上球员的能力。

为简单起见,模型模拟的第一次迭代是为偶数钱寻找公平线。如果我们可以(准确地)找到公平线,那么我们可以搜索比我们预期的概率更好的价格,并思考它们是否提供价值。以下函数对模拟分数进行排序,并求出中值。

def convert_to_line(score):

    score.sort()
    freq = {x:score.count(x) for x in score}
    values_list = list()
    for val, count in freq.items():
        for count in range(count):
            values_list.append(val)median_computed = statistics.median(values_list)
    return median_computed

对于这组结果,它的输出是 17。这意味着,我们的模拟显示,在对阵猛龙的比赛中,斯蒂芬·库里一半时间得分在 17 分以上,另一半时间得分在 17 分以下。

对于体育博彩来说,这意味着如果我们能找到比这条线更好的地方(SC 得分超过或低于 17 分),纯粹基于这个模型,我们可能认为这是一个价值赌注。然而,警告一句——这是高度假设的。在投入任何资金之前,可能有更多的粒度来定义这个过程,这只是一个简单的宠物项目。我强烈建议你不要用这个来真钱下注,我也不鼓励任何形式的赌博。这只是开始构建您自己的模型的一个起点。

完整的模拟模型在我的 GitHub 上,所以请随意查看,但最终结果会为两队的每个球员生成球员线。然而,这是太多的代码张贴在媒体上,但这是金州勇士队对多伦多猛龙队的 10,000 次模拟(耗时不到 40 秒)的输出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

全点线仿真模型的输出

这个模型没有在之前的任何游戏上测试过,我目前正在寻找不同的方法来测试它的准确性。

一些未来的改进:

  • 对旧数据进行加权,使其在模型中变得不那么相关。2013 年发生的事情应该没有 2017 年发生的事情影响大
  • 包括关于每个玩家统计的更进一步的、更精细的统计。这个模型没有考虑到,例如,斯蒂芬·库里主要是三分球,也没有考虑到托尔斯对罚球的防守能力。
  • 因为游戏模拟仅限于得分,所以没有考虑盖帽、助攻、篮板及其对得分的贡献的输入。包括这一点将产生一个更加现实和适用的模型。
  • 它不考虑诸如受伤或比赛类型等信息。鉴于模拟比赛是一场 NBA 决赛,我们可能应该加入一些额外的假设,如与以前的比赛相比,与顶级球员比赛的时间更长,进攻和防守的强度更大。

如果任何人有任何意见,请联系,这是我的一个活跃的宠物项目,所以我将非常感谢听到来自更有经验的数据科学家或对篮球感兴趣的人的任何评论!

这篇文章写得很有启发性,我正在积极地考虑将类似的模型应用到封锁期间正在进行的其他运动中。我目前正在寻找所有运动的数据。我也在寻找立即开始的工作,所以如果你出于这样或那样的原因想要联系,请通过评论、我的 Linkedin 或我在 carterbouley@gmail.com 的电子邮件联系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯蒂安·门多萨在 Unsplash 上拍摄的照片

根据医学综述预测患者的医疗状况—第 1 部分

原文:https://towardsdatascience.com/predict-patients-medical-condition-based-on-medicine-review-part-1-c22ea39d9976?source=collection_archive---------26-----------------------

分析不同患者在不同药物评论网站上对特定药物所做的评论,以预测该药物的使用状况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

詹姆斯·亚雷马在 Unsplash 上的照片

互联网曾经是一个张贴漂亮网站以推广业务的地方,现在已经发展成为一个论坛,消费者可以根据印象和其他志同道合的消费者的反馈来评估不同的产品和服务。最近,在线评论在营销和交流中创造了一个新的领域,弥合了传统口碑和可以影响消费者意见的病毒式反馈之间的差距。然而,在医学领域,对特定药物的审查发挥着更重要的作用,因为它们可以帮助监测药物的不良反应,并确定使用者对药物的总体印象。

由于许多药物治疗多种疾病,当在大多数患者论坛上审查一种药物时,必须提供该药物用于的医学疾病。

医学状况是一个宽泛的术语,包括所有通常接受医学治疗的疾病、病变、失调或非病理状况,如怀孕或分娩。

在这一系列文章中,我们将分析不同患者在不同药物评论网站上对特定药物的评论,并预测**医疗状况,**药物正在用于治疗。

挑战

从评论中预测医疗状况是一项非常具有挑战性的任务。例如,考虑下面的评论:

这药对我有奇效。我肯定会推荐它

这种药物曾被用于治疗痤疮。但是,仅根据审查,很难确定患者是在谈论治疗痤疮,因为帖子中没有提及。由于大多数患者论坛要求在审查表中的单独字段中提供医疗条件的名称,因此患者通常不会在他们的审查中提到它。

方法

为了解决这个问题,在本部分中,我们将分析评论,并使用统计机器学习分类器进行预测。我们将使用来自 Kaggle 的 UCI ML 药物评论数据集。该数据集提供了患者对特定药物以及相关条件的评论,以及反映患者总体满意度的 10 星患者评级系统。这些数据是通过抓取在线药物评论网站获得的。该数据集由针对 700 多种不同医疗状况的 20 多万篇医学综述组成,数据分为训练(75%)和测试(25%)两部分。

分析数据集

首先,我们将首先导入分析和预测所需的所有模块。

然后,我们将下载数据,从中删除空值,然后查看训练和测试数据帧。我已经从前面提到的链接下载了数据集,并将其加载到 pandas dataframes 中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们看到数据集中有 7 列:

  1. uniqueID:每个帖子的标识符。
  2. drugName:被审评药品的名称。
  3. condition:使用该药物的医学病症的名称。
  4. review:患者对某一种药物的评价。
  5. rating:患者对每种药物的评分,10 分代表最大疗效。
  6. date:审核录入日期。
  7. usefulCount:认为评论有用的用户数量。

由于我们对预测医疗状况感兴趣,condition将是我们的目标变量。让我们首先分析condition变量的类分布。

我们将定义以下函数:

plot_bar_chart首先从condition列中提取每个类的评论数量,并使用提供的函数绘制它们。 number_of_classes仅打印数据帧的condition 列中唯一类的数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集中有 708 个类(见上面的快照),评论高度偏向于节育的类,这表明数据集高度不平衡。经过仔细观察,还发现有些类别(以红色突出显示)并不完全是医疗状况,而是在创建数据集期间添加的一些噪声。所有这些噪音都必须消除。

标签(类)预处理

标签的预处理包括三个步骤。我们将在训练数据帧上执行所有的预处理,然后在测试数据帧上应用它。

步骤 1:移除低频类别

我们已经观察到数据集是高度不平衡的。我们将开始预处理,首先删除样本少于 20 个的类,然后再次检查训练集中的类的数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们观察到数量从 708 个显著减少到 214 个(上面的快照)。

步骤 2:对超过 200 个样本的类进行欠采样

为了解决类别不平衡问题,我们将对超过 200 个样本的类别进行欠采样。我们通过遍历每个类,从训练数据帧中提取所有样本,对其进行洗牌,然后将数组分割为 200 个元素来实现这一点。

步骤 3:从数据集中移除噪声类

正如我们在上一节中看到的,数据集由仅仅是噪声的类组成。这些类的典型格式是数字后跟一些文本,例如,数据集中的一个有噪声的类是“ 41 个用户找到了”。我们知道医疗条件不涉及数字,因此我们可以轻松地在数据集中查找字母数字类,并可以直接删除它们以消除噪声。

我们通过编写一个名为filter_labels的方法来实现这一点,该方法遍历所有标签,检查标签是否是字母数字的,并基于检查返回一个真值。然后,我们将它应用于训练数据帧,并检查类的数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在在训练集中只剩下 210 个类(上面的快照),我们需要在这些类上训练我们的分类器。现在让我们来看看班级的分布情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分配看起来比以前好得多。仍然有很高的类别不平衡,但是超过这个范围的欠采样将导致信息的丢失。

对测试数据集标签应用预处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如我们所看到的,测试集中有 664 个类。测试数据集需要与训练数据中的类完全相同。由于我们的测试数据已经被标记,我们只保留那些出现在预处理过的训练集中的类,而丢弃其余的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

测试数据现在也包含 210 个类,与训练集完全相同。

预处理评论

到目前为止,我们只通过平衡数据集和移除低频类来处理标签。为了使评论准备好输入任何机器学习模型,我们必须对它们进行预处理,以便删除不必要的信息。我们将移除停用词,然后对语料库中的单词执行词干化

删除停用词和词干

我们定义了一个名为filter_data的函数,它接受小写评论,遍历句子中的每个单词,然后首先删除标点符号和停用词,然后对单词进行词干提取。

小写目标类

我们将目标类别标签小写,以便它们可以直接用于训练我们的机器学习分类器。

创建机器学习模型

为了获得最佳的机器学习模型,我们将对训练数据集执行 4 重交叉验证,然后使用最佳执行模型对测试数据集进行预测。我们将使用以下机器学习分类器,然后根据其性能选择最佳模型:

  1. 多项式朴素贝叶斯
  2. 随机梯度下降分类器
  3. 随机森林分类器
  4. k 近邻分类器

我们混洗训练数据集,并将数据集的相关列保存在变量 XY 中。

在将文本数据输入任何机器学习分类器之前,需要进行特殊的准备。必须对文本进行解析以删除单词,这称为标记化。然后,需要将单词编码为整数或浮点值,以用作机器学习算法的输入,称为特征提取(或矢量化)。

我们将使用 sklearn 的 CountVectorizer 包将我们的评论转换成向量。 CountVectorizer 提供了一种简单的方法,既可以标记一组文本文档,构建已知单词的词汇表,也可以使用该词汇表对新文档进行编码。

接下来,我们定义一个方法cross_val_multiple_classifiers,该方法接收数据和标签,对上述所有分类器执行 4 重交叉验证,并显示每个分类器所有重的精确度和标准偏差的平均值,并对矢量化的训练数据调用该方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们看到随机森林分类器工作得最好,平均准确度分数大约为 54% 。让我们使用这个模型在完整的训练数据集上训练它,并在测试集上获得预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管该分类器的交叉验证分数仅为 54%,但该分类器在测试数据集上的总体准确度为 70%,F1 分数良好。这可能是因为测试集中的偏差。然而,由于交叉验证的准确度分数很低,我们仍然需要找到一个更好的策略来训练分类器,以提高整体性能。

结论

在系列的这一部分中,我们试图解决一个具有挑战性的问题,即使用消费者对药物的评论来预测医疗状况,这些评论使用统计机器学习分类器,并使用计数矢量器将文本转换为输入特征。尽管我们解决了数据集中的高级别不平衡,但结果仍然不够令人印象深刻,表现最好的分类器仅提供了 54% 交叉验证的准确度分数。

在下一部分中,我们将尝试通过采用不同的方法来解决问题,从而提高模型的性能。

笔记本的完整代码可以从这里获得——https://github . com/hamiz-Ahmed/Machine-Learning-Notebooks/blob/master/classified _ Medical _ Condition _ using _ Statistical _ Models _ Part _ 1 . ipynb

参考

UCI ML 评论数据集—https://www . ka ggle . com/Jessica Li 9530/kuc-hackathon-winter-2018

sci kit-learn—https://scikit-learn.org/stable/

如何用 scikit-learn 对机器学习的文本数据进行编码—https://machinelementmastery . com/prepare-Text-Data-Machine-Learning-scikit-learn/

用 Python 预测带时间戳的销售额

原文:https://towardsdatascience.com/predict-time-stamped-sales-in-python-1914292461ad?source=collection_archive---------26-----------------------

实践教程

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·斯皮斯克Unsplash 上拍摄的照片

**目标:**使用 Python 中的自回归模型(ARIMA)预测即将到来的月销售额。

**详情:**各行各业的大多数业务部门都非常依赖时间序列数据来分析和预测,比如线索/销售/股票/网络流量/收入等。不时地产生一些战略性的商业影响。有趣的是,当我们有连续相关的数据点时,时间序列模型是洞察力的金矿。让我们来看看来自 Kaggle 的这样一个带时间戳的销售数据集,以理解在 Python 中使用自回归(ARIMA)模型进行时间序列预测所涉及的关键步骤。

在这里,我们将 ARIMA 模型应用于一个交易销售数据集,以预测一个具有入站和出站差异的组织的月销售额。在现实世界中,我们需要一个时间戳预测建模的五阶段计划,即数据预处理、数据评估、模型选择、模型评估,以及最后但并非最不重要的对未来的预测。让我们在下面详细了解这些步骤中的每一步:

第一阶段:数据预处理

**第一步。导入库:**导入时间序列预测的所有相关库:

#Data Preprocessing:import pandas as pd
import numpy as np
import os as os
import matplotlib.pyplot as plt
%matplotlib inline    
from matplotlib import dates
import warnings
warnings.simplefilter("ignore")
import easygui as es#Data Evaluation:from statsmodels.tsa.filters.hp_filter import hpfilter
from statsmodels.tsa.seasonal import seasonal_decompose
import statsmodels.api as sm
from statsmodels.tsa.stattools import acovf,acf,pacf,pacf_yw,pacf_ols
from pandas.plotting import lag_plot
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
from statsmodels.tsa.statespace.tools import diff
from statsmodels.tsa.stattools import ccovf,ccf,periodogram
from statsmodels.tsa.stattools import adfuller,kpss,coint,bds,q_stat,grangercausalitytests,levinson_durbin
from statsmodels.graphics.tsaplots import month_plot,quarter_plot
import matplotlib.ticker as ticker#Model Selection:

from statsmodels.tsa.holtwinters import SimpleExpSmoothing
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from statsmodels.tsa.ar_model import AR,ARResults
from pmdarima import auto_arima
from statsmodels.tsa.stattools import arma_order_select_ic
from statsmodels.tsa.arima_model import ARMA,ARMAResults,ARIMA,ARIMAResults
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.api import VAR
from statsmodels.tsa.statespace.varmax import VARMAX, VARMAXResults#Model Evaluation & Forecasting:from statsmodels.tools.eval_measures import mse, rmse, meanabs
from sklearn.metrics import mean_squared_error

第二步。加载输入数据集:

这是相对较短的一步。因为我们在这里所做的只是使用 pandas 加载数据集。因为它是平面文件,所以我们使用 read_excel 方法加载数据集。

#Configure the current working directory:os.chdir(r"C:\Users\srees\Desktop\Blog Projects\1\. Timeseries Forecasting\2\. ARIMA\Input")input_dataframe = pd.read_excel("online_retail.xlsx",parse_dates = True)

第三步。检查输入数据集:

让我们使用 info、description 和 head 方法对数据集的结构进行一些初步评估。

input_dataframe.info()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集 1 的结构(图片由作者提供)

input_dataframe.describe()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集 2 的结构(图片由作者提供)

input_dataframe.head(10)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集的前 10 条记录(图片由作者提供)

步骤四。数据角力:

在 pandas 中使用 dropna()方法,确保数据集中没有任何带有空白或空值的记录中断。此外,将 date 对象(本例中的“月”字段)转换为 datetime。

#Converting date object to datetime :

input_dataframe["Month"]  =  pd.to_datetime(input_dataframe["Month"], format='%Y-%m-%d')#Dropping NA's:input_dataframe = input_dataframe.dropna()

将日期时间字段设置为索引字段:

input_dataframe = input_dataframe.set_index("Month")

第五步。重采样:

重采样基本上涉及修改时间序列数据点的频率。我们将根据数据集的性质对时间序列观测值进行上采样或下采样。我们不必对这个时间序列数据集进行重新采样,因为它已经汇总到月初。请查看 Pandas 以了解有关偏移别名和重采样的更多信息:https://Pandas . pydata . org/Pandas-docs/stable/user _ guide/time series . html # offset-aliases

#Set the datetime index frequency:

input_dataframe.index.freq = 'MS'

第六步。绘制源数据:

#Plot the Graph:ax =  input_dataframe['Sales'].plot.line(
title = 'Monthly Sales Timeseries Analysis'
, legend =True, table = False, grid = False
, subplots = False,  figsize =(15,8), colormap = 'Accent'
, fontsize = 15,linestyle='-', stacked=False)#Configure x and y labels:plt.ylabel('Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Quarter',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title('Monthly Sales Timeseries Analysis \n',horizontalalignment="center", 
fontstyle = "normal", fontsize = "22"
, fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月度销售时间序列分析(图片由作者提供)

第 7 步:滚动和扩展时间序列数据集:

滚动均线帮助我们识别支撑和阻力区域;数据集中历史时间序列观测值的“高于平均倾斜度”和“低于平均倾斜度”的区域。

计算移动平均线的主要优点是,它可以过滤掉随机销售活动中的噪音,消除波动,以查看一段时间内的平均趋势。

第 7.1 步。简单移动平均线趋势分析:

简单移动平均是对时间序列数据集进行趋势分析的最基本模型之一。滚动移动平均趋势分析背后的整个思想是将数据分成时间的“窗口”,然后为每个窗口计算一个聚合函数。

input_dataframe["3-Months-Moving-Avg"] = input_dataframe ["Sales"].rolling(window=3).mean()#Plot the Graph:ax =  input_dataframe[['Sales', '3-Months-Moving-Avg']].plot.line(
title = '3 Months Moving Average Trend Analysis'
, legend =True, table = False, grid = False,  
subplots = False,  figsize =(15,8), colormap = 'Accent', 
fontsize = 15,linestyle='-', stacked=False)#Configure x and y labels:plt.ylabel('Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Quarter',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title('Monthly Sales: 3 Months Moving Average Trend Analysis \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

从滚动的 3 个月移动平均趋势线中,我们可以清楚地看到,零售商店的销售额在每个季度的中期都呈上升趋势,而在同一季度的末期则出现了一系列阻力。因此,我们可以清楚地推断,零售商店的波段支持发生在日历年的每个季度的阻力波之前。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:3 个月移动平均趋势分析(图片由作者提供)

步骤 7.2。时间序列分析的标准差:

标准差图本质上帮助我们了解销售活动在一段时间内是增加还是减少;给出时间序列数据集中平稳性的早期指示。

input_dataframe ['3-Months-Moving-Avg'] = input_dataframe['Sales'].rolling(window=3).mean()
input_dataframe['3-Months-Standard-Deviation'] = input_dataframe['Sales'].rolling(window=3).std()#Plot the Graph:ax =  input_dataframe [['Sales', '3-Months-Moving-Avg', '3-Months-Standard-Deviation']].plot.line(title = 'Standard Deviation of Timeseries Datapoints', legend =True, table = False, grid = False,  subplots = False,  figsize =(15,8), colormap = 'Accent', fontsize = 15,linestyle='-', stacked=False)#Configure x and y labels:plt.ylabel('Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Quarter',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title('Monthly Sales: Standard Deviation of Timeseries Datapoints \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

所选时间序列数据集的标准偏差似乎随着时间的推移略有增加;暗示非平稳性。我们将在随后的步骤中达到平稳性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:时间序列数据点的标准偏差(图片由作者提供)

步骤 7.3。扩展时间序列数据集:

时间序列分析中的扩展过程有助于我们识别销售活动的“稳定性”或“波动性”。因此,当我们在时间序列数据集上应用扩展技术时,我们将能够基本上看到数据集中每个历史时间序列观察值的累积平均值。

#Plot the Graph:ax =  input_dataframe['Sales'].expanding().mean().plot.line(
title = 'Expandind Timeseries Datapoints', legend =True, 
table = False, grid = False,  subplots = False,  figsize =(15,8), colormap = 'Accent', fontsize = 15,linestyle='-', stacked=False)#Configure x and y labels:plt.ylabel('Cumulative Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Quarter',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title('Monthly Sales: Expanded Timeseries Datapoints \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

知道历史时间戳上平均值的位置是非常好的;尤其是在时序建模的后续模型评估阶段。因为扩展技术最终有助于我们将均方根误差与销售额的累积平均值进行比较,以了解差异的大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:扩展的时间序列数据点(图片由作者提供)

第二阶段:数据评估

第八步。评估误差、趋势和季节性:

选择预测模型的一个有用的抽象是将时间序列分解成系统的和非系统的部分。系统的:时间序列的组成部分,具有一致性或重现性,可以描述和建模。非系统性:时间序列中无法直接建模的部分。

第 8.1 步。霍德里克-普雷斯科特滤波器:

Hodrick-Prescott 滤波器将时间序列数据集分解为趋势和周期分量。

#cyclicity:sales_cycle, sales_trend = hpfilter(
input_dataframe["Sales"], lamb = 1600)input_dataframe["cycle"] = sales_cycle#Plot the Graph:ax =  input_dataframe[["cycle", "Sales"]].plot.line(
title = 'Hodrick-Prescott Filter - Cyclicity'
, legend =True, table = False, grid = False
,  subplots = False,  figsize =(15,8), colormap = 'Accent'
, fontsize = 15,linestyle='-', stacked=False)#Configure x and y labels:plt.ylabel('Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Quarter',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title(' Monthly Sales: Hodrick-Prescott Filter - Cyclicity Analysis \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

当数据表现出非固定周期的上升和下降时,存在循环模式。此外,如果循环性值接近零,则表明数据是“随机的”。结果与零相差越多,就越有可能存在某种周期性。正如我们在这里看到的,在选择的数据集中存在循环性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:Hodrick Prescott 过滤器——周期性分析(图片由作者提供)

#Trendlineinput_dataframe ["trend"] = sales_trend#Plot the Graph:ax =  input_dataframe[["trend", "Sales"]].plot.line(
title = 'Hodrick-Prescott Filter - Trendline', 
legend =True, table = False, grid = False,  subplots = False,  figsize =(15,8), colormap = 'Accent', fontsize = 15,
linestyle='-', stacked=False)#Configure x and y labels:plt.ylabel('Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Quarter',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title('Monthly Sales: Hodrick-Prescott Filter - Trendline Analysis \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

数据点的观察值的趋势线显示了在一段时间内以非线性速率的总体增长模式。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:霍德里克-普雷斯科特过滤器-趋势线分析(图片由作者提供)

第 8.2 步。误差、趋势和季节性(ETS)分解:

一个给定的时间序列由三个系统成分组成,包括水平、趋势、季节性和一个称为噪声/误差/残差的非系统成分。本节对时间序列的分解试图分离出时间序列中的这些单独的系统和非系统组成部分;抛出一个包含四个前述情节的图表。

乘法模型在这里更为合适,因为销售额似乎正以非线性的速度增长。另一方面,当季节性和趋势成分在一段时间内保持不变时,我们对时间序列应用“加法”模型。

result = seasonal_decompose(input_dataframe["Sales"]
, model = "multiplicative")fig, axes = plt.subplots(4, 1, sharex=True)result.observed.plot(ax=axes[0], legend=False, colormap = 'Accent')
axes[0].set_ylabel('Observed')result.trend.plot(ax=axes[1], legend=False, colormap = 'Accent')
axes[1].set_ylabel('Trend')result.seasonal.plot(ax=axes[2], legend=False, colormap = 'Accent')
axes[2].set_ylabel('Seasonal')result.resid.plot(ax=axes[3], legend=False, colormap = 'Accent')
axes[3].set_ylabel('Residual')plt.title(""" Monthly Sales: ETS Decomposition Plots \n""",horizontalalignment="center", fontstyle = "normal", fontsize = "15", fontfamily = "sans-serif")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

此处观察值的趋势线表明,随着时间的推移,总体增长模式呈非线性(类似于我们在 Hodrick-Prescott 过滤过程中注意到的情况)。此外,在固定的时间间隔内,数据集的时间戳似乎存在显著的季节性变化(范围远远超过零);暗示季节性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:ETS 分解图(图片由作者提供)

步骤 8.3。用于季节性检查的自相关(ACF)图:

自相关是一种序列相关性,其中时间序列与其自身的滞后版本线性相关。滞后意味着“倒退”,就这么简单。因此,“自身的滞后版本”基本上意味着数据点被后移一定数量的周期/滞后。

因此,如果我们在时间序列数据集上运行自相关函数,我们基本上是在将其后移至一定数量的周期/滞后后绘制同一组数据点。

平均来说,在最初的几个(20-40)滞后期内绘制自相关的大小可以说明一个时间序列的很多情况。通过这样做,我们将能够很容易地发现和验证时间序列数据中的季节性成分。

fig = plt.figure(figsize=(15,8))
ax = fig.add_subplot(111)acf(input_dataframe["Sales"])
lags = 40plot_acf(input_dataframe["Sales"], 
lags = lags, color = 'g', ax = ax);
plt.figure(figsize=(15,8)) 
plt.title(' Monthly Sales: Autocorrelation Plots \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.ylabel('y(t+1)',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('y(t)',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

通过绘制滞后 ACF,我们首先可以确认季节性确实存在于这个时间序列数据集中。因为滞后 ACF 图展示了数据中可预测的季节性模式。我们能够清楚地看到,在第二大正峰值爆发之前,由固定数量的时间戳组成的季节性起伏模式。每个数据点似乎都与未来的另一个数据点密切相关;表明数据集中有很强的季节性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:自相关图(图片由作者提供)

第九步。平稳性检查

如果时间序列数据不显示趋势或季节性,则称其为平稳的。也就是;它的均值、方差和协方差在序列的任何部分都保持不变,并且不是时间的函数。

显示季节性的时间序列肯定不是平稳的。因此,所选择的时间序列数据集是非平稳的。让我们使用自动迪基-富勒& KPSS 测试,并进一步通过绘制数据集的滞后自相关和偏相关函数,再次确认时间序列数据集的非平稳性,如下所示:

步骤 9.1。平稳性的增强 Dickey-Fuller 检验:

平稳性的增强 Dickey-Fuller 检验通常涉及单位根假设检验,其中零假设 H0 表明序列是非平稳的。替代假设 H1 支持具有小 p 值(p <0.05 ) indicating strong evidence against the null hypothesis.

print('Augmented Dickey-Fuller Test on Sales Data')input_dataframe_test = adfuller(input_dataframe["Sales"], autolag = 'AIC')input_dataframe_test

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Augmented Dickey-Fuller Test for Stationarity 1 (Image by Author)

#For loop to assign dimensions to the metrices:

print('Augmented Dickey-Fuller Test on Sales Data')input_dataframe_out = pd.Series(input_dataframe_test[0:4], 
                                index = ['ADF test statistic', 'p-value', '#lags used', '#observations'])for key, val in input_dataframe_test[4].items():input_dataframe_out[f'critical value ({key})'] = val

print(input_dataframe_out)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Augmented Dickey-Fuller Test for Stationarity 2 (Image by Author)

Here we have a very high p-value at 0.99 ( p> 0.05)的平稳性,这提供了反对零假设的弱证据,因此我们无法拒绝零假设。因此,我们决定我们的数据集是非平稳的。

以下是使用 ADF 测试自动检查平稳性的自定义函数:

#Custom function to check stationarity using ADF test:

def adf_test(series,title=''):print(f'Augmented Dickey-Fuller Test: {title}')
    result = adfuller(series.dropna(),autolag='AIC') # .dropna() handles differenced data

    labels = ['ADF test statistic','p-value','# lags used','# observations'] out = pd.Series(result[0:4],index=labels)for key,val in result[4].items():
        out[f'critical value ({key})']=val
         print(out.to_string())          
    # .to_string() removes the line "dtype: float64"

    if result[1] <= 0.05:
        print("Strong evidence against the null hypothesis")
        print("Reject the null hypothesis")
        print("Data has no unit root and is stationary")
    else:
        print("Weak evidence against the null hypothesis")
        print("Fail to reject the null hypothesis")
        print("Data has a unit root and is non-stationary")

调用定制的增强 Dickey-Fuller 函数来检查平稳性:

adf_test(input_dataframe["Sales"], title = "Automated ADF Test for Stationarity")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

平稳性 3 的增强 Dickey-Fuller 测试(图片由作者提供)

第 9.2 步。平稳性的 KPSS(科维亚特科夫斯基-菲利普斯-施密特-申)检验:

在解释零假设和交替假设时,KPSS(科维亚特科夫斯基-菲利普斯-施密特-申)检验结果与 ADF 检验结果正好相反。也就是;平稳性的 KPSS 检验通常涉及单位根假设检验,其中零假设 H0 表示序列是平稳的,具有较大的 p 值(p>0.05),而替代假设 H1 支持非平稳性,表明零假设的证据较弱。

def kpss_test(timeseries):

    print ('Results of KPSS Test:')
    kpsstest = kpss(timeseries, regression='c')
    kpss_output = pd.Series(kpsstest[0:3], index=
    ['Test Statistic','p-value','Lags Used']) for key,value in kpsstest[3].items():
        kpss_output['Critical Value (%s)'%key] = value
        print (kpss_output)

调用自定义 KPSS 函数来检查平稳性:

kpss_test(input_dataframe["Sales"])

这里我们有一个非常低的 p 值,为 0.01 ( p <0.05 ), which provides weak evidence against the null hypothesis, indicating that our time-series is non-stationary.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

KPSS Test for Stationarity (Image by Author)

Step 9.3)。使用滞后&自相关图重新验证非平稳性:

步骤 9.3.1。滞后图:

当我们在非平稳数据集上绘制 y(t)对 y(t+1)时,我们将能够发现强自相关;也就是说,随着 y(t)值的增加,附近的滞后值也会增加。

fig = plt.figure(figsize=(15,8))
ax = fig.add_subplot(111)lag_plot(input_dataframe["Sales"], c= 'g', ax = ax);plt.title('Monthly Sales: Lag Plots \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

我们可以在这里的滞后图中找到 y(t)和 y(t+1)之间的强自相关,重申时间序列数据集的非平稳性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:滞后图(作者图片)

步骤 9.3.2。自相关(ACF)图:

如前所述,我们可以清楚地看到一个没有明显截止或指数衰减迹象的季节性因素。

fig = plt.figure(figsize=(15,8))
ax = fig.add_subplot(111)acf(input_dataframe["Sales"])
lags = 40
plot_acf(input_dataframe["Sales"], lags = lags, c = 'g', ax = ax);plt.title('Monthly Sales: Autocorrelation Plots \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.ylabel('y(t+1)',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('y(t)',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

在第二大正峰值爆发之前,时间序列数据集显然具有由固定数量的时间戳组成的起伏的季节性模式。此外,ACF 图不会很快衰减,仍然远远超出显著性范围;证实时间序列数据集的非平稳性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:自相关图(图片由作者提供)

步骤 9.3.3。部分自相关(PACF)图:

部分自相关(PACF)图只能在静态数据集上生成。由于所选的时间序列数据集显示非平稳性,我们在生成部分自相关(PACF)图之前应用了一阶差分。

input_dataframe["first_order_differentiation"] = diff(input_dataframe["Sales"], k_diff = 1)#Plot the Graph:ax =  input_dataframe["first_order_differentiation"].plot.line(title = 'Monthly Sales Timeseries Data : 1st order Differentiation'
, legend =True, table = False, grid = False , subplots = False,  figsize =(15,8), colormap = 'Accent', fontsize = 15,linestyle='-', stacked=False)#Configure x and y labels:plt.ylabel('Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Quarter',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title(' Monthly Sales: 1st order Differentiation Analysis \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:一阶差异分析(图片由作者提供)

input_dataframe["first_order_differentiation"] = diff(input_dataframe["Sales"], k_diff = 1)fig = plt.figure(figsize=(15,8))
ax = fig.add_subplot(111)
lags = 40
plot_pacf(input_dataframe["first_order_differentiation"].dropna(), lags = np.arange(lags), c='g', ax = ax);plt.title('Monthly Sales: Partial Autocorrelation Plots \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.ylabel('y(t+1)',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('y(t)',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

具有一阶差分的数据点的 PACF 图显示了锐截止点或指数衰减,表明一阶积分的稳定性。此外,PACF 图衰减相当快,并基本保持在显著性范围内(蓝色阴影区域),加强了所选时间序列数据集默认为非平稳的假设。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:部分自相关图

第三阶段:型号选择

第十步。将数据集分为训练集和测试集

len(input_dataframe)training_dataframe = input_dataframe.iloc[:len(input_dataframe)-23, :1]testing_dataframe = input_dataframe.iloc[len(input_dataframe)-23:, :1]

步骤 11.1。确定 ARIMA 订单:

由于数据集是季节性的和不稳定的,我们需要拟合一个 SARIMA 模型。SARIMA 是首字母缩略词,代表季节性自回归综合移动平均线;一类统计模型,用于分析和预测具有季节性和非平稳性的时间序列数据。它只不过是对 ARIMA 的扩展,支持对该系列的季节性成分进行直接建模。

ARIMA 的标准符号是(p,d,q ),其中参数用整数值代替,以快速指示所使用的特定 ARIMA 模型。ARIMA 模型的参数是:

p:模型中包含的滞后观测值的数量,也称为滞后阶数。d:原始观测值的差异次数,也称为差异程度。
问:移动平均线窗口的大小,也叫移动平均线的顺序。

这些组件中的每一个都在模型中被明确指定为参数。在 SARIMA 中,它进一步添加了三个新的超参数,以指定序列的季节性成分的自回归(AR)、差分(I)和移动平均(MA),以及季节性周期的附加参数。

因此在这一节中,我们本质上是试图确定 P、D、Q 和 P、D、Q 和 m 的顺序(即;自动回归、积分和移动平均分量以及季节回归、差分和移动平均系数的顺序)应用于时间序列数据集以拟合 SARIMA 模型。

步骤 11.1.1。使用 pmdarima.auto_arima 的 ARIMA 订单:

auto_arima(input_dataframe["Sales"], seasonal = True, m=12, error_action = "ignore").summary()

auto_arima 建议我们应该拟合以下 SARIMA 模型(3,1,5)(2,1,1,12),以最佳预测所选时间序列数据集的未来值。让我们在下一步尝试通过逐步 AIC 准则法重新验证订单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ARIMA 订单使用 pmdarima.auto_arima(图片由作者提供)

逐步 11.1.2。使用逐步 auto_arima 重新验证 ARIMA 订单:

stepwise_fit = auto_arima(input_dataframe["Sales"], start_p = 0
                          , start_q = 0,max_p =3, max_q = 5
                          , m=12, seasonal = True, d=None, 
                          trace = True, 
                          error_action ='ignore'
                          , suppress_warnings = True,
                          stepwise = True)

逐步 auto_arima 为我们提供了列表中所有可能的“Akaike 信息标准”或 AIC 分数的细分。逐步拟合得到了相同的结果;突出显示在所选时间序列数据集上拟合 SARIMA 模型时要使用的自回归、积分和移动平均系数的正确顺序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用逐步 auto_arima 重新验证 ARIMA 订单(图片由作者提供)

步骤 11.2。拟合萨里玛模型:

在训练数据集上拟合 SARIMA 模型,如下所示:

fitted_SARIMA_model = SARIMAX(training_dataframe["Sales"], order =(3,1,5), seasonal_order = (2,1,1,12))results = fitted_SARIMA_model.fit()results.summary()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

拟合萨里玛模型(图片由作者提供)

第四阶段:模型评估

步骤 12.1。评估萨里玛模型:

start = len(training_dataframe)end = len(training_dataframe) + len(testing_dataframe) -1
test_SARIMA_predictions = results.predict(start = start, end = end).rename('SARIMA Predictions')#Root Mean Squared Errornp.sqrt(mean_squared_error(testing_dataframe, test_SARIMA_predictions))

步骤 12.2。构建差异—预测的入站和出站值:

test_SARIMA_predictions = pd.DataFrame(test_SARIMA_predictions)test_SARIMA_predictions["inbound_variance"] = (test_SARIMA_predictions["SARIMA Predictions"]-562.176565188264).round(decimals =0)test_SARIMA_predictions["outbound_variance"]= (test_SARIMA_predictions["SARIMA Predictions"]+562.176565188264).round(decimals = 0)test_SARIMA_predictions = test_SARIMA_predictions.join(testing_dataframe)test_SARIMA_predictions

步骤 12.3。将预测值与测试集的预期值进行比较:

test_SARIMA_predictions = test_SARIMA_predictions.reset_index()print(test_SARIMA_predictions.columns)type(test_SARIMA_predictions["index"])test_SARIMA_predictions["Month"] = test_SARIMA_predictions["index"].rename("Month")test_SARIMA_predictions["Month"] = test_SARIMA_predictions["Month"] .dt.strftime('%Y-%m-%d')test_SARIMA_predictions.set_index("Month", inplace=True)test_SARIMA_predictions[["Sales", "SARIMA-Predicted Sales",'Predicted Inbound Variance',
       'Predicted Outbound Variance']] = test_SARIMA_predictions[["Sales", "SARIMA-Predicted Sales",'Predicted Inbound Variance',
       'Predicted Outbound Variance']] .astype(int)#Plot the Graph:ax = test_SARIMA_predictions[["Sales", "SARIMA-Predicted Sales","Predicted Inbound Variance","Predicted Outbound Variance"]].plot.line(
                             title = 'Monthly Sales: Evaluating SARIMA Model', legend =True, table = False, grid = False
                            ,  subplots = False,  figsize =(15,8)
                            , colormap = 'Accent', fontsize = 15
                            ,linestyle='-', stacked=False)x=  pd.Series (range (0, len(test_SARIMA_predictions)  , 1))for i in x:
  ax.annotate(test_SARIMA_predictions["SARIMA-Predicted Sales"][i],
      xy=(i,test_SARIMA_predictions["SARIMA-Predicted Sales"][i]), 
      xycoords='data',
      xytext=(i,test_SARIMA_predictions["SARIMA-Predicted Sales"][i]+5 ), textcoords='data',arrowprops=dict(arrowstyle="->", connectionstyle="angle3",facecolor='black'),horizontalalignment='left',verticalalignment='top')#Configure x and y labels:plt.ylabel('Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Month',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title('Monthly Sales: Evaluating SARIMA Model \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:评估 SARIMA 模型(图片由作者提供)

第五阶段:对未来的预测

步骤 13.1。在完整数据集上拟合所选预测模型:

final_model = SARIMAX(input_dataframe["Sales"], order = (3,1,5), seasonal_order = (2,1,1,12))SARIMAfit = final_model.fit()

步骤 13.2。获取整个数据集的预测值:

forecast_SARIMA_predictions = SARIMAfit.predict(start = len(input_dataframe), end = len(input_dataframe)+23, dynamic = False, typ = 'levels').rename ('Forecast')

第 13.3 步。构建差异:入站和出站差异:

forecast_SARIMA_predictions = pd.DataFrame(forecast_SARIMA_predictions)forecast_SARIMA_predictions = forecast_SARIMA_predictions.rename(columns = {'Forecast': "SARIMA Forecast"})forecast_SARIMA_predictions["minimum_sales"] = (forecast_SARIMA_predictions ["SARIMA Forecast"] -546.9704996461452).round(decimals = 0)forecast_SARIMA_predictions["maximum_sales"] = (forecast_SARIMA_predictions ["SARIMA Forecast"] +546.9704996461452).round(decimals = 0)forecast_SARIMA_predictions["SARIMA Forecast"] = forecast_SARIMA_predictions["SARIMA Forecast"].round(decimals = 0)forecast_SARIMA_predictions.to_csv('output.csv')forecast_SARIMA_predictions

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测的 SARIMA 数据集(图片由作者提供)

步骤 13.4。根据已知值绘制预测值:

forecast_SARIMA_predictions1 = forecast_SARIMA_predictionsforecast_SARIMA_predictions1 = forecast_SARIMA_predictions1.reset_index()print(forecast_SARIMA_predictions1.columns)type(forecast_SARIMA_predictions1["index"])forecast_SARIMA_predictions1["Month"] = forecast_SARIMA_predictions1["index"].rename("Month")forecast_SARIMA_predictions1["Month"] = forecast_SARIMA_predictions1["Month"] .dt.strftime('%Y-%m-%d')forecast_SARIMA_predictions1 = forecast_SARIMA_predictions1.drop(['index'], axis=1)forecast_SARIMA_predictions1.set_index("Month", inplace=True)forecast_SARIMA_predictions1[["SARIMA - Forecasted Sales"
,'Minimum Sales','Maximum Sales']] = forecast_SARIMA_predictions[["SARIMA - Forecasted Sales"
,'Minimum Sales','Maximum Sales']] .astype(int)#Plot the Graph:ax = forecast_SARIMA_predictions1[["SARIMA - Forecasted Sales",'Minimum Sales','Maximum Sales']].plot.line(
title = 'Predicting Monthly Sales: SARIMA Model', legend =True, table = False, grid = False,  subplots = False,  figsize =(15,8)
 , colormap = 'Accent', fontsize = 15,linestyle='-', stacked=False)x=  pd.Series (range (0, len(forecast_SARIMA_predictions1)  , 1))for i in x:
              ax.annotate(forecast_SARIMA_predictions1["SARIMA - Forecasted Sales"][i],xy=(i,forecast_SARIMA_predictions1["SARIMA - Forecasted Sales"][i]), xycoords='data',
xytext=(i,forecast_SARIMA_predictions1["SARIMA - Forecasted Sales"][i]+5 ), textcoords='data',#arrowprops=dict(arrowstyle="-",
#facecolor='black'),#horizontalalignment='left',
verticalalignment='top')#Configure x and y labels:plt.ylabel('Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Month',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title('Predicting Monthly Sales: SARIMA Model \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

预测月销售额:萨里玛模型

不可预测性和风险是任何预测模型的亲密伴侣。在现实世界中,我们可能无法始终将实际销售额精确到绝对预测值。

事实上,不仅仅是一个绝对值,根据预测的不可预测性程度来获得洞察力在业内被普遍认为是一种良好的做法。因此,让我们结合输入数据集中过去和现在的数据以及预测的入站/出站差异来预测未来几个月的销售情况。

input_dataframe["Sales"].plot.line(title = 'Monthly Sales: Evaluating SARIMA Model', legend =True, table = False, grid = False
,  subplots = False,  figsize =(15,8), colormap = 'Accent', fontsize = 15,linestyle='-', stacked=False)#forecast_SARIMA_predictions["SARIMA Forecast"].plot(legend = True, label = "SARIMA Forecast")forecast_SARIMA_predictions["Minimum Sales"].plot(legend = True, label = "Minimum Predicted Sales")forecast_SARIMA_predictions["Maximum Sales"].plot(legend = True, label = "Maximum Predicted Sales")#Configure x and y labels:plt.ylabel('Volume of sales',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")plt.xlabel('Year & Month',horizontalalignment="center",fontstyle = "normal", fontsize = "large", fontfamily = "sans-serif")#Set up title, legends and theme:plt.title('Monthly Sales: Evaluating SARIMA Model \n',horizontalalignment="center", fontstyle = "normal", fontsize = "22", fontfamily = "sans-serif")plt.legend(loc='upper left', fontsize = "medium")
plt.xticks(rotation=0, horizontalalignment="center")
plt.yticks(rotation=0, horizontalalignment="right")plt.style.use(['classic'])
ax.autoscale(enable=True, axis='x', tight=False)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月销售额:评估 SARIMA 模型(图片由作者提供)

结论

因此,简而言之,我们利用来自 Kaggle 的带时间戳的销售数据集,并使用 Python 中的 Statsmodels 库预测其未来数据点的实际进出差异。此外,在每一个接合点,我们使用 pandas.plot()和 Matplotlib 可视化输出,以获得洞察力。

接下来是什么?

预测未来的数据点只是故事的一半。在现实世界中,当洞察以可理解的方式与内部/外部的利益相关者共享时,项目就展开了,这样他们就能够不时地做出战略性的商业决策。

1)因此,让我们确保将最终输出数据集插入组织的 BI 平台(如 Tableau/ Power BI/ Qlik 等)。)并构建一个数据故事,突出项目的关键发现。在构建数据故事的同时,翻译调查结果的整个过程很大程度上取决于我们对行业和相关业务部门的了解。

2)与组织的内部/外部利益相关者以及仪表板分享见解,以便他们能够相应地制定营销/销售/财务计划。

3)在 python 中应用完全相同的 Statsmodels 库来预测带时间戳的未来线索/价格/网络流量/收入等。

GitHub 库

我已经从 Github 的许多人那里学到了(并且还在继续学到)。因此,在一个公共的 GitHub 库中分享我的整个 python 脚本和支持文件,以防它对任何在线搜索者有益。此外,如果您在理解使用 Python 中的 ARIMA 模型预测带时间戳的数据点的基础知识方面需要任何帮助,请随时联系我。乐于分享我所知道的:)希望这有所帮助!

关于作者

[## Sreejith Sreedharan - Sree

数据爱好者。不多不少!你好!我是 Sreejith Sreedharan,又名 Sree 一个永远好奇的数据驱动的…

srees.org](https://srees.org/about)

使用 R 中的分类方法进行预测

原文:https://towardsdatascience.com/predict-using-classification-methods-in-r-173477062576?source=collection_archive---------30-----------------------

使用乳腺癌威斯康星(诊断)数据集构建机器学习模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由来自 PixabayJavier Rodriguez 拍摄

在这个分析中,我将建立一个模型,根据乳腺癌研究的数据预测肿瘤是恶性还是良性。建模过程中将使用分类算法。

数据集

这项分析的数据涉及一项乳腺癌研究中的 569 名患者。实际数据可以在 UCI(机器学习知识库)找到:https://archive . ics . UCI . edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic)。这些变量是从乳房肿块的数字化图像中计算出来的,并描述了图像中出现的细胞核的特征。具体而言,变量如下:

  1. 半径(中心到圆周上各点的平均距离)
  2. 纹理(灰度值的标准偏差)
  3. 周长
  4. 区域
  5. 平滑度(半径长度的局部变化)
  6. 密实度 (perimeter^ /面积— 1.0)
  7. 凹度(轮廓凹陷部分的严重程度)
  8. 凹点(轮廓的凹部数量)
  9. 对称性
  10. 分维(“海岸线近似”——1)
  11. (肿瘤可以是恶性-M-或良性-B-型)

探索性分析

对数据集有一个总体的了解是很重要的。下面是每个预测值对目标变量(肿瘤)的箱线图。使用预测值的对数值代替实际值,以便更好地查看图形。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

似乎对于大多数预测者来说,肿瘤类型的恶性水平比良性水平具有更高的值。

现在让我们看看预测因素是否相关。下面是所有预测值的散点图矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们可以看到,正如所料,有一些预测因子是密切相关的,如半径、周长和面积。

相关图将为我们提供更好的服务,并量化所有的相关性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们可以发现一些不太重要的相关性,例如凹性&连接性&紧密性。也凹对半径,周长和面积。

使用分类方法进行预测

在该分析的第一部分中,目标是基于使用分类方法由数字化图像产生的变量来预测肿瘤是恶性还是良性。分类是根据包含已知类别成员的观察值(或实例)的训练数据集,识别新观察值属于哪一组类别(子群体)的问题。

因此,我们必须开发一个模型,将每个肿瘤(病例)分为恶性或良性。

用两种不同的方法进行分类,决策树

特征选择

在构建预测模型时,仅使用重要的预测值是很重要的。你不需要使用所有的特性来创建一个算法。你可以通过只输入那些真正重要的特征来帮助算法。以下是一些原因:

  • 它使机器学习算法能够更快地训练。
  • 它降低了模型的复杂性,使其更容易解释。
  • 如果选择了正确的子集,就可以提高模型的准确性。
  • 它减少了过度拟合。

特别是,我对数据使用了逐步(向前和向后)逻辑回归,因为数据集很小。这种方法的计算量非常大,因此不推荐用于非常大的数据集。

审查逐步选择后,决定将以下预测值用于所有模型构建:

  1. 半径(从中心到周边各点的平均距离)
  2. 纹理(灰度值的标准偏差)
  3. 区域
  4. 平滑度(半径长度的局部变化)
  5. 凹点(轮廓凹陷部分的数量)
  6. 对称

逻辑回归

逻辑回归是一种参数统计学习方法,用于分类,尤其是当结果为二进制时。逻辑回归模型的概率,一个新的观察属于一个特定的类别。为了拟合模型,使用了一种称为最大似然法的方法。下面是逻辑回归的一个实现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

通过查看逻辑回归模型的汇总输出,我们可以看到几乎所有的系数都是正的,表明更高的测量值意味着恶性肿瘤的更高概率。

这里重要的一步是评估模型的预测能力。因为模型的预测是概率,我们必须决定分割两种可能结果的阈值。首先,我将尝试默认阈值 0.5。下面是使用此阈值的预测的混淆矩阵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

模型的整体准确率为 96.47 % (3.53 %的错误率)。但是在这种特殊情况下,我们必须区分不同类型的错误。换句话说,有两种错误率,第一类和第二类错误。在我们的例子中,这些是相似的(第二类误差= 3.74% &第一类误差= 3.17%)。第一类错误是指良性肿瘤被预测为恶性;第二类错误是指恶性肿瘤被预测为良性。第二类误差更昂贵,我们必须找到消除它的方法(即使它增加了第一类误差)。

下面我把阈值提高到 0.8,改变了预测模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

虽然模型的总体精度保持不变,但现在第二类误差消除了,但第一类误差增加了。换句话说,我们现在有了一个模型,可以完美地预测恶性肿瘤,但也错误地将一些良性肿瘤预测为恶性(9.5%)。

决策树

决策树由一系列分割点组成,通常称为节点。为了使用决策树进行预测,我们从树的顶部的一个称为根节点的节点开始。根节点是一个决策点或分割点,因为它根据一个输入要素的值设置了一个条件,并且基于这个决策,我们知道是继续树的左侧部分还是树的右侧部分。我们在遇到的每个内部节点重复选择向左或向右的过程,直到到达一个叶节点。这些是树底部的节点,它们为我们提供了输出的特定值,用作我们的预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

当执行决策树时,从输出可以看出,整体预测率为 94.1% (5.9%的错误率),这对于特定领域来说是相对较低的。特别地,第二类误差为 5.61% &第一类误差= 6.35%。该模型的预测性能比前一个模型(逻辑回归)差。

现在让我们创建一个模型的分类树图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

从上面的图中,我们可以假设凹面和纹理是肿瘤类型最重要的预测因子(分类树上的分裂)。

结果

最后,在使用不同的算法构建各种模型之后,基于其性能选择逻辑回归模型(详情见下表)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

特别是,尤其是调整阈值后,消除了 II 型错误(将恶性肿瘤错误预测为良性)。这在这个具体问题上真的很重要。

正如预期的参数方法,如逻辑回归,在这种情况下表现更好,我们有一个小数据集(569 个观察值)。

虽然我们的分析是一个有趣的步骤,但它是基于有限的案例样本。更大样本的案例,可能会引导我们找到一个更好的分类模型。

完整代码点击这里

最初发表于T5【https://www.manosantoniou.com】*。*

使用多任务深度学习框架预测 ICU 患者 30 天再入院风险

原文:https://towardsdatascience.com/predicting-30-readmission-risk-for-icu-patients-be3eec7e6681?source=collection_archive---------33-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图像来源

使用电子健康记录的用于多任务学习的患者亚群体的无监督聚类

问题

无论是有计划的还是无计划的再入院,美国医疗保健系统每年都要花费数十亿美元。这对于医疗保健系统非常重要,因为大约三分之一的再入院是可以预防的,这为医院系统提供了改善护理质量的巨大机会(1)。此外,作为奥巴马政府通过的 2012 年平价医疗法案(affordable care act)的一部分,医疗保险和医疗补助服务中心(CMS)还会对医院进行处罚,将再入院率降低高达 3%,这为使用数据构建算法创造了巨大的机会,该算法能够预测哪些患者可能会在提前出院的情况下再次入院。

近年来,许多使用电子健康记录(EHR)数据和机器学习技术的研究被执行,以帮助确定大数据是否可以检测到 30 天内再次入院的高风险患者。这些研究利用了大量的统计和机器学习技术,从基本的流行病学模型到深度学习 LSTM 和具有专业制作功能的 CNN 架构(3–12)。尽管取得了进展,但许多研究的一个缺点是用于预测患者再入院风险的通用一刀切方法主要针对特定的表型。随着我们朝着开发考虑到每个患者个体风险因素的个性化药物迈进,我们也应该应用同样的思维模式来创建针对复杂 EHR 数据中存在的大量亚人群的算法。因此,在这项研究中,我探索了使用无监督方法进行队列选择的可行性,以在预测每组在 30 天内再次入院的风险之前,首先识别数据集中的亚群。

拟议的研究

在这项研究中,我将使用单任务和多任务模型来预测使用 MIMIC III 数据集的 30 天再入院风险。这将通过首先使用数据驱动的无监督方法对患者进行聚类,以使用在患者住院的最后 48 小时内捕获的社会人口统计学、操作和临床因素对患者进行聚类来完成。这将用于使用多任务框架预测患者从 ICU 出院后 30 天内再次入院的风险。Suresh 等人(2018) (13)首先介绍了这种方法,用于预测 ICU 的住院死亡率。据我所知,这是第一个使用这种两步法来预测 ICU 异基因患者 30 天再入院风险的研究。此外,值得注意的是,这项研究的重点是实现和测试这种建模方法的可行性,如果成功的话,将在后续的文章中对这项研究进行跟进和改进。

数据源

该项目利用了 MIMIC III 电子健康记录(EHR)数据集,该数据集由 38,645 名成人和 7,875 名新生儿的 58,000 多个住院记录组成。该数据集是从 2001 年 6 月至 2012 年 10 月在贝斯以色列女执事医疗中心的去识别重症监护病房住院病人的集合。

数据预处理

社会人口统计学、手术和临床因素已被证明与再入院相关。为评估 30 天再入院风险而建立的绝大多数模型主要依赖于社会人口统计学、操作和专业制作的疾病特异性临床变量(共病)(14-16),一小部分包括时变测量,如实验室和生命体征,以全面捕捉患者住院期间的进展。因此,为了全面评估这种方法,除了管理和共病特征外,还使用了以下静态和时变变量。时变特征被窗口化以捕捉患者停留的最后 48 小时。为了解决数据缺失的问题,从最后一个测量数据点回填数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**表 1。**用于根据患者住院最后 48 小时内测量的生理和生命体征预测再入院风险的特征。

纳入标准:

  1. 18 岁以上的患者
  2. 患者首次入住 ICU 作为指标(对于多次住院的患者)

排除标准:

  1. 死在医院的病人
  2. 单位之间的转移

然后在以下步骤中使用上述纳入和排除标准创建队列:

步骤 1:计算年龄,删除 18 岁以下的患者并创建再入院标志

下面的 SQL 脚本从 ICU 中提取患者的首次出院日期,并使用该出院日期来估计首次出院日期和再次入住 ICU 之间的时间。每位患者的年龄计算为入住 ICU 的日期与出生年份之间的差值。当数据集中显示年龄为 300 时,请不要惊讶,这是由于在 MIMIC III 数据集中用 300 替换了所有大于 89 岁的年龄。

步骤 2:使用四种最常见的共病风险因素,从上述 SQL 视图中的每个患者中提取这些信息。

第三步:提取表 1 中列出的所有时变实验室和生命体征。对于群组中的每个患者

第 4 步:实验室和患者在同一时间测量的平均实验室数

方法

在预处理数据后,使用自动编码器首先创建特征的密集表示,给出它们的初始稀疏度。然后,自动编码器的输出用于拟合高斯混合模型(GMM ),这是一种概率模型,通过包括关于数据的协方差结构以及潜在高斯中心的信息,可以将其视为 k 均值的一般化版本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1: 展示如何在学习之前发现群组聚类的建模方法(13)

全球模型架构:

为了帮助利用随时间变化的变量来预测 30 天的再入院风险,在每个架构中都使用了 LSTM。在全局模型中(图 2。),使用单个 LSTM 层对所有数据进行训练,创建一个全球基线,旨在展示“一刀切”模型的性能,而不是针对每个患者组使用单独的密集层。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2: 全局多任务模型配置,在最后一个输出层(13)具有每个群组的单独参数

多任务模型架构:

与全局方法类似,该模型使用单一 LSTM 层,但是最终的密集层是特定于每个群组的。与使用不考虑差异的共享密集层相比,这为模型提供了学习仅存在于特定患者队列中的显著模式的机会。这个模型的架构可以在下面的图 3 中看到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3: 单独的密集层多任务模型配置,在最后输出层(13)具有用于每个群组的单独参数

结果

有多少个集群(组件)?

使用由自动编码器创建的嵌入,创建了**赤池信息标准****【AIC】贝叶斯信息标准****【BIC】**图,以确定最小化 AIC 和 BIC 的最佳分量(集群)数量。这些图的结果表明,5 个集群将是最好的。然而,集群规模越大,队列越小,我的实验使用 4 或 5 个具有高度不平衡数据集的集群,得到了只有阴性病例的同质集群。因此,为了建立一个具有一致流行率的有意义的队列,选择 3 个样本作为折衷。还需要注意的是,虽然 AIC 和 BIC 确实会产生负值,但决定所选模型是否最佳的不是 AIC 或 BIC 值的绝对大小,而是所考虑的一组模型的相对值(18)。​

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4: AIC 和 BIC 绘制了所选组件数量对 GMM 密度估计器性能的影响

可视化无人监管的患者集群:

2D 聚类的 t 分布随机邻域嵌入表示

下图(图。5)是由 GMM 模型预测的输出聚类的 t-SNE 表示。在这里,你可以看到集群重叠安静一点,这使得它很难得到一个更好的二维集群图片。因此,在图 6 中创建了 3D t-SNE 表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 5:**GMM 创建的患者队列的 2D t-SNE 图

三维团簇的 t-SNE 表示

为了有助于改善所创建的 4 个聚类的可视化,创建了嵌入的 t-SNE 表示。下图显示了 GMM 模型生成的聚类的散点图和聚类图。这里我们可以看到,绝大多数患者属于第 1 组,即包含大多数再入院的组,其次是第 2 组。我们可以看到,集群 1 和集群 2 似乎比集群 0 更密集地分布,而集群 0 似乎更分散(交互图,点击右上角的集群编号查看各个集群)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6: 使用 t-SNE 3D 表示的所有患者聚类的散点图。互动剧情

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 7: 患者群组聚类的 3D 表示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 8: 每个患者群组的单个 3D 散点图,显示了每个组中患者的分布

按组群分列的再入院率

每个群组的患病率差异显著,从群组 0 的 5.6%、群组 1 的 13.04%到群组 2 的 10.27%不等。全局多任务模型在整个患者群组上进行训练,最终密集层共享每个患者群组的预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表 2: 过去 48 小时住院期间所有患者队列的患病率

按集群和再入院状态划分的患者特征

使用 GMM 模型生成的聚类,表 3 显示了每个患者队列分层的基线特征以及 33,972 例出院和 3602 例(10.6%)再入院的再入院状态。总体而言,30 天内再次入院的绝大多数患者属于第 1 组,59%的患者为男性,67.7%为白人,平均住院时间为 2.70 天,48.7%由医疗保险覆盖。由于年龄是离散的,所有组群中的大部分再入院发生在 51-70 岁年龄组,最初出院到专业护理机构(SNF)。患有充血性心力衰竭等疾病的患者也比数据集中的其他四种共病患者有更高的再入院率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表 3: 按集群和 30 天再入院状态划分的患者队列的基线特征

无监督聚类的时变特征

重要器官

下面的热图显示了在患者住院的最后 48 小时内,实验室和生命体征特征的 z 分值的变化。生命体征的正值、负值或零值分别表示每种特征随时间的升高水平、降低水平或平均水平。在组 0 的情况下,其显示在过去 48 小时内血压和呼吸频率持续增加,而组 1 显示在出院前一天的早些时候 Glascow 昏迷评分增加。有趣的是,聚类 2 显示了相当多的缺失测量值,这是意料之中的,因为这些实验室中的许多在患者住院期间不会被捕获。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 9: 出院前 48 小时的生命体征变化趋势

实验室

对于出院前 48 小时内的实验室测量;在大多数患者再次入院的第 1 组中,我们看到许多实验室在住院的最后 48 小时内仍大幅升高,除了白蛋白、血液 pH 和 pO2 仍相对低于平均水平。与实验室的生命体征热图一样,显示了在过去 48 小时内丢失实验室值的相同趋势,随着这些实验室的测量频率在入住 ICU 后降低,丢失的实验室值增加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 10: 出院前 48 小时的常规实验室变量趋势

模型结果

为了评估聚类是否在更好地预测患者风险方面发挥作用,向患者队列呈现了用于预测患者 30 天再入院风险的全局多任务模型和个体致密层多任务模型。结果如表 3 所示。虽然承诺要付出巨大的代价。虽然这些算法在预测负面案例方面表现出色,但在预测正面案例方面表现不佳。因此,下面的结果可能会产生误导,因为它们在很大程度上基于多数阶级。这可归因于几个因素。有了几个优化器、网络规模和学习率,而 PPV 没有改善,我认为这种情况的一个可能原因很可能是稀疏性和频率降低,其中许多常规生理数据是在接近出院时收集的,如图 9-10 所示。这导致了受缺失值严重影响的特性集的开发。然而,这种方法可以使用不同的特征工程方法。请注意,论文中提出的单一任务模式的表现也明显比作者在研究中经历的其他模式差,因此也没有包括在内。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表 4: 使用全局和多任务模型的 30 天再入院任务的无监督建模方法结果。

结论/局限性

这个项目展示了如何在现实世界中实现个性化的想法。然而,需要对该方法进行调整,以确保所选择的特征为预测即将到来的结果提供有意义的结果。如果要在其他研究项目中使用这种方法,在重新审视本文中介绍的工作时,应该注意的一些发现包括:

  1. 在将数据分成训练/测试/val 集之后执行 z 分数归一化,以避免信息从训练集泄漏到测试集中。
  2. 使用这些实验室的正常值填充缺失的数据集,并为算法提供一个掩膜来识别缺失与伪化要素并创建更大的稀疏要素集。

未来方向

该出版物朝着个性化医疗保健的正确方向迈出了一步,通过一些改变,这种建模方法可以为特定亚人群提供一些有趣的见解,这些亚人群在构建健康相关模型时经常被忽略,因为在应用纳入和排除标准后可用的队列规模有限。然而,虽然这仅仅是探索建模方法的初步研究。随着进一步的研究,通过精心制作的特性和可能使用的更健壮的特性工程策略,可以进一步推动和发展这种方法。如果我们:

  1. 试着进行平衡训练
  2. 使用住院第一天和最后 24 小时内的异常值精心制作实验室特征
  3. 用更简单的模型建立基线方法
  4. 然后,尝试使用 Harutyunyan 等人在 2017 年提出的通道式 LSTM 方法,通过明确显示哪些变量缺失,以及允许模型在与每个聚类中的其他变量混合之前学习和存储与该特定变量相关的相关信息,来更好地解决缺失问题。
  5. 尝试在提交给 LSTM 层之前嵌入患者数据,以帮助减少实验室的稀疏性。
  6. 添加从临床记录中提取的特征,以提取以前的药物使用情况,并添加高风险药物,如:类固醇、麻醉药、抗胆碱能药(7)

我的博客

代码可在 GitHub 上获得

致谢:

特别感谢 Eraldi Skendaj 的批判性阅读和提供反馈。

参考

  1. Bates,D. W .,Saria,s .,Ohno-Machado,l .,Shah,A. & Escobar,g,《医疗保健中的大数据:使用分析识别和管理高风险和高费用患者》。治愈。Aff。33, 1123–1131 (2014).
  2. https://www . CMS . gov/Medicare/Medicare-Fee-for-Service-Payment/acuteinpatientps/read emissions-Reduction-Program
  3. Y.P. Tabak、X. Sun、C. M .、V. Gupta 和 R. S. Johannes,“使用电子临床数据预测早期住院再入院:早期再入院风险评分”,医学关心,2017 年第 55 卷第 3 期。
  4. H.Wang,Z. Cui,Y. Chen,M. Avidan,A. B. Abdallah 和 A. Kronzer,“通过成本敏感的深度学习预测医院再入院”,载于 IEEE/ACM 计算生物学和生物信息学汇刊,第 15 卷,第 6 期,第 1968–1978 页,2018 年 11 月 1 日至 12 月,doi:10.1109/tcbb . 2018 . 2018 . 28282897
  5. 马克·d·银色啤酒杯乐队,秦焕英,s .奎·默瑟,方&齐亚德·海达尔(2008)年龄≥65 岁的患者 30 天再次住院的风险因素,贝勒大学医学中心论文集,21:4,363–372,DOI:10.1080/08999885896
  6. 韦利博尔·米希奇、埃隆·加贝尔、伊拉·霍费尔、库马尔·拉贾拉姆、阿曼·马哈詹;术后急诊医院再入院的机器学习预测。麻醉学2020;132(5):968–980.https://doi.org/10.1097/ALN.0000000000003140。
  7. 武尼基里、拉姆亚&格利克斯伯格、本杰明&约翰逊、基普&达德利、乔尔&苏布拉曼尼安、拉克什米纳拉亚南&卡德尔、沙梅尔。(2018).阿片类患者物质滥用易感性、死亡率和药物相互作用的预测模型。
  8. 麦金太尔路,阿巴比 S,罗宾逊 EF,迈尔 RV。普通外科出院 30 天后患者再次入院的危险因素分析。JAMA Surg. 2016151(9):855‐861.doi:10.1001/jamasurg.2016.1258
  9. 按 VG。是时候从确定 30 天慢性阻塞性肺疾病再住院的风险因素上继续前进了吗?呼唤风险预测工具。安胸足球。2018;15(7):801‐803.doi:10.1513/annalsats . 201804–246 ed
  10. M.J. Rothman 等人/生物医学信息学杂志 46(2013)837–848
  11. Ohnuma,d . Shinjo,a .Brookhart 等人与出院后 30 天内内科和外科重症监护病房幸存者非计划性再入院相关的预测因素。 j 重症监护 6、 14 (2018)。https://doi.org/10.1186/s40560-018-0284-x
  12. Hrayr Harutyunyan,Hrant Khachatrian,David C Kale 和 Aram Galstyan。2017.临床时间序列数据的多任务学习和基准测试。arXiv 预印本 arXiv:1703.07771 (2017)。
  13. Harini Suresh、Jen J Gong 和 John Guttag。多任务学习的学习任务:重症监护室中的异质性患者群体。arXiv 预印本 arXiv:1806.02878,2018
  14. Keenan PS,Normand SL,Lin Z,等:一种基于心力衰竭患者 30 天全因再入院率的适用于描述医院绩效的行政索赔指标。 Circ 心血管质量结果。2008;1:29–37
  15. Krumholz HM,Lin Z,Drye EE 等:一种基于急性心肌梗死患者 30 天全因再入院率的适用于描述医院绩效的行政索赔指标。 Circ 心血管质量结果。2011;4:243–252.
  16. Lindenauer PK,Normand SL,Drye EE,等。肺炎住院后 30 天再入院测量的发展、验证和结果。 J 医院医疗。2011;6:142–150.
  17. 托马斯·巴古利。行为科学高级统计指南。帕尔格雷夫·麦克米伦出版社,2012 年。(第 402 页)
  18. 模型选择和多模型推理:一种实用的信息论方法 (Burnham 和 Anderson,2004)

预测酒店预订需求

原文:https://towardsdatascience.com/predicting-a-hotel-booking-demand-7608a7dbf5a4?source=collection_archive---------20-----------------------

构建机器学习模型预测酒店预订需求。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在本文中,我想写的是如何使用 Python 和 Jupyter Notebook 构建预测模型。我在这个实验中使用的数据是来自 Kaggle 的酒店预订需求数据集。

在本文中,我将只向您展示建模阶段,只有逻辑回归模型,但是您可以在我的 Github 上访问完整的文档,包括数据清理、预处理和探索性数据分析。

事不宜迟,我们开始吧。

导入库

导入库

加载数据集

加载数据集

这是数据集的样子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

资料组

它有 32 栏,完整版是:

['hotel', 'is_canceled', 'lead_time', 'arrival_date_year',
       'arrival_date_month', 'arrival_date_week_number',
       'arrival_date_day_of_month', 'stays_in_weekend_nights',
       'stays_in_week_nights', 'adults', 'children', 'babies', 'meal',
       'country', 'market_segment', 'distribution_channel',
       'is_repeated_guest', 'previous_cancellations',
       'previous_bookings_not_canceled', 'reserved_room_type',
       'assigned_room_type', 'booking_changes', 'deposit_type', 'agent',
       'company', 'days_in_waiting_list', 'customer_type', 'adr',
       'required_car_parking_spaces', 'total_of_special_requests',
       'reservation_status', 'reservation_status_date']

根据我在笔记本上运行的信息,可以在三列中找到数据集中的 NaN 值,这三列是“国家”、“代理商”、“T11”和“公司”

基于’ lead_time’ 列的’ lead_time’ 特性,我将’ country 中的 NaN 值替换为 PRT(葡萄牙),其中 PRT 是最常见的国家,lead_time = 118。

我试图替换基于提前期到达日期月到达日期周数的“代理人”特性上的 NaN 值,但是他们中的大多数都将“240”作为最常见的代理人。在我阅读了可以在互联网上找到的数据集的描述和解释后,作者将’ agent '特性描述为“进行预订的旅行社的 ID”所以,那些在数据集中有“代理人”的人是唯一通过旅行社制作图书的人,而那些没有“代理人”或值为 Nan 的人是那些没有通过旅行社制作图书的人。因此,基于此,我认为最好用 0 填充 NaN 值,而不是用代理填充它们,这会使数据集不同于原始数据集。

最后但同样重要的是,我选择放弃整个“公司”特性,因为该特性中的 NaN 约占数据的 96%。如果我决定修改数据,可能会对数据产生巨大的影响,并且可能会改变整个数据,尤其是在公司特性中。

分割数据集

分割数据集

设置 x 和 y(目标)

我试图根据与目标最相关的前 5 个( is_canceled )来拆分数据集,它们是required _ car _ parking _ spaces’、 lead_time '、 booking_changes '、 **adr、**和 is_canceled。

训练和测试各占 80%和 20%。

拟合模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

model_LogReg_Asli 是在使用超参数调优之前使用逻辑回归的原始模型,这里是模型预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

车型性能

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如你在上面看到的,逻辑回归模型有大约 69.3%的准确率。

模型参数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

带有随机搜索 CV 的逻辑回归

model_LR_RS 是使用带有超参数调整(随机化)的逻辑回归的模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上图所示,带有随机搜索 CV 的逻辑回归模型与没有随机搜索 CV 的逻辑回归模型具有完全相同的结果,即 69.3%。

带网格搜索 CV 的逻辑回归

model_LR2_GS 是使用带有超参数调整(网格搜索)的逻辑回归的模型。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图显示,具有网格搜索 CV 的逻辑回归模型具有完全相同的准确性,即 69.3%。

评估模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

混淆矩阵

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TN 为真阴性,FN 为假阴性,FP 为假阳性,TP 为真阳性,而 0 不取消,1 取消。下面是该型号的分类报告。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分类报告

在本文中,我再次使用逻辑回归进行测试,但是您可以使用其他类型的模型,如随机森林、决策树等等。在我的 Github 上,我也尝试了随机森林分类器,但是结果非常相似。

这就是本文的全部内容。谢谢你,祝你愉快。

利用机器学习预测住院患者的急性肾损伤

原文:https://towardsdatascience.com/predicting-acute-kidney-injury-in-hospitalized-patients-53ca07525e67?source=collection_archive---------32-----------------------

通过使用机器学习算法预测肌酐值来预测住院患者的急性肾损伤。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:肾脏模型,横断面

K 肾脏是你体内过滤血液的重要器官。他们负责清除废物,维持和控制身体的体液平衡,保持电解质的正确水平等。

生病和住院的病人发生肾损伤的风险很高。

急性肾损伤(AKI):

“…是在几小时或几天内发生的肾衰竭或肾损害的突然发作。”

AKI 由 2012 年发布的 KDIGO 标准更精确地定义。

简而言之,当肾脏受损时,会出现以下问题:

  1. 身体的液体平衡和电解质逐渐变得紊乱,最终威胁生命。在严重的情况下,医生可能会对患者进行透析——这需要几个小时的准备,需要一个特殊的程序来建立血液与透析机的人工连接。更不用说,紧急透析是非常昂贵的,一次治疗通常要花费 10,000 美元左右。
  2. 大多数药物通过肾脏排出体外。受伤的肾脏无法迅速将药物清除出体外,体内的药物浓度会累积,导致用药过量。这通常是医生可能改变药物剂量或完全改变药物的原因。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

血清肌酸酐通过血液测试来测量

医生测量肌酸酐,肌酸酐是肌肉产生的一种生物标志物,由肾脏从体内过滤到尿液中。它在你血液中的浓度可以作为肾脏健康/功能的代表。如果你的肾脏过滤血液的能力因为受伤而恶化,那么肌酐值就会上升。

然而,当肌酐上升时,对肾脏的损害已经发生了。理想的情况是能够在肾脏损伤发生之前预测到它的迫近。

模型假设

由于体内的器官系统是相互依赖的,我推断肌酐值(肾脏健康的代表)可能依赖于心脏和肝脏等其他器官的健康。这些其他器官的“健康状况”可以通过针对这些器官系统的不同实验室测试来测量。

我开发了一个预测性临床计算器,使用各种实验室测试和患者人口统计数据作为输入特征,以便预测第二天的肌酐值。肌酐预测值恶化表明 24 小时内即将发生急性肾损伤(AKI)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示意图:输入输出,评估 AKI 风险

获取数据

为了制作这个计算器,我使用了一个名为 MIMIC-III 的可免费访问的去身份病人医疗数据库。关于访问数据库的信息可在生理网网站上找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MIMIC-III 数据库的概览页面

在获得对 MIMIC-III 数据库的访问权后,我按照 Physionet 的指令将数据传输到 PostgreSQL 的本地实例中。数据库中提供了 25 个表格,我针对我的具体项目查询了其中的[ADMISSIONS](https://mimic.physionet.org/mimictables/admissions/)[CHARTEVENTS](https://mimic.physionet.org/mimictables/chartevents/)[D_ITEMS](https://mimic.physionet.org/mimictables/d_items/)[D_LABITEMS](https://mimic.physionet.org/mimictables/d_labitems/)[INPUTEVENTS_MV](https://mimic.physionet.org/mimictables/inputevents_mv/)[LABEVENTS](https://mimic.physionet.org/mimictables/labevents/)[PATIENTS](https://mimic.physionet.org/mimictables/patients/)。我咨询了一位医生,以确定我应该在我的模型中包括哪些实验室测试——我最终得到了 78 个特征。

数据清理和处理

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示意图:数据是如何获得、提取和清理的,以及一些数据混乱的例子

来自医院使用的真实电子健康记录的临床健康数据是混乱的。为了处理数据,我首先使用HADM_IDITEMIDSUBJECT_ID将必要的表(上面列出的表)连接起来。

  • HADM_ID:“代表单个患者入院”
  • SUBJECT_ID:“指定单个患者的唯一标识符”
  • ITEMID:“表示数据库中的测量值”

单个SUBJECT_ID下的患者可以在不同的时间点多次入院,每次新入院都列在HADM_ID下。出于这个项目的目的,我将每个HADM_ID视为一个独特的事件,并没有将它们归入SUBJECT_ID下(尽管如果我有时间,我会这样做以说明历史健康数据——这可能会改进我的模型)。

利用 PANDAS 数据框架,我将表格转换成一种格式,这样,实验室值就可以按照获得它们的日期和时间以YYYY-MM-DD HH:MM:SS格式进行索引。这样做的原因是,许多患者在一天内进行了多个实验室检查,但在一天中的许多不同时间点进行。这将被证明在我后面解释的数据处理管道中是有用的。

年龄等信息需要通过减去住院时间和出生日期来计算。然后我用整数编码分类变量,比如性别和种族。我还必须规范化实验室值及其对应的单元类型,因为它们在数据集中以混合类型存在。

健康数据很少,所以我在每个病人身上插入了任何缺失的实验室数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示意图:心形表示记录实验室数值的日期。x 表示没有实验室值。

每次住院的实验室可以在时间线上进行概念上的“绘制”。我将该时间线的每个 24 小时时间窗内的所有实验室作为输入特征,并将下一个 24 小时的肌酐作为输出“目标”,我将尝试对其进行预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示意图:抓取输入数据X和输出次日值Y的滑动窗口方法

结果是一个输入矩阵X,其中每行代表 1 天,每列是我用作特性的 78 个实验室之一。目标向量Y包含第二天的肌酸酐。缺失的特征被赋值为NaN

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示意图:加工清洗后的数据表。X_matrix 包含输入特征,其中每个特征都是一种不同的实验室测试。Y 向量包括第二天的肌酸酐值。

型号选择和性能

我最初用线性回归做了一些探索性的数据分析。虽然线性回归似乎在预测第二天的值方面做得不错,但 AKI 中的肌酐趋势通常不是线性的。

我决定使用 XGBoost (极端梯度提升)来提高计算速度、准确性和可伸缩性。XGBoost 是陈天琦卡洛斯·盖斯特林对梯度增强树的应用——你可以在这里阅读更多关于它的详细信息。简而言之,它结合了梯度增强和决策树的概念,梯度增强迭代地建立在先前预测器的伪残差上。它的准确性来自于在它的log loss度量中使用二阶导数和内置的正则化参数。我发现这篇文章的答案有助于解释 XGBoost 的一些方面。

由于 XGBoost 无法处理缺失的数据,我用每个实验室测试的中值填充了所有的NaN,并咨询了医生,以验证这是模型开发的合理临床假设。

我以 80/10/10 的比例将数据集分为训练集、验证集和测试集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每次分割的数据大小。超过 3400 万个数据点!

XGBoost 在获取高维实验室数据并从中推断关系方面被证明是不可思议的。下面是我的最终模型的性能和附带的超参数的可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

:通过绘制真实肌酐值与测试集中预测肌酐值的对比图,可视化模型性能。试验了超过 45 个超参数变量,这是表现最好的模型,r 值达到 0.9377。完美模型的 r 为 1.0,预测值将沿着斜率为 1 的直线排列。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

:将训练和验证的回归误差设置为模型训练,并迭代添加估计量。RMSE 是均方根误差,MAE 是平均绝对误差,RMSLE 是均方根对数误差。模型训练了多达 1000 个估计量,此时误差值达到了稳定水平,表明额外的估计量对模型性能的改善很小。

总结思路

总之,我使用 XGBoost 建立了一个模型来预测第二天的肌酐值。我希望像这样的模型有一天可以集成到电子健康记录(EHR)中,以动态预测未来的肌酐(和 AKI 风险)。这将为医生提供实时临床决策支持,使他们能够提前解决肾损伤问题,而不是治疗它。

参考

  1. MIMIC-III,一个免费的重症监护数据库。Johnson AEW,Pollard TJ,Shen L,Lehman L,Feng M,Ghassemi M,Moody B,Szolovits P,LA 和 Mark RG。科学数据(2016)。DOI: 10.1038/sdata.2016.35。可在:【http://www.nature.com/articles/sdata201635获得
  2. 约翰逊,阿利斯泰尔 EW,大卫 j .斯通,利奥 a .切利和汤姆 j .波拉德。"模拟代码库:在危重病研究中实现再现性."美国医学信息学协会杂志(2017): ocx084。

预测 PetFinder 的采用速度

原文:https://towardsdatascience.com/predicting-adoption-speed-for-petfinder-bb4d5befb78c?source=collection_archive---------28-----------------------

我们的团队目前是一家咨询机构,代表 PetFinder 工作,pet finder 是一家非营利组织,包含一个动物数据库,旨在通过与相关方的合作来改善动物福利。这个项目的核心任务是预测一只宠物被收养需要多长时间。

商业理解

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

鸣谢:宠物发现者基金会

根据 pet finder 2018 年的财务报告,其获得的公共支持和获得的收入总额中约有 70%将用于其公共福利项目,包括这个动物收养项目。我们定义的业务问题是**“当新宠物进来时,新宠物被收养的估计时间是什么时候。”根据每只宠物的不同特征,我们可以根据我们创建的模型来估计宠物被收养需要多长时间。因此,通过采用我们的模型,该公司可以指导通过该渠道发布动物信息的收容所和救援人员估计新动物的采用速度。一旦很好地预测了宠物收养速度,就可以实施更有效的资源分配,以提高整体收养性能,并随后降低庇护和寄养的成本。最终 PetFinder 将获得更多的资金支持,为全球动物福利做出更大的贡献。**

数据准备

这个数据集最初由14993 个观测值24 个变量组成。所有数据都基于马来西亚地区,所以我们的分析是针对特定国家和文化的。我们删除了变量名,因为我们认为它与宠物的收养速度无关。出于同样的原因,除了 Name,我们还删除了 State、PetID 和 RescuerID。此外,一些列(如 Breed1 和 Type)被编码为数字,并提供了额外的参考电子表格。出于澄清的原因,我们将类型和性别转换为字符串:我们将“1”编码为“狗”,将“2”编码为“猫”;对于性别,我们将“1”编码为“男性”,“2”编码为“女性”,“3”编码为“混合型”。混合代表宠物的性别。我们还把分类变量变成了虚拟变量。此外,我们进行卡方检验来检验颜色 1、颜色 2 和颜色 3 之间的相关性,结果表明它们是相互依赖的。因此,我们计划保留颜色 1,删除其他两个。最后,考虑到只有 0.38%的记录具有 Breed2,为了简单起见,我们删除了 Breed2。

此外,考虑到数据集包含一个描述列,我们对该列应用了文本分析。根据分析,我们选择了 10 个最常出现的词,并根据这些热词创建了另外 10 个列。我们检查每只宠物的描述是否包含这 10 个单词。如果描述中有匹配的词,我们在该列下指定“1”。如果不匹配,我们指定“0”。这 10 个词是:爱,小猫,小狗,营救,健康,活跃,可爱,火车,母亲,善良。最后,我们都同意描述的长度可能也是一个重要的因素。由于描述越详细,领养者挑选宠物的时间就越少。从逻辑上讲,如果可用信息更丰富,采纳者往往会更快做出决定。因此,我们的最终数据集由14993 条记录29 个变量组成。

数据探索

文本分析

基于文本分析,我们首先创建了一个文本云来捕获描述列中最常见的单词。结果发现,“领养”出现的频率最高,其次是“小猫”、“小狗”和“可爱”等词。从单词 cloud 中,我们可以总结出数据集中这些宠物的主要特征。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我们创建二元模型来捕获文本中的更多模式。最常见的二元结构是“一个月前”,我们挑选了 10 个最有趣的词,并把它们绘制成柱状图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这两幅图中我们可以看出,救援人员和避难所在描述中倾向于使用很多描述性的词语,如积极、善良、可爱等。如上所述,为了测试这些词的有效性,我们挑选了 10 个热词,并将其转换为 10 个分类变量。我们没有选择二元模型的原因是二元模型是由词干组成的,所以软件可能很难在描述中检测到这些二元模型。

品种与采用速度

此外,从马来西亚最知名的宠物网站之一 Perro Market 网站上,我们了解到了马来西亚最受欢迎的 10 个猫狗品种。出于数据探索的目的,我们选择缅因猫和波斯猫作为猫,狮子狗作为狗。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

猫收养速度的平均值为 2.40,标准偏差为 1.21。相比之下,缅因州的平均采用速度为 1.97,波斯语的平均采用速度为 1.95。即使他们的平均值低于平均值,他们仍然在第一标准差范围内。基于这一事实,我们不能得出结论,流行的猫品种,如缅因州和波斯猫往往有较短的收养期比其他品种。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另一方面,狗的平均收养速度为 2.62,标准差为 1.14。值得注意的是,贵宾犬的平均认养速度为 1.97。同样,即使平均收养速度小于整个群体的平均速度,它仍然落在 1 个标准差范围内,所以我们不能得出结论,受欢迎的狗品种导致较短的收养期。

然而,从下面的图表中,我们发现热门品种的宠物数量远远高于其他品种。品种 179 是狮子狗,品种 285 是波斯狗,而品种 276 是缅因狗。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于这一初步分析,我们的结论是,受欢迎的品种决定了该品种下的宠物数量,但不一定意味着较低的领养速度。

接种疫苗与收养速度

接种疫苗为“1”表示宠物接种疫苗,“2”表示宠物未接种疫苗,“3”表示不确定。与直觉相反,接种疫苗的宠物比没有接种疫苗的宠物显示出更高的时间跨度中值,而对于那些报告未知的宠物,它们有更高的时间跨度等待被收养。跨物种的领养速度和疫苗接种之间也没有明显的相关性(-0.06)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

建模

由于目标变量 AdoptionSpeed 是一个具有 4 个级别的分类变量,我们决定该项目的核心任务是分类:当一只新宠物进来时,模型将根据它被分类到哪个级别的采纳速度来确定它将被采纳多长时间。由于其多类的特点,我们选择了三种模型来实现目标,包括随机森林SVM多项逻辑回归。所有这三个模型都根据新动物提供的属性来预测新动物的采用速度,从而帮助解决我们的业务绩效问题。通过与公司分享我们的预测,公司可以对当前资源的分配有更好的计划,特别是将更多的资源分配给预测收养期较长的动物,以加快它们的收养速度。

随机森林

随机森林由大量单独的决策树组成,这些决策树作为一个整体运行。随机森林中的每棵树都给出一个类别预测,拥有最多票数的类别成为我们模型的预测。随机森林的一个优点是,在处理高度相关的变量时,它是去相关的。一个缺点是它限制了预测因子中可包含的分类变量的数量。在我们的项目中,我们排除了描述,因为在一个变量中有超过 14000 个级别,并且它已经分割成具有高频率和描述长度的单词。

支持向量机(SVM)

我们使用的另一个模型是支持向量机(SVM)模型,用于创建最佳超平面,以便在我们的测试数据集中对新记录进行分类。除了描述之外,我们包括来自清理过的训练数据集中的所有变量。通过将复杂数据转换为高维分析,SVM 很容易被用于解决多类分类问题,从而使类容易分离。该模型本身具有良好的计算特性,但它并不试图模拟概率。与随机森林相比,SVM 只能用于预测类别,而不能估计不同类别的概率。从这个角度来看,随机森林可以让我们更全面地了解测试数据集的类别预测。

套索和后套索多项式逻辑回归

我们也使用多项逻辑回归来预测我们的目标变量。然而,由于在多项逻辑回归中可以包含的变量数量的限制,我们使用 Lasso 来选择每一类采用速度的相关变量。基于最小λ和 1 个标准误差λ,我们建立了 4 个带有套索和后套索的多项式 logistic 回归模型。选择变量后,模型消除了过度拟合问题,并可能做出更好的预测。然而,Lasso 选择的变量在不同的自举模型中可能有所不同,它们很难被解释。

估价

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了评估每个模型的性能,我们进行了三重交叉验证,并选择了混淆矩阵平衡准确度作为我们的样本外准确度测量。根据上面的图表,我们所有的六种型号都具有相似的精度性能,范围从 0.5 到 0.6。随机森林达到了最高水平的 OOS 准确率为 59%。使用最小λ的套索多项式逻辑回归是第二高的,具有 56%的 OOS 准确度。考虑到 OOS 准确性是分类模型的一个重要指标,我们选择随机森林作为预测新宠物收养速度的最佳模型。为了研究特定的分类精度,我们进一步评估了随机森林和 SVM 的混淆矩阵,其中一个具有最高的 OOS 精度,另一个具有最低的精度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从混淆矩阵中,我们可以得出结论,Random Forest 对宠物在 1 个月内实际被收养(AdoptionSpeed = 2)和上市 100 天后没有被收养(AdoptionSpeed = 4)的预测更准确。随机森林并没有显示出倾向于某一特定类别的趋势。相比之下,SVM 倾向于将宠物分为收养速度 2 级。

该模型的一个可能的限制是采用速度为 0 的数据点太少,因此很难评估其分类精度。另一方面,在随机森林的上述限制下,如果 PetFinder 增加了一个超过 100 个级别的新分类变量,则使用最小λ的多项 Lasso 逻辑回归而不是随机森林将是对新来宠物的采纳速度进行分类的更好选择。

当我们尝试将我们的模型应用到现实生活中的业务时,我们应该开发一个业务案例来确定预测是否准确,以及业务是否可以利用预测来优化其资源规划,从而提高采用性能。通过根据我们的预测模型分配资源,企业可以将以前的采用绩效与未来的采用绩效进行比较。收养绩效的提高可以通过同一时期内被收养动物数量的增加来证明。此外,企业应该分析预测收养时间长的动物是否可以在较短的时间内被收养,以查看资源分配的变化是否有效率。

部署

**通过评估每个模型的 OOS 精确度,我们得出结论,随机森林生成的 OOS 精确度最高,是 PetFinder 的最佳选择。**每当有新宠物进来,PetFinder 只需输入宠物的特征,就能预测它被收养需要多长时间。更准确地估计收养时间将使我们能够改善动物的状况,这对加快收养速度至关重要,并随后节省庇护成本。

为了更深入地了解哪些具体特征对需要更长时间才能被采用的宠物有重大影响,我们使用最小λ检验了通过多项逻辑回归和 Lasso 选择的变量。由于变量选择在数据的每个折叠中都不同,我们取 3 个折叠中变量选择的交集,发现在采用速度的四个级别中,年龄、品种、上传的照片数量和上传的视频数量都很重要。具体来说,对于领养速度较慢的宠物,人们更关注它们的健康状况:是否接种疫苗、驱虫、绝育。另外,描述的长度在收养速度较慢的宠物的简介中起着更重要的作用。如果宠物被归类为可能需要更长时间才能被收养,PetFinder 应该鼓励收容所优先考虑宠物的健康,并增加简介的描述长度。

一个重要的伦理考虑是,是否应该根据宠物的预测收养速度来区别对待它们。在没有预测模型的情况下,我们假设所有宠物都接受同等水平的治疗。然而,如果我们建议企业将更多资源分配给预测收养速度较低的动物,我们将导致资源分配不均。如果我们的预测不准确,一些宠物会受到负面影响,更不可能被收养。从这个角度来看,企业改善全球动物福利的目标可能无法完全实现。

**我们的模型的一个可能的风险是,我们目前对宠物的实际收养速度等级为 0 的预测不准确。**如果这些宠物被预测为 3 级或 4 级,企业将分配更多资源来推广它们,从而导致有限资源的浪费。为了降低风险,我们应该经常更新和改进我们的模型,因为我们有更多的记录,尤其是实际采用速度为 0 的记录。

用 GCP 的预言家预测空气污染

原文:https://towardsdatascience.com/predicting-air-pollution-with-prophet-on-gcp-42ceb1625818?source=collection_archive---------52-----------------------

使用 EPA 的公共数据进行时间序列预测

GCP 提供了一套云技术和全面管理的无服务器解决方案,使处理,存储和分析数据变得容易。该分析将利用 BigQueryGeo VizAI 平台

GCP 向新用户提供 300 美元的试用积分。此外,BigQuery 每月提供 1TB 的免费处理。本演示使用了这些配额的一部分。

BigQuery 是一个无服务器的数据仓库和分析工具,具有熟悉的 SQL 接口。它具有地理空间分析的地理信息系统能力,这使它成为任何环境评估的理想工具。此外,BigQuery 提供了许多公开可用的数据集,包括 EPA 的历史数据。

美国环保署维持着一个全面的监测网络,监测许多有害的空气污染物,包括臭氧(O₃)、氮氧化物和颗粒物。该网络确保空气质量符合国家空气质量标准,并协助分析和模拟空气污染模式。

我们将把重点放在每日臭氧摘要上,这在 BigQuery 上很容易获得。这个数据集可能很难处理,因为来自全国各地监视器的大量信息包含每日记录。

抽取、转换、加载至目的端(extract-transform-load 的缩写)

第一件事是在 BigQuery 中创建一个数据集来保存我们将在表中处理的数据,将数据集命名为 EPAO3

接下来,我们查询 EPA 的每日臭氧,并按县、州和月对每日最大臭氧进行最大聚合。我们将这些数据与 2016 年美国人口普查中的县几何数据相结合,以使这些数据在 Geo Viz 中可见。查询结果作为一个新表存储在我们的数据集中,名为 o3monthlymax

按县汇总的月最大臭氧量表的创建

这个查询运行了 37 秒,处理了 627.8 mb 的数据。消耗的槽时间,总 CPU 时间,是 9 分 37 秒。与传统的单一处理数据库相比,BigQuery 能够显著提高查询速度。创建的新表有 2.26gb 的数据和 33K 行。

健康影响与急性接触相关联,使得每日最大一小时臭氧值成为健康影响的合理替代值。

数据可视化

既然我们已经处理了数据,我们可以在 BigQuery Geo Viz 中检查它。让我们做一个时间跨度上的最大聚合,以使 Geo Viz 中的可视化更容易。

o3max_v 视图用于 Geo Viz

我们将把它保存为一个新视图,而不是运行查询。调用视图 o3max_v 。在 EPAO3 数据集中找到新视图,突出显示导出,并选择使用 Geo Viz 进行探索。您需要授权 Geo Viz 访问您的数据。我们可以使用默认的查询 Geo Viz 来访问我们的数据

地理 Viz 查询

几何图形应自动选择为几何图形列。移动到样式和填充颜色。选择数据驱动选项,并在字段选择器中滚动到 O3 。这里选择线性作为函数,但是间隔也可以工作。添加一些领域的限制,并发挥范围内的颜色,直到你满意的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

按县划分的最大 1 小时臭氧 Geo Viz 地图

请注意,一些县在监测网络中有很好的代表性,而另一些县则没有监测员。例如,内布拉斯加州和堪萨斯州很少有臭氧监测器。

时间数列预测法

接下来我们将使用 Prophet 进行空气污染预测。Prophet 是由脸书开发的开源时间序列预测工具。它基于一个附加模型,其中非线性趋势适用于各种时间窗口和假期趋势。

我们将使用 GCP 的人工智能平台创建一个虚拟机来运行 Prophet,该平台具有适合机器学习的虚拟机。在 AI 平台中创建一个新的笔记本实例,这里使用的是定制的 n1-standard-1 机器类型,这有助于最小化成本。AI 平台上的 Notebook 实例已经过身份验证,可以访问同一个项目中的 BigQuery。

一旦虚拟机被配置好,你就可以直接从 GCP 控制台打开 jupyterlab 。从那里创建一个 Python 3 笔记本或者上传到 github repo 中。

人工智能平台 Jupyter 笔记本使用 BigQuery 上的数据预测未来的臭氧

BigQuery 客户端库提供了 cell magic,它可以运行 SQL 查询并以 Pandas DataFrame 的形式返回结果,从而使 python 查询变得容易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

洛杉矶县臭氧预测。监控值以黑点显示。预测用蓝线显示。

臭氧往往在夏季达到峰值,因为它依赖于温度。Prophet 在捕捉臭氧的季节性变化方面做了合理的工作,并提供了现成的参数。

摘要

我们能够使用 GCP 平台和开源软件上包含的工具,在几个步骤中完成复杂的地理空间时间序列分析。

感谢

感谢爱德华·克鲁格道格拉斯·富兰克林审阅本文。

预测里斯本 AirBnB 的价格:树木和随机森林

原文:https://towardsdatascience.com/predicting-airbnb-prices-in-lisbon-trees-and-random-forests-336d19cdf5a2?source=collection_archive---------32-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

安德烈亚斯·布吕克尔在 Unsplash 上的照片

在这篇小文章中,我们将快速启动一个预测模型,预测里斯本 AirBnB 的夜间价格。本指南希望通过使用真实数据和开发真实模型,为机器学习数据分析提供简单实用的介绍。

它还假设对 Python 和机器学习库 scikit-learn 有基本的了解,并且是在运行 Python 3.6 和 sklearn 0.21 的 Jupyter 笔记本上编写的。数据集和笔记本都可以在我的 Github 账户上获得,或者通过谷歌的数据集搜索获得。

1.数据探索和清理

作为第一步,我们从加载数据集开始。下载文件后,用 Pandas 打开并解析它是很简单的事情,并提供一个我们可以从中期待的快速列表:

Index(['room_id', 'survey_id', 'host_id', 'room_type', 'country', 'city', 'borough', 'neighborhood', 'reviews', 'overall_satisfaction', 'accommodates', 'bedrooms', 'bathrooms', 'price', 'minstay', 'name', 'last_modified', 'latitude', 'longitude', 'location'], dtype='object')

尽管我们可以确认数据集已被正确加载和解析,但对数据统计描述的快速分析可以让我们快速了解其本质:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这个表中,我们实际上可以推断出每个参数的基本统计观察值。因为我们的模型打算根据我们将提供给它的任何一组输入来预测价格,所以我们可以检查例如:

  • 每晚价格的平均值约为 88 欧元
  • 价格从最低 10 欧元4203 欧元不等
  • 价格的标准偏差约为 123 欧元(!)

价格分布可以表示如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如我们所见,我们的价格分布集中在 300 欧元区间下,有一些条目对应 4000 欧元的值。绘制出大部分价格所在的位置:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上面的描述中我们可以清楚地看到,在里斯本住一晚的大部分价格在 0-150 欧元之间。

现在,让我们窥探一下实际数据集,以便了解我们将要处理的参数类型:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上面的描述中,我们应该能够推断出一些关于数据性质的统计数据。除了分布参数集(我们现在不寻找),我们清楚地确定了两组相关的见解:

  • 有空列:countryboroughbathroomsminstay
  • host_idsurvey_idroom_idnamecitylast_modifiedsurvey_id这样的条目可能与我们的价格预测器不太相关
  • 有一些分类数据,我们最初无法添加到价格回归中,例如room_typeneighborhood(但我们稍后会回到这两个数据)
  • location现在可能是多余的,因为我们既有latitude又有longitude,我们可能需要进一步推断该字段格式的性质

然后,让我们继续将数据集分为:

  • 一个向量 Y 将包含数据集的所有真实价格
  • 在矩阵 X 上,包含我们认为与我们的模型相关的所有特征

这可以通过下面的代码片段来实现:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有了新的子集,我们现在可以尝试了解这些参数在最常见价格范围内的总体满意度方面的相关性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上述图表允许我们检查所有单个变量的分布,并试图推断它们之间的关系。我们可以根据我们选择的每个参数的审核值自由应用色调。上图中一些简单易懂的例子,来自可能表示正相关的关系:

  • 对于住宿较少的房间,评论的数量更常见。这可能意味着大多数评论的客人都租了较小的房间。
  • 大多数评论都是针对价格较低的房间的
  • 考虑到黄色的视觉优势,大多数评论实际上是 5 分。要么这意味着大多数住宿实际上是非常令人满意的,或者最有可能的是,大量的人实际上审查,这样做是为了给 5 分的评级。

一个奇怪的观察是,位置严重影响价格和评级。绘制经度和纬度时,我们可以获得里斯本沿线评级的准地理/空间分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,我们可以将这些数据添加到里斯本的实际地图上,以检查分布情况:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正如预期的那样,大多数评论都是关于市中心的,一些评论已经与最近的 Parque das Na es 相关。北部更多的次城区,尽管它有一些分散的地方,但评论没有中心那么高和普遍。

2.分割数据集

现在我们的数据集已被正确清除,我们将首先把它分成两部分:

  • 将负责训练我们的模型的集合,因此称为训练集合
  • 一个验证集,它将被用来验证我们的模型

这两个集合基本上都是 XY 的子集,包含租赁空间及其相应价格的子集。然后,在训练我们的模型之后,我们将使用验证集作为输入,然后推断我们的模型在归纳成除了用于训练的数据集之外的数据集方面有多好。当一个模型在训练集上表现很好,但不能很好地推广到其他数据时,我们说该模型对数据集过度拟合

有关过度配合的更多信息,请参考https://en.wikipedia.org/wiki/Overfitting

为了避免我们的模型对测试数据的这种过度拟合,我们将使用 sklearn 的一个名为https://sci kit-learn . org/stable/modules/generated/sk learn . model _ selection . train _ test _ split . html的工具,该工具基本上将我们的数据分割成一系列随机的训练和测试子集:

Training set: Xt:(10183, 6) Yt:(10183,) 
Validation set: Xv:(3395, 6) Yv:(3395,) 
- 
Full dataset: X:(13578, 6) Y:(13578,)

现在我们已经有了数据集,我们现在可以继续创建一个简单的回归模型,根据我们选择的参数,尝试预测里斯本 AirBnb 的每夜费用。

3.种植决策树

作为最简单的监督 ML 模型之一,决策树通常用于通过从所有可用的特征数据中学习和推断决策规则来预测结果。通过获取我们的数据参数,这些树可以学习一系列有知识的“问题”,以便以某种方式划分我们的数据,我们可以使用得到的数据结构对分类数据进行分类,或者简单地为数值创建回归模型(就像我们对价格的情况一样)。

一个可视化的例子,取自维基百科,可以是围绕泰坦尼克号乘客生存预测的决策树:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基于这些数据,树建立在根上,并且将通过将每个节点分成两个子节点来(递归地)划分。这些生成的节点将根据我们向模型提供的统计数据推断出的决策进行拆分,直到我们达到数据拆分产生最大信息增益的点,这意味着我们可以根据我们迭代创建的类对所有样本进行正确分类。我们称之为“叶子”的末端顶点。

在上面的维基百科示例中,遵循决策过程是微不足道的,因为存活概率是这里的估计参数,所以我们可以很容易地获得当“他没有兄弟姐妹”时,“9.5 岁以上的男性”存活的概率。

(为了更深入地理解决策树是如何为回归构建的,我推荐由 StatQuest 制作的名为决策树的视频。

然后让我们通过利用 sklearn 实现来创建我们的决策树回归:

DecisionTreeRegressor(criterion='mse', max_depth=None, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=42, splitter='best')

为了便于说明,我们可以在下图中验证树是如何构建的:

在这里找到生成树的图形表示 @ Github。

我们还可以显示预测的片段,以及训练数据集样本的相应参数。所以对于以下住宿:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们获得以下价格:

array([ 30., 81., 60., 30., 121.])

在将我们的模型拟合到训练数据之后,我们现在可以对验证集运行预测,并评估我们的模型的当前绝对误差,以评估当不针对它所测试的数据运行时它的概括程度。

为此,我们将使用平均绝对误差 (MAE)度量。我们可以将这一指标视为预测集中的平均误差幅度。它可以这样表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它基本上是我们的模型预测(y)和实际观测值( y-hat )之间差异的平均值,考虑到所有个体差异具有同等的权重。

然后,让我们使用 Scikit Learn 实现将这一指标应用于我们的模型:

42.91664212076583

这一结果基本上意味着,当暴露于测试数据时,我们的模型给出的绝对误差约为每间客房 42.935 欧元,而我们在初始数据探索期间收集的平均值为 88.38 欧元

要么是因为我们的数据集太小,要么是因为我们的模型太天真,这个结果并不令人满意。

尽管这在这一点上看起来令人担忧,但总是建议尽快创建一个生成结果的模型,然后开始迭代优化。因此,现在让我们继续尝试改进我们模型的预测。

目前,我们确实为测试数据的过度拟合而痛苦。如果我们想象正在构建的决策树,由于我们没有为要分割的决策指定限制,因此我们将生成一个决策树,该决策树一直深入到测试特征,而不是在任何测试集上很好地概括。

由于 sklearn 的DecisionTreeRegressor允许我们指定叶节点的最大数量作为超参数,因此让我们快速尝试评估是否存在降低 MAE 的值:

(Size: 5, MAE: 42.6016036138866) 
(Size: 10, MAE: 40.951013502542885) 
(Size: 20, MAE: 40.00407688450048) 
(Size: 30, MAE: 39.6249335490541) 
(Size: 50, MAE: 39.038730827750555) 
(Size: 100, MAE: 37.72578309289501) 
(Size: 250, MAE: 36.82474862034445) 
(Size: 500, MAE: 37.58889602439078) 250

然后,让我们尝试生成我们的模型,但包括计算的最大树大小,然后用新的限制检查其预测:

36.82474862034445

因此,通过简单地调整我们的最大叶节点数超参数,我们就可以获得模型预测的显著增加。我们现在已经改进了我们模型的平均误差(42.935 - 36.825 ) ~ 6.11 欧元

4.分类数据

如上所述,即使我们能够继续优化我们非常简单的模型,我们仍然放弃了两个可能的相关字段,它们可能(也可能不会)有助于我们模型的更好的泛化和参数化:room_typeneighborhood

这些非数字数据字段通常被称为分类数据,通常我们可以通过三种方式接近它们:

1)下降

有时,处理分类数据最简单的方法是…将其从数据集中删除。我们这样做是为了快速建立我们的项目,但是我们必须一个案例一个案例地去推断这些字段的性质,以及它们是否有意义被删除。

这就是我们到目前为止分析过的场景,MAE 为:36445

2)标签编码

所以对于标签编码,我们假设每个值被分配给一个唯一的整数。我们还可以考虑任何可能与数据相关的顺序/数量级(例如,评级、浏览量等)来进行这种转换。让我们使用 sklearn 预处理器检查一个简单的示例:

array([3, 3, 1, 0, 2])

通过分配拟合数据的数组索引来评估LabelEncoder正在进行的转换是很简单的:

array(['double room', 'shared room', 'single room', 'suite'], dtype='<U11')

然后,让我们将这种预处理技术应用于分类数据,并验证这如何影响我们的模型预测。因此,我们的新数据集将是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的分类数据在 panda 的数据帧上表示为一个object,可以通过以下方式提取:

['room_type', 'neighborhood']

现在我们有了列,接下来让我们在训练集和验证集上转换它们:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,让我们用转换后的数据来训练和拟合模型:

35.690195084932355

然后,我们改进了我们的预测器,对我们的分类数据进行编码,将我们的 MAE 降低到 ~ 35.69 欧元

3)一键编码

一次性编码不是枚举字段的可能值,而是创建新的列来指示编码值是否存在。让我们用一个小例子来展示这一点:

array([[0., 0., 0., 1., 0., 0., 1.], [0., 1., 0., 0., 0., 1., 0.]])

从上面的结果我们可以看到,二进制编码在每个特性数组实际启用的特性上提供了1,在不存在时提供了0。然后,让我们尝试在我们的模型上使用这种预处理:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以上面的结果乍一看可能很奇怪,但是对于 26 个可能的类别,我们现在有一个二进制编码来检查它的存在。我们现在将:

  • 添加回转换过程中丢失的原始行索引
  • 从原始集合train_Xvalidation_X中删除原始分类列
  • 用包含所有 26 个可能类别的新数据框架替换删除的列

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,我们可以继续在模型中使用新的编码集:

36.97010930367817

通过对我们的分类数据使用一个热编码,我们获得了 MAE to ~ 36.97EUR

这个结果可以证明,当与标签编码相比较时,对于我们的分类参数以及同时对于这两个参数来说,一键编码不是最佳的。然而,这个结果仍然允许我们将分类参数包括在初始 MAE 的减少中。

5.随机森林

从上一节我们可以看到,使用决策树,我们总是在以下两者之间保持平衡:

  • 一棵有很多叶子的深树,在我们的例子中,每片叶子上只有很少的 AirBnB 位置,对我们的测试集来说太多了(它们呈现了我们所说的高方差
  • 一棵浅树,叶子很少,无法区分一个项目的各种特征

我们可以将“随机森林”想象为决策树的集合,为了试图减少上述差异,决策树以允许算法以减少误差的方式选择剩余树的方式生成树。如何创建随机森林的一些示例如下:

  • 用不同的数据子集生成树。例如,根据上面分析的我们的参数集,将生成仅具有它们的随机集的树(例如,仅具有“评论”和“卧室”的决策树,另一个具有除“纬度”之外的所有参数
  • 通过对不同的数据样本进行训练来生成其他树(不同的大小,训练和验证数据集之间的不同划分等等)

为了减少方差,增加的随机性使得生成的单个树的误差不太可能相关。然后,通过组合不同的决策树预测,从所有预测的平均值中提取预测,这具有甚至消除一些错误的有趣效果,从而降低整个预测的方差。

更深入地解释该算法的原始出版物可以在本文末尾的参考书目部分找到。

然后,让我们使用随机森林来实现我们的预测器:

33.9996500736377

我们可以看到,当使用随机森林时,我们的 MAE 显著降低。

6.摘要

尽管决策树是机器学习中非常简单(可能是最简单)的回归技术,我们可以在我们的模型中使用,但我们希望演示一个分析数据集以生成预测的样本过程。很明显,通过小的优化步骤(如清理数据、对分类数据进行编码)和将单棵树抽象为随机森林,我们可以显著降低模型预测的平均绝对误差。

我们希望这个例子作为机器学习的实践经验变得有用,如果我可以澄清或纠正上面演示的一些内容,请不要联系我。在未来的一些文章中,我们还计划使用其他方法和工具进一步优化我们对这个特定数据集的预测,敬请关注:)

7.进一步阅读

请在下面找到一些资源,它们对于理解一些公开的概念非常有用:

欢迎随时联系我@https://Jose . tapadas . eu

使用 PyTorch 和 Apache Mxnet 的分层注意力网络预测亚马逊评论分数

原文:https://towardsdatascience.com/predicting-amazon-reviews-scores-using-hierarchical-attention-networks-with-pytorch-and-apache-5214edb3df20?source=collection_archive---------19-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这篇文章和这里的代码是一个更大的回购的一部分,我有(非常创造性地)称为“NLP-stuff”。顾名思义,我在回购项目中包括我所做的项目和/或我的想法——只要有与这些想法相关的代码——都与 NLP 相关。在每个目录中,我都包含了一个 README 文件和一系列解释笔记本,我希望它们有助于解释代码。我打算在 2020 年继续添加项目,不一定是最新和/或最流行的版本,而只是我觉得有趣和有用的论文或算法。特别是这篇帖子相关的代码在目录Amazon _ reviews _ class ification _ HAN

首先,让我们从感谢那些努力工作的相关人员开始。本帖及配套回购基于论文“用于文档分类的分层注意网络”(杨子超等,2016 )。此外,在我的实现中,我还使用了“正则化和优化 LSTM 语言模型”中的结果和代码( Stephen Merity,Nitish Shirish Keskar 和 Richard Socher,2017 )。我在回购中用于此实验和其他实验的数据集是亚马逊产品数据 ( J. McAuley 等人,2015R. He,J. McAuley 2016 ),特别是服装、鞋子和珠宝数据集。我强烈建议看一看这些论文和其中的参考资料。

1.网络架构

完成后,让我们从描述我们将在此实施的网络体系结构开始。下图是Figure 2杨子超等人的论文。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1(他们论文中的图 2)。分层注意网络

我们考虑一个由 L 个句子st5】ᵢ组成的文档,每个句子包含tt11】ᵢt13】个单词。 w_it 带 T∈【1,T】,代表第 i 个句中的词。如图所示,作者使用了一个单词编码器(一个双向 GRU, Bahdanau 等人,2014 ),以及一个单词注意机制,将每个句子编码成一个向量表示。这些句子表示通过具有句子注意机制的句子编码器,产生文档向量表示。该最终表示被传递给具有相应激活函数的全连接层以进行预测。单词“层次化在这里指的是首先从单词编码句子,然后从句子编码文档的过程,自然遵循文档中的“语义层次化”。

1.1 注意机制

假设一个人熟悉 GRU 公式(如果不是看这里的),所有理解注意力机制所需的数学都包括在下面。我在这里包括的数学表达式指的是注意机制这个词。句子注意机制相同,但在句子层面。因此,我相信解释下面的表达式,以及下面的代码片段,将足以理解整个过程。前三个表达式非常标准:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程组 1(直接从论文中提取):GRU 输出

其中 x_it 是单词 t 在句子 i. 中的单词嵌入向量,向量h*_ it*是来自双向 GRU 的前向和后向输出特征,它们在应用关注之前被连接。注意机制的公式如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程组 2(直接从论文中摘录):字注意。句子注意相同,但在句子级别**。**

首先, h_it 特征通过一个带有双曲正切函数的单层 MLP。这导致了一个隐藏的表示 h_it,u_it。然后,将每个单词的重要性度量为 u_it 与上下文向量 u_w 的点积,得到所谓的归一化重要性权重 α_it 。之后,基于归一化的重要性权重,计算句子向量 s 作为 h_it 特征的加权和。更多详情,请阅读论文第 2.2 节"等级注意*"如前所述,句子注意机制是相同的,但在句子层面。*

单词和句子的注意力可以编码为:

Pytorch:

片段 1。Pytorch 的单词和句子注意机制

Mxnet:

片段 2。Mxnet 的单词和句子注意机制。

其中inph_ith_i 分别为单词和句子注意。

可以看出,Mxnet 的实现与 Pytorch 中的几乎相同,尽管有一些细微的差别。这将是贯穿整个韩实施的情况。不过我想补充几行澄清一下:这是我第二次“认真”潜入 Mxnet 和胶子。我用得越多,我就越喜欢它,但是我很确定我可以写出更好、更有效的代码。记住这一点,如果你,读者,是一个 Mxnet 用户,并有建议和意见,我很乐意听到他们。

1.1.1 字编码器+字注意

一旦我们有了AttentionWithContext类,编码WordAttnNet(单词编码器+单词注意力)就简单了。下面的代码片段是回购的简化版本,但包含了主要组件。完整版请看回购中的代码。

Pytorch

代码片段 3:单词编码器+单词注意力模块(又名单词注意力网络)的 Pytorch 实现

Mxnet

代码片段 3:单词编码器+单词注意力模块(又名单词注意力网络)的 Mxnet 实现

您将注意到 3 个与信号丢失相关的参数:embed_dropweight_droplocked_drop。我将在第 2 节中详细描述它们。目前,让我们忽略它们,将注意力集中在模块的其余组件上。

简单地说,输入令牌(X)通过嵌入查找表(word_embed)。得到的令牌嵌入通过双向 GRU ( rnn)和 GRU 的输出到达AttentionWithContext ( word_attn),后者将返回重要性权重(α)、句子表示( s )和隐藏状态 h_n

注意,返回隐藏状态是必要的,因为文档(这里是 amazon 评论)由一系列句子组成。因此,句子 i+1 的初始隐藏状态将是句子 i 的最后隐藏状态。我们可以说,我们将把文档本身视为“有状态的”。我将在稍后的文章中回到这个话题。

1.1.2 句子编码器+句子注意

假设我们不需要句子编码器的嵌入查找表,SentAttnNet(句子编码器+句子注意)简单来说就是:

Pytorch

代码片段 5:句子编码器+句子注意模块(又名句子注意网络)的 Pytorch 实现

Mxnet

代码片段 6:句子编码器+句子注意模块(又名句子注意网络)的 Mxnet 实现

这里,网络将接收WordAttnNet ( X)的输出,该输出然后将通过双向 GRU ( rnn),然后通过AttentionWithContext ( sent_attn)。

至此,我们拥有了编码 HAN 的所有构件。

1.1.3 分层注意网络(HANs)

Pytorch

代码片段 7: Pytorch 实现的分层注意力网络(HAN)

Mxnet

代码片段 8:分层注意力网络(HAN)的 Mxnet 实现

我认为在这里用一些与张量在网络中导航时的维数相关的数字来说明网络中的数据流可能是有用的。让我们假设我们使用批量大小(bsz)为 32,令牌嵌入为 dim ( embed_dim ) 100,GRUs 为隐藏大小(hidden_dim ) 64。

X之前的片段中对HierAttnNet的输入是 dim (bzs, maxlen_doc, maxlen_sent)的张量,其中maxlen_docmaxlen_sent是每个文档的最大句子数和每个句子的最大字数。我们假设这些数字是 5 和 20。所以,X在这里是 dim (32, 5, 20)的张量。

我们做的第一件事是改变坐标轴,得到一个 dim (5, 32, 20)的张量。这是因为我们将以“有状态”的方式,一次处理一个句子,将一个句子的最后一个隐藏状态作为下一个句子的初始隐藏状态。这将发生在向前传球的循环中。

在这个循环中,我们将一次处理一个句子,也就是说,一个 dim (32, 20)的张量包含批处理中所有 32 个评论的第个到第个句子。然后将这个张量传递给wordattnnet,简单来说就是前面所说的单词编码器+单词注意力。在那里,它将首先通过嵌入层,产生一个 dim 张量(32, 20, 100)。然后通过双向 GRU,产生 dim 张量(32, 20, 128),最后通过注意机制,产生 dim 张量(32, 1, 128)。这最后一个张量是杨子超等人论文中方程 7 中的*,对应于第 I 个句子的向量表示。*

运行该循环后,我们将得到沿第二维连接的 dim (32, 1, 128)maxlen_doc(即 5 个)张量,从而得到 dim (32, 5, 128)(bsz, maxlen_doc, hidden_dim*2)的张量。这个张量再经过sentattnnet,就是前面说的简单的句子编码器+句子注意。在那里,它将首先通过双向 GRU,产生一个 dim 张量(32, 5, 128),最后通过注意力机制,产生一个 dim 张量(32, 128)。这最后一个张量将是他们论文中方程 10 中的 v

最后、*、**、 v 、*然后通过全连接层和 Softmax 函数进行预测。

2。嵌入、锁定和重量损失

当我开始运行实验时,我注意到模型在训练过程中过早地过度拟合。最佳验证损失和准确性发生在最初的几个时期内,或者甚至在第一个时期之后。出现过度拟合时,有多种选择:

  • ***降低模型复杂性:*我通过运行一些具有少量嵌入和/或隐藏大小的模型来探索这一点。
  • 提前停止:通常通过early_stop功能使用。
  • ***附加正则化,*如剔除、标签平滑( Christian Szegedy 等人,2015 年)或数据增强。我写“附加”是因为我已经使用了重量衰减。

在本练习中,我没有探讨标签平滑或数据扩充。如果你想更深入地了解如何在 Pytorch 中实现标签平滑,看看这个 repo 。在 Mxnet 的情况下,gluonnlp API 有自己的 LabelSmoothing 类

关于数据扩充,事实是我还没有尝试过,也许我应该尝试一下。不仅因为它通常会在模型泛化方面带来显著的改进,而且因为我已经从另一个实验中获得了大部分代码,在那里我实现了 EDA:用于提高文本分类任务性能的简单数据增强技术 ( Jason Wei 和邹凯 2019 )。然而,一个人必须在某个地方停下来,我决定专注于探索不同的辍学机制。

我在这里使用的 3 种不同形式的辍学是:嵌入辍学,锁定辍学和重量辍学。我使用的代码直接取自AWD-LTSM 协议( Merity,hirish Keskar and Socher,2017 )实施对应的 salesforce 回购。在这一节中,我将重点讨论 Pytorch 的实现,但是我也将包括关于 Mxnet 实现的信息。请注意,这些退出机制最初是在语言模型的环境中考虑和实现的。然而,没有理由为什么它们不应该在这里工作(或者至少没有理由为什么我们不应该尝试它们)。

2.1 嵌入脱落

这将在第 4.3 节中详细讨论。基于 Gal & Ghahramani (2016) 的工作。没有人比作者自己更好地解释它了。用他们自己的话说:“这相当于在单词级别上对嵌入矩阵执行丢弃,其中丢弃在所有单词向量的嵌入中传播。[……]"**

代码(以下代码是原* 回购 )中的简化版本😗

嵌入丢失的简化(即不完整)实现。来自 Merity,Shirish Keskar 和 Socher 2017: 规范和优化 LSTM 语言模型

基本上,我们沿着嵌入张量的第一维(“单词维)创建 0 和 1 的掩码,然后我们沿着第二维(“嵌入维)扩展该掩码,相应地缩放剩余的权重。正如作者所说,我们放弃文字。

2.2 锁定脱落

这也是基于Gal&Ghahramani(2016)的工作。再次用作者的话来说:“[…] 在第一次调用时只对二进制丢失掩码进行一次采样,然后对正向和反向传递中的所有重复连接重复使用锁定的丢失掩码”。

在代码中:

锁定辍学的实现。来自 Merity,Shirish Keskar 和 Socher 2017: 规范和优化 LSTM 语言模型

简单地说,LockedDropout将接收一个三维张量,然后它将沿第二维生成一个掩码,并沿第一维扩展该掩码。例如,当应用于像(batch_size, seq_length, embed_dim)这样的张量时,它将创建一个模糊(1, seq_length, embed_dim)的遮罩,并将其应用于整批。Mxnet 的nn.Dropout模块有一个axes参数,直接实现这种类型的退出。

最后…

2.3。重量下降

这在他们论文的第二部分讨论。再一次,用他们自己的话说:“我们建议在递归隐藏到隐藏权重矩阵上使用 DropConnect (* 万等人,2013*),这不需要对公式进行任何修改。”**

代码(以下代码是原* 回购 )中的简化版本😗

重量下降的简化(即不完整)实现。来自 Merity,Shirish Keskar 和 Socher 2017: 规范和优化 LSTM 语言模型

WeightDrop将首先复制并注册带有后缀_raw 的隐藏到隐藏的权重(或一般意义上的List权重中的权重)(第 14 行)。然后,它将应用 dropout 并将权重再次分配给module (如果variational为第 25 行,否则为第 27 行)。如代码片段所示,variational选项与之前讨论的嵌入丢失的情况相同,即沿张量的第一维生成一个掩码,并沿第二维扩展(或广播)。

这种实现有几个缺点。首先,给定一些输入权重,最终的模型将包含原始权重(称为weight_name_raw)和那些丢失的权重(称为weight_name),这不是很高效。其次,它更改了参数的名称,在原来的名称上添加了’module’。

老实说,这些根本不是主要的缺点,但是我可以把它们作为一个借口来介绍另外两个可能更好一点的实现(当然是基于原来的实现)。一个是[fastai](https://github.com/fastai/fastai)库中伟大的text API 中的实现。我想在这一点上每个人都知道这个库,但是如果你不让我在这里写几行。我发现这个库非常优秀,不仅因为它提供的高级 API,或者巧妙的默认设置,还因为在源代码中隐藏了很多小宝石。如果你对图书馆不熟悉,试一试,没有回头路。

另一个不错的实现是 Mxnet 的 gluonnlp API 中的函数apply_weight_drop,我在这里使用了它。事实上,在他们的[AWDRNN](https://gluon-nlp.mxnet.io/_modules/gluonnlp/model/language_model.html#AWDRNN)语言模型的实现中,这个函数被用于嵌入和隐藏到隐藏的权重丢失。可通过他们的utils模块获得:

*from gluonnlp.model.utils import apply_weight_drop*

就实现而言,就是这样。是时候做些实验了。

3。结果和可视化注意力

3.1。结果

我最终记录了 59 个实验(我又运行了几个),其中 40 个使用 Pytorch 实现,19 个使用 Mxnet。在整个实验中,我使用了不同的批量大小、学习速率、嵌入维数、GRU 隐藏大小、辍学率、学习速率调度器、优化器等。都显示在笔记本04 _ Review _ Score _ Prediction _ results . ipynb的表 1 和表 2 中。下表显示了每个实现的测试数据集上的最佳结果,以及我从使用 tf-idf 以及 LightGBM 和 Hyperopt 进行分类和超参数优化任务的先前尝试中获得的最佳结果。

表 1。将 HANs 与 Pytorch 和 Mxnet 以及 tf-idf+LightGBM 配合使用可获得最佳结果。更多详情请参见回购

首先,值得重申的是,我只对 Mxnet 实现进行了 19 次实验。部分原因是,正如我在本文前面提到的,我在 Pytorch 上的经验比 Mxnet 和 Gluon 多,这影响了相应的实验。因此,很有可能我错过了对 Mxnet 模型的一个小的调整,这个调整会导致比表中的结果更好的结果。

除此之外,我们可以看到 HAN-Pytorch 模型在所有准确度、F1 分数和精确度的测试数据集上比彻底调整的 tf-idf +LighGBM 模型表现得更好。因此,下一个最直接的问题是:使用 HAN 而不是 tf-idf+LightGBM (或者您最喜欢的分类器)值得吗?答案是,就像生活中的大多数事情一样,“这要看情况”。

确实汉族表现更好,但是涨幅比较小。一般来说,抛开亚马逊评论的特例不谈,如果在你的业务中,3%左右的 F1 分数很重要(即导致收入、节约或其他一些好处的大幅增加),那么毫无疑问,人们会使用 DL 方法。最重要的是,注意力机制可能会给你一些额外的有用信息(比如文本中导致某种分类的表达),而不仅仅是通过使用 tf-idf (或主题建模)等方法获得的关键词。

最后,我的 HANs 实现效率很低(见下一节)。即使在这种情况下,表中显示的结果也总是在不到 10 个时间段内获得,每个时间段在 Tesla K80 上运行约 3 分钟(或更短,取决于批次大小)。因此,这当然不是一个计算量很大的训练算法,而且性能很好。总的来说,我认为在执行文本分类时,HANs 是一个很好的算法。

3.2 观想注意力

现在让我们来看看注意力权重,特别是单词和句子的重要性权重(α)* 。*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图二。已被正确分类的评论的注意力图,包括正面(顶部)和负面(底部)评论。颜色强度对应于重要性权重的值(本文第 2 组等式中的αs 或他们论文中的等式 6 和 9)。

图 2 显示了两个被正确分类的评论的单词和句子的注意力权重。xxmaj记号是由 fastai 记号赋予器引入的特殊记号,表示下一个记号以大写字母开始。此外,值得一提的是,在原始数据集中,评论得分从 1-5 星不等。在预处理过程中,我将带有 1 和 2 starts 的评论合并到一个类中,并将这些类重新标记为从 0 开始(详见这里的)。因此,最终的类数为 4: {0,1,2,3}。

该图显示了在预测评论分数时,韩如何关注短语和结构,如“fit is perfect”、“ very superior ”或“rub[…]error places”,以及孤立的词,如“buyed”或“ not ”。此外,我们可以看到,在上面的图中,相对于其他 3 个句子,第 3 个句子受到了更多的关注。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3。除了分类错误之外,与图 2 相同。

图 3 显示了两个被错误分类的评论的单词和句子的注意力权重。最高评价被预测为 0,而真实分数为 3(原始数据集中的真实分数为 5)。有人发现这些靴子“恶心”、“令人失望”和“糟糕”,却给了他们 5 颗星的评分。底部的评论被预测为 3,而真实分数为 0(原始数据集中的真实分数为 1)。这就很容易理解为什么韩把这篇评论错误地归类为第一句话,而第一句话是最受重视的。

尽管如此,这些数字表明,注意力机制运作良好,捕捉评论中的相关片段,从而导致某种分类。笔记本05 _ Visualizing _ attention . ipynb包含了我用来生成这些图的代码。

4。讨论

在这一阶段,有几条意见值得提出。首先,我手动运行了所有实验(使用一个 bash 文件),这不是优化模型超参数的最佳方式。理想情况下,人们希望将训练和验证过程封装在一个目标函数中,并使用 Hyperopt,正如我在 repo 中对所有其他侧重于文本分类的实验所做的那样。在不久的将来,我将包含一个.py脚本来完成这个任务。

另一方面,观察图 2 和 3,可以看到注意力通常集中在孤立的单词或结构和短语或 2 或 3 个单词上。因此,有人可能会认为使用非 DL 方法和 n-grams 可能会改善表中的结果。我实际上在这个笔记本中做了,使用或不使用 n 元模型(特别是通过[gensim.models.phrases](https://radimrehurek.com/gensim/models/phrases.html)的二元模型)之间的差异可以忽略不计。

其他值得讨论的问题与模型的泛化和效率有关。例如,我已经提到,可以使用标签平滑和数据扩充来增加正则化。事实上,即使增加了一些遗漏,最好的验证损失和度量仍然在训练的早期获得,而且在 Mxnet 实现的情况下。这不一定是不好的,可能只是反映了这样一个事实,即模型在几个时期后就达到了最佳性能。然而,还需要更多的探索。

另外,如果你看一下我的实现细节,你会发现输入张量有很多不必要的填充。从这种填充中不会学到任何东西,但仍然必须进行处理,即这对于 GPU 来说是低效的。为了补救这种情况,可以将相似长度的评论分组到桶中,并相应地填充,从而减少处理文档所需的计算。此外,可以根据文档长度调整学习速率和批量大小。所有这些方法都已经被用于构建语言模型(例如,参见这个演示)并且在 gluonnlp API 上很容易获得。在这一点上,我只是触及了这个 API 的皮毛,我期待着在不久的将来进行更多的实验。

5.总结和结论

我已经使用 Pytorch 和 Mxnet 实现了“用于文档分类的分层注意力网络”(杨子超等人,2016 )来预测亚马逊评论得分,并将结果与之前不涉及深度学习的实现进行了比较。HANs 在所有评估指标上都表现得更好,相对容易实施,训练也更快。因此,我相信这是一个值得在文本分类任务中使用的算法。

除此之外,一如既往,我希望这篇文章对你有用。

任何意见,建议,请发邮件给我:jrzaurin@gmail.com 或更好地在回购问题。

参考文献

Dzmitry Bahdanau,KyungHyun Cho,Yoshua Bengio 2016。通过联合学习对齐和翻译的神经机器翻译。https://arxiv.org/abs/1409.0473

2015 年邹斌·格拉马尼·亚林加尔。递归神经网络中基于理论的丢包应用。https://arxiv.org/abs/1512.05287。**

毁了何,朱利安·麦考利 2016。起伏:用一类协同过滤模拟流行趋势的视觉演变。https://arxiv.org/abs/1602.01585

朱利安·麦考利、克里斯托弗·塔吉特、秦风、史和安东·范·登·亨格尔 2015。基于图像的风格和替代品建议。https://arxiv.org/abs/1506.04757

Stephen Merity,Nitish Shirish Keskar,Richard Socher 2017。规范和优化 LSTM 语言模型。【https://arxiv.org/abs/1708.02182】T5T6

克里斯蒂安·塞格迪、文森特·范霍克、谢尔盖·约菲、黄邦贤·施伦斯、兹比格涅夫·沃伊纳 2015。重新思考计算机视觉的初始架构。https://arxiv.org/abs/1512.00567

李万,马修泽勒,张思欣,杨乐村,罗布弗格斯 2013。使用 DropConnect 正则化神经网络。http://proceedings.mlr.press/v28/wan13.html

贾森·魏,邹凯 2019。EDA:用于提高文本分类任务性能的简单数据扩充技术。https://arxiv.org/abs/1901.11196

杨子超,杨迪一,,何晓东,亚历克斯·斯莫拉,爱德华·霍维 2016。用于文档分类的分层注意网络。https://www.cs.cmu.edu/~./hovy/papers/16 hlt-hierarchical-attention-networks . pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值