Etapa 2: analise seus dados

Criar e treinar um modelo é apenas uma parte do fluxo de trabalho. Compreensão as características de seus dados de antemão permitirá que você construa uma melhor um modelo de machine learning. Isso pode significar simplesmente ter uma acurácia maior. Também pode significar exigindo menos dados para treinamento ou menos recursos computacionais.

Carregar o conjunto de dados

Primeiro, vamos carregar o conjunto de dados em 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)))

Verifique os dados

Depois de carregar os dados, recomendamos fazer algumas verificações: escolha um algumas amostras e verifique manualmente se elas estão de acordo com suas expectativas. Por exemplo, exiba algumas amostras aleatórias para ver se o rótulo de sentimento corresponde ao sentimento da avaliação. Esta é uma avaliação que escolhemos aleatoriamente do conjunto de dados da IMDb: “Dez minutos de história consumiam melhor em duas horas. Quando nada de significado tinha acontecido no eu deveria ter saído da metade do caminho.” O sentimento (negativo) corresponde ao esperado o rótulo da amostra.

Coletar as principais métricas

Depois de verificar os dados, colete as seguintes métricas importantes que podem ajudar a caracterizar seu problema de classificação de texto:

  1. Número de amostras: número total de exemplos que você tem nos dados.

  2. Número de turmas: número total de tópicos ou categorias nos dados.

  3. Número de amostras por classe: número de amostras por classe (assunto/categoria). Em um conjunto de dados balanceado, todas as classes terão um número semelhante de amostras; em um conjunto de dados desequilibrado, o número de amostras em cada classe será variam muito.

  4. Número de palavras por amostra: número médio de palavras em uma amostra.

  5. Distribuição de frequência de palavras: distribuição mostrando a frequência (número de ocorrências) de cada palavra do conjunto de dados.

  6. Distribuição do comprimento da amostra: distribuição mostrando o número de palavras por amostra no conjunto de dados.

Vamos conferir os valores dessas métricas para o conjunto de dados de avaliações do IMDb (Consulte as figuras 3 e 4 para gráficos de frequência de palavras e comprimento da amostra) das suas distribuições).

Nome da métrica Valor métrico
Número de amostras 25.000
Número de aulas 2
Número de amostras por classe 12500
Número de palavras por amostra 174

Tabela 1: o IMDb analisa as métricas do conjunto de dados

explore_data.py contém funções para calcular e analisar essas métricas. Veja alguns exemplos:

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()

Distribuição de frequência de palavras para IMDb

Figura 3: distribuição de frequência das palavras para IMDb

Distribuição do comprimento da amostra para IMDb

Figura 4: distribuição do comprimento da amostra para IMDb