文章目录
分类
什么是分类?
一种典型的有监督学习问题
分类模型的评价
混淆矩阵(Confusion Matrix)
机器学习中存在各种不同的分类模型,如逻辑回归、决策树、朴素贝叶斯和支持向量机等。对于不同的分类模型性能的评价方法是相通的。 在分类问题中,对于每一个样本存在两种角度的标签: 一个是样本真实的标签,一个是模型预测的标签。根据每一个样本的两种角度的标签,可以得到一个混淆矩阵(Confusion Matrix)。
混淆矩阵如下:**
预测结果 | 预测结果 | ||
---|---|---|---|
0 | 1 | ||
实际答案 | 0 | TN | FP |
实际答案 | 1 | FN | TP |
1代表Positive,0代表Negative
明显地,对于二分类问题,每一个样本可以划分为以下四种类型:
- 真正例(TP, True Positive): 样本真实类别是正向的,模型预测的类别也是正向的;
- 真负例(TN, True Negative): 样本真实类别是负向的,模型预测的类别也是负向的;
- 假正例(FP, False Positive): 样本真实类别是负向的,模型预测的类别是正向的;
- 假负例(FN, False Negative): 样本真实类别是正向的,模型预测的类别是负向的。
(Positive,Negative由预测值决定,然后分出真假)
import numpy as np
from sklearn.metrics import confusion_matrix
y_pred = np.array([1,0,0,1,1,1])
y_true = np.array([0,1,1,0,0,1])
confusion_matrix(y_true,y_pred) #Get the Confusion Matrix
# Get the return values
(tn, fp, fn, tp) = confusion_matrix(y_true,y_pred).ravel()
print(tn, fp, fn, tp)
# 0 3 2 1
上面的代码实际得到了一个如下的混淆矩阵:
![image-20210119201246946](https://i-blog.csdnimg.cn/blog_migrate/811fde1422c272c53115ca34c4855668.png)
sklearn提供了许多的测量函数实现了多种分类学习器和回归学习器的评价指标计算。这些函数都包含在 metrics 模块中。对于 分类模型而言,包括了F1值 metrics.f1_score 、正确率 metrics.accuracy_score 、召回率 metrics.recall_sco re 和AUC值 metrics.roc_auc_score 等。
1. Accuracy(正确率)
表示模型预测正确的样本比例,定义如下:
Accuracy = T P + T N T N + F N + F P + T P \Large\text{Accuracy} = \frac{TP + TN}{TN + FN + FP + TP} Accuracy=TN+FN+FP+TPTP+TN
Accuracy在样本不均衡时不是一个很好的度量模型好坏的指标。
例如在文本情绪分类数据集中,正面的样本占比为90%,负 面的内容占比只有10%(不均衡)。如果一个分类模型将所有的样本都预测为正面,这个模型显然是一个无用的模型,但是它的正确率却可以达到90%。
对于不平衡数据,精度和召回率是比正确率更好的性能评价指标。
2. Precision(精度)
精度是指正确预测的正样本占所有预测为正样本的比例,定义如下:
Precision = T P T P + F P \Large\text{Precision} = \frac{TP}{TP + FP} Precision=TP+FPTP
可以形象理解为你认为或预测是对的中,有多少的确是对的
3. Recall(召回率)
召回率,又称灵敏度和命中率,是指正样本中(实际答案为正),被正确预测的比例,定义如下:
Recall = T P T P + F N \Large\text{Recall} = \frac{TP}{TP + FN} Recall=TP+FNTP
可以形象理解为本来就是对的中,你找回了多少对的
通常精度和召回率是负相关的,实际应用中高精度往往对应低召回率,反之亦然。我们需要根据实际问题场景和需求来在精度和召回率指标上做权衡。
但单独考虑精度和召回率是片面的,两种需要综合考虑。在二分类问题中,可以定义一个综合考虑精度和召回率的指标,这个指标为F值。
4. F1值(F值的特殊情况)
广义上的F值定义如下:
F β = ( 1 + β 2 ) P r e c i s i o n × R e c a l l β 2 × P r e c i s i o n + R e c a l l \Large\ F_\beta = (1 + \beta^2)\frac{Precision \times Recall}{\beta^2 \times Precision + Recall} Fβ=(1+β2)β2×Precision+RecallPrecision×Recall
其中 β \large\beta β是正数,其作用是调整精度和召回率的权重。 β \large\beta β越大,召回率的权重更大; β \large\beta β越小,则精度的权重更大。
当 β = 1 \large\beta=1 β=1时,精度和召回率的权重一样,此时称为F1值,它是精度和召回率的调和平均数。
F1 = 2 × Precision × Recall Precision + Recall \Large\text{F1} = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1=Precision+Recall2×Precision×Recall
化成以下形式便于理解:
F1 = 2 1 Precision + 1 Recall \Large\text{F1} = \frac{2 }{ \frac{1}{\text{Precision}} + \frac{1}{\text{Recall}} } F1=Precision1+Recall12
5. Specificity(特异度)
特异度是在负样本中正确预测的概率,换言之,负样本的召回率。
Specificity = T N T N + F P \Large\text{Specificity} = \frac{TN}{TN + FP} Specificity=TN+FPTN
6. Kappa
Kappa是用于计算分类精度和评价一致性的指标。
多分类模型下评价指标的改变
对于混淆矩阵,由于多分类问题,矩阵从 2 × 2 2\times2 2×2的结构变成了 n × n ( n > 2 ) n\times n(n>2) n×n(n>2)。也不可以直接通过TP,TN,FP,FN来标注各单元格所 代表的含义。
与二分类模型相比, 可以直接适用的评价指标包括准确度,而其他的评价指标,都需要进行一定程度的转化。
多分类模型评价指标中,精度、召回率都是计算的平均值。
将每一个分类都当作是正样本,非此分类皆为负样本,转化为一个多次的二分类模型。计算每一个二分类模型的精准率和召回率,取平均数得到多分类模型的平均精准率和召回率,再通过调和平均计算出F1值。同理,特异度也是这种计算方式。
ROC曲线和AUC
ROC曲线和AUC是一个从整体上评价二分类模型优劣的指标,其中AUC(Area Under the Curve)是ROC曲线(Receiver operating characteristic curve,“受试者工作特征曲线”)与横轴之间的面积。
相比于其他评价指标,ROC曲线具有一定的稳定性,它不会因为正负样本分布的变化而产生不同的曲线。
ROC曲线通过***真阳率***(True Positive Rate, TPR)和***假阳率***(False Positive Rate, FPR)两个指标进行绘制。真阳率又称为敏感度(Sensitivity),表示真实标签为正向的样本中,模型预测也是正向的样本比例(和召回率一样)。假阳率表示真实标签是负向的样本中,模型预测为正向的比例。真阳率和假阳率的定义为:
T P R = T P T P + F N \Large\ TPR = \frac{TP}{TP + FN} TPR=TP+FNTP
F P R = F P F P + T N \Large\ FPR = \frac{FP}{FP + TN} FPR=FP+TNFP
假设预测概率大于阈值的样本才为正例,那么通过调整模型的阈值,我们可以得到一组TPR和FPR。以FPR作为横轴,TPR作为纵 轴,可以针对一个模型绘制ROC曲线。ROC曲线下面积(Area Under Curve, AUC)代表了模型性能的好坏。完美的模型在ROC曲线的(0,1)。通过调整阈值,ROC曲线是经过(0,0),(0, 1),(1,1)三个点的曲线,此时ROC曲线下面积为1。一个示例的ROC曲线如下图所示:
一个随机模型在ROC曲线中是一条直线,AUC=0.5
-
AUC = 0.5: 说明模型与偶然造成的结果效果差不多 ,模型没有预测价值
-
AUC < 0.5: 说明模型不如偶然造成的效果,但只要总是反预测而行,就优于随机猜测
-
AUC > 0.5: 说明模型较好
-
AUC > 0.75:一般来说,可以认为是一个比较理想的模型
-
AUC = 1.0: 是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器
(完美的模型:通过调整阈值,ROC曲线是经过 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 1 ) (0,0),(0, 1),(1,1) (0,0),(0,1),(1,1)三个点的曲线,此时ROC曲线下面积为1)
在多分类模型下,ROC和AUC并不适用,虽然有研究者提出在多分类下的ROC曲线和AUC,但实际应用的较少。 与二分类模型相比, 可以直接适用的评价指标包括准确度,而其他的评价指标,都需要进行一定程度的转化。
Code
import numpy as np
from sklearn.metrics import roc_curve
from sklearn.metrics import confusion_matrix
y = np.array([1, 1, 2, 2])
scores = np.array([0.1, 0.4, 0.35, 0.8])
# Get the FPR,TPR
fpr, tpr, thresholds = roc_curve(y, scores ,pos_label=2)
print('fpr:',fpr)
print('tpr:',fpr)
print('thresholds:',thresholds)