TowardsDataScience 博客中文翻译 2019(三百九十六)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

在泰坦尼克号数据集上预测谁将幸存

原文:https://towardsdatascience.com/predicting-whos-going-to-survive-on-titanic-dataset-7400cc67b8d9?source=collection_archive---------6-----------------------

有志和初学者数据科学家的权威指南

您的首次数据科学之旅、探索性数据分析(EDA)和 Kaggle 提交的全面指南

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

Source: KWMP

上船啦!与泰坦尼克号一起开始您的数据之旅

欢迎来到数据科学 SS。我叫 Vincent,希望您会喜欢我们的数据科学首次旅程。今天,我们将和逝去的战友泰坦尼克号一起在大西洋中航行。我们要去仔细探索数据冰山,航行机器学习大海,准备有见地的下船。希望你和我以及数据科学 SS 一路顺风。

欢迎光临!!本文的目的是通过著名的 Kaggle Challenge 新手挑战赛——“泰坦尼克号:灾难中的机器学习”,来激起你对数据科学的兴趣

在这篇文章中,你将开始你的第一次探索性数据分析(EDA)和机器学习,以预测泰坦尼克号乘客的存活率。对于大多数入职数据科学家来说,这是一个创世纪的挑战,它将帮助你走向成功。希望这篇文章对你有所启发。上船啦!!

技术先决条件

我们将使用 Jupyter Notebook 和几个数据科学 Python 库。如果你还没有安装 Anaconda 在你的 Windows 或者 Mac 上。或者,您可以关注我的笔记本并享受这个指南!

台阶

对于大多数初学者来说。不要担心,我将指导您完成这篇文章,进行端到端的数据分析。以下是今天要探索的几个里程碑:

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

What we are going to learn

咻,离我们到达第一个目的地还有很长的一段路。我们开船吧,好吗?

导入

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

Importing Library. Source: unsplash

导入库

Python 库是一个函数和方法的集合,允许你在不写代码的情况下执行许多动作(Quora)。这将有助于您轻松运行几个数据科学功能。如果没有这个库,可以在命令提示符下运行pip install <library name>来安装。

这是我们正在使用的库列表:

  1. Numpy :多维数组和矩阵表示库
  2. 熊猫:数据帧的 Python 数据分析库,CSV 文件 I/O
  3. Matplotlib :数据可视化库
  4. Seaborn :构建在 Matplotlib 之上的数据可视化库。这给了你一个更清晰的可视化和更容易调用的界面。
**import** **numpy** **as** **np** 
**import** **pandas** **as** **pd** 
**import** **seaborn** **as** **sns**
**import** **matplotlib.pyplot** **as** **plt**

导入数据

我们可以用熊猫从泰坦尼克号数据页读取 train.csv。这段代码将创建一个 DataFrame 对象,它是一个二维数组,用于优化数据浏览过程。可以把它想象成 Python 中包含行和列的 Excelsheet。

maindf = pd.read_csv(‘dataset/Titanic/train.csv’)

探索数据

头部()或尾部()

我们将从查看数据中的前几行开始。这是为了先睹为快,确保正确提取数据。

maindf.head()

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

Data Frame Head

描述()

describe 将帮助你得到所有统计数字列的描述。如果将include 参数写成 object,它将描述非数字列。这是一种非常有用的方法,可以快速了解统计数据。

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

Describe() to explore Titanic Data

从这段描述中,我们可以找到以下思路:

  1. 变量的均值和分布。
  2. 大多数乘客以相对较低的价格买了票。但是,有一些是高价购买的,这表明可能是贵宾。
  3. 由于四分位数表示 0,最大值表示 6,因此帕奇分布高度偏斜。这意味着大多数人不带父母或孩子上船,少数父母带多达 6 个孩子和父母上船。

信息()

这些信息帮助您确定数据类型和空值的存在。这里我们发现*年龄、*舱位、上船栏目有缺失值。

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

这很好,我们已经确定了一些探索的途径。但首先,让我们清理数据。

干净的

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

Source: Unsplash

处理年龄中缺失的值

有几种方法可以替换年龄列中缺失的值:

  1. 不推荐:用年龄平均值代替。这不是一个好方法,因为你可以看到大多数乘客年龄在 20-30 岁之间,其中最大的 80 岁,最小的 0.42 岁(婴儿)。
  2. 推荐:替换为年龄中位数。这将是一个更好的方法,因为这将安全地将我们缺失的值分配到 20-30 岁,这是四分位数范围内的舒适值。
  3. **最推荐:根据每个称呼的中位数替换年龄。**这将是最好的方法,因为称呼将暗示估算数据中的共同年龄(例如:Sir、Mdm 等)。

**结论:**让我们采取第三种方法。如果你不知道lambda 是什么,你可以把它想成一个内联函数。这使得代码更容易阅读。

maindf['Salutation'] = maindf.Name.apply(lambda name: group = maindf.groupby(['Salutation', 'Pclass'])
group.Age.apply(lambda x: x.fillna(x.median()))
maindf.Age.fillna(maindf.Age.median, inplace = True)

删除不相关的列

为了简化分析,让我们删除一些可能与生存无关的列,比如乘客 id 和姓名。

但是,删除这些列时应该非常小心,因为这会限制您的假设。例如,名字为“约翰”的乘客生还的概率可能会高得惊人。仔细观察,这是因为“约翰”这个名字通常是为那些社会经济地位高的英国人保留的。因此,如果我们没有 SES 列,我们可能需要在分析中包含名称。

cleandf = maindf.loc[:,['Survived','Pclass','Sex','Age','SibSp','Parch','Embarked']]

设计功能

在这一部分,我们将对一些特征(列)进行处理,以进行合理且更有意义的数据分析。

社会经济状况

我们将根据 Pclass 中的数值对 SES 特征进行分类。我们只编码 1——上,2——中,3——下。

cleandf['socioeconomicstatus']=cleandf.Pclass.map({1:'upper',2:'middle',3:'lower'})

启航港口

我们将把字母值(’ C ‘,’ Q ‘和’ S ')映射到它们各自的端口。然后,我们可以根据乘客的出发港口和生存状况来划分乘客的数量。我们将使用饼图来比较基于启运港和生存状态的百分比。

cleandf['embarkedport']=cleandf.Embarked.map({'C':'Cherbourg','Q':'Queenstown','S':'Southampton'})

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

Ratios of survivals based on Port of Embarkation

年龄

我们将生成年龄直方图,并得出以下宁滨。宁滨是一种将连续数据的偏斜分布量化为离散类别的好方法。每个条柱代表分组数值的范围和强度程度。

agesplit = [0,10,18,25,40,90]
agestatus = ['Adolescent','Teenager','Young Adult','Adult','Elder']

cleandf['agegroup']=pd.cut(cleandf.Age,agesplit,labels=agestatus)

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

binned Age based on Age Split and Age Status Group

家庭关系

然而,救生艇仍然漂浮着,因此“伯肯黑德演习”的传说诞生了——这是一项在海上灾难中优先考虑妇女和儿童的协议。—历史

伯肯黑德演习引发了一些思考,你的孩子或妻子的存在是否会提高你的存活率。因此,我们希望将船上的兄弟姐妹/配偶(SibSp)和父母/子女(Parch)的数量设计成每个人是否都有家庭成员— hasfamily

cleandf['familymembers']=cleandf.SibSp+cleandf.Parch
hasfamily = (cleandf.familymembers>0)*1
cleandf['hasfamily'] = hasfamily

结果呢

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

The result of feature engineering

恭喜你。你已经完成了你的特征工程。现在我们可以用这些新的特征来分析

分析

有如此多的分析,我们可以使用新的清理数据集。现在,让我们回答几个问题。请随意访问我的 Python 笔记本获取更多分析。

  1. 存活率会因性别而异吗?
  2. 生存率会因 SES 而不同吗?
  3. 存活率会因性别和社会经济地位而不同吗?

给数据科学家一个小提示,你的角色是不断提问并以统计学的方式回答问题。这不会是一个一次性的瀑布过程,而是一个持续的迭代过程。正如我要说的…

这只是冰山一角!

存活率会因性别而异吗?

maindf.groupby(['Survived','Sex']).count().Name
maindf.groupby(['Survived','Sex']).count().Name.plot(kind='bar')

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

总共有 342 人幸存,549 人死亡。幸存者中(233 名女性,109 名男性),而非幸存者中(81 名女性,468 名男性)。似乎雌性比雄性更有可能存活。

生存率会因 SES 而不同吗?

我们可以使用交叉选项卡清楚地生成两个分类特征(SES,survival)的计数

survived = pd.crosstab(index=cleandf.Survived, columns = cleandf.socioeconomicstatus,margins=True)
survived.columns = ['lower','middle','upper','rowtotal']
survived.index = ['died','survived','coltotal']

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

The Counts and Percentage of Survived and Died Passengers

快速浏览一下,似乎社会经济地位对幸存者非常重要——上层阶级比下层阶级生存得更久。然而,让我们用卡方方法进一步检验这个假设。

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

Chi square run on the cross tab

让我们试着理解这意味着什么。Chi2 统计量是卡方统计量,自由度是列*行。这意味着你有 6 个自由度,包括 3 个 SES 事件(下、中、上)和 2 个生存事件(死亡、幸存)。自由度越大,差异的统计意义就越大。

p 值将决定 SES 对生存的重要性。如果我们的 p 值低于α(0.01),我们将拒绝我们的零假设。因为我们的 p 值是 6.25,远远高于我们的 alpha 值,所以我们可以说这个结果没有统计学意义。

也许我们可以把性包括进来,观察是否有显著的差异?

存活率会因社会经济地位和性别而不同吗?

这个交叉表允许我们为总共 6 个可能的事件生成一个特征(SES,Sex)。与男性低社会经济地位者相比,女性高社会经济地位者的存活率似乎有很大差异。

survivedcrosstabsex = pd.crosstab(index=cleandf.Survived, columns = [cleandf[‘socioeconomicstatus’],cleandf[‘Sex’]],margins=True)

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

让我们做和以前一样的事情,在 Chi2 测试中插入这个值的交叉表

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

Chi square run on the cross tab (SES and Sex)

p 值更低,这表明它比我们仅使用 SES 进行分析具有更大的统计学意义。但是,p 值仍然高于我们的 alpha (0.01)。因此我们仍然认为 SES 和性别对推断生存状态没有统计学意义。但是我们可以看到它接近统计意义,这是一个好现象!

现在,我们可以用我们的机器学习模型来探索这些功能:)。

模型

训练决策树模型

让我们用决策树来模拟我们的发现。决策树是一种机器学习模型,它根据信息增益提供基于规则的分类。这提供了一种选择关键特征和规则来最好地辨别我们的数据因变量的好的和圆滑的方法。

我们将使用我们的训练数据,然后修剪树木,以避免过度拟合。最后,我们将使用 GraphViz 库将我们的树可视化如下。由于代码很长,请随意浏览我的 Python 笔记本。

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

Decision Tree for Titanic Kaggle Challenge

从这个图中,我们可以发现决策树的美妙之处如下:

  1. **了解幸存者分布及概况:**数组表示【死亡人数,存活人数】。在每个节点中,我们可以看到阵列和规则分类的不同拆分,以便分支到更低级别的节点。我们可以发现,如果性别=女性(≤0.5),数组表示更多的幸存者[69,184]。我们也可以跟踪叶级节点。
  2. **了解关键特征可以区分幸存者:**在顶级特征中,我们将性别和社会经济地位视为主要特征。然而,正如我们之前所发现的,这些特征本身不足以具有统计学意义。因此,也许第三级的起运港和年龄组可能给我们更好的意义。

恭喜你,你刚刚创建了你的第一个机器学习模型!

决策树的评估

**from** **sklearn.metrics** **import** accuracy_score, log_loss

train_predictions = clftree.predict(X_test)
acc = accuracy_score(y_test, train_predictions)

从这里我们将检索到我们的准确率是 77.65%。这意味着在 100 名乘客中,该模型可以正确回答 77 名乘客的生存状态。

为了进一步评估这个模型,我们可以将混淆矩阵和 ROC 曲线添加到我们的评估中,我将在随后的文章中详细介绍。

使服从

您将使用以下方法和命令生成预测的 csv。我们将其命名为*“titanic _ submission _ tree . CSV”*并保存在您的本地目录中。

def titanic_kaggle_submission(filename, predictions):
 submission = pd.DataFrame({‘PassengerId’:testdf[‘PassengerId’],’Survived’:predictions})
 submission.to_csv(filename,index=False)titanic_kaggle_submission("titanic_submission_tree.csv",predictions_tree)

一旦你提交了*titanic _ submission _ tree . CSV .*你会收到如下结果。在这里,我得到了所有相关条目中的排名 6535。

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

我们如何改进我们的分析?

  1. 超参数调谐和模型选择。使用梯度下降增加提交分析。还有其他提交的大量利用集合模型,如随机森林XG Boost
  2. 特征工程:找出可能产生的其他特征。例如,也许有孩子的父母被拯救的可能性更小。或者,拥有早期字母的人可能会首先被保存,因为他们的房间分配是根据机票类型和字母顺序排序的?基于问题创建我们的特征将进一步提高我们分析的准确性。
  3. 实验,实验,实验:享受乐趣,不断调整你的发现。在这个挑战中,没有什么想法是荒谬的!

恭喜你。您已经提交了您的第一份数据分析和 Kaggle 提交。现在,开始您自己的数据科学之旅吧!!

结论

在本文中,我们学习了一种在著名的泰坦尼克号数据上设计探索性数据分析(EDA)的方法。我们学习了如何导入、探索、清理、设计、分析、建模和提交。

除此之外,我们还学到了有用的技术:

  1. 探索 →描述、绘图、直方图
  2. 清除 →插入缺失的数值,删除不相关的列
  3. 工程师→宁滨,贴标签
  4. 分析 →存活图、交叉表、Chi2 检验
  5. 模型 →决策树可视化、预测和评估

最后…

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

Source : Unsplash

我真的希望这是一本很棒的读物,是你发展和创新的灵感来源。

请在下面评论出来建议和反馈。就像你一样,我也在学习如何成为一名更好的数据科学家和工程师。请帮助我改进,以便我可以在后续的文章发布中更好地帮助您。

谢谢大家,编码快乐:)

关于作者

Vincent Tatan 是一名数据和技术爱好者,拥有在 Visa Inc .和 Lazada 实施微服务架构、商业智能和分析管道项目的相关工作经验

Vincent 是土生土长的印度尼西亚人,在解决问题方面成绩斐然,擅长全栈开发、数据分析和战略规划。

他一直积极咨询 SMU BI & Analytics Club,指导来自不同背景的有抱负的数据科学家和工程师,并为企业开发他们的产品开放他的专业知识。

请通过LinkedInMedium Youtube 频道 联系文森特

用神经网络预测温布尔登。

原文:https://towardsdatascience.com/predicting-wimbledon-matches-using-neural-network-e2ee4d3dead2?source=collection_archive---------25-----------------------

神经网络预测诺瓦克·德约科维奇将在决赛中击败罗杰·费德勒成为最终的冠军。

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

随着第二周的 温布尔登 即将来临,有许多激动人心的比赛值得期待。温布尔登网球公开赛第二周的周一可以说是全年最激动人心的一天。周一,16 名最优秀的男女网球运动员将在温布尔登网球公开赛四分之一决赛中争夺一席之地。将会有很多体育评论员和分析家预测谁会进入 8 强,4 强,并最终成为冠军。

然而,我还没有遇到任何使用机器学习/人工智能做出的预测。因此,我认为这将是一个很好的机会,让我实施我一直在学习的一些机器学习技能,以预测温布尔登第二周的比赛。更具体地说,我将实现一个简单的2-隐层神经网络来预测比赛的结果。

我如何得出我的预测:

  • 第一步:创建可以帮助预测比赛获胜者的特征
  • 步骤 2:使用 Keras 建立、验证和微调模型神经网络,并检查过拟合/损失函数/测试精度。
  • 第三步:做预测

步骤 1:创建特征:

神经网络或任何预测模型最重要的部分之一是创建能够解释结果变量的特征。像选手排名、整体胜率、草地胜率这样的特征将在很大程度上帮助解释一场网球比赛的结果。此外,根据过去 52 周的胜率和单挑记录捕捉到的玩家状态可以进一步帮助预测结果。总的来说,我创建了 21 个特征作为神经网络的输入层,下面是我认为最重要的 5 个特征。

  1. 排名。
  2. 匹配胜率。
  3. 在草地上头对头。
  4. 过去 60 周在草地上的比赛胜率。
  5. 五局三胜的百分比。

注意:对于每个特征,我计算两个玩家之间的差异。例如排名=(玩家 0 的排名)——(玩家 1 的排名)。

第二步:建立并微调神经网络。

在我描述神经网络的实现之前,下面是带有特征的数据的一个片段。

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

Training Sample Snippet

