使用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
相关产品推荐
相关产品推荐

