当前位置: 首页 > news >正文

网站建设公司网站模版郑州专业网站推广公司

网站建设公司网站模版,郑州专业网站推广公司,虚拟空间下载,wordpress数据转移目录 1. pmdarima实现单变量时间序列预测 2. 时间序列交叉验证 2.1 滚动交叉验证(RollingForecastCV) 2.2 滑窗交叉验证(SildingWindowForecastCV) 1. pmdarima实现单变量时间序列预测 Pmdarima是以statsmodel和autoarima为基础、封装研发出的Python时序分析库、也是现在市…目录 1. pmdarima实现单变量时间序列预测 2. 时间序列交叉验证 2.1 滚动交叉验证(RollingForecastCV) 2.2 滑窗交叉验证(SildingWindowForecastCV) 1. pmdarima实现单变量时间序列预测 Pmdarima是以statsmodel和autoarima为基础、封装研发出的Python时序分析库、也是现在市面上封装程度最高、代码最为简洁的时序预测库之一。Pmdarima由sklearn团队开发沿袭了sklearn库的代码习惯、并保留了一切接入sklearn的接口是非常方便机器学习学习者学习的工具。该库包括了以R语言为基础的autoarima所有的功能并且能够处理平稳性、季节性、周期性等问题可以执行差分、交叉验证等运算以及内容丰富的官方说明文档。以下是使用Pmdarima实现一个简单预测的过程 import pmdarima as pm from pmdarima import model_selection import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.metrics import mean_squared_error import warnings warnings.filterwarnings(ignore)data pm.datasets.load_wineind() len(data) #176figplt.figure(figsize(16,5)) plt.plot(range(data.shape[0]),data) plt.grid() #使用pm分割数据遵循时序规则不会打乱时间顺序 train, test model_selection.train_test_split(data, train_size152) #自动化建模只支持SARIMAX混合模型,不支持VARMAX系列模型 arima pm.auto_arima(train, traceTrue, #训练数据是否打印训练过程error_actionignore, suppress_warningsTrue, #无视警告和错误maxiter5, #允许的最大迭代次数seasonalTrue, m12 #是否使用季节性因子如果使用的话多步预测的步数是多少) Performing stepwise search to minimize aicARIMA(2,1,2)(1,0,1)[12] intercept : AIC2955.247, Time0.46 secARIMA(0,1,0)(0,0,0)[12] intercept : AIC3090.160, Time0.02 secARIMA(1,1,0)(1,0,0)[12] intercept : AIC2993.480, Time0.08 secARIMA(0,1,1)(0,0,1)[12] intercept : AIC2985.395, Time0.09 secARIMA(0,1,0)(0,0,0)[12] : AIC3088.177, Time0.02 secARIMA(2,1,2)(0,0,1)[12] intercept : AIC2978.426, Time0.16 secARIMA(2,1,2)(1,0,0)[12] intercept : AIC2954.744, Time0.18 secARIMA(2,1,2)(0,0,0)[12] intercept : AIC3025.510, Time0.10 secARIMA(2,1,2)(2,0,0)[12] intercept : AIC2954.236, Time0.49 secARIMA(2,1,2)(2,0,1)[12] intercept : AIC2958.264, Time0.49 secARIMA(1,1,2)(2,0,0)[12] intercept : AIC2964.588, Time0.38 secARIMA(2,1,1)(2,0,0)[12] intercept : AIC2950.034, Time0.53 secARIMA(2,1,1)(1,0,0)[12] intercept : AIC2950.338, Time0.24 secARIMA(2,1,1)(2,0,1)[12] intercept : AIC2953.291, Time0.45 secARIMA(2,1,1)(1,0,1)[12] intercept : AIC2951.569, Time0.21 secARIMA(1,1,1)(2,0,0)[12] intercept : AIC2958.953, Time0.32 secARIMA(2,1,0)(2,0,0)[12] intercept : AIC2966.286, Time0.35 secARIMA(3,1,1)(2,0,0)[12] intercept : AIC2951.433, Time0.50 secARIMA(1,1,0)(2,0,0)[12] intercept : AIC2993.310, Time0.39 secARIMA(3,1,0)(2,0,0)[12] intercept : AIC2952.990, Time0.47 secARIMA(3,1,2)(2,0,0)[12] intercept : AIC2953.842, Time0.58 secARIMA(2,1,1)(2,0,0)[12] : AIC2946.471, Time0.45 secARIMA(2,1,1)(1,0,0)[12] : AIC2947.171, Time0.17 secARIMA(2,1,1)(2,0,1)[12] : AIC2948.216, Time0.42 secARIMA(2,1,1)(1,0,1)[12] : AIC2946.151, Time0.29 secARIMA(2,1,1)(0,0,1)[12] : AIC2971.736, Time0.14 secARIMA(2,1,1)(1,0,2)[12] : AIC2948.085, Time0.50 secARIMA(2,1,1)(0,0,0)[12] : AIC3019.258, Time0.06 secARIMA(2,1,1)(0,0,2)[12] : AIC2959.185, Time0.36 secARIMA(2,1,1)(2,0,2)[12] : AIC2950.098, Time0.52 secARIMA(1,1,1)(1,0,1)[12] : AIC2953.184, Time0.14 secARIMA(2,1,0)(1,0,1)[12] : AIC2964.069, Time0.14 secARIMA(3,1,1)(1,0,1)[12] : AIC2949.076, Time0.16 secARIMA(2,1,2)(1,0,1)[12] : AIC2951.826, Time0.16 secARIMA(1,1,0)(1,0,1)[12] : AIC2991.086, Time0.09 secARIMA(1,1,2)(1,0,1)[12] : AIC2960.917, Time0.14 secARIMA(3,1,0)(1,0,1)[12] : AIC2950.719, Time0.13 secARIMA(3,1,2)(1,0,1)[12] : AIC2952.019, Time0.17 secBest model: ARIMA(2,1,1)(1,0,1)[12] Total fit time: 11.698 seconds #预测 preds arima.predict(n_periodstest.shape[0]) preds #按照测试集的日期进行预测 array([25809.09822027, 27111.50500611, 30145.84346715, 35069.09860267,19044.09098919, 22734.07766136, 24370.14476344, 24468.4989244 ,24661.71940304, 24465.6250753 , 29285.02123954, 25607.32326197,26131.79439226, 26937.20321329, 29632.82588046, 33904.51565498,20207.31393733, 23342.10936251, 24741.41755828, 24828.6385991 ,24993.22466868, 24825.14042152, 28939.23990247, 25799.92370898]) figplt.figure(figsize(16,5)) plt.plot(range(test.shape[0]),test) plt.plot(range(test.shape[0]),preds) plt.grid() 模型评估指标可共有sklearn的评估指标也可调用特定的时序指标AIC np.sqrt(mean_squared_error(test, preds)) 2550.8826581401277 arima.aic() 2946.1506587436375 arima.summary() 枚举式搜索合适的参数从效率角度来说远远超过statsmodel遗憾的是从上述代码不难看出pmdarima的代码思路是更最近机器学习而不是统计学的因此pmd.auto arima跑出的结果往往无法满足统计学上的各类检验要求因此泛化能力无法被保证。同时也很容易发现由于数据集分割的缘故autoarima选择出的最佳模型可能无法被复现例如我们使用autoarima选择出的最佳模型建立单模: modelpm.ARIMA(order(2,1,1),seasonal_order(1,0,1,12),max_iter500) model.fit(train)figplt.figure(figsize(16,5)) plt.plot(range(test.shape[0]),test) plt.plot(range(test.shape[0]),model.predict(n_periodstest.shape[0])) plt.grid() np.sqrt(mean_squared_error(test, model.predict(n_periodstest.shape[0]))) 3081.3401428137163 model.aic() 2936.648256262213既然pmdarima是基于statsmodel搭建也能够使用基于R语言的autoarima所有的功能pmdarima自然也能够支持相应的各类统计学检验以及相关系数计算更多的详情都可以参考pmdarima的官方说明文档。一般在使用pmdarima建模后还需要使用统计学中的一系列检验来选择模型、找出能够通过所有检验的模型。 2. 时间序列交叉验证 在时序模型的选择过程中可以借助交叉验证来帮助我们选择更好的模型。时间序列的交叉验证非常特殊因为时间序列数据必须遵守“过去预测未来”、“训练中时间顺序不能打乱等基本原则因此传统机器学习中的k折交叉验证无法使用。         在时间序列的世界中有以下两种常见的交叉验证方式滚动交叉验证(RollingForecastCV) 和滑窗交叉验证 (SlidingWindowForecastCV)当提到“时序交叉验证”时一般特指滚动交叉验证。下面具体来看一下两种交叉验证的操作 2.1 滚动交叉验证(RollingForecastCV) 滚动交叉验证是在验证过程中不断增加训练集、并让验证集越来越靠近未来的验证方式这一方式既能保证我们一定是在用“过去预测未来”同时也能够保证需要预测的未来和过去真实标签之间的是足够近的因为越靠近未来的数据对未来的影响越大。这一交叉验证方式很像“多步预测”但是该方式却不会存在多步预测中的“错误累计问题因为在训练过程中我们一直是在使用客观存在的真实标签。         在pmdarima中我们使用类 RollingForecastCV和 cross_validate 来实现交叉验证很明显pmdarima的思路借鉴了sklearn (事实上pmdarima在所有统计学相关内容上是借鉴并依赖于statsmodel进行运行在所有机器学习相关内容上是借鉴sklearn进行运行)。sklearn中的交叉验证 cv KFold(n_splits5,shuffleTrue,random_state1412) results cross_validate(reg,Xtrain,Ytrain,cvcv) 其中cv是交叉验证具体的模式cross_validate则负责执行交叉验证本身。在pmdarima运行交叉验证时类RollingForecastCV的地位等同于普通机器学习交叉验证中的 KFold 类。RollingForecastCv 也只能规定交叉验证的模式不负责执行交叉验证本身。特别的是普通K折交叉验证是由折数来控制的但时序交叉验证其实是以单个样本为单位的。一般来说时序交叉验证的验证集可以是多个时间点也可以为单个时间点。当验证集为1个时间点时滚动交叉验证如下所示: 在pmdarima当中使用RollingForecastCV来完成交叉验证 class pmdarima.model selection.RollingForecastCV(h1step1initialNone) h验证集中的样本数量可以输入[1,n_samples]的整数。 step训练集中每次增加的样本数量必须为大于等于1的正整数。 initial第一次交叉验证时的训练集样本量如果不填写则按1/3处理。 取h1,step1,initial10 data pm.datasets.load_wineind() cvmodel_selection.RollingForecastCV(h1,step1,initial10) cv_generatorcv.split(data) next(cv_generator)#根据initial初始训练集有10个样本验证集遵循参数h的设置只包含一个样本 (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), array([10])) next(cv_generator)#根据step的设置训练集每次增加1个样本验证集继续包含一个样本 (array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), array([11])) next(cv_generator) (array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), array([12])) 取h10,step5,initial10 cvmodel_selection.RollingForecastCV(h10,step5,initial10) cv_generatorcv.split(data) next(cv_generator) (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])) next(cv_generator) (array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]),array([15, 16, 17, 18, 19, 20, 21, 22, 23, 24])) next(cv_generator) (array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,17, 18, 19]),array([20, 21, 22, 23, 24, 25, 26, 27, 28, 29])) 不难发现在pmdarima中实现滚动交叉验证时验证集实际上是可以重复的因此滚动交叉验证可以在有限的数据上进行多轮验证集重合的交叉验证只要满足“过去预测未来”的基本条例时序交叉验证其实可以相对自由的进行(即验证集与验证集之间不是互斥的)。也因此时序交叉验证的实际运行时间往往会很长当数据量巨大时交叉验证的负担也会更大。 # 沿用上面的数据和模型 modelpm.ARIMA(order(2,1,1),seasonal_order(1,0,1,12),max_iter500) cvmodel_selection.RollingForecastCV(h24,step12,initial36) predictionsmodel_selection.cross_validate(model,data,cvcv,scoringmean_squared_error,verbose2,error_scoreraise) [CV] fold0 .......................................................... [CV] fold1 .......................................................... [CV] fold2 .......................................................... [CV] fold3 .......................................................... [CV] fold4 .......................................................... [CV] fold5 .......................................................... [CV] fold6 .......................................................... [CV] fold7 .......................................................... [CV] fold8 .......................................................... [CV] fold9 .......................................................... predictions {test_score: array([1.35362847e08, 1.08110482e08, 2.18376249e07, 1.97805181e07,6.16138893e07, 1.42418110e07, 1.32432958e07, 1.31182597e07,3.57071218e07, 5.79654872e06]),fit_time: array([0.2784729 , 0.12543654, 0.62335014, 0.64258695, 0.75659704,0.73791075, 0.82430649, 0.92007995, 0.98767185, 1.03166628]),score_time: array([0.01047397, 0. , 0.00223732, 0. , 0. ,0. , 0.01564431, 0. , 0.01562428, 0.01562572])} np.sqrt(predictions[test_score]) array([11634.55400113, 10397.61906654, 4673.07446159, 4447.52944078,7849.45153132, 3773.83240719, 3639.13393689, 3621.91381986,5975.54363899, 2407.60227639]) 可以看到交叉验证的测试集中得到的RMSE大部分都大于之前自动化建模时得到的RMSE(2550)并且训练数据越少时测试集上的RMSE会越大这可能说明在前几折交叉验证时训练集的数据量太少因此可以考虑增大initial当中的设置来避免这个问题。 2.2 滑窗交叉验证(SildingWindowForecastCV) 滑窗交叉验证是借助滑窗技巧完成的交叉验证。滑窗是时间序列中常见的技巧具体操作如下: Sliding window———— 在时间序列预测时常常使用窗内的样本作为训练样本、窗右侧(或下方)的第一个样本做为被预测的样本。滑窗技巧在时间序列的各个领域都应用广泛是时间序列的基础之一。很显然滑窗交叉验证就是使用窗内的样本作为训练集窗右侧(或下方)的样本作为验证集而进行的交叉验证。 与滚动交叉验证一样滑窗交叉验证中的验证集也可以是单一样本也可以是一系列数据集。相比起滚动交叉验证滑窗交叉验证的优势在于训练集不会越来越大、每次训练时都使用了理论上对当前验证集来说最有效的信息。但同时这个优势也会带来问题由于训练集往往较小因此滑窗交叉验证需要进行的建模次数异常地多这可能导致交叉验证模型变得非常缓慢。 在pmdarima当中使用 SlidingWindowForecastCV 来完成滑窗交叉验证class pmdarima.model_selection.SlidingWindowForecastCV(h1,step1,window sizeNone) h验证集中的样本数量可以输入[1,n_samples]的整数 step每次向未来滑窗的样本数量必须为大于等于1的正整数 window_size滑窗的尺寸大小如果填写None则按照样本量整除5得到的数来决定 取h1,step1,window_size10 cvmodel_selection.SlidingWindowForecastCV(h1,step1,window_size10) cv_generatorcv.split(data) next(cv_generator)#首次进行交叉验证时的数据分割情况 (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), array([10])) next(cv_generator)#第二次交叉验证时的数据分割情况 (array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), array([11])) 取h10,step5,window_size10 cvmodel_selection.SlidingWindowForecastCV(h10,step5,window_size10) cv_generatorcv.split(data) next(cv_generator) (array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19])) next(cv_generator) (array([ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]),array([15, 16, 17, 18, 19, 20, 21, 22, 23, 24])) # 沿用上面的数据和模型 modelpm.ARIMA(order(2,1,1),seasonal_order(1,0,1,12),max_iter500) cvmodel_selection.SlidingWindowForecastCV(h24,step12,window_size36) predictionsmodel_selection.cross_validate(model,data,cvcv,scoringmean_squared_error,verbose2,error_scoreraise) [CV] fold0 .......................................................... [CV] fold1 .......................................................... [CV] fold2 .......................................................... [CV] fold3 .......................................................... [CV] fold4 .......................................................... [CV] fold5 .......................................................... [CV] fold6 .......................................................... [CV] fold7 .......................................................... [CV] fold8 .......................................................... [CV] fold9 .......................................................... predictions {test_score: array([1.35362847e08, 1.20867167e08, 1.48347243e08, 2.49879706e08,2.32217899e08, 4.01511152e08, 1.92061264e08, 2.51755311e08,1.50798724e08, 1.92747682e08]),fit_time: array([0.28506732, 0.16709971, 0.17653751, 0.12498903, 0.1408143 ,0.16088152, 0.22708297, 0.33786058, 0.1593399 , 0.27807832]),score_time: array([0.00801778, 0. , 0.01562667, 0. , 0.01132369,0. , 0.01562595, 0. , 0.01562929, 0. ])} np.sqrt(predictions[test_score]) array([11634.55400113, 10993.96047191, 12179.78831408, 15807.58382521,15238.69740534, 20037.7431982 , 13858.61697326, 15866.79900091,12280.01317219, 13883.35991075]) 从结果来看使用更少的训练集进行训练后模型输出的RMSE大幅上升了并且也没有变得更稳定这说明当前模型下更大的训练集会更有利于模型的训练(不是每个时间序列都是这样)。尝试调整滑窗的window_size就会发现RMSE下降到了与滚动交叉验证时相似的水平: modelpm.ARIMA(order(2,1,1),seasonal_order(1,0,1,12),max_iter500) cvmodel_selection.SlidingWindowForecastCV(h24,step1,window_size132) predictionsmodel_selection.cross_validate(model,data,cvcv,scoringmean_squared_error,verbose2,error_scoreraise) [CV] fold0 .......................................................... [CV] fold1 .......................................................... [CV] fold2 .......................................................... [CV] fold3 .......................................................... [CV] fold4 .......................................................... [CV] fold5 .......................................................... [CV] fold6 .......................................................... [CV] fold7 .......................................................... [CV] fold8 .......................................................... [CV] fold9 .......................................................... [CV] fold10 ......................................................... [CV] fold11 ......................................................... [CV] fold12 ......................................................... [CV] fold13 ......................................................... [CV] fold14 ......................................................... [CV] fold15 ......................................................... [CV] fold16 ......................................................... [CV] fold17 ......................................................... [CV] fold18 ......................................................... [CV] fold19 ......................................................... [CV] fold20 ......................................................... predictions {test_score: array([35707121.78143389, 66176325.69903485, 40630659.97659013,78576782.28645307, 23666490.55159284, 20310751.60353827,2841898.1720445 , 4484619.0619739 , 18925627.1367884 ,3231920.46993413, 55955063.23334328, 5769421.1274077 ,12204785.2577201 , 81763866.37114508, 86166090.62031393,4308494.01384212, 4472068.45984436, 80544390.23157245,95444224.35956413, 4356301.4101477 , 41312817.67528097]),fit_time: array([0.98685646, 1.00776458, 0.98309445, 0.98523855, 0.99820113,0.88483882, 1.14556432, 0.94388413, 0.95140123, 1.01311779,1.01590633, 1.06021142, 1.05152464, 1.06878543, 1.08534598,1.07379961, 0.96942186, 0.92225981, 0.95834565, 1.33569884,0.91161823]),score_time: array([0.01562262, 0.01562762, 0. , 0.00460625, 0. ,0.00678897, 0.00810504, 0.01536226, 0.01825047, 0.00629425,0.00742435, 0.01564217, 0. , 0. , 0. ,0. , 0.00800204, 0.01618385, 0. , 0.01562595,0. ])} np.sqrt(predictions[test_score]) array([5975.54363899, 8134.88326278, 6374.21838162, 8864.35458939,4864.82173893, 4506.74512298, 1685.79303951, 2117.69191857,4350.35942616, 1797.75428519, 7480.31170696, 2401.96193296,3493.53477981, 9042.33743958, 9282.56918209, 2075.69121351,2114.72656858, 8974.65265242, 9769.55599603, 2087.17546223,6427.50477832]) 此时RMSE的均值大幅下降了但是模型还是不稳定波动较大这说明当前时间序列各时间段上的差异较大,当前模型的拟合结果一般。虽然通过增加训练集的数据量可以让模型表现提升但极其不稳定的结果展示当前模型的泛化能力是缺失的。和使用AIC时一样我们只能选择表现更好的时序模型(只能择优)而无法选择完美的时序模型。当我们将auto_arima选出的最佳参数放弃、而选择带有其他参数的模型说不定得到的结果会更加不稳定。 你是否注意到一个细节?时序交叉验证不会返回训练集上的分数同时pmdarima的预测功能predict中也不接受对过去进行预测。通常来说我们判断过拟合的标准是训练集上的结果远远好于测试集但时序交叉验证却不返回训练集分数因此时间序列数据无法通过对比训练集和测试集结果来判断是否过拟合。但在时间序列的世界中依然存在着”过拟合”这个概念我们可以通过交叉验证的结果来判断不同参数下的时间序列模型哪个过拟合程度更轻。         通常来说验证集上的分数最佳的模型过拟合风险往往最小因为当一个模型学习能够足够强、且既不过拟合又不欠拟合的时候模型的训练集和验证集分数应该是高度接近的所以验证集分数越好验证集的分数就越可能更接近训练集上的分数。因此在多个模型对比的情况下我们可以只通过观察测试集上的分数来选定最佳模型。这个最佳模型即是表现最佳的模型也是过拟合风险最小的模型(不是绝对)。
http://www.huolong8.cn/news/28147/