我的数据由 2010 年到 2018 年的所有温网比赛组成。为了使事情更简单,可读性更强,我总是把排名较高的玩家作为 0 号玩家,排名较低的玩家作为 1 号玩家。因此,结果 0 表示玩家 0 赢了(不是一次翻盘),结果 1 表示玩家 1 赢了(一次翻盘)。

接下来,我将我的数据分为训练和测试(dev)数据,以便根据训练数据优化神经网络,并在样本测试数据上验证它。下面的代码构建了神经网络。

下面是神经网络的一些细节。

`- Number of Layers: 3. (2 Hidden Layers)

  • Number of Neuros in each layer: 64->32->1
  • Activation relu->relu->sigmoid
  • Stop if validation loss does not improve for 500 epochs
  • Save the best model which gives the minimum validation set loss`

这里需要注意的一件重要事情是,经过下图所示的几轮时期后,神经网络开始过度拟合训练样本。即,它在训练样本上获得了准确性,同时对于测试样本失去了准确性。因此,为了做出好的预测,避免使用过度拟合的神经网络是很重要的。因此,我使用给出最小验证集损失的模型。

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

Loss and accuracy level after each Epoch

在测试和训练集上,最好的模型具有下面的准确度水平,作为预测网球比赛的基准,这似乎是相当合理的。

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

第三步:预测结果。

一旦我有了一个训练好的神经网络并保存了最佳模型。我可以使用最佳模型来预测即将到来的比赛。以下是从第 16 轮开始以表格和括号格式对预定和潜在比赛的预测片段。

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

Final prediction table and bracket.

总决赛感想:

神经网络预测诺瓦克·德约科维奇将在决赛中击败罗杰·费德勒成为最终的冠军。根据模式,最接近的比赛将是费德勒和纳达尔在半决赛中的对决。考虑到这一点,根据模型,如果德约科维奇在决赛中对阵费德勒,他有 70%的胜算,而如果他在决赛中对阵纳达尔,他有 59%的胜算。

我会在所有比赛结束后更新这篇文章,看看这个模型的表现如何。然而,这篇文章的重点是而不是建立一个给出最准确预测的神经网络,而是这篇文章的重点是探索神经网络和其他机器学习技术可以帮助使用数据回答简单问题的方法。这篇文章的问题是“今年谁会赢得温布尔登网球赛?”

本文使用的代码和数据可以在下面的 github 资源库中找到。包含模型和结果的最终笔记本可通过 链接 查看。如果你有任何建议,请随时联系我。(github.com/jugalm)

[## 朱加尔姆/预测-温布尔登-比赛

预测温布尔登比赛:。通过在…上创建一个帐户,为 jugalm/predicting-Wimbledon-matches 的发展做出贡献

github.com](https://github.com/jugalm/predicting-wimbledon-matches)

参考文献:

使用文本评论预测葡萄酒质量

原文:https://towardsdatascience.com/predicting-wine-quality-using-text-reviews-8bddaeb5285d?source=collection_archive---------10-----------------------

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

As someone who doesn’t drink a lot of wine, I usually rely on the 100 point Wine Scale and the purple “Staff Recommended” sticker to pick something off the shelf

我将使用这个 Kaggle 数据集,其中包含葡萄酒评论、葡萄酒评级(以分数衡量)以及从葡萄酒爱好者那里收集的其他相关信息。

数据集包含两个在不同日期抓取的文件。我将使用文件wine mag-data _ first 150k . CSV作为训练集,使用 winemag-data-130k-v2.csv (从稍后的日期抓取)作为测试集。

这里是代码的

目的:训练一个基于文本评论预测葡萄酒质量的机器学习模型

葡萄酒爱好者使用从 1 到 100 的评分标准来给他们的葡萄酒打分(1 代表最差,100 代表最好)。不幸的是,该网站只发布积极的评论,这就是为什么数据集中的分数范围只有 80 到 100。

这意味着我们的数据集不能代表我们试图解决的问题。使用这些数据建立的任何模型只适用于广受好评的葡萄酒。

收集一些领域知识

在我们开始分析之前,我们应该尝试收集一些领域知识。在浏览了网站和阅读了其他一些与葡萄酒相关的资源后,我发现了一个基于积分系统的漂亮的分类系统。

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

对于最终用户(即葡萄酒购买者),积分的重要性只取决于它们传达的信息。如果我们把这个问题作为一个分类问题,我们可以保留葡萄酒质量的必要信息,同时减少问题的维度。

决策:我将把这个问题框定为一个情绪分析问题,在这个问题中,评论将被用来确定葡萄酒是经典、卓越、优秀、非常好、好还是可以接受

探索性数据分析

下一步是更好地了解我们的数据。这可以给我们更好地解决问题提供重要的见解。除了评论和评级,还有其他相关信息,如葡萄酒价格、品种(葡萄类型)和葡萄酒产地。

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

Preview of our data

如果我们想建立一个更全面的模型,我们也可以将这些特征作为预测因素来确定葡萄酒的质量。要将文本描述与其他预测特征相结合,我们可以创建一个集成模型(文本分类器是其中之一)或一个分层模型,其中文本分类器的结果将用作一个预测变量。

出于这里的目的,我们将只探讨评论和葡萄酒评分之间的关系。

从高层次检查数据完整性

“点和描述”列中没有缺失条目。正如我们之前已经注意到的,葡萄酒点向右移动。从我个人的经验来看,价格也是向右偏移的。

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

Output from data.describe()

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

Output from data.info()

检查文本数据

评论看起来很“干净”。似乎没有任何语法或拼写错误,所有的评论都是用非常简洁的语言写的。

样本审查:

This tremendous 100% varietal wine hails from Oakville and was aged over three years in oak. Juicy red-cherry fruit and a compelling hint of caramel greet the palate, framed by elegant, fine tannins and a subtle minty tone in the background. Balanced and rewarding from start to finish, it has years ahead of it to develop further nuance. Enjoy 2022–2030.

有些评论需要葡萄酒知识才能完全理解。在上面的例子中,单宁是一个文本元素,使葡萄酒尝起来很干。

我们还可以看看最常见的词汇出现的频率。

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

the most commonly occurring word is “wine” which occurs just over 0.025% of the time

准备分类

以前,我们将我们的类标识如下:

我们可以通过分数将评论映射到我们的一个类。

不幸的是,我们的数据不是很平衡。

第 4 类没有评论(94-97 分—极好),大多数评论集中在第 1、2 和 3 类。不平衡的类是有问题的,但是可以通过对较大的类进行采样或设置类权重来解决。然而,一门课的完全缺席更令人担忧。

决定:我将把 4 班和 5 班合并成新的 4 班。任何在 94-100 分范围内的评论都属于这个类别。

应该清理文本数据吗?

我们也可以选择清理/规范我们的葡萄酒评论。影响这个决定的最大因素是我们想要使用的学习算法的类型。如果我们选择将每个评论作为自己的向量嵌入,并将输入传递给一对一的分类器,那么我们应该花更多的时间来规范化文本。另一方面,将文本作为许多向量的表示进行顺序处理使得规范化变得不那么重要。

顺序处理文本(通常每个单词由其自己的向量表示,并学习单词关系)也有助于解决*(同一单词拥有多个含义)和识别 同义词 *。由于这些评论使用非常具体的行话分享非常相似的上下文,我不太关心词义歧义或同义词。但考虑到评论的总体积极情绪,我担心一对一的分类器可能无法找出相邻类别之间的细微差异。

决定:我将使用一个递归神经网络,通过将每次复习作为一个向量序列来预测课程。我还将保持文本描述的原始形式。

很难说这种选择是否比使用诸如 TF-IDF 这样的嵌入技术并将其传递给一对一的分类器更好。也许将来我也会尝试这样做,并比较结果。

嵌入文本

将每个单词作为其自己的向量嵌入的自然选择是使用基于神经的嵌入技术,如 word2vec、GloVe 或 fastText。我们也可以选择训练我们自己的嵌入模型或者使用预先训练的向量。由于我们正在处理的文本没有什么特别之处,使用预先训练的单词向量可能会帮助我们更好地理解语言。

决定:我们将使用预先训练的单词嵌入。

但是我们应该使用哪一类嵌入呢?我将立即消除 fastText,因为它通过对字符 n-gram 级别的向量求和来构建单词向量。因为我们正在处理的文本类型不太可能包含词汇以外的单词(没有拼写错误、不常见的俚语或缩写),所以它不会受益于这种粒度。

即便如此,通常也很难确定哪种技术效果最好。由于我发现一些葡萄酒的描述在本质上是相似的,我将选择 GloVe,希望从共现结构中学习将有助于更好地理解语义比较。

决策:我们将使用预先训练的手套向量

几个预先训练好的手套词向量可以在这里下载。我将使用带有 840B 令牌的普通爬网,因为它包含最大的词汇表,并且区分大小写。glove.840B.300d 中的每个单词向量有 300 个坐标。

在加载预训练的嵌入之前,我们应该定义一些固定的参数。

Num_classes: 自我说明——这是我们正在处理的类的数量

**嵌入 _ 尺寸:这是单词向量的尺寸

**时期:通过所有训练示例的向前和向后次数

batch_size: 每一遍的训练样本数

max_len: 文本描述中考虑的最大长度(以字为单位)。任何超过 100 字的描述都将被截断。任何少于 100 字的描述都将被填充以满足该长度。

class_weights: 我们之前观察到我们的类不是很平衡。具有较高权重的类(类 0 和类 4)将对学习算法产生较大影响。类别 0 的每个实例被视为 7 个实例。

***关于选择 max_len 的注意:*捕获太少的单词会导致信息丢失,但是捕获太多会导致数据稀疏的问题。理想情况下,我们希望选择一个值,该值能够捕获大多数文本描述的整体,而不会引入太多的零序列。

加载所需的库:

我们还必须对目标类进行一次性编码。

训练-验证分割

即使我们已经有了一个指定的测试集,出于参数调整的目的,将训练集分为训练集和验证集仍然是一个好主意。

标记输入并准备嵌入矩阵

我将使用 Keras 的 text_to_sequences 方法来保存文本的单词序列。每个单词将被映射到其来自预训练单词向量的向量。任何小于 100 (max_len)字的描述都将被填充,任何超过 100 (max_len)字的描述都将被截断,以便输入具有相同的长度。

在文本中找到的没有出现在预训练单词向量的词汇表中的单词被初始化为零向量。

注意:如果有很多单词在词汇表之外,那么设计一种更智能的方法来初始化这些单词可能是值得的

训练分类器

由于文字描述通常很短,我将使用 GRU 单位,而不是 LSTM 单位。有了更短的描述,我们对记忆单元的需求就更少了,并且可以从 GRU 更高效的学习算法中受益。

我还将利用早期停止,它(在这种情况下)使用验证准确性来确定我们是否应该继续训练网络。当验证准确性在几个时期内持续下降时,提前停止将会启动并结束训练过程。它还会将最佳权重保存为“检查点”(在本例中为 model.h5),并在准确度提高时重写权重。通过早期停止,我们可以让网络训练许多个纪元,而不必太担心过度适应。

耐心参数是用于确定是否/何时提前结束训练的阈值。耐心= 3 表示如果 3 个时期后验证损失没有改善,将开始提前停止。

递归神经网络的结构非常简单。该网络有一个具有 50 个单元的双向 GRU 层,其后是一个汇集、密集和丢弃层。双向意味着网络将学习文本序列的原始顺序以及单词出现的相反顺序。

分类器也在精确度上进行优化。准确性不会像人类那样区分不正确的预测。对一个人来说,预测 0 级为 4 级比预测 0 级为 1 级更糟糕。对网络来说,没什么区别。对于未来的实现,设计一个反映这种关系的度量可能是值得的。

是时候评估我们的模型了——让我们拿出测试集吧!

测试集的准确率:64%

让我们来看看混淆矩阵。在这个矩阵中,值以百分比的形式来衡量,以反映我们数据的不平衡性质。

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

不错的开始!

我们应该记住,由于所有的葡萄酒评论都非常正面,这个分类器将只适用于广受好评的葡萄酒。将来尝试使用不同的数据集会很有意思。

干杯!

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

Let’s end with a wine picture

感谢您的阅读!

如果你喜欢这篇文章,可以看看我关于数据科学、数学和编程的其他文章。通过 Medium 关注我的最新动态。😃

作为一个业余爱好项目,我还在 www.dscrashcourse.com建立了一套全面的免费数据科学课程和练习题。

如果你想支持我的写作,下次你报名参加 Coursera 课程时,可以考虑使用我的会员链接。完全公开—我从每一次注册中获得佣金,但不会对您产生额外费用。

再次感谢您的阅读!📕

用梯度提升机预测葡萄酒质量

原文:https://towardsdatascience.com/predicting-wine-quality-with-gradient-boosting-machines-a-gmb-tutorial-d950b1542065?source=collection_archive---------15-----------------------

培训和部署 GBM 模型的必要条件

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

Photo by Vincenzo Landino on Unsplash

介绍

本文给出了一个训练梯度增强机器(GBM)模型的教程,该模型仅使用葡萄酒的价格和书面描述来预测葡萄酒的质量。在许多真实的数据科学项目中,通过部署其他人可以用来获得实时预测的实时模型,将项目带入下一阶段是很重要的。在本文中,我使用 AWS SageMaker 创建一个活动端点来演示模型训练和部署过程。

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

我想从 Winc 购买一瓶“夏日之水”玫瑰酒,这是一家在线葡萄酒订阅服务公司。因为我不能在购买前试用,所以我想在决定购买前先了解一下它的质量。在这篇文章的最后,我们将看到使用经过训练的 GBM 模型对这款葡萄酒的质量预测。

让我们跳进数据和建模!

数据

该模型使用梯度推进树回归和来自 Kaggle 的真实数据来预测一瓶葡萄酒的质量点(y)。葡萄酒的“分数”分为 0-100 分,由《葡萄酒鉴赏家》分类如下:

  • 95–100 经典:一款好酒
  • 90–94 杰出:一款具有卓越品质和风格的葡萄酒
  • 85–89 非常好:具有特殊品质的葡萄酒
  • 80–84 好:坚实、制作精良的葡萄酒
  • 75–79 平庸:可能有小瑕疵的可饮用的葡萄酒
  • 50–74 不推荐

特征工程

在这个模型中使用的特征(X)是一瓶酒的价格和从对来自描述的非结构化文本数据执行潜在语义分析(LSA)中获得的潜在特征。

使用以下步骤设计潜在文本特征:

  • 使用清理文档字符串的典型方法来清理和处理文本数据,例如删除标点符号和将文本转换为小写字母。
  • 使用 LSA 对葡萄酒描述进行特征工程(使用 TF-IDF 和 SVD 进行矢量化,然后将文本的主体压缩成 25 个潜在特征)。

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

Figure 1: Example of wine description, price, and points data.

模型

使用 python 中的 xgboost 拟合梯度推进回归树模型,并使用平均绝对误差(MAE)进行评估

那么什么是梯度增压机呢?

一般来说,梯度增强机器是弱学习者集合到一个模型中以创建强学习者。梯度推进机器可用于回归或分类任务。它们通常应用于基于树的模型,但是理论上也可以应用于任何类型的弱学习者。

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

Figure 2: This visualization of one of the weak learner trees in the XGBoost model illustrates how the tree splits on the price and latent description of the wine. We can see that the price is very influential for predicting the wine quality points! This weak learner also found something meaningful in one of the latent description topics from the LSA.

训练数据用于适应每个弱学习者。Boosting 和 Bagging 都可以用来将这些弱学习者集成到一个模型中。Bagging 并行构建所有弱学习者。Boosting 采用了一种更系统的方法,并通过将权重应用于前一个弱学习者错误预测的观察值,顺序构建弱学习者,每个弱学习者都试图更好地解释上一个弱学习者错过的模式。

在随机梯度增强中,训练数据的样本用于拟合每个弱学习者。

Adaboosting

AdaBoosting 是最简单有效的二值分类 Boosting 算法。它顺序地用一次分裂来拟合决策树。这些小而弱的学习树被称为“决策树桩”。训练观察中的每个观察接收基于分类误差的权重,并且使用训练数据上的更新的权重来训练下一个决策树桩。还基于分类器的总误分类率为每个树桩分配一个权重。然后,该模型使用每个树桩上的权重来整合预测。具有大量错误分类的树桩接收较低的权重,导致它们的预测在集合预测中贡献较少。

梯度推进

梯度提升顺序地使弱学习者适应损失函数的梯度(导数),试图解释先前弱学习者错过的模式。当每一个学习者都适合时,使用加法模型来集成弱学习者。新的弱学习器的输出被加到先前弱学习器的输出上,以调整预测。这导致了一个递归方程,每个弱学习者都试图解释一个前一个学习者没有发现的模式。

第一个弱学习器被初始化为常数,例如平均值。

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

然后,函数 h(x)被拟合到残差。残差是损失函数的梯度。

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

其中 h(x)是适合损失函数梯度的弱学习器。Gamma 代表学习速率或步长。

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

最终的模型对每个特征都有许多项,每一项都将预测推向不同的方向。

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

因为弱学习器适合于预测损失函数的梯度,所以可以选择所使用的任何可微分损失函数,从而允许该方法应用于分类和回归问题。

用 Python 训练模型

首先,从导入所需的 python 库开始。

现在,加载葡萄酒数据并查看它的样本。

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

通过删除标点符号、数字并将所有字符转换为小写来预处理文本描述。

现在描述已经清理完毕,TF-IDF 用于向量化单词,SVD 用于将矩阵压缩成 5 个潜在向量。这种从文本数据中压缩特征的方法被称为潜在语义分析。为了简单起见,选择了 5 个潜在特征,但是在实践中,可以使用肘图来选择潜在特征的正确数量。

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

执行测试/训练分割,为 xgboost 格式化数据,并训练模型!

对测试数据进行预测,并使用平均绝对误差评估模型。平均而言,预测的质量点相差 1.84 个点。还不错!

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

使用 xgboost 中的要素重要性图查看对模型影响最大的要素。看起来价格是预测葡萄酒质量时最重要的特征。

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

Figure 3: Feature importance.

使用 AWS SageMaker 进行部署和推理

这个笔记本中,我使用 SageMaker 的 estimator 来训练模型,并将其作为一个实时端点。估计器启动一个训练实例,并使用[train_wine_gbt.py](https://github.com/statisticianinstilettos/wine_quality_predictions/blob/master/train_wine_gbt.py)脚本中的代码来训练模型,将模型保存到 s3,并定义端点的输入和输出。可以使用 SageMaker 的许多内置模型进行训练和部署,但我想为实时预测指定我自己的特征转换和输出,这可以使用像train_wine_gbt.py这样的 python 脚本来完成。

现在这个模型已经被训练和部署了,我可以用它来预测任何一瓶酒的质量!使用来自 Winc 网站的“夏日之水”的文本描述和价格,模型预测这款酒为 87,属于“非常好”的类别!

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

如果您想重用这些代码,请点击这里查看项目的 GitHub repo,在那里我有 jupyter 笔记本用于培训和部署。

干杯!

张量流在时间序列数据预测和分析中的应用

原文:https://towardsdatascience.com/prediction-and-analysis-of-time-series-data-using-tensorflow-2136ef633018?source=collection_archive---------4-----------------------

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

Photo by Jason Briscoe on Unsplash

嘿大家好!在这篇文章中,我试图总结 Deeplearning.ai 关于序列、时间序列和预测的课程。

在这篇文章中,我们关注“时间序列数据”,它是序列模型的一部分。本质上,这代表了一种随时间变化的数据类型,例如特定地方的天气、一群人的行为趋势、数据的变化率、身体在 2D 或 3D 空间中的运动或者市场中特定股票的收盘价。

时间序列数据的分析可以对任何包含“时间”因素的事物进行。

那么机器学习可以帮助我们在时间序列数据上实现什么呢?

1)预测 —最显著的应用是根据收集的历史数据预测未来。

2)数据插补 —预测过去的数据,从而预测过去的数据,即使我们没有收集这些数据。它还可以用来预测数据中缺失的值。

