90-预测分析-R语言实现-时间序列1

Python012

90-预测分析-R语言实现-时间序列1,第1张

时间序列(time series)是随机变量Y 1 、Y 2 、……Y t 的一个序列,它是由等距的时间点序列索引的。

一个时间序列的均值函数就是该时间序列在某个时间索引t上的期望值。一般情况下,某个时间序列在某个时间索引t 1 的均值并不等于该时间序列在另一个不同的时间索引t 2 的均值。

自协方差函数及自相关函数是衡量构成时间序列的随机变量在不同时间点上相互线性依赖性的两个重要函数。自相关函数通常缩略为ACF函数。ACF函数是对称的,但是无单位,其绝对值被数值1约束,即当两个时间序列索引之间的自相关度是1或-1,就代表两者之间存在完全线性依赖或相关,而当相关度是0时,就代表完全线性无关。

平稳性:实质描述的是一个时间序列的概率表现不会随着时间的流逝而改变。常用的平稳性的性质有严格平稳和弱平稳两个版本。tseries包的adf.test()函数可以检验时间序列的平稳性,返回的p值小于0.05则表示是平稳的。

白噪声是一个平稳过程,因为它的均值和方差都是常数。

随机漫步的均值是常数(不带漂移的随机漫步),但它的方差是随着时间的变化而不同的,因此它是不平稳的。

自回归模型(Autoregressive models, AR)来源于要让一个简单模型根据过去有限窗口时间里的最近值来解释某个时间序列当前值的想法。

自回归条件异方差模型:ARIMA模型的关键前提条件是,虽然序列本身是非平稳的,但是我们可以运用某个变换来获得一个平稳的序列。像这样为非平稳时间序列构建模型的方法之一是作出一个假设,假设该模型非平稳的原因是该模型的方差会以一种可预见的方式随时间变化,这样就可以把方差随时间的变化建模为一个自回归过程,这种模型被称为自回归条件异方差模型(ARCH)。加入了移动平均方差成分的ARCH模型称为广义自回归条件异方差模型(GARCH)。

任务:预测强烈地震

数据集:2000-2008年期间在希腊发生的强度大于里氏4.0级地震的时间序列。

不存在缺失值。

将经度和纬度之外的变量转换为数值型。

从图上可以看出,数据在30次左右波动,并且不存在总体向上的趋势。

通过尝试多个不同的组合来找到最优的阶数参数p,d,q,确定最优的准则是使用参数建模,能使模型的AIC值最小。

定义一个函数,它会针对某个阶数参数拟合出一个ARIMA模型,并返回模型的AIC值。如果某组参数导致模型无法收敛,就会产生错误,并且无法返回AIC,这时需要人为设置其AIC为无限大(InF)。

调用函数,选取最合适的模型。

然后找出最优的阶数参数:

得到最合适的模型为ARIMA(1, 1, 1)。再次使用最优参数训练模型。

使用forecast包预测未来值。

带颜色的条带是预测的置信区间,蓝色线表示均值,结果表示在后续的10个月里,地震的数量会有小幅增加。

检查自相关函数:

ACF绘图:虚线显示了一个95%的置信区间,特定延迟对应的ACF函数值如果处于该区间内,就不会被认为具有统计显著性(大于0)。这个ACF轮廓表明,针对本数据集,简单的AR(1)过程可能是一种合适的拟合方式。

PACF为偏自相关函数,是将时间延迟K的PACF定义为在消除了小于K的延迟中存在的任何相关性影响的情况下所产生的相关性。

机器学习模型评价指标及R实现

1.ROC曲线

考虑一个二分问题,即将实例分成正类(positive)或负类(negative)。对一个二分问题来说,会出现四种情况。如果一个实例是正类并且也被 预测成正类,即为真正类(True positive),如果实例是负类被预测成正类,称之为假正类(False positive)。相应地,如果实例是负类被预测成负类,称之为真负类(True negative),正类被预测成负类则为假负类(false negative)。

列联表如下表所示,1代表正类,0代表负类。

真正类率(true positive rate ,TPR), 也称为 Sensitivity,计算公式为TPR=TP/ (TP+ FN),刻画的是分类器所识别出的 正实例占所有正实例的比例。

假正类率(false positive rate, FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。

真负类率(True Negative Rate,TNR),也称为specificity,计算公式为TNR=TN/ (FP+ TN) = 1 - FPR。 在一个二分类模型中,对于所得到的连续结果,假设已确定一个阈值,比如说 0.6,大于这个值的实例划归为正类,小于这个值则划到负类中。如果减小阈值,减到0.5,固然能识别出更多的正类,也就是提高了识别出的正例占所有正例的比例,即TPR,但同时也将更多的负实例当作了正实例,即提高了FPR。为了形象化这一变化,在此引入ROC。

ROC曲线正是由两个变量1-specificity(x轴) 和 Sensitivity(y轴)绘制的,其中1-specificity为FPR,Sensitivity为TPR。随着阈值的改变,就能得到每个阈值所对应的1-specificity和Sensitivity,最后绘制成图像。

该图像的面积如果越接近1,那么我们则认为该分类器效果越好。从直觉上来说,假设我们的预测全部100%正确,那么不管阈值怎么变(除了阈值等于0和1时),我们的Sensitivity(真正类)率永远等于1,1-specificity(1-真负类率)永远等于0,所以该图就是个正方形,面积为1,效果最好。

样例数据集:

library(ROCR)

data(ROCR.simple)

ROCR.simple<-as.data.frame(ROCR.simple)

head(ROCR.simple)

# predictions labels

# 1 0.6125478 1

# 2 0.3642710 1

# 3 0.4321361 0

# 4 0.1402911 0

# 5 0.3848959 0

# 6 0.2444155 1

绘制ROC图:

pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)

