一、基础概念
如果需要理解ROC曲线,那你就需要先了解一下混淆矩阵了,具体的内容可以查看一下之前的文章,这里重点引入2个概念:
真正率(true positive rate,TPR),指的是被模型正确预测的正样本的比例:
假正率(false positive rate,FPR) ,指的是被模型错误预测的正样本的比例:
precision(精度),也称为查准率:
recall(召回率),也称为查全率:
二、ROC概念
ROC(receiver operating characteristic)接受者操作特征,其显示的是分类器的真正率和假正率之间的关系,如下图所示:
ROC曲线有助于比较不同分类器的相对性能,其曲线下方的面积为AUC(area under curve),其面积越大则分类的性能越好,理想的分类器auc=1。
三、ROC曲线绘制
对于一个特定的分类器和测试数据集,显然只能得到一个分类结果,即一组FPR和TPR结果,而要得到一个曲线,我们实际上需要一系列FPR和TPR的值。
那么如何处理?很简单,我们可以根据模型预测的概率值,并且设置不同的阈值来获得不同的预测结果。什么意思?
比如说:
5个样本,真实的target(目标标签)是y=c(1,1,0,0,1)
模型分类器将预测样本为1的概率p=c(0.5,0.6,0.55,0.4,0.7)
我们需要选定阈值才能把概率转化为类别,
如果我们选定阈值为0.1,那么5个样本被分进1的类别
如果选定0.3,结果仍然一样
如果选了0.45作为阈值,那么只有样本4被分进0
之后把所有得到的所有分类结果计算FTR,PTR,并绘制成线,就可以得到ROC曲线了,当threshold(阈值)取值越多,ROC曲线越平滑。
四、ROC曲线代码实现
代码语言:javascript复制 1from sklearn.metrics import roc_curve, auc
2from scipy import interp
3
4pipe_lr = Pipeline([('scl', StandardScaler()),
5 ('pca', PCA(n_components=2)),
6 ('clf', LogisticRegression(penalty='l2',
7 random_state=0,
8 C=100.0))])
9
10X_train2 = X_train[:, [4, 14]]
11 # 因为全部特征丢进去的话,预测效果太好,画ROC曲线不好看哈哈哈,所以只是取了2个特征
12
13
14cv = list(StratifiedKFold(n_splits=3,
15 random_state=1).split(X_train, y_train))
16
17fig = plt.figure(figsize=(7, 5))
18
19mean_tpr = 0.0
20mean_fpr = np.linspace(0, 1, 100)
21all_tpr = []
22
23for i, (train, test) in enumerate(cv):
24 probas = pipe_lr.fit(X_train2[train],
25 y_train[train]).predict_proba(X_train2[test])
26
27 fpr, tpr, thresholds = roc_curve(y_train[test],
28 probas[:, 1],
29 pos_label=1)
30 mean_tpr = interp(mean_fpr, fpr, tpr)
31 mean_tpr[0] = 0.0
32 roc_auc = auc(fpr, tpr)
33 plt.plot(fpr,
34 tpr,
35 lw=1,
36 label='ROC fold %d (area = %0.2f)'
37 % (i 1, roc_auc))
38
39plt.plot([0, 1],
40 [0, 1],
41 linestyle='--',
42 color=(0.6, 0.6, 0.6),
43 label='random guessing')
44
45mean_tpr /= len(cv)
46mean_tpr[-1] = 1.0
47mean_auc = auc(mean_fpr, mean_tpr)
48plt.plot(mean_fpr, mean_tpr, 'k--',
49 label='mean ROC (area = %0.2f)' % mean_auc, lw=2)
50plt.plot([0, 0, 1],
51 [0, 1, 1],
52 lw=2,
53 linestyle=':',
54 color='black',
55 label='perfect performance')
56
57plt.xlim([-0.05, 1.05])
58plt.ylim([-0.05, 1.05])
59plt.xlabel('false positive rate')
60plt.ylabel('true positive rate')
61plt.title('Receiver Operator Characteristic')
62plt.legend(loc="lower right")
63
64plt.tight_layout()
65plt.show()
查看下AUC和准确率的结果:
代码语言:javascript复制1pipe_lr = pipe_lr.fit(X_train2, y_train)
2y_labels = pipe_lr.predict(X_test[:, [4, 14]])
3y_probas = pipe_lr.predict_proba(X_test[:, [4, 14]])[:, 1]
4# note that we use probabilities for roc_auc
5# the `[:, 1]` selects the positive class label only
代码语言:javascript复制1from sklearn.metrics import roc_auc_score, accuracy_score
2print('ROC AUC: %.3f' % roc_auc_score(y_true=y_test, y_score=y_probas))
3print('Accuracy: %.3f' % accuracy_score(y_true=y_test, y_pred=y_labels))
代码语言:javascript复制ROC AUC: 0.752
Accuracy: 0.711
代码语言:javascript复制—End—