Clasificador lineal en TensorFlow: Ejemplo de Clasificación Binaria

¿Qué es Linear Classifier?

Las dos tareas de aprendizaje supervisado más comunes son la regresión lineal y el clasificador lineal. La regresión lineal predice un valor mientras que el clasificador lineal predice una clase. Este tutorial se centra en Clasificador Lineal.

Los problemas de clasificación representan aproximadamente el 80 por ciento de la tarea de aprendizaje automático. La clasificación tiene como objetivo predecir la probabilidad de cada clase dada un conjunto de entradas. La etiqueta (es decir, la variable dependiente) es un valor discreto, llamado clase.

1. Si la etiqueta tiene sólo dos clases, el algoritmo de aprendizaje es un clasificador binario.
2. Clasificador multiclass aborda etiquetas con más de dos clases.

Por ejemplo, un problema típico de clasificación binaria es predecir la probabilidad de que un cliente realice una segunda compra. Predecir que el tipo de animal mostrado en una imagen es problema de clasificación multiclass ya que hay más de dos variedades de animales existentes.

La parte teórica de este tutorial pone el foco principal en la clase binaria. Aprenderá más sobre la función de salida multiclass en un tutorial futuro.

En este tutorial, aprenderá

¿Cómo funciona el clasificador binario?

Aprendió en el tutorial anterior que una función se compone de dos tipos de variables, una variable dependiente y un conjunto de entidades (variables independientes). En la regresión lineal, una variable dependiente es un número real sin rango. El objetivo principal es predecir su valor minimizando el error cuadrado medio.

Para una tarea binaria, la etiqueta puede haber tenido dos valores enteros posibles. En la mayoría de los casos, es [0,1] o [1,2]. Por ejemplo, el objetivo es predecir si un cliente va a comprar un producto o no. La etiqueta se define de la siguiente manera:

  • Y = 1 (el cliente compró el producto)
  • Y = 0 (el cliente no compra el producto)

El modelo utiliza las características X para clasificar a cada cliente en la clase más probable a la que pertenece, es decir, comprador potencial o no.

La probabilidad de éxito se calcula con regresión logística. El algoritmo calculará una probabilidad basada en la característica X y predice un éxito cuando esta probabilidad está por encima del 50 por ciento. Más formalmente, la probabilidad se calcula de la siguiente manera:

donde 0 es el conjunto de pesos, las características y b el sesgo.

La función se puede descomponer en dos partes:

  • El modelo lineal
  • La función logística

Modelo lineal

Ya está familiarizado con la forma en que se calculan los pesos. Los pesos se calculan utilizando un producto de punto: Y es una función lineal de todas las entidades xi. Si el modelo no tiene características, la predicción es igual al sesgo, b.

Los pesos indican la dirección de la correlación entre las entidades xi y la etiqueta y. Una correlación positiva aumenta la probabilidad de la clase positiva mientras que una correlación negativa conduce la probabilidad más cerca de 0, (es decir, clase negativa).

El modelo lineal devuelve sólo el número real, lo que es incoherente con la medida de probabilidad del rango [0,1]. La función logística es necesaria para convertir la salida del modelo lineal en una probabilidad,

Función logística

La función logística, o función sigmoide, tiene una forma S y la salida de esta función siempre está entre 0 y 1.

Es fácil sustituir la salida de la regresión lineal en la función sigmoide. Resulta en un nuevo número con una probabilidad entre 0 y 1.

El clasificador puede transformar la probabilidad en una clase

  • Los valores entre 0 y 0.49 se convierten en clase 0
  • Los valores entre 0.5 y 1 se convierten en clase 1

¿Cómo medir el rendimiento del Clasificador Lineal?

Exactitud

El rendimiento general de un clasificador se mide con la métrica de precisión. Precisión recopila todos los valores correctos divididos por el número total de observaciones. Por ejemplo, un valor de precisión del 80 por ciento significa que el modelo es correcto en el 80 por ciento de los casos.

Puede notar una deficiencia con esta métrica, especialmente para la clase de desequilibrio. Un dataset de desequilibrio se produce cuando el número de observaciones por grupo no es igual. Digamos que tratas de clasificar un evento raro con una función logística. Imagine que el clasificador intenta estimar la muerte de un paciente después de una enfermedad. En los datos, el 5 por ciento de los pacientes fallan. Puede entrenar a un clasificador para predecir el número de muertes y utilizar la métrica de precisión para evaluar el rendimiento. Si el clasificador predice 0 muerte para todo el conjunto de datos, será correcto en el 95 por ciento del caso.

