Topic outline

  • General

    • Bienvenidos al Curso OCW Aplicaciones de Machine Learning en Python y MATLAB para la Ingeniería Civil e Ingeniería Industrial.

      Este curso OCW procede del desarrollo de un proyecto de innovación docente de la convocatoria 2023-2024 del Vicerrectorado de la UCA.

      El objetivo fue encontrar un espacio de trabajo y colaboración conjunta entre estudiantes y profesores para intentar dotar a los estudiantes de un mayor desarrollo en soft skills, en particular, en este caso de programación.

      La idea desarrollada fue que aquellos que conocieran MATLAB pudieran acercarse fácilmente a Python y al contrario. Fruto de esta idea nació este curso que hace más hincapié en una introducción al machine learning en ambos lenguajes.

    • ÍNDICE

      Módulo 1. Introducción a la programación
      1.1. Introducción
      1.1.1.  Salida por pantalla
      1.1.2.  Tipos de datos y asignación de variables
      1.1.3.  Entrada de datos
      1.1.4.  Cadenas
      1.2. Alternativas
      1.2.1.  Control de flujo if-then-else
      1.2.2.  Control de flujo anidados
      1.3. Iteraciones
      1.3.1.  Bucles for
      1.3.2.  Bucles while
      1.4. Estructuras de datos
      1.4.1.  Listas
      1.4.2.  Matrices
      1.4.3.  Diccionarios y cell arrays
      1.4.4.  Diccionarios con listas como elementos
      1.4.5.  Tuplas o vectores
      1.5. Funciones
      1.5.1.  Librerías e instalación
      1.5.2.  Funciones para arrays y vectores
      1.5.3.  Funciones para arrays y matrices
      1.5.4.  Funciones de utilidad
      1.6. Gráficas

      Módulo 2. Manipulación de datos
      2.1. Series en Python y tablas en MATLAB
      2.2. Dataframes con Panda en Python y registros en MATLAB
      2.3. Funciones para obtener información
      2.4. Tratamiento de datos perdidos
      2.5. Lectura/escritura archivos CSV
      2.6. Funciones para dataframes y tablas
      2.7. Selección de datos
      2.7.1.  De filas loc-iloc
      2.7.2.  De columnas
      2.7.3.  Intersección de datasets con filas comunes
      2.7.4.  Combinaciones a nivel columna
      2.7.5.  Tablas dinámicas


      Módulo 3. Análisis de datos y machine learning
      3.1. Estadística descriptiva
      3.2. Correlación entre variables.
      3.3. Asimetría e histogramas.
      3.4. Outliers.
      3.5. Preprocesamiento y preparación de datos para machine learning.
      3.5.1. Training-test
      3.5.2. Estandarización y normalización
      3.5.3. Métricas para problemas de regresión y clasificación.
      3.5.4. Validación cruzada k-Folds y leave one out.
      3.6. Análisis de Regresión
      3.7. Regresión con validación cruzada
      3.8. Regresión con Redes Neuronales Artificiales
      3.9. Análisis de Clasificación
      3.10. Clasificación con validación cruzada
      3.11. Clasificación con Redes Neuronales Artificiales
      3.12. Análisis de Clustering con K-medias

  • Módulo 1. Introducción a la programación

    • En conjunto, este módulo tiene como objetivo principal enseñar al lector conceptos fundamentales de programación en Python y MATLAB, centrándose en:

      • Control de flujo condicional.
      • Definición y uso de funciones.
      • Iteraciones y bucles.
      • Estructuras de datos simples

      Cada documento proporciona ejemplos prácticos para cada uno de estos temas, comparando cómo se implementan en ambos lenguajes para que el lector pueda comprender las similitudes y diferencias entre ellos.

      Específicamente:

      Este modulo tiene como objetivo explicar y ejemplificar el uso de estructuras de control de flujo en Python y MATLAB. Se cubren diferentes tipos de alternativas condicionales como if-else, if-elif-else, y otras más complejas con operadores lógicos como and, or, y not. Además, se incluyen ejemplos que muestran cómo anidar condiciones en ambos lenguajes. El objetivo es familiarizar al lector con el manejo de decisiones condicionales en ambos lenguajes de programación.

      También tiene como objetivo explicar el uso de bucles o iteraciones en Python y MATLAB. Se cubren tanto los bucles for como los bucles while, y cómo funcionan en cada uno de los lenguajes. Se introducen también los conceptos de break y continue para controlar el flujo dentro de los bucles. El documento ilustra el uso de bucles anidados y cómo estos pueden ser implementados tanto en Python como en MATLAB. Además, se proporcionan ejemplos prácticos para entender su comportamiento.

      Otro de los objetivos del módulo es introducir y explicar la creación y uso de funciones en Python y MATLAB. Se aborda la definición de funciones, el uso de parámetros (con o sin valores por defecto), y cómo devolver múltiples valores desde una función. También se exploran las listas y arrays como parámetros, además de cómo trabajar con matrices y vectores utilizando bibliotecas especializadas como numpy en Python. En MATLAB, se explica el concepto de funciones almacenadas en archivos separados y cómo manejar parámetros de entrada y salida.

      Librerías: Breve descripción de las librerías más usadas en Python para el cálculo numérico, análisis de datos y visualización, como NumPy, SciPy, Matplotlib, Pandas y scikit-learn. En MATLAB se mencionan los Toolboxes, equivalentes a las librerías de Python.

  • Módulo 2. Manipulación de datos

    • Uno de los objetivos es explicar la manipulación de datos utilizando Series en Python (mediante la librería Pandas) y Tablas en MATLAB. Se presentan ejemplos prácticos que muestran cómo crear, acceder y manipular series y tablas en ambos lenguajes.

      • Pandas es una librería de Python que facilita la manipulación y análisis de datos, proporcionando estructuras como Series (arrays unidimensionales) y DataFrames (tablas). Se explica cómo crear series desde arrays de numpy, listas, y diccionarios, con ejemplos detallados. Se muestra cómo definir series con o sin etiquetas, y cómo acceder a sus elementos usando índices o etiquetas. Se abordan también temas como manejo de datos vacíos (NaN), y cómo filtrar datos nulos o no nulos utilizando métodos como isnull(), notnull().
      • En MATLAB, el equivalente a las series de Pandas se logra usando Tablas, una estructura que permite almacenar etiquetas y valores en columnas separadas. Se incluyen ejemplos que muestran cómo crear tablas en MATLAB a partir de arrays, listas o diccionarios. Se cubren temas como la creación de tablas con o sin etiquetas, cómo acceder a los datos de las tablas, y cómo filtrar filas basándose en valores vacíos o no vacíos.

      Se proporcionan ejemplos comparativos para crear series/tablas, acceder a sus elementos, y manipular datos. En cada caso, se muestran códigos equivalentes tanto en Python (Pandas) como en MATLAB. Los ejercicios incluyen la creación de estructuras a partir de arrays, listas y diccionarios, filtrado de datos basados en condiciones específicas (como valores nulos), y acceso a los datos por índices o etiquetas.

    • Esta sección se enfoca en enseñar el uso de DataFrames en Python con la librería Pandas y su equivalente en MATLAB mediante tablas y registros. El objetivo es mostrar cómo crear, manipular y acceder a los datos en ambas plataformas, utilizando estructuras de datos que permiten almacenar y trabajar con múltiples columnas de diferentes tipos de datos.

      Conceptos:

      1. Definición de DataFrames y Tablas:

        • En Python, un DataFrame en Pandas es una matriz bidimensional que consiste en una colección de series (columnas). Cada columna tiene un nombre y un índice, y puede contener diferentes tipos de datos.
        • En MATLAB, el equivalente a los DataFrames se logra mediante tablas, que pueden tener múltiples columnas y tipos de datos. Los registros también pueden ser una alternativa en algunos casos.
      2. Creación de DataFrames y Tablas:

        • En Python: Se crean DataFrames utilizando arrays de numpy o diccionarios. Se asignan etiquetas a las filas y nombres a las columnas.
        • En MATLAB: Se utilizan las funciones array2table() y table() para crear tablas a partir de matrices y arrays. Se pueden asignar nombres a las columnas y filas de la tabla.
      3. Acceso a los Elementos:

        • Se muestran ejemplos de cómo acceder a los elementos de los DataFrames y tablas. En Python, se accede a las columnas y filas usando nombres de columnas y etiquetas de filas. En MATLAB, se utilizan las propiedades de las tablas para acceder a los datos.
      4. DataFrames como Diccionarios:

        • En Python, se demuestra cómo un DataFrame puede actuar de manera similar a un diccionario, permitiendo el acceso a los datos por nombres de columnas.
        • En MATLAB, se usa una estructura de registros y tablas para organizar los datos de manera similar a como lo haría un DataFrame en Python.
      5. Modificación de Índices:

        • Se enseña cómo modificar el índice en un DataFrame en Python utilizando set_index, y cómo realizar una operación similar en MATLAB creando un timetable o asignando manualmente etiquetas a las filas de una tabla.
      6. Trabajar con Fechas y Valores Categóricos:

        • En Python, se usa la función pd.date_range para crear una columna de fechas, y pd.Categorical para manejar variables categóricas.
        • En MATLAB, se usa la función datetime() para trabajar con fechas y categorical para crear columnas con valores categóricos.
    • Esta sección se centra en funciones de utilidad para obtener información sobre los datos en Python (usando Pandas) y MATLAB. Se muestran ejemplos que permiten extraer detalles sobre las columnas de los DataFrames (Python) o las Tablas (MATLAB), como el número de filas, la frecuencia de ciertos valores y resúmenes estadísticos de los datos.

      Conceptos fundamentales:

      1. En Python:

        • Se utilizan varias funciones de la librería Pandas para obtener información sobre los datos almacenados en un DataFrame.
        • Algunas de las funciones destacadas son:
          • df['columna'].value_counts() para contar las apariciones de los valores en una columna.
          • len(df) para contar el número de filas.
          • df['columna'].nunique() para contar el número de valores únicos en una columna.
          • df.describe() para obtener un resumen estadístico de las columnas numéricas.
      2. En MATLAB, las funciones equivalentes incluyen:
        • tabulate(datos) para contar las apariciones de los valores en una columna.
        • size(df, 1) para contar el número de filas.
        • unique(datos) y numel(unique(datos)) para obtener los valores únicos y contarlos.
        • summary(df) para obtener un resumen de la tabla.
    • Esta sección se centra en el tratamiento de datos perdidos o faltantes en Python (usando Pandas) y MATLAB. Se proporcionan comandos y ejemplos que permiten identificar, eliminar, reemplazar valores faltantes y eliminar filas duplicadas en los datasets.

      1. En Python (Pandas):

        • Número de filas con NaN: df.isna().sum().sum()
        • Eliminar filas con NaN: df.dropna()
        • Reemplazar NaN con un valor: df.fillna(valor)
        • Borrar filas duplicadas: df.drop_duplicates()
      2. En MATLAB:

        • Eliminar filas con NaN: T_cleaned = rmmissing(T, 'row');
        • Reemplazar NaN con un valor: T_filled = fillmissing(T, 'constant', 0);
        • Borrar filas duplicadas: T_unique = unique(T);
        • Número de filas con NaN
      ** Los valores faltantes se pueden rellenar con valores procedentes de un modelo de regresión o con redes neuronales artificiales.
    • Esta sección se enfoca en la lectura y escritura de archivos CSV en Python (con Pandas) y MATLAB. Se proporcionan ejemplos de cómo cargar datos desde un archivo CSV o una URL, manipular los datos, y luego guardar los resultados nuevamente en formato CSV.

      Lectura de Archivos CSV en Python:

      • Se utiliza la función pd.read_csv() para cargar datos desde una URL o archivo local.
      • Se muestran las funciones para obtener información sobre los datos, como shape para conocer las dimensiones del DataFrame, y head() y tail() para ver las primeras o últimas filas.

      Lectura de Archivos CSV en MATLAB:

      • En MATLAB, se utilizan las funciones readtable() o readmatrix() para cargar archivos CSV. El archivo puede contener datos mixtos (numéricos y texto), y estas funciones detectan automáticamente el formato.
    • Este archivo explica cómo aplicar funciones de uso común a dataframes en Python (usando Pandas) y a tablas en MATLAB. Se detallan varias funciones útiles que se pueden aplicar a columnas y filas para obtener estadísticas, sumar, ordenar, o modificar los datos.

      En Python, algunas funciones de uso común aplicadas a DataFrames y Tablas:

      • Funciones como sum(), min(), max(), mean(), var(), std(), count(), size(), median(), y apply() pueden aplicarse tanto a columnas como a filas.
      • También se incluyen funciones adicionales como sample(), nlargest(), nsmallest(), sort_values(), rename(), y drop() para manipular dataframes.

      En MATLAB, se destaca la función varfun() para aplicar funciones a tablas y arrayfun() para aplicar funciones a arrays de manera más flexible.

    • Métodos para Seleccionar Subconjuntos de Filas y Columnas en Pandas y MATLAB:
       
      Tanto Pandas en Python como MATLAB ofrecen diversas maneras de seleccionar subconjuntos de filas y columnas en estructuras de datos como DataFrames y Tablas. 
       
      Pandas (Python):
      - Selección por etiqueta (.loc):
      • Permite seleccionar filas y columnas utilizando sus etiquetas.
      • Se pueden seleccionar filas individuales, rangos de filas y combinaciones específicas de filas y columnas.
      - Selección por posición (.iloc):
      • Se basa en la posición numérica de las filas y columnas, comenzando desde 0.
      • Similar a .loc, permite seleccionar rangos y combinaciones de filas y columnas.
      - Selección lógica:
      • Se utiliza una condición lógica para filtrar las filas que cumplen con el criterio. 
      • Ejemplo: df[df.valor > 10] selecciona las filas donde la columna 'valor' es mayor que 10.
       
      MATLAB: 
      - Selección por nombre de fila:
      • Se usa el nombre de la fila entre paréntesis para seleccionar una fila completa.
      • Ejemplo: df('Lunes', :) selecciona la fila con nombre 'Lunes'.
      - Selección por índice de fila:
      • Se utiliza el índice numérico de las filas para seleccionar.
      • Se pueden usar rangos de índices.
      - Selección por nombre de columna:
      • Se usan llaves con los nombres de las columnas deseadas.
      • Ejemplo: df(:, {'contaminante', 'Tipo'}) selecciona las columnas 'contaminante' y 'Tipo'.
      - Selección por índice de columna:
      • Se usan los índices numéricos de las columnas.
      • Se pueden usar rangos de índices.
      - Selección por posición (llaves {}):
      • Permite seleccionar elementos o subconjuntos utilizando índices numéricos de filas y columnas.
      - Selección lógica:
      • Similar a Pandas, se utiliza una condición lógica para filtrar las filas.
      • Ejemplo: df(df.valor > 10, :) selecciona las filas donde la columna 'valor' es mayor que 10.
       
      Puntos Clave:
      • La selección por etiqueta en Pandas es útil cuando las etiquetas de filas y columnas son informativas y fáciles de usar.
      • La selección por posición es útil en ambos lenguajes cuando se conoce la ubicación exacta de los datos.
      • La selección lógica es una herramienta poderosa para filtrar datos basados en criterios específicos.
       
    • Cuestionario común para los dos primeros módulos. 

    • Las soluciones se leen de izquierda a derecha.

  • Módulo 3. Análisis de datos y machine learning

    • Los documentos proporcionados en esta sección ilustran cómo utilizar la validación cruzada para el entrenamiento y la evaluación de modelos de aprendizaje automático (machine learning) en Python y MATLAB. Los ejemplos cubren técnicas como la clasificación con redes neuronales, el clustering k-means, la regresión múltiple lineal  o la clasificación con k-NN. Además, se explica cómo preprocesar los datos para mejorar la precisión de los modelos, incluyendo la estandarización, la normalización y la eliminación de valores atípicos. Los ejemplos también incluyen la visualización de los resultados, como histogramas, diagramas de caja y matrices de confusión.

    • Esta sección describe cómo utilizar redes neuronales artificiales (ANNs: Artificial Neural Networks) para realizar una tarea de regresión, implementando una validación cruzada tanto externa como interna para ajustar los hiperparámetros de la red, tales como el número de neuronas y el número de capas ocultas.

      En MATLAB:

      1. Lectura de datos: Los datos se leen desde un archivo Excel, donde las primeras columnas son las características de entrada (X) y la última columna es la variable dependiente (y). Se usa readtable().
      2. Validación cruzada externa e interna: Se implementan para ajustar el número de neuronas y capas ocultas de la red neuronal, usando cvpartition() para dividir los datos en entrenamiento y validación.
      3. Entrenamiento de la red neuronal: Se utiliza feedforwardnet para crear una red de retropropagación con el algoritmo de optimización Adam y se entrena usando las diferentes configuraciones probadas.
      4. Evaluación del modelo: Se calculan las métricas de evaluación para regresión, como el Error Cuadrático Medio (MSE), Error Porcentual Absoluto Medio (MAPE), y el coeficiente de correlación (r), para evaluar el rendimiento del modelo.

      En Python:

      1. Lectura de datos: Los datos también se leen desde un archivo Excel usando pandas, y se dividen en entradas (X) y salidas (y). Se usa pandas.read_excel().
      2. Construcción de la red neuronal: Se utiliza Keras para definir una red neuronal con capas completamente conectadas (Dense), y el optimizador Adam para entrenar el modelo con el objetivo de minimizar el MSE.
      3. Validación cruzada: Se implementa usando KFold de scikit-learn para realizar la validación cruzada externa e interna, ajustando el número de neuronas y capas ocultas.
      4. Construcción de la red neuronal: La función build_model() define una red completamente conectada con una sola neurona en la salida para la regresión. Se usa el optimizador Adam y como función de pérdida el MSE.
      5. Evaluación: Se calculan métricas como el MSE, MAPE y el coeficiente de correlación (r) para evaluar el modelo entrenado para datos no vistos en la validación externa.
    • Esta sección presenta un ejemplo utilizando redes neuronales artificiales en ambos lenguajes para una tarea de clasificación. Se enfoca en el uso de validación cruzada externa e interna para ajustar los hiperparámetros de la red neuronal, como el número de neuronas y capas ocultas.

      En MATLAB:

      1. Lectura de datos: Los datos se leen desde un archivo Excel y se dividen en entradas y etiquetas de clase, usando readtable().
      2. Validación cruzada: Se usa una validación cruzada externa e interna para ajustar el número de neuronas y capas ocultas mediante cvpartition().
      3. Entrenamiento de la red neuronal: Se utiliza trainNetwork con el optimizador Adam y se ajustan parámetros como el número de épocas y el tamaño del batch.
      4. Evaluación del modelo: Se mide la precisión utilizando la validación cruzada externa, ajustando la arquitectura de la red neuronal según los resultados de la validación interna.

      En Python:

      1. Lectura de datos: Los datos también se leen desde un archivo Excel y se preparan para la red neuronal, usando pandas.read_excel() para cargar los datos y LabelEncoder para transformar las etiquetas de clase,
      2. Codificación de las etiquetas: Se codifican las etiquetas en un formato categórico.
      3. Validación cruzada: Se implementa una validación cruzada estratificada externa e interna se realiza correctamente utilizando StratifiedKFold.
      4. Construcción y entrenamiento del modelo: Se utiliza TensorFlow y Keras para construir una red neuronal con capas completamente conectadas y el optimizador Adam. La red está configurada para clasificación utilizando softmax y la función de pérdida categorical_crossentropy.
      5. Evaluación: Se calcula la precisión del modelo usando la validación cruzada y se muestra una matriz de confusión al final.
    • Esta sección describe cómo realizar clustering con K-means en un conjunto de datos en ambos lenguajes. Se cubren varias etapas importantes:

      • Los códigos en MATLAB y Python incluyen las mismas métricas de evaluación de clustering, como el coeficiente de silueta, Calinski-Harabasz y Davies-Bouldin, para medir la calidad del agrupamiento.
      • Visualización: En ambos lenguajes se muestran las gráficas que permiten observar tanto la evolución de las métricas de evaluación como los clusters generados.
      • Normalización de datos: En ambos códigos se realiza la normalización de los datos, lo cual es una buena práctica antes de aplicar el clustering.

      En Python:

      1. Lectura de datos: Los datos se cargan desde un archivo CSV utilizando pandas.
      2. Aplicación de K-means: Se aplica K-means utilizando la función de scikit-learn. Se define un rango de números de clusters (range_n_clusters) y se ajusta el modelo para cada valor en el rango.
      3. Métricas de evaluación:
        • Silhouette Score: Evalúa la calidad del agrupamiento.
        • Calinski-Harabasz Score: Mide la dispersión de los clusters.
        • Davies-Bouldin Score: Evalúa la relación entre la distancia de los clusters.
      4. Visualización: Se generan gráficos para visualizar la evolución de las métricas y los clusters generados.

      En MATLAB:

      1. Lectura de datos: Se cargan los datos desde un archivo CSV usando csvread.
      2. Aplicación de K-means: Se utiliza el algoritmo de K-means con diferentes números de clusters y varias réplicas para mejorar la estabilidad.
      3. Métricas de evaluación:
        1. Coeficiente de Silueta: Evalúa la cohesión y separación de los clusters.
        2. Índices de Calinski-Harabasz y Davies-Bouldin: Se utilizan para evaluar la calidad de los clusters.
      4. Visualización: Se generan gráficos que muestran la calidad del clustering utilizando las métricas y la visualización de los clusters.
    • Las soluciones se leen de izquierda a derecha.