perf <- performance(pred,"tpr","fpr")

plot(perf,colorize=TRUE)

2.AUC值

AUC值就是ROC曲线下的面积,可以通过以下代码计算:

pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)

auc.tmp <- performance(pred,"auc")

auc <- as.numeric([email protected])

3.Recall-Precision(PR)曲线

同样是一个二分类的模型的列联表,我们可以定义:

然后我们通过计算不同的阈值,以Recall为X轴,Precision为Y轴绘制图像。

PR图可以有这样的应用,引用一个例子[1]:

1. 地震的预测

对于地震的预测,我们希望的是RECALL非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲PRECISION。情愿发出1000次警报,把10次地震都预测正确了;也不要预测100次对了8次漏了两次。

2. 嫌疑人定罪

基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。及时有时候放过了一些罪犯(recall低),但也是值得的。

对于分类器来说,本质上是给一个概率,此时,我们再选择一个CUTOFF点(阀值),高于这个点的判正,低于的判负。那么这个点的选择就需要结合你的具体场景去选择。反过来,场景会决定训练模型时的标准,比如第一个场景中,我们就只看RECALL=99.9999%(地震全中)时的PRECISION,其他指标就变得没有了意义。

绘制代码:

pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)

RP.perf <- performance(pred, "prec", "rec")

plot (RP.perf)

#查看阈值为0.1,0.5,0.9下的召回率和精确率

plot(RP.perf, colorize=T, colorkey.pos="top",

print.cutoffs.at=c(0.1,0.5,0.9), text.cex=1,

text.adj=c(1.2, 1.2), lwd=2)

一般这曲线越靠上,则认为模型越好。对于这个曲线的评价,我们可以使用F分数来描述它。就像ROC使用AUC来描述一样。

4.F1分数

分数定义如下:

我们可以使用R计算F1分数:

pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)

f.perf <- performance(pred, "f")

plot(f.perf) #横坐标为阈值的取值

5.均方根误差RMSE

回归模型中最常用的评价模型便是RMSE(root mean square error,平方根误差),其又被称为RMSD(root mean square deviation),其定义如下:

其中,yi是第i个样本的真实值,y^i是第i个样本的预测值,n是样本的个数。该评价指标使用的便是欧式距离。

??RMSE虽然广为使用,但是其存在一些缺点,因为它是使用平均误差,而平均值对异常点(outliers)较敏感,如果回归器对某个点的回归值很不理性,那么它的误差则较大,从而会对RMSE的值有较大影响,即平均值是非鲁棒的。 所以有的时候我们会先剔除掉异常值,然后再计算RMSE。

R语言中RMSE计算代码如下:

pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)

rmse.tmp<-performance(pred, "rmse")

[email protected]

6.SAR

SAR是一个结合了各类评价指标,想要使得评价更具有鲁棒性的指标。(cf. Caruana R., ROCAI2004):

其中准确率(Accuracy)是指在分类中,使用测试集对模型进行分类,分类正确的记录个数占总记录个数的比例:

pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)

sar.perf<-performance(pred, "sar")

7.多分类的AUC[5]

将二类 AUC 方法直接扩展到多类分类评估中, 存在表述空间维数高、复杂性大的问题。 一般采用将多类分类转成多个二类分类的思想, 用二类 AUC 方法来评估多类分类器的性能。Fawcett 根据这种思想提出了 F- AUC 方法[4], 该评估模型如下

其中AUC(i,rest)是计算 用 ” 1- a- r”方 法 得 到 的 每 个 二 类 分 类器的 AUC 值,“ 1- a- r”方法思想是 k 类分类问题构造 k 个二类分类器, 第 i 个二类分类器中用第 i 类的训练样本作为正例, 其他所有样本作为负例。 p ( i) 是计算每个类在所有样本中占有的比例,

从速度的角度看,Spark从流行的MapReduce模型继承而来,可以更有效地支持多种类型的计算,如交互式查询和流处理。速度在大数据集的处理中非常重要,它可以决定用户可以交互式地处理数据,还是等几分钟甚至几小时。Spark为速度提供的一个重要特性是其可以在内存中运行计算,即使对基于磁盘的复杂应用,Spark依然比MapReduce更有效。

从通用性来说,Spark可以处理之前需要多个独立的分布式系统来处理的任务,这些任务包括批处理应用、交互式算法、交互式查询和数据流。通过用同一个引擎支持这些任务,Spark使得合并不同的处理类型变得简单,而合并操作在生产数据分析中频繁使用。而且,Spark降低了维护不同工具的管理负担。

