Кривая обучения: когда добавлять данные, а когда менять признаки
У модели стабильная ошибка на проверке. Команда предлагает собрать ещё тысячу размеченных строк, но это дорого. Перед покупкой данных стоит выяснить, как менялось качество, когда модель уже получала больше примеров. Если проверочная ошибка продолжает уменьшаться, новые данные могут помочь. Если обе кривые давно сошлись на плохом уровне, сначала ищите причину в признаках, постановке или выразительности модели.
Дайте модели несколько размеров обучения
learning_curve обучает один и тот же алгоритм на разных подмножествах train и оценивает его на проверочных частях. Для ошибки MAE scikit-learn использует scorer neg_mean_absolute_error: больший score лучше, поэтому для привычной положительной ошибки меняем знак. Ниже используется открытый набор диабета и один пайплайн масштабирования с Ridge. Масштабирование находится внутри пайплайна, значит каждый фолд вычисляет его параметры только из своих обучающих строк.
from sklearn.datasets import load_diabetes
from sklearn.linear_model import Ridge
from sklearn.model_selection import learning_curve
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
X, y = load_diabetes(return_X_y=True)
sizes, train, valid = learning_curve(
make_pipeline(StandardScaler(), Ridge(alpha=1.0)), X, y,
train_sizes=[0.25, 0.5, 1.0], cv=5,
scoring="neg_mean_absolute_error", shuffle=True, random_state=0)
for size, a, b in zip(sizes, train, valid):
print(int(size), "train MAE", round(-a.mean(), 1),
"validation MAE", round(-b.mean(), 1))
assert len(sizes) == 3 and sizes[0] < sizes[-1]В этом прогоне при росте обучающего поднабора с 88 до 353 строк проверочная MAE меняется примерно с 46,2 до 44,3, а обучающая — с 40,9 до 43,2. Разрыв сокращается, но последнее прибавление данных почти не улучшает проверку. Для этой комбинации признаков и Ridge следующий разумный опыт — другой признак или модель, поскольку проверочная ошибка почти перестала снижаться.
Код печатает размер обучающего поднабора, ошибку на нём и ошибку на проверке. Сравнивайте не только последний результат, но и направление изменения: сокращается ли разрыв при увеличении числа строк, растёт ли качество на проверке. Конкретные числа зависят от выбранных фолдов и алгоритма; вывод следует из формы кривой, а не из одного измерения. Небольшой учебный набор не говорит, сколько строк понадобится вашему магазину или заводу.
Как не перепутать причины
Высокая ошибка обучения вместе с высокой ошибкой проверки часто говорит, что модель не извлекает нужный сигнал в текущих признаках или слишком ограничена. Добавление похожих строк не обязательно исправит это. Большой разрыв между train и validation при росте проверочного качества оставляет шанс, что дополнительные данные помогут. Но сначала проверьте утечку, различия периодов и качество разметки: они способны нарисовать обманчивую кривую.
Для временного прогноза нельзя перемешивать будущие даты в обучающие поднаборы. Передайте временную схему валидации, отключите shuffle=True из примера и учитывайте, что размер train тогда связан ещё и с периодом истории. Рост качества может объясняться появлением нового сезона, а не просто числом строк. На клиентских данных не делите записи одной сущности между частями; групповая утечка тоже меняет форму кривой.
Сначала получите baseline, затем сравните несколько разумных размеров, сохраняя одинаковую метрику и проверочную схему. Если кривая уже выровнялась, запланируйте проверку новых признаков и ошибок по сегментам. Если она ещё растёт, оцените стоимость получения следующих размеченных объектов и их сходство с будущими запросами. Курс «Data Scientist: от данных до деплоя моделей» охватывает выбор валидации, сравнение моделей и анализ ошибок. Посмотрите программу курса.
Продолжить на практике
- Data Scientist: от данных до деплоя моделей ↗
Практический курс по Data Science: от постановки ML-задачи и работы с данными до inference API, CI/CD и мониторинга моделей в продакшне. Вы пройдёте EDA, feature engineering, обучение и оценку моделей, experiment tracking, error analysis и deployment — чтобы собирать полноценный рабочий контур вокруг ML-решения.
