Математическое моделирование

Практика 8

Модели на основе деревьев

В практических примерах ниже показано как:

  • строить регрессионные деревья;
  • строить деревья классификации;
  • делать обрезку дерева;
  • использовать бэггинг, бустинг, случайный лес для улучшения качества прогнозирования.

Модели: деревья решений.
Данные: Sales {ISLR}, Boston {MASS}

Подробные комментарии к коду лабораторных см. в [1], глава 8.

# Загрузка пакетов
library('tree')              # деревья tree()
library('ISLR')              # набор данных Carseats
library('GGally')            # матричный график разброса ggpairs()
library('MASS')              # набор данных Boston
library('randomForest')      # случайный лес randomForest()
library('gbm')               # бустинг gbm()

# ядро генератора случайных чисел
my.seed <- 2

Деревья решений

Загрузим таблицу с данными по продажам детских кресел и добавим к ней переменную High – “высокие продажи” со значениями:

# ?Carseats
head(Carseats)
# новая переменная
High <- ifelse(Carseats$Sales <= 8, "No", "Yes")

# присоединяем к таблице данных
Carseats <- cbind(Carseats, High)

# матричные графики разброса переменных
p <- ggpairs(Carseats[, c(12, 1:4)], aes(color = High))
suppressMessages(print(p))

p <- ggpairs(Carseats[, c(12, 5:8)], aes(color = High))
suppressMessages(print(p))

p <- ggpairs(Carseats[, c(12, 9:11)], aes(color = High))
suppressMessages(print(p))

Судя по графикам, переменная классы No и Yes переменной High сопоставимы по размерам. Классы на графиках разброса объясняющих переменных сильно смешаны, поэтому модели с непрерывной разрешающей границей вряд ли сработают хорошо. Построим дерево для категориального отклика High, отбросив непрерывный отклик Sales (мы оставили его на первом графике, чтобы проверить, как сработало разделение по значению Sales = 8).

# модель бинарного  дерева
tree.carseats <- tree(High ~ . -Sales, Carseats)
summary(tree.carseats)
## 
## Classification tree:
## tree(formula = High ~ . - Sales, data = Carseats)
## Variables actually used in tree construction:
## [1] "ShelveLoc"   "Price"       "Income"      "CompPrice"   "Population" 
## [6] "Advertising" "Age"         "US"         
## Number of terminal nodes:  27 
## Residual mean deviance:  0.4575 = 170.7 / 373 
## Misclassification error rate: 0.09 = 36 / 400
# график результата
plot(tree.carseats)              # ветви
text(tree.carseats, pretty = 0)  # подписи

