在R的caret包中构建回归模型:因子纳入与预处理问题咨询
Caret包回归模型:数值型与因子型变量处理问题
问题1:在caret包中构建回归模型时,同时纳入数值型与因子型变量的正确方式是什么?
- 先确保因子型变量被正确识别为
factor类型:比如示例代码里用as.factor(mydata$dir)把字符向量转成因子,这一步是必要的,避免caret把类别变量误判为数值变量处理 - 直接用公式语法(比如
hp ~ .)即可,caret会根据你选择的模型类型自动适配因子处理逻辑:- 对于线性模型(如glm、pls),caret会自动将因子转换为虚拟变量(哑变量),比如4水平的因子会生成3个虚拟变量,规避多重共线性问题
- 对于树模型(如ranger随机森林)、KNN、SVM这类模型,caret会直接保留因子的类别属性,模型内部会自行处理类别输入
- 不需要手动对因子做额外编码,
train函数会适配不同模型的要求
问题2:中心化(center)和标准化(scale)预处理对因子型变量是如何生效的?
center(减去均值实现中心化)和scale(除以标准差实现标准化)这两个预处理操作仅针对数值型变量生效,完全不会处理因子型变量- caret的
preProcess函数默认只对numeric或integer类型的变量执行这类数值变换,因子变量会被直接跳过 - 你可以自行验证:用
preProcess(mydata, c('center','scale')) %>% predict(mydata)查看预处理后的数据集,会发现dir因子列完全没有变化,只有mpg、disp等数值列被做了中心化标准化处理
示例代码
library(caret) data("mtcars") mydata = mtcars[, -c(8,9)] set.seed(100) mydata$dir = sample(x=c("N", "E", "S", "W"), size = 32, replace = T) mydata$dir = as.factor(mydata$dir) class(mydata$dir) # Factor with four levels MyControl = trainControl( method = "repeatedcv", number = 5, repeats = 2, verboseIter = TRUE, savePredictions = "final" ) model_glm <- train( hp ~ ., data = mydata, method = "glm", metric = "RMSE", preProcess = c('center', 'scale'), trControl = MyControl ) model_pls <- train( hp ~ ., data = mydata, method = "pls", metric = "RMSE", preProcess = c('center', 'scale'), trControl = MyControl ) model_rf <- train( hp ~ ., data = mydata, tuneLength = 5, method = "ranger", metric = "RMSE", preProcess = c('center', 'scale'), trControl = MyControl ) model_knn <- train( hp ~ ., data = mydata, tuneLength = 5, method = "knn", metric = "RMSE", preProcess = c('center', 'scale'), trControl = MyControl ) model_svmr <- train( hp ~ ., data = mydata, tuneLength = 5, method = "svmRadial", metric = "RMSE", preProcess = c('center', 'scale'), trControl = MyControl )
内容的提问来源于stack exchange,提问作者Yang Yang
相关产品推荐
相关产品推荐

