Авторы: Шрути Джадон, Аджит Патанкар, Аман Гаурав, Дивьянк Гарг, Мэн Сун

Введение:

Данные временных рядов носят последовательный характер, и для их анализа используются такие данные. Нам нужны модели машинного обучения, которые могут изучать функции последовательности и могут включать концепции прошлого и будущего. Следовательно, общие модели, такие как линейная регрессия, регрессия опорных векторов или простые многослойные нейронные сети с высокой плотностью, не будут работать с данными временных рядов, поскольку они предполагают, что данные не зависят друг от друга.

Как часть команды AI / ML, мы потратили почти год на изучение и изучение наиболее подходящих подходов к моделированию данных временных рядов, начиная от статистических моделей, моделей глубокого обучения и вероятностных моделей. В настоящее время мы поддерживаем восемь таких моделей как часть библиотеки ts_forecasting:

а. Статистические модели: экспоненциально-взвешенное среднее (базовый уровень), ARIMA

б. Модели глубокого обучения: RNN, LSTM (и варианты) и GRU

в. Вероятностные модели: скрытая марковская модель.

Мы также включили их методы настройки гиперпараметров через Grid Search. Поскольку глубокое обучение и статистические подходы имеют разные способы обучения. Мы пройдемся по их обучающей реализации библиотеки.

На первом этапе мы создали очень базовую структуру модели на основе прогнозирования. В любом классе Predictor Model мы ожидаем базовые функции, такие как Fit, Update и Predict:

class Predictor(metaclass=ABCMeta): 
@abstractmethod 
def fit(self, **kwargs): 
raise NotImplementedError() 
 
@abstractmethod 
def update(self, **kwargs): 
raise NotImplementedError() 
 
@abstractmethod 
def predict(self, **kwargs): 
raise NotImplementedError()

Но поскольку подход к моделированию усложняется, нам нужно больше функциональных возможностей. Статистические подходы очень широки, почти все они имеют разные методы оптимизации, и поэтому невозможно реализовать их функцию подгонки/обновления в одном и том же базовом классе. Поэтому для статистических моделей мы реализовали StatisticalPredictor Inheriting from Predictor class. Мы не смогли инкапсулировать их стратегии подгонки/обновления, но у нас есть четкое представление о входных данных и их типах.

Примечание. Вероятностные модели также следуют той же схеме, что и класс StatisticalPredictor.

class StatisticalPredictor(Predictor): 
@abstractmethod 
def fit(self, series: pd.Series) -> None: 
raise NotImplementedError() 
 
@abstractmethod 
def update(self, series: pd.Series) -> None: 
raise NotImplementedError() 
 
@abstractmethod 
def predict(self, series: pd.Series, size: int) -> np.array: 
raise NotImplementedError()

Модели глубокого обучения в целом очень сложны и трудны для понимания, но когда дело доходит до их инкапсулированной реализации, они, безусловно, являются самым простым кандидатом, поскольку большинство из них следуют одной и той же кодовой базе соответствия, обновления и прогнозирования. Итак, мы создали класс DL, как показано ниже:

class TFRnnBase(Predictor, metaclass=ABCMeta): 
def __init__(self, weights_save_path: str, n_steps=10, n_features=1, 
n_out=1, units=50): 
super().__init__() 
 
@abstractmethod 
def _build_model(self): 
raise NotImplementedError() 
 
def _build(self): 
model = self._build_model() 
return model 
 
def fit(self, X_train: np.array, X_val: np.array, y_train: np.array, 
y_val: np.array, epochs: int = 500, loss: str = ‘huber’) -> None: 
hist = self.train(X_train, X_val, y_train, y_val, epochs, loss) 
return hist 
 
def update(self, X_train: np.array, X_val: np.array, y_train: np.array, 
y_val: np.array, epochs: int = 500) -> None: 
hist = self.train(X_train, X_val, y_train, y_val, epochs) 
return hist 
 
def predict(self, X_test: np.array, prediction_range: int = 10, val=False) \ 
-> np.array: 
return predictions 
 
def train(self, X_train, X_val, y_train, y_val, epoch, loss=’huber’, 
batch_size=8): 
return hist

В рамках обучения модели глубокого обучения мы позаботились о том, чтобы как можно скорее сохранить лучшую модель, поэтому предоставили модуль экономии веса, раннюю остановку и снижение скорости обучения. Эти утомительные длинные строки функционального кода написаны в кодовой базе ts_forecasting. Создание базового класса помогло нам уменьшить избыточность написания кода и создать структуру, с помощью которой можно тестировать каждую новую модель друг против друга.

Предыдущая ссылка на блог:https://medium.com/@juniper.cto.aiml.2021/time-series-forecasting-library-structure-part-i-data-preprocessing-abb569e4e1eb

Следующая ссылка на блог:https://medium.com/@juniper.cto.aiml.2021/time-series-forecasting-library-structure-part-iii-model-evaluation-and-model -прогноз-4fcaf5a5056d