遥感&机器学习入门实战教程|Sklearn案例⑰:决策树与遥感分类(tree 模块)

《机器学习原理及应用》全套PPT课件2026(重庆工商大学) 获取 《机器学习原理及应用》全套PPT课件2026(重庆工商大学)::https://download.youkuaiyun.com/download/m0_54748666/93793958。13-第十三章高斯混合模型.pptx。1-第一章 机器学习概述.pptx。3-第三章模型评估与选择.pptx。12-第十二章K均值聚类.pptx。14-第十四章 谱聚类.pptx。6-第六章 逻辑回归.pptx。7-第七章 神经网络.pptx。11-特征选择与提取.pptx。9-第九章决策树.pptx。 阅读详情

在前面的文章中,我们介绍了 SVM、随机森林、神经网络等模型。
今天要回到一个经典而直观的模型:决策树(Decision Tree)。

🧩 决策树的基本思想

决策树是一种 树形结构的分类与回归方法:

  • 每个 节点 表示一个特征条件(例如“第5个波段 > 0.23”)。
  • 每个 分支 表示决策结果(是/否)。
  • 直到叶子节点,给出分类结果(类别ID)。

优点:

  • 结构简单,结果易解释;
  • 训练速度快,能处理非线性关系;
  • 不需要大量预处理。

缺点:

  • 单棵树容易过拟合,对噪声敏感;
  • 一般在实际应用中更常作为 集成方法(随机森林、梯度提升) 的基础模型。

💻 代码示例:KSC 数据 + 决策树分类

# -*- coding: utf-8 -*-
"""
Sklearn案例⑰:决策树分类(KSC 真实数据)
- 无泄露预处理:仅在训练像素上 fit 标准化与 PCA
- 评估:OA/Kappa/分类报告 + 数字标注混淆矩阵
- 整图预测:逐像素分类可视化(离散色标)
- 决策树结构:仅展示前1层,放大字体、按比例显示
"""

import os
import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.colors import ListedColormap, BoundaryNorm

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.metrics import (confusion_matrix, classification_report,
                             accuracy_score, cohen_kappa_score)

# ===== 中文显示 =====
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False

# ===== 参数区(仅需修改 DATA_DIR)=====
DATA_DIR   = r"your_path"   # ←← 修改为你的 KSC 数据路径(包含 KSC.mat / KSC_gt.mat)
PCA_DIM    = 30
TRAIN_SIZE = 0.3
SEED       = 42

# ===== 1) 读取 KSC 数据(仅取有标签像素)=====
X_cube = sio.loadmat(os.path.join(DATA_DIR, "KSC.mat"))["KSC"].astype(np.float32)   # (H,W,B)
Y_map  = sio.loadmat(os.path.join(DATA_DIR, "KSC_gt.mat"))["KSC_gt"].astype(int)     # (H,W)
h, w, b = X_cube.shape

coords = np.argwhere(Y_map != 0)              # 有标签像素坐标
X_all  = X_cube[coords[:, 0], coords[:, 1]]   # (N,B)
y_all  = Y_map[coords[:, 0], coords[:, 1]] - 1
num_classes = int(y_all.max() + 1)
print(f"[INFO] 有标签像素: {len(y_all)}, 类别数: {num_classes}")

# ===== 2) 分层划分(仅在有标签像素上)=====
X_tr, X_te, y_tr, y_te = train_test_split(
    X_all, y_all,
    train_size=TRAIN_SIZE,
    stratify=y_all,
    random_state=SEED
)

# ===== 3) 无泄露预处理:仅用训练像素拟合 =====
scaler = StandardScaler().fit(X_tr)
pca    = PCA(n_components=PCA_DIM, random_state=SEED).fit(scaler.transform(X_tr))

X_train = pca.transform(scaler.transform(X_tr))
X_test  = pca.transform(scaler.transform(X_te))

# ===== 4) 决策树模型 =====
clf = DecisionTreeClassifier(
    criterion="gini",       # 或 "entropy"
    max_depth=20,           # 适度限制深度防过拟合
    min_samples_split=5,
    random_state=SEED
)
clf.fit(X_train, y_tr)
y_pred = clf.predict(X_test)

# ===== 5) 评估与报告 =====
oa    = accuracy_score(y_te, y_pred)
kappa = cohen_kappa_score(y_te, y_pred)
cm    = confusion_matrix(y_te, y_pred, labels=np.arange(num_classes))
cmn   = cm / np.maximum(cm.sum(axis=1, keepdims=True), 1)

