Python statsmodels ARIMA LinalError:SVD没有收敛

Python statsmodels ARIMA LinalError:SVD没有收敛,python,statsmodels,Python,Statsmodels,背景:我正在开发一个使用statsmodels的程序,该程序将27个arima模型(p,d,q=0,1,2)与100多个变量相匹配,并选择aic最低、AR/MA系数具有统计显著性t统计量、dickey fuller检验具有统计显著性p值的模型 对于一个特定的变量和一组特定的参数,我得到 LinAlgError: SVD did not converge 对于复制,变量和失败的代码如下所示 rollrate =[0.3469842191781748, 0.955068915757202

背景:我正在开发一个使用statsmodels的程序,该程序将27个arima模型(p,d,q=0,1,2)与100多个变量相匹配,并选择aic最低、AR/MA系数具有统计显著性t统计量、dickey fuller检验具有统计显著性p值的模型

对于一个特定的变量和一组特定的参数,我得到

LinAlgError: SVD did not converge    
对于复制,变量和失败的代码如下所示

rollrate =[0.3469842191781748,
 0.9550689157572028,
 0.48170862494888256,
 0.15277985674197356,
 0.46102487817508747,
 0.32777706854320243,
 0.5163787896482797,
 0.01707716528127215,
 0.015036662424309755,
 0.2299825242910243,
 0.03719773802216722,
 0.24392098372995807,
 0.1783587055969874,
 0.6759904243574179,
 0.1197617555878022,
 0.04274682226635633,
 0.27369984820298465,
 0.18999355015483932,
 0.2985208240580264,
 0.2872064881442138,
 1.0522764728046277,
 0.3694114556631419,
 0.09613536093441034,
 0.6648215681632191,
 0.3223120091564835,
 0.9274048223872483,
 0.2763221143255601,
 0.4501460109958479,
 0.2220472247972312,
 0.3644512582291407,
 0.7790042237519584,
 0.3749145302678043,
 1.2771681290160286,
 0.6760112486224217,
 0.5214358465170098,
 0.84041997296269,
 0.12054593136059581,
 0.18900376737686622,
 0.042561102427304424,
 0.17189805124670604,
 0.11383752243305952,
 0.2687780002387387,
 0.717538770963329,
 0.26636160206108384,
 0.04221743047344771,
 0.3259506533106764,
 0.20146525340606328,
 0.4059344185647537,
 0.07503287726465639,
 0.3011594076817088,
 0.1433563136989911,
 0.14803562944375281,
 0.23096999679467808,
 0.31133672787599703,
 0.2313639154827471,
 0.30343086620083537,
 0.4608439884577555,
 0.19149827372467804,
 0.2506814947310181,
 1.008458195025946,
 0.3776434264127751,
 0.344728062930179,
 0.2110402015365776,
 0.26582041849423843,
 1.1019000121595244,
 0.0,
 0.023068095385979804,
 0.014256779894199491,
 0.3209225608633755,
 0.00294468492742426,
 0.0,
 0.3346732726544143,
 0.38256681208088283,
 0.4916019617068597,
 0.06922156984602362,
 0.34458053250016984,
 0.0,
 0.09615667784109984,
 1.8271531669931351,
 0,
 0,
 0.0,
 0,
 0.0,
 0.03205594450156685,
 0.0,
 0.0,
 0.0,
 0,
 0.0,
 0,
 0.0,
 0,
 0,
 1.0,
 0]


p=2
q=2
d=0
fit = statsmodels.api.tsa.ARIMA(rollRate, (p,d,q)).fit(transparams=False)   

我理解,对于该特定变量,特定参数p=2、d=2、q=0可能是一个糟糕的ARIMA模型,并且由于存在许多零或非平稳性质,该变量本身可能不是ARIMA模型的合适候选变量,但我需要一种可能绕过此错误或修复此问题的方法,以保持程序在参数中迭代。感谢

< P>也许考虑尝试这种方式,因为这是我从Jason Brownlee(PHD)、机器学习掌握< /P>学到的方法的组合。

还有数学家法哈德·马利克

通过结合他们的方法和技术,我能够提出一个我认为是接近工作和可靠的模型

以下是我花了几个小时痛苦拼凑的代码:

import warnings
import pandas as pd
from statsmodels.tsa.arima_model import ARIMA
from sklearn.metrics import mean_squared_error
from math import sqrt
from matplotlib import pyplot

rollRate=[0.3469842191781748,0.9550689157572028,0.48170862494888256,0.15277985674197356,0.46102487817508747,0.32777706854320243,
0.5163787896482797,0.01707716528127215,0.015036662424309755,0.2299825242910243,0.03719773802216722,0.24392098372995807,
0.1783587055969874,0.6759904243574179,0.1197617555878022,
0.04274682226635633,0.27369984820298465,0.18999355015483932,0.2985208240580264,0.2872064881442138,1.0522764728046277,
0.3694114556631419,0.09613536093441034,0.6648215681632191,0.3223120091564835,0.9274048223872483,0.2763221143255601,
0.4501460109958479,0.2220472247972312,0.3644512582291407,0.7790042237519584,0.3749145302678043,
1.2771681290160286,0.6760112486224217,0.5214358465170098,0.84041997296269,0.12054593136059581,
0.18900376737686622,0.042561102427304424,0.17189805124670604,0.11383752243305952,0.2687780002387387,
0.717538770963329,0.26636160206108384,0.04221743047344771,0.3259506533106764,0.20146525340606328,0.4059344185647537,
0.07503287726465639,0.3011594076817088,0.1433563136989911,0.14803562944375281,0.23096999679467808,
0.31133672787599703,0.2313639154827471,0.30343086620083537,0.4608439884577555,0.19149827372467804,
0.2506814947310181,1.008458195025946,0.3776434264127751,0.344728062930179,0.2110402015365776,0.26582041849423843,
1.1019000121595244,0.0,0.023068095385979804,0.014256779894199491,0.3209225608633755,0.00294468492742426,0.0,
0.3346732726544143,0.38256681208088283,0.4916019617068597,0.06922156984602362,0.34458053250016984,0.0,
0.09615667784109984,1.8271531669931351,0,0,0.0,0,0.0,0.03205594450156685,0.0,0.0,0.0,0,0.0,0,0.0,0,0,1.0,0]

# Evaluate an ARIMA model for a given order (p,d,q) and return RMSE
def evaluate_arima_model(X, arima_order):
    # prepare training dataset
    X = X.astype('float32')
    train_size = int(len(X) * 0.50)
    train, test = X[0:train_size], X[train_size:]
    history = [x for x in train]
    # make predictions
    predictions = list()
    for t in range(len(test)):
        model = ARIMA(history, order=arima_order)
        # model_fit = model.fit(disp=0)
        model_fit = model.fit(trend='nc', disp=0)
        yhat = model_fit.forecast()[0]
        predictions.append(yhat)
        history.append(test[t])
    # calculate out of sample error
    rmse = sqrt(mean_squared_error(test, predictions))
    return rmse

# evaluate combinations of p, d and q values for an ARIMA model
def evaluate_models(dataset, p_values, d_values, q_values):
    dataset = dataset.astype('float32')
    best_score, best_cfg = float("inf"), None
    for p in p_values:
        for d in d_values:
            for q in q_values:
                order = (p, d, q)
                try:
                    rmse = evaluate_arima_model(dataset, order)
                    print(rmse)
                    if rmse < best_score:
                        best_score, best_cfg = rmse, order
                    print('ARIMA%s RMSE=%.3f' % (order, rmse))
                except:
                    continue
    print('Best ARIMA%s RMSE=%.3f' % (best_cfg, best_score))

p_values = range(0, 2)
d_values = range(0, 1)
q_values = range(0, 2)
warnings.filterwarnings("ignore")

dataset = pd.Series([356,386,397,397,413,458,485,344,390,360,420,435,439,454,462,454,469,500,492,473,458,469,481,
          488,466,462,473,530,662,651,587,515,526,503,503,503,515,522,492,503,503,450,432,432,458,462,
          503,488,466,492,503,515,500,522,575,583,587,628,640,609,606,632,617,613,598,575,564,549,538,
          568,575,579,587,602,594,587,587,625,613])

dataset = dataset.values
print('\n==============================\n')
evaluate_models(dataset, p_values, d_values, q_values)

pp = 2
dd = 1
qq = 2

def StartProducingARIMAForecastValues(dataVals, p, d, q):
    model = ARIMA(dataVals, order=(p, d, q))
    model_fit = model.fit(disp=0)
    pred = model_fit.forecast()[0]
    return pred

print('\n==============================\n')

predictions = StartProducingARIMAForecastValues(rollRate, 1, 1, 0)
print('First Prediction=%f' % (predictions))

Actual = [x for x in rollRate]
Predictions = list()

for timestamp in range(len(rollRate)):
    ActualValue = rollRate[timestamp]
    Prediction = StartProducingARIMAForecastValues(Actual, 3, 1, 0)
    print('Actual=%f, Predicted=%f' % (ActualValue, Prediction))

    Predictions.append(Prediction)
    Actual.append(ActualValue)

Error = mean_squared_error(rollRate, Predictions)

print('Test Mean Squared Error : %.3f' % Error)
# plot
pyplot.plot(rollRate)
pyplot.plot(Predictions, color='red')
pyplot.show()

导入警告
作为pd进口熊猫
从statsmodels.tsa.arima_模型导入arima
从sklearn.metrics导入均方误差
从数学导入sqrt
从matplotlib导入pyplot
rollRate=[0.3469842191781748,0.95506891572028,0.48170862494888256,0.15277985674197356,0.46102487817508747,0.32777706854243,
0.5163787896482797,0.01707716528127215,0.015036662424309755,0.2299825242910243,0.03719773802216722,0.24392098372995807,
0.1783587055969874,0.6759904243574179,0.1197617555878022,
0.04274682226635633,0.27369984820298465,0.18999355015483932,0.2985208240580264,0.2872064881442138,1.0522764728046277,
0.3694114556631419,0.09613536093441034,0.6648215681632191,0.3223120091564835,0.9274048223872483,0.2763221143255601,
0.4501460109958479,0.2220472247972312,0.3644512582291407,0.7790042237519584,0.3749145302678043,
1.2771681290160286,0.6760112486224217,0.5214358465170098,0.84041997296269,0.12054593136059581,
0.18900376737686622,0.042561102427304424,0.17189805124670604,0.11383752243305952,0.2687780002387387,
0.717538770963329,0.26636160206108384,0.04221743047344771,0.3259506533106764,0.20146525340606328,0.4059344185647537,
0.07503287726465639,0.3011594076817088,0.1433563136989911,0.14803562944375281,0.23096999679467808,
0.31133672787599703,0.2313639154827471,0.30343086620083537,0.4608439884577555,0.19149827372467804,
0.2506814947310181,1.008458195025946,0.3776434264127751,0.344728062930179,0.2110402015365776,0.26582041849423843,
1.1019000121595244,0.0,0.023068095385979804,0.014256779894199491,0.3209225608633755,0.00294468492742426,0.0,
0.3346732726544143,0.38256681208088283,0.4916019617068597,0.06922156984602362,0.34458053250016984,0.0,
0.09615667784109984,1.8271531669931351,0,0,0.0,0,0.0,0.03205594450156685,0.0,0.0,0.0,0,0.0,0,0.0,0,0,1.0,0]
#评估给定订单(p、d、q)的ARIMA模型并返回RMSE
def评估arima模型(X,arima顺序):
#准备培训数据集
X=X.astype('float32')
列车尺寸=整数(长度(X)*0.50)
列车,测试=X[0:列车尺寸],X[列车尺寸:]
历史=[x代表列车中的x]
#预测
预测=列表()
对于范围内的t(len(测试)):
模型=ARIMA(历史,顺序=ARIMA_顺序)
#模型拟合=模型拟合(disp=0)
模型拟合=模型拟合(趋势=nc',显示=0)
yhat=model_fit.forecast()[0]
预测。追加(yhat)
history.append(测试[t])
#计算样本外误差
rmse=sqrt(均方误差(测试、预测))
返回rmse
#评估ARIMA模型的p、d和q值组合
def评估_模型(数据集、p_值、d_值、q_值):
dataset=dataset.astype('float32')
最佳分数,最佳cfg=浮动(“inf”),无
对于p_值中的p:
对于d in d_值:
对于q_值中的q:
顺序=(p,d,q)
尝试:
rmse=评估arima模型(数据集,顺序)
打印(rmse)
如果rmse<最佳分数:
最佳分数,最佳cfg=rmse,顺序
打印('ARIMA%s RMSE=%.3f'(订单,RMSE))
除:
持续
打印('Best ARIMA%s RMSE=%.3f%'(Best\u cfg,Best\u分数))
p_值=范围(0,2)
d_值=范围(0,1)
q_值=范围(0,2)
警告。过滤器警告(“忽略”)
数据集=pd.系列([356386397397413458485344390304204354462454469500492473458469481,
488,466,462,473,530,662,651,587,515,526,503,503,503,515,522,492,503,503,450,432,432,458,462,
503,488,466,492,503,515,500,522,575,583,587,628,640,609,606,632,617,613,598,575,564,549,538,
568,575,579,587,602,594,587,587,625,613])
dataset=dataset.values
打印('\n==============================================\n')
评估_模型(数据集、p_值、d_值、q_值)
pp=2
dd=1
qq=2
def STARTPRODUCTINGARIMAFORECASTVALUES(数据值、p、d、q):
模型=ARIMA(数据量,顺序=(p,d,q))
模型拟合=模型拟合(disp=0)
pred=model_fit.forecast()[0]
返回pred
打印('\n==============================================\n')
预测=开始生成RimaForecast值(滚动率,1,1,0)
打印('第一个预测=%f'(预测))
实际值=[x代表rollRate中的x]
预测=列表()
对于范围内的时间戳(len(rollRate)):
ActualValue=rollRate[时间戳]
预测=开始生成预测值(实际值,3,1,0)
打印('实际=%f,预测=%f'(实际值,预测))
预测。追加(预测)
实际值。追加(实际值)
误差=均方误差(滚动率、预测)
打印('测试均方误差:%.3f'%Error)
#密谋
pyplot.plot(rollRate)
plot.plot(预测,颜色为红色)
pyplot.show()
和输出