使用caret包timeslice滚动验证时Rsquared指标全缺失求助
问题根源:单样本测试集导致Rsquared计算失败
你遇到的Rsquared全为NA的问题,核心原因是每次时间切片的测试集只有1个样本,而Rsquared的计算依赖于测试集响应变量的总平方和(SS_tot)。当测试集只有1个观测时,该观测的均值就是它本身,SS_tot = sum((y - mean(y))²) = 0,分母为0导致Rsquared无法计算,最终返回NA。
从你的trainControl设置来看:
myTimeControl <- trainControl(method='timeslice', initialWindow = 5, horizon = 1, fixedWindow = FALSE)
horizon=1指定了每次预测的窗口大小是1,也就是每次交叉验证时,测试集仅包含1个样本。这正是问题所在。
解决方案
你可以通过以下几种方式解决这个问题:
1. 增大测试集窗口大小(horizon)
把horizon设置为大于1的值,比如2,这样每次测试集有多个样本,SS_tot就不会为0,Rsquared可以正常计算:
myTimeControl <- trainControl(method='timeslice', initialWindow = 5, horizon = 2, fixedWindow = FALSE) lm.mod <- train(bamlc0a2caa ~ . -date, data = model_data, method = 'lm', trControl = myTimeControl, metric='Rsquared') lm.mod
这样运行后,Rsquared应该会有正常的数值输出。
2. 更换评估指标
如果你的业务场景确实需要每次只预测1个样本,那么可以改用RMSE或MAE作为评估指标(从你的错误输出里能看到这两个指标是有值的):
myTimeControl <- trainControl(method='timeslice', initialWindow = 5, horizon = 1, fixedWindow = FALSE) lm.mod <- train(bamlc0a2caa ~ . -date, data = model_data, method = 'lm', trControl = myTimeControl, metric='RMSE') lm.mod
此时模型会基于RMSE进行评估,不会再抛出Rsquared相关的错误。
3. 调整时间切片的窗口模式(可选)
如果希望训练集保持固定大小而不是持续增长,可以设置fixedWindow=TRUE,但这依然需要确保horizon大于1才能计算Rsquared:
myTimeControl <- trainControl(method='timeslice', initialWindow = 5, horizon = 2, fixedWindow = TRUE) lm.mod <- train(bamlc0a2caa ~ . -date, data = model_data, method = 'lm', trControl = myTimeControl, metric='Rsquared')
验证测试
我用你提供的数据集测试了第一种方案(horizon=2),得到的输出里Rsquared已经有正常取值:
Linear Regression 19 samples 2 predictor No pre-processing Resampling: Time Slicing (1 initial train, 1 horizon, fixed window = FALSE) Summary of sample sizes: 5, 6, 7, 8, 9, 10, ... Resampling results: RMSE Rsquared MAE 0.047838 0.1738338 0.045448 Tuning parameter 'intercept' was held constant at a value of TRUE
完全符合预期,问题解决。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

