¿Cómo aumentar la precisión de los clasificadores?


16

Estoy usando el ejemplo de OpenCV letter_recog.cpp para experimentar en árboles aleatorios y otros clasificadores. Este ejemplo tiene implementaciones de seis clasificadores: árboles aleatorios, impulso, MLP, kNN, Bayes ingenuos y SVM. Se utiliza el conjunto de datos de reconocimiento de letras UCI con 20000 instancias y 16 características, que dividí por la mitad para capacitación y pruebas. Tengo experiencia con SVM, así que configuré rápidamente su error de reconocimiento en 3.3%. Después de experimentar un poco, lo que obtuve fue:

Reconocimiento de letras UCI:

  • RTrees - 5.3%
  • Impulso: 13%
  • MLP - 7.9%
  • kNN (k = 3) - 6.5%
  • Bayes - 11.5%
  • SVM - 3.3%

Parámetros utilizados:

  • RTrees - max_num_of_trees_in_the_forrest = 200, max_depth = 20, min_sample_count = 1

  • Impulso: boost_type = REAL, cuenta_debilitada = 200, weight_trim_rate = 0.95, max_depth = 7

  • MLP: método = BACKPROP, param = 0.001, max_iter = 300 (valores predeterminados: demasiado lento para experimentar)

  • kNN (k = 3) - k = 3

  • Bayes - ninguno

  • SVM - núcleo RBF, C = 10, gamma = 0.01

Después de eso, utilicé los mismos parámetros y probé en los conjuntos de datos Dígitos y MNIST extrayendo primero las características de gradiente (elementos de tamaño de vector 200):

Dígitos:

  • RTrees - 5.1%
  • Impulso: 23.4%
  • MLP - 4.3%
  • kNN (k = 3) - 7.3%
  • Bayes - 17.7%
  • SVM - 4.2%

MNIST:

  • RTrees - 1.4%
  • Boost - sin memoria
  • MLP - 1.0%
  • kNN (k = 3) - 1.2%
  • Bayes - 34,33%
  • SVM - 0.6%

Soy nuevo en todos los clasificadores, excepto SVM y kNN, para estos dos puedo decir que los resultados parecen estar bien. ¿Qué hay de los demás? Esperaba más de los árboles aleatorios, en MNIST kNN ofrece una mayor precisión, ¿alguna idea de cómo hacerlo más alto? Boost y Bayes dan una precisión muy baja. Al final, me gustaría usar estos clasificadores para hacer un sistema de clasificadores múltiples. ¿Algún consejo?

Respuestas:


9

Reducción de dimensionalidad

Otro procedimiento importante es comparar las tasas de error en el conjunto de datos de entrenamiento y prueba para ver si está sobreajustado (debido a la "maldición de la dimensionalidad"). Por ejemplo, si su tasa de error en el conjunto de datos de prueba es mucho mayor que el error en el conjunto de datos de entrenamiento, este sería un indicador.
En este caso, puede probar técnicas de reducción de dimensionalidad, como PCA o LDA.

Si está interesado, he escrito sobre PCA, LDA y algunas otras técnicas aquí: http://sebastianraschka.com/index.html#machine_learning y en mi repositorio de GitHub aquí: https://github.com/rasbt/pattern_classification

Validación cruzada

También es posible que desee echar un vistazo a las técnicas de validación cruzada para evaluar el rendimiento de sus clasificadores de una manera más objetiva


Sí, de hecho, las tasas de error en el conjunto de datos de entrenamiento son alrededor de 0. Cambiar los parámetros para reducir el sobreajuste no resultó en una mayor precisión en el conjunto de datos de prueba en mi caso. Investigaré las técnicas que mencionas lo antes posible y comentaré, gracias.
Mika

¿Cuáles son las proporciones relativas de entrenamiento y conjunto de datos de prueba por cierto? ¿Algo de la línea 70:30, 60:40 o 50:50?

Primer conjunto de datos: el reconocimiento de letras UCI se establece en 50:50 (10000: 10000), los dígitos son aproximadamente 51:49 (1893: 1796) y MNIST es aproximadamente 86:14 (60000: 10000).
Mika

Experimenté con PCA, todavía no obtuve buenos resultados con forrest aleatorio, pero boost y Bayes ahora dan resultados similares a otros clasificadores. Encontré una discusión sobre el bosque aleatorio aquí: stats.stackexchange.com/questions/66543/… Es posible que en realidad no esté sobreajustando, pero no pude encontrar el error de predicción de bolsa (OOB) mencionado allí. Ejecute el experimento ahora con una gran cantidad de árboles para ver si la precisión mejorará.
Mika

Bien, parece que estás progresando un poco :) Una pregunta trivial, pero ¿has estandarizado tus características (puntaje z) para que se centren en la media con desviación estándar = 1?

5

Esperaba más de los árboles al azar :

  • Con bosques aleatorios, típicamente para características N, las características sqrt (N) se usan para cada construcción de árbol de decisión. Como en su caso N = 20, puede intentar establecer max_depth (el número de subcaracterísticas para construir cada árbol de decisión) en 5.

  • En lugar de árboles de decisión, se han propuesto y evaluado modelos lineales como estimadores de base en bosques aleatorios, en particular la regresión logística multinomial y las ingenuas Bayes. Esto podría mejorar su precisión.

En MNIST kNN ofrece una mayor precisión, ¿alguna idea de cómo aumentarla?

  • Intente con un valor más alto de K (digamos 5 o 7). Un valor más alto de K le daría más evidencia de apoyo sobre la etiqueta de clase de un punto.
  • Puede ejecutar PCA o Análisis discriminante lineal de Fisher antes de ejecutar k-vecino más cercano. De este modo, podría deshacerse de las funciones correlacionadas mientras calcula las distancias entre los puntos, y por lo tanto sus k vecinos serían más robustos.
  • Pruebe diferentes valores de K para diferentes puntos en función de la varianza en las distancias entre los K vecinos.

Creo que se refiere al parámetro OpenCV nactive_vars (no max_depth), que configuré en el valor predeterminado de sqrt (N), es decir, nactive_vars = sqrt (16) para el primer conjunto de datos y sqrt (200) para los otros dos. max_depth determina si los árboles crecen hasta la profundidad total (25 es su valor máximo) y equilibra entre la adaptación y el sobreajuste, más sobre esto aquí: stats.stackexchange.com/questions/66209/... No estoy seguro acerca de min_sample_count pero probé varios valores y lo configuré a 1 funcionó mejor.
Mika

La documentación de OpenCV da una breve explicación de los parámetros: docs.opencv.org/modules/ml/doc/… Por ahora me gustaría hacer que los árboles aleatorios funcionen razonablemente bien y mantener las cosas simples porque quiero centrarme en trabajar con un sistema de clasificación múltiple.
Mika

Acerca de kNN: todas estas son sugerencias realmente buenas, pero lo que quise decir es que kNN funcionó mejor que el clasificador de árboles aleatorios y creo que hay mucho margen de mejora con árboles aleatorios.
Mika

sí, no estoy seguro de por qué el bosque aleatorio no funciona tan bien (o mejor) que el enfoque simplista k-NN ... podría ser el caso de un enfoque basado en el núcleo donde intentas estimar directamente P (y | D) (datos dados de salida) como en k-NN sin estimar P (theta | D) (datos dados del modelo latente) como en los modelos paramétricos.
Debasis
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.