Descenso por lotes con scikit learn (sklearn)

Estoy jugando con un clasificador de Regresión logística uno-contra-todos usando Scikit-Learn (sklearn). Tengo un conjunto de datos grande que es demasiado lento para ejecutarlo todo de una vez; También me gustaría estudiar la curva de aprendizaje a medida que avanza la formación.

Me gustaría usar el descenso de gradiente por lotes para entrenar a mi clasificador en lotes de, digamos, 500 muestras. ¿Hay alguna forma de usar sklearn para hacer esto, o debo abandonar sklearn y “rodar el mío”?

Esto es lo que tengo hasta ahora:

from sklearn.linear_model import LogisticRegression from sklearn.multiclass import OneVsRestClassifier # xs are subsets of my training data, ys are ground truth for same; I have more # data available for further training and cross-validation: xs.shape, ys.shape # => ((500, 784), (500)) lr = OneVsRestClassifier(LogisticRegression()) lr.fit(xs, ys) lr.predict(xs[0,:]) # => [ 1.] ys[0] # => 1.0 

Es decir, identifica correctamente una muestra de entrenamiento (sí, me doy cuenta de que sería mejor evaluarla con datos nuevos; esto es solo una prueba de humo rápida).

Re descendiente de degradado por lotes: no he llegado tan lejos como para crear curvas de aprendizaje, pero ¿se puede simplemente ejecutar el fit repetidamente en subconjuntos subsiguientes de los datos de entrenamiento? ¿O hay alguna otra función para entrenar en lotes? La documentación y Google guardan bastante silencio al respecto. ¡Gracias!

Lo que desea no es un descenso de gradiente de lotes, sino un descenso de gradiente estocástico; el aprendizaje por lotes significa aprender en todo el conjunto de entrenamiento de una sola vez, mientras que lo que describe se denomina apropiadamente aprendizaje de minibatch. Se implementa en sklearn.linear_model.SGDClassifier , que se ajusta a un modelo de regresión logística si le da la opción loss="log" .

Con SGDClassifier , al igual que con LogisticRegression , no hay necesidad de envolver el estimador en un OneVsRestClassifier ; ambos hacen el entrenamiento de uno contra todos fuera de la caja.

 # you'll have to set a few other options to get good estimates, # in particular n_iterations, but this should get you going lr = SGDClassifier(loss="log") 

Luego, para entrenar en minibatches, use el método partial_fit lugar de fit . La primera vez, debe alimentarlo con una lista de clases porque no todas las clases pueden estar presentes en cada minibatch:

 import numpy as np classes = np.unique(["ham", "spam", "eggs"]) for xs, ys in minibatches: lr.partial_fit(xs, ys, classes=classes) 

(Aquí, estoy pasando classes para cada minibatch, lo cual no es necesario pero tampoco duele y hace que el código sea más corto).