caret包构建nnet分类器时自定义tuneGrid未生效问题咨询
问题根因
这不是caret包的bug,属于代码书写疏漏,核心原因是R语言对函数参数名的大小写识别强敏感,你写错了train()函数的自定义网格参数名。
train()函数官方定义的自定义调参网格参数是驼峰格式的tuneGrid,你在代码里写的是全小写的tunegrid,这个命名完全不被函数识别。- 当函数接收不到合法的
tuneGrid入参时,会自动忽略你传入的无效参数,直接调用caret内置的nnet默认调参网格执行训练,最终就出现了实际调参取值(仅遍历size=1/3/5、decay=0/1e-4/0.1共9组组合)和你自定义的32组参数范围完全不匹配的现象。
修正方法
将代码里的参数名调整为正确的驼峰格式即可,修正后的代码如下:
nnet_grid <- expand.grid( .decay = c(0.5, 0.1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7), .size = c(3, 5, 10, 20) ) features.nn <- train( label ~ ., method = "nnet", trControl = trControl, data = features, tuneGrid = nnet_grid, # 修正此处参数名的大小写写错问题 verbose = FALSE )
额外提示:nnet模型对输入特征的尺度敏感度极高,建议在
train()函数中补充preProcess = c("center", "scale")参数,对特征做标准化后再开展训练,避免模型因特征数值范围差异过大出现收敛异常、准确率偏低的问题。
内容的提问来源于stack exchange,提问作者Quasease
相关产品推荐
相关产品推荐