Matriz de confusión

Una mejor manera de evaluar el rendimiento de un clasificador es mirar la matriz de confusión.

La matriz de confusión visualiza la precisión de un clasificador comparando las clases reales y predecidas. La matriz de confusión binaria se compone de cuadrados:

  • TP: Verdadero positivo: valores predichos correctamente predichos como positivos reales
  • FP: valores predichos incorrectamente predijeron un positivo real. Es decir, valores negativos predichos como positivos
  • FN: False Negativo: Valores positivos predichos como negativos
  • TN: Verdadero Negativo: Valores predichos correctamente predichos como negativos reales

A partir de la matriz de confusión, es fácil comparar la clase real y la clase predicha.

Precisión y sensibilidad

La matriz de confusión proporciona una buena comprensión de lo verdadero positivo y falso positivo. En algún caso, es preferible tener una métrica más concisa.

Precisión

La métrica de precisión muestra la precisión de la clase positiva. Mide la probabilidad de que la predicción de la clase positiva sea correcta.

La puntuación máxima es 1 cuando el clasificador clasifica perfectamente todos los valores positivos. La precisión por sí sola no es muy útil porque ignora la clase negativa. La métrica suele estar emparejada con la métrica Recuperar. Recordar también se llama sensibilidad o tasa positiva verdadera.

Sensibilidad

La sensibilidad calcula la proporción de clases positivas detectadas correctamente. Esta métrica da lo bueno que es el modelo para reconocer una clase positiva.

Clasificador lineal con TensorFlow

Para este tutorial, vamos a utilizar el conjunto de datos del censo. El propósito es utilizar las variables del conjunto de datos censales para predecir el nivel de ingresos. Tenga en cuenta que el ingreso es una variable binaria

  • con un valor de 1 si el ingreso > 50k
  • 0 si los ingresos son < 50k.

Esta variable es su etiqueta

Este conjunto de datos incluye ocho variables categóricas:

  • lugar de trabajo
  • educación
  • conyugal
  • ocupación
  • relación
  • raza
  • sexo
  • native_country

además, seis variables continuas:

  • edad
  • Fnlwgt
  • núm_educación_de_educación
  • capital_gain
  • capital_loss
  • horas_semana

A través de este ejemplo, comprenderá cómo entrenar un clasificador lineal con el estimador TensorFlow y cómo mejorar la métrica de precisión.

Procederemos de la siguiente manera:

  • Paso 1) Importar los datos
  • Paso 2) Conversión de datos
  • Paso 3) Entrenar al clasificador
  • Paso 4) Mejorar el modelo
  • Paso 5) Hiperparámetro: Lazo y Ridge

Paso 1) Importar los datos

Primero debe importar las bibliotecas utilizadas durante el tutorial.

A continuación, se importan los datos del archivo de UCI y se definen los nombres de las columnas. Utilizará COLUMNAS para nombrar las columnas de un marco de datos pandas.

Tenga en cuenta que entrenará al clasificador usando un marco de datos Pandas.

Los datos almacenados en línea ya están divididos entre un conjunto de trenes y un conjunto de pruebas.

El conjunto de trenes contiene 32,561 observaciones y el conjunto de pruebas 16,281

Tensorflow requiere un valor booleano para entrenar el clasificador. Necesita convertir los valores de cadena a entero. La etiqueta se almacena como un objeto, sin embargo, debe convertirla en un valor numérico. El siguiente código crea un diccionario con los valores para convertir y bucle sobre el elemento de columna. Tenga en cuenta que realiza esta operación dos veces, una para la prueba del tren, otra para el conjunto de pruebas

En los datos del tren, hay 24,720 ingresos inferiores a 50k y 7841 por encima. La relación es casi la misma para el conjunto de pruebas. Consulte este tutorial sobre facetas para obtener más información.

Paso 2) Conversión de datos

Se requieren algunos pasos antes de entrenar un clasificador lineal con Tensorflow. Debe preparar las operaciones que se incluirán en el modelo. En la regresión de referencia, utilizará los datos originales sin aplicar ninguna transformación.

El estimador necesita tener una lista de entidades para entrenar el modelo. Por lo tanto, los datos de la columna requieren ser convertidos en un tensor.

Una buena práctica es definir dos listas de entidades basadas en su tipo y luego pasarlas en las feature_columns del estimador.

Comenzará convirtiendo entidades continuas y, a continuación, definirá un bucket con los datos categóricos.

