2016-05-14 17 views
1

Ich habe einen riesigen Datensatz, und ich bin ziemlich neu in R, so ist die einzige Art und Weise, wie ich 100-fach-CV durch mich implementieren kann durch viele für und If's macht es extrem ineffizient für meine riesige Datenmenge und könnte sogar mehrere Stunden dauern, um zu kompilieren. Ich begann nach Paketen zu suchen, die das tun und fand ziemlich viele Themen im Zusammenhang mit CV auf Stackoverflow, und ich habe versucht, diejenigen zu verwenden, die ich gefunden habe, aber keiner von ihnen funktioniert für mich, ich würde gerne wissen, was ich falsch mache Hier.100-fach-Kreuzvalidierung für Ridge-Regression in R

Zum Beispiel dieser Code aus DAAG Paket:

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

..gives mir folgende Fehlermeldung:

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

Ich versuche Kernel Ridge Regression zu tun, deshalb habe ich alpha Koeffizient Werte bereits berechnet. Um Vorhersagen zu erhalten, muss ich entweder nur t(alpha_cofficient_values)%*% Test_Points oder einfach crossprod(alpha_cofficient_values,Test_Points) eingeben und dies gibt mir alle Vorhersagen für unbekannte Werte. Ich gehe also davon aus, dass ich, um mein Modell zu testen, dasselbe tun sollte, außer für BEKANNTE Werte, daher muss ich meinen Training_Points-Datensatz verwenden.

Mein Training_Points-Datensatz hat 9000 Spalten und 9000 Zeilen. Ich kann für's schreiben und wenn und 100-fache-CV jedes Mal 100 Zeilen als test_data machen und 8900 Zeilen für das Training lassen und dies tun, bis der ganze Datensatz fertig ist, dann Durchschnittswerte nehmen und dann mit meinen bekannten Werten vergleichen. Aber gibt es kein Paket, um das Gleiche zu tun? (und im Idealfall auch die vorhergesagten Werte mit bekannten Werten vergleichen und sie wenn möglich grafisch darstellen)

Entschuldigen Sie bitte meine elementare Frage, ich bin sehr neu in der R- und Kreuzvalidierung, also könnte mir etwas Grundlegendes fehlen Punkte.

+0

Ich verstehe nicht ganz, wie Sie bereits die Koeffizienten haben, da diese für die 100 verschiedenen Modelle unterschiedlich sein werden? Also haben Sie eine 9000 x 100 Matrix von Koeffizienten? – timcdlucas

+0

Sie könnten das Caret-Paket verwenden (ich werde eine Antwort hinzufügen, sobald ich überprüft habe, wie lange es dauert, um zu laufen). 9k Prädiktorvariablen machen es unweigerlich ziemlich langsam. Müssen Sie eine 100-fache Kreuzvalidierung durchführen? Wäre 10 fach vernünftig? – timcdlucas

+0

Ach, Caret hat keine Kernel-Ridge-Regression eingebaut. Sie müssten es hinzufügen. – timcdlucas

Antwort

1

Die CVST package implementiert fast cross-validation via sequential testing. Diese Methode beschleunigt die Berechnungen erheblich und behält dabei die volle Fähigkeit zur Kreuzvalidierung bei. Zusätzlich haben die Paketentwickler auch eine Standard-Kreuzvalidierungsfunktion hinzugefügt.

Ich habe das Paket vorher nicht benutzt, aber es scheint ziemlich flexibel und einfach zu verwenden. Darüber hinaus ist KRR ohne weiteres als ein CVST.learner Objekt durch die constructKRRLearner() Funktion verfügbar. Um die crossval-Funktionalität zu verwenden, müssen Sie zuerst Ihre Daten in ein CVST.data-Objekt konvertieren, indem Sie die constructData(x, y)-Funktion verwenden, mit x die Feature-Daten und y die Beschriftungen. Als Nächstes können Sie eine der Kreuzvalidierungsfunktionen verwenden, um über einen definierten Parameterraum zu optimieren. Sie können die Einstellungen der cv oder fastcv Methoden nach Ihren Wünschen optimieren.

Nachdem die Kreuzvalidierung die optimalen Parameter ausgegeben hat, können Sie das Modell erstellen, indem Sie die learn-Funktion und anschließend predict neue Beschriftungen verwenden. Ich habe ein Beispiel aus der Paketdokumentation zu CRAN zusammen gerätselt.

# 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) 

Wenn eine weitere Beschleunigung erforderlich ist, können Sie die Kreuzvalidierungen parallel ausführen. Ansicht this post für ein Beispiel des doparallel Pakets.