Как выполнить упаковку в r (шаг за шагом)
Когда мы создаем дерево решений для данного набора данных, мы используем только один набор обучающих данных для построения модели.
Однако недостатком использования единого дерева решений является то, что оно склонно к высокой дисперсии . То есть, если мы разделим набор данных на две половины и применим дерево решений к обеим половинам, результаты могут сильно отличаться.
Один из методов, который мы можем использовать для уменьшения дисперсии одного дерева решений, известен как пакетирование , иногда его называют бутстрап-агрегированием .
Багажирование работает следующим образом:
1. Возьмите b самозагружаемых выборок из исходного набора данных.
2. Создайте дерево решений для каждого образца начальной загрузки.
3. Усредните прогнозы каждого дерева, чтобы получить окончательную модель.
Построив сотни или даже тысячи отдельных деревьев решений и взяв средние прогнозы для всех деревьев, мы часто получаем модель «подогнанного мешка», которая дает гораздо меньший уровень ошибок при тестировании по сравнению с одним деревом решений.
В этом руководстве представлен пошаговый пример создания упакованной модели в R.
Шаг 1. Загрузите необходимые пакеты
Сначала мы загрузим необходимые пакеты для этого примера:
library (dplyr) #for data wrangling library (e1071) #for calculating variable importance library (caret) #for general model fitting library (rpart) #for fitting decision trees library (ipred) #for fitting bagged decision trees
Шаг 2. Установите модель в мешке.
В этом примере мы будем использовать встроенный набор данных R под названием « Качество воздуха» , который содержит измерения качества воздуха в Нью-Йорке за 153 отдельных дня.
#view structure of air quality dataset
str(airquality)
'data.frame': 153 obs. of 6 variables:
$ Ozone: int 41 36 12 18 NA 28 23 19 8 NA ...
$Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
$ Wind: num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
$ Temp: int 67 72 74 62 56 66 65 59 61 69 ...
$Month: int 5 5 5 5 5 5 5 5 5 5 ...
$Day: int 1 2 3 4 5 6 7 8 9 10 ...
Следующий код показывает, как подогнать упакованную модель в R с помощью функции Bagging() из библиотеки ipred .
#make this example reproducible set.seed(1) #fit the bagged model bag <- bagging( formula = Ozone ~ ., data = airquality, nbagg = 150 , coob = TRUE , control = rpart. control (minsplit = 2 , cp = 0 ) ) #display fitted bagged model bag Bagging regression trees with 150 bootstrap replications Call: bagging.data.frame(formula = Ozone ~ ., data = airquality, nbagg = 150, coob = TRUE, control = rpart.control(minsplit = 2, cp = 0)) Out-of-bag estimate of root mean squared error: 17.4973
Обратите внимание, что мы решили использовать 150 загрузочных выборок для построения пакетной модели и указали, что coob имеет значение TRUE , чтобы получить расчетную ошибку вне пакета.
Мы также использовали следующие спецификации в функции rpart.control() :
- minsplit = 2: это указывает модели, что для разделения требуется только 2 наблюдения в узле.
- сп = 0 . Это параметр сложности. Установив его равным 0, мы не требуем от модели возможности каким-либо образом улучшить общую подгонку для выполнения разделения.
По сути, эти два аргумента позволяют отдельным деревьям расти чрезвычайно глубоко, что приводит к появлению деревьев с высокой дисперсией, но с низким смещением. Затем, когда мы применяем пакетирование, мы можем уменьшить дисперсию окончательной модели, сохраняя при этом низкую погрешность.
Из результатов модели мы видим, что расчетное RMSE вне сумки составляет 17,4973 . Это средняя разница между прогнозируемым значением содержания озона и фактическим наблюдаемым значением.
Шаг 3. Визуализируйте важность предикторов
Хотя пакетные модели, как правило, дают более точные прогнозы, чем отдельные деревья решений, трудно интерпретировать и визуализировать результаты подобранных пакетных моделей.
Однако мы можем визуализировать важность переменных-предикторов, рассчитав общее уменьшение RSS (остаточной суммы квадратов) из-за распределения по данному предиктору, усредненного по всем деревьям. Чем больше значение, тем важнее предиктор.
В следующем коде показано, как создать график важности переменной для модели подходящей сумки, используя функцию varImp() из библиотеки курсоров :
#calculate variable importance VI <- data.frame(var= names (airquality[,-1]), imp= varImp (bag)) #sort variable importance descending VI_plot <- VI[ order (VI$Overall, decreasing= TRUE ),] #visualize variable importance with horizontal bar plot barplot(VI_plot$Overall, names.arg= rownames (VI_plot), horiz= TRUE , col=' steelblue ', xlab=' Variable Importance ')
Мы видим, что Solar.R — самая важная переменная-предиктор в модели, а Месяц — наименее важная.
Шаг 4. Используйте модель для прогнозирования
Наконец, мы можем использовать модель «подогнанного мешка» для прогнозирования новых наблюдений.
#define new observation new <- data.frame(Solar.R=150, Wind=8, Temp=70, Month=5, Day=5) #use fitted bagged model to predict Ozone value of new observation predict(bag, newdata=new) 24.4866666666667
На основе значений переменных-предсказателей модель подходящего мешка предсказывает, что значение озона в этот конкретный день составит 24 487 .
Полный R-код, использованный в этом примере, можно найти здесь .