Explicación del clasificador ficticio: una guía visual con ejemplos de código para principiantes | por Samy Baladram | agosto de 2024

Estableciendo el estándar en aprendizaje automático con modelos de referencia simples

Todas las ilustraciones de este artículo fueron creadas por el autor, incorporando elementos de diseño con licencia de Canva Pro.

¿Alguna vez te has preguntado cómo miden los científicos de datos el rendimiento de sus modelos de aprendizaje automático? Aquí entra en escena el clasificador ficticio, una herramienta sencilla pero poderosa en el mundo de la ciencia de datos. Piensa en él como el jugador de referencia en un juego, que establece el estándar mínimo que otros modelos más sofisticados deben superar.

Un clasificador ficticio es un modelo de aprendizaje automático simple que realiza predicciones utilizando reglas básicas, sin aprender realmente de los datos de entrada. Sirve como base para comparar el rendimiento de modelos más complejos. El clasificador ficticio nos ayuda a comprender si nuestros modelos sofisticados realmente están aprendiendo patrones útiles o solo están adivinando.

El clasificador ficticio es uno de los algoritmos clave básicos en el aprendizaje automático.

A lo largo de este artículo, utilizaremos este sencillo conjunto de datos de golf artificial (inspirado en [1]) como ejemplo. Este conjunto de datos predice si una persona jugará al golf en función de las condiciones meteorológicas. Incluye características como el pronóstico del tiempo, la temperatura, la humedad y el viento, y la variable objetivo es si jugará al golf o no.

# Import libraries
from sklearn.model_selection import train_test_split
import pandas as pd

# Make a dataset
dataset_dict = {
'Outlook': ['sunny', 'sunny', 'overcast', 'rain', 'rain', 'rain', 'overcast', 'sunny', 'sunny', 'rain', 'sunny', 'overcast', 'overcast', 'rain', 'sunny', 'overcast', 'rain', 'sunny', 'sunny', 'rain', 'overcast', 'rain', 'sunny', 'overcast', 'sunny', 'overcast', 'rain', 'overcast'],
'Temperature': [85.0, 80.0, 83.0, 70.0, 68.0, 65.0, 64.0, 72.0, 69.0, 75.0, 75.0, 72.0, 81.0, 71.0, 81.0, 74.0, 76.0, 78.0, 82.0, 67.0, 85.0, 73.0, 88.0, 77.0, 79.0, 80.0, 66.0, 84.0],
'Humidity': [85.0, 90.0, 78.0, 96.0, 80.0, 70.0, 65.0, 95.0, 70.0, 80.0, 70.0, 90.0, 75.0, 80.0, 88.0, 92.0, 85.0, 75.0, 92.0, 90.0, 85.0, 88.0, 65.0, 70.0, 60.0, 95.0, 70.0, 78.0],
'Wind': [False, True, False, False, False, True, True, False, False, False, True, True, False, True, True, False, False, True, False, True, True, False, True, False, False, True, False, False],
'Play': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes']
}
df = pd.DataFrame(dataset_dict)

# One-hot Encode 'Outlook' Column
df = pd.get_dummies(df, columns=['Outlook'], prefix='', prefix_sep='', dtype=int)

# Convert 'Windy' (bool) and 'Play' (binary) Columns to 0 and 1
df['Wind'] = df['Wind'].astype(int)
df['Play'] = (df['Play'] == 'Yes').astype(int)

# Set feature matrix X and target vector y
X, y = df.drop(columns='Play'), df['Play']

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.5, shuffle=Fals

El clasificador ficticio opera con estrategias simples para hacer predicciones. Estas estrategias no implican ningún aprendizaje real a partir de los datos. En cambio, utilizan reglas básicas como:

  1. Siempre prediciendo la clase más frecuente
  2. Predicción aleatoria de una clase en función de la distribución de clases del conjunto de entrenamiento
  3. Siempre prediciendo una clase específica
Para nuestro conjunto de datos de golf, un clasificador ficticio siempre podría predecir “Sí” para jugar al golf si ese es el resultado más común en los datos de entrenamiento.

El proceso de “entrenamiento” de un clasificador ficticio es bastante simple y no implica los algoritmos de aprendizaje habituales. A continuación, se ofrece un esquema general:

1. Seleccione la estrategia

Elija una de las siguientes estrategias:

  • Estratificado:Hace conjeturas aleatorias basándose en la distribución de clases original.
  • Más frecuentes:Siempre elige la clase más común.
  • Uniforme:Elige cualquier clase al azar.
Dependiendo de la estrategia, Dummy Classifier hace diferentes predicciones.
from sklearn.dummy import DummyClassifier

# Choose a strategy for your DummyClassifier (e.g., 'most_frequent', 'stratified', etc.)
strategy = 'most_frequent'

2. Recopilación de etiquetas de entrenamiento

Recopile las etiquetas de clase del conjunto de datos de entrenamiento para determinar los parámetros de la estrategia.

El algoritmo simplemente obtiene información de la clase “Más frecuente” en el conjunto de datos de entrenamiento; en este caso, “Sí”.
# Initialize the DummyClassifier
dummy_clf = DummyClassifier(strategy=strategy)

# "Train" the DummyClassifier (although no real training happens)
dummy_clf.fit(X_train, y_train)

3. Aplicar la estrategia a los datos de prueba

Utilice la estrategia elegida para generar una lista de etiquetas previstas para sus datos de prueba.

Si elegimos la estrategia “más frecuente” y descubrimos que “Sí” (jugar al golf) aparece con más frecuencia en nuestros datos de entrenamiento, el clasificador ficticio simplemente recordará siempre predecir “Sí”.
# Use the DummyClassifier to make predictions
y_pred = dummy_clf.predict(X_test)
print("Label :",list(y_test))
print("Prediction:",list(y_pred))

Evaluar el modelo

El clasificador ficticio proporciona una precisión del 64 % como base para modelos futuros.
# Evaluate the DummyClassifier's accuracy
from sklearn.metrics import accuracy_score

accuracy = accuracy_score(y_test, y_pred)
print(f"Dummy Classifier Accuracy: {accuracy.round(4)*100}%")

Si bien los clasificadores ficticios son simples, tienen algunos parámetros importantes:

  1. Estrategia: Esto determina cómo realiza las predicciones el clasificador. Las opciones más comunes incluyen:
    – ‘most_frequent’: siempre predice la clase más común en el conjunto de entrenamiento.
    – ‘estratificado’: genera predicciones basadas en la distribución de clases del conjunto de entrenamiento.
    – ‘uniforme’: genera predicciones de manera uniforme y aleatoria.
    – ‘constante’: siempre predice una clase específica.
  2. Estado aleatorio:Si se utiliza una estrategia que implica aleatoriedad (como ‘estratificada’ o ‘uniforme’), este parámetro garantiza la reproducibilidad de los resultados.
  3. Constante:Cuando se utiliza la estrategia ‘constante’, este parámetro especifica qué clase se debe predecir siempre.
Para nuestro conjunto de datos de golf, podríamos elegir la estrategia “más frecuente”, que no requiere parámetros adicionales.

Como cualquier herramienta de aprendizaje automático, los clasificadores ficticios tienen sus fortalezas y limitaciones.

Ventajas:

  1. Sencillez:Fácil de entender e implementar.
  2. Rendimiento de referencia:Proporciona un punto de referencia de rendimiento mínimo para otros modelos.
  3. Comprobación de sobreajuste:Ayuda a identificar cuándo los modelos complejos están sobreajustados comparando su desempeño con el clasificador ficticio.
  4. Rápido para entrenar y predecir:Requiere recursos computacionales mínimos.

Contras:

  1. Poder predictivo limitado:Por diseño, no aprende de los datos, por lo que sus predicciones suelen ser inexactas.
  2. Sin importancia de las características:No proporciona información sobre qué características son más importantes para las predicciones.
  3. No apto para problemas complejos:En escenarios del mundo real con patrones intrincados, los clasificadores ficticios son demasiado simplistas para ser útiles por sí solos.

Comprender los clasificadores ficticios es crucial para cualquier científico de datos o entusiasta del aprendizaje automático. Sirven como una verificación de la realidad y nos ayudan a garantizar que nuestros modelos más complejos realmente están aprendiendo patrones útiles a partir de los datos. A medida que continúe su viaje en el aprendizaje automático, recuerde siempre comparar sus modelos con estas líneas de base simples: ¡puede que se sorprenda con lo que aprenda!

# Import necessary libraries
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.dummy import DummyClassifier

# Make dataset
dataset_dict = {
'Outlook': ['sunny', 'sunny', 'overcast', 'rain', 'rain', 'rain', 'overcast', 'sunny', 'sunny', 'rain', 'sunny', 'overcast', 'overcast', 'rain', 'sunny', 'overcast', 'rain', 'sunny', 'sunny', 'rain', 'overcast', 'rain', 'sunny', 'overcast', 'sunny', 'overcast', 'rain', 'overcast'],
'Temperature': [85.0, 80.0, 83.0, 70.0, 68.0, 65.0, 64.0, 72.0, 69.0, 75.0, 75.0, 72.0, 81.0, 71.0, 81.0, 74.0, 76.0, 78.0, 82.0, 67.0, 85.0, 73.0, 88.0, 77.0, 79.0, 80.0, 66.0, 84.0],
'Humidity': [85.0, 90.0, 78.0, 96.0, 80.0, 70.0, 65.0, 95.0, 70.0, 80.0, 70.0, 90.0, 75.0, 80.0, 88.0, 92.0, 85.0, 75.0, 92.0, 90.0, 85.0, 88.0, 65.0, 70.0, 60.0, 95.0, 70.0, 78.0],
'Wind': [False, True, False, False, False, True, True, False, False, False, True, True, False, True, True, False, False, True, False, True, True, False, True, False, False, True, False, False],
'Play': ['No', 'No', 'Yes', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'Yes', 'No', 'Yes']
}
df = pd.DataFrame(dataset_dict)

# Perform one-hot encoding on 'Outlook' column
df = pd.get_dummies(df, columns=['Outlook'], prefix='', prefix_sep='', dtype=int)

# Convert 'Wind' and 'Play' columns to binary indicators
df['Wind'] = df['Wind'].astype(int)
df['Play'] = (df['Play'] == 'Yes').astype(int)

# Split data into features (X) and target (y), then into training and test sets
X, y = df.drop(columns='Play'), df['Play']
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.5)

# Initialize and train the dummy classifier model
dummy_clf = DummyClassifier(strategy='uniform')
dummy_clf.fit(X_train, y_train)

# Make predictions on the test data
y_pred = dummy_clf.predict(X_test)

# Calculate and print the model's accuracy on the test data
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")