"Descubriendo el Poder de los Modelos de Clasificación en Machine Learning: Predicciones Precisas y Clasificaciones Sorprendentes"




 

Cuando se trata de Machine Learning, los modelos de clasificación son como magos que pueden predecir el futuro y clasificar cosas de manera increíblemente precisa.

Digamos que estás organizando una competencia de perros y necesitas clasificarlos en diferentes categorías según su raza. Aquí es donde entra en juego otro tipo de modelo de clasificación. Utilizando datos de entrenamiento que contienen información sobre características como el tamaño, el color del pelaje y la forma de las orejas, puedes entrenar un modelo para identificar automáticamente la raza de un perro en función de estas características. Es como tener un asistente canino inteligente que puede reconocer diferentes razas con solo echar un vistazo. ¡Es sorprendente!


Un Desafío Alquímico: Prediciendo el Origen de la Materia Prima con Machine Learning

Hoy nos sumergiremos en un intrigante problema que desafía los límites de la predicción y nos lleva al emocionante mundo de las materias primas. Nos enfrentamos a un enigma: predecir a qué tipo de materia prima pertenece un lote en función de sus características únicas.

Imagínense un misterioso lote que contiene un tesoro de datos. Sus características nos revelan secretos ocultos: el porcentaje de libras empacadas en Grado A, Grado B y Grado C, así como el total de libras del lote. Estas pistas nos conducirán al descubrimiento de su verdadero origen: ¿es una CD, un DB, un SBT o simplemente R?

 En este fascinante viaje, nos adentraremos en las profundidades del aprendizaje automático, donde los algoritmos se convierten en alquimistas modernos. Utilizando técnicas como logistic regression, Decision Tree, Random Forest, XGBoost y KNN, desentrañaremos los patrones y las relaciones sutiles que se esconden en los datos del lote.

No se preocupen, pues estaré a su lado en cada paso del camino para explicarles los conceptos técnicos con claridad y con ejemplos. Juntos, descubriremos cómo la validación cruzada nos brinda la confianza necesaria para enfrentar este desafío, y afinaremos los hiperparámetros para desatar todo el potencial de nuestros modelos.

Prepárense para maravillarse con las poderosas matrices de confusión que revelarán la precisión de nuestras predicciones, y para deleitarse con los bosques de decisiones que trazarán el camino hacia la resolución del enigma. Finalmente, descubriremos la verdad detrás de cada lote, dándonos el poder de tomar decisiones fundamentadas y retroalimentar los procesos de producción.

En este emocionante viaje de exploración de datos, aprenderás a utilizar la herramienta mágica llamada Python. Sumérgete en un conjunto de datos como si fuera una misteriosa cueva llena de tesoros ocultos.    

Traigamos las librerías que nos facilitaran manipular los datos.

import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn import svm
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.ensemble import RandomForestClassifier
import xgboost as xgb
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
import seaborn as sns

Traigamos los datos y guardémoslos en la variable dt

# Importar los datos
dt = pd.read_excel("PT.xlsx")
# Vemos los primeros 10 datos
dt.head()

Echemos un vistazo a los datos que contiene


# Cuantos datos de cada etiqueta hay en el conjunto de datos?
dt["MP"].value_counts()


Abordar datos desbalanceados puede ser desafiante, pero es crucial para construir modelos precisos. Algunas estrategias incluyen el muestreo (submuestreo o sobremuestreo), la ponderación de clases (lo que aplicaremos más adelante), la generación de características y el uso de métricas de evaluación adecuadas. Encuentra el equilibrio adecuado y construye modelos confiables.

Feature Engineering

Codificando la variable de salida o resultado

Cuando se trata de Feature Engineering, no solo nos enfocamos en las características de entrada, sino también en cómo codificar la variable de salida o resultado. La forma en que representamos la variable objetivo puede tener un impacto significativo en nuestros modelos de aprendizaje automático.

# Inporta las librerías que harán el trabajo duro
from pandas.core.interchange.dataframe_protocol import Column
from sklearn.preprocessing import LabelEncoder

# Crear una instancia del codificador de etiquetas
label_encoder = LabelEncoder()

# Aplicar el Label Encoding a la columna 'MP' y asignar un numero para cada materia prima
dt['MP_encoded'] = label_encoder.fit_transform(dt['MP'])