Las características del conjunto de datos tienen dos formatos:

  • Entero
  • Objeto

Cada entidad se enumera en las dos variables siguientes según sus tipos.

La feature_column está equipada con un objeto numeric_column para ayudar en la transformación de las variables continuas en tensor. En el siguiente código, se convierten todas las variables de CONTI_FACTIES en un tensor con un valor numérico. Esto es obligatorio para construir el modelo. Todas las variables independientes deben convertirse en el tipo adecuado de tensor.

A continuación escribimos un código para que pueda ver lo que está sucediendo detrás de feature_column.numeric_column. Imprimiremos el valor convertido para la edad Es para fines explicativos, por lo tanto, no hay necesidad de entender el código python. Puede consultar la documentación oficial para entender los códigos.

Los valores son exactamente los mismos que en df_train

De acuerdo con la documentación de TensorFlow, hay diferentes formas de convertir datos categóricos. Si la lista de vocabulario de una característica es conocida y no tiene muchos valores, es posible crear la columna categórica con categorical_column_with_vocabulary_list. Se asignará a todas las listas de vocabulario único una identificación.

Por ejemplo, si un estado de variable tiene tres valores distintos:

  • Marido
  • Esposa
  • Soltero

Entonces se le atribuirán tres ID. Por ejemplo, Husband tendrá la ID 1, Esposa la ID 2 y así sucesivamente.

A título ilustrativo, puede utilizar este código para convertir una variable de objeto en una columna categórica en TensorFlow.

El sexo característico solo puede tener dos valores: masculino o femenino. Cuando vamos a convertir el sexo característica, Tensorflow creará 2 nuevas columnas, una para macho y otra para hembra. Si el sexo es igual a masculino, entonces la nueva columna masculina será igual a 1 y hembra a 0. Este ejemplo se muestra en la siguiente tabla:

filas sexo después de la transformación masculino mujer
1 masculino => 1 0
2 masculino => 1 0
3 mujer => 0 1

En tensorflow:

A continuación, agregamos código Python para imprimir la codificación. Nuevamente, no necesita comprender el código, el propósito es ver la transformación

Sin embargo, una forma más rápida de transformar los datos es utilizar el método categorical_column_with_hash_bucket. Alterar variables de cadena en una matriz dispersa será útil. Una matriz dispersa es una matriz con casi cero. El método se ocupa de todo. Solo necesita especificar el número de cubos y la columna clave. El número de cubos es la cantidad máxima de grupos que Tensorflow puede crear. La columna clave es simplemente el nombre de la columna a convertir.

En el siguiente código, se crea un bucle sobre todas las entidades categóricas.

Paso 3) Entrenar al Clasificador

TensorFlow proporciona actualmente un estimador para la regresión lineal y la clasificación lineal.

  • Regresión lineal: LinearRegresor
  • Clasificación lineal: LinearClassifier

La sintaxis del clasificador lineal es la misma que en el tutorial sobre regresión lineal, excepto por un argumento, n_class. Necesita definir la columna de entidad, el directorio del modelo y, comparar con el regresor lineal; tiene el definir el número de clase. Para una regresión logit, el número de clase es igual a 2.

El modelo calculará los pesos de las columnas contenidas en continuous_features y categorical_features.

SALIDA:

Ahora que el clasificador está definido, puede crear la función de entrada. El método es el mismo que en el tutorial regresor lineal. Aquí, utiliza un tamaño de lote de 128 y baraja los datos.

Cree una función con los argumentos requeridos por el estimador lineal, es decir, número de épocas, número de lotes y barajar el dataset o la nota. Dado que utiliza el método Pandas para pasar los datos al modelo, es necesario definir las variables X como un marco de datos pandas. Tenga en cuenta que recorre todos los datos almacenados en CARACTERÍSTICAS.

Vamos a entrenar el modelo con el objeto model.train. Utilice la función previamente definida para alimentar el modelo con los valores adecuados. Tenga en cuenta que establece el tamaño del lote en 128 y el número de épocas en Ninguno. El modelo será entrenado más de mil pasos.

Obsérvese que la pérdida disminuyó posteriormente durante los últimos 100 pasos, es decir, de 901 a 1000.

La pérdida final después de mil iteraciones es 5444. Puede estimar su modelo en el conjunto de pruebas y ver el rendimiento. Para evaluar el rendimiento de su modelo, debe utilizar la evaluación del objeto. Alimenta el modelo con el conjunto de pruebas y establece el número de épocas en 1, es decir, los datos irán al modelo solo una vez.