tree.carseats                    # посмотреть всё дерево в консоли
## node), split, n, deviance, yval, (yprob)
##       * denotes terminal node
## 
##   1) root 400 541.500 No ( 0.59000 0.41000 )  
##     2) ShelveLoc: Bad,Medium 315 390.600 No ( 0.68889 0.31111 )  
##       4) Price < 92.5 46  56.530 Yes ( 0.30435 0.69565 )  
##         8) Income < 57 10  12.220 No ( 0.70000 0.30000 )  
##          16) CompPrice < 110.5 5   0.000 No ( 1.00000 0.00000 ) *
##          17) CompPrice > 110.5 5   6.730 Yes ( 0.40000 0.60000 ) *
##         9) Income > 57 36  35.470 Yes ( 0.19444 0.80556 )  
##          18) Population < 207.5 16  21.170 Yes ( 0.37500 0.62500 ) *
##          19) Population > 207.5 20   7.941 Yes ( 0.05000 0.95000 ) *
##       5) Price > 92.5 269 299.800 No ( 0.75465 0.24535 )  
##        10) Advertising < 13.5 224 213.200 No ( 0.81696 0.18304 )  
##          20) CompPrice < 124.5 96  44.890 No ( 0.93750 0.06250 )  
##            40) Price < 106.5 38  33.150 No ( 0.84211 0.15789 )  
##              80) Population < 177 12  16.300 No ( 0.58333 0.41667 )  
##               160) Income < 60.5 6   0.000 No ( 1.00000 0.00000 ) *
##               161) Income > 60.5 6   5.407 Yes ( 0.16667 0.83333 ) *
##              81) Population > 177 26   8.477 No ( 0.96154 0.03846 ) *
##            41) Price > 106.5 58   0.000 No ( 1.00000 0.00000 ) *
##          21) CompPrice > 124.5 128 150.200 No ( 0.72656 0.27344 )  
##            42) Price < 122.5 51  70.680 Yes ( 0.49020 0.50980 )  
##              84) ShelveLoc: Bad 11   6.702 No ( 0.90909 0.09091 ) *
##              85) ShelveLoc: Medium 40  52.930 Yes ( 0.37500 0.62500 )  
##               170) Price < 109.5 16   7.481 Yes ( 0.06250 0.93750 ) *
##               171) Price > 109.5 24  32.600 No ( 0.58333 0.41667 )  
##                 342) Age < 49.5 13  16.050 Yes ( 0.30769 0.69231 ) *
##                 343) Age > 49.5 11   6.702 No ( 0.90909 0.09091 ) *
##            43) Price > 122.5 77  55.540 No ( 0.88312 0.11688 )  
##              86) CompPrice < 147.5 58  17.400 No ( 0.96552 0.03448 ) *
##              87) CompPrice > 147.5 19  25.010 No ( 0.63158 0.36842 )  
##               174) Price < 147 12  16.300 Yes ( 0.41667 0.58333 )  
##                 348) CompPrice < 152.5 7   5.742 Yes ( 0.14286 0.85714 ) *
##                 349) CompPrice > 152.5 5   5.004 No ( 0.80000 0.20000 ) *
##               175) Price > 147 7   0.000 No ( 1.00000 0.00000 ) *
##        11) Advertising > 13.5 45  61.830 Yes ( 0.44444 0.55556 )  
##          22) Age < 54.5 25  25.020 Yes ( 0.20000 0.80000 )  
##            44) CompPrice < 130.5 14  18.250 Yes ( 0.35714 0.64286 )  
##              88) Income < 100 9  12.370 No ( 0.55556 0.44444 ) *
##              89) Income > 100 5   0.000 Yes ( 0.00000 1.00000 ) *
##            45) CompPrice > 130.5 11   0.000 Yes ( 0.00000 1.00000 ) *
##          23) Age > 54.5 20  22.490 No ( 0.75000 0.25000 )  
##            46) CompPrice < 122.5 10   0.000 No ( 1.00000 0.00000 ) *
##            47) CompPrice > 122.5 10  13.860 No ( 0.50000 0.50000 )  
##              94) Price < 125 5   0.000 Yes ( 0.00000 1.00000 ) *
##              95) Price > 125 5   0.000 No ( 1.00000 0.00000 ) *
##     3) ShelveLoc: Good 85  90.330 Yes ( 0.22353 0.77647 )  
##       6) Price < 135 68  49.260 Yes ( 0.11765 0.88235 )  
##        12) US: No 17  22.070 Yes ( 0.35294 0.64706 )  
##          24) Price < 109 8   0.000 Yes ( 0.00000 1.00000 ) *
##          25) Price > 109 9  11.460 No ( 0.66667 0.33333 ) *
##        13) US: Yes 51  16.880 Yes ( 0.03922 0.96078 ) *
##       7) Price > 135 17  22.070 No ( 0.64706 0.35294 )  
##        14) Income < 46 6   0.000 No ( 1.00000 0.00000 ) *
##        15) Income > 46 11  15.160 Yes ( 0.45455 0.54545 ) *

Теперь построим дерево на обучающей выборке и оценим ошибку на тестовой.

# ядро генератора случайных чисел
set.seed(my.seed)

# обучающая выборка
train <- sample(1:nrow(Carseats), 200)

# тестовая выборка
Carseats.test <- Carseats[-train,]
High.test <- High[-train]

