Классификатор сначала строит числовой счёт, а уже затем сравнивает его с порогом. Геометрия границы определяется признаками; цена решения — выбранным порогом. Эти две части нельзя смешивать: одна отвечает за то, как устроен мир, другая — за то, что мы готовы потерять.

Письмо по одну сторону прямой

Возьмём реальную коллекцию SMS Spam Collection, ту же, что в уроке 42: 5574 сообщения, из них 747 помечены как спам — 13,4%. Опишем каждое письмо двумя честными, измеримыми признаками: x1x_1 — доля цифр среди символов, x2x_2 — длина письма, делённая на тысячу символов. Ни одного слова из словаря, только форма сообщения. Линейный классификатор вычисляет

s(x)=w1x1+w2x2+b.s(x)=w_1x_1+w_2x_2+b.

При s(x)0s(x)\geq0 письмо относят к спаму, иначе — к обычным. Множество точек с нулевым счётом

wx+b=0w^\top x+b=0

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

Обучим логистическую регрессию на 3901 случайно выбранном сообщении и проверим на отложенных 1673 (разделение с фиксированным зерном, как учит урок 32). Получаем

w=(19,50;  7,20),b=3,21,w=20,78,w=(19{,}50;\;7{,}20),\qquad b=-3{,}21,\qquad \|w\|=20{,}78,

и точность 93,5% на отложенной выборке. Две грубые характеристики формы уже отделяют большую часть спама от переписки живых людей — просто потому, что рекламные рассылки любят номера, коды и длинные тексты.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Облако синих точек обычных писем и красных точек спама в осях доля цифр и длина; чёрная прямая границы, золотая стрелка вектора w перпендикулярно ей и зелёный перпендикуляр от одной точки до границы
Рис. 53.1. Нормаль, граница и расстояние со знаком на реальном спаме

Оси намеренно взяты в одном масштабе, поэтому прямой угол на картинке — это настоящий прямой угол. Чёрная линия задаёт s=0s=0, золотая стрелка ww — направление роста счёта. Для письма с 30% цифр и длиной 140 символов счёт равен 3,653{,}65, а расстояние до границы — 3,65/20,78=0,1763{,}65/20{,}78=0{,}176.

Счёт — это расстояние, умноженное на длину весов

Формула s(x)=wx+bs(x)=w^\top x+b выглядит алгебраически, но в ней спрятана геометрия. Пусть x0x_0 — любая точка границы, тогда wx0+b=0w^\top x_0+b=0 и

s(x)=w(xx0).s(x)=w^\top(x-x_0).

Скалярное произведение равно длине проекции xx0x-x_0 на направление ww, умноженной на w\|w\|. Значит,

d(x)=s(x)wd(x)=\frac{s(x)}{\|w\|}

— расстояние от точки до границы со знаком: плюс с той стороны, куда смотрит ww, минус — с другой. Наше письмо удалено от границы на 0,1760{,}176 в тех единицах, в которых измерены признаки.

От счёта к вероятности

Логистическая регрессия переводит счёт через сигмоиду:

p^(y=1x)=σ(s)=11+es.\widehat p(y=1\mid x)=\sigma(s)=\frac1{1+e^{-s}}.

Обратное преобразование даёт логарифм шансов:

logp1p=wx+b.\log\frac{p}{1-p}=w^\top x+b.

Отсюда прямое, проверяемое утверждение: при увеличении xjx_j на единицу шансы класса 1 умножаются на ewje^{w_j}, если остальные признаки фиксированы. В нашей модели прибавка одного процентного пункта цифр (Δx1=0,01\Delta x_1=0{,}01) умножает шансы на

e19,500,01=e0,195=1,22,e^{19{,}50\cdot0{,}01}=e^{0{,}195}=1{,}22,

а сотня лишних символов (Δx2=0,1\Delta x_2=0{,}1) — на

e7,200,1=e0,72=2,05.e^{7{,}20\cdot0{,}1}=e^{0{,}72}=2{,}05.

Такая интерпретация требует осмысленного масштаба и осторожности с коррелированными признаками: если два столбца почти совпадают, веса распределяются между ними произвольно, о чём предупреждал урок 51.

