分类模型性能评价指标:混淆矩阵、F Score、ROC曲线与AUC面积、PR曲线

以二分类模型为例:二分类模型最终需要判断样本的结果是1还是0,或者说是positive还是negative。

评价分类模型性能的场景:

  1. 采集一个称之为测试集的数据集: 测试集的每一个样本由特征数据及其相应的分类结果组成(注:该数据集在建立分类模型时未使用,也就是说,测试集对建立的分类模型来说是未知的);
  2. 将测试集中的特征数据输入到建立的分类模型中,得到模型的分类结果。

混淆矩阵(Confusion Matrix)相关评价指标

  • TP=True Positive:真实值是positive,模型结果是positive的样本数量;
  • FN=False Negative:真实值是positive,模型结果是negative的样本数量,这是统计学上的第一类错误(Type I Error);
  • FP=False Positive:真实值是negative,模型认为是positive的数量,这是统计学上的第二类错误(Type II Error);
  • TN=True Negative:真实值是negative,模型认为是negative的数量。

将这四个基础指标一起呈现在表格中得到的矩阵称之为混淆矩阵(Confusion Matrix):
混淆矩阵
  可以说,混淆矩阵是为了进一步分析性能而对该分类模型测试结果做出的总结。但是单凭混淆矩阵中统计的个数,很难衡量模型优劣,因此在混淆矩阵基本的统计结果之上又延伸出以下指标。

  • 准确率(Accuracy):在所有样本中,分类模型预测对的比重。
    A C C = T P + T N T P + T N + F P + F N ACC=\frac{TP+TN}{TP+TN+FP+FN} ACC=TP+TN+FP+FNTP+TN
    准确率是一个很直观的评价指标,准确率越高,分类器越好,但是有时候准确率高并不能代表一个算法就好。例如,判断一个人是否患有某种病,患病的人所占的比例很少,仅有1%,假设1000个人中有十个人患病,分类模型将所有人分为不患病,虽然准确率有99%,但我们目的是检测出那1%,准确率这时是没什么意义的。

1. 分类模型预测为Positive的样本中

  • 精确率/精度(Precision):模型预测正确的比重。
    P P V = T P T P + F P PPV=\frac{TP}{TP+FP} PPV=TP+FPTP
  • FDR:模型预测错误的比重。
    F D R = F P T P + F P FDR=\frac{FP}{TP+FP} FDR=TP+FPFP

2. 分类模型预测为Negative的样本中

  • NPV:模型预测正确的比重。
    N P V = T N T N + F N NPV=\frac{TN}{TN+FN} NPV=TN+FNTN
  • FOR:模型预测错误的比重。
    N P V = F N T N + F N NPV=\frac{FN}{TN+FN} NPV=TN+FNFN

3. 真实值是Positive的样本中

  • 灵敏度(Sensitivity)/召回率(Recall):模型预测正确的比重。
    T P R = R e c a l l = T P T P + F N TPR=Recall=\frac{TP}{TP+FN} TPR=Recall=TP+FNTP

  • FNR:模型预测错误的比重。
    F N R = F N T P + F N = 1 − T P R FNR=\frac{FN}{TP+FN}=1-TPR FNR=TP+FNFN=1TPR

4. 真实值是Negative的样本中

  • 特异度(Specificity):模型预测正确的比重。
    T N R = T N T N + F P TNR=\frac{TN}{TN+FP} TNR=TN+FPTN
  • FPR :模型预测错误的比重。
    F P R = F P T N + F P = 1 − T N R FPR=\frac{FP}{TN+FP}=1-TNR FPR=TN+FPFP=1TNR

  上面的指标将混淆矩阵中数量的结果转化为0-1之间的比率,便于进行标准化的衡量。

5. F Score/F Measure—综合评价指标
  精度和召回率有时会出现矛盾的情况,F Score是精度P和召回率R的加权调和平均,综合考虑了精度和召回率。
