Тестовые данные – это часть Датасета (Dataset) , проверяющая основа Модели (Model) Машинного обучения (ML) . Является одной из составляющих разделенного набора данных наряду с Тренировочными (Train Data) и Валидационными (Validation Data) данными.
Пример. Мы создаем модель, предсказывающую потребление электроэнергии в городе. Если на тренировочных данных она, подобно человеческому мозгу, учится видеть скачки потребления электричества, то на тестовой Дата-сайентист (Data Scientist) проверяет качество обучения.
Тестовую часть информации используют в качестве золотого стандарта для сравнения различных конкурирующих моделей (например, на соревнованиях Kaggle). Наивысший результат во время такого теста и определяет наиболее эффективную модель. Набор для тестирования обычно формируется случайным способом и содержит Наблюдения (Observation) различных классов, с которыми может столкнуться модель при использовании в реальном мире.
Тестовые данные и Scikit-learn
Библиотека Scikit-learn предлагает беспрецедентно минималистичный синтаксис встроенной функции train_test_split() , позволяющий разделить датасет на тренировочную и тестовую части за одну строку кода. Посмотрим, как это работает.
Стоит отметить также, что не во всех случаях простое случайное разделение датасета на части уместно: если речь идет о небольшом датасете, применяется так называемая Кросс-Валидация (Cross Validation): данные делят на k частей, и как бы попеременно используют каждую из них то в тестовых, то в валидационных целях, то как часть тренировочного компонента.
Для начала импортируем необходимые библиотеки:
Создадим датасет-лилипут с помощью numpy.arange() – метод сгенерирует Переменные-предикторы (Predictor Variable) , ряд из десяти упорядоченных чисел с одинаковым интервалом, в данном случае, от 0 до 9. Метод reshape() сделает из полученного ряда матрицу 5 х 2, а встроенная Python-функция range() , отвечающая за целевую переменную, сгенерирует пять ярлыков Целевой переменной (Target Variable) y – числа от 0 до 4 включительно.
Посмотрим, что мы "положили" в объект X:
И в y , в свою очередь:
Элегантная функция range() позволила нам сгенерировать вот такой ряд максимально кратко и без циклов, и это прекрасно:
Теперь разделим наш датасет на тренировочную и тестовую части. Сниппет ниже – это пример обращения ко встроенной функции библиотеки train_test_split() . Мы имеем дело с размеченным датасетом, поскольку указываем переменные-предикторы X , и целевую переменную y . Размер тестовой части – 33% от общего размера датасета. random_state = 42 задает случайный характер разделения данных:
В первую очередь, алгоритм функции выбирает тестовые 33% случайным образом:
Треть данных – это всего две строки, когда речь идет о датасете 5 x 3:
Вызовем тестовую часть данных целевой переменной – это Ярлыки (Label) двух рядов X_test :
Ряды [2, 3], [8, 9] принадлежат классам 1 и 4 соответственно:
Разделив датасет на четыре части, мы вызываем тренировочную часть предикторов:
Этот компонент – остаток тренировочных данных после выборки 33% тестовых Наблюдений (Observation):
Тоже самое для тренировочной части целевой переменной:
y_train – это Ярлыки (Label), которые соответствуют порядковому номеру рядов X_train:
Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.