2013-10-03 3 views
9

으로 결합했습니다. R (2 일)을 처음 사용하고 임의의 숲으로 구성된 숲을 짓는 임무를 맡았습니다. 각각의 개별 임의의 숲은 다른 훈련 세트를 사용하여 건설 될 것이며 우리는 예측을 위해 모든 숲을 마지막에 결합 할 것입니다. 나는 이것을 R에서 구현하고 있는데 같은 세트를 사용하지 않고 두 개의 숲을 결합하는 데 약간의 어려움이있다. 다음과 같이 내 시도이다 : 나는 이것에 대한 실마리를보고 약간의 시간에 대한 웹 검색되었지만 아직 성공을 거두었하지 않은다른 훈련 세트로 구축 된 임의의 숲을 R

Error in rf$votes + ifelse(is.na(rflist[[i]]$votes), 0, rflist[[i]]$votes) : 
non-conformable arrays 
In addition: Warning message: 
In rf$oob.times + rflist[[i]]$oob.times : 
longer object length is not a multiple of shorter object length 

: 물론

d1 = read.csv("../data/rr/train/10/chunk0.csv",header=TRUE) 
d2 = read.csv("../data/rr/train/10/chunk1.csv",header=TRUE) 

rf1 = randomForest(A55~., data=d1, ntree=10) 
rf2 = randomForest(A55~., data=d2, ntree=10) 

rf = combine(rf1,rf2) 

이 오류가 발생합니다

. 어떤 도움이라도 여기에 가장 감사 할 것입니다.

+0

두 데이터 세트의 정확한 구조는 무엇입니까? (볼 때'str '을 사용하십시오). 그들은 똑같은 변수를 가지고 있으며, 모두 똑같은 이름을 갖고 있습니까? – joran

+0

@ joran. 그들은 수동으로 분리 된 더 큰 훈련 세트의 서브 세트입니다. 'str'을 실행할 때 첫번째 줄은 : 'data.frame': \t 38735 obs. 55 개의 변수들 :'d1과''data.frame ': \t 38734 obs. 55 개의 변수 중 'd2'. 각 데이터 세트에 대해 동일한 이름이옵니다. – josh

+0

각 rf 개체의 votes 개체의 크기를 확인하십시오. 모든 요인 수준이 교육 데이터의 각 하위 집합에 존재하지 않을 수도 있습니다. – joran

답변

20

아. 이것은 combine의 감독이거나 귀하의 관점에 따라 무의미한 시도입니다.

투표 매트릭스는 각 응답 범주에 대한 학습 데이터의 각 사례에 대해 포리스트의 투표 수를 기록합니다. 당연히 교육 데이터의 행 수와 같은 수의 행을 갖습니다.

combine동일한 데이터 세트에서 임의의 포리스트를 두 번 실행 한 것으로 가정하므로 해당 행렬의 크기는 동일합니다. 이 작업은 결합 된 포리스트에 대한 "전체"오류 추정치를 제공하기 때문에 수행됩니다.

그러나 두 데이터 집합이 인 경우 서로 다른 투표 행렬을 결합하면 간단하게 무의미 해집니다. 더 큰 훈련 데이터 세트에서 하나의 행을 제거하는 것만으로 combine을 실행할 수는 있지만, 각 행은 두 가지 다른 교육 사례에 대한 투표 조합이 될 것이므로 조합 된 포리스트의 결과 행렬은 횡포합니다.

아마도 이것은 단지 combine에서 해제 할 수있는 옵션이어야합니다. 이 실제 나무와 predict을 결합하는 데 여전히 의미가 있어야하기 때문에 결과 개체에. 그러나 combine의 출력에서 ​​"결합 된"오류 추정치 중 일부는 의미가 없습니다.

간단히 말하자면 각 교육 데이터 세트를 동일한 크기로 설정하면 실행됩니다. 하지만 그렇게한다면 새로운 결과물을 만드는 것 이외에는 결과물을 사용하지 않을 것입니다. 숲의 성능을 요약 한 내용이 합쳐지면 아무 의미가 없습니다.

는 그러나, 나는 combine를 사용하는 구성 방법은 전체 데이터 세트에서 여러 임의 숲에 맞게,하지만 나무의 감소 번호와 다음 그 숲을 결합 생각합니다.

편집 내가 나서서 불평등 한 교육 집합 크기를 "처리"로 combine을 수정

. 그 모든 사실은 실제로 일치시키지 않을 것들을 함께 꿰매려고하는 많은 양의 코드를 제거했다는 것을 의미합니다.하지만 숲을 결합 부분을 유지, 그래서 당신은 여전히 ​​predict를 사용할 수 있습니다

