R 中的 Ensemble 模型和调优错误
Error with Ensemble models and tuning in R
我一直在尝试在 R 中使用 Ensemble 方法,并在 BostonHousing2 数据集上尝试插入符模型的集成。在设置贪婪系综和线性系综时,出现错误。代码如下:
library(caret)
library(caretEnsemble)
library(mlbench)
data(BostonHousing2)
X <- model.matrix(cmedv~crim+zn+indus+chas+nox+rm+age+dis+
rad+tax+ptratio+b+lstat+lat+lon, BostonHousing2)[,-1]
X <- data.frame(X)
Y <- BostonHousing2$cmedv
train <- runif(nrow(X)) <= 0.7
folds=5
repeats=1
myControl <- trainControl(method='cv', number=folds, repeats=repeats, returnResamp='none',
returnData=FALSE, savePredictions=TRUE,
verboseIter=TRUE, allowParallel=TRUE,
index=createMultiFolds(Y[train], k=folds, times=repeats))
PP <- c('center', 'scale')
model1 <- train(X[train,], Y[train], method='gbm', trControl=myControl,
tuneGrid=expand.grid(.n.trees=500, .interaction.depth=15, .shrinkage = 0.01))
model2 <- train(X[train,], Y[train], method='blackboost', trControl=myControl)
model3 <- train(X[train,], Y[train], method='parRF', trControl=myControl)
model4 <- train(X[train,], Y[train], method='mlpWeightDecay', trControl=myControl, trace=FALSE, preProcess=PP)
model5 <- train(X[train,], Y[train], method='ppr', trControl=myControl, preProcess=PP)
model6 <- train(X[train,], Y[train], method='earth', trControl=myControl, preProcess=PP)
model7 <- train(X[train,], Y[train], method='glm', trControl=myControl, preProcess=PP)
model8 <- train(X[train,], Y[train], method='svmRadial', trControl=myControl, preProcess=PP)
model9 <- train(X[train,], Y[train], method='gam', trControl=myControl, preProcess=PP)
model10 <- train(X[train,], Y[train], method='glmnet', trControl=myControl, preProcess=PP)
all.models <- list(model1, model2, model3, model4, model5, model6, model7, model8, model9, model10)
names(all.models) <- sapply(all.models, function(x) x$method)
sort(sapply(all.models, function(x) min(x$results$RMSE)))
greedy <- caretEnsemble(all.models, iter=1000L)
Error: is(list_of_models, "caretList") is not TRUE
有几个例子让我卡住了:在设置 model1 时,我收到以下错误消息:
The tuning parameter grid should have columns n.trees, interaction.depth, shrinkage, n.minobsinnode
此外,在设置贪婪集成和线性集成时,我在组合模型时遇到列表错误。请请求帮助。
PS:抱歉,如果这些问题需要单独提出。
您必须使用函数 caretlist()
才能创建可以传递给 caretEnsemble
的插入符号模型列表,如下面的插图示例所示:
model_list <- caretList(
Class~., data=training,
trControl=my_control,
methodList=c("glm", "rpart")
)
回答您的第二个问题,您希望以下行做什么?
expand.grid(.n.trees=500, .interaction.depth=15, .shrinkage = 0.01)
您可以测试它只是三个值的单个组合。您应该在任何列中至少有两个值以生成超过 1 个参数值组合以进行调整。此外,为什么名称有一个额外的“。” (点)开头?
回答第二部分:
method="gbm" 的更新版本要求在 tuneGrid 中存在 n.trees、interaction.depth、收缩、n.minobsinnode。
tuneGrid=expand.grid(.n.trees=500, .interaction.depth=6, .shrinkage = 0.01,.n.minobsinnode = c(10))
在上述情况下就可以正常工作。
如果我们使用代码 -
将普通列表 'all.models' 转换为 Caret_List,它就会起作用
class(all.models) <- "caretList"
谢谢!
我一直在尝试在 R 中使用 Ensemble 方法,并在 BostonHousing2 数据集上尝试插入符模型的集成。在设置贪婪系综和线性系综时,出现错误。代码如下:
library(caret)
library(caretEnsemble)
library(mlbench)
data(BostonHousing2)
X <- model.matrix(cmedv~crim+zn+indus+chas+nox+rm+age+dis+
rad+tax+ptratio+b+lstat+lat+lon, BostonHousing2)[,-1]
X <- data.frame(X)
Y <- BostonHousing2$cmedv
train <- runif(nrow(X)) <= 0.7
folds=5
repeats=1
myControl <- trainControl(method='cv', number=folds, repeats=repeats, returnResamp='none',
returnData=FALSE, savePredictions=TRUE,
verboseIter=TRUE, allowParallel=TRUE,
index=createMultiFolds(Y[train], k=folds, times=repeats))
PP <- c('center', 'scale')
model1 <- train(X[train,], Y[train], method='gbm', trControl=myControl,
tuneGrid=expand.grid(.n.trees=500, .interaction.depth=15, .shrinkage = 0.01))
model2 <- train(X[train,], Y[train], method='blackboost', trControl=myControl)
model3 <- train(X[train,], Y[train], method='parRF', trControl=myControl)
model4 <- train(X[train,], Y[train], method='mlpWeightDecay', trControl=myControl, trace=FALSE, preProcess=PP)
model5 <- train(X[train,], Y[train], method='ppr', trControl=myControl, preProcess=PP)
model6 <- train(X[train,], Y[train], method='earth', trControl=myControl, preProcess=PP)
model7 <- train(X[train,], Y[train], method='glm', trControl=myControl, preProcess=PP)
model8 <- train(X[train,], Y[train], method='svmRadial', trControl=myControl, preProcess=PP)
model9 <- train(X[train,], Y[train], method='gam', trControl=myControl, preProcess=PP)
model10 <- train(X[train,], Y[train], method='glmnet', trControl=myControl, preProcess=PP)
all.models <- list(model1, model2, model3, model4, model5, model6, model7, model8, model9, model10)
names(all.models) <- sapply(all.models, function(x) x$method)
sort(sapply(all.models, function(x) min(x$results$RMSE)))
greedy <- caretEnsemble(all.models, iter=1000L)
Error: is(list_of_models, "caretList") is not TRUE
有几个例子让我卡住了:在设置 model1 时,我收到以下错误消息:
The tuning parameter grid should have columns n.trees, interaction.depth, shrinkage, n.minobsinnode
此外,在设置贪婪集成和线性集成时,我在组合模型时遇到列表错误。请请求帮助。
PS:抱歉,如果这些问题需要单独提出。
您必须使用函数 caretlist()
才能创建可以传递给 caretEnsemble
的插入符号模型列表,如下面的插图示例所示:
model_list <- caretList(
Class~., data=training,
trControl=my_control,
methodList=c("glm", "rpart")
)
回答您的第二个问题,您希望以下行做什么?
expand.grid(.n.trees=500, .interaction.depth=15, .shrinkage = 0.01)
您可以测试它只是三个值的单个组合。您应该在任何列中至少有两个值以生成超过 1 个参数值组合以进行调整。此外,为什么名称有一个额外的“。” (点)开头?
回答第二部分:
method="gbm" 的更新版本要求在 tuneGrid 中存在 n.trees、interaction.depth、收缩、n.minobsinnode。
tuneGrid=expand.grid(.n.trees=500, .interaction.depth=6, .shrinkage = 0.01,.n.minobsinnode = c(10))
在上述情况下就可以正常工作。
如果我们使用代码 -
将普通列表 'all.models' 转换为 Caret_List,它就会起作用class(all.models) <- "caretList"
谢谢!