惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Securelist
C
Cybersecurity and Infrastructure Security Agency CISA
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security Affairs
Hacker News: Ask HN
Hacker News: Ask HN
L
Lohrmann on Cybersecurity
PCI Perspectives
PCI Perspectives
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cyber Attacks, Cyber Crime and Cyber Security
Recent Commits to openclaw:main
Recent Commits to openclaw:main
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
月光博客
月光博客
W
WeLiveSecurity
T
Threat Research - Cisco Blogs
Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recorded Future
Recorded Future
The GitHub Blog
The GitHub Blog
Webroot Blog
Webroot Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
TaoSecurity Blog
TaoSecurity Blog
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
F
Full Disclosure
U
Unit 42
Jina AI
Jina AI
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
L
LINUX DO - 最新话题
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
T
Troy Hunt's Blog
腾讯CDC
T
Threatpost
H
Hacker News: Front Page
P
Palo Alto Networks Blog
博客园 - 聂微东
Last Week in AI
Last Week in AI
有赞技术团队
有赞技术团队
Help Net Security
Help Net Security
L
LINUX DO - 热门话题
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Spread Privacy
Spread Privacy

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
predict_proba выдаёт 0.9 — но это не вероятность 90%
artem · 2026-05-27 · via Все публикации подряд на Хабре

Средний

7 мин

7.3K

Привет, Хабр!

Самая распространённая ошибка при работе с вероятностями в ML — читать число из predict_proba как вероятность. Модель вернула 0.9, и кажется очевидным: «событие произойдёт примерно в 90 случаях из 100». На этом строят решения — ранжируют лиды по этому числу, ставят порог отсечения, считают ожидаемую выручку как 0.9 * сумма_сделки, показывают пользователю «уверенность 90%».

А потом расчёты ожидаемой выручки систематически расходятся с фактом, сравнение «0.7 против 0.9» означает совсем не то, что предполагалось, а порог отсечения стоит не там, где надо. При этом AUC модели прекрасный, и кажется, что с моделью всё в порядке.

predict_proba возвращает не вероятность, а оценку, внутреннюю уверенность модели, втиснутую в диапазон от нуля до единицы. Синтаксически это похоже на вероятность: число в [0, 1], по классам сумма равна единице. Но означает ли «0.9», что среди подобных объектов положительных действительно около 90%, — это отдельное свойство, оно называется калибровкой, и по умолчанию большинство моделей им не обладает.

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

Вероятность и порядок — это два разных свойства

Вероятность откалибрована, если выполняется частотная интерпретация: среди всех объектов, которым модель присвоила оценку около 0.8, положительных действительно примерно 80%. Это определение и есть смысл слова «вероятность» применительно к выходу модели.

predict_proba всегда даёт число в [0, 1]. Откалибровано ли оно — вопрос отдельный, и ответ на него ничем не гарантирован.

Здесь полезно развести два независимых качества классификатора. Первое — ранжирующая способность: умеет ли модель ставить положительные объекты выше отрицательных. Её измеряет AUC. Второе — калибровка: совпадают ли сами числа с наблюдаемыми частотами.

Эти качества независимы друг от друга, и AUC не видит калибровку в принципе. AUC — это вероятность того, что случайный положительный объект получит оценку выше случайного отрицательного, то есть величина чисто порядковая. Возьмите все предсказанные вероятности и возведите их в квадрат — порядок объектов не изменится, AUC останется прежним, а калибровка будет разрушена. Модель с AUC 0.95 может быть откалибрована сколь угодно плохо. Хороший AUC не говорит ровным счётом ничего о том, означает ли «0.9» девяносто процентов.

Почему модель выдаёт не вероятность

Смещение predict_proba — не случайность и не баг конкретной библиотеки. Оно вытекает из того, как устроена модель. Разберём по семействам.

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

Логистическая регрессия обучается минимизацией log-loss — функции, которая достигает минимума ровно тогда, когда предсказанные числа совпадают с истинными вероятностями. Поэтому логистическая регрессия обычно откалибрована неплохо: давать честные вероятности буквально цель её обучения.

Случайный лес

Случайный лес устроен иначе и ведёт себя противоположно. Его predict_proba — это усреднённая по всем деревьям оценка класса. Чтобы лес выдал 1.0, к этому значению должно прийти каждое дерево. Но деревья обучены на бутстрэп-выборках со случайными подмножествами признаков, поэтому на почти любом объекте хотя бы одно дерево даст оценку, далёкую от единицы. Среднее оттягивается от 0 и от 1 к середине. Случайный лес недоуверен: когда он выдаёт 0.9, истинная доля положительных обычно выше, а гистограмма его вероятностей упирается в пики около 0.2 и 0.9, и почти ничего нет у краёв.

Наивный Байес

Наивный Байес смещён в другую сторону. Он предполагает, что признаки независимы. Когда признаки на самом деле скоррелированы, он учитывает одно и то же свидетельство несколько раз — «считает дважды», — и произведение схлопывается к 0 или 1. Наивный Байес переуверен: говорит 0.99 там, где в реальности 0.85.

Метод опорных векторов

Метод опорных векторов вероятностей не выдаёт в принципе. Опция probability=True достраивает поверх решающей функции отдельную сигмоиду — это аппроксимация, и для методов максимального зазора она обычно даёт недоуверенные оценки.

