uniquegino..
70
假设您model是一个sklearn预测器,您可以尝试以下两种方法:
import sklearn.metrics as metrics
# calculate the fpr and tpr for all thresholds of the classification
probs = model.predict_proba(X_test)
preds = probs[:,1]
fpr, tpr, threshold = metrics.roc_curve(y_test, preds)
roc_auc = metrics.auc(fpr, tpr)
# method I: plt
import matplotlib.pyplot as plt
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
# method II: ggplot
from ggplot import *
df = pd.DataFrame(dict(fpr = fpr, tpr = tpr))
ggplot(df, aes(x = 'fpr', y = 'tpr')) + geom_line() + geom_abline(linetype = 'dashed')
或尝试
ggplot(df, aes(x = 'fpr', ymin = 0, ymax = 'tpr')) + geom_line(aes(y = 'tpr')) + geom_area(alpha = 0.2) + ggtitle("ROC Curve w/ AUC = %s" % str(roc_auc))
Reii Nakano..
61
在给定一组地面实况标签和预测概率的情况下,这是绘制ROC曲线的最简单方法.最好的部分是,它绘制了所有类的ROC曲线,因此您也可以获得多个整齐的曲线
import scikitplot as skplt
import matplotlib.pyplot as plt
y_true = # ground truth labels
y_probas = # predicted probabilities generated by sklearn classifier
skplt.metrics.plot_roc_curve(y_true, y_probas)
plt.show()
这是plot_roc_curve生成的样本曲线.我使用了来自scikit-learn的样本数据集,因此有10个类.请注意,为每个类绘制了一条ROC曲线.
免责声明:请注意,这使用我构建的scikit-plot库.
我在尝试使用包时遇到问题.每当我试图提供曲线roc曲线时,它告诉我我有"太多指数".我正在喂我的y_test,并且正在为它做准备.我能够做出我的预测.但由于这个错误,不能得到阴谋.是由于我正在运行的python版本? (10认同)
Reii Nakano - 你是天使伪装的天才.你结识了我的一天.这个包很简单但是非常有效.你对我充满敬意.关于您上面的代码段,请注意一下; 最后一行不读它:`skplt.metrics.plot_roc_curve(y_true,y_probas)`?十分感谢你. (3认同)
我不得不将我的y_pred数据重新整形为大小为Nx1而不仅仅是一个列表:y_pred.reshape(len(y_pred),1).现在我得到错误'IndexError:索引1超出了轴1的大小为1',但绘制了一个数字,我猜是因为代码需要一个二进制分类器来提供每个类概率的Nx2向量 (3认同)
ebarr..
33
这里的问题根本不清楚,但是如果你有一个数组true_positive_rate和一个数组false_positive_rate,那么绘制ROC曲线并得到AUC就像这样简单:
import matplotlib.pyplot as plt
import numpy as np
x = # false_positive_rate
y = # true_positive_rate
# This is the ROC curve
plt.plot(x,y)
plt.show()
# This is the AUC
auc = np.trapz(y,x)
如果代码中有FPR,TPR oneliners,那么这个答案会好得多. (3认同)
fpr,tpr,阈值= metrics.roc_curve(y_test,preds) (3认同)
ajayramesh..
27
AUC曲线使用matplotlib进行二进制分类
from sklearn import svm, datasets
from sklearn import metrics
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt
加载乳腺癌数据集
breast_cancer = load_breast_cancer()
X = breast_cancer.data
y = breast_cancer.target
拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.33, random_state=44)
模型
clf = LogisticRegression(penalty='l2', C=0.1)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
准确性
print("Accuracy", metrics.accuracy_score(y_test, y_pred))
AUC曲线
y_pred_proba = clf.predict_proba(X_test)[::,1]
fpr, tpr, _ = metrics.roc_curve(y_test, y_pred_proba)
auc = metrics.roc_auc_score(y_test, y_pred_proba)
plt.plot(fpr,tpr,label="data 1, auc="+str(auc))
plt.legend(loc=4)
plt.show()
小智..
12
这是一个python代码:
import matplotlib.pyplot as plt
import numpy as np
score = np.array([0.9, 0.8, 0.7, 0.6, 0.55, 0.54, 0.53, 0.52, 0.51, 0.505, 0.4, 0.39, 0.38, 0.37, 0.36, 0.35, 0.34, 0.33, 0.30, 0.1])
y = np.array([1,1,0, 1, 1, 1, 0, 0, 1, 0, 1,0, 1, 0, 0, 0, 1 , 0, 1, 0])
# false positive rate
fpr = []
# true positive rate
tpr = []
# Iterate thresholds from 0.0, 0.01, ... 1.0
thresholds = np.arange(0.0, 1.01, .01)
# get number of positive and negative examples in the dataset
P = sum(y)
N = len(y) - P
# iterate through all thresholds and determine fraction of true positives
# and false positives found at this threshold
for thresh in thresholds:
FP=0
TP=0
for i in range(len(score)):
if (score[i] > thresh):
if y[i] == 1:
TP = TP + 1
if y[i] == 0:
FP = FP + 1
fpr.append(FP/float(N))
tpr.append(TP/float(P))
plt.scatter(fpr, tpr)
plt.show()
更多参考
Max..
6
之前的答案假设您确实自己计算了TP/Sens.手动执行此操作是一个坏主意,通过计算很容易出错,而是使用库函数来完成所有这些操作.
scikit_lean中的plot_roc函数正是您所需要的:http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html
代码的基本部分是:
for i in range(n_classes):
fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
roc_auc[i] = auc(fpr[i], tpr[i])
Cherry Wu..
6
from sklearn import metrics
import numpy as np
import matplotlib.pyplot as plt
y_true = # true labels
y_probas = # predicted results
fpr, tpr, thresholds = metrics.roc_curve(y_true, y_probas, pos_label=0)
# Print ROC curve
plt.plot(fpr,tpr)
plt.show()
# Print AUC
auc = np.trapz(tpr,fpr)
print('AUC:', auc)
如何计算`y_true = #trical labels,y_probas = #prepected results`? (2认同)
如果您有基本事实,则y_true是您的基本事实(标签),y_probas是模型的预测结果 (2认同)