hihocoder 1522 : F1 Score

 
时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi和他的小伙伴们一起写了很多代码。时间一久有些代码究竟是不是自己写的,小Hi也分辨不出来了。

于是他实现了一个分类算法,希望用机器学习实现自动分类。

为了评价这个分类算法的优劣,他选出了N份有标记的代码作测试集,并决定用F1 Score作为评价标准。

给出N份代码的实际作者是不是小Hi以及分类算法预测的结果,请你计算F1 Score。

输入

第一行包含一个整数N。(1 <= N <= 1000)    

以下N行每行包含两个字符(+或-)。第一个字符代表这份代码的实际作者是不是小Hi(+代表是,-代表不是),第二个代表预测的作者是不是小Hi(+代表是,-代表不是)。  

输出

一个百分数,X%,代表答案,X保留两位小数。

样例输入

4  
+ +    
+ -  
- +  
- -

样例输出

50.00%

用F1-Score来作为评价标准,而F1-Score的定义可见http://www.cnblogs.com/weedboy/p/7072010.html

比较坑的是要注意分母为零的时候,precision和recall都为1,F1-Score的分母为0的时候,分母当成1来计算

ac代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
int main()
{
    int n;
    double tp=0,fp=0,tn=0,fn=0;
    char ans, pre;
    cin >> n;
    for (int i = 0;i < n;i++)
    {
        cin >> ans >> pre;
        if (ans == '+'&&pre == '+') tp++;
        else if (ans == '+'&&pre == '-') fn++;
        else if (ans == '-'&&pre == '-') tn++;
        else if (ans == '-'&&pre == '+') fp++;
    }
    double p = (tp + fp)==0?1:tp / (tp + fp);
    double r = (tp + fn)==0?1:tp / (tp + fn);
    double res = (p + r)==0? 2*p*r :2*p*r /(p + r);
    printf("%.2lf%s
", res*100,"%");
    return 0;
}
原文地址:https://www.cnblogs.com/weedboy/p/7072828.html