2016-04-24 14 views
0

Meine Daten eine Spalte pid und Datensätze mit denselben pid genannt sollte nicht zwischen Zug-Test Splits durchgesickert sein. Ich habe eine 2-Schichten gestapelt model -verschachtelte Kreuzvalidierung mit benutzerdefinierter Faltung

  • innere Schicht bildet einen inneren-Prädiktionsvektor durch Kreuz val-Vorhersage auf den Bahndaten
  • I dann ein externes Modell auf den ursprünglichen Zug-Daten aufzubauen + interner Prädiktionsvektor
  • ich dann Leistung auf den

Testdaten beurteilen sollte Dieser Prozess X5 wiederholt werden.

Der beste Weg, an den ich denken konnte, wurde durch pid % 25 in der externen Schicht und pid % 5 in der internen Schicht geteilt.

Der Code kam umständlich und nicht sehr pythonisch. Gibt es einen besseren Weg, das zu tun? Fehle ich eine saubere und saubere Verwendung von Sklearn/Python oder gibt es einen grundlegenden Fehler in meinem Design?

N = 5 

for external_fold in range(N): 

    ex_test = [x for x in range(N**2) if external_fold*N <= x % (N**2) < (external_fold+1)*N] 
    ex_train = [x for x in range(N**2) if x not in ex_test] 
    ex_train_index = X[(X.pid % N**2).isin(ex_train)].index 
    ex_test_index = X[(X.pid % N**2).isin(ex_test)].index 
    ... 
    for internal_fold in range(N): 
     in_train_index = X[(X.pid % N)!=internal_fold].index 
     in_test_index = X[(X.pid % N)==internal_fold].index 
     # build a vector of internal model predictions 

    # build external model and assess performance 
+0

Verwenden Sie ['skelarn.cross_validation.KFold'] (http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html#sklearn.cross_validation.KFold), anstatt zu versuchen, Ihre eigene Lösung könnte ein besserer Ansatz sein. – ChrisP

Antwort

1

Sie haben zwei Bedürfnisse, die erst vor kurzem in angesprochenen Scikit-Learn und sollen in der nächsten veröffentlichten Version enthalten sein:

Kreuzvalidierung Strategien mit korrelierten Proben zusammengehalten

die neuen CV splitter classes sind jetzt LabelKFold und LabelShuffleSplit beide entworfen, den Fall zu behandeln Sie überlegen, wo Elemente mit den gleichen pid im gleichen Testbereich sein sollten.

Nested Kreuzvalidierung

Die Kreuzvalidierung Iterator API hat zur besseren Unterstützung verschachtelt Kreuzvalidierung neu gestaltet. Sie sollten datenabhängige Parameter nicht mehr an einen Kreuzvalidierungsstrategiekonstruktor übergeben müssen. Somit sollte ein GridSearchCV innerhalb einer GridSearchCV, jede mit ihren eigenen cv Parameter verschachtelt werden, sollte Ihre Bedürfnisse erfüllen.

Bitte beachten Sie, dass dieser API noch sehr frisch und offen für Veränderungen ist.