3)检测异常 —可用于检测潜在的拒绝服务攻击。

4)检测模式 —可用于预测声波系列数据中的单词。

在处理时间序列数据时,总会出现某些关键词。

趋势

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

时间序列有一个特定的数据移动方向。上图是一系列具有向上趋势的数据。

季节性

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

以可预测的间隔重复的模式。以上是一个软件开发者网站的数据。该数据向上值为 5 个单位,向下值为 2 个单位。因此,我们可以对每个单独的峰进行推断,峰开始和结束时的下降对应于周末,中间的数据对应于工作日

组合

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

上面的 pic 是具有上升趋势和季节性的数据类型的组合。

白噪声

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

这只是一组随机值,不能用于预测。因此,这被称为白噪声。

自相关

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

没有季节性或趋势,峰值似乎是随机出现的,但峰值不是随机的。在尖峰之间,有一种非常确定的衰变类型。

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

下一个时间步长是前一个时间步长值的 99%加上一个偶然的尖峰。上面是一个自相关序列,也就是说,它与自身的延迟拷贝(也称为滞后)相关。

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

上面突出显示的框中的值似乎具有很强的自相关性, 像这样的时间序列被描述为具有记忆,其中步骤依赖于先前的步骤。这些尖峰通常被称为创新 。换句话说,这些创新不能用过去的价值来预测。

因此我们现在知道时间序列数据是由趋势、季节性、自相关噪声组合而成。

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

机器学习模型被训练来发现模式,并基于这些模式来预测未来。因此,这在很大程度上与时间序列相关,除了不可预测的噪声,但这仍然给了模型一种直觉,即过去存在的模式可能在未来存在。

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

平稳(时间)序列是指其均值、方差、自相关等统计特性在一段时间内均为常数的序列 。因此,非平稳序列的统计特性会随时间而改变。

当然,现实生活中的时间序列,也可能有不可预见的事件,可能会影响数据。以上面的图表为例。如果上图是一只股票,那么可能导致这种变化的“大事件”可能是由于某种金融危机或丑闻。

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

预测数据的一种方法是使用“简单预测”,即取上一个值并假设下一个值将是相同的值。

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

将数据分成三部分用于训练、验证和测试,称为“固定部分”。在这样做的时候,必须确保每个时期包含一个整数个季节。

例如:如果时间序列具有年度季节性,那么每个周期必须包含 1 年、2 年或 3 年的季节性。如果我们取一个跨度为一年半的周期,那么某些月份会比其他月份表现得更多。

与非时间序列数据集相比,这有一点不同,在非时间序列数据集中,我们选择随机值来做同样的事情,这不会影响最终结果。但是,在这里,我们会注意到跨度和周期的选择会影响最终结果,因为数据是时间敏感的。

另一件需要考虑的事情是,在训练时,我们可以使用如上所述的策略将数据分成三个部分,但是一旦训练完成并且我们准备好模型,我们应该对整个数据进行再训练,因为用于测试的数据部分与当前时间点的最新数据相关,并且是确定未来值的最强信号。

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

绩效评估指标

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

最基本的预测方法是“移动平均线”。其思想是,上图中的 黄色 线是在一个称为“平均窗口”的特定固定时间帧中获取的蓝色值的平均值。

上面的曲线给出了时间序列的平滑曲线,但是它 没有预测趋势或季节性 。它甚至可以给出比天真预测差的性能,给出大的 MSE。

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

消除这种情况的一种方法是通过一种叫做“差异的方法来消除趋势或季节性。在这种方法中,我们研究时间’ t ‘和时间’ t-365 '的值。根据时间序列的时间段,进行差分的时间段可以改变。

这样做我们得到了上面的结果。以上数值没有趋势性,也没有季节性。

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

然后,我们可以使用移动平均线来预测时间序列。因此,黄线给出了上述数据的移动平均值,但这只是时间序列中差异的预测。为了得到真实的数据,我们将’差分的数据与’ t-365 的数据相加。

在下图中,由于季节性周期是 365 ,我们将从时间 t 的值中减去 t-365 的值。

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

上述操作的结果如上图所示。与之前的移动平均线预测相比,我们得到了一个较低的“ MSE ”。这是比幼稚的方法稍微好一点的版本。

我们会注意到预测有很多噪音。这是因为在取差值时,来自’ t-365 '数据的噪声被加入到我们的预测中。为了避免这种情况,我们可以对 t -365 数据进行移动平均,然后将其添加到我们的差分数据中。

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

如果我们这样做,我们最终会得到上面用黄线表示的预测。以上曲线平滑,具有较好的’ MSE '。

让我们先接触一下实际的编码部分。我们将遵循下面提到的几个步骤来模拟时间序列数据集,并尝试在其上构建模型。

我们创建一个值范围从 0 到 9 的数据集,并显式地将其转换为 numpy 数组。

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

数据集被分成大小为 5 的窗口,即每个数据窗口包含 5 个数据实例。1 的移位导致下一个数据窗口将第一个数据实例移位 1 个单位。

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

drop_remainder 导致不包含一组 5 个数据点的剩余窗口被丢弃。

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

每个数据窗口被平面映射成 5 个一批。

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

进行映射以包含前 4 个实例作为训练数据,剩余的数据在每个窗口的末尾作为标签。然后,数据集以与数据范围大小相同的缓冲区大小进行混洗。

数据被混洗是为了避免 序列偏差

顺序偏差是当事物的顺序能够影响对事物的选择时。例如,如果我问你最喜欢的电视节目,并按顺序列出“权力的游戏”、“杀死夏娃”、“旅行者”和“神秘博士”,你可能更有可能选择你熟悉的“权力的游戏”,这是你看到的第一个节目。哪怕和其他电视剧持平。因此,当训练数据集中的数据时,我们不希望序列以类似的方式影响训练,所以最好将它们打乱。

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

数据集被分成每批 2 个,每个 X 作为包含训练数据的列表,每个 Y 作为标签映射到数据。

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

数据被拆分,以便训练数据包含要合并到训练数据中的季节性和趋势。

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

使用下面的函数将数据分解到不同的窗口中。

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

数据集的窗口实例通过名称 数据集 创建,模型创建。

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

迭代每个窗口,我们试图预测验证数据。

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

我们结合了一个学习率调度器,试图测量模型的最佳学习率。

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

我们绘制了一系列已经实现的不同学习率,并确定了最适合我们模型的学习率。

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

从上面的图表中,我们观察到与学习率相关的最低成本大约是 1e-5。然而,这里要注意的一件有趣的事情是,图表在这一点和随后的几个点上似乎很不稳定。使用这个学习率可能会对我们的预测模型产生负面影响。因此,最适合的学习速率似乎是 1e-6,既平滑又低。

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

我们现在绘制关于时期的损失函数。

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

该模型似乎已经停止学习,因此,该图似乎在前几个时期已经饱和,但事实并非如此。当我们绘制前 10 个时期的损失函数时,我们注意到损失持续减少。这意味着,即使学习速度非常慢,模型仍会继续学习。

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

最后,我们为数据绘制图表。 蓝色 为原始, 黄色 为预测,

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

我们的均方误差如下所示。

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

轮回层

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

我们开始使用机器学习技术来预测数据的未来值。在上图中,我们有一个大小为(4,1)的输入批量向量。想象一下,如果 存储单元 有 3 个神经元,那么 存储单元 的输出将具有(4,3)的形状。因此,如果整个系列有 30 个存储单元,网络输出的总大小将是(4,3,30)。

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

上图是序列到序列网络的一个例子,其中一个序列作为输入给出,一个序列作为输出接收,即输出为(4,3,30)的形状。当我们需要将一个 RNN 层堆叠在另一个之上时,这种类型的架构非常有用。

上图是一个序列到向量网络,其中一个序列作为输入给出,但我们接收一个向量作为输出,即输出是(4,3,1)的形状。

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

为了演示序列到向量模型的工作原理,我们使用上图。对于第一层,命令“**return _ sequences = True”**使下一层的每个时间步返回一个序列输出。这然后被馈送到下一层。默认情况下,下一层有" return_sequences = False ",这导致只给出一个向量作为输出。

请注意 input_shape = [None,1] 参数。Tensorflow 假设第一维是批量大小,它被设置为**“无”意味着它可以有任何大小作为输入批量大小,下一维是时间步数,它可以被设置为“无”**意味着 RNN 模型可以处理任何长度的序列,最终值为“1”,因为数据是单变量的。

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

如果我们在上面的模型中加入**“return _ sequences = True”的参数,那么模型的第二层现在给出的是一个序列作为输出,而不是一个向量。密集层现在得到一个序列作为输入。Tensorflow 通过使用相同的密集**层独立处理每个时间步长的输出。

LSTMs

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

当我们观察 RNN 时,它看起来就像上面的图表。这里,各个节点被输入批量大小的数据 X[i] ,并给出输出 y[i] ,同时将单元状态从该节点传递到下一个节点,该状态是计算后续输出的重要因素。

这种方法的问题是,随着单元状态从一个节点传递到另一个节点,它的值会减少,其效果会逐渐消失。

为了解决这个问题,应用了一种叫做 LSTMs 的新方法。

LSTMs 通过引入一种单元状态来消除这个问题,该单元状态在单元之间和时间步长之间传递,因此可以更好地保持状态

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

单元状态可以是如上图所示的单向或如下图所示的双向

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

这意味着,与 RNNs 的情况相比,早期窗口中的数据对整体预测具有更大的影响。

在我们的代码中实现 LSTMs。

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

在我们的模型中增加了另一层双向 LSTM。

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

上面的代码给出了以下输出:-

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

通过在下面添加一层新的双向代码,我们得到以下结果。

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

我们没有观察到太大的差异,事实上, MAE 似乎已经倒下,也就是说,我们的模型性能已经下降。

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

因此,必须在模型中试验不同类型的层,并选择最佳层。

对模型进行卷积

为什么我们要在时间序列分析问题中使用卷积?

一个原因是因为他们的训练成本更低。

第二,它们最适合解决许多实际问题。例如,在我们应用 RNNs 的某些情况下,我们假设先前出现的“每一个”数据将被要求猜测下一个数据。rnn 在这个概念上工作,因为它考虑了所有的历史数据来预测下一项数据。事实上,我们并不真的需要所有的数据。

为了理解这一点,让我们考虑一个子弹射弹的例子。为了预测抛射体的下一个值,我们实际上并不需要所有的历史抛射体数据。假设投射数据是一组*‘n’实例,我们将只需要最新的‘k’*实例来预测下一个投射数据,其中 k < n.

因此,人们可以限制时间依赖性,而是使用 CNN 架构来模拟时间序列。所以现在每个假设变成了依赖于前一个’ k ’ 实例的时间实例,前一个实例是卷积上的感受域。每个 CNN 过滤器学习一组规则,并将这些规则应用到最适合该规则的特定数据部分。因此,这成为一个非线性系统。

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

我们注意到“输入形状,它将数据转换为一维数据,而不是卷积通常用来处理图像的二维数据(图像是二维数据)。

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

上面的图是我们应用了 conv 图层后得到的。与早期的情节相比,这是一个巨大的进步。然而,情节仍然可以通过以下方式进行改进

  1. 对它进行更长时间的训练。

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

从图中可以看出,模型仍在学习,也许学习速度很慢,因此,如果我们继续训练模型一段更长的时间,模型的整体效率可以提高。

2。另一种方法是使模型双向化。

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

然而,我们注意到模型现在开始过度拟合数据,并且“ MAE ”实际上已经增加。

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

当我们绘制数据时,我们可以清楚地看到数据中有很多噪声,因为我们是以小批量的方式向模型提供数据,所以我们最终得到了这个结果。因此,这使我们能够得出结论,上述步骤是朝着正确方向迈出的一步,通过对批量大小等超参数进行一些调整,我们可以改善我们的结果。我们可以试验批量大小,并尝试得到适当的结果。

调整我们模型的过程

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

我们以“太阳黑子活动数据集”为例。我们使用基本的“密集”层网络来训练我们的模型,该网络具有两层,每层具有 10 个神经元。我们因此得到上述结果。

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

事实上,当我们放大时,我们可以看到我们的预测与原始数据相比表现如何。

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

我们可以看到,火车窗口大小为 20,这基本上意味着我们有 20 个时间片的数据。每个时间片对应一个月。

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

通过查看数据,我们意识到我们有 11 到 22 年的季节性。

因此,我们现在使用的时间片为 132,也等于 11 年(132 个月= 11 年)。

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

但是我们注意到 MAE 实际上增加了。因此,增加窗口大小不起作用。

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

当我们分析我们的数据时,我们发现即使数据具有 11 年的季节性,噪声也使其表现为典型的时间序列数据。

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

因此,我们将“窗口大小更改为 30,并更加关注为训练和测试提供的数据量。为训练提供更多数据可以提高模型的效率。

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

现在’ MAE’ 已经降到了 15.14。我们可以通过改变输入节点的数量来进一步做出改变。现在我们的输入数据已经增加到 30,我们可以有 30 个输入节点。然而,这导致我们的网络性能比以前更差,另一方面,调整’学习率’提高了模型的效率。

让我们意识到这样一个事实,尽管改变了:-

1.批量

2.神经元数量

3.窗口大小

4.训练数据大小

5.学习率

导致我们的模型发生了许多变化,有些促进了预测效率,有些则降低了预测效率,每一个变化都同样重要,需要进行试验以获得更好的结果。

这就把我们带到了记录课程的结尾。人们应该意识到机器学习可以用于对顺序和时间序列数据进行预测的多种方式。然而,我们在这里看到的只是表面现象,还有很多需要深入研究的。通过本文的学习,我们已经准备好迎接新的复杂的挑战。举一个…‘多元时间序列数据’。

我希望这能激励你真正开始学习这门课程,并尝试自己去实施。

感谢您阅读这篇博客。我希望听到你对此的想法。

线性回归中的预测区间

原文:https://towardsdatascience.com/prediction-intervals-in-linear-regression-2ea14d419981?source=collection_archive---------7-----------------------

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

