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?
Geben 'verbose = 1 'an den SGD-Konstruktor, dass Sie einen Hinweis geben kann. –
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 –
Der durchschnittliche Verlust. Überprüfen Sie, ob es im Stapelfall schneller fällt. –