Непропорциональная выборка клиентов: как sample_weight меняет метрику
Команда собрала проверочный набор для редкого отказа от услуги: половина клиентов отказалась, половина осталась. Так удобно разбирать ошибки модели, но в реальном потоке отказываются лишь 10%. Модель, которая всегда предсказывает отказ, получает на искусственном тесте 50% accuracy. В работе верно будет только примерно 10% её ответов. Это не изменение самой модели — это изменение того, какую популяцию представляет оценка.
Верните наблюдениям их долю в потоке
Если выборка набиралась по известной схеме и внутри каждого класса объекты представляют будущую популяцию, можно назначить им веса. В примере положительные строки получают вес 1, отрицательные — 9. Это моделирует целевой поток с долей положительных 10%. accuracy_score принимает sample_weight и считает взвешенную долю правильных ответов.
import numpy as np
from sklearn.metrics import accuracy_score
truth = np.array([1, 1, 0, 0])
predicted = np.ones(4, dtype=int)
weights = np.array([1, 1, 9, 9], dtype=float)
print("точность на выборке:", accuracy_score(truth, predicted))
print("оценка для целевой смеси:", accuracy_score(truth, predicted, sample_weight=weights))
print("взвешенная доля события:", np.average(truth, weights=weights))
assert accuracy_score(truth, predicted, sample_weight=weights) == 0.1На собранной таблице точность равна 0,5. После весов — 0,1, как и взвешенная доля отказов. Проверка в коде фиксирует расчёт. Это не доказательство качества рабочей модели: мы специально взяли глупый постоянный прогноз, чтобы показать, как меняется знаменатель оценки при изменении состава населения.
Что веса не исправляют
Веса помогают только при известной схеме отбора. Если «сложные» отрицательные заявки чаще попадали в ручную разметку, чем обычные отрицательные, вес на уровне класса не восстановит их реальную смесь. Нужны вероятности включения или репрезентативный отложенный срез. Не подбирайте веса после просмотра ответа модели, чтобы получить приятный балл; задайте их из процесса сбора данных.
При сравнении моделей применяйте одни и те же веса к одному и тому же тестовому периоду. Сохраняйте рядом невзвешенную метрику и численность классов, чтобы видеть, что именно меняется. Для очереди ручной проверки accuracy всё равно может быть слабым выбором: посмотрите precision, recall и число найденных отказов на доступном объёме работы. Разбор порога и цены ошибок помогает связать метрику с действием.
Разделяйте веса для оценки и веса для обучения. Первые определяют, какую популяцию описывает отчёт; вторые меняют функцию потерь и сами предсказания модели. Их нельзя молча считать одной и той же настройкой. Если изменяется частота события после запуска, старые веса оценки тоже устаревают. Тогда нужна новая оценка состава потока и проверка модели на свежем периоде.
Если схема отбора известна точнее, считайте вес как обратную вероятность попадания строки в проверочный набор с общей нормировкой. В учебном примере отношение весов 1:9 выбрано так, чтобы два положительных и два отрицательных объекта представляли поток 10:90. Для реального отчёта документируйте источник этих долей и период, к которому они относятся; иначе коллега не сможет повторить оценку при смене потока.
В курсе «Data Scientist: от данных до деплоя моделей» вы начинаете с постановки задачи и качества данных, выбираете метрики, проверяете модель на holdout и разбираете ошибки по сегментам. Это помогает не принять показатель на искусственно собранной выборке за результат будущего сервиса. Откройте программу курса.
Продолжить на практике
- Data Scientist: от данных до деплоя моделей ↗
Практический курс по Data Science: от постановки ML-задачи и работы с данными до inference API, CI/CD и мониторинга моделей в продакшне. Вы пройдёте EDA, feature engineering, обучение и оценку моделей, experiment tracking, error analysis и deployment — чтобы собирать полноценный рабочий контур вокруг ML-решения.
