在R中制作错误分类表

Posted

技术标签:

【中文标题】在R中制作错误分类表【英文标题】:Making a misclassification table in R 【发布时间】:2019-07-09 14:01:39 【问题描述】:

关于这个问题有几个问题,但我无法找到我的问题的答案。运行KNN 算法后,我创建了一个"observed"/"predicted" 文件。 "observed" 是真实事件,而 "predicted" 是算法分类的事件。我有多个文件,所有文件的名称都遵循以下模式:"accuracycollar4136*_4136*.0.*.csv"。这是一个小示例:

> sample<-fread("accuracycollar41361_41366.0.8.csv")
> print(sample)
      V1  observed predicted   
  1:   1   Head-up   Grazing       
  2:   2   Head-up   Head-up      
  3:   3   Head-up   Head-up       
  4:   4   Head-up   Head-up       
  5:   5   Head-up   Head-up       
 ---                                                                                                
236: 236   Unknown   Head-up       
237: 237   Unknown   Grazing      
238: 238 Vigilance   Grazing      
239: 239   Unknown   Grazing       
240: 240   Unknown   Head-up       

我已经计算了不同的分类准确度度量。但是,我接下来想做的是:

1) 创建一个for 循环读取每个"accuracycollar4136*_4136*.0.*.csv" 文件。

2) 对于每个文件,我想创建一个汇总错误分类的表格。

3) 理想情况下,我希望最终得到一个百分比/概率表,说明一个事件被归类为另一个事件的次数比例。例如,假设"Head-up" 80% 的时间被归类为“Head-up”,15% 的时间被归类为 "Grazing",5% 的时间被归类为 "Unknown"。这是我的想法:

    class Head-up Vigilance Grazing Unknown etc.. 
  Head-up       %         %       %       %
Vigilance       %         %       %       %
  Grazing       %         %       %       %
  Unknown       %         %       %       %
    etc..       %         %       %       %

我总共有 9 个班级,分别是 "Head-up""Grazing""Browsing""Vigilance""Unknown""Moving""Grooming""Fleeing""Resting"

现在,这可以用caret 或任何其他包来完成吗?如果没有,是否有一种相对简单的方法来编写这样的过程?至少有人能让我走上正轨吗?

感谢任何帮助!

【问题讨论】:

【参考方案1】:

考虑到您所有的文件都在"your folder" 中(没有别的)

files = as.list(list.files(path = "your folder"))

如果不是这种情况,您只需将文件名列表传递给 files 即可进行下一步

miss_class = lapply(files, function(x)
  data = read.csv(x)
  prop.table(table(data$observed,data$predicted),margin=1)
)

这将生成一个百分比表列表,your folder 中的每个文件对应一个。 margin = 1 表示百分比表的总和为 100%。您可以将列更改为 2 或删除整个表 100% 总和的参数

【讨论】:

是的文件在同一个文件夹中。这是我尝试过的:files = as.list(list.files(path = "C:/Users/Juan/Desktop/KNN/41361_by_41365")) miss_class = lapply(files, function(x) data = read.csv("accuracycollar41361_41365",header=T) prop.table(table(data$observed,data$predicted),margin=1) ) 我得到了错误:Error in file(file, "rt") : cannot open the connection In addition: Warning message: In file(file, "rt") : Show Traceback Rerun with Debug Error in file(file, "rt") : cannot open the connection 这可能是因为该文件夹中有一些不是.csv 的文件。您可以删除它们,或者,如果您可以以某种方式生成文件名向量(例如v = c("accuracycollar41361_41366.0.8.csv","accuracycollar41362_41366.0.8.csv",...)),只需执行files = as.list(v),它应该可以工作。 谢谢,成功了。但是我想知道如何以 csv 格式编写由 R 打印的结果表?我需要在代码开头创建一个对象吗? 您可以使用write.csv(miss_class[[i]],"your_file.csv") 编写每个单独的表,并将i 替换为文件索引。我不确定如何将它们全部保存到同一个文件中,因为这取决于你想要它们的方式。【参考方案2】:

函数table() 将起作用。这里我写了一个简单的例子来说明它是如何工作的:

predicted<-c(1,0,0,1)
observed<- c(1,1,0,1)
data<-data.frame(predicted, observed)
table(data)

【讨论】:

以上是关于在R中制作错误分类表的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法通知 R 中的分类器错误分类的相对成本? [关闭]

如何制作双变量交互分类表

解释 naiveBayes 分类器在 e1071:R 中返回的条件概率

Excel制作两级分类级联的一种方法

Excel制作两级分类级联的一种方法

Excel制作两级分类级联的一种方法