
Почему +0.3% к ROC‑AUC почти всегда шум, и как это проверить
badcasedaily1 15 минут назад Почему +0.3% к ROC‑AUC почти всегда шум, и как это проверить Средний 6 мин 428 Блог компании OTUS Машинное обучение * Python * Программирование * Туториал Вы поменяли набор признаков,...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Значимый прорыв формирует отрасль ИИ: badcasedaily1 15 минут назад Почему +0. 3% к ROC‑AUC почти всегда шум, и как это проверить Средний 6 мин 428 Блог компании OTUS Машинное обучение * Python * Программирование * Туториал Вы поменяли набор признаков, прогнали кросс‑валидацию, ROC‑AUC вырос с 0. Изменение уезжает в продакшен как улучшение, в чате ставят плюсы, через месяц на свежих данных «улучшенная» модель работает не лучше прежней, а иногда хуже.
Прирост на третьем знаке утонул в шуме самой процедуры валидации, и отличить его от настоящего сдвига по одному числу было нельзя с самого начала. Корень в том, что метрика на отложенной выборке — это не свойство модели, а случайная величина: она зависит от того, какие объекты попали в тест, с каким зерном перемешались данные, как нарезались фолды. У этой величины есть разброс, и если прирост меньше разброса, никакого прироста нет.
Технические детали
Разберём, откуда берётся шум, как его измерить и как сравнивать модели так, чтобы вывод был воспроизводимым. Один прогон ничего не говорит о разницеОдиночный train/test split или одна пятифолдовая кросс‑валидация дают одно число, и по нему невозможно понять, насколько оно устойчиво. Достаточно прогнать ту же модель на той же выборке с разными зёрнами разбиения, чтобы увидеть собственный разброс оценки:from sklearn.
model_selection import RepeatedStratifiedKFold, cross_val_score cv = RepeatedStratifiedKFold(n_splits=5, n_repeats=10, random_state=0) scores = cross_val_score(model, X, y, cv=cv, scoring="roc_auc scores. 009Если стандартное отклонение оценки 0. 003 между двумя моделями лежит внутри собственного шума процедуры.
Повторённая кросс‑валидация с несколькими разбиениями на разных зёрнах — минимальный способ увидеть этот разброс, а одиночный фолд его просто прячет, выдавая одно число с видимостью точности. Сравнивать модели нужно на одних и тех же фолдахСравнивать средние двух независимых прогонов — ошибка: тогда в разницу попадает и разброс из‑за того, что фолды бывают разной сложности. Правильная величина — разность метрик двух моделей на одних и тех же фолдах.
Сложность конкретного разбиения сокращается, и остаётся именно эффект модели:cv = RepeatedStratifiedKFold(n_splits=5, n_repeats=10, random_state=0) scores_a = cross_val_score(model_a, X, y, cv=cv, scoring="roc_auc scores_b = cross_val_score(model_b, X, y, cv=cv, scoring="roc_auc diff = scores_b - scores_a # на тех же фолдах, поэлементно diff. std()Одно и то же зерно cv гарантирует, что scores_a и scores_b посчитаны на идентичном разбиении, и поэлементное вычитание имеет смысл. Если средняя разность сопоставима со своим стандартным отклонением или меньше него — различия нет.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





