scikit-learn

ScikitLearn

Tutorial ScikitLearn: Clasificación con algoritmos de conjunto

Scikit Learn y los ensembles algoritmos de conjunto para clasificación. Aprende a implementar Bagging, Random Forest, AdaBoost y Gradient Boosting con ejemplos detallados y código en Python.

Aprende ScikitLearn GRATIS y certifícate

Introducción a los algoritmos de conjunto para clasificación

Los algoritmos de conjunto son técnicas de aprendizaje automático que combinan múltiples modelos base para mejorar la capacidad predictiva y la robustez del modelo final. En el contexto de la clasificación, estos algoritmos permiten obtener resultados más precisos al reducir la varianza y el sesgo de los modelos individuales.

La idea fundamental detrás de los métodos de conjunto es que una colección de modelos débiles puede conformar un modelo fuerte cuando se combinan adecuadamente. Esto se logra mediante técnicas que promueven la diversidad entre los modelos base y estrategias de combinación eficientes.

Existen principalmente dos enfoques para construir algoritmos de conjunto:

  1. Métodos de promediado: Estos métodos construyen varios estimadores independientes y promedian sus predicciones. El objetivo es reducir la varianza de las predicciones. Un ejemplo clásico es el bagging (bootstrap aggregating), donde se utilizan muestras aleatorias con reemplazo para entrenar cada modelo base.
  2. Métodos de potenciación: Conocidos como boosting, estos métodos construyen secuencialmente una serie de modelos, cada uno intentando corregir los errores del anterior. El enfoque se centra en reducir el sesgo del modelo combinado.

En Scikit-Learn, se proporcionan implementaciones eficientes de varios algoritmos de conjunto para clasificación:

  • Bagging

El BaggingClassifier permite entrenar modelos base en diferentes subconjuntos del conjunto de datos de entrenamiento y luego combinar sus predicciones. Es especialmente útil para modelos con alta varianza.

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

# Cargar conjunto de datos
X, y = load_wine(return_X_y=True)

# Dividir en conjunto de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Crear el modelo de Bagging
bagging = BaggingClassifier(estimator=DecisionTreeClassifier(),
                            n_estimators=10, random_state=42)

# Entrenar el modelo
bagging.fit(X_train, y_train)

# Evaluar el modelo
score = bagging.score(X_test, y_test)
print(f'Precisión del modelo Bagging: {score:.2f}')
  • Random Forest

El RandomForestClassifier es una extensión del bagging que introduce aleatoriedad adicional al seleccionar subconjuntos de características para la construcción de cada árbol de decisión. Esto mejora la diversidad entre los árboles y suele conducir a un mejor rendimiento.

from sklearn.ensemble import RandomForestClassifier

# Crear el modelo de Random Forest
random_forest = RandomForestClassifier(n_estimators=100, random_state=42)

# Entrenar el modelo
random_forest.fit(X_train, y_train)

# Evaluar el modelo
score = random_forest.score(X_test, y_test)
print(f'Precisión del modelo Random Forest: {score:.2f}')
  • AdaBoost

El AdaBoostClassifier ajusta secuencialmente modelos base, normalmente árboles de decisión de profundidad uno (stumps), y ajusta los pesos de las observaciones para enfocarse en los ejemplos difíciles de clasificar.

from sklearn.ensemble import AdaBoostClassifier

# Crear el modelo de AdaBoost
adaboost = AdaBoostClassifier(n_estimators=50, algorithm='SAMME', random_state=42)

# Entrenar el modelo
adaboost.fit(X_train, y_train)

# Evaluar el modelo
score = adaboost.score(X_test, y_test)
print(f'Precisión del modelo AdaBoost: {score:.2f}')
  • Gradient Boosting

El GradientBoostingClassifier construye modelos de manera aditiva, optimizando una función de pérdida arbitraria mediante el descenso del gradiente. Es especialmente eficaz para manejar datos complejos y puede ajustarse para evitar el sobreajuste.

from sklearn.ensemble import GradientBoostingClassifier

# Crear el modelo de Gradient Boosting
gradient_boosting = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1, random_state=42)

# Entrenar el modelo
gradient_boosting.fit(X_train, y_train)

# Evaluar el modelo
score = gradient_boosting.score(X_test, y_test)
print(f'Precisión del modelo Gradient Boosting: {score:.2f}')

Ventajas de utilizar algoritmos de conjunto:

  • Mayor precisión: Al combinar múltiples modelos, se suelen obtener predicciones más precisas que con modelos individuales.
  • Reducción de la varianza y el sesgo: Los métodos de conjunto equilibran la varianza y el sesgo, reduciendo el riesgo de sobreajuste.
  • Flexibilidad: Permiten el uso de diferentes modelos base y pueden adaptarse a diversas estructuras de datos.

Consideraciones importantes:

  • Coste computacional: Pueden requerir más tiempo de entrenamiento y recursos computacionales debido al número de modelos involucrados.
  • Interpretabilidad limitada: Los modelos de conjunto son más complejos y menos interpretables que los modelos individuales simples.
  • Ajuste de hiperparámetros: Es necesario prestar atención al ajuste de los hiperparámetros para garantizar un rendimiento óptimo.

RandomForestClassifier

El RandomForestClassifier es un algoritmo de aprendizaje automático que combina múltiples árboles de decisión para realizar tareas de clasificación. Este método pertenece a los algoritmos de conjunto, donde el modelo final se beneficia de la diversidad de varios modelos base, reduciendo la varianza y mejorando la precisión.

El Random Forest construye una multitud de árboles de decisión durante el entrenamiento y emite la clase que es el modo de las clases de los árboles individuales. La aleatoriedad se introduce en dos niveles: primero, al seleccionar muestras aleatorias (con reemplazo) del conjunto de datos para construir cada árbol (bootstrap), y segundo, al seleccionar un subconjunto aleatorio de características en cada nodo para determinar la mejor división.

Implementación básica

Para utilizar el RandomForestClassifier de Scikit-Learn, es necesario importar el módulo correspondiente y entrenar el modelo con los datos de entrenamiento.

from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# Cargar el conjunto de datos
X, y = load_iris(return_X_y=True)

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

# Crear el modelo de Random Forest
modelo = RandomForestClassifier(random_state=42)

# Entrenar el modelo
modelo.fit(X_train, y_train)

# Realizar predicciones
y_pred = modelo.predict(X_test)

# Evaluar el modelo
precision = modelo.score(X_test, y_test)
print(f'Precisión del modelo: {precision:.2f}')

En este ejemplo, se utiliza el conjunto de datos Iris, un clásico en problemas de clasificación. Se divide el conjunto de datos en entrenamiento y prueba, se crea una instancia de RandomForestClassifier y se entrena el modelo con los datos de entrenamiento. Finalmente, se evalúa la precisión del modelo en los datos de prueba.