# строим дерево на обучающей выборке
tree.carseats <- tree(High ~ . -Sales, Carseats, subset = train)

# делаем прогноз
tree.pred <- predict(tree.carseats, Carseats.test, type = "class")

# матрица неточностей
tbl <- table(tree.pred, High.test)
tbl
##          High.test
## tree.pred No Yes
##       No  86  27
##       Yes 30  57
# ACC на тестовой
acc.test <- sum(diag(tbl))/sum(tbl)
names(acc.test)[length(acc.test)] <- 'Carseats.class.tree.all'
acc.test
## Carseats.class.tree.all 
##                   0.715

Обобщённая характеристика точности: доля верных прогнозов: 0.72.

Теперь обрезаем дерево, используя в качестве критерия частоту ошибок классификации. Функция cv.tree() проводит кросс-валидацию для выбора лучшего дерева, аргумент prune.misclass означает, что мы минимизируем ошибку классификации.

set.seed(my.seed)
cv.carseats <- cv.tree(tree.carseats, FUN = prune.misclass)
# имена элементов полученного объекта
names(cv.carseats)
## [1] "size"   "dev"    "k"      "method"
# сам объект
cv.carseats
## $size
## [1] 19 17 14 13  9  7  3  2  1
## 
## $dev
## [1] 57 56 55 54 52 55 61 62 81
## 
## $k
## [1]       -Inf  0.0000000  0.6666667  1.0000000  1.7500000  2.0000000
## [7]  4.2500000  5.0000000 23.0000000
## 
## $method
## [1] "misclass"
## 
## attr(,"class")
## [1] "prune"         "tree.sequence"
# графики изменения параметров метода по ходу обрезки дерева ###################

# 1. ошибка с кросс-валидацией в зависимости от числа узлов
par(mfrow = c(1, 2))
plot(cv.carseats$size, cv.carseats$dev, type = "b",
     ylab = 'Частота ошибок с кросс-вал. (dev)',
     xlab = 'Число узлов (size)')
# размер дерева с минимальной ошибкой
opt.size <- cv.carseats$size[cv.carseats$dev == min(cv.carseats$dev)]
abline(v = opt.size, col = 'red', 'lwd' = 2)     # соотв. вертикальная прямая
mtext(opt.size, at = opt.size, side = 1, col = 'red', line = 1)

# 2. ошибка с кросс-валидацией в зависимости от штрафа на сложность
plot(cv.carseats$k, cv.carseats$dev, type = "b",
     ylab = 'Частота ошибок с кросс-вал. (dev)',
     xlab = 'Штраф за сложность (k)')

Как видно на графике слева, минимум частоты ошибок достигается при числе узлов 9. Оценим точность дерева с 9 узлами.

# дерево с 9 узлами
prune.carseats <- prune.misclass(tree.carseats, best = 9)

# визуализация
plot(prune.carseats)
text(prune.carseats, pretty = 0)

# прогноз на тестовую выборку
tree.pred <- predict(prune.carseats, Carseats.test, type = "class")

# матрица неточностей
tbl <- table(tree.pred, High.test)
tbl
##          High.test
## tree.pred No Yes
##       No  94  24
##       Yes 22  60
# ACC на тестовой
acc.test <- c(acc.test, sum(diag(tbl))/sum(tbl))
names(acc.test)[length(acc.test)] <- 'Carseats.class.tree.9'
acc.test
## Carseats.class.tree.all   Carseats.class.tree.9 
##                   0.715                   0.770

Точность этой модели чуть выше точности исходного дерева и составляет 0.72, 0.77. Увеличив количество узлов, получим более глубокое дерево, но менее точное.

# дерево с 15 узлами
prune.carseats <- prune.misclass(tree.carseats, best = 15)

# визуализация
plot(prune.carseats)
text(prune.carseats, pretty = 0)

# прогноз на тестовую выборку
tree.pred <- predict(prune.carseats, Carseats.test, type = "class")

