Este artículo es una continuación al primer artículo de ML y que tiene bajo supuesto que usted ya está familiarizado con ciertas definiciones enseñadas previamente.
El artículo tiene cómo fin enseñar la “mecánica” como entrenar cualquier modelo de Machine Learning (ML). Este es un paso posterior a la fase de transformación de datos. Sin embargo este punto quedará pendiente. Pero, básicamente ese paso es el de transformar los datos, y básicamente “dejarlos listos para ser usados en el modelo ML”.
Hay 3 pilares fundamentales que tienen todos los entrenamientos de modelos de ML, implícitamente o explícitamente (mostrados o no en el código) estos son:
- Modelo (y/o estructura) para evaluar la relación entre los datos.
- Forma que el modelo aprende de los datos, evalúa el error y cambia para mejorar.
- Especificación de los datos a entrenar. Número de iteraciones, epochs o alguna otra métrica para decirle al modelo “entrena hasta aquí y no más”.
A continuación se presenta cada uno de estos puntos con ejemplos concretos.
Icons made by itim2101 from www.flaticon.comModelo a Seleccionar
Este punto hace relación con escoger una estructura para evaluar e interpretar los datos (de input a output). Por ejemplo, si creemos que la relación entre unas variables es lineal con respecto a otra que queremos predecir, se usará un modelo de regresión lineal. Si es una estructura más compleja puede ser una red neural. Si por ejemplo, se quiere predecir si un cliente se va de un banco o no, se puede usar un árbol de decisión. Qué básicamente dice que los clientes que se van tienes ciertas características comunes. Más aún que estas características son unidimensionales. Es decir, no se combinan entre ellas en formas complejas sino que se establecen rangos para cada variable. Más concreto considere estos ejemplos:
- Regresión lineal: Se trabajó con esta cuando se analizó la encuesta del trabajo remoto. Aquí se determinó una relación lineal entre la productividad del trabajador y otras 3 variables que eran: espacio de trabajo, comunicación en general y priorizar las tareas a realizar. Donde cada variable tenía un “peso” sobre la productividad de trabajo.
- Árbol de decisión: Se trabajó con esto en el modelo de fuga de clientes de un banco. Aquí se determinó que: “Los clientes mayores de 42 años que no son miembros activos o son miembros pero tienen 3 o más productos son más propensos a irse.” Lo que hace el modelo es crear grupos lo más homogéneos posibles. Donde por un lado están los grupos donde hay más clientes leales que se quedan en el banco. Y en otros, en cambio, donde se van.
- Redes neuronales: Estos modelos la gran gracia que tienen es que simulan como funcionan las neuronas. Permitiéndoles ser altamente flexibles y no lineales (esto es un tremendo plus). Se crearán en un futuro varios artículos de estos. El problema que tienen estos modelos es que es difícil saber que hacen para predecir. Cuesta entender su lógica para llegar a los resultados. Al igual que en las relaciones lineales, se puede distinguir los pesos que tienen cada neuronas (y sus sesgos). Pero dada la gran cantidad de pesos o neuronas que generalmente se trabaja y su difícil relación con cada variable del modelo su interpretación queda en segundo plano.
¿Cómo se programa esto?
Esta parte es la más simple, ya que está todo creado y listo para usar, siguiendo los ejemplos anteriores se tienen los siguientes códigos:
Regresión lineal:linear_model.LinearRegression()
Árbol de decisión: tree.DecisionTreeClassifier()
Red neuronal: tf.keras.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28, 1)), tf.keras.layers.Dense(200, activation=tf.nn.relu), tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
El último caso de la red neuronal requiere un explicación. Este es una red neuronal que toma imágenes y las clasifica (hay 10 posibilidades distintas). Las imágenes son de 28 x 28 en tonos de grises (por eso el 1 después de los 28). El modelo cuenta con 200 neuronas, y la imagen que le llega la transforma en un solo vector analizadas por estas neuronas. Se explicará mejor este tipo de modelos en otro artículo. Por ahora, es importante solo que entienda que este es una estructura por la cual se evalúan los datos diferentes a las anteriores.
Aprendiendo de los Datos
La idea de usar un modelo de ML es aprender de los datos. En el apartado anterior, se creó una estructura pero no se dijo como se iba a aprender de los datos. Siga esta metáfora, imagínese usted va a comprar ropa. Lo primero que debe hacer es escoger el tipo de ropa que quiere (esto es el apartado anterior). Por ejemplo, si quiere unos pantalones, ya que está haciendo frio para usar short, y le faltan pantalones eso comprará. Al escoger que va a usar los pantalones debe probarse distintos modelos y tallas disponibles y así ver cual le queda mejor. Habrá algunos muy apretados y otros muy sueltos. Al probar distintos modelos, por prueba y error (teniendo en mente, por ejemplo, que es talla 47) encontrará su pantalón ideal.
Usted en el apartado anterior de modelo a seleccionar, escogió su ropa a comprar (siguiendo la metáfora). Y cuando usted selecciona el pantalón perfecto desechando un pantalón talla 47 porque le aprieta y escogiendo otro de talla 50 está aprendiendo de errores. Este es el punto que se tocará en este apartado.
Icons made by Freepik from www.flaticon.com¿Cómo se programa esto?
Regresión lineal: No sé preocupe por esto en este caso. Las regresiones lineales tratan de reducir el error cuadrático entre el valor predicho y el real. Es decir, al escoger las regresiones lineales no se debe preocupar de este punto, ya que viene definido por “default”.
Árbol de decisión: En general, tampoco debe preocuparse por esto (cuando se define el DecisionTreeClassifier por sklearn viene por “default” una métrica para aprender de los errores).
Redes neuronales: Aquí debe definir todo. Desde el learning rate (estos son los pasos como se mueve cuando encuentra un error. Por ejemplo, si encuentra un pantalón talla 40 apretado y lo cambia por uno de talla 60 tiene un learning rate más alto que alguien que lo cambia por uno de 42). Por otra parte, está él cómo definir que el pantalón que se probo es el equivocado (o en realidad definir que tan equivocado está). Ejemplos de estos son:
- Puede ver si el pantalón es apretado para rechazarlo y está ser la métrica más importante.
- Puede ver su figura con distintos tamaños (ajustado piernas u otras partes pueden ser un plus o un contra).
- Largo del pantalón.
- Otros criterios.
Un ejemplo de código es el siguiente:
model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), metrics=['accuracy'])
Acá se define todo lo que se mencionó anteriormente. ‘Adam’ es una forma de actualizar “inteligentemente” el learning rate especial, ya que el tamaño del paso depende de que tan grande fue el error y en que dirección han sido los errores anteriores. A mayor error, mayor será el paso. Por otro lado, para la dirección del error trata de sacar un “promedio” de hacia donde ha estado yendo el algoritmo. Loss es la forma de medir el error. Y el metrics es un registro que entrega el modelo para que podamos evaluar que tan bueno fue el modelo final. El loss que uso en este caso, se usa para variables categóricas (siguiendo el ejemplo del apartado anterior).
Hasta donde entrenar y qué entrenar.
En este punto es hasta donde se llega para decir ¡este es mi pantalón! Aquí hay varios conceptos importantes como iteración, epoach y batch size. No se profundizará en ninguno de ellos. La idea es entender qué se debe hacer aquí y el fin de esta tarea.
¿Cómo se programa esto?
Regresión lineal: ¡Este caso es muy interesante!, ya que hay una forma analítica (ecuación normal) para llegar al mínimo total. Sin embargo, esta no se puede usar si son muchos datos y/o ‘features‘, ya que no se puede computar y por esto se usa el gradiente.
Árbol de decisión: tree.DecisionTreeClassifier(max_leaf_nodes=8). En los árboles de decisión hay varios criterios para decidir hasta que punto seguir “creando más ramas del árbol”. El max_leaf_nodes es uno de ellos y específica la profundidad del árbol.
Redes neuronales: Nuevamente este es el más complejo. El código luciría algo así:
model.fit(train_dataset, epochs=5).
Donde Epoach 5 quiere decir que el modelo recorra 5 veces toda la base de datos del training set. Esto último tiene sentido, ya que en un paso previo los datos se ordenan aleatoriamente y se seleccionan batch (de un determinado tamaño) para entrenar el modelo. Estos conceptos no es necesario que los entienda aquí, ya que serán materia de otro artículo. Lo que sí es importante es notar que se específica hasta cuando se va a correr el modelo.
¡Y es así como llega a su modelo ideal!
Otros ejemplos de este último punto es en k-means el argumento max_iter (revise esta fuente y vea lo que hace este argumento). Pero, en resumen, este argumento también dice, cuando parar de entrenar el modelo.