Правила тестирования, сгенерированные пакетом 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

Ответы на вопрос(3)

Ваш ответ на вопрос