R의 임의 포리스트 계산 시간


48

10,000 개의 행과 34 개의 기능이있는 R 의 파티 패키지를 사용하고 있으며 일부 요인 기능에는 300 개 이상의 레벨이 있습니다. 컴퓨팅 시간이 너무 깁니다. (지금까지 3 시간이 걸렸으며 아직 끝나지 않았습니다.)

임의 포리스트의 컴퓨팅 시간에 어떤 요소가 큰 영향을 미치는지 알고 싶습니다. 레벨이 너무 많은 요인이 있습니까? RF 컴퓨팅 시간을 개선하기위한 최적화 된 방법이 있습니까?

답변:


64

RF의 전체적인 복잡성은 와 같습니다. 계산 속도를 높이려면 다음을 시도하십시오.ntreemtry(# objects)log(# objects)

  1. 사용 randomForest대신에 party더 좋은, 또는 rangerRborist(모두 아직 전투 테스트 아니지만).
  2. 공식을 사용하지 마십시오 (예 : randomForest(predictors,decision)대신에 전화 ) randomForest(decision~.,data=input).
  3. do.trace실시간으로 OOB 오류를 보려면 인수를 사용하십시오 . 이런 식으로 당신은 당신이 낮출 수 있음을 감지 할 수 있습니다 ntree.
  4. 요인에 대하여; RF (및 모든 트리 방법)는 레벨의 최적 서브 세트를 찾아서 가능성 을 스캔합니다 . 이를 위해 randomForest는 32 개 이상의 레벨을 가진 요소를 먹지 않을 것입니다. 어쩌면 단순히 그것을 순서가 지정된 것으로 취급하거나 (따라서 RF의 경우 일반적인 숫자 변수와 동일) 일부 그룹에서 클러스터링 하여이 속성을 여러 속성으로 나눌 수 있습니까?2(# of levels-1)
  5. 컴퓨터에 RAM이 부족하지 않고 스왑 공간을 사용 중인지 확인하십시오. 그렇다면 더 큰 컴퓨터를 구입하십시오.
  6. 마지막으로, 임의의 객체 하위 집합을 추출하고 이에 대한 초기 실험을 할 수 있습니다.

2
감사합니다, 나는 당신의 대답에서 많은 것을 배우고 당신이 말한 것처럼 두 번째 제안이 왜 효과가 있는지 테스트를 했습니까?
Chenghao Liu

4
@ChenghaoLiu Formulas는 작지만 복잡한 라이너 모델 프레임을 위해 설계되었으므로 세트를 복사하는 데 비용이 많이들 때 비효율적입니다.

1
randomForest (예측 자, 의사 결정)를 호출하면 실행 시간이 단축되는 이유는 무엇입니까?
JenSCDC

mtry

1
@AndyBlankertz randomForest의 수식 해석은 전체 입력을 복사하는 것으로 보입니다.

12

randomForest는 기능 및 레코드의 임의 서브 세트에 대해 학습 된 독립 카트의 콜렉션이므로 병렬화에 적합합니다. combine()randomForest 패키지 의 기능은 독립적으로 훈련 된 포리스트를 함께 연결합니다. 다음은 장난감 예입니다. @mpq의 답변에 따르면 수식 표기법을 사용하지 말고 변수의 데이터 프레임 / 행렬과 결과 벡터를 전달해야합니다. 나는 문서에서 이것을 부끄러워하지 않았다.

library("doMC")
library("randomForest")
data(iris)

registerDoMC(4) #number of cores on the machine
darkAndScaryForest <- foreach(y=seq(10), .combine=combine ) %dopar% {
   set.seed(y) # not really needed
   rf <- randomForest(Species ~ ., iris, ntree=50, norm.votes=FALSE)
}

randomForest 결합 함수를 비슷한 이름의 .combine 매개 변수 (루프 출력의 함수를 제어하는 ​​매개 변수)에 전달했습니다. 단점은 OOB 오류율이 없거나 비극적으로 변수의 중요성이 없다는 것입니다.

편집하다:

게시물을 다시 읽은 후 34 + 요인 문제에 대해 아무 것도 이야기하지 않는다는 것을 알게되었습니다. 완전히 생각하지 않은 대답은 그것들을 이진 변수로 표현하는 것일 수 있습니다. 이는 존재 / 비 존재에 대해 0/1 수준 요소로 인코딩 된 열인 각 요소입니다. 중요하지 않은 요소에 대해 일부 변수를 선택하고 제거하면 피쳐 공간이 너무 커지지 않도록 할 수 있습니다.


@jdennison 사이트에 오신 것을 환영합니다. RF에 대해 너무 많이 알지 못하고 병렬 컴퓨팅에 대해서는 전혀 모르지만 실제로 이것은 훌륭한 기여로 보입니다. 참고로 답변의 순서는 시간이 지남에 따라 변동될 수 있으므로 "위의 답변"을 참조하는 것이 아니라 '\ @ so-and-so의 답변'을 참조하는 것이 가장 좋습니다.
gung-모니 티 복원

늦게 대답해서 죄송합니다. 귀하의 블로그를 읽었습니다, 훌륭한 작품
Chenghao Liu

3

몇 가지 링크를 제안합니다.

1) 팩터 변수의 레벨 축소stackoverflowrandomForest패키지 를 사용하는 동안 비슷한 문제를 처리 하기위한 질문에 대한 링크 입니다. 특히 가장 자주 발생하는 수준 만 사용하고 덜 자주 발생하는 다른 모든 수준에 새 수준을 할당합니다.

: 그것에 대한 아이디어는 여기에서 온 2009 KDD 컵 느린 도전 . 이 경쟁의 데이터에는 많은 수준의 요소가 많았으며 2 코어 / 2GB RAM 랩톱에서 실행하기 위해 50,000 행에서 15,000 열로 데이터를 분석하는 데 사용한 몇 가지 방법에 대해 설명합니다.

마지막 제안은 위에서 제안한 바와 같이 hi-CPU Amazon EC2 인스턴스에서 병렬로 문제를 실행하는 것입니다.


2) 없습니다 . 링크에 전적으로 의존하는 대신 페이지의 중요한 부분을 제공해야합니다.
AL

