Шаг 2. Изучите свои данные

Построение и обучение модели — это только часть рабочего процесса. Заблаговременное понимание характеристик ваших данных позволит вам построить лучшую модель. Это может просто означать получение более высокой точности. Это также может означать, что для обучения требуется меньше данных или меньше вычислительных ресурсов.

Загрузите набор данных

Во-первых, давайте загрузим набор данных в 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: «История на десять минут растянулась на большую часть двух часов. Когда на полпути не произошло ничего существенного, я должен был уйти». Ожидаемая тональность (отрицательная) соответствует метке образца.

Соберите ключевые показатели

После проверки данных соберите следующие важные метрики, которые могут помочь охарактеризовать вашу проблему с классификацией текста:

  1. Количество образцов : общее количество примеров в данных.

  2. Количество классов : общее количество тем или категорий в данных.

  3. Количество образцов в классе : количество образцов в классе (тема/категория). В сбалансированном наборе данных все классы будут иметь одинаковое количество выборок; в несбалансированном наборе данных количество выборок в каждом классе будет сильно различаться.

  4. Количество слов в образце : среднее количество слов в одном образце.

  5. Частотное распределение слов : распределение, показывающее частоту (количество вхождений) каждого слова в наборе данных.

  6. Распределение длины выборки : Распределение, показывающее количество слов на выборку в наборе данных.

Давайте посмотрим, каковы значения этих показателей для набора данных обзоров 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()

Частотное распределение слов для IMDb

Рисунок 3: Частотное распределение слов для IMDb

Распределение длины выборки для IMDb

Рисунок 4: Распределение длины выборки для IMDb