ScikitLearn: Clasificación

Aprende ScikitLearn GRATIS y certifícate

El ámbito de la clasificación comprende aquellos métodos en los que se predicen etiquetas discretas, como la detección de correo spam, la identificación de un tipo de tumor o la clasificación de imágenes. En Scikit Learn, la variedad de algoritmos y utilidades para este propósito permite cubrir un amplio abanico de necesidades, desde tareas muy sencillas hasta casos con estructuras de datos complejas.

La interfaz de cada algoritmo de clasificación mantiene un estándar coherente: crear el modelo, entrenarlo con fit usando un conjunto de datos de entrenamiento (X, y) y, finalmente, generar predicciones con predict. Este paradigma unificado facilita realizar comparaciones entre múltiples enfoques en un mismo proyecto.

Se pueden distinguir varias familias de modelos de clasificación:

  • Lineales (regresión logística, perceptrones, etc.)
  • Árboles de decisión y métodos en ensamblado (RandomForest, GradientBoosting, etc.)
  • Máquinas de vectores soporte (SVM)
  • Vecinos más cercanos (k-NN)
  • Naive Bayes (GaussianNB, MultinomialNB, etc.)
  • Redes neuronales básicas (MLPClassifier)

A continuación se describe el modo de uso y las características principales de los algoritmos de clasificación más frecuentes en Scikit Learn.

Regresión logística
Es un modelo lineal básico que asume que la probabilidad de pertenecer a una clase puede expresarse a través de una función logística. Se implementa en sklearn.linear_model.LogisticRegression. Suele emplearse en problemas binarios, pero también maneja clasificación multiclase con el modo multinomial. Un ejemplo básico:

from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()
lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)

Es común combinar la regresión logística con regularizaciones L1 (Lasso) o L2 (Ridge) para controlar la magnitud de los coeficientes. Esto evita el sobreajuste cuando el número de características es elevado.

Máquinas de vectores soporte (SVM)
El clasificador SVC de sklearn.svm se basa en la idea de encontrar un hiperplano que separe las clases con un máximo margen. Dispone de múltiples kernels, como linear, rbf, poly, que ayudan a capturar relaciones no lineales. Un ejemplo con un kernel RBF:

from sklearn.svm import SVC

svc = SVC(kernel='rbf', C=1.0, gamma='scale')
svc.fit(X_train, y_train)
y_pred = svc.predict(X_test)

Elegir el kernel apropiado y ajustar parámetros como C y gamma pueden impactar mucho en la capacidad de generalización del modelo.

Árboles de decisión y bosques aleatorios
Los árboles de decisión (DecisionTreeClassifier) pueden segmentar el espacio de características de forma jerárquica, generando reglas si/entonces. Son intuitivos de interpretar y entrenar, pero a veces presentan sobreajuste. Para mitigarlo, se aplican parámetros de pre-poda como max_depth o min_samples_split.

El RandomForestClassifier, por otro lado, entrena múltiples árboles de decisión en subconjuntos aleatorios de datos y características, integrando sus predicciones para lograr mayor robustez. Un ejemplo:

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=100, max_depth=None, random_state=42)
rfc.fit(X_train, y_train)
y_pred = rfc.predict(X_test)

Incluir más estimadores y sintonizar parámetros como max_features puede equilibrar la varianza y el sesgo del modelo.

Gradient boosting
Los métodos de gradient boosting (p. ej. GradientBoostingClassifier o HistGradientBoostingClassifier) combinan árboles de decisión de manera aditiva, corrigiendo iterativamente los errores de modelos débiles previos. Estos algoritmos suelen requerir una búsqueda cuidadosa de hiperparámetros como la tasa de aprendizaje (learning_rate) o la profundidad de los árboles.

HistGradientBoostingClassifier, por ejemplo, realiza un mapeo de los datos en histogramas para acelerar el entrenamiento y manejar datos grandes. Su uso general resulta similar a otros estimadores:

from sklearn.ensemble import HistGradientBoostingClassifier

hist_gb = HistGradientBoostingClassifier(learning_rate=0.1, max_iter=100)
hist_gb.fit(X_train, y_train)
y_pred = hist_gb.predict(X_test)

k-Vecinos más cercanos (k-NN)
El clasificador KNeighborsClassifier se basa en la vecindad de cada punto. No genera un modelo explícito, sino que, al predecir, observa las clases de los k datos más próximos según una métrica de distancia. Esto puede ser adecuado si el conjunto es relativamente pequeño y si la distancia elegida (euclidiana, manhattan, etc.) guarda relación con la naturaleza de los datos.

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)

A menudo conviene normalizar las características antes de aplicar k-NN para que todas tengan influencia equiparable en la distancia.

Naive Bayes
Scikit Learn incorpora distintos clasificadores bayesianos como GaussianNB (para variables continuas con distribución normal aproximada), MultinomialNB (especial para recuentos, como en clasificación de textos) y BernoulliNB. Su fundamento radica en la aplicación de la regla de Bayes y la asunción de independencia condicional entre características.

from sklearn.naive_bayes import GaussianNB

gnb = GaussianNB()
gnb.fit(X_train, y_train)
y_pred = gnb.predict(X_test)

Gracias a su simplicidad, estos modelos resultan muy rápidos de entrenar y funcionan bien incluso con conjuntos pequeños.

Redes neuronales con MLPClassifier
Aunque Scikit Learn no se centra en redes neuronales complejas, el MLPClassifier (perceptrón multicapa) permite crear una arquitectura con una o varias capas ocultas y funciones de activación como relu o tanh. Su entrenamiento se basa en descensos de gradiente estocásticos e introduce hiperparámetros como el número de neuronas, la tasa de aprendizaje y la regularización.

from sklearn.neural_network import MLPClassifier

mlp = MLPClassifier(hidden_layer_sizes=(100,50), activation='relu', solver='adam', max_iter=300)
mlp.fit(X_train, y_train)
y_pred = mlp.predict(X_test)

Este modelo puede capturar patrones no lineales de manera más flexible, aunque requiere una buena selección de parámetros y de la configuración de las capas.

Evaluación y métricas
Para comprobar la eficacia de un clasificador, existen métricas en sklearn.metrics como accuracy_score, precision_score, recall_score y la métrica F1, que combina precisión y sensibilidad en un único valor. Se emplea también classification_report para obtener un resumen de las métricas por clase y confusion_matrix para visualizar la distribución de predicciones correctas e incorrectas.

from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

acc = accuracy_score(y_test, y_pred)
print("Exactitud:", acc)
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))

En contextos con clases desbalanceadas, se recomiendan métricas más robustas, como la AUC-ROC o la sensibilidad y la precisión.

Validación y búsqueda de hiperparámetros
Para evaluar la capacidad de generalización, se utiliza la validación cruzada con KFold o StratifiedKFold. Para explorar distintos valores de hiperparámetros, se aplican GridSearchCV (búsqueda exhaustiva) o RandomizedSearchCV (muestras aleatorias), indicando la métrica que se desea optimizar.

from sklearn.model_selection import GridSearchCV, StratifiedKFold
from sklearn.svm import SVC

params = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
svc = SVC()
cv = StratifiedKFold(n_splits=5)
grid = GridSearchCV(svc, param_grid=params, cv=cv, scoring='f1_macro')
grid.fit(X_train, y_train)
print("Mejor combinación:", grid.best_params_)

Este procedimiento sistemático garantiza la evaluación honesta del rendimiento y ayuda a encontrar configuraciones de hiperparámetros más óptimas.

Pipelines de clasificación
Con Pipeline, se enlazan transformaciones de preprocesamiento y el clasificador elegido en un solo objeto. Esto asegura que la secuencia de pasos se aplique correctamente, evitando fugas de información y facilitando la reproducción de resultados.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

pipe = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', LogisticRegression())
])
pipe.fit(X_train, y_train)
y_pred = pipe.predict(X_test)

Esta aproximación es recomendable cuando se combinan múltiples etapas, como imputación de valores, codificación de variables y escalado, integrando así el clasificador final.

En definitiva, la clasificación en Scikit Learn abarca desde métodos lineales hasta enfoques complejos de ensamblado y redes neuronales. El vasto surtido de técnicas y la consistencia de la interfaz dan la posibilidad de probar algoritmos distintos y optimizar la estrategia de manera ágil, siempre garantizando la correcta validación y la interpretación adecuada de los resultados.

Empezar curso de ScikitLearn

Lecciones de este módulo de ScikitLearn

Lecciones de programación del módulo Clasificación del curso de ScikitLearn.

Ejercicios de programación en este módulo de ScikitLearn

Evalúa tus conocimientos en Clasificación con ejercicios de programación Clasificación de tipo Test, Puzzle, Código y Proyecto con VSCode.