Тренировочные данные (Train Data) - Лена Капаца
Тренировочные данные (Train Data) by Лена Капаца March 4, 2021

Тренировочные данные (обучающие) – это часть Датасета (Dataset), обучающая основа Модели (Model) Машинного обучения (ML). Является одной из составляющих разделенного набора данных наряду с Тестовыми (Test Data) и Валидационными (Validation Data) данными.

Типы разделений датасета 

Пример. Мы создаем модель, предсказывающую потребление электроэнергии в городе. Если на тренировочных данных она, подобно человеческому мозгу, учится видеть скачки потребления электричества, то на тестовой Дата-сайентист (Data Scientist) проверяет качество обучения. Но зачем же нужна валидационная часть?

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

Не существует четких правил относительно того, сколько данных нужно. Для тех случаев, когда модель должна быть высокоточной (например, для беспилотных автомобилей), потребуются огромные объемы данных, тогда как узкоспециализированный алгоритм распознавания текста требует гораздо меньший датасет. Зачастую исходное предположение о необходимом объеме тренировочных данных оказывается заниженным: для достижения приемлемой точности распознавания (70% и выше) простого Чат-бота (Chat Bot), распознающего одно-два намерения пользователя, могут потребоваться десятки тысяч текстовых сообщений.

Тестовые данные и Scikit-learn

Библиотека Scikit-learn предлагает беспрецедентно минималистичный синтаксис встроенной функции train_test_split(), позволяющий разделить датасет на тренировочную и тестовую части за одну строку кода. Посмотрим, как это работает.

Стоит отметить также, что не во всех случаях простое случайное разделение датасета на части уместно: если речь идет о небольшом датасете, применяется так называемая Кросс-Валидация (Cross Validation): данные делят на k частей, и как бы попеременно используют каждую из них то в тестовых, то в валидационных целях, то как часть тренировочного компонента.

Для начала импортируем необходимые библиотеки

import numpy as np
import sklearn 
from sklearn.model_selection import train_test_split

Создадим датасет-лилипут с помощью numpy.arange() – метод сгенерирует Переменные-предикторы (Predictor Variable), ряд из десяти упорядоченных чисел с одинаковым интервалом, в данном случае, от 0 до 9. Метод reshape() сделает из полученного ряда матрицу 5 х 2, а встроенная Python-функция range(), отвечающая за целевую переменную, сгенерирует пять ярлыков Целевой переменной (Target Variable) y – числа от 0 до 4 включительно.

X, y = np.arange(10).reshape((5, 2)), range(5)
X

Посмотрим, что мы "положили" в объект X:

array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [8, 9]])

И в y, в свою очередь:

list(y)

Элегантная функция range() позволила нам сгенерировать вот такой ряд максимально кратко и без циклов, и это прекрасно:

[0, 1, 2, 3, 4]

Теперь разделим наш датасет на тренировочную и тестовую части. Сниппет ниже – это пример обращения ко встроенной функции библиотеки train_test_split(). Мы имеем дело с размеченным датасетом, поскольку указываем переменные-предикторы X, и целевую переменную y. Размер тестовой части – 33% от общего размера датасета. random_state = 42 задает случайный характер разделения данных:

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

В первую очередь, алгоритм функции выбирает тестовые 33% случайным образом:

X_test

Треть данных – это всего две строки, когда речь идет о датасете 5 x 3:

array([[2, 3],
       [8, 9]])

Вызовем тестовую часть данных целевой переменной – это Ярлыки (Label) двух рядов X_test:

y_test

Ряды [2, 3], [8, 9] принадлежат классам 1 и 4 соответственно:

[1, 4]

Разделив датасет на четыре части, мы вызываем тренировочную часть предикторов:

X_train

Этот компонент – остаток тренировочных данных после выборки 33% тестовых Наблюдений (Observation):

array([[4, 5],
       [0, 1],
       [6, 7]])

Тоже самое для тренировочной части целевой переменной:

y_train

y_train – это Ярлыки (Label), которые соответствуют порядковому номеру рядов X_train:

[2, 0, 3]

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Фото: @liuchen37

© Лена Капаца. Все права защищены.