Métodos de Kernel en Machine Learning: Kernel gaussiano (Ejemplo)

El propósito de este tutorial es hacer que un conjunto de datos sea separable linealmente. El aprendizaje se divide en dos partes:

1. Transformación de entidades
2. Entrenar un clasificador de kernel con Tensorflow

En la primera parte, comprenderá la idea detrás de un clasificador de kernel mientras que en la segunda parte, verá cómo entrenar un clasificador de kernel con Tensorflow. Utilizará el conjunto de datos para adultos. El objetivo de este conjunto de datos es clasificar los ingresos por debajo y por encima de 50k, conociendo el comportamiento de cada hogar.

En este tutorial aprenderás –

¿Por qué necesita los métodos del núcleo?

El objetivo de cada clasificador es predecir las clases correctamente. Para eso, el conjunto de datos debe ser separable. Mire la trama de abajo; es bastante simple ver que todos los puntos por encima de la línea negra pertenecen a la primera clase y los otros puntos a la segunda clase. Sin embargo, es extremadamente raro tener un conjunto de datos tan simple. En la mayoría de los casos, los datos no son separables. Le da a los clasificadores ingenuos como una regresión logística un momento difícil.


En la figura siguiente, trazamos un conjunto de datos que no es linealmente separable. Si trazamos una línea recta, la mayoría de los puntos no se clasificarán en la clase correcta.

Una forma de abordar este problema es tomar el dataset y transformar los datos en otro mapa de entidades. Significa que usará una función para transformar los datos en otro plan, que debería ser lineable.


Los datos de la figura anterior están en un plan de dos dimensiones que no es separable. Puede intentar transformar estos datos en una dimensión de tres, es decir, crear una figura con 3 ejes.

En nuestro ejemplo, aplicaremos una asignación polinómica para llevar nuestros datos a una dimensión 3D. La fórmula para transformar los datos es la siguiente.

Defina una función en Python para crear los nuevos mapas de entidades

Puede usar numpy para codificar la fórmula anterior:

Formula Equivalent Numpy Code
x x[:,0]**
y x[:,1]
x2 x[:,0]**2
np.sqrt(2)*
xy x[:,0]*x[:,1]
y2 x[:,1]**2

El nuevo mapeo debe tener 3 dimensiones con 16 puntos

Hagamos una nueva trama con 3 ejes, x, y y z respectivamente.


Vemos una mejora, pero si cambiamos la orientación de la trama, está claro que el dataset es ahora separable


Para manipular un dataset grande y es posible que tenga que crear más de 2 dimensiones, se enfrentará a un gran problema utilizando el método anterior. De hecho, es necesario transformar todos los puntos de datos, lo que claramente no es sostenible. Le llevará años, y su computadora puede quedarse sin memoria.

La forma más común de superar este problema es usar un kernel.

¿Qué es un kernel en el aprendizaje automático?

La idea es utilizar un espacio de entidad de mayor dimensión para hacer que los datos se separen casi linealmente como se muestra en la figura anterior.

Hay muchos espacios dimensionales superiores para hacer que los puntos de datos puedan separarse. Por ejemplo, hemos demostrado que el mapeo polinomio es un gran comienzo.

También hemos demostrado que con una gran cantidad de datos, esta transformación no es eficiente. En su lugar, puede utilizar una función del núcleo para modificar los datos sin cambiar a un nuevo plan de características.

La magia del núcleo es encontrar una función que evite todos los problemas que implica el cálculo de alta dimensión. El resultado de un kernel es un escalar, o dicho de manera diferente estamos de vuelta al espacio unidimensional

Después de encontrar esta función, puede conectarla al clasificador lineal estándar.

Veamos un ejemplo para entender el concepto de Kernel. Tienes dos vectores, x1 y x2. El objetivo es crear una dimensión superior mediante un mapeo polinomio. La salida es igual al producto de puntos del nuevo mapa de entidades. Desde el método anterior, debe:

1. Transformar x1 y x2 en una nueva dimensión
2. Calcular el producto de puntos: común a todos los núcleos
3. Transformar x1 y x2 en una nueva dimensión

Puede utilizar la función creada anteriormente para calcular la dimensión superior.

Salida

Calcular el producto de puntos

Puede usar el punto objeto de numpy para calcular el producto de punto entre el primer y el segundo vector almacenado en x_1.

La salida es 8100. Verá el problema, debe almacenar en la memoria un nuevo mapa de entidades para calcular el producto de puntos. Si tiene un conjunto de datos con millones de registros, es computacionalmente ineficaz.

En su lugar, puede utilizar el núcleo polinómico para calcular el producto de puntos sin transformar el vector. Esta función calcula el producto de puntos de x1 y x2 como si estos dos vectores se hubieran transformado en la dimensión superior. Dicho de otra manera, una función del núcleo calcula los resultados del producto de punto desde otro espacio de entidad.

Puede escribir la función del núcleo polinomio en Python de la siguiente manera.

Es el poder del producto de puntos de dos vectores. A continuación, devuelve el segundo grado del núcleo polinomio. La salida es igual al otro método. Esta es la magia del núcleo.

Tipo de métodos del núcleo

Hay un montón de diferentes granos disponibles. El más simple es el núcleo lineal. Esta función funciona bastante bien para la clasificación de texto. El otro núcleo es:

  • Núcleo polinomial
  • Núcleo gaussiano

En el ejemplo con TensorFlow, vamos a utilizar Random Fourier. TensorFlow tiene un estimador de compilación para calcular el nuevo espacio de entidades. Esta función es una aproximación de la función del núcleo gaussiano.

Esta función calcula la similitud entre los puntos de datos en un espacio dimensional mucho más alto.

Entrenar clasificador de kernel gaussiano con TensorFlow

El objetivo del algoritmo es clasificar el hogar que gana más o menos de 50k.

Evaluará una regresión logística para tener un modelo de referencia. Después de eso, entrenará a un clasificador de Kernel para ver si puede obtener mejores resultados.

Utilice las siguientes variables del dataset adulto:

  • edad
  • clase de trabajo
  • Fnlwgt
  • educación
  • núm_educación_de_educación
  • conyugal
  • ocupación
  • relación
  • raza
  • sexo
  • capital_gain
  • capital_loss
  • horas_semana
  • native_country
  • etiqueta

Usted procederá de la siguiente manera antes de entrenar y evaluar el modelo:

  • Paso 1) Importar las bibliotecas
  • Paso 2) Importar los datos
  • Paso 3) Preparar los datos
  • Paso 4) Construir el input_fn
  • Paso 5) Construir el modelo logístico: Modelo de línea de base
  • Paso 6) Evaluar el modelo
  • Paso 7) Construir el clasificador Kernel
  • Paso 8) Evaluar el clasificador del núcleo

Paso 1) Importar las bibliotecas

Para importar y entrenar el modelo, debe importar tensorflow, pandas y numpy

Paso 2) Importar los datos

Usted descarga los datos de la siguiente página web e importa como un marco de datos panda.

Ahora que el tren y el conjunto de pruebas están definidos, puede cambiar la etiqueta de columna de cadena a enteros. tensorflow no acepta el valor de cadena para la etiqueta.

Paso 3) Preparar los datos

El dataset contiene entidades continuas y categóricas. Una buena práctica es estandarizar los valores de las variables continuas. Puede utilizar la función StandardScaler de sci-kit learn. También se crea una función definida por el usuario para facilitar la conversión del tren y el conjunto de pruebas. Tenga en cuenta que, concatenar las variables continuas y categóricas a un conjunto de datos común y la matriz debe ser del tipo: float32

La función de transformador está lista, puede convertir el conjunto de datos y crear la función input_fn.

En el siguiente paso, entrenará una regresión logística. Le dará una precisión de línea base. El objetivo es superar la línea de base con un algoritmo diferente, a saber, un clasificador Kernel.

