如何将XGBoost回归的残差导出为单个栅格?
解决XGBoost回归残差计算及栅格导出问题
修复残差计算错误
"未定义sb对象"这类报错,本质是引用了未初始化的变量(比如模型对象名、数据框名拼写错误)。先确保模型训练流程正确,再按以下步骤计算残差:
- 从数据框分离自变量与因变量:
X <- df[, c("pop", "tirs", "agbh")] y_true <- df$ntl
- 用训练好的模型生成预测值并计算残差:
y_pred <- predict(xgb_model, newdata = X) residuals <- y_true - y_pred # 将残差绑定回原数据框 df$residuals <- residuals
将残差导出为栅格
要生成带空间参考的残差栅格,必须保留原始栅格的像元索引或空间坐标,以下是完整流程:
前提:确保数据框包含像元索引
如果你的数据框是从栅格提取而来,提取时需保留像元ID:
# 加载原始栅格堆栈 raster_stack <- stack("pop.tif", "tirs.tif", "agbh.tif", "ntl.tif") # 提取像元值及对应ID df <- as.data.frame(extract(raster_stack, 1:ncell(raster_stack), cellnumbers = TRUE)) # 重命名列匹配你的数据集 colnames(df) <- c("cell_id", "pop", "tirs", "agbh", "ntl")
创建并导出残差栅格
- 选取任意原始栅格作为模板(保证空间参数一致):
template_raster <- raster_stack$pop
- 初始化残差栅格并填充值:
residual_raster <- template_raster # 将残差赋值到对应像元位置 residual_raster[df$cell_id] <- df$residuals
- 导出为GeoTIFF格式:
writeRaster(residual_raster, filename = "xgb_residuals.tif", format = "GTiff", overwrite = TRUE)
完整可运行示例
library(caret) library(xgboost) library(raster) # 加载数据(替换为你的数据路径) df <- read.csv("your_dataset.csv") # 加载原始栅格堆栈(用于生成栅格模板) raster_stack <- stack("pop.tif", "tirs.tif", "agbh.tif", "ntl.tif") # 用最优参数训练XGBoost回归模型 train_control <- trainControl(method = "cv", number = 5) xgb_optimal_grid <- expand.grid( nrounds = 150, # 替换为你的最优参数 max_depth = 5, eta = 0.08, gamma = 0.1, colsample_bytree = 0.7, min_child_weight = 2, subsample = 0.9 ) xgb_model <- train( x = df[, c("pop", "tirs", "agbh")], y = df$ntl, method = "xgbTree", trControl = train_control, tuneGrid = xgb_optimal_grid, metric = "RMSE" ) # 计算残差 df$y_pred <- predict(xgb_model, newdata = df[, c("pop", "tirs", "agbh")]) df$residuals <- df$ntl - df$y_pred # 生成并导出残差栅格 template <- raster_stack$pop residual_raster <- template residual_raster[df$cell_id] <- df$residuals writeRaster(residual_raster, "xgb_residuals.tif", format = "GTiff", overwrite = TRUE)
内容的提问来源于stack exchange,提问作者Nikos
相关产品推荐
相关产品推荐

