分类算法的评估指标

常见的评估指标及基本概念

评估指标是针对模型性能优劣的一个定量指标。一种评价指标只能反映模型一部分性能,如果选择的评价指标不合理,那么可能会得出错误的结论,故而应该针对具体的数据、模型选取不同的的评价指标。

针对不同类型的学习任务,我们有不同的评估指标,这里我们来介绍最常见的分类算法的一些评估指标。常用的分类任务评价指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 Score、P-R曲线(Precision-Recall Curve)、ROC、AUC等。


基本概念—混淆矩阵

混淆矩阵(confusion matrix)是一个评估分类问题常用的工具,对于 k 元分类,其实它就是一个k x k的表格,用来记录分类器的预测结果。对于常见的二分类,它的混淆矩阵是 2x2 的。

在二分类中,可以将样本根据其真实结果和模型的预测结果的组合划分为

True Positive(TP):真正类。样本的真实类别是正类,并且模型识别的结果也是正类。

False Negative(FN):假负类。样本的真实类别是正类,但是模型将其识别为负类。

False Positive(FP):假正类。样本的真实类别是负类,但是模型将其识别为正类。

True Negative(TN):真负类。样本的真实类别是负类,并且模型将其识别为负类。
 

混淆矩阵要表达的含义:


混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;
每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目;每一列中的数值表示真实数据被预测为该类的数目。如图所示:
 

 举例-混淆矩阵

如有150个样本数据,预测为类I,类II,类III 各为50个。分类结束后得到的混淆矩阵为:
 

每一行之和表示该类别的真实样本数量,每一列之和表示被预测为该类别的样本数量。

第一行第一列中的43表示有43个实际归属第一类的实例被预测为第一类,同理,第一行第二列的2表示有2个实际归属为第一类的实例被错误预测为第二类。

混淆矩阵是对分类问题的预测结果的总结。使用计数值汇总正确和不正确预测的数量,并按每个类进行细分,这是混淆矩阵的关键所在。混淆矩阵显示了分类模型的在进行预测时会对哪一部分产生混淆。它不仅可以让您了解分类模型所犯的错误,更重要的是可以了解哪些错误类型正在发生。正是这种对结果的分解克服了仅使用分类准确率所带来的局限性。


从混淆矩阵得到分类指标

常用的分类任务评价指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 Score、P-R曲线(Precision-Recall Curve)、ROC、AUC等。

1.准确率(Accuracy)

准确率指分类正确的样本占总样本个数的比例。准确率是针对所有样本的统计量。它被定义为:

 

准确率能够清晰的判断我们模型的表现,但有一个严重的缺陷: 在正负样本不均衡的情况下,占比大的类别往往会成为影响 Accuracy 的最主要因素,此时的 Accuracy 并不能很好的反映模型的整体情况。

例如,一个测试集有正样本99个,负样本1个。模型把所有的样本都预测为正样本,那么模型的Accuracy为99%,看评价指标,模型的效果很好,但实际上模型没有任何预测能力。

2.精确率(Precision)

精确率又称为查准率,是针对预测结果而言的一个评价指标。指在分类正确的正样本个数占分类器判定为正样本的样本个数的比例。精确率是对部分样本的统计量,侧重对分类器判定为正类的数据的统计。它被定义为:

多标签:

 

 3.召回率(Recall)

召回率指分类正确的正样本个数占真正的正样本个数的比例。召回率也是对部分样本的统计量,侧重对真实的正类样本的统计。它被定义为:

多标签:

 

 

Precision 与 Recall 的权衡
精确率高,意味着分类器要尽量在 “更有把握” 的情况下才将样本预测为正样本, 这意味着精确率能够很好的体现模型对于负样本的区分能力,精确率越高,则模型对负样本区分能力越强。

召回率高,意味着分类器尽可能将有可能为正样本的样本预测为正样本,这意味着召回率能够很好的体现模型对于正样本的区分能力,召回率越高,则模型对正样本的区分能力越强。

从上面的分析可以看出,精确率与召回率是此消彼长的关系, 如果分类器只把可能性大的样本预测为正样本,那么会漏掉很多可能性相对不大但依旧满足的正样本,从而导致召回率降低。

