Базовые методы искусственного интеллекта в физических исследованиях

Добро пожаловать!

Эта книга предназначена для физиков, студентов и всех, кто интересуется применением методов машинного обучения в физических исследованиях.

Зачем это нужно?

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

Методы машинного обучения позволяют нам:

  • Находить закономерности в больших наборах данных
  • Классифицировать физические объекты и явления
  • Предсказывать поведение систем на основе известных данных
  • Оптимизировать экспериментальные установки и процессы

Что вы найдёте в этой книге

Эта книга структурирована так, чтобы вы постепенно, от простого к сложному, овладели основными методами машинного обучения:

  1. Теория — мы разберёмся в математике и интуиции за каждым методом
  2. Практика — вы реализуете алгоритмы самостоятельно, чтобы действительно их понять

Важное замечание

Эта книга не требует глубокого знания машинного обучения. Мы предполагаем, что вы:

  • Знакомы с математикой на уровне старших курсов физического факультета
  • Умеете программировать хотя бы на базовом уровне
  • Готовы экспериментировать и искать решения

Главное — понимание. Мы не просто будем давать готовые рецепты, а будем разбираться, почему методы работают так, а не иначе.


Давайте начнём этот путь вместе. Машинное обучение — это мощный инструмент, который каждый физик должен иметь в своём арсенале.

О себе

Меня зовут Федоров Вячеслав Васильевич, я разработчик программного обеспечения с глубокими знаниями в области физики и вычислительной математики. На протяжении нескольких лет я работаю в Институте ядерной физики им. Будкера, где занимаюсь разработкой наукоемкого прикладного программного обеспечения на языках высокого уровня Python и C++ для решения различных задач. Моя основная работа сосредоточена на моделировании динамики заряженных частиц в сложных электромагнитных полях, а также на внедрении алгоритмов машинного обучения для оптимизации и настройки ускорительных комплексов.

Мой опыт также включает работу в международной компании по разработке ПО и веб-приложений SIBERS, где я руководил командой разработчиков в создании ПО на основе микросервисной архитектуры для государственной организации, оказывающей финансовые услуги. Я активно участвовал в разработке дополнительных модулей для статического анализа кода для различных сред разработки, а также был ведущим разработчиком приложения для врачей, предназначенного для распознавания и присвоения кодов болезней в медицинских картах пациентов с использованием бессерверных вычислений и алгоритмов машинного обучения. Я внедрял процессы автоматизированного тестирования, непрерывной интеграции и доставки кода, проводил обзор и оценку кода, а также подготовил и прочитал полугодовой обучающий курс «Микросервисные масштабируемые веб-сайты» для команды.

Ранее я принимал участие в проектах Роскосмоса, в том числе в разработке ПО на языке C++ для инфракрасного датчика горизонта с использованием платформы Arduino для сверхмалого космического аппарата НГУ «Норби», успешный запуск которого состоялся в 2020 году.

У меня есть диплом бакалавра НГУ в области физики пучков заряженных частиц и физики ускорителей. Я прошёл курсы повышения квалификации по разработке и эксплуатации ПО на Python и C++, алгоритмам и структурам данных, системному администрированию и обеспечению надёжности информационных систем от «Образовательных технологий Яндекса», а также основы искусственного интеллекта и машинного обучения от НГУ.

Мои технические навыки включают: отличное владение языками программирования Python и C++, разнообразными фреймворками; работу с асинхронным и параллельным кодом; проектирование ПО, веб-приложений и микросервисов; создание документации; работу с реляционными базами данных и NoSQL-хранилищами; управление очередями сообщений и задач; владение методологиями непрерывной интеграции и доставки кода, автоматизации процессов сборки, настройки и развёртывания ПО. Мой опыт позволяет ускорять процессы производства IT-продуктов за счёт поиска и устранения «узких» мест, автоматизировать процесс разработки и развёртывания приложений, контейнеризировать приложения и размещать их в облачных сервисах. Я использую актуальные инструменты для обеспечения качества, скорости и стабильности приложений, управляю инфраструктурой в парадигме Infrastructure as Code, сокращая время команды на развёртывание и масштабирование, а также налаживаю коммуникацию между участниками процесса разработки продукта: службой эксплуатации, разработчиками, заказчиками от бизнеса и многими другими.

Больше обо мне можно узнать здесь

Введение

Цели курса

Этот курс станет вашим стартом в мир Data Science и Machine Learning. По его окончании вы сможете претендовать на позиции Junior Machine Learning Engineer или Junior Data Scientist.

Для вас этот курс — это:

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

Для нас этот курс — это:

  • Развитие профессионального сообщества.
  • Возможность найти будущих коллег.
  • Интересный и важный процесс поддержания знаний в актуальном состоянии.

Основные термины

Давайте договоримся о терминах, которые будут использоваться на протяжении всего курса:

  • Искусственный интеллект (AI) — система, способная принимать решения на основе восприятия окружающего мира.
  • Машинное обучение (ML) — подраздел AI; система, принимающая решения на основе накопленного опыта (данных) и текущего состояния мира.
  • Глубокое обучение (DL) — подраздел ML, основанный на использовании глубоких нейронных сетей (Neural Networks, NN).
  • Data Science — дисциплина, включающая сбор, обработку, анализ и извлечение знаний из данных.
  • Big Data — обработка и анализ данных, масштаб которых не позволяет работать с ними в стандартных инструментах (например, в Excel).

Термины, связанные с данными

  • Датасет / Выборка (Dataset) — набор данных, с которым работает алгоритм.
  • Признак / Фича (Feature, X) — характеристика или измеряемый параметр объекта.
  • Целевая переменная / Метка / Класс (Label, Target, y) — значение, которое мы хотим предсказать по признакам объекта.
  • Закон природы (в контексте ML) — скрытая взаимосвязь между признаками и целевой переменной, которую стремится восстановить модель. Формально: отображение из пространства признаков X в пространство меток y.

Типы задач машинного обучения

Задачи ML классифицируются по наличию и типу разметки (метки y).

1. Обучение с учителем (Supervised Learning)

Есть размеченная обучающая выборка, где каждому объекту сопоставлена правильная метка y. Цель — восстановить закон природы X -> y.

Пример: Классификация электронных писем (спам / не спам), где человек вручную разметил исторические данные.

2. Обучение без учителя (Unsupervised Learning)

Разметки y нет или она не используется. Алгоритм ищет внутренние структуры, закономерности и связи в данных.

Пример: Кластеризация пользователей поисковой системы по их запросам для выявления групп интересов.

Основные типы задач

В рамках двух парадигм выделяют несколько ключевых типов задач.

Классификация (Classification)

  • Цель: Восстановить закон природы.
  • Особенность: Множество меток yконечное (часто небольшое).
  • Подвиды: Бинарная (2 класса) и многоклассовая (>2 классов).
  • Пример: Определение болезни по симптомам (болен/здоров), распознавание цифр на изображении.

Регрессия (Regression)

  • Цель: Предсказать непрерывную числовую величину.
  • Особенность: Метка y — вещественное число.
  • Пример: Прогнозирование стоимости квартиры по её характеристикам, прогноз температуры на завтра.

Кластеризация (Clustering)

  • Цель: Разбить данные на группы (кластеры) так, чтобы объекты внутри одной группы были похожи, а объекты из разных групп — отличались.
  • Особенность: Отсутствие заранее известных меток (без учителя).
  • Пример: Сегментация клиентов для маркетинга, группировка новостей по темам.

Снижение размерности (Dimensionality Reduction)

  • Цель: Уменьшить количество признаков, перейдя в пространство меньшей размерности, сохранив при этом важные структуры данных (близкие объекты должны остаться близкими).
  • Применение: Визуализация данных (например, 3D -> 2D), борьба с "проклятием размерности", сжатие данных.

Ранжирование (Ranking)

  • Цель: Упорядочить объекты (например, документы или товары) согласно их релевантности запросу или предпочтениям пользователя.
  • Пример: Выдача результатов поиска, рекомендательные системы.

