Rのランダムフォレスト分類における一連の予測変数の相対的重要性


31

randomForestRの分類モデルに対する変数セットの相対的な重要度を決定したいのですが、importance関数はMeanDecreaseGini個々の予測変数のメトリックを提供します。セット内の各予測変数でこれを合計するのと同じくらい簡単ですか?

例えば:

# Assumes df has variables a1, a2, b1, b2, and outcome
rf <- randomForest(outcome ~ ., data=df)
importance(rf)
# To determine whether the "a" predictors are more important than the "b"s,
# can I sum the MeanDecreaseGini for a1 and a2 and compare to that of b1+b2?

回答:


46

最初に、重要度メトリックが実際に測定するものを明確にしたいと思います。

MeanDecreaseGiniは、トレーニング中のスプリットの計算に使用されるGini不純物インデックスに基づく変数の重要度の尺度です。一般的な誤解は、変数重要度メトリックが、AUCに密接に関連するモデルのパフォーマンスをアサートするために使用されるGiniを参照することですが、これは間違っています。以下は、BreimanとCutlerによって書かれたrandomForestパッケージの説明です。

Giniの重要性
変数mでノードの分割が行われるたびに、2つの子孫ノードのGini不純物基準は親ノードよりも小さくなります。フォレスト内のすべてのツリーの個々の変数ごとにginiの減少を加算すると、順列重要度の尺度と非常に一貫性のある変数の重要度が速くなります。

ジニ不純物指数はのように定義される ここで、N Cはターゲット変数とのクラスの数であり、P iは、このクラスの比です。

G=i=1ncpi(1pi)
ncpi

2クラスの問題の場合、これにより、50〜50のサンプルで最大化され、同種のセットで最小化される次の曲線が得られます。 2クラスのジニ不純物

次に、重要度は次のように計算されます は、問題の予測子を含むフォレスト内のすべての分割にわたって平均されます。これは平均であるため、グループに含まれる変数のすべての分割で平均するように簡単に拡張できます。

I=GparentGsplit1Gsplit2

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

明確で厳密な答えをありがとう!グループの重要度に関数を追加してもかまわないなら、それは素晴らしいことです。
マックスゲニス14

その答えをありがとう!少し時間があれば、2つの質問:(1)重要度は次のように計算されます...:Breimanの定義に関して、私はそこに「ジニ減少」であり、重要性が減少の合計となり、正しいです?(2)問題の予測子が関係するフォレスト内のすべての分割の平均:これを、その特定の機能の分割が関係するすべてのノードに置き換えることはできますか?私が完全に理解できるように;)
レミメリソン14

1
あなたはコメントで定義についてもう少し考えさせられたので、Rで使用されているrandomForestコードを掘り下げて適切に答えました。正直に言うと、少し離れています。平均は、すべてのノードではなく、すべての木で行われます。時間があればすぐに回答を更新します。今のところ、あなたの質問に対する答えは次のとおりです。(1)はい。これは、ツリーレベルでの定義方法です。減少の合計は、すべてのツリーで平均されます。(2)はい、それは私が言いたいことでしたが、実際には成り立ちません。
しばらく

4

上記のG = sum over classes [pi(1-pi)]として定義されている関数は、実際にはエントロピーです。これは、スプリットを評価する別の方法です。子ノードと親ノードのエントロピーの違いは情報ゲインです。GINIの不純関数は、G = 1-クラスの合計[pi ^ 2]です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.