Paso 2: Explora tus datos

Compilar y entrenar un modelo es solo una parte del flujo de trabajo. Comprender las características de tus datos con anterioridad te permitirá crear un mejor modelo. Esto podría significar simplemente obtener una mayor precisión. También podría significar requerir menos datos para el entrenamiento o menos recursos de procesamiento.

Carga el conjunto de datos

Primero, carguemos el conjunto de datos en Python.

def load_imdb_sentiment_analysis_dataset(data_path, seed=123):
    """Loads the IMDb movie reviews sentiment analysis dataset.

    # Arguments
        data_path: string, path to the data directory.
        seed: int, seed for randomizer.

    # Returns
        A tuple of training and validation data.
        Number of training samples: 25000
        Number of test samples: 25000
        Number of categories: 2 (0 - negative, 1 - positive)

    # References
        Mass et al., http://www.aclweb.org/anthology/P11-1015

        Download and uncompress archive from:
        http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
    """
    imdb_data_path = os.path.join(data_path, 'aclImdb')

    # Load the training data
    train_texts = []
    train_labels = []
    for category in ['pos', 'neg']:
        train_path = os.path.join(imdb_data_path, 'train', category)
        for fname in sorted(os.listdir(train_path)):
            if fname.endswith('.txt'):
                with open(os.path.join(train_path, fname)) as f:
                    train_texts.append(f.read())
                train_labels.append(0 if category == 'neg' else 1)

    # Load the validation data.
    test_texts = []
    test_labels = []
    for category in ['pos', 'neg']:
        test_path = os.path.join(imdb_data_path, 'test', category)
        for fname in sorted(os.listdir(test_path)):
            if fname.endswith('.txt'):
                with open(os.path.join(test_path, fname)) as f:
                    test_texts.append(f.read())
                test_labels.append(0 if category == 'neg' else 1)

    # Shuffle the training data and labels.
    random.seed(seed)
    random.shuffle(train_texts)
    random.seed(seed)
    random.shuffle(train_labels)

    return ((train_texts, np.array(train_labels)),
            (test_texts, np.array(test_labels)))

Verifica los datos

Después de cargar los datos, te recomendamos ejecutar algunas verificaciones: elige algunos ejemplos y verifica manualmente si son coherentes con tus expectativas. Por ejemplo, imprime algunas muestras aleatorias para ver si la etiqueta de opinión corresponde a la opinión de la opinión. Esta es una revisión que elegimos al azar del conjunto de datos de IMDb: "Diez minutos de una historia completa se extendieron en la mejor parte de dos horas. Cuando no había ocurrido nada significativo en el punto intermedio, debería haber salido”. La opinión esperada (negativa) coincide con la etiqueta de la muestra.

Recopilar métricas clave

Una vez que hayas verificado los datos, recopila las siguientes métricas importantes que pueden ayudarte a caracterizar tu problema de clasificación de texto:

  1. Cantidad de muestras: La cantidad total de ejemplos que tienes en los datos.

  2. Cantidad de clases: Cantidad total de temas o categorías en los datos.

  3. Cantidad de muestras por clase: Cantidad de muestras por clase (tema/categoría). En un conjunto de datos equilibrado, todas las clases tendrán una cantidad similar de muestras; en un conjunto de datos desequilibrado, la cantidad de muestras en cada clase variará mucho.

  4. Cantidad de palabras por muestra: Muestra la cantidad media de palabras en una muestra.

  5. Distribución de frecuencia de palabras: distribución que muestra la frecuencia (cantidad de casos) de cada palabra en el conjunto de datos.

  6. Distribución de la longitud de la muestra: Distribución que muestra la cantidad de palabras por muestra en el conjunto de datos.

Veamos cuáles son los valores de estas métricas en el conjunto de datos de revisiones de IMDb (consulta las figuras 3 y 4 para trazar las distribuciones de frecuencia de palabras y de longitud de muestra).

Nombre de la métrica Valor de la métrica
Cantidad de muestras 25000
Cantidad de clases 2
Cantidad de muestras por clase 12500
Cantidad de palabras por muestra 174

Tabla 1: Métricas del conjunto de datos de revisiones de IMDb

explore_data.py contiene funciones para calcular y analizar estas métricas. Estos son algunos ejemplos:

import numpy as np
import matplotlib.pyplot as plt

def get_num_words_per_sample(sample_texts):
    """Returns the median number of words per sample given corpus.

    # Arguments
        sample_texts: list, sample texts.

    # Returns
        int, median number of words per sample.
    """
    num_words = [len(s.split()) for s in sample_texts]
    return np.median(num_words)

def plot_sample_length_distribution(sample_texts):
    """Plots the sample length distribution.

    # Arguments
        samples_texts: list, sample texts.
    """
    plt.hist([len(s) for s in sample_texts], 50)
    plt.xlabel('Length of a sample')
    plt.ylabel('Number of samples')
    plt.title('Sample length distribution')
    plt.show()

Distribución de frecuencia de palabras para IMDb

Figura 3: Distribución de frecuencia de palabras para IMDb

Distribución de la longitud de la muestra para IMDb

Figura 4: Distribución de la longitud de la muestra para IMDb