Paso 2: Explora tus datos

Compilar y entrenar un modelo es solo una parte del flujo de trabajo. Comprensión características de tus datos de antemano te permitirá crear una mejor un modelo de responsabilidad compartida. Esto podría significar simplemente obtener una mayor exactitud. También podría significar que requieran 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, se recomienda ejecutar algunas verificaciones: elige un algunas muestras y verificar manualmente si son coherentes con tus expectativas. Por ejemplo, puedes imprimir algunas muestras aleatorias para ver si la etiqueta de opinión corresponda a la opinión de la opinión. Aquí hay una opinión que elegimos de forma aleatoria del conjunto de datos de IMDb: “Diez minutos de historia extendido en la más de dos horas. Cuando no había sucedido nada de importancia en el punto medio que debería haberme ido”. La opinión esperada (negativa) coincide la etiqueta de la muestra.

Recopila métricas clave

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

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

  2. Cantidad de clases: Es la cantidad total de temas o categorías que aparecen 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 un número similar de las muestras; en un conjunto de datos desequilibrado, la cantidad de muestras en cada clase varían ampliamente.

  4. Cantidad de palabras por muestra: Es la cantidad mediana de palabras en una muestra.

  5. Distribución de frecuencia de palabras: Distribución que muestra la frecuencia (cantidad de apariciones) 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 para el conjunto de datos de reseñas de IMDb (Consulta las Figuras 3 y 4 para ver diagramas de la frecuencia de palabras y la longitud de la muestra distribuciones).

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: IMDb revisa las métricas de los conjuntos de datos

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