Paso 4) Construir el modelo logístico: modelo de línea de base

La columna de entidad se construye con el objeto real_valued_column. Se asegurará de que todas las variables sean datos numéricos densos.

El estimador se define utilizando TensorFlow Estimator, indica las columnas de entidad y dónde guardar el gráfico.

Usted entrenará la regresión logisitc usando mini-lotes de tamaño 200.

Puede entrenar el modelo con 1.000 iteración

Paso 6) Evaluar el modelo

Defina el estimador numpy para evaluar el modelo. Utilizar todo el conjunto de datos para la evaluación

Tiene una precisión del 82 por ciento. En la siguiente sección, intentarás vencer al clasificador logístico con un clasificador Kernel

Paso 7) Construir el clasificador Kernel

El estimador del núcleo no es tan diferente del clasificador lineal tradicional, al menos en términos de construcción. La idea detrás es usar el poder del kernel explícito con el clasificador lineal.

Necesita dos estimadores predefinidos disponibles en TensorFlow para entrenar el Clasificador de Kernel:

  • RandomFourierFeatureMapper
  • KernellinearClassifier

Aprendió en la primera sección que necesita transformar la dimensión baja en una dimensión alta usando una función kernel. Más precisamente, usará el Fourier aleatorio, que es una aproximación de la función gaussiana. Afortunadamente, Tensorflow tiene la función en su biblioteca: RandomFourierFeatureMapper. El modelo se puede entrenar utilizando el estimador KernelLineClassifier.

Para construir el modelo, siga estos pasos:

1. Establecer la función Kernel de alta dimensión
2. Establecer el hiperparámetro L2
3. Construir el modelo
4. Entrenar el modelo
5. Evaluar el modelo

Paso A) Establecer la función de núcleo de alta dimensión

El dataset actual contiene 14 entidades que transformará en una nueva dimensión alta del vector de 5.000 dimensiones. Utilice las entidades aleatorias de Fourier para lograr la transformación. Si recuerda la fórmula del núcleo gaussiano, observa que existe el parámetro de desviación estándar para definir. Este parámetro controla la medida de similitud empleada durante la clasificación.

Puede ajustar todos los parámetros en RandomFourierFeatureMapper con:

  • input_dim = 14
  • output_dim= 5000
  • stddev=4

Necesita construir el mapeador del núcleo usando las columnas de entidades creadas antes: feat_column

Paso B) Establecer el hiperparámetro L2

Para evitar el exceso de ajuste, penaliza la función de pérdida con el regularizador L2. Establecer el hiperparámetro L2 en 0.1 y la tasa de aprendizaje en 5

Paso C) Construir el modelo

El siguiente paso es similar a la clasificación lineal. Se utiliza el estimador integrado KernelLineClassifier. Tenga en cuenta que agrega el mapeador del núcleo definido previamente y cambia el directorio del modelo.

Paso D) Entrenar el modelo

Ahora que el clasificador Kernel está construido, está listo para entrenarlo. Usted elige iterar 2000 veces el modelo

Paso E) Evaluar el modelo

Por último, pero no menos importante, usted evalúa el rendimiento de su modelo. Deberías ser capaz de superar la regresión logística.

La precisión final es del 84%, es una mejora del 2% en comparación con la regresión logística. Existe un equilibrio entre la mejora de la precisión y el costo computacional. Debe pensar si una mejora del 2% vale la pena el tiempo consumido por el clasificador diferente y si tiene un impacto convincente en su negocio.

Resumen

Un núcleo es una gran herramienta para transformar datos no lineales a (casi) lineales. La deficiencia de este método es computacionalmente lento y costoso.

A continuación, puede encontrar el código más importante para entrenar a un clasificador de kernel

Establecer la función Kernel de alta dimensión

  • input_dim = 14
  • output_dim= 5000
  • stddev=4


Establecer el hiperparámetro L2

Construir el modelo

Entrenar el modelo

Evaluar el modelo
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 *