🏢 Ситуация
Логистика Datacore жалуется: стоимость доставки для клиента считается «средним тарифом по городу», и компания теряет деньги на дальних и тяжёлых заказах.
Лена:
«Твоя первая модель! Есть история: 80 000 доставок с фактической стоимостью. Признаки — вес, габариты, расстояние, город, срочность. Начни с линейной регрессии. Да, все хотят сразу нейросети, но правило команды: сначала простой бейзлайн. Если линейная модель даст MAE меньше 60 ₽ — уже сэкономим миллионы. И будь готов объяснить Максу, откуда модель берёт цифру: с "чёрным ящиком" финансы не согласуют.»
🎯 Ваша задача
- Понять, как работает линейная регрессия и градиентный спуск.
- Обучить модель в scikit-learn, оценить качество через MAE/RMSE.
- Интерпретировать коэффициенты для бизнеса.
📚 Теория
Линейная регрессия
Модель предсказывает число как взвешенную сумму признаков:
Обучение — подбор весов w, минимизирующих ошибку на исторических данных. Классическая функция потерь — MSE (средний квадрат ошибки).
Градиентный спуск — как модель «учится»
Это ядро почти всего ML, включая нейросети (Andrew Ng посвящает этому первую неделю курса):
- Начинаем со случайных весов.
- Считаем ошибку на данных.
- Считаем градиент — направление наискорейшего роста ошибки.
- Делаем шаг против градиента:
w = w − α·∇L, гдеα— learning rate. - Повторяем до сходимости.
- α слишком большой → перепрыгиваем минимум, ошибка скачет/растёт.
- α слишком маленький → учимся вечность.
Масштабирование признаков
Вес посылки: 0.1–50 кг. Расстояние: 1–9000 км. При таких разных масштабах градиентный спуск сходится плохо, а коэффициенты несравнимы. Решение — стандартизация: x' = (x − mean) / std (StandardScaler).
Метрики регрессии
| Метрика | Формула (суть) | Особенность |
|---|---|---|
| MAE | среднее |y − ŷ| | в тех же единицах (₽), устойчива к выбросам, понятна бизнесу |
| RMSE | корень из среднего (y − ŷ)² | сильнее штрафует большие ошибки |
| R² | доля объяснённой дисперсии | 1 — идеал, 0 — не лучше среднего |
Если RMSE ≫ MAE — есть отдельные большие промахи, стоит их исследовать.
Train/test split — священное правило
Качество меряют на данных, которые модель не видела при обучении. Иначе вы измеряете память, а не обобщение.