# Elimina la columna anterior sin codificar
dt.drop(columns=['MP'], inplace=True)

# Imprime los resultados.
print(dt)


Entrenamiento del Modelo: Desatando el Poder de los Datos

 ¡Es hora de llevar nuestros datos al siguiente nivel a través del entrenamiento del modelo! Después de haber realizado el Feature Engineering y preparado nuestros datos, es momento de enseñar a nuestro modelo a realizar predicciones precisas. Prepárate para sumergirte en este emocionante proceso y desatar el poder oculto en tus datos.

# Importamos las librerías que harán toda la magia.

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# Guardamos las características o variables independientes en X sin la variable de
# resultado MP_encoded
X = dt.drop(['MP_encoded'], axis=1)

# Guardamos los valores objetivo o resultados en la variable y
y = dt['MP_encoded']


Paso 1

Antes de comenzar el entrenamiento, dividiremos nuestros datos en conjuntos de entrenamiento y prueba (30%). El conjunto de entrenamiento será utilizado para enseñar al modelo, mientras que el conjunto de prueba nos ayudará a evaluar su rendimiento en datos no vistos previamente. Es importante tener una evaluación imparcial y realista. Recuerdan que los datos estaban desalanceados, usemos la función stratify=y para preservar  los pesos de cada categoria tanto en los datos de entrenamiento como de prueba.


# Dividir los datos en conjuntos de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y,random_state=42)


Paso 2: Selección del algoritmo

El siguiente paso es seleccionar el algoritmo de aprendizaje automático adecuado para nuestro problema. Existen numerosos algoritmos, como regresión logística, árboles de decisión, bosque aleatorio, support vector machine, XGB, redes neuronales, entre otros. La elección del algoritmo dependerá de la naturaleza de nuestros datos y del objetivo de nuestro proyecto. 

Qué me dicen si los probamos todos?

# Lista de los algoritmos de clasificación que vamos a entrenar
model_list = [
    LogisticRegression(max_iter=1000),#Regresión logística
    svm.SVC(),#Máquina de soporte vectorial
    DecisionTreeClassifier(), #Árbol de decisión
    RandomForestClassifier(n_estimators=300), # Bosque aleatorio
    xgb.XGBClassifier(), # Xtreme Gradient Boosting
    KNeighborsClassifier() # K-nearest neighbors
]

# Normalizamos los datos para mayor estabilidad y convergencia en el proceso
# de aprendizaje
# Creamos una instancia del "escalador" y luego lo aplicamos en ambos datos
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)


Paso 3: Entrenamiento del modelo

Aquí es donde la magia ocurre. Alimentaremos nuestros datos de entrenamiento a los algoritmos y los entrenaremos para aprender los patrones y relaciones presentes en los datos. Cada modelo ajustará varios parámetros y aprenderá a hacer predicciones basadas en los ejemplos proporcionados. Este proceso implica iteraciones repetidas para mejorar el rendimiento del modelo. 


# Lista con los parametros que se evaluaran con su respectivo algoritmo
param_list = {
    "Logreg": {'C': [0.001, 0.01, 0.1, 1, 10]},
    "svm": {'kernel': ('linear', 'rbf'), 'C': [0.001, 0.01, 0.1, 1, 10]},
    "Tree": {
        'criterion': ['gini', 'entropy'],
        'max_depth': [None, 5, 10, 15],
        'min_samples_split': [2, 5, 10],
        'min_samples_leaf': [1, 2, 4]
    },
    "Forest": {
        'n_estimators': [100, 200, 300],
        'max_depth': [None, 5, 10],
        'min_samples_split': [2, 5, 10],
        'min_samples_leaf': [1, 2, 4]
    },
    "xgb": {'learning_rate': [0.1, 0.01],
            'max_depth': [3, 5, 7],
            'n_estimators': [100, 200, 300]
    },
    "knn": {
        'n_neighbors': [3, 5, 7],
        'weights': ['uniform', 'distance'],
        'p': [1, 2]
    }
}