Parámetros importantes

El RandomForestClassifier ofrece una variedad de hiperparámetros que permiten ajustar el comportamiento del modelo:

  • n_estimators: Número de árboles en el bosque. Un valor más alto suele mejorar el rendimiento, pero aumenta el tiempo de entrenamiento.
  • max_depth: Profundidad máxima de los árboles. Limitar la profundidad puede evitar el sobreajuste.
  • min_samples_split: Número mínimo de muestras requeridas para dividir un nodo interno.
  • min_samples_leaf: Número mínimo de muestras requerido para ser una hoja.
  • max_features: Número máximo de características a considerar para encontrar la mejor división. Puede ser un valor entero, un porcentaje o palabras clave como 'auto', 'sqrt' o 'log2'.
  • bootstrap: Si es True, se utiliza el muestreo con reemplazo; si es False, se utilizan todas las muestras para construir cada árbol.
  • class_weight: Permite asignar pesos a las clases para manejar conjuntos de datos desbalanceados.

Ajuste de hiperparámetros

El rendimiento del modelo puede mejorar significativamente al ajustar los hiperparámetros. Se puede emplear la búsqueda en cuadrícula (GridSearchCV) o la búsqueda aleatoria (RandomizedSearchCV) para encontrar la combinación óptima.

from sklearn.model_selection import GridSearchCV

# Definir el espacio de búsqueda
parametros = {
    'n_estimators': [50, 100, 200],
    'max_depth': [None, 10, 20],
    'max_features': ['auto', 'sqrt', 'log2']
}

# Crear la instancia de GridSearchCV
busqueda = GridSearchCV(estimator=RandomForestClassifier(random_state=42),
                        param_grid=parametros, cv=5, n_jobs=-1)

# Ejecutar la búsqueda
busqueda.fit(X_train, y_train)

# Mejor estimador encontrado
mejor_modelo = busqueda.best_estimator_
print(f'Mejores hiperparámetros: {busqueda.best_params_}')

En este código, se exploran diferentes combinaciones de hiperparámetros utilizando validación cruzada de 5 pliegues. El parámetro n_jobs=-1 permite utilizar todos los núcleos disponibles del procesador para acelerar el cálculo.

Importancia de las características

El Random Forest proporciona una estimación de la importancia de las características, lo que permite identificar cuáles son las variables más relevantes para la clasificación.

import pandas as pd
import matplotlib.pyplot as plt

# Obtener las importancias de las características
importancias = mejor_modelo.feature_importances_
nombres_caracteristicas = load_iris().feature_names

# Crear un DataFrame para visualizar
df_importancias = pd.DataFrame({'Característica': nombres_caracteristicas, 'Importancia': importancias})
df_importancias = df_importancias.sort_values('Importancia', ascending=False)

# Visualizar las importancias
plt.barh(df_importancias['Característica'], df_importancias['Importancia'])
plt.xlabel('Importancia')
plt.ylabel('Característica')
plt.title('Importancia de las características')
plt.gca().invert_yaxis()
plt.show()

Este gráfico muestra las características ordenadas según su importancia en el modelo. Identificar las variables más influyentes es esencial para entender el comportamiento del modelo y puede ser útil para reducción de dimensionalidad o para interpretar los resultados.

Control del sobreajuste

Los árboles de decisión profundos pueden ocasionar sobreajuste. En el contexto del Random Forest, aunque la aleatoriedad y el conjunto de árboles ayudan a mitigar este problema, es recomendable ajustar parámetros como max_depth, min_samples_split y min_samples_leaf.

# Modelo con limitación de profundidad
modelo_limitado = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
modelo_limitado.fit(X_train, y_train)
precision_limitada = modelo_limitado.score(X_test, y_test)
print(f'Precisión del modelo con max_depth=5: {precision_limitada:.2f}')

Al limitar la profundidad máxima de los árboles, se reduce la complejidad del modelo, lo que puede mejorar su capacidad de generalización en datos nuevos.

Uso de Out-of-Bag (OOB) Score

El Out-of-Bag Score es una forma de estimar la precisión del modelo sin necesidad de un conjunto de validación adicional. Las muestras no incluidas en el bootstrap de cada árbol se utilizan para calcular este puntaje.

# Modelo con evaluación OOB
modelo_oob = RandomForestClassifier(n_estimators=100, oob_score=True, random_state=42)
modelo_oob.fit(X_train, y_train)
print(f'Puntaje OOB: {modelo_oob.oob_score_:.2f}')

El parámetro oob_score=True habilita el cálculo del puntaje OOB. Este valor es útil para evaluar el rendimiento del modelo durante el entrenamiento y detectar posibles problemas de sobreajuste.

Predicción de probabilidades

El RandomForestClassifier permite obtener las probabilidades asociadas a cada clase, lo cual es esencial en aplicaciones donde se requiere un umbral de decisión personalizado.

# Obtener probabilidades de predicción
probabilidades = modelo.predict_proba(X_test)

# Ver las probabilidades de las primeras 5 muestras
print(probabilidades[:5])

La función predict_proba devuelve un arreglo con las probabilidades de pertenencia a cada clase para cada muestra. Esto puede utilizarse para construir curvas ROC o calcular métricas como el AUC.

Manejo de datos desbalanceados

En conjuntos de datos donde las clases están desbalanceadas, es crucial ajustar el parámetro class_weight o utilizar técnicas de remuestreo. El RandomForestClassifier permite establecer pesos inversamente proporcionales a la frecuencia de las clases.

# Modelo con ajuste de class_weight
modelo_balanceado = RandomForestClassifier(class_weight='balanced', random_state=42)
modelo_balanceado.fit(X_train, y_train)

Al asignar class_weight='balanced', el modelo ajusta los pesos de las clases automáticamente, lo que puede mejorar la capacidad de clasificación en clases minoritarias.

Guardar y cargar el modelo entrenado

Es común guardar el modelo entrenado para uso futuro sin tener que re-entrenarlo. Se puede utilizar el módulo joblib para este propósito.

import joblib

# Guardar el modelo
joblib.dump(mejor_modelo, 'random_forest_model.pkl')

# Cargar el modelo
modelo_cargado = joblib.load('random_forest_model.pkl')

# Verificar que el modelo cargado funciona
precision_cargado = modelo_cargado.score(X_test, y_test)
print(f'Precisión del modelo cargado: {precision_cargado:.2f}')

Al guardar el modelo, es posible desplegarlo en entornos de producción o compartirlo con otros equipos. El uso de joblib es eficiente para modelos de Scikit-Learn porque maneja correctamente objetos grandes como los que se generan en Random Forest.

