Reguły testowania generowane przez pakiet Rpart
Chcę programowo przetestować jedną regułę wygenerowaną z drzewa. W drzewach ścieżka między korzeniem a liściem (węzeł końcowy) może być z reguły interpretowana.
W R możemy użyćrpart
pakiet i wykonaj następujące czynności: (W tym poście użyjęiris
zestaw danych tylko na przykład)
library(rpart)
model <- rpart(Species ~ ., data=iris)
Z tymi dwoma liniami mam drzewo o nazwiemodel
, którego klasą jestrpart.object
(rpart
dokumentacja, strona 21). Ten obiekt ma wiele informacji i obsługuje różne metody. W szczególności obiekt maframe
zmienna (do której można uzyskać dostęp w standardowy sposób:model$frame
) (ten sam) i metodapath.rpath
(rpart
dokumentacja, strona 7), która podaje ścieżkę od węzła głównego do węzła zainteresowania (node
argument w funkcji)
Therow.names
zframe
zmienna zawiera numery węzłów drzewa. Thevar
kolumna podaje podzieloną zmienną w węźle,yval
dopasowana wartość iyval2
prawdopodobieństwa klasy i inne informacje.
> 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
Ale tylko oznaczone jako<leaf>
wvar
kolumna to węzły końcowe (liście). W tym przypadku węzły to 2, 6 i 7.
Jak wspomniano powyżej, możesz użyćpath.rpart
metoda wyodrębnienia reguły (ta technika jest używana wrattle
pakiet i artykułSharma Credit Score, w następujący sposób:
Ponadto model zachowuje wartości przewidywanej wartości w
predicted.levels <- attr(model, "ylevels")
Ta wartość odpowiada kolumnieyval
wmodel$frame
zbiór danych.
Dla liścia z węzłem numer 7 (wiersz numer 5) przewidywana wartość wynosi
> ylevels[model$frame[5, ]$yval]
[1] "virginica"
a reguła jest
> rule <- path.rpart(model, nodes = 7)
node number: 7
root
Petal.Length>=2.45
Petal.Width>=1.75
Tak więc reguła może być odczytana jako
If Petal.Length >= 2.45 AND Petal.Width >= 1.75 THEN Species = Virginica
Wiem, że mogę przetestować (w zestawie danych testowych, użyję ponownie zestawu danych tęczówki), ile prawdziwych pozytywów mam dla tej reguły, dzieląc nowy zestaw danych w następujący sposób
> hits <- subset(iris, Petal.Length >= 2.45 & Petal.Width >= 1.75)
a następnie obliczenie macierzy zamieszania
> table(hits$Species, hits$Species == "virginica")
FALSE TRUE
setosa 0 0
versicolor 1 0
virginica 0 45
(Uwaga: użyłem tego samego zestawu danych przysłony co testowanie)
Jak mogę ocenić regułę w sposób programowy? Mogę wyodrębnić warunki z reguły w następujący sposób
> unlist(rule, use.names = FALSE)[-1]
[1] "Petal.Length>=2.45" "Petal.Width>=1.75"
Ale jak mogę kontynuować stąd? Nie mogę użyćsubset
funkcjonować
Z góry dziękuję
UWAGA: To pytanie zostało mocno zredagowane dla lepszej przejrzystości