mtry in Caret交叉验证随机森林方法
mtry in Caret cross validation Random Forest method
我有一个包含 499 个观测值和 1412 个变量的数据框。我将我的数据框分成训练集和测试集,并通过随机森林方法在 Caret 5 折交叉验证中尝试训练集。我的问题是随机森林方法的交叉验证如何选择 mtry 的值?例如,如果您查看绘图,为什么程序不选择 30 作为 mtry 的 statring 值?
要回答这个问题,需要检查射频模型的 train code。
从链接代码可以清楚地看出,如果指定了网格搜索,插入符号将使用 caret::var_seq
函数生成 mtry。
mtry = caret::var_seq(p = ncol(x),
classification = is.factor(y),
len = len)
从函数的帮助中可以看出,如果预测变量的数量少于 500,则会在 2 和 p 之间生成长度为 len 的简单值序列。对于较大数量的预测变量,序列是使用 log2 步骤创建的。
例如:
caret::var_seq(p = 1412,
classification = T,
len = 3)
#output
[1] 2 53 1412
如果指定 len = 1
,则使用 randomForest package 中的默认值:
mtry = if (!is.null(y) && !is.factor(y))
max(floor(ncol(x)/3), 1) else floor(sqrt(ncol(x)))
如果指定了随机搜索,则 caret 计算 mtry 为:
unique(sample(1:ncol(x), size = len, replace = TRUE)
换句话说你的情况:
unique(sample(1:1412 , size = 3, replace = TRUE))
#output
[1] 857 181 64
这里有一个例子:
library(caret)
#some data
z <- matrix(rnorm(100000), ncol = 1000)
colnames(z) = paste0("V", 1:1000)
#specify model evaluation
ctrl <- trainControl(method = "repeatedcv",
number = 10,
repeats = 1)
#train
fit_rf <- train(V1 ~.,
data = z,
method = "rf",
tuneLength = 3,
trControl = ctrl)
fit_rf$results
#output
mtry RMSE Rsquared MAE RMSESD RsquaredSD MAESD
1 2 0.8030665 0.11101385 0.5889436 0.2824439 0.09644324 0.1650381
2 44 0.8146023 0.09481331 0.6014367 0.2821711 0.10082099 0.1665926
3 998 0.8420705 0.03190199 0.6375570 0.2503089 0.03205335 0.1550021
与通过以下操作获得的 mtry 值相同:
caret::var_seq(p = 999,
classification = F,
len = 3)
指定随机搜索时:
ctrl <- trainControl(method = "repeatedcv",
number = 10,
repeats = 1,
search = "random")
fit_rf <- train(V1 ~.,
data = z,
method = "rf",
tuneLength = 3,
trControl = ctrl)
fit_rf$results
#output
mtry RMSE Rsquared MAE RMSESD RsquaredSD MAESD
1 350 0.8571330 0.10195986 0.6214896 0.1637944 0.1385415 0.09904165
2 826 0.8644918 0.07775553 0.6286101 0.1725390 0.1264605 0.10587076
3 855 0.8636692 0.07025535 0.6232729 0.1754164 0.1332580 0.10438083
或通过以下方式获得的一些其他随机数:
unique(sample(1:999 , size = 3, replace = TRUE))
要将 mtry 固定为所需值,最好提供您自己的搜索网格。有关如何执行此操作的教程以及更多内容,请参见 here。
我有一个包含 499 个观测值和 1412 个变量的数据框。我将我的数据框分成训练集和测试集,并通过随机森林方法在 Caret 5 折交叉验证中尝试训练集。我的问题是随机森林方法的交叉验证如何选择 mtry 的值?例如,如果您查看绘图,为什么程序不选择 30 作为 mtry 的 statring 值?
要回答这个问题,需要检查射频模型的 train code。
从链接代码可以清楚地看出,如果指定了网格搜索,插入符号将使用 caret::var_seq
函数生成 mtry。
mtry = caret::var_seq(p = ncol(x),
classification = is.factor(y),
len = len)
从函数的帮助中可以看出,如果预测变量的数量少于 500,则会在 2 和 p 之间生成长度为 len 的简单值序列。对于较大数量的预测变量,序列是使用 log2 步骤创建的。
例如:
caret::var_seq(p = 1412,
classification = T,
len = 3)
#output
[1] 2 53 1412
如果指定 len = 1
,则使用 randomForest package 中的默认值:
mtry = if (!is.null(y) && !is.factor(y))
max(floor(ncol(x)/3), 1) else floor(sqrt(ncol(x)))
如果指定了随机搜索,则 caret 计算 mtry 为:
unique(sample(1:ncol(x), size = len, replace = TRUE)
换句话说你的情况:
unique(sample(1:1412 , size = 3, replace = TRUE))
#output
[1] 857 181 64
这里有一个例子:
library(caret)
#some data
z <- matrix(rnorm(100000), ncol = 1000)
colnames(z) = paste0("V", 1:1000)
#specify model evaluation
ctrl <- trainControl(method = "repeatedcv",
number = 10,
repeats = 1)
#train
fit_rf <- train(V1 ~.,
data = z,
method = "rf",
tuneLength = 3,
trControl = ctrl)
fit_rf$results
#output
mtry RMSE Rsquared MAE RMSESD RsquaredSD MAESD
1 2 0.8030665 0.11101385 0.5889436 0.2824439 0.09644324 0.1650381
2 44 0.8146023 0.09481331 0.6014367 0.2821711 0.10082099 0.1665926
3 998 0.8420705 0.03190199 0.6375570 0.2503089 0.03205335 0.1550021
与通过以下操作获得的 mtry 值相同:
caret::var_seq(p = 999,
classification = F,
len = 3)
指定随机搜索时:
ctrl <- trainControl(method = "repeatedcv",
number = 10,
repeats = 1,
search = "random")
fit_rf <- train(V1 ~.,
data = z,
method = "rf",
tuneLength = 3,
trControl = ctrl)
fit_rf$results
#output
mtry RMSE Rsquared MAE RMSESD RsquaredSD MAESD
1 350 0.8571330 0.10195986 0.6214896 0.1637944 0.1385415 0.09904165
2 826 0.8644918 0.07775553 0.6286101 0.1725390 0.1264605 0.10587076
3 855 0.8636692 0.07025535 0.6232729 0.1754164 0.1332580 0.10438083
或通过以下方式获得的一些其他随机数:
unique(sample(1:999 , size = 3, replace = TRUE))
要将 mtry 固定为所需值,最好提供您自己的搜索网格。有关如何执行此操作的教程以及更多内容,请参见 here。