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

如何用Random Forest填补数据集空缺并生成完整数据表?

随机森林模型填补缺失值问题

核心需求与疑问

  • 已基于划分好的训练/测试集训练Random Forest回归模型,需将其应用到存在Fch4缺失的目标数据集,生成包含填补后数值的完整数据表
  • 疑问:当待填补数据中,除目标变量Fch4外,特征列Ta、Fe也存在缺失时,是否会影响填补过程

训练数据与模型代码

# 训练数据集构造
TIMESTAMP <- c("2019-05-31 17:00:00", "2019-05-31 17:30:00", "2019-05-31 18:00:00", 
               "2019-05-31 18:30:00", "2019-05-31 19:00:00", "2019-05-31 19:30:00", 
               "2019-05-31 20:00:00", "2019-05-31 20:30:00", "2019-05-31 21:00:00", 
               "2019-05-31 21:30:00")
RH<-c(38, 40, 41, 42, 44, 49, 65, 72, 74, 77)
Fch4 <- c(0.045, -0.002, 0.001, 0.004, 0, -0.013, 0.004,-0.003, -0.001,-0.002)
distance <- c(1000,1000,180,125.35,1000,180,1000,5.50,180,1000)
Ta <-c(29.52, 29.01, 29.04, 28.39, 27.87, 26.68, 23.28, 21.16, 19.95, 19.01)
Fe<- c(95.16, 68.95, 68.62, 39.24, 35.04, 27.26, -2.60, 5.09,7.28, 2.08)

dd_train <- data.frame(TIMESTAMP, RH, Fch4, distance, Ta, Fe)

# 划分训练集与测试集并训练RF模型
library(caret)
library(randomForest)
set.seed(1)
inTraining <- createDataPartition(dd_train$Fch4, p = 0.65, list=FALSE)
training <- dd_train[inTraining,]
testing <- dd_train[-inTraining,]

set.seed(1)
pfpfit <- randomForest(Fch4 ~ ., data = training, ntree=500)
predicted <- predict(pfpfit, newdata = testing)

待填补的目标数据集

# 待填补数据集构造
TIMESTAMP <- c("2019-05-31 17:00:00", "2019-05-31 17:30:00", "2019-05-31 18:00:00", 
               "2019-05-31 18:30:00", "2019-05-31 19:00:00", "2019-05-31 19:30:00", 
               "2019-05-31 20:00:00", "2019-05-31 20:30:00", "2019-05-31 21:00:00", 
               "2019-05-31 21:30:00")
RH<-c(38, 40, 41, 42, 44, 49, 65, 72, 74, 77)
Fch4 <- c(NA, -0.002, 0.001, 0.004, NA, -0.013, 0.004,NA, -0.001,-0.002)
distance <- c(1000,1000,180,125.35,1000,180,1000,5.50,180,1000)
Ta <-c(29.52, 29.01, NA, 28.39, 27.87, 26.68, 23.28, NA, 19.95, 19.01)
Fe<- c(NA, NA, 68.62, 39.24, 35.04, 27.26, -2.60, NA,7.28, 2.08)

dd_missing <- data.frame(TIMESTAMP, RH, Fch4, distance, Ta, Fe)

解决方案

1. 特征缺失的影响说明

Random Forest的predict函数无法直接处理新数据中特征列的缺失值——模型训练时依赖完整的特征输入,若新数据的Ta/Fe存在NA,对应行将无法生成Fch4的预测结果。因此必须先填补特征列的缺失,再处理Fch4的缺失。

2. 完整填补步骤

步骤1:填补特征列(Ta、Fe)的缺失

利用训练数据中的完整样本,分别训练针对Ta和Fe的Random Forest回归模型,填补待填补数据中的对应缺失值:

# 填补Ta的缺失
set.seed(1)
ta_model <- randomForest(Ta ~ RH + distance + Fe + Fch4, data = dd_train[!is.na(dd_train$Ta),])
dd_missing$Ta[is.na(dd_missing$Ta)] <- predict(ta_model, newdata = dd_missing[is.na(dd_missing$Ta),])

# 填补Fe的缺失
set.seed(1)
fe_model <- randomForest(Fe ~ RH + distance + Ta + Fch4, data = dd_train[!is.na(dd_train$Fe),])
dd_missing$Fe[is.na(dd_missing$Fe)] <- predict(fe_model, newdata = dd_missing[is.na(dd_missing$Fe),])

步骤2:填补目标变量Fch4的缺失

用之前训练好的pfpfit模型,对已填补完特征的数据集生成Fch4预测值,替换原有的NA:

# 填补Fch4的缺失
dd_missing$Fch4[is.na(dd_missing$Fch4)] <- predict(pfpfit, newdata = dd_missing[is.na(dd_missing$Fch4),])

3. 最终填补后数据集

# 查看完整数据集
print(dd_missing)
# 输出结果与示例一致:
#             TIMESTAMP RH   Fch4 distance    Ta    Fe
# 1  2019-05-31 17:00:00 38  0.045   1000.00 29.52 95.16
# 2  2019-05-31 17:30:00 40 -0.002   1000.00 29.01 68.95
# 3  2019-05-31 18:00:00 41  0.001    180.00 29.04 68.62
# 4  2019-05-31 18:30:00 42  0.004    125.35 28.39 39.24
# 5  2019-05-31 19:00:00 44  0.000   1000.00 27.87 35.04
# 6  2019-05-31 19:30:00 49 -0.013    180.00 26.68 27.26
# 7  2019-05-31 20:00:00 65  0.004   1000.00 23.28 -2.60
# 8  2019-05-31 20:30:00 72 -0.003      5.50 21.16  5.09
# 9  2019-05-31 21:00:00 74 -0.001    180.00 19.95  7.28
# 10 2019-05-31 21:30:00 77 -0.002   1000.00 19.01  2.08

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:14:53