程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python繪制ROC曲線,計算AUC

編輯:Python

一:前言

ROC曲線:
  • ROC曲線(receiver operating characteristic curve),
  • 是反映靈敏性和特效性連續變量的綜合指標;
  • 是用構圖法揭示敏感性和特異性的相互關系;
  • 它通過將連續變量設定出多個不同的臨界值,從而計算出一系列敏感性和特異性;
  • ROC曲線是根據一系列不同的二分類方式(分界值或決定阈),以真正例率(True Positive Rate,TPR 也就是靈敏度)為縱坐標,假正例率(False Positive Rate,FPR,1-特效性)為橫坐標繪制的曲線。
AUC:
  • AUC(Area Under Curve)被定義為ROC曲線下與坐標軸圍成的面積;
  • 面積的數值不會大於1;
  • 又由於ROC曲線一般都處於y=x這條直線的上方,所以AUC的取值范圍在0.5和1之間;
  • AUC越接近1.0,檢測方法真實性越高;等於0.5時,則真實性最低,無應用價值。
數據集:car.data UCI Car Evaluation Data Set

6個屬性及標簽介紹如圖(多分類問題):

二:繪制ROC曲線:需要fpr(x軸)、tpr(y軸)

  • fpr:假正例率
  • tpr:真正例率

知乎截圖(可參考學習~):ROC曲線簡介

1. 如果標簽是二值,跳過這一步;如果不是,需要二值化處理(one-hot編碼)

roc_auc_score是根據真實值(必須是二值的)。
所以需要對標簽值作如下二值化處理

n_class = len(data['accept'].unique()) #accept是標簽列
y_test_one_hot = label_binarize(y_test, classes=np.arange(n_class)) # 將標簽值映射成one-hot編碼
#print(y_test_one_hot.shape) # 結果是(519, 4)
y_test_one_hot_hat = clf.predict_proba(x_test) # 測試集預測分類概率
#此處使用的是決策樹預測算法,此處僅參考思路即可

2. 計算fpr,tpr ,auc

根據預測值計算出AUC值(預測值類型:可以是0/1,也可以是proba值)

  • 得到proba預測值 (有預測值跳過這一步)
y_test_one_hot_hat = clf.predict_proba(x_test) #測試集預測分類的概率 
# predict_proba返回的是一個 n 行 k 列的數組, 第 i 行 第 j 列上的數值是模型預測 第 i 個預測樣本為某個標簽的概率,並且每一行的概率和為1。
#參考:https://blog.csdn.net/u011630575/article/details/79429757
  • 計算fpr、tpr
from sklearn import metrics
fpr, tpr, _ = metrics.roc_curve(y_test_one_hot.ravel(), y_test_one_hot_hat.ravel())
#y_test_one_hot:one-hot 測試集(編碼後)的真實值y
#y_test_one_hot_hat: one-hot 測試集(編碼後)的預測值y
  • 計算不同average下的AUC值
from sklearn import metrics
print ('Micro AUC:\t', metrics.auc(fpr, tpr)) # AUC ROC意思是ROC曲線下方的面積(Area under the Curve of ROC)
print( 'Micro AUC(System):\t', metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='micro'))
auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='macro')
print ('Macro AUC:\t', auc)

3. 繪制曲線圖代碼(有了fpr、tpr、auc直接copy就行~)

import matplotlib.pyplot as plt
''' 計算獲得fpr、tpr、auc,上述步驟中有 假裝已經得到~ '''
plt.figure(figsize=(8, 7), dpi=80, facecolor='w') # dpi:每英寸長度的像素點數;facecolor 背景顏色
plt.xlim((-0.01, 1.02)) # x,y 軸刻度的范圍
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.plot(fpr, tpr, 'r-', lw=2, label='AUC=%.4f' % auc) # 繪制AUC 曲線
plt.legend(loc='lower right') # 設置顯示標簽的位置
plt.xlabel('False Positive Rate', fontsize=14) #繪制x,y 坐標軸對應的標簽
plt.ylabel('True Positive Rate', fontsize=14)
plt.grid(b=True, ls=':') # 繪制網格作為底板;b是否顯示網格線;ls表示line style
plt.title(u'DecisionTree ROC curve And AUC', fontsize=18) # 打印標題
plt.show()

4. 結果

三:全部Demo(Demo來自實驗作業呀~)

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize # 將label二值化
import matplotlib.pyplot as plt
data = pd.read_csv('car.data', header=None) # header=None沒有標題
print(data.shape)
n_columns = len(data.columns) # 獲取數據集的列數
columns = ['buy', 'maintain', 'doors', 'persons', 'boot', 'safety', 'accept']
new_columns = dict(zip(np.arange(n_columns), columns)) # 將列名與整數影射
data.rename(columns=new_columns, inplace=True) # 替換數據集中的列名columns中的值
for col in columns:
# Categorical方法,獲取list的類別,codes方法賦給每個類別對應的類別的編碼值
data[col] = pd.Categorical(data[col]).codes
x = data.loc[:, columns[:-1]] # 得到樣本特征y = data[ 'accept']#取到標簽值
y = data['accept']
x, x_test, y, y_test = train_test_split(x, y, test_size=0.3)
clf = DecisionTreeClassifier(criterion='gini', max_depth=12, min_samples_split=5, max_features=5)
clf.fit(x, y)
y_hat = clf.predict(x) # 在訓練集上進行預測
print('訓練集精確度:', metrics.accuracy_score(y, y_hat)) # 評估成績
y_test_hat = clf.predict(x_test) # 測試集預測
print('測試集精確度:', metrics.accuracy_score(y_test, y_test_hat)) # 評估繪制曲線
n_class = len(data['accept'].unique())
y_test_one_hot = label_binarize(y_test, classes=np.arange(n_class)) # 將標簽值映射成one-hot編碼
y_test_one_hot_hat = clf.predict_proba(x_test) # 測試集預測分類概率
# 計算fpr ,tpr及面積
fpr, tpr, _ = metrics.roc_curve(y_test_one_hot.ravel(), y_test_one_hot_hat.ravel())
print('Micro AUC:\t', metrics.auc(fpr, tpr)) # AUC ROC意思是ROC曲線下方的面積(Area under the Curve of ROC)
print('Micro AUC(System):\t', metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='micro'))
auc = metrics.roc_auc_score(y_test_one_hot, y_test_one_hot_hat, average='macro')
print('Macro AUC:\t', auc)
plt.figure(figsize=(8, 7), dpi=80, facecolor='w')
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.plot(fpr, tpr, 'r-', lw=2, label='AUC=%.4f' % auc)
plt.legend(loc='lower right')
plt.xlabel('False Positive Rate', fontsize=14)
plt.ylabel('True Positive Rate', fontsize=14)
plt.grid(b=True, ls=':')
plt.title(u'DecisionTree ROC curve And AUC', fontsize=18)
plt.show()

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved