Нужно ли разбивать данные на три; поезд, вал и тест? - PullRequest
0 голосов
/ 09 января 2020

Здесь описывается разница между тестом, поездом и набором валидации. В большинстве документов по обучению нейронных сетей я обнаружил, что эти три набора используются, однако они часто предопределены.

У меня относительно небольшой набор данных (всего 906 3D-изображений, распределение сбалансировано). Я использую функцию sklearn.model_selection.train_test_split для разделения данных в поездах и тестовых наборах и использую X_test и y_test в качестве данных проверки в моей модели.

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=1)
...
history = AD_model.fit(
    X_train, 
    y_train, 
    batch_size=batch_size,
    epochs=100,
    verbose=1,
    validation_data=(X_test, y_test))

После тренировки я оцениваю модель на тестовом наборе:

test_loss, test_acc = AD_model.evaluate(X_test,  y_test, verbose=2)

Я видел, что другие люди также подходят к этому так, но так как модель уже видела это данные, я не уверен, каковы последствия этого подхода. Может кто-нибудь сказать мне, каковы последствия использования одного и того же набора для проверки и тестирования? И так как у меня уже есть небольшой набор данных (в результате чего происходит переоснащение), необходимо ли разбивать данные на 3 набора?

Ответы [ 3 ]

0 голосов
/ 09 января 2020

Валидационный набор может использоваться для следующих целей:

  • Контролировать производительность вашей текущей модели обучения на данных, которые не были частью тренировочного набора. Это может помочь вам убедиться в том, что ваша модель правильно тренировалась и не перегружается.
  • Выберите гиперпараметры, обеспечивающие наилучшую производительность.
  • Выберите лучший снимок / вес или остановку эпохи на основе метрики проверки.

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

0 голосов
/ 09 января 2020

Вот что я делаю:

  1. Разделение данных на% 80 train и% 20 test наборов
  2. С данными о поездах выполните 5-кратную перекрестную проверку , Обратите внимание, что набор train также будет снова разделен на% 80-20 из-за перекрестной проверки в каждом сгибе, но CV-модули делают это сами (например, перекрестная проверка sklearn). Таким образом, вам не нужно снова делить его вручную
  3. . После каждого сгиба оцените модель, используя набор тестов
  4. . После 5 сгибов по средним и стандартным показателям CV определите точность модели. Вы также можете добавить отчеты о классификации, матрицы путаницы, графики потерь и точности и т. Д. c.

Причина использования набора поездов, проверки и тестирования заключается в одном: модель обучается с использованием данных поезда Я оптимизирую себя, используя данные проверки, и в конце обучения я тестирую модель, используя данные испытаний.

Вот почему при использовании полного отдельного тестового набора полезно решить, достаточно ли точна модель: модель оптимизирует себя, используя ошибку оценки данных проверки. Если вы снова оцените его, используя данные проверки, это будет нечестно, потому что модель как бы видела это раньше.

Для вашей ситуации, если вам удастся разделить данные поровну (одинаковое количество каждого класса в test набор), да, все еще хорошо разделить на 3 набора.

0 голосов
/ 09 января 2020

Вы можете использовать train, validate, test = np.split(df.sample(frac=1), [int(.6*len(df)), int(.8*len(df))]). Он дает 60%, 20%, 20% для обучения, проверки и тестирования.

Надеюсь, это полезно. Спасибо за чтение !!

...