AdaBoostClassifier

El AdaBoostClassifier es un algoritmo de aprendizaje automático que pertenece a la familia de métodos de potenciación, o boosting. La principal idea detrás de AdaBoost (Adaptive Boosting) es combinar múltiples modelos débiles para crear un modelo fuerte, mejorando así la capacidad predictiva y reduciendo el sesgo.

El proceso de AdaBoostClassifier se basa en ajustar secuencialmente una serie de estimadores débiles, normalmente árboles de decisión de poca profundidad (a menudo, árboles de decisión de un solo nivel, conocidos como stumps). En cada iteración, el algoritmo ajusta los pesos de las observaciones, enfatizando aquellas que fueron clasificadas incorrectamente en iteraciones anteriores. De esta manera, los estimadores posteriores se enfocan en los ejemplos más difíciles.

Implementación básica

Para utilizar el AdaBoostClassifier en Scikit-Learn, es necesario importar la clase correspondiente y entrenar el modelo con los datos de entrenamiento.

from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

# Cargar el conjunto de datos
X, y = load_wine(return_X_y=True)

# Dividir en conjuntos de entrenamiento y prueba
X_entrenamiento, X_prueba, y_entrenamiento, y_prueba = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# Crear el modelo de AdaBoost
modelo_adaboost = AdaBoostClassifier(random_state=42)

# Entrenar el modelo
modelo_adaboost.fit(X_entrenamiento, y_entrenamiento)

# Realizar predicciones
y_pred = modelo_adaboost.predict(X_prueba)

# Evaluar el modelo
precision = modelo_adaboost.score(X_prueba, y_prueba)
print(f'Precisión del modelo AdaBoost: {precision:.2f}')

En este ejemplo, se utiliza el conjunto de datos Wine, que es un conjunto de datos clásico para problemas de clasificación multicategoría. El modelo se entrena y se evalúa su precisión en el conjunto de prueba.

Parámetros importantes

El AdaBoostClassifier ofrece varios hiperparámetros que permiten ajustar el comportamiento del algoritmo:

  • base_estimator: Estimador base a utilizar. Por defecto es un DecisionTreeClassifier con una profundidad máxima de 1 (stump). Se puede especificar cualquier clasificador compatible de Scikit-Learn.
  • n_estimators: Número máximo de estimadores a combinar. Valores más altos pueden mejorar el rendimiento pero incrementan el tiempo de entrenamiento.
  • learning_rate: Tasa de aprendizaje que controla la contribución de cada estimador débil. Un valor más bajo requiere más estimadores.
  • algorithm: Algoritmo de potenciación a utilizar. Puede ser 'SAMME' o 'SAMME.R' (por defecto 'SAMME.R'), donde 'SAMME.R' utiliza las probabilidades de clase para actualizar los pesos, lo cual suele ser más rápido.
  • random_state: Semilla para la generación de números aleatorios, lo que permite reproducir los resultados.

Uso de diferentes estimadores base

Aunque el AdaBoostClassifier utiliza por defecto un árbol de decisión de poca profundidad, es posible especificar otros estimadores base. Por ejemplo, se puede utilizar un árbol de decisión con mayor profundidad o un clasificador lineal.

from sklearn.tree import DecisionTreeClassifier

# Utilizar un árbol de decisión con profundidad máxima de 3 como estimador base
estimador_base = DecisionTreeClassifier(max_depth=3, random_state=42)
modelo_adaboost_custom = AdaBoostClassifier(
    base_estimator=estimador_base, n_estimators=50, random_state=42
)

# Entrenar el modelo
modelo_adaboost_custom.fit(X_entrenamiento, y_entrenamiento)

# Evaluar el modelo
precision_custom = modelo_adaboost_custom.score(X_prueba, y_prueba)
print(f'Precisión del modelo AdaBoost con estimador base personalizado: {precision_custom:.2f}')

Al cambiar el estimador base, es posible que el rendimiento mejore o empeore, dependiendo de los datos y del problema específico. Es recomendable experimentar con diferentes estimadores para encontrar la mejor configuración.

Ajuste de hiperparámetros

Para optimizar el rendimiento del AdaBoostClassifier, es fundamental ajustar sus hiperparámetros utilizando técnicas como la búsqueda en cuadrícula (GridSearchCV).

from sklearn.model_selection import GridSearchCV

# Definir el espacio de búsqueda
parametros = {
    'n_estimators': [50, 100, 200],
    'learning_rate': [0.01, 0.1, 1],
    'base_estimator__max_depth': [1, 2, 3]
}

# Crear el estimador base
estimador_base = DecisionTreeClassifier(random_state=42)

# Crear el modelo de AdaBoost
modelo_adaboost = AdaBoostClassifier(base_estimator=estimador_base, random_state=42)

# Configurar la búsqueda en cuadrícula
busqueda = GridSearchCV(
    estimator=modelo_adaboost,
    param_grid=parametros,
    cv=5,
    n_jobs=-1
)

# Ejecutar la búsqueda
busqueda.fit(X_entrenamiento, y_entrenamiento)

# Mejor modelo encontrado
mejor_modelo = busqueda.best_estimator_
print(f'Mejores hiperparámetros: {busqueda.best_params_}')

# Evaluar el mejor modelo
precision_mejor = mejor_modelo.score(X_prueba, y_prueba)
print(f'Precisión del mejor modelo AdaBoost: {precision_mejor:.2f}')

En este código, se ajustan los hiperparámetros n_estimators, learning_rate y la profundidad máxima del estimador base. El prefijo base_estimator__ se utiliza para acceder a los hiperparámetros del estimador base dentro del AdaBoostClassifier.

Importancia de las características

El AdaBoostClassifier ofrece una estimación de la importancia de las características a través del atributo feature_importances_. Esto permite identificar qué variables tienen mayor influencia en el modelo.

import pandas as pd
import matplotlib.pyplot as plt

# Obtener las importancias de las características
importancias = mejor_modelo.feature_importances_
nombres_caracteristicas = load_wine().feature_names

# Crear un DataFrame para visualizar
df_importancias = pd.DataFrame({
    'Característica': nombres_caracteristicas,
    'Importancia': importancias
})
df_importancias = df_importancias.sort_values('Importancia', ascending=False)

# Visualizar las importancias
plt.barh(df_importancias['Característica'], df_importancias['Importancia'])
plt.xlabel('Importancia')
plt.ylabel('Característica')
plt.title('Importancia de las características en AdaBoost')
plt.gca().invert_yaxis()
plt.show()

Este gráfico muestra la relevancia de cada característica en el modelo final. Es una herramienta útil para la interpretabilidad y para tomar decisiones sobre la selección de características en futuros modelos.

