R neuralnet на данных NIR плохие результаты
Я пытаюсь предсказать набор валидации с помощью нейронной сети () со спектрами NIR, и я получаю очень плохие результаты.
В литературе некоторые сообщают об использовании сигмоидальной функции от входного слоя до скрытого слоя и линейной от скрытой до выходной; который я выбрал здесь. Я пробовал несколько разных итераций (т.е. количество нейронов, факторы PLS в качестве входных данных, ets) и все еще получил довольно плохие результаты в моей валидации.
maxs1 <- apply(cal, 2, max)
mins1 <- apply(cal, 2, min)
scaledcal <- as.data.frame(scale(cal, center = mins1, scale = maxs1- mins1))
maxs2 <- apply(val, 2, max)
mins2 <- apply(val, 2, min)
scaledval <- as.data.frame(scale(val, center = mins2, scale = maxs2- mins2))
library(neuralnet)
sigmoid = function(x) {
1 / (1 + exp(-x))
}
set.seed(400)
n <- names(cal)
z <- length(n)-1
f <- as.formula(paste("DM ~", paste(n[!n %in% "DM"], collapse = " + ")))
nn <- neuralnet(f, data=scaledcal, act.fct = sigmoid, hidden=(20), linear.output=T,
lifesign ="full", threshold=0.01, stepmax = 1e+07)
pr.nn <- compute(nn,scaledval[,1:83])
pr.nn_ <- pr.nn$net.result*(max(cal$DM)-min(cal$DM))+min(cal$DM)
test.cv.r <- (scaledval$DM)*(max(val$DM)-min(val$DM))+min(val$DM)
MSE.nn <- sum((pr.nn_ - val$DM)^2)/nrow(val)
MSE, которую я получал на nn, был где-то между 20-2, поэтому удивительно, что я получаю MSE 0,8 (диапазон 9-22) при выполнении простой LM на тех же данных.
lm.fit <- glm(DM~., data=cal)
pr.lm <- predict(lm.fit,val)
MSE.lm <- sum((pr.lm - val$DM)^2)/nrow(val)
Ура,