Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 获取插入符号';nnet的s模型参数_R_R Caret_Nnet - Fatal编程技术网

R 获取插入符号';nnet的s模型参数

R 获取插入符号';nnet的s模型参数,r,r-caret,nnet,R,R Caret,Nnet,我在为nnet提取插入符号的最终模型参数时遇到问题。如果我对caret::train和nnet::nnet使用完全相同的参数,我(有时)会得到很大的差异。我是否忘记了一个参数,或者这是由于神经网络的计算算法?我知道我可以使用predict for caret_net(在下面的示例中),但我仍然希望仅使用nnet复制结果 例如: library(nnet) library(caret) len <- 100 set.seed(4321) X <- data.frame(x1 = rn

我在为nnet提取插入符号的最终模型参数时遇到问题。如果我对caret::train和nnet::nnet使用完全相同的参数,我(有时)会得到很大的差异。我是否忘记了一个参数,或者这是由于神经网络的计算算法?我知道我可以使用predict for caret_net(在下面的示例中),但我仍然希望仅使用nnet复制结果

例如:

library(nnet)
library(caret)

len <- 100
set.seed(4321)
X <- data.frame(x1 = rnorm(len, 40, 25), x2 = rnorm(len, 70, 4), x3 = rnorm(len, 1.6, 0.3))
y <- 20000 + X$x1 * 3 - X$x1*X$x2 * 4 - (X$x3**4) * 7 + rnorm(len, 0, 4)
XY <- cbind(X, y)

# pre-processing
preProcPrms <- preProcess(XY, method = c("center", "scale"))
XY_pre <- predict(preProcPrms, XY)

# caret-nnet
controlList <- trainControl(method = "cv", number = 5)
tuneMatrix <- expand.grid(size = c(1, 2), decay = c(0, 0.1))

caret_net <- train(x = XY_pre[ , colnames(XY_pre) != "y"],
                   y = XY_pre[ , colnames(XY_pre) == "y"],
                   method = "nnet",
                   linout = TRUE,
                   TRACE = FALSE,
                   maxit = 100,
                   tuneGrid = tuneMatrix,
                   trControl = controlList)

# nnet-nnet
nnet_net <- nnet(x = XY_pre[ , colnames(XY_pre) != "y"],
                 y = XY_pre[ , colnames(XY_pre) == "y"],
                 linout = caret_net$finalModel$param$linout,
                 TRACE = caret_net$finalModel$param$TRACE,
                 size = caret_net$bestTune$size,
                 decay = caret_net$bestTune$decay,
                 entropy = caret_net$finalModel$entropy,
                 maxit = 100)

# print
print(caret_net$finalModel)
print(nnet_net)

y_caret <- predict(caret_net$finalModel, XY_pre[ , colnames(XY_pre) != "y"])
y_nnet <- predict(nnet_net, XY_pre[ , colnames(XY_pre) != "y"])

plot(y_caret, y_nnet, main = "Hard to spot, but y_caret <> y_nnet - which prm have I forgotten?")
hist(y_caret - y_nnet)
库(nnet)
图书馆(插入符号)

len如评论中所述,差异是由不同的种子引起的。引用@Artem Sokolov的话:神经网络训练通常从随机状态开始。可以合理地预期caret::train和nnet::nnet从两种不同的状态开始。因此,它们可能收敛到两个不同的局部最优解

要获得可复制的模型,请从同一种子开始:

controlList <- trainControl(method = "none", seeds = 1)
tuneMatrix <- expand.grid(size = 2, decay = 0)

set.seed(1)
caret_net <- train(x = XY_pre[ , colnames(XY_pre) != "y"],
                   y = XY_pre[ , colnames(XY_pre) == "y"],
                   method = "nnet",
                   linout = TRUE,
                   TRACE = FALSE,
                   maxit = 100,
                   tuneGrid = tuneMatrix,
                   trControl = controlList)