Manejo del sobreajuste

El AdaBoostClassifier puede ser propenso al sobreajuste, especialmente si se utilizan demasiados estimadores o si los estimadores base son demasiado complejos. Para controlar el sobreajuste, es importante:

  • Ajustar el número de estimadores (n_estimators): Valores muy altos pueden llevar a un sobreajuste.
  • Regularizar el estimador base: Limitar la complejidad del estimador base, por ejemplo, ajustando max_depth en árboles de decisión.
  • Modificar la tasa de aprendizaje (learning_rate): Una tasa de aprendizaje más baja puede hacer que el modelo sea más robusto.
# Modelo con parámetros ajustados para evitar sobreajuste
modelo_regularizado = AdaBoostClassifier(
    base_estimator=DecisionTreeClassifier(
        max_depth=1, min_samples_leaf=5, random_state=42
    ),
    n_estimators=100,
    learning_rate=0.5,
    random_state=42
)

# Entrenar el modelo
modelo_regularizado.fit(X_entrenamiento, y_entrenamiento)

# Evaluar el modelo
precision_regularizada = modelo_regularizado.score(X_prueba, y_prueba)
print(f'Precisión del modelo regularizado: {precision_regularizada:.2f}')

Ajustar estos parámetros ayuda a encontrar un equilibrio entre sesgo y varianza, mejorando la capacidad de generalización del modelo.

Predicción de probabilidades

El AdaBoostClassifier permite obtener las probabilidades asociadas a cada clase mediante el método predict_proba. Esto es esencial en aplicaciones donde es necesario establecer umbrales de decisión personalizados o calcular métricas como la curva ROC y el AUC.

from sklearn.metrics import roc_auc_score, roc_curve

# Obtener las probabilidades de predicción
probabilidades = mejor_modelo.predict_proba(X_prueba)

# Calcular el AUC (para problemas binarios)
# Aquí, se asume que el problema es binario para ilustrar el uso del AUC
# En caso de ser multicategoría, se deben adaptar las métricas

# Suponiendo que las etiquetas son 0 y 1
# y_prueba_binaria = (y_prueba == clase_positiva).astype(int)

# AUC = roc_auc_score(y_prueba_binaria, probabilidades[:, 1])
# print(f'AUC del modelo AdaBoost: {AUC:.2f}')

Es importante adaptar el cálculo de métricas como el AUC al tipo de problema (binario o multicategoría) y a las clases presentes en el conjunto de datos.

Aplicación en datos desbalanceados

El AdaBoostClassifier puede tener dificultades con conjuntos de datos donde las clases están desbalanceadas. Es fundamental utilizar técnicas para abordar este problema, como:

  • Ajustar los pesos de las clases: Mediante el parámetro algorithm y los pesos en el estimador base.
  • Sobremuestreo o submuestreo: Utilizar técnicas como SMOTE para balancear el conjunto de datos antes de entrenar.
  • Utilizar métricas apropiadas: En lugar de la precisión, utilizar métricas que reflejen mejor el rendimiento en datos desbalanceados, como el F1-score.
from sklearn.utils import resample

# Combinar los datos en un solo DataFrame
df = pd.DataFrame(X_entrenamiento, columns=load_wine().feature_names)
df['objetivo'] = y_entrenamiento

# Dividir entre clases mayoritaria y minoritaria
clase_mayoritaria = df[df['objetivo'] == 0]
clase_minoritaria = df[df['objetivo'] != 0]

# Sobremuestreo de la clase minoritaria
clase_minoritaria_upsampled = resample(
    clase_minoritaria,
    replace=True,
    n_samples=len(clase_mayoritaria),
    random_state=42
)

# Combinar clases
df_balanceado = pd.concat([clase_mayoritaria, clase_minoritaria_upsampled])

# Separar características y etiquetas
X_balanceado = df_balanceado.drop('objetivo', axis=1)
y_balanceado = df_balanceado['objetivo']

# Entrenar el modelo con datos balanceados
modelo_balanceado = AdaBoostClassifier(random_state=42)
modelo_balanceado.fit(X_balanceado, y_balanceado)

Balancear el conjunto de datos puede mejorar significativamente el rendimiento del modelo en clases minoritarías.

Guardar y cargar el modelo entrenado

Es común guardar el modelo entrenado para su uso posterior sin necesidad de reentrenarlo. Se puede utilizar el módulo joblib para este propósito.

import joblib

# Guardar el modelo
joblib.dump(mejor_modelo, 'modelo_adaboost.pkl')

# Cargar el modelo
modelo_cargado = joblib.load('modelo_adaboost.pkl')

# Verificar que el modelo cargado funciona
precision_cargado = modelo_cargado.score(X_prueba, y_prueba)
print(f'Precisión del modelo cargado: {precision_cargado:.2f}')

Al guardar el modelo, es posible implementarlo en entornos de producción o compartirlo con otros miembros del equipo. El uso de joblib es eficiente para modelos de Scikit-Learn y maneja correctamente objetos de gran tamaño.

Consideraciones sobre el rendimiento

El AdaBoostClassifier puede ser menos eficiente computacionalmente en comparación con otros métodos de conjunto como el RandomForestClassifier, especialmente en conjuntos de datos muy grandes. Esto se debe a su naturaleza secuencial, ya que cada estimador se adapta en función del anterior.

Para mejorar el rendimiento computacional:

  • Reducir el número de estimadores: Utilizar un valor óptimo de n_estimators para minimizar el tiempo de entrenamiento.
  • Simplificar el estimador base: Emplear estimadores base más simples para reducir la complejidad.
  • Paralelizar procesos: Aunque AdaBoost es inherentemente secuencial, algunos procesos pueden beneficiarse de la paralelización utilizando n_jobs en el estimador base.

Con una comprensión profunda de sus parámetros y una cuidadosa validación, el AdaBoostClassifier puede ser una herramienta poderosa para mejorar el rendimiento en tareas de clasificación complejas.

GradientBoostingClassifier

El GradientBoostingClassifier es un algoritmo de aprendizaje automático que pertenece a la familia de métodos de potenciación, o boosting. A diferencia de AdaBoost, que ajusta los pesos de las observaciones en función de los errores, el Gradient Boosting optimiza una función de pérdida diferenciable mediante el descenso de gradiente. Esto permite construir modelos más precisos al corregir los errores residuales de los modelos anteriores en cada iteración.

El principio fundamental del GradientBoostingClassifier es construir secuencialmente una serie de modelos débiles, normalmente árboles de decisión poco profundos, donde cada modelo intenta reducir los residuos o errores del modelo anterior. Al combinar estos modelos, se obtiene un modelo fuerte con una capacidad predictiva mejorada.

Implementación básica

