Я хочу программно протестировать одно правило, сгенерированное из дерева. В деревьях путь между корнем и листовым (конечным узлом )можно интерпретировать как правило.
В R мы могли бы использовать пакет rpart
и сделать следующее:
(В этом посте я буду использовать набор данных iris
, только для примера )
library(rpart)
model <- rpart(Species ~., data=iris)
. С помощью этих двух строк я получил дерево с именем model
, класс которого rpart.object
(rpart
. документация, стр. 21 ). Этот объект содержит много информации и поддерживает различные методы. В частности, объект имеет frame
переменную (, доступ к которой можно получить стандартным способом:model$frame
)(то же)и метод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 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 54 54 5 2 0.00 0 0 2.00000000 0.00000000 49.00000000 5.00000000 0.00000000 0.90740741 0.09259259
7 46 46 1 3 0.01 0 0 3.00000000 0.00000000 1.00000000 45.00000000 0.00000000 0.02173913 0.97826087
Но только помеченные как
в столбце var
являются конечными узлами (. листья). В данном случае это узлы 2, 6 и 7.
Как упоминалось выше, вы можете использовать метод path.rpart
для извлечения правила (. Этот метод используется в пакете rattle
и в статье Кредитный рейтинг Sharma следующим образом:
Дополнительно модель сохраняет значения предсказанного значения в
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
Заранее спасибо
ПРИМЕЧАНИЕ:Этот вопрос был сильно отредактирован для большей ясности