R语言如何按时序原始顺序非随机划分天气数据集训练测试集
问题解答
按原始时间顺序划分训练集、测试集的需求完全可以实现,这也是时序类预测任务的标准采样方式——随机采样会造成未来数据泄露,得到的模型验证结果不具备实际参考价值。
原代码问题说明
- 你已经完成了时序切分的前置步骤:通过
dataset[order(dataset$Date),]将数据集按日期从早到晚升序排列 - 原代码使用
sample()函数随机抽取行号,本质是打乱数据顺序采样,自然会出现测试集时间乱序的问题 - 原代码存在比例逻辑错误:代码中抽取的是80%的行赋值给测试集,剩余20%作为训练集,和注释标注的占比完全相反
实现方法
方法1:按固定比例时序切分
如果需要按比例划分(例如80%训练、20%测试),直接按排序后的行号连续切分即可,无需随机采样:
# 数据已按日期升序排列的前提下 train_ratio <- 0.8 train_row_num <- floor(nrow(dataset) * train_ratio) # 前序时间更早的数据作为训练集 train <- dataset[1:train_row_num, ] # 后序时间更晚的数据作为测试集 test <- dataset[(train_row_num + 1):nrow(dataset), ]
方法2:按预测目标时段精准切分
你的任务是固定预测2008年5月7日至2008年5月18日的气温,不需要按比例切分,直接通过日期字段筛选是最贴合实际场景的方案:
# 先将Date列转换为日期格式,避免字符串匹配误差 dataset$Date <- as.Date(dataset$Date) # 训练集:预测起始日之前的所有历史数据 train <- dataset[dataset$Date < as.Date("2008-05-07"), ] # 测试集:需要预测的目标时段数据 test <- dataset[dataset$Date >= as.Date("2008-05-07") & dataset$Date <= as.Date("2008-05-18"), ]
验证方式
切分完成后可通过以下命令校验结果,确认训练集的最晚日期早于测试集的最早日期,且两个子集均保留原始时间顺序:
# 查看训练集最后几条的日期 tail(train$Date) # 查看测试集前几条的日期 head(test$Date)
注意:后续使用决策树、随机森林、SVM、神经网络开展预测时,必须使用这种时间顺序切分的数据集验证效果,随机采样会让模型在训练阶段提前接触到未来时段的信息,导致验证效果远好于实际预测的真实表现。
内容的提问来源于stack exchange,提问作者nullUser
相关产品推荐
相关产品推荐

