python - scikit - sklearn fit
Supervisión de reducción de dimensionalidad para datos de texto en scikit-learn (5)
Intento usar scikit-learn para hacer algo de aprendizaje automático sobre datos de lenguaje natural. Tengo mi corpus transformado en vectores de bolsa de palabras (que toman la forma de una matriz de CSR dispersa) y me pregunto si existe un algoritmo supervisado de reducción de dimensionalidad en sklearn capaz de tomar datos supervisados y de alta dimensión, y proyectar en un espacio dimensional inferior que conserva la varianza entre estas clases.
La descripción del problema de alto nivel es que tengo una colección de documentos, cada uno de los cuales puede tener varias etiquetas, y quiero predecir cuál de esas etiquetas recibirá una bofetada en un nuevo documento basado en el contenido del documento.
En esencia, se trata de un problema supervisado, multietiqueta y multiclasma que utiliza una representación dispersa de vectores BoW. ¿Existe una técnica de reducción de dimensionalidad en sklearn que pueda manejar ese tipo de datos? ¿Existen otros tipos de técnicas que las personas hayan utilizado para trabajar con datos supervisados de BoW en scikit-learn?
¡Gracias!
Prueba ISOMAP. Hay una función incorporada muy simple para él en scikits.learn. Incluso si no tiene algunas de las propiedades de conservación que está buscando, vale la pena intentarlo.
Puede usar la asignación de dirichlet latente (aquí está la wiki ) para descubrir los temas en sus documentos. Para la asignación de una etiqueta a un documento, puede usar la distribución de probabilidad condicional para una etiqueta de documento (dada la distribución sobre los temas en su documento). Si ya tiene etiquetas para sus documentos, solo necesita aprender el CPD, que es trivial. Desafortunadamente, scikit-learn no tiene una implementación de LDA, pero gensim sí.
PD: Aquí hay otro documento que puede ayudar. Si no está muy bien versado en inferencia estadística / aprendizaje o aprendizaje automático, le sugiero que comience aquí (nota: todavía asume un alto nivel de madurez matemática).
Use una red neuronal multicapa para clasificar. Si desea ver cuál es la representación de la entrada en la dimensión reducida, observe las activaciones de la capa oculta. El papel de la capa oculta está optimizado por definición para distinguir entre las clases, ya que eso es lo que se optimiza directamente cuando se establecen los pesos.
Debe recordar usar una activación de softmax en la capa de salida y algo no lineal en la capa oculta (tanh o sigmoid).
Estoy un poco confundido por tu pregunta. En mi experiencia, la reducción de la dimensionalidad nunca está realmente supervisada ... pero parece que lo que quieres es algún tipo de selección de funciones informadas, lo cual es imposible de hacer antes de que se realice la clasificación. En otras palabras, no puede saber qué características son más informativas antes de que su clasificador sea entrenado y validado.
Sin embargo, reducir el tamaño y la complejidad de sus datos siempre es bueno, y tiene varias formas de hacerlo con datos de texto. La aplicabilidad y el rendimiento dependen del tipo de vectores que tenga (recuentos de frecuencia, tfidf) y siempre tendrá que determinar el número de dimensiones (componentes) que desea en su salida. Las implementaciones en scikit-learn se encuentran principalmente en el módulo de descomposición .
El método más popular en el procesamiento del lenguaje natural es la descomposición de valores singulares (SVD), que se encuentra en el núcleo del análisis semántico latente (LSA, también LSI). Siguiendo con scikit-learn, simplemente puede aplicar TruncatedSVD()
en sus datos. Un método similar es la factorización de matriz no negativa , implementada en scikit-learn como NMF()
.
Un enfoque cada vez más popular utiliza la transformación mediante proyecciones aleatorias, Indización Aleatoria . Puedes hacer esto en scikit-learn con las funciones en random_projection .
Como alguien señaló en otra respuesta, La asignación de Dirichlet latente también es una alternativa, aunque es mucho más lenta y computacionalmente más exigente que los métodos anteriores. Además, al momento de escribir este artículo no está disponible en scikit-learn.
Si todo lo que quiere es simplificar sus datos para alimentarlo a un clasificador, sugeriría SVD con n_components entre 100 y 500, o proyección aleatoria con n_components entre 500 y 2000 (valores comunes de la literatura).
Si está interesado en usar las dimensiones reducidas como algún tipo de clasificación / clúster ya (las personas llaman extracción de este tema, aunque en realidad no está extrayendo temas, sino dimensiones latentes), entonces LDA podría ser una mejor opción. Tenga cuidado, es lento y solo requiere recuentos de frecuencia puros (no tfidf). Y la cantidad de componentes es un parámetro que debe determinar de antemano (no es posible hacer una estimación).
Volviendo a su problema, crearía una canalización de sckit-learn con un vectorizador, opciones de reducción de dimensionalidad y clasificador y llevaría a cabo una búsqueda masiva de parámetros. De esta forma, verá qué le ofrece mejores resultados con el conjunto de etiquetas que tiene.
Varios módulos de scikit existentes hacen algo similar a lo que usted solicitó.
El Análisis Discriminante Lineal es probablemente el más cercano a lo que usted solicitó. Encuentra una proyección de los datos que maximiza la distancia entre los centroides de clase en relación con las varianzas proyectadas.
La descomposición cruzada incluye métodos como Mínimos cuadrados parciales que se ajustan a modelos de regresión lineal para objetivos multidimensionales a través de una proyección a través de un espacio intermedio dimentonial inferior. Es muy parecido a una sola red neuronal de capa oculta sin los sigmoides. Estos son métodos de regresión lineal, pero podría aplicar una codificación 0-1 a su señal de destino y usar estos modelos de todos modos.
Puede usar un clasificador regularizado L1 como
LogisticRegression
o SGDClassifierto do feature selection.
RandomizedLogisticRegression` combina esto con bootstrapping para obtener un conjunto de características más estable.