假设有10个样本,属于A、B、C三个类别。假设这10个样本的真实类别和预测的类别分别是:
真实:A A A C B C A B B C
预测:A A C B A C A C B C
(1) 求出混淆矩阵。
(2)求出每个类别的P, R, 和F1。
草稿纸解:
略····
直接套公式即可,可以看以下文章中的混淆矩阵部分。
机器学习——分类评价指标_猿_同学的博客-CSDN博客ROC是一个用于度量分类中的非均衡性的工具,ROC曲线及AUC常被用来评价一个二值分类器的优劣。为什么要使用ROC和AUC呢?因为,在实际的数据集中经常会出现类别不平衡现象,即女性本比男性样本多很多(或者相反),而且测试数据中的男女样本的分布也可能随着时间而变化。而在这种情况下,ROC曲线能够保持不变。https://blog.csdn.net/qq_21402983/article/details/124106002
代码解:
import pandas as pd
from sklearn import metrics
y_test=pd.DataFrame(['A' ,'A', 'A', 'C', 'B', 'C', 'A', 'B' ,'B', 'C'])
y_pred=pd.DataFrame(['A' ,'A', 'C', 'B', 'A', 'C', 'A', 'C', 'B', 'C'])
print(confusion_matrix(y_test,y_pred))
print(metrics.classification_report(y_test,y_pred))
print("查准率:",metrics.precision_score(y_test,y_pred,average=None))
print("召回率:",metrics.recall_score(y_test,y_pred,average=None))
print("F1分数:",metrics.f1_score(y_test,y_pred,average=None))
笔记:
当我想单独输出各个指标时报错:
print("查准率:",metrics.precision_score(y_test,y_pred))
print("召回率:",metrics.recall_score(y_test,y_pred))
print("F1分数:",metrics.f1_score(y_test,y_pred))
ValueError: Target is multiclass but average='binary'. Please choose another average setting, one of [None, 'micro', 'macro', 'weighted'].
解决办法
原代码基础上添加了average=‘micro’。
from sklearn.metrics import precision_score, recall_score
precision_score(y_train, y_train_pred, average='micro')
average参数定义了该指标的计算方法,二分类时average参数默认是binary;多分类时,可选参数有micro、macro、weighted和samples。
None:返回每个班级的分数。否则,这将确定对数据执行的平均类型。
binary:仅报告由指定的类的结果pos_label。仅当targets(y_{true,pred})是二进制时才适用。
micro:通过计算总真阳性,假阴性和误报来全球计算指标。也就是把所有的类放在一起算(具体到precision),然后把所有类的TP加和,再除以所有类的TP和FN的加和。因此micro方法下的precision和recall都等于accuracy。
macro:计算每个标签的指标,找出它们的未加权平均值。这不会考虑标签不平衡。也就是先分别求出每个类的precision再求其算术平均。
weighted:计算每个标签的指标,并找到它们的平均值,按支持加权(每个标签的真实实例数)。这会改变“宏观”以解决标签不平衡问题; 它可能导致F分数不在精确度和召回之间。
samples:计算每个实例的指标,并找出它们的平均值(仅对于不同的多标记分类有意义 accuracy_score)。
参考:https://blog.csdn.net/datongmu_yile/article/details/81750737