2017-11-14 1 views
0

Ich habe einige Daten, für die ich ein paar verschiedene lineare Modelle vergleichen möchte. Ich kann caTools::sample.split() verwenden, um ein Training/Test-Set zu bekommen.Verschiedene Test- und Trainingssätze aus der gleichen Probe

Ich würde gerne sehen, wie sich das Modell ändern würde, wenn ich ein anderes Training/Test-Set aus der gleichen Probe verwendet hätte. Wenn ich set.seed() nicht verwende, sollte ich jedes Mal einen anderen Satz bekommen, wenn ich sample.split rufe.

ich lapply verwende jetzt die Funktion, um eine bestimmte Anzahl von Malen zu nennen:

library(data.table) 
library(caTools) 
dat <- as.data.table(iris) 
dat_list <- lapply(1:20, function(z) { 
    sample_indices <- sample.split(dat$Sepal.Length, SplitRatio = 3/4) 
    inter <- dat 
    inter$typ <- "test" 
    inter$typ[sample_indices] <- "train" 
    inter$set_no <- z 
    return(as.data.table(inter))}) 

Und zum Vergleich der Koeffizienten:

coefs <- sapply(1:20, function(z){ 
    m <- lm(Sepal.Length ~ Sepal.Width, data = dat_list[[z]][typ == "train"]) 
    return(unname(m$coefficients)) 
}) 

Die letzten Zeilen bearbeitet werden könnte zurückkehren RMS-Fehler bei der Vorhersage von Werten im Testset (typ=="test").

Ich frage mich, ob es eine bessere Möglichkeit gibt, dies zu tun?

+0

Eine bessere Art, was zu tun? Die Daten mehrfach teilen? Vergleichen von Koeffizienten? Annäherung an das Problem? Ich würde sagen, es geht dir gut, und wenn du mit dem Ergebnis zufrieden bist, geh weiter! Sie könnten stattdessen an k-facher Kreuzvalidierung interessiert sein - es ist häufiger und teilt ein ähnliches Ziel. Sie könnten es ziemlich automatisch mit 'caret' machen. – Gregor

+0

Danke! Ich bin daran interessiert, die Daten effizient zu teilen (mein tatsächlicher Datensatz ist ziemlich groß). Ich bin auch scharf darauf, zu wissen, ob es einen Standard Weg gibt, um Modelle auf diese Weise zu vergleichen - ich werde die k-fache Methode nachschlagen, die Sie erwähnt haben. Mein Wissen über Statistiken ist leider schlecht. – Gautam

Antwort

0

ich die Daten effizient zu spalten interessiert bin (meine eigentliche Datensatz ist ziemlich groß)

ich ein großer Verfechter von Listen von Datenrahmen bin, aber es macht keinen Sinn, zu Duplizieren Sie Ihre Daten in einer Liste - besonders wenn es sich um große Daten handelt, benötigen Sie nicht 20 Kopien Ihrer Daten für 20 Zug-Test-Splits.

Speichern Sie stattdessen einfach die Indizes des Zugs und der Testsätze und geben Sie dem Modell die entsprechende Teilmenge.

n = 5 
train_ind = replicate(n = n, sample(nrow(iris), size = 0.75 * nrow(iris)), simplify = FALSE) 
test_ind = lapply(train_ind, function(x) setdiff(1:nrow(iris), x)) 

# then modify your loop to subset the right rows 
coefs <- sapply(seq_len(n), function(z) { 
    m <- lm(Sepal.Length ~ Sepal.Width, data = iris[train_ind[[z]], ]) 
    return(m$coefficients) 
}) 

Es ist auch gut, alles zu parametrisieren, das mehr als einmal verwendet wird. Wenn Sie zu 20 Replikaten wechseln möchten, richten Sie Ihren Code so ein, dass Sie n = 20 an der Spitze ändern und nicht das ganze Ding durchgehen müssen, um jedes Mal, wenn Sie 5 verwendeten, es in 20 zu ändern. Es könnte schön sein, das split_ratio = 0.75 herauszuziehen und es oben auf seine eigene Linie zu legen, obwohl es nur einmal benutzt wird.

+0

Gute Idee, ich speichere stattdessen die Indizes! Jetzt geht es nur noch darum, die Modelle zu vergleichen. – Gautam

Verwandte Themen