my_combine <- function (...) 
{ 
    pad0 <- function(x, len) c(x, rep(0, len - length(x))) 
    padm0 <- function(x, len) rbind(x, matrix(0, nrow = len - 
     nrow(x), ncol = ncol(x))) 
    rflist <- list(...) 
    areForest <- sapply(rflist, function(x) inherits(x, "randomForest")) 
    if (any(!areForest)) 
     stop("Argument must be a list of randomForest objects") 
    rf <- rflist[[1]] 
    classRF <- rf$type == "classification" 
    trees <- sapply(rflist, function(x) x$ntree) 
    ntree <- sum(trees) 
    rf$ntree <- ntree 
    nforest <- length(rflist) 
    haveTest <- !any(sapply(rflist, function(x) is.null(x$test))) 
    vlist <- lapply(rflist, function(x) rownames(importance(x))) 
    numvars <- sapply(vlist, length) 
    if (!all(numvars[1] == numvars[-1])) 
     stop("Unequal number of predictor variables in the randomForest objects.") 
    for (i in seq_along(vlist)) { 
     if (!all(vlist[[i]] == vlist[[1]])) 
      stop("Predictor variables are different in the randomForest objects.") 
    } 
    haveForest <- sapply(rflist, function(x) !is.null(x$forest)) 
    if (all(haveForest)) { 
     nrnodes <- max(sapply(rflist, function(x) x$forest$nrnodes)) 
     rf$forest$nrnodes <- nrnodes 
     rf$forest$ndbigtree <- unlist(sapply(rflist, function(x) x$forest$ndbigtree)) 
     rf$forest$nodestatus <- do.call("cbind", lapply(rflist, 
      function(x) padm0(x$forest$nodestatus, nrnodes))) 
     rf$forest$bestvar <- do.call("cbind", lapply(rflist, 
      function(x) padm0(x$forest$bestvar, nrnodes))) 
     rf$forest$xbestsplit <- do.call("cbind", lapply(rflist, 
      function(x) padm0(x$forest$xbestsplit, nrnodes))) 
     rf$forest$nodepred <- do.call("cbind", lapply(rflist, 
      function(x) padm0(x$forest$nodepred, nrnodes))) 
     tree.dim <- dim(rf$forest$treemap) 
     if (classRF) { 
      rf$forest$treemap <- array(unlist(lapply(rflist, 
       function(x) apply(x$forest$treemap, 2:3, pad0, 
        nrnodes))), c(nrnodes, 2, ntree)) 
     } 
     else { 
      rf$forest$leftDaughter <- do.call("cbind", lapply(rflist, 
       function(x) padm0(x$forest$leftDaughter, nrnodes))) 
      rf$forest$rightDaughter <- do.call("cbind", lapply(rflist, 
       function(x) padm0(x$forest$rightDaughter, nrnodes))) 
     } 
     rf$forest$ntree <- ntree 
     if (classRF) 
      rf$forest$cutoff <- rflist[[1]]$forest$cutoff 
    } 
    else { 
     rf$forest <- NULL 
    } 
    # 
    #Tons of stuff removed here... 
    # 
    if (classRF) { 
     rf$confusion <- NULL 
     rf$err.rate <- NULL 
     if (haveTest) { 
      rf$test$confusion <- NULL 
      rf$err.rate <- NULL 
     } 
    } 
    else { 
     rf$mse <- rf$rsq <- NULL 
     if (haveTest) 
      rf$test$mse <- rf$test$rsq <- NULL 
    } 
    rf 
} 

을 그리고 당신은 이런 식으로 테스트 할 수 있습니다 :

data(iris) 
d <- iris[sample(150,150),] 
d1 <- d[1:70,] 
d2 <- d[71:150,] 
rf1 <- randomForest(Species ~ ., d1, ntree=50, norm.votes=FALSE) 
rf2 <- randomForest(Species ~ ., d2, ntree=50, norm.votes=FALSE) 

rf.all <- my_combine(rf1,rf2) 
predict(rf.all,newdata = iris) 

물론, 이것은 전혀 보증이 제공됩니다! :)

+0

@joran에 대한 자세한 답변을 주셔서 감사합니다. 만약 투표 행렬이 같은 크기라면 결합과 예측이 의미가 있다고 생각합니다. 말하자면, 각 행은 서로 다른 두 가지 경우의 조합입니다. 링크를 가져 주셔서 감사합니다. 슬프게도, 제 경우에는 각 교육 세트를 만드는 것과 같은 크기가 옵션이 아니므로, 제가보고 싶은 것은 왜곡 된 데이터가이 시스템의 전반적인 성능에 영향을 미치기 때문입니다. 더 크고 (잘하면) 더 좋은 아이디어에! – josh

+0

@Josh 문제는 없습니다. 가능한 해결 방법은 내 편집을 참조하십시오. – joran

+0

정말 고마워요. 내가 한 일은 숲 한 무리를 만들고 각각에 대해 개별적으로 예측을하는 것이 었습니다. 그런 다음이 행렬을 하나의 더 큰 예측 행렬로 결합했습니다. 그래도 다시 고마워! – josh

관련 문제