R因子考试卡有新的水平

时间:2015-07-14 09:30:31

标签: r classification predict training-data test-data

我使用下面给出的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考试卡在分类中占有很大的优势,因此无法忽略。如何对这些值进行分类?

1 个答案:

答案 0 :(得分:1)

您无法在测试集中为训练集中不存在的因子级别创建预测。您的模型将没有这些新因子水平的系数。

如果您正在进行70/30分割,则需要使用caret::CreateDataPartition重新分区数据...

...或您自己的分层样本函数,以确保所有级别都在训练集中表示:使用“split-apply-combine”方法:通过考试卡分割数据集,并为每个子集应用分割,然后结合训练子集和测试子集。

有关详细信息,请参阅this question