非规则时序遥感影像随机森林作物分类数据处理与建模咨询
问题解答
1. 合并宽表并转换为长表
假设提取的宽表(记为extracted_bands)每行对应一个样本点,列名格式为波段名_影像序号(如B1_1、B2_37),且行顺序与s_points的样本点顺序一致;或两个数据框均包含唯一标识的sample_id列。
步骤1:合并数据框
若存在sample_id列:
library(dplyr) combined_df <- inner_join(s_points, extracted_bands, by = "sample_id")
若无sample_id但行顺序匹配:
combined_df <- bind_cols(s_points, extracted_bands)
步骤2:转换为长表
使用tidyr::pivot_longer重塑格式,按时间(影像序号)和波段分组:
library(tidyr) long_df <- combined_df %>% pivot_longer( cols = starts_with("B"), # 匹配所有波段列,可根据实际列名调整 names_to = c("band", "image_idx"), names_sep = "_", # 假设列名用下划线分隔波段与影像序号 values_to = "reflectance" ) %>% mutate(image_idx = as.integer(image_idx)) # 将影像序号转为整数类型
最终长表将包含sample_id、crop_class、band、image_idx、reflectance列,满足时序样本的长格式需求。
2. 训练随机森林分类模型
随机森林需要每个样本一行,所有波段特征为列,作物类别为标签的宽格式数据,直接使用合并后的combined_df即可:
步骤1:准备训练数据
# 分离特征与标签 features <- combined_df %>% select(-sample_id, -crop_class) labels <- factor(combined_df$crop_class) # 转为因子类型适配分类任务 # 划分训练集与测试集(可选) set.seed(123) # 设置随机种子保证可复现 train_idx <- sample(nrow(combined_df), 0.7 * nrow(combined_df)) train_features <- features[train_idx, ] train_labels <- labels[train_idx] test_features <- features[-train_idx, ] test_labels <- labels[-train_idx]
步骤2:训练模型
推荐使用ranger包(比基础randomForest更快,支持并行):
library(ranger) rf_model <- ranger( y = train_labels, x = train_features, num.trees = 500, # 树的数量可按需调整 importance = "impurity", # 计算特征重要性 seed = 123 )
若使用randomForest包:
library(randomForest) rf_model <- randomForest( x = train_features, y = train_labels, ntree = 500, importance = TRUE, seed = 123 )
步骤3:模型评估
# 预测测试集 test_pred <- predict(rf_model, test_features) # 生成混淆矩阵 table(test_pred, test_labels) # 计算准确率 mean(test_pred == test_labels)
3. 非规则时序下gdalcubes的适用性
针对非规则时序遥感影像,gdalcubes是更合适的工具,核心优势如下:
- 时序规整化:可将非规则时间间隔的影像重采样为规则时序(如每周、每10天),解决影像时间错位问题,便于提取稳定的时序特征。
- 内置时序处理:支持直接计算时序统计量(均值、标准差)、物候参数(植被物候期)、时序滤波(Savitzky-Golay平滑),这类特征对作物分类精度的提升远高于单波段简单堆叠。
- 内存高效:无需将所有影像合并为单个大SpatRaster,通过虚拟立方体处理,降低内存压力,适配37景12波段的大数据量场景。
若分类任务需利用作物生长周期的光谱变化特征,优先用gdalcubes构建时序立方体、提取特征后再输入模型;若仅使用静态光谱信息分类,terra工作流也可满足需求,但处理非规则时序的灵活性远不及gdalcubes。
内容的提问来源于stack exchange,提问作者talocodat
相关产品推荐
相关产品推荐

