как решить LinAlgError & ValueError при обучении модели аримы с помощью Python - PullRequest
1 голос
/ 11 марта 2019

Я пытаюсь реализовать модель временного ряда и получаю странные исключения, которые мне ничего не говорят.Интересно, делаю ли я ошибку или она полностью ожидаема?Вот подробности ...

При обучении моей модели я пытаюсь выполнить поиск по сетке, чтобы найти лучшие (p, d, q) настройки.Вот полный код (и ниже я объясню, что здесь происходит):

Воспроизводимый код *1005*, приведенный ниже, по сути является копией https://machinelearningmastery.com/grid-search-arima-hyperparameters-with-python/, с некоторыми небольшими изменениями...:

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)

А вот вывод (не все, но он дает достаточно информации):

Evaluating the settings:  7 0 0
Exception occured... LinAlgError 
 SVD did not converge
Evaluating the settings:  7 0 1
Exception occured... LinAlgError 
 SVD did not converge
Evaluating the settings:  7 0 2
Exception occured... ValueError 
 The computed initial AR coefficients are not stationary
You should induce stationarity, choose a different model order, or you can
pass your own start_params.
Evaluating the settings:  7 1 0
Exception occured... LinAlgError 
 SVD did not converge
Evaluating the settings:  7 1 1
Exception occured... ValueError 
 The computed initial AR coefficients are not stationary
You should induce stationarity, choose a different model order, or you can
pass your own start_params.
Evaluating the settings:  7 1 2
Exception occured... ValueError 
 The computed initial AR coefficients are not stationary
You should induce stationarity, choose a different model order, or you can
pass your own start_params.
Evaluating the settings:  7 2 0
Exception occured... LinAlgError 
 SVD did not converge
Evaluating the settings:  7 2 1
Exception occured... ValueError 
 The computed initial AR coefficients are not stationary
You should induce stationarity, choose a different model order, or you can
pass your own start_params.
Evaluating the settings:  7 2 2
Exception occured... ValueError 
 The computed initial AR coefficients are not stationary
You should induce stationarity, choose a different model order, or you can
pass your own start_params.

Код просто пробует все различные заданные настройки, обучая модель,вычисление MSE (среднеквадратичная ошибка) для каждого заданного параметра, а затем выбор наилучшего (на основе минимального MSE).

Но во время процедуры обучения код продолжает генерировать исключения LinAlgError и ValueError,что мне ничего не говорит.

И, насколько я могу понять, код на самом деле не обучает определенным настройкам, когда выбрасываются эти исключения, а затем просто переходит к следующей настройке, которая будет опробована.

Почему я вижу эти исключения?Можно ли их игнорировать?Что мне нужно сделать, чтобы решить это?

1 Ответ

2 голосов
/ 14 марта 2019

Во-первых, чтобы ответить на ваш конкретный вопрос: я думаю, что «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) и когда вы также добавляете компоненты скользящего среднего. Я предлагаю вам пересмотреть, какие модели вы рассматриваете.

...