网络安全最新SARIMA季节项时间序列分析流程+python代码

文章目录
  • 数据
  • 流程
  • 流程分割
    • 1 画图
      • 2 季节项和周期项的去除
      • 3 平稳性检验
      • 4 白噪声检验
      • 5 模型拟合
      • 6 模型定阶
        • AIC/ BIC 准则
      • 7 检查残差是否通过检验
        • 7.1 若通过检验
          • 7.2 若未通过检验
      • 8 模型的预测
      • 9 模型的评价
        • 画图
          • 均方差等
  • 总的代码
  • 参考

数据

数据网站:National Aeronautics and Space Administration Goddard Institute for Space Studies
主要分析的是北美陆地表面温度。
训练数据:1990.1-2019.12.
测试数据:2020.1-2020.11
开始只选取了120即10的数据来进行分析,但是到最后发现模型有很多的波动之后,去问老师,老师说这是数据太少导致波动太大造成的,所以建议我们再多训练一些数据。就之后进行模型的定阶而言,至少需要三四百的数据。最后我们选取了360个数据,即30年的数据。
关于模型定阶所需要的阶数,最后展现的lags的选取,老师建议选择

l

a

g

s

=

n

lags=\sqrt{n}

lags=n

​因为只有这样才会才合理。具体为什么合理,我弄明白之后,回来补充!后来又猜测,应该是大数定律

流程

大致流程:
1、首先画出原始数据的时序图,

2、接着,查看原始时间序列是否稳定,不稳定的话,需要转化成稳定的时间序列;
如果不稳定,可采用一阶12步差分指数平滑法小趋势项法等来消除趋势项和季节项。一般,需要先消除趋势项,再消除季节项。因为趋势项如果不消除,会对后来季节项的去除有影响。
如果时序图呈指数形式增长,则还需要取对数,之后再尝试以上方法来消除趋势项和季节项。
如果方差和自协方差不平稳,使用Box-Cox变换,来使得数据变得平稳。
具体参考第2章 时间序列的预处理

3、尝试使用上面的几种去除趋势项和季节项的方法之后,需要检测你去除的效果。一般需要使用平稳性检验。经常使用的是单位根检验,即ADF检验,之后直接掉包即可。还有DF检验、PP检验。具体参考:单位根检验

4、白噪声检验。在进行平稳性的检验之后,还需要继续对消除趋势项和季节项之后的序列进行白噪声检验。因为一旦在进行两步处理之后,你的时间序列就没有了任何的信息,那就不需要分析了,因为我们已经将里面的信息提取完全了(也就是榨干净了)。即,原来的时间序列中只包含趋势项、季节项和随即向(白噪声)。分析终止。

5、若没有通过白噪声检验,则需要进行ARIMA的建模。可能还有其他的时间序列模型,但是我们在这里只分析ARIMA模型,即差分后的ARMA模型。

6、建模首先需要进行模型的定阶。定阶一般使用的是自相关图和偏自相关图。根据AR、MA、ARMA模型分别的自相关系数和偏自相关系数的拖尾性和截尾性来进行判断。
简单写一下

模型 自相关系数 偏自相关系数
AR 拖尾 (p阶)截尾
MA (q阶)截尾 拖尾
ARMA 拖尾 拖尾

这里的判断,人工一般是找不到最优的。比如说,在进行MA模型定阶的时候,截尾最大的阶数是12,即查过95%置信区间的是12阶的,但是这里的12阶并不是最优的。所以我们需要使用借助 AIC和BIC准则来进行判断。

一般,当样本容量n比较时,使用AIC;当样本容量n比较时,使用BIC。这里,我们360个数据使用的时BIC 准则。

7、 进行模型定阶之后就可以将原始数据传入到SARIMAX模型中去训练,得到一个模型啦。得到模型之后,主要利用模型来进行预测。在python包中,这个模型(类)中有很多很有用的方法,残差和预测等等 。

流程分割

1 画图

首先读取数据,将原始数据的图画出来,肉眼观察是否是平稳时间序列。
如果是,则直接平稳性检验和白噪声检验步骤;没有则进行下一步。
在这里插入图片描述

2 季节项和周期项的去除

季节项和周期项的去除。
这里面有讲时间序列的预处理。主要介绍了三种办法:1差分,常见的一阶12步消除趋势项和季节项。2、Box-Cox变换。3、结合1和2来去除。
此外,我们课本上还提及到两种办法:1、小趋势项法,2、滑动平均法。
至于具体怎么实现,可以一个个关键字搜索学习。
我使用的方法1,一阶12步差分得到的图形如下:
在这里插入图片描述

3 平稳性检验

主要使用的是ADF,即单位根检验。
原假设

H

0

H_0

H0​:存在单位根,即数据是不平稳的。
备择假设

H

