Авторы: Шрути Джадон, Аджит Патанкар, Аман Гаурав, Дивьянк Гарг, Мэн Сун
Введение:
Данные временных рядов носят последовательный характер, и для их анализа используются такие данные. Нам нужны модели машинного обучения, которые могут изучать функции последовательности и могут включать концепции прошлого и будущего. Следовательно, общие модели, такие как линейная регрессия, регрессия опорных векторов или простые многослойные нейронные сети с высокой плотностью, не будут работать с данными временных рядов, поскольку они предполагают, что данные не зависят друг от друга.
Как часть команды 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