Najpierw chciałbym wyjaśnić, co faktycznie mierzy wskaźnik ważności.
MeanDecreaseGini jest miarą o różnym znaczeniu opartym na wskaźniku zanieczyszczenia Gini stosowanym do obliczania podziałów podczas treningu. Powszechnym nieporozumieniem jest to, że metryka o zmiennym znaczeniu odnosi się do Giniego używanego do zapewnienia wydajności modelu, która jest ściśle związana z AUC, ale jest to błędne. Oto wyjaśnienie z pakietu randomForest napisanego przez Breimana i Cutlera:
Znaczenie Gini
Za każdym razem, gdy dokonuje się podziału węzła na zmiennej m, kryterium zanieczyszczenia gini dla dwóch potomnych węzłów jest mniejsze niż węzeł nadrzędny. Zsumowanie spadków gini dla każdej pojedynczej zmiennej we wszystkich drzewach w lesie daje szybkie znaczenie zmiennej, które często jest bardzo spójne z miarą ważności permutacji.
Wskaźnik zanieczyszczenia Giniego jest zdefiniowana jako
G = ∑i = 1ndopja( 1 - pja)
ndopja
W przypadku problemu dwóch klas powoduje to następującą krzywą, która jest zmaksymalizowana dla próbki 50-50 i zminimalizowana dla zestawów jednorodnych:
Ważność jest następnie obliczana jako
ja= Gp a r e n t- Gs p l i t 1- Gs p l i t 2
E [ E [X| Y] ] = E [X]
Teraz, aby bezpośrednio odpowiedzieć na twoje pytanie nie tak proste, jak tylko podsumowując wszystkie importances w każdej grupie, aby uzyskać łączną MeanDecreaseGini ale obliczenia średniej ważonej będzie Ci odpowiedź szukasz. Musimy tylko znaleźć zmienne częstotliwości w każdej grupie.
Oto prosty skrypt, aby pobrać je z losowego obiektu lasu w R:
var.share <- function(rf.obj, members) {
count <- table(rf.obj$forest$bestvar)[-1]
names(count) <- names(rf.obj$forest$ncat)
share <- count[members] / sum(count[members])
return(share)
}
Wystarczy podać nazwy zmiennych w grupie jako parametr członkowie.
Mam nadzieję, że to odpowiada na twoje pytanie. Potrafię napisać funkcję, aby uzyskać bezpośrednio ważność grupy, jeśli jest to interesujące.
EDYCJA:
Oto funkcja, która nadaje grupie znaczenie nadane randomForest
obiektowi i liście wektorów o nazwach zmiennych. Używa var.share
jak wcześniej zdefiniowano. Nie sprawdziłem danych wejściowych, dlatego musisz upewnić się, że używasz odpowiednich nazw zmiennych.
group.importance <- function(rf.obj, groups) {
var.imp <- as.matrix(sapply(groups, function(g) {
sum(importance(rf.obj, 2)[g, ]*var.share(rf.obj, g))
}))
colnames(var.imp) <- "MeanDecreaseGini"
return(var.imp)
}
Przykład użycia:
library(randomForest)
data(iris)
rf.obj <- randomForest(Species ~ ., data=iris)
groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"),
Petal=c("Petal.Width", "Petal.Length"))
group.importance(rf.obj, groups)
>
MeanDecreaseGini
Sepal 6.187198
Petal 43.913020
Działa również w przypadku nakładających się grup:
overlapping.groups <- list(Sepal=c("Sepal.Width", "Sepal.Length"),
Petal=c("Petal.Width", "Petal.Length"),
Width=c("Sepal.Width", "Petal.Width"),
Length=c("Sepal.Length", "Petal.Length"))
group.importance(rf.obj, overlapping.groups)
>
MeanDecreaseGini
Sepal 6.187198
Petal 43.913020
Width 30.513776
Length 30.386706