r - 如何在R中绘制具有移动阈值的百分比
问题描述
我正在一个项目中使用多种语言检测算法,例如 Textcat 和 CLD3。我有一个数据框,我在其中记录了一段文本是用什么语言编写的,每种算法的猜测是什么以及猜测是否正确。
因为字符串的长度变化很大,我想评估每个算法在移动阈值上的性能(例如对于所有超过 5 个单词的字符串,然后超过 10 个单词等)
数据如下所示:
Text Language CLD Textcat Word_count CLD_correct Textcat_correct
String1 EN en en 20 1 1
String2 EN NA fr 5 0 0
String3 FR fr es 10 1 0
String4 ES ca es 7 0 1
我非常想做的是根据字数绘制每个阈值的准确性。例如,我发现总体 CLD 在 75% 的情况下正确标记语言。然而,当只考虑包含 7 个或更多单词的字符串时,这个比例会上升到 85%。
因此,在 x 轴上,我想绘制阈值的单词数,在 y 轴上绘制算法做出的正确猜测的百分比。
我知道如何手动执行此操作(对值 Word_count > x 的数据框进行子集化,计算每个算法的准确度,将它们存储在数据框中,计算 Word_count > y 等等,然后绘制它),但是因为我的样本非常大,要完成这一切需要大量的工作,并且必须有更智能的方法来做到这一点。我考虑过使用 for 循环遍历不同的阈值以计算每个阈值的值,然后存储这些值,但是该数据集中的大部分字符串可能超过 100 个单词,我正在考虑对字符长度执行相同的操作。
有人知道如何以更自动化的方式解决这个问题吗?
解决方案
首先定义一个使用算法的向量
algorithmrithms <- c('Textcat_correct', 'CLD_correct')
然后创建一个向量,其中包含您要查看其准确性的单词数
word.size <- seq(5, 20, 5)
现在您可以使用该包dplyr
并lapply
获取每个单词数量和算法的列表。
library(dplyr)
resultList <- lapply(word.size, function(y) {
lapply(algorithm, function(x) {
df %>%
rename(algorithm = x) %>%
filter(Word_count >= y) %>%
group_by(algorithm) %>%
summarise(all = sum(Word_count)) %>%
mutate(accuracy = all/sum(all)*100) %>%
filter(algorithm == 1) %>%
mutate(algorithm=replace(algorithm, algorithm == 1, x)) %>%
mutate(words = y) })
})
您可以将此列表转换为数据框
df2 <- as.data.frame(do.call(rbind, unlist(resultList, recursive=F)))
现在您可以绘制结果
library(ggplot2)
ggplot(df2, aes(words, accuracy, fill=algorithm)) +
geom_bar(stat="identity", position="dodge")
结果你得到了这个
推荐阅读
- php - 如何一次编辑数据库中的多个值
- javascript - NG build failed 模块解析失败:意外的令牌 - 没有任何改变
- bash - 将文件内容发送到另一个命令 bash
- javascript - 在两个数组中检查相同属性值的快速方法?
- javascript - 如何修复“运行此应用程序的环境不支持此操作。”location.protocol“...”错误?
- angular - 具有多个匹配项的 Angular ngIf 不起作用
- qemu - 如何将 QEMU 输出重定向到 Windows cmd 控制台?
- json - 我在 Swift 4 中使用 JSON Codable 返回一个 NIL - 尝试从嵌套的 JSON 示例返回一个值
- python - 错误:找不到满足要求的版本
- java - 在 Firebase Android 中将带有子项的值转换为 Java 对象