# Урок 10: Валидация и воспроизводимость

### Валидация(проверка)

```python
import pandas as pd
from neuralprophet import NeuralProphet, set_log_level

# Загрузка набора данных из CSV-файла с помощью pandas
df = pd.read_csv("https://github.com/ourownstory/neuralprophet-data/raw/main/kaggle-energy/datasets/tutorial01.csv")

# Отключение сообщений журнала, кроме случаев ошибок
set_log_level("ERROR")

# Модель и прогнозирование
m = NeuralProphet()
m.set_plotting_backend("plotly-static")
```

Разбейте наш набор данных на обучающую и проверочную выборки. Мы будем использовать проверочную выборку для проверки эффективности нашей модели. Размер проверочной выборки составляет 20% от всего нашего набора данных. Настройте размер с помощью параметра `valid_p` в функции

```python
df_train, df_val = m.split_df(df, valid_p=0.2)

print("Dataset size:", len(df))
print("Train dataset size:", len(df_train))
print("Validation dataset size:", len(df_val))
```

```python
Dataset size: 1462
Train dataset size: 1170
Validation dataset size: 292
```

Валидация выполняется путем передачи валидационного набора в метод fit во время обучения. Полученные метрики показывают производительность модели по сравнению с нашим валидационным набором.

```python
metrics = m.fit(df_train, validation_df=df_val, progress=None)
metrics
```

<table><thead><tr><th width="55"></th><th>MAE_val</th><th width="117">RMSE_val</th><th>Loss_val</th><th width="95">RegLoss_val</th><th width="79">epoch</th><th>MAE</th><th>RMSE</th><th>Loss</th><th>RegLoss</th></tr></thead><tbody><tr><td>0</td><td>151.067062</td><td>159.602341</td><td>2.067798</td><td>0.0</td><td>0</td><td>75.920654</td><td>89.007133</td><td>0.699122</td><td>0.0</td></tr><tr><td>1</td><td>147.524399</td><td>155.866516</td><td>2.007845</td><td>0.0</td><td>1</td><td>74.146973</td><td>86.745255</td><td>0.676098</td><td>0.0</td></tr><tr><td>2</td><td>143.015457</td><td>151.105865</td><td>1.931547</td><td>0.0</td><td>2</td><td>71.729416</td><td>84.111290</td><td>0.645402</td><td>0.0</td></tr><tr><td>3</td><td>137.148010</td><td>144.921494</td><td>1.832287</td><td>0.0</td><td>3</td><td>68.274185</td><td>80.496658</td><td>0.602091</td><td>0.0</td></tr><tr><td>4</td><td>129.434494</td><td>136.787064</td><td>1.701819</td><td>0.0</td><td>4</td><td>64.227638</td><td>75.879417</td><td>0.549886</td><td>0.0</td></tr><tr><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td><td>...</td></tr><tr><td>180</td><td>7.111052</td><td>9.061026</td><td>0.011818</td><td>0.0</td><td>180</td><td>4.582942</td><td>6.183656</td><td>0.004233</td><td>0.0</td></tr><tr><td>181</td><td>7.106644</td><td>9.057316</td><td>0.011808</td><td>0.0</td><td>181</td><td>4.587008</td><td>6.228304</td><td>0.004246</td><td>0.0</td></tr><tr><td>182</td><td>7.100244</td><td>9.049046</td><td>0.011786</td><td>0.0</td><td>182</td><td>4.592853</td><td>6.206255</td><td>0.004245</td><td>0.0</td></tr><tr><td>183</td><td>7.102000</td><td>9.050427</td><td>0.011790</td><td>0.0</td><td>183</td><td>4.603105</td><td>6.197680</td><td>0.004274</td><td>0.0</td></tr><tr><td>184</td><td>7.101621</td><td>9.050205</td><td>0.011789</td><td>0.0</td><td>184</td><td>4.579907</td><td>6.184962</td><td>0.004225</td><td>0.0</td></tr></tbody></table>

185 rows × 9 columns

```python
forecast = m.predict(df)
m.plot(forecast)
```

<figure><img src="https://neuralprophet.com/_images/tutorials_tutorial10_7_0.svg" alt=""><figcaption></figcaption></figure>

Для изучения продвинутых методов проверки и тестирования обратитесь к руководству *Тестирование и кросс-валидация* в разделе *Как сделать*.

### Воспроизводимость

Вариабельность результатов заключается в том, что SGD находит разные оптимумы при разных запусках. Большая часть случайности происходит из-за случайной инициализации весов, различных скоростей обучения и разного перемешивания данных в дата-лоадере. Мы можем контролировать генератор случайных чисел, установив его начальное значение (seed):

```python
from neuralprophet import set_random_seed

set_random_seed(0)
```

Чтобы получать идентичные результаты при каждом запуске модели, необходимо перед её обучением явно установить одно и то же случайное число в качестве начального значения генератора случайных чисел (random seed).
