使用tidymodels搭建CatBoost分类模型时出现标签类型错误如何解决
报错原因
CatBoost的R引擎不直接接收因子型分类标签,要求分类任务的标签必须为integer或double数值类型,你当前的二分类标签为因子格式,传入后触发类型不匹配报错。
排查步骤
- 运行代码确认标签类型:
class(cb_train$covid_vaccination),返回结果为factor即可确认是类型不匹配问题。 - 确认预处理流程未修改标签属性:你当前的recipe仅处理预测变量,未对标签列做类型转换,因此标签保持原始因子格式传入模型。
解决方法
二选一即可,推荐第二种方案不修改原始数据集,符合tidymodels工作流规范:
- 提前转换原始训练集标签:
cb_train <- cb_train %>% mutate(covid_vaccination = as.integer(covid_vaccination) - 1)
减1操作是因为R中因子转整数默认从1开始,CatBoost的Logloss损失函数要求二分类标签取值为0/1。
- 在预处理recipe中新增标签转换步骤:
cb_rec <- recipe(covid_vaccination ~ ., data = cb_train) %>% step_mutate(covid_vaccination = as.integer(covid_vaccination) - 1) %>% step_unknown(all_nominal_predictors()) %>% step_impute_median(all_numeric_predictors()) %>% step_nzv(all_predictors())
注意事项
- 你注释掉的
step_dummy不需要打开,CatBoost原生支持类别特征输入,独热编码反而会降低模型效果。 - 后续若需要输出分类报告、混淆矩阵等结果,可将预测的0/1结果转回对应因子水平,和原始标签格式对齐即可。
内容的提问来源于stack exchange,提问作者Robert Tedesco
相关产品推荐
相关产品推荐

