【问题标题】:R - factor examcard has new levelsR - 因素考试卡有新的水平
【发布时间】:2015-07-14 09:30:30
【问题描述】:

我使用下面给出的 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 的比例划分的 trainingtest 集上表现出色,但是当我为测试集提供以下给出的新值时,问题就来了:

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

特征考试卡在分类中占有重要地位,因此不容忽视。如何对这些值集进行分类?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    更多详情请见this question

    【讨论】:

    • 我使用caret::CreateDataPartition 对我的数据集进行分区。我在阅读我的 CSV 文件时也使用了stringAsFactors = FALSE,因为在某些情况下,级别将是预先定义的,学习者将无法识别传递给它的任何新数据。有了这个,学习者C50::C5.0 只识别因子结果。
    • @NeelimaSeshadri 您应该在您的问题中包含您的CreateDataPartition 声明,因为这是您问题的根源。您应该考虑在examcard 上进行分层(或者可能是像paste(anatomy,examcard,sep="#") 这样的虚拟因素以保持类平衡,具体取决于数据集的大小)。此外,您应该考虑在分区之前分解examcard 和其他变量,以便训练和测试数据集之间的级别保持一致。
    • 训练集中完全不存在但测试集中存在的值怎么办?那仍然不会包含在分层样本中,对吧?
    • @NaiveBabes 我不认为你理解我。分层是分区过程的一部分(适用于 100% 的数据)。然后,您将确保因子的每个级别都出现在训练 (70%) 和测试集 (30%) 中。这可能是一个问题的唯一情况是该级别非常罕见(在数据集中仅出现 1-3 次)。您可以手动将它们强制放入训练集中。
    • 我理解你的建议。我正在尝试使用具有新值集的数据来验证模型。我已经用早先划分为 70:30 的训练和测试测试了模型,我现在为模型提供具有相同实例但不同值的值,这些值在训练和测试中都不存在。另外,您的意思是说,如果学习者不知道某个值,则必须再次对其进行分层,以便它成为训练数据的一部分?如果这很复杂,我很抱歉
    猜你喜欢
    • 2015-12-22
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2014-10-30
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多