Autor: Jhonathan Borda Moreno

  • Aprendizaje supervisado – Regresión

    Aprendizaje supervisado – Regresión

    La regresión nos permite predecir uno o varios valores.

    OLS

    Uno de los algoritmos mas simples es el OLS. Sirve tanto para regresión simple como regresión múltiple. Consiste en una función matemática muy sencilla(combinación lineal de los atributos) del siguiente modo:

    \hat{y}=W_0+W_1\cdot X_1+\cdots +W_p\cdot X_p

    \hat{y} es el valor predicho, X hace referencia a los parámetros y W a los coeficientes del modelo; W_0 es el termino independiente de la combinación lineal.

    Este es un proceso iterativo en el que vamos ajustando los coeficientes y por lo tanto requiere una función objetivo(función de bondad o coste)) para evaluar la bondad de una posible solución, en OLS la función se expresa como:

    f(W_0,\cdots,W_p)=\frac{1}{2n}\cdot\sum_{i=1}^{n}((W_0+\sum_{j=1}^{p}W_j\cdot X_{i,j})-y_i)^2

    Básicamente consiste en la suma de las diferencias al cuadrado entre la estimación del modelo(coeficientes) y la clase real. El factor \frac{1}{2n} actúa como corrección al volumen de datos de entrenamiento, con el fin de normalizar la función objetivo.

    Particularidades a tener en cuenta

    • Simplicidad del modelo.
    • El modelo es fácil de interpretar. A mayor valor del coeficiente mas relevancia tiene en el modelo.
    • Gran eficacia en problemas de índole lineal.
    • Tiempo de entrenamiento muy razonable.
    • Tiempo de predicción casi instantáneo debido a que genera una única función matemática.

     

    • Se requiere variables estadísticamente independiente, sin correlación significativa.
    • Los valores se deben aproximar a una distribución normal. Los outliers afectan significativamente al modelo.
    • La homocedasticidad de los datos.

    En el ejemplo a continuación se usa validación cruzada pero es innecesario por que no hay parámetros a optimizar.

    En el anterior ejemplo de OLS introducimos esta métrica, y es que es exclusiva de modelos lineales. R^2 es el coeficiente de determinación y recoge la cantidad de variabilidad de la clase con respecto a su media aritmética.

    R^2=1-\frac{\sum_{i=1}^{n}(y_i-\hat{y_i})^2}{\sum_{i=1}^{n}(y_i-\bar{y})^2}

    \bar{y} es la media aritmética de los valores de una clase. En R^2=1 indica una predicción perfecta.

    KNN (Vecinos más cercanos)

    Este método se basa en la premisa de que ejemplos similares presentan un comportamiento similar en su clase, es decir que podemos agrupar por sus características. Este acercamiento nos sirve tanto para regresión como clasificación y por su algoritmo lo podemos usar tanto en aprendizaje supervisado como no supervisado.

    Básicamente en aprendizaje supervisado consiste en generar como predicción el promedio de los ejemplos de entrenamiento mas parecidos a la entrada. Para encontrar los vecinos mas cercanos la clave esta en definir una distancia:

    • Minkowski(e_i,e_j)=(\sum_{d=1}^{p}|x_{i,d}-x_{j,d}|^q)^{\frac{1}{q}}
    • Euclidea(e_i,e_j)=\sqrt{\sum_{d=1}^{p}|x_{i,d}-x_{j,d}|^2}

    En realidad es la misma distancia y solo vamos variando el valor de la q.

    En la mayoría de los casos la distancia mas usada es la euclídea. Sin embargo independiente de la que queramos usar la distancia debe cumplir con las siguientes propiedades matemáticas:

    • No negatividad: d(e_i,e_j)\geq0
    • Identidad: d(e_i,e_j)=0\Leftrightarrow e_i=e_j
    • Simetría: d(e_i,e_j)=d(e_j,e_i)
    • Desigualdad triangular: d(e_i,e_r)+d(e_r,e_j)\geqd(e_i,e_j)

    Particularidades a tener en cuenta

    • Es fundamental estandarizar los atributos, este algoritmo es muy sensible a la escala en los rangos de valores.
    • Determinar una buena función de distancia.
    • La ponderación de los vecinos, si un vecino mas cercano tiene mas peso.
    • La ponderación de los atributos, si un atributo es mas relevante que otro.
    • Simplicidad.
    • Fácil de interpretar.
    • Tiempo de entrenamiento nulo.

     

    • El tiempo de ejecución se puede ampliar dependiendo de la cantidad de datos.
    • Falta de generalización.
    • Necesidad de tener en la misma escala los datos.

    OLS vs KNN

  • Reconocimiento de dígitos

    Reconocimiento de dígitos

    Entrenamiento

    Predicción

  • Descriptores de forma

    Descriptores de forma

    Descriptores geométricos

    Analizan la forma estructural de objetos binarios y sus contornos. Se puede utilizar para identificar objetos y reconocer patrones.

    • Área: Mide el número de pixeles de la región de interés.
    • Bounding box(bbox): Rectángulo mas pequeño capaz de albergar la región de interés(rectángulo rojo).
    • Área de bbox: Número de pixeles de la bounding box.
    • Convex hull image: Polígono convexo mas pequeño capaz de albergar la región de interés(polígono cian).
    • Área de la convex image: Número de pixeles dentro de la convex image.
    • Excentricidad: Relación de la distancias entre los focos de la elipse y su longitud del eje principal. Una elipse con excentricidad = 0 es un circulo, una con excentricidad = 1 denota un segmento de línea.
    • Diámetro equivalente: Diámetro de un circulo cuya área sea la misma que la región de interés.
    • Extensión: Ratio de pixeles en la región con respecto al numero total de pixeles contenidos en la bounding box.
    • Longitud de eje mayor: Longitud del eje mayor de una elipse que tiene el mismo segundo momento central normalizado que la región.
    • Orientación: Angulo que forma la elipse anterior con respecto al eje horizontal. El valor se expresa en grados en un rango de -90, 90.
    • Perímetro: Numero de pixeles que forman parte del contorno del objeto de interés.
    • Solidez: Proporción de pixeles que contiene el área respecto a la convex hull image. En el caso de polígonos regulares su valor será 1.

    A partir de estos descriptores se pueden extraer otros de interés como:

    • Compacidad: Mide la circularidad del objeto. Se calcula como cociente entre el área y el perímetro al cuadrado.
    • Rectangularidad: Cociente entre el área del objeto y la bounding box.

    Descriptores de textura

    Matriz de concurrencias

    A partir de la imagen(matriz de pixeles), generamos una matriz midiendo la frecuencia en la que un pixel de intensidad i es adyacente a otro pixel de intensidad j. Se define a través de un número de pixeles vecinos d y una orientación(ángulo, \alpha). De estos valores podemos extraer características como:

    • contraste
    • correlación
    • homogeneidad
    • energía
    • segundo momento angular

    Scale-Invariant Feature Transform(SIFT)

    SIFT sirve para detección de esquinas, bordes o texturas; es estable frente a transformaciones de posición, escala, rotación, iluminación y contraste. Consta de las siguientes fases:

    1. Detección de extremos en la escala-espacio: Se crea aplicando convoluciones entre la imagen original(i) y un kernel gaussiano(G) con diferentes escalas(\sigma).
      L(x, y, \sigma)=G(x,y,\sigma)\cdot I(x,y),
      G(x,y,\sigma)=\frac{1}{\sqrt{2\pi\sigma^{2}}}e^{-(x^2+y^2)/2\sigma^2}
      Todas las imágenes(L) generadas forman una octave. Este proceso se repite para obtener varios octaves, donde el tamaño de cada una de ellas es la mitad de la anterior.
    2. Diferencia de Gaussianas(DOG): Restar para cada octave la imagen original.
    3. Detección de posibles puntos de interés: Cada pixel de una imagen es comparada con los 8 pixeles vecinos de la misma imagen y también con los 9 pixeles en la misma posición de la imagen anterior y posterior. Si el valor del pixel es un extremo local(mayor o menor intensidad), ese pixel se convierte en un posible punto de interés.
    4. Localización de puntos de interés: En el anterior punto se crean muchos puntos de interés por lo que en este paso nos quedamos con los puntos útiles. Se aplican series de Tylor(segundo orden) sobre cada punto de interés, se rechaza si la intensidad es menor a un determinado umbral. También eliminamos los bordes o puntos de interés que no son robustos al ruido, esto se hace con una matriz Hessiana de 2×2 que permite obtener la curvatura principal.
    5. Asignación de la orientación: localizados los puntos de interés(keypoints) necesitamos hacerlos robustos frente a las transformaciones que mencionamos anteriormente. Se selecciona un vecindario alrededor del punto de interés, se calcula la magnitud y la dirección del gradiente. A partir de las magnitudes y las direcciones del gradiente podemos construir un histograma de 36 bins, es decir de diez en diez para cubrir todas las direcciones posibles(360^{\circ}). Sumamos la magnitud a la dirección correspondiente, esto teniendo en cuenta el bin correspondiente del histograma.
    6. Descriptor del punto de interés: Se coge una ventana alrededor del punto de interés de 16×16 pixeles, luego se subdivide en 4×4 para en cada uno de estos calcular la magnitud y orientación de los pixeles obteniendo un histograma de 8 bins por lo que obtendríamos 16 histogramas de o bins, resultando en un fingerprint de 128 características.
    Imagen de https://towardsdatascience.com/sift-scale-invariant-feature-transform-c7233dc60f37

    Speeded-Up Robust Features(SURF)

    SURF es una versión mejorada de SIFT para la detección y descripción de puntos de interés, Su principal ventaja es que es hasta 3 veces mas rápido que el algoritmo SIFT, consta de los siguientes pasos:

    1. Cálculo de la matriz Hessiana: Permite sacar la segunda derivada, lo que hace es aproximar los filtros a una estructura mas simple.
    2. Cálculo de la orientación: Localizados los puntos de interés mediante la matriz Hessiana se calcula por bloque(wavelet) las derivadas verticales y horizontales.
    3. Cálculo del descriptor SURF: Se selecciona una ventana de 20×20, obteniendo 16 regiones de 5×5. Para cada subregión se calcula la derivada wavelet y se extraen las características en un vector v obteniendo 64 características para describir el punto de interés.

    Histogram of oriented gradients(HOG)

    HOG utiliza la distribución de los gradientes como características, muy similar al ultimo paso de SIFT. El algoritmo consta de los siguientes pasos:

    1. Cálculo de los gradientes de la imagen: Se calculan los gradientes verticales y horizontales con un kernel de tamaño 1, también se puede aplicando el algoritmo de Sobel. Una vez obtenidas las matrices G_x y G_y (representan las aproximaciones de las derivadas de intensidades) se calcula la magnitud y dirección del gradiente.
    2. Cálculo de gradientes en celdas mas grandes(8×8): tomamos celdas de 8×8 para obtener 128 características (64 magnitud, 64 dirección), se representan en un histograma de 9 bins en los ángulos correspondientes a los ángulos 0,20,40,60,80,100,120,140,160; esta representación es mas compacta y resistente al ruido.
    3. Cálculo del histograma de gradientes de 9 bins:
      • Si la dirección coincide con la etiqueta de un bin especifico, entonces se añade íntegramente el valor de su magnitud a dicho bin.
      • Si la dirección toma valores entre dos bins, la magnitud correspondiente se añadirá a los dos bins de manera proporcional.
      • En caso que la dirección sea mayor de 180^{\circ}, la magnitud se añadirá de manera proporcional entre los bins 160 y 0.
    4. Normalización del histograma de gradientes: La idea es que el descriptor sea invariante frente a cambios de contraste o luminosidad. Para esto recorremos con un celda de 16×16, lo que nos genera un vector de características de 36 elementos ya que estamos tomando 4 histogramas de 9 bins.
    5. Cálculo de HOG: El descriptor final tendrá un total de características igual a la cantidad de celdas de 16×16 en el eje horizontal por el total de celdas de 16×16 en el eje vertical.

    Local Binary Patterns(LBP)

    LBP describe patrones de la imagen a nivel local, dan buenos resultados en el reconocimiento de texturas, objetos y formas. Veamos los pasos del algoritmo:

    1. Se calcula la diferencia entre los pixeles vecinos y el central.
    2. Se construye una matriz auxiliar a partir de la umbralización de las diferencias con 0s en los valores negativos y 1s en los positivos.
    3. La matriz construida da lugar a una cadena binaria que se multiplica por una matriz de referencia.
    4. Se suman todos los valores que resultan de la multiplicación anterior y se establece el valor del pixel central.

    Para hacer el descriptor invariante a transformaciones de intensidad podemos variar P(número de pixeles vecinos) y R(radio de la frecuencia). LBP_{P,R}, P determina el espacio angular y R la resolución espacial.

    También lo podemos hacer invariante  las rotaciones asignándole un identificador único a todas aquellas cadenas binarias que presentan el mismo número de transiciones. LBP_{P,R}^{ri}

    Además se demostró que los patrones con un número de transiciones menor o igual a 2 tenían una capacidad discriminativa mucho mayor que el resto, por lo que se definieron dichos patrones como LBP uniformes. LBP_{P,R}^{riu2}

  • Segmentación en imágenes

    Segmentación en imágenes

    Para extraer las características de una imagen basado en descriptores de forma, previamente es necesario llevar a cavo una técnica de segmentación, para delimitar la región de interés que se desea analizar.

    La idea de los algoritmos de segmentación es dividir la imagen en diferentes segmentos(objetos) para posteriormente facilitar la comprensión del contenido. Lo que hacen es asignar una etiqueta a cada pixel, por lo que los pixeles con la misma etiqueta comparten características similares.

    Detección de objetos
    Segmentación semántica
    Segmentación de instancia

    Estos algoritmos de segmentación son muy usados en diferentes ámbitos, estamos rodeados por sistemas que dependen de recursos gráficos:

    • Reconocimiento de objetos en cámaras
    • Análisis de imágenes medicas
    • Reconocimiento aéreo(drones)
    • Reconocimiento de patrones
    • Conducción autónoma

    Algunas de las técnicas de segmentación son:

    • Métodos de umbralización(thresholding)
    • Métodos basados en espacio de color
    • Detección de bordes
    • Crecimiento de regiones(region growing)
    • Métodos de agrupación(clustering)
    • Watershed
    • Autoencoders(redes neuronales convolucionales)

    En este post solo vamos a trabajar con los métodos mas sencillos.

    Thresholding

    1. Necesitamos generar una mascara, y el primer paso es pasar nuestra imagen a escala de grises; esto nos ayudara a separar las formas del fondo.
    2. Vamos a visualizar el histograma que nos indica el numero de pixeles y su intensidad.
    3. A partir de los valores que visualizamos en el histogramas generamos la mascara final.

    Esta imagen tiene una particularidad y es que el fondo es blanco y las formas son muy fáciles de reconocer, en este caso utilizamos THRESH_BINARY_INV y en la segunda alternativa para sacar la mascara utilizamos la condición mask<t, de esta manera le indicamos que todos los pixeles menor al umbral son los que queremos destacar. En una imagen con color de fondo lo mas probable es que necesitemos usar las operaciones opuestas, es decir, THRESH_BINARY y mask>t, pero esto también depende de los colores y que tan fáciles sean de separar. Recordemos que esta es una de las técnicas mas básicas de segmentación.

    Ahora, vemos en el anterior ejemplo que el umbral lo sacamos manualmente, utilizando el histograma vemos la distribución de pixeles y su intensidad y decidimos que en este caso 180 era el umbral indicado. Esto obviamente no es posible cuando tenemos grandes cantidades de datos, la idea es que el umbral se pueda seleccionar de manera automática. La librería de OpenCV nos provee un método para hacer esto, usando la técnica de OTSU, este algoritmo consta de los siguientes pasos:

    1. Crear dos clases, una con los valores de intensidad de 0 hasta el t(umbral), y la otra clase desde t hasta la intensidad máxima encontrada en la escala. Entonces se itera sobre cada pixel se obtiene la intensidad de gris y se almacena en un vector que corresponde a cada clase.
      c_1=[0,1,2,\cdots ,t]
      c_1=[t+1,t+2,\cdots ,L]
    2. Se define la probabilidad del nivel de gris i
      p_i=\frac{f_i}{N}, siendo f_i la frecuencia de repetición del nivel de gris i
    3. Se calculan las medias para cada una de las clases
      \mu_1=\sum_{i=0}^{t}\frac{i\cdot p_i}{\omega_1(t)}; \omega_1(t)=\sum_{i=0}^{t}p_i
      \mu_2=\sum_{i=t+1}^{L}\frac{i\cdot p_i}{\omega_2(t)}; \omega_2(t)=\sum_{i=t+1}^{L}p_i
    4. Obtener la intensidad media total de la imagen
      \mu_r=\omega_1\cdot\mu_1+\omega_2\cdot\mu_2
    5. Calcular la varianza entre clases
      \sigma^2=\omega_1(\mu_1-\mu_r)^2+\omega_2(\mu_2-\mu_r)^2
    6. Se selecciona el umbral optimo, es aquel que maximiza la varianza, es decir vamos iterando sobre los anteriores pasos y donde la varianza sea máxima será nuestro umbral.
      t'=Max(\sigma^2(t))

    En el siguiente ejemplo implementamos esta técnica, todos los pasos ya están integrados en la librería de OpenCV, lo que vamos a hacer es sumarle a THRESH_BINARY_INV el THRESH_OTSU, esto lo hacemos justamente por que nuestra imagen tiene el fondo blanco, si fuese a color utilizaríamos directamente THRESH_OTSU.

    Espacios de color

    Vamos a obtener las figuras amarillas, para esto vamos a tener que utilizar las transformaciones de color para destacar justamente el canal amarillo y luego utilizamos los mismos pasos que en la segmentación anterior. En el caso de la mascara le resto un poco al máximo ya que el color en las formas no es un amarillo homogéneo.

    Detección de bordes

    En este caso vamos a obtener nuestra imagen y aplicaremos un filtro gaussiano(blur) para reducir el ruido, no es necesario pero se suele recomendar. Luego aplicaremos el método de Canny, rellenar y así obtenemos la mascara.

    Es importante conocer que hace internamente el método de Canny para así entender los resultados.

    1. Detectar bordes con Sobel: calcula la primera derivada para obtener el gradiente de intensidad en cada pixel, es decir que mide los cambios de intensidad en la imagen: esto lo hace con dos mascaras de convoluciones con kernels de 3×3, uno para los cambios horizontales y el otro para los cambios verticales. Se obtiene G_x y G_y que representan las aproximaciones de las derivadas de intensidades.
      Operador Sobel

      En cada pixel se combinan las aproximaciones de las derivadas para obtener la magnitud G
      G=\sqrt{G_{x}^{2}+G_{y}^{2}}

      Y con esto podemos calcular la dirección del gradiente: La dirección puede ser en estos ángulos(0, 45, 90 o 135)
      \Theta=arctan(\frac{G_y}{G_x})

    2. Filtrado de bordes mediante la supresión non-máximum: permite adelgazar los bordes basándose en el gradiente, elimina los pixeles que no corresponden a un borde. Esto lo hace comparando el valor de intensidad de cada pixel con los pixeles vecinos en la dirección del gradiente.
    3. Umbralización por histéresis: establece dos umbrales(máximo y mínimo):
      • Si el valor del pixel es mayor que el umbral máximo, el pixel se considera parte del borde.
      • Si el valor del pixel es menor que el umbral mínimo, el pixel no se considera parte del borde.
      • Si el valor del pixel esta entre el umbral mínimo y el máximo, el pixel se considera parte del borde si esta conectado a otro pixel que es borde.

    En el ejemplo vamos a ver que una de las figuras(estrella) no se resalta y eso es por que el borde esta abierto. Eso lo podemos solucionar probando con el filtro gaussiano, por ahora el que mejor me funciono fue 5 x 5. También aplique al método Canny la dilatación de bordes para solventar el problema.

    Crecimiento de regiones

    Este método esta implementado de manera muy sencillita. Consiste en coger un punto como semilla y a partir de este ir coloreando, en este caso el punto 0,0 sabemos que esta vacío, por lo que iremos rellenando con negro, nos quedara un fondo negro con formas a color, para completar la mascara simplemente hacemos una transformación de color y listo.

  • Transformaciones en imágenes

    Transformaciones en imágenes

    Introducción a los datos 2D

    Una imagen es simplemente una función bidimensional f(x,y) donde x y y representan las cordenadas espaciales y el valor de la f la intensidad de la imagen en dicho punto.

    Es decir que una imagen es una matriz de valores cuyo tamaño es la anchura y altura es el tamaño de la imagen; los valores corresponden al nivel de intensidad, que van del 0 al 255 en el caso de esta imagen en escala de grises. En el caso de imágenes de color(rgb), tenemos tres capas, es decir una matriz de intensidades por cada color(Rojo, Verde, Azul) que al combinarse generan los colores que visualizamos finalmente.

    Transformaciones

    Intensidad

    La transformación de intensidad nos ayuda para resaltar ciertas formas o características. La transformación de contraste nos puede ayudar para destacar contornos.

    Además tenemos otras transformaciones bastantes interesantes:

    • Lineal a tramos
    • Cambio de linealidad
    • Negativo
    • Ajuste del histograma
    • Ecualización del histograma

    Color

    Esta transformación es útil para destacar ciertos colores, por ejemplo una forma en particular que queremos resaltar.

    Geométricas

    Estas transformaciones son muy útiles para el aumento de datos. Aunque también nos sirven para destacar alguna característica.

  • Introducción estadística

    Introducción estadística

    Conceptos básicos

    • Población: Conjunto del cual se quiere extraer características.
    • Muestra: Subconjunto de la población. Es muy importante que este conjunto represente la población, es decir que involucre sus particularidades y características.
    • Inferencia estadística: Proceso para obtener conclusiones de una población a partir de un análisis sobre una muestra.
    • Variable(atributo): Representa el valor de una cualidad de una población, este valor puede variar de registro a registro.
      • Ordinales: No numéricas en la que existe un criterio de orden.
      • Nominales: No numérico y no admiten criterio de orden.
      • Discretas: Toman un número finito de valores, son contables.
      • Continuas: Toman un número infinito de valores en un rango continuo.

    Análisis de variables cualitativas

    Podemos usar una tabla de frecuencias para resumir y facilitar la comprensión de los datos. Esta tabla simplemente consiste en tener cada uno de los valores que puede tomar la variable y la cantidad de repeticiones(frecuencia) que hay en los datos.

    Otra manera, que a mi particularmente me gusta mucho es representar el análisis por medio de gráficos de por ejemplo pie o barras(hay muchos mas). Estos permiten comprender los datos de manera muy visual y fácil, y te da una ventaja al momento de exponer sobre el tema. Tienen una facilidad tremenda de ser comprendidos y causan un impacto a nivel profesional muy bueno.

    Análisis de variables cuantitativas

    Podemos usar medidas de tendencia central:

    • Media
      \bar{x}=\frac{1}{N}\sum_{i=1}^{N}x_i
    • Mediana
      Impar, \bar{x} es el valor en la posición \frac{N}{2}
      Par, \bar{x}=\frac{1}{2}(X\begin{bmatrix}\frac{N}{2}\end{bmatrix}+X\begin{bmatrix}\frac{N}{2}+1\end{bmatrix})
    • Moda
      Valor mas repetido en el conjunto de datos X

    Medidas de posición como en el diagrama de caja y bigotes.

    Medidas de dispersión:

    Medidas de distribución:

    • Coeficiente de asimetría
      Mide la simetría de la distribución de una variable respecto a la media aritmética
      A=\frac{\sum_{i=1}^{N}(x_i-\bar{x})^3}{N\cdot \sigma^3}
    • Curtosis
      Mide el grado de apuntamiento o achatamiento de la distribución de frecuencia respecto a una distribución normal
      K=\frac{\sum_{i=1}^{N}(x_i-\bar{x})^4}{N\cdot \sigma^4}-3
  • Proceso de aprendizaje supervisado

    Proceso de aprendizaje supervisado

    En una síntesis muy simple el resultado de un proceso de aprendizaje automático el la suma de funciones, es decir que los datos están representados en estas funciones o los valores son muy aproximados. Por lo que tenemos un conjunto de datos y la idea es justamente encontrar las funciones mas apropiadas para describirlos.

    Supongamos que tenemos los siguientes datos:

    En nuestro proceso la idea es probar diferentes funciones y comparar cuales se ajustan mejor a nuestros datos.

    overfitting y underfitting

    Antes de ver el proceso al detalle debemos conocer estos dos conceptos, son muy importantes entenderlos y saber como manejarlos ya que de estos depende gran parte del éxito de nuestro proyecto.

    Como mencionamos el objetivo es encontrar las funciones que mas se ajusten a nuestros datos, pero esto tiene una pequeña trampa, mas bien es buscar las funciones que generalicen y representen los datos, esto en otras palabras es encontrar un modelo que nos sirve para predecir nuevos datos.

    Si entrenamos tanto el modelo que literalmente la función contiene cada uno de nuestros valores (a veces hasta incluyendo outliers) es una clara señal de que el modelo tiene overfitting(sobreajustado) y esto es un grave problema ya que las funciones que dan como resultado nuestros datos no necesariamente van a predecir correctamente, ya que las funciones que dan como resultado nuestros datos siempre pueden estar imprecisos, además que el modelo se ajusta tan bien a lo que conoce que futuros datos causaran predicciones erróneas. Por el contrario también tenemos underfitting(falta de ajuste), que precisamente es que las funciones están tan generales que las predicciones se pueden alejar bastante de los casos reales.

    Hay diversas métricas para medir y controlar esto durante la creación de nuestro modelos; pero por ahora no ahondaremos en ellas. Vamos a ver que el proceso de undefitting y overfitting se puede ir controlando desde el principio, como ya vimos en el anterior post desde la limpieza de datos y a continuación con la segmentación de la data preparándonos a la creación del modelo.

    Partición de los datos

    Continuando con nuestro proceso de crear un modelo supervisado vamos a particionar los datos, es una parte importante en la creación del modelo. Se suele separar en datos de entrenamiento y datos para pruebas, dejando unos porcentajes entre 70%(train) – 30%(test)  y 95%(train) – 5%(test) dependiendo de nuestra cantidad de datos y necesidades.

    Sin embargo también es muy frecuente además subdividir el set de datos de entrenamiento en dos, quedándonos un set de datos mas para validación.

    • Pruebas(test): Este dataset se separa al inicio y se deja aislado de todo el proceso, eso es para no contaminarlo con transformaciones y no exponer al modelo a estos datos, esto justamente ayuda a que el modelo se enfrente a valores a los que no ha estado expuesto y mostrarnos que tan preparado esta para enfrentarse a datos reales. Usamos los datos una vez generado el modelo, para validar el error real de nuestro modelo.
    • Entrenamiento(train): Este dataset provee los datos para entrenar nuestro modelo, de aquí se extraen los datos para que el modelo cree las funciones que generalizaran y representaran nuestros datos.
    • Validación: Este dataset se extrae del dataset de entrenamiento, y nos sirve justamente para ir validando la bondad del modelo, es decir ir validando durante la construcción del modelo la evolución de este. Tenemos varias maneras de ir haciendo estas evaluaciones; vamos a ver unas técnicas sencillas de como usar este data set para validar el modelo.

    Validación

    En cada iteración realizamos el proceso de de ir ajustando los pesos de cada una de las neuronas(veremos ese proceso de aprendizaje mas al detalle en otro post), que básicamente consiste en ir probando diferentes valores para crear funciones que se adapten a nuestros datos. Para medir que tan preciso es nuestro modelos utilizamos el dataset de validación. Tenemos diferentes métricas para medir el error, veamos algunas de introducción:

    MAE(Error absoluto medio)

    Se utiliza en problemas de regresión donde calculamos la desviación de la predicción al valor real. Es decir calculamos para cada registro del set de validación la desviación y luego sacamos un media general para todo el grupo de datos. Este resultado se guarda y se compara con la siguiente iteración; de esta manera voy comprobando si mi modelo mejora o empeora y puedo ir ajustando los pesos.

    MAE=\frac{1}{n}\cdot \sum_{i=1}^{n}|Y_i-\hat{Y_i}|

    RMSE(Error cuadrático medio)

    Básicamente usamos los mismos fundamentos del MAE, ambas son métricas de evaluación absolutas, pero elevamos el error al cuadrado lo que permite que el error se penalice mas.

    RMSE=\sqrt{\frac{1}{n}\cdot \sum_{i=1}^{n}(Y_i-\hat{Y_i})^2}

    MAPE(Porcentaje de error absoluto medio)

    Es una métrica de evaluación relativa, utilizamos el porcentaje en vea de los valores absolutos.

    MAPE=\frac{100}{n}\cdot \sum_{i=1}^{n}\begin{vmatrix}\frac{Y_i-\hat{Y_i}}{Y_i}\end{vmatrix}

    La diferencia entre métricas de evaluación absolutas y relativas es que en las absolutas las desviaciones tienen la misma unidad de magnitud, por ejemplo si estamos comparando una cantidad de productos te devuelve la cantidad de productos que hay de error.

    Exactitud

    Esta métrica se utiliza en problemas de clasificación. Simplemente consiste en comparar la tasa de acierto. Se suman todas las clases predichas que si coinciden con la clase real, de la siguiente manera:

    Exactitud=\frac{100}{n}\cdot \sum_{i=1}^{n}Y_i=\hat{Y_i}

    Es muy importante para conocer a fondo las métricas de clasificación el uso de la matriz de confusión: esta consiste en una tabla donde se comparan los valores de la clase real frente a los valores de la clase predicha.

    Conociendo esta tabla también podemos definir la métrica de Exactitud de la siguiente manera:

    Exactitud=\frac{TP+TN}{TP+TN+FP+FN}

    Precisión

    Precision=100\cdot \frac{TP}{TP+FP}

    Sensibilidad

    Sensibilidad=\frac{TP}{TP+FN}

    F1(F1-score, F1-measure)

    Combina la sensibilidad y precisión. Es una de las métricas mas robustas para clasificación.

    F1=100\cdot \frac{2\cdot Sensibilidad \cdot Precision}{Sensibilidad + Precision}

    Teniendo nuestras métricas planteadas vamos a ver unos ejemplos de como se hace la separación de datos.

    Validación Hold-out

    Esta es una de las particiones mas sencillas, simplemente es obtener un porcentaje de nuestro dataset para usarlo por separado. En el ejemplo a continuación lo que hacemos es separar los datos con la función train_test_split:

    Validación cruzada

    Esta es una selección de datos un poco mas robusta, ya que evita el sobreajuste, debido a que no tenemos siempre el mismo conjunto de datos de validación. La técnica consiste en cada iteración ir cambiando nuestro dataset de validación. Siempre mantendremos la misma cantidad de datos pero iremos intercambiando entre ellos.

    Ahora veamos un ejemplo mas real usando la función KFold.

    Validación leave-one-out

    Como su nombre lo indica es dejar un registro afuera, ese único registro se va a usar para validar. En cada iteración usamos uno, luego el siguiente y así sucesivamente, por lo que al final usaremos todos los datos como validación. Esto es especialmente bueno cuando tenemos pocos datos.

    Validación en regresión

    Validación en clasificación

  • Selección de atributos

    Selección de atributos

    Valores ausentes

    Anteriormente vimos el preprocesamiento de datos, sin embargo nos falto el manejo de los valores ausentes. La mayoría de las veces simplemente vamos eliminar estos registros, pero no siempre es buena opción, ya que si tenemos pocos registros eliminarlos puede ser una mala alternativa;  sin embargo podemos asignarle valores:

    • Imputar valores con media o mediana para datos continuos.
    • Imputar con la moda valores para datos categóricos.
    • Entrenar un modelo de regresión o predicción para asignar los valores faltantes.
    • Crear un algoritmo o técnica propia.

    Selección de atributos

    La selección de atributos permite trabajar con las columnas mas relevantes y eliminar ruido, esto genera modelos mas robustos.

    Vamos a ver uno de los modelos mas sencillos para ejemplificar la selección de atributos. El siguiente algoritmo cuenta con las siguientes características:

    • Selección de atributos univariante: Esto se refiere a que la selección tiene en cuenta los atributos de manera individual.
    • Selección no supervisada: No tiene en cuenta la clase.
    • El algoritmo selecciona por medio de un umbral definido: En este caso se establece un valor arbitrario, pero para hacerlo de manera correcta debemos tener el cuenta el tamaño del dataset y análisis estadísticos.

    También vamos a ver dos métricas de aprendizaje supervisado, es decir que tiene en cuenta la clase, y de selección multivariante.

    F-test: Pruebas de regresión lineal univariante que devuelven el estadístico F y los valores p (Dependencia lineal).

    Información mutua: entre dos variables aleatorias es un valor no negativo que mide la dependencia entre las variables. Es igual a cero si y sólo si dos variables aleatorias son independientes, y los valores más altos significan una mayor dependencia, además a diferencia de la métrica F-test esta tiene en cuenta la dependencia lineal y la no lineal.

    Como mencionamos inicialmente estos métodos son muy básicos, nos pueden servir para evaluaciones muy rápidas. Obviamente tenemos algoritmos mas robustos como los algoritmos de búsqueda o la misma PCA. Los veremos en otro post mas adelante.

  • Preprocesamiento de datos

    Preprocesamiento de datos

    En el anterior post vimos una introducción a la metodología CRISP-DM, que es una de las mas usadas en general para desarrollo de sistemas de inteligencia artificial. En este post vamos a continuar con ese flujo orientándolo al aprendizaje supervisado.

    Existe otra metodología muy similar pero orientada a Machine Learning, CRISP-ML(Q). Esta metodología comparte prácticamente todas las fases de la metodología de donde hereda sus características, pero se enfoca en el desarrollo de modelos de ML y agrega una fase al final; el monitoreo y mantenimiento de los modelos, ya que en el transcurso del tiempo podemos obtener mas data he irlo puliendo. Esto se conoce como evaluación continua del modelo.

    El aprendizaje supervisado tiene como principal característica el uso de registros de los cuales tenemos su clase(predicción) ya sea para un problema de regresión o clasificación. Con estos registros debidamente categorizados o predichos procederemos a recorrer todas las fases de la metodología CRISP-DM. En este post en particular empezaremos a adentrarnos en la parte mas técnica.

    Preparación de los datos

    Esta es una fase primordial, ya que de aquí depende en gran parte el éxito del proyecto. Una correcta limpieza o preprocesado de los datos permite exponer los patrones y características que luego extraerá el modelo.

    Normalización y estandarización

    Normalización

    La normalización permite centrar y escalar los datos, es decir, transformamos sus atributos en un rango continuo entre 0 y 1 mediante una operación matemática llamada homotecia.

    x_{i}^{N}=\begin{Bmatrix}\frac{x_{i,j}-min(x_i)}{max(x_i)-min(x_i)},\forall j\in1,\cdots ,n\end{Bmatrix}

    Este proceso es reversible con la formula contraria:

    x=x^{N}\cdot (max(x_i)-min(x_i))+min(x_i)

    Esta transformación es recomendada cuando se pretenden usar distancias o productos escalares. Veamos un ejemplo practico. Sklearn nos provee la mayoría de estos algoritmos ya funcionales, por lo que nos reduce el trabajo a solo utilizar sus métodos.

    Estandarización

    Consiste en hacer que los valores posean una media y desviación típica determinada, es decir que la media de loas valores sea igual a 0 y su desviación estándar igual a 1.

    x_{S}^{i}=\begin{Bmatrix}\frac{x_{i,j}-media(x_i)}{desv(x_i)},\forall j\in 1,\cdots ,n \end{Bmatrix}

    Este proceso es reversible con la formula contraria:

    x=x^{S}\cdot desv(x_i)+media(x_i)

    En el caso de querer hacer la reversión con SKLearn podemos usar la función inverse_transform

    La estandarización al no tener un rango acotado se vuelve menos sensible a los outliers.

    Outliers

    Este es uno de los problemas mas habituales, y se refiere a la presencia de valores anómalos, ya sea por errores de digitación, valores fuera de lo común o eventos inesperados que se registraron.

    Los outliners por lo general queremos identificarlos para eliminarlos o modificarlos, sin embargo no es una tarea sencilla cuando tenemos muchos datos. Tenemos muchas maneras de abordar el problema, desde una clasificación manual hasta algoritmos diseñados. Como en los anteriores ejemplos ya utilizamos SKLearn vamos a continuar por este rumbo. Esta librería nos provee varios métodos para la evaluación de outliners.

  • Azure – Introducción a IaaS

    Azure – Introducción a IaaS

    Dentro de los servicios de Cloud, podemos encontrar IaaS y PaaS; cada una tiene sus pros y contras, sin embargo la mayoría de ingenieros que vienen de cacharrear y trastear por su cuenta (como es mi caso) estamos mas familiarizados con la administración propia de los recursos, nos acostumbramos a ver un rack con los servidores he incluso a pelearnos con los continuos errores de estas maquinas. Por esta razón, es casi natural pasar a una arquitectura IaaS, claro que con esto no quiero decir que sea mejor que PaaS, simplemente es un acercamiento diferente a la administración y arquitectura en la nube.

    Azure nos provee de ambos servicios y claro en esta ocasión revisaremos IaaS, un breve recorrido por sus principales características. En próximos post veremos como trabajar con PaaS.

    Lo primero que vamos a hacer es instalar el Azure CLI. Este nos provee las herramientas para trabajar en la linea de comandos con Azure; esta manera se me hace mucho mas practica y necesaria para poder automatizar las tareas, sin embargo todo lo que veremos se puede hacer por la interfaz web de Azure con unos cuantos clics.

    En este ejemplo vamos a ver como crear crear un par de maquinas virtuales y colocar un balanceado de carga. Pero antes de entrar al código necesitamos responder a unas preguntas muy importantes:

    • ¿Para qué voy a utilizar mi VM?
      Aquí debemos tener claro el objetivo de esta máquina para así determinar que recursos vamos a usar. Azure provee diferentes maquinas virtuales, podemos ver en detalle las características en la documentación. A continuación resumo brevemente sus maquinas y principales usos:

      • Serie A: Desarrollo/pruebas
      • Serie Bs: ampliables económicas
      • Serie D: Proceso de uso general
      • Serie E: Optimizado para aplicaciones en memoria
      • Serie F: Optimizadas para proceso
      • Serie G: Optimizadas para memoria y almacenamiento
      • Serie H: Informática de alto rendimiento
      • Serie Ls: Optimizadas para almacenamiento
      • Serie M: Optimizadas para memoria
      • Serie N: Con GPU

      Ademas tambien debemos tener en cuenta las aplicaciones que vamos a correr en la VM y el sistema operativo a usar, ya que todo esto influye en la selección de la maquina y finalmente en su precio, aquí les dejo la calculadora para estimar los costos de la VM de sus sueños. Una curiosidad es que las maquinas virtuales basadas en Linux no tienen interfaz gráfica por lo que para su uso se requiere el manejo de la linea de comandos por lo menos para su arranque inicial y luego pueden instalar la interfaz gráfica de preferencia.

    • ¿Cuánto tiempo estará encendida?
      Esto es clave para al posterior despliegue podamos programar los auto apagados y obvio esto repercute en el costo de la VM.
    • ¿Cuál es el retorno de la inversion?
      Esta pregunta es clave responderla tanto si es para educación como para un ámbito empresarial. Si es para educación claramente el retorno se ve reflejado en el aprendizaje obtenido, pero en el ámbito profesional debemos demostrar la necesidad y que las anteriores preguntas se respondieron a conciencia, de esta manera se puede justificar la inversion.

    Creando una VM desde comandos – Azure CLI

    Lo primero será hacer login. Para esto debemos tener una cuenta creada de Azure. Si solo estas probando puedes optar por una suscripción gratuita de 30 días que te permite conocer la plataforma.

    az login

    Esto nos devolverá un json confirmando el usuario con el que accedimos, ahora estamos listos para comenzar a trabajar con el CLI. Vamos a empezar por consultar las imágenes de SO que podemos instalar en nuestras VM.

    az vm image list

    En este caso me interesa instalar la imagen de Ubuntu, voy a usar el alias para realizar la instalación. Otro dato es que en las imágenes disponibles de Linux solo se pueden usar las versiones LTS.

    Ahora, dependiendo de nuestra suscripción y ubicación tenemos acceso a ciertas localizaciones, las vamos a necesitar, entonces vamos a consultarlas.

    az account list-locations

    Luego vamos a consultar de una de esas localizaciones que recursos tenemos disponibles. Me interesa para pruebas una maquina de serie A.

    az vm list-skus --location westus3 --zone --all --output table

    Necesitamos crear un grupo, este nos servirá para agrupar recursos. Estos grupos es muy importantes definirlos de manera correcta, ya que si los recursos son de un mismo grupo facilita muchísimo realizar la mayoría de tareas.

    Creamos el grupo asignándole un nombre y pasándole la localización de despliegue de los recursos.

    az group create --name Jhontona --location westus3 
    

    Bien, por fin vamos a crear nuestras maquinas virtuales, para esto debemos pasarle el nombre, el grupo, la imagen y el tipo de autenticación, en esta ocasión usaré usuario y contraseña.

    az vm create -n VMTest01 -g Jhontona --image UbuntuLTS --authentication-type password --admin-username jhontona --size Standard_A1_v2

    Tenemos listas nuestras maquinas y podemos consultarlas con el comando

    az vm list

    Podemos proceder a actualizar nuestras maquinas e instalar el software necesario. Podemos conectarnos por escritorio remoto o por SSH, aunque recordemos que las instalaciones de Linux por defecto no traen escritorio y generaran una excepción.

    Para esta prueba instalare Apache2 pero obviamente puedes instalar cualquier servidor web o aflictivo que requieras. No voy a colocar los pasos de instalación del Apache aquí, por que como mencione aquí depende enteramente del software que necesites.Una vez instalado debemos abrir los puertos necesarios, en mi caso es necesario abrir el puerto 80, por defecto todos los puertos están cerrados.

    az vm open-port --resource-group Jhontona --name VMTest01 --port 80
    Maquinas virtuales ejecutando Apache

    Por defecto al crear una maquina virtual esta se inicia. Podemos detenerla o arrancarla con los siguientes comandos.

    az vm start
    az vm stop

    Balanceo de carga

    Necesitamos agregarle una ip publica al grupo que creamos anteriormente, esto con el fin de que el balancer responda a esta IP.

    az network public-ip create --resource-group Jhontona --name publicBalancerIP

    Ahora vamos a crear el balanceador.

    az network lb create --resource-group Jhontona --name lbJhontona --frontend-ip-name frontendPool  --backend-pool-name backendPool --public-ip-address publicBalancerIP

    Vamos a evaluar la información y definir las reglas de enrutamiento.

    az network lb probe create --resource-group Jhontona --lb-name lbJhontona --name probeLbJhontona --protocol tcp --port 80
    az network lb rule create --resource-group Jhontona --lb-name lbJhontona --name ruleLbJhontona --protocol tcp --frontend-port 80 --backend-port 80 --frontend-ip-name frontendPool --backend-pool-name backendPool --probe-name probeLbJhontona

    También necesitamos crear una red virtual.

    az network vnet create --resource-group Jhontona --name vnBalancer --subnet-name lbSubnet
    az network nsg create --resource-group Jhontona --name netSecuriryGroup
    az network nsg rule create --resource-group Jhontona --nsg-name netSecuriryGroup --name networkGroupSecurity --priority 1001 --protocol tcp --destination-port-range 80
    for i in `seq 1 2`; do
    az network nic create --resource-group Jhontona --name nic$i --vnet-name vnBalancer --subnet lbSubnet --network-security-group netSecuriryGroup --lb-name lbJhontona --lb-address-pools backendPool 
    done
    
    az vm availability-set create --resource-group Jhontona --name avset

    Olvide al crear la IP colocar el parámetro –allocation-method por lo que voy a actualizarlo para que genere IP y luego obtendremos esa IP.

    az network public-ip update -g Jhontona -n publicBalancerIP --allocation-method Static
    az network public-ip show --resource-group Jhontona --name publicBalancerIP --query "{address: ipAddress}"
¡Hola a todos los entusiastas de la tecnología! Quería informarles que en mi blog utilizamos cookies para mejorar la experiencia de usuario. Estas pequeñas herramientas nos ayudan a personalizar el contenido y ofrecer funciones específicas. Al continuar explorando el sitio, aceptas nuestro uso de cookies. Puedes obtener más información sobre cómo las utilizamos en nuestra política de privacidad. ¡Gracias por ser parte de esta comunidad tecnológica! 🍪    Más información
Privacidad