F = α 2 + 1 α 2 1 R + 1 P = ( α 2 + 1 ) P R α 2 P + R F=\frac{\alpha^2+1}{\alpha^2\frac{1}{R}+\frac{1}{P}}=\frac{(\alpha^2+1)PR}{\alpha^2P+R} F=α2R1+P1α2+1=α2P+R(α2+1)PR

  • 如果取参数 α = 1 \alpha=1 α=1,就是最常见的F1 Score,认为精度和召回率一样重要,
    F 1 = 2 P R P + R F1=\frac{2PR}{P+R} F1=P+R2PR

  • 如果取 α \alpha α小于1,表示精度比召回率重要;

  • 如果取 α \alpha α大于1,表示召回率比精度重要。

注:调和平均数是各变量值倒数的算术平均数的倒数,加权调和平均数是各变量值倒数的加权算术平均数的倒数。

混淆矩阵相关指标总结
总结

Python-Sklearn实现

混淆矩阵

如下函数得到的混淆矩阵是上述矩阵的转置:

sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None, normalize=None)
  • Returns :Cndarray of shape (n_classes, n_classes)混淆矩阵
    C i , j C_{i,j} Ci,j:表示预测为第 i i i组,实际是第 j j j组的样本个数。
    在二分类中: C 00 = T N , C 01 = F P , C 10 = F N , C 11 = T P C_{00}=TN,C_{01}=FP,C_{10}=FN,C_{11}=TP C00=TN,C01=FP,C10=FN,C11=TP
  • y_true :array-like of shape (n_samples,)真实标签值
  • y_pred:array-like of shape (n_samples,)预测标签值>* labels:array-like of shape (n_classes), default=None List of labels to index the matrix. This may be used to reorder or select a subset of labels. If None is given, those that appear at least once in y_true or y_pred are used in sorted order.
  • sample_weight :array-like of shape (n_samples,), default=None样本权重
  • normalize :{‘true’, ‘pred’, ‘all’}, default=None Normalizes confusion matrix over the true (rows), predicted (columns) conditions or all the population. If None, confusion matrix will not be normalized.
>>> from sklearn.metrics import confusion_matrix
>>> y_true = [2, 0, 2, 2, 0, 1]
>>> y_pred = [0, 0, 2, 2, 0, 2]
>>> confusion_matrix(y_true, y_pred)
array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])
>>> y_true = ["cat", "ant", "cat", "cat", "ant", "bird"]
>>> y_pred = ["ant", "ant", "cat", "cat", "ant", "cat"]
>>> confusion_matrix(y_true, y_pred, labels=["ant", "bird", "cat"])
array([[2, 0, 0],
       [0, 0, 1],
       [1, 0, 2]])

Recall

