You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用mlr3、ranger与Terra实现分类概率预测及未知类添加的咨询

问题与解答

问题描述

我是机器学习新手,术语表述若有错误还请见谅。现咨询两个问题:

  • 当任意一类的概率都极低时,能否添加额外的“unknown”类别?
  • 如何将每个单元格的各类概率值以图层形式返回?

示例代码

library(terra, exclude = "resample") # 处理栅格数据
library(sf) # 处理矢量数据

library(mlr3verse) # 机器学习工具集,懒加载大部分mlr3包
library(mlr3spatiotempcv) # 空间重采样方法
library(mlr3spatial)

leipzig = read_sf(system.file("extdata", "leipzig_points.gpkg", package = "mlr3spatial"), stringsAsFactors = TRUE)

leipzig_raster = rast(system.file("extdata", "leipzig_raster.tif", package = "mlr3spatial"))

task = as_task_classif_st(leipzig, 
                          id = "veg_class", 
                          target = "land_cover", 
                          backend = leipzig)

resample_method = rsmp("repeated_spcv_coords", folds = 10)

rf_ranger_lrn = lrn("classif.ranger", predict_type = "prob", importance = "impurity")

resample_rf = resample(task = task,
                       learner = rf_ranger_lrn,
                       resampling = resample_method,
                       store_models = FALSE)

rf_ranger_lrn$train(task)

classes <- terra::predict(leipzig_raster, rf_ranger_lrn, na.rm = TRUE)

问题解答

1. 添加“unknown”类别

可以实现,分两种场景处理:

  • 训练阶段加入unknown样本:如果你有无法确定类别的样本,直接将它们标记为unknown加入训练数据集,让模型学习识别这类不确定的情况,后续预测时模型会自动输出unknown类别的概率。
  • 预测后处理生成unknown:如果没有这类训练样本,可以在得到所有类别概率后,设定一个阈值(比如所有类别的最大概率低于0.3),将满足条件的单元格标记为unknown。示例代码如下:
# 获取所有类别的概率图层
prob_raster <- terra::predict(leipzig_raster, rf_ranger_lrn, na.rm = TRUE, type = "prob")
# 计算每个单元格的最大概率值
max_prob <- max(prob_raster)
# 创建unknown图层:最大概率低于0.3时为1,否则为0
unknown_layer <- ifel(max_prob < 0.3, 1, 0)
# 将unknown图层合并到概率栅格中
final_raster <- c(prob_raster, unknown_layer)
# 修改最后一个图层的名称为"unknown"
names(final_raster)[nlyr(final_raster)] <- "unknown"

阈值可以根据实际需求调整,比如0.2或0.4,取决于你对“极低概率”的定义。

2. 返回各类概率的图层

你的rf_ranger_lrn已经设置了predict_type = "prob",只需在terra::predict中明确指定返回概率类型,就能得到每个类别对应一个图层的多波段栅格:

# 直接获取每个类别的概率图层,每个类别对应一个栅格图层
prob_layers <- terra::predict(leipzig_raster, rf_ranger_lrn, na.rm = TRUE, type = "prob")
# 查看各个图层对应的类别名称
names(prob_layers)

prob_layers就是包含所有类别概率的多图层栅格,每个图层对应一个类别的概率值,后续可以单独提取或分析任意类别的概率图层。


内容的提问来源于stack exchange,提问作者pbengou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:33:31