Spark被设计的高度易访问,用Python、Java、Scala和SQL提供简单的API,而且提供丰富的内建库。Spark也与其他大数据工具进行了集成。特别地,Spark可以运行在Hadoop的集群上,可以访问任何Hadoop的数据源,包括Cassandra。

Spark 核心组件

Spark核心组件包含Spark的基本功能,有任务调度组件、内存管理组件、容错恢复组件、与存储系统交互的组件等。Spark核心组件提供了定义弹性分布式数据集(resilient distributed datasets,RDDs)的API,这组API是Spark主要的编程抽象。RDDs表示分布在多个不同机器节点上,可以被并行处理的数据集合。Spark核心组件提供许多API来创建和操作这些集合。

Spark SQLSpark SQL是Spark用来处理结构化数据的包。它使得可以像Hive查询语言(Hive Query Language, HQL)一样通过SQL语句来查询数据,支持多种数据源,包括Hive表、Parquet和JSON。除了为Spark提供一个SQL接口外,Spark SQL允许开发人员将SQL查询和由RDDs通过Python、Java和Scala支持的数据编程操作混合进一个单一的应用中,进而将SQL与复杂的分析结合。与计算密集型环境紧密集成使得Spark SQL不同于任何其他开源的数据仓库工具。Spark SQL在Spark 1.0版本中引入Spark。

Shark是一个较老的由加利福尼亚大学和伯克利大学开发的Spark上的SQL项目,通过修改Hive而运行在Spark上。现在已经被Spark SQL取代,以提供与Spark引擎和API更好的集成。

Spark流(Spark Streaming)Spark流作为Spark的一个组件,可以处理实时流数据。流数据的例子有生产环境的Web服务器生成的日志文件,用户向一个Web服务请求包含状态更新的消息。Spark流提供一个和Spark核心RDD API非常匹配的操作数据流的API,使得编程人员可以更容易地了解项目,并且可以在操作内存数据、磁盘数据、实时数据的应用之间快速切换。Spark流被设计为和Spark核心组件提供相同级别的容错性,吞吐量和可伸缩性。

MLlibSpark包含一个叫做MLlib的关于机器学习的库。MLlib提供多种类型的机器学习算法,包括分类、回归、聚类和协同过滤,并支持模型评估和数据导入功能。MLlib也提供一个低层的机器学习原语,包括一个通用的梯度下降优化算法。所有这些方法都可以应用到一个集群上。

GraphXGraphX是一个操作图(如社交网络的好友图)和执行基于图的并行计算的库。与Spark流和Spark SQL类似,GraphX扩展了Spark RDD API,允许我们用和每个节点和边绑定的任意属性来创建一个有向图。GraphX也提供了各种各样的操作图的操作符,以及关于通用图算法的一个库。

集群管理器Cluster Managers在底层,Spark可以有效地从一个计算节点扩展到成百上千个节点。为了在最大化灵活性的同时达到这个目标,Spark可以运行在多个集群管理器上,包括Hadoop YARN,Apache Mesos和一个包含在Spark中的叫做独立调度器的简易的集群管理器。如果你在一个空的机器群上安装Spark,独立调度器提供一个简单的方式如果你已经有一个Hadoop YARN或Mesos集群,Spark支持你的应用允许在这些集群管理器上。第七章给出了不同的选择,以及如何选择正确的集群管理器。

谁使用Spark?用Spark做什么?

由于Spark是一个面向集群计算的通用框架,可用于许多不同的应用。使用者主要有两种:数据科学家和数据工程师。我们仔细地分析一下这两种人和他们使用Spark的方式。明显地,典型的使用案例是不同的,但我们可以将他们粗略地分为两类,数据科学和数据应用。

数据科学的任务数据科学,近几年出现的一门学科,专注于分析数据。尽管没有一个标准的定义,我们认为一个数据科学家的主要工作是分析和建模数据。数据科学家可能会SQL,统计学,预测模型(机器学习),用Python、MATLAB或R编程。数据科学家能将数据格式化,用于进一步的分析。

数据科学家为了回答一个问题或进行深入研究,会使用相关的技术分析数据。通常,他们的工作包含特殊的分析,所以他们使用交互式shell,以使得他们能在最短的时间内看到查询结果和代码片段。Spark的速度和简单的API接口很好地符合这个目标,它的内建库意味着很多算法可以随时使用。

Spark通过若干组件支持不同的数据科学任务。Spark shell使得用Python或Scala进行交互式数据分析变得简单。Spark SQL也有一个独立的SQL shell,已经为大家精心准备了大数据的系统学习资料,从Linux-Hadoop-spark-......,需要的小伙伴可以点击它可以用SQL进行数据分析,也可以在Spark程序中或Spark shell中使用Spark SQL。MLlib库支持机器学习和数据分析。而且,支持调用外部的MATLAB或R语言编写的程序。Spark使得数据科学家可以用R或Pandas等工具处理包含大量数据的问题。