На этом шаге мы рассмотрим способы проведения такой оценки.
Чтобы оценить качество модели в ходе корректировки ее параметров (таких как количество эпох обучения), можно разбить исходные данные на обучающий и проверочный наборы, как это делалось в предыдущих примерах. Однако, поскольку у нас имеется и без того небольшой набор данных, проверочный набор получился бы слишком маленьким (скажем, около 100 образцов). Как следствие, оценки при проверке могут сильно меняться в зависимости от того, какие данные попадут в проверочный и обучающий наборы: иными словами, могут иметь слишком большой разброс. Это не позволит надежно оценить качество модели.
Лучшей практикой в таких ситуациях является применение перекрестной проверки по K блокам (K-fold cross-validation, рисунок 1). .
Рис.1. Перекрестная проверка по трем блокам
Суть ее заключается в разделении доступных данных на K блоков (обычно K = 4 или 5), создании K идентичных моделей и обучении каждой на K - 1 блоках с оценкой по оставшимся блокам. По полученным K оценкам вычисляется среднее значение, которое принимается как оценка модели. В коде такая проверка реализуется достаточно просто.
from tensorflow import keras from tensorflow.keras import layers import numpy as np k = 4 num_val_samples = len(train_data) // k num_epochs = 100 all_scores = [] for i in range(k): print(f"Processing fold #{i}") # Подготовка проверочных данных: данных из блока с номером k val_data = train_data[i * num_val_samples: (i + 1) * num_val_samples] val_targets = train_targets[i * num_val_samples: (i + 1) * num_val_samples] # Подготовка обучающих данных: данных из остальных блоков partial_train_data = np.concatenate( [train_data[:i * num_val_samples], train_data[(i + 1) * num_val_samples:]], axis=0) partial_train_targets = np.concatenate( [train_targets[:i * num_val_samples], train_targets[(i + 1) * num_val_samples:]], axis=0) # Конструирование модели Keras (уже скомпилированной) model = build_model() # Обучение модели (в режиме без вывода сообщений, verbose = 0) model.fit(partial_train_data, partial_train_targets, epochs=num_epochs, batch_size=16, verbose=0) # Оценка модели по проверочным данным val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0) all_scores.append(val_mae)
Выполнив этот код с num_epochs = 100, мы получили следующие результаты:
print(all_scores) print(np.mean(all_scores)) [1.9412295818328857, 2.441345453262329, 2.519310474395752, 2.2891979217529297] 2.297770857810974
Разные прогоны действительно показывают разные оценки, от 2,1 до 3,1. Средняя (2,6) выглядит более достоверно, чем любая из оценок отдельных прогонов, - в этом главная ценность перекрестной проверки по K блокам. В данном случае средняя ошибка составила ~2300 долларов, что довольно много, если вспомнить, что цены колеблются в диапазоне от 10 000 до 50 000 долларов.
На следующем шаге мы закончим изучение этого вопроса.