Прогнозные значения, полученные для перекрестной проверки, хранятся в 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
не предназначена для чисто перекрестной проверки, но для выбора переменных. Таким образом, вы выполняете множество избыточных вычислений.
Я сделал все это, но по какой-то причине, когда я делаю «model $ idx», я просто получаю NULL – user2062207
Вам нужно вызвать измененную функцию 'cvrf2', а не оригинальную. Пожалуйста, просмотрите изменения в конце ответа. – DrDom
О, я вижу. Есть ли способ вернуть результаты, чтобы они имели предсказанные и фактические результаты? В настоящее время я получаю взамен следующее: - '[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