Passaggio 2: esplora i dati

La creazione e l'addestramento di un modello sono solo una parte del flusso di lavoro. Comprensione le caratteristiche dei dati in anticipo per consentirti di creare un un modello di machine learning. Ciò potrebbe significare semplicemente ottenere una maggiore precisione. Può anche significare richiedono meno dati per l'addestramento o meno risorse di calcolo.

Carica il set di dati

Innanzitutto, carichiamo il set di dati in 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)))

Controlla i dati

Dopo aver caricato i dati, è buona norma eseguire alcuni controlli sui dati: scegli una alcuni campioni e controlla manualmente se sono coerenti con le tue aspettative. Ad esempio, stampa alcuni campioni casuali per vedere se l'etichetta di sentiment corrisponde al sentiment della recensione. Ecco una recensione che abbiamo scelto a caso dal set di dati IMDb: "Una storia lunga dieci minuti, che si è estesa parte migliore di due ore. Quando non era successo niente di rilevante in quel momento a metà strada avrei dovuto rimanere". Il sentiment previsto (negativo) corrisponde a l'etichetta del campione.

Raccolta delle metriche chiave

Dopo aver verificato i dati, raccogli le seguenti metriche importanti che possono per caratterizzare il tuo problema di classificazione del testo:

  1. Numero di campioni: il numero totale di esempi presenti nei dati.

  2. Numero di corsi: il numero totale di argomenti o categorie nei dati.

  3. Numero di campioni per classe: il numero di campioni per classe (argomento/categoria). In un set di dati bilanciato, tutte le classi avranno un numero simile dei campioni; in un set di dati sbilanciato, il numero di campioni in ogni classe variano notevolmente.

  4. Numero di parole per campione: numero mediano di parole in un campione.

  5. Distribuzione della frequenza delle parole: distribuzione che mostra la frequenza (numero di occorrenze) di ogni parola nel set di dati.

  6. Distribuzione della lunghezza del campione: distribuzione che mostra il numero di parole per campione nel set di dati.

Vediamo quali sono i valori di queste metriche per il set di dati delle recensioni IMDb (vedi le figure 3 e 4 per i grafici della frequenza delle parole e della lunghezza del campione) ).

Nome metrica Valore metrica
Numero di campioni 25000
Numero di corsi 2
Numero di campioni per classe 12500
Numero di parole per campione 174

Tabella 1: metriche del set di dati delle revisioni IMDb

explore_data.py contiene funzioni calcolare e analizzare queste metriche. Ecco un paio di esempi:

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

Distribuzione della frequenza delle parole per IMDb

Figura 3: distribuzione della frequenza delle parole per IMDb

Distribuzione della lunghezza del campione per IMDb

Figura 4: distribuzione della lunghezza del campione per IMDb