Para utilizar el GradientBoostingClassifier en Scikit-Learn, es necesario importar la clase correspondiente y entrenar el modelo con los datos de entrenamiento. A continuación, se presenta un ejemplo completo:

from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

# Cargar el conjunto de datos
X, y = load_breast_cancer(return_X_y=True)

# Dividir en conjuntos de entrenamiento y prueba
X_entrenamiento, X_prueba, y_entrenamiento, y_prueba = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# Crear el modelo de Gradient Boosting
modelo_gb = GradientBoostingClassifier(random_state=42)

# Entrenar el modelo
modelo_gb.fit(X_entrenamiento, y_entrenamiento)

# Realizar predicciones
y_pred = modelo_gb.predict(X_prueba)

# Evaluar el modelo
precision = modelo_gb.score(X_prueba, y_prueba)
print(f'Precisión del modelo Gradient Boosting: {precision:.2f}')

En este ejemplo, se utiliza el conjunto de datos Breast Cancer, un clásico en problemas de clasificación binaria. El modelo se entrena y se evalúa su precisión en el conjunto de prueba.

Parámetros importantes

El GradientBoostingClassifier ofrece una variedad de hiperparámetros que permiten ajustar el comportamiento del modelo:

  • loss: Función de pérdida a optimizar. Por defecto es 'log_loss', adecuada para clasificación binaria y multiclase.
  • learning_rate: Tasa de aprendizaje que controla la contribución de cada árbol. Valores más bajos requieren más estimadores para lograr un buen rendimiento.
  • n_estimators: Número de árboles en el modelo. Un número mayor de estimadores puede mejorar el rendimiento, pero aumenta el riesgo de sobreajuste.
  • max_depth: Profundidad máxima de los árboles individuales. Limitar la profundidad ayuda a reducir la varianza y controlar el sobreajuste.
  • subsample: Fracción de muestras utilizadas para entrenar cada árbol. Un valor menor que 1.0 introduce aleatoriedad y puede mejorar la generalización.
  • random_state: Semilla para la generación de números aleatorios, lo que permite reproducir los resultados.

Control del sobreajuste

El GradientBoostingClassifier puede ser propenso al sobreajuste si no se ajustan adecuadamente sus hiperparámetros. Algunas estrategias para controlar el sobreajuste incluyen:

  • Reducir el número de estimadores (n_estimators): Aunque más estimadores pueden mejorar el ajuste a los datos de entrenamiento, también pueden llevar al sobreajuste. Es fundamental encontrar un equilibrio.
  • Ajustar la tasa de aprendizaje (learning_rate): Una tasa de aprendizaje más baja reduce la influencia de cada árbol, lo que puede mejorar la capacidad de generalización. Sin embargo, es necesario aumentar el número de estimadores para compensar.
  • Limitar la profundidad de los árboles (max_depth): Á rboles más superficiales son menos complejos y pueden ayudar a prevenir el sobreajuste.
  • Utilizar el parámetro subsample: Configurar subsample a un valor menor que 1.0 (por ejemplo, 0.8) hace que cada árbol se entrene con una muestra aleatoria de los datos, lo que introduce variabilidad y puede mejorar la generalización.
# Modelo con ajustes para evitar sobreajuste
modelo_gb_ajustado = GradientBoostingClassifier(
    n_estimators=200,
    learning_rate=0.05,
    max_depth=3,
    subsample=0.8,
    random_state=42
)

# Entrenar el modelo ajustado
modelo_gb_ajustado.fit(X_entrenamiento, y_entrenamiento)

# Evaluar el modelo ajustado
precision_ajustada = modelo_gb_ajustado.score(X_prueba, y_prueba)
print(f'Precisión del modelo ajustado: {precision_ajustada:.2f}')

En este ejemplo, se ha reducido la tasa de aprendizaje y se ha incrementado el número de estimadores para mantener la capacidad predictiva. Además, se ha limitado la profundidad máxima y ajustado el submuestreo para mejorar la generalización.

Ajuste de hiperparámetros

Para optimizar el rendimiento del GradientBoostingClassifier, es esencial ajustar sus hiperparámetros utilizando técnicas como la búsqueda en cuadrícula (GridSearchCV) o la búsqueda aleatoria (RandomizedSearchCV).

from sklearn.model_selection import GridSearchCV

# Definir el espacio de búsqueda
parametros = {
    'n_estimators': [100, 200, 300],
    'learning_rate': [0.1, 0.05, 0.01],
    'max_depth': [3, 4, 5],
    'subsample': [0.6, 0.8, 1.0]
}

# Crear el modelo base
modelo_gb_base = GradientBoostingClassifier(random_state=42)

# Configurar la búsqueda en cuadrícula
busqueda = GridSearchCV(
    estimator=modelo_gb_base,
    param_grid=parametros,
    cv=5,
    n_jobs=-1
)

# Ejecutar la búsqueda
busqueda.fit(X_entrenamiento, y_entrenamiento)

# Mejor modelo encontrado
mejor_modelo = busqueda.best_estimator_
print(f'Mejores hiperparámetros: {busqueda.best_params_}')

# Evaluar el mejor modelo
precision_mejor = mejor_modelo.score(X_prueba, y_prueba)
print(f'Precisión del mejor modelo: {precision_mejor:.2f}')

Este código realiza una búsqueda exhaustiva en el espacio de hiperparámetros definido, utilizando validación cruzada para seleccionar la combinación que ofrece el mejor rendimiento.

Importancia de las características

El GradientBoostingClassifier proporciona una estimación de la importancia de las características a través del atributo feature_importances_. Esto permite identificar qué variables tienen mayor influencia en el modelo.

import pandas as pd
import matplotlib.pyplot as plt

# Obtener las importancias de las características
importancias = mejor_modelo.feature_importances_
nombres_caracteristicas = load_breast_cancer().feature_names

# Crear un DataFrame para visualizar
df_importancias = pd.DataFrame({
    'Característica': nombres_caracteristicas,
    'Importancia': importancias
})
df_importancias = df_importancias.sort_values('Importancia', ascending=False)

# Visualizar las importancias
plt.barh(df_importancias['Característica'], df_importancias['Importancia'])
plt.xlabel('Importancia')
plt.ylabel('Característica')
plt.title('Importancia de las características en Gradient Boosting')
plt.gca().invert_yaxis()
plt.show()

Este gráfico permite visualizar las características más relevantes para el modelo, lo cual es útil para la interpretabilidad y puede guiar procesos de selección de características.

Predicción de probabilidades

El GradientBoostingClassifier puede proporcionar las probabilidades asociadas a cada clase mediante el método predict_proba, lo que es esencial en aplicaciones donde se requiere un umbral de decisión personalizado o se necesitan métricas basadas en probabilidades.

