Правила тестирования, сгенерированные пакетом Rpart
Я хочу программно протестировать одно правило, сгенерированное из дерева. В деревьях путь между корнем и листом (конечным узлом) можно интерпретировать как правило.
В R мы могли бы использоватьrpart
упакуйте и сделайте следующее:
(В этом посте я буду использоватьiris
набор данных, только для примера)
library(rpart)
model <- rpart(Species ~ ., data=iris)
С этими двумя строками я получил дерево с именемmodel
чей классrpart.object
(rpart
документация, стр. 21). Этот объект содержит много информации и поддерживает различные методы. В частности, объект имеетframe
переменная (к которой можно получить доступ стандартным способом:model$frame
)(idem) и методpath.rpath
(rpart
документация, стр. 7), которая дает вам путь от корневого узла до интересующего узла (node
аргумент в функции)
row.names
изframe
переменная содержит номера узлов дерева.var
столбец дает переменную разбиения в узле,yval
установленное значение иyval2
класс вероятностей и другая информация.
> model$frame
var n wt dev yval complexity ncompete nsurrogate yval2.1 yval2.2 yval2.3 yval2.4 yval2.5 yval2.6 yval2.7
1 Petal.Length 150 150 100 1 0.50 3 3 1.00000000 50.00000000 50.00000000 50.00000000 0.33333333 0.33333333 0.33333333
2 <leaf> 50 50 0 1 0.01 0 0 1.00000000 50.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000
3 Petal.Width 100 100 50 2 0.44 3 3 2.00000000 0.00000000 50.00000000 50.00000000 0.00000000 0.50000000 0.50000000
6 <leaf> 54 54 5 2 0.00 0 0 2.00000000 0.00000000 49.00000000 5.00000000 0.00000000 0.90740741 0.09259259
7 <leaf> 46 46 1 3 0.01 0 0 3.00000000 0.00000000 1.00000000 45.00000000 0.00000000 0.02173913 0.97826087
Но только отмеченные как<leaf>
вvar
столбец терминальные узлы (leafs). В этом случае узлами являются 2, 6 и 7.
Как уже упоминалось выше, вы можете использоватьpath.rpart
метод для извлечения правила (этот метод используется вrattle
пакет и в статьеШарма Кредитный рейтинг, следующее:
Кроме того, модель сохраняет значения прогнозируемого значения в
predicted.levels <- attr(model, "ylevels")
Это значение соответствует столбцуyval
вmodel$frame
набор данных.
Для листа с номером узла 7 (строка № 5) прогнозируемое значение
> ylevels[model$frame[5, ]$yval]
[1] "virginica"
и правило
> rule <- path.rpart(model, nodes = 7)
node number: 7
root
Petal.Length>=2.45
Petal.Width>=1.75
Таким образом, правило можно прочитать как
If Petal.Length >= 2.45 AND Petal.Width >= 1.75 THEN Species = Virginica
Я знаю, что могу проверить (в наборе данных тестирования я снова буду использовать набор данных радужной оболочки), сколько истинных положительных результатов у меня есть для этого правила, поднабора нового набора данных следующим образом
> hits <- subset(iris, Petal.Length >= 2.45 & Petal.Width >= 1.75)
а затем вычисление матрицы путаницы
> table(hits$Species, hits$Species == "virginica")
FALSE TRUE
setosa 0 0
versicolor 1 0
virginica 0 45
(Примечание: я использовал тот же набор данных радужной оболочки, что и при тестировании)
Как я могу оценить правило программным способом? Я мог бы извлечь условия из правила следующим образом
> unlist(rule, use.names = FALSE)[-1]
[1] "Petal.Length>=2.45" "Petal.Width>=1.75"
Но как я могу продолжить отсюда? Я не могу использоватьsubset
функция
заранее спасибо
NOTE: This question has been heavily edited for better clarity