使用Caret包R

时间:2016-04-21 06:58:54

标签: r neural-network regression prediction r-caret

我在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

我可以检查xtrainytraindframe的尺寸是否正确,但我对yFit一无所知。根据{{​​1}}小插图

的示例,我不需要这样做

4 个答案:

答案 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

与所有方面一样,这种方法有一些缺点(文中概述),但绝对值得知道作为一种选择。