Случайные леса в 2023 году современные расширения мощного метода

Тренды 2023 года Эволюция лесных мотивов в современных модных тенденциях

Random Forests пройдены долгий путь

Особенности современных методов Random Forest. Источник: Автор.

С точки зрения временной линии обучения машинного обучения, Random Forests (RFs), представленные в работе Брейманна ([1]), являются древними. Несмотря на свой возраст, они продолжают впечатлять своей производительностью и являются предметом активных исследований. Целью этой статьи является подчеркивание того, каким многофункциональным инструментом стали методы Random Forest, с акцентом на Generalized Random Forest (GRF) и Distributional Random Forest (DRF).

Вкратце, основная идея обоих методов заключается в том, что веса, неявно производимые RF, могут быть использованы для оценки целей, отличных от условного математического ожидания. Идея GRF заключается в использовании Random Forest с критерием разделения, который адаптирован к цели, которую вы имеете в виду (например, условное среднее, условные квантили или условный эффект лечения). Идея DRF заключается в адаптации критерия разделения таким образом, чтобы можно было оценить всего условное распределение. Из этого объекта можно затем получить множество разных целей на втором этапе. Фактически в этой статье я больше рассказываю о DRF, так как я более знаком с этим методом, и он немного более упрощен (должен быть подготовлен только один лес для широкого спектра целей). Однако все преимущества, указанные на рисунке выше, также применимы к GRF, и, фактически, пакет DRF в R построен на профессиональной реализации GRF. Более того, тот факт, что критерий разделения лесов GRF адаптирован к цели, означает, что он может иметь лучшую производительность, чем DRF. Это особенно верно для бинарного Y, где следует использовать функцию probability_forests(). Так что, хотя я больше говорю о DRF, GRF следует иметь в виду на протяжении всей этой статьи.

Цель этой статьи – дать обзор с ссылками на более глубокое чтение в соответствующих разделах. Мы пройдем через каждый пункт на представленном выше рисунке по часовой стрелке, ссылаясь на соответствующие статьи и подчеркивая их небольшим примером. Сначала я кратко резюмирую самые важные ссылки на дополнительное чтение ниже:

Универсальность/производительность: Статья VoAGI и Оригинальные статьи (DRF/GRF)

Интеграция пропущенных значений: Статья VoAGI

Показатели неопределенности: Статья VoAGI

Важность переменных: Статья VoAGI

Пример

Мы берем X_1, X_2, X_4, …, X_10, независимые равномерно распределенные между (-1,1), и создаем зависимость между X_1 и X_3, беря X_3=X_1 + случайная ошибка. Затем мы моделируем Y таким образом

## Загрузка пакетов и необходимых функцийlibrary(drf)library(mice)source("drfnew_v2.R")## Функция drfnew_v2.R доступна ниже, или по адресу ## https://github.com/JeffNaef/drfupdate## Установка параметровset.seed(10)n<-1000##Генерация данных, которые подвергаются сдвигу среднего и сдвигу стандартного отклонения# Генерация данных Xx1 <- runif(n,-1,1)x2 <- runif(n,-1,1)x3 <- x1+ runif(n,-1,1)X0 <- matrix(runif(7*n,-1,1), nrow=n, ncol=7)Xfull <- cbind(x1,x2, x3, X0)colnames(Xfull)<-paste0("X", 1:10)# Генерация зависимой переменной YY <- as.matrix(rnorm(n,mean = 0.8*(x1 > 0), sd = 1 + 1*(x2 > 0)))##Также добавляем пропущенные значения MAR с помощью функции ampute из пакета miceX<-ampute(Xfull)$amphead(cbind(Y,X))           Y         X1          X2          X3          X4           X51 -3.0327466 -0.4689827  0.06161759  0.27462737          NA -0.6244630792  1.2582824 -0.2557522  0.36972181          NA -0.04100963  0.0095180473 -0.8781940  0.1457067 -0.23343321          NA -0.64519687 -0.9454263054  3.1595623  0.8164156  0.90997600  0.69184618 -0.20573331 -0.0074042985  1.1176545 -0.5966361          NA -1.21276055  0.62845399  0.8947034226 -0.4377359  0.7967794 -0.92179989 -0.03863182  0.88271415 -0.237635732          X6         X7          X8         X9        X101 -0.9290009  0.5401628  0.39735433 -0.7434697  0.88075582 -0.2885927  0.3805251 -0.09051334 -0.7446170  0.99353113 -0.5022541  0.3009541  0.29424395  0.5554647 -0.53418004  0.7583608 -0.8506881  0.22758566 -0.1596993 -0.71619765 -0.3640422  0.8051613 -0.46714833  0.4318039 -0.86740606 -0.3577590 -0.7341207  0.85504668 -0.6933918  0.4656891

