Один вопрос, один пример, одна проверка. Начни в режиме «Очень просто» и открывай математику тогда, когда готов.
Неделя 1 · Лекция 1 · Введение в машинное обучение
С чего начинается машинное обучение?
Сначала поймём задачу и данные, затем попробуем простую модель и проверим её на новых примерах. Здесь можно пройти первую лекцию небольшими шагами.
1. Учимся на примерах
Ты умеешь писать правила в коде: «если выполнено условие, верни ответ». В машинном обучении мы даём алгоритму примеры и выбираем способ, которым он будет искать закономерность. Полученная модель затем отвечает на новые вопросы.
Пример Есть письма, которые люди уже отметили как «спам» или «обычное». Алгоритм использует эти примеры, чтобы научиться различать новые письма. Ответ на новое письмо мы заранее модели не сообщаем.
Способ обучения
Что есть у алгоритма
Пример
С учителем
Примеры и известные правильные ответы
Письмо → спам или нет
Без учителя
Данные без готового ответа для каждого примера
Объединить похожих посетителей в группы
С подкреплением
Действия и награда за результаты
Игровой агент выбирает ход и учится по наградам
«Учитель» — это известные ответы в данных. Человек не обязан сидеть рядом с компьютером во время обучения. Нейронные сети — одна из групп методов ML; начнём с более простых моделей.
Чем классификация отличается от кластеризации?
При классификации заранее известны категории: «спам» и «не спам». При кластеризации алгоритм ищет группы похожих объектов, но смысл и названия найденных групп мы изучаем отдельно.
2. Что мы знаем и что хотим узнать?
Объект — то, о чём делаем прогноз: квартира, письмо или человек. Признаки — сведения об объекте, доступные в момент прогноза. Целевой ответ — то, что хотим предсказать.
Сведения о квартире
Тип признака
Как понимать
Площадь 50 м²
Числовой
Размер можно измерить и сравнить
Район «Центральный»
Категориальный
Название группы, не количество
Состояние «хорошее»
Порядковый
Есть порядок: плохое → среднее → хорошее
Числа и названия выше придуманы для примера. Если задача — предсказать цену, то цена будет ответом y. Её нельзя одновременно подавать модели как известный признак при прогнозе этой же цены.
Как читать X, x, y и ŷ?
X — таблица признаков всех объектов: строка соответствует объекту, столбец — признаку.
x — признаки одного выбранного объекта.
y — настоящий ответ из данных.
ŷ («игрек с шапочкой») — ответ, вычисленный моделью.
В лекции большие X и Y также обозначают множества возможных объектов и ответов. Смысл обозначения зависит от контекста: таблица данных и множество всех возможных объектов — разные вещи.
Какую задачу решаем?
Хотим получить
Тип задачи
Цену квартиры, например 8 млн
Регрессия — предсказываем число
Вид цветка или класс письма
Классификация — выбираем категорию
Порядок документов в поиске
Ранжирование — сортируем по полезности
Не перепутай Класс можно закодировать числом 0 или 1. От этого выбор между двумя категориями не становится регрессией.
3. KNN: спросим похожие примеры
Предположим, посетители с похожим количеством прошлых посещений часто ведут себя похоже. Для нового посетителя найдём несколько ближайших примеров и выберем ответ, который встречается чаще.
Откуда данные? Это семь придуманных записей: 10 → нет клика; 20 → нет; 35 → клик; 50 → клик; 65 → клик; 80 → клик; 90 → клик. Числа слева — прошлые посещения, справа — наблюдавшиеся ответы. Это не статистика реального сайта.
Круги — «нет клика», треугольники — «клик». Обводка выделяет выбранных соседей. Вертикальная пунктирная линия — новый человек.
Выбранный сосед
Как нашли расстояние
Известный ответ
Почему именно эти числа? Пример при x = 30 и k = 3
До записи 35 расстояние 5: 35 − 30 = 5. До записи 20 — 10: 30 − 20 = 10. До записей 10 и 50 одинаково далеко: 20. В демонстрации при равных расстояниях раньше выбираем запись с меньшим номером, поэтому третьим станет 10.
У соседей 35, 20 и 10 ответы: «клик», «нет», «нет». Два голоса из трёх за «нет» — это прогноз. k = 3 выбрал пользователь: это гиперпараметр, настройка метода. Алгоритм его здесь сам не нашёл.
Запись |x − xᵢ| означает расстояние между новым значением x и значением соседа xᵢ. Вертикальные черты просят убрать знак: расстояние от 30 до 20 равно 10, а не −10. Номер i указывает, какую запись берём.
Масштаб признаков и много измерений
Если сравнивать расстояние до метро в метрах и число комнат, разница в 1000 метров численно гораздо больше разницы в 2 комнаты. Обычное расстояние будет в основном реагировать на метры. Поэтому признаки часто масштабируют, используя настройки, рассчитанные на обучающих данных.
При большом числе признаков данных нужно больше: близких примеров становится мало, и понятие «похожий» может терять пользу. Это называют проклятием размерности.
Что запомнить KNN хранит обучающие примеры. Основная работа происходит при прогнозе: поиск соседей и голосование. Для регрессии вместо голосования можно усреднить ответы соседей.
4. Модель — правило с настройками
В лекции есть пример с допуском на аттракцион. Для учебного опыта выберем правило: ответ «да», если рост не меньше выбранного порога и возраст не меньше второго порога. Это вымышленная задача, а не реальные правила безопасности.
Рост и возраст — данные
Ответ из учебных данных
Ответ нашего правила
Когда двигаешь ползунки, ты сам меняешь параметры модели. Кнопка перебирает целые пороги из диапазонов ползунков и выбирает пару с наименьшим числом ошибок на этих четырёх примерах. При нескольких лучших вариантах берёт первый.
Как читать формулу из лекции?
ŷ = 1, если x₁ ≥ a и x₂ ≥ b; иначе ŷ = 0.
x₁ — рост ребёнка, x₂ — возраст: это входные данные.
a и b — пороги: параметры правила.
≥ читается «больше или равно».
1 кодирует «да», 0 — «нет»; ŷ — прогноз.
θ («тета») — общее имя всех параметров. Здесь θ = (a, b), то есть пара порогов.
Семейство моделей — все варианты одного правила при разных a и b. Обучение выбирает подходящий вариант по данным. Правило может быть слишком простым для реальной задачи.
Что нужно понять Данные фиксированы, меняются настройки правила. Совпадение со всеми учебными примерами ещё не гарантирует правильных ответов для новых детей.
5. Как сравнить два варианта модели?
Нужно число, по которому видно, насколько прогнозы расходятся с известными ответами. Такое число ошибки называют loss. Сначала посчитаем его для каждой квартиры, потом усредним.
Настоящая цена y
Прогноз ŷ
Разница ŷ − y
Без знака
Квадрат разницы
5
6
6 − 5 = 1
1
1 × 1 = 1
8
7
7 − 8 = −1
1
(−1) × (−1) = 1
11
13
13 − 11 = 2
2
2 × 2 = 4
Все цены в миллионах рублей. Настоящие цены взяты из нашего учебного примера; прогнозы 6, 7 и 13 специально выбраны для показа ошибок, а не получены обучением.
MAE: средний промах
(1 + 1 + 2) / 3 = 4 / 3 ≈ 1.33 млн. Убираем знак, чтобы недооценка не погашала переоценку. Делим на 3, потому что квартир три.
MSE: средний квадрат промаха
(1 + 1 + 4) / 3 = 6 / 3 = 2. Возводим ошибки в квадрат, поэтому крупные промахи влияют сильнее. Единицы здесь — (млн ₽)², а не млн ₽.
«Эмпирический риск» и сложная запись из лекции
Эмпирический означает «посчитанный на имеющихся примерах». Эмпирический риск — среднее выбранного loss на обучающих данных.
R(θ) = (1 / n) × Σ L(yᵢ, ŷᵢ)
R — общая средняя ошибка; θ — настройки модели, от которых зависят прогнозы.
n — количество примеров; у нас n = 3.
i — номер примера; yᵢ — его настоящий ответ, ŷᵢ — прогноз.
L — способ считать один штраф, например квадрат разницы.
Σ («сигма») — сложить штрафы по всем примерам; 1 / n — разделить сумму на их число.
arg min читается здесь как «найди те настройки, при которых ошибка самая маленькая». Это цель обучения; сам алгоритм поиска может быть разным.
Подробное происхождение весов прямой и уменьшение loss уже разобраны во второй неделе.
6. Запомнить примеры недостаточно
Можно идеально отвечать на вопросы, которые уже видел, и плохо отвечать на новые. В ML это проявляется как слишком хорошее качество на обучающих данных по сравнению с проверочными.
Проверим KNN на новых посетителях
Обучающие записи те же, что в разделе про соседей. Проверочные посещения: 15, 25, 30, 40, 55, 75 и 85. Известные ответы для них: «нет», «нет», «нет», «нет», «клик», «клик», «клик». Эти примеры также придуманы для демонстрации.
Откуда проценты и почему при k = 1 обучение выглядит идеальным?
Accuracy — доля правильных ответов: число совпадений / число проверенных объектов. Например, 5 правильных из 7 дают 5 / 7 ≈ 0.714, то есть 71.4%.
На обучающей выборке каждый объект участвует в поиске соседей, включая себя. При k = 1 ближайшим оказывается он сам: расстояние равно нулю. У наших записей нет одинаковых посещений с разными ответами, поэтому получается 7 из 7. На новых людях самого себя среди обучающих записей уже нет.
При k = 3 или 5 возможны другие ошибки. Большее k не гарантирует улучшения: слишком широкая группа соседей может скрыть полезные различия. Результат зависит от данных.
А как это связано с полиномами из лекции?
Можно расширить признаки линейной модели: вместо одной площади x добавить x², x³ и так далее. Например, при x = 2 квадрат x² = 2 × 2 = 4. Эти новые значения вычисляются из того же входа.
Модель остаётся линейной по весам, но график по x может изгибаться. Большая степень даёт больше гибкости: иногда модель подгоняется к случайным особенностям обучающих точек. Проверяй её на отложенных данных.
Что запомнить Очень хорошее качество на train само по себе не доказывает полезность модели. Если качество низкое и на train, и на validation, возможны недообучение, неподходящие признаки или другие проблемы.
7. Три набора данных — три роли
Набор
Для чего нужен
Аналогия
Train
Подбираем параметры модели
Учебные задачи
Validation
Сравниваем модели и настройки, например k
Пробный экзамен
Test
Финальная оценка выбранного решения
Экзамен с новыми вопросами
Если постоянно менять модель после просмотра test, этот набор фактически становится validation. Название переменной не защищает от подглядывания. Масштабирование и другие обучаемые преобразования тоже настраивают на train.
Кросс-валидация: проверяем по очереди
Возьмём 100 учебных объектов и разделим на 5 равных частей: 100 / 5 = 20 объектов в каждой. На каждом круге одну часть оставляем для проверки, остальные четыре используем для обучения: 4 × 20 = 80.
Как получается итоговая оценка?
Представим, что получили accuracy 0.80, 0.85, 0.75, 0.90 и 0.80. Это придуманные оценки для объяснения, не результат работы этого сайта.
Сумма: 0.80 + 0.85 + 0.75 + 0.90 + 0.80 = 4.10. Среднее: 4.10 / 5 = 0.82, то есть 82%. Делим на 5, потому что было пять проверок. Полезно смотреть и на разброс оценок между кругами.
В каждом круге модель и преобразования обучаются заново на четырёх частях. Это не продолжение обучения одной модели с предыдущего круга. Отдельный финальный test в этот подбор не включаем.
Не всегда случайное перемешивание Для прогноза будущего проверяй на более поздних данных. Если у одного человека несколько записей, учитывай группы, чтобы связанные примеры не оказались одновременно в обучении и проверке.
8. Как решать задачу ML
Определи ответ. Что предсказываем и какие сведения будут доступны в момент прогноза?
Изучи данные. Проверь пропуски, типы признаков и корректность известных ответов.
Раздели данные. Выдели обучение, подбор настроек и финальную проверку.
Подготовь признаки и обучи простую модель. Настройки преобразований вычисляй по train.
Проверь на validation. Сравни несколько решений и разберись в ошибках.
Оцени выбранное решение на test. Это проверка на данных, по которым решение не подбиралось.
Связь недель Неделя 1: понимаем задачу и проверку → Неделя 2: подробнее учим линейные модели → Неделя 3: исследуем, почему готовая модель даёт такие ответы.
Материалы первой недели
Объяснения выше опираются на лекцию Григория Лелейтнера «Введение в машинное обучение». Примеры с посетителями и порогами добавлены для самостоятельного разбора.
Лекция дополнена учебным решением ДЗ: открой пункт «ДЗ · Игра престолов» в меню первой недели. Код запускается в Colab; сайт не отправляет работу на проверку.
Что я должен уметь объяснить после лекции?
Чем признак отличается от правильного ответа.
Когда нужна классификация, регрессия или ранжирование.
Как KNN выбирает ответ и что означает k.
Какие настройки подбираются во время обучения.
Зачем измерять ошибку и проверять модель на новых данных.
Чем отличаются train, validation, test и кросс-валидация.
Неделя 1 · Домашнее задание · Учебный режим
Игра престолов: от таблицы героев до прогноза
Задача — по известным свойствам персонажа предсказать isAlive: 1 — жив, 0 — не жив. Ниже — полный вариант решения заданий 1.1–1.10, 2.1–2.2, 3.1 и подготовки файла для сдачи.
Как проходить Открой подсказку, попробуй сам, затем раскрой решение. Код шагов выполняй по порядку в копии исходного Colab. Он заменяет незаполненные ячейки соответствующего этапа; повторно выполнять старые заготовки с «…» не нужно. Это один учебный вариант, не гарантия максимального балла.
Кнопки с пунктирным подчёркиванием открывают «Откуда это?» по наведению, фокусу или тапу. Escape и нажатие вне подсказки закрывают её.
1.1–1.2 · Открываем таблицу персонажей
Данные → признаки → обучение → прогноз → проверка Мы здесь: Таблицу data и сводку по её столбцам
Условие. Импортировать библиотеки, прочитать CSV и посмотреть типы столбцов.
По-человечески. Нужно сначала рассмотреть сведения о героях, а не сразу запускать модель.
Что дано
Два файла из задания: train — персонажи с известным ответом, test — персонажи для финального прогноза. S.No — номер персонажа, а не его свойство.
Что нужно найти
Таблицу data и сводку по её столбцам
Подсказка 1 — с чего начать
Одна строка — один персонаж. Один столбец — одно известное свойство.
Подсказка 2 — нужный инструмент
pd.read_csv читает файл; index_col делает S.No подписью строки.
Показать решение и код для Colab
Решение руками: зачем каждый шаг
Скачиваем ровно файлы из notebook. Ни одного персонажа сами не придумываем.
Открываем train. Отделяем номер строки от свойств персонажа.
Смотрим первые строки, типы и границы чисел: это помогает заметить ошибку до обучения.
Код
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import display
import gdown
# Это ID файлов, предоставленные авторами ДЗ.
gdown.download(id="1XL0VTygpZj-ZAuTNRBgApZTPQyNDnT-v", output="train.csv", quiet=False)
gdown.download(id="1h99toeF7lZ2I3iJwehgKO-QQmDaOe_O3", output="test.csv", quiet=False)
gdown.download(id="1M14conWjAW2QLoyCXbHEAy8bql2f99eF", output="submission.csv", quiet=False)
raw_train = pd.read_csv("train.csv", index_col="S.No")
data = raw_train.copy()
display(data.head(), data.dtypes)
display(data.describe(include="object").T)
display(data.describe(include=[np.number]).T[["count", "min", "max"]])
assert data.index.is_unique
assert "isAlive" in data.columns
Разбор кода
pd — короткое имя pandas. DataFrame — таблица. .head() показывает первые строки; .T меняет строки и столбцы местами, чтобы сводку было удобнее читать. count считает известные значения; min и max — крайние числа. .copy() сохраняет исходный train отдельно.
Как проверить
У data есть столбец isAlive, а S.No стал индексом. Если скачался HTML вместо CSV, сначала восстанови доступ к исходным файлам.
Что вынести: Модель получает таблицу с примерами; сначала проверяем, что мы её правильно открыли.
1.3 · Ищем пропущенные сведения
Данные → признаки → обучение → прогноз → проверка Мы здесь: Число и долю пропусков в каждом столбце
Условие. Посчитать пропуски, сохранив строки.
По-человечески. Если про героя неизвестен возраст, это не повод выбрасывать все остальные сведения о нём.
Что дано
NaN — сведения отсутствуют. Это не ноль и не слово «нет».
Что нужно найти
Число и долю пропусков в каждом столбце
Подсказка 1 — с чего начать
Нужно проверить каждую ячейку: известна она или нет.
Подсказка 2 — нужный инструмент
isna() даёт True для пропуска, sum() считает такие ячейки.
Показать решение и код для Colab
Решение руками: зачем каждый шаг
Учебный пример: из 10 героев возраст известен у 7. Неизвестен у 10 − 7 = 3. Доля пропусков: 3 / 10 = 0.3; умножаем на 100, чтобы получить 30%. В коде вместо этих придуманных чисел будут настоящие размеры таблицы.
True считается как 1, False как 0. .sum() складывает единицы по столбцу. .mean() делит число единиц на число строк. 100 — перевод доли в проценты, не параметр модели.
Как проверить
В таблице всё ещё столько же строк, сколько в raw_train.
Что вынести: Пропуск нужно обозначить и обработать, а не путать с настоящим нулём.
1.4 · Делаем числовые признаки удобнее
Данные → признаки → обучение → прогноз → проверка Мы здесь: log_popularity, boolDeadRelations, age_value и age_no_data
Условие. Преобразовать popularity, numDeadRelations и age.
По-человечески. Смысл данных сохраняем, но записываем их так, чтобы модель могла ими пользоваться.
Что дано
popularity, numDeadRelations и age взяты из файла.
Что нужно найти
log_popularity, boolDeadRelations, age_value и age_no_data
Подсказка 1 — с чего начать
Сохрани отдельно: значение возраста и факт, что оно неизвестно.
Гистограмма делит значения на 50 интервалов: число 50 задано автором задания.
Учебная популярность 0.09: умножаем на выбранные 100 → 9; добавляем 1 → 10; log₁₀(10) = 1, потому что 10¹ = 10. Для популярности 0 получаем log₁₀(1) = 0. Добавка 1 не даёт взять логарифм нуля.
Если умерших близких 2, вопрос «есть хотя бы один?» даёт 1. Если 0 — даёт 0. Здесь 1 означает «да», а не число близких.
Возраст 25 → (25, 0). Неизвестный возраст → (0, 1). Второе число говорит, настоящий это ноль или заполненный пропуск.
np.log10 — логарифм с основанием 10, не ln. > 0 задаёт вопрос, а .astype(int) записывает ответ числом. Возраст заполняем нулём вместе с индикатором пропуска. Для дополнительных пропусков в выбранных признаках ниже предусмотрен imputer.
Как проверить
age_no_data содержит только 0 и 1; age_value не содержит NaN. В будущем test применяем те же правила.
Что вынести: Новое число может быть вычислено из старого признака; это ещё не предсказание.
1.5 · Объединяем названия народов
Данные → признаки → обучение → прогноз → проверка Мы здесь: Единую категорию для каждого написания народа
Условие. Инвертировать словарь cultures_grouped и заполнить culture_grouped.
По-человечески. Разные написания одного народа не должны выглядеть как совершенно разные признаки.
Что дано
Словарь ниже предоставлен авторами ДЗ. Это готовое правило группировки, а не результат обучения на правильных ответах.
Что нужно найти
Единую категорию для каждого написания народа
Подсказка 1 — с чего начать
Было «группа → список названий». Нужно «название → группа».
Подсказка 2 — нужный инструмент
Два вложенных цикла проходят по группам и их названиям; Series.map ищет значение в словаре.
Показать решение и код для Colab
Решение руками: зачем каждый шаг
Например, в словаре the North содержит northmen. Записываем обратное соответствие: northmen → the North. str.lower() превращает Northmen в northmen, чтобы совпало написание. Для пропуска оставляем отдельную метку.
Код
cultures_grouped = {
'Old Nations': ['valyrian', 'first men', 'andal', 'andals', 'rhoynar'],
'the North': ['northmen', 'northern mountain clans', 'crannogmen'],
'the Iron Islands': ['ironborn', 'ironborn', 'ironmen'],
'the Mountain and the Vale': ['valemen', 'vale', 'vale mountain clans',
'sistermen'],
'the Isles and Rivers': ['riverlands', 'rivermen'],
'the Rock': ['westerman', 'westermen', 'westerlands'],
'the Stormlands': ['stormlander', 'stormlands'],
'the Reach': ['reach', 'reachmen', 'the reach'],
'Dorne': ['dornish', 'dornishmen', 'dorne'],
'Essos Nations': ['astapor', 'astapori', 'braavosi', 'braavos', 'tyroshi', 'lysene', 'lyseni',
'myrish', 'pentoshi', 'qartheen', 'qarth', 'dothraki',
'lhazarene', 'lhazareen','meereen', 'meereenese',
'norvoshi', 'qohor', 'summer isles', 'summer islands',
'summer islander', 'asshai', "asshai'i", 'norvos', 'ghiscari',
'ghiscaricari'],
'Other Nations': ['ibbenese', 'westeros', 'free folk', 'wildling', 'wildlings', 'naathi']}
cultures_grouped_inverted = {}
for group, names in cultures_grouped.items():
for name in names:
cultures_grouped_inverted[name] = group
display(data["culture"].value_counts(dropna=False))
data["culture_grouped"] = (
data["culture"].str.lower().map(cultures_grouped_inverted)
.fillna("culture_no_data")
)
display(data[["culture", "culture_grouped"]].head())
Разбор кода
group — название крупной группы; names — список написаний. map заменяет каждое название по словарю. Здесь culture_no_data означает отсутствующее или не найденное в словаре значение.
Как проверить
culture_grouped не содержит NaN. Посмотри несколько пар «до → после», чтобы убедиться, что замена верна.
Что вынести: Группировка — наше заранее заданное правило подготовки данных.
1.6–1.8 · Какие признаки связаны с ответом?
Данные → признаки → обучение → прогноз → проверка Мы здесь: Сводки, корреляции и подход к one-hot
Условие. Исследовать категориальные и числовые признаки; подготовить кодирование.
По-человечески. Сначала смотрим, есть ли полезная связь. Пока не выдаём корреляцию за доказательство.
Что дано
и свойства персонажей. Зависимость в этой таблице не доказывает причинность.
Что нужно найти
Сводки, корреляции и подход к one-hot
Подсказка 1 — с чего начать
Среднее по нулям и единицам — доля единиц.
Подсказка 2 — нужный инструмент
groupby объединяет строки; mean считает среднее; corr измеряет линейную связь.
Показать решение и код для Colab
Решение руками: зачем каждый шаг
Учебная группа имеет ответы [1, 0, 1, 1]. Складываем: 3. Делим на 4 персонажей: 0.75, то есть 75% живы.
Сравниваем такие доли между категориями; рядом смотрим размер группы. Один персонаж — слабое основание для вывода.
Для народа делаем отдельные колонки: «это the North?» и «это Dorne?». Ответы 0/1. Произвольные номера 1, 2, 3 могли бы создать выдуманный порядок.
Код
display(data.describe(include=[np.number]).T[
["count", "min", "max"]
].assign(N_unique_values=data.nunique()))
display(data.groupby("isAliveSpouse", dropna=False)["isAlive"].agg(["mean", "count"]))
display(data.groupby("culture_grouped", dropna=False)["isAlive"].agg(["mean", "count"]))
num_view = data.select_dtypes(include=np.number)
corr = num_view.corr()
display(corr["isAlive"].drop("isAlive").sort_values())
plt.figure(figsize=(9, 7))
sns.heatmap(corr, cmap="coolwarm", center=0, annot=False)
plt.title("Корреляции числовых столбцов")
plt.show()
# Учебная демонстрация кодирования, не матрица для обучения:
display(pd.get_dummies(data[["culture_grouped"]], dtype=int).head())
# Для модели ниже используем OneHotEncoder внутри Pipeline.
Разбор кода
agg(["mean", "count"]) показывает долю живых и число известных ответов. corr близко к 1 — вместе растут, к −1 — меняются в противоположных направлениях; около 0 не исключает нелинейную связь. get_dummies показывает смысл one-hot; обучаемый кодировщик ниже увидит только train.
Как проверить
Для своих выводов назови конкретный признак, его связь и размер группы по выводу Colab. Числа здесь заранее не подставлены. Если подбор признаков зависит от y, делай его на train или внутри кросс-валидации; обзор всего файла не используй для многократной подгонки под validation.
Что вынести: Исследование помогает выбирать признаки, но качество ещё нужно проверить на отложенных примерах.
1.9–1.10 · Отделяем ответы и откладываем проверку
Данные → признаки → обучение → прогноз → проверка Мы здесь: X_train, X_val, y_train, y_val
Условие. Создать X, y и разделить их на train и validation.
По-человечески. Одних героев даём модели для учёбы, других прячем до проверки.
Что дано
; ; ;
Что нужно найти
X_train, X_val, y_train, y_val
Подсказка 1 — с чего начать
Нельзя передавать правильный ответ среди признаков.
Подсказка 2 — нужный инструмент
drop убирает столбец; train_test_split откладывает часть строк.
Показать решение и код для Colab
Решение руками: зачем каждый шаг
Выбираем фиксированный учебный набор признаков, не по результату validation.
X содержит сведения, y — ответ. Индексы соответствуют одним персонажам.
На учебных 100 героях доля 0.2 дала бы 20 для проверки и 80 для обучения. Настоящие размеры напечатает код.
Код
from sklearn.model_selection import train_test_split
def make_features(frame):
out = pd.DataFrame(index=frame.index)
# Фиксированный набор для этого учебного решения.
binary = ["male", "book1", "book2", "book3", "book4", "book5", "isMarried", "isNoble"]
for col in binary:
out[col] = frame[col]
out["log_popularity"] = np.log10(frame["popularity"] * 100 + 1)
out["boolDeadRelations"] = (frame["numDeadRelations"] > 0).astype(int)
out["dead_relations_missing"] = frame["numDeadRelations"].isna().astype(int)
# Неизвестный или ошибочный отрицательный возраст считаем пропуском.
age = frame["age"].mask(frame["age"] < 0)
out["age_value"] = age.fillna(0)
out["age_no_data"] = age.isna().astype(int)
out["culture_grouped"] = (
frame["culture"].str.lower().map(cultures_grouped_inverted)
.fillna("culture_no_data")
)
return out
X = make_features(raw_train)
y = raw_train["isAlive"].astype(int)
assert set(y.unique()) <= {0, 1}
X_train, X_val, y_train, y_val = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
print("Размеры:", X_train.shape, X_val.shape)
assert "isAlive" not in X.columns
assert set(X_train.index).isdisjoint(X_val.index)
Разбор кода
make_features применяет одинаковые правила к train и test, не подглядывая в y. .shape — число строк и столбцов. stratify=y сохраняет примерно ту же долю классов в обеих частях. Имя персонажа и S.No исключены. Эти признаки относятся к учебной ретроспективной задаче; для прогноза будущего нужно отдельно проверять, были ли сведения доступны заранее.
Как проверить
Индексы train и val не пересекаются; число строк X_train равно длине y_train. Сумма размеров двух частей равна размеру X.
Что вынести: Ответы для проверки нельзя показывать модели во время обучения.
2.1–2.2 · Готовим данные и обучаем модели
Данные → признаки → обучение → прогноз → проверка Мы здесь: Обученные модели и их ответы на X_val
Условие. Обучить LogisticRegression; для сравнения взять KNN и простейший baseline.
По-человечески. Baseline всегда выбирает самый частый класс. Если сложная модель хуже такого ответа, её стоит пересмотреть. LogisticRegression, несмотря на название, здесь решает классификацию.
Что дано
;
Что нужно найти
Обученные модели и их ответы на X_val
Подсказка 1 — с чего начать
Все обучаемые преобразования должны узнавать настройки только из X_train.
Подсказка 2 — нужный инструмент
Pipeline объединяет подготовку и модель. fit учит; predict выдаёт ответы.
Показать решение и код для Colab
Решение руками: зачем каждый шаг
Пропуски оставшихся числовых столбцов заменяем медианой, найденной на train; индикатор сохраняет факт пропуска.
StandardScaler находит среднее μ и стандартное отклонение σ на train. Пример: возраст 30, среднее 20, σ = 10 → (30 − 20) / 10 = 1. Все три числа здесь придуманы для объяснения; в коде они считаются по train.
OneHotEncoder учит список категорий на train; неизвестную категорию в val не превращает в ошибку.
fit подбирает параметры; predict применяет найденное к новым строкам.
Код
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.dummy import DummyClassifier
from sklearn.base import clone
numeric_cols = X.select_dtypes(include=np.number).columns.tolist()
categorical_cols = ["culture_grouped"]
preprocess = ColumnTransformer([
("numbers", Pipeline([
("fill", SimpleImputer(strategy="median", add_indicator=True)),
("scale", StandardScaler())
]), numeric_cols),
("categories", OneHotEncoder(handle_unknown="ignore"), categorical_cols)
])
models = {
"Baseline": DummyClassifier(strategy="most_frequent"),
"LogisticRegression": LogisticRegression(max_iter=2000, random_state=42),
"KNN": KNeighborsClassifier(n_neighbors=5)
}
fitted = {}
for name, estimator in models.items():
model = Pipeline([("prepare", clone(preprocess)), ("model", clone(estimator))])
model.fit(X_train, y_train)
fitted[name] = model
y_pred = fitted["LogisticRegression"].predict(X_val)
print(y_pred[:10])
Разбор кода
ColumnTransformer применяет разные преобразования к числам и категориям. clone создаёт отдельный ещё не обученный экземпляр. fitted — словарь готовых моделей. y_pred — вычисленные ответы, не настоящие y_val. Масштабирование особенно важно для расстояний KNN.
Как проверить
Длина y_pred равна числу строк X_val; значения 0 или 1. В fit нет X_val или y_val. Если возникло предупреждение о сходимости, проверь его до выводов о качестве.
Что вынести: Обучение и получение ответа — разные операции.
3.1 · Сравниваем качество
Данные → признаки → обучение → прогноз → проверка Мы здесь: Долю правильных ответов на validation
Условие. Посчитать Accuracy для всех выбранных моделей и выбрать лучшую.
По-человечески. Соревнуются реальные ответы моделей на одних и тех же спрятанных строках.
Что дано
;
Что нужно найти
Долю правильных ответов на validation
Подсказка 1 — с чего начать
Сравни предсказание и настоящий ответ для каждого персонажа.
Подсказка 2 — нужный инструмент
accuracy_score считает долю совпадений.
Показать решение и код для Colab
Решение руками: зачем каждый шаг
Учебный пример: настоящие ответы [1, 0, 1, 0], предсказания [1, 1, 1, 0]. Совпали 3 из 4. Accuracy = 3 / 4 = 0.75 = 75%. Число 4 — количество проверенных героев; 3 — число совпадений. Это пример, не измеренное качество нашего решения.
Код
from sklearn.metrics import accuracy_score
scores = {}
for name, model in fitted.items():
pred = model.predict(X_val)
scores[name] = accuracy_score(y_val, pred)
results = pd.Series(scores, name="validation_accuracy").sort_values(ascending=False)
display(results)
best_name = results.index[0]
best_model = fitted[best_name]
print("Выбрали:", best_name)
assert all(0 <= score <= 1 for score in scores.values())
Разбор кода
predict не переобучает модель. accuracy_score(y_val, pred) получает сначала настоящие, затем предсказанные ответы. sort_values ставит наибольшее качество первым. При равенстве оценок достаточно заранее выбрать более простую модель; здесь используется порядок сортировки.
Как проверить
Сравни с Baseline. Не заявляй заранее «точность 90%»: используй фактический вывод. Частые попытки улучшить ту же validation делают оценку оптимистичной; для серьёзного подбора используй кросс-валидацию.
Что вынести: Качество — результат проверки, а не число, которое мы задаём модели.
Результат контрольного запуска этого решения
Проверено 18 октября 2026 года на файлах авторов: 1557 размеченных персонажей, из них 1245 в train и 312 в validation; ещё 389 персонажей в test. Разбиение: test_size=0.2, random_state=42, stratify=y. Версия scikit-learn: 1.8.0.
Модель
Совпадений на validation
Accuracy
Baseline
243 из 312
77.88%
LogisticRegression
242 из 312
77.56%
KNN, k = 5
251 из 312
80.45%
Например, 251 / 312 ≈ 0.8045: 251 — реально совпавшие ответы, 312 — число проверенных персонажей. Это измерения данного запуска, не гарантированная оценка на платформе. В другой версии библиотек результат может немного отличаться. Файл содержит 389 прогнозов со столбцами S.No и isAlive. Скрытые ответы test не использовались.
Финал · Проверяем test и получаем прогноз
Данные → признаки → обучение → прогноз → проверка Мы здесь: Один ответ 0/1 для каждого героя test
Условие. Загрузить test, исправить указанные в notebook ошибки и применить тот же способ подготовки.
По-человечески. Не придумываем новые правила для тестовых героев. Они должны проходить ту же подготовку.
Что дано
test.csv — новые герои без ответов. Исправления для S.No 1685 и 1869 даны авторами notebook, мы их не угадываем.
Что нужно найти
Один ответ 0/1 для каждого героя test
Подсказка 1 — с чего начать
Сначала подготовка тем же make_features, затем predict.
Подсказка 2 — нужный инструмент
После выбора модели можно обучить её заново на всех размеченных строках.
Показать решение и код для Colab
Решение руками: зачем каждый шаг
Смотрим отрицательные возраста. Год рождения может быть отрицательным, возраст — нет.
Применяем именно исправления из задания: 1685 → год 278, возраст 0; 1869 → год 299, возраст 0. Это правка источника, не наша формула «305 − год».
Заново учим выбранную модель на всём X и y. Validation уже использовали для выбора, теперь готовим финальную модель.
Делаем прогноз test. Его настоящих ответов у нас нет, поэтому Accuracy на test здесь не считаем.
clone(best_model) копирует выбранную конфигурацию, но не уже выученные параметры. fit(X, y) учит её заново. Проверка наличия индекса защищает от случайного добавления новой строки. dateOfBirth исправляем по заданию, хотя наш набор признаков его не использует.
Как проверить
Столбцы X_test и X совпадают по названию и порядку. Нет обучения на ответах test.
Что вынести: Финальные предсказания получены, но их качество на скрытых ответах ещё не известно.
Финал · Заполняем submission.csv
Данные → признаки → обучение → прогноз → проверка Мы здесь: new_submission.csv с сохранёнными столбцами и порядком шаблона
Условие. Заменить isAlive в шаблоне и сохранить файл для сдачи.
По-человечески. Каждый прогноз должен попасть к своему герою. Правильное число в чужой строке тоже ошибка.
Что дано
submission.csv — шаблон авторов. S.No связывает прогноз с конкретным героем.
Что нужно найти
new_submission.csv с сохранёнными столбцами и порядком шаблона
Подсказка 1 — с чего начать
Не полагайся на совпадение порядка строк: свяжи ответы через S.No.
Подсказка 2 — нужный инструмент
Series с индексом позволяет найти предсказание по номеру героя.
Показать решение и код для Colab
Решение руками: зачем каждый шаг
Шаблон читаем с S.No как обычным столбцом. Поэтому index=False при сохранении не удалит номер героя.
Сопоставляем номера с индексом test.
Проверяем, что каждому номеру достался ответ, и только потом сохраняем.
map ищет прогноз по S.No, а не по позиции. index=False запрещает pandas добавлять лишний служебный индекс. В этом варианте S.No остаётся полноценной колонкой. Если в исходной ячейке прочитать S.No через index_col, для его сохранения понадобится index=True; не смешивай эти два способа.
Как проверить
Открой сохранённый CSV: столбцы как у исходного шаблона, строк столько же, isAlive состоит из 0/1. Сдача на платформу — отдельное действие, сайт ничего не отправляет.
Что вынести: Решение заканчивается проверенным форматом файла, а не только вызовом predict.
Мини-лаборатория · KNN и проверка ответа
Это учебные точки из лекции, не персонажи датасета. Переключай k и наблюдай, как изменяется голосование. Настоящую модель на героях запускает Python в Colab.
Откуда берётся Accuracy?
7 / 10 = 0.7 = 70%
10 — выбранный размер учебной проверки. Количество совпадений сейчас задаёшь ты. В настоящем ДЗ совпадения считает код по y_val и предсказаниям.
Карта того, что проверяло ДЗ
Таблица → пропуски → новые признаки → категории в числа → разбиение → обучение → Accuracy → файл с прогнозами.
После этого ДЗ я должен уметь объяснить:
Чем неизвестный возраст отличается от возраста 0.
Зачем нужны новые признаки и one-hot.
Почему isAlive нельзя включать в X.
Почему подготовку данных обучают на train.
Чем fit отличается от predict.
Как посчитать долю правильных ответов и сравнить с baseline.
Как не перепутать героев при сохранении прогнозов.
Проверка понимания: выбери одну строку CSV и объясни, как она проходит каждый из этих этапов. Готовый код помогает проверить себя, но не заменяет этот рассказ.
Неделя 3 · Лекция 3 · Дополнительный модуль DLS
Почему модель так решила?
На прошлой неделе мы учились получать прогноз и уменьшать ошибку. Здесь модель уже обучена. Теперь разбираемся, какие признаки повлияли на её ответы.
1. Прогноз есть. А объяснение?
Модель оценила квартиру в 11 млн. Хочется понять: дело в площади, расположении или в случайной особенности данных? Методы XAI помогают исследовать поведение модели.
Локальное объяснение
Почему модель дала этой квартире такую цену?
Глобальное объяснение
На какие признаки модель опирается на многих квартирах?
Как связать это с линейной регрессией?
В нашей прежней прямой дополнительный метр менял прогноз на 0.15 млн. Мы могли прочитать это по весу. У более сложной модели связь может изгибаться и зависеть от других признаков. Тогда нужны дополнительные способы исследования.
Что нужно запомнить Объясняем расчёт модели. Это ещё не доказательство причины в реальном мире: модель может пользоваться случайной связью или ошибаться.
Что именно будем делать?
Менять один признак и смотреть прогноз → сравнивать отдельные объекты со средним → проверять падение качества при перемешивании признака → разбирать вклад признаков в конкретный ответ.
CPO/ICE/PDP/ALE показывают поведение прогноза; Permutation Importance проверяет важность через качество; SHAP распределяет вклад; LIME строит простое объяснение рядом с одним объектом.
2. Меняем один признак и смотрим ответ
Возьмём три условные квартиры: далеко от метро, в обычном районе и рядом с метро. Меняем только площадь, а остальные сведения о каждой квартире оставляем прежними.
По-человечески Одна линия показывает ответы для одного объекта при разных значениях площади. Несколько таких линий — ICE. Среднее этих линий при каждой площади — PDP.
Синяя, зелёная и фиолетовая линии — три объекта (ICE). Оранжевая пунктирная — их среднее (PDP). Точки показывают выбранную площадь.
Откуда взялись числа и что такое CPO?
Это учебные правила, выбранные для демонстрации: прогноз = 0.5 + 0.15 × площадь + поправка района. Поправки трёх квартир: −1, 0 и +1 млн. Здесь веса заданы нами, модель в браузере не обучается.
При площади 50: 0.15 × 50 = 7.5; прибавляем 0.5 и получаем 8. Затем поправки дают 7, 8 и 9 млн. Среднее: (7 + 8 + 9) / 3 = 8. Делим на 3, потому что квартир три.
При включении взаимодействия наклоны становятся 0.10, 0.15 и 0.20: влияние площади зависит от района. Средняя линия может скрыть это различие.
Ceteris paribus означает «при прочих равных». Профиль показывает изменение одного объекта. CPO характеризует, насколько его прогноз колеблется вдоль такого профиля; ICE позволяет сопоставить профили нескольких объектов.
Не перепутай Мы подставляем другую площадь в уже готовую модель. Веса при построении этих графиков заново не обучаем. Плоский PDP может скрывать противоположные эффекты у отдельных объектов — смотри также ICE.
3. А если признаки связаны между собой?
У больших квартир обычно больше комнат. Если увеличить площадь до 150 м², но оставить параметры крошечной студии, получится редкое или неправдоподобное сочетание. PDP может обращаться к модели и с такими сочетаниями.
ALE: смотрим небольшие изменения рядом с реальными объектами
Делим площади на небольшие интервалы.
В каждом интервале берём квартиры, которые действительно туда попали.
Сравниваем прогноз на нижней и верхней границах интервала, сохраняя остальные признаки каждой квартиры.
Усредняем разницы, накапливаем их по интервалам и вычитаем средний накопленный эффект.
Учебный интервал
Прогноз у нижней границы
У верхней
Разница
40–50 м²
6.5 млн
8 млн
8 − 6.5 = +1.5 млн
50–60 м²
8 млн
9.5 млн
9.5 − 8 = +1.5 млн
Числа получены из нашего учебного правила 0.5 + 0.15 × площадь: например, при 40 м² это 0.5 + 6 = 6.5. В сложной модели каждую разницу рассчитывают по её прогнозам для объектов данного интервала.
Зачем накапливать и вычитать среднее?
Первая прибавка +1.5, затем ещё +1.5: накопленный эффект +3 млн. Так из отдельных изменений получается кривая. Вычитание среднего переносит её относительно нуля: ALE показывает относительный эффект признака, а не готовую цену квартиры.
Что запомнить ALE уменьшает проблему неправдоподобных сочетаний при связанных признаках. Это не гарантия отсутствия всех искажений. Слишком мало интервалов скрывает детали, слишком много даёт шум и пустые интервалы.
Важность по PDP и взаимодействия
Если PDP сильно меняется, разброс его значений можно использовать как простую оценку важности. Но оценка зависит от исследуемого диапазона и может пропустить взаимодействия.
Взаимодействие — когда эффект одного признака зависит от другого. Например, прибавка цены за метр различается по районам. Для этого полезны ICE по группам и двумерные графики. Больший коэффициент линейной модели сам по себе не означает большую важность: учитывай единицы признаков и масштаб.
4. Что будет, если перепутать один столбец?
Сначала проверим качество готовой модели. Затем перемешаем значения одного признака между объектами и снова проверим. Если качество ухудшилось, модель использовала информацию этого столбца.
Здесь считаем средний промах без знака: складываем расстояния между прогнозом и настоящей ценой и делим на три квартиры. Это MAE — средняя абсолютная ошибка, в миллионах рублей. До перемешивания ошибка равна 0.
Важность для ошибки = ошибка после перемешивания − ошибка до. Если вместо ошибки считаем качество, где больше значит лучше (например, accuracy), порядок обратный: качество до − качество после.
Настоящие ответы y сохраняются на своих местах: иначе мы не проверим потерю связи между признаком и правильным ответом. Каждый клик начинает опыт с исходных данных. Перестановка случайная, иногда порядок не меняется.
В реальной задаче Используй отложенные данные и несколько перестановок. Если два признака дублируют друг друга, один может подстраховать другой: малая оценка ещё не доказывает бесполезность признака.
5. SHAP: из чего сложился конкретный прогноз?
Представь общий результат команды. Нужно распределить вклад между участниками. SHAP рассматривает признаки как участников: оценивает добавку от признака в разных сочетаниях с другими и усредняет её.
Читаем объяснение Отправная точка + вклад площади + вклад расположения = прогноз. Положительный вклад поднимает прогноз относительно отправной точки, отрицательный — опускает.
Откуда каждое число? Это настоящий расчёт SHAP?
Мы задали простую модель: прогноз = 0.5 + 0.15 × площадь + поправка расположения. Для сравнения выбрали фон с независимыми признаками: средняя площадь 50 м², средняя поправка 1 млн.
Отправная точка: 0.5 + 0.15 × 50 + 1 = 9 млн. При площади 70 вклад площади: 0.15 × (70 − 50) = +3 млн. При поправке 0 её вклад: 0 − 1 = −1 млн. Итого: 9 + 3 − 1 = 11 млн.
Для такой аддитивной модели и такого независимого фона это точное разложение interventional SHAP. Это учебный расчёт, а не запуск библиотеки SHAP и не результаты семинара. Для сложных моделей вклады получают специальным алгоритмом. Выбор фона и способ учёта зависимых признаков важны.
Как прочитать формулу и графики из лекции?
f(x) = φ₀ + Σ φⱼ(x)
x — признаки выбранного объекта; f(x) — ответ модели.
φ₀ — базовый прогноз относительно выбранного фона.
φⱼ — вклад признака с номером j. Греческую букву φ читают «фи».
Σ означает «сложить вклады всех признаков».
Waterfall/force показывают, какие вклады двигают один прогноз. Beeswarm собирает много объектов: каждая точка — вклад признака для одного объекта. Среднее |SHAP| — усреднённый размер вкладов без знака; оно не показывает направление.
Единицы зависят от объясняемого выхода: цена, вероятность или логарифм шансов. Нельзя автоматически читать любой SHAP как проценты. При one-hot кодировании вклад исходной категории обычно рассматривают через сумму её столбцов.
6. LIME: простое объяснение рядом с одной точкой
Сложную извилистую дорогу трудно описать одной прямой. Но короткий участок рядом с нами иногда можно приближённо описать прямой. LIME делает похожее с поведением модели.
Синяя кривая — исходная учебная модель. Оранжевый отрезок — взвешенная прямая, подобранная по соседним прогнозам. Точка — выбранная квартира.
Что именно считает этот интерактив?
Мы выбрали учебную кривую: цена = 0.5 + 0.15 × x + 0.001 × (x − 50)². x — площадь; 0.5, 0.15, 0.001 и 50 — заданные автором настройки демонстрации. Квадрат последней разницы делает кривую изогнутой.
Берём площади от 20 до 80 с шагом 1, получаем их прогнозы и подбираем прямую взвешенным методом наименьших квадратов. Чем дальше площадь от выбранной, тем меньше её вес. Это одномерная демонстрация принципа LIME, а не библиотечный LIME. В семинаре сравнивают собственный LIME-style алгоритм и библиотеку.
Типичная ошибка Объяснение около одной квартиры нельзя переносить на все квартиры. Ширина окрестности, масштаб признаков и случайные примеры могут менять результат. Проверяй повторяемость и точность простой модели рядом с выбранным объектом.
7. Как пройти семинар
В семинаре используют load_breast_cancer(): таблицу измерений и известных классов. Сначала обучают логистическую регрессию с масштабированием и случайный лес. Затем сравнивают объяснения этих моделей. Это учебная работа с готовым набором данных.
Как читать код X_train — данные для обучения; X_test — отложенные данные для проверки. y — известные классы. predict_proba(... )[:, 1] — вероятность класса 1 для каждой строки; значение класса нужно сверять с data.target_names.
Минимальный первый опыт: ICE и PDP из notebook
После выполнения ячеек с обучением rf вставь:
from sklearn.inspection import PartialDependenceDisplay
import matplotlib.pyplot as plt
PartialDependenceDisplay.from_estimator(
rf, X_test, features=[0], kind="both",
grid_resolution=30
)
plt.show()
rf — уже обученный случайный лес. features=[0] — первый столбец, номер 0; его имя — feature_names[0]. kind="both" показывает отдельные профили и среднюю линию. 30 — выбранное число значений признака для построения сетки, не найденный моделью вес.
Проверка: спроси себя, все ли линии идут одинаково? Средняя линия скрывает различия? Не делай вывод о точности модели только по красивому графику.
Дальше: перестановочная важность в семинаре
from sklearn.inspection import permutation_importance
result = permutation_importance(
rf, X_test, y_test,
n_repeats=10, random_state=42, scoring="accuracy"
)
order = result.importances_mean.argsort()[::-1]
for j in order[:5]:
print(feature_names[j], result.importances_mean[j])
10 — число повторов перестановки, 42 — настройка повторяемости случайного порядка. accuracy — доля правильных ответов. importances_mean — среднее падение этой доли. argsort()[::-1] располагает признаки от большей оценки к меньшей; [:5] выбирает первые пять.
Например, 0.10 означало бы падение accuracy на 0.10, то есть 10 процентных пунктов. Это пояснение единиц, а не полученный результат. Сопоставь среднее с result.importances_std — разбросом между повторами.
Самостоятельные упражнения
В notebook указано, что обязательного ДЗ в этом модуле нет. Ниже — учебный маршрут по семи предложенным заданиям; раскрывай подсказку после своей попытки.
После этой недели я могу объяснить Чем отдельный прогноз отличается от среднего поведения; зачем смотреть ICE рядом с PDP; что исправляет локальный подход ALE; почему важность зависит от метода; как SHAP складывает вклады; почему LIME работает локально.
Материалы курса
Основа раздела — лекция и семинар Сабрины Садиех. Учебные примеры с квартирами добавлены для объяснения; код семинара здесь целиком не выполнялся.
Для классификации внутри модели: X → веса → z → sigmoid → p. Вероятности вычисляет модель; likelihood и loss оценивают её ответы.
ОсновыГде мы сейчас?
У нас есть записи о трёх квартирах. Какие числа получает модель, а какое число должна предсказать?
Данные: что знаем и что хотим предсказать
Что дано про квартиры?
В учебной задаче нам уже сообщили площадь и настоящую цену. Эти числа записаны в данных; модель их не придумала.
Площадь x, м²
Настоящая цена y, млн ₽
— площадь одной квартиры. — таблица признаков всех квартир. — известные ответы. При прогнозе новой квартиры её настоящей цены у модели ещё нет.
Чем y отличается от ŷ?
Для квартиры площадью м² в данных указано млн. Допустим, пока модель настроена неточно: наклон 0.15 и сдвиг 0.3. Как мы выбираем их, разберём в следующей теме.
Модель: 0.3 + 0.15 × 50 = млн → В данных: 8 млн →
«Игрек с шапочкой» — вычисленный прогноз. «Игрек без шапочки» — настоящий ответ. Сравнение этих чисел покажет, насколько модель ошиблась.
Как прочитать точку на графике?
Вот три строки данных. По каждой квартире мы знаем площадь и цену.
Площадь
Цена
30 м²
5 млн
50 м²
8 млн
70 м²
11 млн
В таблице всего три строки, но в настоящих данных их могут быть тысячи. На графике направление и сходство проще заметить глазами.
Горизонтальная ось
Здесь откладываем площадь квартиры.
Вертикальная ось Y
Здесь откладываем цену квартиры.
Чтобы нарисовать точку (30, 5), по горизонтали находим 30 м², затем поднимаемся до цены 5 млн и ставим точку. Это одна строка таблицы, только показанная на рисунке.
30 м² → 5 млнточка (30, 5)
50 м² → 8 млнточка (50, 8)
70 м² → 11 млнточка (70, 11)
График не создаёт новых данных. Он просто показывает те же данные глазами.
Как график помогает предсказать цену?
Замечаем: чем больше площадь, тем выше цена. Точки идут в одном направлении. Модель может провести линию, которая описывает эту закономерность. Для новой квартиры площадью 60 м² мы найдём 60 по оси X, поднимемся до линии и прочитаем примерную цену по оси Y.
Площадь → прогноз ценыСиние точки — известные квартиры; оранжевая — прогноз для новой
Для выбранной площади линия показывает цену. Как получилась линия — разберём дальше.
Что означает точка? X — известная площадь, которую подали модели. Y — цена, которую хотим предсказать. Оранжевая точка показывает ответ модели для выбранной площади.
Название горизонтальной оси и матрица признаков X — разные контексты. Здесь горизонтальная ось показывает площадь; в коде X обычно означает целую таблицу.
Теперь мы умеем
Отличать признаки X, настоящий ответ y и прогноз ŷ.
Читать одну квартиру как точку «площадь, цена».
Зачем идём дальше? Найдём правило, которое проводит прямую через эти квартиры.
ОсновыГде мы сейчас?
Мы знаем площади и цены. Откуда берутся наклон и сдвиг?
Линейная регрессия: от данных к прямой
Что изменилось между двумя квартирами?
Первая30 м² → 5 млн
Вторая50 м² → 8 млн
Площадь была 30 м², стала 50 м². Хотим узнать, на сколько она выросла, поэтому находим разницу:
50 − 30 = 20 м²
Мы вычитаем 30 из 50 не потому, что так требует формула. Мы просто сравниваем: было 30, стало 50, значит добавилось 20 м².
Насколько изменилась цена?
Первая квартира стоит 5 млн, вторая — 8 млн. Цена была 5, стала 8. Чтобы узнать, на сколько она выросла, вычитаем старую цену из новой:
8 − 5 = 3 млн рублей
Было30 м² → 5 млн
Стало50 м² → 8 млн
Изменение+20 м² → +3 млн
Сколько цены приходится на один дополнительный метр?
Мы знаем: дополнительные 20 м² связаны с прибавкой цены на 3 млн. А теперь хотим узнать: сколько этой прибавки приходится на один дополнительный квадратный метр?
Почему делим? Аналогия с яблоками
Представь яблоки20 яблок стоят 300 рублей.Одно яблоко стоит 300 ÷ 20 = 15 рублей.
Делим общую цену на количество яблок, чтобы узнать цену одного. Здесь тот же вопрос: делим прибавку цены на количество дополнительных метров.
20 м² → +3 млн 10 м² → +1.5 млн 1 м² → 3 ÷ 20 = 0.15 млн
Мы делим 3 млн на 20 м², потому что хотим узнать, какая часть этих 3 млн приходится на один дополнительный квадратный метр.
0.15 млн = 150 000 рублей за 1 м². Вот это число назовём . Оно не взялось из воздуха: мы получили его, сравнив изменения в наших данных.
w₁ = изменение цены ÷ изменение площади w₁ = 3 ÷ 20 = 0.15
w₁ показывает, насколько в нашей модели меняется цена при увеличении площади на 1 м².
Проверим другие пары на графике ниже: выберем две квартиры и посмотрим, как из их данных получаются изменения площади и цены.
Почему нужно добавить 0.5?
Теперь знаем = 0.15. Возьмём квартиру 30 м² и посчитаем только вклад площади:
0.15 × 30 = 4.5 млн
Настоящая цена по таблице — 5 млн. Сколько не хватает?
5 − 4.5 = 0.5 млн
Нам не хватило 0.5 млн, чтобы попасть в настоящий ответ. Поэтому прямую нужно сдвинуть вверх на 0.5 млн. Это число называется .
Важно:w₀ = 0.5 — не реальная минимальная цена квартиры и не первоначальный взнос. Это математический параметр, который сдвигает прямую относительно точек.
Только площадь: 0.15 × 30 = 4.5 млн Добавили сдвиг: 4.5 + 0.5 = 5 млн
Почему прямую нужно сдвинуть?
Линия = 0.15x при площади 30 м² даёт 4.5 млн, а настоящая точка находится на 5 млн. Не хватает 0.5 млн. Прибавка w₀ = 0.5 поднимает всю прямую на одинаковую высоту.
Как получить прогноз?
= + × Для наших данных: ŷ = 0.5 + 0.15 × x
Символ
Что значит здесь
x
Площадь квартиры из входных данных
w₁ = 0.15
Изменение цены на каждый дополнительный м²
w₀ = 0.5
Сдвиг прямой вверх на 0.5 млн
ŷ
Цена, предсказанная моделью
y
Настоящая цена из данных
Прогноз для квартиры 50 м²
Площадь из данныхx = 50
Подставили в правилоŷ = 0.5 + 0.15 × 50
Умножили0.15 × 50 = 7.5
Добавили сдвиг7.5 + 0.5 = 8
Прогноз моделиŷ = 8 млн
Откуда здесь числа? 50 → площадь из данных 0.15 → нашли по изменениям цены и площади 0.5 → нашли как необходимый сдвиг 8 → прогноз модели
Что меняют три ползунка?
Δ означает просто «изменение» или «разница». На графике горизонтальная стрелка показывает изменение площади, а вертикальная — изменение цены.
Три квартиры из условия задачиСиние числа — даны в примере · оранжевые — вычислили
Вспомнить данные: три квартиры
Площадь
Настоящая цена
30 м²
5 млн
50 м²
8 млн
70 м²
11 млн
Разбор выбранной пары
Что откуда в выбранной паре?
Что откуда?
Изменяй наклон, сдвиг и площадьИсходные точки всегда остаются на графике
Меняет, насколько быстро цена растёт вместе с площадью.
Двигает всю прямую вверх или вниз.
Меняет входное значение и прогноз цены.
ŷ = 0.5 + 0.15 × x
При x = 50: ŷ = 0.5 + 0.15 × 50 = 8 млн
меняет наклон. двигает прямую вверх или вниз. Если значения не подходят, линия отходит от исходных точек.
Не перепутай:x задаём мы как входные данные; w₀ и w₁ — параметры, которые модель подбирает при обучении (здесь их можно менять вручную для опыта); ŷ — прогноз, который вычисляет модель.
Теперь мы умеем
Находить w₁ по разнице цен и площадей.
Находить w₀ как недостающий сдвиг.
Отличать найденные параметры от ручного эксперимента.
Зачем идём дальше? В реальных данных прямая редко попадает во все точки. Нужен способ измерить промах.
ОсновыГде мы сейчас?
Модель умеет выдавать цену ŷ. Настоящая цена y записана в данных. Как одним числом оценить промахи?
Loss для цены: насколько мы промахнулись?
Насколько прогноз отличается от ответа?
Берём квартиру 50 м²: настоящая цена млн. Пусть модель предсказала млн. Хотим узнать величину и направление промаха, поэтому вычитаем настоящий ответ из прогноза.
− 8 = млн
Минус говорит: модель занизила цену. Но два промаха разных знаков могут погасить друг друга при сложении. Поэтому для нашего штрафа возводим каждый промах в квадрат.
(−0.2)² = (−0.2) × (−0.2) = (млн ₽)²
Как собрать промахи трёх квартир?
Для опыта выбрали = и = 0.15. Для площадей 30, 50, 70 модель даёт 4.8, , 10.8 млн: каждый раз на 0.2 ниже настоящей цены.
Площадь
ŷ, прогноз
y, цена в данных
(ŷ − y)²
30
4.8
5
0.04
50
7.8
8
0.04
70
10.8
11
0.04
Сложили: + 0.04 + 0.04 = 0.12. Разделили на , чтобы получить среднее: / 3 = 0.04.
Это MSE — средний квадрат промаха. Loss — общее название штрафа; MSE — один конкретный способ его посчитать.
MSE = (1/n) Σᵢ (ŷᵢ − yᵢ)²
n — количество квартир; i — номер квартиры; — сложить по всем квартирам. ŷᵢ и yᵢ — прогноз и настоящий ответ именно для квартиры i.
В лекции сумма, а здесь среднее — это разные задачи?
На слайдах встречается сумма квадратов. MSE делит эту сумму на n. Для одного фиксированного набора минимум тот же, но величина градиента отличается в n раз. В ДЗ по логистической регрессии используется именно сумма: не дели её градиент на размер батча.
Теперь мы умеем
Вычислять промах ŷ − y.
Понимать, зачем квадрат и среднее.
Зачем идём дальше? Теперь умеем оценивать веса. Разберём, как их менять.
ОбучениеГде мы сейчас?
Loss показывает, насколько плохи прогнозы. Куда сдвинуть веса, чтобы уменьшить loss?
Градиентный спуск: один понятный шаг
Уровень 1. Куда растёт высота?
Представь чашу. Высота точки — значение функции. Наклон подсказывает, куда высота растёт; для спуска выбираем противоположную сторону. У функции одной переменной такая подсказка называется производной. Для нескольких переменных все подсказки вместе — градиент.
Для учебной чаши f() = x² наклон равен 2x. Например, при x = 3 высота равна 9, наклон — 6. При выбранном шаге = 0.1 новая x равна 3 − 0.1 × 6 = 2.4.
Горизонталь — выбранное x, вертикаль — высота f(x). Здесь x обозначает положение в учебной чаше, а не площадь квартиры.
Синяя точка — сейчасОранжевая — после одного шага
Сейчас x3.00
Ошибка f(x) = x²9.00
После одного шага2.40
При x = 3 наклон равен 2 × 3 = 6. При α = 0.1 делаем шаг: 3 − 0.1 × 6 = 2.4. Ошибка уменьшается с 9 до 5.76.
Почему наклон x² равен 2x?
Сдвинемся на маленькое h. Высота изменится на (x+h)² − x² = 2xh + h². На единицу сдвига приходится (2xh+h²)/h = 2x+h. Чем меньше h, тем ближе это число к 2x. Здесь h — маленький пробный сдвиг; производная — предел такой скорости изменения.
Уровень 2. Меняем один вес w
Теперь горизонталь — вес , а не входные данные x. Для тренировки выбрали чашу (w) = (w − 3)²: число задаёт положение её дна.
Начнём с w = 0 и = 0.1. Кнопка будет раскрывать расчёт по одному действию: вес → loss → наклон → размер изменения → новый вес.
Учебная кривая и текущий шаг
Текущий вес w0.00
Текущий loss9.00
После шага0.60
Быстрый режим
Старт w=0.00. Наклон loss здесь −6.00, поэтому шаг направлен вправо: 0 − 0.10×(−6) = 0.60.
Откуда формула наклона и зачем минус?
Наклон квадрата равен удвоенному отклонению от дна: dL/dw = 2(w−3). При w=0 получаем 2×(0−3)=−6. Минус означает: справа функция убывает. Вычитая α×(−6), увеличиваем w, то есть идём вправо и вниз.
Как влияет learning rate?
Маленький α
Шаг аккуратный; для наглядности можно поставить 0.05.
Умеренный α
Например, 0.10: заметно приближаемся к минимуму.
Большой α
Например, 1.20: шаги перескакивают дальше через минимум и становятся неустойчивыми.
На этих мини-графиках горизонталь — номер обновления, вертикаль — вес w. Зелёный пунктир — цель w=3. Край графика ограничивает рисунок; точные числа смотри в разборе шага.
Уровень 3. Обучаем w₀ и w₁ на квартирах
Вернулись к нашим квартирам. Здесь входные площади и настоящие цены остаются прежними; меняются только два параметра прямой. Оси графика: площадь и цена.
Теперь тот же процесс на примере квартир
Данные нам уже знакомы: 30 м² → 5 млн, 50 м² → 8 млн, 70 м² → 11 млн. Задача обучения — подобрать и , чтобы предсказания были близки к этим ценам.
предсказание: = w₀ + w₁ × средняя ошибка: MSE = среднее значение (ŷ − )²
ŷ — цена от модели, y — настоящая цена, а квадрат делает ошибку положительной и сильнее учитывает большие промахи. Мы берём среднее по трём квартирам, чтобы получить одно число для всей модели.
Настройки сейчас
w₀ = 0.500 w₁ = 0.100
Средняя ошибка MSE6.917
Наклон ошибки по w₀−5.000
Наклон ошибки по w₁−276.667
Модель пока занижает цены. Оба наклона ошибки отрицательны, поэтому вычитание градиента немного увеличит w₀ и w₁.
Синяя линия — данные; оранжевая — текущие предсказания модели.
Уровень 4. Как читать запись из лекции?
Для каждого веса нужна своя подсказка. ∂/∂ — как меняется loss, если чуть изменить только сдвиг. ∂L/∂ — если чуть изменить только наклон.
← w − × ∇L(w)
w — все веса; стрелка ← означает «обновить»; α — выбранный размер шага; ∇L — список наклонов по весам. Векторная строка просит сделать знакомое вычитание для каждого веса.
Формулы для квартир и связь с матрицами
Откуда берётся каждый шаг для квартир?
Сначала модель предсказывает цены = w₀ + w₁ ×
Сравниваем прогноз с настоящей ценойошибка = ŷ −
Считаем средний квадрат ошибокMSE — общий размер промахов
Оцениваем, куда менять каждую ручкуградиент по w₀ и градиент по w₁
Делаем небольшой шаг против роста ошибкиновый параметр = старый − α × градиент
В обозначениях со слайдов ∂L/∂w₀ и ∂L/∂w₁ читаются так: «как изменится loss, если немного изменить только этот вес, а остальные оставить прежними». Это частная производная — наклон loss по одной выбранной ручке.
Почему в формулах градиента появляются x и ошибка?
Для средней квадратичной ошибки и прямой ŷᵢ = w₀ + w₁xᵢ получаются такие подсказки:
ŷᵢ − yᵢ показывает величину и направление промаха. Для наклона w₁ ещё умножаем на площадь xᵢ: изменение наклона сильнее влияет на большие квартиры. «Среднее» означает: сложили вклад всех квартир и разделили на 3. Модель двигает параметры в другую сторону от этого градиента.
На лекции loss записан как сумма квадратов ошибок. В интерактиве я показываю среднее: это та же оценка, только дополнительно разделённая на число квартир. Лучшее положение прямой от этого не меняется.
все веса сразу: w ← w − α × ∇L(w) по отдельности: wⱼ ← wⱼ − α × (∂L / ∂wⱼ)
w — список всех настраиваемых весов; ∇L(w) (набла L) — список наклонов loss по каждому весу. Векторная запись — короткий способ сказать: «для каждого веса сделай такой же отдельный шаг».
Как это записано для логистической регрессии?
Здесь модель предсказывает вероятность клика pᵢ, а правильный ответ — yᵢ (0 или 1). Для одного признака xᵢⱼ градиент Binary Cross Entropy по соответствующему весу имеет простой итог:
градиент по wⱼ = среднее [(pᵢ − yᵢ) × xᵢⱼ]
pᵢ − yᵢ — насколько вероятность промахнулась относительно ответа 0 или 1. xᵢⱼ — значение признака у этого объекта. Если признак равен нулю, он не сдвигает этот вес для данного объекта. Если ошибка велика, поправка обычно сильнее.
Дальше шаг тот же: wⱼ ← wⱼ − α × градиент. Меняется формула ошибки, но идея остаётся прежней: смотрим на ошибку, получаем подсказку для весов и делаем небольшой шаг.
Эта короткая формула получается, если соединить BCE с sigmoid. Полное раскрытие производных можно изучать позже; для понимания обучения сейчас достаточно читать её как «ошибка × признак».
Что запомнить: loss говорит, насколько плохи предсказания; градиент подсказывает, в какую сторону менять параметры; α задаёт размер изменения. Компьютер повторяет эти шаги, стараясь уменьшать loss.
Зачем идём дальше? Разный масштаб признаков может делать шаги неудобными. Разберём это на числах.
ОбучениеГде мы сейчас?
Мы научились менять веса. Почему рубли и годы могут мешать удобным шагам?
Масштаб: одинаковый шаг в разных единицах
Почему размеры чисел имеют значение?
Меняем пример: теперь у людей есть возраст и годовой доход. Возраст записан десятками, доход — миллионами. Это разные единицы измерения; большое число ещё не означает большую важность.
Вклады признаков в градиент могут сильно различаться. Приведение шкал часто делает подбор весов удобнее.
Учебная картинка: форма «долины ошибки»
Это схема для интуиции, не обещание: стандартизация часто помогает градиентному спуску, но не гарантирует круглую долину в каждой задаче.
Как измерить расстояние от среднего?
В учебной группе возраста . Среднее = (20++40)/3 = 30 лет. Стандартное отклонение ≈ лет измеряет разброс вокруг среднего.
40 − 30 = 10 — на столько лет выше среднего. 10 / 8.16 ≈ — примерно на столько стандартных отклонений выше среднего (считали без промежуточного округления).
Сначала вычитаем среднее, чтобы узнать отклонение; затем делим на разброс, чтобы выразить его в общей шкале.
новое значение = ( − μ) / σ
x — значение признака; μ — среднее; σ — стандартное отклонение. Это называется стандартизацией. В слайдах DLS для этой формулы используется слово «нормализация».
Поиграй с одним значением
Изменить μ и σ вручную для опыта
Сначала μ = 30 и σ ≈ 8.16 рассчитаны по возрастам 20, 30, 40. Если изменить их вручную, это будут экспериментальные настройки.
Отклонения от 30: −10, 0, 10. Квадраты: 100, 0, 100. Среднее квадратов: (100+0+100)/3 = 200/3. Берём корень, чтобы вернуться к годам: σ = √(200/3) ≈ 8.16497. Поэтому 10/σ ≈ 1.22474. Здесь делим на 3, как StandardScaler; в статистике бывает другая договорённость с n−1.
Как применять это к новым данным?
Сначала разделяем обучение и проверку. и считаем только по обучающей части и затем ими же преобразуем новые данные. Так модель видит одну и ту же шкалу.
Обучение → нашли μ и σ → сохранили → применили к обучению, проверке и новым объектам.
В практике ДЗ это делает StandardScaler внутри Pipeline: при кросс-валидации статистики заново считаются только на обучающей части каждого разбиения.
Таблица «до и после» и дополнительные пояснения
Человек
Возраст до
Возраст после
Доход до
Доход после
А
20 лет
≈ −1.22
500 000 ₽
≈ −1.22
Б
30 лет
0
1 500 000 ₽
0
В
40 лет
≈ +1.22
2 500 000 ₽
≈ +1.22
Для этой таблицы средние — лет и 1 500 000 ₽; стандартные отклонения примерно лет и 816 497 ₽. Смысл данных сохранился: А ниже среднего, Б около среднего, В выше.
Результаты не обязаны лежать между 0 и 1. Если признак постоянный и σ=0, делить на ноль нельзя; StandardScaler обрабатывает такой столбец отдельно.
Теперь мы умеем
Понимать, зачем вычитать μ и делить на σ.
Не смешивать масштаб признака с его важностью.
Избегать утечки при масштабировании.
Зачем идём дальше? Теперь можно осмысленнее сравнивать размеры весов и добавлять штраф за них.
ОбучениеГде мы сейчас?
Мы умеем уменьшать ошибку и учитывать масштаб признаков. Почему иногда полезно сдерживать веса?
Регуляризация: второе пожелание к весам
Что добавляется к обычному loss?
Иногда разные веса дают похожие прогнозы, а иногда модель слишком подстраивается под обучение. Добавим пожелание: предсказывать хорошо и по возможности обходиться умеренными весами.
Для объяснения заранее задали два числа: loss данных = 2, штраф за веса = 5. При выбранной силе = 0.1 добавка равна 0.1 × 5 = 0.5; общий loss = 2.5.
общий loss = loss данных + λ × штраф за веса
λ — «лямбда», настройка силы штрафа. Её выбирают до обучения. При λ=0 добавка выключена.
Loss данных = 2 Penalty = 5 Общий loss = 2 + 0.10 × 5 = 2.5
При λ = 0 штраф выключен. Чем больше λ, тем сильнее модель учитывает штраф.
Как L1 и L2 считают штраф?
Возьмём для опыта один вес = −2. Модуль — расстояние от нуля: |−2| = 2. Квадрат — произведение числа на себя: (−2)² = 4.
L1 может давать нулевые веса в решении. L2 обычно уменьшает их плавно. Обычные шаги с sign(w) не обязаны попадать ровно в ноль.
Ещё один расчёт модуля и квадрата
|w| = 2; w² = 4
Как это связано с градиентом и ДЗ?
В ДЗ добавляются два штрафа одновременно — это Elastic Net. Коэффициенты называются l1_coef и l2_coef. Первый вес — bias, общий сдвиг: в этом задании его не штрафуем.
К градиенту данных прибавляем: L1: l1_coef × sign() L2: 2 × l2_coef × w
sign(w) возвращает −1 для отрицательного веса, +1 для положительного и 0 для нуля. Формулы применяются к весам признаков; добавка для bias равна 0.
Почему возникают эти две добавки?
Градиент L2 складывается из двух подсказок
∂/∂ читается: «как изменится loss, если немного изменить только вес w₁?»
∂L/∂w₁ = 2(xᵢᵀw − yᵢ)xᵢ₁ + 2λw₁
xᵢᵀw — предсказание для объекта i, yᵢ — его настоящий ответ, xᵢ₁ — значение первого признака. Сумма складывает вклад всех объектов. ∂L/∂w₁ — подсказка, как меняется общий loss, если чуть изменить только первый вес.
Вклад данных
Σ 2(xᵢᵀw − yᵢ)xᵢ₁ подсказывает, как улучшить предсказания.
Вклад L2
2λw₁ тянет вес к нулю. Градиент учитывает обе цели сразу.
В учебном примере gradient_data = −2 2λw = 2×0.10×2 = 0.4 Общий градиент = −1.6 Вклад L2 в шаг: 2 − 0.1×0.4 = 1.96 (к нулю)
Здесь вклад данных закреплён равным −2 для наглядности. Ползунок меняет вес, выше — силу регуляризации. L2 участвует в каждом шаге, а не добавляется только после обучения.
Как L1 меняет градиент?
∂L/∂w₁ = Σ2(xᵢᵀw − yᵢ)xᵢ₁ + λ sign(w₁)
sign(w) — знак числа: если вес положительный, sign = +1; если отрицательный, sign = −1. При вычитании градиента оба варианта двигают вес к нулю.
w = +5
sign(w) = +1 → шаг уменьшает положительный вес к нулю.
w = −5
sign(w) = −1 → шаг делает вес менее отрицательным, тоже к нулю.
Что происходит в точке w = 0?
У графика |w| в нуле острый угол, поэтому обычная производная там не определена. Используют обобщённое понятие — субградиент. Оптимизаторы умеют с ним работать.
Про / bias: свободный коэффициент часто не включают в штраф. Обычно регуляризуют w₁, w₂, …, а w₀ оставляют отдельно. Детали зависят от реализации.
Почему одинаковые прогнозы могут иметь разные веса?
Когда два признака говорят почти одно и то же
Представь, что мы предсказываем цену квартиры. x₁ — площадь в м², а x₂ — та же площадь, случайно скопированная в другой столбец. Значит, x₂ = x₁.
= w₁x₁ + w₂x₂ если x₁ = x₂ = , то ŷ = (w₁ + w₂)x
Для прогноза важна сумма весов. Все три пары ниже дают одинаковое правило ŷ = 2x:
Вариант Aw₁ = 2, w₂ = 0
Вариант Bw₁ = 1, w₂ = 1
Вариант Cw₁ = 3, w₂ = −1
Веса разные, а предсказания одинаковые. По одной только ошибке модель не всегда понимает, какой набор весов выбрать.
Когда признаки сильно связаны и несут почти одну информацию, это называют мультиколлинеарностью. Из-за неё отдельные веса могут быть нестабильными: они меняются, а общий прогноз почти тот же.
Математическая запись со слайда
— таблица признаков, w — набор весов, а Xw — предсказания: ŷ = Xw. Если столбцы признаков зависимы, существует ненулевой вектор v, для которого Xv = 0.
X(w + cv) = Xw + cXv = Xw
c — число, которым мы умножаем направление v. Так как Xv = 0, веса меняются, а ответы модели остаются теми же. На слайде направление может называться другой буквой; здесь v — зависимость признаков, а λ ниже — сила регуляризации.
Проверим это на двух одинаковых признаках
Возьмём x₁ = x₂ = 5 и правильный ответ = 10. Если сумма весов равна 2, прогноз всегда будет 10. Но L2-штраф разный.
Меняй веса и смотри, что происходит
ŷ = 2×5 + 0×5 = 10 Ошибка на данных = 0 L2 penalty = 2² + 0² = 4 Общий loss = 0 + 0.10 × 4 = 0.4
Сумма весов остаётся 2, прогноз тот же, но L2-штраф меняется.
Примеры: веса (2, 0) дают прогноз 10 и штраф 4; веса (1, 1) дают прогноз 10 и штраф 2; веса (3, −1) дают прогноз 10 и штраф 10. При одной и той же ошибке L2 предпочитает (1, 1), потому что общий штраф меньше.
Математика глубже: Weight Decay и запись со слайдов
Почему L2 называют Weight Decay?
При L2 к подсказке от данных прибавляется 2λw. В результате обычный шаг обучения слегка уменьшает старый вес, а затем вносит поправку по данным.
без штрафа: w_new = w − × gradient_data с L2: w_new = w − α(gradient_data + 2λw) раскрываем скобки: w_new = (1 − 2αλ)w − αgradient_data
α (альфа) — размер шага обучения. Множитель 1 − 2αλ уменьшает старый вес: например, 10 × 0.99 = 9.9. Потом добавляется поправка от данных. Такое «затухание весов» и называют Weight Decay.
L2 и Weight Decay всегда полностью одно и то же?
При обычном градиентном спуске L2 приводит к такому уменьшению весов. Некоторые оптимизаторы, например AdamW, применяют weight decay отдельно от градиента loss. Для первого знакомства это близкие идеи, но технически реализация может различаться.
L2: штраф за квадраты весов
L2 возводит каждый вес в квадрат и складывает квадраты. Квадрат делает штраф положительным и особенно быстро растущим для больших весов.
L(w) = Σ(ŷᵢ − yᵢ)² + λΣwⱼ²
Обычно штрафуют веса признаков w₁…wₙ; свободный коэффициент w₀ часто оставляют без штрафа.
Обозначение
Простое значение
ŷᵢ
предсказание для объекта i
yᵢ
настоящий ответ для объекта i
ŷᵢ − yᵢ
ошибка
(ŷᵢ − yᵢ)²
квадрат ошибки
Σ
сложить по всем объектам или весам
wⱼ²
квадрат одного веса
λΣwⱼ²
штраф за размеры весов
Здесь i — номер объекта, j — номер веса, L(w) — общий loss для выбранных весов.
Квадрат веса
Если w = 1, то w² = 1. Если w = 2, то w² = 4. Если w = 5, то w² = 25.
Что видно?
Вес вырос с 5 до 10 в 2 раза, а его квадрат — с 25 до 100, в 4 раза. Большие веса обходятся модели дороже.
Теперь мы умеем
Различать ошибку данных и штраф за веса.
Понимать λ, L1 и L2.
Добавлять штрафы к градиенту, не штрафуя bias в ДЗ.
Зачем идём дальше? Перейдём от цены квартиры к другому виду ответа — клику или отсутствию клика.
КлассификацияГде мы сейчас?
До этого ответом была цена квартиры — число. Теперь ответ один из двух: клик или не клик.
Меняем задачу: кликнет или не кликнет?
Что изменилось в задаче?
Предсказать цену — регрессия. Предсказать категорию — классификация. Дальше один постоянный пример: реклама и клик.
Что знаем до прогноза
Что выяснится позже
X: прошлые посещения, клики, объявление
y: кликнул (1) или не кликнул (0)
Модель оценивает вероятность клика p. Мы хотим сохранить степень уверенности: 51% и 99% — разные прогнозы, даже если оба превращаются в ответ «клик» при пороге 50%.
Как читать вероятность?
Вся вероятность — 1, или 100%. Например, = 0.8 означает оценку 80% для клика; для не клика остаётся 1 − 0.8 = 0.2, то есть 20%.
0.10.30.50.70.9
0 — практически невозможно0.5 — посередине1 — модель максимально уверена
0.80 = 80%: скорее кликнет
Если нужен один итоговый класс, часто используют порог 0.5: ниже — класс 0, от 0.5 — класс 1. Порог можно менять. Сначала модель всё равно рассчитывает вероятность.
Здесь ты задаёшь готовую вероятность вручную, чтобы освоить шкалу. В следующей теме модель сама рассчитает её из признака и весов. Порог 0.5 — частый выбор, его можно менять.
Теперь мы умеем
Отличать регрессию от классификации.
Читать вероятность и отличать её от метки y.
Зачем идём дальше? Пока мы двигали вероятность руками. Теперь узнаем, как её рассчитывает модель.
КлассификацияГде мы сейчас?
Мы знаем, что p — вероятность клика. Как получить её из обычных чисел?
От признака к вероятности: z и sigmoid
Сначала получим сырую оценку z
Пусть у человека было посещения сайта. Это единственный признак x. Для демонстрации зададим веса: и .
Умножаем визиты на их вес, затем добавляем сдвиг:
× = 4 + 4 =
= + ×
z — сырая оценка, её можно назвать logit. Это ещё не вероятность: она может быть меньше 0 или больше 1.
Sigmoid превращает оценку в вероятность
Нужен переводчик, который большую положительную оценку приближает к 1, а отрицательную — к 0. Эта функция называется sigmoid, или сигмоида.
= 2 → sigmoid(2) ≈ → примерно 88.1% для клика.
= sigmoid(z) = 1 / (1 + e−z)
p — вероятность клика; z — рассчитанная оценка; e ≈ 2.718 — постоянное математическое число. (z) тоже может обозначать sigmoid; в стандартизации σ имела другой смысл — разброс.
Откуда получилось 0.881?
Подставили z=2. Калькулятор даёт e^() ≈ 0.1353. Прибавляем 1: 1.1353. Делим 1 на это число: 1 / 1.1353 ≈ 0.8808. Округляем до 0.881. Это преобразование гарантирует число между 0 и 1; качество вероятностей зависит от обучения.
Горизонталь — оценка z; вертикаль — вероятность p. Точка — расчёт для выбранного числа визитов.
Теперь мы умеем
Читать цепочку x → веса → z → sigmoid → p.
Отличать учебные веса, входные данные и вычисленную вероятность.
Зачем идём дальше? Теперь у нас есть вероятности и реальные ответы. Проверим, насколько они согласуются.
КлассификацияГде мы сейчас?
Модель уже выдала вероятности клика p. В данных есть реальные ответы y. Как объединить поддержку всех ответов?
Likelihood: поддержала ли модель реальные ответы?
Какую вероятность брать, если человек не кликнул?
Для следующих трёх людей зададим готовые ответы условной модели: = , , 0.6. Это отдельный учебный пример, а не результаты ползунка с визитами.
Человек
Что произошло на самом деле
Что сказала модель
Вероятность настоящего ответа
№ 1
Кликнул, y = 1
P(клик) = 0.8
0.8
№ 2
Не кликнул, y = 0
P(клик) = 0.3
Не клик: 1 − 0.3 = 0.7
№ 3
Кликнул, y = 1
P(клик) = 0.6
0.6
Назовём вероятностью именно того ответа, который случился: при =1 берём q=p, при y=0 берём q=1−p. Поэтому второй человек даёт q=1−0.3=0.7.
Почему 1 − 0.3, а не 1 + 0.3?
Весь «пирог» вероятности — 1. Клик занял 0.3. На противоположный исход осталось 0.7. Проверка: 0.3 + = 1.
Как собрать одно число для всех трёх?
В этой модели считаем ответы отдельных людей независимыми при заданных признаках и весах. Поэтому вероятность наблюдать все эти ответы вместе — произведение их вероятностей.
× × =
Это likelihood, правдоподобие. На одних и тех же наблюдениях можно сравнивать разные веса: больше произведение — сильнее модель поддержала записанные ответы. Это не вероятность, что модель «правильная».
Запись из лекции: ∏ и индекс i
Likelihood() = ∏ᵢ qᵢ
— перемножить; i — номер человека; qᵢ — вероятность его настоящего ответа при текущих весах w. В других материалах её могут обозначать P(Y=yᵢ | =xᵢ, w). Вертикальная черта читается «при известных» признаках и весах.
Каждый ползунок — вероятность, которую модель дала правильному ответу одного человека. Начальные значения — из таблицы выше.
Общее правдоподобие0.336
0.80 × 0.70 × 0.60 = 0.336
Ползунки напрямую меняют для опыта; в настоящем обучении меняют общие веса, и уже из них получаются вероятности. У второго ползунка начальное q=, а вероятность клика была =0.3.
Теперь мы умеем
Выбирать p или 1−p по реальному ответу.
Понимать произведение вероятностей для фиксированных данных.
Зачем идём дальше? Произведение множества вероятностей становится крошечным. Понадобится ln — сначала вспомним его отдельно.
КлассификацияГде мы сейчас?
Мы получили likelihood как произведение вероятностей. Что за операция поможет заменить произведение суммой?
Математическая пауза: что означает ln?
Логарифм спрашивает: какая степень?
На минуту отложим модель. В записи 2³=8 мы знаем степень 3 и ищем результат: 2×2×2=8. Теперь задаём обратный вопрос: какую степень нужно поставить у 2, чтобы получить 8?
ln — логарифм с постоянным основанием e ≈ 2.718. ln(0.9) спрашивает: в какую степень возвести e, чтобы получить 0.9?
e? = 0.9 ? ≈ ln(0.9) ≈
e⁰=1. Чтобы получить число меньше 1, нужна отрицательная степень: например, e⁻¹=1/e≈0.368. Для 0.9 подходит меньший по модулю отрицательный показатель.
Попробуй: какую степень ищет ln?
Несколько значений и границы
q
ln(q)
1
0
0.9
≈ −0.105
0.5
≈ −0.693
0.1
≈ −2.303
0.01
≈ −4.605
Для 0<<1 логарифм отрицательный; при q=1 он равен 0. ln(0) не определён; когда q приближается к нулю справа, ln(q) уходит в минус без границы.
Теперь мы умеем
Читать логарифм как вопрос о степени.
Понимать ln(0.9) и знак результата.
Зачем идём дальше? Возвращаемся к 0.8 × 0.7 × 0.6: применим ln и получим штраф.
КлассификацияГде мы сейчас?
Мы знаем, что ln ищет степень. Зачем применять его к вероятностям и менять знак?
От likelihood к loss и BCE
Возвращаемся к произведению
Мы вернулись к тому месту, где остановились до математической паузы. Снова посмотрим на готовый likelihood, а затем применим к нему ln.
Зачем здесь ln? В большом наборе произведение множества вероятностей становится крошечным. Вместо него компьютер может складывать логарифмы вероятностей. Это удобнее считать, а сравнение моделей сохраняется.
ln(a × b) = ln(a) + ln(b)
Каждая вероятность отвечает своему человеку; после ln умножение заменяется сложением этих отдельных значений:
Это называется log-likelihood — логарифм правдоподобия. Он может быть отрицательным: логарифм числа от 0 до 1 отрицательный. Это нормально.
Почему лучший порядок моделей не меняется?
Логарифм сохраняет порядок чисел: если одно likelihood больше другого, его логарифм тоже будет больше. Поэтому модель, у которой likelihood лучше, останется лучшей и после логарифма. Мы изменили удобство вычисления, а не результат сравнения.
Почему минус превращает это в штраф?
Хорошие веса дают больший log-likelihood. Но привычная задача обучения — уменьшать loss. Меняем знак: максимум log-likelihood становится минимумом его отрицания.
Для одного человека возьмём — вероятность настоящего ответа:
Первый прогноз поддержал настоящий ответ сильнее и получил меньший штраф. Уверенная ошибка получает большой штраф.
loss одного ответа = −ln(q)
q — вероятность настоящего ответа; ln — логарифм; минус меняет знак результата. Это один вид loss, а не определение любого loss.
Двигай ползунок: q — вероятность правильного ответа, которую дала модель.
q = 0.90 · ln(q) ≈ −0.105 · loss ≈ 0.105
Модель дала правильному ответу высокую вероятность — штраф маленький.
Как меняется штраф, когда меняется вероятность?
Оранжевая точка показывает текущее значение ползунка. При q → 1 штраф стремится к 0; при q → 0 быстро растёт. Точные текущие значения смотри в расчёте над графиком.
Почему два минуса дают плюс?
Внешний минус означает умножить результат на −1. Поэтому −(−0.105) = (−1)×(−0.105) = +0.105.
Почему штраф так быстро растёт около нуля?
При уменьшении q логарифм становится всё более отрицательным. Например, q=0.1 даёт 2.303 штрафа, q=0.01 — 4.605. При q→0 штраф не ограничен. Это мешает модели безнаказанно почти исключать реально случившийся ответ.
BCE: объединяем два случая
В бинарной классификации есть два ответа: = 1 или y = 0. Модель выдаёт вероятность класса 1, например = 0.8.
Если правильный ответ y = 1
Нас интересует вероятность класса 1: это p.
Если модель дала ему 0.8, правильный ответ получил вероятность 0.8.
Если правильный ответ y = 0
Нас интересует вероятность класса 0: это 1 − p.
Если класс 1 получил 0.8, класс 0 получает 1 − 0.8 = 0.2.
Мы уже разобрали штраф для одной вероятности. Сейчас объединим два случая — когда правильный ответ y = 1 и когда y = 0 — в одну формулу:
BCE = −[ y × ln(p) + (1 − y) × ln(1 − p) ]
Что это
Значение
y
Настоящий ответ из данных: 0 или 1
p
Вероятность класса 1, которую выдала модель
1 − p
Вероятность класса 0
−ln(...)
Штраф: меньше вероятность настоящего класса — больше штраф
Как формула выбирает нужный случай? Если y = 1, первая часть остаётся: −ln(p). Если y = 0, первая часть обнуляется, остаётся −ln(1 − p).
Поменяй ответ и вероятность
Настоящий ответ1
Вероятность настоящего класса0.80
Loss = −ln(этой вероятности)0.223
Настоящий ответ — 1, поэтому смотрим на вероятность класса 1: p = 0.80. Чем она выше, тем меньше штраф.
Название: Binary Cross Entropy (BCE) — это negative log-likelihood для бинарного ответа. Не нужно заучивать название отдельно: смысл тот же — маленькая вероятность настоящего ответа даёт большой штраф.
Почему уверенная ошибка получает большой штраф?
Если в данных y = 0, а модель дала классу 1 вероятность 0.99, то классу 0 остаётся только 0.01. Вероятность настоящего ответа очень низкая, поэтому −ln(0.01) ≈ — большой штраф. Если модель уверена и права, штраф маленький.
Связь с обучением: посчитали p по и → выбрали вероятность ответа по y → получили loss → вычислили градиент → изменили w. Модель не вычисляет ln до likelihood; это способ записать критерий её обучения.
Что суммируется в ДЗ?
Для каждого объекта считается BCE. Затем штрафы складываются: = Σᵢ BCEᵢ. Градиент этой суммы: Xᵀ(p−y). В других реализациях можно брать среднее, но в вашем notebook деления на размер батча нет.
Теперь мы умеем
Переходить от произведения к сумме логарифмов.
Понимать знак минус в loss.
Читать BCE для y=1 и y=0.
Зачем идём дальше? В notebook те же действия записаны через таблицы и векторы. Разберём эту короткую запись.
ДЗ и справкаГде мы сейчас?
По одному объекту мы уже умеем умножать признаки на веса и складывать. Как записать то же сразу для многих объектов?
Векторы, матрицы и код из ДЗ
Вектор: список с фиксированным порядком
Начнём не с абстрактных букв. Представь карточку одного пользователя. В ней записаны его признаки — несколько чисел.
Пример признаков одного пользователя
= [1, 2, 3]
Первое число 1 — техническая единица для свободного коэффициента. Второе: условно 2 прошлых визита. Третье: 3 клика.
Что называют вектором?
Вектор — это упорядоченный список чисел. Здесь вектор x содержит три числа. Порядок важен: если договорились, что второй элемент — визиты, нельзя потом поставить туда клики.
Можно представить вектор как аккуратную коробочку с ячейками: в каждой ячейке лежит значение одного признака.
x = [x₀, x₁, x₂] = [1, 2, 3]
Что такое веса?
Модель хранит по одному весу для каждого элемента x. Вес показывает, как данная модель учитывает соответствующий признак. Это не универсальная «важность в мире»: знак и величина веса зависят от данных, масштаба признака и остальных весов.
= [, , w₂] = [−2, 0.5, 1]
Если вес положительный, увеличение соответствующего признака увеличивает итоговую сумму, если остальные значения неизменны. Если вес отрицательный — уменьшает. Нулевой вес не добавляет вклад.
Умножили пары чисел и сложили
Операция w · x называется скалярным произведением. В этом контексте её проще читать так: «перемножить пары соответствующих чисел и сложить результаты».
Получилось одно число — 2. Это пока не вероятность и не класс. Это сырая оценка модели.
Не перепутай: точка в записи w · x означает операцию «скалярное произведение», а не обычное умножение двух целых векторов. Результат этой операции — одно число.
Попробуй вклады двух признаков
Попробуй посчитать сама моделью
Поменяй компоненты признаков или весов. Ползунки покажут каждый вклад wᵢ × xᵢ и их сумму.
z = −2×1 + 0.5×2 + 1×3 = 2
Итоговая сумма = 2.00
Зачем столбец единиц?
В формуле модели часто есть свободный коэффициент, который называют b или :
= b + w₁x₁ + w₂x₂
Можно положить x₀ = 1 и считать w₀ = b. Тогда всё складывается в одну запись:
z = w₀x₀ + w₁x₁ + w₂x₂ = ·
Единица не измеряет свойство пользователя. Она просто позволяет записать свободный коэффициент как ещё один член суммы.
Почему число элементов должно совпадать?
Если в x три компонента, то и весов для них должно быть три. Иначе неясно, какой вес умножать на какой признак.
x = [1, 2, 3] и w = [−2, 0.5, 1] → три пары → одно число
В реальных моделях признаков может быть тысячи или миллионы, но принцип тот же.
Квартиры как строки : [1, 30] [1, 50] [1, 70] Веса w = [0.5, 0.15]. Xw = [5, 8, 11] — три прогноза.
Единица позволяет включить сдвиг в то же умножение: 1×0.5 + площадь×0.15. Здесь форма X — (3, 2), w — (2,), результата — (3,).
Как читать Xᵀ(p − y)?
Меняем числа для маленькой задачи о кликах: признак =[0,1,2], ответы =[0,0,1]. При нулевых весах =0 и =0.5 для всех.
Строка X с единицей
p − y
[1, 0]
0.5 − 0 = 0.5
[1, 1]
0.5 − 0 = 0.5
[1, 2]
0.5 − 1 = −0.5
Для bias складываем разницы: 0.5+0.5−0.5=0.5. Для веса признака сначала умножаем на его значения: 0×0.5+1×0.5+2×(−0.5)=−0.5.
градиент = Xᵀ(p − y) = [0.5, −0.5]
Xᵀ — таблица , у которой поменяли строки и столбцы. Так каждый признак собирает вклад всех объектов. В NumPy X.T @ (p - y): .T меняет оси, @ умножает матрицу на вектор.
Размеры массивов и короткий словарь NumPy
X: (3,2); X.T: (2,3); p−y: (3,). Результат: (2,) — одна подсказка для каждого из двух весов. Это одномерный массив, не столбец формы (2,1).
Запись
Смысл здесь
.shape
Размеры массива
np.sum
Сложить значения
np.mean
Взять среднее
np.linalg.norm(w)
Длина вектора весов; для L2 берут её квадрат
np.random
Случайный старт или порядок объектов
Дополнительно: точное решение из лекции
В слайдах есть второй способ обучить линейную регрессию: решить задачу наименьших квадратов сразу. Для домашки вы реализуете градиентный спуск; подробную альтернативу можно открыть позже.
Линейность по параметрам и псевдообратная матрица
Линейная модель линейна по весам. В признаках могут быть x² или другие заранее вычисленные преобразования: =+w₁x+w₂x² всё ещё линейна по w.
Для таблицы и ответов ищем веса с минимальной суммой квадратов: ()=‖Xw−y‖². Знак ‖…‖ означает длину вектора промахов, квадрат длины — сумму квадратов его элементов.
∇L = 2Xᵀ(Xw−y) XᵀXw = Xᵀy w = X⁺y
Приравняли градиент к нулю, чтобы найти минимум. X⁺ — псевдообратная матрица. Если столбцы X независимы, можно записать X⁺=(XᵀX)⁻¹Xᵀ. Знак −1 здесь означает обратную матрицу, а не поэлементное деление.
При зависимых столбцах эта обратная матрица не существует, но псевдообратная остаётся определена. На практике решают через np.linalg.lstsq(X, y, rcond=None)[0] или np.linalg.pinv(X) @ y, не вычисляя обратную вручную. Если решений несколько, псевдообратная выбирает решение с минимальной длиной весов.
Теперь мы умеем
Читать Xw как прогнозы по строкам.
Понимать столбец единиц и формы массивов.
Связывать X.T @ (p−y) с ручным расчётом.
Зачем идём дальше? Можно переходить к четырём упражнениям: подсказки и код открываются по желанию.
Дополнительно: softmax для нескольких классов
В лекции эта тема есть; в HW 2 мы обучаем бинарную модель. Теперь меняем пример с кликов на три категории изображений.
Для двух классов достаточно одной вероятности: если P(класс 1) = 0.8, то P(класс 0) = 0.2. Для трёх и более классов модель должна оценить каждый класс.
У каждого класса свой набор весов
Представим, что модель различает кота, собаку и птицу. У всех изображений одинаковый набор признаков x, но для каждого класса есть свой набор весов.
Считаем скалярное произведение отдельно для каждой строки весов. Получаем три числа — по одному на класс.
zкот = wкот · x zсобака = wсобака · x zптица = wптица · x
Если сложить все наборы весов строками, получится матрица. Матрица — это прямоугольная таблица чисел. Умножение этой матрицы на вектор признаков сразу возвращает вектор оценок для классов.
Размерности можно прочитать буквально: если в признаковом векторе n чисел, каждая строка матрицы W тоже должна иметь n весов. Если классов K, матрица содержит K строк, а результат — K оценок.
Logits — оценки до вероятностей
Logit — сырая оценка, которую модель рассчитала для класса до преобразования в вероятность. Logits могут быть отрицательными, положительными и больше единицы. Они не обязаны складываться в 1.
кот: 2 собака: 1 птица: 0
Пока что самое большое число у кота, поэтому кот — наиболее вероятный выбор модели. Но сами числа 2, 1 и 0 ещё не означают вероятности 2%, 1% и 0%.
Softmax переводит набор оценок в вероятности
Для каждого класса softmax берёт экспоненту его logit, а затем делит на сумму экспонент по всем классам:
Теперь все значения от 0 до 1, а вместе дают примерно 1 (расхождение в последнем знаке может быть из-за округления).
Результат: модель оценивает кота примерно в 66.5%, собаку — в 24.5%, птицу — в 9.0%. Наибольшая вероятность у кота.
Почему в нейросетях часто не пишут softmax перед Cross Entropy?
В математике мы объясняем цепочку как logits → softmax → вероятности → cross-entropy. В библиотеках вроде PyTorch для обучения обычно передают logits прямо в CrossEntropyLoss: функция сама внутри устойчиво сочетает softmax и log-loss. Если вручную применить softmax, а затем передать результат туда, где ожидаются logits, получится неверное использование.
Название может запутать: logit и логарифм — разные слова. Logit здесь означает сырую оценку класса. В бинарном случае математический logit вероятности имеет ещё и специальное определение как log-odds, но в этой лекции главное — значение до sigmoid/softmax.
Карта темы и источники
В машинном обучении модель получает примеры, выдаёт ответ, сравнивает его с реальностью и настраивает свои параметры.
данные→X — признаки→модель с весами w→предсказание
Если нужен числовой ответ
Линейная регрессия → прогноз ŷ (например, цена квартиры).
Если нужна категория
Классификация → вероятность p → выбранный класс 0 или 1.
сравнили с настоящим y→ошибка + штраф за веса→общий loss→изменили веса w→повторили обучение
Цепочка вероятностей в классификации
Модель оценила классвероятность p
Выбрали вероятность реального ответавероятность правильного класса
Объединили ответы многих объектовlikelihood
Произведение заменили суммой логарифмовlog-likelihood
Поменяли знак, чтобы уменьшать числоloss / BCE
Главная мысль: это связанные шаги одного процесса, а не набор отдельных формул.
Какие разделы соответствуют DLS?
Источник
Где на странице
Лекция, слайды 3–12
Линейная модель, loss, векторы, точное решение
Лекция, слайды 13–27
Классификация, likelihood, sigmoid, BCE, softmax
Лекция, слайды 28–40
Главный раздел градиентного спуска
Лекция, слайды 41–47
Регуляризация и масштабирование
HW 2, задания 1–4
Градиент sin²x+sin²y; батчи; fit/get_grad; Elastic Net
Квартиры, чаши и числа кликов — учебные примеры для объяснения тех же идей. Порядок подачи изменён для новичка; формулы и требования ДЗ сохранены.
Сверено 16 октября 2026: задания в main и autumn26 совпадают; в autumn26 добавлена проверка fit и обновлён один вызов построения 3D-графика. HTML объясняет решение, но не подтверждает выполнение вашего Colab.
Словарь: что означает символ здесь?
Обозначение
Что значит
По-простому
X
здесь: таблица признаков; на вероятностных слайдах — случайный вектор
какие вообще бывают входные данные
xᵢ
конкретный объект
одна строка датасета
Y
на вероятностных слайдах: случайная целевая переменная
что мы хотим предсказывать вообще
yᵢ
конкретный правильный ответ
истинная метка объекта i
ŷ
предсказанное число
ответ модели в регрессии
p
вероятность
например, вероятность класса 1
Likelihood
правдоподобие
насколько модель поддержала настоящие ответы
Log-likelihood
логарифм правдоподобия
то же сравнение моделей, но произведение стало суммой
NLL
отрицательный log-likelihood
штраф: чем меньше, тем лучше
BCE
Binary Cross Entropy
штраф за вероятность настоящего ответа 0 или 1
w
параметры модели
числа, которые модель обучает
Σ
сумма
сложить
∏
произведение
перемножить
ln
натуральный логарифм
математическое преобразование
L
loss
насколько плохо модель ошибается
α
скорость обучения
размер шага при изменении параметров
градиент
набор производных по параметрам
подсказка, куда растёт ошибка и насколько быстро
MSE
средняя квадратичная ошибка
средний квадрат промахов для числовых ответов
регуляризация
добавочный штраф в loss
помогает сдерживать слишком большие веса
λ (лямбда)
сила регуляризации
насколько сильно учитываем штраф
L1
штраф по сумме модулей весов
может сделать часть весов нулевыми
L2
штраф по сумме квадратов весов
плавно уменьшает большие веса
мультиколлинеарность
сильная связь между признаками
несколько признаков сообщают почти одну информацию
Одна буква может иметь разные значения в разных местах. В sin²x+sin²y буква y — координата, а в классификации y — настоящий класс.
Символ
Смысл в нашем контексте
q
Вероятность настоящего ответа: p или 1−p
μ, σ
Среднее и стандартное отклонение признака
σ(z)
Иногда так обозначают sigmoid — другой контекст σ
∂L/∂w
Как меняется loss при малом изменении выбранного веса
α, β в Elastic Net
Силы L1/L2; α здесь не learning rate
Проверка: от данных до обучения
Отвечай своими словами, потом выбирай вариант. Ошибка — повод вернуться к одному конкретному шагу.
Главная → Домашние задания
Домашние задания
Выбери работу, посмотри свой прогресс или вернись к темам, которые хочется повторить.