Comparación justa de modelos
Parte de la sección Aprendizaje supervisado del Journey de Machine Learning de Coddy. Lección 38 de 58.
Comparar modelos en una sola división es como lanzar una moneda: uno puede tener suerte con el conjunto de prueba. En su lugar, usa los mismos cinco pliegues para cada modelo. Para 150 billetes, auténticos o falsos:
k-NN y la regresión logística empatan dentro de su margen de variación, y k-NN es más estable. El árbol queda atrás.
Un particionador KFold mezcla las filas una vez y entrega a cada modelo los mismos pliegues:
from sklearn.model_selection import KFold
folds = KFold(n_splits=5, shuffle=True, random_state=0)
for model in [knn, logistic, tree]:
scores = cross_val_score(model, X, y, cv=folds)
print(f"{scores.mean():.3f} {scores.std():.3f}")Imprime los números del gráfico:
0.867 0.042
0.873 0.074
0.807 0.077Elige la media más alta; cuando las medias sean similares, la desviación estándar más pequeña.
Desafío
IntermedioUn sitio de cocina predice qué visitantes cocinan una receta que abren. El código inicial evalúa tres modelos en una sola división y gana el árbol. Compruébalo de manera justa; el programa lee el número de particiones.
- Crea un
KFoldcon esa cantidad de particiones,shuffle=Trueyrandom_state=0. - Valida de forma cruzada cada modelo con esas particiones; imprime su media y su desviación estándar, con 3 decimales.
- Imprime el modelo con la media más alta.
Para otros visitantes y 5:
One split picks: k-NN
k-NN: mean 0.833, std 0.045
logistic: mean 0.860, std 0.044
tree: mean 0.787, std 0.029
Cross-validation picks: logisticPruébalo tú mismo
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
n_folds = int(input())
# No cambies las líneas de abajo: 300 visitantes, 6 hábitos de navegación; la etiqueta 1 significa que prepararon la receta
X, y = make_classification(n_samples=300, n_features=6, n_informative=4, n_redundant=0,
flip_y=0.06, class_sep=0.8, random_state=0)
names = ["k-NN", "logistic", "tree"]
models = [KNeighborsClassifier(), LogisticRegression(max_iter=1000),
DecisionTreeClassifier(max_depth=4, random_state=0)]
# Una sola división corona a un ganador
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
single = []
for model in models:
model.fit(X_train, y_train)
single.append(model.score(X_test, y_test))
print(f"One split picks: {names[np.argmax(single)]}")
# Escribe tu código a continuación
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Aprendizaje supervisado
1Tu primer modelo
Aprender de ejemplosConjuntos de entrenamiento y pruebaAjustar y predecirEvaluar un modeloRepaso: clasificador de semillas4Regresión logística
Predicciones de sí o noEl umbral de decisiónLos pesos como evidenciaVarias clasesRepaso: filtro de spam2Vecinos más cercanos
Cómo decide k-NNCómo elegir kFronteras de decisiónEscalado para los vecinosRepaso: vecinos del vino5Medición de clasificadores
La matriz de confusiónPrecisión y exhaustividadLa puntuación F1Clases desequilibradasCurvas ROCRepaso: prueba de detección8Validación cruzada
Validación K-FoldComparación justa de modelosBúsqueda en cuadrículaRepaso: reparaciones de monopatines11Proyecto: especies de pingüinos
Conoce a los pingüinosPrepara los datosElige un modeloAjusta el modelo ganadorPublica el modelo3Regresión lineal
Predicción de númerosVarias característicasMedición de erroresGráficos de residuosRepaso: alquiler de bicicletas6Árboles de decisión
Los árboles hacen preguntasLeer un árbolProfundidad del árbolImportancia de las característicasRepaso: decisiones de préstamosPractica por tu cuenta: Compilador de Python online