遥感机器学习入门实战教程|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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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块钱了,但我想回家,所以下班今天上午有人事举办的入职培训,下午有业务培训,培训完领导给我安排了两个需求。慌死,吓死,我都不懂,业务和工…