R의 randomForest는 32 개 이상의 레벨을 처리 할 수 ​​없습니다. 해결 방법은 무엇입니까?


22

R의 randomForest 패키지는 32 개 이상의 레벨을 가진 요인을 처리 할 수 ​​없습니다. 32 개 이상의 레벨이 제공되면 오류 메시지가 나타납니다.

범주가 32 개 이상인 범주 형 예측 변수를 처리 할 수 ​​없습니다.

그러나 내가 가지고있는 데이터에는 몇 가지 요소가 있습니다. 그들 중 일부는 1000 + 레벨을 가지고 있고 일부는 100 +를 가지고 있습니다. 미국의 '상태'는 52입니다.

자, 여기 내 질문이 있습니다.

  1. 왜 그런 제한이 있습니까? randomForest는 간단한 경우에도 실행을 거부합니다.

    > d <- data.frame(x=factor(1:50), y=1:50)
    > randomForest(y ~ x, data=d)
      Error in randomForest.default(m, y, ...) : 
      Can not handle categorical predictors with more than 32 categories.
    

    단순히 메모리 제한으로 인해 scikit learn의 randomForeestRegressor가 32 개 이상의 레벨로 실행될 수있는 방법은 무엇입니까?

  2. 이 문제를 처리하는 가장 좋은 방법은 무엇입니까? X1, X2, ..., X50 독립 변수가 있고 Y가 종속 변수라고 가정하십시오. 그리고 X1, X2 및 X3의 레벨이 32 개 이상이라고 가정하십시오. 어떻게해야합니까?

    내가 생각하고있는 것은 거리가 Y의 차이로 정의되는 X1, X2 및 X3 각각에 대해 클러스터링 알고리즘을 실행하는 것입니다. 문제가있는 세 가지 변수가 있으므로 3 개의 클러스터링을 실행합니다. 그리고 각 군집에서 비슷한 수준을 찾을 수 있기를 바랍니다. 그리고 그것들을 합칠 것입니다.

    이 소리는 어때?


패키지 이름과 오류 메시지로 웹을 검색하면 몇 가지 답변이 제공됩니다.
Roland

5
@Roland 실제로 그것은 나를 여기로 이끈다…
isomorphismes

1
여러 차원의 데이터에 대한 프로그래밍 경험이있는 여러 통계적 사고데이터 과학 자체 를 사용해 볼 수 있습니다 .
aeroNotAuto

2
업데이트 : 버전 4.6-9부터 randomForest최대 53 개의 수준으로 범주 형 예측 변수를 처리 할 수 ​​있습니다. 뉴스
Ben

R의 임의 포리스트는 레벨 수를 어떻게 결정합니까? 레벨은 카테고리를 의미한다고 생각합니다.
ajp

답변:


25

수준 의 요인에 대한 분할 이 실제로 2 N - 2 가능한 조합 중 하나의 선택 이므로 실제로는 상당히 합리적인 제약 입니다. 따라서 25 와 같은 N을 사용 하더라도 조합의 공간은 너무 커서 그러한 추론은 사소한 의미가 있습니다.22

다른 옵션은 표현을 변경하는 것입니다. 결과는 주 개체에 직접적으로 의존하지 않지만 지역, 인구, 1 인당 소나무 수 또는 정보 시스템에 대신 연결할 수있는 기타 속성과 같은 것입니다.

또한 각 주가 분리되고 상관되지 않은 독립 체이기 때문에 별도의 모델이 필요합니다.

의사 결정을 기반으로 한 클러스터링은 아마도 결정에서 정보를 밀착시켜 종종 과잉 맞춤으로 끝나기 때문에 나쁜 생각 일 것입니다.


4
약간 지루한 방식으로 쉽게 이동할 수 있습니다. 예를 들어 레벨이 33에서 1024 사이 인 경우 각각 <= 32 레벨의 두 가지 요인을 만듭니다.
KalEl

15

가장 큰 이유는 randomForest가 구현되는 방식입니다. R의 구현은 원래 Breiman의 사양을 많이 따릅니다. 여기서 유의해야 할 것은 요인 / 범주 형 변수의 경우 분할 기준은 왼쪽에 일부 레이블 값이 있고 오른쪽에 나머지 레이블 값이있는 이진입니다.

01[0;21]

왜 Weka와 Python의 구현이 작동합니까?

weka 구현은 기본적으로 CART 트리를 사용하지 않습니다. 범주 형 입력의 경우 각 레벨 값마다 하나씩 여러 노드로 분할되므로이 계산 문제가없는 C45 트리를 사용합니다.

파이썬 랜덤 포레스트 구현은 categorical / factor 변수를 사용할 수 없습니다. 해당 변수를 더미 또는 숫자 변수로 인코딩해야합니다.


