Tidymodels决策树中分类变量按数值变量划分的问题求助
解决决策树按哑变量数值划分而非原始类别问题
核心原因
你用step_dummy生成的哑变量是数值型的0/1变量,决策树算法会把这类变量当作连续型变量处理,因此出现job_other<0.5这类基于阈值的划分规则,而非识别原始的职业类别。
解决方案
决策树(如rpart、partykit等包的实现)本身支持直接处理因子类型(factor)的分类变量,不需要提前做哑编码。调整你的预处理流程即可:
移除分类变量的哑编码步骤
修改你的recipe,不对分类变量执行step_dummy,确保原始分类变量以因子类型传入模型:# 假设你的响应变量是housing_burden,预测变量包含job等分类变量 rec <- recipe(housing_burden ~ ., data = your_data) %>% # 仅对需要的变量做其他预处理(比如中心化/标准化数值变量),跳过分类变量的哑编码 step_center(all_numeric_predictors()) %>% step_scale(all_numeric_predictors())确保分类变量是因子类型
如果原始数据中分类变量是字符型(character),先转换为因子:your_data$job <- as.factor(your_data$job) # 批量转换所有分类变量 your_data <- your_data %>% mutate(across(where(is.character), as.factor))重新训练决策树
用处理后的数据集训练模型,此时决策树会基于原始类别生成划分规则,比如job == "正式工"、job %in% c("临时工", "个体户")这类符合你问卷设定的逻辑。
补充说明
如果因特殊需求必须保留哑编码,可将生成的哑变量转换为因子(但不推荐,会增加变量数量且无必要):
rec <- recipe(housing_burden ~ ., data = your_data) %>% step_dummy(all_nominal_predictors(), one_hot = TRUE) %>% step_mutate(across(contains("job_"), as.factor))
内容的提问来源于stack exchange,提问作者chuchu_yelin
相关产品推荐
相关产品推荐

