Al fin después de tanto trabajar hemos encontrado la solución de este asunto que ciertos los usuarios de este espacio han presentado. Si deseas compartir alguna información no dejes de dejar tu conocimiento.
Solución:
Creo que hay mucha confusión sobre qué pesos se utilizan para qué. No estoy seguro de saber con precisión qué es lo que te molesta, así que voy a cubrir diferentes temas, ten paciencia conmigo;).
Pesos de clase
Los pesos del class_weight
se utilizan para entrenar al clasificador. Ellos no se utilizan en el cálculo de ninguna de las métricas que está utilizando: con diferentes pesos de clase, los números serán diferentes simplemente porque el clasificador es diferente.
Básicamente, en todos los clasificadores de scikit-learn, los pesos de las clases se utilizan para indicarle a su modelo qué tan importante es una clase. Eso significa que durante el entrenamiento, el clasificador hará un esfuerzo adicional para clasificar adecuadamente las clases con pesos altos.
La forma en que lo hacen depende del algoritmo. Si desea detalles sobre cómo funciona para SVC y el documento no tiene sentido para usted, no dude en mencionarlo.
Las métricas
Una vez que tenga un clasificador, querrá saber qué tan bien está funcionando. Aquí puede utilizar las métricas que mencionó: accuracy
, recall_score
, f1_score
…
Por lo general, cuando la distribución de clases no está equilibrada, la precisión se considera una mala elección, ya que otorga puntuaciones altas a los modelos que solo predicen la clase más frecuente.
No detallaré todas estas métricas, pero tenga en cuenta que, con la excepción de accuracy
, se aplican naturalmente a nivel de clase: como puede ver en este print
de un informe de clasificación se definen para cada clase. Se basan en conceptos como true positives
o false negative
que requieren definir qué clase es la positivo uno.
precision recall f1-score support
0 0.65 1.00 0.79 17
1 0.57 0.75 0.65 16
2 0.33 0.06 0.10 17
avg / total 0.52 0.60 0.51 50
La advertencia
F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The
default `weighted` averaging is deprecated, and from version 0.18,
use of precision, recall or F-score with multiclass or multilabel data
or pos_label=None will result in an exception. Please set an explicit
value for `average`, one of (None, 'micro', 'macro', 'weighted',
'samples'). In cross validation use, for instance,
scoring="f1_weighted" instead of scoring="f1".
Recibe esta advertencia porque está utilizando la puntuación f1, la recuperación y la precisión sin definir cómo deben calcularse. La pregunta podría reformularse: del informe de clasificación anterior, ¿cómo se genera uno número global para la puntuación f1? Tú podrías:
- Tome el promedio de la puntuación f1 para cada clase: esa es la
avg / total
resultado anterior. También se llama macro promediando. - Calcule la puntuación f1 utilizando el recuento global de true positivos / false negativos, etc. (sumas el número de true positivos / false negativos para cada clase). Aka micro promediando.
- Calcule un promedio ponderado de la puntuación f1. Utilizando
'weighted'
en scikit-learn sopesará el puntaje f1 con el apoyo de la clase: cuantos más elementos tenga una clase, más importante será el puntaje f1 para esta clase en el cálculo.
Estas son 3 de las opciones en scikit-learn, la advertencia está ahí para decirte tengo que elegir uno. Entonces tienes que especificar un average
argumento para el método de puntuación.
El que elija depende de cómo desee medir el rendimiento del clasificador: por ejemplo macro-El promedio no tiene en cuenta el desequilibrio de clases y el puntaje f1 de la clase 1 será tan importante como el puntaje f1 de la clase 5. Sin embargo, si usa el promedio ponderado, obtendrá más importancia para la clase 5.
Toda la especificación del argumento en estas métricas no es muy clara en scikit-learn en este momento, mejorará en la versión 0.18 de acuerdo con los documentos. Están eliminando algunos comportamientos estándar no obvios y están emitiendo advertencias para que los desarrolladores lo noten.
Calcular puntuaciones
Lo último que quiero mencionar (siéntase libre de omitirlo si lo sabe) es que las puntuaciones solo son significativas si se calculan sobre datos que el clasificador nunca ha visto. Esto es extremadamente importante ya que cualquier puntaje que obtenga sobre los datos que se usaron para ajustar el clasificador es completamente irrelevante.
He aquí una forma de hacerlo usando StratifiedShuffleSplit
, lo que le brinda divisiones aleatorias de sus datos (después de barajar) que preservan la distribución de la etiqueta.
from sklearn.datasets import make_classification
from sklearn.cross_validation import StratifiedShuffleSplit
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix
# We use a utility to generate artificial classification data.
X, y = make_classification(n_samples=100, n_informative=10, n_classes=3)
sss = StratifiedShuffleSplit(y, n_iter=1, test_size=0.5, random_state=0)
for train_idx, test_idx in sss:
X_train, X_test, y_train, y_test = X[train_idx], X[test_idx], y[train_idx], y[test_idx]
svc.fit(X_train, y_train)
y_pred = svc.predict(X_test)
print(f1_score(y_test, y_pred, average="macro"))
print(precision_score(y_test, y_pred, average="macro"))
print(recall_score(y_test, y_pred, average="macro"))
Espero que esto ayude.
Aquí hay muchas respuestas muy detalladas, pero no creo que esté respondiendo las preguntas correctas. Según entiendo la pregunta, hay dos preocupaciones:
- ¿Cómo califico un problema multiclase?
- ¿Cómo trato los datos desequilibrados?
1.
Puede utilizar la mayoría de las funciones de puntuación en scikit-learn tanto con problemas multiclase como con problemas de una sola clase. Ex.:
from sklearn.metrics import precision_recall_fscore_support as score
predicted = [1,2,3,4,5,1,2,1,1,4,5]
y_test = [1,2,3,4,5,1,2,1,1,4,1]
precision, recall, fscore, support = score(y_test, predicted)
print('precision: '.format(precision))
print('recall: '.format(recall))
print('fscore: '.format(fscore))
print('support: '.format(support))
De esta manera terminas con números tangibles e interpretables para cada una de las clases.
| Label | Precision | Recall | FScore | Support |
|-------|-----------|--------|--------|---------|
| 1 | 94% | 83% | 0.88 | 204 |
| 2 | 71% | 50% | 0.54 | 127 |
| ... | ... | ... | ... | ... |
| 4 | 80% | 98% | 0.89 | 838 |
| 5 | 93% | 81% | 0.91 | 1190 |
Luego…
2.
… puede saber si los datos desbalanceados son incluso un problema. Si la puntuación para las clases menos representadas (clase 1 y 2) es más baja que para las clases con más muestras de entrenamiento (clase 4 y 5), entonces sabrá que los datos desequilibrados son de hecho un problema y puede actuar en consecuencia, ya que descrito en algunas de las otras respuestas en este hilo. Sin embargo, si la misma distribución de clases está presente en los datos que desea predecir, sus datos de entrenamiento desequilibrados son un buen representante de los datos y, por lo tanto, el desequilibrio es algo bueno.
Pregunta planteada
Respondiendo a la pregunta ‘qué métrica debería usarse para la clasificación de clases múltiples con datos desequilibrados’: Medida Macro-F1. También se pueden utilizar Macro Precision y Macro Recall, pero no son tan fáciles de interpretar como para la clasificación binaria, ya están incorporadas en la medida F y el exceso de métricas complica la comparación de métodos, el ajuste de parámetros, etc.
El micropromedio es sensible al desequilibrio de clases: si su método, por ejemplo, funciona bien para las etiquetas más comunes y estropea totalmente otras, las métricas micropromediadas muestran buenos resultados.
El promedio de ponderación no es adecuado para datos desequilibrados, porque pondera por conteos de etiquetas. Además, es muy poco interpretable e impopular: por ejemplo, no se menciona tal promedio en la siguiente encuesta muy detallada que recomiendo encarecidamente revisar:
Sokolova, Marina y Guy Lapalme. “Un análisis sistemático de medidas de desempeño para tareas de clasificación”. Tratamiento y gestión de la información 45.4 (2009): 427-437.
Pregunta específica de la aplicación
Sin embargo, volviendo a su tarea, investigaría 2 temas:
- métricas de uso común para su tarea específica: permite (a) comparar su método con otros y comprender si hace algo mal, y (b) no explorar esto por sí mismo y reutilizar los hallazgos de otra persona;
- el costo de los diferentes errores de sus métodos; por ejemplo, el caso de uso de su aplicación puede depender solo de revisiones de 4 y 5 estrellas; en este caso, una buena métrica debe contar solo estas 2 etiquetas.
Métricas de uso común.
Como puedo inferir después de revisar la literatura, hay 2 métricas de evaluación principales:
- Precisión, que se utiliza, por ejemplo, en
Yu, April y Daryl Chang. “Predicción de sentimiento multiclase usando Yelp Business”.
(enlace): tenga en cuenta que los autores trabajan con casi la misma distribución de calificaciones, consulte la Figura 5.
Pang, Bo y Lillian Lee. “Ver estrellas: aprovechar las relaciones de clase para la categorización de sentimientos con respecto a las escalas de calificación”. Actas de la 43ª Reunión Anual de la Asociación de Lingüística Computacional. Asociación de Lingüística Computacional, 2005.
(Enlace)
- MSE (o, con menos frecuencia, error absoluto medio – MAE) – ver, por ejemplo,
Lee, Moontae y R. Grafe. “Análisis de sentimiento multiclase con reseñas de restaurantes”. Proyectos finales de CS N 224 (2010).
(enlace): exploran tanto la precisión como el MSE, considerando que este último es mejor
Pappas, Nikolaos, Rue Marconi y Andrei Popescu-Belis. “Explicación de las estrellas: aprendizaje ponderado de instancias múltiples para el análisis de sentimientos basado en aspectos”. Actas de la Conferencia de 2014 sobre métodos empíricos en el procesamiento del lenguaje natural. No. EPFL-CONF-200899. 2014.
(enlace) – utilizan scikit-learn para enfoques de evaluación y de referencia y afirman que su código está disponible; sin embargo, no puedo encontrarlo, así que si lo necesita, escriba una carta a los autores, el trabajo es bastante nuevo y parece estar escrito en Python.
Costo de diferentes errores.
Si le importa más evitar errores graves, por ejemplo, asignar una reseña de 1 estrella a 5 estrellas o algo así, mire MSE; si la diferencia importa, pero no tanto, pruebe MAE, ya que no cuadra la diferencia; de lo contrario, manténgase con precisión.
Acerca de los enfoques, no de las métricas
Pruebe los enfoques de regresión, por ejemplo, SVR, ya que generalmente superan a los clasificadores multiclase como SVC u OVA SVM.