2016-05-14 203 views
1

我有一個巨大的數據集,我對R很新,所以我能想到的自己實現100倍CV的唯一方法是通過許多for和如果這對我的龐大數據集來說效率極低,甚至可能需要幾個小時才能編譯。我開始尋找能夠做到這一點的軟件包,並且在stackoverflow上發現了很多與CV有關的主題,並且我一直在嘗試使用我發現的那些主題,但是他們都沒有爲我工作,我想知道我在做什麼錯誤這裏。R嶺迴歸的100倍交叉驗證

例如,從DAAG包驗證碼:

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

..gives我下面的錯誤:

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

我試圖做核嶺迴歸,所以我有阿爾法系數值已計算。因此,爲了得到預測結果,我只需要做t(alpha_cofficient_values)%*% Test_Points或簡單地crossprod(alpha_cofficient_values,Test_Points),這會給我所有對未知值的預測。所以我假設爲了測試我的模型,我應該做同樣的事情,但對於已知值,因此我需要使用我的Training_Points數據集。

我的Training_Points數據集有9000列和9000行。我可以編寫for和if,並且每次將100行作爲test_data執行100-fold並保留8900行進行訓練,直到整個數據集完成,然後取平均值,然後與我的已知值進行比較。但是沒有一套方案能做到這一點嗎? (如果可能,理想情況下也將預測值與已知值進行比較並繪製它們)

請原諒我的基本問題,我對R和交叉驗證都很新,所以我可能會缺少一些基本的點。

+0

我不太明白你是如何擁有係數的,因爲這100個不同的模型會有所不同。那麼你有9000×100的係數矩陣嗎? – timcdlucas

+0

您可以使用插入符號包(我會在檢查運行時間後添加一個答案)。具有9k個預測變量不可避免地使其變得相當緩慢。你需要做100倍交叉驗證嗎? 10倍合理嗎? – timcdlucas

+0

呵呵,caret並沒有內建的kernel ridge迴歸,你必須添加它。 – timcdlucas

回答

1

CVST package implements fast cross-validation via sequential testing。這種方法顯着加速了計算,同時保留了完整的交叉驗證功能。另外,軟件包開發者還添加了默認的交叉驗證功能。

我以前沒有使用過這個軟件包,但是它看起來非常靈活和簡單易用。此外,通過constructKRRLearner()函數,KRR可作爲CVST.learner對象輕鬆獲得。 要使用交叉閾值功能,您必須首先使用constructData(x, y)函數將數據轉換爲CVST.data對象,其中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包的示例。