日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

多分类下的ROC曲线和AUC

發(fā)布時(shí)間:2023/12/15 综合教程 22 生活家
生活随笔 收集整理的這篇文章主要介紹了 多分类下的ROC曲线和AUC 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文主要介紹一下多分類(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。