В практических примерах ниже показано как:
Модели: деревья решений.
Данные: 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 – “высокие продажи” со значениями:
Yes если продажи больше 8 (тыс. шт.);No в противном случае.# ?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
Таким образом, изменив гиперпараметр, мы ещё немного снизили ошибку прогноза.
Необходимо построить две модели для прогноза на основе дерева решений:
* для непрерывной зависимой переменной; * для категориальной зависимой переменной.
Данные и переменные указаны в таблице с вариантами.
Ядро генератора случайных чисел – номер варианта.
Задания Для каждой модели:
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}\) | остальные | бустинг |
Источники