那么当不同模型的Recall和Precision各有优势时该如何选择模型?此时可以通过F1 Score来比较。

4.F1分数:

F1 Score是精准率和召回率的调和平均值,它同时兼顾了分类模型的准确率和召回率,是统计学中用来衡量二分类(或多任务二分类)模型精确度的一种指标。它的最大值是1,最小值是0,值越大意味着模型越好。 它定义为:

5.PR曲线

PR曲线(Precision-Recall Curve)是另一种常用的分类模型评估工具,它展示了在不同分类阈值下的精确率(Precision)和召回率(Recall)之间的关系。PR曲线以召回率为横轴,精确率为纵轴,曲线上的每个点表示一个阈值下的模型性能。

PR曲线可以帮助我们观察模型在较低召回率时的精确率水平,这对于一些高召回率的应用场景非常重要。与ROC曲线不同,PR曲线的评估主要关注正例的分类效果。

6.ROC曲线和Auc值

 

在分类任务中,测试样本通常是获得一个概率表示当前样本属于正例的概率, 我们往往会采取一个阈值,大于该阈值的为正例,小于该阈值的为负例。 如果我们减小这个阈值, 那么会有更多的样本被识别为正类,这会提高正类的识别率,但同时会降低负类的识别率。

为了形象的描述上述的这种变化, 引入ROC曲线来评价一个分类器的好坏。ROC曲线也是一个全面评估模型的指标,中文名为“受试者工作特征曲线”。ROC曲线源于军事领域, 而后在医学领域应用甚广, “受试者工作特征曲线”这一名称也正是来自于医学领域。

ROC曲线的横坐标为假阳性率( False Positive Rate, FPR),即将负例错分为正例的概率 ,医学上称为误诊率; 纵坐标为真阳性率( True Positive Rate, TPR),将正例分对的概率。

横坐标:

 纵坐标:

 在ROC曲线中,设置不同的阈值,会得到不同的TPR和FPR,而随着阈值的逐渐减小,越来越多的实例被划分为正类,但是这些正类中同样也掺杂着负类,即TPR和FPR会同时增大。

 

AUC(Area Under the Curve)是ROC 曲线下方的面积,范围在0到1之间,可以理解为模型正确区分正例和反例的能力。
AUC 越大,模型性能越好。当AUC 等于1时,说明模型具有完美分类能力;当AUC 等于 0.5 时,说明模型的分类能力等于随机猜测。
 

分类模型评估模型

我们使用sklearn库合成的示例数据和一个简单的分类模型(逻辑回归)进行评估演示,包括手动计算混淆矩阵、准确度、精确度、召回率、F1分数、ROC曲线、AUC值和PR曲线的计算和绘制。

源码如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc, precision_recall_curve

# 生成合成样本数据
X, y = make_classification(n_samples=2000, n_features=20, random_state=42)

# 划分训练集和测试集
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)

# 计算混淆矩阵
TP = np.sum((y_test == 1) & (y_pred == 1))
TN = np.sum((y_test == 0) & (y_pred == 0))
FP = np.sum((y_test == 0) & (y_pred == 1))
FN = np.sum((y_test == 1) & (y_pred == 0))

# 计算准确度
accuracy = (TP + TN) / (TP + TN + FP + FN)

# 计算精确度
precision = TP / (TP + FP)

# 计算召回率
recall = TP / (TP + FN)

# 计算F1分数
f1 = (2 * precision * recall) / (precision + recall)

# 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
roc_auc = auc(fpr, tpr)

# 计算PR曲线
precision, recall, _ = precision_recall_curve(y_test, model.predict_proba(X_test)[:, 1])

# 输出结果
print("混淆矩阵:")
print("TP:", TP)
print("TN:", TN)
print("FP:", FP)
print("FN:", FN)
print("准确度:", accuracy)
print("精确度:", precision)
print("召回率:", recall)
print("F1分数:", f1)

# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")
plt.show()

