Caret的dummyVars生成不存在的town虚拟变量问题求助
问题原因及解决方法
原因
出现不存在的town_C/town_D/town_E虚拟变量,核心原因是**town列的因子水平包含了当前数据集里没有的类别**:
- 要么是你在同一个R会话中,之前处理过包含C/D/E类别的
town数据,当前读取的train数据中town列被自动转换为因子时,继承了之前的因子水平; - 要么是读取CSV时,旧版本R默认
stringsAsFactors=TRUE,而CSV文件本身存在隐藏的C/D/E条目(比如未注意到的行),导致生成的因子包含多余水平。
解决办法
方法1:重置因子水平
先将town列转换为仅包含当前数据中实际存在的类别的因子,再生成虚拟变量:
library(caret) train <- read.csv("HW1PB4Data_train.csv", header = TRUE) # 重置town的因子水平,只保留当前数据里的唯一值 train$town <- factor(train$town, levels = unique(train$town)) # 生成虚拟变量 dummy <- dummyVars("~ .", data = train) train2 <- data.frame(predict(dummy, newdata = train)) train2
方法2:读取数据时禁用自动转因子
读取CSV时指定stringsAsFactors=FALSE,避免继承旧的因子水平,再手动转换为因子:
library(caret) train <- read.csv("HW1PB4Data_train.csv", header = TRUE, stringsAsFactors = FALSE) train$town <- factor(train$town) dummy <- dummyVars("~ .", data = train) train2 <- data.frame(predict(dummy, newdata = train)) train2
方法3:用levelsOnly参数强制基于当前数据生成
在dummyVars中添加levelsOnly=TRUE参数,让函数仅根据当前数据集的实际类别生成虚拟变量:
library(caret) train <- read.csv("HW1PB4Data_train.csv", header = TRUE) dummy <- dummyVars("~ .", data = train, levelsOnly = TRUE) train2 <- data.frame(predict(dummy, newdata = train)) train2
内容的提问来源于stack exchange,提问作者user176556
相关产品推荐
相关产品推荐

