2

Ich habe einen Pandas DataFrame, der String- und Float-Spalten enthält, die in symmetrische Slices aufgeteilt werden müssen, um eine Sklearn-Pipeline zu trainieren.StratifiedKold über heterogenen Datenrahmen

Idealerweise würde ich StratifiedKFold über den Datenrahmen verwenden, um kleinere Datenblöcke zu erhalten, die überprüft werden sollen. Aber es beschwert sich, dass ich unorderable Typen haben, wie folgt aus:

import pandas as pd 
from sklearn.cross_validation import StratifiedKFold 

dataset = pd.DataFrame(
    [ 
     {'title': 'Dábale arroz a la zorra el abad', 'size':1.2, 'target': 1}, 
     {'title': 'Ana lleva al oso la avellana', 'size':1.0, 'target': 1}, 
     {'title': 'No te enrollé yornetón', 'size':1.4, 'target': 0}, 
     {'title': 'Acá sólo tito lo saca', 'size':1.4, 'target': 0}, 
    ]) 
skfs = StratifiedKFold(dataset, n_folds=2) 

>>> TypeError: unorderable types: str() > float() 

Es gibt Möglichkeiten, Falten Indizes zu erhalten und über die Datenrahmen tun schneiden, aber ich glaube nicht, dass garantiert, dass meine Klassen ausgeglichen werden werden.

Was ist die beste Methode zum Teilen meines Dataframe?

Antwort

4

StratifiedKFold nimmt die label als Eingabe. Angenommen, Ihre label ist target, würden Sie:

from sklearn.cross_validation import StratifiedKFold 
skf = StratifiedKFold(dataset.target, n_folds=2) 
for train_index, test_index in skf: 
    X_train, X_test = dataset.loc[train_index, ['title', 'size']], dataset.loc[test_index, ['title', 'size']] 
    Y_train, Y_test = dataset.loc[train_index, 'target'], dataset.loc[test_index, 'target'] 
+0

Veraltet seit Version 0.18: Dieses Modul wird in 0,20 entfernt. Verwenden Sie stattdessen sklearn.model_selection.StratiifiedKFold. – Matt

1

sklearn.cross_validation.StratifiedKFold seit Version 0.18 ist veraltet und wird in 0,20 entfernt werden. Hier ist ein alternativer Ansatz:

from sklearn.model_selection import StratifiedKFold 

skf = StratifiedKFold(n_splits=2) 
t = dataset.target 
for train_index, test_index in skf.split(np.zeros(len(t)), t): 
    train = dataset.loc[train_index] 
    test = dataset.loc[test_index] 
Verwandte Themen