ПроКодинг - Откроем для вас мир IT!

Если вы когда-нибудь пытались предсказать цену квартиры по площади, оценить влияние рекламы на продажи или понять, как температура влияет на потребление электроэнергии - вы уже сталкивались с задачей регрессии. Это одна из самых простых, но при этом самых мощных искренне полезных вещей в машинном обучении. И да, всё это можно сделать всего в нескольких строках кода на Python с помощью scikit-learn.

Что такое линейная регрессия и зачем она нужна

Линейная регрессия - это метод, который ищет прямую линию, наилучшим образом описывающую связь между одной или несколькими входными переменными и целевой величиной. Например, если вы знаете, сколько часов человек учится, и хотите предсказать его оценку на экзамене - линейная регрессия найдёт, на сколько баллов в среднем растёт результат за каждый дополнительный час учёбы.

Это не магия. Это просто математика: Y = a·X + b. Здесь Y - это то, что мы хотим предсказать (оценка), X - вход (часы учёбы), a - наклон линии (как сильно влияет учёба), b - смещение (базовая оценка, даже если не учишься вообще).

В реальном мире редко бывает одна переменная. Чаще - несколько: площадь квартиры, этаж, район, количество комнат. Тогда формула становится длиннее: Y = a₁·X₁ + a₂·X₂ + ... + aₙ·Xₙ + b. Это называется множественная линейная регрессия. И именно её мы будем использовать на практике.

Почему scikit-learn - идеальный старт

scikit-learn - это не просто библиотека. Это как набор отвёрток, гаечных ключей и мультитула, собранных специально для машинного обучения. Он простой, документированный, стабильный и работает почти на всех данных, с которыми вы столкнётесь на старте.

Он не пытается быть «умнее» других. Он просто делает свою работу чисто и предсказуемо. Для линейной регрессии вам не нужно понимать градиентный спуск, не нужно настраивать нейронные сети. Достаточно импортировать, загрузить данные, обучить модель - и получить результат.

scikit-learn не требует GPU, не требует тонны памяти. Он работает даже на старом ноутбуке. И это делает его идеальным выбором для тех, кто только начинает.

Шаг за шагом: как построить модель на Python

Всё начинается с установки. Если ещё не установили - запустите в терминале:

pip install scikit-learn pandas matplotlib

Теперь возьмём реальные данные. Допустим, у нас есть таблица с характеристиками домов: площадь, количество комнат, год постройки и цена. Мы хотим предсказать цену по остальным параметрам.

Вот как это выглядит в коде:

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error
import matplotlib.pyplot as plt

# Загружаем данные
# Предположим, у нас есть CSV-файл с колонками: 'area', 'rooms', 'year', 'price'
data = pd.read_csv('houses.csv')

# Выбираем признаки и целевую переменную
X = data[['area', 'rooms', 'year']]  # входы
y = data['price']                   # что хотим предсказать

# Разделяем данные на обучение и тест
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Создаём модель
model = LinearRegression()

# Обучаем модель
model.fit(X_train, y_train)

# Делаем предсказания
y_pred = model.predict(X_test)

# Считаем ошибку
mae = mean_absolute_error(y_test, y_pred)
print(f"Средняя ошибка предсказания: {mae:.0f} рублей")

Запускаете - и получаете, например: Средняя ошибка предсказания: 85 000 рублей. Это значит, что в среднем модель ошибается на 85 тысяч при предсказании цены дома. Не идеально, но для начала - вполне неплохо.

Что показывают коэффициенты модели

После обучения модель хранит свои коэффициенты. Их можно посмотреть так:

print("Коэффициенты:", model.coef_)
print("Свободный член:", model.intercept_)

Допустим, вывод такой:

  • Коэффициенты: [12 500, 350 000, -2 000]
  • Свободный член: 500 000

Это значит:

  • За каждый дополнительный квадратный метр цена растёт на 12 500 рублей.
  • Каждая дополнительная комната добавляет 350 000 рублей к цене.
  • Каждый год старше дома - минус 2 000 рублей (старые дома дешевле).
  • Дом площадью 0 м², без комнат, построенный в 0 году - стоил бы 500 000 рублей (это просто математическая точка отсчёта).

Такие коэффициенты - это не просто цифры. Это интерпретируемый результат. Вы можете объяснить клиенту, почему его дом подорожал, или почему соседний район дешевле. Такого не скажешь про нейросеть, которая работает как чёрный ящик.

Трёхмерная визуализация множественной линейной регрессии с данными о ценах домов

Как понять, хороша ли ваша модель

Ошибка в 85 тысяч - это много или мало? Зависит от контекста. Если средняя цена дома у вас 3 миллиона - значит, ошибка 85 тысяч - это около 3%. Это отлично. Если средняя цена - 200 тысяч - тогда это катастрофа.

Есть три основных метрики, которые стоит смотреть:

  1. MAE (Mean Absolute Error) - средняя абсолютная ошибка. Просто и понятно: на сколько рублей в среднем модель ошибается.
  2. R² (коэффициент детерминации) - показывает, какую долю вариации целевой переменной модель объясняет. От 0 до 1. Чем ближе к 1 - тем лучше. 0.7 - уже хорошо, 0.85 - отлично.
  3. RMSE (Root Mean Squared Error) - похожа на MAE, но больше штрафует большие ошибки. Полезна, если вам важно избегать грубых просчётов.

Вот как посчитать R²:

from sklearn.metrics import r2_score
r2 = r2_score(y_test, y_pred)
print(f"R² = {r2:.3f}")

Если у вас R² = 0.82 - значит, модель объясняет 82% разницы в ценах. Это сильный результат для линейной модели.

Что ломает линейную регрессию