Параметры обучаются максимизацией бернуллиевского правдоподобия, то есть минимизацией перекрёстной энтропии:

i[yilogpi+(1yi)log(1pi)].-\sum_i\left[y_i\log p_i+(1-y_i)\log(1-p_i)\right].

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

Фишер искал направление, а не порог: его линейный дискриминант — это выбор вектора ww, вдоль которого два облака расходятся сильнее всего. Вопрос «где поставить черту» он оставлял отдельно. Ровно это разделение мы и разбираем весь урок.

Порог — отдельное решение

Стандартный порог 0,5 не является законом природы. Сравнение ppp\geq p_* равносильно сравнению счёта с числом:

slogit(p)=logp1p.s\geq\operatorname{logit}(p_*)=\log\frac{p_*}{1-p_*}.

Для p=0,8p_*=0{,}8 это slog4=1,386s\geq\log4=1{,}386, для p=0,2p_*=0{,}2s1,386s\geq-1{,}386. Геометрически граница сдвигается параллельно: вектор ww не поворачивается, порядок объектов по счёту не меняется, меняется лишь черта, по которой мы действуем.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева гистограммы счёта для обычных писем и спама в логарифмическом масштабе с тремя вертикальными порогами, справа сигмоида с отмеченными логитами порогов 0,2, 0,5 и 0,8
Рис. 53.2. Один счёт, три порога и мост между шкалами

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

На реальных данных три порога дают три совершенно разные системы:

p=0,2:precision 83,4%,recall 80,8%,p_*=0{,}2:\quad\text{precision }83{,}4\%,\quad\text{recall }80{,}8\%, p=0,5:precision 94,6%,recall 54,5%,p_*=0{,}5:\quad\text{precision }94{,}6\%,\quad\text{recall }54{,}5\%, p=0,8:precision 94,9%,recall 16,5%.p_*=0{,}8:\quad\text{precision }94{,}9\%,\quad\text{recall }16{,}5\%.

Одни и те же веса, одна и та же геометрия. При пороге 0,8 модель пропускает 187 спамовых сообщений из 224, зато ошибается всего на двух обычных письмах. При пороге 0,2 она ловит 181 сообщение, но 36 честных писем попадают под подозрение.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Три параллельные прямые для порогов 0,2, 0,5 и 0,8 на облаке реальных писем с подписанными precision и recall
Рис. 53.3. Пороги двигают прямую параллельно

Направление ww и порядок объектов неизменны, три линии строго параллельны. Полоса между крайними линиями — это множество писем, судьба которых зависит только от политики, а не от модели.

Цена ошибки задаёт порог

Порог нельзя выбрать, не назвав цену ошибок. Пусть пропуск объекта класса 1 стоит cFNc_{\text{FN}}, а ложная тревога — cFPc_{\text{FP}}. При вероятности pp ожидаемые потери двух действий равны

E[потеритревога]=cFP(1p),\mathbb{E}[\text{потери}\mid\text{тревога}]=c_{\text{FP}}(1-p), E[потерибездействие]=cFNp.\mathbb{E}[\text{потери}\mid\text{бездействие}]=c_{\text{FN}}\,p.

Действия равноценны, когда cFP(1p)=cFNpc_{\text{FP}}(1-p)=c_{\text{FN}}p, откуда

p=cFPcFP+cFN.p_*=\frac{c_{\text{FP}}}{c_{\text{FP}}+c_{\text{FN}}}.

Если пропуск мошенничества стоит 1000 рублей, а ручная проверка честной операции — 10 рублей, то p=10/1010=0,0099p_*=10/1010=0{,}0099. Никакой мистики в числе 0,5 нет: оно отвечает случаю равных цен.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева средние потери на письмо как функция порога с минимумом около 0,12 и отмеченной теоретической точкой 0,091, справа кривая precision-recall с отмеченными тремя порогами
Рис. 53.4. Кривая потерь и кривая precision-recall

Слева: реальные потери на отложенной выборке при цене пропуска 10 против 1 за ложную тревогу. Порог 0,5 обходится в 0,6140{,}614 условной единицы на письмо, минимум 0,1640{,}164 достигается при пороге 0,1250{,}125 — почти вчетверо дешевле, и всё это без единого шага обучения. Справа: одна кривая описывает все пороги сразу, а три точки на ней — три политики из рисунка 53.3.

