Набор для обучения и тестирования с функцией createFolds в R - PullRequest
0 голосов
/ 06 мая 2020

Я попытался вычислить некоторые показатели производительности линейной регрессии вручную и хочу разделить свои данные , используя 30 крат перекрестную проверку.

Для расчета этих показателей эффективности требуется набор для обучения и тестирования.

Я запускаю следующий код, но он выдает ошибку («несовместимые размеры, более длинная длина объекта не кратна более короткой длине объекта»).

Есть ли способ решить эту проблему используя функцию createFolds?

######### Upload the data set #########

wdbc <- read.delim("yacht_hydrodynamics.data",sep = "",header = FALSE) 
wdbc[] <- lapply(wdbc, scale)
wdbc<-as.data.frame(wdbc)

############## Leave One Out Cross Validation split ###########

k=30
fitted_value <- rep(0,k)

for(i in 1:k){
test<-wdbc[i,]
training<-wdbc[-i,]

m=lad(V7 ~ ., data=training, method="BR")

co.data = coef(m)  
x = cbind(1, as.matrix(test[, !(colnames(test) %in% "V7")]))

fitted_value[i] <- x %*% co.data

}

 R2<-(cor(wdbc$V7,fitted_value)^2) ### R-squared
 SAD<-sum(abs(wdbc$V7 - fitted_value)) ### Sum Absloute Deviation

 c(round(SAD,2) ,round(R2,2))

ПРИМЕЧАНИЕ

«V7» является зависимой переменной.

1 Ответ

1 голос
/ 10 мая 2020

Ваша ошибка исходит из этой строки:

R2<-(cor(wdbc$V7,fitted_value)^2)

Если вы посмотрите на data.frame, который вы читаете:

wdbc = read.delim("http://archive.ics.uci.edu/ml/machine-learning-databases/00243/yacht_hydrodynamics.data",sep="",header=FALSE)
 dim(wdbc)
[1] 308   7

Итак, вычитая вектор из 30 значений из вектор 308 не работает

Не очень уверен, стоит ли делать 30-кратную перекрестную проверку или исключить 1, в приведенном выше коде один не указан, и вы должны установить k = nrow(wdbc) для оставить-один-нет. Ниже предлагается 30-кратный вариант:

k=30
foldidx = split(sample(nrow(wdbc)),1:nrow(wdbc) %% k)
fitted_value <- vector("list",k)

for(i in 1:k){
test<-wdbc[foldidx[[i]],]
training<-wdbc[-foldidx[[i]],]

m=lad(V7 ~ ., data=training, method="BR")

co.data = coef(m)  
x = cbind(1, as.matrix(test[, !(colnames(test) %in% "V7")]))

fitted_value[[i]] <- x %*% co.data

}

Последняя часть для сопоставления значений, вы отменяете список индексов, а также список сохраненных подогнанных значений:

obs = wdbc$V7[unlist(foldidx)]
test = unlist(fitted_value)

R2<-(cor(obs,test)^2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...