La creazione e l'addestramento di un modello sono solo una parte del flusso di lavoro. Comprendere le caratteristiche dei tuoi dati in anticipo ti permetterà di creare un modello migliore. Ciò potrebbe semplicemente significare ottenere una maggiore precisione. Potrebbe anche essere necessario richiedere 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: scegli alcuni esempi e controlla manualmente se sono coerenti con le tue aspettative. Ad esempio, stampa alcuni esempi casuali per vedere se l'etichetta del sentiment corrisponde al sentiment della recensione. Ecco una recensione che abbiamo scelto in modo casuale dal set di dati IMDb: "Dieci minuti di storia estesi nella parte migliore di due ore. Quando non era avvenuto niente di significativo al punto a metà strada avrei dovuto lasciare." Il sentiment previsto (negativo) corrisponde all'etichetta del campione.
Raccogli metriche chiave
Dopo aver verificato i dati, raccogli le seguenti metriche importanti che possono aiutarti a caratterizzare il tuo problema di classificazione del testo:
Numero di esempi: numero totale di esempi presenti nei dati.
Numero di corsi: numero totale di argomenti o categorie nei dati.
Numero di esempi per corso: numero di esempi per corso (argomento/categoria). In un set di dati bilanciato, tutte le classi avranno un numero simile di campioni; in un set di dati non bilanciato, il numero di campioni in ciascuna classe può variare notevolmente.
Numero di parole per campione: il numero medio di parole in un campione.
Distribuzione della frequenza delle parole: distribuzione che mostra la frequenza (numero di occorrenze) di ogni parola nel set di dati.
Distribuzione della lunghezza del campione: la distribuzione mostra il numero di parole per campione nel set di dati.
Vediamo quali sono i valori per queste metriche per il set di dati delle recensioni IMDb (vedi le Figure 3 e 4 per i grafici delle distribuzioni di frequenza delle parole e di lunghezza dei campioni).
Nome metrica | Valore metrica |
---|---|
Numero di esempi | 25000 |
Numero di corsi | 2 |
Numero di esempi per corso | 12500 |
Numero di parole per campione | 174 |
Tabella 1: metriche del set di dati per le recensioni IMDb
explore_data.py
contiene funzioni per 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()
Figura 3: distribuzione della frequenza delle parole per IMDb
Figura 4: distribuzione della lunghezza del campione per IMDb