Какие подводные камни могут быть при нормализации данных для решения проблемы экстраполяции в случайном лесу
Что проверяют
Понимаете ли вы, почему случайный лес не экстраполирует, и видите ли, что масштабирование признаков эту проблему не решает. Следом обычно спрашивают, что делать с трендом в целевой переменной или с признаками, которые на проде выходят за диапазон обучения.
Как отвечать
Начните с механики. Дерево делит пространство признаков порогами, а в листе хранит среднее целевой переменной по попавшим туда объектам. Лес усредняет деревья, поэтому прогноз всегда лежит между минимумом и максимумом y из обучения. Если цена за три года выросла вдвое, на четвёртый год лес предскажет потолок прошлых данных.
Подводные камни нормализации:
- признаки масштабировать бесполезно: деревья инвариантны к монотонным преобразованиям признака.
StandardScalerилиMinMaxScalerсдвигают пороги, но разбиения и прогноз остаются прежними; - выход за диапазон:
MinMaxScaler, обученный на трейне, выдаст на новых данных значения больше 1, а дерево всё равно отправит их в крайний лист; - масштаб таргета не спасает: после обратного преобразования прогноз упирается в те же границы.
logпомогает при скошенном распределении, но экстраполировать не научит; - утечка: скейлер, обученный вместе с тестом, даёт завышенную оценку, особенно на временных рядах.
Что реально помогает:
- убрать тренд из таргета: предсказывать разность с прошлым значением, отношение к базовому признаку или остаток линейной модели;
- гибрид: линейная регрессия ловит тренд, лес учится на её остатках;
- относительные признаки: доли, приросты, лаги вместо абсолютных величин, чтобы новые данные попадали в знакомый диапазон;
- другие модели: линейные деревья в LightGBM (
linear_tree), GAM, нейросети, если экстраполяция нужна по задаче.
Где спотыкаются
Отвечают «нормализую признаки, и лес начнёт экстраполировать». Именно эту ошибку и ловит вопрос.
Проверяют модель на случайном разбиении, где тест внутри диапазона трейна, и не видят проблему до прода. Для данных со временем нужна валидация по времени, например TimeSeriesSplit.
Не следят за дрейфом: на проде стоит сравнивать входы с обучающим распределением и помечать объекты вне диапазона.