print(f"OA = {oa*100:.2f}%   Kappa = {kappa:.4f}")
print(classification_report(y_te, y_pred, digits=4, zero_division=0))

# ===== 6) 混淆矩阵(计数 & 归一化,含数字)=====
fig, axes = plt.subplots(1, 2, figsize=(11, 4.2), constrained_layout=True)

im0 = axes[0].imshow(cm, cmap=plt.cm.YlGnBu, interpolation='nearest', alpha=0.9)
axes[0].set_title("混淆矩阵(计数)")
axes[0].set_xlabel("预测"); axes[0].set_ylabel("真实")
for i in range(num_classes):
    for j in range(num_classes):
        axes[0].text(j, i, str(cm[i, j]),
                     ha='center', va='center',
                     color='black' if cm[i, j] < cm.max()/2 else 'white', fontsize=9)
fig.colorbar(im0, ax=axes[0], fraction=0.046, pad=0.04)

im1 = axes[1].imshow(cmn, vmin=0, vmax=1, cmap=plt.cm.OrRd, interpolation='nearest', alpha=0.9)
axes[1].set_title("混淆矩阵(归一化)")
axes[1].set_xlabel("预测"); axes[1].set_ylabel("真实")
for i in range(num_classes):
    for j in range(num_classes):
        axes[1].text(j, i, f"{cmn[i, j]*100:.1f}%",
                     ha='center', va='center', color='black', fontsize=9)
fig.colorbar(im1, ax=axes[1], fraction=0.046, pad=0.04)

plt.show()

# ===== 7) 整图像素级预测(逐像素分类)=====
X_flat      = X_cube.reshape(-1, b)
X_flat_pca  = pca.transform(scaler.transform(X_flat))
pred_map    = clf.predict(X_flat_pca).reshape(h, w) + 1   # 转 1..C 便于显示

# 离散色表(1..C),背景本步骤不单独处理
base_cmap   = plt.get_cmap('tab20')
colors      = [base_cmap(i % 20) for i in range(num_classes)]
cmap        = ListedColormap(colors)
boundaries  = np.arange(0.5, num_classes + 1.5, 1)
norm        = BoundaryNorm(boundaries, cmap.N)

