Урок курса
Признаки, цель и строки данных
Машинное обучение с нуля на Python: первая модельПрежде чем модель увидит хоть одно число, нужно понять, с чем вообще работаешь: сколько наблюдений, какие столбцы и где среди них спрятан ответ, который предстоит предсказывать.
Структура таблицы: строки, столбцы и типы перед разделением
Представь, что тебе передали 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 |
Попробуйте решить
Паспорт данных об урожае
Агрономическая служба сельскохозяйственного района ведёт учёт полей, фиксируя для каждого из них за один вегетационный сезон набор числовых показателей: условия полива, количество внесённых удобрений, температурный режим и прочие параметры, способные влиять на итоговую продуктивность. Все эти сведения собраны в единую таблицу, где одна строка соответствует одному полю, а итог сезона выражен в центнерах собранного урожая.
Что уже дано
До вашего кода в том же пространстве имён создаётся 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.
Продолжить с проверкой и прогрессом
Откройте интерактивный раннер с заданиями урока.