# Función que encuentra los mejores parámetros para cada modelo y devuelve
# un diccionario con los resultados de cada evaluación
def eval_model(model_list, param_list, X_train, y_train, X_test, y_test):
    model_results = []

    for name, model, params in zip(param_list.keys(), model_list, param_list.values()):
        best_params, pred = val_cruz(model, params, X_train, y_train, X_test)
        acc, pre, re, f1 = metricas(y_test, pred)
        model_results.append(pd.DataFrame({
        "Name": [name],
        "best_params": [best_params],
        "predictions": [pred],
        "accuracy": [acc],
        "precision": [pre],
        "recall": [re],
        "f1_score": [f1]
        }))
    results = pd.concat(model_results, ignore_index=True)
    return results

# Llama a la función eval_model para obtener los resultados y guardarlos en results
results = eval_model(model_list, param_list, X_train, y_train, X_test, y_test)
print(results)


Paso 4: Evaluación del rendimiento

Después del entrenamiento, evaluaremos el rendimiento del modelo utilizando el conjunto de prueba. Utilizaremos métricas apropiadas según el tipo de problema, como precisión, exactitud, recall, F1-score, entre otros. Esta evaluación nos dará una idea de cómo se desempeñará nuestro modelo en situaciones reales.

# Función que grafica y devuelve la matriz de confusión
def grafica_cm(y_test, y_pred):
    cm = confusion_matrix(y_test, y_pred)
    fig, ax = plt.subplots()
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=ax)
    ax.set_xlabel('Etiqueta Predicha')
    ax.set_ylabel('Etiqueta Real')
    ax.set_title('Matriz de Confusión')
    plt.show()
    return cm

# Función que devuelve las métricas de evaluación: accuracy, precision, recall,f1-score
def metricas(y_test, y_pred):
    accuracy = accuracy_score(y_test, y_pred)
    precision = precision_score(y_test, y_pred, average='macro', zero_division=1)
    recall = recall_score(y_test, y_pred, average='macro')
    f1 = f1_score(y_test, y_pred, average='macro')
    return accuracy, precision, recall, f1

# Llama a la función para grafica la matriz de confusión
grafica_cm(y_test, results.loc[0, 'predictions'])

  # Añadir etiquetas y títulos
  ax.set_xlabel('Etiqueta Predicha')
  ax.set_ylabel('Etiqueta Real')
  ax.set_title('Matriz de Confusión')
  return cm
  # Mostrar la matriz de confusión
  plt.show()

# Llamar a la función para graficar la matriz de confusión y conocer los resultados
# con el primer algoritmo (Regresion logistica)
grafica_cm(y_test, results.loc[0, 'predictions'])

# Veamos la exacatitud para la regresion logística
print("Exactitud de la regresión logística:" , results.loc[0, 'accuracy'])

Veamos cómo le fue al algoritmo de regresión logística. A lo largo del eje horizontal se encuentran el numero de predicción que hizo el modelo para cada materia prima, mientras que en el eje y se encuentran el número de datos que en realidad pertenecen a esa materia prima.



Exactitud de la regresión logística: 0.8746, nada mal!

Explicación de las métricas para la evaluación de un modelo de clasificación.

1. Precisión (Precision): Mide la proporción de instancias clasificadas como positivas que son realmente positivas.

Fórmula: Precision = TP / (TP + FP)

   - TP (True Positives): Número de instancias positivas correctamente clasificadas.

   - FP (False Positives): Número de instancias negativas incorrectamente clasificadas como positivas.

2. Recall (Sensibilidad, Exhaustividad o Tasa de Verdaderos Positivos): Mide la proporción de instancias positivas que son correctamente detectadas.

   Fórmula: Recall = TP / (TP + FN)

   - FN (False Negatives): Número de instancias positivas incorrectamente clasificadas como negativas.

3. F1-Score: Es una métrica que combina la precisión y el recall para obtener un único valor que resume el rendimiento del modelo.

   Fórmula: F1-Score = 2 * (Precision * Recall) / (Precision + Recall)

4. Exactitud (Accuracy): Mide la proporción de instancias clasificadas correctamente sobre el total de instancias.

Fórmula: Accuracy = (TP + TN) / (TP + TN + FP + FN)

   - TN (True Negatives): Número de instancias negativas correctamente clasificadas.

   - TP + TN: Número total de instancias correctamente clasificadas.