EC 인스턴스가 어떻게 실행되는지 좋아합니다. 우와 그들은 멋지다. 가상화 하드웨어가 실제보다 낫다고 생각합니다.
EngrStudent

2

R에서 특정 알고리즘의 속도를 말할 수는 없지만 컴퓨팅 시간이 오래 걸리는 원인이 분명해야합니다. 각 지점의 각 나무에 대해 CART는 최상의 이진 분할 형태를 찾고 있습니다. 따라서 34 개 피처 각각에 대해 각 변수 레벨에서 제공되는 분할을 가장 잘 살펴 봅니다. 트리의 각 분할에 대한 실행 시간에 트리의 분기 수를 곱한 다음 포리스트의 트리 수를 곱하면 실행 시간이 길어집니다. 누가 알아? 빠른 컴퓨터를 사용하더라도 완료하는 데 몇 년이 걸릴 수 있습니까?

속도를 높이는 가장 좋은 방법은 일부 변수를 한꺼번에 모아서 각 변수가 300 개가 아닌 3 ~ 5 개 수준으로 내려가는 것입니다. 물론 이것은 중요한 것을 잃지 않고 이것을 할 수있는 것에 달려 있습니다 데이터의 정보.

그 후 개별 트리의 각 노드에서 분할하는 데 걸리는 검색 시간을 단축 할 수있는 영리한 알고리즘이 있는지 확인할 수 있습니다. 특정 트리에서 분할 검색은 이전 트리에 대해 이미 수행 된 검색의 반복 일 수 있습니다. 따라서 이전 분할 결정의 솔루션을 저장하고 반복시기를 식별 할 수 있으면 해당 전략이 컴퓨팅 시간을 약간 절약 할 수 있습니다.


다시 한 번 감사드립니다, 전적으로 당신에게 동의합니다. 그리고 나는 가짜 더미 방법으로 레벨 수를 줄이려고합니다. 예를 들어, 예측 변수를 600 레벨로 4 예측 변수로 대체합니다 (600 <5 ^ 4)이 변환 후, 임의 포리스트 알고리즘을 실행할 수 있습니다. 그러나 RMSE 결과가 이상합니다. 요인 기능 수준을 낮추는 방법과 10 배 CV RMSE와 테스트 세트 RMSE 점수의 관계에 대한 두 가지 다른 질문을하겠습니다.
Chenghao Liu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.