Por Jose R. Zapata
Ultima actualizacion: 12/Feb/2026
Scikit-learn es una biblioteca de código abierto de Python que implementa una gran variedad de algoritmos de aprendizaje automático, preprocesamiento, validación cruzada y visualización.
Es la librería más utilizada para Machine Learning clásico en Python y proporciona una API consistente y fácil de usar para todos sus algoritmos, lo que facilita experimentar con diferentes modelos y técnicas de preprocesamiento.
Documentación oficial: https://scikit-learn.org/stable/
Instalación
pip install scikit-learn
Importar librerías
import pandas as pd
import sklearn
print(f"Sklearn version: {sklearn.__version__}")
Sklearn version: 1.6.1
Transformador vs Estimador
Antes de trabajar con scikit-learn, es fundamental entender la diferencia entre sus dos componentes principales: Transformadores y Estimadores.
Un transformador es una clase que se utiliza para preprocesar o transformar los datos de entrada. Su función principal es aplicar operaciones a los datos sin alterar su estructura subyacente. Los transformadores son útiles para tareas como normalización, codificación de variables categóricas, selección de características y extracción de características.
Un estimador es una clase que se utiliza para aprender a partir de los datos y hacer predicciones. Representa un modelo que puede aprender patrones en los datos de entrenamiento y utilizar ese conocimiento para hacer predicciones sobre nuevos datos.
| Transformadores | Estimadores |
|---|---|
| Preprocesamiento de datos | Modelado y predicción de datos |
.fit(X) aprende de los datos para transformarlos | .fit(X, y) Aprende de los datos para hacer predicciones |
.transform(X) transforma los datos | .predict(X) Realiza predicciones |
| Ej: Normalizar características antes de entrenar un modelo | Ej: Entrenar un modelo de árboles de decisión |
Ejemplo comparativo:
| StandardScaler (Transformador) | LogisticRegression (Estimador) |
|---|---|
.fit(X) calcula el promedio y la desviación standard | .fit(X, y) Aprende los coeficientes de la regresión logística |
.transform(X) substrae el promedio y divide por la desviación standard | .predict(X) Hace predicciones de las clases entrenadas |
Proceso de un Proyecto de Machine Learning
Un proyecto de Machine Learning sigue un proceso iterativo que se puede resumir en los siguientes pasos:
- Definir el problema y mirar el panorama general
- Obtener los datos y explorarlos para obtener información
- Preparar los datos (limpieza, transformación, feature engineering)
- Seleccionar y entrenar modelos usando validación cruzada
- Afinar los hiperparámetros del mejor modelo
- Evaluar el modelo final con los datos de prueba
- Desplegar y monitorear el sistema
Pasos para la construcción y selección de un Modelo
En la práctica, los pasos 3 a 6 siguen este flujo:
- Preparación de los datos
- División de los datos entre datos de Entrenamiento (80%) y datos de Test (20%)
- Se selecciona la métrica de evaluación según la aplicación
- Usando solo los datos de Entrenamiento se seleccionan los mejores modelos utilizando cross validation
- Se toman los mejores modelos y se ajustan los hiperparámetros
- Se entrena el mejor modelo con todos los datos de Entrenamiento y se evalúa con los datos de Test
- Si hay un buen resultado se pasa a la etapa de despliegue (deployment)
Consideraciones Importantes
Antes de realizar el ejemplo práctico, es importante tener en cuenta algunos problemas comunes que pueden afectar negativamente el rendimiento y la confiabilidad de un modelo de Machine Learning.
Data Leakage
Problemas de Data Leakage
La “fuga de datos” o “data leakage” se produce cuando se utiliza información que no estaría disponible al momento de hacer una predicción. Esto puede hacer que el modelo parezca más preciso de lo que realmente es, lo que podría llevar a errores y selección de modelos subóptimos.
Por ejemplo, si se normalizan los datos antes de dividir en entrenamiento y prueba, los estadísticos (media, desviación estándar) incluirían información del conjunto de prueba. La solución es usar Pipelines de scikit-learn, que garantizan que las transformaciones se ajusten solo con los datos de entrenamiento.
Referencias:
Datos Duplicados
Problemas de Datos Duplicados
La presencia de datos duplicados en los conjuntos de entrenamiento y prueba puede causar:
- Sesgo en la evaluación: Si datos duplicados están en ambos conjuntos, el modelo podría haberlos memorizado, dando una evaluación demasiado optimista.
- Disminución de la generalización: El modelo se centra demasiado en los datos repetidos y no aprende patrones generales.
- Evaluación poco confiable: Las métricas pueden ser demasiado optimistas o pesimistas dependiendo del desempeño en los duplicados.
Recomendación: Eliminar duplicados antes de dividir los datos, y verificar de nuevo después de seleccionar las características finales.
Referencias:
Desbalance de Clases
Problemas de Desbalance de Clases
El desbalance de clases ocurre cuando una clase tiene significativamente más muestras que otra (por ejemplo, 95% vs 5%). En estos casos:
- Accuracy engañoso: Un modelo que siempre predice la clase mayoritaria obtendría un accuracy del 95% sin haber aprendido nada útil.
- El modelo ignora la clase minoritaria: Los algoritmos tienden a optimizar para la clase con más datos, lo que resulta en un rendimiento pobre para la clase minoritaria (que frecuentemente es la más importante).
Soluciones:
- Usar métricas adecuadas como F1-Score, Precision, Recall o AUC-ROC en lugar de accuracy
- Técnicas de resampling: submuestreo de la clase mayoritaria o sobremuestreo de la clase minoritaria
- Ajustar el parámetro
class_weight='balanced'en modelos que lo soporten
Referencias:
Overfitting y Underfitting
Problemas de Overfitting (Sobreajuste) y Underfitting (Subajuste)
Estos son dos de los problemas más fundamentales en Machine Learning:
Overfitting (Sobreajuste): El modelo memoriza los datos de entrenamiento en lugar de aprender patrones generales. Se detecta cuando el rendimiento en entrenamiento es muy alto pero en test es significativamente menor.
- Causas: modelo demasiado complejo, pocos datos de entrenamiento, demasiadas features
- Soluciones: regularización (L1, L2), reducir complejidad del modelo, obtener más datos, usar cross-validation, early stopping, dropout (en redes neuronales)
Underfitting (Subajuste): El modelo es demasiado simple para capturar los patrones de los datos. Se detecta cuando el rendimiento es bajo tanto en entrenamiento como en test.
- Causas: modelo demasiado simple, features insuficientes o poco informativas, exceso de regularización
- Soluciones: modelo más complejo, agregar más features, reducir regularización, feature engineering
Referencias:
Selección de Métrica Equivocada
Problemas de Selección de Métrica Equivocada
Elegir la métrica de evaluación incorrecta puede llevar a seleccionar un modelo que no resuelve el problema real. La métrica debe reflejar el objetivo del negocio.
Ejemplos de errores comunes:
Usar accuracy con clases desbalanceadas: Un modelo que siempre predice “no fraude” en un dataset con 99% de transacciones legítimas tendría 99% de accuracy, pero sería inútil para detectar fraude. Mejor usar Precision, Recall o F1-Score.
Usar MSE cuando hay outliers: El error cuadrático medio penaliza mucho los errores grandes, lo que puede distorsionar la evaluación si hay valores atípicos. Mejor usar MAE (error absoluto medio) o métricas robustas.
No considerar el costo de los errores: En diagnóstico médico, un falso negativo (no detectar una enfermedad) es mucho más grave que un falso positivo (alarma falsa). En estos casos, se debe priorizar el Recall sobre la Precision.
No reportar la variabilidad: Reportar solo el promedio de cross-validation sin la desviación estándar es incompleto. Un modelo con accuracy 0.90 ± 0.02 es mucho más confiable que uno con 0.91 ± 0.15.
Referencias:
Ejemplo Completo de Clasificación con un Modelo
A continuación se presenta un ejemplo completo de un flujo de Machine Learning para clasificación. Este ejemplo sigue los pasos descritos anteriormente y demuestra el uso de las herramientas principales de scikit-learn.
En este ejemplo se asume que los datos ya están limpios de:
- Valores nulos o faltantes
- Las columnas están en el formato correcto (numéricos, categóricos, etc)
- No hay valores atípicos (outliers)
Los pasos que vamos a seguir son:
- Cargar y explorar los datos
- Codificar la variable objetivo
- Eliminar datos duplicados
- Dividir datos en entrenamiento y prueba
- Crear pipeline de preprocesamiento y modelo
- Evaluar con validación cruzada (cross-validation)
- Buscar mejores hiperparámetros (GridSearchCV)
- Entrenar modelo final y evaluar con datos de test
- Guardar y cargar el modelo
1. Cargar y explorar los datos
Usaremos el dataset Iris, un dataset clásico de clasificación que contiene 150 muestras de 3 especies de flores Iris, con 4 características cada una (largo y ancho del sépalo y pétalo).
from sklearn.datasets import fetch_openml
# Descargar el dataset iris desde openml.org
iris = fetch_openml(name="iris", version=1, parser="auto")
# Convertir a DataFrame de pandas
iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df["species"] = iris.target
iris_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepallength 150 non-null float64
1 sepalwidth 150 non-null float64
2 petallength 150 non-null float64
3 petalwidth 150 non-null float64
4 species 150 non-null category
dtypes: category(1), float64(4)
memory usage: 5.1 KB
iris_df.sample(5)
| sepallength | sepalwidth | petallength | petalwidth | species | |
|---|---|---|---|---|---|
| 29 | 4.7 | 3.2 | 1.6 | 0.2 | Iris-setosa |
| 122 | 7.7 | 2.8 | 6.7 | 2.0 | Iris-virginica |
| 113 | 5.7 | 2.5 | 5.0 | 2.0 | Iris-virginica |
| 61 | 5.9 | 3.0 | 4.2 | 1.5 | Iris-versicolor |
| 134 | 6.1 | 2.6 | 5.6 | 1.4 | Iris-virginica |
2. Codificar la variable objetivo (Label Encoding)
Los algoritmos de Machine Learning trabajan con números, por lo que necesitamos
convertir las categorías de texto (Iris-setosa, Iris-versicolor, Iris-virginica)
a valores numéricos. Para esto usamos
LabelEncoder.
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
iris_df["target"] = le.fit_transform(iris_df["species"])
# Mapeo de categorías a números
le_name_mapping = dict(zip(le.classes_, le.transform(le.classes_), strict=False))
print(le_name_mapping)
{'Iris-setosa': np.int64(0), 'Iris-versicolor': np.int64(1), 'Iris-virginica': np.int64(2)}
# Eliminar la columna de texto (species) ya que tenemos la columna numérica (target)
iris_df.drop(["species"], axis=1, inplace=True)
iris_df.sample(5)
| sepallength | sepalwidth | petallength | petalwidth | target | |
|---|---|---|---|---|---|
| 108 | 6.7 | 2.5 | 5.8 | 1.8 | 2 |
| 109 | 7.2 | 3.6 | 6.1 | 2.5 | 2 |
| 25 | 5.0 | 3.0 | 1.6 | 0.2 | 0 |
| 104 | 6.5 | 3.0 | 5.8 | 2.2 | 2 |
| 51 | 6.4 | 3.2 | 4.5 | 1.5 | 1 |
3. Eliminar datos duplicados
Como se mencionó anteriormente, los datos duplicados pueden causar problemas en la evaluación del modelo. Es importante eliminarlos antes de dividir los datos.
print(f"Filas antes de eliminar duplicados: {len(iris_df)}")
iris_df = iris_df.drop_duplicates()
print(f"Filas después de eliminar duplicados: {len(iris_df)}")
Filas antes de eliminar duplicados: 150
Filas después de eliminar duplicados: 147
4. División datos de entrenamiento y test
Dividimos los datos en dos conjuntos:
- Entrenamiento (80%): para seleccionar y ajustar el modelo
- Test (20%): para evaluar el modelo final (datos que el modelo nunca ha visto)
Usamos la opción stratify para que la proporción de clases se mantenga
igual en ambos conjuntos.
Documentación: train_test_split
from sklearn.model_selection import train_test_split
# Separar características (X) y variable objetivo (y)
X_data = iris_df.drop(columns=["target"])
y_target = iris_df["target"]
# División estratificada
X_train, X_test, y_train, y_test = train_test_split(
X_data, y_target, test_size=0.2, stratify=y_target, random_state=42
)
print(f"Datos de entrenamiento: {X_train.shape[0]} filas")
print(f"Datos de test: {X_test.shape[0]} filas")
Datos de entrenamiento: 117 filas
Datos de test: 30 filas
5. Crear Pipeline de preprocesamiento y modelo
Un Pipeline encadena una secuencia de transformaciones y un modelo final en un solo objeto. Esto tiene varias ventajas:
- Previene data leakage: las transformaciones se ajustan solo con datos de entrenamiento
- Simplifica el código: un solo
.fit()y.predict()para todo el flujo - Facilita la reproducibilidad: el pipeline completo se puede guardar y cargar
En este ejemplo, el pipeline incluye:
- StandardScaler - Estandariza las características (media=0, varianza=1)
- PCA - Reduce dimensionalidad a 3 componentes principales
- RandomForestClassifier - Modelo de clasificación basado en árboles de decisión
from sklearn import set_config
from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
# Pipeline de preprocesamiento de datos
pipeline_data = Pipeline(
[
("scaler", StandardScaler()),
("pca", PCA(n_components=3)),
]
)
# Modelo
model_rf = RandomForestClassifier()
# Pipeline completo: transformación + modelo
pipeline_transform_model = Pipeline(
[
("pipeline_datos", pipeline_data),
("modelo", model_rf),
]
)
# Visualizar el pipeline
set_config(display="diagram")
pipeline_transform_model
Pipeline(steps=[('pipeline_datos',
Pipeline(steps=[('scaler', StandardScaler()),
('pca', PCA(n_components=3))])),
('modelo', RandomForestClassifier())])In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Pipeline(steps=[('pipeline_datos',
Pipeline(steps=[('scaler', StandardScaler()),
('pca', PCA(n_components=3))])),
('modelo', RandomForestClassifier())])Pipeline(steps=[('scaler', StandardScaler()), ('pca', PCA(n_components=3))])StandardScaler()
PCA(n_components=3)
RandomForestClassifier()
6. Validación Cruzada (Cross-Validation)
La validación cruzada divide los datos de entrenamiento en K pliegues (folds) y realiza múltiples iteraciones de entrenamiento y evaluación. Esto da una estimación más confiable del rendimiento del modelo que una sola división de datos.
Usamos KFold con 5 pliegues y cross_validate para obtener las métricas.
from sklearn.model_selection import KFold, cross_validate
scoring = "accuracy"
kfold = KFold(n_splits=5)
cv_results = cross_validate(pipeline_transform_model, X_train, y_train, cv=kfold, scoring=scoring)
print(f"Resultado Promedio = {cv_results['test_score'].mean():.4f}")
print(f"Resultado STD = {cv_results['test_score'].std():.4f}")
Resultado Promedio = 0.9319
Resultado STD = 0.0511
7. Búsqueda de Hiperparámetros (GridSearchCV)
Los hiperparámetros son configuraciones del modelo que no se aprenden de los datos (a diferencia de los parámetros). Ejemplos: número de árboles, profundidad máxima, etc.
El ajuste de hiperparámetros busca la combinación óptima evaluando el rendimiento con validación cruzada.
GridSearchCV prueba todas las combinaciones posibles de hiperparámetros definidos en una grilla.
from sklearn.model_selection import GridSearchCV
# Definir la grilla de hiperparámetros para el Random Forest
# Nota: se usa "modelo__" como prefijo porque el modelo está dentro del pipeline
param_grid = {
"modelo__n_estimators": [100, 200, 500],
"modelo__max_depth": [3, 5, 10, None],
"modelo__max_features": ["sqrt", "log2", None],
}
grid_search = GridSearchCV(pipeline_transform_model, param_grid=param_grid, cv=kfold)
grid_search.fit(X_train, y_train)
GridSearchCV(cv=KFold(n_splits=5, random_state=None, shuffle=False),
estimator=Pipeline(steps=[('pipeline_datos',
Pipeline(steps=[('scaler',
StandardScaler()),
('pca',
PCA(n_components=3))])),
('modelo', RandomForestClassifier())]),
param_grid={'modelo__max_depth': [3, 5, 10, None],
'modelo__max_features': ['sqrt', 'log2', None],
'modelo__n_estimators': [100, 200, 500]})In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
GridSearchCV(cv=KFold(n_splits=5, random_state=None, shuffle=False),
estimator=Pipeline(steps=[('pipeline_datos',
Pipeline(steps=[('scaler',
StandardScaler()),
('pca',
PCA(n_components=3))])),
('modelo', RandomForestClassifier())]),
param_grid={'modelo__max_depth': [3, 5, 10, None],
'modelo__max_features': ['sqrt', 'log2', None],
'modelo__n_estimators': [100, 200, 500]})Pipeline(steps=[('pipeline_datos',
Pipeline(steps=[('scaler', StandardScaler()),
('pca', PCA(n_components=3))])),
('modelo',
RandomForestClassifier(max_depth=5, max_features=None,
n_estimators=200))])Pipeline(steps=[('scaler', StandardScaler()), ('pca', PCA(n_components=3))])StandardScaler()
PCA(n_components=3)
RandomForestClassifier(max_depth=5, max_features=None, n_estimators=200)
# Mejores hiperparámetros encontrados
print(f"Mejores parámetros: {grid_search.best_params_}")
print(f"Mejor resultado CV: {grid_search.best_score_:.4f}")
print(
f"STD del mejor resultado: "
f"{grid_search.cv_results_['std_test_score'][grid_search.best_index_]:.4f}"
)
Mejores parámetros: {'modelo__max_depth': 5, 'modelo__max_features': None, 'modelo__n_estimators': 200}
Mejor resultado CV: 0.9319
STD del mejor resultado: 0.0332
8. Evaluación contra datos de Test
Ahora entrenamos el modelo con los mejores hiperparámetros usando todos los datos de entrenamiento y evaluamos su rendimiento con los datos de test (que el modelo nunca ha visto).
Documentación: accuracy_score
from sklearn.metrics import accuracy_score
# Configurar el pipeline con los mejores hiperparámetros
mejor_transform_modelo = pipeline_transform_model.set_params(**grid_search.best_params_)
# Entrenar con datos de entrenamiento
mejor_transform_modelo.fit(X_train, y_train)
# Predecir con datos de test
y_pred = mejor_transform_modelo.predict(X_test)
# Evaluar
print(f"Accuracy en Test: {accuracy_score(y_test, y_pred):.4f}")
Accuracy en Test: 0.9000
9. Modelo Final
Una vez validado el rendimiento en test, entrenamos el modelo final con todos los datos disponibles (entrenamiento + test) para aprovechar al máximo la información antes de desplegarlo en producción.
modelo_final = pipeline_transform_model.set_params(**grid_search.best_params_)
modelo_final.fit(X_data, y_target)
# Verificación: accuracy sobre todos los datos (debe ser alto)
print(f"Accuracy (todos los datos): {accuracy_score(y_target, modelo_final.predict(X_data)):.4f}")
Accuracy (todos los datos): 1.0000
10. Guardar y cargar el modelo
Para usar el modelo en producción, podemos guardarlo en un archivo usando joblib. El pipeline completo (preprocesamiento + modelo) se serializa en un solo archivo.
from joblib import dump
# Guardar el pipeline completo
dump(modelo_final, "pipeline_transform_model.joblib")
['pipeline_transform_model.joblib']
from joblib import load
# Cargar el pipeline desde el archivo
modelo_cargado = load("pipeline_transform_model.joblib")
# Predicción con un solo dato nuevo
# Recordar: {'Iris-setosa': 0, 'Iris-versicolor': 1, 'Iris-virginica': 2}
pred_unico = modelo_cargado.predict([[5.1, 3.5, 1.4, 0.2]])
print(f"Predicción para [5.1, 3.5, 1.4, 0.2]: {pred_unico} ({le.inverse_transform(pred_unico)[0]})")
Predicción para [5.1, 3.5, 1.4, 0.2]: [0] (Iris-setosa)
/Users/jzapata/Sites/JoseRZapata.github.io/.venv/lib/python3.12/site-packages/sklearn/utils/validation.py:2739: UserWarning: X does not have valid feature names, but StandardScaler was fitted with feature names
warnings.warn(
# Predicción con múltiples datos
pred_varios = modelo_cargado.predict(X_test)
print(f"Predicciones: {pred_varios}")
Predicciones: [1 1 2 0 2 1 1 0 2 2 0 0 0 1 2 0 1 0 2 0 1 2 0 0 1 1 2 2 2 1]
Preprocesamiento de Datos
Scikit-learn ofrece una gran variedad de transformadores para preprocesar los datos. La documentación completa se encuentra en: https://scikit-learn.org/stable/modules/preprocessing.html
Los transformadores más utilizados son:
| Transformador | Descripción | Cuándo usarlo |
|---|---|---|
| StandardScaler | Estandariza eliminando la media y escalando a varianza unitaria | Algoritmos sensibles a la escala (SVM, KNN, regresión lineal) |
| MinMaxScaler | Escala cada característica al rango [0, 1] | Cuando se desea preservar la distribución original |
| RobustScaler | Escala usando estadísticas robustas a outliers (mediana, IQR) | Cuando hay valores atípicos |
| OneHotEncoder | Codifica categóricas como matriz binaria one-hot | Variables categóricas nominales |
| OrdinalEncoder | Codifica categóricas como enteros | Variables categóricas ordinales |
| LabelEncoder | Codifica la variable objetivo en valores numéricos | Variable objetivo categórica |
Ejemplo de Estandarización
La estandarización se puede hacer de dos formas equivalentes:
from sklearn.preprocessing import StandardScaler
# Forma 1: fit() + transform() por separado
scaler = StandardScaler()
scaler.fit(X_train) # Aprende media y std de los datos de entrenamiento
X_train_scaled = scaler.transform(X_train) # Transforma entrenamiento
X_test_scaled = scaler.transform(X_test) # Transforma test con los mismos parámetros
# Forma 2: fit_transform() (equivalente a fit + transform en un solo paso)
scaler2 = StandardScaler()
X_train_scaled2 = scaler2.fit_transform(X_train)
X_test_scaled2 = scaler2.transform(X_test)
.fit_transform() con los datos de test.
Los datos de test se transforman usando .transform() con el escalador
que fue ajustado con los datos de entrenamiento.Entrenamiento de Modelos
Scikit-learn incluye modelos para los tres tipos principales de problemas de Machine Learning. A continuación se listan algunos de los más utilizados con links a su documentación. Los capítulos siguientes de este curso profundizan en cada tipo.
Modelos de Regresión
Documentación: Modelos supervisados - Regresión
| Modelo | Importar |
|---|---|
| Regresión Lineal | from sklearn.linear_model import LinearRegression |
| Ridge | from sklearn.linear_model import Ridge |
| Lasso | from sklearn.linear_model import Lasso |
| Random Forest Regressor | from sklearn.ensemble import RandomForestRegressor |
| Gradient Boosting Regressor | from sklearn.ensemble import GradientBoostingRegressor |
Ver también: XGBoost, LightGBM, CatBoost
Modelos de Clasificación
Documentación: Modelos supervisados - Clasificación
| Modelo | Importar |
|---|---|
| Regresión Logística | from sklearn.linear_model import LogisticRegression |
| SVM (SVC) | from sklearn.svm import SVC |
| K-Nearest Neighbors | from sklearn.neighbors import KNeighborsClassifier |
| Decision Tree | from sklearn.tree import DecisionTreeClassifier |
| Random Forest Classifier | from sklearn.ensemble import RandomForestClassifier |
Ver también: XGBClassifier, LGBMClassifier, CatBoostClassifier
Modelos de Clustering
Documentación: Clustering
| Modelo | Importar |
|---|---|
| K-Means | from sklearn.cluster import KMeans |
| DBSCAN | from sklearn.cluster import DBSCAN |
| Agglomerative Clustering | from sklearn.cluster import AgglomerativeClustering |
Evaluación de Modelos
La selección de la métrica de evaluación depende del tipo de problema y del objetivo del negocio.
Métricas de Regresión
Documentación: Métricas de Regresión
| Métrica | Descripción | Código |
|---|---|---|
| MSE | Error cuadrático medio | mean_squared_error(y_true, y_pred) |
| MAE | Error absoluto medio | mean_absolute_error(y_true, y_pred) |
| R² | Coeficiente de determinación | r2_score(y_true, y_pred) |
| MAPE | Error porcentual absoluto medio | mean_absolute_percentage_error(y_true, y_pred) |
Métricas de Clasificación
Documentación: Métricas de Clasificación
| Métrica | Descripción | Código |
|---|---|---|
| Accuracy | Proporción de predicciones correctas | accuracy_score(y_true, y_pred) |
| Precision | Proporción de verdaderos positivos entre positivos predichos | precision_score(y_true, y_pred) |
| Recall | Proporción de verdaderos positivos correctamente clasificados | recall_score(y_true, y_pred) |
| F1-Score | Media armónica de precision y recall | f1_score(y_true, y_pred) |
| AUC-ROC | Área bajo la curva ROC | roc_auc_score(y_true, y_pred_prob) |
Métricas de Clustering
Documentación: Métricas de Clustering
| Métrica | Descripción | Código |
|---|---|---|
| Silhouette | Cohesión y separación de los grupos | silhouette_score(X, labels) |
| Calinski-Harabasz | Relación dispersión intra vs inter grupos | calinski_harabasz_score(X, labels) |
| Adjusted Rand Index | Similitud entre dos asignaciones de clustering | adjusted_rand_score(labels_true, labels_pred) |
Selección de Modelos
Scikit-learn proporciona herramientas para comparar modelos y buscar hiperparámetros óptimos.
División de datos
| Método | Descripción | Documentación |
|---|---|---|
train_test_split | División simple en entrenamiento y prueba | Docs |
KFold | K pliegues para validación cruzada | Docs |
StratifiedKFold | K pliegues estratificados (mantiene proporción de clases) | Docs |
Validación Cruzada
| Método | Descripción | Documentación |
|---|---|---|
cross_val_score | Evalúa el modelo con validación cruzada | Docs |
cross_validate | Similar pero retorna más información (tiempos, múltiples métricas) | Docs |
Búsqueda de Hiperparámetros
| Método | Descripción | Documentación |
|---|---|---|
GridSearchCV | Búsqueda exhaustiva de todas las combinaciones | Docs |
RandomizedSearchCV | Búsqueda aleatoria (más eficiente para espacios grandes) | Docs |
Librerías de Machine Learning en Python
Algunas de las librerías más utilizadas en Python son:
- scikit-learn - https://scikit-learn.org/stable/
- XGBoost - https://xgboost.readthedocs.io/
- LightGBM - https://lightgbm.readthedocs.io/
- CatBoost - https://catboost.ai/
- Local Cascade Ensemble (LCE) - https://pypi.org/project/lcensemble/
Referencias
- Documentación oficial de scikit-learn
- Cheatsheet scikit-learn (DataCamp)
- Errores Comunes y Recomendaciones (scikit-learn)
- Métricas de Regresión
- Métricas de Clasificación
- Métricas de Clustering
- Conceptos de Machine Learning Visuales
- Machine Learning con Python y Scikit-learn - Joaquín Amat Rodrigo
Phd. Jose R. Zapata