Генерация (Generation)

  • Цель: Создавать новые объекты (изображения, текст, музыку), похожие на объекты из обучающей выборки.
  • Пример: Генерация реалистичных лиц, написание текстов в стиле определённого автора.

Типы признаков (Features)

Признаки могут быть разных типов, что влияет на выбор модели и методов предобработки:

  • Бинарные: Выбор из двух вариантов (Да/Нет, Кот/Не кот).
  • Номинальные (категориальные): Конечное множество без порядка (цвета, марки машин).
  • Порядковые (ординальные): Конечное упорядоченное множество (оценки: плохо/удовлетворительно/хорошо/отлично).
  • Числовые (вещественные): Непрерывные величины (рост, цена, расстояние).

Важно: Типы признаков можно преобразовывать (например, разбить числовой на интервалы и получить порядковый).

Что такое модель?

Модель машинного обучения — это параметрическая функция (или "чёрный ящик"), которая отображает пространство признаков X в пространство ответов y: Model: X -> y.

  • У модели есть параметры (внутренние настройки), которые настраиваются в процессе обучения на данных.
  • Обучение — это процесс подбора параметров модели таким образом, чтобы её предсказания на обучающих данных максимально соответствовали известным меткам (или выявляли скрытые структуры).
  • На работу модели влияют: качество данных, выбор алгоритма, его гиперпараметры и правильность процесса обучения.

Метод k-ближайших соседей (KNN)

Постановка задачи

Рассмотрим задачу классификации животных по двум признакам:

  • Длина усов
  • Длина хвоста

Для каждого объекта в обучающей выборке известна метка: кот или пёс. Цель — построить модель, которая по новым измерениям определит класс животного.

При визуализации данных наблюдается, что объекты одного класса группируются в определённых областях пространства признаков.

Гипотеза о компактности

Основа метода KNN — гипотеза о компактности:

Объекты одного класса расположены «близко» друг к другу в пространстве признаков, а объекты разных классов — «далеко».

Эта гипотеза позволяет решать задачу классификации через поиск похожих (близких) объектов в обучающей выборке.

Алгоритм KNN

Определение:
K-ближайших соседей (K Nearest Neighbors, KNN) — один из самых простых и интуитивно понятных алгоритмов классификации.

Алгоритм предсказания:

  1. Для нового объекта вычислить расстояние до всех объектов обучающей выборки
  2. Выбрать $K$ объектов с наименьшим расстоянием
  3. Присвоить объекту класс, который чаще всего встречается среди $K$ соседей (голосование большинства)

Гиперпараметр:
$K$ — количество соседей, участвующих в голосовании. Выбор $K$ влияет на качество модели:

  • Малое $K$: модель чувствительна к шуму и выбросам
  • Большое $K$: граница решений становится более гладкой, но может потерять локальные особенности

Метрики расстояния

Для определения «близости» объектов используются различные метрики:

Манхэттенское расстояние

$$d(\mathbf{x}, \mathbf{\hat{x}}) = \sum_{i=1}^{N} |x_i - \hat{x}_i|$$

Евклидово расстояние

$$d(\mathbf{x}, \mathbf{\hat{x}}) = \sqrt{\sum_{i=1}^{N} (x_i - \hat{x}_i)^2}$$

Косинусное расстояние

$$d(\mathbf{x}, \mathbf{\hat{x}}) = 1 - \frac{\sum_{i=1}^{N} x_i \hat{x}i}{\sqrt{\sum{i=1}^{N} x_i^2} \cdot \sqrt{\sum_{i=1}^{N} \hat{x}_i^2}}$$

Преимущество косинусного расстояния: измеряет угол между векторами, а не абсолютную разницу значений. Полезно, когда важна ориентация вектора признаков, а не его длина.

Проблемы и решения

1. Зависимость от масштаба признаков

Проблема:
Если признаки имеют разные масштабы (например, 29 признаков ∈ [0, 1], а один ∈ [0, 1000]), то расстояние будет доминироваться признаком с большим масштабом.

Решение — нормализация признаков:

  • Минимакс-нормализация: приведение всех значений к диапазону [0, 1]
  • Стандартизация: приведение к нулевому математическому ожиданию и единичной дисперсии ($\mu = 0, \sigma = 1$)

2. Вычислительная сложность

Проблема:
При большом объёме обучающей выборки ($N$ объектов) поиск ближайших соседей требует $O(N)$ операций сравнения для каждого нового объекта.

Решение — структуры данных для ускорения поиска:

  • kD-tree (k-dimensional tree): дерево разбиения пространства, на каждом уровне разделяющее данные по одному признаку
  • Ball tree: иерархическая структура на основе гиперсфер
  • HNSW (Hierarchical Navigable Small World): графовая структура для приближённого поиска ближайших соседей
  • FRiS-Stolp: метод отбора эталонных объектов для сокращения размера выборки

3. Улучшение голосования

Вместо простого подсчёта количества соседей каждого класса можно использовать взвешенное голосование, где вес соседа обратно пропорционален расстоянию до него:

$$\text{вес}_i = \frac{1}{d(\mathbf{x}, \mathbf{x}_i)} \quad \text{или} \quad \text{вес}_i = e^{-d(\mathbf{x}, \mathbf{x}_i)}$$

Свойства модели KNN

АспектОписание
ОбучениеОтсутствует в классическом смысле. Модель «запоминает» всю обучающую выборку
ПредсказаниеВычислительно затратно: требуется рассчитать расстояния до всех объектов выборки
ПараметрыОтсутствуют (модель не имеет обучаемых параметров)
Гиперпараметры$K$ (количество соседей), тип метрики расстояния, стратегия взвешивания
ИнтерпретируемостьВысокая: решение принимается на основе конкретных похожих объектов

Метод FRiS-Stolp для отбора эталонов

Для сокращения вычислительной сложности можно отобрать подмножество наиболее информативных объектов — эталонов (столпов).

Критерий качества эталона:
Объект является хорошим эталоном своего класса, если:

  • Объекты его класса расположены максимально близко к нему
  • Объекты других классов расположены максимально далеко

Функция FRiS: $$\text{FRiS}(z, a_i, b_i) = \frac{r_2 - r_1}{r_2 + r_1}$$

где $r_1$ — расстояние до ближайшего объекта своего класса, $r_2$ — до ближайшего объекта чужого класса.


В следующих главах: метрики качества моделей машинного обучения, линейная регрессия.

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

Постановка задачи

Линейная регрессия решает задачу предсказания непрерывной целевой переменной $y$ на основе одной или нескольких входных переменных (признаков) $x$.

В простейшем одномерном случае модель имеет вид:

$$\hat{y} = w_1 x + w_0$$

где:

  • $w_1$ — вес признака (наклон прямой),
  • $w_0$ — смещение (bias, свободный член).

Модель предполагает, что истинная зависимость имеет вид:

$$y = w_1 x + w_0 + \varepsilon$$

где $\varepsilon$ — случайная ошибка (шум).

Цель обучения: найти такие параметры $w_0, w_1, \dots, w_k$, чтобы предсказания модели $\hat{y}$ были максимально близки к реальным значениям $y$ из обучающей выборки.

Функции ошибки

Для оценки качества модели используются следующие функции потерь:

  • SSE (Sum of Squared Errors) — сумма квадратов ошибок: $$\text{SSE} = \sum_{i=1}^{N} (y_i - \hat{y}_i)^2 = |\text{error}|_2^2$$

  • MSE (Mean Squared Error) — среднеквадратичная ошибка: $$\text{MSE} = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2$$

  • MAE (Mean Absolute Error) — средняя абсолютная ошибка: $$\text{MAE} = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y}_i|$$

MSE чаще используется в линейной регрессии, так как является дифференцируемой функцией и приводит к аналитическому решению.

Матричная форма

Для многомерного случая ($k$ признаков) модель записывается как:

$$y_i = w_1 x_{1,i} + w_2 x_{2,i} + \dots + w_k x_{k,i} + w_0$$

Для удобства вычислений смещение $w_0$ включают в вектор весов, добавляя фиктивный признак $x_0 = 1$ ко всем объектам.

В матричной форме:

$$\mathbf{y} = \mathbf{X} \mathbf{w}$$

где:

  • $\mathbf{y} = \begin{bmatrix} y_1 \ \vdots \ y_N \end{bmatrix}$ — вектор целевых значений,
  • $\mathbf{X} = \begin{bmatrix} x_{1,1} & \cdots & x_{1,k} & 1 \ \vdots & \ddots & \vdots & \vdots \ x_{N,1} & \cdots & x_{N,k} & 1 \end{bmatrix}$ — матрица объектов-признаков (с добавленным столбцом единиц),
  • $\mathbf{w} = \begin{bmatrix} w_1 \ \vdots \ w_k \ w_0 \end{bmatrix}$ — вектор весов.

Оптимизационная задача:

$$\hat{\mathbf{w}} = \arg\min_{\mathbf{w}} |\mathbf{X}\mathbf{w} - \mathbf{y}|_2^2$$

Аналитическое решение: метод наименьших квадратов (МНК)

Квадратичная функция потерь:

$$Q(\mathbf{w}) = |\mathbf{y} - \mathbf{X}\mathbf{w}|_2^2 = (\mathbf{y} - \mathbf{X}\mathbf{w})^T (\mathbf{y} - \mathbf{X}\mathbf{w})$$

Для нахождения минимума приравниваем градиент к нулю:

$$\nabla_{\mathbf{w}} Q(\mathbf{w}) = -2\mathbf{X}^T\mathbf{y} + 2\mathbf{X}^T\mathbf{X}\mathbf{w} = 0$$

Отсюда получаем аналитическое решение:

$$\hat{\mathbf{w}} = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y}$$

Проблемы аналитического решения

  1. Матрица $\mathbf{X}^T \mathbf{X}$ может быть необратима:

    • При линейной зависимости признаков (коллинеарность),
    • Когда число признаков $k$ превышает число объектов $N$ (бесконечное множество решений).
  2. Вычислительная сложность: обращение матрицы имеет сложность $O(k^3)$, что непрактично при большом числе признаков.

Градиентный спуск

Когда аналитическое решение неприменимо или неэффективно, используют итеративный метод оптимизации — градиентный спуск.

Алгоритм:

  1. Инициализировать веса случайными значениями: $\mathbf{w} \gets \text{random}()$
  2. Повторять до сходимости: $$\mathbf{w} \gets \mathbf{w} - \alpha \nabla_{\mathbf{w}} Q(\mathbf{w})$$

где:

  • $\alpha$ — скорость обучения (learning rate),
  • $\nabla_{\mathbf{w}} Q(\mathbf{w})$ — градиент функции потерь.

Для функции потерь MSE градиент вычисляется как:

$$\nabla_{\mathbf{w}} Q(\mathbf{w}) = \frac{2}{N} \mathbf{X}^T (\mathbf{X}\mathbf{w} - \mathbf{y})$$

Варианты градиентного спуска

В зависимости от количества объектов, используемых для вычисления градиента на каждой итерации:

  • Полный градиентный спуск (Batch GD): градиент считается по всей выборке.
  • Стохастический градиентный спуск (SGD): градиент считается по одному случайному объекту.
  • Мини-батч градиентный спуск: градиент считается по небольшой случайной подвыборке (батчу).

Проблемы и улучшения

  • Локальные минимумы: для выпуклых функций (как MSE) проблема отсутствует — любой локальный минимум является глобальным.
  • Выбор скорости обучения $\alpha$:
    • Слишком большая $\alpha$ — алгоритм расходится,
    • Слишком маленькая $\alpha$ — обучение слишком медленное.
    • Решение: адаптивное уменьшение $\alpha$ по мере обучения.
  • Momentum (инерция): $$\mathbf{v} \gets \beta \mathbf{v} + \alpha \nabla_{\mathbf{w}} Q(\mathbf{w}), \quad \mathbf{w} \gets \mathbf{w} - \mathbf{v}$$ где $\beta \in (0, 1)$ — коэффициент инерции. Ускоряет сходимость и помогает «проскакивать» пологие участки.

Проблемы линейной регрессии и их решения

1. Отсутствие линейной зависимости

Если истинная зависимость нелинейна, линейная модель будет давать плохие предсказания.

Пример: предсказание стоимости склада по длине и ширине. Линейная модель: $$\text{цена} = w_1 \cdot \text{длина} + w_2 \cdot \text{ширина} + w_0$$ не учитывает, что важна площадь ($\text{длина} \times \text{ширина}$). Решение — создать новый признак «площадь».

2. Коллинеарность признаков

Если признаки линейно зависимы ($x_2 = 2x_1$), решение становится неустойчивым и неинтерпретируемым:

$$y = 6x_1 + 8x_2 + 5 = 0x_1 + 11x_2 + 5 = 22x_1 + 0x_2 + 5 = \dots$$

Решение: удалять линейно зависимые признаки (анализ корреляции, методы отбора признаков).

3. Выбросы

Выбросы сильно влияют на MSE из-за квадратичного штрафа.

Решения:

  • Фильтрация выбросов на этапе предобработки,
  • Использование более устойчивых функций потерь (например, MAE или Huber loss).

4. Шумные признаки и переобучение

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

Решение: регуляризация.

Регуляризация

Регуляризация добавляет штраф за большие веса в функцию потерь:

L2-регуляризация (Ridge)

$$Q_{\text{reg}}(\mathbf{w}) = \frac{1}{N} |\mathbf{X}\mathbf{w} - \mathbf{y}|_2^2 + \lambda |\mathbf{w}|_2^2$$

  • «Выравнивает» веса, делая их меньше по модулю,
  • Даёт более стабильное решение при коллинеарности,
  • Аналитическое решение: $\hat{\mathbf{w}} = (\mathbf{X}^T \mathbf{X} + \lambda \mathbf{I})^{-1} \mathbf{X}^T \mathbf{y}$.

L1-регуляризация (Lasso)

$$Q_{\text{reg}}(\mathbf{w}) = \frac{1}{N} |\mathbf{X}\mathbf{w} - \mathbf{y}|_2^2 + \lambda |\mathbf{w}|_1$$

  • Также уменьшает веса,
  • Обнуляет веса нерелевантных признаков, выполняя автоматический отбор признаков.

Параметр регуляризации $\lambda$

  • $\lambda = 0$: обычная линейная регрессия,
  • $\lambda \to \infty$: все веса стремятся к нулю,
  • Оптимальное значение $\lambda$ подбирается на валидационной выборке.

Параметры и гиперпараметры

ТипПримеры
Параметры моделиВеса $\mathbf{w}$ (настраиваются в процессе обучения)
ГиперпараметрыСкорость обучения $\alpha$, тип и коэффициент регуляризации $\lambda$, начальное приближение, использование momentum, размер батча

Оценка качества модели

  1. Метрики ошибки: MSE, MAE на тестовой выборке.
  2. Базовое сравнение: сравнение с «наивной» моделью $\hat{y} = \text{mean}(\mathbf{y})$.
  3. Разделение выборки: разбиение на обучающую и тестовую части (train/test split).
  4. Кросс-валидация: более надёжная оценка при ограниченном объёме данных.

В следующих главах: логистическая регрессия (классификация), метрики качества для задач классификации, деревья решений.

Логистическая регрессия и Деревья решений

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

3.1. Линейные классификаторы и Логистическая регрессия

От линейной функции к вероятности

Линейный классификатор строит решающую границу в виде гиперплоскости. Для объекта с признаками $x$ модель вычисляет линейную комбинацию:

$$ f(x) = w_1 x_1 + w_2 x_2 + ... + w_0 = w^T x $$

В простейшем случае класс предсказывается через знак функции: $$ \hat{y}_i = \text{sign}(f(x_i)) = \begin{cases} 1, & f(x_i) \geq 0 \ -1, & f(x_i) < 0 \end{cases} $$

Однако для многих задач важно получить не просто класс, а вероятность принадлежности к классу. Возникает проблема: значение $f(x)$ лежит в диапазоне $(-\infty, +\infty)$, а вероятность $p$ должна быть в диапазоне $[0, 1]$.