TensorFlow devuelve todas las métricas que aprendió en la parte teórica. Sin sorpresa, la precisión es grande debido a la etiqueta desequilibrada. En realidad, el modelo funciona un poco mejor que una conjetura aleatoria. Imagine que el modelo predice todos los hogares con ingresos inferiores a 50K, entonces el modelo tiene una precisión del 70 por ciento. En un análisis más detallado, se puede ver la predicción y el recuerdo son bastante bajos.

Paso 4) Mejorar el modelo

Ahora que tiene un modelo de referencia, puede intentar mejorarlo, es decir, aumentar la precisión. En el tutorial anterior, aprendiste a mejorar el poder de predicción con un término de interacción. En este tutorial, revisitará esta idea añadiendo un término polinomio a la regresión.

La regresión polinómica es instrumental cuando hay no linealidad en los datos. Hay dos formas de capturar la no linealidad en los datos.

  • Añadir término polinomio
  • Bucketizar la variable continua en una variable categórica

Término polinomio

En la imagen de abajo, puede ver qué es una regresión polinómica. Es una ecuación con variables X con diferente potencia. Una regresión polinómica de segundo grado tiene dos variables, X y X al cuadrado. El tercer grado tiene tres variables:X, X2,and X3

A continuación, construimos un gráfico con dos variables, X e Y. Es obvio que la relación no es lineal. Si añadimos una regresión lineal, podemos ver que el modelo es incapaz de capturar el patrón (imagen izquierda).

Ahora, mira la imagen de la izquierda de la imagen de abajo, agregamos cinco términos a la regresión (que es y=x+x2+x3+x4+x5. El modelo ahora captura mucho mejor el patrón. Este es el poder de la regresión polinómica.

Volvamos a nuestro ejemplo. La edad no está en una relación lineal con los ingresos. La edad temprana puede tener un ingreso fijo cercano a cero porque los niños o los jóvenes no trabajan. Luego aumenta en la edad de trabajar y disminuye durante la jubilación. Típicamente es una forma U invertida. Una forma de capturar este patrón es agregando un poder dos a la regresión.

Veamos si aumenta la precisión.

Debe agregar esta nueva entidad al dataset y en la lista de entidad continua.

Agregue la nueva variable en el conjunto de datos de tren y prueba, por lo que es más conveniente escribir una función.

La función tiene 3 argumentos:

  • df_t: definir el conjunto de entrenamiento
  • df_te: definir el conjunto de pruebas
  • var_name = ‘age’: Define la variable a transformar

Puede usar el objeto pow (2) para cuadrar la variable edad. Tenga en cuenta que la nueva variable se denomina ‘nueva’

Ahora que la función square_var está escrita, puede crear los nuevos datasets.

Como puede ver, el nuevo dataset tiene una entidad más.

La variable cuadrada se denomina nueva en el conjunto de datos. Debe agregarlo a la lista de entidades continuas.

Tenga en cuenta que ha cambiado el directorio del Graph. No se pueden entrenar diferentes modelos en el mismo directorio. Significa que debe cambiar la ruta del argumento model_dir. Si no lo hace, TensorFlow generará un error.

Ahora que el clasificador está diseñado con el nuevo dataset, puede entrenar y evaluar el modelo.

La variable cuadrada mejoró la precisión de 0.76 a 0.79. Vamos a ver si usted puede hacerlo mejor combinando la bucketización y el término de interacción juntos.

Bucketización e interacción

Como ha visto antes, un clasificador lineal no puede capturar correctamente el patrón de ingresos por edad. Esto se debe a que aprende un solo peso para cada característica. Para que sea más fácil para el clasificador, una cosa que puede hacer es agrupar la entidad. El sistema de intervalos transforma una entidad numérica en varias entidades determinadas según el rango en el que cae, y cada una de estas nuevas características indica si la edad de una persona cae dentro de ese rango.

Con estas nuevas funciones, el modelo lineal puede capturar la relación aprendiendo diferentes pesos para cada cucharón.

En TensorFlow, se hace con bucketized_column. Debe agregar el rango de valores en los límites.

Ya sabes que la edad no es lineal con los ingresos. Otra forma de mejorar el modelo es a través de la interacción. En la palabra de TensorFlow, es cruce de entidades. El cruce de entidades es una forma de crear nuevas entidades que son combinaciones de las existentes, lo que puede ser útil para un clasificador lineal que no puede modelar las interacciones entre entidades.

Puedes desglosar la edad con otra característica como la educación. Es decir, algunos grupos son propensos a tener un ingreso alto y otros bajos (Piense en el estudiante de doctorado).

Para crear una columna de entidad cruzada, utilice crossed_column con las variables que se cruzan en un corchete. El hash_bucket_size indica las posibilidades máximas de cruce. Para crear interacción entre variables (al menos una variable debe ser categórica), puede usar tf.feature_column.crossed_column. Para utilizar este objeto, debe agregar entre corchetes la variable para interactuar y un segundo argumento, el tamaño del cubo. El tamaño del cubo es el número máximo de grupo posible dentro de una variable. Aquí lo configuras en 1000 ya que no sabes el número exacto de grupos

age_buckets debe ser cuadrado antes de agregarlo a las columnas de entidades. También agrega las nuevas entidades a las columnas de entidades y prepara el estimador

SALIDA

Está listo para estimar el nuevo modelo y ver si mejora la precisión.

El nuevo nivel de precisión es del 83.58 por ciento. Es cuatro por ciento más alto que el modelo anterior.

Por último, puede agregar un término de regularización para evitar el exceso de ajuste.

Paso 5) Hiperparámetro: Lazo y Ridge