sklearn.metrics.recall_score()
  • y_true:1d array-like, or label indicator array / sparse matrix真实的
  • y_pred:1d array-like, or label indicator array / sparse matrix模型预测的
  • average:string, [None, ‘binary’ (default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’]
    用于多分类模型. 如果等于None,返回每个类别的Score。否则,取决于 average。
    • ’binary’ :Only report results for the class specified by pos_label. This is applicable only if targets (y_{true,pred}) are binary.
    • ’micro’ :Calculate metrics globally by counting the total true positives, false negatives and false positives.
    • ’macro’ :Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.
    • ** ‘weighted’** :Calculate metrics for each label, and find their average weighted by support (the number of true instances for each label). This alters ‘macro’ to account for label imbalance; it can result in an F-score that is not between precision and recall.
    • ’samples’ :Calculate metrics for each instance, and find their average (only meaningful for multilabel classification where this differs from accuracy_score).
  • Returns : recallfloat (if average is not None) or array of float, shape = [n_unique_labels]
>>> from sklearn.metrics import recall_score
>>> y_true = [0, 1, 2, 0, 1, 2]
>>> y_pred = [0, 2, 1, 0, 0, 1]
>>> recall_score(y_true, y_pred, average=None)
array([1., 0., 0.])

ROC曲线

ROC曲线全称为受试者工作特征曲线(Receiver Operating Characteristic Curve)

  在二分类模型中,有时输出变量不一定是简单的两个值,可能是多个值,甚至可能是连续的,这时,需要人为确定一个阀值,大于这个值归为Positive,小于这个值则归到Negative。举例来说,逻辑回归模型中,输出结果是该样本是Positive的概率 p p p,指定一个阈值Threshold,当 p p p大于这个值时判定为Positive,反之为Negative。
ROC  上图中,蓝色表示Negative样本的 p p p的概率分布,红色表示Positive样本的 p p p的概率分布,竖实线表示指定的阈值,实线左边判定为Negative,右边判定为Positive。随着阈值的增大,会有更少的假正例,即FPR减小,但同时真正例也在减少,即TPR也在减少,也就是说,前面所说的诸如TPR、FPR等指标和阈值是有关的,这时候就需要一个独立于阈值,只与分类器有关的评价指标,来衡量特定分类器的好坏。ROC曲线就是这样的评价指标。
ROC曲线

  • 以FPR为横轴,TPR为纵轴。
  • ROC曲线上每一个点对应于一个Threshold。
  • 随着Threshold增加,TPR和FPR都在减小,ROC曲线上的点向左下移动。Threshold最大时,全部判断为Negative,TP=FP=0,对应于原点;Threshold最小时,全部判断为Positive,TN=FN=0,对应于右上角的点(1,1)。
  • 理想情况下,TPR应该接近1,FPR应该接近0,即对应于左上角,因此,ROC曲线越靠近左上方分类模型性能越好;

AUC面积

  AUC的英文全称为Area Under Curve,是ROC曲线下的面积,显然,AUC越大,分类模型性能越好。

  • AUC = 1,代表ROC曲线在正方形的左框线和上框线上,预测完全准确。不管阈值选什么,预测都是100%正确的。
  • 0.5 < AUC < 1,代表ROC曲线在对角线上方,预测优于随机(50/50)猜测。妥善设定阈值的话,能有预测价值。
  • AUC = 0.5,代表ROC曲线在45度线上,预测和随机猜测一样,没有预测价值。
  • 0 < AUC < 0.5,代表ROC曲线在45度线下方,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
  • AUC = 0,代表ROC曲线在下框线和右框线上,预测完全不准确。

AUC物理意义

  假设分类模型的输出是样本是Positive的Score(比如概率),则AUC的物理意义为,任取一对(Positive,Negative)样本,Positive样本的Score大于Negative样本的Score的概率。

AUC的绘制

  现实任务中只能通过有限个测试样例来绘制ROC曲线,此时仅能获得有限个(TRP,FRP)坐标对,无法产生光滑的ROC曲线。绘制过程很简单:

  1. 取TPR轴最小步长为1/Positive样本数(在Positive样本中取某个Positive样本的概率),FPR轴最小步长为1/Negative样本数(取某个Negative样本的概率);
  2. 根据模型预测结果对样例按降序排序;
  3. 将分类阈值设为最大,即将所有样本判断为Negative,此时TRP=FRP=0,在坐标(0,0)处标记一个点;
  4. 将分类阈值依次设为每个样本的预测值,即依次将每个样本划分为Positive,若当前样本为Positive,则在前一个标记基础沿纵轴移动一个步长,否则沿横轴移动一个步长。

  举例说明,假设有10个样本,将其Score降序排序,假设其对应的类别为[1,1,1,1,0,1,0,0,0,0],即前4大的Score是Positive,第5大为Negative,第6个为Positive,其后为Negative。以原点为起点,遇到1则沿纵轴移动一个步长,遇见0则沿横轴移动一个步长。
绘制ROC
根据图形绘制过程可以看出:每当出现“向右若干步再向上若干步”这样的现象,意味着在存在Negative样本的Score大于Positive样本的Score,即ROC曲线上方的部分,这样就解释了AUC的物理意义,通过计算也可以看出:

  • 根据图形,可计算 A U C = 0.8 ∗ 0.2 + 0.8 ∗ 1 = 0.96 AUC=0.8*0.2+0.8*1=0.96 AUC=0.80.2+0.81=0.96
  • 另外,任取一对(Positive,Negative)样本,Positive样本的Score小于Negative样本的Score(取第5、6个样本)的概率为 1 5 × 1 5 = 1 25 = 0.04 \frac{1}{5}\times\frac{1}{5}=\frac{1}{25}=0.04 51×51=251=0.04,则Positive样本的Score小于Negative样本的Score的概率为0.96。

AUC的计算

即计算Positive样本的Score大于Negative样本的Score的概率。

设有Positive样本N个,Negative样本M个,

  任取一对(Positive,Negative)样本,共有 M N MN MN种可能的对,那在这 M N MN MN对中有多少对满足“Positive样本的Score大于Negative样本的Score”呢?

  1. 将所有样本按照Score排序,则可得到每个样本的秩Rank(Score最大的为 N + M N+M N+M,依次递减);
  2. 找到Positive样本中Rank最大的样本,不妨设其秩为 r a n k 1 rank_1 rank1,有 M − 1 M-1 M1个Positive样本比它的Score小,那么就有 ( r a n k 1 − 1 ) − ( M − 1 ) = r a n k 1 − M (rank_1-1)-(M-1)=rank_1-M (rank11)(M1)=rank1M个Negative样本比它的Score小;
  3. 设Rank第 i i i大的Positive样本秩为 r a n k i rank_i ranki,依次类推可知,满足“Positive样本的Score大于Negative样本的Score”的样本对的个数为:
    ∑ i = 1 N [ r a n k i − ( M − i + 1 ) ] = ∑ i = 1 N r a n k i − M ( M + 1 ) / 2 \sum_{i=1}^N[rank_i-(M-i+1)]=\sum_{i=1}^Nrank_i-M(M+1)/2 i=1N[ranki(Mi+1)]=i=1NrankiM(M+1)/2
    于是可得概率为:
    ∑ i = 1 N r a n k i − M ( M + 1 ) / 2 M N \frac{\sum_{i=1}^Nrank_i-M(M+1)/2}{MN} MNi=1NrankiM(M+1)/2

PR曲线

  PR曲线全称Precision-Recall曲线,类似于ROC曲线,PR曲线以TPR/Recall为横轴,以Precision为纵轴,曲线上每一个点对应于一个Threshold。
PR

  • 随着Threshold增加,Recall/TPR在减小,由于TP和FP均减少,Precision将增加。因此,随着Threshold的增加,PR曲线上的点向左上增加。
  • 理想情况下,precision和Recall均接近1,对应于右上角,因此PR曲线越靠近右上方模型性能越好。
  • 在极度不平衡的数据下(Positive的样本较少),PR曲线可能比ROC曲线更实用。

其他评价指标

  • 计算速度:分类器训练和预测需要的时间;
  • 鲁棒性:处理缺失值和异常值的能力;
  • 可扩展性:处理大数据集的能力;
  • 可解释性:分类器的预测标准的可理解性,像决策树产生的规则就是很容易理解的,而神经网络的一堆参数就不好理解,我们只好把它看成一个黑盒子。

4.4.2分类模型评判指标(一)-混淆矩阵(Confusion Matrix)
机器学习算法中的准确率(Precision)、召回率(Recall)、F值(F-Measure)
ROC曲线与AUC值
如何直观理解AUC评价指标?

好的,下面是代码实现: ```python from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, classification_report # 加载数据集 data = load_breast_cancer() X = data.data y = data.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定义模型并进行训练 model = LogisticRegression() model.fit(X_train, y_train) # 在测试集上进行预测 y_pred = model.predict(X_test) # 计算性能评价指标 confusion = confusion_matrix(y_test, y_pred) accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) report = classification_report(y_test, y_pred) # 输出结果 print("混淆矩阵:\n", confusion) print("准确率:", accuracy) print("精确率:", precision) print("召回率:", recall) print("F1值:", f1) print("分类报告:\n", report) ``` 运行结果如下: ``` 混淆矩阵: [[39 4] [ 0 71]] 准确率: 0.9649122807017544 精确率: 0.9466666666666667 召回率: 1.0 F1值: 0.9722222222222222 分类报告: precision recall f1-score support 0 1.00 0.91 0.95 43 1 0.95 1.00 0.97 71 accuracy 0.96 114 macro avg 0.97 0.95 0.96 114 weighted avg 0.97 0.96 0.96 114 ``` 可以看到,逻辑回归模型在测试集上表现良好,准确率达到了96.49%。同时,混淆矩阵、精确率、召回率、F1值和分类报告等指标均表现良好,说明模型能够有效地对乳腺癌数据进行分类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值