这篇文章讲述了如何计算线性回归的预测区间。通常在建模时,我们从回归模型中得到一个单一的值。但是如果这个价值被用来计划或做重要的决定呢?

那么,当我们想知道我们的不确定性或误差幅度时,一个单一的值可能会夸大我们的信心。当然,你可以像 RMSE 一样查看所有预测的总体误差分数,但是对于单个预测呢?预测间隔为您提供了一个预测范围,该范围考虑了对您至关重要的任何建模误差阈值。类似于置信区间,您可以选择一个阈值,如 95%,其中您希望实际值在 95%的时间内处于某个范围内。这在计划时非常好,因为您可以在评估过程中使用上限和下限。

我已经创建了一个小方法(使用来自这里的一些输入)来预测对你或你的项目很重要的某个置信阈值的范围。我将用波士顿住房数据集来说明一个预测区间,预测不同地区住房的中值。如果你喜欢阅读 GitHub 上的代码,这里有完整的笔记本。

否则,以下是数据集的描述:

from sklearn import datasets
print(datasets.load_boston()['DESCR'])Boston house prices dataset
---------------------------

**Data Set Characteristics:**  

    :Number of Instances: 506 

    :Number of Attributes: 13 numeric/categorical predictive. Median Value (attribute 14) is usually the target.

    :Attribute Information (in order):
        - CRIM     per capita crime rate by town
        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.
        - INDUS    proportion of non-retail business acres per town
        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
        - NOX      nitric oxides concentration (parts per 10 million)
        - RM       average number of rooms per dwelling
        - AGE      proportion of owner-occupied units built prior to 1940
        - DIS      weighted distances to five Boston employment centres
        - RAD      index of accessibility to radial highways
        - TAX      full-value property-tax rate per $10,000
        - PTRATIO  pupil-teacher ratio by town
        - B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
        - LSTAT    % lower status of the population
        - MEDV     Median value of owner-occupied homes in $1000's

我们将对数据进行预处理,使用 sklearn 的线性回归包对其建模。

#preprocess data
df = pd.DataFrame(datasets.load_boston()['data'])
df.columns = datasets.load_boston()['feature_names']
df['target'] = datasets.load_boston()['target']

#split data
X_train, X_test, y_train, y_test = train_test_split(
    df.drop('target',axis=1), df.target, test_size=0.2, random_state=42)#do modeling
model = LinearRegression()
fit_model = model.fit(X_train, y_train)
predictions = fit_model.predict(X_test)

如果想了解单个预测层面的模型误差呢?这里我构建了一个简单的方法来获得这个区间。

def get_prediction_interval(prediction, y_test, test_predictions, pi=.95):
    '''
    Get a prediction interval for a linear regression.

    INPUTS: 
        - Single prediction, 
        - y_test
        - All test set predictions,
        - Prediction interval threshold (default = .95) 
    OUTPUT: 
        - Prediction interval for single prediction
    '''

    #get standard deviation of y_test
    sum_errs = np.sum((y_test - test_predictions)**2)
    stdev = np.sqrt(1 / (len(y_test) - 2) * sum_errs)#get interval from standard deviation
    one_minus_pi = 1 - pi
    ppf_lookup = 1 - (one_minus_pi / 2)
    z_score = stats.norm.ppf(ppf_lookup)
    interval = z_score * stdev#generate prediction interval lower and upper bound
    lower, upper = prediction - interval, prediction + interval return lower, prediction, upperget_prediction_interval(predictions[0], y_test, predictions)
OUTPUT: (19.24072024369257, 28.996723619824934, 38.752726995957296)

结论

那么你应该从这篇文章中学到什么呢?您可以使用一些工具来计算称为预测区间的不确定性,对于线性回归,您可以在项目中使用上面的代码。这有助于我计算非常关键的业务流程的不确定性,并且是您工具箱中的一项有用技术。

随着您在数据科学职业生涯中的不断进步,您将需要更多量化风险和不确定性的方法,因为这将有助于为关键决策提供信息。希望你喜欢这个简短的教程!

多元时间序列和 VAR 模型的预测任务

原文:https://towardsdatascience.com/prediction-task-with-multivariate-timeseries-and-var-model-47003f629f9?source=collection_archive---------1-----------------------

基于统计 VAR 模型的天气预报

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

ime 系列数据可能会令人困惑,但探索起来非常有趣。这类数据引起我注意的原因是,它几乎存在于每一个行业(销售、交付、天气状况等)。).例如:使用谷歌大查询如何探索天气对纽约市的影响链接

任务中的主要步骤:

  1. 问题定义
  2. 收集信息
  3. 探索性分析
  4. 选择和拟合模型
  5. 使用和评估预测模型

公式化问题。

我们希望使用数据集中的当前信息来预测序列的未来值。此信息包含系列的当前值和过去值。有很多项目使用单变量数据集,为了使它更复杂一些,更接近现实生活中的问题,我选择了一个多变量数据集。多元时间序列分析考虑处理相关数据的同步多个时间序列。(数据集包含多个时间相关变量。)

我想做一个天气预报。使用统计模型预测未来某一特定时间和地点的大气状态的任务。

收集信息和下载数据

我将使用来自以下来源的数据:

  1. 国家海洋和大气管理局。气候数据在线(CDO)提供网络服务,通过 API 提供对可用数据的访问。链接
  2. GoogleCloud BigQuery 公共数据。链接
  3. 卡格尔。你可以从这个页面下载并在你 env 中运行,或者使用 kaggle 提供的 kaggle 帐户并在你的笔记本中使用它。

从 NOAA 获取数据

为了访问 CDO 网络服务,必须首先从令牌请求页面获取令牌。文档是直截了当的,不应该花太多时间去理解。

**示例:**要查找缅因州波特兰的天气信息,您需要知道:State_id 和波特兰的坐标。首先,我将获得所有州的列表。

def get_states_list(self):
    url = conf.noaa['host']+'locations?locationcategoryid=ST&limit=50'
    headers = dict(token=conf.noaa['token'])
    r = requests.get(url, headers=headers)
    data = json.loads(r.content)
    states_list = json_normalize(data['results'])
    return states_list

然后,使用参数“name”:“Maine”查找有关特定州的信息:

def state_info(self, state):
    dataset = NoaaApi()
    states_info = dataset.get_states_list()
    df_states = pd.DataFrame(states_info)
    id = df_states[(df_states.name == state)].id
    return id

**结果:**其中缅因州的 id 为:“FIPS:23”

dataset.state_info('Maine')State id: FIPS:23

下一步是在波特兰附近建立站点,波特兰的坐标可以很容易地在谷歌地图上找到(北纬 43.6591,西经 70.2568)。

用下面的 GET 请求可以找到缅因州的电台列表。

def get_stations_list(self):
    url = conf.noaa['host']+'stations?locationid=FIPS:23&limit=687'
    headers = dict(token=conf.noaa['token'])
    r = requests.get(url, headers=headers)
    data = json.loads(r.content)
    stations_list = json_normalize(data['results'])
    return stations_list

我不需要州内所有的站,我想找波特兰附近的站。为此,我将指定坐标。

def station_info(self):
    dataset = NoaaApi()
    stations_list = dataset.get_stations_list()
    df_stations = pd.DataFrame(stations_list)
    portland_st = df_stations[(df_stations.latitude > 43.5)
                           & (df_stations.latitude < 43.7)
                           & (df_stations.longitude > -70.3)
                           & (df_stations.longitude < -70.1)]
    return portland_st

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

结论:我们得到了波特兰附近的站的列表,这些站点可用于获取该地区的天气数据。

从 Kaggle 获取数据

有很多数据集提供了学习和提高技能的机会,也提供了参加比赛挣钱和展示技能的机会。我找到了每日全球历史气候网络(BigQuery Dataset)的完整描述可以在概览页面找到:链接。这是练习 BigQuery 技能的绝佳机会。

import numpy as np 
import pandas as pd 
import os
import bq_helper
from bq_helper import BigQueryHelpernoaa = bq_helper.BigQueryHelper(active_project="bigquery-public-data", dataset_name="ghcn_d")

创建一个查询并估计大小:

#43.6591° N, 70.2568° W  Portland/Coordinates Maine 45.2538° N, 69.4455° WqueryStations = """SELECT
  id,
  name,
  state,
  latitude,
  longitude
FROM
  `bigquery-public-data.ghcn_d.ghcnd_stations`
