Построение и обучение модели — это только одна часть рабочего процесса. Предварительное понимание характеристик ваших данных позволит вам построить лучшую модель. Это может просто означать получение более высокой точности. Это также может означать, что для обучения потребуется меньше данных или меньше вычислительных ресурсов.
Загрузите набор данных
Прежде всего давайте загрузим набор данных в 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)))
Проверьте данные
После загрузки данных рекомендуется выполнить некоторые проверки : выбрать несколько образцов и вручную проверить, соответствуют ли они вашим ожиданиям. Например, напечатайте несколько случайных образцов, чтобы увидеть, соответствует ли метка настроения настроению обзора. Вот обзор, который мы случайно выбрали из набора данных IMDb: «Десять минут истории растянулись на большую часть двух часов. Когда на полпути не произошло ничего существенного, мне следовало уйти». Ожидаемое настроение (негативное) соответствует метке образца.
Собирайте ключевые показатели
После проверки данных соберите следующие важные показатели, которые помогут охарактеризовать вашу проблему классификации текста:
Количество образцов : общее количество примеров, имеющихся в данных.
Количество классов : общее количество тем или категорий в данных.
Количество образцов в классе : количество образцов в классе (тема/категория). В сбалансированном наборе данных все классы будут иметь одинаковое количество образцов; в несбалансированном наборе данных количество образцов в каждом классе будет сильно различаться.
Количество слов в образце : Среднее количество слов в одном образце.
Частотное распределение слов : распределение, показывающее частоту (количество появлений) каждого слова в наборе данных.
Распределение длины выборки : распределение, показывающее количество слов на выборку в наборе данных.
Давайте посмотрим, каковы значения этих показателей для набора данных обзоров IMDb (графики распределения частоты слов и длины выборки см. на рисунках 3 и 4 ).
Название метрики | Значение показателя |
---|---|
Количество образцов | 25000 |
Количество классов | 2 |
Количество образцов на класс | 12500 |
Количество слов в образце | 174 |
Таблица 1. IMDb анализирует показатели наборов данных
explore_data.py
содержит функции для расчета и анализа этих показателей. Вот несколько примеров:
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()
Рисунок 3: Частотное распределение слов для IMDb
Рисунок 4: Распределение длины выборки для IMDb