sklearn preprocessing onehotencoder python multithreading numpy machine-learning scikit-learn

python - preprocessing - Multiprocesamiento scikit-learn



sklearn (2)

Tengo linearsvc trabajando contra el conjunto de entrenamiento y el conjunto de pruebas usando el método load_file . Estoy intentando que funcione en el entorno multiprocesador.

¿Cómo puedo hacer que el multiprocesamiento funcione en LinearSVC().fit() LinearSVC().predict() ? No estoy muy familiarizado con los tipos de datos de scikit-learn aún.

También estoy pensando en dividir muestras en matrices múltiples, pero no estoy familiarizado con las matrices numpy y las estructuras de datos scikit-learn.

Al hacer esto, será más fácil ponerlo en multiprocesamiento.pool (), con eso, dividir las muestras en trozos, entrenarlas y combinar el retroceso entrenado más tarde, ¿funcionaría?

EDITAR: Esta es mi situación:

digamos, tenemos 1 millón de archivos en el conjunto de muestra de capacitación, cuando queremos distribuir el procesamiento de Tfidfvectorizer en varios procesadores tenemos que dividir esas muestras (para mi caso, solo tendrá dos categorías, digamos 500000 muestras para entrenar) . Mi servidor tiene 24 núcleos con 48 GB, por lo que quiero dividir cada tema en una cantidad de fragmentos de 1000000/24 ​​y procesar Tfidfvectorizer en ellos. Al igual que haría con el conjunto de muestras de prueba, así como con SVC.fit () y decida (). ¿Tiene sentido?

Gracias.

PD: Por favor, no cierres esto.


Creo que usar SGDClassifier en lugar de LinearSVC para este tipo de datos sería una buena idea, ya que es mucho más rápido. Para la vectorización, sugiero que busque en el transformador hash PR .

Para el multiprocesamiento: puede distribuir los conjuntos de datos entre los núcleos, hacer partial_fit , obtener los vectores de ponderación, promediarlos, distribuirlos a los estimadores, hacer ajustes parciales de nuevo.

Hacer un descenso en gradiente paralelo es un área de investigación activa, por lo que no hay una solución preparada allí.

¿Cuántas clases tienen sus datos por cierto? Para cada clase, se formará a un separado (automáticamente). Si tiene casi tantas clases como núcleos, puede ser mejor y mucho más fácil hacer solo una clase por núcleo, especificando n_jobs en SGDClassifier.


Para los modelos lineales ( LinearSVC , SGDClassifier , Perceptron ...) puede dividir sus datos, entrenar modelos independientes en cada fragmento y construir un modelo lineal agregado (por ejemplo, SGDClasifier ) colocando en él los valores promedio de coef_ e intercept_ como atributos. El método de LinearSVC de LinearSVC , SGDClassifier , Perceptron calcula la misma función (predicción lineal utilizando un producto de punto con un umbral de intercept_ y soporte de multiclases de Uno contra todos), por lo que la clase de modelo específico que utiliza para mantener el coeficiente promedio no es importante.

Sin embargo, como se dijo anteriormente, el punto complicado es la paralelización de la extracción de características y el actual scikit-learn (versión 0.12) no proporciona ninguna forma de hacerlo fácilmente.

Editar : scikit-learn 0.13+ ahora tiene un vectorizador hash que no tiene estado.