代码之家  ›  专栏  ›  技术社区  ›  GeoCat333

混淆矩阵中缺失因子的条件替换

  •  1
  • GeoCat333  · 技术社区  · 7 年前

    我正在为一个大型样本点数据集创建混淆矩阵,需要使用 confusionMatrix 通过R包实现的功能 caret (我使用的是输出的准确度指标,即我不能仅使用 table ). 应该有 每组样本点的类别/系数,即i应具有3x3个表格,但一些参考和预测数据包含的类别少于两个,或不重叠的类别,例如:

     Class  A  B             Class  C
       A    8  2               A    3
       B    1  0
       C    1  7
    * columns = reference data, rows = predicted data
    

    我需要相同数量的类/因子才能运行 混淆矩阵 ,所以我要做的是有条件地用零替换缺少的因子,如下所示:

     Class  A  B  C          Class  A  B  C
       A    8  2  0            A    0  0  3
       B    1  0  0            B    0  0  0
       C    1  7  0            C    0  0  0
    

    我使用的预测/参考数据是数值列表,所以我不会在这里复制它们;对于我上面提供的示例,您可以将其视为一个向量,如下所示:

    predicted.data[1] = A A A A A A A A A A B C C C C C C C C
    reference.data[1] = A A A A A A A A A A B B B B B B B B B
    predicted.data[2] = A A A
    reference.data[2] = C C C 
    

    我试图创建某种条件 if 陈述大致如下:

       tab <- table(predicted.data, reference.data)
       if(nrow(tab) != ncol(tab){
       classes <- c("A","B","C")
       missing <- setdiff(classes,names(tab))
       ...
       ...
       }
    
    # would put in a loop/index actual data obviously 
    

    但我似乎无法让它按我想要的方式工作。有什么想法吗?

    编辑:我使用的实际数据示例(通过光栅/形状文件)和错误消息;数据长度相同,但没有参考数据被分类为“2”:

    > mask.vals[[4]]
      [1] 0 4 0 0 0 2 4 0 4 0 4 0 0 0 0 0 4 0 4 2 0 0 0 0 0 0 0 4 0 0 0 0 0 0 4 0 
    0 0 0 0 0 0 0 2 2 0 2 0 4 0 0 4 2 0 0 4 0 0 0 0 0 0 0 2 0 2 0 2 4 0 4
     [72] 4 0 0 0 0 4 4 0 0 0 0 0 0 0 4 0 0 0 0 4 4 4 4 0 4 4 4 4 4 0 4 4 4 0 4 0 
    0 4 4 4 4 4 4
    
    > ref.data[[4]]@data$CLASS_ID
      [1] 0 4 4 4 4 4 4 4 4 4 4 4 4 4 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 
    4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
     [72] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 
    4 4 4 4 4 4 4
    
    > confusionMatrix(data = mask.vals[[4]], reference = ref.data[[4]]@data$CLASS_ID)
    
    Error in confusionMatrix.default(data = mask.vals[[4]], reference = ref.data[[4]]@data$CLASS_ID) : 
      the data cannot have more levels than the reference
    

    i、 e.需要从这一点出发:

    > table(mask.vals[[4]], ref.data[[4]]@data$CLASS_ID)
            0  4          
       0    2  67              
       2    0  9
       4    0  36
    

    对此:

            0  2  4          
       0    2  0  67              
       2    0  0  9
       4    0  0  36
    

    即使我为数据定义了三个级别(例如。 levels(ref.data[[4]]@data$CLASS_ID) <- c("0","2","4") factor(ref.data[[4]]@data$CLASS_ID, levels = c("0","2","4") ) ...

    1 回复  |  直到 7 年前
        1
  •  2
  •   eipi10    7 年前

    这个 caret confusionMatrix 函数返回一个n x n表,无论参考和/或预测向量中是否缺少某些级别。我想知道您是如何得到一个缺少一些参考数据列的混淆矩阵的。例如,使用内置 iris 数据框:

    library(caret)
    
    set.seed(2)
    dat = data.frame(ref=iris$Species, pred=sample(iris$Species))
    
    # Remove two levels from the reference data
    dat1 = dat[dat$ref=="setosa", ]
    
    # Get the confusion matrix
    cm1 = confusionMatrix(dat1$pred, dat1$ref)
    
    cm1$table
    
                Reference
    Prediction   setosa versicolor virginica
      setosa         15          0         0
      versicolor     15          0         0
      virginica      20          0         0
    
    # No overlap between reference and prediction
    dat2 = dat[dat$ref=="setosa" & dat$pred=="versicolor", ]
    
    # Get the confusion matrix
    cm2 = confusionMatrix(dat2$pred, dat2$ref)
    
    cm2$table
    
                Reference
    Prediction   setosa versicolor virginica
      setosa          0          0         0
      versicolor     15          0         0
      virginica       0          0         0
    

    在上述示例中 ref pred 列都被编码为因子,原始的三个级别 Species . 我们可以对其重新编码以降低空级别:

    dat2$ref = droplevels(dat2$ref)
    dat2$pred = droplevels(dat2$pred)
    

    您可以看到,每列中只存在一个因子级别:

    lapply(dat2, levels)    
    
    $ref [1] "setosa"
    
    $pred [1] "versicolor"
    

    但如果你跑 混淆矩阵 它现在抛出一个错误,因为两个向量的级别之间没有重叠:

    cm3 = confusionMatrix(dat2$pred, dat2$ref)
    

    confusionMatrix中出错。默认值(dat2$pred,dat2$ref):数据 必须包含与引用重叠的某些级别。

    更新: 如果在参考向量和预测向量中设置相同的因子级别, 混淆矩阵 将起作用。您已经更新了该问题,但它仍然不可复制,因此很难确定您的工作流程中哪里出了问题。现在,这里有一个与您在问题中所展示的类似的示例,在设置公共因子水平后,该示例按预期工作。

    library(caret)
    
    set.seed(2)
    mask.vals = sample(c(0,2,4), 100, replace=TRUE)
    ref.data = rep(4,100)
    
    cm = confusionMatrix(mask.vals, ref.data)
    
    Error in confusionMatrix.default(mask.vals, ref.data) : 
      the data cannot have more levels than the reference
    
    mask.vals = factor(mask.vals, levels=c(0,2,4))
    ref.data = factor(ref.data, levels=c(0,2,4))
    
    cm = confusionMatrix(mask.vals, ref.data) 
    
    cm$table
    
              Reference
    Prediction  0  2  4
             0  0  0 35
             2  0  0 31
             4  0  0 34