Conceptos básicos de aprendizaje automático
10 ejemplos para empezar con ML Clásico: 7 básicos y 3 intermedios.
Prerrequisitos
uv venv && source .venv/bin/activate
uv pip install "pandas>=2.2" "scikit-learn>=1.5" "numpy>=2.0"- Python 3.14.0 con un entorno virtual aislado.
- pandas 2.2+ para datos tabulares; scikit-learn para algoritmos y canalizaciones de ML clásico.
Ejemplos básicos
1. Cargar datos en un DataFrame
Comience cada proyecto inspeccionando la forma (shape), los tipos de datos (dtypes) y los valores faltantes.
import pandas as pd
from sklearn.datasets import load_iris
iris = load_iris(as_frame=True)
df = iris.frame.assign(species=iris.target_names[iris.target])
print(df.shape, df.dtypes)
print(df.isna().sum())as_frame=Truedevuelve un DataFrame de pandas directamente desde los conjuntos de datos de sklearn.- Compruebe
df.info()ydf.describe()antes de modelar. - Registre la versión del conjunto de datos o la URL de origen para la reproducibilidad.
Relacionado: Conjuntos de datos y divisiones - divisiones de entrenamiento/prueba/validación
2. Separar características y objetivo
Defina X (entradas) y y (etiqueta) explícitamente.
X = df.drop(columns=["species"])
y = df["species"]
feature_names = list(X.columns)- Las características deben excluir la columna objetivo y cualquier columna posterior al resultado.
- Mantenga los nombres de las características como una lista para su posterior inspección y explicabilidad.
- Los objetivos categóricos pueden permanecer como cadenas hasta que se ajuste un codificador.
Relacionado: Ingeniería de características - codificación y escalado
3. División entrenamiento/prueba
Retenga datos no vistos antes de ajustar nada.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)stratify=ypreserva las proporciones de clases en tareas de clasificación.- Ajuste los preprocesadores y modelos solo en
X_train, nunca en el conjunto de datos completo. - El conjunto de prueba se toca una vez al final para obtener una puntuación imparcial.
Relacionado: Conjuntos de datos y divisiones - validación cruzada
4. Ajustar un clasificador de referencia
Establezca un punto de referencia simple antes de ajustar modelos complejos.
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
clf = LogisticRegression(max_iter=1000, random_state=42)
clf.fit(X_train, y_train)
preds = clf.predict(X_test)
print("accuracy:", accuracy_score(y_test, preds))- La regresión logística es una sólida referencia lineal para la clasificación tabular.
- Compare cada nuevo modelo con esta puntuación de referencia.
max_iter=1000evita advertencias de convergencia en algunos conjuntos de datos.
Relacionado: Aprendizaje supervisado - opciones de algoritmos
5. Escalar características numéricas
Muchos algoritmos esperan entradas escaladas de manera similar.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # ajustar solo en entrenamientofitaprende la media y la desviación estándar de los datos de entrenamiento;transformlas aplica.- Nunca llame a
fit_transformen el conjunto de prueba, eso filtra las estadísticas. - Envuelva el escalado en una
Pipelinepara evitar errores manuales.
Relacionado: Ingeniería de características -
ColumnTransformer
6. Construir una canalización (Pipeline) sin fugas de información
Encadene el preprocesamiento y el modelo en un único objeto estimable.
from sklearn.pipeline import Pipeline
pipe = Pipeline([
("scaler", StandardScaler()),
("clf", LogisticRegression(max_iter=1000, random_state=42)),
])
pipe.fit(X_train, y_train)
print("pipeline accuracy:", accuracy_score(y_test, pipe.predict(X_test)))- Una
Pipelineasegura que los datos de prueba nunca influyan en las estadísticas de preprocesamiento. pipe.predict(X_test)realiza el escalado y luego la clasificación en una sola llamada.- Serialice toda la canalización para su implementación, no solo el modelo.
Relacionado: Pipelines - composición de pasos
7. Validación cruzada para puntuaciones estables
Las divisiones únicas de entrenamiento/prueba pueden ser ruidosas; la CV promedia múltiples pliegues (folds).
from sklearn.model_selection import cross_val_score
scores = cross_val_score(pipe, X_train, y_train, cv=5, scoring="accuracy")
print(f"CV mean: {scores.mean():.3f} +/- {scores.std():.3f}")- La validación cruzada se ejecuta solo en los datos de entrenamiento; el conjunto de prueba permanece bloqueado.
- Informe la media y la desviación estándar, no solo el mejor pliegue.
- Utilice
scoringapropiado para el problema (F1, ROC-AUC, etc.).
Relacionado: Evaluación de modelos - métricas y curvas
Ejemplos intermedios
8. Codificar características categóricas
Las columnas numéricas y categóricas mixtas necesitan transformaciones específicas.
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
num_cols = ["sepal length (cm)", "sepal width (cm)"]
cat_cols = ["petal length (cm)"] # ejemplo: tratar una columna como categórica
preprocessor = ColumnTransformer([
("num", StandardScaler(), num_cols),
("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols),
])ColumnTransformeraplica diferentes transformaciones a diferentes grupos de columnas.handle_unknown="ignore"evita errores en categorías no vistas durante la inferencia.- Ajuste el preprocesador dentro de una canalización, nunca en el conjunto de datos completo de antemano.
Relacionado: Ingeniería de características - patrones completos de codificación
9. Ajustar hiperparámetros con búsqueda en cuadrícula (Grid Search)
Busque combinaciones de parámetros dentro de la validación cruzada.
from sklearn.model_selection import GridSearchCV
param_grid = {"clf__C": [0.1, 1.0, 10.0]}
search = GridSearchCV(pipe, param_grid, cv=5, scoring="accuracy")
search.fit(X_train, y_train)
print("best params:", search.best_params_)
print("test accuracy:", accuracy_score(y_test, search.predict(X_test)))- Prefije los parámetros del paso de la canalización con el nombre del paso (
clf__C). GridSearchCVselecciona los mejores parámetros mediante la puntuación CV en los datos de entrenamiento.- Evalúe al ganador una vez en el conjunto de prueba retenido.
Relacionado: Ajuste de hiperparámetros - Optuna y búsqueda aleatoria
10. Guardar y cargar una canalización entrenada
Persista el artefacto completo para una inferencia reproducible.
import joblib
joblib.dump(pipe, "iris_pipeline.joblib")
loaded = joblib.load("iris_pipeline.joblib")
print(loaded.predict(X_test[:3]))- Guarde toda la canalización para que el preprocesamiento viaje con el modelo.
- Versionar el artefacto junto con el hash de los datos de entrenamiento y la semilla aleatoria.
- Cargue y prediga con los mismos nombres de columna de pandas utilizados durante el entrenamiento.
Relacionado: Pipelines - serialización e implementación
Versiones de la pila: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ y uv 0.6+.