Обратите внимание на расхождение: теория обещает p=0,091p_*=0{,}091, а эмпирический минимум лежит на 0,1250{,}125. Это не ошибка формулы, а плата за неточные вероятности: вывод верен для калиброванной модели, а наша откалибрована плохо. Проверим это отдельно.

Калибровка: обещание против факта

Классификатор калиброван, если среди объектов с прогнозом около qq доля положительного класса близка к qq. Проверяется это не рассуждением, а подсчётом.

Наша двухпризнаковая модель ранжирует прилично (AUC 0,973), но говорит о себе неправду: среди 68 писем, которым она дала вероятность между 0,4 и 0,6, спамом оказались 91,2%. Модель слишком скромна — ей просто не хватает признаков, чтобы быть уверенной, и она размазывает вероятность. Её ECE равна 0,071.

Для сравнения обучим на тех же письмах наивный Байес по словам (модель из урока 42). Его AUC чуть выше, 0,979, а ECE — 0,012. Но у него другая беда: только 6,1% писем получают вероятность в промежутке от 0,02 до 0,98, тогда как у логистической регрессии таких 99,9%.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева кривая надёжности логистической регрессии лежит выше диагонали, кривая наивного Байеса опирается на две крайние точки; справа гистограммы вероятностей в логарифмическом масштабе
Рис. 53.5. Кривая надёжности и распределение объявленных вероятностей

Слева: точки логистической регрессии лежат выше диагонали — модель обещает меньше, чем даёт. Справа: наивный Байес почти всегда отвечает «нуль» или «единица», у логистической регрессии ответы размазаны по всей шкале.

Отсюда практический вывод, который редко пишут в учебниках: у переуверенной модели порог перестаёт быть рычагом. Сдвиг порога с 0,1 до 0,9 меняет recall наивного Байеса лишь с 93,8% до 89,3% — почти ничего, ведь между этими порогами почти нет объектов. У логистической регрессии тот же сдвиг обрушивает recall с 94,6% до 6,3%. Управляемость системы — это тоже её свойство, а не только точность.

Матрица ошибок сильнее одной цифры

В тестовой выборке спама 13,4%. Классификатор, который всегда отвечает «не спам», получит 86,6% accuracy — и ноль пользы. Поэтому одна цифра точности без частот классов не значит почти ничего; об этом же говорил урок 31, где мы строили матрицу ошибок для цифр и считали доверительный интервал точности.

Для каждой строки матрицы полезно показывать три вещи: абсолютное число, условную долю и цену. Одинаковый процент ошибок в редком и в массовом классе создаёт совершенно разную нагрузку на людей, которые будут разбирать последствия. И ещё: ошибка «спам вместо рекламы от банка» и ошибка «спам вместо письма от врача» одинаковы для метрики и несравнимы для человека.

Журавлёв: оператор отдельно, решающее правило отдельно

Разделение, вокруг которого построен весь урок, было явно сформулировано в советской школе распознавания образов. Юрий Иванович Журавлёв (1935–2022), работавший в Вычислительном центре Академии наук СССР, предложил в 1970-е годы алгебраический подход к задачам распознавания. Ключевая идея: любой алгоритм распознавания раскладывается в произведение A=CBA=C\circ B, где распознающий оператор BB переводит описание объекта в матрицу числовых оценок принадлежности классам, а решающее правило CC превращает эти оценки в ответ.

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

Лаборатория поворота

Направление, длина весов, смещение и порог

Загружается живая иллюстрация…

Поворачивайте вектор ww и следите, какие точки меняют знак счёта первыми: меняется сама геометрия задачи. Затем растяните w|w| — граница не сдвинется ни на пиксель, но серая зона (объекты с вероятностью между 0,2 и 0,8) начнёт таять: модель становится уверенной, не становясь умнее. Двигайте bb — линия переносится параллельно. Наконец меняйте порог: линия переносится точно так же, но веса при этом остаются нетронутыми. Переключатель цены показывает, как выгодный порог cFP/(cFP+cFN)c_{\text{FP}}/(c_{\text{FP}}+c_{\text{FN}}) уезжает влево, когда пропуск дорожает.

