Das Erstellen und Trainieren eines Modells ist nur ein Teil des Workflows. Verständnis der Eigenschaften Ihrer Daten im Vorfeld hilft Ihnen, ein besseres modellieren. Dies könnte einfach bedeuten, dass eine höhere Genauigkeit erreicht wird. Es kann auch bedeuten, und erfordern weniger Daten für das Training oder weniger Rechenressourcen.
Dataset laden
Zuerst laden wir das Dataset 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)))
Daten prüfen
Es empfiehlt sich, nach dem Laden der Daten einige Prüfungen durchzuführen: Wählen Sie und prüfen Sie manuell, ob sie Ihren Erwartungen entsprechen. Sie können z. B. ein paar zufällige Stichproben ausgeben, um zu sehen, ob das Label der in der Rezension verfassten Meinung entspricht. Diese Rezension haben wir nach dem Zufallsprinzip ausgewählt. aus dem IMDb-Dataset: „Eine 10-minütige Geschichte mehr als zwei Stunden. Als am selben Tag Ich hätte den Weg zur Hälfte verlassen sollen.“ Die erwartete Stimmung stimmt (negativ) überein. das Label der Stichprobe.
Wichtige Messwerte erfassen
Sobald Sie die Daten verifiziert haben, sammeln Sie die folgenden wichtigen Messwerte, bei der Charakterisierung Ihres Textklassifizierungsproblems:
Anzahl der Beispiele: Die Gesamtzahl der Beispiele in den Daten.
Anzahl der Kurse: Gesamtzahl der Themen oder Kategorien in den Daten
Anzahl der Proben pro Klasse: Anzahl der Proben pro Klasse (Thema/Kategorie) In einem ausgewogenen Dataset haben alle Klassen eine ähnliche Anzahl von Stichproben; in einem unausgeglichenen Dataset enthält die Anzahl der Stichproben in jeder Klasse variieren stark.
Anzahl der Wörter pro Probe: Medianwert der Wörter in einer Leseprobe
Häufigkeitsverteilung von Wörtern: Verteilung der Häufigkeit (Anzahl der Vorkommen) jedes Worts im Dataset.
Verteilung der Stichprobenlänge: Verteilung der Anzahl der Wörter pro Stichprobe im Dataset.
Sehen wir uns an, welche Werte diese Messwerte für das IMDb-Rezensions-Dataset haben. (In den Abbildungen 3 und 4 sind Diagramme der Worthäufigkeit und der Stichprobenlänge dargestellt. Verteilungen).
Messwertname | Messwert |
---|---|
Anzahl der Beispiele | 25.000 |
Anzahl der Kurse | 2 |
Anzahl der Beispiele pro Klasse | 12500 |
Anzahl der Wörter pro Leseprobe | 174 |
Tabelle 1: IMDb-Überprüfungen für Dataset-Messwerte
explore_data.py
enthält Funktionen, um
um diese Messwerte zu berechnen und zu analysieren. Hier einige Beispiele:
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()
Abbildung 3: Häufigkeitsverteilung von Wörtern für IMDb
Abbildung 4: Verteilung der Stichprobenlänge für IMDb