R因子examcard有了新的水平

R因子examcard有了新的水平,r,classification,predict,training-data,test-data,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

我使用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)
TreePred <- predict(Tree, test_add)
此处,test\u 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))

feaure examcard在分类中占据着很大的首要地位,因此不可忽视。如何对这些值集进行分类?

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

如果要进行70/30分割,则需要使用
caret::CreateDataPartition
…重新划分数据

。。。或您自己的分层采样函数,以确保所有级别都在培训集中表示:使用“拆分-应用-合并”方法:通过examcard拆分数据集,并对每个子集应用拆分,然后合并培训子集和测试子集


有关更多详细信息,请参阅。

我使用
caret::CreateDataPartition
对数据集进行分区。在阅读CSV文件时,我还使用了
stringAsFactors=FALSE
,因为如果是因子,则级别将是预定义的,学习者将无法识别传递给它的任何新数据。既然如此,学习者
C50::C5.0
只识别因子结果。@NeelimaSeshadri您应该在问题中包含
CreateDataPartition
语句,因为这是问题的根源。你应该考虑在<代码>示例卡>代码>(或者可能是一个虚拟的因素,比如<代码>粘贴(解剖学,示例卡,SEP=“x”)<代码>,以保持类平衡,这取决于数据集的大小)。另外,在划分之前,应该考虑因子分解<代码>示例卡< /C>和其他变量,这样训练和测试数据集之间的水平是一致的。在训练集中存在但在测试集中不存在的值是什么?这还不包括在分层样本中,对吧?@天真的宝贝,我觉得你不理解我。分层是分区过程的一部分(适用于100%的数据)。然后,您将确保每个级别的因子都出现在培训(70%)和测试集(30%)中。唯一可能出现问题的情况是,该级别极不频繁(在数据集中仅出现1-3次)。你可以手动将它们强制加入训练集中。我理解你的建议。我试图用具有新值集的数据验证模型。我已经用前面划分为70:30的training and test对模型进行了测试,现在我为模型提供了具有相同实例但不同值的值,这些值在training和test中都不存在。另外,您的意思是说,如果学员不知道某个值,则必须再次对其进行分层,以便将其作为培训数据的一部分吗?如果这很复杂,我很抱歉
predict code called exit with value 1