Тестирование и кросс-валидация
if "google.colab" in str(get_ipython()):
# удаление предустановленных пакетов из Colab, чтобы избежать конфликтов
!pip uninstall -y torch notebook notebook_shim tensorflow tensorflow-datasets prophet torchaudio torchdata torchtext torchvision
!pip install git+https://github.com/ourownstory/neural_prophet.git # может занять некоторое время
#!pip install neuralprophet # намного быстрее, но может не иметь последних обновлений/исправлений ошибок
import pandas as pd
from neuralprophet import NeuralProphet, set_log_level
set_log_level("ERROR")
Загрузить данные
data_location = "https://raw.githubusercontent.com/ourownstory/neuralprophet-data/main/datasets/"
df = pd.read_csv(data_location + "air_passengers.csv")
1.Базовый уровень: обучение и тестирование модели.
Сначала мы покажем, как подготовить модель и оценить ее на отложенной выборке.
1.1 Оценка Train-Test
m = NeuralProphet(seasonality_mode="multiplicative", learning_rate=0.1)
m.set_plotting_backend("plotly-static")
df = pd.read_csv(data_location + "air_passengers.csv")
df_train, df_test = m.split_df(df=df, freq="MS", valid_p=0.2)
metrics_train = m.fit(df=df_train, freq="MS")
metrics_test = m.test(df=df_test)
metrics_test
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.002764572622254491
MAE_val 18.907012939453125
RMSE_val 23.143999099731445
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
0
18.907013
23.143999
0.002765
0.0
1.2 Прогнозирование будущего
Перед тем как делать какие-либо прогнозы, переобучите модель на всех доступных данных, иначе вы значительно снизите точность прогнозирования!
m = NeuralProphet(seasonality_mode="multiplicative", learning_rate=0.1)
m.set_plotting_backend("plotly-static")
metrics_train2 = m.fit(df=df, freq="MS")
future = m.make_future_dataframe(df, periods=24, n_historic_predictions=48)
forecast = m.predict(future)
m.plot(forecast)
1.3 Визуализируйте обучение
Если вы установили версию NeuralProphet с [live]
, вы можете дополнительно визуализировать ваш процесс обучения и определить любое переобучение, анализируя каждую эпоху.
Примечание: Перед тем как делать какие-либо прогнозы, сначала переобучите модель, используя все данные.
m = NeuralProphet(seasonality_mode="multiplicative", learning_rate=0.1)
m.set_plotting_backend("plotly-static")
df = pd.read_csv(data_location + "air_passengers.csv")
df_train, df_test = m.split_df(df=df, freq="MS", valid_p=0.2)
metrics = m.fit(df=df_train, freq="MS", validation_df=df_test, progress="plot")
metrics.tail(1)
491
19.501102
23.570879
0.002867
0.0
491
6.099627
7.32115
0.000215
0.0
2. Перекрестная проверка временных рядов
Временные ряды и перекрестная проверка — это техника, которая также называется тестированием с перемещающимся началом. Она включает в себя деление данных на несколько частей.
Во время первой части мы обучаем модель на части данных, а затем оцениваем ее производительность на следующем наборе данных, который определяется параметром fold_pct (процент образцов в каждой части).
В следующей части мы включаем данные оценки из предыдущей части в данные для обучения, а затем оцениваем производительность модели на более позднем наборе данных.
Этот процесс повторяется до последней части, где данные оценки достигают конца доступных данных. По сути, точка прогноза «перекатывается» вперед по мере перехода от одной части к следующей.
Примечание: Перед тем, как делать какие-либо прогнозы, переобучите модель на всех доступных данных, иначе вы значительно снизите точность прогнозов!
METRICS = ["MAE", "RMSE"]
METRICS_VAL = ["MAE_val", "RMSE_val"]
params = {"seasonality_mode": "multiplicative", "learning_rate": 0.1}
df = pd.read_csv(data_location + "air_passengers.csv")
folds = NeuralProphet(**params).crossvalidation_split_df(df, freq="MS", k=5, fold_pct=0.20, fold_overlap_pct=0.5)
metrics_train = pd.DataFrame(columns=METRICS)
metrics_test = pd.DataFrame(columns=METRICS_VAL)
for df_train, df_test in folds:
m = NeuralProphet(**params)
m.set_plotting_backend("plotly-static")
train = m.fit(df=df_train, freq="MS")
test = m.test(df=df_test)
metrics_train = metrics_train.append(train[METRICS].iloc[-1])
metrics_test = metrics_test.append(test[METRICS_VAL].iloc[-1])
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:10: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.01086195558309555
MAE_val 16.587053298950195
RMSE_val 20.34723472595215
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:10: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.02300422266125679
MAE_val 31.630748748779297
RMSE_val 34.3193244934082
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:10: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.009417595341801643
MAE_val 21.363872528076172
RMSE_val 28.63540267944336
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:10: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.0073935664258897305
MAE_val 26.357913970947266
RMSE_val 30.63770866394043
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/138744510.py:10: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.0026712114922702312
MAE_val 18.709611892700195
RMSE_val 22.74985122680664
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
metrics_test.describe().loc[["mean", "std", "min", "max"]]
mean
22.929840
27.337904
std
6.081756
5.727830
min
16.587053
20.347235
max
31.630749
34.319324
3. Расширенный уровень: трехфазное обучение, процедура проверки и тестирования.
Наконец, в разделах 3.1 и 3.2 мы выполним трехчастное разделение данных для корректного обучения, валидации и тестирования вашей модели. Такая настройка используется, если вы не хотите исказить оценку производительности за счет ручной настройки гиперпараметров. Однако это не является обычным при работе с временными рядами, если только вы не работаете в академической сфере. Кросс-валидация обычно более чем достаточна для оценки производительности вашей модели.
Если это сбивает вас с толку, просто проигнорируйте этот раздел и продолжайте заниматься прогнозированием. Или если вы заинтересовались, изучите, как оценивать модели машинного обучения, чтобы повысить свои навыки.
3.1 Обучение, проверка и тестирование оценки
m = NeuralProphet(seasonality_mode="multiplicative", learning_rate=0.1)
m.set_plotting_backend("plotly-static")
df = pd.read_csv(data_location + "air_passengers.csv")
# создание тестового участка:
df_train_val, df_test = m.split_df(df=df, freq="MS", valid_p=0.2)
# создание валидационного участка:
df_train, df_val = m.split_df(df=df_train_val, freq="MS", valid_p=0.2)
# обучение модели на тренировочных данных и оценка на валидационном участке
metrics_train1 = m.fit(df=df_train, freq="MS")
metrics_val = m.test(df=df_val)
# переобучение модели на тренировочных и валидационных данных и оценка на тестовом участке
m = NeuralProphet(seasonality_mode="multiplicative", learning_rate=0.1)
m.set_plotting_backend("plotly-static")
metrics_train2 = m.fit(df=df_train_val, freq="MS")
metrics_test = m.test(df=df_test)
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.005187277216464281
MAE_val 18.062246322631836
RMSE_val 25.076841354370117
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.0026784376241266727
MAE_val 18.72081184387207
RMSE_val 22.78059959411621
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
metrics_train1["split"] = "train1"
metrics_train2["split"] = "train2"
metrics_val["split"] = "validate"
metrics_test["split"] = "test"
metrics_train1.tail(1).append([metrics_train2.tail(1), metrics_val, metrics_test]).drop(columns=["RegLoss"])
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/302924761.py:5: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
563
5.339781
6.604742
0.000249
563.0
train1
NaN
NaN
NaN
NaN
491
6.298254
7.553654
0.000226
491.0
train2
NaN
NaN
NaN
NaN
0
NaN
NaN
NaN
NaN
validate
18.062246
25.076841
0.005187
0.0
0
NaN
NaN
NaN
NaN
test
18.720812
22.780600
0.002678
0.0
3.2 Обучение, перекрестная проверка и перекрестное тестирование
METRICS = ["MAE", "RMSE"]
METRICS_VAL = ["MAE_val", "RMSE_val"]
params = {"seasonality_mode": "multiplicative", "learning_rate": 0.1}
df = pd.read_csv(data_location + "air_passengers.csv")
folds_val, folds_test = NeuralProphet(**params).double_crossvalidation_split_df(
df, freq="MS", k=5, valid_pct=0.10, test_pct=0.10
)
metrics_train1 = pd.DataFrame(columns=METRICS)
metrics_val = pd.DataFrame(columns=METRICS_VAL)
for df_train1, df_val in folds_val:
m = NeuralProphet(**params)
m.set_plotting_backend("plotly-static")
train1 = m.fit(df=df_train, freq="MS")
val = m.test(df=df_val)
metrics_train1 = metrics_train1.append(train1[METRICS].iloc[-1])
metrics_val = metrics_val.append(val[METRICS_VAL].iloc[-1])
metrics_train2 = pd.DataFrame(columns=METRICS)
metrics_test = pd.DataFrame(columns=METRICS_VAL)
for df_train2, df_test in folds_test:
m = NeuralProphet(**params)
m.set_plotting_backend("plotly-static")
train2 = m.fit(df=df_train2, freq="MS")
test = m.test(df=df_test)
metrics_train2 = metrics_train2.append(train2[METRICS].iloc[-1])
metrics_test = metrics_test.append(test[METRICS_VAL].iloc[-1])
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:8: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.017169639468193054
MAE_val 43.81590270996094
RMSE_val 45.62299346923828
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:8: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.01694938912987709
MAE_val 42.67584228515625
RMSE_val 45.32938766479492
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:8: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.008688823319971561
MAE_val 29.468582153320312
RMSE_val 32.455142974853516
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:8: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.001547039020806551
MAE_val 13.694732666015625
RMSE_val 13.694735527038574
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:8: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:9: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.0036992093082517385
MAE_val 21.072723388671875
RMSE_val 21.17667007446289
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:18: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:19: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.0032182412687689066
MAE_val 28.705841064453125
RMSE_val 28.857887268066406
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:18: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:19: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.0016795611009001732
MAE_val 17.63250732421875
RMSE_val 20.83587646484375
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:18: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:19: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.0010085979010909796
MAE_val 12.40789794921875
RMSE_val 16.33718490600586
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:18: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:19: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.0016017681919038296
MAE_val 18.285919189453125
RMSE_val 20.88248634338379
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:18: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
WARNING - (py.warnings._showwarnmsg) - /var/folders/6b/n_b96k8n2pn66yjx0387dhjc0000gn/T/ipykernel_22660/2088809072.py:19: FutureWarning:
The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Test metric DataLoader 0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Loss_test 0.0005868254229426384
MAE_val 11.258453369140625
RMSE_val 13.225532531738281
RegLoss_test 0.0
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
metrics_train2.describe().loc[["mean", "std"]]
mean
7.470476
9.342587
std
0.249411
0.270676
metrics_val.describe().loc[["mean", "std"]]
mean
30.145557
31.655786
std
13.203131
14.274982
metrics_test.describe().loc[["mean", "std"]]
mean
17.658124
20.027794
std
6.909549
5.900114
Last updated