混淆矩陣代碼詳解

一、混淆矩陣的定義

混淆矩陣也稱誤差矩陣或混淆矩陣,是用於描述分類模型預測結果的分佈情況的一個表格。其行表示真實值,列表示預測值,表格中的每一個元素表示真實值等於行號,預測值等於列號的樣本數目。例如:

          Predicted
          True  False
Actual True  TP    FN
       False FP    TN

其中TP是真正例,TN是真負例,FP是假正例,FN是假負例。

二、混淆矩陣的計算方法

對於二分類問題,我們可以通過分類器的預測結果和樣本的真實標籤計算混淆矩陣。具體的計算方法如下:

def confusion_matrix(y_true, y_pred):
    tp = np.sum((y_true == 1) & (y_pred == 1))
    tn = np.sum((y_true == 0) & (y_pred == 0))
    fp = np.sum((y_true == 0) & (y_pred == 1))
    fn = np.sum((y_true == 1) & (y_pred == 0))
    return np.array([[tn, fp], [fn, tp]])

其中y_true表示樣本的真實標籤,y_pred表示分類器的預測結果。

三、混淆矩陣的應用

混淆矩陣是衡量分類器性能的重要指標之一,可以用於計算分類器的準確率、召回率、精確率和F1-score等指標。

1. 準確率

準確率指分類器正確分類的樣本數佔總樣本數的比例,可以用混淆矩陣計算:

def accuracy(y_true, y_pred):
    cm = confusion_matrix(y_true, y_pred)
    return (cm[0, 0] + cm[1, 1]) / np.sum(cm)

2. 召回率

召回率指分類器正確預測為正例的正例樣本數占所有真實正例樣本數的比例,可以用混淆矩陣計算:

def recall(y_true, y_pred):
    cm = confusion_matrix(y_true, y_pred)
    return cm[1, 1] / (cm[1, 0] + cm[1, 1])

3. 精確率

精確率指分類器預測為正例的樣本中實際為正例的比例,可以用混淆矩陣計算:

def precision(y_true, y_pred):
    cm = confusion_matrix(y_true, y_pred)
    return cm[1, 1] / (cm[0, 1] + cm[1, 1])

4. F1-score

F1-score是精確率和召回率的調和平均數:

def f1_score(y_true, y_pred):
    p = precision(y_true, y_pred)
    r = recall(y_true, y_pred)
    return 2 * p * r / (p + r)

四、混淆矩陣的改進

混淆矩陣在某些情況下可能會存在不合理的問題。例如,在樣本的正負樣本不平衡的情況下,準確率可能會高但分類器的性能不佳。為了解決這個問題,我們可以使用加權混淆矩陣。具體的計算方法如下:

def weighted_confusion_matrix(y_true, y_pred, class_weights):
    cm = confusion_matrix(y_true, y_pred)
    w_cm = np.zeros_like(cm, dtype=float)
    w_cm[0, 0] = cm[0, 0] * class_weights[0, 0]
    w_cm[0, 1] = cm[0, 1] * class_weights[0, 1]
    w_cm[1, 0] = cm[1, 0] * class_weights[1, 0]
    w_cm[1, 1] = cm[1, 1] * class_weights[1, 1]
    return w_cm

def weighted_f1_score(y_true, y_pred, class_weights):
    w_cm = weighted_confusion_matrix(y_true, y_pred, class_weights)
    p = weighted_precision(y_true, y_pred, class_weights)
    r = weighted_recall(y_true, y_pred, class_weights)
    return 2 * p * r / (p + r)

def weighted_precision(y_true, y_pred, class_weights):
    w_cm = weighted_confusion_matrix(y_true, y_pred, class_weights)
    return w_cm[1, 1] / (w_cm[0, 1] + w_cm[1, 1])

def weighted_recall(y_true, y_pred, class_weights):
    w_cm = weighted_confusion_matrix(y_true, y_pred, class_weights)
    return w_cm[1, 1] / (w_cm[1, 0] + w_cm[1, 1])

其中class_weights表示每個類別的權重,可以根據實際應用給定不同的值。

五、總結

混淆矩陣是分類器性能評估的重要工具之一,可以計算多個指標來評價模型性能。在實際應用中,可以針對樣本不平衡等情況使用加權混淆矩陣進行改進,以更好地評估模型性能。

原創文章,作者:KTPLF,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/371607.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KTPLF的頭像KTPLF
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字符串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字符串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字符串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變量和數…

    編程 2025-04-29
  • Python將矩陣存為CSV文件

    CSV文件是一種通用的文件格式,在統計學和計算機科學中非常常見,一些數據分析工具如Microsoft Excel,Google Sheets等都支持讀取CSV文件。Python內置…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在着手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • 怎麼寫不影響Python運行的長段代碼

    在Python編程的過程中,我們不可避免地需要編寫一些長段代碼,包括函數、類、複雜的控制語句等等。在編寫這些代碼時,我們需要考慮代碼可讀性、易用性以及對Python運行性能的影響。…

    編程 2025-04-29
  • 北化教務管理系統介紹及開發代碼示例

    本文將從多個方面對北化教務管理系統進行介紹及開發代碼示例,幫助開發者更好地理解和應用該系統。 一、項目介紹 北化教務管理系統是一款針對高校學生和教職工的綜合信息管理系統。系統實現的…

    編程 2025-04-29

發表回復

登錄後才能評論