Sklearn SGDClassifier ajuste parcial


Estoy tratando de usar SGD para clasificar un conjunto de datos grande. Como los datos son demasiado grandes para caber en la memoria, me gustaría usar el método partial_fit para entrenar al clasificador. He seleccionado una muestra del conjunto de datos (100.000 filas) que cabe en la memoria para probar fit vs. partial_fit :

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))

Luego pruebo ambos clasificadores con un conjunto de prueba idéntico. En el primer caso obtengo una precisión del 100%. Según entiendo, SGD por defecto pasa 5 veces sobre los datos de entrenamiento (n_iter = 5).

En el segundo caso, tengo que pasar 60 veces sobre los datos para alcanzar la misma precisión.

¿por Qué esta diferencia (5 vs 60)? O estoy haciendo algo mal?

Author: David M., 2014-07-07

1 answers

Finalmente he encontrado la respuesta. Necesita barajar los datos de entrenamiento entre cada iteración, ya que la configuración barajar=True al instanciar el modelo NO barajará los datos cuando use partial_fit (solo se aplica a fit). Nota: habría sido útil encontrar esta información en el sklearn.linear_model.SGDClassifier page .

El código modificado dice lo siguiente:

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))
 51
Author: David M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-15 09:51:27