Чтобы преобразовать линейный отклик в вероятность, используется следующая цепочка рассуждений:

  1. Рассмотрим вероятность положительного класса $p_+ = P(y=1|x)$.
  2. Преобразуем вероятность в шанс (Odds Ratio): $$ OR = \frac{p_+}{1 - p_+} \in [0, +\infty) $$
  3. Прологарифмируем шанс, чтобы получить диапазон $(-\infty, +\infty)$: $$ \log(OR) = \log\left(\frac{p_+}{1 - p_+}\right) = f(x) $$

Выразим вероятность $p_+$ из этого уравнения: $$ \frac{p_+}{1 - p_+} = e^{f(x)} \implies p_+ = e^{f(x)} - p_+ e^{f(x)} \implies p_+(1 + e^{f(x)}) = e^{f(x)} $$

Итоговая формула для вероятности (сигмоида): $$ p_+ = \frac{e^{f(x)}}{1 + e^{f(x)}} = \frac{1}{1 + e^{-f(x)}} = \sigma(f(x)) $$

Таким образом, логистическая регрессия моделирует вероятность принадлежности к классу через сигмоидальную функцию от линейной комбинации признаков.

Понятие отступа (Margin)

Для анализа качества классификации вводится понятие отступа (margin) на $i$-м объекте:

$$ M_i = y_i f(x_i) = y_i w^T x_i $$

где $y_i \in {-1, +1}$ — истинная метка класса.

Интерпретация отступа:

  • $M_i > 0$ — объект классифицирован верно ($y_i = \hat{y}_i$)
  • $M_i \leq 0$ — объект классифицирован неверно ($y_i \neq \hat{y}_i$)

Примеры:

$y_i$$f(x_i)$$M_i = y_i f(x_i)$Результат
+1+6+6Верно, уверенно
+1-6-6Ошибка
-1-6+6Верно, уверенно
-1+6-6Ошибка

Чем больше положительный отступ, тем более «уверенно» модель относит объект к правильному классу. Это понятие лежит в основе многих функций потерь, включая log loss.

Задача оптимизации: Log Loss

Для обучения модели необходимо подобрать веса $w$, максимизирующие правдоподобие данных. Предположим, что объекты независимы и одинаково распределены (i.i.d.).

Вероятность правильного предсказания для объекта $i$ с меткой $y_i \in {-1, 1}$: $$ P(y_i | x_i, w) = \sigma(y_i w^T x_i) = \sigma(M_i) $$

Функция правдоподобия для всей выборки: $$ P(Y | X, w) = \prod_{i=1}^{N} \sigma(y_i w^T x_i) \to \max $$

Для удобства оптимизации перейдем к логарифму правдоподобия: $$ \sum_{i=1}^{N} \log \sigma(y_i w^T x_i) \to \max $$

Подставив определение сигмоиды $\sigma(z) = \frac{1}{1 + e^{-z}}$, получим: $$ \sum_{i=1}^{N} \log \frac{1}{1 + e^{-y_i w^T x_i}} = - \sum_{i=1}^{N} \log (1 + e^{-y_i w^T x_i}) \to \max $$

Задача максимизации логарифма правдоподобия эквивалентна задаче минимизации функции потерь (Log Loss): $$ \mathcal{L}(w) = \sum_{i=1}^{N} \log (1 + e^{-y_i w^T x_i}) = \sum_{i=1}^{N} \log (1 + e^{-M_i}) \to \min $$

Связь с отступом: Функция log loss штрафует малые и отрицательные отступы. При $M_i \to +\infty$ потери стремятся к нулю, при $M_i \to -\infty$ — растут линейно.

Методы оптимизации:

  • Градиентный спуск
  • Регуляризация (L1, L2) для борьбы с переобучением, аналогично линейной регрессии

3.2. Метрики качества классификации

Выбор правильной метрики критически важен, особенно при несбалансированных классах.

Accuracy и её ограничения

Accuracy (Доля правильных ответов): $$ \text{Accuracy} = \frac{\text{Число верных предсказаний}}{\text{Общее число объектов}} $$

Проблема: Accuracy может вводить в заблуждение на несбалансированных данных.

  • Пример: Диагностика редкой болезни.
    • 100 000 здоровых, 10 больных.
    • Если классификатор всегда предсказывает «здоров», Accuracy = $100000 / 100010 \approx 99.99%$.
    • При этом модель бесполезна, так как не находит ни одного больного.

Матрица ошибок (Confusion Matrix)

Для детального анализа используется матрица ошибок:

Предсказано: 1 (Больной)Предсказано: 0 (Здоровый)
Реально: 1 (Больной)TP (True Positive)FN (False Negative)
Реально: 0 (Здоровый)FP (False Positive)TN (True Negative)
  • TP: Сколько больных назвали больными.
  • TN: Сколько здоровых назвали здоровыми.
  • FP: Сколько здоровых назвали больными (Ошибка I рода).
  • FN: Сколько больных назвали здоровыми (Ошибка II рода).

$$ \text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN} $$

Precision и Recall

Для задач с дисбалансом классов чаще используют Precision и Recall.

  1. Precision (Точность): Какая доля объектов, названных положительными, действительно является положительными. $$ \text{Precision} = \frac{TP}{TP + FP} $$
  2. Recall (Полнота): Какая доля реальных положительных объектов была найдена моделью. $$ \text{Recall} = \frac{TP}{TP + FN} $$

Пример 1: Если модель нашла только 1 больного из 10, но не ошиблась на здоровых:

  • Precision = $1 / (0 + 1) = 1$ (все найденные — действительно больные).
  • Recall = $1 / (1 + 9) = 0.1$ (найден только 10% больных).

Пример 2: Поменяем целевой класс — будем искать здоровых (100 000 здоровых, 10 больных):

  • Precision = $100000 / (100000 + 9) \approx 0.99991$
  • Recall = $100000 / (100000 + 0) = 1$

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

F-мера (F-score)

Для баланса между Precision и Recall используется гармоническое среднее — $F_\beta$-мера:

$$ F_\beta = (\beta^2 + 1) \frac{\text{Precision} \times \text{Recall}}{\beta^2 \text{Precision} + \text{Recall}} $$

Наиболее популярна F1-мера ($\beta = 1$): $$ F_1 = 2 \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} $$

ROC-кривая и AUC

Многие классификаторы (включая логистическую регрессию) выдают вероятность $p_+ \in [0, 1]$. Порог классификации можно варьировать.

  • TPR (True Positive Rate): То же самое, что Recall. $$ \text{TPR} = \frac{TP}{TP + FN} $$
  • FPR (False Positive Rate): Доля здоровых, ошибочно названных больными. $$ \text{FPR} = \frac{FP}{FP + TN} $$

ROC-кривая (Receiver Operating Characteristic): Зависимость TPR от FPR при изменении порога классификации.

AUC (Area Under Curve): Площадь под ROC-кривой.

  • AUC = 1: Идеальный классификатор.
  • AUC = 0.5: Случайное угадывание.
  • Чем больше AUC, тем лучше классификатор ранжирует объекты (отделяет положительный класс от отрицательного).

3.3. Деревья решений (Decision Trees)

Дерево решений — это непараметрический метод, который строит последовательность правил для классификации объектов.

Принцип построения

Представим, что у нас есть один признак. Мы сортируем объекты по нему и выбираем порог $t$, разделяющий выборку на две части: $L$ (left) и $R$ (right).

Формально, для признака $x_i$ и порога $t_j$: $$ Q \xrightarrow{x_i < t_j} \begin{cases} L \ R \end{cases} $$

Цель разделения — уменьшить разнородность (гетерогенность) в дочерних узлах. Качество разделения оценивается функцией: $$ G(x_i, t_j) = \frac{|L|}{|Q|} H(L) + \frac{|R|}{|Q|} H(R) $$ где $H(R)$ — функция неопределенности (impurity) в узле.

Критерии неопределенности

