使用Logloss与SMOTE构建决策树时遇报错求助
问题分析与解决方案
看起来你的核心问题是目标变量TripType被R识别为数值型变量,导致caret把整个任务判定为回归问题,而非多分类任务——这是两个报错的共同根源,下面具体拆解并给出修复方案:
报错1:无法计算回归任务的类别概率
你看到的:
Error in ctrl$summaryFunction(testOutput, lev, method) : 'data' should have columns consistent with 'lev'
In addition: Warning message: In train.default(x, y, weights = w, ...) : cannot compute class probabilities for regression
原因是:
TripType是数值型,caret默认按回归任务处理;- 但你在
trainControl里设置了classProbs=TRUE,还指定了mnLogLoss(多分类对数损失,仅适用于分类任务),两者冲突导致报错。
报错2:SMOTE仅支持分类任务
你看到的:
Error: sampling methods are only implemented for classification problems
原因是:
SMOTE是专门用来解决分类任务中类别不平衡的采样方法,回归任务没有“类别”的概念,所以caret拒绝执行。
修复步骤
沃尔玛TripType竞赛是典型的多分类任务,你需要先把TripType转换为因子(factor)类型,让caret正确识别任务类型:
1. 转换目标变量类型
先处理你的数据集,把TripType转为因子:
# 优先处理原始数据集,再拆分训练/测试集(避免重复操作) data$TripType <- as.factor(data$TripType) # 重新拆分训练测试集(如果之前的拆分是基于未转换的数据集) set.seed(1234) ind <- sample(2, nrow(data), replace=TRUE, prob=c(0.8, 0.2)) train <- data[ind==1,] test <- data[ind==2,] # 可以用str()验证类型是否正确 str(train$TripType)
2. 重新运行你的代码
现在caret会识别这是分类任务,你的代码应该能正常运行:
带logloss的交叉验证决策树
ctrl <- trainControl(method="cv", number=5, classProbs=TRUE, summaryFunction=mnLogLoss) ll_tree <- train(TripType~., data=train, method="rpart", metric="logLoss", trControl=ctrl)
结合SMOTE的决策树
ctrl2 <- trainControl(method="cv", number=5, classProbs=TRUE, summaryFunction=mnLogLoss, sampling = "smote") smote_tree <- train(TripType~., data=train, trControl=ctrl2, method="rpart")
内容的提问来源于stack exchange,提问作者D. Romanski
相关产品推荐
相关产品推荐