# матрица неточностей
tbl <- table(tree.pred, High.test)
tbl
##          High.test
## tree.pred No Yes
##       No  86  22
##       Yes 30  62
# ACC на тестовой
acc.test <- c(acc.test, sum(diag(tbl))/sum(tbl))
names(acc.test)[length(acc.test)] <- 'Carseats.class.tree.15'
acc.test
## Carseats.class.tree.all   Carseats.class.tree.9  Carseats.class.tree.15 
##                   0.715                   0.770                   0.740
# сбрасываем графические параметры
par(mfrow = c(1, 1))

Регрессионные деревья

Воспользуемся набором данных Boston.

# ?Boston
head(Boston)
# матричные графики разброса переменных
p <- ggpairs(Boston[, c(14, 1:4)])
suppressMessages(print(p))

p <- ggpairs(Boston[, c(14, 5:8)])
suppressMessages(print(p))

p <- ggpairs(Boston[, c(14, 9:13)])
suppressMessages(print(p))

# обучающая выборка
set.seed(my.seed)
train <- sample(1:nrow(Boston), nrow(Boston)/2) # обучающая выборка -- 50%

Построим дерево регрессии для зависимой переменной medv: медианная стоимости домов, в которых живут собственники (тыс. долл.).

# обучаем модель
tree.boston <- tree(medv ~ ., Boston, subset = train)
summary(tree.boston)
## 
## Regression tree:
## tree(formula = medv ~ ., data = Boston, subset = train)
## Variables actually used in tree construction:
## [1] "lstat" "rm"    "dis"  
## Number of terminal nodes:  8 
## Residual mean deviance:  12.65 = 3099 / 245 
## Distribution of residuals:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -14.10000  -2.04200  -0.05357   0.00000   1.96000  12.60000
# визуализация
plot(tree.boston)
text(tree.boston, pretty = 0)

Снова сделаем обрезку дерева в целях улучшения качества прогноза.

# обрезка дерева
cv.boston <- cv.tree(tree.boston)

# размер дерева с минимальной ошибкой
plot(cv.boston$size, cv.boston$dev, type = 'b')
opt.size <- cv.boston$size[cv.boston$dev == min(cv.boston$dev)]
abline(v = opt.size, col = 'red', 'lwd' = 2)     # соотв. вертикальная прямая
mtext(opt.size, at = opt.size, side = 1, col = 'red', line = 1)

В данном случаем минимум ошибки соответствует самому сложному дереву, с 8 узлами. Покажем, как при желании можно обрезать дерево до 7 узлов (ошибка ненамного выше, чем минимальная).

# дерево с 7 узлами
prune.boston = prune.tree(tree.boston, best = 7)

# визуализация
plot(prune.boston)
text(prune.boston, pretty = 0)

Прогноз сделаем по необрезанному дереву, т.к. там ошибка, оцененная по методу перекрёстной проверки, минимальна.

# прогноз по лучшей модели (8 узлов)
yhat <- predict(tree.boston, newdata = Boston[-train, ])
boston.test <- Boston[-train, "medv"]

# график "прогноз -- реализация"
plot(yhat, boston.test)
# линия идеального прогноза
abline(0, 1)

# MSE на тестовой выборке
mse.test <- mean((yhat - boston.test)^2)
names(mse.test)[length(mse.test)] <- 'Boston.regr.tree.8'
mse.test
## Boston.regr.tree.8 
##           14.69425

MSE на тестовой выборке равна 14.69 (тыс.долл.).

Бэггинг и метод случайного леса

Рассмотрим более сложные методы улучшения качества дерева. Бэггинг – частный случай случайного леса с \(m = p\), поэтому и то, и другое можно построить функцией randomForest().

Для начала используем бэггинг, причём возьмём все 13 предикторов на каждом шаге (аргумент mtry).

# бэггинг с 13 предикторами
set.seed(my.seed)
bag.boston <- randomForest(medv ~ ., data = Boston, subset = train, 
                           mtry = 13, importance = TRUE)