Признаки меняют геометрию

Два класса в форме концентрических колец нельзя разделить прямой в исходных координатах (x1,x2)(x_1,x_2). Проверим на модельном примере (440 точек, зерно генератора зафиксировано): лучшая линейная модель даёт 54,8% — чуть лучше монетки. Добавим признак

ϕ3(x)=x12+x22.\phi_3(x)=x_1^2+x_2^2.

Теперь та же логистическая регрессия в трёх координатах достигает 100%. Порог по ϕ3\phi_3 выглядит окружностью в исходной плоскости, оставаясь гиперплоскостью в расширенном пространстве. Это прямое применение базисных функций: нелинейность границы может жить в признаках, а оптимизатор оставаться линейным.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Слева два кольцевых класса и бессильная прямая с точностью 55 процентов, справа трёхмерный подъём по сумме квадратов и горизонтальная плоскость, разделяющая классы
Рис. 53.6. Окружность становится плоскостью

Слева линейная граница невозможна: любая прямая режет оба кольца. Справа точки подняты на высоту z=x12+x22z=x_1^2+x_2^2; классы оказались на разных этажах, и горизонтальная плоскость их разделяет. Проекция плоскости обратно даёт окружность. Данные здесь модельные, зерно генератора фиксировано.

Несколько классов

Для KK классов обучают KK счётов

sk(x)=wkx+bks_k(x)=w_k^\top x+b_k

и выбирают argmaxksk\arg\max_k s_k. Softmax задаёт вероятности

pk(x)=esk(x)jesj(x).p_k(x)=\frac{e^{s_k(x)}}{\sum_j e^{s_j(x)}}.

Добавление одной и той же константы ко всем счётам не меняет вероятности:

esk+cjesj+c=eceskecjesj=eskjesj.\frac{e^{s_k+c}}{\sum_j e^{s_j+c}} =\frac{e^{c}e^{s_k}}{e^{c}\sum_j e^{s_j}} =\frac{e^{s_k}}{\sum_j e^{s_j}}.

Значит, у параметризации есть лишняя степень свободы. Граница между классами aa и bb задаётся уравнением sa=sbs_a=s_b, то есть

(wawb)x+(babb)=0,(w_a-w_b)^\top x+(b_a-b_b)=0,

и остаётся прямой. На реальном ирисе (две координаты лепестка) такой классификатор даёт 96,7%: плоскость разбивается на три выпуклые области.

Рисунок шире экрана — проведите по немуОткрыть целиком ↗
Плоскость длины и ширины лепестка ириса разбита на три области с прямыми границами, точки трёх видов раскрашены синим, красным и зелёным
Рис. 53.7. Три счёта, argmax и прямые границы

Три линейных счёта разбивают плоскость на выпуклые области; каждая пара классов разделена прямой sa=sbs_a=s_b. Ошибки живут только вдоль одной границы — между versicolor и virginica.

Стратегия «один против всех» обучает отдельный бинарный классификатор для каждого класса. Его вероятности не обязаны суммироваться в единицу, поэтому независимая калибровка и разрешение конфликтов становятся частью системы. Важное ограничение softmax: каждая область выпукла. Если класс представлен двумя раздельными облаками, одна выпуклая область опишет его плохо; тогда нужны новые признаки, несколько прототипов класса или порождающая модель облаков.

Матрица ошибок показывает, какие пары классов путаются, и это диагноз, а не приговор: путаница «кошка вместо собаки» и «кошка вместо дорожного знака» говорит о разных поломках представления. Для несбалансированных классов macro-среднее даёт каждому классу одинаковый вес, micro-среднее считает все объекты вместе; один итоговый F1 без частот и без матрицы оставляет геометрию путаницы невидимой.

Запас, шум и робастность

Точки около s=0s=0 естественно неуверенны: малое изменение признаков меняет класс. Оценим это количественно. Если признаки измерены с возмущением Δx\Delta x, то по неравенству Коши — Буняковского

s(x+Δx)s(x)=wΔxwΔx.|s(x+\Delta x)-s(x)|=|w^\top\Delta x|\leq\|w\|\,\|\Delta x\|.

Значит, при Δxε\|\Delta x\|\leq\varepsilon знак счёта гарантированно сохранится, если

