机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)_百 ...

机器学习之⽀持向量机SVM之python实现ROC曲线绘制(⼆
分类和多分类)
⼀、ROC曲线
定义可见:
作⽤:通过ROC曲线可以获取相关性能指标,如EER、AUC等,这些性能指标可以⽤来评价⼀个SVM训练出来模型的优劣
thinkcentre m7100z⼆、TP、FP、TN、FN
三、 python绘制ROC曲线(⼆分类)
1、思路
python主要的思路是通过roc_curve函数和测试样本的实际标签集test_label、由训练模型预测得到的标签集test_predict_label获得。通过⽐对实际标签和预测标签来计算TP、FP、TN、FN,通过roc_curve函数可以实现,返回的是TP、FP、以及阈值threshold。计算ROC 曲线只需要TPFP即可。
2、关键代码
1. ................
2.
3. #train_data⽤于训练的样本集, test_data⽤于测试的样本集, train_label训练样本对应的标签集, test_label测试样本对应的标签集
4.
5. ###通过decision_function()计算得到的test_predict_label的值,⽤在roc_curve()函数中
6. test_predict_label = svm.fit(train_data, train_label).decision_function(test_data)
7. #⾸先通过fit来对训练样本和训练样本标签进⾏训练得到模型,然后通过decision_function来获得模型对于测试样本集预测的标签集
8.
9. # Compute ROC curve and ROC area for each class#计算tp,fp
0. #通过测试样本输⼊的标签集和模型预测的标签集进⾏⽐对,得到fp,tp,不同的fp,tp是算法通过⼀定的规则改变阈值获得的
1. fpr,tpr,threshold = roc_curve(test_label, test_predict_label) ###计算真正率和假正率
2. roc_auc = auc(fpr,tpr) ###计算auc的值,auc就是曲线包围的⾯积,越⼤越好
13.
4. ..................
1. #test_predict_label
2. [ 0.17284263 0.65445393 -0.54087101 0.3555818 0.00579262 -0.20174248
3. 0.0565328 0.00571205 -0.1517872 0.25656427 0.39764688 0.04549989
4. 0.33455816 -0.12499602 0.23724787 -0.36250412 -0.0874348 -0.11575856
5. -0.25270656 -0.23457408 -0.18239472 -0.10728706 -0.32201471 0.71954289
6. -0.29292995 -0.22073314 -0.32473373 -0.19383585 -0.24296148 0.37524795]
在⼆分类问题中,阈值的改变其实就是相当于从⼀个边界移动到另⼀个边界,阈值的改变也就使得tp和fp的改变
1. #阈值threshold
2. [ 1.71954289 0.71954289 0.25656427 0.0565328 0.00571205 -0.0874348
3. -0.10728706 -0.12499602 -0.1517872 -0.18239472 -0.20174248 -0.23457408
4. -0.24296148 -0.54087101]
1. #tp
2. [0. 0. 0. 0.2 0.2 0.26666667
3. 0.26666667 0.4 0.4 0.46666667 0.46666667 0.6
北京市卫生局招待所4. 0.6 1. ]
1. #fp
2. [0. 0.06666667 0.46666667 0.46666667 0.66666667 0.66666667
3. 0.73333333 0.73333333 0.8 0.8 0.93333333 0.93333333
4. 1. 1. ]
3、完整代码
1. # -*- coding: utf-8 -*-
2.
3. import numpy as np
4. import matplotlib.pyplot as plt
阿比丹 艾山
5. from sklearn import svm, datasets
6. ics import roc_curve, auc ###计算roc和auc二硫化碳毒性
7. from sklearn import model_selection
8.
9. # Import some data to play with
0. iris = datasets.load_iris()
1. X = iris.data#得到样本集
2. y = iris.target#得到标签集
13.
4. ##变为2分类
数据挖掘论文5. X, y = X[y != 2], y[y != 2]#通过取y不等于2来取两种类别
16.
7. # Add noisy features to make the problem harder添加扰动
高僧H粗热8. random_state = np.random.RandomState(0)
9. n_samples, n_features = X.shape
0. X = np.c_[X, random_state.randn(n_samples, 200 * n_features)]
21.
2. # shuffle and split training and test sets划分样本集
3. train_data, test_data, train_label, test_label = ain_test_split(X, y, test_size=.3,random_state=0)
4. #train_data⽤于训练的样本集, test_data⽤于测试的样本集, train_label训练样本对应的标签集, test_label测试样本对应的标签集2
5.
6. # Learn to predict each class against the other分类器设置
7. svm = svm.SVC(kernel='linear', probability=True,random_state=random_state)#使⽤核函数为线性核,参数默认,创建分类器28.
9. ###通过decision_function()计算得到的test_predict_label的值,⽤在roc_curve()函数中
0. test_predict_label = svm.fit(train_data, train_label).decision_function(test_data)
1. #⾸先通过fit来对训练样本和训练样本标签进⾏训练得到模型,然后通过decision_function来获得模型对于测试样本集预测的标签集
2. print(test_predict_label)
33.
4. # Compute ROC curve and ROC area for each class#计算tp,fp
5. #通过测试样本输⼊的标签集和模型预测的标签集进⾏⽐对,得到fp,tp,不同的fp,tp是算法通过⼀
定的规则改变阈值获得的
6. fpr,tpr,threshold = roc_curve(test_label, test_predict_label) ###计算真正率和假正率
7. print(fpr)
8. print(tpr)
9. print(threshold)
0. roc_auc = auc(fpr,tpr) ###计算auc的值,auc就是曲线包围的⾯积,越⼤越好
41.
2. plt.figure()
3. lw = 2
4. plt.figure(figsize=(10,10))
5. plt.plot(fpr, tpr, color='darkorange',
6. lw=lw, label='ROC curve (area = %0.2f)' % roc_auc) ###假正率为横坐标,真正率为纵坐标做曲线
7. plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
8. plt.xlim([0.0, 1.0])
9. plt.ylim([0.0, 1.05])
0. plt.xlabel('False Positive Rate')
1. plt.ylabel('True Positive Rate')
2. plt.title('Receiver operating characteristic example')
3. plt.legend(loc="lower right")
4. plt.show()
虚线表⽰auc为0.5,正确率与错误率⼀样的情况
四、 python绘制ROC曲线(多分类)
对于多分类问题,ROC曲线的获取主要有两种⽅法:
假设测试样本个数为m,类别个数为n。在训练完成后,计算出每个测试样本的在各类别下的概率或置信度,得到⼀个[m, n]形状的矩阵P,每⼀⾏表⽰⼀个测试样本在各类别下概率值(按类别标签排序)。相应地,将每个测试样本的标签转换为类似⼆进制的形式,每个位置⽤来标记是否属于对应的类别(也按标签排序,这样才和前⾯对应),由此也可以获得⼀个[m, n]的标签矩阵L。
①⽅法⼀:每种类别下,都可以得到m个测试样本为该类别的概率(矩阵P中的列)。所以,根据概率矩阵P和标签矩阵L中对应的每⼀列,可以计算出各个阈值下的假正例率(FPR)和真正例率(TPR),从⽽绘制出⼀条ROC曲线。这样总共可以绘制出n条ROC曲线。最后对n 条ROC曲线取平均,即可得到最终的ROC曲线。
②⽅法⼆:
⾸先,对于⼀个测试样本:1)标签只由0和1组成,1的位置表明了它的类别(可对应⼆分类问题中的‘’正’’),0就表⽰其他类别(‘’负‘’);2)要是分类器对该测试样本分类正确,则该样本标签中1对应的位置在概率矩阵P中的值是⼤于0对应的位置的概率值的。基于这两点,将标签矩阵L和概率矩阵P分
别按⾏展开,转置后形成两列,这就得到了⼀个⼆分类的结果。所以,此⽅法经过计算后可以直接得到最终的ROC曲线。
上⾯的两个⽅法得到的ROC曲线是不同的,当然曲线下的⾯积AUC也是不⼀样的。 在python中,⽅法1和⽅法2分别对应
<_auc_score函数中参数average值为’macro’和’micro’的情况。下⾯参考sklearn官⽹提供的例⼦,对两种⽅法进⾏实现。

本文发布于:2024-09-22 21:33:22,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/570056.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:样本   曲线   测试   标签   标签集   对应
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议