2016-04-15 3 views
0

Ich habe versucht, eine Funktion zu erstellen, die geschichtete Proben aus einem Dataset erzeugt (wie sklearn hat keine solche Funktion) und ich bin gekommen mit einer.Pandas Slice von [] wirft Index außerhalb der Grenzen Fehler, aber .ix nicht

Die Funktion unter den Indizes erzeugt und ich habe gehofft, dass die ursprünglichen Daten-Set mit, dass schneiden, aber aus irgendeinem Grunde, wenn es kommt zur

sampleData = dataset[indexes] 

Linie, wirft es ein

IndexError: indices are out-of-bounds 

Error. Jedoch

sampleData = dataset.ix[indexes] 

funktioniert. Ich habe jedoch das Gefühl, dass dies falsch ist und meine späteren Prozesse vermasselt. Hat jemand eine Idee? :)

Hier ist der vollständige Code bis zu diesem Punkt:

def stratifiedSampleGenerator(dataset,target,subsample_size=0.1): 
    print('Generating stratified sample of size ' + str(round(len(dataset)*subsample_size,2))) 
    dic={} 
    indexes = np.array([]) 
    # find number of classes in sample 
    for label in target.unique(): 
     labelSize = len(target[target==label]) 
     dic[label] = int(labelSize * subsample_size) 
    # make a dataset of size sizeSample with ratio of classes in dic 
    for label in dic: 
     classIndex = target[target==label].index #obtain indexes of class 
     counts = dic[label] #get number of times class occurs 
     newIndex = np.random.choice(classIndex,counts,replace=False) 
     indexes = np.concatenate((indexes,newIndex),axis=0) 

    indexes = indexes.astype(int) 
    sampleData = dataset[indexes] #throws error 
    sampleData = dataset.ix[indexes] #doesnt 

Dank! :)

Antwort

1

In der Tat sklearnhat eine Möglichkeit, einen Datensatz in einer geschichteten Art und Weise zu teilen.

Würde so etwas in Ihrem Fall nicht ausreichen?

from sklearn.cross_validation import train_test_split 

dataset = ['A']*100 + ['B']*20 + ['C']*10 
target = [0]*100 + [1]*20 + [2]*10 
X_fit,X_eval,y_fit,y_eval= train_test_split(dataset,target,test_size=0.1,stratify=target) 
print X_eval.count('A') # output: 10 
print X_eval.count('B') # output: 2 
print X_eval.count('C') # output: 1 

Überprüfen Sie die Dokumentation hier: http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html

+0

Hiya, was im suchen ist eine geschichtete Stichprobe. Wenn es nicht falsch ist, erzeugt diese Funktion in sklearn geschichtete Falten für den gesamten Datensatz. So sind die Größen immer noch gleich. ZB ursprüngliche Daten-Set: 100A 20B 10C geschichtete Stichprobe: 10A 2B 1C – Wboy

+0

in meinem Beispiel 'X_eval' und' y_eval' eine geschichtete Substichprobe von Größe 0,1 * total_dataset_size enthalten. Willst du das nicht? –

+0

gerade aktualisiert das Beispiel, können Sie es sofort ausführen, auch die Ausgänge gedruckt, so dass Sie sehen können, dass es die Subsample-Größe, aber es behält die Proportionen –

Verwandte Themen