从模型性能计算中排除缺失值

Posted

技术标签:

【中文标题】从模型性能计算中排除缺失值【英文标题】:Exclude missing values from model performance calculation 【发布时间】:2017-02-15 00:38:21 【问题描述】:

我有一个数据集,我想构建一个模型,最好使用 caret 包。我的数据实际上是一个时间序列,但问题并不特定于时间序列,只是我使用CreateTimeSlices 进行数据分区。

我的数据有一定数量的缺失值NA,我将它们与caret代码分开估算。我还记录了他们的位置:

# a logical vector same size as the data, which obs were imputed NA
imputed=c(FALSE, FALSE, FALSE, TRUE, FALSE, FALSE)
imputed[imputed] <- NA; print(imputed)
#### [1] FALSE FALSE FALSE    NA FALSE FALSE

我知道 Caret train 函数中有一个选项可以排除 NA 或使用不同的技术对其进行估算。这不是我想要的。我需要在已经估算的数据集上构建模型,但我想从误差指标(RMSE、MAE、...)的计算中排除估算点

我不知道如何在插入符号中执行此操作。在我的第一个脚本中,我尝试手动进行整个交叉验证,然后我有一个自定义的错误度量:

actual = c(5, 4, 3, 6, 7, 5)
predicted = c(4, 4, 3.5, 7, 6.8, 4)
Metrics::rmse(actual, predicted) # with all the points
#### [1] 0.7404953
sqrt(mean( (!imputed)*(actual-predicted)^2 , na.rm=T)) # excluding the imputed
#### [1] 0.676757

我该如何处理caret 中的这种做法?还是有另一种方法可以避免手动编码所有内容?

【问题讨论】:

对我来说,这听起来像是需要自定义代码,而不是 caret 我也想过使用weights参数,但不清楚何时考虑。 【参考方案1】:

我不知道你是否在寻找这个,但这里是一个通过创建函数的简单解决方案。

i=which(imputed==F) ## As you have index for NA values

metric_na=function(fun, actual, predicted, index)
    fun(actual[index], predicted[index])


metric_na(Metrics::rmse, actual, predicted, index = i)
0.676757
metric_na(Metrics::mae, actual, predicted, index = i)
0.54

您也可以在计算所需指标时直接使用索引。

Metrics::rmse(actual[i], predicted[i])

【讨论】:

谢谢,这是一个很好的功能,真的很有帮助,我一定会用插入符号实现它:-) 我认为这是可能的,但需要一些努力。如果您还没有,也请查看this 帖子。

以上是关于从模型性能计算中排除缺失值的主要内容,如果未能解决你的问题,请参考以下文章

从函数返回时复合数据类型缺失值

使用统计模型本地线性趋势模型处理缺失值

警告消息:使用 rpart 的插入符号 train() 中的“重采样性能测量中的缺失值”

机器学习数据预处理之缺失值:预测填充(回归模型填充分类模型填充)

使用预测模型估算缺失值

计算数据帧 Spark 中缺失值的数量