R中岭回归的100倍交叉验证

时间:2016-05-14 14:22:04

标签: r cross-validation

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

例如,来自cv.lm(data=Training_Points, form.lm=formula(t(alpha_cofficient_values) %*% Training_Points), m=100, plotit=TRUE) package的代码:

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

..给了我以下错误:

t(alpha_cofficient_values)%*% Test_Points

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

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

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

1 个答案:

答案 0 :(得分:1)

CVST package实施fast cross-validation via sequential testing。此方法显着加快了计算速度,同时保留了完整的交叉验证功能。另外,软件包开发人员还添加了默认的交叉验证功能。

我之前没有使用过该软件包,但它似乎非常灵活且易于使用。此外,KRR可通过CVST.learner函数作为constructKRRLearner()对象随时使用。 要使用crossval功能,您必须先使用CVST.data功能将数据转换为constructData(x, y)对象,并使用x功能数据和y标签。接下来,您可以使用其中一个交叉验证函数来优化定义的参数空间。您可以根据自己的喜好调整cvfastcv方法的设置。

交叉验证吐出最佳参数后,您可以使用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以获取doparallel包的示例。