17 / 27 · Деревья и ансамбли
Бэггинг и случайный лес
Усреднение многих деревьев, выращенных на бутстрэп-выборках: почему смещение остаётся, а разброс падает, дисперсия среднего коррелированных моделей, выведенная по закону полной дисперсии, случайный лес и случайные подмножества признаков, ошибка out-of-bag и 63.2% точек в каждой бутстрэп-выборке, важность по неоднородности и перестановочная важность и их ловушки, а также экстремально рандомизированные деревья.
Разложение на смещение и разброс · Решающие деревья · Математическое ожидание
На этой странице 12
Заметка о смещении и разбросе нашла слабое место глубокого дерева: его смещение мало, а разброс велик: порядка шума, когда обучающие точки расположены плотно, и во много раз больше, когда редко. Она же нашла и принципиальное лекарство. Среднее моделей, обученных одной и той же процедурой, имеет то же математическое ожидание, что и каждая из них, поэтому сохраняет малое смещение, а его разброс может быть гораздо меньше. Трудность практическая: усреднение по независимым обучающим выборкам требует многих обучающих выборок, а у нас одна. В этой заметке бутстрэп изготавливает обучающие выборки из той, что у нас есть (бэггинг, bagging), выводится, какую часть дисперсии сохраняет среднее, когда его члены коррелированы, и показывается, как случайный лес (random forest) снижает эту корреляцию.
Обозначения. — обучающая выборка из точек. — дерево, выращенное на со случайностью : бутстрэп-выборкой и, для леса, признаками, выбранными в каждом разбиении. Деревья ансамбля используют независимые при данном реализации , и ансамбль предсказывает в регрессии или усредняет вероятности классов, выданные деревьями, в классификации. В фиксированной точке — дисперсия предсказания одного дерева (не — это дисперсия шума в заметке о смещении и разбросе), а — корреляция предсказаний двух деревьев, обе по случайности и .
Бутстрэп-агрегирование#
Бэггинг (bootstrap aggregation, Breiman, 1996):
- Сгенерировать бутстрэп-выборок: точек из с возвращением, раз.
- Вырастить на каждой дерево, обычно до полной глубины, без обрезки.
- Усреднить предсказания: среднее в регрессии, среднее вероятностей классов (или голосование большинством) в классификации.
Бутстрэп-выборка заменяет свежую обучающую выборку из того же распределения, поэтому предсказатель с бэггингом приближает среднюю модель из предыдущей заметки, используя повторные выборки вместо новых данных. Поскольку деревья одинаково распределены, математическое ожидание их среднего равно математическому ожиданию одного бутстрэп-дерева: бэггинг не меняет смещения, если не считать небольшого роста из-за того, что каждое дерево видит только около 63% различных точек (Hastie, Tibshirani and Friedman, 2009, разделы 15.2 и 15.4.2). Весь выигрыш — в разбросе, поэтому бэггинг помогает именно неустойчивым (unstable) методам, чей результат сильно меняется при небольших изменениях данных: деревьям, отбору подмножества признаков, нейросетям. Для устойчивых методов, таких как ближайшие соседи, выигрыш мал, а иногда бэггинг слегка вредит (Breiman, 1996, раздел 1). Для метода наименьших квадратов или выборочного среднего он почти ничего не меняет: среднее бутстрэп-средних — это выборочное среднее.
Какую часть дисперсии сохраняет среднее?#
Если бы деревьев были независимы, дисперсия их среднего была бы равна . Но они зависимы: все выращены по одной и той же . При попарной корреляции дисперсия среднего равна
Прямой вывод суммирует дисперсий и ковариаций , как в заметке о совместных распределениях. Для деревьев второй вывод говорит больше: он показывает, откуда берётся корреляция. Возьмём условие по обучающей выборке и применим закон полной дисперсии:
При данном деревья — независимые реализации , поэтому и . Тот же закон для одного дерева раскладывает его дисперсию на те же две части:
В ковариации двух деревьев нет части от повторной выборки, потому что при данном они независимы: . Значит, — часть дисперсии дерева, которая идёт от обучающей выборки, — часть, которая идёт от повторной выборки (resampling), а подстановка обеих частей даёт формулу (Hastie, Tibshirani and Friedman, 2009, раздел 15.4.1, формулы 15.5 и 15.9).
Разобранный пример с игрушечными числами: при и у одного дерева дисперсия , у десяти деревьев , у ста деревьев ; нижняя граница равна . После нескольких десятков деревьев новые деревья почти ничего не дают, и помочь может только меньшее .
Случайный лес: декорреляция деревьев#
Деревья в бэггинге похожи, потому что выращиваются жадно по похожим выборкам: если один признак сильно предсказывает целевую переменную, почти каждое бутстрэп-дерево разбивает по нему корень, и у деревьев общая верхняя структура. Случайный лес (Breiman, 2001) меняет одну строку алгоритма выращивания дерева: в каждом разбиении случайно выбрать из признаков и искать лучшее разбиение только среди этих . Разные деревья и разные узлы одного дерева вынуждены использовать разные признаки, поэтому деревья меньше коррелированы. Отдельные деревья становятся хуже — с бо́льшим смещением и бо́льшей дисперсией, — так что обменивает на и смещение. Рекомендуемые значения по умолчанию — с листьями размера 1 для классификации и с листьями размера 5 для регрессии, но — настраиваемый параметр (Hastie, Tibshirani and Friedman, 2009, раздел 15.3). Бэггинг — частный случай . Значения по умолчанию в библиотеках другие: RandomForestClassifier из scikit-learn выбирает признаков, а RandomForestRegressor — все , так что его регрессионный лес по умолчанию — это бэггинг.
На функции Фридмана в 10 измерениях (постановка из предыдущей заметки) оценка двух частей дисперсии по 40 обучающим выборкам с 25 деревьями на каждой даёт для одного дерева:
| нижняя граница | смещение² | дисперсия при | |||
|---|---|---|---|---|---|
| бэггинг, | 11.11 | 0.105 | 1.17 | 3.83 | 1.57 |
| лес, | 15.52 | 0.043 | 0.66 | 5.26 | 1.25 |
Деревья леса по отдельности хуже ( растёт с до ), но их корреляция падает с до , и нижняя граница дисперсии ансамбля падает с до . Здесь половина признаков не влияет на целевую переменную, ограниченный поиск часто пропускает влияющие, и большее смещение съедает выигрыш: при неограниченном числе деревьев ожидаемая ошибка бэггинга на тесте около , а леса — около . Когда сигнал распределён по многим признакам, обмен идёт в другую сторону:
Ошибка ансамбля и число деревьев
Каждый из 30 признаков несёт немного информации, как пиксели изображения. Одно дерево леса, ограниченное 5 признаками на разбиение, заметно хуже одного дерева бэггинга, но деревья леса декоррелируются, и лес заканчивает ниже. Обе кривые выходят на полку. Добавление деревьев не переобучает ансамбль так, как это делает лишняя глубина: с ростом сходится к своему пределу (Breiman, 2001, теорема 1.2 и раздел 11), и новые деревья лишь убирают случайные колебания вокруг этого предела. Для квадратичной ошибки ошибка на тесте, усреднённая по случайности деревьев, убывает с ростом , как показывает формула для разброса выше; кривая одного конкретного леса всё же может колебаться или ненадолго немного расти, а доля ошибок голосования большинством не обязана падать при каждом . Сам этот предел всё же может переобучиться, поэтому иногда настраивают и глубину или размер листа (Hastie, Tibshirani and Friedman, 2009, раздел 15.3.4).
У леса есть второе прочтение. В регрессии дерево предсказывает в среднее значение целевой переменной обучающих точек из листа, в который попала , поэтому лес предсказывает взвешенное среднее , где — среднее по деревьям величины . Это правило ближайших соседей, окрестности которого выучены по целевой переменной: точки близки, если часто попадают в один лист, а признаки, которые не важны, не учитываются в расстоянии (Hastie, Tibshirani and Friedman, 2009, раздел 15.4.3).
Ошибка out-of-bag#
Бутстрэп-выборка пропускает некоторые точки. Данная точка не выбирается за одно извлечение с вероятностью , а ни за одно из извлечений — с вероятностью
поэтому каждая бутстрэп-выборка содержит в среднем долю различных обучающих точек: при , при , в пределе. Моделирование при даёт . Тот же расчёт объясняет, почему бутстрэп не работает для максимума, в курсе теории вероятностей.
Итак, каждая точка не попадает примерно в 36.8% деревьев, и эти деревья честно её проверяют. Предсказание out-of-bag (OOB) для усредняет только те деревья, в бутстрэп-выборку которых не вошла , а ошибка OOB — ошибка этих предсказаний по обучающей выборке (Breiman, 2001, раздел 3.1). Она оценивает ошибку на тесте без отложенной выборки и почти бесплатно, во многом как кросс-валидация (Hastie, Tibshirani and Friedman, 2009, раздел 15.3.1). При малом числе деревьев она немного пессимистична, потому что каждое OOB-предсказание усредняет лишь около из них. На рисунке ошибка OOB леса после 150 деревьев равна против ошибки на тесте ; на данных о раке груди лес из 300 деревьев имеет долю правильных ответов (accuracy) OOB и на тесте . В отличие от одного разбиения на обучение и валидацию, ничего не откладывалось: каждая точка использовалась и для обучения, и для оценки качества. Ошибка OOB честна только для самого леса. Выбор , размера листа или признаков сравнением ошибок OOB повторно использует те же точки для выбора, поэтому ошибка OOB выбранной настройки оптимистична, а шаг перед лесом, который использовал целевые значения всех точек, например отбор признаков по их корреляции с , уже видел метку каждой точки. Когда результаты OOB определяют такие решения, оставьте независимую тестовую выборку для итоговой оценки.
Важность признаков и её ловушки#
Лес нельзя прочитать так, как одно дерево, но он может ранжировать признаки. Распространены две меры.
- Важность по неоднородности (impurity importance, mean decrease in impurity, MDI): сложить приросты всех разбиений по признаку во всех деревьях, взвешенные числом точек, которые видят эти разбиения, и нормировать (Hastie, Tibshirani and Friedman, 2009, раздел 15.3.2). Она бесплатна, поскольку приросты вычисляются во время обучения.
- Перестановочная важность (permutation importance): перемешать значения признака в отложенных или OOB-данных, что разрывает его связь с целевой переменной и сохраняет его распределение, и измерить, насколько растёт ошибка (Breiman, 2001, раздел 10). Она работает для любой модели.
У обеих есть ловушки.
- Важность по неоднородности вычисляется на обучающих данных и благоволит признакам с большим числом различных значений. Полностью выращенные деревья разбивают по всему, что снижает неоднородность на обучении, включая шум, а у непрерывного признака гораздо больше порогов для подгонки под шум, чем у бинарного (Strobl et al., 2007). В моделировании, где метка зависит только от , чисто шумовой бинарный признак и чисто шумовой непрерывный признак получают важности по неоднородности и (против у ): лес приписывает непрерывному шуму треть важности. Перестановочная важность на отложенных данных даёт для и и для двух шумовых признаков — с точностью до шума правильный ноль.
- Коррелированные признаки искажают ранжирование. Если добавить к данным о раке груди точную копию самого важного признака (worst perimeter, важность по неоднородности ), близнецы получат и , вместе : пара учтена с избытком, и копия теперь на первом месте. Когда в каждом разбиении выбирается признаков, две копии делают одну и ту же информацию доступной в большем числе разбиений, и пара забирает важность у остальных признаков. Когда каждое разбиение видит все признаки, как в бэггинге, близнецы лишь делят её: и против у одного признака. В обоих случаях оценки коррелированных признаков, прочитанные по одной, не говорят, насколько важна группа.
- Перестановка признака, коррелированного с другими, создаёт невозможные входы, например большой радиус при малом периметре, и измеряет поведение модели там, где данных нет; такие перестановочные важности могут сильно завышать коррелированные признаки (Hooker, Mentch and Zhou, 2021).
- Важность — не причинность. Обе меры описывают, что использует обученная модель, а не что произошло бы, если бы признак изменился.
Экстремально рандомизированные деревья#
Случайный лес рандомизирует признаки; экстремально рандомизированные деревья (extremely randomized trees, extra trees; Geurts, Ernst and Wehenkel, 2006) рандомизируют ещё и пороги. В каждом узле они выбирают признаков, для каждого выбирают одну точку разреза равномерно между его минимумом и максимумом в узле и оставляют лучшее из этих случайных разбиений. Каждое дерево выращивается на всей обучающей выборке, а не на бутстрэп-выборке, чтобы смещение оставалось малым, а разнообразие обеспечивают случайные точки разреза. Такие деревья дешевле выращивать, поскольку нет ни сортировки, ни перебора порогов, и они сильнее декоррелированы. На разбиении данных о раке груди 300 экстремально рандомизированных деревьев достигают доли правильных ответов на тесте против у леса: часто похоже, иногда лучше — в зависимости от данных.
Что изменилось#
| Одно глубокое дерево | Бэггинг | Случайный лес | |
|---|---|---|---|
| Обучающие данные дерева | все | бутстрэп-выборка | бутстрэп-выборка |
| Признаки в разбиении | все | все | случайные |
| Смещение | малое | ≈ как у одного дерева | несколько выше |
| Дисперсия | та же формула, меньшее | ||
| Валидация | отложенные данные | out-of-bag | out-of-bag |
| Интерпретируемость | читаемое | важности | важности |
Ограничения#
- Смещение остаётся. Усреднение не может исправить систематическую ошибку, общую для всех деревьев. Лес из пней имеет смещение одного случайного пня в среднем; это среднее может быть аддитивной функцией признаков, но взаимодействий в нём нет.
- Нижняя граница остаётся. Коррелированные деревья оставляют , сколько бы их ни усреднять; снижает ценой худших деревьев.
- Размер и скорость. Сотни глубоких деревьев занимают память и время предсказания, и модель нельзя прочитать.
- Нет экстраполяции. Лес усредняет средние по листьям, поэтому его предсказания остаются в диапазоне значений целевой переменной на обучении.
- Важности вводят в заблуждение при шумовых признаках с большим числом значений, коррелированных признаках и причинных вопросах.
Что нужно запомнить#
- Бэггинг выращивает деревья на бутстрэп-выборках и усредняет их; он сохраняет смещение и снижает разброс, поэтому помогает неустойчивым методам с малым смещением.
- ; по закону полной дисперсии — часть дисперсии, вызванная обучающей выборкой, которую усреднение убрать не может.
- Случайный лес выбирает признаков на разбиение (рекомендуется для классификации и для регрессии; регрессор scikit-learn по умолчанию берёт все ), чтобы снизить ; деревья хуже, среднее лучше, когда сигнал распределён по многим признакам.
- Больше деревьев не ведёт к переобучению: лес сходится к предельному лесу, и ошибка выходит на полку у нижней границы, с небольшими колебаниями по пути.
- Каждая бутстрэп-выборка содержит долю точек; предсказания out-of-bag используют остальные 36.8% и бесплатно оценивают ошибку на тесте.
- Важность по неоднородности благоволит признакам с большим числом значений и шумовым признакам; перестановочная важность на отложенных данных надёжнее, но вводит в заблуждение при коррелированных признаках.
Код#
Доля точек в бутстрэп-выборке, формула дисперсии, и деревьев бэггинга и леса моделированием, доля правильных ответов out-of-bag, экстремально рандомизированные деревья и ловушки важности:
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier, ExtraTreesClassifier
from sklearn.inspection import permutation_importance
from sklearn.model_selection import train_test_split
rng = np.random.default_rng(0)
# доля обучающих точек в одной бутстрэп-выборке: 1 - (1 - 1/n)^n, и моделирование при n = 100
print([round(1 - (1 - 1 / n) ** n, 3) for n in (10, 100, 1000)], round(1 - np.exp(-1), 3)) # [0.651, 0.634, 0.632] 0.632
print(round(float(np.mean([len(np.unique(rng.integers(0, 100, 100))) / 100 for _ in range(20_000)])), 3)) # 0.634
# дисперсия среднего B моделей с дисперсией 1 и попарной корреляцией 0.3
print([round(0.3 + 0.7 / B, 3) for B in (1, 10, 100)]) # [1.0, 0.37, 0.307]
# tau^2 и rho отдельных деревьев на функции Фридмана, по 40 обучающим выборкам с 25 деревьями на каждой
f = lambda X: 10 * np.sin(np.pi * X[:, 0] * X[:, 1]) + 20 * (X[:, 2] - 0.5) ** 2 + 10 * X[:, 3] + 5 * X[:, 4]
Xtest = rng.random((300, 10))
for name, m in (('bagging', 1.0), ('forest', 1 / 3)):
P = []
for r in range(40):
X = rng.random((200, 10)); y = f(X) + rng.normal(size=200)
P.append([t.predict(Xtest) for t in RandomForestRegressor(25, max_features=m, random_state=r).fit(X, y).estimators_])
P = np.array(P) # обучающие выборки x деревья x тестовые точки
within = P.var(1, ddof=1).mean() # E_D Var(T | D) = (1 - rho) tau^2
between = P.mean(1).var(0, ddof=1).mean() - within / 25 # Var_D E(T | D) = rho tau^2
bias2 = ((P.mean((0, 1)) - f(Xtest)) ** 2).mean()
print(name, round(between + within, 2), round(between / (between + within), 3), round(bias2, 2), round(between + within / 25, 2), round(between, 2))
# bagging 11.11 0.105 3.83 1.57 1.17 | forest 15.52 0.043 5.26 1.25 0.66 (tau^2, rho, смещение^2, дисперсия при B = 25, нижняя граница)
# доля правильных ответов out-of-bag против тестовой выборки; экстремально рандомизированные деревья для сравнения
X, y = load_breast_cancer(return_X_y=True)
names = load_breast_cancer().feature_names
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.3, random_state=0, stratify=y)
rf = RandomForestClassifier(300, oob_score=True, random_state=0).fit(Xtr, ytr)
et = ExtraTreesClassifier(300, random_state=0).fit(Xtr, ytr)
print(round(rf.oob_score_, 3), round(rf.score(Xte, yte), 3), round(et.score(Xte, yte), 3)) # 0.967 0.953 0.942
# точная копия самого важного признака: при m признаках на разбиение близнецы вместе получают больше, чем исходный признак
top = int(np.argmax(rf.feature_importances_))
rf2 = RandomForestClassifier(300, random_state=0).fit(np.column_stack([Xtr, Xtr[:, top]]), ytr)
print(names[top], round(rf.feature_importances_[top], 3), round(rf2.feature_importances_[top], 3), round(rf2.feature_importances_[-1], 3))
# worst perimeter 0.134 0.108 0.124
# если каждое разбиение видит все признаки (бэггинг), близнецы, наоборот, делят важность исходного признака
bag = RandomForestClassifier(300, max_features=None, random_state=0).fit(Xtr, ytr)
bag2 = RandomForestClassifier(300, max_features=None, random_state=0).fit(np.column_stack([Xtr, Xtr[:, top]]), ytr)
print(round(bag.feature_importances_[top], 3), round(bag2.feature_importances_[top], 3), round(bag2.feature_importances_[-1], 3)) # 0.415 0.212 0.204
# важность по неоднородности против перестановочной: метка зависит только от x1; x2 — бинарный шум, x3 — непрерывный шум
Z = rng.random((1000, 3)); Z[:, 1] = Z[:, 1] < 0.5
yz = (Z[:, 0] + 0.3 * rng.normal(size=1000) > 0.5).astype(int)
rf3 = RandomForestClassifier(300, random_state=0).fit(Z[:500], yz[:500])
perm = permutation_importance(rf3, Z[500:], yz[500:], n_repeats=10, random_state=0).importances_mean
print(rf3.feature_importances_.round(3), perm.round(3)) # [0.661 0.008 0.331] [ 0.227 -0.016 -0.008]
Дальше#
Усреднение атакует разброс и не трогает смещение. Лес из неглубоких деревьев в среднем имеет смещение одного неглубокого дерева, построенного той же рандомизированной процедурой. Среднее многих пней по разным признакам и порогам может следовать аддитивной функции, но ни один пень не видит взаимодействия, поэтому если у целевой переменной есть структура, которую не улавливает ни одно дерево леса, никакое число деревьев её не уловит. Следующая заметка строит ансамбль наоборот: последовательно, подгоняя каждое небольшое дерево под ошибки, которые всё ещё делает сумма предыдущих деревьев, так что смещение падает шаг за шагом. Это градиентный спуск в пространстве функций и самый сильный универсальный метод для табличных данных.
Литература#
- L. Breiman. Bagging Predictors. Machine Learning, 24(2), 1996. Раздел 1 (неустойчивые процедуры), раздел 4 (почему бэггинг работает).
- L. Breiman. Random Forests. Machine Learning, 45(1), 2001. Теорема 1.2 (сходимость при добавлении деревьев), раздел 3.1 (оценки out-of-bag), раздел 10 (перестановочная важность), раздел 11 (регрессионные леса).
- T. Hastie, R. Tibshirani, J. Friedman. The Elements of Statistical Learning, 2nd ed. Springer, 2009. Раздел 8.7 (бэггинг), глава 15 (случайный лес: формула 15.1, значения по умолчанию в 15.3, выборки out-of-bag 15.3.1, важность переменных 15.3.2, переобучение 15.3.4, разложение дисперсии 15.4.1, адаптивные ближайшие соседи 15.4.3).
- P. Geurts, D. Ernst, L. Wehenkel. Extremely randomized trees. Machine Learning, 63(1), 2006. Раздел 2.1.
- C. Strobl, A.-L. Boulesteix, A. Zeileis, T. Hothorn. Bias in random forest variable importance measures: Illustrations, sources and a solution. BMC Bioinformatics, 8, 2007.
- G. Hooker, L. Mentch, S. Zhou. Unrestricted permutation forces extrapolation: variable importance requires at least one more model, or there is no free variable importance. Statistics and Computing, 31, 2021 (arXiv:1905.03151).
- E. Sokolov et al. Машинное обучение (HSE). Конспект, лекция 10: бэггинг, случайный лес и разложение на смещение и разброс; семинар 10; семинар 11: интерпретация моделей.