最初に、重要度メトリックが実際に測定するものを明確にしたいと思います。
MeanDecreaseGiniは、トレーニング中のスプリットの計算に使用されるGini不純物インデックスに基づく変数の重要度の尺度です。一般的な誤解は、変数重要度メトリックが、AUCに密接に関連するモデルのパフォーマンスをアサートするために使用されるGiniを参照することですが、これは間違っています。以下は、BreimanとCutlerによって書かれたrandomForestパッケージの説明です。
Giniの重要性
変数mでノードの分割が行われるたびに、2つの子孫ノードのGini不純物基準は親ノードよりも小さくなります。フォレスト内のすべてのツリーの個々の変数ごとにginiの減少を加算すると、順列重要度の尺度と非常に一貫性のある変数の重要度が速くなります。
ジニ不純物指数はのように定義される
ここで、N Cはターゲット変数とのクラスの数であり、P iは、このクラスの比です。
G=∑i=1ncpi(1−pi)
ncpi
2クラスの問題の場合、これにより、50〜50のサンプルで最大化され、同種のセットで最小化される次の曲線が得られます。

次に、重要度は次のように計算されます
は、問題の予測子を含むフォレスト内のすべての分割にわたって平均されます。これは平均であるため、グループに含まれる変数のすべての分割で平均するように簡単に拡張できます。
I=Gparent−Gsplit1−Gsplit2
E[E[X|Y]]=E[X]
質問に直接答えるには、各グループのすべての重要度を合計してMeanDecreaseGiniを合計するだけではなく、加重平均を計算することで、求めている答えが得られます。各グループ内の可変周波数を見つける必要があります。
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