Machine Learning на Python: Интенсив для разработчиков

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

1. Инструментарий ML-инженера: NumPy, Pandas и визуализация данных

Инструментарий ML-инженера: NumPy, Pandas и визуализация данных

Добро пожаловать в курс «Machine Learning на Python: Интенсив для разработчиков». Вы уже владеете Python, умеете писать классы, функции и работать с API. Это отличное начало. Однако переход в Machine Learning (ML) требует смены парадигмы: от императивной обработки циклов к векторным вычислениям и статистическому анализу данных.

В этой первой статье мы не будем строить нейросети. Мы заложим фундамент. Любая модель машинного обучения — это, по сути, математическая функция, которая принимает на вход цифры (матрицы) и выдает цифры. Чтобы подготовить эти данные, нам нужен «Святой Грааль» Python Data Science стека: NumPy, Pandas и библиотеки визуализации (Matplotlib/Seaborn).

NumPy: Фундамент высокопроизводительных вычислений

Почему стандартных списков list в Python недостаточно? Представьте, что вам нужно умножить каждый элемент списка из миллиона чисел на 2. В чистом Python вы бы написали [x * 2 for x in data]. Это работает, но медленно, так как интерпретатор проверяет тип каждого элемента на каждой итерации.

NumPy (Numerical Python) решает эту проблему, вводя объект ndarray (n-dimensional array).

!Сравнение структуры памяти списка Python и массива NumPy

Векторизация и Broadcasting

Главная фишка NumPy — векторизация. Это способность выполнять операции над целыми массивами без явных циклов for. Это не просто синтаксический сахар, это использование инструкций процессора (SIMD) для параллельной обработки данных.

Второй важный концепт — Broadcasting (транслирование). NumPy умеет «растягивать» массивы меньшей размерности, чтобы они совпадали с большими массивами для арифметических операций.

Математика матриц

В ML мы постоянно работаем с матрицами. Одной из самых частых операций является скалярное произведение (Dot Product). Если у нас есть два вектора, их скалярное произведение вычисляется по формуле:

Где:

  • — результат скалярного произведения (одно число).
  • — знак суммирования.
  • — количество элементов в векторе (размерность).
  • — -й элемент вектора .
  • — -й элемент вектора .
  • В NumPy это делается одной командой:

    Pandas: Excel на стероидах

    Если NumPy — это фундамент для математики, то Pandas — это инструмент для работы со структурированными табличными данными. Большинство датасетов в индустрии приходят в формате CSV, Excel или SQL-таблиц.

    Pandas вводит две ключевые структуры данных:

  • Series: Одномерный массив с метками (индексом). Похож на колонку в Excel.
  • DataFrame: Двумерная таблица, состоящая из нескольких Series.
  • !Анатомия Pandas DataFrame

    Загрузка и анализ данных

    Типичный процесс начала работы ML-инженера выглядит так:

    Метод describe() автоматически вычисляет статистики для числовых колонок. Например, среднее значение (mean). Математически это выглядит так:

    Где:

  • — среднее арифметическое (mean).
  • — общее количество наблюдений (строк).
  • — значение признака для -й строки.
  • Фильтрация и манипуляции

    Pandas позволяет фильтровать данные, используя логические условия, очень похожие на SQL, но в синтаксисе Python:

    Визуализация данных: Matplotlib и Seaborn

    Сухие цифры могут лгать. Квартет Анскомба — классический пример того, как четыре разных набора данных имеют одинаковые статистические характеристики (среднее, дисперсия), но выглядят совершенно по-разному на графике. Поэтому Exploratory Data Analysis (EDA) — разведочный анализ данных — обязательный этап.

    Matplotlib

    Это «дедушка» визуализации в Python. Он мощный, низкоуровневый и позволяет настроить каждый пиксель. Однако код может быть громоздким.

    Seaborn

    Это надстройка над Matplotlib, созданная специально для статистической визуализации. Она работает напрямую с Pandas DataFrame и делает красивые графики «из коробки».

    !Пример визуализации Pairplot в Seaborn

    Для ML-инженера критически важно смотреть на распределение данных (нормальное ли оно?) и корреляцию признаков (зависит ли целевая переменная от входных данных?).

    Коэффициент корреляции Пирсона показывает линейную зависимость:

    Где:

  • — коэффициент корреляции (от -1 до 1).
  • — значения двух переменных.
  • — средние значения этих переменных.
  • Если близок к 1, переменные растут вместе. Если к -1 — одна растет, другая падает. Если 0 — линейной связи нет.

    Итог

    Мы рассмотрели три кита, на которых стоит Python Data Science:

  • NumPy — для быстрой математики и работы с матрицами.
  • Pandas — для загрузки, очистки и анализа табличных данных.
  • Matplotlib/Seaborn — для того, чтобы увидеть закономерности глазами.
  • В следующей статье мы используем эти инструменты, чтобы построить нашу первую модель машинного обучения — линейную регрессию, и разберем библиотеку Scikit-learn.

    2. Обучение с учителем: алгоритмы регрессии и классификации

    Обучение с учителем: алгоритмы регрессии и классификации

    В предыдущей статье мы собрали наш «инструментальный ящик»: научились манипулировать матрицами в NumPy, анализировать таблицы в Pandas и строить графики. Теперь у нас есть данные. Но что с ними делать? Как превратить таблицу с историческими данными в предсказание будущего?

    Добро пожаловать в мир Supervised Learning (обучения с учителем). Это самый распространенный и коммерчески успешный раздел машинного обучения. Сегодня мы разберем, как работают фундаментальные алгоритмы, напишем свой первый код на Scikit-learn и поймем математику, стоящую за «магией» предсказаний.

    Что такое обучение с учителем?

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

    В ML это работает так же. У нас есть:

  • Матрица признаков (Features, ): Входные данные (например, площадь квартиры, район, этаж).
  • Целевая переменная (Target, ): То, что мы хотим предсказать (например, цена квартиры).
  • Задача алгоритма — найти такую функцию , чтобы . Причем эта функция должна хорошо работать не только на тех данных, которые мы ей показали (обучающая выборка), но и на новых (тестовая выборка).

    Глобально задачи обучения с учителем делятся на два типа:

  • Регрессия: Предсказание непрерывного числа (цена, температура, выручка).
  • Классификация: Предсказание категории (спам/не спам, кошка/собака, болен/здоров).
  • Линейная регрессия: Классика жанра

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

    !Визуализация линейной зависимости между опытом и зарплатой с линией регрессии

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

    Где: * — предсказанное значение (зарплата). * — входной признак (опыт). * — вес (weight) или коэффициент наклона. Он показывает, насколько сильно влияет на . * — смещение (bias) или свободный член. Это значение , когда (базовая зарплата стажера без опыта).

    Если признаков много (опыт, стек технологий, город), уравнение превращается в сумму:

    Где: * — количество признаков. * — значение -го признака. * — вес -го признака. * — знак суммирования.

    Как модель учится? (Функция потерь)

    «Обучение» модели — это просто подбор таких весов , чтобы ошибка предсказания была минимальной. Но как измерить ошибку? Самая популярная метрика в регрессии — MSE (Mean Squared Error), среднеквадратичная ошибка.

    Где: * — количество примеров в обучающей выборке. * — реальное значение целевой переменной для -го примера. * — предсказанное моделью значение. * — квадрат разницы между фактом и прогнозом (квадрат нужен, чтобы отрицательные и положительные ошибки не гасили друг друга).

    Задача алгоритма — найти минимум этой функции. Для этого используется метод градиентного спуска (Gradient Descent), который итеративно меняет веса, «спускаясь» в точку минимальной ошибки.

    Практика с Scikit-learn

    Библиотека Scikit-learn (sklearn) — это стандарт индустрии для классического ML. У всех моделей в ней одинаковый интерфейс: создаем модель -> fit (обучаем) -> predict (предсказываем).

    Задача классификации

    Теперь представим, что нам нужно предсказать не число, а класс. Например, одобрить кредит клиенту (1) или нет (0).

    Если мы попробуем использовать линейную регрессию, она может выдать значение 0.8 или 1.5, или -0.2. Это неудобно интерпретировать как вероятность. Нам нужна функция, которая «сплющит» любой выход в диапазон от 0 до 1.

    Логистическая регрессия

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

    !Сигмоида трансформирует любое число в вероятность от 0 до 1

    Формула сигмоиды:

    Где: * — результат функции (вероятность класса 1), значение в диапазоне . * — число Эйлера (основание натурального логарифма, ). * — выход линейной части модели ().

    Если , мы говорим, что это класс 1. Если меньше — класс 0. Линия, где , называется разделяющей гиперплоскостью (Decision Boundary).

    K-Nearest Neighbors (k-NN)

    Еще один простой, но мощный алгоритм классификации — Метод k-ближайших соседей. Он работает по принципу: «Скажи мне, кто твой друг, и я скажу, кто ты».

    Алгоритм не учит веса. Вместо этого он запоминает всю обучающую выборку. Когда приходит новый объект:

  • Мы ищем самых похожих на него объектов из памяти (ближайших по расстоянию).
  • Смотрим, какой класс среди них преобладает.
  • Присваиваем этот класс новому объекту.
  • Оценка качества моделей

    Как понять, что наша модель хороша? Просто посмотреть на предсказания недостаточно.

    Метрики для регрессии

    * MAE (Mean Absolute Error): Средняя абсолютная ошибка. На сколько в среднем мы ошибаемся (в рублях, метрах и т.д.). * (Коэффициент детерминации): Показывает, какую долю дисперсии (разнообразия) данных объясняет наша модель. 1 — идеально, 0 — модель предсказывает просто среднее значение, < 0 — модель хуже, чем просто среднее.

    Метрики для классификации

    * Accuracy (Точность): Доля правильных ответов. . Осторожно:* Если у вас 95% здоровых пациентов и 5% больных, модель, которая всем ставит «здоров», получит Accuracy 95%, но будет бесполезна. * Precision (Точность срабатывания): Если модель сказала «это спам», какова вероятность, что это действительно спам? * Recall (Полнота): Какую долю реального спама нашла модель?

    Проблема переобучения (Overfitting)

    Это главная боль ML-инженера. Представьте студента, который вызубрил ответы на билеты, но не понял предмет. На экзамене (обучающая выборка) он получит 5, но на реальной задаче (тестовая выборка) провалится.

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

    Признаки переобучения: * Ошибка на Train (обучении) очень низкая. * Ошибка на Test (тесте) высокая.

    Чтобы бороться с этим, мы используем:

  • Разделение данных (train_test_split).
  • Регуляризацию (штраф за слишком большие веса модели).
  • Больше данных.
  • Заключение

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

    В следующей статье мы отойдем от линейных моделей и рассмотрим Деревья решений и Ансамбли — алгоритмы, которые сегодня выигрывают большинство соревнований на Kaggle с табличными данными.

    3. Feature Engineering, предобработка данных и валидация моделей

    Feature Engineering, предобработка данных и валидация моделей

    В предыдущих статьях мы научились загружать данные с помощью Pandas и обучать базовые модели (линейную регрессию, k-NN) с помощью Scikit-learn. Казалось бы, всё просто: fit -> predict. Но в реальной жизни между получением данных и обучением модели лежит огромная пропасть.

    В индустрии существует поговорка: Garbage In, Garbage Out (Мусор на входе — мусор на выходе). Если вы подадите в самую мощную нейросеть «грязные» данные, она выдаст бесполезный результат. Более того, качество модели на 80% зависит не от выбора алгоритма, а от того, как вы подготовили данные.

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

    Предобработка данных: Чистим «мусор»

    Реальные данные никогда не бывают идеальными. В них есть пропуски, выбросы и ошибки. Большинство алгоритмов Scikit-learn просто упадут с ошибкой, если вы попытаетесь скормить им NaN (Not a Number) или строку вместо числа.

    Работа с пропущенными значениями

    Пропуски могут возникать по разным причинам: пользователь не заполнил поле, датчик сломался, данные потерялись при экспорте. У нас есть три основные стратегии:

  • Удаление: Если строк с пропусками мало (например, < 5%), их можно просто выкинуть.
  • Заполнение константой: Заменить все пропуски на 0 или «Unknown».
  • Импутация (Imputation): Заполнение статистикой (средним, медианой или модой).
  • Почему медиана часто лучше среднего? Среднее арифметическое чувствительно к выбросам. Если в комнате сидят 10 человек со средней зарплатой 50к, и заходит миллиардер, средняя зарплата станет огромной, хотя у большинства она не изменилась. Медиана устойчива к таким ситуациям.

    Кодирование категориальных признаков

    Машины понимают только цифры. Если у вас есть колонка «Цвет» со значениями «Красный», «Зеленый», «Синий», модель не сможет с ней работать напрямую. Нам нужно превратить категории в числа.

    Label Encoding Каждой категории присваивается уникальное число: Красный = 1, Зеленый = 2, Синий = 3. Проблема: Алгоритм может решить, что Синий (3) больше, чем Красный (1), и между ними есть математическая связь. Это подходит только для порядковых данных (например, размер одежды: S, M, L).

    One-Hot Encoding (OHE) Создается новая колонка для каждой категории. Если объект «Красный», то в колонке «is_red» будет 1, а в остальных 0.

    !Визуализация процесса One-Hot Encoding: превращение одной категориальной колонки в несколько бинарных.

    В Pandas это делается функцией get_dummies, но в ML-пайплайнах лучше использовать OneHotEncoder из sklearn.

    Масштабирование признаков (Feature Scaling)

    Представьте, что мы используем алгоритм k-NN (ближайшие соседи) для предсказания кредитного рейтинга. У нас два признака:

  • Возраст (от 18 до 90).
  • Зарплата (от 20 000 до 500 000).
  • Евклидово расстояние между точками считается как корень из суммы квадратов разностей. Разница в зарплате (например, 10 000) будет вносить колоссальный вклад в расстояние по сравнению с разницей в возрасте (например, 10 лет). Модель будет «смотреть» только на зарплату.

    Чтобы этого избежать, мы приводим все признаки к одному масштабу.

    Стандартизация (StandardScaler)

    Мы преобразуем данные так, чтобы среднее значение стало равно 0, а стандартное отклонение — 1. Это делает распределение признака «стандартным нормальным» (если оно изначально было похоже на нормальное).

    Формула стандартизации для каждого значения :

    Где: * — новое масштабированное значение. * — исходное значение признака. * (мю) — среднее значение этого признака во всей выборке. * (сигма) — стандартное отклонение признака.

    Нормализация (MinMaxScaler)

    Мы сжимаем все данные в диапазон от 0 до 1.

    Где: * — новое значение в диапазоне [0, 1]. * — исходное значение. * — минимальное значение признака в выборке. * — максимальное значение признака в выборке.

    > Важное правило: Деревьям решений (Random Forest, Gradient Boosting) масштабирование обычно не нужно. Но для линейных моделей, нейросетей и методов ближайших соседей оно обязательно.

    Feature Engineering: Творчество в ML

    Feature Engineering — это процесс создания новых признаков из уже имеющихся, чтобы помочь модели найти закономерности. Это то место, где знание предметной области (доменная экспертиза) важнее навыков программирования.

    Примеры: * Даты: Из поля 2023-10-05 14:30 модель ничего не поймет. Но если мы извлечем day_of_week (четверг), hour (14) или is_weekend (0), мы можем найти зависимость продаж от времени суток. * Текст: Длину сообщения или количество знаков препинания можно использовать как признак для детекции спама. * Нелинейности: Если зависимость квадратичная, можно добавить признак .

    Валидация: Как не обмануть себя

    В прошлой статье мы использовали train_test_split, чтобы разбить данные на обучение и тест. Но что, если нам просто «повезло» с разбиением? Что, если в тестовую выборку попали только легкие примеры?

    Cross-Validation (Кросс-валидация)

    Чтобы получить более надежную оценку качества модели, используют k-fold cross-validation (кросс-валидацию по k блокам).

    Алгоритм:

  • Разбиваем все данные на равных частей (фолдов). Обычно или .
  • Проводим итераций обучения.
  • На каждой итерации один фолд используется как тест, а остальные — как обучение.
  • Усредняем метрики качества со всех итераций.
  • !Иллюстрация процесса кросс-валидации: данные делятся на блоки, и каждый блок по очереди становится тестовым.

    Утечка данных (Data Leakage)

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

    Типичная ошибка:

  • Сделать масштабирование (StandardScaler) на всем датасете.
  • Потом сделать train_test_split.
  • Почему это плохо? При вычислении среднего и стандартного отклонения для масштабирования вы использовали данные из будущего тестового набора. Модель косвенно «подсмотрела» распределение тестовых данных.

    Правильный подход:

  • Сделать train_test_split.
  • Сделать fit скейлера только на X_train.
  • Сделать transform на X_train и X_test, используя параметры, вычисленные на трейне.
  • Scikit-learn Pipelines

    Чтобы избежать утечек и писать чистый код, в sklearn есть класс Pipeline. Он позволяет объединить шаги предобработки и модель в единый объект.

    Заключение

    Мы разобрали критически важные этапы построения ML-систем:

  • Очистка: Заполнение пропусков и удаление мусора.
  • Кодирование: Превращение категорий в числа (One-Hot).
  • Масштабирование: Помощь метрическим алгоритмам через StandardScaler.
  • Валидация: Использование Cross-Validation для честной оценки.
  • Пайплайны: Автоматизация процессов для защиты от утечек данных.
  • Теперь, когда мы умеем готовить данные и честно оценивать результат, мы готовы перейти к более сложным и мощным алгоритмам. В следующей статье мы разберем Деревья решений и Случайный лес — алгоритмы, которые доминируют в задачах с табличными данными.

    4. Обучение без учителя: методы кластеризации и снижения размерности

    Обучение без учителя: методы кластеризации и снижения размерности

    В предыдущих частях курса мы занимались обучением с учителем (Supervised Learning). У нас всегда были правильные ответы: цены квартир для регрессии или метки «спам/не спам» для классификации. Мы учили модель подгонять свои предсказания под эти эталоны.

    Но что делать, если правильных ответов нет? Представьте, что вы работаете в маркетплейсе. У вас есть база из миллиона пользователей с историей покупок, и бизнес ставит задачу: «Раздели клиентов на сегменты, чтобы мы могли делать персонализированные предложения». Никто заранее не знает, какие это сегменты: «любители гаджетов», «молодые родители» или «охотники за скидками». У вас есть только данные (), но нет целевой переменной ().

    Добро пожаловать в мир Unsupervised Learning (обучения без учителя). Здесь алгоритм предоставлен сам себе: он должен самостоятельно найти структуру, паттерны и закономерности в хаосе данных.

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

  • Кластеризация: Группировка похожих объектов.
  • Снижение размерности: Сжатие данных с сохранением смысла.
  • Кластеризация: Поиск порядка в хаосе

    Задача кластеризации — разбить множество объектов на группы (кластеры) так, чтобы объекты внутри одной группы были максимально похожи друг на друга, а объекты из разных групп — максимально отличались.

    K-Means (Метод k-средних)

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

    !Итеративный процесс обучения K-Means: от случайной инициализации до финального разделения.

    Алгоритм работает так:

  • Мы выбираем число кластеров заранее (это гиперпараметр).
  • Случайно выбираем точек в пространстве данных как начальные центроиды.
  • Шаг присвоения: Для каждой точки данных вычисляем расстояние до всех центроидов и относим точку к ближайшему.
  • Шаг обновления: Пересчитываем положение центроидов. Новый центр кластера — это среднее арифметическое координат всех точек, попавших в этот кластер.
  • Повторяем шаги 3 и 4, пока центроиды не перестанут двигаться.
  • Математически «близость» обычно определяется через Евклидово расстояние:

    Где: * — расстояние между точкой данных и центроидом . * — количество признаков (размерность пространства). * — значение -го признака у объекта. * — значение -го признака у центроида. * — знак суммирования по всем признакам.

    Пример на Python:

    Проблема выбора K Как понять, сколько кластеров нам нужно? Для этого используют метод локтя (Elbow Method). Мы строим график зависимости Inertia (сумма квадратов расстояний от точек до их центроидов) от количества кластеров . Чем больше , тем меньше ошибка, но в какой-то момент падение замедляется. Этот изгиб («локоть») и есть оптимальное число.

    DBSCAN: Когда формы имеют значение

    K-Means отлично работает с простыми круглыми кластерами. Но что, если ваши данные выглядят как два вложенных полумесяца или кольцо внутри кольца? K-Means попытается разбить их прямыми линиями и ошибется.

    Здесь на сцену выходит DBSCAN (Density-Based Spatial Clustering of Applications with Noise). Он ищет области с высокой плотностью точек.

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

  • Не нужно заранее задавать число кластеров.
  • Находит кластеры любой формы.
  • Умеет находить выбросы (шум) — точки, которые не принадлежат ни одному кластеру.
  • Алгоритм использует два параметра: * eps (радиус окрестности): максимальное расстояние между двумя точками, чтобы считать их соседями. * min_samples: минимальное количество соседей в радиусе eps, чтобы точка считалась «ядровой» (центром плотного скопления).

    Снижение размерности: Проклятие размерности

    В реальных задачах у нас часто бывают сотни и тысячи признаков. Представьте таблицу с 10 000 колонок. Работать с такими данными сложно по двум причинам:

  • Вычислительная сложность: Алгоритмы работают медленно.
  • Проклятие размерности: В многомерном пространстве все точки становятся одинаково далекими друг от друга, и понятие «соседства» теряет смысл.
  • Снижение размерности позволяет сжать информацию, оставив только самое важное. Это как тень от трехмерного объекта на стене: мы теряем объем, но сохраняем очертания.

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

    Principal Component Analysis (PCA) — это король линейного снижения размерности. Его задача — найти такие новые оси (главные компоненты), вдоль которых данные имеют наибольший разброс (дисперсию).

    Представьте вытянутое облако точек. PCA проведет первую ось вдоль самой длинной части облака. Вторую ось — перпендикулярно первой. И так далее.

    !PCA находит направления максимальной дисперсии и поворачивает данные так, чтобы эти направления стали новыми осями координат.

    Математически PCA выполняет линейное преобразование матрицы данных :

    Где: * — новая матрица данных меньшей размерности. * — исходная центрированная матрица данных. * — матрица весов (собственные векторы ковариационной матрицы), определяющая направление новых осей.

    Главная метрика PCA — Explained Variance Ratio (доля объясненной дисперсии). Она говорит, сколько информации сохранила каждая компонента.

    Пример: Сжатие данных с 4D до 2D Возьмем классический датасет ирисов Фишера (4 признака: длина/ширина чашелистика и лепестка) и сожмем его до плоскости, чтобы нарисовать.

    В результате мы получаем 2D график, на котором четко видны разделенные группы цветов, хотя изначально мы не использовали информацию о сортах (target) при обучении PCA.

    t-SNE и UMAP: Нелинейная магия

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

    * t-SNE (t-Distributed Stochastic Neighbor Embedding): Старается сохранить соседей. Если точки были рядом в исходном пространстве, они останутся рядом и на плоскости. Отлично подходит для визуализации, но не сохраняет глобальную структуру и расстояния. * UMAP: Современный аналог t-SNE. Работает быстрее и лучше сохраняет глобальную структуру данных.

    Практическое применение в пайплайнах

    Часто методы Unsupervised Learning используют как этап предобработки для Supervised Learning. Например:

  • Использовать PCA, чтобы убрать шум и коррелирующие признаки перед подачей в линейную регрессию.
  • Использовать K-Means, чтобы создать новый признак cluster_id для классификатора (Feature Engineering).
  • Заключение

    Обучение без учителя — это способ понять природу данных, когда у нас нет подсказок. * K-Means помогает быстро разбить данные на группы. * DBSCAN находит сложные структуры и чистит данные от шума. * PCA позволяет сжать данные и визуализировать многомерные миры.

    Теперь ваш арсенал ML-инженера почти полон. Вы умеете предсказывать числа, классифицировать объекты и находить скрытые структуры. В следующей, завершающей части курса, мы коснемся самой хайповой темы современности — Нейронных сетей и Deep Learning.

    5. Введение в нейронные сети и глубокое обучение

    Введение в нейронные сети и глубокое обучение

    Мы прошли долгий путь. Мы начали с основ NumPy и Pandas, научились предсказывать числа с помощью линейной регрессии, классифицировать объекты методом k-ближайших соседей и даже искать скрытые структуры в данных с помощью кластеризации. Все эти методы относятся к классическому машинному обучению (Classical ML).

    Сегодня мы переходим к теме, которая произвела революцию в мире технологий за последние 10 лет. Мы поговорим о нейронных сетях и глубоком обучении (Deep Learning). Именно эти технологии стоят за распознаванием лиц в вашем смартфоне, за переводчиками текстов и за генерацией изображений.

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

    От биологии к математике: Перцептрон

    Идея искусственных нейронных сетей возникла из попыток смоделировать работу человеческого мозга. Наш мозг состоит из миллиардов нейронов, соединенных синапсами. Нейрон получает электрические сигналы от соседей, суммирует их и, если сигнал достаточно сильный, «выстреливает» импульс дальше.

    В 1957 году Фрэнк Розенблатт представил математическую модель этого процесса — перцептрон.

    !Сравнение биологического нейрона и искусственного перцептрона

    Анатомия искусственного нейрона

    Один нейрон выполняет простую работу: он взвешивает входные данные и принимает решение. Математически это выглядит так:

    Где: * — взвешенная сумма входов (до применения функции активации). * — количество входов (признаков). * — вес (weight) -го входа. Вес определяет важность признака. Если большой, нейрон сильно реагирует на этот вход. * — значение -го входного признака. * — смещение (bias). Это порог чувствительности нейрона. Он позволяет сдвигать функцию активации влево или вправо.

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

    Разница в функции активации.

    Функции активации: Добавляем нелинейность

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

    Функция активации берет взвешенную сумму и преобразует её. Итоговый выход нейрона:

    Где: * — выходное значение нейрона (activation). * — функция активации. * — взвешенная сумма входов.

    Популярные функции активации

  • Сигмоида (Sigmoid):
  • Превращает любое число в диапазон . Исторически использовалась часто, но сейчас считается устаревшей для скрытых слоев из-за проблемы затухания градиента. Где: * — результат функции (значение от 0 до 1). * — число Эйлера (). * — входное значение.

  • ReLU (Rectified Linear Unit):
  • Стандарт де-факто для современного Deep Learning. Она очень проста: если число положительное, оставляем как есть, если отрицательное — заменяем на ноль. Где: * — результат функции. * — операция выбора максимального из двух чисел: нуля и .

    ReLU работает быстро и позволяет обучать очень глубокие сети.

    Архитектура нейронной сети

    Один нейрон — это слабо. Сила нейросетей — в коллективе. Мы объединяем нейроны в слои.

    !Архитектура полносвязной нейронной сети (MLP)

    Типичная архитектура Feedforward Neural Network (сети прямого распространения) состоит из:

  • Входной слой (Input Layer): Принимает сырые данные (пиксели картинки, слова текста, параметры квартиры). Количество нейронов равно количеству признаков.
  • Скрытые слои (Hidden Layers): «Мозг» сети. Здесь происходит магия выделения признаков. Чем больше слоев, тем «глубже» сеть (отсюда и Deep Learning).
  • Выходной слой (Output Layer): Выдает финальный результат. Для регрессии это один нейрон (цена), для классификации — вектор вероятностей классов.
  • Почему «Глубокое» обучение?

    Каждый следующий слой учится распознавать более сложные паттерны на основе предыдущего. * Первый слой может видеть простые линии и грани. * Второй слой собирает из линий геометрические фигуры (круги, квадраты). * Третий слой собирает из фигур части объектов (глаза, колеса). * Четвертый слой видит целые объекты (кошка, машина).

    Как сеть учится? (Backpropagation)

    Процесс обучения нейросети похож на настройку гитары, только струн (весов ) миллионы. Этот процесс состоит из трех этапов:

    1. Прямое распространение (Forward Pass)

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

    2. Вычисление ошибки (Loss Calculation)

    Мы сравниваем предсказание с правильным ответом с помощью функции потерь (Loss Function), например, MSE для регрессии или Cross-Entropy для классификации.

    3. Обратное распространение ошибки (Backpropagation)

    Это самый важный алгоритм в Deep Learning. Мы должны понять: как нужно изменить каждый вес , чтобы ошибка уменьшилась?

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

    Формула обновления весов:

    Где: * — новое значение веса. * — текущее значение веса. * (альфа) — скорость обучения (learning rate). Коэффициент, определяющий размер шага. * — частная производная функции потерь по весу (градиент). Показывает, как сильно ошибка зависит от этого конкретного веса.

    Практика: Keras и PyTorch

    В Python есть два основных фреймворка для Deep Learning:

  • PyTorch (от Meta): Любимец исследователей. Гибкий, динамичный, «pythonic».
  • TensorFlow / Keras (от Google): Keras — это высокоуровневый API, работающий поверх TensorFlow. Он идеален для новичков и быстрого прототипирования.
  • Давайте создадим простую сеть на Keras для классификации рукописных цифр (знаменитый датасет MNIST).

    Этот код создает полносвязную сеть. Dense означает, что каждый нейрон этого слоя соединен с каждым нейроном предыдущего слоя.

    Проблемы и ограничения

    Нейросети — мощный инструмент, но капризный: * Требуют много данных: На 100 примерах нейросеть не обучится, ей нужны тысячи или миллионы. * Black Box (Черный ящик): Сложно понять, почему сеть приняла именно такое решение. Интерпретируемость низкая. * Вычислительные ресурсы: Для обучения серьезных моделей нужны мощные видеокарты (GPU).

    Заключение

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

    Глубокое обучение — это не замена классическому ML, а расширение инструментария. Если у вас табличные данные (Excel), градиентный бустинг (который мы упоминали ранее) часто работает лучше и быстрее. Но если вы работаете с картинками, звуком или текстом — нейросети вне конкуренции.

    В этом курсе мы заложили фундамент. Дальше вас ждет бесконечный мир архитектур: сверточные сети (CNN) для зрения, рекуррентные сети (RNN) и трансформеры (Transformers) для текстов. Но база у них одна — нейроны, веса и градиенты.