Пусть $p_0$ и $p_1$ — доли объектов классов 0 и 1 в узле.

  1. Misclassification (Доля ошибок): $$ H(R) = 1 - \max(p_0, p_1) $$
  2. Entropy (Энтропия): $$ H(R) = -p_0 \log_2 p_0 - p_1 \log_2 p_1 = - \sum_k p_k \log_2 p_k $$
  3. Gini (Индекс Джини): $$ H(R) = 1 - p_0^2 - p_1^2 = 1 - \sum_k p_k^2 $$

Когда останавливаться? (Регуляризация)

Если не ограничивать рост дерева, оно переобучится (запомнит каждый объект). Критерии остановки:

  • Ограничить максимальную глубину дерева.
  • Ограничить минимальное количество объектов в узле для дальнейшего деления.
  • Ограничить минимальное количество объектов в листе.
  • Pruning (Обрезка): Построить большое дерево, а затем «постричь» ветви, которые не дают прироста качества на валидации.

Плюсы и минусы деревьев решений

Плюсы:

  • Интерпретируемость: Правила легко понять и визуализировать.
  • Масштаб: Устойчивы к разным масштабам признаков (не требуют нормировки).
  • Пропуски: Некоторые реализации могут работать с пропусками в данных.
  • Параметры: Мало гиперпараметров для настройки.

Минусы:

  • Шум: Чувствительны к шуму в данных (склонность к переобучению).
  • Границы: Разделяющая граница кусочно-линейная (перпендикулярна осям признаков).
  • Нестабильность: Малое изменение данных может сильно изменить структуру дерева.
  • Экстраполяция: Не умеют экстраполировать (предсказывать за пределами диапазона обучающей выборки), только интерполируют.

3.4. Заключение

В этой лекции мы рассмотрели логистическую регрессию как способ получения вероятностных оценок в линейных моделях и разобрали ключевые метрики для оценки качества классификации, такие как Precision, Recall и ROC-AUC. Важным понятием оказался отступ (margin), который связывает линейный отклик модели с качеством классификации и лежит в основе функции потерь log loss.

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

Что дальше? В следующих главах мы рассмотрим:

  • Ансамбли деревьев (Random Forest, Gradient Boosting).
  • Методы улучшения стабильности и качества деревьев.

Деревья. Случайный лес. Градиентный бустинг

Введение

В данной главе рассматриваются методы анализа больших массивов данных, основанные на деревьях решений и их ансамблях. Мы изучим регрессионные деревья, проблему смещения и разброса (bias-variance), а также методы объединения моделей: бэггинг (Bagging), случайный лес (Random Forest) и бустинг (Boosting), включая градиентный бустинг.

1. Деревья решений

Регрессия

При построении деревьев для задач регрессии используется критерий качества разбиения. Обозначения из лекции:

  • $G_{x_i, t_j} = L_Q H_L + R_Q H_R$
  • MSE (Среднеквадратичная ошибка): $H_R = \frac{1}{N} \sum_{i}^{N} (y_m - y_i)^2$, где $y_m$ — среднее значение.
  • MAE (Средняя абсолютная ошибка): $H_R = \frac{1}{N} \sum_{i}^{N} |y_m - y_i|$, где $y_m$ — медиана.

Оптимизация

Сложность алгоритмов построения деревьев оценивается следующим образом:

  • Сложность подготовки: $O(N \cdot \log N \cdot d)$, где $d$ — количество признаков, $N$ — количество объектов. Необходимо отсортировать все признаки перед тем, как считать ошибку на разных разбиениях.
  • Сложность ошибки: $O(N)$.
  • Сложность нахождения оптимального разбиения: $O(N^2 d)$.

Существуют методы оптимизации пересчета ошибок. Например, переход от суммы квадратов отклонений для $N$ объектов к сумме для $N-1$ объектов может быть выполнен за $O(1)$ для одного пересчёта при использовании определенных формул преобразования сумм. Также применяются эвристические оптимизации, например, рассмотрение случайного набора признаков в каждой вершине.

2. Смещение и Разброс (Bias-Variance)

Decomposition of Error

Рассмотрим модель зависимости истинных значений от функции: $$y = f(x) + \varepsilon$$ где:

  • $y$ — истинные значения;
  • $f(x)$ — закон природы;
  • $\varepsilon$ — ошибка измерения ($\varepsilon \in N(0, \sigma^2)$, математическое ожидание $M\varepsilon = 0$).

Таким образом, $y \in N(f(x), \sigma^2)$, математическое ожидание $My = f(x)$.

Рассмотрим семейство функций-регрессоров $b = b(x)$, приближенных к $f(x)$. В конкретной точке множество регрессоров даст множество значений. У $b(x)$ есть математическое ожидание и дисперсия.

Разложение среднеквадратичной ошибки (MSE): $$MSE = M(y - b)^2 = M(y^2) + M(b^2) - 2M(by)$$

Используя свойства дисперсии $Var(x) = Dx = M(x - Mx)^2 = Mx^2 - M[x]^2$:

  1. $My^2 = Dy + M[y]^2 = \sigma^2 + f^2$
  2. $Mb^2 = Db + M[b]^2$
  3. $Mby = M(f + \varepsilon)b = Mfb + M\varepsilon b = fMb + M\varepsilon Mb = fMb$

Подставляя в формулу MSE: $$MSE = \sigma^2 + f^2 + Db + Mb^2 - 2fMb = (f - Mb)^2 + Db + \sigma^2$$

Где:

  • $(f - M[b]) = \text{bias}$ (смещение);
  • $Db = \text{variance}$ (разброс);
  • $\sigma^2$ — неустранимая ошибка.

Итоговая формула decomposition: $$MSE = \text{bias}^2 + \text{variance} + \sigma^2$$

Влияние сложности модели

  • Сложные модели склонны иметь большое значение variance из-за переобучения.
  • Простые модели склонны иметь большое значение bias.

3. Ансамбли моделей

Мудрость толпы

На ярмарке проводилась лотерея: нужно было угадать вес быка по внешнему виду.

  • Участвовало 800 человек.
  • Реальный вес быка: 1198 фунтов.
  • Ни один человек не угадал точный вес.
  • Среднее арифметическое их предсказаний: 1197 фунтов.

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

Бэггинг (Bagging)

Идея заключается в усреднении предсказаний нескольких классификаторов или регрессоров. Чтобы дать моделям разный «опыт», их обучают на разных данных. Используется метод Bootstrap: элемент из общей выборки берётся случайным образом, при этом один и тот же элемент может быть взят несколько раз.

Пусть $b_1(x), ..., b_n(x)$ — модели регрессии, $f(x)$ — функция истинных значений. Квадратичная ошибка $i$-й модели: $\varepsilon_i^2(x) = (b_i(x) - f(x))^2$. Если усреднить ошибку всех моделей, получим $\frac{1}{n} M_x [\sum \varepsilon_i^2(x)]$.

Предположим, что ошибки несмещены ($M_x \varepsilon_i(x) = 0$) и некоррелированы ($M_x \varepsilon_i(x)\varepsilon_j(x) = 0$ при $i \neq j$). Построим новую модель: $$a(x) = \frac{1}{n} \sum_{i}^{n} b_i(x)$$

Тогда среднеквадратичная ошибка новой модели: $$M_x \left( \frac{1}{n} \sum_{i}^{n} b_i(x) - f(x) \right)^2 = M_x \left( \frac{1}{n} \sum_{i}^{n} \varepsilon_i(x) \right)^2 = \frac{1}{n^2} M_x \sum_{i}^{n} \varepsilon_i^2(x)$$

Вывод: Бэггинг снижает variance в ошибке (снижает эффект переобучения) примерно в $n$ раз (при условии некоррелированности). Модели «в среднем» ошибаются одинаково, но в разные стороны. В меньшее число моделей попадают выбросы.

Случайный лес (Random Forest)

Метод развивает идею бэггинга для деревьев:

  1. Обучаем деревья на разных подвыборках.
  2. Чтобы повысить некоррелированность деревьев, при построении узла дерева ищем наилучшее разбиение не по всем признакам, а лишь по части.

Гиперпараметры: количество деревьев + гиперпараметры дерева.

  • В регрессии выбираем среднее.
  • В классификации выбираем большинство.

