如何利用Python绘制ROC曲线

如何利用Python绘制ROC曲线,第1张

方法/步骤

1

首先,打开数据,以A2列数据为例做曲线

2

点击“ Analyze -ROC curve ”。

3

d出界面后,导入A2列数据,调节其它参数。

4

点击“OK”,出现结果。

5

双击ROC曲线,进入调节界面。

6

可以调节很多参数,也汪漏可以把曲线链陵模调成平滑的。棚缓很方便实用吧!

使用sklearn的一系列方法后可以很方便的绘基衫制处ROC曲线,这里简单实现以下。

主要是利用混淆矩阵中的知识作为绘制的数据(如果不是很懂可以先看看这里的基础):

tpr(Ture Positive Rate):真阳率 图像的纵坐标

fpr(False Positive Rate):阳率(伪阳率)槐察 图像的横坐标

mean_tpr:累计真阳率求平均值

mean_fpr:累计阳率求平均值

import numpy as np

import matplotlib.pyplot as plt

from sklearn import svm, datasets

from sklearn.metrics import roc_curve, auc

from sklearn.model_selection import StratifiedKFold

iris = datasets.load_iris()

X = iris.data

y = iris.target

X, y = X[y != 2], y[y != 2] # 去掉了label为2,label只能二分,才可以。

n_samples, n_features = X.shape

# 增加噪声特征

random_state = np.random.RandomState(0)

X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]

cv = StratifiedKFold(n_splits=6)#导入该模型,后面将搏明腔数据划分6份

classifier = svm.SVC(kernel='linear', probability=True,random_state=random_state) # SVC模型 可以换作AdaBoost模型试试

# 画平均ROC曲线的两个参数

mean_tpr = 0.0 # 用来记录画平均ROC曲线的信息

mean_fpr = np.linspace(0, 1, 100)

cnt = 0

for i, (train, test) in enumerate(cv.split(X,y)): #利用模型划分数据集和目标变量 为一一对应的下标

cnt +=1

probas_ = classifier.fit(X[train], y[train]).predict_proba(X[test]) # 训练模型后预测每条样本得到两种结果的概率

fpr, tpr, thresholds = roc_curve(y[test], probas_[:, 1])# 该函数得到伪正例、真正例、阈值,这里只使用前两个

mean_tpr += np.interp(mean_fpr, fpr, tpr) # 插值函数 interp(x坐标,每次x增加距离,y坐标) 累计每次循环的总值后面求平均值

mean_tpr[0] = 0.0 # 将第一个真正例=0 以0为起点

roc_auc = auc(fpr, tpr) # 求auc面积

plt.plot(fpr, tpr, lw=1, label='ROC fold {0:.2f} (area = {1:.2f})'.format(i, roc_auc))# 画出当前分割数据的ROC曲线

plt.plot([0, 1], [0, 1], '--', color=(0.6, 0.6, 0.6), label='Luck') # 画对角线

mean_tpr /= cnt # 求数组的平均值

mean_tpr[-1] = 1.0 # 坐标最后一个点为(1,1) 以1为终点

mean_auc = auc(mean_fpr, mean_tpr)

plt.plot(mean_fpr, mean_tpr, 'k--',label='Mean ROC (area = {0:.2f})'.format(mean_auc), lw=2)

plt.xlim([-0.05, 1.05]) # 设置x、y轴的上下限,设置宽一点,以免和边缘重合,可以更好的观察图像的整体

plt.ylim([-0.05, 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()


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12432539.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存