Урок курса
Признаки, цель и строки данных
Машинное обучение с нуля на Python: первая модельЧто такое признаки X и целевая переменная y
Признаки X — то, что известно об объекте в момент прогноза. Цель y — величина или класс, которые модель должна предсказать. В задаче цены квартиры площадь, комнаты и этаж могут быть признаками, а цена — целью.
Цель выбирает постановка задачи, а не положение столбца в таблице. Для регрессии цены y числовая; в другой задаче классификации целью может быть метка категории. Поле с ответом не должно одновременно оставаться среди признаков.
Ниже соберём таблицу квартир с нуля, отделим цену от признаков и проверим, что строки X и y по-прежнему относятся к одним объектам.
Прежде чем модель увидит хоть одно число, нужно понять, с чем вообще работаешь: сколько наблюдений, какие столбцы и где среди них спрятан ответ, который предстоит предсказывать.
Структура таблицы: строки, столбцы и типы перед разделением
Представь, что тебе передали DataFrame df с неизвестным содержимым. Первый вопрос — сколько строк и столбцов, а второй — что в каждом столбце лежит.
import pandas as pd
data = {
'площадь': [38, 55, 70, 90, 45],
'комнаты': [1, 2, 3, 4, 2],
'этаж': [3, 7, 1, 12, 5],
'цена': [4200, 6100, 7800, 11500, 5300],
}
df = pd.DataFrame(data)
print(df.shape) # (5, 4)
print(list(df.columns)) # ['площадь', 'комнаты', 'этаж', 'цена']
print(df.dtypes)
Вывод df.dtypes выглядит так:
площадь int64 комнаты int64 этаж int64 цена int64 dtype: object
df.shape возвращает кортеж (строки, столбцы). Первое число — это количество наблюдений: здесь 5 квартир. Каждая строка — ровно один объект; именно это число потом должно совпасть у X и y после разделения.
list(df.columns) показывает имена всех столбцов в том порядке, в котором они стоят. Это важно: если имя столбца написано с опечаткой или в другом регистре, попытка обратиться к нему упадёт с KeyError.
df.dtypes раскрывает тип каждого столбца. Здесь всё int64 — числа. Если целевой столбец показывает тип object, это повод заглянуть в его значения: pandas присваивает object при смешанном содержимом или нечисловых элементах. Например, если в столбце с ценой встретилось 'н/д' или пустая строка, dtype станет object, и такой столбец потребует очистки или преобразования перед подачей в модель регрессии.
По этому выводу видно, что столбцы бывают двух ролей: одни описывают свойства объекта, другой — то, что нужно предсказать. Какой именно столбец станет целевым, определяет условие задачи, а не структура данных: если стоит задача прогнозировать цену квартиры по её характеристикам, то цена — это y, а площадь, комнаты и этаж — кандидаты в X, потому что они будут известны в момент прогноза. Числовой тип целевого столбца обязателен, но сам по себе не подсказывает роль: среди числовых столбцов целевым будет ровно один, и его выбирает постановщик задачи.
Разделение таблицы на матрицу признаков X и целевую переменную y
Когда целевой столбец определён, его нужно физически отделить от остальных. Делается это двумя строками:
y = df['цена']
X = df.drop(columns=['цена'])
print(X.shape) # (5, 3)
print(len(y)) # 5
print(X.shape[0] == len(y)) # True
df['цена'] возвращает Series — одномерный объект, где каждый элемент соответствует одной строке исходной таблицы. Это и есть y: то, что модель будет учиться воспроизводить.
df.drop(columns=['цена']) возвращает новый DataFrame без указанного столбца. В X остаются только признаки — площадь, комнаты, этаж. Важно: drop по умолчанию не изменяет df, а отдаёт копию. Исходная таблица остаётся нетронутой.
Проверка X.shape[0] == len(y) подтверждает, что количество наблюдений в обоих объектах одинаково. Это необходимое, но не достаточное условие корректного разделения: равенство размеров не гарантирует, что строки X и элементы y относятся к одним и тем же объектам.
Sklearn связывает X и y по позиции — нулевая строка X должна соответствовать нулевому элементу y, первая — первому, и так далее. Это соответствие можно нарушить двумя способами. Первый — отфильтровать строки только в одном из объектов: тогда X.shape[0] == len(y) сразу станет False, и ошибка обнаружится при первой же проверке. Второй, более коварный, — переставить строки только в X или только в y: длины останутся равны, но каждая квартира окажется привязана к чужой цене. Такую ошибку проверка длин не поймает. Именно поэтому надёжнее всего выделять X и y из одного и того же df без промежуточных перестановок строк между ними.
Теперь о границе, которую нельзя нарушать. Если цена останется в X — случайно, потому что забыли вызвать drop, — модель на обучающих данных получает ответ прямо среди входных переменных. Это называется утечкой данных: оценка качества может стать искусственно хорошей и не отражать реальную способность модели предсказывать. А когда потребуется применить модель к новым объектам, у них цены ещё нет — столбец будет отсутствовать. Sklearn обнаружит несовпадение набора признаков и вызов predict завершится ошибкой.
Таким образом, модель с утечкой не только даёт ненадёжную оценку качества, но и оказывается непригодной к реальному использованию.
После разделения структура зафиксирована: X с тремя признаками описывает квартиру, y содержит её цену. Именно это и является предметом задачи регрессии: по трём числам на входе предсказать одно число на выходе.
| Площадь | Комнаты | Этаж | Цена (y) |
|---|---|---|---|
| 38 | 1 | 3 | 4200 |
| 55 | 2 | 7 | 6100 |
| 70 | 3 | 1 | 7800 |
| 90 | 4 | 12 | 11500 |
| 45 | 2 | 5 | 5300 |
Задача 1
В таблице есть столбцы «город», «площадь», «год_постройки», «стоимость». Нужно предсказать стоимость. Какие столбцы войдут в матрицу признаков X?
Задача 2
После выполнения кода:
import pandas as pd
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6], 'target': [10,20,30]})
X = df.drop(columns=['target'])
y = df['target']
Чему равно X.shape? Напиши ответ в формате (строки, столбцы).
Задача 3
Что произойдёт, если целевой столбец случайно остался среди признаков X?
Задача 4
Паспорт данных об урожае
Агрономическая служба сельскохозяйственного района ведёт учёт полей, фиксируя для каждого из них за один вегетационный сезон набор числовых показателей: условия полива, количество внесённых удобрений, температурный режим и прочие параметры, способные влиять на итоговую продуктивность. Все эти сведения собраны в единую таблицу, где одна строка соответствует одному полю, а итог сезона выражен в центнерах собранного урожая.
Что уже дано
До вашего кода в том же пространстве имён создаётся df — готовый pandas DataFrame. Каждая строка соответствует одному полю за сезон. Числовые столбцы полив_мм, удобрение_кг и температура_с описывают условия выращивания; урожай_ц — фактический урожай в центнерах. Видимый шаблон содержит имена для результата.
Что нужно сделать
Создайте X со столбцами условий в исходном порядке и y из столбца урожай_ц. Запишите в feature_names список имён столбцов X, в first_y — урожай первой строки, а в n_rows — число наблюдений. Сохраните исходный df без изменений.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно. После вашего кода проверяются верхнеуровневые имена X, y, feature_names, first_y и n_rows. X остаётся DataFrame, y — Series; число строк X и элементов y равно числу строк df.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Задача 5
Утечка в таблице коммунальных счетов
Управляющая компания ведёт реестр коммунальных начислений: каждый расчётный месяц по каждой квартире формируется одна строка, в которой зафиксированы характеристики жилья, показания счётчиков воды и электричества, а также итоговая сумма счёта. Именно из такой таблицы аналитик планирует построить модель, способную по техническим параметрам квартиры и показаниям приборов учёта предсказывать, какой счёт получит жилец.
Перед обучением аналитик подготовил X и y, но проверка состава данных отклонила результат. Разберитесь, какие сведения доступны при прогнозе нового счёта, а какие появляются только после его выставления. По этому различию найдите дефект в подготовке данных.
Что уже дано
До вашего кода в том же пространстве имён создаётся df — pandas DataFrame с одной строкой на квартиру за расчётный месяц. Столбцы площадь_м2, вода_м3 и электричество_квтч содержат числовые признаки, а счёт_руб — числовую цель. Видимый код уже создаёт X и y.
Что нужно сделать
Исправьте видимый код так, чтобы X содержал только три признака в порядке исходной таблицы, а y — суммы счетов. Создайте column_names как список имён столбцов X, row_count как число строк X и first_bills как список первых двух значений y. Не изменяйте df.
Ввод и вывод
stdin не используется. Печатать через print в stdout ничего не нужно. После вашего кода проверяются верхнеуровневые X, y, column_names, row_count, first_bills. X должен быть DataFrame, y — Series; число строк X равно числу строк исходного df.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Задачи к уроку
- Утечка целевой переменной в ML: как отделить X от y
Исключите целевой столбец из признаков X и сохраните y отдельно, чтобы модель не видела будущий ответ при прогнозе.
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
