我试图预测一些时间序列数据,我已经使用了三种不同类型的模型来预测。现在,我已经记下了每个系列的模型的性能,这是一个独特的标识。数据格式如下:
ID MAPE_Model_Residual MAPE_Validation_Residual Diff_Residual
1 8355_0_32167 83.26487 77.86192 5.40295030
2 8355_0_32168 93.44941 93.51703 0.06761914
3 8355_0_32169 93.46655 93.52344 0.05688714
4 8355_3936_32170 88.94154 84.96923 3.97231385
5 8355_3937_32170 74.37984 83.19228 8.81243847
6 8355_3940_32170 74.06081 52.38760 21.67321223
MAPE_Model_Fitted MAPE_Validation_Fitted Diff_Fitted MAPE_Model_Arima MAPE_Validation_Arima
81.87216 74.91174 6.96041639 83.96876 80.19690
93.36049 93.33518 0.02530898 92.93121 90.73525
93.37859 93.33369 0.04489972 92.91448 90.74218
88.24597 85.42486 2.82111289 88.69834 83.08940
74.43546 83.19509 8.75962941 73.69333 74.74214
6 73.77239 52.97098 20.80140874 75.56103 63.57248
Diff_Arima
3.771864
2.195963
2.172300
5.608939
1.048811
11.988552模型的精度、交叉验证精度和差异有三种模型.我想确定一个与唯一的id对应的模型,它具有最高的精度和最低的差值。就像一个小例子
Model1 Model2 Model3
M1_2 M1_diff M2_1 M2_2 M2_diff M3_1 M3_2 M3_diff
A 55.2 60.8 5.6 66.7 69.8 3.1 58.5 60.3 1.8
B 56.8 55.4 1.4 62.8 63.9 1.1 65.7 69.8 4.1
C 52.3 54.3 2.0 53.8 55.9 1.1 56.7 57.9 1.2我必须找出哪种型号1,2,3最适合A,B,C。标准是Mi_1和Mi_2最高,Mi_diff最低。就像id B一样,它可能是第二种模式。我不能想出任何通用的算法来做这件事。数据相当大,几乎有1000个唯一的ids,而且不可能是唯一的,我在想,可能有一些简单的解决方案,我没有得到。有人能帮忙吗?我用R来计算。
发布于 2014-06-07 16:14:55
您可以计算一个score函数,它将三个值组合在一起,然后选择最大分数的模型(通过id)。由于您的所有值都是正的,所以作为一个得分函数,我将采用以下一个:
score = product(acc_1,acc_2)/diff在此,我将如何进行:
首先,我以长格式重新塑造数据(更容易通过(id,model )进行):
library(plyr)
library(reshape2)
melted <- melt(dat)
melted$model <- sub('_.*','',melted$variable)
head(melted)
# id variable value model
# 1 A M1_1 55.2 M1
# 2 B M1_1 56.8 M1
# 3 C M1_1 52.3 M1
# 4 A M1_2 60.8 M1
# 5 B M1_2 55.4 M1
# 6 C M1_2 54.3 M1然后,对于每个(id,模型),我计算分数:
ddply(melted,.(id,model),summarise,
score = prod(value[!grepl('diff',variable)])/ value[grepl('diff',variable)])
# id model score
# 1 A M1 599.3143
# 2 A M2 1501.8258
# 3 A M3 1959.7500
# 4 B M1 2247.6571
# 5 B M2 3648.1091
# 6 B M3 1118.5024
# 7 C M1 1419.9450
# 8 C M2 2734.0182
# 9 C M3 2735.7750最后,对于每个id,我选择了使分数最大化的模型:
ddply(scored,.(id),summarise,model = model[which.max(score)])
# id model
# 1 A M3
# 2 B M2
# 3 C M3https://stackoverflow.com/questions/24098657
复制相似问题