Su modelo puede sufrir de montaje excesivo o de montaje inferior.

  • Sobreajuste: el modelo no puede generalizar la predicción a nuevos datos
  • Underfitting: el modelo no puede capturar el patrón de los datos. Es decir, regresión lineal cuando los datos no son lineales

Cuando un modelo tiene muchos parámetros y una cantidad relativamente baja de datos, conduce a predicciones deficientes. Imagine que un grupo solo tiene tres observaciones; el modelo calculará un peso para este grupo. El peso se utiliza para hacer una predicción; si las observaciones del conjunto de pruebas para este grupo en particular son completamente diferentes del conjunto de entrenamiento, entonces el modelo hará una predicción incorrecta. Durante la evaluación con el conjunto de entrenamiento, la precisión es buena, pero no buena con el conjunto de pruebas porque los pesos calculados no son los verdaderos para generalizar el patrón. En este caso, no hace una predicción razonable sobre datos no vistos.

Para evitar el exceso de ajuste, la regularización le da las posibilidades de controlar esta complejidad y hacerla más generalizable. Existen dos técnicas de regularización:

  • L1: Lazo
  • L2: Ridge

En TensorFlow, puede agregar estos dos hiperparámetros en el optimizador. Por ejemplo, cuanto mayor es el hiperparámetro L2, el peso tiende a ser muy bajo y cercano a cero. La línea ajustada será muy plana, mientras que una L2 cercana a cero implica que los pesos están cerca de la regresión lineal regular.

Puede probar por sí mismo el valor diferente de los hiperparámetros y ver si puede aumentar el nivel de precisión.

Tenga en cuenta que si cambia el hiperparámetro, debe eliminar la carpeta en curso/train4, de lo contrario, el modelo comenzará con el modelo previamente entrenado.

Vamos a ver cómo es la precisión con el bombo

SALIDA

SALIDA

SALIDA

Con este hiperparámetro, aumenta ligeramente las métricas de precisión. En el siguiente tutorial, aprenderá cómo mejorar un clasificador lineal usando un método kernel.

Resumen

Para entrenar a un modelo, necesita:

  • Definir las características: Variables independientes: X
  • Definir la etiqueta: Variable dependiente: y
  • Construir un tren o conjunto de pruebas
  • Definir el peso inicial
  • Definir la función de pérdida: MSE
  • Optimizar el modelo: Descenso de gradiente
  • Definir:
  • Tasa de aprendizaje
  • Número de épocas
  • Tamaño del lote
  • Número de clase

En este tutorial, aprendió a utilizar la API de alto nivel para un clasificador de regresión lineal. Necesita definir:

    1. Columnas de entidades. Si es continuo: tf.feature_column.numeric_column (). Puede rellenar una lista con la comprensión de la lista de python
    2. El estimador: tf.estimator.linearClassifier (feature_columns, model_dir, n_classes = 2)
    3. Una función para importar los datos, el tamaño del lote y la época: input_fn ()

Después de eso, usted está listo para entrenar, evaluar y hacer una predicción con train (), evaluate () y predict ()

Para mejorar el rendimiento del modelo, puede:

  • Usar regresión polinómica
  • Término de interacción: tf.feature_column.crossed_column
  • Agregar parámetro de regularización
0 replies

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *