Метод поиска по векторизованной сетке для гиперпараметров ARIMA (p, d, q) в python - PullRequest
0 голосов
/ 28 марта 2020

В настоящее время я использую модель ARIMA для прогнозирования стоимости мобильных телефонов на будущее с помощью функции прогноза. Для лучших параметров p, d, q, используя mse, я использую метод поиска по сетке.

Но у меня есть большой набор данных, и, следовательно, мой код ищет лучший параметр p, d, q для каждой модели. , Поскольку он ищет каждую модель одну за другой, для получения наилучших параметров p, d, q требуется около 12 часов.

При изучении глубокого обучения я обнаружил, что векторизация упрощает поиск в сетке. Поможет ли это в моей проблеме для повышения производительности?

Вот мой текущий код:

class Regressor():

    def __init__(self):
        super().__init__()


    def evaluate_ARIMA(self,data,arima_order):
        data.price= data.price.values.astype('float32')
        model = ARIMA(data.price.values,order=arima_order).fit(disp=0)
        y_pred = model.predict()
        mse = mean_squared_error(model.fittedvalues, y_pred)
        y_forecast = model.forecast(steps=10)[0].tolist()
        return mse,y_forecast

    def evaluate_pdq(self,i,df):
        best_score, best_cfg, bins, upper = 0.05, None, None,[]
        data = df[df['model_no'] == i]
        bin_no = i
        # evaluate p,d,q parameters for ARIMA model
        for p,q,d in itertools.product([2,3],[0,1,2],[1,2,3]):
            arima_order=(p,q,d)
            try:
                mse,y_forecast = self.evaluate_ARIMA(data, arima_order)
                if mse < best_score:
                    best_score, best_cfg, upper = mse, arima_order, y_forecast
                    break        
            except:
                models= [data['model_no'].unique()]
                models= models.append(bins)
                continue
        values = [(model_no,best_cfg,upper)]
        return values

Для запуска вышеуказанного кода я использую многопроцессорность, как показано ниже:

def pdq_mp(self,df,re):
    model_list = df['model_no'].unique()
    executor = Parallel(n_jobs=cpu_count(), backend= 'multiprocessing')
    tasks = (delayed(re.evaluate_pdq)(i,df) for i in model_list)
    results = executor(tasks)
    values = list(list(zip(*results))[0])
    return values

Также здесь я использую два цикла for, и по этой причине этот код выполняется более 12 часов.

Пожалуйста, предложите мне, как векторизовать приведенный выше код, чтобы я мог получить лучшее p, Параметры d, q за несколько минут.

...