Search

Matriz de confusión

Una herramienta fundamental a la hora de evaluar cómo de bien actúa un algoritmo de clasificación es la matriz de confusión.

Voy a intentar explicar qué es y cómo interpretarla, sin hacer honor a su nombre.

Resulta que te montas un clasificador, un modelo de aprendizaje supervisado, para predecir el valor de una variable categórica. Le has dado bien de comer con un conjunto de datos de entrenamiento y ahora te clasifica genial los datos de prueba (o eso es lo que tú te crees). Para comprobar la precisión de tu modelo te calculas, de forma intuitiva, el siguiente ratio: divides el número de observaciones clasificadas correctamente entre el número total de observaciones, algo que utilicé en el ejemplo del perceptrón.

    \[ \textrm{precisi\'on} = \frac{\textrm{n\'umero clasificaciones correctas} }{\textrm{n\'umero total de observaciones}}\]

¿Con esto nos vale para presumir de clasificador y fumarnos un purito?. Pues no. La precisión calculada de esta manera puede resultar engañosa en algunos casos. Por ejemplo: un dataset con 100k casos de malversación de fondos públicos y dos posibles etiquetas. A la etiqueta ‘culpable’ le corresponden 90k observaciones y a la ‘Inocente’ las 10k restantes. Sin darnos cuenta, nuestro clasificador está metiendo en la sombra a todas las observaciones, otorgando siempre la etiqueta ‘Culpable’. Así la precisión que obtengo es del 90%. Nos quedamos tan contentos hasta que alguien se pregunte dentro de unos años que cómo es posible que todos los gestores públicos roben (mmm es posible, pero eso es harina de otro costal), y nos demos cuenta del sesgo que está cometiendo el modelo.

La matriz de confusión nos dará una mejor idea de cómo está clasificando nuestro modelo, dándonos un conteo de los aciertos y errores de cada una de las clases por las que estemos clasificando.  Así podremos comprobar si nuestro modelo está confundiéndose entre clases, y en qué medida.

Una matriz de confusión de dos clases, en este caso + y -, tiene esta pinta:

    \[ \begin{tabular}{ll|c|c|} \cline{3-3}\cline{4-4} & & \multicolumn{2}{c|}{Clasificador} \\ \cline{3-3}\cline{4-4} & & \begin{tabular}[c]{@{}c@{}}+\\\end{tabular} & - \\ \hline \multicolumn{1}{|c|}{\multirow{2}{*}{Valor real}} & \multicolumn{1}{c|}{\begin{tabular}[c]{@{}c@{}}+\\\end{tabular}} & \begin{tabular}[c]{@{}c@{}}TP\\\end{tabular} & \begin{tabular}[c]{@{}c@{}}FN\\\end{tabular} \\ \cline{2-4} \multicolumn{1}{|c|}{} & \multicolumn{1}{c|}{\begin{tabular}[c]{@{}c@{}}-\\\end{tabular}} & \begin{tabular}[c]{@{}c@{}}FP\\\end{tabular} & \begin{tabular}[c]{@{}c@{}}TN\\\end{tabular} \\ \hline \end{tabular} \]

Cada columna de la matriz representará el número de predicciones para cada clase realizadas por el modelo, y cada fila los valores reales por cada clase. Con lo cual los conteos quedan divididos en 4 clases, TP, FN, FP y TN, que significan lo siguiente:

  • TP – True Positives: Son el número verdaderos positivos, es decir, de predicciones correctas para la clase +.
  • FN – False Negatives: Son el número de falsos negativos, es decir, la predicción es negativa cuando realmente el valor tendría que ser positivo. A estos casos también se les denomina errores de tipo II.
  • FP – False Positives: Son el número de falsos positivos, es decir, la predicción es positiva cuando realmente el valor tendría que ser negativo. A estos casos también se les denomina errores de tipo I.
  • TN – True Negatives: Son el número de verdaderos negativos, es decir, de predicciones correctas para la clase -.

Gracias a estas cuatro categorías podemos calcular métricas más elaboradas, como, por ejemplo:

  • Sensibilidad: también se la llama recall o tasa de verdaderos positivos. Nos da la probabilidad de que, dada una observación realmente positiva, el modelo la clasifique así.

    \[ \textrm{Sensibilidad} = \frac{\textrm{TP} }{\textrm{TP + FN}} \]

  • Especifidad: también llamado ratio de verdaderos negativos. Nos da la probabilidad de que, dada una observación realmente negativa, el modelo la clasifique así.

    \[ \textrm{Especifidad} = \frac{\textrm{TN} }{\textrm{TN + FP}} \]

  • Precisión: también llamado valor de predicción positiva. Nos da la probabilidad de que, dada una predicción positiva, la realidad sea positiva también.

    \[ \textrm{Precisi\'on} = \frac{\textrm{TP} }{\textrm{TP + FP}} \]

  • Valor de predicción Negativa: Nos da la probabilidad de que, dada una predicción negativa, la realidad sea también negativa.

    \[ \textrm{Valor de predicci\'on negativa} = \frac{\textrm{TN} }{\textrm{TN + FN}} \]

  • Error de clasificación: Porcentaje de errores del modelo.

    \[ \textrm{Error de clasificaci\'on} = \frac{\textrm{FP + FN} }{\textrm{TP + TN + FP + FN}} \]

  • Accuracy: Porcentaje total de los aciertos de nuestro modelo.

    \[ \textrm{Accuracy} = \frac{\textrm{TP + TN} }{\textrm{TP + TN + FP + FN}} \]

  • Prevalencia: La probabilidad de un positivo en el total de la muestra.

    \[ \textrm{Prevalencia} = \frac{\textrm{TP + FN} }{\textrm{TP + TN + FP + FN}} \]

Por ejemplo, con la sensibilidad y la especifidad nos hacemos una idea de cómo de bien clasifica nuestro modelo.

Aquí tenéis un par de sitios con más información sobre la matriz de confusión y los ratios que se pueden calcular:

Vamos a hacer un ejemplo con datos para verlo mejor, y poder calcular alguna métrica.

Imaginemos que tenemos una epidemia de un virus más viejo que el color negro, pero que últimamente está desatado. Se trata del virus Trinque, que convierte a servidores públicos honrados en máquinas de trincar.

Alguien ha creado un modelo para diferenciar a los políticos infectados (culpables +) de los que están limpios (inocentes -), y se lo han pasado a 80000 individuos, resultando la siguiente matriz de confusión:

    \[ \begin{tabular}{|c|r|r|r|} \cline{3-3}\cline{4-4} \multicolumn{1}{l}{} & \multicolumn{1}{l|}{} & \multicolumn{2}{c|}{Clasificador} \\ \cline{3-3}\cline{4-4} \multicolumn{2}{c|}{n=80000} & \multicolumn{1}{c|}{Culpable (+)} & \multicolumn{1}{c|}{\begin{tabular}[c]{@{}c@{}}Inocente (-)\\\end{tabular}} \\ \hline \multirow{2}{*}{Valor real} & \begin{tabular}[c]{@{}r@{}}Culpable (+)\\\end{tabular} & \begin{tabular}[c]{@{}r@{}}63040 (TP)\\\end{tabular} & \begin{tabular}[c]{@{}r@{}}160 (FN)\\\end{tabular} \\ \cline{2-4} & \begin{tabular}[c]{@{}r@{}}Inocente (-)\\\end{tabular} & \begin{tabular}[c]{@{}r@{}}960 (FP)\\\end{tabular} & \begin{tabular}[c]{@{}r@{}}15840 (TN)\\\end{tabular} \\ \hline \end{tabular} \]

Estos serían los cálculos de algunos ratios:

    \[ \begin{tabular}{|l|r|} \hline Prevalencia & \begin{tabular}[c]{@{}r@{}}79 \%\\\end{tabular} \\ \hline Sensibilidad & 99,75\% \\ \hline Especifidad & 94,29\% \\ \hline Precisi\'on & 98,50\% \\ \hline VPN & 99,00\% \\ \hline Errores & 1,40\% \\ \hline Accuracy & 98,60\% \\ \hline \end{tabular} \]

Parece que el modelo resulta bastante bueno.

Clasifica los casos positivos con una probabilidad del 99,75% y los casos negativos con una probabilidad del 94,29%.

Además, si el clasificador dice que eres un trinqueitor, es que lo eres con un 98,5% de probabilidad. Y si dice que no lo eres, entonces es que no trincas con una probabilidad del 99%.

Así que ya sabes, si quieres comprobar si tu clasificador te la está pegando, puedes hacerlo fácilmente con la matriz de confusión.

En Python puedes calcular matrices de confusión con la función confusion_matrix de la librería scikit-learn.

2 Comments

Deja una respuesta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.