【机器学习】ROC曲线
- 1、ROC曲线简介
- 2、ROC曲线和AUC值
- 2.1 ROC曲线
- 2.2 AUC值
- 3、实验内容
- 3.1 准备数据集
- 3.2 特征提取
- 3.3 数据集划分
- 3.4 模型训练与预测
- 3.5 计算和绘制ROC曲线
- 3.6 绘制混淆矩阵
- 3.7 三分类混淆矩阵
- 4 源代码
- 4.1 实现ROC二分类
- 4.2 三分类混淆例子
1、ROC曲线简介
接受者操作特性曲线(receiver operating characteristic curve,简称ROC曲线),又称为感受性曲线(sensitivity curve)。在二战期间,雷达系统被广泛应用于检测敌方飞机。为了优化雷达系统的性能,研究人员需要找到一种评估雷达系统的性能的方法。他们引入了信号检测理论中的TPR(真阳性率)和FPR(假阳性率)的概念。TPR表示在所有实际存在目标的情况下,系统正确检测到目标的比例。FPR则表示在所有实际不存在目标的情况下,系统错误地报告目标存在的比例。
随着计算机技术的进步,ROC曲线在机器学习和模式识别领域得到了广泛应用。它成为了评估分类器性能和选择最佳阈值的重要工具。历史上,统计学家和研究人员对于ROC曲线和AUC的研究也不断深入。他们提出了数学模型和统计方法来解释和推导ROC曲线的性质,并在医学诊断、生物信息学、金融风险评估等领域得到了广泛应用。
2、ROC曲线和AUC值
2.1 ROC曲线
以鸢尾花的两个种类为标准的分类就是一个二分类问题。判断预测的结果有下面四种结局,见表。
判断结果和实际结果 | |
---|---|
真阳性(True Positive, TP) | 判断为Setosa,实际上确实是Setosa |
伪阳性(False Positive, FP) | 判断为Setosa,但实际上是Versicolor |
真阴性(True Negative, TN) | 判断为Versicolor,实际上确实是Versicolor |
伪阴性(False Negative, FN) | 判断为Versicolor,但实际上是Setosa |
相关术语
阳性 (P, Positive) 正样本。
阴性 (N, Negative) 负样本。
真阳性 (TP, True Positive) 表明实际是正样本预测成正样本的样本。
真阴性 (TN, True Negative) 表明实际是负样本预测成负样本的样本。
伪阳性 (FP, False Positive) 表明实际是负样本预测成正样本的样本。
伪阴性 (FN, False Negative) 表明实际是正样本预测成负样本的样本。
伪阳性率(False Positive Rate,FPR) 在所有实际为阴性的样本中,被错误地判断为阳性之比率。又称:错误命中率,假警报率 (false alarm rate)。计算公式为:FPR = FP / N = FP / (FP + TN)
真阳性率(True Positive Rate,TPR) 在所有实际为阳性的样本中,被正确地判断为阳性之比率。又称:命中率 (hit rate)、敏感度(sensitivity)。计算公式为:TPR = TP / P = TP / (TP + FN)
ROC曲线提供了评估分类模型性能的一个直观可视化工具,可以帮助我们了解模型在不同决策阈值下的表现,并根据需求调整模型的分类策略。
2.2 AUC值
AUC(Area Under the Curve)值是ROC曲线下的面积,它用于评估分类器(或模型)在不同阈值下的性能。AUC值通常被用作衡量二分类问题中分类器的准确性的标准。在绘制ROC曲线时,横轴代表False Positive Rate(FPR),纵轴代表True Positive Rate(TPR)。AUC值表示了ROC曲线下的面积大小,范围从0到1之间,数值越大表示分类器性能越好。
当AUC值接近1时,说明分类器能够很好地区分正样本和负样本,具有高准确性。相反,AUC值接近0.5时,说明分类器的性能与随机猜测相当;而AUC值小于0.5时,则表示分类器的性能不佳,实际上与随机猜测相反。
AUC是一个用来评估分类模型性能的常见指标,优点是:适用于正负样本分布不一致的场景;对于分类器性能的评价,不限定单一的分类阈值。
3、实验内容
3.1 准备数据集
首先使用 load_iris() 函数加载鸢尾花数据集,并将特征矩阵存储在 X 中,分类值存储在 y 中。
数据集里面的特征依次为花萼长、宽和花瓣长、宽; 而类别标签为0,1,2分别表示山鸢尾(setosa),变色鸢尾(versicolor)和维吉尼亚鸢尾(virginica)
然后,通过索引操作从 X 中提取了前5条数据,即 X[0:5],以及第二个品种对应的前5条数据: X[50:55]。使用 np.concatenate 函数将这两组数据合并为一个新的特征矩阵 X1。接下来,同样的操作也应用于目标值 y,提取了相应的标签并存储在 y1 中。
3.2 特征提取
将包含鸢尾花数据集的特征和目标变量按照类别为0和1进行筛选并分离。选择类别为0和1的样本,并将其存储在一个名为iris_new的新数据集中。这是为了将原始的鸢尾花数据集转换为一个二分类任务的数据集。通过这段代码的处理,我们得到了一个包含特征变量X和目标变量Y的数据集,可以用于二分类任务的建模和训练。
3.3 数据集划分
将特征变量X和目标变量Y按照指定的比例划分为训练集和测试集,并将划分后的结果分别赋值给Xtrain、Xtest、Ytrain和Ytest。
参数解释:
X:特征变量的数据集
Y:目标变量的数据集
test_size:测试集所占的比例,这里设置为0.3,表示测试集占总数据集的30%
random_state:随机种子,用于保证每次划分结果的一致性,设置为420
3.4 模型训练与预测
创建了一个SVM分类器对象clf,使用线性核函数(kernel=‘linear’)进行分类。然后使用训练集Xtrain和Ytrain对分类器进行训练。接着使用测试集Xtest和Ytest对训练好的模型进行评估,并输出准确率(accuracy)。最后对测试集Xtest进行预测,将预测结果存储在result中。
3.5 计算和绘制ROC曲线
使用真实标签Ytest和预测结果result计算了真阳性率(True Positive Rate,TPR)、假阳性率(False Positive Rate,FPR)以及阈值(thresholds),然后通过计算得到了AUC值(Area Under Curve,曲线下面积)并将其打印输出。使用plt.plot()函数绘制了ROC曲线,其中真阳性率(TPR)作为纵轴,假阳性率(FPR)作为横轴,并在图例中显示了AUC值。通过plt.plot([0, 1], [0, 1], color=‘navy’, lw=2, linestyle=‘–’)绘制了随机猜测曲线。其他代码用于设置横轴纵轴的取值范围、标签、标题、图例、网格线,并最后显示图表。绘制出的图如图1所示:
3.6 绘制混淆矩阵
使用ConfusionMatrixDisplay.from_predictions()函数根据预测结果result和真实结果Ytest绘制了混淆矩阵,设置了颜色条、标签、颜色映射等。其他代码用于设置标题,并最后显示图表。绘制出的图如图2所示:
3.7 三分类混淆矩阵
计算和绘制混淆矩阵,并使用seaborn库和matplotlib库进行可视化。首先,我们导入了seaborn、confusion_matrix和matplotlib.pyplot模块。然后,我们设置了seaborn的主题样式。接下来,创建了一个图表对象f和一个子图对象ax。定义了真实标签y_true和预测标签y_pred。使用confusion_matrix函数计算了混淆矩阵C2,并通过指定labels参数设置了类别标签。打印了计算得到的混淆矩阵。使用sns.heatmap函数绘制了热力图,将混淆矩阵中的每个元素以颜色的形式显示出来,并在图表上方加上了注解,注解内容为每个元素的数值。通过plt.title、plt.xlabel和plt.ylabel设置了图表的标题、x轴标签和y轴标签。最后,使用plt.show显示了图表。绘制出的图如图3所示:
4 源代码
4.1 实现ROC二分类
# 导入模块
from sklearn.datasets import load_iris # 导入鸢尾花数据集
from sklearn.svm import SVC # 导入支持向量机分类器
import pandas as pd # 导入pandas库,用于数据处理和分析
import matplotlib.pyplot as plt # 导入matplotlib库,用于数据可视化
import numpy as np # 导入numpy库,用于数值计算
from sklearn.metrics import classification_report, roc_auc_score, confusion_matrix, accuracy_score, roc_curve, auc, \
ConfusionMatrixDisplay # 导入一些评估指标和绘图函数
from sklearn.model_selection import train_test_split # 导入数据集划分函数
# 加载数据集
iris = load_iris() # 加载鸢尾花数据集
iris_data = pd.DataFrame(iris.data, columns=iris.feature_names) # 将特征数据转换为DataFrame格式
iris_data['class'] = iris.target # 添加目标变量到DataFrame中
# 数据预处理
iris_new = iris_data[iris_data['class'] < 2] # 选择类别为0和1的样本作为二分类任务的数据集
X = iris_new.iloc[:, :-1] # 特征变量
Y = iris_new.iloc[:, -1] # 目标变量
# 数据集划分
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y, test_size=0.3, random_state=420) # 划分训练集和测试集
# 模型训练与预测
clf = SVC(C=1, gamma='auto', kernel='linear') # 创建SVM分类器对象
clf.fit(Xtrain, Ytrain) # 使用训练集进行模型训练
clf.score(Xtest, Ytest) # 使用测试集对模型进行评估,输出准确率
result = clf.predict(Xtest) # 对测试集进行预测
print(result)
# 计算ROC曲线的参数
fpr, tpr, thresholds = roc_curve(Ytest, result) # 计算真阳性率、假阳性率和阈值
roc_auc = auc(fpr, tpr) # 计算AUC值
print(roc_auc)
# 绘制ROC曲线
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc) # 绘制ROC曲线
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') # 绘制随机猜测曲线
plt.xlim([0.0, 1.0]) # 设置x轴的取值范围
plt.ylim([0.0, 1.05]) # 设置y轴的取值范围
plt.xlabel('False Positive Rate') # 设置x轴标签
plt.ylabel('True Positive Rate') # 设置y轴标签
plt.title('Receiver operating characteristic example') # 设置图表标题
plt.legend(loc="lower right") # 添加图例
plt.grid(color='purple', linestyle='--') # 添加网格线
plt.show() # 显示图表
# 绘制混淆矩阵
ConfusionMatrixDisplay.from_predictions(Ytest, result, colorbar=True, display_labels=["0", "1"],
cmap=plt.cm.Reds) # 根据预测结果和真实结果绘制混淆矩阵
plt.title("Confusion Matrix") # 设置图表标题
plt.show() # 显示图表
4.2 三分类混淆例子
import seaborn as sns
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
sns.set() # 设置seaborn主题
f, ax = plt.subplots() # 创建一个图表和子图对象
y_true = [0, 0, 1, 2, 1, 2, 0, 2, 2, 0, 1, 1] # 真实标签
y_pred = [1, 0, 1, 2, 1, 0, 0, 2, 2, 0, 1, 1] # 预测标签
C2 = confusion_matrix(y_true, y_pred, labels=[0, 1, 2]) # 计算混淆矩阵
print(C2) # 打印混淆矩阵
sns.heatmap(C2, annot=True, ax=ax) # 绘制热力图,显示混淆矩阵中的每个元素并在图表上方加注解
plt.title("confusion matrix") # 设置图表标题
plt.xlabel("predict") # 设置x轴标签
plt.ylabel("true") # 设置y轴标签
plt.show() # 显示图表