Шаг 114.
Глубокое обучение на Python. ... . Предсказание цен на дома: пример регрессии. Оценка решения методом перекрестной проверки по K блокам

    На этом шаге мы рассмотрим способы проведения такой оценки.

    Чтобы оценить качество модели в ходе корректировки ее параметров (таких как количество эпох обучения), можно разбить исходные данные на обучающий и проверочный наборы, как это делалось в предыдущих примерах. Однако, поскольку у нас имеется и без того небольшой набор данных, проверочный набор получился бы слишком маленьким (скажем, около 100 образцов). Как следствие, оценки при проверке могут сильно меняться в зависимости от того, какие данные попадут в проверочный и обучающий наборы: иными словами, могут иметь слишком большой разброс. Это не позволит надежно оценить качество модели.

    Лучшей практикой в таких ситуациях является применение перекрестной проверки по K блокам (K-fold cross-validation, рисунок 1). .


Рис.1. Перекрестная проверка по трем блокам

    Суть ее заключается в разделении доступных данных на K блоков (обычно K = 4 или 5), создании K идентичных моделей и обучении каждой на K - 1 блоках с оценкой по оставшимся блокам. По полученным K оценкам вычисляется среднее значение, которое принимается как оценка модели. В коде такая проверка реализуется достаточно просто.


Пример 4.26. Перекрестная проверка по 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 долларов.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг