$ cat toc.txt

Каждый раз, когда ChatGPT делает что-то умное, заголовки кричат про «революцию нейросетей». И возникает обманчивое впечатление, что старые алгоритмы — линейная регрессия, решающие деревья — это вчерашний день, музей ML. Но зайдите в любой банк, страховую компанию или e-commerce, посмотрите, что реально предсказывает отток клиентов, оценивает кредитный риск или ранжирует товары в выдаче. С вероятностью 80% там работает не LLM, а градиентный бустинг — алгоритм, которому в этом году исполняется 22 года.

Эта статья — про классическое машинное обучение: алгоритмы, которые были до нейросетей и никуда не ушли. Мы разберём их не через формулы, а через одну общую метафору: подгонку. Все эти методы делают одно и то же — подгоняют модель под данные, — но подгоняют по-разному, и именно способ подгонки определяет, где алгоритм силён, а где беспомощен.

1. Главная идея: подобрать функцию

Машинное обучение, в самом грубом приближении, сводится к одной задаче. У вас есть данные (наблюдения) и вы хотите подобрать функцию, которая по входам предсказывает выход. Входы — это признаки (возраст, доход, количество покупок); выход — то, что нужно предсказать (вернёт ли клиент кредит, купит ли товар).

1
2
3
4
# входы X → выход y
X = [возраст, доход, стаж]    # признаки
y = вернёт_кредит?            # что предсказываем
f(X) ≈ y                     # подбираем f

Разница между алгоритмами — в том, каким семейством функций мы разрешаем быть f, и как ищем лучшую в этом семействе. От ответов на эти два вопроса и рождаются регрессии, деревья и нейросети.

2. Линейная регрессия: провести прямую

Самый старый житель города. Идея настолько проста, что её знали ещё Гаусс и Лежандр в начале XIX века: представьте, что f — это прямая линия. Подберите её наклон и смещение так, чтобы она прошла как можно ближе ко всем точкам данных.

«Как можно ближе» — это функция потерь: сумма квадратов вертикальных отклонений от точек до прямой. Минимизируем её — получаем оптимальные коэффициенты. Алгоритм, который это делает, называется градиентным спуском: маленькими шагами двигаем коэффициенты в сторону уменьшения ошибки.

1
2
y = w1·возраст + w2·доход + w3·стаж + b
# веса w1, w2, w3 и смещение b подбираются градиентным спуском

Где работает. Прогноз продаж, оценка стоимости недвижимости, любая задача «число по числам», где связь между признаками и ответом примерно линейна. Интерпретируема как ничто другое: коэффициент w2 = 0.3 буквально значит «каждый дополнительный рубль дохода повышает предсказанный ответ на 0.3».

Где ломается. Когда зависимость нелинейна. Если ответ зависит от произведения признаков, от их взаимодействия, от порога («доход выше 100к — совсем другая история») — прямая линия не опишет это, и линейная регрессия промахнётся систематически. Тут нужна либо нелинейная модель, либо ручная генерация признаков.

3. Логистическая регрессия: регрессия, которая классифицирует

Название сбивает с толку: это не «регрессия» в смысле «предсказать число», а классификатор. Идея та же — линейная комбинация признаков, — но результат пропускается через сигмоиду: функцию, которая сжимает любое число в интервал (0, 1).

z = w1·возраст + w2·доход + ...
p = 1 / (1 + e^(-z))     # сигмоида, p ∈ (0,1)
# p трактуется как вероятность класса «да»

Порог 0.5 делит ответы на «да/нет». Но важна не сама бинарность, а что p — это калиброванная вероятность: если модель говорит «80%», то примерно в 80 случаях из 100 такой клиент действительно вернёт кредит. Поэтому логрег до сих пор — стандарт в задачах, где нужна не просто классификация, а именно оценка вероятности: риск-модели, скоринг, медицинская диагностика.

Главное преимущество — интерпретируемость. В отличие от нейросети, в логреге всегда видно, какой признак и насколько влияет на ответ. Регулятор в банке может спросить «почему отказано в кредите?» — и вы покажете: потому что доход × w_доход + просрочки × w_просрочки дали p < 0.3. С LLM такого не объяснишь.

4. Решающее дерево: серия вопросов

Если линейная регрессия — это «подобрать формулу», то решающее дерево — это «задавать вопросы по одному». Представьте игру «данетки»: вы хотите угадать животное, задавая вопросы «оно больше кошки?», «у него есть перья?». Каждый вопрос делит варианты пополам, и через 5–10 вопросов остаётся один ответ.

Дерево делает буквально это. На каждом узле оно выбирает признак и порог, которые лучше всего разделяют данные («возраст > 30?» делит чище, чем «вес > 70?»). Рекурсивно разбивает, пока в листьях не останутся почти однородные группы. Обучение — это поиск оптимальных порогов; инференс — спуск по дереву от корня к листу.

            [возраст > 30?]
           /              \
        да                 нет
        |                   |
   [доход > 80k?]      → класс A
   /          \
 да            нет
  |             |
→ класс B    → класс C

Плюсы. Естественно ловит нелинейности и взаимодействия (в одной ветке важен возраст, в другой — доход). Интерпретируемо («если возраст > 30 и доход > 80, то класс B»). Работает с категориальными признаками без кодирования.

Минусы. Одно дерево легко переобучается — запоминает конкретные данные, теряя обобщение. Дерево, обученное на 90% данных, может сильно отличаться от дерева на других 90%. Это нестабильность, и именно она привела к идее ансамблей.

5. Случайный лес: мудрость толпы деревьев

Если одно дерево капризно — давайте построим много. Случайный лес обучает сотни деревьев, каждое на случайном подмножестве данных (bootstrap) и случайном подмножестве признаков. Итог — голосование: для классификации большинство, для регрессии — среднее.

Идея глубже, чем кажется. Каждое дерево по-своему ошибается (оно видело свои данные, свои признаки). Но если ошибки деревьев независимы, то при голосовании они компенсируют друг друга — как если бы вы спросили 500 экспертов и усреднили: шум взаимно уничтожается, сигнал остаётся. Это тот же принцип, что в теории информации: усреднение независимых наблюдений снижает энтропию ошибки.

Где хорош. «Из коробки» даёт достойный результат почти на любой табличной задаче. Устойчив к переобучению (для этого и придуман), не требует масштабирования признаков, ловит нелинейности. Долгое время был «базовой линией» в любой новой задаче.

6. Градиентный бустинг: деревья, исправляющие друг друга

Если случайный лес — деревья, работающие независимо и голосующие, то бустинг — деревья, работающие последовательно, где каждое исправляет ошибки предыдущих. Это различие фундаментально.

Механика. Первое дерево учится на данных и предсказывает с ошибкой. Второе дерево учится предсказывать эту ошибку (точнее, её градиент — направление уменьшения). Третье учится на ошибке уже композиции первых двух. И так далее. Каждое следующее дерево — это поправка, добавляемая к сумме.

F_0 = среднее(y)                          # простейший старт
F_1 = F_0 + α·дерево_1(данные → ошибка_0)
F_2 = F_1 + α·дерево_2(данные → ошибка_1)
...
F_n = F_0 + α·Σ дерево_i                  # финальная модель

Здесь α — learning rate, маленький шаг (0.01–0.1), который не даёт последующим деревьям «заглушить» предыдущие. Бустинг чувствителен к гиперпараметрам (число деревьев, глубина, learning rate), и его легко переобучить — но при правильной настройке он бьёт всё остальное на табличных данных.

Почему именно он — король таблиц. На изображениях и тексте правят нейросети: там признаковое пространство огромное и неструктурированное, нужна «глубина». Но на табличных данных (столбцы в CSV) признаков мало, они уже осмысленны (возраст, доход), и ценность не в «извлечении признаков», а в тонком взаимодействии между ними. Бустинг ловит эти взаимодействия через деревья и исправляет ошибки через последовательность — это сочетание оказывается оптимальным. Именно поэтому XGBoost, LightGBM, CatBoost доминируют в Kaggle-соревнованиях на табличных данных.

7. Когда классика, а когда нейросети

Это вопрос, который задают чаще всего, и ответ на него — инженерный, а не модный.

КритерийКлассическое MLНейросети / LLM
Данные табличные✅ бустинг — лучший выбор❌ чаще проигрывает
Данные — текст/картинки❌ плохо (нужны признаки руками)✅ нейросети (CNN, Transformer)
Мало данных (< 10k строк)✅ классика стабильнее❌ нейросеть переобучится
Нужна интерпретируемость✅ логрег/дерево объяснимы❌ чёрный ящик
Инференс на CPU/edge✅ миллисекунды❌ тяжёлые, нужен GPU
Связи простые/линейные✅ логрег даст максимум⚠️ избыточно

Правило большого пальца: начинайте с простого. Логистическая регрессия как baseline → если не хватает качества, поднимайтесь до случайного леса → если всё ещё мало, бустинг. И только когда вы на табличных данных упрётесь в потолок бустинга — имеет смысл думать о нейросетях. Чаще всего не упрётесь.

8. Почему это всё ещё важно для self-hosting и инженеров

Если вы работаете с инфраструктурой, у вас регулярно появляются задачи, где классическое ML — правильный инструмент, а не «модная» нейросеть.

Аналитика и мониторинг. Та же observability, о которой мы говорили в статье про Шеннона, часто строится на классических методах: PCA для снижения размерности метрик, k-means для кластеризации аномалий, изоляционный лес для детекции выбросов. Это лёгкие, быстрые модели, которые можно держать прямо в пайплайне мониторинга, без GPU и без облачных API.

Предсказание нагрузки. Прогноз трафика, потребления ресурсов, времени отклика — это временные ряды, и лучшим решением часто оказывается не «LSTM-нейросеть», а простая линейная регрессия с сезонными признаками или Prophet (тоже статистическая модель). Прозрачно, дёшево, легко деплоится.

Скрининг и валидация. Если у вас есть поток логов и нужно отсеивать подозрительные события — логрег с TF-IDF-признаками отработает за миллисекунды на CPU и будет объяснимым. Поднять для этого LLM — это как забивать гвозди микроскопом: дорого, медленно и непрозрачно.

Уважение к инструментам. Главное, что даёт знание классики — понимание, что «новее» не значит «лучше». У каждого алгоритма своя ниша. Инженер, который достаёт LLM там, где хватило бы логрега, либо тратит лишние деньги своей компании, либо украшает резюме модными словами. Хороший инженер выбирает инструмент под задачу, а не задачу под модный инструмент.

Заключение

Классическое машинное обучение — не музей. Это фундамент, на котором стоит весь AI, и в половине продакшн-задач именно классика остаётся лучшим решением. Линейная и логистическая регрессия, решающие деревья, случайный лес, градиентный бустинг — пять алгоритмов, каждый из которых отвечает на вопрос «как подобрать функцию под данные» своим способом.

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

В следующей статье серии мы спустимся в нейросети и разберём, как свёрточные сети научились «видеть» изображения — почему свёртка оказалась тем приёмом, который сделал возможным компьютерное зрение.

← все посты [поделиться] [rss]