2014-07-07 13 views
27

Ich versuche SGD zu verwenden, um einen großen Datensatz zu klassifizieren. Da die Daten zu groß sind, um in den Speicher zu passen, möchte ich die Methode partial_fit verwenden, um den Klassifizierer zu trainieren. Ich habe eine Probe des Datensatzes (100.000 Zeilen) ausgewählt, die in den Speicher passt fit vs. partial_fit zu testen:Sklearn SGDClassifier partielle Anpassung

from sklearn.linear_model import SGDClassifier 

def batches(l, n): 
    for i in xrange(0, len(l), n): 
     yield l[i:i+n] 

clf1 = SGDClassifier(shuffle=True, loss='log') 
clf1.fit(X, Y) 

clf2 = SGDClassifier(shuffle=True, loss='log') 
n_iter = 60 
for n in range(n_iter): 
    for batch in batches(range(len(X)), 10000): 
     clf2.partial_fit(X[batch[0]:batch[-1]+1], Y[batch[0]:batch[-1]+1], classes=numpy.unique(Y)) 

I dann testen beide Klassifikatoren mit einem identischen Test-Set. Im ersten Fall bekomme ich eine Genauigkeit von 100%. Wie ich es verstehe, übergibt SGD standardmäßig 5 mal über die Trainingsdaten (n_iter = 5).

Im zweiten Fall muss ich 60 mal über die Daten gehen, um die gleiche Genauigkeit zu erreichen.

Warum dieser Unterschied (5 vs. 60)? Oder mache ich etwas falsch?

+0

Geben 'verbose = 1 'an den SGD-Konstruktor, dass Sie einen Hinweis geben kann. –

+0

Erster Fall (Fit) endet mit "- Epoche 5 Norm: 29,25, NNZs: 300, Voreinstellung: -1,674706, T: 459595, Durchschn. Verlust: 0,076786". Der zweite Fall (partial_fit) endet nach 10 Durchläufen mit "- Epoche 1 Norm: 22.99, NNZs: 300, Vorkommen: -1.999685, T: 1918, Durchschn. Verlust: 0.089302". Nach was soll ich suchen? thx –

+0

Der durchschnittliche Verlust. Überprüfen Sie, ob es im Stapelfall schneller fällt. –

Antwort

46

Ich habe endlich die Antwort gefunden. Sie müssen die Trainingsdaten zwischen jeder Iteration Shuffle, als Einstellung Shuffle = True, wenn das Modell instanziieren werden die Daten nicht mischen bei der Verwendung von partial_fit (es gilt nur für passen). Hinweis: Es wäre hilfreich gewesen, diese Informationen auf der sklearn.linear_model.SGDClassifier page zu finden.

Der geänderte Code lautet wie folgt:

from sklearn.linear_model import SGDClassifier 
import random 
clf2 = SGDClassifier(loss='log') # shuffle=True is useless here 
shuffledRange = range(len(X)) 
n_iter = 5 
for n in range(n_iter): 
    random.shuffle(shuffledRange) 
    shuffledX = [X[i] for i in shuffledRange] 
    shuffledY = [Y[i] for i in shuffledRange] 
    for batch in batches(range(len(shuffledX)), 10000): 
     clf2.partial_fit(shuffledX[batch[0]:batch[-1]+1], shuffledY[batch[0]:batch[-1]+1], classes=numpy.unique(Y))