Estas fórmulas se utilizan para calcular las métricas de evaluación de un modelo de clasificación. Es importante destacar que las métricas pueden variar dependiendo del problema y del enfoque específico de evaluación utilizado.

Paso 5: Ajuste y validación

Si el rendimiento del modelo no es satisfactorio, podemos realizar ajustes y mejoras. Podemos ajustar los hiperparámetros del modelo, probar diferentes algoritmos o realizar más Feature Engineering. La validación cruzada nos ayudará a evaluar el rendimiento del modelo de manera más robusta y tomar decisiones informadas sobre cómo mejorarlo.

Validación cruzada (Cross-Validation)

Se está utilizando la validación cruzada para buscar los mejores parámetros del modelo de regresión logística.

La función GridSearchCV se encarga de realizar la búsqueda exhaustiva de los parámetros especificados en una cuadrícula y utiliza validación cruzada para evaluar el rendimiento del modelo en diferentes divisiones de los datos.

La validación cruzada es una técnica comúnmente utilizada en el aprendizaje automático para evaluar y seleccionar modelos de manera más robusta. En lugar de dividir los datos en un conjunto de entrenamiento y un conjunto de prueba fijo, la validación cruzada divide los datos en k partes iguales (folds) y realiza k iteraciones donde cada fold se utiliza como conjunto de prueba una vez, mientras que los demás folds se utilizan como conjunto de entrenamiento. Esto permite una evaluación más precisa del rendimiento del modelo al promediar los resultados obtenidos en cada iteración.

En el código proporcionado, se utiliza GridSearchCV con una validación cruzada de 5 folds (cv=5) para buscar los mejores parámetros del modelo de regresión logística. Esto significa que los datos se dividirán en 5 partes iguales y se realizarán 5 iteraciones para evaluar el modelo en diferentes divisiones de los datos.

# Función que realiza la validación cruzada y devuelve los mejores parámetros y predicciones
def val_cruz(model, param_grid, X_train, y_train, X_test):
    grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy')
    grid_search.fit(X_train, y_train)
    pred = grid_search.predict(X_test)
    best_params = grid_search.best_params_
    return best_params, pred

Probemos con otros algoritmos!

Máquina de soporte vectorial (Support Vector Machine o SVM)

¿Alguna vez han sentido que los datos les desafían a encontrar una línea divisoria clara y definida? ¡Las SVM están aquí para romper esas barreras! Estas máquinas aprenden del pasado y extraen patrones complejos para trazar límites en un mundo de datos multidimensionales.

Imaginen un campo de batalla, donde las clases se enfrentan y luchan por la supremacía. Aquí es donde las SVM entran en acción, equipadas con una astucia matemática y un espíritu implacable para encontrar el hiperplano óptimo, esa línea mágica que separa las clases con el mayor margen posible.

Pero no crean que las SVM son solo un par de algoritmos aburridos. ¡No! Son mucho más que eso. Son auténticos campeones del aprendizaje automático, capaces de resolver problemas de clasificación binaria y multiclase con elegancia y eficiencia.

Imaginemos una situación en la que tengamos una tarea de clasificación por delante. Nuestro héroe, el SVM, se enfrenta a un mar de puntos de datos, cada uno deseando ser asignado a su clase correspondiente. Con su magia matemática, el SVM busca el equilibrio perfecto entre el aprendizaje y el generalismo, para evitar tanto el sobreajuste como el subajuste.

¡Pero espera, hay más! Las SVM también pueden manejar características no lineales, gracias a una técnica poderosa llamada kernelización. Al combinar habilidades matemáticas con la capacidad de transformar los datos a espacios de características más complejos, las SVM pueden superar incluso los desafíos más retorcidos y confusos.

Ahora que hemos encendido la llama de su curiosidad, prepárense para sumergirse en el fascinante mundo de las SVM. 



¡Árboles de Decisión, la hoja de ruta hacia la inteligencia!

Imaginen un frondoso bosque, lleno de árboles majestuosos, cada uno con ramas extendiéndose en todas las direcciones. Ahora, visualicen que estos árboles no son solo maravillas de la naturaleza, sino que también representan la toma de decisiones en el mundo de la inteligencia artificial. ¡Bienvenidos al apasionante mundo de los árboles de decisión!

