Что такое X, y, признаки, target и зачем нужен train/test в Machine Learning
Когда человек только заходит в Machine Learning, у него очень быстро начинают мелькать одни и те же обозначения:
XYпризнаки
target
traintest
Проблема в том, что эти слова часто объясняют слишком быстро. В итоге у новичка в голове остается набор терминов, но не появляется цельная картина: что именно подается в модель, что она должна предсказать и как вообще проверять, что она чему-то научилась.
А без этого дальше действительно начинается путаница почти во всем: в моделях, метриках, коде и даже в понимании того, что именно делает ML.
В этой статье спокойно разберем базовую конструкцию, на которой держится почти все классическое машинное обучение:
что такое признаки;
что такое target;
что такое
XиY;чем регрессия отличается от классификации;
зачем делить данные на
trainиtest.
Почему здесь так часто путаются
Одна из причин путаницы очень простая: многие помнят из школы, что x и y — это координаты на плоскости.
В Machine Learning это не так.
Здесь:
X— это входные данные;y— это правильный ответ, который модель должна научиться предсказывать.
То есть в ML это не оси координат, а просто удобные обозначения для данных.
Если совсем коротко, то можно запомнить так:
X— что модель видит;y— что модель должна угадать.
Или еще проще:
X— вход;y— ответ.
С чего вообще начинается ML-модель
Любая базовая ML-задача выглядит примерно так:
У нас есть объект.
У объекта есть какие-то характеристики.
Мы хотим по этим характеристикам предсказать результат.
Например, мы хотим предсказывать зарплату человека по данным о нем.
Допустим, у нас есть такая информация:
{
"experience_years": 3,
"english_level": 4
}
И есть результат:
{
"salary": 120000
}
Тогда логика такая:
experience_yearsиenglish_level— это входные данные;salary— это ответ, который нужно предсказать.
В терминах ML:
X = [experience_years, english_level]y = salary
Что такое признаки
Признаки (features) — это характеристики объекта, по которым модель пытается найти закономерность.
Например, признаками могут быть:
опыт работы;
уровень английского;
возраст;
площадь квартиры;
количество комнат;
история покупок.
Если говорить совсем просто, признаки — это входные параметры.
Именно они попадают в модель на вход. Модель смотрит на них и пытается понять, как они связаны с нужным ответом.
Что такое target
Target или целевая переменная — это то, что мы хотим предсказать.
Например:
зарплату;
цену квартиры;
факт ухода клиента;
спам или не спам;
класс изображения.
То есть target — это правильный ответ для модели во время обучения.
Это очень важное разделение:
признаки — то, по чему мы предсказываем;
target — то, что предсказываем.
На практике многие ошибки начинаются именно в тот момент, когда человек перестает четко разделять эти две роли.
Что такое X и y на практике
Теперь можно перейти к самым популярным обозначениям.
X — матрица признаков
X — это все входные данные, обычно в виде таблицы.
Например:
experience_years | english_level |
|---|---|
1 | 2 |
2 | 3 |
3 | 4 |
4 | 4 |
Это и есть X.
Каждая строка — отдельный объект.
Каждый столбец — отдельный признак.
y — целевая переменная
y — это колонка с правильными ответами для каждой строки из X.
Для той же таблицы это может быть:
salary |
|---|
70000 |
90000 |
120000 |
150000 |
Это и есть y.
Именно поэтому базовая схема в ML выглядит так:
X— входные признаки;y— правильные ответы.
Полный пример: как это выглядит вместе
Допустим, у нас есть такая таблица:
experience_years | english_level | salary |
|---|---|---|
1 | 2 | 70000 |
2 | 3 | 90000 |
3 | 4 | 120000 |
4 | 4 | 150000 |
Что здесь происходит?
Шаг 1. Выделяем признаки
То, по чему модель будет предсказывать:
experience_yearsenglish_level
Это наш X.
Шаг 2. Выделяем target
То, что нужно предсказать:
salary
Это наш y.
В коде такая логика часто выглядит так:
import pandas as pd
df = pd.DataFrame({
"experience_years": [1, 2, 3, 4],
"english_level": [2, 3, 4, 4],
"salary": [70000, 90000, 120000, 150000]
})
# X — только признаки
X = df[["experience_years", "english_level"]]
# y — целевая переменная
y = df["salary"]
Здесь важно не само количество строк, а сам принцип: мы явно отделяем вход от ответа.
Это регрессия или классификация
Как только у нас появляется y, сразу возникает следующий вопрос: а что именно мы предсказываем?
От этого зависит тип задачи.
Когда это регрессия
Если y — это число, которое может принимать разные значения на числовой шкале, то это регрессия.
Например:
зарплата;
цена;
температура;
выручка;
время доставки.
В примере выше salary — это число, значит перед нами задача регрессии.
Когда это классификация
Если y — это не число как непрерывная величина, а категория или класс, то это уже классификация.
Например:
spam / not spamyes / nojunior / middle / seniorcat / dog
То есть разница очень простая:
регрессия — предсказываем число;
классификация — предсказываем класс.
Почему без train/test нельзя честно оценить модель
Вот здесь начинается одна из самых важных идей во всем ML.
Нельзя обучать модель и проверять ее на одних и тех же данных.
Потому что в этом случае модель может не понять закономерность, а просто запомнить ответы.
Тогда получится ложное ощущение, что все работает отлично.
Простая аналогия
Представьте экзамен.
Если человек заранее увидел ответы, а потом решает ровно тот же вариант, это не означает, что он реально понял тему.
Это означает только то, что он смог воспроизвести уже знакомый набор ответов.
С моделью происходит то же самое.
Что такое train и test
Train
Train — это данные, на которых модель обучается.
На них она ищет закономерности:
какие признаки влияют на ответ;
как связаны вход и результат;
какие паттерны повторяются.
Test
Test — это данные, которые модель не видела во время обучения.
На них мы проверяем, умеет ли модель работать на новых примерах.
Именно здесь становится видно, произошло ли обучение на закономерности или просто запоминание train-части.
Как это выглядит в коде
На практике разделение данных часто делают так:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, # признаки
y, # target
test_size=0.25, # 25% данных уходит в test
random_state=42 # чтобы разбиение воспроизводилось
)
Что здесь получается:
X_train— признаки для обучения;y_train— правильные ответы для обучения;X_test— признаки для проверки;y_test— правильные ответы для проверки.
Дальше модель обучают на train-части, а качество оценивают на test-части.
Что ломается, если понять это неправильно
Вот несколько типичных ошибок новичков.
Ошибка 1. Путают признаки и target
Например, человек случайно кладет в X колонку, которую модель должна предсказывать.
В результате получается нечестное обучение: модель как будто “угадывает”, но на деле просто получает ответ прямо на вход.
Ошибка 2. Проверяют модель на тех же данных, на которых обучали
Это одна из самых опасных ошибок, потому что внешне все может выглядеть отлично: метрика высокая, предсказания красивые, код работает.
Но на новых данных модель внезапно начинает сыпаться.
Ошибка 3. Не понимают, что именно предсказывают
Если не зафиксировать, какой именно у нас y, можно легко начать путать регрессию и классификацию, а вместе с этим — выбирать не ту модель и не те метрики.
Например:
для регрессии не подойдет
accuracy;для классификации не подходят ошибки вроде
MAEкак основной способ оценки.
Как правильно держать это в голове
Есть простая схема, которую полезно помнить почти всегда:
объект — то, про что у нас есть данные;
признаки — характеристики объекта;
X— таблица признаков;y— колонка правильных ответов;train — данные для обучения;
test — данные для честной проверки.
Если эта логика у человека в голове зафиксирована, то дальше уже намного проще понимать:
как устроено обучение модели;
что такое предсказание;
зачем нужны метрики;
почему бывает переобучение;
как интерпретировать результат.
Мини-проверка на понимание
Возьмем ту же таблицу:
experience_years | english_level | salary |
|---|---|---|
1 | 2 | 70000 |
2 | 3 | 90000 |
3 | 4 | 120000 |
4 | 4 | 150000 |
Здесь:
признаки:
experience_years,english_level;target:
salary;X: таблица из двух признаков;y: колонкаsalary;тип задачи: регрессия.
Если вместо salary была бы колонка job_level со значениями junior, middle, senior, то это уже была бы классификация.