bag.boston
## 
## Call:
##  randomForest(formula = medv ~ ., data = Boston, mtry = 13, importance = TRUE,      subset = train) 
##                Type of random forest: regression
##                      Number of trees: 500
## No. of variables tried at each split: 13
## 
##           Mean of squared residuals: 17.18726
##                     % Var explained: 78.31
# прогноз
yhat.bag = predict(bag.boston, newdata = Boston[-train, ])

# график "прогноз -- реализация"
plot(yhat.bag, boston.test)
# линия идеального прогноза
abline(0, 1)

# MSE на тестовой
mse.test <- c(mse.test, mean((yhat.bag - boston.test)^2))
names(mse.test)[length(mse.test)] <- 'Boston.bag.13'
mse.test
## Boston.regr.tree.9      Boston.bag.13 
##           14.69425           10.85600

Ошибка на тестовой выборке равна 10.86.
Можно изменить число деревьев с помощью аргумента ntree.

# бэггинг с 13 предикторами и 25 деревьями
bag.boston <- randomForest(medv ~ ., data = Boston, subset = train,
                           mtry = 13, ntree = 25)

# прогноз
yhat.bag <- predict(bag.boston, newdata = Boston[-train, ])

# MSE на тестовой
mse.test <- c(mse.test, mean((yhat.bag - boston.test)^2))
names(mse.test)[length(mse.test)] <- 'Boston.bag.13.25'
mse.test
## Boston.regr.tree.9      Boston.bag.13   Boston.bag.13.25 
##           14.69425           10.85600           11.42487

Но, как видно, это только ухудшает прогноз.
Теперь попробуем вырастить случайный лес. Берём 6 предикторов на каждом шаге.

# обучаем модель
set.seed(my.seed)
rf.boston <- randomForest(medv ~ ., data = Boston, subset = train,
                          mtry = 6, importance = TRUE)

# прогноз
yhat.rf <- predict(rf.boston, newdata = Boston[-train, ])

# MSE на тестовой выборке
mse.test <- c(mse.test, mean((yhat.rf - boston.test)^2))
names(mse.test)[length(mse.test)] <- 'Boston.rf.6'
mse.test
## Boston.regr.tree.9      Boston.bag.13   Boston.bag.13.25 
##           14.69425           10.85600           11.42487 
##        Boston.rf.6 
##           11.05467
# важность предикторов
importance(rf.boston)  # оценки 
##           %IncMSE IncNodePurity
## crim    11.837967    1103.70728
## zn       1.430625      54.27998
## indus   11.442101     955.49786
## chas     3.254195      89.06795
## nox     12.387968    1164.63104
## rm      26.792326    4551.68041
## age     10.509686     665.29925
## dis     15.027453    1426.61927
## rad      4.206529     136.03468
## tax      8.388355     521.19325
## ptratio  9.779405     617.69651
## black    6.876575     307.30151
## lstat   33.610837    8084.49984
varImpPlot(rf.boston)  # графики

Ошибка по модели случайного леса равна 11.05, что ниже, чем для бэггинга.

Бустинг

Построим 5000 регрессионных деревьев с глубиной 4.

set.seed(my.seed)
boost.boston <- gbm(medv ~ ., data = Boston[train, ], distribution = "gaussian",
                    n.trees = 5000, interaction.depth = 4)
# график и таблица относительной важности переменных
summary(boost.boston)
# графики частной зависимости для двух наиболее важных предикторов
par(mfrow = c(1, 2))
plot(boost.boston, i = "rm")

plot(boost.boston, i = "lstat")

# прогноз
yhat.boost <- predict(boost.boston, newdata = Boston[-train, ], n.trees = 5000)

# MSE на тестовой
mse.test <- c(mse.test, mean((yhat.boost - boston.test)^2))
names(mse.test)[length(mse.test)] <- 'Boston.boost.opt'
mse.test
## Boston.regr.tree.9      Boston.bag.13   Boston.bag.13.25 
##           14.69425           10.85600           11.42487 
##        Boston.rf.6   Boston.boost.opt 
##           11.05467           14.25256

