【问题标题】:100-fold-cross-validation for Ridge Regression in RR 中岭回归的 100 倍交叉验证
【发布时间】:2016-09-10 16:49:22
【问题描述】:

我有一个庞大的数据集,而且我对 R 很陌生,所以我能想到自己实现 100 倍 CV 的唯一方法是通过许多 for 和 if 的方法,这对于我的庞大数据集来说效率极低,并且甚至可能需要几个小时来编译。我开始寻找执行此操作的软件包,并在 stackoverflow 上找到了很多与 CV 相关的主题,我一直在尝试使用我找到的那些,但没有一个对我有用,我想知道我做错了什么在这里。

例如,DAAG 包中的这段代码:

cv.lm(data=Training_Points, form.lm=formula(t(alpha_cofficient_values)
%*% Training_Points), m=100, plotit=TRUE)

..给我以下错误:

Error in formula.default(t(alpha_cofficient_values)
%*% Training_Points) : invalid formula

我正在尝试进行内核岭回归,因此我已经计算了 alpha 系数值。因此,为了获得预测,我只需要t(alpha_cofficient_values)%*% Test_Points 或简单地crossprod(alpha_cofficient_values,Test_Points),这将为我提供未知值的所有预测。所以我假设为了测试我的模型,我应该做同样的事情,但对于 KNOWN 值,因此我需要使用我的 Training_Points 数据集。

我的 Training_Points 数据集有 9000 列和 9000 行。我可以写for和if,每次做100倍CV,取100行作为test_data,留下8900行进行训练,直到整个数据集完成,然后取平均值,然后与我的已知值进行比较。但是没有一个包可以做同样的事情吗? (理想情况下,还可以将预测值与已知值进行比较并绘制它们,如果可能的话)

请原谅我的基本问题,我对 R 和交叉验证都很陌生,所以我可能会遗漏一些基本点。

【问题讨论】:

  • 我不太明白您是如何获得系数的,因为 100 种不同模型的系数会有所不同?那么你有一个 9000 x 100 的系数矩阵吗?
  • 你可以使用 caret 包(一旦我检查了运行需要多长时间,我会添加一个答案)。拥有 9k 个预测变量确实不可避免地会使其相当慢。需要做100折交叉验证吗? 10折合理吗?
  • 啊,插入符号没有内置内核岭回归。您必须添加它。

标签: r cross-validation


【解决方案1】:

CVST package实施fast cross-validation via sequential testing。此方法显着加速计算,同时保留完全交叉验证能力。辅助程序,包开发人员还添加了默认交叉验证功能。

我之前没有使用过包装,但它似乎非常灵活,也很直接。此外,通过constructKRRLearner() function,krr随时可用作CVST.learner object。 要使用横向功能,您必须首先使用constructData(x, y) 987654327 constructData(x, y) 987654328 @ the feature data和y 987654329。接下来,您可以使用其中一个交叉验证函数来优化定义的参数空间。您可以在您的喜好调整cvfastcv 987654331的设置。

交叉验证占用出最佳参数,您可以使用learn函数和随后predict新标签创建模型。 我困惑了Cran上的包文档中的一个例子。

# contruct CVST.data using constructData(x,y)
# constructData(x,y)

# Load some data..
ns = noisySinc(1000)
# Kernel ridge regression
krr = constructKRRLearner()
# Create parameter Space
params=constructParams(kernel="rbfdot", sigma=10^(-3:3), 
                       lambda=c(0.05, 0.1, 0.2, 0.3)/getN(ns))

# Run Crossval
opt = fastCV(ns, krr, params, constructCVSTModel())
# OR.. much slower!
opt = CV(ns, krr, params, fold=100)

# p = list(kernel=opt[[1]]$kernel, sigma=opt[[1]]$sigma, lambda=opt[[1]]$lambda)
p = opt[[1]]
# Create model
m = krr$learn(ns, p)
# Predict with model
nsTest = noisySinc(10000)
pred = krr$predict(m, nsTest)
# Evaluate..
sum((pred - nsTest$y)^2) / getN(nsTest)

如果需要进一步加速,则可以并行运行交叉验证。查看this post for doparallel package。

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 2015-01-11
    • 1970-01-01
    • 2021-05-06
    • 2017-01-25
    • 2018-09-12
    • 2016-09-30
    • 2016-06-27
    • 2013-12-22
    相关资源
    最近更新 更多