我使用下面给出的C5.0在R中构建了一个分类模型:
library(C50)
library(caret)
a = read.csv("All_SRN.csv")
set.seed(123)
inTrain <- createDataPartition(a$anatomy, p = .70, list = FALSE)
training <- a[ inTrain,]
test <- a[-inTrain,]
Tree <- C5.0(anatomy ~ ., data = training,
trControl = trainControl(method = "repeatedcv", repeats = 10,
classProb = TRUE))
TreePred <- predict(Tree, test)
训练集的功能类似于 - examcard, coil_used, anatomy_region, bodypart_anatomy and anatomy
(目标类)。所有功能都是分类变量。总共有10k个奇数值,我将数据分成训练和测试数据。学习者在70:30比例的培训和测试设置中工作得很好,但是当我为测试集提供下面给出的新值时,问题出现了:
TreePred <- predict(Tree, test_add)
此处, test_add 包含已存在的测试集和一组新值,并且在执行学习器时无法对新值进行分类并引发以下错误:
Error in model.frame.default(object$Terms, newdata, na.action = na.action, : factor examcard has new levels
我尝试使用以下方法将新因子级别与现有级别合并:
Tree$xlevels[["examcard"]] <- union(Tree$xlevels[["examcard"]], levels(test_add$examcard))
但是,由于使用以下消息执行代码并且没有产生任何富有成效的结果,因此这并没有多大帮助:
predict code called exit with value 1
feaure考试卡在分类中占有很大的优势,因此无法忽略。如何对这些值进行分类?
答案 0 :(得分:1)
您无法在测试集中为训练集中不存在的因子级别创建预测。您的模型将没有这些新因子水平的系数。
如果您正在进行70/30分割,则需要使用caret::CreateDataPartition
重新分区数据...
...或您自己的分层样本函数,以确保所有级别都在训练集中表示:使用“split-apply-combine”方法:通过考试卡分割数据集,并为每个子集应用分割,然后结合训练子集和测试子集。
有关详细信息,请参阅this question。