2013-12-09 4 views
0

Так у меня есть набор данных, который 162 х 151: -просмотра ваших предсказывали фактические значения в R для случайного леса

RT (seconds) 76_TI2 114_DECC 120_Lop 212_PCD 
38 4.086 1.2 2.322 0 
40 2.732 0.815 1.837 1.113 
41 4.049 1.153 2.117 2.354 
41 4.049 1.153 2.117 3.838 
42 4.56 1.224 2.128 2.38 
42 2.96 0.909 1.686 0.972 
42 3.237 0.96 1.922 1.202 
44 2.989 0.8 1.761 2.034 

И я хочу, чтобы построить модель случайного леса на нем, используя 10 кратную перекрестную проверки, а затем просмотреть значения для предсказанного и фактического значения для каждого для fold. Я использую пакет randomForest. Я сделал: -

> set.seed(1500) 
> model <- rfcv(x,y, cv.fold=10) 

, но я не смог найти способ просто просматривать все предсказанные значения, полученные из каждой складки, и фактического значения, которое соответствует с ним. Как мне это сделать?

Благодаря

ответ

1

Прогнозные значения, полученные для перекрестной проверки, хранятся в model$predicted[[1]], наблюдаемые значения является y. Если вы хотите посмотреть на значения предсказания каждой разницы отдельно, вам нужно получить информацию о разложении сгибов. Для этого вы можете:

1) разделение складок вручную и делать перекрестную проверку на себя

2) использовать caret пакет

3) немного изменить cvrf для вывода этой информации - добавить idx к выходу список

rfcv2 <- function (trainx, trainy, cv.fold = 5, scale = "log", step = 0.5, 
      mtry = function(p) max(1, floor(sqrt(p))), recursive = FALSE, 
      ...) 
{ 
    classRF <- is.factor(trainy) 
    n <- nrow(trainx) 
    p <- ncol(trainx) 
    if (scale == "log") { 
    k <- floor(log(p, base = 1/step)) 
    n.var <- round(p * step^(0:(k - 1))) 
    same <- diff(n.var) == 0 
    if (any(same)) 
     n.var <- n.var[-which(same)] 
    if (!1 %in% n.var) 
     n.var <- c(n.var, 1) 
    } 
    else { 
    n.var <- seq(from = p, to = 1, by = step) 
    } 
    k <- length(n.var) 
    cv.pred <- vector(k, mode = "list") 
    for (i in 1:k) cv.pred[[i]] <- trainy 
    if (classRF) { 
    f <- trainy 
    } 
    else { 
    f <- factor(rep(1:5, length = length(trainy))[order(order(trainy))]) 
    } 
    nlvl <- table(f) 
    idx <- numeric(n) 
    for (i in 1:length(nlvl)) { 
    idx[which(f == levels(f)[i])] <- sample(rep(1:cv.fold, 
               length = nlvl[i])) 
    } 
    for (i in 1:cv.fold) { 
    all.rf <- randomForest(trainx[idx != i, , drop = FALSE], 
          trainy[idx != i], trainx[idx == i, , drop = FALSE], 
          trainy[idx == i], mtry = mtry(p), importance = TRUE, 
          ...) 
    cv.pred[[1]][idx == i] <- all.rf$test$predicted 
    impvar <- (1:p)[order(all.rf$importance[, 1], decreasing = TRUE)] 
    for (j in 2:k) { 
     imp.idx <- impvar[1:n.var[j]] 
     sub.rf <- randomForest(trainx[idx != i, imp.idx, 
            drop = FALSE], trainy[idx != i], trainx[idx == 
                       i, imp.idx, drop = FALSE], trainy[idx == i], 
          mtry = mtry(n.var[j]), importance = recursive, 
          ...) 
     cv.pred[[j]][idx == i] <- sub.rf$test$predicted 
     if (recursive) { 
     impvar <- (1:length(imp.idx))[order(sub.rf$importance[, 
                   1], decreasing = TRUE)] 
     } 
     NULL 
    } 
    NULL 
    } 
    if (classRF) { 
    error.cv <- sapply(cv.pred, function(x) mean(trainy != 
                x)) 
    } 
    else { 
    error.cv <- sapply(cv.pred, function(x) mean((trainy - 
                x)^2)) 
    } 
    names(error.cv) <- names(cv.pred) <- n.var 
    list(n.var = n.var, error.cv = error.cv, predicted = cv.pred, idx = idx) 
} 

Теперь вы можете вызвать

model <- rfcv2(x,y, cv.fold=10) 
model$idx # returns the folds split. 

Обратите внимание, что функция cvrf не предназначена для чисто перекрестной проверки, но для выбора переменных. Таким образом, вы выполняете множество избыточных вычислений.

+0

Я сделал все это, но по какой-то причине, когда я делаю «model $ idx», я просто получаю NULL – user2062207

+0

Вам нужно вызвать измененную функцию 'cvrf2', а не оригинальную. Пожалуйста, просмотрите изменения в конце ответа. – DrDom

+0

О, я вижу. Есть ли способ вернуть результаты, чтобы они имели предсказанные и фактические результаты? В настоящее время я получаю взамен следующее: - '[1] 6 2 1 5 2 3 7 10 9 6 1 7 7 9 5 2 3 7 4 10 7 1 8 2 4 [26] 1 6 4 5 8 4 5 9 4 4 6 10 3 6 3 5 9 9 1 3 5 2 3 2 10 ' – user2062207

Смежные вопросы