2
고마워요! 범주 값을 처리하기위한 R의 구현이 파이썬의 구현보다 우수하다는 답변을 따랐습니다 (Max Kuhn은 RF에 대한 범주 변수를 그룹화하는 것이 그보다 희미한 결과보다 약간 더 나은 결과를 제공한다고 언급했습니다). 파이썬 다른 결과 (정확도 등)를 얻을 수있는 좋은 기회가 있습니까? 경험을 바탕으로 모델링 할 때 var를 그룹화하고 (R로) 두껍게 한 다음 두 가지 접근법을 비교하는 것이 합리적입니까?
Sergey Bushmanov

2
더미 인코딩은 작동하지만 하나의 범주 만 생성 할 수 있습니다. 인코딩 후 변수는 한 번에 한 번 테스트됩니다. 따라서 투잉을 구현하는 것은 불가능합니다. 이 기능이 도움이 될 수 있다면 실제로 큰 차이는 없다고 생각합니다. 그러나 변수 중요성으로 작업 할 때주의를 기울여야 할 다른 사항이 있습니다. 일부 구현은 여러 수준의 범주 형으로 편향되어 있습니다. 자세한 내용은 Carolin Strobl 논문을 참조하십시오 : statistik.uni-dortmund.de/useR-2008/slides/Strobl+Zeileis.pdf . R에는이 바이어스가없는 구현이 있습니다.
rapaio

2

하나의 열을 다르게 표시하려고 할 수 있습니다. 희소 데이터 프레임과 동일한 데이터를 나타낼 수 있습니다.

가능한 최소 코드;

example <- as.data.frame(c("A", "A", "B", "F", "C", "G", "C", "D", "E", "F"))
names(example) <- "strcol"

for(level in unique(example$strcol)){
      example[paste("dummy", level, sep = "_")] <- ifelse(example$strcol == level,     1, 0)
}

원래 열의 각 값이 이제 별도의 더미 열이되는 방법에 주목하십시오.

보다 광범위한 예제 코드;

set.seed(0)
combs1 = sample.int(33, size= 10000, replace=TRUE)
combs2 = sample.int(33, size= 10000, replace=TRUE)
combs3 = combs1 * combs2 + rnorm(10000,mean=0,100)
df_hard = data.frame(y=combs3, first=factor(combs1), second=factor(combs2))

for(level in unique(df_hard$first)){
    df_hard[paste("first", level, sep = "_")] <- ifelse(df_hard$first == level, 1, 0)
}

for(level in unique(df_hard$second)){
    df_hard[paste("second", level, sep = "_")] <- ifelse(df_hard$second == level, 1, 0)
}

example$first <- NULL
example$second <- NULL

rf_mod = randomForest( y ~ ., data=example )

이 코드는 실제로 더 이상 오류가 발생하지 않음을 보여 주지만 randomForest 알고리즘이 완료되기까지 오랜 시간이 필요하다는 것을 알 수 있습니다. 이것은 CPU 제약으로 인해 이제 샘플링을 통해이 작업을 줄일 수 있습니다.

자세한 내용은 다음 블로그 포스트를 확인하십시오.

https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-parallel-with-r-on-hadoop/


두 번째 코드 블록은 혼란스러워 보이지만 본문 전체에서 df_hard를 사용하지만 마지막 줄에서 "first"및 "second"를 NULL로 설정하고 randomForest의 데이터로 "example"을 사용하는 것은 의미가 없습니다. example과 df_hard 사이에 연결이 없기 때문에 나.
Özgür

빈센트, 내가 100 + 수준의 레벨을 가지고 있다면 그렇게 큰 문제를 겪게 될 것이라고 생각하지 않습니까? 각 열을 무작위로 입력으로 추가 하시겠습니까?
Hardik Gupta

또 다른 대안은 h2o에서 randomforest 구현을 사용하는 것입니다. 이것은 큰 데이터 세트를 더 잘 지원합니다. "각 열을 임의의 입력으로 입력"비트를 이해하지 못합니다.
Vincent Warmerdam

0

extraTrees 패키지를 대신 사용할 수 있습니다. 매우 무작위 화 된 포리스트 알고리즘은 중단 점 / 분할을 시도하지 않고 분할의 제한된 무작위 서브 세트 만 시도합니다.


1
extraTrees는 입력이 숫자 데이터 행렬이어야한다는 의미에서 제한이 있습니까?
Hardik Gupta

0

다른 옵션 : 데이터의 수준 수와 관측치 수에 따라 일부 수준을 병합 할 수 있습니다. 한계를 벗어나는 것만으로도 관측치가 적은 수준이 많은 경우 분산이 줄어들 수 있습니다. Hadleyforcats : fct_lump가이를 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.