Настройку бустинга можно делать с помощью гиперпараметра \(\lambda\) (аргумент shrinkage). Установим его равным 0.2.

# меняем значение гиперпараметра (lambda) на 0.2 -- аргумент shrinkage
boost.boston <- gbm(medv ~ ., data = Boston[train, ], distribution = "gaussian",
                    n.trees = 5000, interaction.depth = 4, 
                    shrinkage = 0.2, verbose = F)

# прогноз
yhat.boost <- predict(boost.boston, newdata = Boston[-train, ], n.trees = 5000)

# MSE а тестовой
mse.test <- c(mse.test, mean((yhat.boost - boston.test)^2))
names(mse.test)[length(mse.test)] <- 'Boston.boost.0.2'
mse.test
## Boston.regr.tree.9      Boston.bag.13   Boston.bag.13.25 
##           14.69425           10.85600           11.42487 
##        Boston.rf.6   Boston.boost.opt   Boston.boost.0.2 
##           11.05467           14.25256           13.03698

Таким образом, изменив гиперпараметр, мы ещё немного снизили ошибку прогноза.

Упражнение 8

Необходимо построить две модели для прогноза на основе дерева решений:
* для непрерывной зависимой переменной; * для категориальной зависимой переменной.
Данные и переменные указаны в таблице с вариантами.
Ядро генератора случайных чисел – номер варианта.

Задания Для каждой модели:
1. Указать настроечные параметры метода из своего варианта (например: количество узлов, количество предикторов, скорость обучения).
2. Подогнать модель на обучающей выборке (50% наблюдений). Рассчитать MSE на тестовой выборке.
3. Перестроить модель с помощью метода, указанного в варианте.
4. Сделать прогноз по модели с подобранными в п.3 параметрами на тестовой выборке, оценить его точность и построить график «прогноз-реализация».

Как сдавать: прислать на почту преподавателя ссылки: * на html-отчёт с видимыми блоками кода (блоки кода с параметром echo = T), размещённый на rpubs.com.
* на код, генерирующий отчёт, в репозитории на github.com. В текст отчёта включить постановку задачи и ответы на вопросы задания.

Варианты

