【发布时间】:2019-01-05 11:48:57
【问题描述】:
我有比特币时间序列,我使用 11 个技术指标作为特征,我想将回归树拟合到数据中。据我所知,r 中有两个函数可以创建回归树,即 rpart() 和 tree(),但这两个函数似乎都不合适。 rpart() 使用 k 折交叉验证来验证最优成本复杂度参数 cp,而在 tree() 中,无法指定 cp 的值。
我知道 cv.tree() 通过交叉验证寻找 cp 的最佳值,但同样,cv.tee() 使用 k 折交叉验证。由于我有时间序列,因此有时间依赖性,我不想使用 k 折交叉验证,因为 k 折交叉验证会将数据随机分成 k 折,将模型拟合到 k-1 折并计算左边第k折的MSE,然后我的时间序列的序列显然被破坏了。
我找到了rpart()函数的一个参数,即xval,它应该让我指定交叉验证的次数,但是当我查看xval=0时rpart()函数调用的输出时,它似乎没有关闭交叉验证。下面你可以看到我的函数调用和输出:
tree.model= rpart(Close_5~ M+ DSMA+ DWMA+ DEMA+ CCI+ RSI+ DKD+ R+ FI+ DVI+
OBV, data= train.subset, method= "anova", control=
rpart.control(cp=0.01,xval= 0, minbucket = 5))
> summary(tree.model)
Call:
rpart(formula = Close_5 ~ M + DSMA + DWMA + DEMA + CCI + RSI +
DKD + R + FI + DVI + OBV, data = train.subset, method = "anova",
control = rpart.control(cp = 0.01, xval = 0, minbucket = 5))
n= 590
CP nsplit rel error
1 0.35433076 0 1.0000000
2 0.10981049 1 0.6456692
3 0.06070669 2 0.5358587
4 0.04154720 3 0.4751521
5 0.02415633 5 0.3920576
6 0.02265346 6 0.3679013
7 0.02139752 8 0.3225944
8 0.02096500 9 0.3011969
9 0.02086543 10 0.2802319
10 0.01675277 11 0.2593665
11 0.01551861 13 0.2258609
12 0.01388126 14 0.2103423
13 0.01161287 15 0.1964610
14 0.01127722 16 0.1848482
15 0.01000000 18 0.1622937
rpart() 似乎交叉验证了 15 个不同的 cp 值。如果这些值是用 k 折交叉验证来测试的,那么我的时间序列的顺序又会被破坏,我基本上不能使用这些结果。有谁知道如何有效地关闭 rpart() 中的交叉验证,或者如何改变 tree() 中 cp 的值?
更新:我听从了一位同事的建议并设置了 xval=1,但这似乎并没有解决问题。当 xval=1 here 时,您可以看到完整的函数输出。顺便说一句,parameters[j] 是参数向量的第 j 个元素。当我调用这个函数时,parameters[j]= 0.0009765625
在此先感谢
【问题讨论】:
-
您考虑过使用
caret包吗?它支持rolling forecasting origin techniques(以及许多其他有用的东西)。 -
您是如何设置数据的?您是否正在创建滞后变量并将它们作为特征包含在模型中?您是否将日期属性作为特征包括在内?请提供minimal, complete, and verifiable example。
rpart()中的cp参数是复杂度参数,它限制了必须在每个步骤中改进的整体失配。它会影响交叉验证的行为,但无论xval控制参数的值如何,它都会有所不同。 -
@LenGreski 感谢您的评论。我从比特币的开盘价、最高价、最低价和收盘价计算了 11 个技术指标,我将它们用作自变量。我没有将比特币价格本身的任何滞后值作为自变量。我至少花了 100 行代码来计算这些技术指标,那么您建议如何提供最小、完整和可验证的示例?如果有帮助,我绝对可以将数据框和我的整个代码上传到我的网站并将其链接到我的问题。然后,您可以重现该问题,但信息量很大。
-
@markus,感谢您的评论。我查看了 caret 包,它似乎可以做很多事情。我花了 15 分钟浏览它,但我没有找到任何关于回归树的信息。您能否提供一些伪代码,您将如何使用 caret 包来拟合回归树,同时关闭交叉验证并指定成本复杂性参数?
-
@KevinSüdmersen 也许
library(caret); fit <- train(x = x, y = y, method = "rpart", trControl = trainControl(method = "none"), metric = "RMSE", tuneGrid = data.frame(cp=0.01), preProcess = c("center", "scale"), xval = 0, minbucket = 5)。对于method = rpartcaret,让我们只在tuneGrid参数中调整(或修复)cp,而不是xval或minbucket,这就是我们需要通过...参数提供它们的原因。x是您的特征,y结果变量向量。希望这会有所帮助。
标签: r tree cross-validation rpart