的R - 因子examcard有新的水平(R - factor examcard has new

2019-10-23 20:29发布

我建了一个分类模型中的R使用C5.0如下:

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 examcard持有分级首要的一个很好的协议,因此不能忽视。 如何能够将这些设定值进行分类?

Answer 1:

您不能创建在您的测试组,在您的训练集中缺少因子水平的预测。 您的模型不会对这些新的因子水平系数。

如果你正在做一个70:30的比例分摊,则需要使用重新分区数据caret::CreateDataPartition ...

...或者你自己的分层抽样的功能,以确保所有级别的训练集表示:使用“分申请-结合”的方法:分割数据通过examcard集,并为每个子集,申请拆分,然后再结合训练子集和检验子集。

见这个问题的更多细节。



文章来源: R - factor examcard has new levels