【发布时间】:2023-03-13 09:12:01
【问题描述】:
我使用caret 包中的train 函数调整randomForest 的mtry 参数。我的X 数据中只有48 列,但是train 返回mtry=50 作为最佳值,而这不是有效值(>48)。对此有何解释?
> dim(X)
[1] 93 48
> fit <- train(level~., data=data.frame(X,level), tuneLength=13)
> fit$finalModel
Call:
randomForest(x = x, y = y, mtry = param$mtry)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 50
OOB estimate of error rate: 2.15%
Confusion matrix:
high low class.error
high 81 1 0.01219512
low 1 10 0.09090909
不设置tuneLength参数就更惨了:
> fit <- train(level~., data=data.frame(X,level))
> fit$finalModel
Call:
randomForest(x = x, y = y, mtry = param$mtry)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 55
OOB estimate of error rate: 2.15%
Confusion matrix:
high low class.error
high 81 1 0.01219512
low 1 10 0.09090909
我不提供数据,因为它是机密的。但是这些数据并没有什么特别之处:每一列都是数值或者是因子,并且没有缺失值。
【问题讨论】:
-
如果没有可重复的数据,很难判断。作为第一个想法,您可以检查
fit$modelInfo$grid(X, level, 13)以确保网格生成没有发生奇怪的事情。 -
谢谢@charles。
fit$modelInfo$grid(X, level, 13)的输出中的最大值是48。 -
尝试使用
set.seed(1234)和X <- matrix(rep(rep(rnorm(48)), 93), nrow=93)的通用随机矩阵并诱导分类X[1:82,] <- X[1:82,] + 0.5和X[83:93,] <- X[83:93,] - 0.5。这是非常粗略的,但应该适用于这些目的。运行相同的分析。这应该在每次拆分时只返回 5 个变量,以确保一切正常工作。另外,也许您可以分享您的数据的str(随意将列重命名为 X1-X48),以便我们尽可能地模仿它?
标签: r random-forest r-caret