Menú
Gratis
Registro
hogar  /  Instalación y configuración/ Problemas modernos de la ciencia y la educación. Métricas en problemas de clasificación Algoritmo para evaluar la calidad de la restauración de imágenes

Problemas modernos de la ciencia y la educación. Métricas en problemas de clasificación Algoritmo para evaluar la calidad de la restauración de imágenes

Según la salida de clientes del operador de telecomunicaciones.


Descargue las bibliotecas necesarias y mire los datos.

import pandas as pd import matplotlib.pyplot as plt from matplotlib.pylab import rc, plot import seaborn as sns from sklearn.preprocessing from sklearn.metrics import precision_recall_curve, Classification_report from sklearn.model_selection import train_test_split df = pd.read_csv(../ ../data/telecom_churn.csv")


df.cabeza(5)

Preprocesamiento de datos

# Asigne las columnas binarias # y codifique de forma ficticia el estado (para simplificar, es mejor no hacer esto para los modelos de madera) d = ("Sí": 1, "No": 0) df["Plan internacional"] = df ["Plan internacional"].map(d) df["Plan de correo de voz"] = df["Plan de correo de voz"].map(d) df["Churn"] = df["Churn"].astype(" int64" ) le = LabelEncoder() df["State"] = le.fit_transform(df["State"]) ohe = OneHotEncoder(sparse=False) encoded_state = ohe.fit_transform(df["State"].values.reshape (- 1, 1)) tmp = pd.DataFrame(estado_codificado, columnas=["estado " + str(i) for i in range(estado_codificado.forma)]) df = pd.concat(, eje=1)

Exactitud, precisión y recuperación

Antes de pasar a las métricas en sí, es necesario introducir un concepto importante para describir estas métricas en términos de errores de clasificación: matriz de confusión(matriz de errores).
Supongamos que tenemos dos clases y un algoritmo que predice si cada objeto pertenece a una de las clases, entonces la matriz de errores de clasificación se verá así:


Verdadero Positivo (TP) Falso positivo (FP)
Falso Negativo (FN) Verdadero Negativo (TN)

Aquí, está la respuesta del algoritmo sobre el objeto, y es la verdadera etiqueta de la clase sobre este objeto.
Así, existen dos tipos de errores de clasificación: Falso Negativo (FN) y Falso Positivo (FP).


Entrenamiento de algoritmos y construcción de matrices de error

X = df.drop("Churn", axis=1) y = df["Churn"] # Divide la muestra en entrenar y probar, todas las métricas se evaluarán en el conjunto de datos de prueba X_train, X_test, y_train, y_test = train_test_split( X, y , stratify=y, test_size=0.33, random_state=42) # Entrena la regresión logística nativa lr = LogisticRegression(random_state=42) lr.fit(X_train, y_train) # Usa la función para construir la matriz de error a partir de la documentación de sklearn def plot_confusion_matrix(cm, clases , normalizar=Falso, title="Matriz de confusión", cmap=plt.cm.Blues): """ This function prints and plots the confusion matrix. Normalization can be applied by setting `normalize=True`. """ plt.imshow(cm, interpolation="nearest", cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) if normalize: cm = cm.astype("float") / cm.sum(axis=1)[:, np.newaxis] print("Normalized confusion matrix") else: print("Confusion matrix, without normalization") print(cm) thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape), range(cm.shape)): plt.text(j, i, cm, horizontalalignment="center", color="white" if cm > thresh else "black") plt.tight_layout() plt.ylabel("True label") plt.xlabel("Predicted label") font = {"size" : 15} plt.rc("font", **font) cnf_matrix = confusion_matrix(y_test, lr.predict(X_test)) plt.figure(figsize=(10, 8)) plot_confusion_matrix(cnf_matrix, classes=["Non-churned", "Churned"], title="Matriz de confusión") plt.savefig("conf_matrix.png") plt.show()!}


Exactitud

Una métrica intuitiva, obvia y casi sin usar es la precisión: el porcentaje de respuestas correctas del algoritmo:



Esta métrica es inútil en problemas con clases desiguales, y esto es fácil de mostrar con un ejemplo.


Digamos que queremos evaluar el rendimiento de un filtro de spam de correo. Tenemos 100 correos electrónicos que no son spam, 90 de los cuales nuestro clasificador determinó correctamente (Verdadero negativo = 90, Falso positivo = 10) y 10 correos electrónicos no deseados, 5 de los cuales también fueron determinados correctamente por el clasificador (Verdadero positivo = 5, Falso negativo = 5).
Entonces precisión:



Sin embargo, si solo predecimos todos los correos electrónicos como no spam, obtenemos una mayor precisión:



Al mismo tiempo, nuestro modelo no tiene ningún poder predictivo, ya que inicialmente queríamos identificar correos electrónicos no deseados. La transición de una métrica común para todas las clases a indicadores individuales de calidad de clase nos ayudará a superar esto.

Precisión, recuperación y medida F

Para evaluar la calidad del algoritmo en cada una de las clases, introducimos por separado las métricas de precisión (exactitud) y recuperación (integridad).




La precisión se puede interpretar como la proporción de objetos llamados positivos por el clasificador y al mismo tiempo son realmente positivos, y la memoria muestra qué proporción de objetos de una clase positiva de todos los objetos de una clase positiva encontró el algoritmo.



Es la introducción de la precisión que no nos permite escribir todos los objetos en una sola clase, ya que en este caso obtenemos un aumento en el nivel de falsos positivos. La recuperación demuestra la capacidad del algoritmo para detectar una clase determinada, mientras que la precisión demuestra la capacidad de distinguir esta clase de otras clases.


Como señalamos anteriormente, hay dos tipos de errores de clasificación: falso positivo y falso negativo. En estadística, el primer tipo de error se denomina error de tipo I y el segundo tipo se denomina error de tipo II. En nuestra tarea de determinar la salida de suscriptores, el error del primer tipo será el error de un suscriptor fiel por uno que se va, ya que nuestra hipótesis nula es que ninguno de los suscriptores se va, y rechazamos esta hipótesis. En consecuencia, un error del segundo tipo será el "paso" del abonado saliente y la aceptación errónea de la hipótesis nula.


La precisión y la recuperación no dependen, a diferencia de la exactitud, de la proporción de clases y, por lo tanto, son aplicables en condiciones de muestras desequilibradas.
A menudo, en la práctica real, la tarea es encontrar el equilibrio óptimo (para el cliente) entre estas dos métricas. Un ejemplo clásico es el problema de determinar la salida de clientes.
Está claro que no podemos encontrar todo clientes agitados y solo su. Pero, habiendo determinado la estrategia y el recurso para la retención de clientes, podemos seleccionar los umbrales necesarios para la precisión y el recuerdo. Por ejemplo, podemos enfocarnos en retener solo a los clientes de alto margen o aquellos que tienen más probabilidades de irse, ya que tenemos recursos limitados en el centro de llamadas.


Normalmente, al optimizar los hiperparámetros de un algoritmo (por ejemplo, en el caso de iterar sobre una cuadrícula GridSearchCV) usa una métrica, cuya mejora esperamos ver en la muestra de prueba.
Hay varios varias maneras combinar precisión y recuperación en un criterio de calidad agregado. Medida F (generalmente): precisión y recuperación de la media armónica:



En este caso, determina el peso de la precisión en la métrica, y al mismo tiempo la media armónica (con un factor de 2, de modo que en el caso de precisión = 1 y recuperación = 1 tenemos)
La medida F alcanza su máximo en recuperación y precisión igual a uno y está cerca de cero si uno de los argumentos está cerca de cero.
sklearn tiene una práctica función _metrics.classification informe, que devuelve la recuperación, la precisión y la medida F de cada una de las clases, así como el número de instancias de cada clase.


informe = informe_clasificación(y_test, lr.predict(X_test), target_names=["No-batido", "Batido"]) print(informe)
clase precisión recordar puntaje f1 apoyo
no batido 0.88 0.97 0.93 941
batido 0.60 0.25 0.35 159
promedio/total 0.84 0.87 0.84 1100

Cabe señalar aquí que en el caso de tareas con clases desequilibradas que prevalecen en la práctica real, a menudo es necesario recurrir a técnicas de modificación artificial de conjuntos de datos para igualar la relación de clases. Hay muchos de ellos, y no los mencionaremos, puede ver algunos métodos y elegir el que se adapte a su tarea.

AUC-ROC y AUC-PR

Al convertir la respuesta real del algoritmo (generalmente la probabilidad de pertenecer a una clase, ver SVM por separado) en una etiqueta binaria, debemos elegir algún umbral en el que 0 se convierte en 1. Un umbral de 0.5 parece natural y cercano, pero es no siempre resulta óptimo, por ejemplo, en la citada falta de equilibrio de clases.


Una forma de evaluar el modelo como un todo, sin estar atado a un umbral específico, es AUC-ROC (o ROC AUC) - área ( A rea tu bajo C curva) bajo la curva de error ( R receptor O perando C curva característica). Esta curva es una línea de (0.0) a (1.1) en coordenadas de Tasa de verdaderos positivos (TPR) y Tasa de falsos positivos (FPR):




Ya conocemos TPR, esto es completitud, y FPR muestra qué proporción de objetos de la clase negativa predijo incorrectamente el algoritmo. En el caso ideal, cuando el clasificador no cometa errores (FPR = 0, TPR = 1), obtendremos el área bajo la curva igual a uno; de lo contrario, cuando el clasificador genera aleatoriamente probabilidades de clase, AUC-ROC tenderá a 0,5 ya que el clasificador generará la misma cantidad de TP y FP.
Cada punto del gráfico corresponde a la elección de algún umbral. El área bajo la curva en este caso muestra la calidad del algoritmo (más es mejor), además, la inclinación de la curva en sí es importante: queremos maximizar TPR mientras minimizamos FPR, lo que significa que nuestra curva idealmente debería tender a el punto (0,1).


Código de dibujo de la curva ROC

sns.set(font_scale=1.5) sns.set_color_codes("silenciado") plt.figure(figsize=(10, 8)) fpr, tpr, umbrales = roc_curve(y_test, lr.predict_proba(X_test)[:,1], pos_label=1) lw = 2 plt.plot(fpr, tpr, lw=lw, label="curva ROC") plt.plot(, ) plt.xlim() plt.ylim() plt.xlabel("Tasa de falsos positivos ") plt.ylabel("Tasa de verdaderos positivos") plt.title("Curva ROC") plt.savefig("ROC.png") plt.show()



El criterio AUC-ROC es resistente a las clases desequilibradas (spoiler: por desgracia, no todo es tan simple) y puede interpretarse como la probabilidad de que el clasificador clasifique más alto un objeto positivo seleccionado al azar (tendrá una mayor probabilidad de ser positivo ) que un objeto negativo seleccionado al azar .


Considere el siguiente problema: necesitamos seleccionar 100 documentos relevantes de 1 millón de documentos. Hemos aprendido dos algoritmos:

  • Algoritmo 1 devuelve 100 documentos, 90 de los cuales son relevantes. De este modo,

  • Algoritmo 2 devuelve 2000 documentos, 90 de los cuales son relevantes. De este modo,


Lo más probable es que elijamos el primer algoritmo, que produce muy pocos falsos positivos en comparación con su competidor. Pero la diferencia en la tasa de falsos positivos entre estos dos algoritmos extremadamente pequeño - solo 0.0019. Esto es consecuencia del hecho de que AUC-ROC mide la proporción de falsos positivos en relación con los verdaderos negativos, y en tareas en las que la segunda clase (más grande) no es tan importante para nosotros, es posible que no proporcione una imagen totalmente adecuada al comparar algoritmos. .


Para corregir la situación, volvamos a la integridad y precisión:

  • Algoritmo 1

  • Algoritmo 2


Ya existe una diferencia significativa entre los dos algoritmos: ¡0,855 de precisión!


La precisión y la recuperación también se utilizan para trazar la curva y, de manera similar a AUC-ROC, encontrar el área debajo de ella.



Cabe señalar aquí que en conjuntos de datos pequeños, el área bajo la curva PR puede ser demasiado optimista, ya que se calcula utilizando el método trapezoidal, pero generalmente hay suficientes datos en tales tareas. Para obtener detalles sobre la relación entre AUC-ROC y AUC-PR, consulte aquí.

Pérdida Logística

Aparte está la función de pérdida logística, definida como:



donde es la respuesta del algoritmo en el i-ésimo objeto, es la verdadera etiqueta de clase en el i-ésimo objeto y es el tamaño de la muestra.


Los detalles sobre la interpretación matemática de la función de pérdida logística ya se escribieron en la publicación sobre modelos lineales.
esta métrica Rara vez aparece en los requisitos comerciales, pero a menudo en las tareas de Kaggle.
Intuitivamente, uno puede pensar en minimizar el logloso como un problema de maximizar la precisión al penalizar las predicciones erróneas. Sin embargo, cabe señalar que logloss penaliza severamente la confianza del clasificador en la respuesta incorrecta.


Considere un ejemplo:


def logloss_crutch(y_true, y_pred, eps=1e-15): return - (y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) print("Logloss con clasificación incierta %f " % logloss_crutch(1, 0.5)) >> Logloss con clasificación incierta 0.693147 print("Logloss con clasificación segura y respuesta correcta %f" % logloss_crutch(1, 0.9)) >> Logloss con clasificación segura y respuesta correcta 0.105361 print(" Logloss para clasificación segura y respuesta incorrecta %f" % logloss_crutch(1, 0.1)) >> Logloss para clasificación segura y respuesta incorrecta 2.302585

¡Observe cómo aumentó dramáticamente el logloso con la respuesta incorrecta y la clasificación segura!
Por lo tanto, el error en un objeto puede provocar un deterioro significativo en el error general de la muestra. Dichos objetos a menudo son valores atípicos que deben recordarse para filtrar o considerar por separado.
Todo encaja si dibujas un gráfico logloss:



Se puede ver que cuanto más cerca de cero es la respuesta del algoritmo para la verdad básica = 1, mayor es el valor del error y más empinada crece la curva.

Para resumir:

  • En el caso de la clasificación multiclase, debe monitorear cuidadosamente las métricas de cada una de las clases y seguir la lógica de la decisión. tareas, en lugar de optimizar la métrica
  • En el caso de clases desiguales, es necesario seleccionar un equilibrio de clases para el entrenamiento y una métrica que refleje correctamente la calidad de la clasificación.
  • y madrugado por su ayuda en la elaboración del artículo. 

Este capítulo presenta métodos populares para evaluar la calidad de un modelo de clasificación, que también se utilizan en otros trabajos sobre este tema. Se proporciona su descripción y justificación de las métricas utilizadas para esta evaluación.

Métricas de evaluación de la calidad

Precisión total (exactitud)

Esta métrica es una de las métricas más simples y al mismo tiempo universales para evaluar la calidad de los algoritmos de clasificación. El valor de este coeficiente se calcula como la proporción de objetos correctamente clasificados sobre el número total de objetos de la muestra. Esta métrica es popular debido a su simplicidad y la capacidad de extenderse a cualquier número de clases. La principal desventaja de esta métrica es que asigna el mismo peso a todos los documentos, lo que puede no ser correcto en caso de un fuerte sesgo de los documentos en la muestra de capacitación hacia una o más clases. Esta métrica puede tener un valor alto, pero el clasificador dentro de la misma clase puede mostrar una calidad de trabajo extremadamente baja. Al mismo tiempo, la métrica no señala esto de ninguna manera.

Precisión, recuperación y medida F

Métricas como precisión (precisión) y recuperación (recall) por primera vez se utilizaron ampliamente para evaluar la calidad del trabajo de los sistemas que resuelven el problema de la recuperación de información. La precisión del sistema dentro de una clase es la proporción de objetos que realmente pertenecen a una determinada clase en relación con todos los objetos asignados por el sistema a esta clase. La completitud se expresa como la proporción de objetos encontrados por el clasificador que pertenecen a la clase en relación con todos los objetos de esta clase. La Tabla 4 es una tabla de contingencia de una clase separada, donde TP (positivo verdadero) es una solución positiva verdadera, TN (negativo verdadero) es una solución negativa verdadera, FP (positivo falso) es una solución positiva falsa y FN (negativo falso) es una decisión falsa-negativa.

Tabla 1 - Tabla de contingencia de clases de objetos

Entonces, la precisión y la recuperación se calculan como:

La medida F combina información sobre la precisión y la integridad del algoritmo que se evalúa. Se calcula como el promedio armónico de los indicadores de precisión y recuperación:

Debido a que la medida F se calcula por separado para cada clase, es conveniente utilizarla para buscar y analizar errores específicos del algoritmo, para evaluar una clasificación con varias clases. Al mismo tiempo, en el caso de un gran número de clases, se necesita una característica que agregue la integridad y la precisión de todas las clases y caracterice el comportamiento general del sistema. En este trabajo se utilizan para este propósito los siguientes valores agregados: precisión macro, que se calcula como la media aritmética de la precisión para todas las clases, recuperación macro, que se calcula como la media aritmética de la recuperación para todas las clases, y macro F-medida (Macro F-score), que es la media armónica entre ellos.

Validación cruzada

Uno de los métodos más comunes para realizar pruebas completas y evaluar el rendimiento de varios algoritmos de aprendizaje automático es la validación cruzada. Para una muestra independiente este método le permite obtener una estimación imparcial de la probabilidad de error, en contraste con el error promedio en la muestra de entrenamiento, que puede ser una estimación sesgada de la probabilidad de error debido al sobreajuste del algoritmo. Otra ventaja de este procedimiento es la capacidad de obtener una estimación de la probabilidad de un error de algoritmo, en ausencia de una muestra de control especialmente diseñada para la prueba.

Supongamos que es un conjunto de descripciones de características de objetos, en el que se especifica una muestra finita de precedentes, donde es un conjunto finito de clases. Se proporciona un mapeo que asocia una muestra arbitraria de precedentes con un algoritmo. Luego se estima el desempeño del algoritmo para una muestra arbitraria de precedentes utilizando el funcional de calidad:

donde hay una función no negativa que devuelve el valor de error del algoritmo dada la etiqueta de clase correcta.

¡Hola, Habr!

En las tareas de aprendizaje automático, las métricas se utilizan para evaluar la calidad de los modelos y comparar diferentes algoritmos, y su selección y análisis es una parte indispensable del trabajo de un científico de datos.

En este artículo, veremos algunos criterios de calidad en los problemas de clasificación, discutiremos qué es importante al elegir una métrica y qué puede salir mal.

Métricas en problemas de clasificación

para demostración características útiles aprender y una representación visual de las métricas, usaremos el conjunto de datos de abandono de clientes de nuestro operador de telecomunicaciones, que conocimos en el primer artículo del curso.

Descargue las bibliotecas necesarias y mire los datos.

Importar pandas como pd importar matplotlib.pyplot como plt de matplotlib.pylab importar rc, plot importar seaborn como sns de sklearn.preprocessing importar LabelEncoder, OneHotEncoder de sklearn.model_selection importar cross_val_score de sklearn.linear_model importar LogisticRegression de sklearn.ensemble importar RandomForestClassifier, GradientBoostingClassifier desde sklearn.metrics import precision_recall_curve, Classification_report from sklearn.model_selection import train_test_split df = pd.read_csv("../../data/telecom_churn.csv")

Df cabeza(5)

Preprocesamiento de datos

# Asigne las columnas binarias # y codifique de forma ficticia el estado (para simplificar, es mejor no hacer esto para los modelos de madera) d = ("Sí": 1, "No": 0) df["Plan internacional"] = df ["Plan internacional"].map(d) df["Plan de correo de voz"] = df["Plan de correo de voz"].map(d) df["Churn"] = df["Churn"].astype(" int64" ) le = LabelEncoder() df["State"] = le.fit_transform(df["State"]) ohe = OneHotEncoder(sparse=False) encoded_state = ohe.fit_transform(df["State"].values.reshape (- 1, 1)) tmp = pd.DataFrame(estado_codificado, columnas=["estado " + str(i) for i in range(estado_codificado.forma)]) df = pd.concat(, eje=1)

Exactitud, precisión y recuperación

Antes de pasar a las métricas en sí, es necesario introducir un concepto importante para describir estas métricas en términos de errores de clasificación: matriz de confusión(matriz de errores).
Supongamos que tenemos dos clases y un algoritmo que predice si cada objeto pertenece a una de las clases, entonces la matriz de errores de clasificación se verá así:

Verdadero Positivo (TP) Falso positivo (FP)
Falso Negativo (FN) Verdadero Negativo (TN)

es la respuesta del algoritmo sobre el objeto, y

La verdadera etiqueta de clase de este objeto.
Así, existen dos tipos de errores de clasificación: Falso Negativo (FN) y Falso Positivo (FP).

Entrenamiento de algoritmos y construcción de matrices de error

X = df.drop("Churn", axis=1) y = df["Churn"] # Divide la muestra en entrenar y probar, todas las métricas se evaluarán en el conjunto de datos de prueba X_train, X_test, y_train, y_test = train_test_split( X, y , stratify=y, test_size=0.33, random_state=42) # Entrena la regresión logística nativa lr = LogisticRegression(random_state=42) lr.fit(X_train, y_train) # Usa la función para construir la matriz de error a partir de la documentación de sklearn def plot_confusion_matrix(cm, clases , normalizar=Falso, title="Matriz de confusión", cmap=plt.cm.Blues): """ This function prints and plots the confusion matrix. Normalization can be applied by setting `normalize=True`. """ plt.imshow(cm, interpolation="nearest", cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) if normalize: cm = cm.astype("float") / cm.sum(axis=1)[:, np.newaxis] print("Normalized confusion matrix") else: print("Confusion matrix, without normalization") print(cm) thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape), range(cm.shape)): plt.text(j, i, cm, horizontalalignment="center", color="white" if cm > thresh else "black") plt.tight_layout() plt.ylabel("True label") plt.xlabel("Predicted label") font = {"size" : 15} plt.rc("font", **font) cnf_matrix = confusion_matrix(y_test, lr.predict(X_test)) plt.figure(figsize=(10, 8)) plot_confusion_matrix(cnf_matrix, classes=["Non-churned", "Churned"], title="Matriz de confusión") plt.savefig("conf_matrix.png") plt.show()!}

Exactitud

Una métrica intuitiva, obvia y casi sin usar es la precisión: el porcentaje de respuestas correctas del algoritmo:

Esta métrica es inútil en problemas con clases desiguales y es fácil de mostrar con un ejemplo.

Digamos que queremos evaluar el rendimiento de un filtro de spam de correo. Tenemos 100 correos electrónicos que no son spam, 90 de los cuales nuestro clasificador determinó correctamente (Verdadero negativo = 90, Falso positivo = 10) y 10 correos electrónicos no deseados, 5 de los cuales también fueron determinados correctamente por el clasificador (Verdadero positivo = 5, Falso negativo = 5 ).
Entonces precisión:

Sin embargo, si solo predecimos todos los correos electrónicos como no spam, obtenemos una mayor precisión:

Al mismo tiempo, nuestro modelo no tiene ningún poder predictivo, ya que inicialmente queríamos identificar correos electrónicos no deseados. La transición de una métrica común para todas las clases a indicadores individuales de calidad de clase nos ayudará a superar esto.

Precisión, recuperación y medida F

Para evaluar la calidad del algoritmo en cada una de las clases por separado, introducimos las métricas precisión (exactitud) y recuperación (integridad).

La precisión se puede interpretar como la proporción de objetos llamados positivos por el clasificador y al mismo tiempo son realmente positivos, y la memoria muestra qué proporción de objetos de una clase positiva de todos los objetos de una clase positiva encontró el algoritmo.

Es la introducción de la precisión que no nos permite escribir todos los objetos en una sola clase, ya que en este caso obtenemos un aumento en el nivel de falsos positivos. La recuperación demuestra la capacidad del algoritmo para detectar una clase determinada, mientras que la precisión demuestra la capacidad de distinguir esta clase de otras clases.

Como señalamos anteriormente, hay dos tipos de errores de clasificación: falso positivo y falso negativo. En estadística, el primer tipo de error se denomina error de tipo I y el segundo tipo se denomina error de tipo II. En nuestro problema de determinación de la salida de suscriptores, el error del primer tipo será el error de un suscriptor fiel por uno que se va, ya que nuestra hipótesis nula es que ninguno de los suscriptores está saliendo, y rechazamos esta hipótesis. En consecuencia, un error del segundo tipo será el "paso" del abonado saliente y la aceptación errónea de la hipótesis nula.

La precisión y la recuperación no dependen, a diferencia de la exactitud, de la proporción de clases y, por lo tanto, son aplicables en condiciones de muestras desequilibradas.
A menudo, en la práctica real, la tarea es encontrar el equilibrio óptimo (para el cliente) entre estas dos métricas. Un ejemplo clásico es el problema de determinar la salida de clientes.
Está claro que no podemos encontrar todo clientes agitados y solo su. Pero habiendo determinado la estrategia y el recurso para la retención de clientes, podemos seleccionar los umbrales necesarios para la precisión y el recuerdo. Por ejemplo, podemos concentrarnos en retener solo a los clientes de alto margen o aquellos que tienen más probabilidades de abandonar, ya que estamos limitados por los recursos del centro de llamadas.

Normalmente, al optimizar los hiperparámetros de un algoritmo (por ejemplo, en el caso de iterar sobre una cuadrícula GridSearchCV) usa una métrica, cuya mejora esperamos ver en la muestra de prueba.
Hay varias formas diferentes de combinar precisión y recuperación en una medida de calidad agregada. Medida F (generalmente

) - precisión armónica media y recuperación:

en este caso determina el peso de la precisión en la métrica y, cuando

esta es la media armónica (con un factor de 2, por lo que en el caso de precisión = 1 y recuperación = 1 tenemos

)
La medida F alcanza su máximo en recuperación y precisión igual a uno y está cerca de cero si uno de los argumentos está cerca de cero.
sklearn tiene una práctica función _metrics.classification informe que devuelve la recuperación, la precisión y la medida F para cada una de las clases, así como el número de instancias de cada clase.

Informe = informe_clasificación(y_test, lr.predict(X_test), target_names=["No-batido", "Batido"]) print(informe)

clase precisión recordar puntaje f1 apoyo
no batido 0.88 0.97 0.93 941
batido 0.60 0.25 0.35 159
promedio/total 0.84 0.87 0.84 1100

Cabe señalar aquí que en el caso de tareas con clases desequilibradas que prevalecen en la práctica real, a menudo es necesario recurrir a técnicas de modificación artificial de conjuntos de datos para igualar la relación de clases. Hay muchos de ellos y no los tocaremos, puede ver algunos métodos y elegir el que se adapte a su tarea.

AUC-ROC y AUC-PR

Al convertir la respuesta real del algoritmo (generalmente la probabilidad de pertenecer a una clase, ver SVM por separado) en una etiqueta binaria, debemos elegir algún umbral en el que 0 se convierte en 1. Un umbral de 0.5 parece natural y cercano, pero es no siempre resulta óptimo, por ejemplo, en la citada falta de equilibrio de clases.

Una forma de evaluar el modelo como un todo, sin estar atado a un umbral específico, es AUC-ROC (o ROC AUC) - área ( A rea tu bajo C curva) bajo la curva de error ( R receptor O perando C curva característica). Esta curva es una línea de (0.0) a (1.1) en coordenadas de Tasa de verdaderos positivos (TPR) y Tasa de falsos positivos (FPR):

Ya conocemos TPR, esto es completitud, y FPR muestra qué proporción de objetos de la clase negativa predijo incorrectamente el algoritmo. En el caso ideal, cuando el clasificador no cometa errores (FPR = 0, TPR = 1), obtendremos el área bajo la curva igual a uno, de lo contrario, cuando el clasificador produzca aleatoriamente probabilidades de clase, el AUC-ROC tenderá a 0.5, ya que el clasificador emitirá la misma cantidad de TP y FP.
Cada punto del gráfico corresponde a la elección de algún umbral. El área bajo la curva en este caso muestra la calidad del algoritmo (más es mejor), además, la inclinación de la curva en sí es importante: queremos maximizar TPR mientras minimizamos FPR, lo que significa que nuestra curva idealmente debería tender a el punto (0,1).

Código de dibujo de la curva ROC

sns.set(font_scale=1.5) sns.set_color_codes("silenciado") plt.figure(figsize=(10, 8)) fpr, tpr, umbrales = roc_curve(y_test, lr.predict_proba(X_test)[:,1], pos_label=1) lw = 2 plt.plot(fpr, tpr, lw=lw, label="curva ROC") plt.plot(, ) plt.xlim() plt.ylim() plt.xlabel("Tasa de falsos positivos ") plt.ylabel("Tasa de verdaderos positivos") plt.title("Curva ROC") plt.savefig("ROC.png") plt.show()

El criterio AUC-ROC es resistente a las clases desequilibradas (spoiler: por desgracia, no todo es tan simple) y puede interpretarse como la probabilidad de que el clasificador clasifique más alto un objeto positivo seleccionado al azar (tendrá una mayor probabilidad de ser positivo) que un objeto negativo seleccionado al azar.

Considere el siguiente problema: necesitamos seleccionar 100 documentos relevantes de 1 millón de documentos. Hemos aprendido dos algoritmos:

  • Algoritmo 1 devuelve 100 documentos, 90 de los cuales son relevantes. De este modo,
  • Algoritmo 2 devuelve 2000 documentos, 90 de los cuales son relevantes. De este modo,

Lo más probable es que elijamos el primer algoritmo, que produce muy pocos falsos positivos en comparación con su competidor. Pero la diferencia en la tasa de falsos positivos entre estos dos algoritmos extremadamente pequeño - solo 0.0019. Esto es consecuencia del hecho de que AUC-ROC mide la proporción de falsos positivos en relación con los verdaderos negativos, y en tareas en las que la segunda clase (más grande) no es tan importante para nosotros, es posible que no proporcione una imagen totalmente adecuada al comparar algoritmos. .

Para corregir la situación, volvamos a la integridad y precisión:

  • Algoritmo 1
  • Algoritmo 2

Ya existe una diferencia significativa entre los dos algoritmos: ¡0,855 de precisión!

La precisión y la recuperación también se utilizan para trazar la curva y, de manera similar a AUC-ROC, encontrar el área debajo de ella.

Cabe señalar aquí que en conjuntos de datos pequeños, el área bajo la curva PR puede ser demasiado optimista, ya que se calcula utilizando el método trapezoidal, pero generalmente hay suficientes datos en tales tareas. Para obtener detalles sobre la relación entre AUC-ROC y AUC-PR, consulte aquí.

Pérdida Logística

Aparte está la función de pérdida logística, definida como:

es la respuesta del algoritmo a

objeto ohmio,

etiqueta de clase verdadera en

objeto de ohmios, y

tamaño de la muestra.

Los detalles sobre la interpretación matemática de la función de pérdida logística ya se escribieron en la publicación sobre modelos lineales.
Esta métrica no suele aparecer en los requisitos comerciales, pero sí en las tareas de Kaggle.
Intuitivamente, uno puede pensar en minimizar el logloso como un problema de maximizar la precisión al penalizar las predicciones erróneas. Sin embargo, cabe señalar que logloss penaliza severamente la confianza del clasificador en la respuesta incorrecta.

Considere un ejemplo:

Def logloss_crutch(y_true, y_pred, eps=1e-15): return - (y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) print("Logloss con clasificación incierta %f " % logloss_crutch(1, 0.5)) >> Logloss con clasificación incierta 0.693147 print("Logloss con clasificación segura y respuesta correcta %f" % logloss_crutch(1, 0.9)) >> Logloss con clasificación segura y respuesta correcta 0.105361 print(" Logloss para clasificación segura y respuesta incorrecta %f" % logloss_crutch(1, 0.1)) >> Logloss para clasificación segura y respuesta incorrecta 2.302585

¡Observe cómo aumentó dramáticamente el logloso con la respuesta incorrecta y la clasificación segura!
Por lo tanto, el error en un objeto puede provocar un deterioro significativo en el error general de la muestra. Dichos objetos a menudo son valores atípicos que deben recordarse para filtrar o considerar por separado.
Todo encaja si dibujas un gráfico logloss:

Se puede ver que cuanto más cerca de cero es la respuesta del algoritmo para la verdad básica = 1, mayor es el valor del error y más empinada crece la curva.

Resumiendo:

  • En el caso de la clasificación multiclase, debe monitorear cuidadosamente las métricas de cada una de las clases y seguir la lógica de la decisión. tareas, en lugar de optimizar la métrica
  • En el caso de clases desiguales, es necesario seleccionar un equilibrio de clases para el entrenamiento y una métrica que refleje correctamente la calidad de la clasificación.
  • La elección de la métrica debe hacerse con un enfoque en el área temática, preprocesando los datos y, posiblemente, segmentando (como en el caso de dividir en clientes ricos y pobres)

Enlaces útiles

  1. Curso de Evgeny Sokolov: Seminario sobre la elección de modelos (hay información sobre las métricas de los problemas de regresión)
  2. Problemas para AUC-ROC por A.G. Dyakonova
  3. Puede leer más sobre otras métricas en kaggle. Se ha agregado un enlace a la competencia donde se usó a la descripción de cada métrica
  4. Presentación de Bogdan Melnyk, también conocido como ld86, sobre el aprendizaje en muestras no balanceadas

En las tareas de aprendizaje automático, las métricas se utilizan para evaluar la calidad de los modelos y comparar diferentes algoritmos, y su selección y análisis es una parte indispensable del trabajo de un científico de datos.

En este artículo, veremos algunos criterios de calidad en los problemas de clasificación, discutiremos qué es importante al elegir una métrica y qué puede salir mal.

Métricas en problemas de clasificación

Para demostrar características útiles aprender y una representación visual de las métricas, usaremos el conjunto de datos de abandono de clientes de nuestro operador de telecomunicaciones, que conocimos en el primer artículo del curso.

Descargue las bibliotecas necesarias y mire los datos.

Importar pandas como pd importar matplotlib.pyplot como plt de matplotlib.pylab importar rc, plot importar seaborn como sns de sklearn.preprocessing importar LabelEncoder, OneHotEncoder de sklearn.model_selection importar cross_val_score de sklearn.linear_model importar LogisticRegression de sklearn.ensemble importar RandomForestClassifier, GradientBoostingClassifier desde sklearn.metrics import precision_recall_curve, Classification_report from sklearn.model_selection import train_test_split df = pd.read_csv("../../data/telecom_churn.csv")

Df cabeza(5)


Preprocesamiento de datos

# Asigne las columnas binarias # y codifique de forma ficticia el estado (para simplificar, es mejor no hacer esto para los modelos de madera) d = ("Sí": 1, "No": 0) df["Plan internacional"] = df ["Plan internacional"].map(d) df["Plan de correo de voz"] = df["Plan de correo de voz"].map(d) df["Churn"] = df["Churn"].astype(" int64" ) le = LabelEncoder() df["State"] = le.fit_transform(df["State"]) ohe = OneHotEncoder(sparse=False) encoded_state = ohe.fit_transform(df["State"].values.reshape (- 1, 1)) tmp = pd.DataFrame(estado_codificado, columnas=["estado " + str(i) for i in range(estado_codificado.forma)]) df = pd.concat(, eje=1)

Exactitud, precisión y recuperación

Antes de pasar a las métricas en sí, es necesario introducir un concepto importante para describir estas métricas en términos de errores de clasificación: matriz de confusión(matriz de errores).
Supongamos que tenemos dos clases y un algoritmo que predice si cada objeto pertenece a una de las clases, entonces la matriz de errores de clasificación se verá así:

Verdadero Positivo (TP) Falso positivo (FP)
Falso Negativo (FN) Verdadero Negativo (TN)

Aquí, está la respuesta del algoritmo sobre el objeto, y es la verdadera etiqueta de la clase sobre este objeto.
Así, existen dos tipos de errores de clasificación: Falso Negativo (FN) y Falso Positivo (FP).

Entrenamiento de algoritmos y construcción de matrices de error

X = df.drop("Churn", axis=1) y = df["Churn"] # Divide la muestra en entrenar y probar, todas las métricas se evaluarán en el conjunto de datos de prueba X_train, X_test, y_train, y_test = train_test_split( X, y , stratify=y, test_size=0.33, random_state=42) # Entrena la regresión logística nativa lr = LogisticRegression(random_state=42) lr.fit(X_train, y_train) # Usa la función para construir la matriz de error a partir de la documentación de sklearn def plot_confusion_matrix(cm, clases , normalizar=Falso, title="Matriz de confusión", cmap=plt.cm.Blues): """ This function prints and plots the confusion matrix. Normalization can be applied by setting `normalize=True`. """ plt.imshow(cm, interpolation="nearest", cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) if normalize: cm = cm.astype("float") / cm.sum(axis=1)[:, np.newaxis] print("Normalized confusion matrix") else: print("Confusion matrix, without normalization") print(cm) thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape), range(cm.shape)): plt.text(j, i, cm, horizontalalignment="center", color="white" if cm > thresh else "black") plt.tight_layout() plt.ylabel("True label") plt.xlabel("Predicted label") font = {"size" : 15} plt.rc("font", **font) cnf_matrix = confusion_matrix(y_test, lr.predict(X_test)) plt.figure(figsize=(10, 8)) plot_confusion_matrix(cnf_matrix, classes=["Non-churned", "Churned"], title="Matriz de confusión") plt.savefig("conf_matrix.png") plt.show()!}


Exactitud

Una métrica intuitiva, obvia y casi sin usar es la precisión: el porcentaje de respuestas correctas del algoritmo:

Esta métrica es inútil en problemas con clases desiguales y es fácil de mostrar con un ejemplo.

Digamos que queremos evaluar el rendimiento de un filtro de spam de correo. Tenemos 100 correos electrónicos que no son spam, 90 de los cuales nuestro clasificador determinó correctamente (Verdadero negativo = 90, Falso positivo = 10) y 10 correos electrónicos no deseados, 5 de los cuales también fueron determinados correctamente por el clasificador (Verdadero positivo = 5, Falso negativo = 5 ).
Entonces precisión:

Sin embargo, si solo predecimos todos los correos electrónicos como no spam, obtenemos una mayor precisión:

Al mismo tiempo, nuestro modelo no tiene ningún poder predictivo, ya que inicialmente queríamos identificar correos electrónicos no deseados. La transición de una métrica común para todas las clases a indicadores individuales de calidad de clase nos ayudará a superar esto.

Precisión, recuperación y medida F

Para evaluar la calidad del algoritmo en cada una de las clases, introducimos por separado las métricas de precisión (exactitud) y recuperación (integridad).

La precisión se puede interpretar como la proporción de objetos llamados positivos por el clasificador y al mismo tiempo son realmente positivos, y la memoria muestra qué proporción de objetos de una clase positiva de todos los objetos de una clase positiva encontró el algoritmo.

Es la introducción de la precisión que no nos permite escribir todos los objetos en una sola clase, ya que en este caso obtenemos un aumento en el nivel de falsos positivos. La recuperación demuestra la capacidad del algoritmo para detectar una clase determinada, mientras que la precisión demuestra la capacidad de distinguir esta clase de otras clases.

Como señalamos anteriormente, hay dos tipos de errores de clasificación: falso positivo y falso negativo. En estadística, el primer tipo de error se denomina error de tipo I y el segundo tipo se denomina error de tipo II. En nuestra tarea de determinar la salida de suscriptores, el error del primer tipo será el error de un suscriptor fiel por uno que se va, ya que nuestra hipótesis nula es que ninguno de los suscriptores se va, y rechazamos esta hipótesis. En consecuencia, un error del segundo tipo será el "paso" del abonado saliente y la aceptación errónea de la hipótesis nula.

La precisión y la recuperación no dependen, a diferencia de la exactitud, de la proporción de clases y, por lo tanto, son aplicables en condiciones de muestras desequilibradas.
A menudo, en la práctica real, la tarea es encontrar el equilibrio óptimo (para el cliente) entre estas dos métricas. Un ejemplo clásico es el problema de determinar la salida de clientes.
Está claro que no podemos encontrar todo clientes agitados y solo su. Pero habiendo determinado la estrategia y el recurso para la retención de clientes, podemos seleccionar los umbrales necesarios para la precisión y el recuerdo. Por ejemplo, podemos enfocarnos en retener solo a los clientes de alto margen o aquellos que tienen más probabilidades de irse, ya que tenemos recursos limitados en el centro de llamadas.

Normalmente, al optimizar los hiperparámetros de un algoritmo (por ejemplo, en el caso de iterar sobre una cuadrícula GridSearchCV) usa una métrica, cuya mejora esperamos ver en la muestra de prueba.
Hay varias formas diferentes de combinar precisión y recuperación en una medida de calidad agregada. Medida F (generalmente): precisión y recuperación de la media armónica:

En este caso, determina el peso de la precisión en la métrica, y al mismo tiempo la media armónica (con un factor de 2, de modo que en el caso de precisión = 1 y recuperación = 1 tenemos)
La medida F alcanza su máximo en recuperación y precisión igual a uno y está cerca de cero si uno de los argumentos está cerca de cero.
sklearn tiene una práctica función _metrics.classification informe que devuelve la recuperación, la precisión y la medida F para cada una de las clases, así como el número de instancias de cada clase.

Informe = informe_clasificación(y_test, lr.predict(X_test), target_names=["No-batido", "Batido"]) print(informe)

clase precisión recordar puntaje f1 apoyo
no batido 0.88 0.97 0.93 941
batido 0.60 0.25 0.35 159
promedio/total 0.84 0.87 0.84 1100

Cabe señalar aquí que en el caso de tareas con clases desequilibradas que prevalecen en la práctica real, a menudo es necesario recurrir a técnicas de modificación artificial de conjuntos de datos para igualar la relación de clases. Hay muchos de ellos y no los mencionaremos, puede ver algunos métodos y elegir el que se adapte a su tarea.

AUC-ROC y AUC-PR

Al convertir la respuesta real del algoritmo (generalmente la probabilidad de pertenecer a una clase, ver SVM por separado) en una etiqueta binaria, debemos elegir algún umbral en el que 0 se convierte en 1. Un umbral de 0.5 parece natural y cercano, pero es no siempre resulta óptimo, por ejemplo, en la citada falta de equilibrio de clases.

Una forma de evaluar el modelo como un todo, sin estar atado a un umbral específico, es AUC-ROC (o ROC AUC) - área ( A rea tu bajo C curva) bajo la curva de error ( R receptor O perando C curva característica). Esta curva es una línea de (0.0) a (1.1) en coordenadas de Tasa de verdaderos positivos (TPR) y Tasa de falsos positivos (FPR):

Ya conocemos TPR, esto es completitud, y FPR muestra qué proporción de objetos de la clase negativa predijo incorrectamente el algoritmo. En el caso ideal, cuando el clasificador no cometa errores (FPR = 0, TPR = 1), obtendremos el área bajo la curva igual a uno; de lo contrario, cuando el clasificador genera aleatoriamente probabilidades de clase, AUC-ROC tenderá a 0,5 ya que el clasificador generará la misma cantidad de TP y FP.
Cada punto del gráfico corresponde a la elección de algún umbral. El área bajo la curva en este caso muestra la calidad del algoritmo (más es mejor), además, la inclinación de la curva en sí es importante: queremos maximizar TPR mientras minimizamos FPR, lo que significa que nuestra curva idealmente debería tender a el punto (0,1).

Código de dibujo de la curva ROC

sns.set(font_scale=1.5) sns.set_color_codes("silenciado") plt.figure(figsize=(10, 8)) fpr, tpr, umbrales = roc_curve(y_test, lr.predict_proba(X_test)[:,1], pos_label=1) lw = 2 plt.plot(fpr, tpr, lw=lw, label="curva ROC") plt.plot(, ) plt.xlim() plt.ylim() plt.xlabel("Tasa de falsos positivos ") plt.ylabel("Tasa de verdaderos positivos") plt.title("Curva ROC") plt.savefig("ROC.png") plt.show()


El criterio AUC-ROC es resistente a las clases desequilibradas (spoiler: por desgracia, no todo es tan simple) y puede interpretarse como la probabilidad de que el clasificador clasifique más alto un objeto positivo seleccionado al azar (tendrá una mayor probabilidad de ser positivo ) que un objeto negativo seleccionado al azar .

Considere el siguiente problema: necesitamos seleccionar 100 documentos relevantes de 1 millón de documentos. Hemos aprendido dos algoritmos:

  • Algoritmo 1 devuelve 100 documentos, 90 de los cuales son relevantes. De este modo,
  • Algoritmo 2 devuelve 2000 documentos, 90 de los cuales son relevantes. De este modo,

Lo más probable es que elijamos el primer algoritmo, que produce muy pocos falsos positivos en comparación con su competidor. Pero la diferencia en la tasa de falsos positivos entre estos dos algoritmos extremadamente pequeño - solo 0.0019. Esto es consecuencia del hecho de que AUC-ROC mide la proporción de falsos positivos en relación con los verdaderos negativos, y en tareas en las que la segunda clase (más grande) no es tan importante para nosotros, es posible que no proporcione una imagen totalmente adecuada al comparar algoritmos. .

Para corregir la situación, volvamos a la integridad y precisión:

  • Algoritmo 1
  • Algoritmo 2

Ya existe una diferencia significativa entre los dos algoritmos: ¡0,855 de precisión!

La precisión y la recuperación también se utilizan para trazar la curva y, de manera similar a AUC-ROC, encontrar el área debajo de ella.


Cabe señalar aquí que en conjuntos de datos pequeños, el área bajo la curva PR puede ser demasiado optimista, ya que se calcula utilizando el método trapezoidal, pero generalmente hay suficientes datos en tales tareas. Para obtener detalles sobre la relación entre AUC-ROC y AUC-PR, consulte aquí.

Pérdida Logística

Aparte está la función de pérdida logística, definida como:

aquí está la respuesta del algoritmo en el -ésimo objeto, la verdadera etiqueta de clase en el -ésimo objeto y el tamaño de la muestra.

Los detalles sobre la interpretación matemática de la función de pérdida logística ya se escribieron en la publicación sobre modelos lineales.
Esta métrica no suele aparecer en los requisitos comerciales, pero sí en las tareas de Kaggle.
Intuitivamente, uno puede pensar en minimizar el logloso como un problema de maximizar la precisión al penalizar las predicciones erróneas. Sin embargo, cabe señalar que logloss penaliza severamente la confianza del clasificador en la respuesta incorrecta.

Considere un ejemplo:

Def logloss_crutch(y_true, y_pred, eps=1e-15): return - (y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) print("Logloss con clasificación incierta %f " % logloss_crutch(1, 0.5)) >> Logloss con clasificación incierta 0.693147 print("Logloss con clasificación segura y respuesta correcta %f" % logloss_crutch(1, 0.9)) >> Logloss con clasificación segura y respuesta correcta 0.105361 print(" Logloss para clasificación segura y respuesta incorrecta %f" % logloss_crutch(1, 0.1)) >> Logloss para clasificación segura y respuesta incorrecta 2.302585

¡Observe cómo aumentó dramáticamente el logloso con la respuesta incorrecta y la clasificación segura!
Por lo tanto, el error en un objeto puede provocar un deterioro significativo en el error general de la muestra. Dichos objetos a menudo son valores atípicos que deben recordarse para filtrar o considerar por separado.
Todo encaja si dibujas un gráfico logloss:


Se puede ver que cuanto más cerca de cero es la respuesta del algoritmo para la verdad básica = 1, mayor es el valor del error y más empinada crece la curva.

Para resumir:

  • En el caso de la clasificación multiclase, debe monitorear cuidadosamente las métricas de cada una de las clases y seguir la lógica de la decisión. tareas, en lugar de optimizar la métrica
  • En el caso de clases desiguales, es necesario seleccionar un equilibrio de clases para el entrenamiento y una métrica que refleje correctamente la calidad de la clasificación.
  • mephistopheies y madrugado por su ayuda en la elaboración del artículo.

Cualquier científico de datos trabaja con grandes cantidades de datos todos los días. Se cree que alrededor del 60% - 70% del tiempo lo toma la primera etapa del flujo de trabajo: limpiar, filtrar y convertir datos a un formato adecuado para aplicar algoritmos de aprendizaje automático. En la segunda etapa se realiza el preprocesamiento y entrenamiento directo de los modelos. En el artículo de hoy, nos centraremos en el segundo paso del proceso y veremos las diversas técnicas y mejores prácticas que resultan de mi participación en más de 100 competencias de aprendizaje automático. A pesar de que los conceptos descritos son de carácter bastante general, serán útiles para resolver muchos problemas específicos.

¡Todos los ejemplos de código están escritos en Python!

Datos

Antes de aplicar algoritmos de aprendizaje automático, los datos deben convertirse en una representación tabular. Este proceso, que se muestra en la siguiente figura, es el más complejo y lento.

Datos en la base de datos: datos en la base de datos. Munging de datos: filtrado de datos. Datos útiles - datos útiles. Conversión de datos - conversión de datos. Datos tabulares - datos tabulares. Datos - variables independientes (características). Las etiquetas son variables dependientes (variables objetivo).

Una vez que se tabulan los datos, se pueden utilizar para entrenar modelos. La vista de tabla es la representación más común de datos en el aprendizaje automático y la minería de datos. Las filas de la tabla son objetos separados (observaciones). Las columnas de la tabla contienen variables independientes (características), indicadas X, y las variables dependientes (objetivo) indicadas y. Dependiendo de la clase de tarea, las variables de destino se pueden representar mediante una o más columnas.

Tipos de variables objetivo

Las variables de destino definen la clase de tarea y se pueden representar mediante una de las siguientes opciones:

  • Una columna con valores binarios: problema de clasificación de dos clases (clasificación binaria), cada objeto pertenece a una sola clase.
  • Una columna con valores reales: Problema de regresión, se predice un valor.
  • Múltiples columnas con valores binarios: problema de clasificación de múltiples clases, cada objeto pertenece a una sola clase.
  • Múltiples columnas con valores reales: Problema de regresión, se predicen múltiples valores.
  • Múltiples columnas con valores binarios: problema de clasificación de múltiples etiquetas, un objeto puede pertenecer a varias clases.

Métrica

A la hora de resolver cualquier problema de aprendizaje automático, es necesario poder evaluar el resultado, es decir, se necesita una métrica. Por ejemplo, para un problema de clasificación de dos clases, el área bajo la curva ROC (ROC AUC) generalmente se usa como métrica. En el caso de la clasificación multiclase, se suele utilizar la entropía cruzada categórica. En el caso de la regresión, es el error cuadrático medio (MSE).

No consideraremos las métricas en detalle, ya que pueden ser bastante diversas y se eligen para una tarea específica.

bibliotecas

El primer paso es instalar las bibliotecas básicas necesarias para realizar los cálculos, como entumecido Y espía. Luego, puede comenzar a instalar las bibliotecas más populares para el análisis de datos y el aprendizaje automático:

  • Exploración y transformación de datos: pandas(http://pandas.pydata.org/).
  • Una amplia gama de diferentes algoritmos de aprendizaje automático: scikit-aprender(http://scikit-learn.org/stable/).
  • Mejor implementación de aumento de gradiente: xgboost(https://github.com/dmlc/xgboost).
  • Redes neuronales: queras(http://keras.io/).
  • Visualización: matplotlib(http://matplotlib.org/).
  • Indicador de progreso de ejecución: tqdm(https://pypi.python.org/pypi/tqdm).

Hay que decir que no uso Anaconda(https://www.continuum.io/downloads). Anaconda combina la mayoría de las bibliotecas populares y simplifica enormemente el proceso de instalación, pero necesito más libertad. Tú decides. 🙂

Marco de aprendizaje automático

En 2015, presenté el concepto de un marco de aprendizaje automático automático. El sistema aún está en desarrollo, pero se lanzará pronto. La estructura del marco, que servirá como base para una presentación posterior, se muestra en la siguiente figura.

Figura de la publicación: Thakur A., ​​​​Kron-Grimberge A. AutoCompete: un marco para competencias en aprendizaje automático. (A. Thakur y A. Krohn-Grimberghe, AutoCompete: un marco para las competencias de aprendizaje automático).

En la entrada, el marco recibe datos que se han convertido previamente en una vista de tabla. Las líneas rosadas muestran la dirección para el caso más simple.

El primer paso es definir la clase de tarea. Esto se puede hacer analizando la variable de destino. La tarea puede ser una clasificación o una regresión, la clasificación puede ser de dos clases o de varias clases, las clases pueden superponerse o no. Después de definir la clase de tarea, dividimos el conjunto de datos original en dos partes y obtenemos un conjunto de entrenamiento (conjunto de entrenamiento) y un conjunto de validación (conjunto de validación), como se muestra en la siguiente figura.

En el caso de que se trate de clasificación, la separación de datos debe realizarse de forma que en los conjuntos resultantes la relación del número de objetos pertenecientes a diferentes clases corresponda a esta relación para el conjunto de datos original (desdoblamiento estratificado). Esto se puede hacer fácilmente con la clase EstratificadoKFold bibliotecas scikit-aprender.

Para el problema de regresión, la división usual usando la clase KDoblar, que también está disponible en la biblioteca scikitaprender.

Además, para el problema de regresión, existen métodos de separación de datos más complejos que aseguran la misma distribución de la variable objetivo en los conjuntos resultantes. Estos enfoques se dejan a la consideración del lector.

En el ejemplo de código anterior, el tamaño del conjunto de validación ( eval_size) es el 10% del conjunto de datos original. Este valor debe elegirse en función de la cantidad de datos iniciales.

Después de dividir los datos, todas las operaciones aplicadas al conjunto de entrenamiento deben almacenarse y luego aplicarse al conjunto de validación. El conjunto de validación nunca debe combinarse con el conjunto de entrenamiento. Si hacemos esto, obtendremos muy buenas puntuaciones, mientras que nuestros modelos serán inútiles debido al fuerte sobreajuste.

En el siguiente paso, definimos los tipos de características. Los tres tipos más comunes son numéricos, categóricos y de texto. Veamos el conjunto de datos del popular problema del pasajero del Titanic (https://www.kaggle.com/c/titanic/data).

En este conjunto de datos, la columna supervivencia contiene la variable objetivo. En el paso anterior, ya hemos separado la variable objetivo de las características. señales pclase, sexo Y embarcado son categóricos. señales edad, sibsp, tostar y como son numéricos. firmar nombre es texto Sin embargo, no creo que el nombre del pasajero sea útil para predecir si ese pasajero sobrevivió o no.

No es necesario convertir las características numéricas. Dichas funciones en su forma original están listas para la normalización y el entrenamiento de modelos.

Recuerde que antes de usar OneHotEncoder, necesita convertir categorías a números con Codificador de etiquetas.

Dado que los datos de la competencia Titanic no contienen buen ejemplo característica de texto, formulemos una regla general para la transformación de características de texto. Podemos combinar todas las características del texto en una sola y luego aplicar los algoritmos apropiados para convertir el texto en una representación numérica.

Las funciones de texto se pueden combinar de la siguiente manera:

Entonces podemos hacer la transformación con la clase. ContarVectorizador o TfidfVectorizer bibliotecas scikit-aprender.

Generalmente, TfidfVectorizer proporciona mejores resultados que ContarVectorizador. En la práctica, encontré que los siguientes valores de parámetros TfidfVectorizer son óptimos en la mayoría de los casos:

Si aplica el vectorizador solo al conjunto de entrenamiento, asegúrese de guardarlo en el disco para que luego pueda aplicarlo al conjunto de validación.

En el siguiente paso, las características obtenidas como resultado de las transformaciones descritas anteriormente se transfieren al apilador. Este nodo de marco combina todas las características transformadas en una sola matriz. Tenga en cuenta que en nuestro caso estamos hablando de un apilador de funciones, que no debe confundirse con un apilador de modelos, que es otra tecnología popular.

La combinación de características se puede hacer usando la función hstack bibliotecas entumecido(en el caso de características no dispersas (densas)) o usando la función hstack del módulo escaso bibliotecas espía(en el caso de características escasas).

En el caso de que se realicen otros pasos de preprocesamiento, por ejemplo, reducción de dimensionalidad o selección de características (que se discutirán más adelante), la combinación de las características obtenidas se puede realizar de manera eficiente utilizando la clase Unión de funciones bibliotecas scikitaprender.

Después de combinar todas las características en una matriz, podemos comenzar a entrenar los modelos. Debido a que las características no están normalizadas, este escenario solo se deben usar algoritmos de conjunto basados ​​en árboles de decisión:

  • RandomForestClassifier
  • RandomForestRegresor
  • ExtraTreesClassifier
  • ExtraTreesRegresor
  • Clasificador XGB
  • XGBRegresor

Para aplicar modelos lineales, es necesario realizar la normalización de características utilizando clases normalizador o escalador estándar bibliotecas scikit-aprender.

Estos métodos de normalización brindan un buen resultado solo en el caso de características no dispersas (densas). Aplicar escalador estándar a características escasas (escasas), como parámetro, debe especificar with_mean=Falso.

Si los pasos anteriores nos proporcionaron un "buen" modelo, podemos pasar a ajustar los hiperparámetros. Si el modelo no nos satisface, podemos seguir trabajando con características. En particular, podemos aplicar varias técnicas de reducción de dimensionalidad como pasos adicionales.

Para simplificar, no consideraremos el análisis discriminante lineal (LDA) ni el análisis discriminante cuadrático (QDA). En general, el análisis de componentes principales (PCA) se utiliza para reducir la dimensionalidad de los datos. Cuando trabaje con imágenes, debe comenzar con 10 - 15 componentes y aumentar este valor hasta que el resultado mejore significativamente. Cuando trabaje con otros tipos de datos, puede comenzar con 50 - 60 componentes.

En el caso de los datos de texto, después de convertir el texto en una matriz dispersa, puede aplicar una descomposición de valores singulares (SVD). Implementación de descomposición de valores singulares TruncadoSVD disponible en la biblioteca scikit-aprender.

El número de componentes de la descomposición en valor singular, que, por regla general, proporciona un buen resultado en el caso de características obtenidas como resultado de la transformación utilizando ContarVectorizador o TfidfVectorizer, es 120 - 200. Gran cantidad El componente permite mejorar ligeramente el resultado a costa de costos computacionales significativos.

Después de completar los pasos descritos, no olvide normalizar las características para poder aplicar modelos lineales. A continuación, podemos usar las funciones preparadas para entrenar los modelos o realizar una selección de funciones.

Hay varios métodos de selección de características. Uno de los métodos populares es el algoritmo de selección de características voraz. El algoritmo codicioso tiene el siguiente esquema. Paso 1: entrenar y evaluar el modelo en cada una de las características iniciales; seleccionamos una característica que proporciona la mejor estimación. Paso 2: entrene y evalúe el modelo en pares de características que consisten en la mejor característica seleccionada en el paso anterior y cada una de las características restantes; seleccione la mejor característica del resto. Repetimos pasos similares hasta que seleccionamos el número requerido de características, o hasta que se cumpla algún otro criterio. Opción de implementación este algoritmo, donde el área bajo la curva ROC se usa como métrica, está disponible en el siguiente enlace: https://github.com/abhishekkrthakur/greedyFeatureSelection. se debe notar que implementación dada imperfecto y requiere ciertas modificaciones para una tarea específica.

Otro método de selección de funciones más rápido es la selección mediante uno de los algoritmos de aprendizaje automático que evalúan la importancia de las funciones. Por ejemplo, puede usar la regresión logística o En el futuro, las funciones seleccionadas se pueden usar para entrenar otros algoritmos.

Al realizar la selección de características con un bosque aleatorio, tenga en cuenta que la cantidad de árboles debe ser pequeña y que el ajuste de hiperparámetros no debe realizarse en gran medida, de lo contrario, es posible el sobreajuste.

La selección de características también se puede realizar utilizando algoritmos de aumento de gradiente. Se recomienda utilizar la biblioteca. xgboost en lugar de la implementación correspondiente de scikit-aprender, porque la implementación xgboost mucho más rápido y escalable.

Algoritmos RandomForestClassifier, RandomForestRegresor Y xgboost también le permite realizar una selección de características en caso de datos escasos.

Otra técnica popular de selección de características no negativas es la selección de chi-cuadrado. Una implementación de este método también está disponible en la biblioteca. scikit-aprender.

En el código anterior, aplicamos la clase SeleccioneKBest junto con la prueba de chi-cuadrado ( chí2 ) para seleccionar las 20 funciones principales. El número de características que se van a muestrear es esencialmente un hiperparámetro que debe optimizarse para mejorar el rendimiento del modelo.

No olvide guardar las transformaciones que haya aplicado al conjunto de entrenamiento. Se necesitarán para evaluar los modelos en el conjunto de validación.

El siguiente paso es seleccionar un algoritmo de aprendizaje automático y ajustar los hiperparámetros.

En general, al elegir un algoritmo de aprendizaje automático, debe considerar las siguientes opciones:

  • Clasificación:
    • Bosque aleatorio (bosque aleatorio).
    • Regresión logística.
    • Bayes ingenuo.
    • Método de k vecinos más cercanos (k-vecinos más cercanos).
  • Regresión:
    • Bosque aleatorio (bosque aleatorio).
    • Aumento de gradiente.
    • Regresión lineal.
    • Regresión de cresta.
    • Regresión de lazo (regresión de lazo).
    • Máquinas de vectores soporte.

La siguiente tabla muestra los principales hiperparámetros de cada algoritmo y sus rangos de valores óptimos.

Etiqueta RS* en la tabla significa que no se pueden especificar valores óptimos y se debe realizar una búsqueda aleatoria.

Permíteme recordarte nuevamente, no olvides guardar todos los convertidores aplicados:

Y no olvide aplicarlos al conjunto de validación:

El enfoque que hemos considerado y el marco basado en él han mostrado buenos resultados en la mayoría de los conjuntos de datos con los que he tenido que trabajar. Por supuesto, al resolver problemas muy complejos, esta técnica no siempre da un buen resultado. Nada es perfecto, pero aprendiendo mejoramos. Al igual que lo hace en el aprendizaje automático.