machine-learning - ejemplo - naive bayes example
¿Formas de mejorar la precisión de un clasificador Naive Bayes? (5)
Estoy usando un clasificador Naive Bayes para categorizar varios miles de documentos en 30 categorías diferentes. Implementé un clasificador Naive Bayes y, con la selección de algunas funciones (principalmente filtrado de palabras inútiles), obtuve una precisión de prueba del 30%, con una precisión de entrenamiento del 45%. Esto es significativamente mejor que aleatorio, pero quiero que sea mejor.
Intenté implementar AdaBoost con NB, pero no parece dar resultados apreciablemente mejores (la literatura parece dividirse en esto, algunos documentos dicen que AdaBoost con NB no da mejores resultados, otros lo hacen). ¿Conoces otras extensiones de NB que puedan dar una mejor precisión?
En mi experiencia, los clasificadores Naive Bayes adecuadamente entrenados son asombrosamente precisos (y muy rápidos de entrenar, notablemente más rápidos que cualquier clasificador-generador que haya usado alguna vez).
así que cuando quieras mejorar la predicción del clasificador, puedes buscar en varios lugares:
sintonice su clasificador (ajustando los parámetros ajustables del clasificador);
aplicar algún tipo de técnica de combinación del clasificador (p. ej., conjunto, refuerzo, embolsado); o tu puedes
Mire los datos alimentados al clasificador: agregue más datos, mejore su análisis básico o refine las características que seleccione de los datos.
w / r / t clasificadores bayesianos ingenuos, ajuste de parámetros es limitado; Recomiendo centrarse en sus datos, es decir, la calidad de su preprocesamiento y la selección de características.
I. Análisis de datos (preprocesamiento)
supongo que sus datos brutos son algo así como una cadena de texto sin formato para cada punto de datos, que mediante una serie de pasos de procesamiento transforma cada cadena en un vector estructurado (matriz 1D) para cada punto de datos de modo que cada desplazamiento corresponde a una característica ( generalmente una palabra) y el valor en ese desplazamiento corresponde a la frecuencia.
derivación : ya sea manualmente o mediante el uso de una biblioteca de tallo? los populares de código abierto son Porter, Lancaster y Snowball. Entonces, por ejemplo, si tiene los términos programador, programa, programación programados en un punto de datos dado, un generador de láminas los reducirá a un solo tallo (probablemente programa ) de modo que su vector de términos para ese punto de datos tendrá un valor de 4 para el programa de características, que es probablemente lo que quieres.
búsqueda de sinónimos : la misma idea que stemming - palabras relacionadas con fold en una sola palabra; para que un buscador de sinónimos pueda identificar desarrollador, programador, codificador e ingeniero de software y ponerlos en un solo término
palabras neutras : las palabras con frecuencias similares en todas las clases tienen características deficientes
II. Selección de características
considere un caso de uso prototípico para NBC: filtrado de spam; puedes ver rápidamente cómo falla y con la misma rapidez puedes ver cómo mejorarlo. Por ejemplo, los filtros antispam por encima de la media tienen características matizadas como: la frecuencia de las palabras en mayúsculas, la frecuencia de las palabras en el título y la aparición de signos de exclamación en el título. Además, las mejores características a menudo no son palabras sueltas, sino, por ejemplo, pares de palabras o grupos de palabras más grandes .
III. Optimizaciones específicas del clasificador
En lugar de 30 clases, use un esquema ''uno contra muchos'' - en otras palabras, usted comienza con un clasificador de dos clases (Clase A y ''todo lo demás'') luego los resultados en la clase ''todo lo demás'' se devuelven a el algoritmo para clasificación en Clase B y ''todo lo demás'', etc.
El Método Fisher (probablemente la forma más común de optimizar un clasificador Naive Bayes). Para mí, pienso que Fisher normaliza (más correctamente, estandariza ) las probabilidades de entrada. Un NBC utiliza las probabilidades de características para construir una probabilidad de ''todo el documento'' . El Método de Fisher calcula la probabilidad de una categoría para cada característica del documento, luego combina estas características de probabilidad y compara esa probabilidad combinada con la probabilidad de un conjunto aleatorio de características.
Seleccione las funciones que tienen menos correlación entre ellas. Y trate de usar una combinación diferente de características a la vez.
Sugeriría usar un SGDClassifier como en this y sintonizarlo en términos de fuerza de regularización.
También intente sintonizar la fórmula en TFIDF que está utilizando afinando los parámetros de TFIFVectorizer .
Normalmente veo que para los problemas de clasificación de texto SVM o Regressioin logístico cuando se entrena uno contra todos supera a NB. Como puede ver en este bonito artículo de Stanford People para documentos más largos, SVM supera a NB. El código para el documento que usa una combinación de SVM y NB ( NBSVM ) está here .
En segundo lugar, sintonice su fórmula TFIDF (por ejemplo, sublinear tf, smooth_idf).
Normalice sus muestras con la normalización l2 o l1 (predeterminado en Tfidfvectorization) porque compensa las diferentes longitudes de documento.
El perceptrón multicapa , generalmente obtiene mejores resultados que NB o SVM debido a la no linealidad introducida que es inherente a muchos problemas de clasificación de texto. He implementado una altamente paralela utilizando Theano / Lasagne que es fácil de usar y descargable here .
Intente ajustar su regularización l1 / l2 / elasticnet . Hace una gran diferencia en SGDClassifier / SVM / Regresión logística.
Intenta usar n-grams que se puede configurar en tfidfvectorizer.
Si sus documentos tienen estructura (por ejemplo, tienen títulos ) considere usar diferentes características para diferentes partes. Por ejemplo, añada title_word1 a su documento si ocurre word1 en el título del documento.
Considere usar la longitud del documento como una característica (por ejemplo, número de palabras o caracteres).
Considere usar metainformación sobre el documento (por ejemplo, la hora de creación, el nombre del autor, la url del documento, etc.).
Recientemente Facebook publicó su código de clasificación FastText que funciona muy bien en muchas tareas, asegúrese de probarlo.
Usando la corrección laplaciana junto con AdaBoost.
En AdaBoost, primero se asigna un peso a cada tupla de datos en el conjunto de datos de entrenamiento. Los pesos init_weights
se establecen con el método init_weights
, que inicializa cada peso para que sea 1/d
, donde d
es el tamaño del conjunto de datos de entrenamiento.
Luego, se llama a un método generate_classifiers
, que se ejecuta k
veces, creando k
instancias del clasificador Naïve Bayes. Estos clasificadores se ponderan y los datos de prueba se ejecutan en cada clasificador. La suma de los "votos" ponderados de los clasificadores constituye la clasificación final.
mantener el n tamaño pequeño también hace que NB brinde un resultado de alta precisión. y en el núcleo, a medida que el tamaño n aumenta su precisión se degrada,