La création et l'entraînement d'un modèle ne représentent qu'une partie du workflow. Compréhension les caractéristiques de vos données en amont vous permettra d'élaborer dans un modèle de ML. Cela pourrait simplement signifier obtenir une meilleure précision. Cela peut également signifier nécessite moins de données pour l'entraînement ou moins de ressources de calcul.
Charger l'ensemble de données
Tout d'abord, chargeons l'ensemble de données dans 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)))
Vérifier les données
Une fois les données chargées, il est recommandé d'effectuer quelques vérifications: choisissez une quelques échantillons et vérifier manuellement s'ils correspondent à vos attentes. Imprimez quelques échantillons aléatoires pour voir si l'étiquette de sentiment correspond au sentiment dans l'avis. Voici un avis que nous avons choisi au hasard de l'ensemble de données IMDb: "Dix minutes d'histoire étendent en moins de deux heures. Lorsque rien d'important n'était arrivé au à mi-chemin." Le sentiment attendu (négatif) correspond l'étiquette de l'échantillon.
Collecter des métriques clés
Une fois que vous avez vérifié les données, collectez les métriques importantes suivantes qui peuvent vous aider à définir votre problème de classification de texte:
Nombre d'échantillons: nombre total d'exemples contenus dans les données.
Nombre de cours: nombre total de thèmes ou de catégories dans les données.
Nombre d'échantillons par classe: nombre d'échantillons par classe (thème/catégorie). Dans un ensemble de données équilibré, toutes les classes ont un nombre similaire d'échantillons, Dans un ensemble de données déséquilibré, le nombre d'échantillons dans chaque classe varient considérablement.
Nombre de mots par échantillon: nombre médian de mots dans un échantillon.
Répartition des impressions: répartition indiquant la fréquence (nombre d'occurrences) de chaque mot dans l'ensemble de données.
Distribution de la longueur de l'échantillon: répartition indiquant le nombre de mots par échantillon de l'ensemble de données.
Voyons quelles sont les valeurs de ces métriques pour l'ensemble de données IMDb "reviews" (voir les figures 3 et 4 pour les graphiques sur la fréquence des mots et la longueur de l'échantillon). distributions).
Nom de la métrique | Valeur de métrique |
---|---|
Nombre d'exemples | 25 000 |
Nombre de classes | 2 |
Nombre d'échantillons par classe | 12500 |
Nombre de mots par échantillon | 174 |
Tableau 1: Métriques de l'ensemble de données IMDb examine
explore_data.py
contient des fonctions permettant
calculer et analyser ces métriques. Voici quelques exemples:
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()
Figure 3: Répartition des impressions pour IMDb
Figure 4: Répartition de la durée d'échantillon pour IMDb