Линейная регрессия - не панацея. Она работает хорошо, если:

  • Связь между переменными примерно прямолинейна
  • Нет сильных выбросов (например, дом за 50 млн, когда все остальные - до 3 млн)
  • Признаки не сильно коррелируют друг с другом (это называется мультиколлинеарность)

Если у вас есть два признака, которые почти одно и то же - например, «площадь» и «количество комнат» - модель может начать «глючить». Она не поймёт, кто из них на самом деле влияет на цену. Решение - убрать один из них или использовать регуляризацию (Ridge или Lasso).

Выбросы - ещё одна боль. Одна квартира за 10 млн может исказить всю линию. Лучше сначала построить график - посмотреть, есть ли аномалии. scikit-learn позволяет легко выкинуть выбросы с помощью IQR (межквартильного размаха).

Что дальше? Регуляризация и Lasso/Ridge

Если у вас много признаков, или они коррелируют - используйте Ridge или Lasso регрессию. Они добавляют штраф за сложность модели, чтобы не переобучаться.

Вот как заменить обычную регрессию на Ridge:

from sklearn.linear_model import Ridge

model = Ridge(alpha=1.0)  # alpha - сила штрафа
model.fit(X_train, y_train)

Alpha - это параметр, который вы настраиваете. Маленький (0.1) - почти как обычный. Большой (10) - сильно упрощает модель. Лучше перебрать несколько значений с помощью GridSearchCV.

Lasso, в отличие от Ridge, может вообще обнулить коэффициенты. Это полезно, если вы хотите отобрать самые важные признаки. Например, если у вас 20 переменных, а только 5 действительно влияют - Lasso их найдёт.

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

Простой пример: как предсказать цену на бензин

Представьте, что у вас есть данные о цене на бензин за последние 6 месяцев: средняя температура, курс доллара, цена на нефть, количество дней до праздников.

Вы запускаете модель - и получаете, что:

  • Каждый градус выше - цена падает на 0.8 рубля
  • Каждый рубль роста курса доллара - цена растёт на 2.3 рубля
  • Цена на нефть - самый сильный фактор

Это не просто предсказание. Это понимание. Вы можете сказать: "Если доллар вырастет на 5 рублей, бензин подорожает на 11,5 рублей" - и это будет правдой, основанной на данных.

Сравнение моделей: что лучше - линейная регрессия или что-то сложнее?

Многие думают: "Если я использую нейросеть, я буду умнее". Но это не так.

Линейная регрессия:

  • Обучается за секунды
  • Легко объяснить клиенту
  • Не требует больших данных
  • Не ломается при малом объёме

Градиентный бустинг (XGBoost, LightGBM):

  • Точнее на больших данных
  • Сложно объяснить
  • Требует тонкой настройки
  • Может переобучиться на шуме

На практике, в 60-70% случаев линейная модель работает не хуже, чем сложные алгоритмы - и при этом её можно развернуть в продакшен за час. А если вы работаете в банке, страховой компании или государственном секторе - вам именно это и нужно: прозрачность и объяснимость.

Практические советы от реальных проектов

  • Всегда визуализируйте: постройте график «реальные цены vs предсказанные». Увидите, где модель ошибается чаще всего.
  • Проверяйте остатки (разницу между реальным и предсказанным). Если они не случайны - значит, модель упускает что-то важное.
  • Не бойтесь удалять признаки. Иногда 3 хороших переменных лучше, чем 10 плохих.
  • Используйте cross_val_score для проверки устойчивости модели. Одного разбиения на train/test недостаточно.
  • Если данные временные - не перемешивайте их. Учитесь на прошлом, проверяйте на будущем. Иначе вы просто угадываете.

Один из моих знакомых в Казани использовал линейную регрессию, чтобы предсказать, сколько бензина купят на АЗС в зависимости от погоды и дня недели. Он сэкономил 15% на хранении топлива - просто потому, что понял, когда и зачем люди заправляются.

Можно ли использовать линейную регрессию для классификации?

Нет, линейная регрессия предназначена для предсказания чисел, а не категорий. Если вы хотите определить, купит человек товар или нет - это задача классификации. Для этого используйте логистическую регрессию (LogisticRegression в scikit-learn). Она похожа, но выдаёт вероятность, а не число.

Нужно ли нормализовать данные для линейной регрессии?

Не обязательно. scikit-learn сам справляется с разными масштабами. Но если вы используете регуляризацию (Ridge, Lasso), то нормализация помогает. Используйте StandardScaler - это улучшит стабильность обучения.

Что делать, если модель плохо работает на новых данных?

Это называется переобучением. Проверьте: 1) Слишком много признаков? Уберите лишние. 2) Мало данных? Добавьте больше. 3) Есть выбросы? Почистите их. 4) Используйте кросс-валидацию. 5) Попробуйте Ridge или Lasso - они уменьшают сложность модели.

Как понять, какие признаки важнее?

Посмотрите на абсолютные значения коэффициентов модели. Но учтите: если признаки измеряются в разных единицах (например, площадь в м², а возраст в годах), сравнение может быть обманчивым. Лучше нормализуйте данные перед обучением, тогда коэффициенты будут сравнимы.

Сколько данных нужно для линейной регрессии?

Минимум - 10-20 наблюдений на каждый признак. То есть, если у вас 5 переменных - нужно хотя бы 100 строк данных. Для стабильных результатов лучше 200-500. Меньше - модель будет неустойчивой и не будет обобщать.

Линейная регрессия - не самая зрелищная тема в машинном обучении. Но она - основа. Как счёт в уме перед тем, как брать калькулятор. Понимая её, вы перестаёте бояться данных. Вы начинаете видеть, как числа говорят о реальном мире. И это - настоящая сила.