谈谈评价指标中的宏平均和微平均

谈谈评价指标中的宏平均和微平均

 

  今天在阅读周志华老师的《机器学习》一书时,看到性能度量这一小节,里面讲到了宏平均和微平均的计算方法,这也是我一直没有很清晰的一个概念,于是在看了之后又查阅了一些资料,但是还是存在一些问题,想和大家分享一下。

1)召回率、准确率、F

对于二分类问题,可将样例根据其真实类别和分类器预测类别划分为:

  • 真正例(True PositiveTP):真实类别为正例,预测类别为正例。
  • 假正例(False PositiveFP):真实类别为负例,预测类别为正例。
  • 假负例(False NegativeFN):真实类别为正例,预测类别为负例。
  • 真负例(True NegativeTN):真实类别为负例,预测类别为负例。

然后可以构建混淆矩阵(Confusion Matrix)如下表所示。

 

真实类别

预测类别

正例

负例

正例

TP

FN

负例

FP

TN

 

准确率,又称查准率(PrecisionP):

       (1)       

 

召回率,又称查全率(RecallR):

       (2)    

 

F1值:

      (3)     

 

F1的一般形式

      (4)   

 

如果只有一个二分类混淆矩阵,那么用以上的指标就可以进行评价,没有什么争议,但是当我们在n个二分类混淆矩阵上要综合考察评价指标的时候就会用到宏平均和微平均。

2)宏平均(Macro-averaging)和微平均(Micro-averaging

宏平均(Macro-averaging),是先对每一个类统计指标值,然后在对所有类求算术平均值。

             (5)

           (6)

           (7)

        (8)     

微平均(Micro-averaging),是对数据集中的每一个实例不分类别进行统计建立全局混淆矩阵,然后计算相应指标。

          (9)

          (10)

         

       (11)  

  从上面的公式我们可以看到微平均并没有什么疑问,但是在计算宏平均F值时我给出了两个公式分别为公式(7)和(8)。这两个公式就是我疑惑的地方,因为我在不同的论文中看到了不同的宏平均F值的计算方法,例如在参考资料的[3][4]。于是我试图查阅宏平均和微平均提出的初始论文。但是可能由于时间比较久远还是某些原因,我并没有找到最早提出的论文,而大多数论文使用它们的时候引用比较多的是Yang 1999的这篇论文,论文中也未明确给出宏平均F值的计算公式,但是根据其描述:

"For evaluating performance average across categories, there are two conventional methods, namely macro-averaging and micro-averaging. Macro-averaged performance scores are computed by first computing the scores for the per-category contingency tables and then averaging these per-category scores to compute the global means. Micro-averaged performance scores are computed by first creating a global contingency table whose cell values are the sums of the corresponding cells in the per-category contingency tables, and then use this global contingency table to compute the micro-averaged performance scores"

可以看到论文里的宏平均F值应该按照公式(7)计算。但是在不少论文中我也看到了公式(8)的计算方法,所以在这可能并没有一个定论,我也比较困惑

  在参加评测中,评价指标计算都是由主办方制定并进行计算,一般会有明确的计算公式,我在这里想说的是在不少论文中使用宏平均F值时并未给出明确的计算公式,可能会存在两种不同的算法,在论文进行结果比较时,可能会有所差异。

 

参考资料:

1. 周志华. 机器学习.清华大学出版社

2. Yang Y. An evaluation of statistical approaches to text categorization[J]. Information retrieval, 1999, 1(1-2): 69-90.

3. 杨杰明. 文本分类中文本表示模型和特征选择算法研究. 吉林大学博士论文.

4. 廖一星. 文本分类及其特征降维研究. 浙江大学博士论文.

转载于:https://www.cnblogs.com/robert-dlut/p/5276927.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++,`read()`和`write()`是用于二进制数据读写的成员函数,可以用于从文件读取数据或将数据写入到文件。这两个函数是通过文件流对象调用的。 下面是关于`read()`和`write()`的一些重要信息: 1. `read()`函数定义:`istream& read(char* buffer, streamsize count);` `read()`函数用于从输入流读取二进制数据,并将其存储到指定的字符数组(buffer)。它接受两个参数:一个字符数组指针(buffer)和要读取的字节数(count)。 2. `write()`函数定义:`ostream& write(const char* buffer, streamsize count);` `write()`函数用于将指定的二进制数据写入到输出流。它接受两个参数:一个常量字符数组指针(buffer)和要写入的字节数(count)。 3. `read()`函数的返回值:`istream&` `read()`函数返回一个输入流对象的引用,可以用于链式调用其他输入操作。 4. `write()`函数的返回值:`ostream&` `write()`函数返回一个输出流对象的引用,可以用于链式调用其他输出操作。 下面是一个简单的示例,展示了如何使用`read()`和`write()`函数进行二进制数据的读写: ```cpp #include <iostream> #include <fstream> int main() { // 写入二进制数据 std::ofstream outfile("data.bin", std::ios::binary); // 创建输出文件流对象,并打开文件 if (outfile.is_open()) { int data[] = {1, 2, 3, 4, 5}; // 要写入的数据 int dataSize = sizeof(data); // 数据的字节数 outfile.write(reinterpret_cast<const char*>(data), dataSize); // 将数据写入文件 outfile.close(); // 关闭文件 } else { std::cerr << "Failed to open the file." << std::endl; } // 读取二进制数据 std::ifstream infile("data.bin", std::ios::binary); // 创建输入文件流对象,并打开文件 if (infile.is_open()) { const int bufferSize = 5 * sizeof(int); // 缓冲区大小 char buffer[bufferSize]; // 缓冲区 infile.read(buffer, bufferSize); // 从文件读取数据到缓冲区 int* data = reinterpret_cast<int*>(buffer); // 将字符数组转换为整数数组 for (int i = 0; i < bufferSize / sizeof(int); i++) { // 输出读取的数据 std::cout << data[i] << " "; } std::cout << std::endl; infile.close(); // 关闭文件 } else { std::cerr << "Failed to open the file." << std::endl; } return 0; } ``` 在上述代码,首先使用`std::ofstream`对象创建输出文件流对象,并以二进制模式打开名为"data.bin"的文件。然后,我们创建一个整数数组`data`并将其写入到文件,使用`write()`函数将数据写入文件。 接下来,我们使用`std::ifstream`对象创建输入文件流对象,并以二进制模式打开同样的文件。我们创建一个字符数组缓冲区`buffer`,并使用`read()`函数从文件读取数据到缓冲区。 然后,我们将字符数组缓冲区转换为整数数组`data`,并遍历输出读取的数据。 通过使用`read()`和`write()`函数,我们可以在C++进行二进制数据的读写操作,以实现更灵活和高效的数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值