Как ответить
Out-of-Bag ошибка — это встроенный механизм оценки качества в Random Forest, который использует данные, не попавшие в bootstrap-выборку конкретного дерева. Каждое дерево обучается на случайной подвыборке с возвращением (bootstrap), и примерно 37% исходных объектов остаются неиспользованными — это и есть OOB-сэмплы для этого дерева. Ошибка считается как средняя ошибка предсказания по всем деревьям на тех объектах, которые не участвовали в их обучении.
Вот как это работает на практике:
- Для каждого объекта из обучающей выборки собираются предсказания только тех деревьев, для которых этот объект был OOB (не попал в bootstrap).
- Для задачи классификации — голосование большинства среди этих деревьев; для регрессии — среднее значение.
- OOB-ошибка — это доля неверных классификаций (или MSE для регрессии) по всем объектам, вычисленная на основе этих агрегированных предсказаний.
Ключевое преимущество — не нужна отдельная валидационная выборка. OOB-оценка практически эквивалентна кросс-валидации на том же объёме данных, но выполняется бесплатно во время обучения. В scikit-learn это включается параметром oob_score=True:
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, oob_score=True, random_state=42)
rf.fit(X_train, y_train)
print(f"OOB accuracy: {rf.oob_score_:.3f}")
# Вывод: OOB accuracy: 0.947Важный нюанс: OOB-ошибка может быть смещена, если деревья сильно коррелированы или если bootstrap-выборка слишком мала. На практике она хорошо коррелирует с ошибкой на тестовой выборке, если распределение данных стабильно. Ещё один момент — OOB-оценка не заменяет тестовую выборку для финальной валидации, так как она всё равно использует обучающие данные (хоть и косвенно).
Пример из моего опыта: на задаче бинарной классификации с дисбалансом классов (5% позитивных) OOB-ошибка показала accuracy 0.96, но recall был 0.3. Это намекнуло, что модель просто угадывает мажоритарный класс — пришлось добавить взвешивание классов. Без OOB пришлось бы делать отдельную валидацию, что замедлило бы итерации.