Los árboles de decisión son como mapas intrincados que nos guían a través del laberinto de los datos. Son algoritmos que toman una serie de preguntas y condiciones, y nos conducen por un camino específico hasta llegar a una conclusión. ¡Son como guías expertos, llevándonos hacia la respuesta correcta con confianza y precisión!

Estos árboles se construyen a través de un proceso de aprendizaje automático, donde se utilizan ejemplos de datos etiquetados para aprender patrones y reglas. Una vez construido, el árbol de decisión se convierte en una herramienta poderosa para clasificar nuevas instancias o predecir resultados futuros. ¡Es como tener un navegante en el océano de datos, listo para mostrarte el camino hacia el éxito!



¡Bosques Aleatorios, donde los árboles cobran vida!

Pero, ¿qué ocurre cuando un solo árbol no es suficiente para satisfacer nuestra curiosidad? ¡Ahí es cuando entra en juego el emocionante mundo de los Bosques Aleatorios!

Los Bosques Aleatorios son como un carnaval fascinante, lleno de diversidad y alegría. En lugar de depender únicamente de un solo árbol de decisión, los Bosques Aleatorios combinan múltiples árboles para formar un verdadero ejército de sabiduría colectiva. Cada árbol en el bosque toma decisiones basadas en diferentes características y juntos forman una fuerza imparable.

Al combinar la sabiduría de múltiples árboles, los Bosques Aleatorios pueden ofrecer resultados más precisos y robustos. Además, tienen la capacidad de manejar conjuntos de datos grandes y complejos, proporcionando una poderosa herramienta para la clasificación y la regresión. ¡Imaginen un coro de árboles, cada uno con su voz única, creando una sinfonía de aprendizaje automático!

creditos de imagen a: imagen


¡XGB, el héroe de la velocidad y la precisión!

¡Pero espera, aquí viene XGB, el héroe de la velocidad y la precisión! XGB, también conocido como Gradient Boosting Extreme, es como el corredor olímpico de los algoritmos de aprendizaje automático. ¡Es rápido, poderoso y siempre busca la excelencia!

XGB se basa en la técnica de impulso de gradientes, que implica construir árboles de decisión de manera secuencial, donde cada árbol se centra en mejorar las debilidades del modelo anterior. A medida que los árboles se construyen y se combinan, el modelo se vuelve cada vez más preciso y eficiente. ¡Es como tener un entrenador personal que te empuja constantemente hacia el máximo rendimiento!

La velocidad y la precisión son las joyas de la corona de XGB. Gracias a su capacidad para procesar grandes volúmenes de datos de manera eficiente, XGB se ha convertido en una opción popular en aplicaciones donde el tiempo es crucial, como el procesamiento de datos en tiempo real y la competición de ciencia de datos. ¡Con XGB a tu lado, estarás preparado para conquistar cualquier desafío de aprendizaje automático con velocidad y estilo!

creditos imagen: imagen

¡KNN, el vecino curioso que siempre está ahí!

¿Alguna vez has pensado en cómo tus vecinos pueden ser útiles en momentos de necesidad? ¡Bueno, KNN es ese vecino curioso y servicial en el mundo de los algoritmos de aprendizaje automático!

KNN, que significa k-nearest neighbors (k-vecinos más cercanos), es un algoritmo que busca respuestas en su vecindario. Cuando se le presenta un problema, KNN encuentra los puntos de datos más cercanos en función de la similitud de sus características y se basa en su comportamiento para tomar una decisión. ¡Es como tener una comunidad sólida a la que acudir en busca de ayuda!

La belleza de KNN radica en su simplicidad y enfoque intuitivo. No requiere ninguna suposición sobre la estructura subyacente de los datos y puede adaptarse fácilmente a diferentes escenarios. Sin embargo, también es importante tener en cuenta que el rendimiento de KNN puede verse afectado por la elección del valor de "k" y la métrica de distancia utilizada. ¡Así que asegúrate de elegir sabiamente a tus vecinos más cercanos!