相关文章:

  • wordpress托管建站网站服务器做缓存
  • 本溪化工建设质量监督站网站长春网页制作公司
  • 创新的企业网站建设上海网络整合推广
  • dz做分类网站河北沧州泊头做网站的电话
  • 网站运营专员四川省的建设厅注册中心网站首页
  • 珠海横琴天聚建设工程有限公司网站自建国际网站做电商
  • 百度搜索到自己的网站有自己网站好处
  • 网站做百度排名wordpress过去指定分类文章
  • 优秀设计师的个人网站哪些网站做问卷可以赚钱
  • 淄博汽车网站建设织梦网站建设流程
  • 西宁房地产网站建设嘉兴网红桥
  • 盐城网站建设培训用flask做的网站
  • 最快网站备案上海专业网站营销
  • html成品网站网站首页动画代码
  • 网上购物商城系统论文上海排名优化seo
  • 做设计兼职网站招代理商的网站
  • 网站怎么做备案建网站自己做服务器
  • 网站成品下载梧州吧
  • 贵阳网站空间企业微信公众号开发
  • 手机网站弹窗酒泉网站建设费用
  • 自学网站建设最快要多久手机做网页的软件有哪些
  • 微信菜单怎么做微网站西安做网站选哪家好
  • 最好用的crm大连seo整站优化
  • 深圳宝安做网站的ps怎么做电商网站
  • 欧美风网站建设wap端是电脑还是手机
  • 广告网站推荐外贸网站建设可以吗
  • 网站建设基础包括网站上广告
  • 网站功能型和展示型的区别做网站鼎盛
  • 青海 住房和建设厅网站分享网站友情链接
  • 百度回收网站搭建杭州网络整合营销公司