# machine-learning-en-python
Machine Learning en Python
Volver a la portada del cursoEjercicio práctico: primer script en Python
Sección 1 · Introducción a Machine Learning
Ejercicio práctico: primer script en Python
Esta práctica recorre de punta a punta el flujo de un modelo supervisado con los 1000 clientes de PyShop: generar los datos, mirarlos, separar entrenamiento y prueba, entrenar un LinearRegression, medir su error y predecir el gasto anual de un cliente nuevo. Todo está en el notebook primer-script-ml, adjunto a esta lección; esta guía explica cada parte y las cifras esperadas.
Antes de empezar
Necesitas el entorno de la lección anterior: Python 3.11 o superior con NumPy, pandas, matplotlib, seaborn, scikit-learn y Jupyter. La primera celda de código imprime las versiones; el notebook se ejecutó con scikit-learn 1.8.0 y pandas 3.0.3. Ejecuta las celdas en orden (Shift + Enter): cada una usa variables de las anteriores; si algo falla, «Restart and Run All».
1. Los datos se generan, no se descargan
La segunda celda de código contiene la función generar_clientes. Usa np.random.default_rng(42), así que siempre produce los mismos clientes. Cada fila trae edad, ciudad, antigüedad en meses, visitas al mes, minutos por sesión, compras en 12 meses, ticket promedio, gasto anual y si el cliente contrató envío premium. Los datos vienen «sucios» a propósito, como los de una tienda real: 1012 filas en lugar de 1000, 25 edades y 15 tiempos de sesión vacíos, y edades de −4 y 999.
2. Mirar antes de modelar
head(), info() y describe() revelan esos problemas en tres celdas. info() muestra 987 valores no nulos en edad sobre 1012 filas; describe() enseña la edad máxima de 999. Una celda de limpieza mínima los corrige (quitar duplicados, unificar ciudades, marcar edades imposibles como nulas y rellenar con la mediana) y deja 1000 filas sin nulos. Cada paso se explica a fondo en la sección siguiente.
3. Separar entrenamiento y prueba
El objetivo es gasto_anual, un número, así que el problema es de regresión. Las variables son seis columnas numéricas. La separación aparta el 20 % de los clientes para evaluar al final:
from sklearn.model_selection import train_test_split
variables = ["edad", "antiguedad_meses", "visitas_mes",
"minutos_sesion", "compras_12m", "ticket_promedio"]
X, y = df[variables], df["gasto_anual"]
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42)
print(X_train.shape, X_test.shape) # (800, 6) (200, 6)
El modelo nunca ve esos 200 clientes al entrenar. Su error sobre ellos es la mejor estimación de cómo se comportará con clientes nuevos.
4. El primer modelo y sus métricas
Toda la API de scikit-learn sigue el mismo patrón: crear el modelo, fit para entrenar y predict para predecir. El notebook empieza con una sola variable, el número de compras:
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_absolute_error
modelo_1 = LinearRegression().fit(X_train[["compras_12m"]], y_train)
pred_1 = modelo_1.predict(X_test[["compras_12m"]])
print(round(modelo_1.coef_[0], 1)) # 113.1
print(round(r2_score(y_test, pred_1), 3)) # 0.099
print(round(mean_absolute_error(y_test, pred_1))) # 2166
Cada compra extra suma unos 113 pesos al gasto estimado, pero el R² de 0.099 indica que las compras explican menos del 10 % de la variación del gasto, y el error medio (MAE) es de 2166 pesos. Con las seis variables el R² sube a 0.853 y el MAE baja a 693. El notebook imprime también los coeficientes: el de visitas_mes sale negativo (−160.8), un recordatorio de que los coeficientes de variables relacionadas entre sí no se leen de forma aislada.
5. Predecir un cliente nuevo
predict recibe un DataFrame con las mismas columnas que se usaron al entrenar. Para un cliente de 30 años, 24 meses de antigüedad, 6 visitas al mes, 10 minutos por sesión, 12 compras y ticket de 400 pesos, el modelo estima unos 3974 pesos al año. Multiplicar 12 compras por 400 pesos da 4800: el modelo lineal suma efectos, pero el gasto es un producto.
6. Ejercicios
Cuatro ejercicios cierran el notebook, cada uno con su assert:
- Contar los clientes de prueba (200).
- Entrenar con solo
ticket_promedio: su R² de 0.567 queda entre el modelo de compras y el de seis variables. - Calcular el MAE a mano con NumPy y comprobar que coincide con
mean_absolute_error. - Agregar la variable
compras_x_ticket: el R² sube a 0.988.
Trampas comunes
- Evaluar con los datos de entrenamiento. El modelo ya los vio; el error sobre ellos es optimista.
- Pasar una
Seriesdonde se espera una tabla.X_train["compras_12m"]es 1D yfitla rechaza; con doble corchete,X_train[["compras_12m"]], es unDataFrame. - Columnas distintas al predecir. El cliente nuevo debe tener las mismas columnas, con los mismos nombres, que el entrenamiento.
El segundo notebook: limpieza y visualización
Esta lección incluye un segundo recurso, el notebook limpieza-y-visualizacion, que acompaña la sección «Preparación y Análisis de Datos». Retoma los mismos clientes y desarrolla lo que aquí se resolvió en una celda: diagnóstico de nulos y duplicados, las 14 escrituras de ciudad que en realidad son 5, las edades imposibles, la imputación con la mediana y por qué no con la media, y las gráficas de la sección (histograma del gasto, boxplot por ciudad, dispersión de ticket contra gasto, mapa de calor de correlaciones y comparación por premium). Conviene trabajarlo junto con esos videos y antes del quiz «Exploración y limpieza de datos».