前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Machine Learning-模型评估与调参 ——ROC曲线

Machine Learning-模型评估与调参 ——ROC曲线

作者头像
Sam Gor
发布2019-08-22 13:27:14
1.1K0
发布2019-08-22 13:27:14
举报
文章被收录于专栏:SAMshareSAMshareSAMshare

一、基础概念

如果需要理解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曲线代码实现

 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和准确率的结果:

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
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))
ROC AUC: 0.752
Accuracy: 0.711
—End—
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SAMshare 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 比如说:
  • 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曲线越平滑。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档