set.seed(1)
nnet_net <- nnet(x = XY_pre[ , colnames(XY_pre) != "y"],
                 y = XY_pre[ , colnames(XY_pre) == "y"],
                 linout = caret_net$finalModel$param$linout,
                 TRACE = caret_net$finalModel$param$TRACE,
                 size = caret_net$bestTune$size,
                 decay = caret_net$bestTune$decay,
                 entropy = caret_net$finalModel$entropy,
                 maxit = 100)

y_caret <- predict(caret_net, XY_pre[ , colnames(XY_pre) != "y"])
y_nnet <- predict(nnet_net, XY_pre[ , colnames(XY_pre) != "y"])


all.equal(as.vector(y_caret[,1]), y_nnet[,1])
#TRUE

controlList如评论中所述,差异是由不同的种子引起的。引用@Artem Sokolov的话:神经网络训练通常从随机状态开始。可以合理地预期caret::train和nnet::nnet从两种不同的状态开始。因此,它们可能收敛到两个不同的局部最优解

要获得可复制的模型,请从同一种子开始:

controlList <- trainControl(method = "none", seeds = 1)
tuneMatrix <- expand.grid(size = 2, decay = 0)

set.seed(1)
caret_net <- train(x = XY_pre[ , colnames(XY_pre) != "y"],
                   y = XY_pre[ , colnames(XY_pre) == "y"],
                   method = "nnet",
                   linout = TRUE,
                   TRACE = FALSE,
                   maxit = 100,
                   tuneGrid = tuneMatrix,
                   trControl = controlList)

set.seed(1)
nnet_net <- nnet(x = XY_pre[ , colnames(XY_pre) != "y"],
                 y = XY_pre[ , colnames(XY_pre) == "y"],
                 linout = caret_net$finalModel$param$linout,
                 TRACE = caret_net$finalModel$param$TRACE,
                 size = caret_net$bestTune$size,
                 decay = caret_net$bestTune$decay,
                 entropy = caret_net$finalModel$entropy,
                 maxit = 100)

y_caret <- predict(caret_net, XY_pre[ , colnames(XY_pre) != "y"])
y_nnet <- predict(nnet_net, XY_pre[ , colnames(XY_pre) != "y"])


all.equal(as.vector(y_caret[,1]), y_nnet[,1])
#TRUE

controlList关于
caret
和基线包之间差异的问题经常出现。很多时候,这种差异可以追溯到随机数的产生。神经网络训练通常从随机状态开始。由于我在代码中的任何地方都没有看到
set.seed
,因此可以合理地预期
caret::train
nnet::nnet
从两种不同的状态开始。因此,它们可能会收敛到两个不同的局部最优解。有时差异相当大(但无法构建更好的示例,因为a尚未找到原因)。我同意@Artem Sokolov使用不同种子运行
nnet
模型会产生与carets模型类似的变化。在两个模型之前设置相同的种子不会有多大效果,因为插入符号和nnet涉及不同的操作。请尝试以下实验:(i)将元参数调整矩阵设置为仅包含一组参数;(ii)在
caret::train
之前和
nnet::nnet
之前设置相同的随机种子。因为<代码> CART < /C>只考虑一组元参数,它应该产生一个匹配您自己的代码> NNET调用的单一模型.@ ARTEM索科洛夫,这确实提供了相同的RMSE。很多时候,这种差异可以追溯到随机数的产生。神经网络训练通常从随机状态开始。由于我在代码中的任何地方都没有看到
set.seed
,因此可以合理地预期
caret::train
nnet::nnet
从两种不同的状态开始。因此,它们可能会收敛到两个不同的局部最优解。有时差异相当大(但无法构建更好的示例,因为a尚未找到原因)。我同意@Artem Sokolov使用不同种子运行
nnet
模型会产生与carets模型类似的变化。在两个模型之前设置相同的种子不会有多大效果,因为插入符号和nnet涉及不同的操作。请尝试以下实验:(i)将元参数调整矩阵设置为仅包含一组参数;(ii)在
caret::train
之前和
nnet::nnet
之前设置相同的随机种子。因为<代码> CART < /C>只考虑一组元参数,它应该产生一个匹配您自己的代码> NNET调用的单一模型。@ ARTEM索科洛夫,这确实提供了相同的RMSE。