如何正确绘制ROC曲线:从基础到实践
创作时间:
作者:
@小白创作中心
如何正确绘制ROC曲线:从基础到实践
引用
CSDN
1.
https://blog.csdn.net/qq_61854787/article/details/140867656
在机器学习模型评估中,ROC曲线是一个重要的可视化工具,用于展示分类器在不同阈值下的性能。然而,在绘制ROC曲线时,很多初学者可能会遇到一些问题,比如曲线看起来不圆润,只有一个折点。本文将详细解释如何正确绘制ROC曲线,并通过多个具体的代码示例进行演示。
问题描述
在绘制ROC曲线时,如果曲线看起来只有一个折点(如图1所示),而不是预期的圆润曲线(如图2所示),这通常意味着在计算ROC曲线时使用了错误的数据。
图1:错误的ROC曲线
图2:正确的ROC曲线
问题所在
绘制ROC曲线时,应该使用模型预测的分数(即正类的概率),而不是预测的标签。这是因为ROC曲线是基于不同阈值下的真阳性率(TPR)和假阳性率(FPR)来绘制的,而分数提供了更丰富的信息,可以生成多个阈值下的性能指标。
逻辑回归示例
以下是一个使用逻辑回归模型的示例:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LogisticRegression()
model.fit(X_train, y_train)
y_scores = model.predict_proba(X_test)[:, 1] # 选择正类的概率
fpr1, tpr1, thread1 = roc_curve(y_test, y_scores) # 注意用的是y_scores
roc_auc = auc(fpr1, tpr1)
# 绘图
plt.figure()
lw = 2
plt.plot(fpr1, tpr1, color='darkred',
lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, 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')
plt.legend(loc="lower right")
plt.savefig('roc.png')
plt.show()
其他模型示例
同样地,对于SVM和随机森林模型,也需要使用预测分数:
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
# SVM
svm_model = SVC(probability=True)
svm_model.fit(X_train, y_train)
y_scores_svm = svm_model.predict_proba(X_test)[:, 1] # 选择正类的概率
y_pred_svm = svm_model.predict(X_test) # 计算准确率
print("SVM Accuracy:", accuracy_score(y_test, y_pred_svm))
# 随机森林
rf_model = RandomForestClassifier(random_state=0)
rf_model.fit(X_train, y_train)
y_scores_rf = rf_model.predict_proba(X_test)[:, 1] # 选择正类的概率
y_pred_rf = rf_model.predict(X_test) # 计算准确率
print("Random Forest Accuracy:", accuracy_score(y_test, y_pred_rf))
深度学习示例
对于深度学习模型,获取预测分数的方法略有不同:
import torch
import numpy as np
from torch.utils.data import DataLoader
from sklearn.metrics import roc_curve, auc
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = net(hidden_size=512)
weight = torch.load('./model.pth', map_location=device)
model.load_state_dict(weight, strict=False)
model = model.to(device)
model.eval()
y_score = []
with torch.no_grad():
for data, target in dataloader_test:
data = data.to(device)
output = model(data)
y_score.extend(output.cpu().numpy())
fpr, tpr, thread = roc_curve(y_test, y_score)
roc_auc = auc(fpr, tpr)
同时绘制多条ROC曲线
如果需要在同一张图上绘制多条ROC曲线,可以按照以下方式操作:
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
lw=lw, label='SVM ROC curve (area = %0.2f)' % roc_auc1)
plt.plot(fpr1, tpr1, color='green',
lw=lw, label='Random forest ROC curve (area = %0.2f)' % roc_auc2)
plt.plot(fpr, tpr, color='darkred', label='Deep learning ROC curve (area = %0.2f)' % auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, 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('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()
需要注意的是,由于数据量的限制,即使正确绘制的ROC曲线也可能看起来不够圆润,存在一些折线。但这并不影响其正确性。
通过以上步骤,可以确保正确绘制ROC曲线,从而更准确地评估分类模型的性能。
热门推荐
研究证实:地中海饮食配大枣助眠效果佳
双11后消费后悔怎么办?专家推荐两大情绪管理法
万元奖金等你拿,微信启动圣诞红包封面设计大赛
非遗童谣摇啊摇:跨越百年的音乐与亲情记忆
国家二级心理咨询师:提升情绪价值在于理解而非拯救
热爱与冷静:乔布斯库克的情绪管理之道
研究证实:父母情绪价值是塑造孩子未来的关键
OCR技术的扩展:应用、挑战与前景
从壁虎到麻雀:普通野生动物也需要保护
李云龙的“坑队友”操作:段鹏差点被开除
反流性食管炎患者冬季注意事项:从饮食到生活全方位指导
江苏高院发布物业纠纷案例:拒交物业费或成失信被执行人
无锡三年受理9000件物业纠纷案,这些方法助你维权
每天一碗燕麦粥,有效控制血糖血脂,降低脑梗风险
脑梗患者办公室健康饮食:专家推荐低盐低脂高纤维方案
脑梗患者需警惕:高脂高盐高糖和酒精是饮食禁区
降脂降压效果好,燕麦菠菜苹果助脑梗患者康复
天麻珍珠母:肝火旺的中药调理方案
冬季养生,中医教你调理肝火旺
四味中药教你轻松降肝火
菊花枸杞泡水:轻松调理肝火旺
支付宝微信都能办:老年人手机认证最全指南
成都70岁以上老人可免费乘地铁,天津公交优惠更普惠
NFC技术让公交卡年审更便捷,淄博老年人足不出户可办理
从座位到敬酒:职场饭局中的权力与礼仪
远光眼问题该如何解决?远光眼对行车安全有哪些影响?
探访巴塞罗那圣家堂,感受高迪的信仰奇迹
圣家堂:高迪未竟之梦,巴塞罗那必打卡圣地
复星艺术中心XR展带你“走进”圣家堂
京东热卖生理盐水喷雾:温和清洁鼻腔,辅助治疗鼻炎