Вывод из этого один. Число из predict_proba — побочный продукт того, как модель оптимизировалась, а не измеренная частота. Откалиброванную вероятность выдают лишь некоторые модели и лишь при некоторых условиях. predict_proba отдаёт вам внутреннюю оценку модели, нормированную в [0, 1]; называть её вероятностью — это ваше допущение, а не обещание модели.

Как увидеть смещение: график надёжности

Калибровку не нужно угадывать — её видно. Инструмент называется графиком надёжности (reliability diagram), и строится он так: предсказания разбивают на корзины по значению, и для каждой корзины считают две величины — среднюю предсказанную вероятность и фактическую долю положительных объектов.

from sklearn.calibration import calibration_curve

prob_true, prob_pred = calibration_curve(y_test, y_proba, n_bins=10)

Если отложить prob_pred по горизонтали, а prob_true по вертикали, у идеально откалиброванной модели точки лягут на диагональ: предсказал 0.8 — получил 80% положительных. У случайного леса кривая пойдёт S-образно, провисая ниже диагонали на низких оценках и поднимаясь выше на высоких, — картина недоуверенности. У наивного Байеса перекос будет обратным.

Есть и числовая мера, не требующая графика, — Brier score, средний квадрат отклонения предсказанной вероятности от фактического исхода 0 или 1:

from sklearn.metrics import brier_score_loss

score = brier_score_loss(y_test, y_proba)

В отличие от AUC, Brier score штрафует именно за нечестные числа. Разумная практика — смотреть обе метрики: AUC отвечает за порядок, Brier score (или log-loss) — за то, можно ли верить самим вероятностям.

Как починить: калибровка как постобработка

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

from sklearn.calibration import CalibratedClassifierCV
from sklearn.ensemble import RandomForestClassifier

calibrated = CalibratedClassifierCV(
    RandomForestClassifier(), method='isotonic', cv=5
)
calibrated.fit(X_train, y_train)
proba = calibrated.predict_proba(X_test)[:, 1]

Метода два. method='sigmoid' — это шкалирование Платта: поверх оценок подгоняется сигмоида. Параметров у неё мало, она устойчива на небольших выборках, но предполагает, что искажение имеет именно сигмоидную форму. method='isotonic' — изотоническая регрессия: непараметрическое монотонное преобразование, оно гибче и способно исправить искажения, с которыми сигмоида не справляется, но требует больше данных и на маленькой выборке склонно переобучаться.

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

И ещё, калибровка — монотонное преобразование: она меняет сами числа, но не их порядок. Поэтому AUC после калибровки не меняется.

Когда калибровка нужна, а когда нет

Калибровать имеет смысл не всегда.

Калибровка нужна, когда вы используете вероятность как число: считаете ожидаемую выручку как произведение вероятности на сумму сделки, выбираете порог отсечения из цены ошибки, складываете или сравниваете выходы нескольких моделей, показываете пользователю «уверенность 87%». Во всех этих случаях важна не только величина оценки, но и её честность.

Калибровка не нужна, когда вы используете только порядок. Если задача — выбрать top-N лидов на обзвон или отранжировать выдачу, то берётся лишь взаимное расположение объектов, а его predict_proba передаёт верно даже без калибровки. Гнать такие предсказания через CalibratedClassifierCV смысла нет.

Вы делаете с вероятностью арифметику или только сравниваете и сортируете? Если арифметику — число обязано быть честным, и без калибровки не обойтись.

Как смотреть на чужой ML-код

predict_proba внутри арифметического выражения — proba * выручка, ожидаемая стоимость, любое умножение на вероятность. Здесь нужны откалиброванные числа.

«Уверенность X%», показанная пользователю прямо из predict_proba — без калибровки этот процент почти наверняка неточен.

Модель выбрана и сравнивалась только по AUC, а её вероятности дальше используются как вероятности — AUC этого качества не проверял.

Случайный лес, бустинг или наивный Байес, чей predict_proba потребляется как вероятность без обёртки CalibratedClassifierCV и без проверки графиком надёжности — почти наверняка числа смещены.

Во всём проекте ни одного графика надёжности и ни одного Brier score, только AUC и accuracy — калибровку просто никто не смотрел.

Что в итоге

predict_proba возвращает внутреннюю оценку уверенности модели, втиснутую в диапазон [0, 1]. Выглядит как вероятность, но модель не обещала, что это частота. Совпадает ли «0.9» с девяноста процентами — это калибровка, отдельное свойство, которым большинство моделей по умолчанию не обладает.

Поэтому пока вы только ранжируете объекты по оценке, всё в порядке — порядок predict_proba передаёт верно. Но как только вы начинаете делать с этим числом арифметику или показывать его как процент, сначала откалибруйте модель через CalibratedClassifierCV, а потом проверьте результат — графиком надёжности и Brier score, а не AUC.

Если хотите не просто получать от модели красивое число в predict_proba, а понимать, что с ним можно делать дальше, присмотритесь к открытым урокам:

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

А ещё подписывайтесь на канал OTUS в MAX — там публикуем анонсы открытых уроков, полезные материалы и разборы для IT‑специалистов без лишнего шума.