Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决线性误差&;使用Python训练arima模型时出现ValueError_Python_Time Series_Statsmodels_Arima - Fatal编程技术网

如何解决线性误差&;使用Python训练arima模型时出现ValueError

如何解决线性误差&;使用Python训练arima模型时出现ValueError,python,time-series,statsmodels,arima,Python,Time Series,Statsmodels,Arima,我试图实现一个时间序列模型,但得到一些奇怪的异常,这些异常对我来说毫无意义。我不知道我是否犯了错误,或者这完全是意料之中的。下面是一些细节 在训练我的模型时,我尝试进行网格搜索以找到最佳(p、d、q)设置。下面是完整的代码(我将在下面解释发生了什么): 下面的可复制的代码本质上是……的副本,有一些细微的变化: import warnings from pandas import Series from statsmodels.tsa.arima_model import ARIMA from s

我试图实现一个时间序列模型,但得到一些奇怪的异常,这些异常对我来说毫无意义。我不知道我是否犯了错误,或者这完全是意料之中的。下面是一些细节

在训练我的模型时,我尝试进行网格搜索以找到最佳(p、d、q)设置。下面是完整的代码(我将在下面解释发生了什么):

下面的可复制的代码本质上是……的副本,有一些细微的变化:

import warnings
from pandas import Series
from statsmodels.tsa.arima_model import ARIMA
from sklearn.metrics import mean_squared_error

# evaluate an ARIMA model for a given order (p,d,q)
def evaluate_arima_model(X, arima_order):
    # prepare training dataset
    train_size = int(len(X) * 0.66)
    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)
        yhat = model_fit.forecast()[0]
        predictions.append(yhat)
        history.append(test[t])
    # calculate out of sample error
    error = mean_squared_error(test, predictions)
    return error

# 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('float64')
    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:
                    print("Evaluating the settings: ", p, d, q)
                    mse = evaluate_arima_model(dataset, order)
                    if mse < best_score:
                        best_score, best_cfg = mse, order
                    print('ARIMA%s MSE=%.3f' % (order,mse))
                except Exception as exception:
                    print("Exception occured...", type(exception).__name__, "\n", exception)

    print('Best ARIMA%s MSE=%.3f' % (best_cfg, best_score))

# dataset
values = np.array([-1.45, -9.04, -3.64, -10.37, -1.36, -6.83, -6.01, -3.84, -9.92, -5.21,
                   -8.97, -6.19, -4.12, -11.03, -2.27, -4.07, -5.08, -4.57, -7.87, -2.80,
                   -4.29, -4.19, -3.76, -22.54, -5.87, -6.39, -4.19, -2.63, -8.70, -3.52, 
                   -5.76, -1.41, -6.94, -12.95, -8.64, -7.21, -4.05, -3.01])

# evaluate parameters
p_values = [7, 8, 9, 10]
d_values = range(0, 3)
q_values = range(0, 3)
warnings.filterwarnings("ignore")
evaluate_models(values, p_values, d_values, q_values)
代码只是尝试所有不同的给定设置,训练模型,计算每个给定设置的MSE(均方误差),然后选择最佳设置(基于最小MSE)

但是在培训过程中,代码不断抛出
linalgeror
ValueError
异常,这对我来说毫无意义

据我所知,当抛出这些异常时,代码并没有真正训练某些设置,然后跳转到下一个将要尝试的设置

为什么我会看到这些例外? 可以忽略它们吗?
我需要做些什么来解决这个问题?

首先,回答你的具体问题:我认为“SVD没有收敛”是Statsmodels的ARIMA模型中的一个缺陷。SARIMAX模型现在得到了更好的支持(并且做了ARIMA模型所做的一切+更多),因此我建议改用它。为此,请将模型创建替换为:

model = sm.tsa.SARIMAX(history, trend='c', order=arima_order, enforce_stationarity=False, enforce_invertibility=False)
尽管如此,我认为考虑到您的时间序列和您正在尝试的规范,您仍然不可能获得好的结果


特别是,您的时间序列非常短,您只考虑非常长的自回归滞后长度(p>6)。很难用如此少的数据点来估计许多参数,特别是当你也有积分(d=1或d=2)时,以及当你也加入移动平均成分时。我建议您重新评估您正在考虑的车型。

谢谢您的回答。在我接受答案之前,现在研究一下。ARIMA模型的预测函数甚至返回置信区间,为了简单起见,我在上面没有提到。使用SARIMAX进行预测时,如何计算置信区间?另外,通过改变可能的p,d,q值,我仍然可以进行网格搜索,对吗?(这些统计模型并非我的专长。)是的,您可以使用
fcast\u res=res.get\u forecast()
然后是
ci=fcast\u res.conf\u int()
,从结果对象获取置信区间,而实际预测是
fcast=fcast\u res.predicted\u mean
。是的,您仍然可以进行网格搜索。SARIMAX是一个简单的ARIMA模型,如果您愿意,还可以选择添加(S)季节项和e(X)生成回归。谢谢!最后一个问题。。我的数据集有大量数据。(例如:-6.1e+10)在培训期间,我偶尔会看到´“ValueError输入包含NaN、无穷大或一个对于dtype('float64')来说太大的值”。我可以使用sklearn.preprocessing.StandardScaler规范化数据集。使用“fit”和“transform”函数,可以进行规范化。但随后计算的置信区间将基于标准化数据集(太小的数字)。要对数据集(甚至预测)进行反规范化,我可以调用逆变换函数,但如何解决conf.interv的相同问题?不幸的是,没有一种简单的方法来转换置信区间。您可以选择许多方向,但没有一个是内置的(例如,一种称为delta方法或模拟的近似技术)。有关其中一些问题的讨论,请参见示例。
model = sm.tsa.SARIMAX(history, trend='c', order=arima_order, enforce_stationarity=False, enforce_invertibility=False)