from sklearn.metrics import roc_auc_score, roc_curve

# Obtener las probabilidades de predicción
probabilidades = mejor_modelo.predict_proba(X_prueba)

# Calcular el AUC
auc = roc_auc_score(y_prueba, probabilidades[:, 1])
print(f'AUC del modelo: {auc:.2f}')

# Generar la curva ROC
fpr, tpr, thresholds = roc_curve(y_prueba, probabilidades[:, 1])

# Graficar la curva ROC
plt.plot(fpr, tpr, label=f'AUC = {auc:.2f}')
plt.plot([0, 1], [0, 1], linestyle='--')
plt.xlabel('Tasa de falsos positivos')
plt.ylabel('Tasa de verdaderos positivos')
plt.title('Curva ROC')
plt.legend(loc='lower right')
plt.show()

La capacidad de predecir probabilidades permite ajustar el umbral de clasificación para mejorar métricas específicas, como la sensibilidad o la especificidad.

Manejo de datos desbalanceados

En conjuntos de datos con clases desbalanceadas, el GradientBoostingClassifier puede beneficiarse del ajuste de parámetros y técnicas específicas:

  • Ajustar la función de pérdida: Utilizar una función de pérdida que tenga en cuenta el desbalance de clases, como exponential_loss.
  • Modificar los pesos de las clases: A través del parámetro sample_weight al entrenar el modelo.
  • Sobremuestreo o submuestreo: Utilizar técnicas como SMOTE para equilibrar las clases antes del entrenamiento.
from imblearn.over_sampling import SMOTE

# Aplicar SMOTE al conjunto de entrenamiento
smote = SMOTE(random_state=42)
X_entrenamiento_bal, y_entrenamiento_bal = smote.fit_resample(X_entrenamiento, y_entrenamiento)

# Entrenar el modelo con datos balanceados
modelo_gb_bal = GradientBoostingClassifier(random_state=42)
modelo_gb_bal.fit(X_entrenamiento_bal, y_entrenamiento_bal)

# Evaluar el modelo
precision_bal = modelo_gb_bal.score(X_prueba, y_prueba)
print(f'Precisión del modelo con SMOTE: {precision_bal:.2f}')

El uso de SMOTE genera nuevas muestras sintéticas de la clase minoritaria, lo que puede mejorar el rendimiento del modelo en conjuntos de datos desbalanceados.

Guardar y cargar el modelo entrenado

Para reutilizar el modelo entrenado sin tener que reentrenarlo, se puede guardar utilizando el módulo joblib.

import joblib

# Guardar el modelo
joblib.dump(mejor_modelo, 'modelo_gradient_boosting.pkl')

# Cargar el modelo
modelo_cargado = joblib.load('modelo_gradient_boosting.pkl')

# Verificar que el modelo cargado funciona
precision_cargado = modelo_cargado.score(X_prueba, y_prueba)
print(f'Precisión del modelo cargado: {precision_cargado:.2f}')

Guardar el modelo permite su despliegue en entornos de producción o compartirlo con otros equipos de trabajo.

Monitorización y ajuste mediante información diagnóstica

El GradientBoostingClassifier proporciona herramientas para monitorear el proceso de entrenamiento y detectar problemas como el sobreajuste. El atributo train_score_ almacena la evolución de la función de pérdida en el conjunto de entrenamiento.

# Entrenar el modelo con seguimiento del entrenamiento
modelo_gb_diagnostico = GradientBoostingClassifier(
    n_estimators=200,
    learning_rate=0.05,
    max_depth=3,
    subsample=0.8,
    random_state=42
)

modelo_gb_diagnostico.fit(X_entrenamiento, y_entrenamiento)

# Obtener la puntuación en entrenamiento y prueba
train_loss = modelo_gb_diagnostico.train_score_
test_loss = []

from sklearn.metrics import log_loss

for y_pred in modelo_gb_diagnostico.staged_decision_function(X_prueba):
    test_loss.append(log_loss(y_prueba, 1 / (1 + np.exp(-y_pred))))

# Graficar la evolución de la pérdida
plt.plot(train_loss, label='Pérdida en entrenamiento')
plt.plot(test_loss, label='Pérdida en prueba')
plt.xlabel('Número de estimadores')
plt.ylabel('Pérdida logística')
plt.title('Evolución de la pérdida durante el entrenamiento')
plt.legend()
plt.show()

Este análisis permite identificar el punto en el que el modelo comienza a sobreajustar y ajustar el número óptimo de estimadores.

Uso de early_stopping

El parámetro n_iter_no_change puede utilizarse para detener el entrenamiento de manera temprana si la puntuación no mejora después de un número determinado de iteraciones.

# Modelo con early stopping
modelo_gb_early = GradientBoostingClassifier(
    n_estimators=1000,
    learning_rate=0.1,
    max_depth=3,
    validation_fraction=0.1,
    n_iter_no_change=10,
    tol=1e-4,
    random_state=42
)

# Entrenar el modelo
modelo_gb_early.fit(X_entrenamiento, y_entrenamiento)

# Número de estimadores utilizados
print(f'Número de estimadores utilizados: {modelo_gb_early.n_estimators_}')

El uso de early stopping evita entrenar más estimadores de los necesarios, reduciendo el tiempo de entrenamiento y previniendo el sobreajuste.

Consideraciones sobre el rendimiento

El GradientBoostingClassifier puede ser más lento en comparación con otros algoritmos de conjunto debido a su naturaleza secuencial. Para mejorar el rendimiento computacional:

  • Reducir el número de características: Mediante selección de características o reducción de dimensionalidad.
  • Paralelizar el entrenamiento: Utilizando el parámetro n_jobs (disponible en ciertas versiones y circunstancias).
  • Utilizar implementaciones alternativas: Como HistGradientBoostingClassifier en Scikit-Learn o XGBoost, que están optimizadas para grandes conjuntos de datos.
from sklearn.ensemble import HistGradientBoostingClassifier

# Modelo con HistGradientBoostingClassifier
modelo_hist_gb = HistGradientBoostingClassifier(
    max_iter=200,
    learning_rate=0.1,
    max_depth=3,
    random_state=42
)

# Entrenar el modelo
modelo_hist_gb.fit(X_entrenamiento, y_entrenamiento)

# Evaluar el modelo
precision_hist = modelo_hist_gb.score(X_prueba, y_prueba)
print(f'Precisión del modelo HistGradientBoosting: {precision_hist:.2f}')

El HistGradientBoostingClassifier es una implementación más rápida y eficiente para conjuntos de datos grandes, aprovechando histogramas para acelerar el entrenamiento.

Personalización de la función de pérdida

