Precisión y exhaustividad
Parte de la sección Aprendizaje supervisado del Journey de Machine Learning de Coddy. Lección 22 de 58.
Dos preguntas califican las respuestas de la prueba sobre la gripe. De sus alarmas de gripe, ¿cuántas fueron correctas? De los casos reales de gripe, ¿cuántos detectó?
La precisión responde a la primera: 42 de 45 alarmas. La exhaustividad responde a la segunda: 42 de 47 casos.
from sklearn.metrics import precision_score, recall_score
print(f"{precision_score(y_test, pred):.3f}")
print(f"{recall_score(y_test, pred):.3f}"):.3f siempre muestra 3 decimales, así que 0.9 se imprimiría como 0.900. Esto imprime:
0.933
0.894Elige según el error más costoso. Un caso de gripe que no se detecta se propaga, así que esta prueba necesita exhaustividad. Un filtro de spam que oculta correo legítimo necesita precisión.
Desafío
IntermedioEl filtro de una tienda oculta las reseñas que parecen falsas. El código inicial crea dos versiones a partir de un mismo modelo, strict_pred y eager_pred, y lee qué error perjudica más: missed (una reseña falsa permanece visible) o hidden (una reseña real desaparece).
- Imprime la precisión y la exhaustividad de cada filtro, con 3 decimales.
- Imprime el filtro que comete menos errores de ese tipo, como se muestra a continuación (para
missed:Fewer fakes missed: ...).
Para otra tienda y hidden:
Strict: precision 0.900, recall 0.450
Eager: precision 0.640, recall 0.800
Fewer real reviews hidden: strictPruébalo tú mismo
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_score, recall_score
# ¿Qué error perjudica más: no detectar una reseña falsa (permanece publicada) u ocultar una reseña real?
worse = input()
# Una fila por reseña: 1 en fake significa que la reseña se escribió por encargo
reviews = pd.read_csv("reviews.csv")
features = ["words", "exclamations", "account_days", "user_reviews", "stars", "photo"]
X_train, X_test, y_train, y_test = train_test_split(reviews[features], reviews["fake"], test_size=0.25, random_state=0)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
proba = model.predict_proba(X_test)[:, 1]
# Dos filtros del mismo modelo: strict oculta una reseña con una probabilidad de 0.7 de ser falsa; eager lo hace con 0.3
strict_pred = proba >= 0.7
eager_pred = proba >= 0.3
# 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