2016-06-19 6 views
0

ich SKlearn KFold bin mit wie folgt:bestimmte Indizes von einem KFold Split in Python SKlearn

 kf = KFold(10000, n_folds=5, shuffle=True, random_state=88) 

Allerdings habe ich bestimmte Indizes ausschließen wollen von der Ausbildung Falten (nur). Wie kann dies erreicht werden? Vielen Dank.

Ich frage mich, ob dies mit sklearn.cross_validation.PredefinedSplit erreicht werden kann?


Update: Die KFold Instanz wird mit XGBoost für die Falten Parameter von xgb.cv. verwendet werden Die Python-API here gibt an, dass Falten "eine KFold- oder eine StratifiedKFold-Instanz" sein sollten.

Ich werde aber versuchen, die KFolds wie oben zu erzeugen, Iterieren über die Bahn fold Indizes, ändern sie, und dann eine custom_cv von Hand wie folgt definieren:

custom_cv = zip(train_indices, test_indices) 
+0

Was meinst du mit „sie zum KFold Objekt zurückgeben“ ? Was versuchst du zu erreichen? –

+0

Der KFold wird an XGBoost für xgb.cv übergeben. Ich muss bestimmte Indizes aus den Trainingsfalten entfernen, bevor ich die KFold-Instanz an xgb übergebe. –

+0

Ich bin mir immer noch nicht sicher, was Sie meinen, indem Sie sie an das KFold-Objekt zurückgeben. –

Antwort

0

Wenn Sie von der entfernen Indizes wollen Ausbildung gesetzt, aber es ist in Ordnung, wenn sie bei der Prüfung festgelegt sind, dann wird dieser Ansatz funktionieren:

kf_list = list(kf) 

Dies wird eine Liste von Tupeln zurück, die auf die gleiche Art und Weise iteriert als KFold Instanz werden kann. Sie können dann die Indizes einfach ändern, wie Sie es für richtig halten, und Ihre KFold-Instanz bleibt unberührt. Sie können sich ein KFold-Objekt als ein Array von ganzen Zahlen vorstellen, die die Indizes darstellen, und Methoden, mit denen Sie die Falten im laufenden Betrieb erzeugen können.

Hier ist der Quellcode, der ziemlich einfach ist, für den fleischigen Teil davon, wie das Iterator-Protokoll implementiert wird:

https://github.com/scikit-learn/scikit-learn/blob/51a765a/sklearn/cross_validation.py#L254

def _iter_test_indices(self): 
    n = self.n 
    n_folds = self.n_folds 
    fold_sizes = (n // n_folds) * np.ones(n_folds, dtype=np.int) 
    fold_sizes[:n % n_folds] += 1 
    current = 0 
    for fold_size in fold_sizes: 
     start, stop = current, current + fold_size 
     yield self.idxs[start:stop] 
     current = stop 
+0

Ändert das Ändern der kf_list auch die KFold-Instanz? Wenn list() nur eine Kopie erstellt und die KFold-Instanz unverändert bleibt, werden die Änderungen nicht an xgb übergeben. Vielen Dank. –

+0

Nein, tut es nicht. Aber warum fragst du? –

+0

Wie gesagt, ich werde die KFold-Instanz an XGBoost übergeben. Diese Falten werden dann in der Kreuzvalidierung verwendet. Wenn die KFold-Instanz unverändert bleibt, hilft das nicht. Ich muss die spezifischen Indizes von der Kreuzvalidierung ausschließen. –