Estoy buscando hacer una clasificación en mis datos de texto. Tengo 300 classes
200 documentos de capacitación por clase (más o menos 60000 documents in total
) y es probable que esto genere datos dimensionales muy altos (es posible que estemos buscando más de 1 millón de dimensiones ).
Me gustaría realizar los siguientes pasos en la tubería (solo para darle una idea de cuáles son mis requisitos):
- Convertir cada documento en un vector de características (
tf-idf
ovector space model
) Feature selection
(Mutual Information
basado preferiblemente, o cualquier otro estándar)- El entrenamiento del clasificador (
SVM
,Naive Bayes
,Logistic Regression
oRandom Forest
) - Predicción de datos no vistos basados en el modelo de clasificador entrenado.
Entonces, la pregunta es ¿qué herramientas / marco utilizo para manejar datos tan dimensionales? Soy consciente de los sospechosos habituales (R, WEKA ...) pero hasta donde yo sé (puedo estar equivocado) posiblemente ninguno de ellos pueda manejar datos tan grandes. ¿Hay alguna otra herramienta lista para usar que pueda mirar?
Si tengo que paralelizarlo, ¿debería estar mirando Apache Mahout ? Parece que aún no puede proporcionar la funcionalidad que necesito.
Gracias a todos de antemano.
Actualización: busqué en este sitio web , en la lista de correo de R y en Internet en general. Me parece que los siguientes problemas podrían surgir en mi situación:
(1) El preprocesamiento de mis datos utilizando R ( paquete tm en particular) podría no ser práctico , ya tm
que será prohibitivamente lento.
(2) Dado que necesitaré usar un conjunto de paquetes R (preprocesamiento, matrices dispersas, clasificadores, etc.) la interoperabilidad entre los paquetes podría convertirse en un problema, y podría incurrir en una sobrecarga adicional al convertir datos de un formato a otro . Por ejemplo, si realizo mi preprocesamiento utilizando tm
(o una herramienta externa como WEKA), tendré que encontrar una manera de convertir estos datos en un formulario que las bibliotecas de HPC en R puedan leer. Y de nuevo, no me queda claro si los paquetes de clasificadores tomarían directamente los datos proporcionados por las bibliotecas de HPC.
¿Estoy en el camino correcto? Y lo más importante, ¿tengo sentido?
fuente
foreach
código paralelo de escritura de la biblioteca en R. Esto funciona especialmente bien en combinación con bosques aleatorios, que son inherentemente fáciles de paralelizar.Respuestas:
Esto debería ser posible para que funcione siempre y cuando los datos se representen como una estructura de datos dispersa, como la
scipy.sparse.csr_matrix
instancia en Python. Escribí un tutorial para trabajar en datos de texto . Es posible reducir aún más el uso de la memoria aprovechando el truco de hash: adaptarlo para usar el enHashingVectorizer
lugar delCountingVectorizer
o elTfidfVectorizer
. Esto se explica en la sección de documentación extracción de características de texto .Los bosques aleatorios son en general mucho más caros que los modelos lineales (como las máquinas de vectores de soporte lineal y la regresión logística) y los Bayes ingenuos multinomiales o de Bernoulli y para la mayoría de los problemas de clasificación de texto que no ofrecen una precisión predictiva significativamente mejor que los modelos más simples.
Si scikit-learn no puede adaptarse a su problema, Vowpal Wabbit lo hará (y probablemente más rápido que sklearn) aunque no implemente todos los modelos de los que está hablando.
Editado en abril de 2015 para reflejar el estado actual de la biblioteca scikit-learn y para corregir enlaces rotos.
fuente
Gensim para Python es mágico. Y como está en Python, puede usarlo junto con la sugerencia de @ ogrisel.
fuente
No para sonar mi propia bocina, pero hice una serie de videos bastante popular sobre análisis de texto con Rapidminer. Puedes verlo aqui:
http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html
Es probable que pueda evitar la selección de funciones, solo use un clasificador que no cree una matriz de millones * millones en la memoria :)
La regresión logística se ahogará en tantas dimensiones. Naive Bayes asume dimensiones independientes, por lo que estará bien. SVM no depende de la cantidad de dimensiones (sino de la cantidad de vectores de soporte), por lo que también estará bien.
Sin embargo, 300 son muchas clases. Comenzaría con solo unos pocos y avanzaría.
fuente
Primero, según sus comentarios, trataría esto como 300 problemas de clasificación binarios (sí / no). Hay muchos aprendices de clasificadores binarios de código abierto fáciles de usar, y esto le permite cambiar el tiempo por la memoria.
Los SVM y la regresión logística son probablemente los enfoques más populares para la clasificación de texto. Ambos pueden manejar fácilmente 1000000 dimensiones, ya que las implementaciones modernas usan estructuras de datos dispersas e incluyen configuraciones de regularización que evitan el sobreajuste.
Varios paquetes de aprendizaje automático de código abierto, incluidos WEKA y KNIME , incluyen SVM y regresión logística. Las implementaciones independientes de SVM incluyen libSVM y SVMlight . Para la regresión logística, conectaré BXRtrain y BXRclassify , que desarrollé con Madigan, Genkin y otros. BXRclassify puede construir un índice en memoria de miles de modelos de regresión logística y aplicarlos simultáneamente.
En cuanto a la conversión de texto a forma de vector de atributo, de alguna manera siempre termino escribiendo un poco de Perl para hacerlo desde cero. :-) Pero creo que las suites de aprendizaje automático que mencioné incluyen tokenización y código de vectorización. Otra ruta sería ir con más herramientas de lenguaje natural como LingPipe , aunque eso puede ser excesivo para usted.
fuente
Desde Sklearn 0.13 existe una implementación del HashingVectorizer .
EDITAR: Aquí hay un ejemplo completo de dicha aplicación de sklearn docs
Básicamente, este ejemplo demuestra que puede clasificar el texto en datos que no pueden caber en la memoria principal de la computadora (sino en el disco / red / ...).
fuente