一般,咱们在评价classifier的性能时使用的是accuracypython
考虑在多类分类的背景下iphone
accuracy = (分类正确的样本个数) / (分类的全部样本个数)性能
这样作其实看上去也挺不错的,不过可能会出现一个很严重的问题:例如某一个不透明的袋子里面装了1000台手机,其中有600台iphone6, 300台galaxy s6, 50台华为mate7,50台mx4(固然,这些信息分类器是不知道的。。。)。若是分类器只是简单的把全部的手机都预测为iphone6, 那么经过上面的公式计算的准确率accuracy为0.6,看起来还不错;但是三星,华为和小米的所有预测错了。若是再给一个袋子,里面装着600台galaxy s6, 300台mx4, 50台华为mate7,50台iphone,那这个分类器立马就爆炸了,连回家带孩子的要求都达不到.net
因此,仅仅用accuracy来衡量一个分类器的性能是很不科学的。所以要引入其余的衡量标准。3d
是否是常常看见以下相似的图?这是二分类的图,假设只有正类和负类,True和False分别表示对和错;Positive和Negative分别表示预测为正类和负类。code
那么blog
因此precision就表示:被正确预测的Positive样本 / 被预测为Positive的样本总数接口
同理,recall就表示:被正确预测的Positive样本 / 实际为Positive的样本总数ip
F1是调和平均值,精准率和召回率只要有一个比较小的话,F1的值也会被拉下来:ci
其实和二分类状况很相似,例子以下 这个是Micro , 和二分类相似 (将例子中的precision和recall代入到F1公式中,获得的就是Micro下的F1值)
而Macro状况下计算F1须要先计算出每一个类别的F1值,而后求平均值。以下
Macro状况下上述例子的计算
下面是使用sklearn直接计算多类别F1/P/R的程序,将接口中的average参数配置为’macro’便可。
from sklearn.metrics import f1_score, precision_score, recall_score y_true=[1,2,3] y_pred=[1,1,3] f1 = f1_score( y_true, y_pred, average='macro' ) p = precision_score(y_true, y_pred, average='macro') r = recall_score(y_true, y_pred, average='macro') print(f1, p, r) # output: 0.555555555556 0.5 0.666666666667
参考连接: