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:
Cantidad de muestras: Cantidad total de ejemplos que tienes en los datos
Cantidad de clases: Es la cantidad total de temas o categorías que aparecen en los datos.
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.
Cantidad de palabras por muestra: Es la cantidad mediana de palabras en una muestra.
Distribución de frecuencia de palabras: Distribución que muestra la frecuencia (cantidad de apariciones) de cada palabra en el conjunto de datos.
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()
Figura 3: Distribución de frecuencia de palabras para IMDb
Figura 4: Distribución de la longitud de la muestra para IMDb