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

(참조 항상 환영합니다)


이 질문은 stats.stackexchange.com/questions/5443/… 과 어떻게 다릅니 ?
steffen

이 질문은 어떤 예측 변수가 종속 변수의 특정 범주 값과 관련이 있는지를 나타냅니다. 이 질문은 더 광범위합니다 (효과가 어떤 명목 값에 영향을 미치는지 감지하지 않고 변수 중요도 / 순위 지정). 그 질문에 대답하지 않았기 때문에 누군가가 ... 도울 수있을지도 모른다는 희망에서 더 일반적인 방법으로 그것을 표현 그것에 가치를 생각
탈 Galili 한에게

답변:


42

변수 중요도는 일반적으로 관심있는 예측 변수가 제거 될 때 (임의의 포리스트와 같은 순열 기법을 사용하여) 또는 노드 불순물 감소를 측정 할 때 예측 정확도의 해당 감소를 기반으로 계산 될 수 있지만 개요는 (1)을 참조하십시오. 사용 가능한 방법. CART의 확실한 대안은 물론 RF입니다 ( randomForest 이지만 party 참조 ). RF를 사용하면 Gini 중요도 지수는 포리스트의 모든 트리에서 평균 노드 불순물 감소로 정의됩니다 (지정된 상위 노드의 Gini 불순물 지수가 두 노드에 대한 해당 측정 값보다 크다는 사실에 따릅니다) 도터 노드, 예를 들어 (2) 참조).

나는 Carolin Strobl과 coll. RF 및 CART에서 (조건부) 변수 중요도에 대한 많은 시뮬레이션 및 실험적 연구에 기여했습니다 (예 : (3-4). 그러나 다른 많은 것들 또는 그녀의 논문, 기계 학습의 통계적 문제 – 신뢰할 수있는 분할 선택을 향한 변수 중요성 측정 ).

내가 알기로는, 캐럿 패키지 (5)는 회귀 사건에 대한 손실 함수 (즉, 평균 제곱 오차) 만 고려합니다. 가까운 시일 내에 추가 될 수도 있습니다 dotPlot.

그러나 Noel M O'Boyle은 CART에서 Variable 중요성에 대한 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()에서 랜덤 포레스트는 acccuracy의 평균 deacrease 및 평균 지니 감소 개별 변수의 중요성을 수행합니다.
Zhubarb

3

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 트리 "fit"에 대한 중요도 점수를 생성합니다.

 varImp(fit)

감사. Max에 버그를보고 했습니까? (캐럿 패키지의 관리자)
Tal Galili

1

나는 chl이 첫 번째 부분에 거의 대답했다고 생각합니다.

CART 모델에 참여하는 변수의 변수 중요도 순위를 매기거나 측정하기 위해 어떤 일반적인 측정이 있습니까?

질문의 두 번째 부분과 관련하여 :

R을 사용하여 어떻게 계산할 수 있습니까 (예 : rpart 패키지를 사용하는 경우)

rpart를 사용하여 summary (fit)를 사용하여 변수 중요도를 찾을 수 있습니다. 이것은 여러 가지 중에서 변수의 중요성을 출력합니다. 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.