1

H_1

H1​:不存在单位根,数据平稳。
这里使用的检验方法一般是P-值检验,所以当p小于上面给出的在10%, 5%, 2.5%, 1%时,则拒绝原假设,平稳;否则,不拒绝原假设,数据不平稳。假设检验中的P值

关于原假设和备择假设
平稳性检验和白噪声检验

# 平稳性检验
from statsmodels.tsa.stattools import adfuller
result = adfuller(df.diff(1).dropna().diff(12).dropna())
# result = adfuller(no\_season) # 与上面的等价
print(u'一阶12步差分序列的平稳性检验\n', result)

result:

一阶12步差分序列的平稳性检验
 (-9.08927532353749, 3.863646256069488e-15, 14, 332, {'1%': -3.4502011472639724, '5%': -2.8702852297358983, '10%': -2.5714292194077513}, -87.4608194311453)

看到 3.863646256069488e-15 << 0.01 or 0.05
p-value远小于0.01, 0.05
所以拒绝原假设,认为序列非白噪声,可以接着进行下一步。

4 白噪声检验

在消除趋势项(差分、指数平滑、或者小趋势法)之后,看是否是白噪声。
在消除季节项之后,需要进行白噪声检验。
原因:当你进行数据平稳化操作之后,如果是白噪声就不需要进行下面的分析了。即,处理之后所得数据无任何信息。

主要使用LB统计量,即使用Q函数。

H

0

:

ρ

1

=

ρ

2

=

=

ρ

k

H_0: \quad \rho_1 = \rho_2 = \cdots =\rho_k

H0​:ρ1​=ρ2​=⋯=ρk​

H

1

:

i

,

s

.

t

.

ρ

i

0

H_1: \quad \exist i, s.t. \rho_i \ne 0

H1​:∃i,s.t.ρi​​=0

H

0

H_0

H0​对应着序列是随机序列;

H

1

H_1

H1​:序列是不随机的。
同单位根检验,也是使用p值检验。

#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'一阶12步序列的白噪声检验结果为:\n', acorr_ljungbox(df.diff(1).dropna().diff(12).dropna(), lags=6)) #返回统计量和p值

result:

一阶12步序列的白噪声检验结果为:
 (array([69.05945861, 69.10660643, 69.12487584, 70.00931964, 70.22520516,
       70.61247787]), array([9.55392347e-17, 9.85578186e-16, 6.57102236e-15, 2.25958202e-14,
       9.19954185e-14, 3.06166120e-13]))

主要看的是输出的第二个array,这里的 9.55392347e-17 << 0.05 ,所以可以拒绝原假设,认为不是白噪声。

5 模型拟合

在我们的模型中,主要是SARIMAX(p, d, q) × (P, D, Q, s).
其中每一个参数代表的意思可以在网上找到。
比如:
Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测
时间序列预测,非季节性ARIMA及季节性SARIMA
python 时间序列预测 —— SARIMA
我补充一下自己理解的。
p, d, q并不难理解,课本上一般都有解释,不多说。
P, D, Q, s
P是SAR项的周期性阶数,比如你的数据的周期是12,与此同时,偏自相关系数在24, 36时呈现出周期性,那么就需要将Q值 取为1, 2
D是季节项差分的阶数。一般是取1。
Q时SMA的周期性阶数,同理Q,只不过这时需要看自相关系数了。
s:代表你的周期是多少。比如我上面说的周期为12,则s=12.

6 模型定阶

主要有三种方法:1、利用残差方差图定阶法。2、F检验定阶法。3、准则函数(AIC和BIC准则)定阶法。
这里主要介绍利用AIC和BIC准则进行定阶。

AIC/ BIC 准则