El GradientBoostingClassifier permite definir funciones de pérdida personalizadas mediante la clase LossFunction, lo que ofrece flexibilidad para adaptar el modelo a problemas específicos.

from sklearn.ensemble._gb_losses import BinaryCrossEntropy

# Definir una función de pérdida personalizada
class CustomLoss(BinaryCrossEntropy):
    def __init__(self, n_classes):
        super().__init__(n_classes)
        # Personalizar si es necesario

# Modelo con función de pérdida personalizada
modelo_gb_custom_loss = GradientBoostingClassifier(
    loss=CustomLoss(2),
    random_state=42
)

# Entrenar el modelo
modelo_gb_custom_loss.fit(X_entrenamiento, y_entrenamiento)

La capacidad de utilizar funciones de pérdida personalizadas permite adaptar el modelo a métricas o criterios específicos de una aplicación.

Interpretabilidad de los algoritmos de conjuntos en Scikit Learn

Los algoritmos de conjuntos como RandomForestClassifier, AdaBoostClassifier y GradientBoostingClassifier son modelos potentes para tareas de clasificación. Sin embargo, su naturaleza compleja puede dificultar la interpretabilidad. A pesar de esto, Scikit-Learn ofrece herramientas que permiten extraer información valiosa sobre el funcionamiento interno de estos modelos.

Una de las técnicas principales para interpretar estos algoritmos es la importancia de las características. Aunque este concepto ya ha sido explorado en secciones anteriores, existen métodos adicionales que brindan una visión más profunda. A continuación, se describen técnicas avanzadas que permiten una mejor comprensión de los modelos de conjunto.

La importancia permutada de características es un método que evalúa la importancia de cada característica al medir el aumento en el error del modelo cuando se permutan aleatoriamente los valores de dicha característica. Esto permite identificar qué características son realmente relevantes para el modelo.

from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split

# Cargar los datos
X, y = load_breast_cancer(return_X_y=True)

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

# Entrenar el modelo
modelo = RandomForestClassifier(random_state=42)
modelo.fit(X_train, y_train)

# Calcular la importancia permutada
resultados = permutation_importance(modelo, X_test, y_test, n_repeats=10, random_state=42)

# Mostrar las importancias
import pandas as pd
import numpy as np

importancias = pd.Series(resultados.importances_mean, index=load_breast_cancer().feature_names)
importancias = importancias.sort_values(ascending=False)

print(importancias)

En este ejemplo, se utiliza la función permutation_importance de Scikit-Learn para calcular la influencia de cada característica en el modelo. Este método es más robusto que las importancias basadas en el criterio de división de los árboles, ya que considera el impacto real en el rendimiento del modelo.

Los gráficos de dependencia parcial son herramientas útiles para visualizar la relación entre una o dos características y la respuesta predicha por el modelo. Permiten entender cómo cambia la predicción al variar una característica, manteniendo las demás constantes.

from sklearn.inspection import PartialDependenceDisplay
import matplotlib.pyplot as plt

# Características a analizar
caracteristicas = [0, 2]  # Índices de las características

# Generar el gráfico de dependencia parcial
PartialDependenceDisplay.from_estimator(modelo, X_test, caracteristicas)
plt.show()

Este código genera gráficos que muestran la relación entre las características seleccionadas y la probabilidad de pertenencia a una clase determinada. Los gráficos de dependencia parcial son especialmente útiles para interpretar modelos complejos como los algoritmos de conjunto.

Los gráficos ICE (Individual Conditional Expectation) proporcionan una visión detallada del efecto de una característica en las predicciones individuales. A diferencia de los gráficos de dependencia parcial, que muestran una media, los gráficos ICE muestran las predicciones para cada muestra, permitiendo detectar interacciones y efectos no lineales.

from sklearn.inspection import PartialDependenceDisplay

# Generar el gráfico ICE
PartialDependenceDisplay.from_estimator(
    modelo, X_test, [0], kind='both', subsample=50, random_state=42
)
plt.show()

En este ejemplo, se genera un gráfico ICE para la característica con índice 0. El parámetro kind='both' indica que se mostrarán tanto el gráfico de dependencia parcial como las curvas individuales ICE.

Otra técnica para interpretar modelos de conjunto es analizar cómo las predicciones cambian en función de intervalos o bins de una característica. Al agrupar los datos por rangos, es posible observar tendencias y patrones.

import numpy as np

# Crear bins para una característica
caracteristica = X_test[:, 0]
bins = np.percentile(caracteristica, [0, 25, 50, 75, 100])

# Agrupar las predicciones
grupos = np.digitize(caracteristica, bins)
predicciones = modelo.predict_proba(X_test)[:, 1]

# Calcular la media de las predicciones por grupo
media_predicciones = [predicciones[grupos == i].mean() for i in range(1, len(bins))]

# Mostrar los resultados
for i in range(1, len(bins)):
    print(f'Bin {i}: intervalo ({bins[i-1]:.2f}, {bins[i]:.2f}), predicción media: {media_predicciones[i-1]:.2f}')

Este enfoque permite entender si el modelo asigna mayores probabilidades a ciertas categorías de una característica, proporcionando una interpretación más tangible.

Para simplificar la interpretación de un modelo de conjunto, se puede ajustar un árbol de decisión sobre las predicciones del modelo complejo. Esto permite aproximar el comportamiento del modelo con una estructura más interpretable.

from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import plot_tree

# Obtener las predicciones del modelo complejo
predicciones = modelo.predict_proba(X_train)[:, 1]

# Ajustar un árbol de decisión sobre las predicciones
arbol_aproximado = DecisionTreeClassifier(max_depth=3, random_state=42)
arbol_aproximado.fit(X_train, predicciones > 0.5)

# Visualizar el árbol
plt.figure(figsize=(12, 8))
plot_tree(arbol_aproximado, feature_names=load_breast_cancer().feature_names, filled=True)
plt.show()

Este método permite visualizar una representación simplificada de cómo el modelo toma decisiones, facilitando la interpretación de los patrones aprendidos.

Es importante tener en cuenta que, aunque estas técnicas ayudan a interpretar modelos de conjunto, siempre existe cierta pérdida de información debido a la complejidad inherente de estos algoritmos. Las interacciones entre características y las decisiones tomadas por múltiples estimadores pueden dificultar una interpretación completa.

Además, es fundamental validar que las interpretaciones sean coherentes y no se extraigan conclusiones erróneas. Las herramientas de interpretación deben utilizarse como apoyo en el entendimiento del modelo, pero siempre con cautela.

Aunque no es parte de Scikit-Learn, la biblioteca SHAP (SHapley Additive exPlanations) es ampliamente utilizada para interpretar modelos complejos. SHAP proporciona valores que cuantifican la contribución de cada característica a la predicción individual.

