# fundamentos-de-scikit-learn
Fundamentos de Scikit-learn
Volver a la portada del cursoEntrenamiento de Modelos
Sección 3 · Modelado y Entrenamiento
Entrenamiento de modelos
En las lecciones anteriores preparaste las piezas por separado: la partición, el preprocesamiento pre y la idea de comparar contra un modelo tonto. En este notebook las unes en un solo objeto, lo entrenas con las 1500 entregas de train y lo usas para predecir si un pedido nuevo de PyEnvíos llegará tarde. Esta guía acompaña al notebook entrenamiento-de-modelos y te dice qué buscar en cada sección.
1. Partir con stratify
El notebook genera las 2000 entregas con generar_entregas(), separa X = df[NUMERICAS + CATEGORICAS] y y = df["tarde"], y parte una sola vez:
X_tr, X_te, y_tr, y_te = train_test_split(
X, y, test_size=0.25, stratify=y, random_state=42)
print(X_tr.shape, X_te.shape) # (1500, 9) (500, 9)
print(y_tr.mean().round(3), y_te.mean().round(3)) # 0.268 0.268
stratify=y mantiene la misma proporción de tardías (26.8 %) en ambos lados; random_state hace que la partición sea la misma cada vez que ejecutes. minutos no está en X: es la respuesta disfrazada.
2. Un Pipeline que lo hace todo
Un Pipeline encadena pasos con nombre. Todos menos el último son transformadores; el último es el modelo. Al llamar fit, cada paso se ajusta con la salida del anterior, siempre sobre los datos que le pasas, y eso evita la fuga de datos sin que tengas que pensarlo:
pipe = Pipeline([
("pre", pre),
("modelo", LogisticRegression(max_iter=1000)),
])
pipe.fit(X_tr, y_tr)
print(pipe.score(X_te, y_te)) # 0.888
max_iter=1000 da margen al optimizador para converger. El resultado: 0.888 de exactitud en test, contra 0.732 del DummyClassifier que siempre dice «a tiempo».
3. predict, predict_proba y score
Los tres métodos responden preguntas distintas, y el notebook los muestra sobre las primeras cinco entregas de test:
predict(X)devuelve la clase: 0 (a tiempo) o 1 (tarde). Para las primeras cinco:[0 1 0 0 1], cuando la realidad es[0 1 0 1 1].predict_proba(X)devuelve una columna por clase en el orden declasses_([0 1]); la segunda es la probabilidad de llegar tarde: 0.059, 0.998, 0.066, 0.282, 0.803. La cuarta entrega sí llegó tarde, pero el modelo le daba solo 0.282.score(X, y)predice y compara: en un clasificador es la exactitud (accuracy).
predict aplica un umbral de 0.5 sobre esa probabilidad. En la lección de métricas verás qué pasa al moverlo.
4. Mirar dentro: named_steps
Cada paso sigue accesible por su nombre: pipe.named_steps["pre"] es el ColumnTransformer ya ajustado y pipe.named_steps["modelo"] la regresión logística. Con los nombres de columna del primero y los coeficientes del segundo se arma una tabla legible:
nombres = pipe.named_steps["pre"].get_feature_names_out()
coef = pipe.named_steps["modelo"].coef_[0]
tabla = pd.Series(coef, index=nombres).sort_values()
print(tabla.round(2).tail(3))
Los tres coeficientes más altos son num__distancia_km (2.44), cat__transporte_bicicleta (1.43) y num__lluvia (0.97); el más negativo, cat__transporte_moto (−1.32). Un coeficiente positivo empuja hacia «tarde». Como las numéricas están estandarizadas, el 2.44 se lee por cada desviación estándar de distancia (unos 4.8 km), no por kilómetro. Las tasas de los datos lo confirman: en bicicleta llega tarde el 45.2 % y en moto el 18.9 %.
5. Predecir pedidos nuevos
Un pedido nuevo entra como un DataFrame con las mismas 9 columnas, aunque traiga faltantes; el pipeline los imputa con lo aprendido en train. El notebook prueba dos:
- 12 km en bicicleta, 3 artículos, viernes a las 19 h, con lluvia, en Oriente:
predictda 1 con probabilidad 0.995. - 3 km en moto, 2 artículos, martes a las 10 h, sin lluvia, sin peso ni zona registrados:
predictda 0 con probabilidad 0.001.
Qué debes obtener
Al terminar, tu pipeline debe dar 0.888 en test (0.885 en train: no hay sobreajuste visible) y la misma tabla de coeficientes. Si tus cifras difieren, revisa la semilla, el stratify y que minutos no se haya colado en X. Como práctica, cambia el paso "modelo" por un DecisionTreeClassifier(max_depth=5, random_state=42) sin tocar pre (debe dar 0.844 en test) y predice un tercer pedido elegido por ti.