AIC/BIC:是在模型的精度和模型的阶数之间进行的平衡。精度越高,阶数则越大。
我们希望在两者之间找到一个平衡,精度可接受阶数也不是特别大的模型来进行拟合。
两者有一个差别。(上面流程讲过
简单讲。当样本n比较小时,使用AIC准则进行定阶。当样本n比较大时,使用BIC准则进行定阶。具体公式也可以自己百度。定义、性质、适用情况,优缺点。
对上一步提及到的六个参数的选择,找到AIC或者BIC最小的,以这个参数建立模型,来进行拟合。

两个步骤:

  1. 找到各种阶数((p, d, q)×(P, D, Q, S))的上界。
  2. 对((p, d, q)×(P, D, Q, S))的各种组合来拟合模型。找到最小的AIC或者BIC,此为最优的模型。

(这个好像Bayes寻求样本容量呀(ENGS)

一些需要注意的地方:

  1. AIC和BIC可能为负,当模型拟合的方差特别小(<1)时,则可能为负,这是正常的。
  2. 在观察ACF和PACF的图形时,坚定的认为你的序列是MA或者AR模型时,如果在进行模型拟合时,出现AR或者MA的系数为nan的情形,则模型的系数的方差过大。此时应该换一个模型(阶数较小的)来进行拟合。找到方差不为nan,且AIC和BIC为最小的的模型作为最优模型。
  3. 在模型拟合时,若在步骤1中出现模型拟合报错的情形时,应调节参数最大值(一般是降低),再来寻求AIC/BIC的最小值。例如我就出现过MA阶数(12)等于季节项阶数(12)的问题,此时应该调低MA的阶数

生成所有可能参数组合:

from itertools import product
# ARIMA的参数
ps = range(0, 1)
d = range(0, 2)
qs = range(0, 12)
# 季节项相关的参数
Ps = range(0, 1)
D = range(1, 2)
Qs = range(1, 2)
# 将参数打包,传入下面的数据,是哦那个BIC准则进行参数选择
params_list = list(product(ps, d, qs, Ps, D, Qs))
print(params_list)

利用BIC准则找最优的参数:

from statsmodels.tsa.statespace.sarimax import SARIMAX
from tqdm import tqdm_notebook
from statsmodels.tsa.arima_model import ARIMA
import warnings
# 忽视在模型拟合中遇到的错误
warnings.filterwarnings("ignore")
# 找最优的参数 SARIMAX
def find\_best\_params(data:np.array, params_list):
    result = []
    best_bic = 100000
    for param in tqdm_notebook(params_list):
        # 模型拟合
        # model = SARIMAX(data,order=(param[0], param[1], param[2]),seasonal\_order=(param[3], param[4], param[5], 12)).fit(disp=-1)
        model = SARIMAX(data, order=(param[0], param[1], param[2]), seasonal_order=(param[3], param[4], param[5], 12)).fit(disp=-1)
        bicc = model.bic # 拟合出模型的BIC值
        # print(bic)
        # 寻找最优的参数
        if bicc < best_bic:
            best_mode = model
            best_bic = bicc
            best_param = param
        param_1 = (param[0], param[1], param[2])
        param_2 = (param[3], param[4], param[5], 12)
        param = 'SARIMA{0}x{1}'.format(param_1, param_2)
        print(param)
        result.append([param, model.bic])

    result_table = pd.DataFrame(result)
    result_table.columns = ['parameters', 'bic']
    result_table = result_table.sort_values(by='bic',ascending=True).reset_index(drop=True)


### 如何自学黑客&网络安全


#### 黑客零基础入门学习路线&规划


**初级黑客**  
 **1、网络安全理论知识(2天)**  
 ①了解行业相关背景,前景,确定发展方向。  
 ②学习网络安全相关法律法规。  
 ③网络安全运营的概念。  
 ④等保简介、等保规定、流程和规范。(非常重要)


**2、渗透测试基础(一周)**  
 ①渗透测试的流程、分类、标准  
 ②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking  
 ③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察  
 ④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等


**3、操作系统基础(一周)**  
 ①Windows系统常见功能和命令  
 ②Kali Linux系统常见功能和命令  
 ③操作系统安全(系统入侵排查/系统加固基础)


**4、计算机网络基础(一周)**  
 ①计算机网络基础、协议和架构  
 ②网络通信原理、OSI模型、数据转发流程  
 ③常见协议解析(HTTP、TCP/IP、ARP等)  
 ④网络攻击技术与网络安全防御技术  
 ⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现


**5、数据库基础操作(2天)**  
 ①数据库基础  
 ②SQL语言基础  
 ③数据库安全加固


**6、Web渗透(1周)**  
 ①HTML、CSS和JavaScript简介  
 ②OWASP Top10  
 ③Web漏洞扫描工具  
 ④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)  
 恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k


到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?


如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!


**7、脚本编程(初级/中级/高级)**  
 在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.


如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。

**8、超级黑客**  
 这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。  
 ![img](https://img-blog.csdnimg.cn/img_convert/3fd39c2ba8ec22649979f245f4221608.webp?x-oss-process=image/format,png)


#### 网络安全工程师企业级学习路线


![img](https://img-blog.csdnimg.cn/img_convert/931ac5ac21a22d230645ccf767358997.webp?x-oss-process=image/format,png)  
 如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的


视频配套资料&国内外网安书籍、文档&工具


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

![img](https://img-blog.csdnimg.cn/img_convert/153b2778a3fe5198265bed9635d63469.webp?x-oss-process=image/format,png)  
 一些笔者自己买的、其他平台白嫖不到的视频教程。  
 ![img](https://img-blog.csdnimg.cn/img_convert/32eb4b22aa740233c5198d3c161b37e8.webp?x-oss-process=image/format,png)



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/topics/618540462)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

你可能感兴趣的:(程序员,python,人工智能,机器学习)