Implementación del Método Predict en Naive Bayes Clasificador

Clase 24 de 26Curso de Algoritmos de Clasificación de Texto

Resumen

¿Cómo implementar un clasificador de Naive Bayes en Python?

En el fascinante mundo del machine learning, implementar desde cero un algoritmo nos permite comprender en profundidad cómo funciona realmente. En esta ocasión, veremos cómo terminar de desarrollar un clasificador Naive Bayes con suavizado de Laplace en Python. Este algoritmo es vital para tareas de clasificación de texto y es conocido por su simplicidad y eficacia.

¿Qué es el suavizado de Laplace?

El suavizado de Laplace, también conocido como suavizado laplaciano, es una técnica utilizada para gestionar la cero probabilidad en la clasificación. Cuando una palabra del dataset de prueba no aparece en el conjunto de entrenamiento, las probabilidades se ajustan ligeramente para evitar multiplicar por cero. La fórmula añade uno al contador de cada palabra, lo que permite a todas las palabras tener al menos una pequeña probabilidad.

¿Cómo programamos el método predict?

El método predict es crucial, ya que nos permite hacer predicciones utilizando un modelo ya entrenado. Su implementación se basa en los siguientes pasos:

  1. Tokenización: Dividimos cada texto en palabras o tokens únicos sobre los que evaluaremos las probabilidades.
  2. Cálculo del score de probabilidades: Para cada clase, calculamos una puntuación basada en la probabilidad condicional calculada.
  3. Validación del vocabulario: Ignoramos las palabras que no están en el vocabulario entrenado, pues no podemos calcularles una probabilidad.
  4. Aplicación del suavizado de Laplace: Usamos el conteo de palabras por categoría y el tamaño del vocabulario para calcular probabilidades logarítmicas con suavizado.
  5. Selección de la máxima probabilidad: Finalmente, mediante la función argmax de NumPy, determinamos cuál es la clase más probable para cada texto.
def predict(self, data):
    results = []
    for text in data:
        words = set(self.tokenize(text))
        scores = {c: 0 for c in self.classes_}

        for word in words:
            if word not in self.vocab_:
                continue
            for c in self.classes_:
                word_probability = math.log(
                    (self.word_counts_[c].get(word, 0) + 1) / 
                    (self.class_count_[c] + len(self.vocab_))
                )
                scores[c] += word_probability
        
        best_score = max(scores, key=scores.get)
        results.append(best_score)
    return results

¿Cómo evaluar el desempeño del modelo?

Para verificar la eficacia del modelo, utilizamos el método train_test_split de Scikit Learn para dividir nuestro dataset en conjuntos de entrenamiento y prueba. Esto nos ayuda a evitar sesgos y garantiza que el modelo aprenda correctamente.

Después del entrenamiento con el método fit, evaluamos el modelo con accuracy_score, también de Scikit Learn. Esta métrica nos indica qué tan bueno es el modelo en términos de precisión.

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Datos de entrenamiento y prueba
data_train, data_test, classes_train, classes_test = train_test_split(
    data, classes, test_size=0.1, random_state=42)

# Entrenar modelo
classifier = NaiveBayesClassifier()
classifier.fit(data_train, classes_train)

# Predecir y evaluar
predictions = classifier.predict(data_test)
accuracy = accuracy_score(classes_test, predictions)
print(f'Accuracy: {accuracy * 100:.2f}%')

Con un accuracy del 85%, el modelo demuestra ser efectivo, considerándolo un buen indicador del correcto funcionamiento del algoritmo que hemos desarrollado desde cero.

Motivación para seguir aprendiendo

El logro de implementar y ajustar un algoritmo de clasificador Naive Bayes desde cero es una de las experiencias más gratificantes en machine learning. No solo se trata de escribir código, sino de comprender profundamente cómo los conceptos matemáticos subyacen a funciones vitales.

Estamos en el camino correcto para dominar el análisis de texto y la clasificación de datos. No dejes que los errores interrumpan tu progreso; cada uno de ellos es una piedra más en tu camino hacia el aprendizaje. Recuerda, conocer minuciosamente un algoritmo te capacita para abordar otros algoritmos usando la misma filosofía de aprendizaje. ¡Sigue explorando y perfeccionando tus habilidades!