2013-11-04 17 views
15
durch

Ich kann keine Methode zur Durchführung einer Kreuzvalidierung für ein zufälliges Regressionsmodell finden, das ich erstellen möchte.So führen Sie eine zufällige Gesamtstruktur-/Kreuzvalidierung in R

Also habe ich einen Datensatz mit 1664 erklärenden Variablen (verschiedene chemische Eigenschaften), mit einer Antwortvariable (Retentionszeit). Ich versuche ein Regressions-Waldmodell zu erstellen, um die chemischen Eigenschaften von etwas aufgrund seiner Retentionszeit vorhersagen zu können.

ID RT (seconds) 1_MW 2_AMW 3_Sv 4_Se 
4281 38 145.29 5.01 14.76 28.37 
4952 40 132.19 6.29 11 21.28 
4823 41 176.21 7.34 12.9 24.92 
3840 41 174.24 6.7 13.99 26.48 
3665 42 240.34 9.24 15.2 27.08 
3591 42 161.23 6.2 13.71 26.27 
3659 42 146.22 6.09 12.6 24.16 

Dies ist ein Beispiel für die Tabelle, die ich habe. Ich möchte RT gegen 1_MW usw. darstellen (bis zu 1664 Variablen), damit ich herausfinden kann, welche dieser Variablen wichtig sind und welche nicht.

ich tun: -

r = randomForest(RT..seconds.~., data = cadets, importance =TRUE, do.trace = 100) 
varImpPlot(r) 

, die mir sagt, welche Variablen von Bedeutung ist und was nicht, was toll ist. Ich möchte jedoch in der Lage sein, meine Datenmenge zu partitionieren, damit ich eine Kreuzvalidierung durchführen kann. Ich fand ein Online-Tutorial, das erklärte, wie man es macht, aber für ein Klassifizierungsmodell statt Regression.

Ich verstehe, was Sie tun: -

k = 10 
n = floor(nrow(cadets)/k) 
i = 1 
s1 = ((i-1) * n+1) 
s2 = (i * n) 
subset = s1:s2 

zu definieren, wie viele Querfalten Sie tun wollen, und die Größe jeder Falte, und die Anfangs- und Endwert der Teilmenge einzustellen. Ich weiß jedoch nicht, was ich danach machen soll. Mir wurde gesagt, ich solle durchgehen, aber ich habe wirklich keine Ahnung, wie ich das machen soll. Ich weiß auch nicht, wie ich dann den Validierungssatz und den Testsatz auf den gleichen Graphen auftrage, um den Grad der Genauigkeit/des Fehlers darzustellen.

Wenn Sie mir bitte damit helfen könnten, wäre ich Ihnen so dankbar, danke!

+0

Wenn Sie noch Interesse an CV in R gibt es mindestens Paar: [caret] (http://cran.r-project.org/web/packages/caret/caret.pdf) und [cvTools ] (http://cran.r-project.org/web/packages/cvTools/cvTools.pdf) – topchef

Antwort

0

Dies ist in Python mit der scikit-learn-Bibliothek (http://scikit-learn.org/stable/modules/cross_validation.html) schneller und einfacher. Sie können eine K-fache Validierung durchführen, eine geschichtete K-Falte (die sicherstellt, dass die Klassen gleichmäßig in jeder der Faltungen verteilt sind), eine auslassen und andere.

Es ist auch sehr einfach, die ROC-Kurve, Feature-Importanzen und andere Bewertungsmetriken zu generieren.

Hier ist ein kurzes Beispiel:

y = data[1:, 0].astype(np.float) 
X = data[1:, 1:].astype(np.float) 
cv = StratifiedKFold(y, n_folds = 5) 

precision = [] 
accuracy = [] 
sensitivity = [] 
matthews = [] 
r2   = [] 
f1   = [] 
auroc  = [] 
cm   = [[0, 0], [0, 0]] 

for i, (train, test) in enumerate(cv): 
    probas_  = rf.fit(X[train], y[train]).predict_proba(X[test]) 
    classes  = rf.fit(X[train], y[train]).predict(X[test]) 
    r2   = np.append(r2, (r2_score(y[test], probas_[:, 1]))) 
    precision = np.append(precision, (precision_score(y[test], classes))) 
    auroc  = np.append(auroc, (roc_auc_score(y[test], classes))) 
    accuracy = np.append(accuracy, (accuracy_score(y[test], classes))) 
    sensitivity = np.append(sensitivity, (recall_score(y[test], classes))) 
    f1   = np.append(f1, (f1_score(y[test], classes))) 
    matthews = np.append(matthews, (matthews_corrcoef(y[test], classes))) 
    cma   = np.add(cma, (confusion_matrix(y[test], classes))) 

cma   = np.array(cma) 
r2   = np.array(r2) 
precision = np.array(precision) 
accuracy = np.array(accuracy) 
sensitivity = np.array(sensitivity) 
f1   = np.array(f1) 
auroc  = np.array(auroc) 
matthews = np.array(matthews) 

print("KF Accuracy: %0.2f (+/- %0.2f)" % (accuracy.mean(), accuracy.std() * 2)) 
print("KF Precision: %0.2f (+/- %0.2f)" % (precision.mean(), precision.std() * 2)) 
print("KF Sensitivity: %0.2f (+/- %0.2f)" % (sensitivity.mean(), sensitivity.std() * 2)) 
print("KF R^2: %0.2f (+/- %0.2f)" % (r2.mean(), r2.std() * 2)) 
print("KF F1: %0.2f (+/- %0.2f)" % (f1.mean(), f1.std() * 2)) 
print("KF AUROC: %0.2f (+/- %0.2f)" % (auroc.mean(), auroc.std() * 2)) 
print("KF Matthews: %0.2f (+/- %0.2f)" % (matthews.mean(), matthews.std() * 2)) 
print("Confusion Matrix", cma) 
+5

Wie könnte dies auch die akzeptierte Antwort sein, fragte der Benutzer eine Antwort mit R, beantwortet Sie mit Python .... –

28

Vom source:

Die Out-of-bag (OOB) -Fehler

In Zufall Wäldern schätzen, gibt es keine Notwendigkeit für die Kreuzvalidierung ist oder einen separater Test auf eine unverzerrte Schätzung des Testmengenfehlers erhalten. Es wird intern, während des Laufes geschätzt ...

Insbesondere predict.randomForest gibt die out-of-Tasche Vorhersage wenn newdata nicht gegeben ist.

10

Als TopChef pointed out, Kreuzvalidierung ist nicht notwendig als Schutz gegen Überanpassung. Dies ist ein nettes Feature des Random Forest-Algorithmus.

Es klingt wie Ihr Ziel ist Feature-Auswahl, Kreuzvalidierung ist immer noch nützlich für diesen Zweck. Sehen Sie sich die Funktion rfcv() im Paket randomForest an. Dokumentation spezifiziert Eingabe eines Datenrahmens & Vektor, also fange ich an, indem ich jene mit Ihren Daten herstelle.

set.seed(42) 
x <- cadets 
x$RT..seconds. <- NULL 
y <- cadets$RT..seconds. 

rf.cv <- rfcv(x, y, cv.fold=10) 

with(rf.cv, plot(n.var, error.cv)) 
+2

macht diese Funktion wirklich Kreuzvalidierung? Zeigt es nicht den Fehler in Bezug auf die Menge der verwendeten Variablen? – marbel

Verwandte Themen