plt.figure(figsize=(8.6, 6.4))
im = plt.imshow(pred_map, cmap=cmap, norm=norm, interpolation='nearest')
plt.title("KSC 整图预测结果(决策树)")
plt.axis('off')
cbar = plt.colorbar(im, boundaries=boundaries,
                    ticks=np.arange(1, num_classes + 1, max(1, num_classes // 12)),
                    fraction=0.046, pad=0.04)
cbar.set_label("类别ID", rotation=90)
plt.show()

# ===== 8) 决策树结构可视化(前两层,放大字体、按比例显示)=====
plt.figure(figsize=(16, 8))
plot_tree(
    clf,
    filled=True,
    feature_names=[f"PC{i+1}" for i in range(PCA_DIM)],
    class_names=[str(i+1) for i in range(num_classes)],
    max_depth=1,        # 仅展示前两层
    fontsize=10,        # 放大字体
    proportion=True     # 节点以类别比例显示,信息更简洁
)
plt.title("决策树前1层结构示意(按比例显示)", fontsize=14)
plt.show()

🔍 结果解读

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 性能指标

    • 控制台输出:OA、Kappa、精确率、召回率和 F1。
    • 混淆矩阵:可以直观看出哪些类别容易混淆。
  2. 整图预测

    • 每个像素都会被分配一个类别,直观呈现分类效果。
    • 由于单棵树容易过拟合,分类图可能存在块状噪声。
  3. 树结构可视化

    • 决策树可以直接画出来(示例只画前两层),展示分类规则,非常适合教学与解释。

✅ 总结

  • 决策树是一个直观、易解释的模型,在遥感分类中可作为 入门基线。

  • 它的主要超参数包括:

    • criterion(划分标准):gini 或 entropy;
    • max_depth(最大深度):防止过拟合的重要参数;
    • min_samples_split(最小分裂样本数):控制节点继续划分的条件。
  • 实际应用中,单棵树的泛化能力有限,更推荐使用 集成方法(随机森林、梯度提升树)。

欢迎大家关注下方公众号获取更多内容!

ArcGIS学习记录—SHP文件转换为KML KMZ数据,并显示面要素相应的标注 使用相应软件操作获取KMZ数据得以下发到外业调查人员,使得矢量数据能够更显而易见,可视化,让外业人员的工作减轻许多。(过程步骤是借鉴于网络上的相关人士给的建议,根据这些建议自己做出来的步骤,可能有些粗略,有问题的话可以再进行探讨)... 阅读详情

相关推荐

”COMSOL“竟然如此简单!我悟了!!

COMSOL Multiphysics具有强大的多物理场全耦合仿真分析功能、高效的计算性能,可以保证数值仿真的高度精确,已被广泛应用于各个学科领域,近年来运用COMSOL来解决电化学实际工程问题也越来越普遍。

C1012562281的博客 3447

利用Python的Scikit-Learn库对遥感影像进行随机森林分类

利用Python的Scikit-Learn库对遥感影像进行随机森林(RandomForest)分类 随机森林是一个包含多个决策树的分类器,因其运算速度快、分类精度高、算法稳定等特点,被广泛应用到遥感图像的分类研究中。Scikit-Learn作为Python 编程语言的免费软件机器学习库,提供了对随机森林算法的支持,但没有提供针对遥感影像分类的相关函数。因此,本篇文章将为读者介绍利用Python及其扩展包Scikit-Learn对遥感影像进行随机森林分类的完整过程,包括:ShapeFile格式样本数据的读取、

u014444411的博客 1万+

MTK平台LCD驱动开发实战:从零开始点亮你的Android屏幕

本文详细介绍了在MTK平台进行Android LCD驱动开发的完整流程。从理解LK与Kernel双核驱动框架入手,手把手讲解驱动结构体、屏幕参数配置、初始化序列编写以及PLL_CLOCK计算等核心步骤,并提供了系统集成配置与实用的调试避坑指南,帮助开发者高效点亮新屏幕。

terraform7cloud的博客 291

【机器学习300问】139、Post-LN 和 Pre-LN 的区别?

Post-LN与Pre-LN的核心区别在于LayerNorm的位置:Post-LN在残差连接后,导致梯度需经LayerNorm变换,深层易出现梯度衰减或震荡;Pre-LN先做归一化,使输入稳定,残差路径梯度可无损回传,显著提升深层训练稳定性。尽管Pre-LN支持更深层次模型(如LLaMA、Qwen),但存在“深度诅咒”——深层贡献不足。相比之下,Post-LN浅层表现尚可,深层数易发散。因此,现代大模型普遍采用Pre-LN以保障训练可靠性。

qq_39780701的博客 347

UE4/5项目GPU崩溃?可能是Windows的TDR机制在搞鬼!深入浅出聊聊TdrDelay与显卡超时

本文深入探讨了UE4/5项目中GPU崩溃的常见原因,揭示了Windows TDR机制的工作原理及其对渲染进程的影响。通过调整TdrDelay参数和优化GPU负载,提供了解决显卡超时问题的实用方案,帮助开发者提升项目稳定性。

weixin_30691649的博客 409

【180609】剑侠情缘_整套源码+地图编辑器(单机学习例子)

剑侠情缘_整套源码+地图编辑编(单机学习例子)完整源码下载地址:点击下载备用下载地址:点击下载

资源小站 6276

python 机器学习 交叉验证train_test_split 网格搜索GridSearchCV

最佳参数: {'metric': 'euclidean', 'n_neighbors': 3, 'weights': 'uniform'}交叉验证 用于在数据集中拆分成测试集和验证集,用于模型训练和验证。最佳交叉验证得分: 0.9428571428571428。网格搜索 用于自动查找最合适的模型参数,用于模型调优。测试集准确率: 1.0。

frt的博客 240

Gemini 2.5 Pro国内免魔法直连教程:5分钟搞定专业级PPT图表(附折线图/柱状图案例)

本文详细介绍了如何利用Gemini 2.5 Pro快速生成专业级PPT图表,包括折线图和柱状图等常见商业图表。通过自然语言交互和智能图表生成功能,用户可以在5分钟内完成数据可视化,大幅提升工作效率。文章还提供了实战案例和高级技巧,帮助用户轻松应对各种商业场景需求。

weixin_30733003的博客 460

【机器学习300问】138、LayerNorm和BatchNorm的区别?

本文阐述了归一化与标准化在深度学习中的核心作用。输入层标准化可统一初始输入,但深层网络仍面临激活分布漂移。为此,提出BatchNorm与LayerNorm两种主流方法。

qq_39780701的博客 176

3.嵌入式控制器EC学习,源码框架(60/64端口)(一)

服务函数剖析 上一篇讲到while循环会一直查询十六个标志位是否满足要求,一旦其中某个标志位为1时,程序将会执行相应的服务函数,而执行服务函数是通过函数指针(service_table[ _R1 ])();来实现的。接下来我们分别来看看这十六个服务函数分别包含了哪些内容。 16个函数的函数名如下: const FUNCT_PTR_V_V code service_table[16] = { // Hi-Level Service Service_PCI, // Host 6

qq_30135687的博客 4158

月薪2万+的网络工程师,到底藏着哪些“绝活”?

在IT圈,网络工程师是个既神秘又硬核的职业。月薪2万+的网工,早已不是只会拉网线、改IP的“IT民工”,而是掌握了一身“绝技”的技术大牛。他们能让企业网络如丝般顺滑,面对宕机临危不乱,还能用自动化脚本批量搞定上百台设备。想知道这些高薪网工的秘密武器是什么?今天,我就以一个老网工的视角,结合自己和同行们的实战经验,扒一扒那些月薪2万+的网络工程师都身怀哪些绝技。如果你也想挤进高薪行列,不妨参考参考!

网络技术联盟站 359

为什么生成对抗网络训练常不稳定,模式崩溃与判别器过强之间是什么关系?

当支持集不重叠时(即 $D$ 能完美区分真假),JS 散度为常数 $\log 2$,其梯度为 0。这意味着一旦 $D$ 训练得稍好,$G$ 就失去了学习方向,导致训练停滞。生成对抗网络(GAN)的训练本质上是生成器($G$)与判别器($D$)之间的非合作零和博弈。以下代码展示了如何通过梯度惩罚(Gradient Penalty)来约束判别器,避免其过强导致生成器梯度失效。判别器过强是导致模式崩溃的直接诱因之一,二者之间存在明确的**“梯度误导”**因果关系。

2402_84593233的博客 194

LangGraph实战训练营-打造 WhatsApp 全自动消息收发AI智能助手

本文系统梳理了项目架构(WhatsApp Bridge + Talon Host + LangGraph Agent Harness三层设计)、完整环境搭建流程(Docker/本地双模式部署)、核心原理(WhatsApp桥接机制、NVIDIA Parakeet语音转录管线、Cron定时调度、Agent图状状态机),并提供了基础对话、文件操作、语音处理、定时任务等六大实战示例。同时涵盖安全策略、性能优化、数据备份等生产级运维实践,以及十个高频问题的排查方案。

program哲学 190

人工智能,机器学习,深度学习,神经网络之间到底是什么关系,它们之间有什么联系和区别

联系:四者是目标 - 方法 - 架构 - 深化的递进关系。AI 是终极目标,ML 是实现 AI 的主流路径,NN 是 ML 中模仿人脑的算法架构,DL 是利用深层 NN 解决复杂问题的最强工具。区别核心AI包含非学习型规则系统(如专家系统)。ML强调“从数据中学习”,但通常需要人工介入特征工程。NN是具体的算法模型,浅层 NN 属于传统 ML。DL特指“深层”NN,核心优势在于自动特征提取和处理非结构化大数据的能力。技术选型建议:若数据量小、特征明确且需要高可解释性(如金融风控表格数据),首选。

2402_84593233的博客 226

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【人工智能驱动的电催化研究-01】人工智能是什么?AI、机器学习、深度学习和神经网络之间有什么区别?

介绍人工智能、机器学习、神经网络和深度学习的基本概念及相互关系。围绕催化剂性能预测,解释样本、特征、标签、模型、参数、训练、预测与验证的含义。结合二硫化钼边缘位点与析氢活性的研究案例,说明科学问题如何指导特征选择。利用真实文献中的析氢数据,通过手算和Python实践,对比人工规则与均值模型,理解参数学习和误差评价。强调数据学习不保证预测更优,相关性不能直接证明反应机理,文献数据还须核查实验条件与适用范围,为后续编程、数学和电催化机器学习课程建立基础。

2402_84593233的博客 747

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

机器学习01,KNN使用与简单数学原理

个人笔记

qq_59247073的博客 247

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

机器学习教程,从入门到精通,高斯混合模型(GMM)——写给机器学习小白的保姆级教程(10)

高斯混合模型(Gaussian Mixture Model,简称 GMM):假设你手里的数据是由"好几堆正态分布的数据混在一起"形成的,GMM 的任务就是——把这几堆分开,并且描述清楚每一堆的样子。

qq_45746668的博客 108

机器学习01,了解与KNN

个人笔记

qq_59247073的博客 343

【slam公式】

F:状态转移矩阵H:观测矩阵R: 观测噪声协方差。

qq_44691564的博客 285

基于有效Token规模化的大模型预训练数据配方与工程体系研究——基于唐杰《高级机器学习》课程演讲

在此背景下,本文系统梳理GLM系列模型数据迭代轨迹,纠正数据墙认知偏差,分析天然数据与合成数据的互补机制,并完整构建支撑高质量Token挖掘的全链路数据工程体系,为大模型数据规模化建设提供理论与工程参考。早期小模型训练场景下,数据总量远大于算力可消化量,核心策略为择优筛选少量高质量数据。基于唐杰公开演讲核心观点、GLM数据迭代、数据墙、合成数据、清洗解析工具链、分层架构图、自研工程壁垒),完整重构成一篇结构严谨、逻辑连贯、标准期刊论文风格全文,预留精准图片插入位置,可直接定稿、查重、发表、结课提交。

interpromotion的博客 230

机器学习-支持向量机

本文通过多个案例深入解析SVM在二分类、多分类及高维文本数据中的应用。基于乳腺癌数据集,构建标准化+SVM的流水线,结合网格搜索优化C与gamma参数,实现98.02%的测试准确率。通过交叉验证评估模型稳定性,结果显示标准差仅0.0162,表明模型鲁棒性强。引入probability=True后,可输出预测概率,揭示模型不确定性(如样本4的52%良性概率),助力医疗决策。结果表明,特征维度提升需调小gamma、增大C以适应复杂数据,凸显参数与数据特性的交互关系。

buwangchuxinking的博客 325

茶叶病虫害目标检测数据集

目标检测 yolo 目标检测数据集 茶叶病虫害目标检测数据集

DL_data_set的博客 338

生成式对抗网络GAN(Generative Adversarial Network)

和我们之前所说的梯度消失的问题类似所以很长一段时间用GAN来生成Sequence文字是非常困难的更多的生成模型:但是一般还是GAN产生的结果最好。

2303_76561497的博客 155

分布式计算框架如何赋能大规模机器学习

PyTorch 和 TensorFlow 是当今最流行的深度学习框架,它们都提供了强大的内置库来支持分布式训练。其核心策略主要分为数据并行和模型并行。

Cat_fish_snow的博客 172

基于机器学习的酒店数据分析及流失预测系统

本系统是一个面向酒店行业的客户数据分析与流失预测平台,基于 Antonio et al. (2019) 公开的酒店预订需求数据集,采用 Flask + SQLite + ECharts + scikit-learn 技术栈,实现数据可视化分析、机器学习流失预测、模型管理等功能,帮助酒店管理者识别流失风险客户并制定针对性挽留策略。流失(1):预订取消(is_canceled = 1),或非回头客且有历史取消记录未流失(0):不符合上述条件的客户。

aiyuanma_vip的博客 335

40V/24A高频率增强型GaN HEMT功率开关管/高频DC转换/电动工具/GaN充电器 方案首选

是一种增强型硅基氮化镓晶体管。氮化镓是一种宽禁带半导体,具有高功率密度。氮化镓晶体管的特点是没有体二极管,因此反向恢复电荷为零。这种氮化镓高电子迁移率晶体管(HEMT)是一种高性能增强型氮化镓HEMT,可实现优异的高频和高效率运行。该氮化镓功率HEMT结合了最高的dv/dt抗扰性以及行业标准的低轮廓、低电感FCQFN 3x4封装,使设计人员能够实现简单、快速且可靠的解决方案。符合RoHS、无铅、REACH标准。提供FCQFN 3x4封装。无人机及遥控模型电子调速器。高频DC-DC转换器。

2301_76864527的博客 224
上一篇: 遥感&机器学习入门实战教程|Sklearn案例⑯:聚类与无监督分类(cluster 模块)
下一篇: 遥感&机器学习入门实战教程|Sklearn案例⑱:半监督学习(semi_supervised)
遥感AI实战
博客等级 码龄9年 1002粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遥感AI实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值