import shap

# Crear un objeto explainer
explainer = shap.TreeExplainer(modelo)

# Calcular los valores SHAP
shap_values = explainer.shap_values(X_test)

# Visualizar los valores SHAP
shap.summary_plot(shap_values, X_test, feature_names=load_breast_cancer().feature_names)

Este código utiliza SHAP para generar un resumen de las características más influyentes en el modelo. Aunque requiere instalar una biblioteca adicional, es una herramienta potente para la interpretación detallada.

Otra herramienta externa es LIME (Local Interpretable Model-agnostic Explanations), que permite interpretar las predicciones de cualquier modelo de manera local.

import lime
from lime import lime_tabular

# Crear un objeto explainer
explainer = lime_tabular.LimeTabularExplainer(
    X_train,
    feature_names=load_breast_cancer().feature_names,
    class_names=load_breast_cancer().target_names,
    discretize_continuous=True
)

# Seleccionar una muestra para explicar
muestra = X_test[0]

# Generar la explicación
explicacion = explainer.explain_instance(muestra, modelo.predict_proba, num_features=5)

# Mostrar la explicación
explicacion.show_in_notebook(show_table=True)

LIME ayuda a entender por qué el modelo realizó una predicción específica, mostrando las características que más contribuyeron a dicha decisión.

Algunas recomendaciones para mejorar la interpretabilidad incluyen:

  • Utilizar múltiples técnicas de interpretación para obtener una visión más completa del modelo.
  • Validar las interpretaciones con conocimiento experto y sentido común.
  • Documentar las metodologías empleadas para asegurar la trazabilidad y reproducibilidad de los análisis.
  • Considerar el impacto de la interpretabilidad en la toma de decisiones y en la comunicación de resultados.

La interpretabilidad en algoritmos de conjunto es un área en constante evolución. Las herramientas y técnicas mencionadas permiten desentrañar, en la medida de lo posible, el funcionamiento interno de modelos complejos, facilitando su adopción en entornos donde la transparencia es esencial.

Aprende ScikitLearn GRATIS online

Ejercicios de esta lección Clasificación con algoritmos de conjunto

Evalúa tus conocimientos de esta lección Clasificación con algoritmos de conjunto con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de ScikitLearn

Accede a todas las lecciones de ScikitLearn y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Aprendizaje Automático

scikit-learn

Introducción Y Entorno

Introducción E Instalación

scikit-learn

Introducción Y Entorno

Introducción Al Preprocesamiento De Datos

scikit-learn

Preprocesamiento De Datos

Identificación Y Tratamiento De Valores Faltantes

scikit-learn

Preprocesamiento De Datos

Escalado De Datos

scikit-learn

Preprocesamiento De Datos

Normalización De Datos

scikit-learn

Preprocesamiento De Datos

Codificación De Variables Categóricas

scikit-learn

Preprocesamiento De Datos

Ingeniería De Características

scikit-learn

Preprocesamiento De Datos

Selección De Características

scikit-learn

Preprocesamiento De Datos

Extracción De Características

scikit-learn

Preprocesamiento De Datos

Particionamiento De Datos

scikit-learn

Preprocesamiento De Datos

Preprocesamiento De Datos Desbalanceados

scikit-learn

Preprocesamiento De Datos

Introducción A La Regresión

scikit-learn

Regresión

Regresión Lineal

scikit-learn

Regresión

Regresión Knn Kneighborsregressor

scikit-learn

Regresión

Regresión Svm Con Svr

scikit-learn

Regresión

Regresión Con Árboles Decisiontreeregressor

scikit-learn

Regresión

Regresión Con Algoritmos De Conjunto

scikit-learn

Regresión

Introducción A La Clasificación

scikit-learn

Clasificación

Clasificación Con Regresión Logística

scikit-learn

Clasificación

Clasificación Knn Kneighborsclassifier

scikit-learn

Clasificación

Clasificación Svm Con Svc

scikit-learn

Clasificación

Clasificación Con Árboles Decisiontreeclassifier

scikit-learn

Clasificación

Clasificación Con Algoritmos De Conjunto

scikit-learn

Clasificación

Reducción De La Dimensionalidad Con Pca

scikit-learn

Aprendizaje No Supervisado

Clustering Con Kmeans

scikit-learn

Aprendizaje No Supervisado

Clustering Jerárquico

scikit-learn

Aprendizaje No Supervisado

Clustering De Densidad Con Dbscan

scikit-learn

Aprendizaje No Supervisado

Preprocesamiento De Textos Para Nlp

scikit-learn

Nlp

Representación De Texto Y Extracción De Características

scikit-learn

Nlp

Clasificación De Texto Con Scikit Learn

scikit-learn

Nlp

Análisis De Sentimiento

scikit-learn

Nlp

Técnicas Avanzadas De Extracción De Características

scikit-learn

Nlp

Introducción Al Análisis De Series Temporales

scikit-learn

Series Temporales

Preprocesamiento De Datos De Series Temporales

scikit-learn

Series Temporales

Ingeniería De Características Para Series Temporales

scikit-learn

Series Temporales

Transformación Y Escalado De Series Temporales

scikit-learn

Series Temporales

Validación Y Evaluación De Modelos En Series Temporales

scikit-learn

Series Temporales

Validación Y Evaluación De Modelos

scikit-learn

Validación De Modelos

Técnicas De Validación Cruzada

scikit-learn

Validación De Modelos

Métricas De Regresión

scikit-learn

Validación De Modelos

Métricas De Clasificación

scikit-learn

Validación De Modelos

Ajuste De Hiperparámetros

scikit-learn

Validación De Modelos

Introducción A Pipelines

scikit-learn

Pipelines Y Despliegue

Creación De Pipelines Básicos

scikit-learn

Pipelines Y Despliegue

Preprocesamiento De Datos Con Pipelines

scikit-learn

Pipelines Y Despliegue

Pipelines Y Validación Cruzada

scikit-learn

Pipelines Y Despliegue

Pipelines Con Columntransformer

scikit-learn

Pipelines Y Despliegue

Exportar E Importar Pipelines

scikit-learn

Pipelines Y Despliegue

Accede GRATIS a ScikitLearn y certifícate

Objetivos de aprendizaje de esta lección

  • Comprender los fundamentos de los algoritmos de conjunto para clasificación.
  • Implementar Bagging, Random Forest, AdaBoost y Gradient Boosting con Scikit Learn.
  • Ajustar los hiperparámetros para optimizar el rendimiento de los modelos.
  • Aplicar técnicas para prevenir el sobreajuste y mejorar la generalización.
  • Interpretar modelos de conjunto utilizando importancias de características y otras herramientas avanzadas.