Данные: Auto{ISLR}
## Warning: package 'tree' was built under R version 3.4.4
## Warning: package 'randomForest' was built under R version 3.4.4
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
## Warning: package 'gbm' was built under R version 3.4.4
## Loading required package: survival
## Loading required package: lattice
## Loading required package: splines
## Loading required package: parallel
## Loaded gbm 2.1.3
Загрузим таблицу с данными по 392 автомобилям и добавим к ней переменную High – “Мили на галлон” со значениями:
Убираем переменную name и непрерывный отклик mpg.
##
## Classification tree:
## tree(formula = High ~ . - mpg - name, data = Auto)
## Variables actually used in tree construction:
## [1] "horsepower" "year" "weight" "displacement"
## Number of terminal nodes: 10
## Residual mean deviance: 0.2449 = 93.56 / 382
## Misclassification error rate: 0.05102 = 20 / 392
## node), split, n, deviance, yval, (yprob)
## * denotes terminal node
##
## 1) root 392 451.500 0 ( 0.737245 0.262755 )
## 2) horsepower < 84.5 132 161.900 1 ( 0.303030 0.696970 )
## 4) year < 76.5 51 67.350 0 ( 0.627451 0.372549 )
## 8) weight < 2091 22 23.580 1 ( 0.227273 0.772727 )
## 16) displacement < 90.5 15 7.348 1 ( 0.066667 0.933333 ) *
## 17) displacement > 90.5 7 9.561 0 ( 0.571429 0.428571 ) *
## 9) weight > 2091 29 14.560 0 ( 0.931034 0.068966 ) *
## 5) year > 76.5 81 52.220 1 ( 0.098765 0.901235 )
## 10) weight < 2255 58 0.000 1 ( 0.000000 1.000000 ) *
## 11) weight > 2255 23 29.720 1 ( 0.347826 0.652174 ) *
## 3) horsepower > 84.5 260 91.110 0 ( 0.957692 0.042308 )
## 6) year < 79.5 227 12.850 0 ( 0.995595 0.004405 )
## 12) year < 78.5 208 0.000 0 ( 1.000000 0.000000 ) *
## 13) year > 78.5 19 7.835 0 ( 0.947368 0.052632 ) *
## 7) year > 79.5 33 40.490 0 ( 0.696970 0.303030 )
## 14) displacement < 137 10 12.220 1 ( 0.300000 0.700000 )
## 28) displacement < 115.5 5 6.730 0 ( 0.600000 0.400000 ) *
## 29) displacement > 115.5 5 0.000 1 ( 0.000000 1.000000 ) *
## 15) displacement > 137 23 17.810 0 ( 0.869565 0.130435 ) *
Теперь построим дерево на обучающей выборке и оценим ошибку на тестовой.
## High.test
## tree.pred 0 1
## 0 132 9
## 1 10 45
## [1] 0.9030612
Доля верных прогнозов: 0.9030612.
Теперь обрезаем дерево, используя в качестве критерия частоту ошибок классификации. Функция cv.tree() проводит кросс-валидацию для выбора лучшего дерева, аргумент prune.misclass означает, что мы минимизируем ошибку классификации.
## [1] "size" "dev" "k" "method"
## $size
## [1] 8 6 4 3 2 1
##
## $dev
## [1] 22 22 17 21 31 49
##
## $k
## [1] -Inf 0.0 1.5 6.0 10.0 23.0
##
## $method
## [1] "misclass"
##
## attr(,"class")
## [1] "prune" "tree.sequence"
Как видно на графике слева, минимум частоты ошибок достигается при числе узлов 4. Оценим точность дерева с 4 узлами.
## High.test
## tree.pred 0 1
## 0 136 11
## 1 6 43
## [1] 0.9132653
Теперь точность выше, чем в предыдущем случае: 0.9132653.
Построим дерево регрессии для зависимой переменной mpg: мили на галлон. Также теперь не учитываем переменную High, с которой мы ранее имели дело, не забывая исключить переменную name.
##
## Regression tree:
## tree(formula = mpg ~ . - name - High, data = Auto, subset = train)
## Variables actually used in tree construction:
## [1] "displacement" "horsepower" "year" "weight"
## Number of terminal nodes: 7
## Residual mean deviance: 9.306 = 1759 / 189
## Distribution of residuals:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -9.06700 -1.55500 -0.06667 0.00000 1.48800 10.99000
Снова сделаем обрезку дерева в целях улучшения качества прогноза.
В данном случаем минимум ошибки соответствует самому сложному дереву, с 7 узлами. Покажем, как при желании можно обрезать дерево до 6 узлов (ошибка ненамного выше, чем минимальная).
Прогноз сделаем по необрезанному дереву, т.к. там ошибка, оцененная по методу перекрёстной проверки, минимальна.
## [1] 14.29394
MSE на тестовой выборке равна 14.29394(мили на галлон).