Что такое разделение Train-validation-test в ML

Разделение обучения, тестирования и проверки — это процесс разделения набора данных на три отдельных подмножества: набор обучения, набор тестов и набор проверки.

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

  • Обучающий набор: обучающий набор используется для обучения модели, настраивая ее параметры для наилучшего соответствия данным. Этот набор должен быть достаточно большим, чтобы зафиксировать закономерности в данных, но не настолько большим, чтобы модель соответствовала данным. Обычно для обучения используется 60–90% данных.
  • Проверочный набор. Проверочный набор используется для оценки производительности модели и настройки ее гиперпараметров, таких как скорость обучения и количество скрытых слоев. Набор проверки действует как прокси для набора тестов, который не следует использовать для выбора модели или настройки гиперпараметров. Этот набор должен быть достаточно большим, чтобы обеспечить осмысленную оценку модели, но не настолько большим, чтобы существенно влиять на обучение модели. Обычно для проверки используется 10–30% данных.
  • Набор тестов. Набор тестов используется для оценки производительности окончательной модели и ее способности обобщать невидимые данные. Этот набор не должен зависеть от наборов для обучения и проверки и должен использоваться только для оценки окончательной модели. Обычно для тестирования используется 10–30% данных.

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

Наконец, важно скрыть набор тестов во время процесса обучения, используя его только для оценки окончательной модели. Это помогает предотвратить риск переобучения тестовому набору, что может привести к чрезмерно оптимистичной оценке производительности модели на невидимых данных.

Использование сплита

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

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

Лучший поезд, проверка, коэффициент разделения теста

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

  • Разделение 60 – 20 – 20. При этом разделении данные делятся на 60 % для обучения, 20 % для проверки и 20 % для тестирования. Это обычное соотношение, когда набор данных большой, а модель относительно проста.
  • Разделение 70–15–15. При этом разделении данные делятся на 70 % для обучения, 15 % для проверки и 15 % для тестирования. Это соотношение можно использовать, когда набор данных относительно небольшой или модель более сложная.
  • Разделение 80 – 10 – 10. При этом разделении данные делятся на 80 % для обучения, 10 % для проверки и 10 % для тестирования. Это соотношение можно использовать, когда набор данных чрезвычайно велик или когда модель очень сложна.

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

Реализация разделения 60–20–20 с использованием Python’s scikit-learn

Вот пример кода для разделения набора данных на наборы для обучения, проверки и тестирования с использованием библиотеки Python scikit-learn:

Python3

from sklearn.model_selection import train_test_split

# Assuming you have a dataset 'X' and labels 'y'
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(
    X_train, y_train, test_size=0.25, random_state=42)

# X_train, y_train are the training data
# X_val, y_val are the validation data
# X_test, y_test are the test data# Assuming you have a dataset 'X' and labels 'y'
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(
    X_train, y_train, test_size=0.25, random_state=42)

В приведенном выше коде функция train_test_split используется дважды, чтобы сначала разделить данные на обучающие и тестовые наборы с размером теста 20%, а затем разделить обучающие данные на обучающий и проверочный наборы с размером теста 25%. Параметр random_state используется для обеспечения того, чтобы при каждом запуске кода выполнялись одни и те же разбиения.

Общая реализация

Приведенный ниже код используется для разделения набора данных в любом заданном соотношении.

Python3

import numpy as np
import pandas as pd


def train_test_val_split(data, train_ratio=0.8, test_ratio=0.1, val_ratio=0.1):
    np.random.seed(0)
    perm = np.random.permutation(data.index)
    m = len(data)
    train_end = int(train_ratio * m)
    test_end = int((train_ratio + test_ratio) * m)
    train = data.iloc[perm[:train_end]]
    test = data.iloc[perm[train_end:test_end]]
    val = data.iloc[perm[test_end:]]
    return train, test, val


data = pd.read_csv("data.csv")  # replace "data.csv" with the actual file path
train, test, val = train_test_val_split(
    data, train_ratio, test_ratio, val_ratio)

Приведенный выше код является примером того, как разделить набор данных на наборы для обучения, тестирования и проверки в Python с использованием библиотеки Pandas.

Функция train_test_val_split принимает входные данные набора данных и желаемое соотношение каждого разделения с точки зрения данных обучения, тестирования и проверки. Коэффициент обучения по умолчанию, коэффициент тестирования и коэффициент проверки установлены на 0,8, 0,1 и 0,1 соответственно, но эти значения можно настроить по мере необходимости.

Первым шагом в функции является перемешивание строк данных путем создания перестановки индекса данных с использованием np.random.permutation. Это важно для того, чтобы полученные разбиения были случайными и репрезентативными для исходных данных.

Затем длина данных вычисляется с использованием m = len(data), а конечные индексы для наборов поезда, теста и проверки вычисляются с использованием целочисленного деления с коэффициентами, указанными в качестве входных данных.

Наконец, данные делятся на наборы для обучения, тестирования и проверки с использованием метода индексации .iloc в Pandas DataFrame и вычисленных индексов, и эти наборы возвращаются в качестве выходных данных функции.

Обратите внимание, что этот код предполагает, что данные хранятся в кадре данных pandas и что индекс данных перемешивается перед разделением на наборы для обучения, тестирования и проверки. Начальное значение для генератора случайных чисел устанавливается для обеспечения воспроизводимости.

Заключение

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

Точное соотношение разделения зависит от размера набора данных, сложности модели и целей проекта, но общие соотношения включают 60–20–20, 70–15–15 и 80–10–10.

Реализация разделения поезд-валидация-тест в Python может быть выполнена с использованием различных библиотек, таких как NumPy и Pandas. Независимо от точной реализации, важно обеспечить, чтобы разделение выполнялось случайным и репрезентативным образом, чтобы максимизировать точность и надежность результатов.