Фаза 02 · урок 01
Что такое машинное обучение
Цель урока: Вы хотите создать спам-фильтр. Традиционный подход: сесть и написать сотни правил. «Если письмо содержит “FREE MONEY”, пометь его как спам. Если в нём больше трёх восклицательных знаков, пометь его как спам». Вы тратите недели на…
Текущий релиз AlexBred.com: первые 100 уроков русскоязычной программы.
Содержание урока
- Цели обучения
- Проблема
- Концепция
- Обучение на данных, а не на правилах
- Три типа машинного обучения
- За пределами большой тройки
- Классификация и регрессия
- Рабочий процесс ML
- Обучающая, валидационная и тестовая выборки
- Переобучение и недообучение
- Компромисс между смещением и дисперсией
- Теорема об отсутствии бесплатного обеда
- Когда НЕ следует использовать машинное обучение
- Создайте это
- Шаг 1: классификатор ближайшего центроида с нуля
- Шаг 2: обучение на синтетических данных
- Шаг 3: сравнение с базовой линией
- Почему это важно
- Шаг 4: чего классификатор центроидов не умеет
- Используйте это
- Внедрите это
- Ключевые термины
- Упражнения
- Дополнительное чтение
Машинное обучение — это обучение компьютеров находить закономерности в данных вместо ручного написания правил.
Тип: Изучение Языки: Python Предварительные требования: Фаза 1 (Математические основы) Время: ~45 минут
Цели обучения
- Объяснять разницу между обучением с учителем, без учителя и с подкреплением и определять, какой тип применим к данной задаче
- Реализовывать классификатор ближайшего центроида с нуля и оценивать его по сравнению со случайной базовой линией
- Различать задачи классификации и регрессии и выбирать для каждой подходящую функцию потерь
- Оценивать, подходит ли данная бизнес-задача для ML или её лучше решать детерминированными правилами
Проблема
Вы хотите создать спам-фильтр. Традиционный подход: сесть и написать сотни правил. «Если письмо содержит “FREE MONEY”, пометь его как спам. Если в нём больше трёх восклицательных знаков, пометь его как спам». Вы тратите недели на написание правил. Затем спамеры меняют формулировки. Ваши правила перестают работать. Вы пишете ещё больше правил. Этот цикл никогда не заканчивается.
Машинное обучение меняет подход. Вместо написания правил вы даёте компьютеру тысячи размеченных писем («спам» или «не спам») и позволяете ему самостоятельно вывести правила. Компьютер находит закономерности, о которых вы бы никогда не подумали. Когда спамеры меняют тактику, вы переобучаете модель на новых данных, а не переписываете код.
Этот переход от «программирования правил» к «обучению на данных» — суть машинного обучения. Так работают все рекомендательные системы, голосовые помощники, беспилотные автомобили и языковые модели.
Концепция
Обучение на данных, а не на правилах
Традиционное программирование и машинное обучение решают задачи в противоположных направлениях.
В традиционном программировании вы пишете правила. Программа применяет их к данным и создаёт результат.
В машинном обучении вы предоставляете данные и ожидаемые результаты. Алгоритм сам обнаруживает правила.
«Модель», получаемая в результате обучения, И ЕСТЬ правила, закодированные в числах (весах, параметрах). Она обобщает увиденные примеры, чтобы делать предсказания для данных, которых никогда не видела.
Три типа машинного обучения
Обучение с учителем (supervised learning): у вас есть пары «вход — выход». Модель учится отображать входы в выходы.
- «Вот 10 000 фотографий с метками “кошка” или “собака”. Научись отличать их».
- «Вот характеристики домов и их цены. Научись предсказывать цену».
Обучение без учителя (unsupervised learning): у вас есть только входные данные. Меток нет. Модель самостоятельно находит структуру.
- «Вот истории покупок 10 000 клиентов. Найди естественные группы».
- «Вот 1 000 точек данных высокой размерности. Сократи размерность до 2, сохранив структуру».
Обучение с подкреплением (reinforcement learning): агент выполняет действия в среде и получает награды или штрафы. Он учится стратегии (policy), максимизирующей суммарную награду.
- «Играй в эту игру. +1 за победу, -1 за поражение. Выработай стратегию».
- «Управляй этой рукой робота. +1 за поднятие объекта, -0.01 за каждую потраченную впустую секунду».
Большинство того, что вы будете создавать на практике, использует обучение с учителем. Обучение без учителя распространено для предобработки и исследования данных. Обучение с подкреплением лежит в основе игрового ИИ, робототехники и RLHF для языковых моделей.
За пределами большой тройки
Три приведённые выше категории чётко разделены, но в реальном ML границы между ними часто размываются.
Полуобучение с учителем (semi-supervised learning) использует небольшой набор размеченных данных и большой набор неразмеченных. У вас может быть 100 размеченных медицинских изображений и 100 000 неразмеченных. Методы включают:
- Распространение меток (label propagation): постройте граф, соединяющий похожие точки данных. Метки распространяются от размеченных узлов к неразмеченным соседям по графу.
- Псевдоразметка (pseudo-labeling): обучите модель на размеченных данных, используйте её для предсказания меток неразмеченных данных, затем переобучите на всём наборе. Модель сама наращивает свой обучающий набор.
- Регуляризация согласованности (consistency regularization): модель должна давать одно и то же предсказание для входа и для его слегка возмущённой версии. Это работает даже без меток.
Самообучение с учителем (self-supervised learning) создаёт сигнал обучения из самих данных. Человеческие метки вообще не нужны. Модель формирует собственную задачу предсказания из структуры данных.
- Моделирование маскированного языка (BERT): скройте 15% слов в предложении и обучайте модель предсказывать пропущенные слова. «Метки» берутся из исходного текста.
- Контрастивное обучение (SimCLR): возьмите изображение, создайте две его аугментированные версии. Обучайте модель распознавать, что они получены из одного изображения, и отличать их от аугментированных версий других изображений.
- Предсказание следующего токена (GPT): предсказывайте следующее слово по всем предыдущим словам. Каждый текстовый документ становится обучающим примером.
Это не отдельные от большой тройки категории. Это стратегии, объединяющие идеи обучения с учителем и без учителя. Самообучение технически относится к обучению с учителем (модель что-то предсказывает), но метки генерируются автоматически, а не людьми.
Классификация и регрессия
Это две основные задачи обучения с учителем.
| Аспект | Классификация | Регрессия |
|---|---|---|
| Выход | Дискретные категории | Непрерывные числа |
| Пример | «Это письмо — спам?» | «Какой будет цена дома?» |
| Пространство выходов | {кошка, собака, птица} | Любое вещественное число |
| Функция потерь | Кросс-энтропия, точность | Среднеквадратичная ошибка, MAE |
| Решение | Границы между классами | Кривая, аппроксимирующая данные |
Классификация отвечает на вопрос «к какой категории?». Регрессия отвечает на вопрос «сколько?».
Некоторые задачи можно сформулировать обоими способами. Предсказание роста или падения акции — это классификация. Предсказание точной цены — регрессия.
Рабочий процесс ML
Каждый проект машинного обучения проходит один и тот же конвейер независимо от алгоритма.
Сбор данных (Collect Data): соберите исходные данные. Больше данных почти всегда лучше, но качество важнее количества.
Очистка и исследование (Clean & Explore): обработайте пропуски, удалите дубликаты, визуализируйте распределения, найдите аномалии. Этот этап часто занимает 60–80% всего времени проекта.
Проектирование признаков (Feature Engineering): преобразуйте исходные данные в признаки, которые модель может использовать. Превращайте даты в день недели. Нормализуйте числовые столбцы. Кодируйте категориальные переменные. Хорошие признаки важнее модных алгоритмов.
Разделение данных (Split Data): разделите данные на обучающую, валидационную и тестовую выборки. Модель обучается на обучающей выборке, вы настраиваете гиперпараметры на валидационной и сообщаете итоговую производительность на тестовой.
Обучение модели (Train Model): подайте обучающие данные в алгоритм. Алгоритм корректирует внутренние параметры, чтобы минимизировать функцию потерь.
Оценка (Evaluate): измерьте производительность на валидационных/тестовых данных. Если результат неприемлем, вернитесь и попробуйте другие признаки, алгоритмы или гиперпараметры.
Развёртывание (Deploy): переведите модель в продакшен, где она будет делать предсказания для новых данных.
Мониторинг (Monitor): отслеживайте производительность со временем. Распределения данных меняются (дрейф данных, data drift), и модели ухудшаются. Когда производительность падает, переобучите модель.
Обучающая, валидационная и тестовая выборки
Это самый важный принцип, который новички понимают неправильно. Модель необходимо оценивать на данных, которые она никогда не видела во время обучения. Иначе вы измеряете запоминание, а не обучение.
| Выборка | Назначение | Когда используется | Типичный размер |
|---|---|---|---|
| Обучающая | Модель учится на этих данных | Во время обучения | 60–80% |
| Валидационная | Настройка гиперпараметров, сравнение моделей | После каждого запуска обучения | 10–20% |
| Тестовая | Итоговая непредвзятая оценка производительности | Один раз, в самом конце | 10–20% |
Тестовая выборка неприкосновенна. Вы смотрите на неё ровно один раз. Если вы продолжаете корректировать модель на основе тестовой производительности, то фактически обучаетесь на тестовой выборке, и заявленные показатели становятся бессмысленными.
Для небольших наборов данных используйте k-fold кросс-валидацию: разделите данные на k частей, обучайтесь на k-1 частях, валидируйте на оставшейся, чередуйте их и усредняйте результаты.
Переобучение и недообучение
Недообучение (underfitting): модель слишком проста, чтобы уловить закономерности в данных. Прямая пытается аппроксимировать криволинейную зависимость. Ошибка обучения высока. Ошибка на тесте высока.
Переобучение (overfitting): модель слишком сложна и запоминает обучающие данные, включая шум. Это извилистая кривая, которая проходит через каждую обучающую точку, но не справляется с новыми данными. Ошибка обучения низка. Ошибка на тесте высока.
Хорошее соответствие (good fit): модель улавливает реальные закономерности, не запоминая шум. И ошибка обучения, и ошибка на тесте достаточно низки.
Признаки переобучения:
- Точность на обучении намного выше точности на валидации
- Модель хорошо работает на обучающих данных, но плохо на новых
- Добавление обучающих данных повышает производительность (модель запоминала, а не училась)
Способы устранить переобучение:
- Получить больше обучающих данных
- Снизить сложность модели (меньше параметров, более простая архитектура)
- Регуляризация (добавить штраф за большие веса)
- Dropout (случайно обнулять нейроны во время обучения)
- Ранняя остановка (прекратить обучение, когда валидационная ошибка начинает расти)
Способы устранить недообучение:
- Использовать более сложную модель
- Добавить больше признаков
- Уменьшить регуляризацию
- Обучать дольше
Компромисс между смещением и дисперсией
Это математическая основа переобучения и недообучения.
Смещение (bias): ошибка от неверных предположений модели. Линейная модель имеет высокое смещение, когда истинная зависимость нелинейна. Высокое смещение приводит к недообучению.
Дисперсия (variance): ошибка из-за чувствительности к небольшим колебаниям обучающих данных. Модель с высокой дисперсией даёт очень разные предсказания, если обучить её на разных подмножествах данных. Высокая дисперсия приводит к переобучению.
| Сложность модели | Смещение | Дисперсия | Результат |
|---|---|---|---|
| Слишком низкая (линейная модель для криволинейных данных) | Высокое | Низкая | Недообучение |
| В самый раз | Среднее | Средняя | Хорошее обобщение |
| Слишком высокая (полином степени 20 для 10 точек) | Низкое | Высокая | Переобучение |
Полная ошибка = Смещение^2 + Дисперсия + Неустранимый шум
Вы не можете уменьшить неустранимый шум (это случайность в самих данных). Нужно найти золотую середину, в которой смещение^2 + дисперсия минимально.
Теорема об отсутствии бесплатного обеда
Не существует единого алгоритма, который лучше всего работает для любой задачи. Алгоритм, хорошо работающий на одном классе задач, будет плохо работать на другом. Поэтому специалисты по данным пробуют несколько алгоритмов и сравнивают результаты.
На практике выбор зависит от:
- Количества имеющихся данных
- Количества признаков
- Линейности или нелинейности зависимости
- Необходимости интерпретируемости
- Доступных вычислительных ресурсов
Когда НЕ следует использовать машинное обучение
ML мощен, но не всегда является правильным инструментом. Прежде чем тянуться к модели, спросите себя, действительно ли она нужна.
Не используйте ML, когда:
- Правила просты и чётко определены. Расчёт налогов, алгоритмы сортировки, преобразование единиц измерения. Если логику можно выразить несколькими if-операторами, модель добавляет сложность без пользы.
- У вас нет данных или их слишком мало. ML нужны примеры, чтобы учиться на них. С 10 точками данных невозможно обучить что-то содержательное. Сначала соберите данные.
- Цена ошибки катастрофична и нужна гарантированная корректность. Расчёт дозы лекарства, управление ядерным реактором, криптографическая проверка. Модели ML вероятностны. Иногда они будут ошибаться. Если «иногда ошибается» неприемлемо, используйте детерминированные методы.
- Задачу решает таблица поиска или эвристика. Если простой порог или таблица покрывает 99% случаев, добавление ML увеличивает стоимость поддержки без заметного улучшения.
- Вы не можете объяснить решение, а объяснимость обязательна. Регулируемые отрасли (кредитование, страхование, уголовное правосудие) иногда требуют, чтобы каждое решение было полностью объяснимо. Некоторые модели ML интерпретируемы (линейная регрессия, небольшие деревья решений). Большинство — нет.
- Задача меняется быстрее, чем вы можете переобучаться. Если правила меняются ежедневно, а переобучение занимает неделю, модель всегда будет устаревшей.
Используйте эту диаграмму принятия решения:
Создайте это
Код в code/ml_intro.py реализует классификатор ближайшего центроида с нуля — простейший возможный алгоритм ML. Он демонстрирует основную идею: учиться на данных, а затем предсказывать для новых данных.
Шаг 1: классификатор ближайшего центроида с нуля
Классификатор ближайшего центроида вычисляет центр (среднее) каждого класса в обучающих данных. Для предсказания он относит каждую новую точку к классу, центр которого находится ближе всего.
class NearestCentroid:
def fit(self, X, y):
self.classes = np.unique(y)
self.centroids = np.array([
X[y == c].mean(axis=0) for c in self.classes
])
def predict(self, X):
distances = np.array([
np.sqrt(((X - c) ** 2).sum(axis=1))
for c in self.centroids
])
return self.classes[distances.argmin(axis=0)]
Это весь алгоритм. Fit вычисляет два средних. Predict вычисляет расстояния. Никакого градиентного спуска, итераций или гиперпараметров.
Шаг 2: обучение на синтетических данных
Мы создаём двумерный набор данных для классификации с двумя классами, которые немного перекрываются. Классификатор центроидов проводит линейную границу решения между центрами классов.
rng = np.random.RandomState(42)
X_class0 = rng.randn(100, 2) + np.array([1.0, 1.0])
X_class1 = rng.randn(100, 2) + np.array([-1.0, -1.0])
X = np.vstack([X_class0, X_class1])
y = np.array([0] * 100 + [1] * 100)
Шаг 3: сравнение с базовой линией
Каждую ML-модель следует сравнивать с тривиальной базовой линией. Здесь базовая линия предсказывает случайный класс. Если ваша ML-модель не превосходит случайное угадывание, что-то не так.
baseline_preds = rng.choice([0, 1], size=len(y_test))
baseline_acc = np.mean(baseline_preds == y_test)
Классификатор центроидов должен достигать точности около 90% и выше на этом чистом наборе данных. Случайная базовая линия достигает примерно 50%.
Почему это важно
Классификатор ближайшего центроида тривиально прост. У него нет гиперпараметров, итераций или градиентного спуска. Тем не менее он воплощает фундаментальный шаблон ML:
- Извлечь представление из обучающих данных (центроиды)
- Предсказать для новых данных с помощью этого представления (ближайшее расстояние)
- Оценить по сравнению с базовой линией (случайное угадывание)
Каждый алгоритм ML — от логистической регрессии до трансформеров — следует этому же трёхшаговому шаблону. Представление становится сложнее, но рабочий процесс остаётся тем же.
Шаг 4: чего классификатор центроидов не умеет
Классификатор ближайшего центроида предполагает, что каждый класс образует единое облако. Он строит линейные границы решений. Он не справляется, когда:
- У классов несколько кластеров (например, цифру «1» можно написать несколькими разными способами)
- Граница решения нелинейна (например, один класс окружает другой)
- Признаки имеют очень разные масштабы (в расстоянии доминирует признак наибольшего масштаба)
Эти ограничения мотивируют все остальные алгоритмы, которые вы изучите. Метод k ближайших соседей обрабатывает несколько кластеров. Деревья решений обрабатывают нелинейные границы. Масштабирование признаков исправляет проблему масштаба. Каждый урок опирается на ограничения предыдущего.
Используйте это
sklearn предоставляет NearestCentroid и генераторы синтетических данных:
from sklearn.neighbors import NearestCentroid
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(
n_samples=500, n_features=2, n_redundant=0,
n_clusters_per_class=1, random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
clf = NearestCentroid()
clf.fit(X_train, y_train)
print(f"Accuracy: {clf.score(X_test, y_test):.3f}")
Внедрите это
Этот урок создаёт outputs/prompt-ml-problem-framer.md — промпт, который превращает расплывчатые бизнес-задачи в конкретные задачи ML. Дайте ему описание задачи («мы хотим снизить отток» или «предсказать спрос на следующий квартал»), и он определит тип обучения, задаст цель предсказания, перечислит возможные признаки, выберет метрику успеха, установит базовую линию и отметит подводные камни, такие как утечка данных или дисбаланс классов. Используйте его в начале любого ML-проекта, чтобы не построить не ту систему.
Ключевые термины
| Термин | Как обычно говорят | Что это на самом деле означает |
|---|---|---|
| Модель | «ИИ» | Математическая функция с обучаемыми параметрами, отображающая входы в выходы |
| Обучение | «Обучение ИИ» | Запуск алгоритма оптимизации для корректировки параметров модели так, чтобы предсказания совпадали с известными выходами |
| Признак | «Входной столбец» | Измеряемое свойство данных, которое модель использует для предсказаний |
| Метка | «Ответ» | Известный выход для обучающего примера, используемый для вычисления сигнала ошибки |
| Гиперпараметр | «Настройка, которую вы меняете» | Параметр, заданный до обучения и управляющий процессом обучения (скорость обучения, число слоёв) |
| Функция потерь | «Насколько модель ошибается» | Функция, измеряющая разрыв между предсказанными и фактическими выходами, который обучение пытается минимизировать |
| Переобучение | «Она запомнила тест» | Модель усвоила специфичный для обучения шум вместо общих закономерностей, поэтому не справляется с новыми данными |
| Недообучение | «Она ничему не научилась» | Модель слишком проста, чтобы уловить реальные закономерности в данных |
| Обобщение | «Она работает на новых данных» | Способность модели делать точные предсказания для данных, на которых она не обучалась |
| Кросс-валидация | «Тестирование на разных частях» | Многократное разбиение данных на обучающие/тестовые блоки и усреднение результатов, дающее более устойчивую оценку производительности |
| Регуляризация | «Удержание весов маленькими» | Добавление штрафного члена к функции потерь, который препятствует чрезмерно сложным моделям |
| Дрейф данных | «Мир изменился» | Статистическое распределение поступающих данных сдвигается со временем, ухудшая производительность модели |
Упражнения
- Возьмите любой набор данных (например, Iris, Titanic). Разделите его в пропорции 70/15/15 на обучающую/валидационную/тестовую выборки. Объясните, почему не следует настраивать гиперпараметры на тестовой выборке.
- Перечислите три задачи из реального мира. Для каждой определите, является ли она классификацией, регрессией или кластеризацией, а также относится ли она к обучению с учителем или без учителя.
- Модель получает 99% точности на обучающих данных, но 60% на тестовых. Диагностируйте проблему и перечислите три действия, которые вы бы попробовали для её исправления.
Дополнительное чтение
- An Introduction to Statistical Learning — бесплатный учебник, охватывающий все классические методы ML с практическими примерами
- Google’s Machine Learning Crash Course — краткое визуальное введение в концепции ML
- Scikit-learn User Guide — практический справочник по реализации ML в Python
Источник: What Is Machine Learning 01.22 — Стохастические процессы · Фаза 2 — Основы машинного обучения · Полный каталог · 02.02 — Линейная регрессия