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

questionAnswers(3)

yourAnswerToTheQuestion