library(gbm) CV_FOLDS <- 12 #сколько кроссвалидаций делать SplitToFolds <- function(x, n, k){ indexesPerFold <- length(x)/n startIndex <- ceiling(indexesPerFold*(k-1))+1 endIndex <- min(ceiling(indexesPerFold*k),length(x)) # return(x[round(1:indexesPerFold+indexesPerFold*(k-1))]) return(x[startIndex:endIndex]) } R2 <- function(act, pred){ return(1 - sum((act-pred)^2)/sum((act-mean(act))^2)) } #Таблица для обучения inputData <- matrix(runif(1100)-0.5, ncol=11, nrow=100) colnames(inputData) <- c(paste(rep("pred"),1:10, sep=""),"target") #тут просто рандомные данные, вместо таблицы inputData лучше подставить свою #номера колонок с предикторами predictorColumnIds <- 1:(ncol(inputData)-1) #номер колонки с целью targetcolumnId <- ncol(inputData) #Кроссвалидация #Эту часть кода нужно повторять много раз в цикле, меняя и оптимизируя параметры обучения модели, добиваясь наибольшего значения r2Score modelList <- list() prediction <- c() for(i in 1:CV_FOLDS){ trainIndexes <- 1:nrow(inputData) testIndexes <- SplitToFolds(trainIndexes, CV_FOLDS, i) trainIndexes <- setdiff(trainIndexes, testIndexes) cat(testIndexes, "\n") modelList[[i]] <- gbm.fit(x = inputData[trainIndexes, predictorColumnIds], y = inputData[trainIndexes, targetcolumnId], distribution = "gaussian", n.trees = 7, verbose = FALSE) prediction <- c(prediction, predict(modelList[[i]], inputData[testIndexes, predictorColumnIds], n.trees = 7)) } r2Score <- R2(inputData[, targetcolumnId], prediction) cat(r2Score, "\n") #использование ранее обученных моделей для предсказания новых данных fronttestData <- matrix(runif(1000)-0.5, ncol=10, nrow=100) colnames(fronttestData) <- paste(rep("pred"),1:10, sep="") predictionFronttest <- rep(0, nrow(fronttestData)) for(i in 1:length(modelList)){ predictionFronttest <- predictionFronttest + predict(modelList[[i]], fronttestData[, predictorColumnIds], n.trees = 7) } predictionFronttest <- predictionFronttest / length(modelList)