CARTを使用する際の「変数重要度」の測定/ランク付け方法 (具体的にはRの{rpart}を使用)


27

rpart(R内)を使用してCARTモデル(特に分類ツリー)を構築する場合、モデルに導入されたさまざまな変数の重要性を知ることはしばしば興味深いです。

したがって、私の質問は次のとおりです。CARTモデルの参加変数の変数の重要度をランク付け/測定するための一般的な尺度何ですか?Rを使用してこれをどのように計算できますか(たとえば、rpartパッケージを使用する場合)

たとえば、ダミーコードを作成して、ソリューションを示します。この例は、変数x1とx2が「重要」であり、(ある意味では)x1がx2よりも重要であることを明確にするように構造化されています(x1はより多くのケースに適用されるため、データの構造により大きな影響を与えるため、次にx2)。

set.seed(31431)
n <- 400
x1 <- rnorm(n)
x2 <- rnorm(n)
x3 <- rnorm(n)
x4 <- rnorm(n)
x5 <- rnorm(n)

X <- data.frame(x1,x2,x3,x4,x5)

y <- sample(letters[1:4], n, T)
y <- ifelse(X[,2] < -1 , "b", y)
y <- ifelse(X[,1] < 0 , "a", y)

require(rpart)
fit <- rpart(y~., X)
plot(fit); text(fit)

info.gain.rpart(fit) # your function - telling us on each variable how important it is

(参照は常に歓迎されます)



その質問は、従属変数の特定のカテゴリ値に関連する予測変数を知ることを指します。この質問はより広範です(変数の重要度/ランク付けは、どの公称値に影響するかを検出せずに)。その質問は...私は、誰かが助けることができるかもしれないと期待して、より一般的な方法でフレーズそれにそれは価値が考え答えていなかったので
タルGalili

回答:


42

通常、変数の重要度は、対象の予測子が削除されたときの予測精度の対応する低下に基づいて計算される場合があります(ランダムフォレストのような置換手法を使用)またはノードの不純物の減少の何らかの尺度ですが、概要については(1)を参照してください利用可能なメソッド。CARTの明らかな代替手段はもちろんRFです(randomForestですが、partyも参照してください)。RFでは、Gini重要度インデックスは、フォレスト内のすべてのツリーでのノード不純物の平均Gini減少として定義されます(特定の親ノードのGini不純物インデックスが、その2つのメジャーの値よりも大きいという事実に基づきます)ドーターノード、例えば(2)を参照)。

キャロリン・ストロブルと同僚。RFとCARTの(条件付き)変数の重要性に関する多くのシミュレーションと実験研究に貢献しました(例(3-4)が、他にも多くのもの、または彼女の論文、機械学習の統計的問題–信頼できる分割選択と変数の重要度の測定)。

私の知る限り、キャレットパッケージ(5)は、回帰の場合の損失関数(平均二乗誤差)のみを考慮しています。近い将来追加されるかもしれません(とにかく、k-NNによる分類ケースの例は、のオンラインヘルプで利用可能ですdotPlot)。

ただし、Noel M O'Boyleには、CARTの可変重要度の Rコードがいくつかあるようです。

参照資料

  1. サンドリとズッコロット。分類木におけるGini変数重要度尺度のバイアス補正アルゴリズム。2008年
  2. アイゼンマン。現代の多変量統計手法。スプリンガー2008
  3. Strobl、Hothorn、およびZeilis。パーティー!Rジャーナル 2009 1/2
  4. Strobl、Boulesteix、Kneib、Augustin、およびZeilis。ランダムフォレストの条件変数の重要性BMC Bioinformatics 2008、9:307
  5. クーン キャレットパッケージを使用したRでの予測モデルの構築JSS 2008 28(5)

1
本当に-それが持っているよりもはるかに多くの票に値する。
マットパーカー

+1がすばらしい答えです。またimportance()randomForestのレイトカマー(私のような)の更新では、個々の変数の重要度は平均精度が低下し、平均ジニは減少します。
ジュバル

3

次の関数(Caretパッケージから)は、rpartツリーで変数の重要度を評価するために使用できます。これがツリーの唯一のルートノードであるときのCaret関数のバグを修正しました。

varImp <- function(object, surrogates = FALSE, competes = TRUE, ...)
  {
tmp <- rownames(object$splits)

 allVars <- colnames(attributes(object$terms)$factors)
if(is.null(tmp))
  {
  out<-NULL
    zeros <- data.frame(x = rep(0, length(allVars)),
                        Variable = allVars)
    out <- rbind(out, zeros)
  }

else {

rownames(object$splits) <- 1:nrow(object$splits)
splits <- data.frame(object$splits)
    splits$var <- tmp
splits$type <- ""

frame <- as.data.frame(object$frame)
    index <- 0
    for(i in 1:nrow(frame))
      {
        if(frame$var[i] != "<leaf>")
          {
            index <- index + 1
            splits$type[index] <- "primary"
            if(frame$ncompete[i] > 0)
              {
                for(j in 1:frame$ncompete[i])
                  {
                    index <- index + 1
                    splits$type[index] <- "competing"
                  }
              }
            if(frame$nsurrogate[i] > 0)
              {
                for(j in 1:frame$nsurrogate[i])
                  {
                    index <- index + 1
                    splits$type[index] <- "surrogate"
                  }
              }
          }
      }
    splits$var <- factor(as.character(splits$var))
    if(!surrogates) splits <- subset(splits, type != "surrogate")
    if(!competes) splits <- subset(splits, type != "competing")
    out <- aggregate(splits$improve,
                 list(Variable = splits$var),
                 sum,
                 na.rm = TRUE)

allVars <- colnames(attributes(object$terms)$factors)
if(!all(allVars %in% out$Variable))
      {
        missingVars <- allVars[!(allVars %in% out$Variable)]
        zeros <- data.frame(x = rep(0, length(missingVars)),
                            Variable = missingVars)
        out <- rbind(out, zeros)
      }
    }
    out2 <- data.frame(Overall = out$x)
rownames(out2) <- out$Variable
out2

}

次のrコードは、rpartツリー「適合」の重要度スコアを生成します

 varImp(fit)

ありがとう。バグをMaxに報告しましたか?(キャレットパッケージのメンテナー)
タルガリリ

1

chlは最初の部分にほぼ答えていると思います。

CARTモデルの参加変数の変数の重要度をランク付け/測定するための一般的な尺度は何ですか?

質問の2番目の部分に関して:

Rを使用してこれをどのように計算できますか(たとえば、rpartパッケージを使用する場合)

summary(fit)を使用して、rpartを使用して変数の重要度を見つけることができます。これは、他のいくつかの間で変数の重要度を出力します。詳細については、https//cran.r-project.org/web/packages/rpart/rpart.pdfをご覧ください。25ページを参照してください。


0

names(result) ショー variable.importance

result$variable.importance 助けるべきですか?


3
質問は、特定のメソッドのRで利用可能なものを印刷する方法よりも、変数の重要性のいくつかの尺度の利点または人気に関係していると思います。
chl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.