Заметьте, что с функцией ampute из пакета mice мы создаем значения отсутствующих значений (MAR) на X, чтобы подчеркнуть способность GRF/DRF работать с отсутствующими значениями. Кроме того, в вышеуказанном процессе только X_1 и X_2 являются значимыми для прогнозирования Y, все остальные переменные являются «шумовыми». Такая «разреженная» ситуация может быть довольно обычной в реальных наборах данных.

Теперь выберем тестовую точку для этого примера, которую мы будем использовать:

x<-matrix(c(0.2, 0.4, runif(8,-1,1)), nrow=1, ncol=10)print(x)     [,1] [,2]      [,3]      [,4]      [,5]      [,6]    [,7]      [,8][1,]  0.2  0.4 0.7061058 0.8364877 0.2284314 0.7971179 0.78581 0.5310279           [,9]     [,10][1,] -0.5067102 0.6918785

Универсальность

DRF оценивает условное распределение P_{Y|X=x} в виде простых весов:

Из этих весов можно вычислить широкий спектр целей или использовать их для моделирования из условного распределения. Хорошей справкой по его универсальности является оригинальная научная статья, где было использовано множество примеров, а также соответствующая статья VoAGI.

В этом примере мы сначала моделируем из этого распределения:

DRF<-drfCI(X=X, Y=Y, B=50,num.trees=1000, min.node.size = 5)DRFpred<-predictdrf(DRF, newdata=x)## Sample from P_{Y| X=x}Yxs<-Y[sample(1:n, size=n, replace = T, DRFpred$weights[1,])]hist(Yxs, prob=T)z<-seq(-6,7,by=0.01)d<-dnorm(z, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))lines(z,d, col="darkred"  )
Гистограмма смоделированного условного распределения с нанесенной на нее истинной плотностью (красный цвет). Источник: Автор.

На графике показаны приближенные значения из условного распределения, нанесенные на истинную плотность красным цветом. Теперь мы используем это для оценки условного ожидания и условных (0,05; 0,95) квантилей при x:

# Calculate quantile prediction as weighted quantiles from Yqx <- quantile(Yxs, probs = c(0.05,0.95))# Calculate conditional mean predictionmux <- mean(Yxs)# True quantilesq1<-qnorm(0.05, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))q2<-qnorm(0.95, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))mu<-0.8 * (x[1] > 0)hist(Yxs, prob=T)z<-seq(-6,7,by=0.01)d<-dnorm(z, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))lines(z,d, col="darkred"  )abline(v=q1,col="darkred" )abline(v=q2, col="darkred" )abline(v=qx[1], col="darkblue")abline(v=qx[2], col="darkblue")abline(v=mu, col="darkred")abline(v=mux, col="darkblue")
Гистограмма условного распределения, наложенная на истинную плотность (красным). Кроме того, оценка условного математического ожидания и условные (0.05, 0.95) квантили обозначены синим цветом, а истинные значения - красным цветом. Источник: Автор.

Точно так же, можно рассчитать множество целей с помощью GRF, только в этом случае для каждой из этих двух целей необходимо подобрать разные леса. В частности, regression_forest() для условного математического ожидания и quantile_forest() для квантилей.

То, чего GRF не может сделать, это работа с многомерными целями, что также возможно с DRF.

Производительность

Несмотря на все работы над мощными новыми (непараметрическими) методами, такими как нейронные сети, методы на основе деревьев постоянно способны превзойти конкурентов на табличных данных. См., например, эту увлекательную статью или эту старую статью о силе RF в классификации.