¡Ahí lo tienen, intrépidos aprendices y maestros universitarios! Los árboles de decisión, los bosques aleatorios, XGB y KNN son solo algunas de las emocionantes herramientas que nos ofrece el vasto mundo del aprendizaje automático. Cada uno tiene su propio encanto y nos lleva por caminos emocionantes hacia el conocimiento y la comprensión.

Así que, ¡adelante! ¡Sumérjanse en estos algoritmos con entusiasmo y aprovechen su poder para desentrañar los misterios de los datos! ¡Que la aventura comience y que el aprendizaje nunca termine!

Paso 6: Que gane el mejor!

¡Oh, vaya! Parece que estamos en un momento crucial, donde debemos tomar una decisión épica: elegir el mejor algoritmo entre los que hemos explorado, teniendo en cuenta métricas clave como la exactitud (accuracy), la precisión (precision), la exhaustividad (recall) y el puntaje F1 (F1-score). ¡Prepárense para la gran revelación!

Después de un exhaustivo proceso de pruebas y evaluación, he sometido a todos los algoritmos a un desafío titánico. Han competido en una serie de tareas deslumbrantes y han demostrado sus habilidades en cada una de las métricas que nos interesan. Ahora, llegó el momento de desvelar al campeón supremo.

Redoble de tambores, por favor...

El ganador de esta emocionante batalla de algoritmos es...

# Ordenes los resultados de mayor a menor f1_score de cada algoritmo y guardemoslos en r_sorted
r_sorted = results.sort_values("f1_score", ascending=False)
# Presentamos los nombres de los algoritmos con los resultados de sus métricas
r_sorted.loc[:,["Name","accuracy", "precision", "recall", "f1_score"]]



¡KNN, el increíble K vecinos cercanos!

KNN ha demostrado ser un verdadero titán en términos de precisión, exhaustividad y F1-score. Su capacidad para agrupar continuamente a través de la búsqueda implacable de las mínimas distancias le ha dado una ventaja significativa sobre los demás. Es un algoritmo rápido, poderoso y siempre busca la excelencia.

Si bien los árboles de decisión y los bosques aleatorios también han mostrado un rendimiento impresionante, KNN se ha destacado en todas las métricas clave que hemos considerado. Su precisión en la clasificación de datos es asombrosa, su capacidad para identificar verdaderos positivos y minimizar los falsos negativos es excepcional, y su F1-score equilibra de manera brillante la precisión y la exhaustividad.

Dicho esto, es importante recordar que la elección del algoritmo "mejor" depende en última instancia del contexto y los requisitos específicos de tu problema. Cada algoritmo tiene sus fortalezas y debilidades, y es fundamental tener en cuenta el conjunto de datos y el objetivo que buscas lograr.

¡Así que felicidades a KNN por su victoria impresionante! Pero también te animo a explorar y experimentar con otros algoritmos, ya que en diferentes situaciones podrían surgir sorpresas y desafíos que requieran diferentes enfoques.

En última instancia, la emoción y la diversión de la exploración en el mundo del aprendizaje automático radican en descubrir qué algoritmo se adapta mejor a tus necesidades y te ayuda a desatar todo tu potencial en el análisis de datos. ¡Que tus futuras aventuras sean emocionantes y llenas de descubrimientos sorprendentes!

