多分类下的ROC曲线和AUC
本文主要介紹一下多分類(lèi)下的ROC曲線繪制和AUC計(jì)算,并以鳶尾花數(shù)據(jù)為例,簡(jiǎn)單用python進(jìn)行一下說(shuō)明。如果對(duì)ROC和AUC二分類(lèi)下的概念不是很了解,可以先參考下這篇文章:http://blog.csdn.net/ye1215172385/article/details/79448575
由于ROC曲線是針對(duì)二分類(lèi)的情況,對(duì)于多分類(lèi)問(wèn)題,ROC曲線的獲取主要有兩種方法:
假設(shè)測(cè)試樣本個(gè)數(shù)為m,類(lèi)別個(gè)數(shù)為n(假設(shè)類(lèi)別標(biāo)簽分別為:0,2,...,n-1)。在訓(xùn)練完成后,計(jì)算出每個(gè)測(cè)試樣本的在各類(lèi)別下的概率或置信度,得到一個(gè)[m, n]形狀的矩陣P,每一行表示一個(gè)測(cè)試樣本在各類(lèi)別下概率值(按類(lèi)別標(biāo)簽排序)。相應(yīng)地,將每個(gè)測(cè)試樣本的標(biāo)簽轉(zhuǎn)換為類(lèi)似二進(jìn)制的形式,每個(gè)位置用來(lái)標(biāo)記是否屬于對(duì)應(yīng)的類(lèi)別(也按標(biāo)簽排序,這樣才和前面對(duì)應(yīng)),由此也可以獲得一個(gè)[m, n]的標(biāo)簽矩陣L。
比如n等于3,標(biāo)簽應(yīng)轉(zhuǎn)換為:
方法1:每種類(lèi)別下,都可以得到m個(gè)測(cè)試樣本為該類(lèi)別的概率(矩陣P中的列)。所以,根據(jù)概率矩陣P和標(biāo)簽矩陣L中對(duì)應(yīng)的每一列,可以計(jì)算出各個(gè)閾值下的假正例率(FPR)和真正例率(TPR),從而繪制出一條ROC曲線。這樣總共可以繪制出n條ROC曲線。最后對(duì)n條ROC曲線取平均,即可得到最終的ROC曲線。
方法2:首先,對(duì)于一個(gè)測(cè)試樣本:1)標(biāo)簽只由0和1組成,1的位置表明了它的類(lèi)別(可對(duì)應(yīng)二分類(lèi)問(wèn)題中的‘’正’’),0就表示其他類(lèi)別(‘’負(fù)‘’);2)要是分類(lèi)器對(duì)該測(cè)試樣本分類(lèi)正確,則該樣本標(biāo)簽中1對(duì)應(yīng)的位置在概率矩陣P中的值是大于0對(duì)應(yīng)的位置的概率值的?;谶@兩點(diǎn),將標(biāo)簽矩陣L和概率矩陣P分別按行展開(kāi),轉(zhuǎn)置后形成兩列,這就得到了一個(gè)二分類(lèi)的結(jié)果。所以,此方法經(jīng)過(guò)計(jì)算后可以直接得到最終的ROC曲線。
上面的兩個(gè)方法得到的ROC曲線是不同的,當(dāng)然曲線下的面積AUC也是不一樣的。 在python中,方法1和方法2分別對(duì)應(yīng)sklearn.metrics.roc_auc_score函數(shù)中參數(shù)average值為'macro'和'micro'的情況。
下面以方法1為例,直接上代碼,概率矩陣P和標(biāo)簽矩陣L分別對(duì)應(yīng)代碼中的y_score和y_one_hot:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegressionCV
from sklearn import metrics
from sklearn.preprocessing import label_binarize
if __name__ == '__main__':
np.random.seed(0)
data = pd.read_csv('iris.data', header = None) #讀取數(shù)據(jù)
iris_types = data[4].unique()
n_class = iris_types.size
x = data.iloc[:, :2] #只取前面兩個(gè)特征
y = pd.Categorical(data[4]).codes #將標(biāo)簽轉(zhuǎn)換0,1,...
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size = 0.6, random_state = 0)
y_one_hot = label_binarize(y_test, np.arange(n_class)) #裝換成類(lèi)似二進(jìn)制的編碼
alpha = np.logspace(-2, 2, 20) #設(shè)置超參數(shù)范圍
model = LogisticRegressionCV(Cs = alpha, cv = 3, penalty = 'l2') #使用L2正則化
model.fit(x_train, y_train)
print '超參數(shù):', model.C_
# 計(jì)算屬于各個(gè)類(lèi)別的概率,返回值的shape = [n_samples, n_classes]
y_score = model.predict_proba(x_test)
# 1、調(diào)用函數(shù)計(jì)算micro類(lèi)型的AUC
print '調(diào)用函數(shù)auc:', metrics.roc_auc_score(y_one_hot, y_score, average='micro')
# 2、手動(dòng)計(jì)算micro類(lèi)型的AUC
#首先將矩陣y_one_hot和y_score展開(kāi),然后計(jì)算假正例率FPR和真正例率TPR
fpr, tpr, thresholds = metrics.roc_curve(y_one_hot.ravel(),y_score.ravel())
auc = metrics.auc(fpr, tpr)
print '手動(dòng)計(jì)算auc:', auc
#繪圖
mpl.rcParams['font.sans-serif'] = u'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
#FPR就是橫坐標(biāo),TPR就是縱坐標(biāo)
plt.plot(fpr, tpr, c = 'r', lw = 2, alpha = 0.7, label = u'AUC=%.3f' % auc)
plt.plot((0, 1), (0, 1), c = '#808080', lw = 1, ls = '--', alpha = 0.7)
plt.xlim((-0.01, 1.02))
plt.ylim((-0.01, 1.02))
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.xlabel('False Positive Rate', fontsize=13)
plt.ylabel('True Positive Rate', fontsize=13)
plt.grid(b=True, ls=':')
plt.legend(loc='lower right', fancybox=True, framealpha=0.8, fontsize=12)
plt.title(u'鳶尾花數(shù)據(jù)Logistic分類(lèi)后的ROC和AUC', fontsize=17)
plt.show()
我的實(shí)戰(zhàn)
Bnew_one1=[]
for lis in Bnew4:
bol=np.zeros(51)
bol=bol.tolist()
bol[lis[0]]=1
Bnew_one1.append(bol)
Blast_one=[]
for lis in Blast:
bol=np.zeros(51)
bol=bol.tolist()
bol[lis[0]]=1
Blast_one.append(bol)
Bnew_one1=np.array(Bnew_one1)
Blast_one=np.array(Blast_one)
Bnew_one=np.array(Bnew_one)
print('調(diào)用函數(shù)auc:', metrics.roc_auc_score(Blast_one, Bnew_one1, average='micro'))
fpr, tpr, thresholds = metrics.roc_curve(Blast_one.ravel(),Bnew_one1.ravel())
auc = metrics.auc(fpr, tpr)
print('手動(dòng)計(jì)算auc:', auc)
#繪圖
mpl.rcParams['font.sans-serif'] = u'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
#FPR就是橫坐標(biāo),TPR就是縱坐標(biāo)
plt.plot(fpr, tpr, c = 'r', lw = 2, alpha = 0.7, label = u'AUC=%.3f' % auc)
plt.plot((0, 1), (0, 1), c = '#808080', lw = 1, ls = '--', alpha = 0.7)
plt.xlim((-0.01, 1.02))
plt.ylim((-0.01, 1.02))
plt.xticks(np.arange(0, 1.1, 0.1))
plt.yticks(np.arange(0, 1.1, 0.1))
plt.xlabel('False Positive Rate', fontsize=13)
plt.ylabel('True Positive Rate', fontsize=13)
plt.grid(b=True, ls=':')
plt.legend(loc='lower right', fancybox=True, framealpha=0.8, fontsize=12)
plt.title(u'大類(lèi)問(wèn)題一分類(lèi)后的ROC和AUC', fontsize=17)
plt.show()
總結(jié)
以上是生活随笔為你收集整理的多分类下的ROC曲线和AUC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: flink读mysql速度怎么样_[DB
- 下一篇: layui框架的验证