Преимущества:

  • Высокая точность.
  • Менее чувствителен к выбросам.
  • Менее склонен к переобучению.
  • Хорошо параллелится.
  • Хорошо работает с дефолтными параметрами.

Недостатки:

  • Сложно интерпретировать.
  • Плохо работает с разреженными признаками.
  • Не экстраполируется.
  • Требует много памяти.

4. Бустинг

AdaBoost и случайные пни

В бустинге элементы, на которых модель ошиблась, будут иметь больший вес на следующих шагах. Часто используются «пни» — деревья глубиной 1.

Градиентный бустинг: Пример

Задача: Предсказать цену товара по возрасту (в днях). Допустим, есть только один признак.

Шаг 1: Начальное приближение — среднее по выборке. Цены: 700, 800, 600, 400, 300. Среднее: $(700+800+600+400+300) / 5 = 560$.

Считаем остатки (цена - приближение):

Возраст (дней)ЦенаПриближениеОстаток
25700560140
50800560240
7560056040
80400560-160
100300560-260

Шаг 2: Строим регрессионное дерево, которое предсказывает остатки. Разбиение по признаку Возраст >= 80:

  • Ветка 1 (Age < 80): Остатки 140, 240, 40. Среднее: 140.
  • Ветка 2 (Age >= 80): Остатки -160, -260. Среднее: -210.

Шаг 3: Прибавляем предсказание дерева к приближению (можно с коэффициентом, в примере без него).

ВозрастЦенаПриближение №1Остаток №1Выход дерева №1Приближение №2Остаток №2
257005601401407000
50800560240140700100
7560056040140700-100
80400560-160-21035050
100300560-260-210350-50

Далее процесс продолжается: строим деревья дальше, изменяем приближение, считаем новые остатки.

Градиентный бустинг: Формализация

На $t$-м шаге модель представляет собой сумму функций: $$f(x) = \sum_{i=0}^{t-1} f_i(x)$$

Параметры нового шага находятся через минимизацию функции потерь $L$: $$\rho_t, \theta_t = \arg\min_{\rho, \theta} M_{x,y} [L(y, f(x) + \rho h(x, \theta))]$$ где $f_t(x) = \rho_t h(x, \theta_t)$.

Остаток на $i$-м элементе (градиент): $$r_{i,t} = - \left[ \frac{\nabla L(y_i, f(x_i))}{\nabla f(x_i)} \right]$$ Мы хотим уменьшить этот остаток новой функцией.

  1. Параметры дерева: $\theta_t = \arg\min_{\theta} \sum_{i}^{n} (r_{i,t} - h(x_i, \theta))^2$
  2. Параметры «линейной регрессии» (шаг): $\rho_t = \arg\min_{\rho} \sum_{i}^{n} L(y_i, f(x_i) + \rho h(x_i, \theta_t))$

Случай MSE: Для среднеквадратичной ошибки остаток равен разнице между истинным значением и предсказанием: $$r_{i,t} = - \frac{\nabla L}{\nabla f} = -2(y_i - y_i) \rightarrow \text{разница между истинным значением и предсказанием}$$

Сравнение Градиентного бустинга и Бэггинга

  • Точность: Градиентный бустинг точнее, чем Bagging и Random Forest.
  • Переобучение: Бустинг любит переобучаться. Нужна тестовая выборка. Если переобучить дерево в начале цепочки, остальные деревья не смогут исправить это переобучение. Поэтому гиперпараметры деревьев выбирают так, чтобы они были достаточно «глупые».
  • Параллелизм: Деревья строятся последовательно. Параллелизм возможен только на уровне построения одного дерева (в отличие от Random Forest).
  • Линейные модели: С логистической регрессией работает нормально.

Понижение размерности. Кластеризация

В данной главе рассматриваются методы работы с данными, направленные на уменьшение количества признаков при сохранении структуры данных (понижение размерности), а также методы автоматического grouping объектов без учителя (кластеризация). Мы изучим метод главных компонент (PCA), t-SNE, алгоритмы k-средних, иерархическую кластеризацию и DBSCAN.

1. Понижение размерности

Основная идея

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

Метод главных компонент (PCA)

Простое отрезание оси пространства почти всегда не оптимально: в худшем случае проекция превратится в точку.

Основная концепция:

  1. Предполагается, что данные описываются неким эллипсом.
  2. Меняется базис пространства.
  3. Отрезается «новая ось» с минимальной дисперсией.
  4. Чтобы посчитать «потерянную информацию», делят дисперсию отрезанной оси на сумму дисперсий по всем осям.

Вычисления: Ковариация признаков вычисляется по формуле: $$cov(X_i, X_j) = M[(X_i - M[X_i])(X_j - M[X_j])] = M[X_i X_j] - M[X_i]M[X_j]$$

Выборку можно переместить так, чтобы математическое ожидание $M[X_i] = 0$. В матричном виде ковариация: $$cov(X) = X^T X$$

Свойства:

  • Ковариация симметрична.
  • Ковариация признака с самим собой равна его дисперсии.
  • Направление оси с максимальной дисперсией совпадает с направлением собственного вектора с максимальным собственным значением.
  • Собственное значение в этом случае равно дисперсии.

Ограничения PCA:

  • Необходимо стандартизировать выборку.
  • Не работает со сложными структурами, не похожими на эллипс.

t-SNE (t-Distributed Stochastic Neighbor Embedding)

Физический смысл:

  1. Данные из пространства размерности $N$ помещаются в пространство меньшей размерности $M$ (отображение).
  2. Объекты «прибиваются гвоздями» к своим местам.
  3. Объекты в пространстве $M$ соединяются пружинками. Сила пружины зависит от того, насколько расстояние в пространстве $M$ отличается от расстояния в пространстве $N$.
  4. Система «отпускается» (гвозди убираются).

Динамика:

  • Если точки в пространстве $M$ дальше, чем в пространстве $N$, то они притягиваются.
  • Если точки в пространстве $M$ ближе, чем в пространстве $N$, то они отталкиваются.

Математическое описание: Пусть $|x_i - x_j|$ — расстояние в исходном пространстве, $|y_i - y_j|$ — расстояние в пространстве отображения.

Условное сходство (Гауссово распределение): $$p_{j|i} = \frac{e^{-|x_i - x_j|^2 / 2\sigma_i^2}}{\sum_{k \neq i} e^{-|x_i - x_k|^2 / 2\sigma_i^2}}$$ где $\sigma_i^2$ — дисперсия распределения Гаусса вокруг точки $x_i$. Разные распределения берутся для точек в плотных и разреженных участках.

Симметричное сходство: $$p_{ji} = \frac{p_{j|i} + p_{i|j}}{2N}$$

В пространстве меньшей размерности используется не Гауссово, а распределение Стьюдента с одной степенью свободы (t-distribution): $$q_{ij} = \frac{t(|y_i - y_j|)}{\sum_{k \neq i} t(|y_i - y_k|)}, \text{ где } t(x) = \frac{1}{1 + x^2}$$

Оптимизация: Необходимо приблизить матрицу сходства отображения к матрице исходного пространства. Минимизируется расстояние Кульбака-Лейблера: $$KL(P||Q) = \sum_{i,j} p_{ij} \log \frac{p_{ij}}{q_{ij}} \to \min$$

Минимизация производится методом градиентного спуска. Градиент является совокупностью всех сил, действующих на объект: $$\frac{\partial KL(P||Q)}{\partial y_i} = 4 \sum_j (p_{ij} - q_{ij}) t(|x_i - x_j|) u_{ij}$$ где $u_{ij}$ — единичный вектор.

Почему t-distribution? При понижении размерности максимальные расстояния «меняются». Если использовать распределение Гаусса, то точки отображаются очень скученно (crowding problem).

Особенности t-SNE:

  • Работает со сложными структурами.
  • При появлении новых данных нет возможности просто спроецировать их. Нужно либо полностью переобучаться, либо использовать «хитрости» (например, k-nn).
  • Долго считать. Можно брать не все точки, а только ближайших соседей.
    • Если брать мало соседей, t-SNE больше учитывает локальные паттерны.
    • Если брать много соседей, t-SNE больше учитывает глобальные паттерны.

