分类问题评价标准及Python实现
2021-08-16 本文已影响0人
术枚派
分类问题常见的标准:准确率,精确率,召回率,F1-Score, AUC, ROC曲线, P-R曲线
一、定义
分类结果会出现四种情况。
- TP:True Positive, 把正类预测为正类
- FP:False Positive,把负类预测为正类
- TN:True Negative, 把负类预测为负类
- FN:False Negative,把正类预测为负类
这里我们可以这样理解,前一个T代表分类器的判断是正确的,F代表分类器的判断是错误的,后面的P代表分类器判断的结果是正类,N代表分类器判断的结果是负类。
准确度(Accuracy)
代表分类器判断的结果是正类
精确率 (Precision)
精确率是指在预测为正类的样本中真的正类所占的比例。
召回率(Recall)
召回率又名查全率。指在所有的正类中被预测为正类的比例。
F1-Score
精确率和召回率的调和平均。
ROC曲线和AUC
TPR:True Positive Rate,真正率, TPR代表能将正例分对的概率。
FPR: False Positive Rate, 假正率, FPR代表将负例错分为正例的概率。
ROC曲线以FPR为横坐标,TPR为纵坐标。
直观的看越靠近左上角,分类器效果越好,越靠近右下角,效果越差。
二、实现
使用sklearn计算上述指标。
1. 准确率
# 准确率
import numpy as np
from sklearn.metrics import accuracy_score
y_pred = [0, 2, 1, 3,9,9,8,5,8]
y_true = [0, 1, 2, 3,2,6,3,5,9]
accuracy_score(y_true, y_pred)
accuracy_score(y_true, y_pred, normalize=False) # 类似海明距离,每个类别求准确后,再求微平均
2. 召回率
from sklearn import metrics
metrics.recall_score(y_true, y_pred, average='micro')
metrics.recall_score(y_true, y_pred, average='macro')
3. F1-score
metrics.f1_score(y_true, y_pred, average='weighted')
4. 混淆矩阵
横的是正确的标签,纵的是错误的标签
from sklearn.metrics import confusion_matrix
confusion_matrix(y_true, y_pred)
5. 分类报告
# 分类报告:precision/recall/fi-score/均值/分类个数
from sklearn.metrics import classification_report
y_true = [0, 1, 2, 2, 0]
y_pred = [0, 0, 2, 2, 0]
target_names = ['class 0', 'class 1', 'class 2']
print(classification_report(y_true, y_pred, target_names=target_names))
6. kappa score
kappa score是一个介于(-1, 1)之间的数. score>0.8意味着好的分类;0或更低意味着不好(实际是随机标签)
from sklearn.metrics import cohen_kappa_score
y_true = [2, 0, 2, 2, 0, 1]
y_pred = [0, 0, 2, 2, 0, 2]
cohen_kappa_score(y_true, y_pred)
7. ROC
计算ROC值,获得ROC曲线
import numpy as np
from sklearn.metrics import roc_auc_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
roc_auc_score(y_true, y_scores)
#ROC曲线
from sklearn.metrics import roc_curve
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2)
官网例子
ROC曲线可以进行二分类评价也可以进行多分类评价。在多分类时,需要将标签转换为二分类的标签,可以使用sklearn中的label_binarize方法。
8. 海明距离和Jaccard距离
from sklearn.metrics import hamming_loss
import numpy as np
from sklearn.metrics import jaccard_similarity_score
y_pred = [1, 2, 3, 4]
y_true = [2, 2, 3, 4]
hamming_loss(y_true, y_pred)
jaccard_similarity_score(y_true, y_pred)
三、引用
python + sklearn ︱分类效果评估——acc、recall、F1、ROC、回归、距离
二分类和多分类问题的评价指标总结
python实现二分类和多分类的ROC曲线教程