Алгоритмы машинного обучения: полный гид по выбору
Представь: ты открываешь вакансию на должность ML-инженера и видишь в требованиях «опыт работы с XGBoost, Random Forest, SVM». Или на собеседовании спрашивают «какой алгоритм выбрали бы для задачи регрессии?». Знакомо?
За 10 лет работы data scientist я сотни раз наблюдал одну и ту же картину: люди прекрасно знают, что такое машинное обучение в теории, но буквально впадают в ступор, когда нужно выбрать конкретный алгоритм для реальной задачи. Они видели десятки формул, писали лабораторные в Jupyter, но интуиции выбора — нет.
Этот пробел я и хочу закрыть. За 17 минут (столько длится оригинальное видео, которое стало основой этого поста) мы пройдёмся по всем ключевым алгоритмам ML и главное — получим стратегию выбора.
Что такое машинное обучение
Начнём с определения, потому что без него дальше будет сложнее. По Wikipedia, машинное обучение — это область исследований в области искусственного интеллекта, занимающаяся разработкой и изучением статистических алгоритмов, которые могут учиться на данных и обобщать на неизвестные данные, и таким образом выполнять задачи без явных инструкций.
Если перевести на человеческий: вам не нужно писать правила «если X, то Y». Вместо этого вы показываете алгоритму примеры (данные), он находит паттерны сам, а потом применяет их к новым ситуациям.
Большая часть последних достижений в области ИИ — от ChatGPT до генерации изображений — обусловлена нейросетями. Но нейросети это не магия и не единственный инструмент. Это один из инструментов в большом ящике, и для многих задач он далеко не оптимальный выбор.
Два типа обучения: с учителем и без
Весь ML делится на две большие области. Понимание этого деления снимает 50% вопросов о выборе алгоритма.
Обучение с учителем (Supervised Learning) — это когда у вас есть набор данных, где вы знаете правильные ответы (их называют лейблы или метки). Вы показываете алгоритму: вот входные данные, вот правильный ответ. Он учится воспроизводить это соответствие. После обучения вы даёте ему новые данные без ответов и ожидаете, что он предскажет правильно.
Классические примеры: предсказать цену дома по его характеристикам (площадь, локация, год постройки) или определить, спам ли письмо, based on its content and sender.
Обучение без учителя (Unsupervised Learning) — это когда правильных ответов нет. Алгоритм сам ищет структуру в данных. Никаких лейблов, никакой «правильной» группы — только сырые данные и ваша задача что-то в них найти.
Пример: взять все ваши письма и разложить по группам (кластерам), которые алгоритм посчитает похожими. Вы потом сами решаете, что эти группы означают — может, это «работа», «личное», «магазины».
Регрессия: предсказываем числа
Когда нужно предсказать непрерывную числовую величину — это регрессия. Цена дома, температура завтра, количество продаж.
Линейная регрессия — мать всех ML-алгоритмов. Идея до неприличия проста: найти линию, которая лучше всего описывает зависимость между входом и выходом. «Для каждой единицы увеличения площади дома цена растёт на X».
В реальности редко всё сводится к одной переменной. Добавляете пол, возраст, этническую принадлежность — и модель становится многомерной. Но принцип тот же: минимизируем расстояние от точек до линии (или гиперплоскости в многомерном случае).
Многие продвинутые алгоритмы, включая нейросети, — это по сути расширения этой простой идеи. Линейная регрессия это фундамент, на котором всё стоит.
Классификация: относим к категориям
Когда нужно отнести объект к одной из нескольких категорий — это классификация. Спам/не спам. Кот/собака. Буква A/B/C на изображении.
Логистическая регрессия (название сбивает с толку — это именно классификация) вместо линии строит так называемую сигмоидную функцию. Она предсказывает не число, а вероятность принадлежности к классу.
На практике это выглядит так: «человек ростом 180 см и весом 75 кг — мужчина с вероятностью 80%». Никакой магии, просто вероятностная оценка.
Метод K ближайших соседей (KNN) — один из самых интуитивных алгоритмов. Для новой точки вы смотрите на K ближайших к ней уже известных точек и берёте усреднённый ответ. Ближайших в каком пространстве? В пространстве признаков — тех самых входных переменных.
В классификации это выглядит так: «определим пол человека по росту и весу — посмотрим на 5 ближайших по этим параметрам и возьмём большинство». В регрессии: «вес человека будет средним весом троих ближайших в пространстве роста и обхвата груди».
Звучит просто, но работает удивительно хорошо для задач, где зависимости сложнее линейных. Главный подвох — выбрать правильное K. Слишком маленькое (1-2) ведёт к переобучению (модель идеально запоминает тренировочные данные, но плохо работает на новых). Слишком большое (1000) — к недообучению (модель слишком грубая). Правильный K находится где-то посередине и зависит от задачи.
Метод опорных векторов (SVM) рисует границу решения между классами так, чтобы максимизировать зазор (margin) между ними. Грубо говоря, не просто провести линию между кошками и слонами, а найти такую линию, которая оставляет максимальное пространство с каждой стороны.
Крутое свойство SVM — так называемые kernel functions (функции ядра). Они позволяют превращать исходные признаки в новые, более сложные, и строить очень замысловатые границы решения. Это называется kernel trick, и это один из способов, которым SVM обходит линейные модели.
Наивный Байес получает своё название от теоремы Байеса. Представьте спам-фильтр: вы считаете, как часто разные слова встречаются в спаме и в нормальных письмах, а потом для нового письма перемножаете вероятности всех его слов. Получается вероятность того, что письмо спам.
«Наивным» его называют, потому что он предполагает, что вероятности слов независимы друг от друга (что, конечно, неправда — слова связаны). Но для многих задач, особенно текстовой классификации, это приближение работает неплохо и считается очень быстро.
Деревья решений и ансамбли
Дерево решений — это последовательность вопросов с ответами «да»/«нет», которые разбивают данные на группы. «Рост > 170? Да → следующий вопрос: вес > 80? Нет → класс: среднее телосложение».
Главная цель при построении дерева — сделать листья (конечные группы) как можно «чище», то есть чтобы в каждом листе было как можно меньше объектов не того класса.
Само по себе дерево решений — слабый алгоритм. Но если объединить много деревьев вместе, получается мощная штука. Это называется ансамблевые методы.
Random Forest (случайный лес) — это множество деревьев, каждое из которых обучено на случайном подмножестве данных и использует случайное подмножество признаков. Все деревья голосуют, и победителя выбирает большинство.
Случайность в выборе признаков не даёт деревьям сильно коррелировать друг с другом, что делает ансамбль устойчивым и снижает переобучение. Random Forest — один из самых надёжных алгоритмов для старта: почти всегда выдаёт хороший результат и не требует тонкой настройки.
Бустинг — другой подход к ансамблям. Вместо того чтобы строить деревья параллельно, он делает это последовательно. Каждое новое дерево фокусируется на ошибках предыдущего и пытается их исправить. Получается «сильная модель» из последовательности слабых.
Известные реализации: AdaBoost, Gradient Boosting, XGBoost. Последний стал стандартом де-факто в соревнованиях по анализу данных и часто выигрывает на табличных задачах. Бустинг может достигать более высокой точности, чем Random Forest, но из-за последовательной природы обучается медленнее и чаще переобучается.
Нейросети: когда нужно автоматически извлекать признаки
До сих пор мы предполагали, что признаки (фичи) для модели нам известны и мы просто передаём их алгоритму. Но что, если сами признаки неизвестны или их слишком сложно выразить в числах?
Класческий пример — распознавание цифр. Написаная от руки цифра «1» каждый раз выглядит по-разному: разные пиксели, разные углы наклона, разная толщина линии. Как явно выразить это в признаках? Никак.
Идея нейросетей: вместо того чтобы самим придумывать признаки, позволить модели автоматически их извлекать. Делается это через скрытые слои — промежуточные переменные между входом и выходом.
В простейшем виде (однослойный персептрон) это просто многомерная логистическая регрессия. Но если добавить скрытый слой, получается следующее: модель сначала пытается предсказать некоторые скрытые признаки по входным данным, а потом по этим скрытым признакам — финальный ответ.
В примере с цифрами: скрытый признак может соответствовать «наличию горизонтальной линии» — и модель научится его выделять автоматически, хотя мы ей никогда не говорили, что это «горизонтальная линия».
Добавьте ещё слоёв — и это уже deep learning. Глубокие сети могут выделять очень сложные абстракции — грани, текстуры, формы, лица. Что именно выучит конкретный нейрон, мы обычно не знаем. Но мы знаем, что это работает.
Кластеризация: ищем группы без учителя
Когда меток нет и нужно найти структуру данных — на помощь приходит кластеризация.
K-means — самый известный алгоритм кластеризации. K — это количество кластеров, которое вы задаёте заранее. Алгоритм работает так: случайно выбираете K центроидов, относите все точки к ближайшему, пересчитываете центроиды как среднее по кластеру, повторяете до стабилизации.
Визуально это выглядит как точки, которые постепенно «собираются» в группы вокруг движущихся центров.
Важный нюанс: K-means находит кластеры любой формы, но требует заранее знать их количество. Альтернативы вроде иерархической кластеризации или DBSCAN позволяют обойтись без этого, но здесь останавливаться не будем.
Понижение размерности: сжимаем признаки
Иногда признаков слишком много, и это создаёт проблемы: шум, переобучение, медленная работа. Понижение размерности решает эту проблему, находя более компактное представление данных.
PCA (метод главных компонент) находит направления максимальной вариации в данных. Первый главный компонент — это направление, вдоль которого данные разбросаны больше всего. Второй — ортогонален первому и объясняет оставшуюся дисперсию. Берём первые N компонент — и получаем данные в сжатом пространстве.
Пример: предсказываем тип рыбы по длине, высоте, цвету и количеству зубов. Если длина и высота сильно коррелируют, нет смысла держать оба признака. PCA объединит их в один «размер» и уберёт лишнее.
Как выбрать алгоритм: практическая стратегия
Теперь самое важное — как применить всё это на практике.
Первый вопрос: есть ли у вас лейблы? Если да — supervised learning, если нет — unsupervised.
Для регрессии (предсказать число) начните с линейной регрессии. Если точность недостаточная — попробуйте Random Forest или XGBoost.
Для классификации (предсказать категорию) разумный старт — логистическая регрессия или Random Forest. Если данные сложные и признаков много — попробуйте SVM с kernel или нейросеть.
Для кластеризации (найти группы) — K-means, если знаете количество групп, или иерархическую кластеризацию/DBSCAN, если не знаете.
Для понижения размерности — PCA.
Если не знаете, с чего начать, — Random Forest это лучший универсальный старт. Он редко бывает худшим вариантом и часто близок к оптимальному без какой-либо настройки.
Часто задаваемые вопросы
Когда использовать нейросеть, а когда классические алгоритмы?
Нейросети имеют смысл, когда признаки сложно выразить явно (изображения, звук, текст) или когда данных очень много. Для табличных данных с понятными признаками классические алгоритмы часто работают не хуже при значительно меньших вычислительных затратах. Если у вас 10 тысяч строк и 20 признаков — начните с XGBoost.
Почему Random Forest так популярен?
Он прощает ошибки, почти не переобучается при правильном количестве деревьев, не требует нормализации данных, работает с категориальными признаками и даёт оценку важности признаков «из коробки». Это универсальный инструмент, который хорош в качестве первого приближения и часто достаточно хорош для продакшена.
Что такое переобучение и как его избежать?
Переобучение — это когда модель идеально запоминает тренировочные данные, но плохо работает на новых. Признаки: на тренировочных данных точность 99%, на тестовых 60%. Борьба: больше данных, регуляризация, уменьшение сложности модели, кросс-валидация, ансамбли (особенно Random Forest с его случайным выбором признаков).
Когда использовать XGBoost, а когда Random Forest?
XGBoost обычно точнее на хорошо подготовленных данных с правильно подобранными гиперпараметрами. Random Forest более устойчив и требует меньше настройки. Если есть время на оптимизацию — XGBoost может выиграть. Если нужен быстрый рабочий результат — Random Forest.
Итог
Машинное обучение это не один алгоритм, а набор инструментов для разных ситуаций. Линейная регрессия и нейросеть решают разные задачи и работают в разных условиях.
Ключ к выбору — понять, какой тип задачи перед вами: регрессия или классификация, есть ли лейблы, сколько у вас данных, насколько сложны признаки. Дальше всё сводится к списку из 5-7 алгоритмов, где вы пробуете 2-3 и выбираете лучший.
Не пытайтесь запомнить все детали каждого алгоритма. Достаточно понимать, что каждый из них делает и когда его применять. А детали — документация и опыт подскажут.
Если хотите визуальную шпаргалку по выбору алгоритма — Tim рекомендует cheat sheet от scikit-learn. Это отправная точка, которая сэкономит много времени на первых порах.