В практических примерах ниже показано как:
Модели: деревья решений.
Данные: 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}\) | остальные | бустинг |
Источники