Алгоритмы машинного обучения: базовый курс - страница 17




Как правильно разделить данные?

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

Чаще всего данные делят в пропорции: 70-80% на обучение и 20-30% на тестирование. Такой баланс выбран неслучайно. Если выделить слишком мало данных для обучения, модель не сможет выявить устойчивые закономерности, так как у неё будет недостаточно примеров. Если же оставить слишком мало данных для тестирования, то сложно будет объективно оценить качество модели: её результаты на новой информации могут оказаться случайными.

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

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

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

Рассмотрим несколько примеров кода на Python с использованием библиотеки `scikit-learn`, чтобы лучше понять процесс разделения данных.


Пример 1: Базовое разбиение данных

Этот код показывает, как разделить данные на обучающую и тестовую выборки с помощью `train_test_split`.

```python

from sklearn.model_selection import train_test_split

import numpy as np

# Создадим массив данных (обычно здесь загружаются реальные данные)

X = np.array([[i] for i in range(1, 11)]) # Признаки (например, номера объектов)

y = np.array([i * 2 for i in range(1, 11)]) # Целевые значения (например, цены)

# Разделяем на 80% обучение, 20% тест

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

print("Обучающая выборка (X_train):", X_train.ravel())

print("Тестовая выборка (X_test):", X_test.ravel())

```

Вывод: Обучающая и тестовая выборки будут сформированы случайным образом, но примерно 80% данных пойдет на обучение, а 20% на тестирование.


Пример 2: Добавление валидационной выборки

Иногда, помимо тестовой выборки, выделяют валидационную. Это можно сделать в два этапа.