Pongamos todas las piezas juntas.


  # Preparación de los datos en dos tipo: entrenamiento(train) y prueba(test)
  X = dt.drop(['MP_encoded'], axis=1)
  y = dt['MP_encoded']
  X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=42)
  scaler = StandardScaler()
  X_train = scaler.fit_transform(X_train)
  X_test = scaler.transform(X_test)

  # Lista de los modelo de clasificación que vamos a entrenar
  model_list = [
      LogisticRegression(max_iter=1000),#Regresión logística
      svm.SVC(),#Máquina de soporte vectorial
      DecisionTreeClassifier(), #Árbol de decisión
      RandomForestClassifier(n_estimators=300), # Bosque aleatorio
      xgb.XGBClassifier(), # Xtreme Gradient Boosting 
      KNeighborsClassifier() # K-nearest neighbors
  ]
  # Lista con los parametros que se evaluaran con su respectivo algoritmo
  param_list = {
      "Logreg": {'C': [0.001, 0.01, 0.1, 1, 10]},
      "svm": {'kernel': ('linear', 'rbf'), 'C': [0.001, 0.01, 0.1, 1, 10]},
      "Tree": {
          'criterion': ['gini', 'entropy'],
          'max_depth': [None, 5, 10, 15],
          'min_samples_split': [2, 5, 10],
          'min_samples_leaf': [1, 2, 4]
      },
      "Forest": {
          'n_estimators': [100, 200, 300],
          'max_depth': [None, 5, 10],
          'min_samples_split': [2, 5, 10],
          'min_samples_leaf': [1, 2, 4]
      },
      "xgb": {'learning_rate': [0.1, 0.01],
              'max_depth': [3, 5, 7],
              'n_estimators': [100, 200, 300]
      },
      "knn": {
          'n_neighbors': [2,3,4,5,6,7],
          'weights': ['uniform', 'distance'],
          'p': [1, 2]
      }
  }

  # Función que devuelve las métricas de evaluación
  def metricas(y_test, y_pred):
      accuracy = accuracy_score(y_test, y_pred)
      precision = precision_score(y_test, y_pred, average='macro', zero_division=1)
      recall = recall_score(y_test, y_pred, average='macro')
      f1 = f1_score(y_test, y_pred, average='macro')
      return accuracy, precision, recall, f1

  # Función que realiza la validación cruzada y devuelve los mejores parámetros y predicciones
  def val_cruz(model, param_grid, X_train, y_train, X_test):
      grid_search = GridSearchCV(model, param_grid, cv=5, scoring='accuracy')
      grid_search.fit(X_train, y_train)
      pred = grid_search.predict(X_test)
      best_params = grid_search.best_params_
      return best_params, pred

  # Función que encuentra los mejores parametros para cada modelo y devuelve un diccionario con los resultados de cada evaluación
  def eval_model(model_list, param_list, X_train, y_train, X_test, y_test):
      model_results = []

      for name, model, params in zip(param_list.keys(), model_list, param_list.values()):
          best_params, pred = val_cruz(model, params, X_train, y_train, X_test)
          acc, pre, re, f1 = metricas(y_test, pred)
          model_results.append(pd.DataFrame({
          "Name": [name],
          "best_params": [best_params],
          "predictions": [pred],
          "accuracy": [acc],
          "precision": [pre],
          "recall": [re],
          "f1_score": [f1]
          }))
      results = pd.concat(model_results, ignore_index=True)
      return results

  # Llamar a la función eval_model
  results = eval_model(model_list, param_list, X_train, y_train, X_test, y_test)
  print(results)

  # Función que grafica y devuelve la matriz de confusión
  def grafica_cm(y_test, y_pred):
      cm = confusion_matrix(y_test, y_pred)
      fig, ax = plt.subplots()
      sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', ax=ax)
      ax.set_xlabel('Etiqueta Predicha')
      ax.set_ylabel('Etiqueta Real')
      ax.set_title('Matriz de Confusión')
      plt.show()
      return cm

  # Llamar a la función para graficar la matriz de confusión
  grafica_cm(y_test, results.loc[0, 'predictions'])

  # Ordena los resultados de mayor a menor f1_score de cada algoritmo y guardemoslos en r_sorted
  r_sorted = results.sort_values("f1_score", ascending=False)

  # Presentamos los nombres de los algoritmos con los resultados de sus métricas
  r_sorted.loc[:,["Name","accuracy", "precision", "recall", "f1_score"]]

  # Guardamos los resultados para futuras implementaciones en un archivo excel
  results.to_excel("ML_results.xlsx")
  

Encuentra los mejores libros de machine learning aqui.

Machine Learning Books

Entradas populares de este blog

Cómo Equilibrar Múltiples Productos con Pedidos a la Medida

Maximiza la rentabilidad de tu negocio: Cómo optimizar la selección de proveedores de mercancías.

Domina tu Almacén sin arruinarte: El Juego del Modelo de Inventario Múltiproductos con Presupuesto ajustado

¡Plan Desagregado de Producción como un jefe!

Optimización del Inventario Multiproducto en Espacios Reducidos: Una guía para la eficiencia en gestión de stocks

El Desafío del Empaque en Contenedores: Optimizando Espacios en contenedores con Ingenio

¡Optimización de Portafolios de Productos: El arte de maximizar el éxito!"