Нейросеть, Которая Поможет Выбрать Фильм – «Ваши Вкусы Специфичны»

Привет! Иногда смотришь фильм, а в голове только один вопрос: «Опять я попался на кликбейтЭ» Давайте решим эту проблему и будем смотреть только хорошие фильмы.

Предлагаю немного поэкспериментировать с данными и написать простую нейросеть для оценки фильма.

Наш эксперимент основан на технологии анализа настроений, позволяющей определить настроение аудитории по отношению к продукту.

В качестве данных мы берем датасет пользовательских обзоров фильмов IMDb. Среда разработки Google Colab позволит быстро обучить нейронную сеть благодаря бесплатному доступу к графическому процессору (NVidia Tesla K80).

Я использую библиотеку Keras, с помощью которой построю универсальную модель для решения подобных задач машинного обучения.

Мне понадобится серверная часть TensorFlow, версия по умолчанию в Colab 1.15.0, поэтому давайте просто обновимся до 2.0.0.

  
  
  
  
  
  
  
  
  
  
   

from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf !tf_upgrade_v2 -h

Далее импортируем все необходимые модули для предварительной обработки данных и построения модели.

Предыдущие статьи посвящены библиотекам, вы можете посмотреть там.



%matplotlib inline import matplotlib import matplotlib.pyplot as plt



import numpy as np from keras.utils import to_categorical from keras import models from keras import layers from keras.datasets import imdb



Анализ данных IMDb



Нейросеть, которая поможет выбрать фильм – «ваши вкусы специфичны»

Набор данных IMDb состоит из 50 000 обзоров фильмов от пользователей, помеченных как положительные (1) и отрицательные (0).

  • Отзывы предварительно обрабатываются, и каждый из них кодируется последовательностью индексов слов в виде целых чисел.

  • Слова в обзорах индексируются по общей частоте их появления в наборе данных.

    Например, целое число «2» кодирует второе наиболее часто используемое слово.

  • 50 000 отзывов, разделенных на две группы: 25 000 для обучения и 25 000 для тестирования.

Загружаем набор данных, встроенный в Keras. Так как данные на обучающие и тестовые разделены в соотношении 50-50, я объединим их, чтобы в дальнейшем разделить на 80-20.

from keras.datasets import imdb (training_data, training_targets), (testing_data, testing_targets) = imdb.load_data(num_words=10000) data = np.concatenate((training_data, testing_data), axis=0) targets = np.concatenate((training_targets, testing_targets), axis=0)



Исследование данных

Давайте посмотрим, с чем мы работаем.



print("Categories:", np.unique(targets)) print("Number of unique words:", len(np.unique(np.hstack(data))))



Нейросеть, которая поможет выбрать фильм – «ваши вкусы специфичны»



length = [len(i) for i in data] print("Average Review length:", np.mean(length)) print("Standard Deviation:", round(np.std(length)))



Нейросеть, которая поможет выбрать фильм – «ваши вкусы специфичны»

Вы можете видеть, что все данные делятся на две категории: 0 или 1, что отражает настроение обзора.

Весь датасет содержит 9998 уникальных слов, средний размер отзыва — 234 слова со стандартным отклонением 173. Давайте посмотрим на первый отзыв из этого набора данных, который отмечен как положительный.



print("Label:", targets[0]) print(data[0])



Нейросеть, которая поможет выбрать фильм – «ваши вкусы специфичны»



index = imdb.get_word_index() reverse_index = dict([(value, key) for (key, value) in index.items()]) decoded = " ".

join( [reverse_index.get(i - 3, "#") for i in data[0]] ) print(decoded)



Нейросеть, которая поможет выбрать фильм – «ваши вкусы специфичны»



Подготовка данных

Пришло время подготовить данные.

Нам нужно векторизовать каждый отзыв и заполнить его нулями, чтобы вектор содержал ровно 10 000 чисел.

Это означает, что мы заполняем нулями каждый отзыв длиной более 10 000 слов.

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

Вам также необходимо преобразовать переменные в тип float.

def vectorize(sequences, dimension = 10000): results = np.zeros((len(sequences), dimension)) for i, sequence in enumerate(sequences): results[i, sequence] = 1 return results data = vectorize(data) targets = np.array(targets).

astype("float32")

Далее я разделяю набор данных на обучающие и тестовые данные, как и было согласовано, 4:1.

test_x = data[:10000] test_y = targets[:10000] train_x = data[10000:] train_y = targets[10000:]



Создаем и обучаем модель

Делать особо нечего, осталось только написать модель и обучить ее.

Начать следует с выбора типа.

В Keras доступны два типа моделей: последовательный и функциональный API. Затем вам нужно добавить входные, скрытые и выходные слои.

Чтобы предотвратить переобучение, мы будем использовать отсев между ними.

На каждом слое используется функция «плотность» для полного соединения слоев друг с другом.

В скрытых слоях мы будем использовать функцию активации «relu»; это почти всегда приводит к удовлетворительным результатам.

На выходном слое мы используем сигмовидную функцию, которая перенормирует значения в диапазоне от 0 до 1. Я использую оптимизатор «Адам», он будет менять веса в процессе тренировки.

Мы используем двоичную кросс-энтропию в качестве функции потерь и точность в качестве показателя оценки.

Теперь мы можем обучить нашу модель.

Мы сделаем это с размером пакета 500 и всего тремя эпохами, поскольку было обнаружено, что модель начинает переобучаться, если она обучается дольше.



model = models.Sequential() # Input - Layer model.add(layers.Dense(50, activation = "relu", input_shape=(10000, ))) # Hidden - Layers model.add(layers.Dropout(0.3, noise_shape=None, seed=None)) model.add(layers.Dense(50, activation = "relu")) model.add(layers.Dropout(0.2, noise_shape=None, seed=None)) model.add(layers.Dense(50, activation = "relu")) # Output- Layer model.add(layers.Dense(1, activation = "sigmoid")) model.summary() # compiling the model model.compile( optimizer = "adam", loss = "binary_crossentropy", metrics = ["accuracy"] ) results = model.fit( train_x, train_y, epochs= 3, batch_size = 500, validation_data = (test_x, test_y) ) print("Test-Accuracy:", np.mean(results.history["val_acc"]))



Нейросеть, которая поможет выбрать фильм – «ваши вкусы специфичны»



Заключение

Мы создали простую нейронную сеть с шестью слоями, которая может вычислять настроения рецензентов фильмов с точностью 0,89. Конечно, вам не обязательно писать нейронную сеть, чтобы смотреть отличные фильмы, но это был всего лишь еще один пример того, как вы можете использовать данные и получать от них пользу, потому что именно для этого они и нужны.

Нейронная сеть универсальна благодаря простоте своей структуры; изменив некоторые параметры, можно адаптировать его под совершенно разные задачи.

Не стесняйтесь писать свои идеи в комментариях.

Теги: #Машинное обучение #python #нейронные сети #Большие данные #Визуализация данных #наука о данных #Интеллектуальный анализ данных #комментарии

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.