Как дерево возвращает вероятность принадлежности объекта к классу
Что проверяют
Понимаете ли вы, откуда берётся число в predict_proba и можно ли доверять ему как вероятности. Следом спрашивают, как это устроено в случайном лесе и бустинге и как проверить калибровку.
Как отвечать
- одно дерево: объект спускается по сплитам до листа, а вероятность класса равна доле обучающих объектов этого класса в листе. В листе 30 объектов класса A и 10 класса B, значит
predict_probaвернёт 0,75 и 0,25. Если при обучении былиsample_weightилиclass_weight, доли считаются по весам; - ступенчатость: все объекты одного листа получают одинаковую вероятность, различных значений скора мало, и ROC-кривая получается ступенькой из нескольких точек;
- глубина: дерево, выращенное до чистых листьев, отдаёт только 0 и 1. Сглаживают это ограничения
max_depth,min_samples_leaf,min_samples_split; - случайный лес: в scikit-learn
RandomForestClassifierусредняетpredict_probaвсех деревьев, а не считает голоса за класс. Вероятности плавнее, но у краёв тянутся к середине: чтобы получить 1,0, все деревья должны быть единодушны; - градиентный бустинг: деревья там регрессионные, листья хранят не доли, а добавки к логиту. Сумма по всем деревьям проходит через сигмоиду для двух классов или softmax для нескольких;
- калибровка: проверяется кривой надёжности
calibration_curveи Brier score, исправляетсяCalibratedClassifierCVс методомsigmoidилиisotonicна отложенных данных.
Для задач, где вероятность потом умножается на деньги (скоринг, прогноз оттока), калибровка важнее лишней сотой ROC AUC.
Где спотыкаются
Отвечают, что дерево возвращает класс большинства в листе. Это predict, а вопрос про predict_proba.
Считают выход дерева или леса откалиброванной вероятностью. Доли посчитаны на тех же данных, на которых дерево строилось, поэтому глубокое дерево систематически переуверено.
Забывают, что class_weight="balanced" сдвигает вероятности. Модель начинает завышать редкий класс, и доля в листе уже не отражает реальную частоту.