Номер варианта Данные Непрерывный \(Y\) Категориальный \(Y\) Объясняющие переменные Метод подгонки моделей
1 Boston {MASS} \(medv\) \(high.medv = \begin{cases} \begin{array}{lcl} 1, & если & medv >= 25 \\ 0, & если & medv < 25 \end{array} \end{cases}\) все остальные дерево с обрезкой ветвей
2 Boston {MASS} \(medv\) \(high.medv = \begin{cases} \begin{array}{lcl} 1, & если & medv >= 25 \\ 0, & если & medv < 25 \end{array} \end{cases}\) все остальные бэггинг
3 Boston {MASS} \(medv\) \(high.medv = \begin{cases} \begin{array}{lcl} 1, & если & medv >= 25 \\ 0, & если & medv < 25 \end{array} \end{cases}\) все остальные случайный лес
4 Boston {MASS} \(medv\) \(high.medv = \begin{cases} \begin{array}{lcl} 1, & если & medv >= 25 \\ 0, & если & medv < 25 \end{array} \end{cases}\) все остальные бустинг
5 Wage {ISLR} \(wage\) \(high.wage = \begin{cases} \begin{array}{lcl} 1, & если & wage >= 128.68 \\ 0, & если & wage < 128.68 \end{array} \end{cases}\) остальные, кроме \(region\), \(logwage\) дерево с обрезкой ветвей
6 Wage {ISLR} \(wage\) \(high.wage = \begin{cases} \begin{array}{lcl} 1, & если & wage >= 128.68 \\ 0, & если & wage < 128.68 \end{array} \end{cases}\) остальные, кроме \(region\), \(logwage\) бэггинг
7 Wage {ISLR} \(wage\) \(high.wage = \begin{cases} \begin{array}{lcl} 1, & если & wage >= 128.68 \\ 0, & если & wage < 128.68 \end{array} \end{cases}\) остальные, кроме \(region\), \(logwage\) случайный лес
8 Wage {ISLR} \(wage\) \(high.wage = \begin{cases} \begin{array}{lcl} 1, & если & wage >= 128.68 \\ 0, & если & wage < 128.68 \end{array} \end{cases}\) остальные, кроме \(region\), \(logwage\) бустинг
9 Auto {ISLR} \(mpg\) \(high.mpg = \begin{cases} \begin{array}{lcl} 1, & если & mpg >= 29 \\ 0, & если & mpg < 29 \end{array} \end{cases}\) остальные, кроме \(name\) дерево с обрезкой ветвей
10 Auto {ISLR} \(mpg\) \(high.mpg = \begin{cases} \begin{array}{lcl} 1, & если & mpg >= 29 \\ 0, & если & mpg < 29 \end{array} \end{cases}\) остальные, кроме \(name\) бэггинг
11 Auto {ISLR} \(mpg\) \(high.mpg = \begin{cases} \begin{array}{lcl} 1, & если & mpg >= 29 \\ 0, & если & mpg < 29 \end{array} \end{cases}\) остальные, кроме \(name\) случайный лес
12 Auto {ISLR} \(mpg\) \(high.mpg = \begin{cases} \begin{array}{lcl} 1, & если & mpg >= 29 \\ 0, & если & mpg < 29 \end{array} \end{cases}\) остальные, кроме \(name\) бустинг
13 Boston {MASS} \(crim\) \(high.crim = \begin{cases} \begin{array}{lcl} 1, & если & crim > 3.5 \\ 0, & если & crim <= 3.5 \end{array} \end{cases}\) остальные дерево с обрезкой ветвей
14 Boston {MASS} \(crim\) \(high.crim = \begin{cases} \begin{array}{lcl} 1, & если & crim > 3.5 \\ 0, & если & crim <= 3.5 \end{array} \end{cases}\) остальные бэггинг
15 Boston {MASS} \(crim\) \(high.crim = \begin{cases} \begin{array}{lcl} 1, & если & crim > 3.5 \\ 0, & если & crim <= 3.5 \end{array} \end{cases}\) остальные случайный лес
16 Boston {MASS} \(crim\) \(high.crim = \begin{cases} \begin{array}{lcl} 1, & если & crim > 3.5 \\ 0, & если & crim <= 3.5 \end{array} \end{cases}\) остальные бустинг
17 Carseats {ISLR} \(Sales\) \(high.Sales = \begin{cases} \begin{array}{lcl} 1, & если & Sales > 9.3 \\ 0, & если & Sales <= 9.3 \end{array} \end{cases}\) остальные дерево с обрезкой ветвей
14 Carseats {ISLR} \(Sales\) \(high.Sales = \begin{cases} \begin{array}{lcl} 1, & если & Sales > 9.3 \\ 0, & если & Sales <= 9.3 \end{array} \end{cases}\) остальные бэггинг
15 Carseats {ISLR} \(Sales\) \(high.Sales = \begin{cases} \begin{array}{lcl} 1, & если & Sales > 9.3 \\ 0, & если & Sales <= 9.3 \end{array} \end{cases}\) остальные случайный лес
16 Carseats {ISLR} \(Sales\) \(high.Sales = \begin{cases} \begin{array}{lcl} 1, & если & Sales > 9.3 \\ 0, & если & Sales <= 9.3 \end{array} \end{cases}\) остальные бустинг

Источники

  1. Джеймс Г., Уиттон Д., Хасти Т., Тибширани Р. Введение в статистическое обучение с примерами на языке R / пер. с англ. С.Э. Мастицкого. – М.: ДМК Пресс, 2016 – 450 с. Репозиторий с примерами к книге на русском языке: https://github.com/ranalytics/islr-ru