discutió sobre las métricas de clasificación como Roc-Auc y Kolmogorov-Smirnov (KS) estadística en blogs anteriores.
En este blog, exploraremos otra métrica de clasificación importante llamada coeficiente de Gini.
¿Por qué tenemos múltiples métricas de clasificación?
Cada métrica de clasificación nos dice el rendimiento del modelo desde un ángulo diferente. Sabemos que ROC-AUC nos da la capacidad de clasificación general de un modelo, mientras que la estadística de KS nos muestra dónde ocurre la brecha máxima entre dos grupos.
Cuando se trata del coeficiente de Gini, nos dice cuánto mejor es nuestro modelo que adivinar aleatoriamente en clasificar los positivos más altos que los negativos.
Primero, veamos cómo se calcula el coeficiente de Gini.
Para esto, nuevamente usamos el conjunto de datos de crédito alemán.
Usemos los mismos datos de muestra que usamos para comprender el cálculo de la estadística de Kolmogorov-Smirnov (KS).
Estos datos de muestra se obtuvieron aplicando regresión logística en el conjunto de datos de crédito alemán.
Dado que el modelo genera probabilidades, seleccionamos una muestra de 10 puntos de esas probabilidades para demostrar el cálculo del coeficiente de Gini.
Cálculo
Paso 1: Ordene los datos por probabilidades predichas.
Los datos de la muestra ya están ordenados descendiendo predeciendo las probabilidades.
Paso 2: Calcule la población acumulada y los positivos acumulativos.
Población acumulada: el número acumulativo de registros considerados hasta esa fila.
Población acumulativa (%): el porcentaje de la población total cubierta hasta ahora.
Positivos acumulativos: cuántos positivos reales (clase 2) hemos visto hasta este punto.
Positivos acumulativos (%): el porcentaje de positivos capturados hasta ahora.
Paso 3: Valores de trazado x e y
X = población acumulativa (%)
Y = positivos acumulativos (%)
Aquí, usemos Python para trazar estos valores X e Y.
Código:
Importar matplotlib.pyplot como plt x = [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
Y = [0.0, 0.25, 0.50, 0.75, 0.75, 1.00, 1.00, 1.00, 1.00, 1.00, 1.00]
# Gract curve plt.figure (figSize = (6,6)) plt.plot (x, y, marker = ‘o’, color = “CornflowerBlue”, etiqueta = “modelo lorenz curve”) plt.plot ([0,1], [0,1]linestyle = “-“, color = “gris”, etiqueta = “modelo aleatorio (diagonal)”) plt.title (“curva lorenz de datos de muestra”, fontSize = 14) plt.xlabel (“población acumulativa % (x)”, fontsize = 12) plt.ylabel (“POSITIVES CUMULATIVES % (Y)”, Fontsize = 12) plt.grid (true) plt.show ()
Trama:
La curva que obtenemos cuando trazamos la población acumulada (%) y los positivos acumulativos (%) se llama curva de Lorenz.
Paso 4: Calcule el área debajo de la curva de Lorenz.
Cuando discutimos ROC-AUC, encontramos el área debajo de la curva utilizando la fórmula trapezoide.
Cada región entre dos puntos fue tratada como un trapezoide, su área se calculó y luego se agregaron todas las áreas para obtener el valor final.
El mismo método se aplica aquí para calcular el área debajo de la curva Lorenz.
Área bajo la curva de Lorenz
Área de trapecio:
$$
\ text {área} = \ frac {1} {2} \ times (y_1 + y_2) \ times (x_2 – x_1)
$$
De (0.0, 0.0) a (0.1, 0.25):
\[
A_1 = \frac{1}{2}(0+0.25)(0.1-0.0) = 0.0125
\]
De (0.1, 0.25) a (0.2, 0.50):
\[
A_2 = \frac{1}{2}(0.25+0.50)(0.2-0.1) = 0.0375
\]
De (0.2, 0.50) a (0.3, 0.75):
\[
A_3 = \frac{1}{2}(0.50+0.75)(0.3-0.2) = 0.0625
\]
De (0.3, 0.75) a (0.4, 0.75):
\[
A_4 = \frac{1}{2}(0.75+0.75)(0.4-0.3) = 0.075
\]
De (0.4, 0.75) a (0.5, 1.00):
\[
A_5 = \frac{1}{2}(0.75+1.00)(0.5-0.4) = 0.0875
\]
De (0.5, 1.00) a (0.6, 1.00):
\[
A_6 = \frac{1}{2}(1.00+1.00)(0.6-0.5) = 0.100
\]
De (0.6, 1.00) a (0.7, 1.00):
\[
A_7 = \frac{1}{2}(1.00+1.00)(0.7-0.6) = 0.100
\]
De (0.7, 1.00) a (0.8, 1.00):
\[
A_8 = \frac{1}{2}(1.00+1.00)(0.8-0.7) = 0.100
\]
De (0.8, 1.00) a (0.9, 1.00):
\[
A_9 = \frac{1}{2}(1.00+1.00)(0.9-0.8) = 0.100
\]
De (0.9, 1.00) a (1.0, 1.00):
\[
A_{10} = \frac{1}{2}(1.00+1.00)(1.0-0.9) = 0.100
\]
Área total bajo la curva de Lorenz:
\[
A = 0.0125+0.0375+0.0625+0.075+0.0875+0.100+0.100+0.100+0.100+0.100 = 0.775
\]
Calculamos el área bajo la curva de Lorenz, que es 0.775.
Aquí, trazamos la población acumulada (%) y los positivos acumulativos (%), y podemos observar que el área bajo esta curva muestra cuán rápido se capturan los aspectos positivos (clase 2) a medida que avanzamos por la lista ordenada.
En nuestro conjunto de datos de muestra, tenemos 4 positivos (clase 2) y 6 negativos (clase 1).
Para un modelo perfecto, cuando alcanzamos el 40% de la población, captura el 100% de los aspectos positivos.
La curva se ve así para un modelo perfecto.
Área debajo de la curva Lorenz para el modelo perfecto.
\[
\begin{aligned}
\text{Perfect Area} &= \text{Triangle (0,0 to 0.4,1)} + \text{Rectangle (0.4,1 to 1,1)} \\[6pt]
& = \ frac {1} {2} \ Times 0.4 \ Times 1 \;+\; 0.6 \ Times 1 \\[6pt]
& = 0.2 + 0.6 \\[6pt]
& = 0.8
\ End {alineado}
\]
También tenemos otro método para calcular el área bajo la curva para el modelo perfecto.
\[
\text{Let }\pi \text{ be the proportion of positives in the dataset.}
\]
\[
\text{Perfect Area} = \frac{1}{2}\pi \cdot 1 + (1-\pi)\cdot 1
\]
\[
= \frac{\pi}{2} + (1-\pi)
\]
\[
= 1 – \frac{\pi}{2}
\]
Para nuestro conjunto de datos:
Aquí, tenemos 4 positivos de 10 registros, entonces: π = 4/10 = 0.4.
\[
\text{Perfect Area} = 1 – \frac{0.4}{2} = 1 – 0.2 = 0.8
\]
Calculamos el área bajo la curva de Lorenz para nuestro conjunto de datos de muestra y también para el modelo perfecto con el mismo número de positivos y negativos.
Ahora, si pasamos por el conjunto de datos sin clasificar, los aspectos positivos se extienden uniformemente. Esto significa que la tasa a la que recolectamos positivos es la misma que la tasa a la que nos movemos a través de la población.
Este es el modelo aleatorio, y siempre da un área bajo la curva de 0.5.
Paso 5: Calcule el coeficiente de Gini
\[
A_{\text{model}} = 0.775
\]
\[
A_{\text{random}} = 0.5
\]
\[
A_{\text{perfect}} = 0.8
\]
\[
\text{Gini} = \frac{A_{\text{model}} – A_{\text{random}}}{A_{\text{perfect}} – A_{\text{random}}}
\]
\[
= \frac{0.775 – 0.5}{0.8 – 0.5}
\]
\[
= \frac{0.275}{0.3}
\]
\[
\approx 0.92
\]
Obtuvimos Gini = 0.92, lo que significa que casi todos los aspectos positivos se concentran en la parte superior de la lista ordenada. Esto muestra que el modelo hace un muy buen trabajo al separar positivos de los negativos, que se acerca a la perfecta.
Como hemos visto cómo se calcula el coeficiente de Gini, veamos lo que realmente hicimos durante el cálculo.
Consideramos una muestra de 10 puntos que consiste en probabilidades de salida de la regresión logística.
Ordenamos las probabilidades en orden descendente.
A continuación, calculamos la población acumulada (%) y los positivos acumulativos (%) y luego los trazamos.
Obtuvimos una curva llamada curva de Lorenz, y calculamos el área debajo, que es 0.775.
Ahora entendamos qué es 0.775?
Nuestra muestra consta de 4 positivos (clase 2) y 6 negativos (clase 1).
Las probabilidades de salida son para la clase 2, lo que significa que cuanto mayor sea la probabilidad, más probable es que el cliente pertenezca a la Clase 2.
En nuestros datos de muestra, los aspectos positivos se capturan dentro del 50% de la población, lo que significa que todos los aspectos positivos se clasifican en la parte superior.
Si el modelo es perfecto, los aspectos positivos se capturan dentro de las primeras 4 filas, es decir, dentro del primer 40% de la población, y el área bajo la curva para el modelo perfecto es 0.8.
Pero obtuvimos AUC = 0.775, que es casi perfecto.
Aquí, estamos tratando de calcular la eficiencia del modelo. Si se concentran más positivos en la parte superior, significa que el modelo es bueno para clasificar positivos y negativos.
A continuación, calculamos el coeficiente de Gini, que es 0.92.
\[
\text{Gini} = \frac{A_{\text{model}} – A_{\text{random}}}{A_{\text{perfect}} – A_{\text{random}}}
\]
El numerador nos dice cuánto mejor es nuestro modelo que adivinanzas aleatorias.
El denominador nos dice la mejora máxima posible sobre el azar.
La relación reúne a estos dos, por lo que el coeficiente de Gini siempre cae entre 0 (aleatorio) y 1 (perfecto).
Gini se usa para medir qué tan cerca está el modelo de ser perfecto para separar las clases positivas y negativas.
Pero podemos tener dudas sobre por qué calculamos Gini y por qué no nos detuvimos después de 0.775.
0.775 es el área debajo de la curva de Lorenz para nuestro modelo. No nos dice qué tan cerca está el modelo de ser perfecto sin compararlo con 0.8, que es el área para el modelo perfecto.
Por lo tanto, calculamos que Gini lo estandarizará para que caiga entre 0 y 1, lo que facilita la comparación de modelos.
Los bancos también utilizan el coeficiente de Gini para evaluar los modelos de riesgo de crédito junto con la estadística ROC-AUC y KS. Juntas, estas medidas dan una imagen completa del rendimiento del modelo.
Ahora, calculemos ROC-AUC para nuestros datos de muestra.
Importar pandas como PD de sklearn.metrics import roc_auc_score # sample data data = {“real”: [2, 2, 2, 1, 2, 1, 1, 1, 1, 1]”Pred_prob_class2″: [0.92, 0.63, 0.51, 0.39, 0.29, 0.20, 0.13, 0.10, 0.05, 0.01]
} df = pd.dataframe (datos) # convertir real: clase 2 -> 1 (positivo), clase 1 -> 0 (negativo) y_true = (df[“Actual”] == 2) .astype (int) y_score = df[“Pred_Prob_Class2”]
Calcule roc-auc roc_auc = roc_auc_score (y_true, y_score) roc_auc
Tenemos AUC = 0.9583
Ahora, Gini = (2 * AUC) – 1 = (2 * 0.9583) – 1 = 0.92
Esta es la relación entre Gini y Roc-Auc.
Ahora calculemos el coeficiente de Gini en un conjunto de datos completo.
Código:
Importar pandas como PD de sklearn.linear_model logistyRegression de sklearn.model_selection Import Train_test_split de sklearn.metrics import roc_auc_score # cargar dataSet file_path = “c: /german.data” data = pd.read_csv (file_path, sep = “,”, nine) # RENAMATS “COLUNTERS” COLUNTERS “COLUNTERS. [f”col_{i}” for i in range(1, 21)] + + [“target”]
data.columns = columnas # características y destino x = pd.get_dummies (data.drop (columnas =[“target”]), drop_first = true) y = data[“target”]
# Convertir el objetivo: hacerlo binario (1 = bueno, 0 = bad) y = (y == 2) .astype (int) # Train-test Split x_train, x_test, y_train, y_test = trenes_test_split (x, y, test_size = 0.3, random_state = 42, stratify = y) # trenes de regresión logística = logisticRession (mAx (mAx) model.fit (x_train, y_train) # probabilidades predichas y_pred_proba = model.predict_proba (x_test)[:, 1]
# Calcule ROC -AUC AUC = ROC_AUC_SCORE (Y_TEST, Y_PRED_PROBA) # Calcule Gini Gini = 2 * AUC – 1 AUC, Gini
Tenemos Gini = 0.60
Interpretación:
Gini> 0.5: aceptable.
Gini = 0.6–0.7: buen modelo.
Gini = 0.8+: Excelente, raramente logrado.
Conjunto de datos
El conjunto de datos utilizado en este blog es el conjunto de datos de crédito alemán, que está disponible públicamente en el repositorio de aprendizaje automático de UCI. Se proporciona bajo la licencia Creative Commons Attribution 4.0 International (CC por 4.0). Esto significa que se puede usar y compartir libremente con la atribución adecuada.
Espero que hayas encontrado este blog útil.
Si disfrutó de leer, considere compartirlo con su red y no dude en compartir sus pensamientos.
Si no ha leído mis blogs anteriores sobre ROC-AUC y Kolmogorov Smirnov Statistic, puede consultarlos aquí.
¡Gracias por leer!