Estoy tratando de ponerme al día con R. Finalmente, quiero usar las bibliotecas R para hacer la clasificación de texto. Me preguntaba cuáles son las experiencias de las personas con respecto a la escalabilidad de R cuando se trata de hacer una clasificación de texto.
Es probable que me encuentre con datos de altas dimensiones (~ 300k dimensiones). Estoy mirando el uso de SVM y Random Forest en particular como algoritmos de clasificación.
¿Las bibliotecas R se adaptarían al tamaño de mi problema?
Gracias.
EDITAR 1: Solo para aclarar, es probable que mi conjunto de datos tenga 1000-3000 filas (quizás un poco más) y 10 clases.
EDIT 2: como soy muy nuevo en R, solicitaré que los carteles sean más específicos siempre que sea posible. Por ejemplo, si está sugiriendo un flujo de trabajo / tubería, asegúrese de mencionar las bibliotecas R involucradas en cada paso si es posible. Algunos indicadores adicionales (a ejemplos, código de muestra, etc.) serían la guinda del pastel.
EDITAR 3: Primero, gracias a todos por sus comentarios. Y en segundo lugar, me disculpo, quizás debería haber dado más contexto para el problema. Soy nuevo en R pero no tanto en la clasificación de texto. Ya he realizado el preprocesamiento (derivación, eliminación de palabras vacías, conversión de tf-idf, etc.) en mi parte de mis datos usando el paquete tm , solo para tener una idea de las cosas. tm fue tan lento incluso con unos 200 documentos que me preocupaba la escalabilidad. Luego comencé a jugar con FSelector e incluso eso fue muy lento. Y ese es el punto en el que hice mi OP.
EDITAR 4: Se me ocurrió que tengo 10 clases y aproximadamente ~ 300 documentos de capacitación por clase, y de hecho estoy construyendo la matriz termXdoc a partir de todo el conjunto de capacitación, lo que resulta en una dimensionalidad muy alta. Pero, ¿qué hay de reducir cada problema de clasificación 1 fuera de k a una serie de problemas de clasificación binaria? Eso reduciría drásticamente la cantidad de documentos de capacitación (y por lo tanto la dimensionalidad) en cada uno de los pasos k-1 considerablemente, ¿no? Entonces, ¿este enfoque es bueno? ¿Cómo se compara en términos de precisión con la implementación habitual de varias clases?
Respuestas:
Como se solicitó en un comentario, aquí hay algunos consejos para procesar los pasos. Se pueden encontrar varias herramientas en la vista de tareas CRAN para el procesamiento del lenguaje natural . También es posible que desee ver en este documento en el
tm
paquete (minería de texto) para R .openNLP
(para el que hay un paquete R) es una ruta.tf.idf
- frecuencia de término * frecuencia de documento inversa - vea la entrada de Wikipedia para más detalles. Hay otras normalizaciones más recientes, pero este es un método de pan y mantequilla, por lo que es importante saberlo. Puede implementarlo fácilmente en R: simplemente almacene (docID, wordID, freq1, freq2) donde freq1 es el recuento de veces que la palabra indexada por wordID ha aparecido en el documento dado y freq2 es el número de documentos en los que aparece. No es necesario almacenar este vector para palabras que no aparecen en un documento determinado. Luego, simplemente tome freq1 / freq2 y tendrá su valor tf.idf.Matrix
paquete.En este punto, tiene un conjunto de datos bien preprocesado. Recomendaría continuar con las herramientas citadas en la vista de tareas CRAN o el paquete de minería de texto. Agrupar los datos, por ejemplo proyectando en los primeros 4 o 6 componentes principales, podría ser muy interesante para su grupo cuando se grafican los datos.
Otra cosa: puede encontrar que la reducción de dimensionalidad en la línea de PCA (*) puede ser útil cuando se utilizan varios métodos de clasificación, ya que esencialmente está agregando las palabras relacionadas. Los primeros 10-50 componentes principales pueden ser todo lo que necesita para la clasificación de documentos, dado el tamaño de su muestra.
(*) Nota: PCA es solo un primer paso. Puede ser muy interesante para alguien que recién comienza con la minería de texto y PCA, pero eventualmente puede encontrar que es un poco molesto para los conjuntos de datos dispersos. Sin embargo, como primer paso, échale un vistazo, especialmente a través de las funciones
prcomp
yprincomp
.Actualización: no indiqué una preferencia en esta respuesta, lo recomiendo en
prcomp
lugar de hacerloprincomp
.fuente
prcomp
y / oprincomp
escalará a este tipo de datos que usted considera? También acabo de editar mi pregunta y agregué información adicional.prcomp
) estarán bien.Primero, bienvenido! El procesamiento de texto es muy divertido, y hacerlo en R es cada vez más fácil.
La respuesta corta: sí, las herramientas en R ahora son bastante buenas para manejar este tipo de datos. De hecho, no hay nada especial sobre R, C ++, Groovy, Scala o cualquier otro idioma cuando se trata del almacenamiento de datos en RAM: cada idioma almacena un flotante doble de 8 bytes ... espere ... espere. .. 8 bytes!
Los algoritmos y su implementación son importantes, especialmente si se implementan muy mal con respecto a las estructuras de datos y la complejidad computacional. Si está implementando sus propios algoritmos, solo tenga cuidado. Si usa otro código, se aplica advertencia de advertencia, como lo hace en cualquier entorno.
Para R, deberá considerar:
Matrix
paquete)bigmemory
off
; o distribuida, usando Hadoop)El último punto está realmente bajo tu control.
Cuando se trata de esta dimensionalidad, ya no es particularmente grande. El número de observaciones tendrá un mayor impacto, pero puede dividir sus datos para ajustar el uso de RAM, por lo que no hay mucho de qué preocuparse.
fuente
Estoy de acuerdo con crayola en que el número de filas es crucial aquí. Para RF, necesitará al menos 3 veces más RAM que los pesos de su conjunto de datos y probablemente mucho tiempo (tal cantidad de atributos generalmente requiere muchos árboles en el bosque, y tenga en cuenta que no hay una implementación paralela de RF en R).
Sobre SVM, dudo que sea una buena idea luchar con dimensiones de 300k, mientras que probablemente puedas desarrollar una función de kernel que sea equivalente a tus descriptores de texto.
EDITAR: la matriz de 3k x 30k (real) ocuparía algo así como 7Gb, por lo que todo lo que necesita hacer RF (usando randomForest) en estos datos es una computadora con 16GB de RAM, algo de suerte y bastante tiempo o simplemente una computadora con 24GB RAM y bastante tiempo.
fuente
foreach
paquete juega muy bien con elrandomForest
paquete. Creo que hay un ejemplo en la viñetaforeach
. (O tal vezdoMC
.)randomForest
tal manera que consultara las columnas elegidas al azar de, por ejemplo, una base de datos SQL en cada iteración (de modo que las dimensiones completas de 300k nunca tendrían estar en ram). Pero eso es probablemente principalmente porque sé más sobre R que sobre las otras opciones posibles.