Поиграем и познакомимся с TensorFlow

Зачастую попытаться что-то объяснить кому-то — неплохой метод разобраться в этом самому. Так что я приведу тут перевод небольшого мануальчика по TF и заодно попробую изучить его сам (должен же я чем-то более полезным чем ваяние страшного кода на Java заниматься, правда?)

Итак, что такое TensorFlow вообще? Это библиотека для машинного обучения, сделанная Гуглом, чтобы мы могли решать задачи построения и тренировки нейронной сети с целью автоматического нахождения и классификации образцов. Попробуем с помощью TF решить простую задачу — определим, насколько велика была вероятность выжить у пассажиров Титаника разного достатка, возраста, пола.

Установка

Писать будем на Python 3, много времени установка не займёт, нужно только 2 команды:

Ура, теперь можно приниматься за программирование!

Вводная задачи

Как мы помним, в первую очередь эвакуировали женщин и детей, пассажиров 1 класса и так далее. Очевидно, что изначально у Джека Доусона, которого сыграл ДиКаприо, шансов было немного :( Но можно узнать точное число!

На вход поступают данные вот такого формата:

Построение классификатора

Загрузка данных

Набор данных хранится в CSV-файле, его же в свою очередь можно достать с помощью TFLearn. Данные загрузим в list. Аргумент ‘target_column’ определяется для того, чтобы наши метки (выжил/не выжил) были в первой колонке (id:0). Функция вернет tuple: (data, labels).

Препроцессинг данных

Данные к нам прилетают “как есть”, поэтому нам необходимо их немного попрепроцессить (какое же противное слово, господи) обработать, чтобы потом мы могли использовать в нашем классификаторе.

Сперва выкинем поля которые нам явно не помогут в анализе — маловероятно, что имя пассажира этого рейса и вероятность его выжить как-то коррелировали друг с другом. Аналогично не пригодится и номер билета.

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

Функция препроцессинга при этом может выглядеть так:

Строим нейросеть

С помощью TFLearn построим трёхслойную нейросеть. Сперва нам необходимо определить форму наших данных. В нашем случае каждый пример имеет всего 6 параметров и мы будем их обрабатывать пачками (batch), чтобы не нагружать память. Таким образом наша форма данных будет [None, 6] (‘None’ используется для неизвестной размерности, но мы можем изменить на количество записей, которые процессятся в одной пачке).

Обучение

У TFLearn есть wrapper (обертка) для модели (‘DNN’ – Deep Neural Network) который автоматически выполняет задачи классификатора нейросети: обучение, предсказание и т.д. Запустим это на 10 эпох (то есть подсунем данные для нейросети 10 раз) с размером обрабатываемой пачки в 16 штук.

Кстати таким образом можно сразу определить, сколько шагов для обучения мы предпримем: если всего записей во входном наборе 1309 штук, то зная количество эпох и размер пачки: 1309/16*10 = 820

На выходе получим:

Посмотрите на значение acc — обучение завершилось с точностью около 78%. То есть, примерно с такой вероятностью наша модель и будет определять, выжил кто-то конкретный, или нет.

Опробуем модель

Настало время что-нибудь нашей модели отдать, чтобы она что-нибудь посчитала!

Сделаем модель двух персонажей из фильма — Джека и Розу, а потом посчитаем, какие же шансы на спасение у них были:

На выходе получим

10.6% и 81.6% — довольно ожидаемые результаты. Правда не забывайте, что Роза из-за своих приключений с Джеком эти проценты могла легко обнулить! 😉

А вот Gist, где можно достать пример целиком: https://gist.github.com/b00blik/f165fa1c01cdb621d537f6d031b08122