Autoencoders

...

2. Кластеризация

k-средних (k-means)

Алгоритм заключается в следующем:

  1. Задать количество кластеров.
  2. Бросить случайным образом точки (центроиды) в пространстве.
  3. Для каждой точки посчитать, к какому центроиду она ближе.
  4. Передвинуть каждый центроид в «центры масс» подвыборки, принадлежащих этому центроиду.
  5. Повторять пункты 3-4 фиксированное число раз, или пока перемещение центроидов не будет достаточно маленьким (алгоритм сойдётся).

Особенности и ограничения:

  • Нужно задавать количество кластеров. Для подбора можно смотреть на сумму расстояний от точек до центров кластеров. Если сумма перестаёт резко падать, можно останавливаться.
  • Чувствителен к начальным случайным значениям.
  • Есть ограничения на форму кластеров.
  • Требует много вычислений.

Агломеративная (иерархическая) кластеризация

Алгоритм «снизу-вверх»:

  1. Сначала каждая точка — центр своего кластера.
  2. Считаем попарные расстояния между центрами кластеров.
  3. Склеиваем пару ближайших кластеров в новый кластер и пересчитываем его центр.
  4. Повторяем пункты 2-3, пока не склеим все в один кластер.

DBSCAN

Алгоритм, основанный на плотности:

  1. Берём случайную точку.
  2. Если у неё меньше $N$ соседей, то помечаем её как потенциальный выброс (noise point), и берём другую точку.
  3. Если соседей больше $N$:
    • Заводим новый кластер и помещаем точку (core point) в него.
    • Если сосед — потенциальный выброс или у него мало соседей, то это край кластера (border point). Заносим его в кластер и идём к другому соседу.
    • Если у соседа достаточно его собственных соседей, то добавляем его в кластер (core point), а его соседей заносим в очередь обхода.
  4. Повторяем пункты 1-3.
  5. Выбросы выделяем в отдельный кластер.

3. Заключение

В данной главе были рассмотрены ключевые методы уменьшения размерности данных и методы кластеризации без учителя.

В следующих лекциях планируется рассмотрение нейронных сетей.

Введение в нейронные сети

В данной главе рассматриваются основы построения и обучения нейронных сетей. Мы изучим математическую модель нейрона, роль функций активации, архитектуру многослойных сетей и метод обратного распространения ошибки (backpropagation). Также будут рассмотрены методы оптимизации (SGD, Adam, RMSProp), техники нормализации данных и весов, а также методы регуляризации для борьбы с переобучением.

1. Нейрон и функции активации

Математический нейрон

Математический нейрон концептуально похож на биологический. Он принимает входные сигналы, умножает их на веса и пропускает через функцию активации.

Рассмотрим пример задачи: предсказать, сдаст ли студент экзамен исходя из следующих признаков:

  • $X_1$ — Задавал вопросы на парах (1/0).
  • $X_2$ — Попал к лектору на экзамене (1/0).
  • $X_3$ — Сдал лабы (1/0).

Логика задачи может быть следующей:

  • Если студент попал к лектору, то он сдаст экзамен только если задавал вопросы и сдал лабы.
  • Если студент не попал к лектору, то для сдачи достаточно или задавать вопросы, или сдать лабы.

Модель нейрона вычисляет взвешенную сумму входов: $$S = W_1X_1 + W_2X_2 + W_3X_3$$

Выход нейрона $Y$ определяется пороговой функцией активации: $$f(x) = \begin{cases} 1, & x \ge 0.5 \ 0, & x < 0.5 \end{cases}$$

Пример весов для простой логики: $W_1 = 0.5, W_2 = -0.5, W_3 = 0.5$. Для входа $(1, 1, 1)$: $0.5 \cdot 1 - 0.5 \cdot 1 + 0.5 \cdot 1 = 0.5 \ge 0.5 \rightarrow$ сдал (1).

Проблема одного слоя

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

Скрытые слои

Решением является добавление скрытых слоев. Скрытые слои ($Z$) формируют новое признаковое пространство, в котором задача решается проще. $$Z_1 = f(W_{11,1}X_1 + W_{12,1}X_2 + \dots)$$ $$Y_1 = f(W_{21,1}Z_1 + W_{22,1}Z_2 + \dots)$$

Функции активации

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

  • Пороговая функция: Используется в биологических моделях, но не дифференцируема в точке порога.
  • Сигмоида: Дифференцируемая функция. $$f(x) = \frac{1}{1 + e^{-x}}$$ Производная сигмоиды: $$\frac{d\sigma(x)}{dx} = \sigma(x)(1 - \sigma(x))$$

2. Обучение нейронной сети

Обучение одного нейрона

Обучение одного нейрона с сигмоидальной функцией активации аналогично обучению логистической регрессии. Обучаемыми параметрами являются веса $W$.

Метод обратного распространения ошибки (Backpropagation)

Для пересчета весов в многослойной сети необходимо знать ошибку для каждого нейрона. Ошибка для выходного слоя $Y_1$ считается легко, но для скрытых слоев $Z$ требуется метод обратного распространения.

Цепное правило (Chain Rule): $$\frac{dz}{dx} = \frac{dz}{dy} \cdot \frac{dy}{dx}$$

Пример вычисления градиента: Пусть есть функция $f(x, y, z) = (x + y)z$.

  1. $q = x + y$. Производные: $\frac{dq}{dx} = 1, \frac{dq}{dy} = 1$.
  2. $f = zq$. Производные: $\frac{df}{dq} = z, \frac{df}{dz} = q$.
  3. Итоговые градиенты: $\frac{df}{dx} = \frac{df}{dq} \cdot \frac{dq}{dx} = z \cdot 1$.

Обновление весов: Ошибка вычисляется как разность между_actual_ и expected. $$err = actual - expected$$ Для сигмоиды градиент веса включает производную функции активации: $$weights_delta = err \cdot \sigma(x) \cdot (1 - \sigma(x))$$ Обновление веса с learning rate ($lr$): $$weight_{new} = weight_{old} - output \cdot weights_delta \cdot lr$$

Ошибка для скрытых слоев распределяется пропорционально весам, связывающим их с последующим слоем: $$err_{hidden} = weight \cdot weights_delta$$

Проблемы сигмоиды

  • Маленькие градиенты на концах функции (проблема затухающего градиента).
  • Всегда положительная.
  • Дорого считать экспоненту.

3. Оптимизаторы

Для минимизации функции потерь используются различные варианты градиентного спуска.

SGD (Stochastic Gradient Descent)

Базовый метод: $$x_{t+1} = x_t - \alpha f'(x_t)$$ где $\alpha$ — learning rate.

SGD with Momentum

Накапливает инерцию движения, чтобы сглаживать колебания: $$v_{t+1} = \rho v_t + \alpha f'(x_t)$$ $$x_{t+1} = x_t - v_{t+1}$$

Nesterov Momentum

Улучшенная версия momentum, которая «смотрит вперед» перед вычислением градиента. Меньше «заносит на поворотах»: $$v_{t+1} = \rho v_t - \alpha f'(x_t + \rho v_t)$$ $$x_{t+1} = x_t + v_{t+1}$$

Adagrad (Adaptive Gradient)

Адаптирует learning rate для каждого параметра индивидуально. Веса, которые менялись сильно, меняются меньше: $$cache_{t+1} = cache_t + f'(x_t)^2$$ $$x_{t+1} = x_t - \frac{\alpha f'(x_t)}{\sqrt{cache_{t+1}} + \epsilon}$$ Проблема: $cache \to \infty$, что может остановить обучение.

RMSProp

Сглаживает изменения кэша, забывая старые значения (экспоненциальное скользящее среднее): $$cache_{t+1} = \beta cache_t + (1 - \beta) f'(x_t)^2, \quad \beta \in [0, 1]$$ $$x_{t+1} = x_t - \frac{\alpha f'(x_t)}{\sqrt{cache_{t+1}} + \epsilon}$$

Adam

