machine-learning scikit-learn classification logistic-regression auc

machine learning - Obteniendo un bajo puntaje ROC AUC pero una alta precisión



machine-learning scikit-learn (2)

No sé qué es exactamente AIR_DEL15 , que usa como etiqueta (no está en los datos originales). Supongo que es una función desequilibrada, es decir, hay muchos más 0 que 1; en tal caso, la precisión como una métrica no es significativa, y en su lugar debe usar la precisión, la recuperación y la matriz de confusión; consulte también este hilo ).

Como ejemplo extremo, si el 87% de sus etiquetas son ceros, puede tener un "clasificador" de precisión del 87% simplemente (e ingenuamente) clasificando todas las muestras como 0; en tal caso, también tendría un AUC bajo (bastante cercano a 0.5, como en su caso).

Para una discusión más general (y muy necesaria, en mi opinión) de qué es exactamente AUC, vea mi otra respuesta.

Uso de una clase LogisticRegression en scikit-learn en una versión del conjunto de datos de retraso de vuelo .

Yo uso pandas para seleccionar algunas columnas:

df = df[["MONTH", "DAY_OF_MONTH", "DAY_OF_WEEK", "ORIGIN", "DEST", "CRS_DEP_TIME", "ARR_DEL15"]]

NaN valores de NaN con 0:

df = df.fillna({''ARR_DEL15'': 0})

Asegúrese de que las columnas categóricas estén marcadas con el tipo de datos ''categoría'':

df["ORIGIN"] = df["ORIGIN"].astype(''category'') df["DEST"] = df["DEST"].astype(''category'')

Luego llame a get_dummies() desde pandas :

df = pd.get_dummies(df)

Ahora entreno y pruebo mi conjunto de datos:

from sklearn.linear_model import LogisticRegression lr = LogisticRegression() test_set, train_set = train_test_split(df, test_size=0.2, random_state=42) train_set_x = train_set.drop(''ARR_DEL15'', axis=1) train_set_y = train_set["ARR_DEL15"] test_set_x = test_set.drop(''ARR_DEL15'', axis=1) test_set_y = test_set["ARR_DEL15"] lr.fit(train_set_x, train_set_y)

Una vez que llamo al método de score obtengo alrededor de 0.867. Sin embargo, cuando llamo al método roc_auc_score obtengo un número mucho menor de alrededor de 0.583

probabilities = lr.predict_proba(test_set_x) roc_auc_score(test_set_y, probabilities[:, 1])

¿Hay alguna razón por la cual el AUC ROC es mucho más bajo de lo que proporciona el método de score ?


Para empezar, decir que un AUC de 0.583 es ​​"más bajo" que un puntaje * de 0.867 es exactamente como comparar manzanas con naranjas.

[* Supongo que su score es de precisión media, pero esto no es crítico para esta discusión, podría ser cualquier otra cosa en principio]

Según mi experiencia, al menos, la mayoría de los profesionales de ML piensan que el puntaje de AUC mide algo diferente de lo que realmente hace : el uso común (y desafortunado) es como cualquier otra métrica de mayor-mejor-mejor, como la precisión, que puede naturalmente conduce a rompecabezas como el que te expresas.

La verdad es que, en términos generales, el AUC mide el rendimiento de un clasificador binario promediado en todos los umbrales de decisión posibles .

El threshold (decisión) en la clasificación binaria es el valor por encima del cual decidimos etiquetar una muestra como 1 (recuerde que los clasificadores probabilísticos en realidad devuelven un valor p en [0, 1], generalmente interpretado como una probabilidad; en scikit-learn es lo que predict_proba devuelve).

Ahora, este umbral, en métodos como scikit-learn, predict qué etiquetas de retorno ( 1/0 ) se establece en 0.5 de manera predeterminada , pero esta no es la única posibilidad, y puede que ni siquiera sea deseable en los casos venideros (datos desequilibrados, por ejemplo).

El punto para llevar a casa es que:

  • cuando solicita una score (que debajo del capó score , es decir, etiquetas y no probabilidades), también ha establecido implícitamente este umbral en 0.5
  • cuando solicita AUC (que, por el contrario, utiliza probabilidades devueltas con predict_proba ), no hay ningún umbral involucrado y obtiene (algo así) la precisión promedio en todos los umbrales posibles

Dadas estas aclaraciones, su ejemplo particular proporciona un caso muy interesante :

Obtengo una precisión bastante buena ~ 87% con mi modelo; ¿Debería importarme que, de acuerdo con un AUC de 0.58, mi clasificador funciona solo un poco mejor que la mera suposición aleatoria?

Siempre que la representación de clase en sus datos esté razonablemente equilibrada , la respuesta a estas alturas debería ser obvia: no, no debería importarle; para todos los casos prácticos, lo que le interesa es un clasificador desplegado con un umbral específico, y lo que este clasificador hace en una situación puramente teórica y abstracta cuando se promedia en todos los umbrales posibles debería representar muy poco interés para un profesional (sí plantea interés para un investigador con un nuevo algoritmo, pero supongo que este no es tu caso).

(Para los datos desequilibrados, el argumento cambia; la precisión aquí es prácticamente inútil, y debe considerar la precisión, la recuperación y la matriz de confusión en su lugar).

Por esta razón, AUC ha comenzado a recibir serias críticas en la literatura (no lo lea mal: el análisis de la curva ROC en sí es altamente informativo y útil); La entrada de Wikipedia y las referencias proporcionadas allí son lecturas muy recomendables:

Por lo tanto, el valor práctico de la medida AUC se ha cuestionado, lo que plantea la posibilidad de que el AUC pueda introducir más incertidumbre en las comparaciones de precisión de clasificación de aprendizaje automático que la resolución.

[...]

Una explicación reciente del problema con ROC AUC es que reducir la curva ROC a un solo número ignora el hecho de que se trata de las compensaciones entre los diferentes sistemas o puntos de rendimiento trazados y no el rendimiento de un sistema individual

El énfasis es mío: vea también los peligros de las AUC ...