# 绘制PR曲线
plt.figure(figsize=(8, 6))
plt.plot(recall, precision, color='blue', lw=2, label='Precision-Recall curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc="lower left")
plt.show()

 

输出结果如下:

混淆矩阵:
TP: 181
TN: 180
FP: 24
FN: 15
准确度: 0.9025
精确度: [0.49       0.49122807 0.49246231 0.49370277 0.49494949 0.49620253
 0.49746193 0.49872774 0.5        0.50127877 0.5025641  0.50385604
 0.50515464 0.50645995 0.50777202 0.50909091 0.51041667 0.51174935
 0.51308901 0.5144357  0.51578947 0.5171504  0.51851852 0.5198939
 0.5212766  0.52266667 0.52406417 0.52546917 0.52688172 0.52830189
 0.52972973 0.53116531 0.5326087  0.53405995 0.53551913 0.5369863
 0.53846154 0.5399449  0.54143646 0.54293629 0.54444444 0.545961
 0.54748603 0.54901961 0.5505618  0.55211268 0.55367232 0.55524079
 0.55681818 0.55840456 0.56       0.56160458 0.56321839 0.5648415
 0.56647399 0.56811594 0.56976744 0.57142857 0.57309942 0.57478006
 0.57647059 0.57817109 0.57988166 0.58160237 0.58333333 0.58507463
 0.58682635 0.58858859 0.59036145 0.59214502 0.59393939 0.59574468
 0.59756098 0.59938838 0.60122699 0.60307692 0.60493827 0.60681115
 0.60869565 0.6105919  0.6125     0.61442006 0.6163522  0.61829653
 0.62025316 0.62222222 0.62420382 0.62619808 0.625      0.62700965
 0.62903226 0.63106796 0.63311688 0.63517915 0.6372549  0.63934426
 0.64144737 0.64356436 0.64569536 0.64784053 0.65       0.65217391
 0.65436242 0.65656566 0.65878378 0.66101695 0.66326531 0.66552901
 0.66780822 0.66666667 0.66896552 0.67128028 0.67361111 0.67595819
 0.67832168 0.68070175 0.68309859 0.68551237 0.68794326 0.69039146
 0.69285714 0.6953405  0.69784173 0.70036101 0.70289855 0.70545455
 0.7080292  0.71062271 0.71323529 0.71586716 0.71851852 0.72118959
 0.7238806  0.72659176 0.72556391 0.72830189 0.73106061 0.7338403
 0.73664122 0.7394636  0.74230769 0.74517375 0.74806202 0.75097276
 0.75390625 0.75686275 0.75984252 0.76284585 0.76190476 0.76494024
 0.768      0.77108434 0.77016129 0.77327935 0.77642276 0.77959184
 0.78278689 0.78600823 0.7892562  0.79253112 0.79583333 0.79916318
 0.80252101 0.80168776 0.80084746 0.80425532 0.80769231 0.8111588
 0.81465517 0.81385281 0.8173913  0.8209607  0.8245614  0.82378855
 0.82743363 0.82666667 0.83035714 0.83408072 0.83783784 0.84162896
 0.84545455 0.84931507 0.84862385 0.85253456 0.85185185 0.85581395
 0.85981308 0.86384977 0.86792453 0.87203791 0.87142857 0.8708134
 0.875      0.87439614 0.87864078 0.88292683 0.8872549  0.88669951
 0.88613861 0.88557214 0.885      0.88944724 0.88888889 0.88832487
 0.89285714 0.8974359  0.89690722 0.89637306 0.89583333 0.90052356
 0.9        0.8994709  0.90425532 0.90374332 0.90322581 0.90810811
 0.9076087  0.90710383 0.91208791 0.91160221 0.91666667 0.91620112
 0.91573034 0.91525424 0.91477273 0.91428571 0.91954023 0.92485549
 0.9244186  0.92982456 0.93529412 0.93491124 0.93452381 0.94011976
 0.93975904 0.93939394 0.93902439 0.93865031 0.9382716  0.94409938
 0.95       0.94968553 0.94936709 0.94904459 0.94871795 0.95483871
 0.95454545 0.95424837 0.95394737 0.95364238 0.95333333 0.95302013
 0.95945946 0.95918367 0.95890411 0.95862069 0.95833333 0.95804196
 0.95774648 0.95744681 0.95714286 0.95683453 0.95652174 0.95620438
 0.95588235 0.95555556 0.95522388 0.96240602 0.96212121 0.96183206
 0.96153846 0.96124031 0.9609375  0.96062992 0.96031746 0.96
 0.95967742 0.95934959 0.95901639 0.95867769 0.95833333 0.95798319
 0.95762712 0.95726496 0.95689655 0.95652174 0.95614035 0.95575221
 0.95535714 0.95495495 0.96363636 0.96330275 0.96296296 0.96261682
 0.96226415 0.96190476 0.96153846 0.96116505 0.96078431 0.96039604
 0.96       0.95959596 0.95918367 0.95876289 0.95833333 0.95789474
 0.95744681 0.96774194 0.9673913  0.96703297 0.96666667 0.96629213
 0.96590909 0.96551724 0.96511628 0.96470588 0.96428571 0.96385542
 0.96341463 0.96296296 0.9625     0.96202532 0.96153846 0.96103896
 0.96052632 0.96       0.95945946 0.95890411 0.95833333 0.95774648
 0.95714286 0.95652174 0.97058824 0.97014925 0.98484848 0.98461538
 0.984375   0.98412698 0.98387097 0.98360656 0.98333333 0.98305085
 0.98275862 0.98245614 0.98214286 0.98181818 0.98148148 0.98113208
 0.98076923 0.98039216 0.98       0.97959184 0.97916667 0.9787234
 0.97826087 0.97777778 0.97727273 0.97674419 0.97619048 0.97560976
 0.975      0.97435897 0.97368421 0.97297297 0.97222222 0.97142857
 0.97058824 0.96969697 0.96875    0.96774194 0.96666667 0.96551724
 0.96428571 0.96296296 0.96153846 0.96       0.95833333 0.95652174
 0.95454545 0.95238095 0.95       0.94736842 0.94444444 0.94117647
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.        ]
召回率: [1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         1.         1.
 1.         1.         1.         1.         0.99489796 0.99489796
 0.99489796 0.99489796 0.99489796 0.99489796 0.99489796 0.99489796
 0.99489796 0.99489796 0.99489796 0.99489796 0.99489796 0.99489796
 0.99489796 0.99489796 0.99489796 0.99489796 0.99489796 0.99489796
 0.99489796 0.98979592 0.98979592 0.98979592 0.98979592 0.98979592
 0.98979592 0.98979592 0.98979592 0.98979592 0.98979592 0.98979592
 0.98979592 0.98979592 0.98979592 0.98979592 0.98979592 0.98979592
 0.98979592 0.98979592 0.98979592 0.98979592 0.98979592 0.98979592
 0.98979592 0.98979592 0.98469388 0.98469388 0.98469388 0.98469388
 0.98469388 0.98469388 0.98469388 0.98469388 0.98469388 0.98469388
 0.98469388 0.98469388 0.98469388 0.98469388 0.97959184 0.97959184
 0.97959184 0.97959184 0.9744898  0.9744898  0.9744898  0.9744898
 0.9744898  0.9744898  0.9744898  0.9744898  0.9744898  0.9744898
 0.9744898  0.96938776 0.96428571 0.96428571 0.96428571 0.96428571
 0.96428571 0.95918367 0.95918367 0.95918367 0.95918367 0.95408163
 0.95408163 0.94897959 0.94897959 0.94897959 0.94897959 0.94897959
 0.94897959 0.94897959 0.94387755 0.94387755 0.93877551 0.93877551
 0.93877551 0.93877551 0.93877551 0.93877551 0.93367347 0.92857143
 0.92857143 0.92346939 0.92346939 0.92346939 0.92346939 0.91836735
 0.91326531 0.90816327 0.90306122 0.90306122 0.89795918 0.89285714
 0.89285714 0.89285714 0.8877551  0.88265306 0.87755102 0.87755102
 0.87244898 0.86734694 0.86734694 0.8622449  0.85714286 0.85714286
 0.85204082 0.84693878 0.84693878 0.84183673 0.84183673 0.83673469
 0.83163265 0.82653061 0.82142857 0.81632653 0.81632653 0.81632653
 0.81122449 0.81122449 0.81122449 0.80612245 0.80102041 0.80102041
 0.79591837 0.79081633 0.78571429 0.78061224 0.7755102  0.7755102
 0.7755102  0.77040816 0.76530612 0.76020408 0.75510204 0.75510204
 0.75       0.74489796 0.73979592 0.73469388 0.72959184 0.7244898
 0.7244898  0.71938776 0.71428571 0.70918367 0.70408163 0.69897959
 0.69387755 0.68877551 0.68367347 0.67857143 0.67346939 0.66836735
 0.66326531 0.65816327 0.65306122 0.65306122 0.64795918 0.64285714
 0.6377551  0.63265306 0.62755102 0.62244898 0.61734694 0.6122449
 0.60714286 0.60204082 0.59693878 0.59183673 0.58673469 0.58163265
 0.57653061 0.57142857 0.56632653 0.56122449 0.55612245 0.55102041
 0.54591837 0.54081633 0.54081633 0.53571429 0.53061224 0.5255102
 0.52040816 0.51530612 0.51020408 0.50510204 0.5        0.49489796
 0.48979592 0.48469388 0.47959184 0.4744898  0.46938776 0.46428571
 0.45918367 0.45918367 0.45408163 0.44897959 0.44387755 0.43877551
 0.43367347 0.42857143 0.42346939 0.41836735 0.41326531 0.40816327
 0.40306122 0.39795918 0.39285714 0.3877551  0.38265306 0.37755102
 0.37244898 0.36734694 0.3622449  0.35714286 0.35204082 0.34693878
 0.34183673 0.33673469 0.33673469 0.33163265 0.33163265 0.32653061
 0.32142857 0.31632653 0.31122449 0.30612245 0.30102041 0.29591837
 0.29081633 0.28571429 0.28061224 0.2755102  0.27040816 0.26530612
 0.26020408 0.25510204 0.25       0.24489796 0.23979592 0.23469388
 0.22959184 0.2244898  0.21938776 0.21428571 0.20918367 0.20408163
 0.19897959 0.19387755 0.18877551 0.18367347 0.17857143 0.17346939
 0.16836735 0.16326531 0.15816327 0.15306122 0.14795918 0.14285714
 0.1377551  0.13265306 0.12755102 0.12244898 0.11734694 0.1122449
 0.10714286 0.10204082 0.09693878 0.09183673 0.08673469 0.08163265
 0.08163265 0.07653061 0.07142857 0.06632653 0.06122449 0.05612245
 0.05102041 0.04591837 0.04081633 0.03571429 0.03061224 0.0255102
 0.02040816 0.01530612 0.01020408 0.00510204 0.        ]
F1分数: 0.9027431421446385

绘制的ROC曲线如下:

绘制的PR曲线如下:

 

总结

机器学习中常用的分类评估算法包括准确率、召回率、F1分数和精确率等。以下是这些算法的优缺点:
1. 准确率(Accuracy):
   - 优点:直观易懂,是分类模型性能的最基本度量,适用于类别平衡的情况。
   - 缺点:当数据集高度不平衡时,高准确率可能掩盖了对少数类的识别能力不足。

2. 召回率(Recall):
   - 优点:关注模型对正类样本的识别能力,对于需要尽可能减少漏报的场景(如医疗诊断)非常有用。
   - 缺点:召回率高可能伴随着较多的误报,即低精确率。

3. F1分数(F1-Score):
   - 优点:综合考虑了精确率和召回率,是一个更加均衡的性能指标,特别适用于类别不平衡的情况。
   - 缺点:当需要更侧重于某一方面的性能时(例如更重视精确率或召回率),F1分数可能不是最佳选择。

4. 精确率(Precision):
   - 优点:关注模型预测为正类中的真正正类比例,对于需要尽可能减少误报的场景非常有用。
   - 缺点:过分强调精确率可能会导致召回率降低,即遗漏一些真正的正类样本。

总的来说,在实际应用中,选择合适的评估指标通常取决于具体问题的需求和数据的特性。例如,如果两个类别的重要性不同,或者错误分类的成本不一致,可能需要采用不同的评估策略。此外,除了上述指标外,还有其他一些评估方法,如ROC曲线、AUC值等,它们可以从不同角度评估模型的性能。在机器学习实践中,通常会结合多个评估指标来全面理解模型的表现。
 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值