WHERE
  latitude > 43.5
  AND latitude < 44
  AND longitude > -70.4
  AND longitude < -69.4; 
  """

noaa.estimate_query_size(queryStations)

Kaggle BigQuery.helper 为查询提供估计,以避免超出限制。

0.0065232375636696815

现在运行查询:

stations_portland = noaa.query_to_pandas_safe(queryStations)
stations_portland.head(20)

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

如我们所见,我们得到了几乎相同的电台列表。

从谷歌云获取数据

谷歌提供 30GB 的公共天气数据。有可能有一个免费的帐户和实践,以提高您的技能在大查询。还可以选择您需要的数据,并下载数据集进行进一步研究。对私人和公司都非常有用。我不会尝试查找电台列表,但会从找到的电台请求每日温度。

SELECT
  TIMESTAMP(CONCAT(year,"-",mo,"-",da)) AS date,
  AVG(IF (temp=9999.9, 0, temp)) AS temperature,
  MIN(IF (temp=9999.9, 0, min)) AS temperature_min,
  MAX(IF (temp=9999.9, 0, max)) AS temperature_max,
  AVG(IF (visib=999.9, 0, visib)) AS visibility,
  AVG(IF (gust=999.9, 0, gust)) AS wind_gust,
  AVG(IF (wdsp="999.9", 0, CAST(wdsp AS Float64))) AS wind_speed,
  AVG(IF (prcp=99.99, 0, prcp)) AS precipitation,
  AVG(IF (sndp=999.9, 0, sndp)) AS snow_depth
FROM
  `bigquery-public-data.noaa_gsod.gsod20*`
WHERE
  CAST(YEAR AS INT64) > 2008
  AND (stn="726060") 
GROUP BY
  date
ORDER BY
  date

该查询运行时将处理 5.19 GB。

该查询将返回缅因州波特兰市一个气象站过去 10 年的每日天气。

探索性分析

首先,我想把重要的信息可视化,让我们清楚地知道我们有什么样的数据。

地理数据

我将使用来自缅因州波特兰市的数据,通过 GeoPandas 库绘制气象站的位置。第一步是找到并下载一个形状文件(。shp 文件)。我已经展示了如何使用 NOAA API( portland_st )获得波特兰附近的站点

highway_map = gpd.read_file('./maine_highway/maine_highway.shp')

crs = {'init': 'epsg:4326'}
point = [Point(xy) for xy in zip(portland_st['longitude'], portland_st['latitude'])]
geo_stations = gpd.GeoDataFrame(portland_st, crs=crs, geometry=point)

fig, ax = plt.subplots(figsize=(5, 5))
highway_map.plot(ax=ax, alpha=0.4, color='grey')
geo_stations.plot(ax=ax, color='red', marker='o')
plt.legend(prop={'size': 5})
plt.show()

我找到了显示波特兰主要道路的形状文件(“maine_highway.shp”),并将其与车站位置结合起来。红点是气象站的位置。现在很明显特征模型需要哪个站。这是一种可视化地理空间数据的简单方法。

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

Portland, City in Maine

时间序列图形

时间序列分析的目标是发现数据中的模式,并使用数据进行预测。

探索时间序列之间的关系也很有用。让我们看看 2017 年的所有支线剧情:

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

当然,我们想看看将要预测的系列。我是用 iplot 库做的。

df[['temperature', 'temperature_min']].iplot(
    mode='lines+markers',
    opacity=0.8,
    size=8,
    symbol=1,
    xTitle='Time',
    yTitle='Temperature',
    title='Temperature over last 10 years')

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

出于好奇,我可以举例说明显示过去 10 年新年平均/最低/最高温度的线图:

sns.set(rc={'figure.figsize': (14.7, 8.27)})
g = sns.lineplot(data=newyear.temperature_max, palette="tab10", linewidth=2.5, label="max")
g = sns.lineplot(data=newyear.temperature_min, palette="tab10", linewidth=2.5, label="min")
g = sns.lineplot(data=newyear.temperature, palette="tab10", linewidth=2.5, label="avg")g.tick_params(labelsize=10)
plt.xticks(rotation=45)
plt.show()

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

27.12 至 03.01 期间的温度,为期 10 年。如果有人需要过去几年中某个特定时期的历史统计数据,比如说新年的那一周。

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

如果主要目的只是准备数据和选择模型。正确的解决方法是在查看特定系列时绘制四个图表。

除了查看数据的时间图,ACF 图对于识别非平稳时间序列也很有用。对于平稳的时间序列,ACF 会相对较快地下降到零,而非平稳数据的 ACF 下降较慢。

def tsplot(y, title, lags=None, figsize=(10, 6)):
    fig = plt.figure(figsize=figsize)
    layout = (2, 2)
    ts_ax = plt.subplot2grid(layout, (0, 0))
    hist_ax = plt.subplot2grid(layout, (0, 1))
    acf_ax = plt.subplot2grid(layout, (1, 0))
    pacf_ax = plt.subplot2grid(layout, (1, 1))

    y.plot(ax=ts_ax)
    ts_ax.set_title(title, fontsize=12, fontweight='bold')
    y.plot(ax=hist_ax, kind='hist', bins=25)
    hist_ax.set_title('Histogram')
    sm.tsa.graphics.plot_acf(y, lags=lags, ax=acf_ax)
    sm.tsa.graphics.plot_pacf(y, lags=lags, ax=pacf_ax)
    sns.despine()
    plt.tight_layout()
    plt.show()
    return ts_ax, acf_ax, pacf_ax

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

在一系列的每日温度中,平均温度不是恒定的,因为它每天都在变化,但对于不同年份的同一个月,我们可以期望一个恒定的平均值。

季节周期 s 定义了构成一个季节周期的观测次数。例如,每月系列的 s = 12,季度系列的 s = 4,每日系列的 s = 365。

然而,这可能并不完全正确:例如,如果我们有每日数据,并且季节周期是一个月的长度,则 s 将大约为 30,但它会逐月变化。最棘手的是,季节性可能不止一种。例如,对于每日数据,我们可以得到 s = 30 的月度季节性和 s = 365 的年度季节性。

由于另一个原因,每日数据具有挑战性——它们通常涉及多重 季节模式,因此我们需要使用一种方法来处理如此复杂的季节性。

时间序列数据也可能有其他模式,如趋势或周期。所有这些都表明数据不是静止的。

要使用统计模型,如 VAR 模型,我们应该在数据能够适合模型之前关注这些模式。对于风险值模型,你需要执行稳定条件。将足够的结构放入模型中,以识别模型中的一些参数。

对序列的对数应用季节差异应该使上述序列平稳。为气候数据定义参数是相当具有挑战性的,有很多关于这个主题的出版物。我不会深入挖掘,只选择简单的参数 lag=365 和 diff=1。更多关于参数的信息你可以在 T rend 气候时间序列分析出版物中找到。

变形

平稳时间序列的性质不依赖于序列被观察的时间。带有季节性的时间序列不是平稳的,因为季节性会影响时间序列在不同时间的值。

transformed = df.copy()
transformed['temperature'] = np.log(df.iloc[:, 0]).diff(1)
transformed['wind_speed'] = np.log(df.iloc[:, 1]).diff(1)

变换的目的是使数列平稳。

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

Temperature after transformation

下一步是分割数据。

将样本分成训练/测试和验证集。需要根据依赖关系结构对其进行仔细的划分。最适合这种情况的方法是滚动窗口。但是在这个特殊的例子中,我将在最后留下一些观察结果来验证我的模型。我想预测 7 天。稍后,为了检查模型的性能,我将使用这 7 个真值。

开发 VAR 模型

这种模型要求序列是平稳的,如果序列不是平稳的,那么单个序列必须被转换为平稳的。

两个变量的 VAR§可以矩阵形式(其中 p=1)写成

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

source: wikipedia

model = sm.tsa.VARMAX(y_train, order=(5, 0), trend='c')
model_result = model.fit(maxiter=1000, disp=False)
model_result.summary()

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

选择订单的方法是使用信息标准 AIC、BIC、HQIC。估计一系列模型,选择最好的一个。模型阶次选择的最常见方法包括最小化在模型阶次范围内评估的一个或多个信息标准。

for i in range(5):
    i += 1
    model = sm.tsa.VARMAX(y_train, order=(i,0))
    model_result = model.fit(maxiter=1000, disp=False)
    print('Order = ', i)
    print('AIC: ', model_result.aic)
    print('BIC: ', model_result.bic)
    print('HQIC: ', model_result.hqic)

关于如何选择正确顺序的更多细节,你可以在《T4 多时间序列分析新入门》一书中找到,作者是 Lütkepohl,Helmut(第 4 章)。在这个特殊的例子中,我将使用 p = 5,此时 AIC 标准达到最小值。

型号诊断

下一步是模型诊断,并检查基本假设是否正确。Statsmodels 中的 VARMAX 类允许对 VAR、VMA 和 VARMA 模型进行估计(通过 order 参数)。VARMAX 过程是一个完善且强大的多变量时间序列分析工具。

model = sm.tsa.VARMAX(y_train, order=(5, 0))
model_result = model.fit(maxiter=1000, disp=False)
model_result.plot_diagnostics()
plt.show()

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

常见的总体诊断是绘制残差图,并查看残差是否符合模型假设。

可以应用测试:

  1. 确认正常的测试
  2. 缺乏序列相关性
  3. 不存在异方差

这两个系列不显示趋势或规律的季节模式。因此,我们假设它们是平稳 VAR§过程的实现。

预测和估算

概括一下:我们用下面的等式来转换温度和风速,其中 yt 是原始序列:

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

这意味着它应该被转换回定义和估计预测的真实结果。为此,我们计算方程并应用于预测值:

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

z = model_result.forecast(steps=7)

转换值并打印结果:

pd.concat([df['temperature'][-7:], forecast], axis=1)

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

计算均方误差:

rmse = sqrt(mean_squared_error(df['temperature'][-7:], forecast))RMSE: 4.200

结论:时间序列数据很难正确处理。你需要适当地探索你的数据来理解它,意识到任何季节性或其他模式。不可能总是使用相同的方法。总的来说,最好从简单的模型开始,并在此基础上构建您的分析。

参考

  1. AM207:哈佛大学 pav los Protopapas
  2. 预测:原则与实践
  3. Jeffrey Yau,PyData 大会 2017
  4. 多时间序列分析的新介绍
  5. 谷歌 BigQuery 探索天气效应

政府决策中的预测分析

原文:https://towardsdatascience.com/predictive-analytics-in-government-decisions-8128ba019a77?source=collection_archive---------21-----------------------

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

Photo by Michael on Unsplash

私营部门与公共部门

许多美国人都意识到机器学习和预测分析正在重塑我们的个人生活、工作和世界经济的速度。虽然最近的事件引起了对企业如何使用和共享我们的数据的更大审查,但很少有人认为私营部门不应继续推进它们的使用。市场力量(即客户、公众意见)和政府法规会影响公司如何采用和实施它们。

然而,政府处于市场之外,对立法和司法监督的缓慢进程作出反应。随着政府机构扩大对这些技术的采用和实施,我们如何确保政府机构采用机器学习和预测分析?

政府决定

在许多情况下,我们当前的法律法规要求政府做出直接影响公民的决定,尽管程度不同。这些决定中的一些与福利的资格有关,另一些是个人是否会受到惩罚,或者个人的公民自由是否会受到限制。在代议制民主国家,这些决策通常由一小部分公务员、当选者甚至是个人做出。这些决定的影响可能大不相同;从小的不便,如在机场托运行李,到更大的影响,如通过将公民关进监狱来剥夺他们的公民自由的决定。刑事司法有多个例子,包括根据对犯罪可能发生的地点的预测,决定何时何地派遣警察巡逻。以及在决定是否允许候审个人保释时的情况。

假设这些政府决策者在这些情况下尽了最大努力,这些决策者仍然不得不处理这样一个事实,即他们无法获得关于他们需要做出决策的情况和个人的完美信息。例如,最近的工作显示了个人偏见的深度,无论是决策中已知的偏见还是未知的偏见。此外,在缺乏工具帮助的情况下,个人不太擅长根据过去事件的统计数据对未来事件做出预测性决策。最近的研究还表明,个人做出预测的成功率通常并不比随机机会好。

结合这些限制和风险,以及我们的系统作出这些重要裁决的要求,产生了建立更好的方法来通知这些决定的需要。为做出更好的决策、更好的政策实施以及更高的效率所做的努力导致了几种不同的运动。这些努力的一个分支是基于证据的决策或基于绩效信息的决策,这已被政治家、公务员和公众衷心拥护。支持者认为需要更好的数据才能做出更好的决策。其他人现在认为,政府决策者也需要工具来使用更好的数据做出更好的决策,而大数据和预测分析可以实现这些目标。

我同意这样的观点,即预测分析是一个政府可以利用基于证据的决策能力并提高决策准确性和效率的领域,正如这些运动所规定的那样,从而获得公众信任和立法者的支持。

公共部门预测分析的优势和风险

即使预测分析算法在 99%的时候是准确的,应用于 3 亿公民,你仍然会有 300 万个误报或漏报。

政府预测分析的潜在好处有很多;包括更有效的决策制定、更高效的决策过程以及更少偏见的决策制定。还必须充分考虑风险和挑战。实施任何预测分析计划都存在风险,但在政府领域,风险会增加,因为预测的结果可能对公民产生更大的影响。假阳性和假阴性的风险增加了。此外,正如大多数从业者所知,这些风险几乎是肯定的。例如,没有一个模型是完美的,每个模型都有可能出现非随机和随机误差。即使预测分析算法在 99%的时候是准确的,应用于 3 亿公民,你仍然会有 300 万个误报或漏报。在推荐关于网飞的电影时,这可能是一个可以接受的错误率,但在推荐是否启动监控项目或逮捕公民时,我们可能会认为这是不可接受的。

偏差 —预测算法可能会因年龄、种族、性别或性偏好等固有的歧视性偏差而被错误地编程,这些偏差并不代表结果的真正因果因素。

隐私 —有人担心当政府或私营实体使用大数据技术时,会对的公民数据隐私产生影响,大数据技术可以在个人不知情或未经其同意的情况下,更快、更准确地识别个人及其敏感属性。

透明度 —另一个令人担忧的领域是预测分析的透明度,即个人将如何理解对他们做出的决定,对输入或算法提出异议,或理解他们过去和未来的行为将如何影响这些决定。立法机关制定的政策要么由公共资助的机构、公私伙伴关系执行,要么由政府工作人员承包和指导的私营公司执行。在公共部门的许多领域,存在着基于价值观和基于规则的等级制度,旨在以最小的成本取得成果。然而,由于公众缺乏监督一切的能力,存在着一种有利于机构而牺牲公民利益的信息不平衡。因此,公众和政府如何使用预测分析之间可能存在信息差距。政府机密的性质以及执法和国家安全信息的敏感性会加剧这种情况。

模型风险 —其他需要注意的地方是预测分析模型本身的风险。当它们是编程数据,不能准确说明构成实际情况的输入、输出和结果的广度时,就会发生这种情况。例如,在预测性警务模型中,风险将是仅使用由警察资源提供的数据,因为这将仅包括犯罪、逮捕或警察的其他行动。这可能导致一个基于过去有偏见的决定的回音室的决定,例如更高的警力和对某些少数群体的逮捕。至少,如果模型局限于那些向警方报告或由警方发现的犯罪,它将受到过去“犯罪”的不完整图片的影响。众所周知,并不是所有的犯罪都会被报道。相反,预测分析模型需要包括犯罪的第三方数据源(因为许多数据被少报了多达 50 %)和超出警方组织统计的结果。

孤立的数据科学家 —其中一些预测分析算法问题可能源于坏数据,但当数据科学家不一定了解他们正在处理的数据以及这些数据是如何收集的时,也会发现这些问题。这在政府中很常见,因为很少有机构拥有大数据、机器学习和预测分析的内部技能,并且通常依赖外部承包商或现成的产品解决方案。此外,预测分析所需的专业数据人员(通常从机构运营部门之外获得)和数据运营链(收集、编译、清理、转换)有可能增加模型的偏差或不准确性。

正当程序 —最后一个领域是对预测分析和大数据将如何影响正当程序的关注,以便组织或个人寻求纠正或不准确的决定,或者对宪法第五和第十四修正案中规定的行政部门决定进行司法审查。正当程序对我们的制衡制度很重要,因为它为受影响的公民提供补救,也为司法和立法监督以及行政部门的审查奠定基础。对许多公民来说,算法“黑箱”的性质可能排除传统形式的正当程序。

政府的本质是权力;权力,因为它必须放在人的手中,永远容易被滥用。

—詹姆斯·麦迪逊

政府实施预测分析的这些风险和潜在陷阱并非不可逾越。因为政府做出的决定有可能对公民产生重大影响,所以需要关注和监督。此外,如果公众没有理由相信政府的预测性分析决策,那么政府就不会获得信任和效率作为采纳的可能结果。

可能的解决方案

虽然以上所有的风险和担忧在当今世界都存在,但我相信所有的风险和担忧都有可能得到解决。政府试图在政府政策中说明这些风险的一种方式是通过透明度,例如根据《信息自由法》以及《行政程序法》和《文书工作减少法》中规定的规则。这些法律要求公开发布条例和规则草案,允许公众在修改定稿前提出意见和修改。此外,它们规定政府机构必须报告服务和福利申请所要求的数据和信息,以及这些数据和信息将如何被使用。此外,这些信息收集和计划在被批准实施之前,要接受司法审查,通常还要接受公众审查和评论。

独立机构监督 —我的提议是建立一个独立的第三方机构,负责几个领域,这些领域将直接减轻这些风险,并确保联邦政府准确、有效和高效地使用预测分析。该政策侧重于确保公众对预测分析计划的信任的机制,以及对算法的歧视性偏见、不准确性的独立审查和审计,并确保既定标准确实按照规定得到利用。

预测分析算法本身不可能进行同样的公开通知、公开审查和评论,因为系统的一些详细输入和输出过于敏感,不像乍看上去那么有用。学者们指出,大多数公民不具备必要的专业知识水平来理解和建设性地评论该算法。此外,那些具有理解它的专业知识水平的公民将能够针对输出的可能的不当行为和不当行为来玩弄预测分析模型,以便欺骗系统。

因此,该独立机构将接收所有预测分析计划和算法,以进行内部审计、审查和验证。未经批准,任何机构都不能实施他们的预测分析计划。除了审计以确保预测分析计划将产生预期的结果,审计还将寻找歧视性偏见和潜在的隐私损害。此外,该机构将保留预测分析计划的官方注册,以便在以后需要时允许司法和国会监督。这将减轻公众信任的担忧,以确保机构实际使用提议的预测分析系统和算法,这可以防止对机构不当行为的指控,因为这将允许将提议的系统与机构实际实施的系统进行比较。

限制 —本提案存在一些潜在的限制和挑战。首先,许多新的机构或办公室需要立法批准和资金。可以想象,这可以通过行政部门的授权开始,但资金必须从现有拨款中筹集。任何新的公共行政事业都需要资源。这可以通过向希望实施预测分析的机构收取独立机构的费用来实现,如经济法案所要求的。

此外,负责监督这些计划的机构同样需要资源,以确保机构的审查和批准请求得到快速裁定,从而使政府能够实现预测分析技术的有效性和效率增益。政府还必须投资于法律资源,致力于这一新兴技术,并确保有法律资源准备应对新的挑战和关注,它将提出。

然而,我认为,通过在决策中采用预测分析实现的准确性和效率收益不仅可以抵消这些资源支出,还有助于提高公众对政府裁决的信任度。

其他好处 —这家独立机构也将致力于以其他方式实施预测分析的联邦政府政策。首先,它可以成为政府的卓越中心,根据该领域的最新研究为联邦机构发布最佳实践和标准,并了解政府机构的需求。对预测分析项目进行审计的人员也可以向机构咨询现有的政府决策和项目,这些决策和项目可以从预测分析中受益。这将包括对信息技术需求、基础设施以及程序和流程开发的建议。

结论

最终,这些新技术将会存在,它们似乎为我们的政府利用数据做出更准确、客观和高效的决策提供了无数机会。正如我们在其他公众采用私营部门方法和技术的例子中所看到的那样,以不造成伤害或破坏公众信任的方式采用和实施这些新技术的能力将是公众反应的基础。公众的负面反应可能会导致立法者实施更严厉、更深入的监管和安全措施,这可能会抑制利用这些新技术的灵活性和敏捷性。因此,积极主动地采取这些步骤来采用减轻预测分析系统的潜在负面结果的政策,将大大有助于防止政治反弹。

当我们讨论政府机构在我们的民主中成功实施这些技术时,我欢迎其他想法,包括对这些想法的不同意见。

预测分析:

原文:https://towardsdatascience.com/predictive-analytics-predicting-consumer-behavior-with-data-analytics-8ca51abb8dc2?source=collection_archive---------16-----------------------

通过数据分析预测消费者行为

企业在推出新的服务或产品之前花费数百万美元进行市场调查,这并不奇怪。尽管如此,重要的是要认识到,最终产品不会自我销售,实际上需要正确的营销工具才能让潜在消费者看到自己。用传统的方法做这件事相当于承担了适量的风险——但不幸的是,企业无法承受试错法。这一直是一项具有挑战性的任务,但今天,随着消费者不断接触到新技术、产品和不断变化的“必需品”,赌注甚至更高了在数以百万计的购买选择中,这个时代的消费者的行为一直在闪烁!多亏了移动商务,购买一项简单的服务或产品不再是一项简单的任务;消费者在最终决定购买之前有很多东西要权衡。

然而,这还不是全部。即使一个产品碰巧是最好的,它仍然经常被遗弃在购物车中,因为买家很可能在其他地方找到了更好的交易或更有价值的替代产品。虽然企业失去潜在客户令人沮丧,但并非所有希望都破灭了。这正是数据分析发挥作用的地方。

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

Using data analytics to predict consumer behavior

如今,精通数字和商业的营销人员更喜欢将资金和信任投入到数据分析中,以更好地了解他们的客户和他们的行为。在一个数字化过度曝光的时代,将一个潜在买家塑造成一个忠诚的客户,需要对用户的偏好、动机、行为和购买习惯进行更深入的研究。因此,聪明的营销策略围绕着在智能工具的帮助下追踪潜在客户的数字足迹,使用数据作为他们的燃料。

今天,我们将快速了解分析世界,为什么我们需要主动而不是被动,以及预测分析如何帮助我们预测这个时代的消费者行为。

你说的“分析”是什么意思?

分析是对数据或统计数据进行系统的计算分析,以获得有意义的模式,以及应用这些模式做出有效决策的过程。

有三种类型的分析:

  1. 描述的
  2. 预言性的
  3. 规定的

但是,本次讨论的重点将是预测分析。因此,顾名思义,预测分析是使用数据或统计数据来获得可用于预测未来的有意义模式的过程。而描述性分析描述了过去,说明性分析有助于规划最佳行动方案。

公司仍在努力解释和实施这种新形式的分析,因为分析数据的技能仅限于少数数据科学家,他们通常不知道公司在预测消费者行为时的概念背景。然而,人们不应该对此感到害怕。福布斯进行的一项调查声称:

“监督预测性营销工作至少两年的绝大多数高管(86%)表示,他们的预测性营销提高了投资回报率(ROI)。”

因此,即使使用这种新的分析形式听起来有点可怕,人们也可以相信福布斯,并考虑投入其中。

分析消费者行为的理由

想象一下,如果你在顾客走进你的商店的那一刻就知道他想要什么,而你的库存中没有那件特定的商品。好吧,你可能最终会惹恼并永远失去一个潜在客户。如果你已经知道你的消费者想要什么,什么时候想要,不是更容易吗?要做到这一点,分析消费者行为至关重要

  • 洞察:通过细分客户数据库来确定消费者细分。
  • 吸引和吸引潜在客户:通过分析过去的购买和个人资料,以相关优惠锁定细分客户。
  • 提高客户保留率:它允许企业评估客户价值,并使用主动保留方法来保留客户。

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

Predict your way to success

将预测分析应用于营销

虽然预测分析可以支持一系列其他商业活动,但营销是预测分析的最佳应用之一。因此,以下是预测分析在营销中的几种应用方式:

1。分段

细分围绕着将一个市场划分为具有相似特征(如人口统计、地理、行为或态度)的不同子群的过程。这样,企业主可以针对每个群体,更充分地满足他们的需求。

在这里,数据有助于开发您的目标细分市场,并为每个细分市场确定最有效的定位。在预测分析的帮助下,你甚至可以确定最“赚钱”的细分市场,并根据这些细分市场中的历史消费者行为相应地锁定他们。

营销经理使用这些数据将资源分配到真正需要的地方,也就是说,分配到利润最高的部分。

2。预测

预测分析的主要用途是开发预测销售和收入的需求模型,这对于制定预算至关重要。

3。需求定价

也称为收益管理需求定价,是根据消费者群体需求弹性的差异对产品和服务进行定价的过程。例如,像优步这样的服务在高峰时间收费更高,但每个人的费用并不相同。与临时乘客相比,上班族愿意为舒适的乘坐支付更多的费用,因此这些乘坐可以收取更多的费用,并且可以降低另一组乘客的价格,以满足 ROI(投资回报)目标,而不会在消费者中变得不受欢迎。

使用预测分析,人们可以设计实验,帮助企业找出影响价格对需求影响的因素,这有助于开发最有利的定价策略,最大限度地提高公司的财务增长。

4。提高客户满意度

如果你是向你的顾客销售,那你就做错了!现在是 2019 年,你的业务应该更多地服务于客户,而不是从他们的口袋里掏钱。

客户满意度对保留率和忠诚度有重大影响。一个满意的顾客等于一笔好生意。统计数据显示,失去一个客户的成本可能是留住一个客户的五倍。预测分析在留住客户方面发挥着至关重要的作用;像联合分析这样的工具使公司能够精确定位哪些产品/服务的改进能更大程度地提高客户满意度。

结论

预测分析是一种难以适应的强大技术,如果与正确的营销策略完美结合,可以有效预测消费者行为,帮助公司实现投资回报最大化。

预测性维护:使用 CNN 检测传感器故障

原文:https://towardsdatascience.com/predictive-maintenance-detect-faults-from-sensors-with-cnn-6c6172613371?source=collection_archive---------5-----------------------

使用 python 代码和图形表示的有趣方法

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

Photo by Bruce Warrington on Unsplash

在机器学习中,随着时间的推移,预测性维护的主题变得越来越流行。这些挑战并不容易,而且非常多样化:对该领域有很好的了解或者与了解底层系统如何工作的人接触是很有用的。由于这些原因,当数据科学家投身于这个新的战场时,必须遵循线性和理性的方法,记住最简单的解决方案总是更好的。

在本文中,我们将研究一个分类问题。我们将在 Keras 应用一个由 CNN 制作的简单但非常强大的模型,并尝试对我们的结果给出一个直观的解释。

数据集

我决定从常青 UCI 仓库(液压系统的状态监控)获取一个数据集。

该数据集是用液压试验台通过实验获得的。该试验台由通过油箱连接的一次工作回路和二次冷却过滤回路组成。当四个液压部件(冷却器、阀门、泵和蓄能器)的状态定量变化时,系统周期性地重复恒定负载循环(持续时间 60 秒)并测量过程值,如压力、体积流量和温度。

我们可以设想有一个液压管道系统,该系统周期性地接收由于例如管道中特定类型液体的转移而产生的脉冲。这种现象持续 60 秒,由不同的传感器(传感器物理量单位采样率、PS1 压力棒、PS2 压力棒、PS3 压力棒、PS4 压力棒、PS5 压力棒、PS6 压力棒、EPS1 电机功率、FS1 体积流量、FS2 体积流量、TS1 温度、TS2 温度、TS3 温度、TS4 温度、VS1 振动、CE 冷却效率、CP 冷却功率、SE 效率因子)以不同的 Hz 频率测量。

我们的目的是预测组成管道的四个液压元件的状态。这些目标条件值以整数值的形式进行注释(易于编码),如果某个特定组件在每个周期都接近失效,则称之为 us

读取数据

每个传感器测量的值可在特定的 txt 文件中获得,其中每一行以时间序列的形式表示一个周期。

我决定考虑来自温度传感器(TS1、TS2、TS3、TS4)的数据,这些传感器以 1 Hz 的频率测量(每个周期 60 次观察)。

label = pd.read_csv(path+'profile.txt', sep='\t', header=None)
label.columns = ['Cooler','Valve','Pump','Accumulator','Flag']data = ['TS1.txt','TS2.txt','TS3.txt','TS4.txt']
df = pd.DataFrame()for txt in data:
    read_df = pd.read_csv(path+txt, sep='\t', header=None)
    df = df.append(read_df)

对于第一个周期,我们从温度传感器获得这些时间序列:

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

Temperature Series for cycle 1 from TS1 TS2 TS3 TS4

模型

为了捕捉有趣的特征和不明显的相关性,我们决定采用 1D CNN。这种模型非常适合于传感器时间序列的分析,并且要求在短的固定长度段中对数据进行整形。

在开发这个工作流程时,我从这篇文章中获得了灵感,这篇文章采用了一种非常有用的方法。我选择了在 Keras 网站上描述的 CNN,并刷新了参数。建立该模型是为了对冷却器组件的状态进行分类,只给定数组格式的温度时间序列作为输入(每个周期的 t_periods x n_sensor)。

num_sensors = 4
TIME_PERIODS = 60
BATCH_SIZE = 16
EPOCHS = 10model_m = Sequential()
model_m.add(Conv1D(100, 6, activation='relu', input_shape=(TIME_PERIODS, num_sensors)))
model_m.add(Conv1D(100, 6, activation='relu'))
model_m.add(MaxPooling1D(3))
model_m.add(Conv1D(160, 6, activation='relu'))
model_m.add(Conv1D(160, 6, activation='relu'))
model_m.add(GlobalAveragePooling1D(name='G_A_P_1D'))
model_m.add(Dropout(0.5))
model_m.add(Dense(3, activation='softmax'))
print(model_m.summary())model_m.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])history = model_m.fit(X_train, y_train, batch_size=BATCH_SIZE, epochs=EPOCHS, validation_split=0.2, verbose=2)

在这种情况下,仅用 10 个纪元,我们就能取得令人难以置信的结果!

Train on 1411 samples, validate on 353 samples
Epoch 1/10
1411/1411 [==============================] - 2s 2ms/step - loss: 0.2581 - acc: 0.9391 - val_loss: 0.0867 - val_acc: 0.9830
Epoch 2/10
1411/1411 [==============================] - 2s 1ms/step - loss: 0.1111 - acc: 0.9731 - val_loss: 0.0686 - val_acc: 0.9830
Epoch 3/10
1411/1411 [==============================] - 2s 1ms/step - loss: 0.0925 - acc: 0.9759 - val_loss: 0.0674 - val_acc: 0.9802
Epoch 4/10
1411/1411 [==============================] - 2s 1ms/step - loss: 0.1093 - acc: 0.9731 - val_loss: 0.0769 - val_acc: 0.9830
Epoch 5/10
1411/1411 [==============================] - 2s 1ms/step - loss: 0.1022 - acc: 0.9731 - val_loss: 0.0666 - val_acc: 0.9802
Epoch 6/10
1411/1411 [==============================] - 2s 1ms/step - loss: 0.0947 - acc: 0.9773 - val_loss: 0.0792 - val_acc: 0.9830
Epoch 7/10
1411/1411 [==============================] - 2s 1ms/step - loss: 0.0984 - acc: 0.9794 - val_loss: 0.0935 - val_acc: 0.9830
Epoch 8/10
1411/1411 [==============================] - 2s 1ms/step - loss: 0.0976 - acc: 0.9738 - val_loss: 0.0756 - val_acc: 0.9802
Epoch 9/10
1411/1411 [==============================] - 2s 1ms/step - loss: 0.0957 - acc: 0.9780 - val_loss: 0.0752 - val_acc: 0.9830
Epoch 10/10
1411/1411 [==============================] - 2s 1ms/step - loss: 0.1114 - acc: 0.9738 - val_loss: 0.0673 - val_acc: 0.9802

对试验数据进行预测,模型的准确率达到 0.9909%。

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

每个班的 KPI 都很牛逼!这一结果对于 3 级(部件冷却器“接近完全失效”)尤为重要,因为通过这种方式,我们能够检测并防止系统中可能出现的故障。

将结果可视化

如果我们想对系统状态有一个总体的了解,并看到我们的模型的不可思议的优点,看一个图形表示可能是有用的。为了达到这个目标,我们重新利用我们在上面建立的 CNN 来制作解码器,并从每个周期的时间序列中提取巧妙的特征。使用 Keras,这在一行代码中就可以实现:

emb_model = Model(inputs=model_m.input, outputs=model_m.get_layer('G_A_P_1D').output)

新模型是一个解码器,它以与我们用于分类任务的 NN 相同的格式接收输入数据(每个周期的 t_periods x n_sensor ),并以嵌入的形式返回“预测”,该嵌入来自具有相对维度的 GlobalAveragePooling1D 层(每个周期的一行 160 个嵌入变量)。

使用我们的编码器对测试数据进行预测计算,采用一种降维技术(如 PCA 或 T-SNE ),并绘制结果,我们可以看到这种魔力:

serie_features = emb_model.predict(X_test)
tsne = TSNE(n_components=2, random_state=42, n_iter=300, perplexity=5)
T = tsne.fit_transform(serie_features)plt.figure(figsize=(16,9))
colors = {0:'red', 1:'blue', 2:'yellow'}
plt.scatter(T.T[0], T.T[1], c=[colors[i] for i in np.argmax(y_test, axis=1)]) 
plt.show()

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

TSNE on cycle embeddings for test data

哇哦!!!这个图讲的是事实!每个点代表测试集中的一个循环,相对颜色是较冷条件的目标类别。可以看出冷却器组件的目标值之间的区别是如何定义的。这种方法是我们模型性能的关键指标。

摘要

在这篇文章中,我们试图解决一个预测性维护的问题,用 CNN 对时间序列进行分类。开发了一个具有令人印象深刻的性能的强大模型。我们还试图给出结果的可视化表示。重要的是要强调 CNN 的力量,不仅是在预测方面,而且是作为一种工具来检测数据之间的无形关系。

如果你对题目感兴趣,我建议:

查看我的 GITHUB 回购

保持联系: Linkedin

LSTM 暹罗网络的预测性维护

原文:https://towardsdatascience.com/predictive-maintenance-with-lstm-siamese-network-51ee7df29767?source=collection_archive---------17-----------------------

从传感器时间序列中检测故障

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

Photo by sol on Unsplash

如今,预测性维护是一个活跃的领域,其中人工智能解决方案被引入以提高各种制造系统的生产率。典型的请求包括开发一个解决方案,当观察到的组件的特定部分接近失败时,该解决方案产生警告。可以猜到,这些是典型的“不平衡情况”,我们有来自各种传感器的大量数据,但缺少阳性标记样本,阳性样本表示存在故障。

在以前的一篇文章中,我介绍了一个解决方案,该方案对液压管道系统中特定组件的退化状态进行分类;结果很酷!现在,**我尝试开发一种管道来检测存储系统是否接近故障。我们希望利用神经网络对来自传感器的连续时间序列进行分类。**特别是,我使用适合时间序列的暹罗网络和 LSTM 架构,避免了缺乏故障样本的问题。

数据集

和往常一样,我更喜欢用真实的数据工作。我在 Kaggle 上发现了一个奇妙的数据集:能源优化的高存储系统数据,由智能工厂发布。数据集存储 4 条短传送带(BLO、BHL、BHR、布鲁)和 2 条轨道(HR、HL)的信号。

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

How the storage system works (source)

高位存储系统是为了在两个地点之间运输一个包裹而建造的。中间的两条传送带在不水平移动包裹的情况下只能垂直移动。中间的两条传送带可以水平移动包裹,也可以垂直移动。提供了整个系统的两次运行:优化和未优化。我使用了HRSS _ 异常 _ 优化. csv ,它包含了失败的优化运行。

我们有 19634 个时间观察结果,分成 111 个周期和 4517 个记录的故障。每次循环开始时,时间戳被设置为 0。这些周期不一定是一个接一个地记录下来的。他们之间可能有更大的时差。

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

Failure occurrences (orange) in cycles (blue)

对于每个周期,我们在 4 条传送带和 2 条轨道上放置了 18 个传感器,用于监控它们的活动。

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

standard deviations of sensor features in all the cycles

在开始考虑模型之前,我们必须花相当多的时间来考虑清理和预处理。在这种情况下,数据总是非常嘈杂,充分的初步处理对于获得良好的结果至关重要。我们没有缺失值,但是我们的传感器系列具有巨大的幅度差异,如 std 条形图所示。为了减少这种差异,我采用了三步预处理工作流:

  • 将我们的数据分成不同的周期;
  • 将每个传感器值作为相对循环开始时间的增量来处理;
  • 使用标准缩放方法缩放增量。

所有这些程序都必须小心进行!我们不想污染我们的数据和损害我们的结果。由于这些原因,一开始就建立一个最佳的验证策略是很重要的。在我们的例子中,我们必须处理时间序列,所以最常见的验证方法是通过保留时间相关性来验证我们的结果。我想在最新的部分数据(最新的 10%)上测试我的模型;鉴于’'最新部分【T3]'我打算每个周期的最后 10%。因此,有了这个概念,操作特定的预处理就更容易了。

模型

正如开头所介绍的,我们试图通过一个连体网络提前一步对系统中可能出现的故障进行建模。理解暹罗系统如何工作是非常简单和直观的。它接收一个双输入,并在此基础上计算嵌入距离。模型的范围是验证两个样本在空间上是相似还是相距较远。所有的过程可以作为一个二元分类任务来处理,其中阳性样本属于同一类(因此它们是相似的)。

暹罗原理经常应用于图像识别,我们尝试转换应用领域来处理预测维护领域中的一个时间序列分类问题。这一程序的好处是避免缺乏重要类别的未标记样本,即在预测性维护中,它等同于缺乏故障证据。

前提听起来不错!因此,要完成这项惊人的任务,最完美的工具就是强大的 LSTM。我们将建立我们的暹罗网络,采用由 LSTM 层组成的顺序编码器。

def SiamesNet(): left_input = Input((sequence_length, len(features)))
    right_input = Input((sequence_length, len(features))) lstmnet = Sequential([
        BatchNormalization(),
        LSTM(128, activation='relu', return_sequences=True,
             input_shape=(sequence_length, len(features))),
        LSTM(32, activation='relu')
    ]) encoded_l = lstmnet(left_input)
    encoded_r = lstmnet(right_input) L1_layer = Lambda(lambda tensor: K.abs(tensor[0] - tensor[1]))
    L1_distance = L1_layer([encoded_l, encoded_r]) drop = Dropout(0.2)(L1_distance)
    prediction = Dense(1,activation='sigmoid')(drop) model = Model(inputs=[left_input,right_input],
                  outputs=prediction) return model

选择 LSTM 结构意味着以顺序样本的形式管理数据。我们将初始时间序列分成一系列 8 个时间步骤,注意避免与循环开始重叠(在代码中,这个过程与预处理工作流一起计算)。

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

example of standardized sequence sample

我们从序列的训练群体中随机选择生成训练对。通过这种方式,我们能够大幅增加可供我们使用的样本数量。有了生成的线对,我们就准备好去适应暹罗网络了。在这个阶段的最后,我们必须进行验证。检查这种系统的性能并不总是立竿见影的。网络适合接收双输入,所以我们必须一次给它传递两个序列。其中一个肯定是我们的测试序列,另一个来自火车。首先,我们将测试与从故障类别中随机选择的训练序列相结合。其次,我们将它与非故障样本配对。因此,我们同时计算两个预测,以验证测试样本所属的最接近的类。最大相似性分数定义了我们的测试序列属于哪个类。

对于(特定类别的)成对测试序列/训练序列重复 N 次随机选择和预测的过程,可以获得结果的稳定性。假设通过进行上述 N 次比较,我们得到了单个类的 N 个相似性分数。我们可以通过取最大值或平均值(我选择最大值)等其他统计数据来总结它们。所以在这个程序之后,我们可以用一个经典的方法来检查性能。

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

我们能够以一种有价值的方式提前一步识别一些故障序列。我们可以预测大约 15%的限制误报数量的中断(高精度),这可以被认为是存储系统的良好起点。

摘要

在这篇文章中,我提出了一个提前检测故障的解决方案。我想在这个特殊而臭名昭著的任务中运用 LSTM 层的暹罗网络的力量。这种结构,结合适当和巧妙的预处理工作流程,允许我们“忽略”缺少阳性标记样本,并训练一个模型,该模型在特定时刻对我们系统的状态进行分类。

如果你对题目感兴趣,我建议:

查看我的 GITHUB 回购

保持联系: Linkedin

预测营销:以下是大数据如何重新定义我们的营销策略

原文:https://towardsdatascience.com/predictive-marketing-here-is-how-big-data-redefined-our-marketing-strategy-e4a99494122?source=collection_archive---------14-----------------------

数据已经并将永远是每个产品营销活动的关键,今天营销空间的性质使数据成为无可争议的王者。

我有超过 10 年的媒体、产品和营销经验。在决定下一步做什么之前,我总是使用数据。但直到几年前,它还只是基于市场上的分析工具。然后,随着数据科学的繁荣,我们遇到了预测营销,使我们不仅可以利用过去的数据,还可以预测未来。

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

Photo Credit: Unsplash, by @ pietrozj

预测营销的权威指南

我也在传统媒体工作过,但数字化已经接管了大量的营销,现在决定了我们如何看待品牌,并最终决定我们使用的新工具或购买的决定,这已经不是新闻了。预计全球将有 1.9 万亿人在网上购物。而在美国,79%的人已经进行了网上购物,而 2002 年只有 22%。然而,令人兴奋的是数字营销过程中的复杂程度,以控制更好的线索并增加销售机会。

随着技术的几次飞跃,市场营销变得越来越复杂。随着新兴公司完全基于网络,数字营销——在互联网和电子设备上为产品和服务做广告——已成为企业超越传统营销的关键。

正如数字营销已经成为我们业务的核心一样,市场数据已经成为营销过程中成功的重要决定因素。不用说,数据已经并将永远是我们每一次营销活动的关键,今天的数字营销空间的性质使数据成为无可争议的王者。

我们使用从多个市场来源获得的数据来做出明智的营销决策,例如如何最好地定位广告和理想的营销预算。为了改进营销决策,我们引入了更复杂的方法来更好地利用数据、分析数据,并在营销中利用数据来实现更好的结果。我们可以用预测营销这个术语来描述这些进步中的一个。

什么是预测营销?

预测营销,顾名思义,是一种决定不同营销策略成功概率的营销技术。除了流行词,这是 MarTech 的一个子集,其前提是营销和销售是由数据驱动的。

因此,在预测营销中,我们使用数据科学(或数据分析)来预测哪些营销行动更有可能成功,哪些更有可能失败。我们可以将所涉及的数据分析部分称为预测分析。

预测分析与预测营销

虽然这两个术语可以互换使用,但预测营销将商业营销的预测分析向前推进了一步,具有更广泛的含义。预测分析使用预测模型来提供对未来的洞察,而预测营销使用预测技术来测试企业的营销策略,在连续(有时是迭代)的过程中提供洞察并做出更好的营销决策。

在一个简单的场景中,预测营销专家(通常是数据科学家、数据分析师或分析公司)从多个来源收集关于企业的数据,并与公司的营销和客户数据一起进行分析。有了这些信息,数据科学家应用适合业务的预测模型,并以一定的准确度预测其营销工作的成功。

预测营销的工作原理

预测营销的一个经典案例是电子商务网站,它根据用户过去的行为向用户推荐产品和服务。从产品搜索页面到结账台,这些网站确保每一个回头客都受到这些产品推荐的狂轰滥炸。这些推荐是该网站“协同过滤”的产品,基于对客户行为的研究,如客户购物车中的商品或客户或其他客户过去互动或购买的商品。该算法的实际内容通常更加复杂,可能会将数据与时间、位置、人口分布以及包括打开率、点击率和选择退出率在内的大量其他指标相关联。

但不再是只有大公司才能负担得起昂贵的内部数据科学家,他们可以从预测营销技术中受益。我们的内部预测营销专家还从多个来源收集数据,并为我们的业务建立预测营销模型。他们已经获得了该公司的营销和客户数据,以及关于营销工作的信息。然后,数据分析师可以预测公司营销工作的成功。

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

Photo Credit: Unsplash, by @ arifrw

预测营销的好处

预测营销的相关性与数字营销中的数据科学非常相似。

首先,预测技术让营销人员更好地了解客户行为。与常规营销数据分析略有不同的是,预测营销工具直接提供决策,而数据科学家不必单独解释数据和提出建议。换句话说,预测营销模型准确地说明了什么样的营销策略可能有效,什么样的营销策略无效,从而使决策更容易做出。预测营销模型可以告诉客户是否会购买,何时以及如何购买,以及其他特定业务的预测,所有这些都基于从客户那里获得的数据。

通过分析客户以前的行为,数据供应商还可以帮助公司在营销预算管理、市场活动规划、线索挖掘和转化策略等方面做出决定。因为它基于对来自客户的大量不同数据的分析(而不是直觉和猜测),预测营销的决策更有针对性,并产生更好的结果。

此外,预测分析使我们的公司更接近自动化营销系统或专家所说的规范营销。在这个层面上,营销系统自动分析数据并实时做出决策。模型生成、销售线索评分和更新客户洞察等活动将即时发生。在这种熟练程度下,我们能够显著提高客户参与度,因为我们可以轻松细分客户,并部署量身定制的营销活动。这样的结果是显而易见的;必须优化我们的营销预算,提高销售线索得分,增加销售收入。

预测分析是数据驱动营销的支柱,根据 Jas Saran, Forbes 的说法,它可以改善公司在至少六个领域的营销工作,包括营销组合建模、向上销售和交叉销售、网络优化、客户获取、特征分析和保留。

以下是预测营销让我们的创业环境受益的一些具体方式:

我们如何通过预测营销为客户特征分析、客户获取和客户保持提供支持

复杂的预测营销模型有助于企业根据客户过去的行为和对未来行为的洞察,创建特定和独特的客户身份。因为用于形成预测营销模型的数据通常非常详细,围绕这些数据构建的营销工作往往具有更高的转化率。

当营销工作精确且只针对正确的客户时,客户获取工作变得更加有效和高效。再次,由于预测营销模型,营销人员可以定制营销活动和客户获取策略,以适当细分的潜在客户群的不同部分,具有高转换概率。

同样,对客户未来行为的洞察有助于企业规划其客户维系战略。当公司知道可能离开的客户群、他们可能离开的时间以及使他们离开的条件时,公司可以为每个客户群设计定制的保留计划,并根据一般假设消除一揽子努力。当企业了解这一点时,它就可以向现有客户进行追加销售和交叉销售,从而获得更高的成功概率。

以下是我们如何利用预测营销改进电子邮件营销和网站参与度

根据预测智能基准报告,使用预测智能的电子邮件营销活动产生最高的影响收入。在预测营销之前,营销人员不得不依靠广泛的概括(有时称为人物角色)来创建电子邮件,其中很多都不会被打开。但预测营销改变了游戏规则,它赋予营销人员特定的信息来创建个性化的电子邮件,从而提高了打开率和参与度。

这里有一个有趣的统计数据:“备货电子邮件”和废弃产品电子邮件活动——可以通过预测营销模型实现——的点击率最高,分别为 19%和 14%。

类似地,使用预测营销模型的网站可以通过研究网站访问者的行为来提高参与度和销售额,尤其是围绕广告横幅、产品页面和动作按钮等网络资产。他们可以利用从访问者和客户那里收集到的信息来优化网络体验。

总之,预测营销旨在预测促使客户购买产品的条件,并帮助企业优化定价和影响客户行为的其他因素。以亚马逊为例,据报道,当引入基于其预测分析模型的推荐时,该公司实现了约 30%的销售额增长。

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

Photo Credit: Unsplash, by @ srd844

预测营销如何削减 B2B 营销成本

企业对企业(B2B)营销是预测分析非常重要的领域,尤其是在降低营销成本和提高效率方面。一个 B2B 的成本可能从 35 美元到 100 美元或更多,视情况而定。这种高成本使得低转化率真的成本很高。在每条线索 50 美元的情况下,1%的转换率将使 B2B 营销人员仅在线索生成方面就花费 5000 美元。

因此,这并不令人惊讶,许多企业正致力于预测营销解决方案,以更好地瞄准他们的营销努力,以获得更好的投资回报。

这里有一个有趣的数据:在 Eversrting 的预测营销调查中,98%的营销人员至少拥有 CRM、营销自动化和一些营销工具,要么完全致力于或已经实施预测营销。

B2B 预测营销:使用案例和最佳实践

对于 B2B 营销人员来说,预测营销或多或少正在成为一种不可或缺的方法。正如我们所见,这种方法为营销人员节省了一些营销成本,这对于 B2B 业务来说是相当可观的。除此之外,根据预测营销的使用案例,预测营销为营销人员提供了一些优势。这里有几个。

B2B 客户拓展

首先,B2B 营销人员可以通过整合预测营销获得高质量的新线索。为此,营销人员通过公司信息和特殊信号应用预测营销模型,以较高的准确度识别潜在客户。

公司规模、产品和收入等信息在预测营销模型中与业务扩张、管理层变动等信号和成千上万的其他公司数据一起分析时,可以确定有资格成为潜在客户的公司行为。使用预测分析模型,营销人员可以生成具有这种行为的类似企业的长列表,作为 B2B 机会的数据库。

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

Photo Credit: Unsplash, oowgnuj

B2B 销售线索评分(销售线索优先排序)

获得潜在客户名单后,B2B 营销人员需要决定哪个潜在客户值得首先出手;这是更有可能成为客户的潜在客户。为了做到这一点,营销人员再次使用预测营销模型来对线索进行优先排序。

线索评分至关重要,因为它告知营销人员如何进行营销工作;应该追求哪些前景,何时追求,如何追求。通过使用预测模型,B2B 营销人员提高了手动建立线索评分公式的效率。所使用的预测模型可以基于购买的可能性或终身收入、盈利能力、促销响应、销售接受度或各种因素的组合。这取决于业务目标和优先级。

B2B 销售线索细分

接下来,B2B 营销人员可以再次借助预测营销技术将潜在客户划分为不同的细分市场。一个理想的模型将创建客户的人物角色,并根据他们的特征和行为将潜在的客户分组。

这些细分基于个人兴趣、公司特征,有趣的是,还有过去的行为。由于过去的客户行为是预测未来行动的可靠而准确的基础,基于预测营销模型的潜在客户群往往会提供更个性化的营销方法,从而产生更高的转化率。

线索细分对整个 B2B 营销过程至关重要,因为它有助于确定每个细分市场的确切方法,而不是一般的营销驱动。除了很大程度上是静态的人物角色,预测营销模型允许营销人员生成动态的细分市场,如“参与度”,这些细分市场经常变化,并且每次都定制营销方法。

主动销售整合

由于预测营销模型创建了动态的客户细分,它使销售团队能够及时获得有关其前景的信息(比如预测)。结合质量线索优先排序,预测模型有助于使销售工作更加主动、及时和高效。例如,一个模型可以预测某个客户群最有可能购买的时间段,并提示销售团队在该时间段内加强对该客户群的努力。

来自预测分析的其他信息,如基于过去决策的决策层次结构,可以帮助销售团队更好地协调他们的工作,并个性化他们的销售宣传。同样,销售团队可以更好地了解何时进行追加销售和交叉销售。

管理 B2B 客户的整个生命周期

除了产生和优先考虑高质量的线索,预测营销技术还帮助营销人员在客户生命周期中产生更大的影响。这些模型支持营销人员通过在销售过程的每个阶段提供关于客户的及时信息来吸引客户。

一些常见的 B2B 预测营销模式

实际的预测营销模型通常分为三类即:侧重于对潜在客户进行分组的细分模型,跟踪获得或搅动客户的可能性的倾向模型,以及预测哪些客户可能需要更多营销努力的智能推荐——通常是追加销售或交叉销售。

细分模型根据产品(基于产品的聚类)和行为(行为聚类)对潜在客户或客户进行分组,而倾向模型则根据客户钱包、竞争、其他客户的模式等因素,通过指出危险信号和机会,寻求保持和扩大客户群的方法。智能模型——规范营销的先驱——确定更好地吸引现有客户的领域。

预测营销的数据供应商和 SaaS 提供商

虽然与数据科学相关的服务似乎很昂贵,但它们更容易被常规企业接受,不像早期那样只有大公司才能负担得起聘请数据科学家团队的费用。由于越来越多的数据供应商和软件即服务(SaaS)系统提供基于云的预测分析。

以下是预测营销领域的一些领先数据供应商:

Everstring 拥有强大的预测营销引擎和全功能数据管理平台。自 2012 年上线以来,它已经为包括康卡斯特在内的许多知名客户提供了服务

Infer 专门从事契合度评分,预测哪个未来潜在客户准备购买,然后创建一个潜在客户数据库。销售和营销软件公司 HubSpot 使用 Infer 的 fit 建模。

**6sense,**服务于戴尔和联想,是预测市场领域的后来者之一。它强调预测客户意图和决策的能力,也称为意图评分。

LeadSpace 是一家社交媒体数据供应商,整合了预测性营销见解,以提高净新线索的质量。微软和 Adobe 使用 LeadSpace。

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

Photo Credit: Unsplash, franki

预测营销是 B2B 营销的未来

从活动中获得高质量的结果后,任何人都可以很容易地认为营销的未来是自动化,而自动化的核心是预测营销。

根据 Everstring & Forrester 报告,B2B 营销人员越来越多地采用预测营销。以下是一些重要的发现:

预测营销人员(41%)报告的收入增长是行业平均水平的 2.9 倍,相比之下,14%的回顾营销人员报告了积极的业务成果。

一半的预测营销人员声称在他们的产品和服务类别中处于领导地位,相比之下,只有 24%的回顾营销人员这样认为

49%的预测营销人员表示,他们的组织一直超过公司基准,相比之下,只有 28%的回顾营销人员能够有效地为他们的业务提供类似的价值。

在这三个方面,预测营销——以及一般的数据分析驱动的营销——正在为 B2B 营销人员设定节奏。据 Salesforce 称,91%的顶级营销人员已经在实施预测营销。它也吸引了商业金融家的注意。仅在几年内,风险资本家和行业参与者就在预测营销和类似的数据驱动营销上投入了超过 50 亿美元。

预测智能基准报告还显示,预测智能建议影响了总订单的 26.34%。经过 36 个月的分析,受影响的订单总数从 11.47%增加到 34.71%。

预测营销的挑战

我非常担心预测营销会取代人类的贡献。预测营销技术的一个主要挑战在于,随着系统走向全自动营销分析,如何去除“人”的贡献。一些专家同意,人类仍然有一些优势,通过自动预测系统增加人类贡献的限制可能会对销售产生负面影响。

作为一项新兴技术,采用方面的担忧将一直存在,尤其是在数据分析非常昂贵的情况下。然而,随着企业可以轻松插入的可扩展 SaaS 解决方案的增长,它正在帮助 B2B 营销人员从预测性营销洞察中受益,而不会破产。最后,对数据质量、数据量、数据相关性和隐私问题等数据科学的关注也会影响预测分析。

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

Photo Credit: Unsplash, sortino

结论

在采用预测营销后,我们在 Smartereum 和 WhatsAround 的业务都在增加流量、销售线索和收入方面获益。我们能够通过自动对销售线索进行分级来支持我们的销售团队,并将我们的重点放在最佳业绩上。

预测建模和多类分类:应对 Taarifa 挑战

原文:https://towardsdatascience.com/predictive-modeling-and-multiclass-classification-a4d2c428a2eb?source=collection_archive---------9-----------------------

对于多类预测任务,我们如何使用最近邻分类模型、决策树和支持向量机?

简介

分类预测问题是数据科学中最常遇到的问题之一。在本文中,我们将使用三个主要的分类家族来解决一个多类分类问题:最近邻、决策树支持向量机(SVMs)。

数据集和原始代码可以通过这个 GitHub 链接访问。

挑战

本文解决了与本文中介绍的相同的挑战。虽然这篇文章是关于预测建模和多类分类的独立文章,但是如果您想知道我是如何清理数据集以用于建模的,您也可以查看那篇文章!(另外,如果您直接从那篇文章而来,请随意跳过这一部分!)

我在这篇文章中使用的挑战来自 Drivendata.org。你可以把它想象成一场挑战社会影响的游戏。你仍然可以获得同样的奖金和格式良好的数据集,额外的好处是你将对世界产生积极的影响!

我们在这篇文章中使用的特殊挑战叫做“ 向上泵:数据挖掘地下水位 ”面临的挑战是**创建一个模型,该模型将预测特定水泵(“water point”)**的状况,因为它有许多属性。

数据由 Taarifa 提供,这是一个开源 API,收集这些数据并呈现给世界。如果你对他们的工作和他们的数据点代表什么感到好奇,一定要去看看他们的网站(和 GitHub !)

数据

我们的原始数据集(由挑战赛提供)有 42 个特征的 74,000 个数据点。在上一篇关于数据预处理和探索性数据分析的文章中,我们将其转换为包含 114 个特征的 74,000 个数据点的数据集。特征数量的增加主要来自于的一键编码,我们将分类特征扩展为每个类别的多个特征。实际上,我们在一次性编码之前已经删除了超过一半的特性,从 42 个特性减少到仅仅 20 个。剩下的 20 个特性的一键编码引导我们找到了这里的 114 个特性。

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

You can see that all of our “new” features are the results of one-hot encoding. The feature title is “original_feature_name” and “class” combined together, with 0 or 1 for whether a data point belongs to that class.

数据准备

目前,我们的测试数据集没有与之相关联的标签。为了查看模型的准确性,我们还需要测试数据集的标签。尽管很痛苦,我们现在还是要放弃测试数据集。我们可以在训练完所有模型并决定最终提交时使用哪个模型后重复使用。

train = df[df.train==True].drop(columns=['train'])
X = train.drop(columns=['status_group'])
y = train.status_group

数据分割

我们将从我们的训练数据中创建一个人工测试数据集,因为训练数据都有标签。让我们从训练数据集中随机抽取三分之一的样本,并将其指定为模型的测试集。我们可以使用 scikit-learn 的 train_test_split 包(或者“sklearn”)。

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.33, random_state=1)

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

Our training dataset now has about 40,000 data points while our testing dataset has about 20,000. That’s a good 2:1 split!

数据输出不平衡

让我们在这里快速复查一下我们的标签余额。

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

The percentages of outputs per our training and testing datasets.

看起来我们的随机分裂做得很好!我们的输出平衡与我们的训练和测试数据集非常一致。输出类有点不平衡,我们稍后会谈到。

建模

虽然我们可以使用许多类型的分类器,但它们通常分为这三类:最近邻居、决策树支持向量机。我们将从每个模型系列中挑选一个示例模型。

请注意,我们的任务是一个多类分类问题。虽然有很多方法可以进行多类逻辑回归,但我们在这里不做。

我们的特征之间也有很多关系。这或者是因为它们对应于相似的方面(例如纬度和经度),或者是一次性编码的结果。这就是为什么我们在这里也不做朴素贝叶斯模型的原因。

Taarifa 采用的指标是**“分类率”** —模型正确分类的百分比。我们来看看每个模型的分类率和运行时间。

# packages required for metrics
import time, math
from sklearn.metrics import accuracy_scorecols_results=['family','model','classification_rate','runtime']
results = pd.DataFrame(columns=cols_results)results

k-最近邻

对于我们的最近邻分类器,我们将采用 K-最近邻(KNN)模型。KNN 是一个"懒惰分类器"-它不构建任何内部模型,而只是"存储训练数据集中的所有实例。

所以,一个 KNN 没有“训练时间”——反而在预测上花了很多时间。当我们有一个大的数据集,并且 KNN 必须评估新数据点和现有数据点之间的距离时,这尤其糟糕。

让我们看看 k = 1 到 9 时,KNN 在精度和时间上的表现。(记住 k=1 的 KNN 只是最近邻分类器)

from sklearn.neighbors import KNeighborsClassifierkVals = range(1,10)
knn_names = ['KNN-'+str(k) for k in kVals]for k in kVals:
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train, y_train)

    time_start = time.time()
    y_pred = knn.predict(X_test)
    time_run = time.time()-time_start

    results = results.append(pd.DataFrame([['KNN',knn_names[k-1],accuracy_score(y_test,y_pred),time_run]],columns=cols_results),ignore_index=True)results[results.family=='KNN']

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

The results of our KNN models! Runtime is in seconds.

好了,我们知道答案了。让我们想象一下他们做得有多好,花了多少时间

fig, ax = plt.subplots()
ax.plot(kVals,results[results.family=='KNN'].classification_rate,color='blue',marker='o')
ax.set_xlabel('k-value for KNN models')
ax.set_ylabel('classification rate (blue)')
ax2=ax.twinx()
ax2.plot(kVals,results[results.family=='KNN'].runtime,color='red',marker='o')
ax2.set_ylabel('runtime (seconds; red)')
plt.show()

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

The accuracy (classification rate; in blue) and runtime (seconds, in red) for KNN models of different k-values.

准确度在开始时确实有点波动,但随着我们考虑更多的邻居,逐渐稳定在 67%左右。运行时间通常随 k 值线性增加。

随机森林

对于我们基于决策树的模型,我们将创建一个随机森林。随机森林是一种在训练数据集的子集上创建多个决策树并取得一致结果的方法。由于这种随机子集化方法,随机森林对过度拟合具有弹性,但比单一决策树需要更长的训练时间。

让我们看看由 1 棵树(这只是一个决策树)、10 棵树、100 棵树和 1000 棵树组成的随机森林的情况。

from sklearn.ensemble import RandomForestClassifier
rVals = range(1,4)
rf_names = ['RF-'+str(int(math.pow(10,r))) for r in rVals]for r in rVals:
    clf = RandomForestClassifier(n_estimators=int(math.pow(10,r)),random_state=0)
    time_start = time.time()
    clf.fit(X_train,y_train)
    time_run = time.time()-time_start
    y_pred=clf.predict(X_test)

    results = results.append(pd.DataFrame([['RF',rf_names[r-1],accuracy_score(y_test,y_pred),time_run]],columns=cols_results),ignore_index=True)

results[results.family=='RF']

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

The results of random forest classifiers.

让我们看看他们是如何想象的。

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

The accuracy and runtime for random forest classifiers.

正如所预料的那样,运行时间几乎与随机森林中决策树的数量成线性增长。然而,精确度并没有增加多少,大约在 80%左右。

SVM

支持向量机利用所谓的"内核技巧为您的数据创建超平面分隔符(即非线性问题的线性分隔符)。虽然支持向量机在理论上“可能”过拟合,但是核的可推广性通常使它能够抵抗小的过拟合。

支持向量机确实倾向于花费大量的时间,并且它的成功高度依赖于它的内核。在这个数据集(100 个特征的 40k 个数据点)上运行一个纯 SVM 将花费很长时间,因此我们将使用 sklearn 提供的 BaggingClassifier 库创建一个“袋装分类器”。BaggingClassifier 将采用一个基础模型(对于我们来说,是 SVM),并在数据集的多个随机子集上训练多个基础模型。对于我们来说,让我们每次在 1%的数据(大约 400 个数据点)上为每个内核训练 10 个 SVM 模型。

让我们来看看我们的模型对于三种不同的内核的效果如何:**线性、RBF、**和 sigmoidSklearn SVC 库也给了我们 poly 内核,但是即使在缩减的数据集上也要花很长时间来训练,所以我们在这里不做了。

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

The accuracy and run time for SVM models on three different kernel types

让我们也想象一下这些 SVM 模型的准确性和运行时间。

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

Accuracy for SVM models

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

Run time for SVM models. Compared to the linear kernel, RBF’s and sigmoid’s <1 second runtime is not visible.

线性核确实表现出最高的准确性,但是它有一个可怕的训练时间。考虑到我们采用了最多取 10%数据的 bagging 方法(=10 个支持向量机,每个支持向量机占数据集的 1%),准确性实际上非常令人印象深刻。

结果

让我们比较一下我们所有模型的准确性和运行时间!

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

The accuracy and runtime of the many classifiers we have tried out in this article.

似乎随机森林给出了最好的结果——接近 80%的准确率!一个只有 100 棵树的随机森林只需要很少的训练时间就可以达到最好的结果之一。线性支持向量机和 KNN 模型给出了下一个最好的结果。但是除了将模型相互比较之外,我们如何“客观地”知道我们的模型做得有多好?

基本情况:随机分类器

对于任何分类任务,基础案例是一个随机分类方案。一种方法是创建随机分类器,对输入进行随机分类并比较结果。标签的随机分配将遵循培训时分配给它的标签的**【基础】比例**。

from sklearn.dummy import DummyClassifierclf = DummyClassifier(strategy='stratified',random_state=0)
clf.fit(X_train,y_train)
y_pred = clf.predict(X_test)
print('Accuracy of a random classifier is: %.2f%%'%(accuracy_score(y_test,y_pred)*100))

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

对于 45%的基本精度,我们所有的模型在精度方面都做得很好。

类别不平衡——采样不足

最后,我们回到我们在开始提到的阶级不平衡问题。标签的不平衡导致分类器偏向多数标签。对我们来说,它是朝向“功能性”标签的。

我们已经看到,在一半时间内预测“功能”标签的分类器(“功能”标签占数据集的 54.3%)已经达到 45%的准确度。这已经远远好于均匀随机猜测的 33% (1/3)。

如果类彼此明显分离,类不平衡可能不会影响分类器,但在大多数情况下,它们不会。为了看看阶级不平衡是否影响了我们的模型,我们可以欠采样数据。

平衡欠采样意味着我们从数据中随机抽取样本,其中类别是“平衡的”这可以通过使用 imblearn 库的 RandomUnderSampler 类来完成。可以把 imblearn 想象成一个不平衡数据集的 sklearn 库。

from imblearn.under_sampling import RandomUnderSampler
rus = RandomUnderSampler(random_state=0)
X_rus_train,y_rus_train = rus.fit_resample(X_train,y_train)
X_rus_test,y_rus_test = rus.fit_resample(X_test,y_test)

虽然我们的原始 X_train 有将近 40,000 个数据点,但我们的欠采样数据集只有大约 8,700 个数据点。让我们通过我们最成功的模型——随机森林——运行它,看看欠采样是否会影响我们的模型准确性。

让我们在这个欠采样数据集上重新训练我们最成功的模型——我们的随机森林。

rf_rus_names = ['RF_rus-'+str(int(math.pow(10,r))) for r in rVals]for r in rVals:
    clf = RandomForestClassifier(n_estimators=int(math.pow(10,r)),random_state=0)
    time_start = time.time()
    clf.fit(X_rus_train,y_rus_train)
    time_run = time.time()-time_start
    y_rus_pred=clf.predict(X_rus_test)

    results = results.append(pd.DataFrame([['RF',rf_rus_names[r-1],accuracy_score(y_rus_test,y_rus_pred),time_run]],columns=cols_results),ignore_index=True)

results[results.family=='RF']

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

The model results of randomly undersampled data, compared with the results from the original random forest models.

因此,我们的模型精度从接近 80%下降到 70%以下。这部分是因为该模型有一个精简数据集来处理。但另一个因素是,由于多数类偏差,我们最初的随机森林模型得到了错误地“夸大”的准确性**,这在类不平衡后现在已经消失了。与此同时,平衡类确实会导致一个客观上更准确的模型,尽管不是更有效的模型。最终的决定是由您做出的——您会关心“夸大”的准确性,还是这些“假阳性”会阻止您使用原始模型?**

由于我们的**“假阳性”**可能会导致我们宣布非功能性或需要维修的供水点未得到解决,我们可能希望以其他方式出错,但这取决于您的选择。

预测建模:选择最佳模型

原文:https://towardsdatascience.com/predictive-modeling-picking-the-best-model-69ad407e1ee7?source=collection_archive---------5-----------------------

在相同的数据上测试不同类型的模型

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

无论您是在办公室环境中预测数据,还是只是在 Kaggle 比赛中竞争,测试不同的模型以找到最适合您正在处理的数据都是非常重要的。

最近,我有机会在一个私人的 Kaggle 比赛中与一些非常聪明的同事竞争,预测坦桑尼亚有问题的水泵。在做了一些数据清理后,我运行了以下模型,我将向您展示结果。

  • 逻辑回归
  • 随机森林
  • 里脊回归
  • k-最近邻
  • XGBoost

加载数据

首先,我们需要看看我们正在处理的数据。在这个特定的数据集中,要素与标注位于不同的文件中。

import pandas as pd
pd.set_option('display.max_columns', None)X_df = pd.read_csv('./train_features.csv')
X_df.head()

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

y_df = pd.read_csv('./train_labels.csv')
y_df.head()

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

我们可以看到 status_group 或 target 标签是一个字符串,有些模型不需要修改就可以工作,但有些模型不需要。稍后我们会做些什么。让我们来看看我们的目标标签的分布。

y_df['status_group'].value_counts(normalize=True)

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

这种分离表明我们在标签中正好有 3 个类,因此我们有一个多类分类。大多数类是“functional ”,所以如果我们只是将 functional 分配给所有的实例,我们的模型在这个训练集上将是. 54。这被称为多数类基线,是我们运行的模型要达到的目标。

数据清理和特征工程

这个数据集中有许多功能,所以我不会详细介绍我所做的每一件事,但我会一步一步地从高层次进行介绍。

首先,我们希望通过查看所有的特性和数据类型来检查事物。

X_df.info()

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

为了能够在模型中使用它们,我们需要使用 30 个对象特征。int 和 float 对象可以直接使用。

另一个需要关注的是高基数特性。如果我们对这些特性的每一个都有超过 100 个类别,那么使用它们就没什么用了。这会给我们的数据集增加维度,我们不想这么做。

在我们删除这些高基数列之前,我看到 date_recorded 是一个对象,它肯定会随着我们的高基数特性而被删除,所以我在此基础上创建了一些特性。

#So date doesn't get dropped in next stepX_df['date_recorded'] = pd.to_datetime(X_df['date_recorded'])X_df['YearMonth'] = X_df['date_recorded'].map(lambda x: 100*x.year + x.month)X_df['Year'] = X_df['date_recorded'].map(lambda x: x.year)X_df['Month'] = X_df['date_recorded'].map(lambda x: x.month)

既然我们已经对日期进行了分类,我们可以检查高基数并删除那些特性。

max_cardinality = 100high_cardinality = [col for col in X_df.select_dtypes(exclude=np.number)
                   if X_df[col].nunique() > max_cardinality]X_df = X_df.drop(columns=high_cardinality)X_df.info()

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

所以,我们放弃了 8 个高基数的特性。现在我们可以使用 OneHotEncoder 或 Pandas get_dummies()将这些对象更改为 int。

现在我们所有的特征都是数字的,让我们进入模型吧!

逻辑回归

逻辑回归对于多类分类非常有用,因为如果目标标签是字符串,Scikit-learn 会自动对其进行编码。

首先,我们需要将数据分为训练和测试。

from sklearn.preprocessing import scale
from sklearn.model_selection import train_test_splitX = X.drop(columns='id') #id is our index and won't help our model
X = scale(X) X_train, X_test, y_train, y_test = train_test_split(
        X, y, train_size=0.75, test_size=0.25, random_state=42, shuffle=True)

当你使用一个学习模型时,重要的是缩放特征到一个以零为中心的范围。缩放将确保特征的方差在相同的范围内。

现在,我们将在训练和测试中运行该模型,并查看我们的准确度得分。

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_scorelogreg = LogisticRegression()
logreg.fit(X_train,y_train)
y_pred = logreg.predict(X_train)
print('Train accuracy score:',accuracy_score(y_train,y_pred))
print('Test accuracy score:', accuracy_score(y_test,logreg.predict(X_test)))

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

在训练和测试中,我们以 0.73 的成绩打破了大多数班级 0.54 的基线。让我们看看另一种模式是否能做得更好。

随机森林

随机森林也可以将字符串作为我们的目标标签,因此我们可以使用相同的训练测试分割来运行模型。

from sklearn.ensemble import RandomForestClassifier as RFCrfc_b = RFC()rfc_b.fit(X_train,y_train)
y_pred = rfc_b.predict(X_train)
print('Train accuracy score:',accuracy_score(y_train,y_pred))
print('Test accuracy score:', accuracy_score(y_test,rfc_b.predict(X_test)))

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

随机森林在训练和测试中击败了逻辑回归,训练中为 0.97,测试中为 0.79。

里脊回归

对于岭回归,我们需要在运行模型之前对目标标签进行编码。

X = X_df.drop(columns=['id'])
X = scale(X)y = y_df.drop(columns='id')
y = y.replace({'functional':0, 'non functional':2,'functional needs repair':1 })X_train, X_test, y_train, y_test = train_test_split(
        X, y, train_size=0.75, test_size=0.25, random_state=42, shuffle=True)

现在我们运行这个模型。Ridge 在其 predict()方法中输出一个概率,所以我们必须用 numpy 更新它,以便得到实际的预测。

from sklearn.linear_model import Ridge
import numpy as npridge = Ridge()ridge.fit(X_train,y_train)
y_prob = ridge.predict(X_train)
y_pred = np.asarray([np.argmax(line) for line in y_prob])
yp_test = ridge.predict(X_test)
test_preds = np.asarray([np.argmax(line) for line in yp_test])
print(accuracy_score(y_train,y_pred))
print(accuracy_score(y_test,test_preds))

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

所以,岭回归对于这些数据来说不是一个好的模型。

k-最近邻

对于 K-最近邻,我们将使用与岭相同的训练测试分割。

from sklearn.neighbors import KNeighborsClassifierknn = KNeighborsClassifier()knn.fit(X_train,y_train)
y_pred = knn.predict(X_train)
print('Train accuracy score:',accuracy_score(y_train,y_pred))
print('Test accuracy score:',accuracy_score(y_test,knn.predict(X_test)))

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

这些分数看起来比 Ridge 好很多,但仍然不是我们最好的分数。

XGBoost

XGBoost 是一种算法,在应用机器学习和针对结构化或表格数据的 Kaggle 竞赛中非常流行。

这是一个梯度增强决策树的实现,旨在提高速度和性能。

如果你想了解更多,请查看这里的文档。当运行这个模型时,我对这些参数进行了一些调整,这些参数是我运行的数据中最好的。

xg_train = xgb.DMatrix(X_train, label=y_train)
xg_test = xgb.DMatrix(X_test, label=y_test)xg_train.save_binary('train.buffer')
xg_test.save_binary('train.buffer')# setup parameters for xgboost
param = {}
# use softmax multi-class classification
param['objective'] = 'multi:softmax'
param['silent'] = 1 # cleans up the output
param['num_class'] = 3 # number of classes in target label watchlist = [(xg_train, 'train'), (xg_test, 'test')]
num_round = 30
bst = xgb.train(param, xg_train, num_round, watchlist)

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

XGBoost 分类器的输出输出一个错误,该错误被定义为

merror:多类分类错误率。它被计算为#(wrong cases)/#(all cases)

# get prediction
y_pred1 = bst.predict(xg_train)
y_pred2 = bst.predict(xg_test)
print('Train accuracy score:',accuracy_score(y_train,y_pred1))
print('Test accuracy score:',accuracy_score(y_test,bst.predict(xg_test)))

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

我们在训练中得到 0.79 分,在测试中得到 0.78 分,这也不是我们最好的成绩,但和随机森林差不多。

结论

出于我的目的,我选择使用 XGBoost 并修改了参数。我在上面使用的训练测试分割数据中的分数在训练中是. 97,在测试中是. 81。在给出的测试数据上,我的 Kaggle 分数以. 795 结束。

一旦您找到了最适合您所拥有的数据的模型,您就可以使用模型接受的参数,看看您是否可以获得更好的分数。

我希望这有助于您的预测建模工作!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值