机器学习 - AUC - ROC 曲线
在本页,W3schools.com 与 纽约数据科学学院 合作,为我们的学生提供数字培训内容。
AUC - ROC 曲线
在分类中,有很多不同的评估指标。最流行的是**准确率**,它衡量模型的正确率。这是一个很好的指标,因为它易于理解,并且通常希望得到最多的正确预测。在某些情况下,你可能需要考虑使用其他评估指标。
另一个常见的指标是**AUC**,即接收者操作特征 (**ROC**) 曲线下的面积。接收者操作特征曲线绘制了不同分类阈值下真阳性 (**TP**) 率与假阳性 (**FP**) 率的关系。阈值是将二元分类中的两个类别分开的不同的概率截止值。它使用概率来告诉我们模型区分类别的程度。
不平衡数据
假设我们有一个不平衡的数据集,其中大多数数据是同一个值的。我们可以通过预测大多数类别来获得模型的高准确率。
例子
import numpy as np
from sklearn.metrics import accuracy_score, confusion_matrix, roc_auc_score, roc_curve
n = 10000
ratio = .95
n_0 = int((1-ratio) * n)
n_1 = int(ratio * n)
y = np.array([0] * n_0 + [1] * n_1)
# 以下是来自一个总是预测大多数类别的假设模型的概率
# 预测类别 1 的概率将是 100%
y_proba = np.array([1]*n)
y_pred = y_proba > .5
print(f'准确率分数: {accuracy_score(y, y_pred)}')
cf_mat = confusion_matrix(y, y_pred)
print('混淆矩阵')
print(cf_mat)
print(f'类别 0 准确率: {cf_mat[0][0]/n_0}')
print(f'类别 1 准确率: {cf_mat[1][1]/n_1}')
运行示例 »
广告
虽然我们获得了非常高的准确率,但模型没有提供有关数据的任何信息,因此它没有用。我们准确地预测了 100% 的时间类别 1,同时不准确地预测了 0% 的时间类别 0。以准确率为代价,拥有一个能够在一定程度上将这两个类别区分开来的模型可能更好。
例子
## 下面是来自假设模型的概率,该模型并不总是预测模式
y_proba_2 = np.array(
np.random.uniform(0, .7, n_0).tolist() +
np.random.uniform(.3, 1, n_1).tolist()
)
y_pred_2 = y_proba_2 > .5
print(f'准确率得分: {accuracy_score(y, y_pred_2)}')
cf_mat = confusion_matrix(y, y_pred_2)
print('混淆矩阵')
print(cf_mat)
print(f'类别 0 准确率: {cf_mat[0][0]/n_0}')
print(f'类别 1 准确率: {cf_mat[1][1]/n_1}')
运行示例 »
对于第二组预测,我们的准确率得分不如第一组高,但每个类别的准确率更加平衡。使用准确率作为评估指标,我们会将第一个模型评定为高于第二个模型,即使它没有告诉我们任何关于数据的信息。
在这种情况下,使用另一个评估指标(如 AUC)会更好。
import matplotlib.pyplot as plt
def plot_roc_curve(true_y, y_prob)
"""
根据概率绘制 ROC 曲线
"""
fpr, tpr, thresholds = roc_curve(true_y, y_prob)
plt.plot(fpr, tpr)
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
例子
模型 1
plot_roc_curve(y, y_proba)
print(f'模型 1 AUC 得分: {roc_auc_score(y, y_proba)}')
结果
模型 1 AUC 得分: 0.5
例子
模型 2
plot_roc_curve(y, y_proba_2)
print(f'模型 2 AUC 得分: {roc_auc_score(y, y_proba_2)}')
结果
模型 2 AUC 得分: 0.8270551578947367
大约 0.5 的 AUC 得分意味着模型无法区分这两个类别,并且曲线看起来像一条斜率为 1 的直线。更接近 1 的 AUC 得分意味着模型能够分离这两个类别,并且曲线会更靠近图的左上角。
概率
由于 AUC 是一种利用类别预测概率的指标,因此我们可以对 AUC 得分更高的模型比 AUC 得分更低的模型更有信心,即使它们的准确率相似。
在下面的数据中,我们有两组来自假设模型的概率。第一组的概率在预测这两个类别时不那么“自信”(概率接近 0.5)。第二组的概率在预测这两个类别时更“自信”(概率接近 0 或 1 的极值)。
例子
import numpy as np
n = 10000
y = np.array([0] * n + [1] * n)
#
y_prob_1 = np.array(
np.random.uniform(.25, .5, n//2).tolist() +
np.random.uniform(.3, .7, n).tolist() +
np.random.uniform(.5, .75, n//2).tolist()
)
y_prob_2 = np.array(
np.random.uniform(0, .4, n//2).tolist() +
np.random.uniform(.3, .7, n).tolist() +
np.random.uniform(.6, 1, n//2).tolist()
)
print(f'模型 1 准确率得分: {accuracy_score(y, y_prob_1>.5)}')
print(f'模型 2 准确率得分: {accuracy_score(y, y_prob_2>.5)}')
print(f'模型 1 AUC 得分: {roc_auc_score(y, y_prob_1)}')
print(f'模型 2 AUC 得分: {roc_auc_score(y, y_prob_2)}')
运行示例 »
即使两个模型的准确率相似,具有更高 AUC 得分的模型也会更可靠,因为它考虑了预测概率。它更有可能在预测未来数据时提供更高的准确率。