На этом шаге мы рассмотрим общий принцип организации такой проверки.
При использовании этого подхода данные разбиваются на K блоков равного размера. Для каждого блока i производится обучение модели на остальных K - 1 блоках и оценка на блоке i. Окончательная оценка рассчитывается как среднее K промежуточных оценок. Такой метод может пригодиться, когда качество модели слишком сильно зависит от деления данных на обучающую/контрольную выборки. Подобно проверке с простым расщеплением выборки, этот метод не избавляет от необходимости использовать отдельную проверочную выборку для калибровки модели.
Схематически перекрестная проверка по K блокам выглядит, как показано на рисунке 1.
Рис.1. Перекрестная проверка по трем блокам
В примере 5.6 отражена простейшая реализация этого приема.
k = 3 num_validation_samples = len(data) // k np.random.shuffle(data) validation_scores = [] for fold in range(k): # Выбор блока данных для проверки validation_data = data[num_validation_samples * fold: num_validation_samples * (fold + 1)] # Использование остальных данных для обучения. # Обратите внимание, что оператор + здесь выполняет # конкатенацию списков, а не вычисляет сумму training_data = np.concatenate( data[:num_validation_samples * fold], data[num_validation_samples * (fold + 1):]) # Создание совершенно новой (необученной) модели model = get_model() model.fit(training_data, ...) validation_score = model.evaluate(validation_data, ...) validation_scores.append(validation_score) # Общая оценка: среднее оценок по K блокам validation_score = np.average(validation_scores) # Обучение окончательной модели на всех данных, # не вошедших в контрольный набор model.fit(data, ...) test_score = model.evaluate(test_data, ...)
На следующем шаге мы рассмотрим итерационную проверку по K блокам с перемешиванием.