먼저 중요성 측정 항목이 실제로 측정하는 내용을 명확히하고 싶습니다.
MeanDecreaseGini 는 훈련 중 분할 계산에 사용되는 Gini 불순물 지수를 기반으로하는 변수 중요도의 측정 값입니다. 일반적인 오해는 변수 중요도 메트릭이 AUC와 밀접한 관련이있는 모델 성능을 주장하는 데 사용되는 Gini를 참조하지만 이는 잘못된 것입니다. Breiman과 Cutler가 작성한 randomForest 패키지의 설명은 다음과 같습니다.
중요도
변수 m에서 노드 분할이 이루어질 때마다 두 하위 노드에 대한 지니 불순물 기준은 상위 노드보다 작습니다. 포리스트의 모든 트리에서 각 개별 변수에 대해 gini 감소를 더하면 순열 중요도 측정과 매우 일치하는 빠른 변수 중요도가 제공됩니다.
G=∑i=1ncpi(1−pi)
ncpi
2 클래스 문제의 경우 50-50 샘플에 대해 최대화되고 균질 세트에 대해 최소화되는 다음 곡선이 생성됩니다.
I=Gparent−Gsplit1−Gsplit2
E[E[X|Y]]=E[X]
지금, 당신의 질문에 대답하는 것은 직접적으로는 하지 만 결합 MeanDecreaseGini를 얻기 위해 각 그룹의 모든 importances을 합산하지만, 당신에게 당신이 찾고있는 해답을 얻을 것이다 가중 평균을 계산 한 간단하게. 각 그룹 내에서 가변 주파수를 찾아야합니다.
다음은 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)
}
그룹의 변수 이름을 members 매개 변수로 전달하십시오.
이것이 귀하의 질문에 답변되기를 바랍니다. 관심이 있다면 그룹 중요도를 직접 얻는 함수를 작성할 수 있습니다.
편집 :
다음은 randomForest
객체와 변수 이름이있는 벡터 목록이 주어진 그룹 중요도를 제공하는 함수입니다 . var.share
이전에 정의한대로 사용합니다 . 입력 검사를 수행하지 않았으므로 올바른 변수 이름을 사용해야합니다.
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)
}
사용 예 :
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
또한 그룹이 겹치는 경우에도 작동합니다.
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