Python實(shí)現(xiàn)兩種多分類混淆矩陣
1、什么是混淆矩陣
深度學(xué)習(xí)中,混淆矩陣是ROC曲線繪制的基礎(chǔ),同時它也是衡量分類型模型準(zhǔn)確度中最基本,最直觀,計算最簡單的方法。它可以直觀地了解分類模型在每一類樣本里面表現(xiàn),常作為模型評估的一部分。它可以非常容易的表明多個類別是否有混淆(也就是一個class被預(yù)測成另一個class)。
首先要明確幾個概念:
T或者F:該樣本 是否被正確分類。
P或者N:該樣本 原本是正樣本還是負(fù)樣本。
- 真正例(True Positive,TP):預(yù)測正確;模型預(yù)測也是正例,樣本的真實(shí)類別是正例,
- 真負(fù)例(True Negative,TN):預(yù)測正確:模型預(yù)測為負(fù)例,樣本的真實(shí)類別是負(fù)例,
- 偽正例(False Positive,F(xiàn)P):預(yù)測錯誤:模型預(yù)測為正例,樣本的真實(shí)類別是負(fù)例,
- 偽負(fù)例(False Negative,F(xiàn)N):預(yù)測錯誤;模型預(yù)測為負(fù)例,樣本的真實(shí)類別是正例,
將這四個指標(biāo)一起呈現(xiàn)在表格中,就能得到如下這樣一個矩陣,我們稱它為混淆矩陣(Confusion Matrix),這里從其他文章偷了張圖:
在混線矩陣中,以對角線為分界線。以上圖為例子:對角線的位置表示預(yù)測正確,對角線以外的位置表示把樣本錯誤的預(yù)測為其他樣本。
2、分類模型評價指標(biāo)
從混淆矩陣可以直觀地看出各個參數(shù)的數(shù)值大小。查準(zhǔn)率是在模型預(yù)測為正的所有樣本中,模型預(yù)測對的比重,即:“分類器認(rèn)為是正類并且確實(shí)是正類的部分占所有分類器認(rèn)為是正類的比例”。計算公式如下式所示:
F1-Score指標(biāo)綜合了Precision與Recall的產(chǎn)出的結(jié)果。F1-Score的取值范圍從0到1的,1代表模型的輸出最好,0代表模型的輸出結(jié)果最差,計算公式如下式所示:
除了F1分?jǐn)?shù)之外,F(xiàn)2分?jǐn)?shù)和F0.5分?jǐn)?shù)在統(tǒng)計學(xué)中也得到大量的應(yīng)用。其中,F(xiàn)2分?jǐn)?shù)中,召回率的權(quán)重高于精準(zhǔn)率,而F0.5分?jǐn)?shù)中,精準(zhǔn)率的權(quán)重高于召回率。
3、兩種多分類混淆矩陣
多分類混淆矩陣根據(jù)不同需求可以繪制不同的矩陣:
1、直接打印出每一個類別的分類準(zhǔn)確率。
2、打印具體的分類結(jié)果的數(shù)值,方便數(shù)據(jù)的分析和各類指標(biāo)的計算
在介紹具體代碼之前,首先來介紹confusion_matrix()函數(shù),它是Python中的sklearn庫提供的輸出矩陣數(shù)據(jù)的方法:
def confusion_matrix(y_true, y_pred, labels=None, sample_weight=None):
參數(shù)意義:
- y_true: 是樣本真實(shí)分類結(jié)果,y_pred: 是樣本預(yù)測分類結(jié)果
- y_pred:預(yù)測結(jié)果
- labels:是所給出的類別,通過這個可對類別進(jìn)行選擇
- sample_weight : 樣本權(quán)重
3.1直接打印出每一個類別的分類準(zhǔn)確率。
# 顯示混淆矩陣 def plot_confuse(model, x_val, y_val): # 獲得預(yù)測結(jié)果 predictions = predict(model,x_val) #獲得真實(shí)標(biāo)簽 truelabel = y_val.argmax(axis=-1) # 將one-hot轉(zhuǎn)化為label cm = confusion_matrix(y_true=truelabel, y_pred=predictions) plt.figure() # 指定分類類別 classes = range(np.max(truelabel)+1) title='Confusion matrix' #混淆矩陣顏色風(fēng)格 cmap=plt.cm.jet cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis] plt.imshow(cm, interpolation='nearest', cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) thresh = cm.max() / 2. # 按照行和列填寫百分比數(shù)據(jù) for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, '{:.2f}'.format(cm[i, j]), horizontalalignment="center", color="white" if cm[i, j] > thresh else "black") plt.tight_layout() plt.ylabel('True label') plt.xlabel('Predicted label') plt.show()
3.2打印具體的分類結(jié)果的數(shù)值
# 顯示混淆矩陣 def plot_confuse_data(model, x_val, y_val): classes = range(0,6) predictions = predict(model,x_val) truelabel = y_val.argmax(axis=-1) # 將one-hot轉(zhuǎn)化為label confusion = confusion_matrix(y_true=truelabel, y_pred=predictions) #顏色風(fēng)格為綠。。。。 plt.imshow(confusion, cmap=plt.cm.Greens) # ticks 坐標(biāo)軸的坐標(biāo)點(diǎn) # label 坐標(biāo)軸標(biāo)簽說明 indices = range(len(confusion)) # 第一個是迭代對象,表示坐標(biāo)的顯示順序,第二個參數(shù)是坐標(biāo)軸顯示列表 plt.xticks(indices, classes) plt.yticks(indices, classes) plt.colorbar() plt.xlabel('Predicted label') plt.ylabel('True label') plt.title('Confusion matrix') # plt.rcParams兩行是用于解決標(biāo)簽不能顯示漢字的問題 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 顯示數(shù)據(jù) for first_index in range(len(confusion)): #第幾行 for second_index in range(len(confusion[first_index])): #第幾列 plt.text(first_index, second_index, confusion[first_index][second_index]) # 顯示 plt.show()
4、總結(jié)
1、混淆矩陣是深度學(xué)習(xí)中分類模型最常用的評估指標(biāo)。網(wǎng)上大部分都是顯示各類的分類正確率,不夠靈活。顯示具體數(shù)值靈活性大,可以計算自己想要的指標(biāo)。
2、多分類的混淆矩陣中 查準(zhǔn)率為主對角線上的值除以該值所在列的和;召回率等于主對角線上的值除以該值所在行的和。
以上就是Python實(shí)現(xiàn)兩種多分類混淆矩陣的詳細(xì)內(nèi)容,更多關(guān)于Python多分類混淆矩陣的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python3.5常見內(nèi)置方法參數(shù)用法實(shí)例詳解
這篇文章主要介紹了Python3.5常見內(nèi)置方法參數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了Python常見的內(nèi)置方法及參數(shù)使用技巧,需要的朋友可以參考下2019-04-04TensorFlow2中提供的幾種處理特征列的方法小結(jié)
本文主要介紹了TensorFlow2中提供的幾種處理特征列的方法小結(jié),主要介紹了6種方式,具有一定的參考價值,感興趣的可以了解一下2023-09-09如何徹底解決Python中matplotlib不顯示中文的問題詳解(顯示方框)
Matplotlib繪制圖像顯示中文的時候,中文會變成小方格子,下面這篇文章主要給大家介紹了關(guān)于如何徹底解決Python中matplotlib不顯示中文問題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04詳解Python3網(wǎng)絡(luò)爬蟲(二):利用urllib.urlopen向有道翻譯發(fā)送數(shù)據(jù)獲得翻譯結(jié)果
這篇文章主要介紹了Python3網(wǎng)絡(luò)爬蟲(二):利用urllib.urlopen向有道翻譯發(fā)送數(shù)據(jù)獲得翻譯結(jié)果,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)多輸入多輸出通道
這篇文章主要為大家介紹了Python深度學(xué)習(xí)中pytorch神經(jīng)網(wǎng)絡(luò)多輸入多輸出通道的詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10