Первая модель: от таблицы до предсказания

Первый fit и predict на своих данных

Содержание курса

В прошлом уроке мы разобрались, что данные делятся на признаки и цель, и научились выделять X и y из готовой таблицы. Теперь пройдём полный цикл: создадим DataFrame вручную, обучим на нём линейную регрессию и попросим её предсказать значения для новых строк.

DataFrame с признаками и целевой переменной: создание X и y

Начнём с данных, которые будут нашим сквозным примером. Мы моделируем прокат велосипедов: два признака — температура воздуха и влажность — и одна цель — количество прокатов за день.

import pandas as pd

data = {
    'температура': [10, 18, 25, 30],
    'влажность':   [60, 55, 70, 45],
    'прокатов':    [120, 210, 280, 350]
}
df = pd.DataFrame(data)

Таблица содержит четыре строки — это четыре наблюдения. Каждая строка описывает один день: какой была погода и сколько велосипедов взяли в аренду.

Теперь разделяем её на X и y:

y = df['прокатов']
X = df.drop(columns=['прокатов'])

y — это pandas Series с четырьмя числами: [120, 210, 280, 350]. X — DataFrame из двух столбцов, температура и влажность, и тех же четырёх строк.

Почему целевой столбец нельзя оставлять в X? Модель обучается искать связь между признаками и целью. Если передать прокатов как признак, правильный ответ окажется прямо во входных данных — это утечка целевой переменной в обучение. Качество модели на тренировочных данных может выглядеть искусственно высоким, но при реальном прогнозе значение цели недоступно: мы как раз и хотим его предсказать. После drop в X остаётся только то, что будет известно в момент прогноза: погодные условия без информации о результате.

Проверить, что столбцы разделены правильно, просто:

print(list(X.columns))  # ['температура', 'влажность']
print(y.name)           # 'прокатов'

Этот список столбцов важен — он понадобится позже, когда будем формировать новые строки для предсказания.

Почему predict требует [[4]], а не [4]

В scikit-learn X — таблица формы «объекты × признаки». Даже один объект с одним признаком остаётся двумерной таблицей:

from sklearn.linear_model import LinearRegression

model = LinearRegression().fit([[1], [2], [3]], [3, 5, 7])
print(model.predict([[4]]).round(6).tolist())
print(model.predict([[4], [5]]).round(6).tolist())

Первый результат — [9.0], второй — [9.0, 11.0]. Запись [4] одномерная и приводит к ошибке Expected 2D array. Запись [[4, 5]] двумерная, но означает один объект с двумя признаками — такой вход тоже не подходит модели, обученной на одном. Число столбцов нового X должно совпадать с обучением.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения и доступны преподавателям курса. Чтобы попросить преподавателя подключиться, отправьте обращение из диалога.

Проверка решения остаётся отдельным действием.