遙感機器學習入門實戰教程|Sklearn案例⑧:評估指標(metrics)全解析

很多同學問:“模型好不好,怎么量化?”
本篇系統梳理 sklearn.metrics 中常用且“夠用”的多分類指標,并給出一段可直接運行的示例代碼,覆蓋:準確率、宏/微/加權 F1、Kappa、MCC、混淆矩陣(計數/歸一化)、Top-K 準確率、ROC-AUC(OvR/OvO)、PR-AUC、對數損失、(多類)Brier 分數、以及 ROC/PR 曲線繪制。

🧭 指標速覽與使用場景

  • 整體驗證

    • accuracy_score(OA,總體準確率)
    • balanced_accuracy_score(類別不均衡時更合理)
  • 逐類與加權

    • precision_recall_fscore_support / classification_report
    • 平均方式:average="macro" | "micro" | "weighted"
  • 一致性/穩健性

    • cohen_kappa_score(Kappa)
    • matthews_corrcoef(MCC,抗不均衡)
  • 混淆矩陣

    • confusion_matrix(計數 & 歸一化)
  • 概率質量/排序質量

    • roc_auc_score(多類:multi_class="ovr"|"ovo"average="macro"|"weighted"
    • average_precision_score(PR-AUC)
    • top_k_accuracy_score(Top-K)
    • log_loss(對數損失,校準敏感)
    • 多類 Brier(自定義:one-hot 與 predict_proba 的 MSE 均值)
  • 曲線

    • ROC 曲線(micro/macro)
    • Precision-Recall 曲線(micro)

經驗:類不均衡→看 balanced_accuracy / macro-F1 / Kappa / MCC
要概率好壞→看 log_loss / ROC-AUC / PR-AUC
Top-K 檢索/多候選→看 top_k_accuracy_score

💻 一鍵可跑代碼(修改 DATA_DIR 后直接運行)

# -*- coding: utf-8 -*-
"""
Sklearn案例⑧:metrics 全解析(多分類 / 概率與曲線)
數據:KSC(將 DATA_DIR 改為你的數據路徑)
"""import os, numpy as np, scipy.io as sio, matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import (accuracy_score, balanced_accuracy_score,precision_recall_fscore_support, classification_report, confusion_matrix,cohen_kappa_score, matthews_corrcoef, top_k_accuracy_score, roc_auc_score,average_precision_score, log_loss)
from sklearn.preprocessing import label_binarize# ============ 參數 ============
DATA_DIR = "your_path"     # ←← 修改為包含 KSC.mat / KSC_gt.mat 的目錄
PCA_DIM, TRAIN_RATIO, SEED = 30, 0.3, 42# ============ 1. 載入與預處理 ============
X = sio.loadmat(os.path.join(DATA_DIR, "KSC.mat"))["KSC"].astype(np.float32)  # (H,W,B)
Y = sio.loadmat(os.path.join(DATA_DIR, "KSC_gt.mat"))["KSC_gt"].astype(int)   # (H,W)
coords = np.argwhere(Y != 0)
Xpix   = X[coords[:,0], coords[:,1]]       # (N,B)
y      = Y[coords[:,0], coords[:,1]] - 1   # 0..C-1
num_classes = int(y.max() + 1)Xtr, Xte, ytr, yte = train_test_split(Xpix, y, train_size=TRAIN_RATIO,stratify=y, random_state=SEED)
scaler = StandardScaler().fit(Xtr)
pca    = PCA(n_components=PCA_DIM, random_state=SEED).fit(scaler.transform(Xtr))
Xtr    = pca.transform(scaler.transform(Xtr))
Xte    = pca.transform(scaler.transform(Xte))# ============ 2. 訓練一個可輸出概率的模型 ============
# 用 RF 示范(也可以換 SVC(probability=True)、LogReg 等)
clf = RandomForestClassifier(n_estimators=300, random_state=SEED, n_jobs=-1)
clf.fit(Xtr, ytr)
y_pred = clf.predict(Xte)
y_proba = clf.predict_proba(Xte)           # (N_test, C)# ============ 3. 基礎/穩健指標 ============
oa  = accuracy_score(yte, y_pred)
boa = balanced_accuracy_score(yte, y_pred)
kappa = cohen_kappa_score(yte, y_pred)
mcc   = matthews_corrcoef(yte, y_pred)prec_m, rec_m, f1_m, _   = precision_recall_fscore_support(yte, y_pred, average="macro", zero_division=0)
prec_w, rec_w, f1_w, _   = precision_recall_fscore_support(yte, y_pred, average="weighted", zero_division=0)print("=== 基礎評估 ===")
print(f"OA                : {oa*100:.2f}%")
print(f"Balanced Acc      : {boa*100:.2f}%")
print(f"Macro-F1          : {f1_m*100:.2f}% (P={prec_m*100:.1f} R={rec_m*100:.1f})")
print(f"Weighted-F1       : {f1_w*100:.2f}% (P={prec_w*100:.1f} R={rec_w*100:.1f})")
print(f"Cohen's Kappa     : {kappa:.4f}")
print(f"Matthews Corrcoef : {mcc:.4f}")
print("\n=== 分類報告(逐類) ===")
print(classification_report(yte, y_pred, digits=4, zero_division=0))# ============ 4. 混淆矩陣(計數/歸一化) ============
cm = confusion_matrix(yte, y_pred, labels=np.arange(num_classes))
cm_norm = cm / np.maximum(cm.sum(axis=1, keepdims=True), 1)plt.figure(figsize=(10,4))
plt.subplot(1,2,1)
plt.imshow(cm, interpolation='nearest')
plt.title("Confusion Matrix (Counts)")
plt.xlabel("Pred"); plt.ylabel("True")
plt.colorbar(fraction=0.046, pad=0.04)plt.subplot(1,2,2)
plt.imshow(cm_norm, vmin=0, vmax=1, interpolation='nearest')
plt.title("Confusion Matrix (Normalized)")
plt.xlabel("Pred"); plt.ylabel("True")
plt.colorbar(fraction=0.046, pad=0.04)
plt.tight_layout(); plt.show()# ============ 5. 概率/排序質量 ============
# 5.1 多類 ROC-AUC:OvR & OvO(macro/weighted)
y_bin = label_binarize(yte, classes=np.arange(num_classes))  # (N,C)
auc_ovr_macro = roc_auc_score(yte, y_proba, multi_class="ovr", average="macro")
auc_ovr_weight= roc_auc_score(yte, y_proba, multi_class="ovr", average="weighted")
auc_ovo_macro = roc_auc_score(yte, y_proba, multi_class="ovo", average="macro")
print("\n=== 概率/排序質量 ===")
print(f"ROC-AUC OvR (macro)   : {auc_ovr_macro:.4f}")
print(f"ROC-AUC OvR (weighted): {auc_ovr_weight:.4f}")
print(f"ROC-AUC OvO (macro)   : {auc_ovo_macro:.4f}")# 5.2 PR-AUC(macro)
ap_macro = average_precision_score(y_bin, y_proba, average="macro")
print(f"PR-AUC (macro)        : {ap_macro:.4f}")# 5.3 對數損失(log-loss)
ll = log_loss(yte, y_proba, labels=np.arange(num_classes))
print(f"Log Loss              : {ll:.4f}")# 5.4 多類 Brier(自定義:one-hot 與 predict_proba 的 MSE 均值)
brier_multi = np.mean((y_bin - y_proba)**2)
print(f"Brier Score (multi)   : {brier_multi:.4f}")# 5.5 Top-K 準確率(以 K=3 為例)
top3 = top_k_accuracy_score(yte, y_proba, k=3, labels=np.arange(num_classes))
print(f"Top-3 Accuracy        : {top3*100:.2f}%")# ============ 6. 曲線:micro-ROC 與 micro-PR ============
# micro:將多類視為一個“整體二分類”匯總,便于一張圖比較
from sklearn.metrics import RocCurveDisplay, PrecisionRecallDisplay
# ROC (micro)
fpr = dict(); tpr = dict()
from sklearn.metrics import roc_curve, precision_recall_curve, auc
y_bin_pred = y_proba
fpr_micro, tpr_micro, _ = roc_curve(y_bin.ravel(), y_bin_pred.ravel())
roc_auc_micro = auc(fpr_micro, tpr_micro)# PR (micro)
prec_micro, rec_micro, _ = precision_recall_curve(y_bin.ravel(), y_bin_pred.ravel())
pr_auc_micro = auc(rec_micro, prec_micro)plt.figure(figsize=(10,4))
plt.subplot(1,2,1)
plt.plot(fpr_micro, tpr_micro, lw=2, label=f"micro-ROC AUC={roc_auc_micro:.3f}")
plt.plot([0,1],[0,1],'--', lw=1)
plt.xlabel("FPR"); plt.ylabel("TPR")
plt.title("ROC (micro-average)")
plt.legend(frameon=False)plt.subplot(1,2,2)
plt.plot(rec_micro, prec_micro, lw=2, label=f"micro-PR AUC={pr_auc_micro:.3f}")
plt.xlabel("Recall"); plt.ylabel("Precision")
plt.title("Precision-Recall (micro-average)")
plt.legend(frameon=False)
plt.tight_layout(); plt.show()

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

? 實戰要點(如何選指標)

  • 報告一頁通讀OA + macro-F1 + Kappa + MCC + 混淆矩陣(歸一化)
    這幾項能同時反映整體、逐類與穩健性,對不均衡也更有意義。
  • 需要概率質量:加上 log_loss + ROC-AUC(ovr, macro) + PR-AUC(macro)
    若要“多候選命中”,再加 Top-K
  • 展示與溝通:曲線(ROC/PR)更直觀,歸一化混淆矩陣能指出“易混類”。
  • 避免踩坑:類別極不均衡時,單看 accuracy 容易誤判;閾值可調的任務(告警/檢索),更應看 PR-AUCPrecision-Recall 曲線

歡迎大家關注下方我的公眾獲取更多內容!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94366.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Bluedroid】深入解析A2DP SBC編碼器初始化(a2dp_sbc_encoder_init)

SBC(Subband Coding)作為藍牙 A2DP 協議的標準編解碼器,其編碼器的初始化與參數配置直接影響音頻傳輸的音質、效率與兼容性。本文基于Andoird A2DP 協議棧源碼,系統剖析 SBC 編碼器的初始化流程,包括核心參數(比特池、采樣率、聲道模式等)的解析、計算與動態調整邏輯,以…

linux shell測試函數

在 C 語言中,int main(int argc, char *argv[])是程序的入口函數,而??在 main函數中調用專門的測試邏輯(如測試函數)??的程序結構,通常被稱為??測試程序(Test Program)??或??測試驅動…

【Java SE】抽象類、接口與Object類

文章目錄一、 抽象類(Abstract Class)1.1 什么是抽象類?1.2 抽象類的語法1.2.1 定義抽象類1.2.2 繼承抽象類1.3 抽象類的特性1.3.1 不能直接實例化1.3.2 抽象方法的限制1.3.3 抽象類可以包含構造方法1.3.4 抽象類不一定包含抽象方法1.3.5 抽象…

Autodl 創建新虛擬環境 python3.9

問題:本人在autodl上保存的環境因為很長時間沒有開機,autodl竟然給我刪除了。后來看了官網的介紹我才發現,原來15天不開機,autodl就會自動釋放實例。 因此,我就自己重新選了一個虛擬環境,從頭開始配置。 GP…

應急響應靶機-WindowsServer2022挖礦事件

依舊手癢開局,知攻善防實驗室的原創靶機 https://mp.weixin.qq.com/s/URrNHvQSnFKOyefHKXKjQQ 相關賬戶密碼: Administrator/zgsf123 注意:做個原始快照(方便日后復習),安裝VMware tool(安裝后圖…

PCB電路設計學習3 電路原理圖設計 元件PCB封裝設計與添加

目錄PCB電路設計學習3五、電路原理圖設計5.1 32個發光二極管電路5.2 單片機外圍電路5.3 供電與程序下載電路5.4 連接各部分網絡,繪制邊框和說明六、元件PCB封裝設計與添加6.1 名詞解釋6.2 繪制PCB附學習參考網址歡迎大家有問題評論交流 (* ^ ω ^)PCB電路設計學習3 …

redis---常用數據類型及內部編碼

Redis 中每種常用數據類型都對應多種內部編碼,這些編碼會根據數據特征(如大小、數量)自動切換,以平衡存儲效率和操作性能。1.字符串(String)用途:存儲文本、數字或二進制數據,是最基…

crypto.randomUUID is not a function

在本地運行時 crypto.randomUUID 好使,build 后放到服務器上用域名訪問就不好使。原因:瀏覽器策略,瀏覽器在非https、localhost的環境中訪問時,crypto.randomUUID 是不可用的開發時使用的是localhost正常訪問 生產臨時使用的是htt…

【思考】什么是服務器?什么是服務?什么是部署?

文章目錄1 什么是服務器?什么是服務?端口是什么意思?2 什么是部署?1 什么是服務器?什么是服務?端口是什么意思? 服務器本質是一臺運行著程序的電腦,它可以運行著很多程序&#xff0c…

自動駕駛導航信號使用方式調研

1 總結 本文調研在給定導航信號后,如何在端到端架構下,利用導航信息引導軌跡生成。 目前主流的方案可以分為2種。一種是將導航作為“前置引導”深度融入軌跡生成過程(導航前置型);另一種則是將導航作為“后置評價”標準…

玳瑁的嵌入式日記D21-08020(數據結構)

雙向鏈表double link listtypedef struct dou_node { DATATYPE data; struct dou_node *prev; struct dou_node *next; }DouLinkNode;雙向鏈表:節點 數據 NEXT PREV . 手撕代碼(增加刪除) 增加,刪除的操作, 需要 tmp 停止待操作節點的前一…

Uipath查找元素 查找子元素 獲取屬性活動組合使用示例

Uipath 查找元素 查找子元素 獲取屬性組合使用示例使用場景案例介紹項目流程圖附加瀏覽器查找元素查找子元素遍歷循環獲取屬性點擊元素使用場景 在實際場景中,有時需RPA自動點擊某組范圍元素或獲取某組范圍元素的值,如需獲取指定的父元素,再…

【MongoDB與MySQL對比】

MongoDB 與 MySQL 全方位對比分析在現代軟件開發中,數據庫的選擇直接影響系統性能、擴展性和開發效率。MongoDB 和 MySQL 作為兩種主流數據庫,分別代表了 NoSQL 和關系型數據庫的典型,各自在不同場景中發揮著重要作用。本文將拋開代碼示例&am…

Spring AI開發指導-對話模型

對話模型接口描述Spring AI基于Spring Cloud的架構體系,定義了一系列可擴展的API接口,支持對接不同類型的AI大模型的核心功能,這些API接口支持同步編程模式或者異步編程模式:接口ModelModel是同步編程模式接口,其參數支…

Win11 下卸載 Oracle11g

目錄 1、停止服務 2、啟動 Universal install 應用 3、執行 deinstall.bat 腳本 4、刪除注冊表相關數據 5、刪除環境變量中的oracle相關路徑 6、刪除安裝文件 7、刪除C盤中的相關Oracle文件 8、刪除 Oracle 數據存放目錄 9、檢查 10、重裝oracle可能還會碰到的問題 &…

深入剖析Spring Boot應用啟動全流程

目錄 前言 啟動流程概覽 一、第一階段:初始化SpringApplication 二、第二階段:運行SpringApplication 三、第三階段:環境準備 四、第四階段:創建應用上下文 五、第五階段:準備應用上下文 六、第六階段&#xf…

Matplotlib 可視化大師系列(三):plt.bar() 與 plt.barh() - 清晰對比的柱狀圖

目錄Matplotlib 可視化大師系列博客總覽Matplotlib 可視化大師系列(三):plt.bar() 與 plt.barh() - 清晰對比的柱狀圖一、 柱狀圖是什么?何時使用?二、 函數原型與核心參數plt.bar(x, height, ...) - 垂直柱狀圖plt.ba…

基于 FastAPI 和 OpenFeature 使用 Feature Flag 控制業務功能

模擬業務場景:多租戶系統跨域轉賬,需要控制某租戶下某用戶是否可以在某域轉賬 open_feature_util.py import typing from abc import abstractmethod, ABCMeta from typing import Sequencefrom openfeature.evaluation_context import EvaluationContex…

Stm32通過ESP8266 WiFi連接阿里云平臺

本文將介紹stm32如何通過WiFi來連接阿里云,上傳數據和接收指令。要先與阿里云建立TCP連接,然后再通過MQTT協議交互。 大體流程:1、在阿里云網頁上創建產品和設備;2、stm32通過WiFi連接云平臺;3、MQTT連接阿里云&#…

北京-測試-入職甲方金融-上班第三天

今日上班時間9-20.18,再加42分鐘就可以拿到75塊錢了,但我想回家,所以下班今天上午有人事舉辦的入職培訓,下午有業務培訓,培訓完領導給我安排了兩個需求。慌死,嚇死,我都不懂,業務和工…