Честно говоря, с настройкой параметров, методы бустинга деревьев, такие как XGboost, часто преуспевают, по крайней мере, в классическом прогнозировании (что соответствует оценке условного математического ожидания). Тем не менее, выдающаяся производительность методов RF без настройки параметров замечательна. Кроме того, также проводится работа по улучшению производительности Random Forests, например, прием ограждаемого подхода к Random Forest в этой статье.

Учет пропущенных значений

Идея “Включение пропущенных значений в атрибуты” (MIA) из этой статьи является очень простой, но очень мощной идеей, которая позволяет деревянным методам обрабатывать отсутствующие данные. Она была реализована в пакете GRF для R, поэтому она также доступна в DRF. Детали также объясняются в этой статье VoAGI. Несмотря на то, что концепция очень проста, она прекрасно работает на практике: в приведенном выше примере DRF без проблем справляется с значительной MAR-неоднородностью в обучающих данных X (!)

Меры неопределенности

Как статистик, я хочу не только точечные оценки (даже распределения), но и меру оценочной неопределенности для своих параметров (даже если “параметром” является все мое распределение). Оказывается, что простая дополнительная подвыборка, встроенная в DRF/GRF, позволяет осуществлять основанную на принципах квантификацию неопределенности для больших выборок. Теория, лежащая в основе этого в случае DRF, изложена в этой исследовательской статье, однако я также объясняю ее в статье VoAGI. В GRF вся теория раскрыта в оригинальной статье.

Мы адаптируем это для приведенного выше примера:

# Расчет неопределенностиalpha<-0.05B<-length(DRFpred$weightsb)qxb<-matrix(NaN, nrow=B, ncol=2)muxb<-matrix(NaN, nrow=B, ncol=1)for (b in 1:B){Yxsb<-Y[sample(1:n, size=n, replace = T, DRFpred$weightsb[[b]][1,])]qxb[b,] <- quantile(Yxsb, probs = c(0.05,0.95))muxb[b] <- mean(Yxsb)}CI.lower.q1 <- qx[1] - qnorm(1-alpha/2)*sqrt(var(qxb[,1]))CI.upper.q1 <- qx[1] + qnorm(1-alpha/2)*sqrt(var(qxb[,1]))CI.lower.q2 <- qx[2] - qnorm(1-alpha/2)*sqrt(var(qxb[,2]))CI.upper.q2 <- qx[2] + qnorm(1-alpha/2)*sqrt(var(qxb[,2]))CI.lower.mu <- mux - qnorm(1-alpha/2)*sqrt(var(muxb))CI.upper.mu <- mux + qnorm(1-alpha/2)*sqrt(var(muxb))hist(Yxs, prob=T)z<-seq(-6,7,by=0.01)d<-dnorm(z, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))lines(z,d, col="darkred"  )abline(v=q1,col="darkred" )abline(v=q2, col="darkred" )abline(v=qx[1], col="darkblue")abline(v=qx[2], col="darkblue")abline(v=mu, col="darkred")abline(v=mux, col="darkblue")abline(v=CI.lower.q1, col="darkblue", lty=2)abline(v=CI.upper.q1, col="darkblue", lty=2)abline(v=CI.lower.q2, col="darkblue", lty=2)abline(v=CI.upper.q2, col="darkblue", lty=2)abline(v=CI.lower.mu, col="darkblue", lty=2)abline(v=CI.upper.mu, col="darkblue", lty=2)
Гистограмма условного распределения с наложенной истинной плотностью (красным цветом). Кроме того, оцененное условное математическое ожидание и условные (0,05, 0,95) квантили обозначены синим цветом, где истинные значения обозначены красным цветом. Кроме того, пунктирные красные линии являются доверительными интервалами для оценок, вычисленными с помощью DRF. Источник: автор.

Как видно из указанного кода, у нас фактически есть B поддеревьев, которые можно использовать для расчета показателя каждый раз. Исходя из этих B выборок среднего и квантилей, мы можем затем рассчитать дисперсии и использовать нормальное приближение для получения (асимптотических) доверительных интервалов, показанных пунктирной линией на рисунке. Опять же, все это можно сделать, несмотря на отсутствие значений в X (!)

Важность перемен