Etiqueta: Minería de datos

  • EXPLORANDO LAS ESTRUCTURAS DE DATOS EN PYTHON: Series y Dataframes

    EXPLORANDO LAS ESTRUCTURAS DE DATOS EN PYTHON: Series y Dataframes

    En Python, ya sea para minería de datos o trabajo con grandes volúmenes de información estructurada, el procesamiento se realiza comúnmente utilizando funciones y estructuras de datos de la biblioteca pandas. En este post nos vamos a centrar en dos estructuras de datos clave de esta librería, las series y los dataframes.

    Este es el tercer post de una serie donde hemos venido hablando de estructuras de datos aplicadas en Python. Si te has perdido el contenido anterior lo puedes ver aquí.

    Series

    En la biblioteca pandas, una Serie es un array unidimensional de valores para datos homogéneos. Podemos visualizar una Serie como una única columna en una hoja de cálculo, la cual contiene varios valores de una variable específica. En esencia, una Serie en pandas es utilizada para representar y manipular información unidimensional de manera eficiente.

    import pandas as pd
    personaje = pd.Series(['Jack',"Frost",16,True])
    print(personaje)
    
    # 0    Jack
    # 1    Frost
    # 2    16
    # 3    True

    En las estructuras de datos basadas en Series de pandas, es importante destacar el término “axis“(eje) que se utiliza para representar una secuencia de valores en una dimensión específica. La Serie tiene solo eje 0 debido a que es unidimensional. En la siguiente sección, exploraremos cómo se aplica este concepto de eje a un DataFrame.

    Dataframe

    Un DataFrame se construye sobre la estructura de datos de la Serie. Se almacena como datos tabulares bidimensionales y se utiliza para procesar datos estructurados de manera tradicional. Puedes pensar en un DataFrame como una tabla con filas y columnas, similar a una hoja de cálculo. La información se organiza en una cuadrícula donde cada fila representa una observación o registro, y cada columna representa una variable o característica específica.

    En este contexto un DataFrame ofrece una manera eficiente y flexible de trabajar con conjuntos de datos complejos, ya que cada columna es esencialmente una Serie, permite aplicar operaciones y análisis de datos de manera coherente en toda la estructura.

    pilares = pd.DataFrame([
        ['1', 'Kyojuru Rengoku', 'Llama'],
        ['2', 'Muichiro Tokito', 'Niebla'],
        ['3', 'Mitsuri Kanroji', 'Amor']])
    pilares.columns = ['id', 'nombre', 'pilar']
    print(pilares)
    id nombre pilar
    0 1 Kyojuru Rengoku Llama
    1 2 Muichiro Tokito Niebla
    2 3 Mitsuri Kanroji Amor

    En el código anterior, df.columns es una lista que especifica los nombres de las columnas. En un DataFrame, una sola columna o fila se denomina un eje.

    Entender y manipular los ejes es fundamental al trabajar con DataFrames, ya que proporciona la capacidad de acceder, indexar y realizar operaciones a lo largo de filas o columnas de manera eficiente.

    La selección de características es esencial para mejorar la eficiencia  y evitar problemas como la redundancia y la dimensionalidad excesiva. En lugar de utilizar todas las características disponibles, es común seleccionar un subconjunto relevante que contribuya significativamente al rendimiento del modelo. Puedes recuperar una columna específica por su nombre, lo cual se ilustra en el siguiente fragmento de código. Este enfoque permite trabajar de manera más selectiva con las características necesarias para una etapa particular del algoritmo, mejorando así la eficacia y la interpretación.

    pilares[['id','nombre']]
    
    id nombre
    0 1 Kyojuru Rengoku
    1 2 Muichiro Tokito
    2 3 Mitsuri Kanroji

    La disposición de una columna en un DataFrame es determinística, lo que significa que su posición está fijada de manera predecible. Puedes recuperar una columna específica no solo por su nombre, como se mencionó anteriormente, sino también por su posición dentro del DataFrame.

    Para hacer esto, puedes utilizar la notación de corchetes y proporcionar el índice numérico de la columna que deseas recuperar. Es decir, la posición de la columna en el DataFrame. Por ejemplo:

    pilares.iloc[:,2]
    # 0 Llama
    # 1 Niebla
    # 2 Amor

    En este caso, iloc es un método que se utiliza para la indexación basada en ubicación en pandas. La expresión [:, 2] significa que estás seleccionando todas las filas (:) de la tercera columna (2).

    Este enfoque de recuperación por posición es útil en situaciones en las que conoces el orden específico de las columnas y prefieres referenciarlas por su posición numérica en lugar de su nombre. Sin embargo, es crucial tener en cuenta que esta metodología depende del orden en el que se han definido las columnas en el DataFrame, ya que esa secuencia determina las posiciones.

    Cada fila en un DataFrame corresponde a un punto de datos en nuestro espacio de problemas. Si deseamos crear un subconjunto específico de los elementos de datos en nuestro espacio de problemas, es necesario realizar la selección de filas.

    La selección de filas en un DataFrame es fundamental para trabajar con conjuntos de datos extensos y centrarse en segmentos particulares que son relevantes para nuestro análisis o aplicación de algoritmos de aprendizaje automático. Hay varias formas de llevar a cabo la selección de filas en pandas:

    pilares.iloc[1:2,:]
    id nombre pilar
    1 2 Muichiro Tokito Niebla

    Una de las maneras más interesantes de selección es mediante el uso de condiciones booleanas.

    Por ejemplo, si queremos seleccionar todas las filas que cumplen con ciertos criterios, podemos utilizar una expresión condicional. Supongamos que queremos seleccionar todas las filas donde el valor en la columna “pilar” sea igual a “Lama”:

    pilares[pilares.pilar=='Llama']

    Claro, podemos utilizar cualquier condición que se pueda comparar contra los datos.

    Eso seria por ahora, dejamos este post aquí y te espero en el próximo donde hablaremos de matrices. No olvides dejar tus dudas y comentarios.


    ¡Conviértete en un experto tecnológico! 🚀 Suscríbete a nuestro newsletter y recibe las últimas noticias, análisis y tendencias directamente en tu bandeja de entrada. No te pierdas las actualizaciones que harán que tu experiencia tecnológica sea aún más emocionante. ¡Únete a nuestra comunidad hoy! 📧✨

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

  • 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