s(x)w>ε.\frac{|s(x)|}{\|w\|}>\varepsilon.

Расстояние до границы — это и есть страховой запас. Наше письмо с s=3,65s=3{,}65 имеет запас 0,1760{,}176: чтобы перевести его в другой класс, придётся изменить признаки не меньше чем на эту величину. Ровно та же выкладка стоит за адверсариальными атаками из урока 26 — там противник выбирает Δx\Delta x вдоль ww, где счёт падает быстрее всего.

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

Далеко от границы — не значит надёжно

Большое s|s| не гарантирует правильности, если объект далеко от обучающих данных. Линейная формула экстраполирует счёт без предупреждения: подставьте письмо из пяти тысяч символов, и модель уверенно объявит спам просто потому, что w2>0w_2>0, хотя таких писем она не видела ни одного.

Различайте две причины неуверенности. Противоречивые метки в одной точке пространства дают шумовую неопределённость: признаков физически недостаточно, чтобы разделить классы, и никакое усложнение модели не поможет. Пустая область пространства даёт неопределённость знания: модель там ничего не видела, и её ответ — просто продолжение формулы. Одинаковая вероятность 0,5 в этих двух случаях означает разные вещи и требует разных действий: в первом — искать новые признаки, во втором — собирать данные. Карта неопределённости должна учитывать и расстояние до границы, и область поддержки обучающей выборки.

Это и есть частотный взгляд на порог: он ничего не сообщает об истине для конкретного письма, а задаёт долгосрочную частоту ошибок каждого типа. Лемма Неймана — Пирсона добавляет важное: оптимальное правило всегда имеет вид «сравни отношение правдоподобия с порогом». Счёт и порог — не изобретение инженеров, а форма любого разумного решения.

Дом как класс: дороже медианы

Из регрессионной задачи урока 49 легко сделать классификацию: предсказывать, будет ли цена квартиры выше медианы района. Такое упрощение теряет расстояние до порога — квартиры на тысячу и на десять миллионов выше медианы получают одинаковую метку. Если действие действительно бинарно, это допустимо; если важен размер ошибки, регрессия богаче.

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

Что остаётся от геометрии

Линейный классификатор задаёт направление ww, смещение bb и счёт s(x)s(x). Сигмоида или softmax превращает счёт в вероятности, а порог — вероятность в действие. Карта признаков определяет форму границы в исходном мире, норма весов задаёт крутизну уверенности, цена ошибок задаёт порог. Четыре ручки, и каждая крутится отдельно.

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

Порог как параллельный перенос: полный расчёт

Соберём всё на одном письме. Его признаки: доля цифр 0,300{,}30, длина 140 символов, то есть x=(0,30;0,140)x=(0{,}30;\,0{,}140). Счёт

s=19,500,30+7,200,1403,21=3,65,s=19{,}50\cdot0{,}30+7{,}20\cdot0{,}140-3{,}21=3{,}65,

расстояние до границы

d=3,6520,78=0,176,d=\frac{3{,}65}{20{,}78}=0{,}176,

вероятность

σ(3,65)=0,975.\sigma(3{,}65)=0{,}975.

При стандартном пороге письмо уверенно попадает в спам. Но пусть ложная тревога дорога, и мы ставим порог 0,80{,}8. На шкале счёта ему отвечает logit(0,8)=ln4=1,386\operatorname{logit}(0{,}8)=\ln4=1{,}386, новая действующая линия — wx+b=1,386w^\top x+b=1{,}386. Её нормаль не изменилась, прямая лишь сдвинулась параллельно. Расстояние письма до новой линии

3,651,38620,78=0,109,\frac{3{,}65-1{,}386}{20{,}78}=0{,}109,

всё ещё положительное: решение сохраняется, но запас упал почти вдвое. Переобучать веса ради нового порога не потребовалось ни на секунду.

И последнее предостережение, к которому мы уже подходили: перенос по формуле логита верен ровно настолько, насколько верны сами вероятности. Наши на отложенной выборке занижены — в группе с обещанием около 0,5 спама оказалось 91,2%. Поэтому сначала проверяют калибровку на свежей популяции и только затем считают порог по матрице цен.

Задачи