2 min read

Тестовые данные (Test Data)

Тестовые данные (Test Data)

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

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

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

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

Тестовые данные и 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]

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

Фото: @editholic7