我在Caret包中使用了不同的神经网络包来进行预测。与nnet
包一起使用的代码是
library(caret)
# training model using nnet method
data <- na.omit(data)
xtrain <- data[,c("temperature","prevday1","prevday2","prev_instant1","prev_instant2","prev_2_hour")]
ytrain <- data$power
train_model <- train(x = xtrain, y = ytrain, method = "nnet", linout=TRUE, na.action = na.exclude,trace=FALSE)
# prediction using training model created
pred_ob <- predict(train_model, newdata=dframe,type="raw")
预测函数只是计算预测值。但是,我也需要预测间隔(2-sigma)。在搜索时,我在stackoverflow链接处找到了相关答案,但这并不是必要的结果。解决方案建议使用finalModel
变量作为
predict(train_model$finalModel, newdata=dframe, interval = "confidence",type=raw)
有没有其他方法可以计算预测间隔?使用的培训数据是stackoverflow link上我之前提问的dput()
,而我的预测数据框(测试数据)的dput()
是
dframe <- structure(list(temperature = 27, prevday1 = 1607.69296666667,
prevday2 = 1766.18103333333, prev_instant1 = 1717.19306666667,
prev_instant2 = 1577.168915, prev_2_hour = 1370.14983583333), .Names = c("temperature",
"prevday1", "prevday2", "prev_instant1", "prev_instant2", "prev_2_hour"
), class = "data.frame", row.names = c(NA, -1L))
**************************** UPDATE ****************** *****
我按照link的建议使用了nnetpredint
个包。令我惊讶的是,它会导致错误,我发现很难调试。这是我到目前为止更新的代码,
library(nnetpredint)
nnetPredInt(train_model, xTrain = xtrain, yTrain = ytrain,newData = dframe)
导致以下错误:
Error: Number of observations for xTrain, yTrain, yFit are not the same
[1] 0
我可以检查xtrain
,ytrain
和dframe
的尺寸是否正确,但我对yFit
一无所知。根据{{1}}小插图
答案 0 :(得分:2)
caret
不会生成预测间隔;这取决于个别包装。如果该包无法执行此操作,则train
对象也不能执行此操作。我同意nnetPredInt
是适当的方式。
另外两个注释:
finalModel
对象有点危险,因为它在创建之前不知道对数据做了什么(例如虚拟变量,居中和缩放或其他预处理方法等)。 最高
答案 1 :(得分:2)
感谢您的提问。对您的问题的一个简单答案是:现在nnetPredInt函数仅支持由不同神经网络包生成的以下S3对象“nnet”,“nn”和“rsnns” 。插入符号包中的train功能返回“train”对象。这就是为什么函数nnetPredInt没有从train_model获取yFit向量,它是训练数据集的fits.value。
1.使用插入包中的模型的快捷方式: 从'train'对象获取finalModel结果:
nnetObj = train_model$finalModel # return the 'nnet' model which the caret package has found.
yPredInt = nnetPredInt(nnetObj, xTrain = xtrain, yTrain = ytrain,newData = dframe)
例如,使用ITS数据集和插入包中的'nnet'方法进行回归预测。
library(caret)
library(nnetpredint)
# Setosa 0 and Versicolor 1
ird <- data.frame(rbind(iris3[,,1], iris3[,,2]), species = c(rep(0, 50), rep(1, 50)))
samp = sample(1:100, 80)
xtrain = ird[samp,][1:4]
ytrain = ird[samp,]$species
# Training
train_model <- train(x = xtrain, y = ytrain, method = "nnet", linout = FALSE, na.action = na.exclude,trace=FALSE)
class(train_model) # [1] "train"
nnetObj = train_model$finalModel
class(nnetObj) # [1] "nnet.formula" "nnet"
# Constructing Prediction Interval
xtest = ird[-samp,][1:4]
ytest = ird[-samp,]$species
yPredInt = nnetPredInt(nnetObj, xTrain = xtrain, yTrain = ytrain,newData = xtest)
# Compare Results: ytest and yPredInt
ytest
yPredInt
2.艰难的方式
使用通用的nnetPredInt函数将所有神经网络特定参数传递给函数:
nnetPredInt(object = NULL, xTrain, yTrain, yFit, node, wts, newData,alpha = 0.05 , lambda = 0.5, funName = 'sigmoid', ...)
xTrain # Training Dataset
yTrain # Training Target Value
yFit # Fitted Value of the training data
node # Structure of your network, like c(4,5,5,1)
wts # Specific order of weights parameters found by your neural network
newData # New Data for prediction
提示: 现在nnetpredint包只支持带激活输出的标准多层神经网络回归,而不是线性输出, 它将在未来很快支持更多类型的模型。
答案 2 :(得分:0)
您可以使用nnetPredInt
函数{package:nnetpredint}。查看功能帮助页here
答案 3 :(得分:0)
如果您愿意编写自己的实现,还有另一种选择。您可以使用您为标准非线性回归编写的相同实现从训练网获得预测间隔(假设使用反向传播进行估计)。
本文介绍了该方法,并且相当直接:http://www.cis.upenn.edu/~ungar/Datamining/Publications/yale.pdf。
与所有方面一样,这种方法有一些缺点(文中概述),但绝对值得知道作为一种选择。