Categoría: Inteligencia artificial

  • 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.

  • Razonamiento aproximado – Introducción

    Razonamiento aproximado – Introducción

    Desde la invención del perceptrón hemos avanzado muchísimo en el campo de la inteligencia artificial, el poder de computo y las técnicas para procesamiento de datos a crecido de manera extraordinaria y hoy en día tenemos modelos predictivos y generativos francamente impresionantes, cada día salen nuevas noticias e investigaciones de modelos de millones de parámetros, que si tienen conciencia (obviamente no), o que mejoran en predicciones y en general en lo que consideramos un comportamiento inteligente.

    Justamente la clave para analizar estos avances radica en nuestra concepción de inteligencia ¿Qué entendemos por inteligente? Por ejemplo, podemos decir que un sistema es inteligente por que nos permite diferenciar entre perritos y gatitos, pero si extrapolamos esto a un humano claramente no asumiríamos que una persona es inteligente solo por diferencias entre perros y gatos; ahora si llevamos esto a diferentes etapas del desarrollo humano, en especifico a la infancia temprana podemos decir que hay indicios de inteligencia. Entonces, definimos la inteligencia artificial como sistemas que replican comportamientos humanos que consideramos inteligentes.

    Teniendo en cuenta la premisa anterior debemos considerar que la inteligencia humana esta llena de incertidumbre e imprecisión, justamente la curiosidad es el mayor motor para el avance científico y es producto de un camino que recorremos hace miles de años, un proceso evolutivo y mental que queremos concluir por ejemplo en una teoría del todo, o en deserciones filosóficas para tratar de tener control y superar a la misma muerte (Si tiene curiosidad de por que digo esto vea este libro: Política para Amador). El punto del asunto es preguntarnos que tan relevante debería ser la incertidumbre en nuestros algoritmos; por eso se celebra un congreso para crear sistemas híbridos, dejando en claro que la inteligencia artificial no lo resuelve todo y que se necesita un acercamiento humano para entender y contextualizar los problemas; estamos acostumbrados a obtener grandes cantidades de datos y luego por medio de procesos estadísticos o métodos de inteligencia artificial inferir resultados y estimar predicciones, pero en estos procesos no se tiene en cuenta los sesgos humanos, coloquemos un ejemplo mas claro: imaginemos que se realiza una encuesta a diferentes poblaciones para determinar el nivel de felicidad, esto es muy subjetivo tanto para los encuestados como para los encuestadores, ya que los encuestadores por mas imparciales que pretendan ser interpretaran los datos a su propio contexto y por ejemplo no se tiene en cuenta la propia conducta y pensamiento humano; ahora podríamos decir que es por que nos falta variables, pero en si es imposible obtenerlas todas y ya veremos el por que.

    El universo en si es un sistema caótico, por mas modelos o representaciones que hagamos de el simplemente no alcanzamos a modelar la realidad, para poder predecir algo con suma certeza deberíamos tomar todo nuestro universo y descomponerlo en variables, crear una simulación completa del todo, lo cual es imposible ya que ni siquiera conocemos la totalidad del universo y avanzamos poco a poco pero parece que nunca alcanzaremos datos totalmente certeros; y es que esta es la magia de los sistemas caóticos, podemos medir tanto como queramos, aproximarnos a cantidades de errores infinitesimales y aun así no obtendremos la cantidad exacta, vivimos en la paradoja de Zenón.

    A pesar del caos muchas de nuestras mediciones y predicciones podemos hacerlas a partir de un contexto local, dándonos resultados muy buenos, este tipo de aproximaciones las trabajamos con la lógica difusa, que justamente considera las relaciones entre las variables de un contexto. Recuerdo un anécdota muy curioso de cuando la Nasa estrelló una sonda por una mala comunicación entre los ingenieros, esto demuestra que no solo es tomar datos y asumir que es suficiente, se debe hacer un análisis humano, a conciencia, previniendo y teniendo en cuenta nuestros sesgos y contextos.

    Las principales causas de incertidumbre son:

    • Insuficiente experiencia
    • Inadecuada representación del conocimiento
    • Información poco fiable
    • No completitud
    • Inexactitud inherente al lenguaje

    Sabemos que no podemos mitigar en su totalidad la incertidumbre pero podemos asociar niveles de confianza a la información, por ejemplo usando probabilidades o factores de certeza. Veamos algunos ejemplos de esto:

    Probabilidad

    Podemos modelar la incertidumbre a través del teorema de Bayes.

    *estos datos son ilustrativos
    P(S/M)=0,5 Probabilidad de tener Covid y fiebre
    P(M)=1/6 Probabilidad de tener Covid
    P(S)=1/20 Probabilidad de tener fiebre
    P(M/S)=(0,5)*(1/6)/(1/20)=1.6

    Como dijimos es muy difícil tener una certeza por que no tenemos todas las variables, además que debemos tener en cuenta las variables excluyentes también, ahí se nos va complicando la cosa.

    Valores de certeza

    Otra aproximación puede ser el uso de factores de certeza, estos son básicamente juicios dados por un experto e implementados correctamente puede facilitar muchísimo las estimaciones.

    Por ejemplo, con la pandemia si tenias tos y fiebre el valor de certeza de Covid era muy alto, los médicos señalaban casi con total seguridad de que se trataba de este virus.

    Los valores de certeza se dan en un intervalo de [-1,1], donde 1 indica completa confianza y -1 la no creencia. Veamos la definición matemática para calcular un valor de certeza. R1 y R2 son reglas que alcanzan una misma conclusión h, a partir de dos evidencias e_1 y e_2:

    R1: Si e_1 entonces h, CF(h,e_1)

    R2: Si e_2 entonces h, CF(h,e_2)

    El factor de certeza de h se calcula como:

    • CF(h,e_1)+CF(h,e_2)(1-CF(h,e_1)), si CF(h,e_1)>0CF(h,e_2)>0
    • CF(h,e_1)+CF(h,e_2)(1+CF(h,e_1)), si CF(h,e_1)<0 y CF(h,e_2)<0
    • [CF(h,e_1)+CF(h,e_2)]/(1-min(|CF(h,e_1)|,|CF(h,e_2)|), en cualquier otro caso

    Veamos unos ejemplos:

    R1: Si viernes entonces trafico, 0.8

    R2: Si llueve entonces trafico, 0.7

    h: Hoy es viernes y llueve ¿Cuál es la certeza de trafico?

    0.8+0.7*(1-0.8)=0.94

    *Se refuerza la certeza con ambas positivas

    R1: Si viernes entonces trafico, 0.8

    R2: Si fin de mes entonces trafico, -0.4

    h: Hoy es viernes y fin de mes ¿Cuál es la certeza de trafico?

    0.8+(-0.4)/(1-min(0.8,0.4))=0.66

    *Se disminuye la fuerza de la mayor

    Es importante tener presente las diferencias entre el enfoque probabilístico y los valores de certeza.

    Las probabilidades vienen a partir de la medición y calculo de los datos; por el contrario los factores de certeza son evaluaciones o apreciaciones personales.

    En resumen debemos quedarnos con que los modelos que realizamos son aproximaciones de la realidad y no son capaces de prevenir outliers. Estamos en un universo caótico y debemos tener en cuenta la incertidumbre. En próximos post veremos al detalle métodos que tratan de superar e incluso se apoyan en la incertidumbre.

  • Introducción a la minería de datos

    Introducción a la minería de datos

    El aprendizaje automático o supervisado hace parte de la minería de datos. Estos se concentran justamente en los modelos generados a partir de datos de naturaleza empírica, es decir, datos preexistentes resultado de un trabajo previo que no necesariamente estaban destinados a análisis de negocio, por ejemplo el histórico de ventas de un producto, su razón principal de ser es mantener un control sobre stock y ventas, pero a partir de estos registros podemos extraer mucha información relacionada con el producto. Actualmente este es el método mas utilizado, a partir de bases de datos existentes se hace el análisis de datos, de ahí el nombre de minería de datos, encontrar los valiosos patrones existentes en estas colecciones.

    Tenemos muchas metodologías que nos sirve de marco (KDD, SEMMA, ASUM-DM entre otras), la mas conocidas y utilizadas esta CRISP-DM.

    CRISP-DM

    Cross-Industry Standard Process for Data Mining, integra todas las tareas necesarias para los proyectos de minería de datos, veamos sus fases:

    Predicción

    En el aprendizaje supervisado tenemos dos tipos de problemas en función del tipo de salida, que llamaremos clase (variable objetivo):

    • Regresión: variable de salida es numérica (número real).
    • Clasificación. variable es categórica (número discreto o etiqueta nominal).

    Esta clase(predicción) se apoya en el conjunto de datos de entrada(dataset), en donde cada celda representa un dato de entrada; estos campos pueden ser de tipo numérico o categórico que llamaremos atributo, los cuales hacen parte de una instancia, es decir, una fila del dataset.

    dataset

    Las características principales para describir un data set son:

    • Número de instancias.
    • Número de atributos.
    • Nombre, tipo y breve descripción de cada atributo.
    • Tipo de datos de la clase, si tiene, y dominio de valores.
    • Nombre y breve descripción de la clase, si tiene.
    • Cantidad de valores ausentes.

    El dominio se refiere al conjunto de valores que puede tomar la clase.

    Principales roles

    Voy a listar algunos de los roles mas comunes:

    • Director técnico de proyecto(data scientist chief): Conocimientos de gestión y técnicos. Mucha experiencia en el campo.
    • Científico de datos(data scientist – ML engineer): Buena comunicación, selección de soluciones y estrategias. Fuertes bases matemáticas y de informática. MLOps.
    • Analista de datos(data analyst): Fuertes bases de estadística, conocer la inteligencia de negocio.
    • Ingeniero de datos(data engineer): Manejo de bases de datos, uso de herramientas y lenguajes para construir las soluciones.

    Para profundizar mas en estos roles recomiendo el artículo de The different data science roles in the industry

    Diferencia entre Bias y Varianza

    Tenemos tres tipos de errores:

    1. Error irreducible: Propio de los datos.

    2. Error de bias: Es la diferencia entre la predicción esperada de nuestro modelo y los valores verdaderos.

    3. Error de varianza: Se refiere a la cantidad que la estimación de la función objetivo cambiará si se utiliza diferentes datos de entrenamiento.

¡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