Комбинация RMSProp и Momentum: $$v_{t+1} = \gamma v_t + (1 - \gamma) f'(x_t)$$ $$cache_{t+1} = \beta cache_t + (1 - \beta) f'(x_t)^2$$ $$x_{t+1} = x_t - \frac{\alpha v_{t+1}}{\sqrt{cache_{t+1}} + \epsilon}$$ В качестве бэйзлайна рекомендуется использовать Adam или Nesterov.

4. Нормализация и инициализация

Нормализация данных

Необходима по следующим причинам:

  • Технические ограничения точности дробных чисел.
  • Без нормализации страдают L1 и L2 регуляризация.
  • Ускоряет обучение. В нейронных сетях это критично, так как каждый слой отображает данные в новое пространство признаков, и при изменении весов меняется распределение новых признаков.

Инициализация весов

  • Нули: Сеть не обучается (все нейроны одинаковы).
  • Константа: Сеть вырождается в один нейрон.
  • Случайные значения: Необходимо сохранять дисперсию данных после прохождения через слой.

Для сохранения дисперсии (например, для ReLU): $$D(s) = D\left(\sum_{i}^{N} w_i x_i\right) = \sum_{i}^{N} D(w_i x_i) = n D(w) D(x)$$ Чтобы $D(s) = D(x)$, необходимо: $$D(w) = \frac{1}{n}$$ Берем случайные значения и умножаем на $\frac{1}{\sqrt{n}}$ (или используем распределение с дисперсией $1/n$).

Batch Normalization

Позволяет преобразовывать данные после прохождения функции активации в пределах одного батча, чтобы бороться с изменением распределения признаков (Internal Covariate Shift).

Формула нормализации: $$\hat{x}_i = \frac{x_i - \mu}{\sqrt{\sigma^2}}$$ где $\mu$ и $\sigma^2$ — матожидание и дисперсия в батче.

Далее применяется масштабирующее преобразование с обучаемыми параметрами $\gamma, \beta$: $$y_i = \gamma \hat{x}_i + \beta$$

Для инференса используются скользящие средние статистики: $$\mu_{t+1} = \alpha \times \mu_{batch} + (1 - \alpha) \mu_t$$ $$\sigma^2_{t+1} = \alpha \times \sigma^2_{batch} + (1 - \alpha) \sigma^2_t$$

Batch normalization позволяет ускорить сходимость сети и использовать больший learning rate.

5. Регуляризация

L1 и L2 регуляризация

Штраф за большие веса позволяет бороться с переобучением:

  • L2: $|W|_2^2 = \sum w^2$
  • L1: $|W|_1 = \sum |w|$
  • Elastic Net: Комбинация L1 и L2.

Dropout

Случайным образом «выключает» некоторые нейроны в процессе обучения. На каждой итерации выключаются разные нейроны.

  • Интерпретация: Уменьшение количества признаков.
  • Инференс: Когда в продакшене включаем все нейроны, необходимо нормировать выходы на долю нейронов, которые мы отключали во время обучения, чтобы сохранить распределение.

Residual Connection (Остаточные связи)

В очень глубоких сетях градиент может не доходить до нижних слоёв (становиться очень маленьким). С помощью сложения фичей в обход нескольких слоёв (skip connection) получается «проталкивать» градиент до нижних слоёв.

Аугментация

Искусственное расширение данных (например, для изображений). Улучшает работу сети в реальной жизни и позволяет получить лучший скор на test выборке.

6. Заключение

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

В следующих лекциях планируется рассмотрение задач компьютерного зрения (Computer Vision)?

Задача: Реализация KNN-классификатора "с нуля"

Напишите собственный класс, который реализует алгоритм k ближайших соседей для классификации.

Класс должен поддерживать:

  1. Две метрики расстояния: евклидову и манхэттенскую
  2. Два режима голосования: равномерный (uniform) и взвешенный по расстоянию (distance)
  3. Методы fit() и predict()

Протестируйте реализацию на датасете Iris и Digits, сравните точность с KNeighborsClassifier. В отчете проанализируйте, как выбор метрики и режима голосования влияет на качество классификации.

Ссылка на репозиторий

Задание: Реализация линейной регрессии с нуля

Реализуйте три варианта алгоритма линейной регрессии с нуля:

  • Аналитическое решение
  • Градиентный спуск
  • Стохастический градиентный спуск

Сравнить результаты с реализацией из sklearn, проанализировать влияние гиперпараметров.

Ссылка на репозиторий

Задание: Реализация логистической регрессии с нуля

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

Сравнить результаты с реализацией из sklearn, проанализировать влияние гиперпараметров.

Ссылка на репозиторий

Задание: Участие в Kaggle-соревновании "Getting Started"

Цель

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

Выбор соревнования

Выберите одно из соревнований из категории "Getting Started":

Требования

  1. Исследовательский анализ данных — загрузите данные, проверьте на пропуски и выбросы, исследуйте распределения и корреляции

  2. Подготовка данных — обработайте пропуски, закодируйте категориальные переменные, масштабируйте признаки

  3. Обучение моделей — обучите минимум 2 разные модели (например, логистическую регрессию и Random Forest для классификации)

  4. Прогнозирование — сделайте предсказания на тестовом наборе и отправьте результаты на Kaggle

  5. Анализ результатов — сравните качество моделей, выявите важные признаки, напишите выводы

Оформление

Создайте Jupyter-ноутбук со всеми этапами работы, кодом и выводами.

Полезные ресурсы

Ссылка на репозиторий

Вопросы и ответы по машинному обучению

Вопросы

Эти вопросы могут быть полезны для проверки понимания основ машинного обучения. Вопросы можно использовать для самопроверки или в качестве материала для обсуждения.

  1. К чему обычно применяется предположение i.i.d. (независимые одинаково распределенные)?
  2. Изменятся ли предсказания алгоритма kNN, если один из признаков (цены в рублях) перевести в евро, при прочих равных?
  3. Какой способ регуляризации в линейной регрессии имеет тенденцию к "отбору признаков"?
  4. Как выглядит аналитическое решение линейной регрессии с ошибкой MSE?
  5. К чему приведет домножение всех значений признаков в обучающей выборке на 10 для различных вариантов линейных моделей (MSE, MAE, с L2-регуляризацией)?
  6. После обучения на очень большой выборке линейная регрессия (в режиме inference) работает быстрее или медленнее kNN?
  7. Для каких моделей могут быть полезны методы L1 и L2 регуляризации?
  8. Какие утверждения о логистической регрессии верны?
  9. Что предсказывает решающее дерево в задаче регрессии в каждом листе?
  10. Как решающие деревья обрабатывают пропуски в данных?
  11. Повлияет ли добавление большого количества признаков, скоррелированных с уже существующим, на процесс построения ансамбля типа бустинга из деревьев?
  12. Что позволяет получить бустинг над линейными регрессиями?
  13. Какое требование к функции потерь предъявляет градиентный бустинг?
  14. Какие существуют основные типы признаков и виды задач в машинном обучении?
  15. Как выбор метрики расстояния влияет на kNN и в чем суть метода FRiS?
  16. В чем преимущества и недостатки градиентного спуска по сравнению с аналитическим решением регрессии?
  17. Как Momentum и использование batch помогают в градиентном спуске?
  18. Как именно L1 и L2 регуляризация меняют формулу обновления весов?
  19. Что такое margin (отступ) в контексте логистической регрессии?
  20. Как интерпретировать Confusion Matrix и когда стоит использовать Precision/Recall вместо Accuracy?
  21. Как рассчитываются энтропия и критерий Джини в вершинах решающего дерева?
  22. Что такое Bias-Variance trade-off и как он связан с переобучением?
  23. За счет чего Bagging и Random Forest уменьшают разброс (variance) ошибки?
  24. Опишите общий алгоритм построения композиции в градиентном бустинге.
  25. Как применяется Chain rule в методе обратного распространения ошибки?
  26. В чем отличия продвинутых оптимизаторов (Adam, RMSProp) от стандартного SGD?
  27. Какие существуют методы регуляризации и улучшения сходимости для нейронных сетей (Dropout, Batch Norm и др.)?