Предсказание выживания пассажиров Титаника при помощи Azure Machine Learning

Выражаем большое спасибо за подготовку статьи Кириллу Малеву из компании Merku. Кирилл больше 3х лет занимается практическим применением машинного обучения для разных объёмов данных. В компании решает задачи в области предсказания оттока клиентов и обработки естественного языка, большое внимание уделяя коммерциализации полученных результатов. Закончил магистратуру Болонского университета и НГТУ


Привет!

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

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

1mtr7x_1ufku60i6hn023937t

Big Data и машиннное обучение уже подходят к плато продуктивности, согласно свежему отчёту Gartner. Это значит, что на рынке есть достаточно понимания того, как применять технологии обработки больших данных и к этой теме люди привыкли больше, чем к 3D печати органов или идеи колонизации Марса.

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

В обоих примерах мы воспользуемся платформой соревнований Data Scientist'ов Kaggle. Kaggle — это место, на котором компании выкладывают данные, обозначают проблемы, которые они хотели бы решить, после чего инженеры со всего мира соревнуются в точности решения задач. Как правило, за лучшие результаты победители при публикации своего решения получают денежные призы.
При этом на Kaggle помимо коммерческих соревнований также есть разобранные задачи с предоставленными данными, которые используются для обучения. Для них в качестве приза напрямую указывается «знание» и эти соревнования не завершаются.

Мы начнём знакомство с Azure ML с того, что поучаствуем в самом известном из них: Titanic: Machine Learning from Disaster. Мы загрузим данные, проанализируем их при помощи моделей языка R и встроенных функций Azure ML, получим результаты и загрузим их на Kaggle.

Будем двигаться от простого к сложному: сначала получим результат анализа данных при помощи кода на R, потом воспользуемся средствами анализа встроенными в саму платформу. Решение на R приведено в конце статьи под катом и оно специально основано на официальных обучающих материалах Kaggle, чтобы новички могли при желании ознакомиться с тем, как они могут получить точно такие же результаты from scratch.

Основной целью этой статьи является именно использование функциональности облачного решения для решения задачи классификации. Если вам не понятен синтаксис или содержание кода на R, вы можете прочитать небольшое введение в решение задач анализа данных на примере задачи Титаника на языке R в блоге Тревора Стивенса или пройти интерактивный часовой курс на datacamp. Любые вопросы по поводу самих моделей приветствуются в комментариях.

Начинаем работать с облаком


Для работы с Azure необходима учётная запись Microsoft. Регистрация занимает 5 минут, вдобавок, если вы ещё не регистрировались в Azure, то пристальное внимание следует обратить на Microsoft BizSpark — программу поддержки стартапов, которая даёт расширенные бонусы при регистрации. Если вы не попадаете под условия этой программы, то при регистрации вам выделят пробные 200$, которые можно потратить на любые ресурсы облака Azure. Для тестирования Azure ML и повторения статьи их более чем достаточно.

При наличии учётной записи вы можете войти в раздел Azure ML.
Выбрав в списке служб Azure слева «Машинное обучение» вам будет предложено создать рабочую область (в которой будут находится модели и файлы проектов, которые называются «эксперименты»). К ней сразу необходимо подключить учётную запись хранения данных или создать новую. Она нужна для того, чтобы хранить промежуточные результаты обработки данных или выгрузки результатов.

q0b12wuzfcvlxknx_eibr1yb

После создания рабочей области в ней можно будет создать проект. Для этого нужно будет нажать кнопку «создать»:

ds8boykokmu_s7pw5nmks4f-

И тут тех, кто привык изучать новую платформу или фреймворк на примерах ждёт отличный подарок — готовые примеры проектов, с помощью которых можно быстро разобраться в том, как работает сервис. В случае возникновения проблем, ответы на большинство вопросов можно найти в удобной онлайн-документации. По практике работы с Azure, всю нужную информацию действительно можно найти там.

202vu4bi-mznw_j85_llj01u-

В библиотеке готовых экспериментов есть пример запуска модели на R, который выглядит так:

1szsf5lc1_gxr1ln1fjtp03tq

Эти блоки, соединённые стрелочками — процесс анализа данных в данном проекте (или эксперименте, если пользоваться терминологией Azure ML). Использование этой визуалиазации значительно облегчает понимание анализа данных и методологии CRISP-DM.

Суть этой методологии состоит в следующем:

  1. Данные загружаются в среду
  2. Из данных выбираются/создаются полезные признаки
  3. Модель обучается на выбранных признаках
  4. Используя отдельный набор данных качество модели оценивается
  5. Если качество неудовлетворительно, то повторяются шаги 2-4, если удовлетворительно, то модель используется по назначению.


Для нашей статьи в диалоге создания эксперимента мы выберем самый первый вариант «Blank Experiment», а потом перенесли на рабочую область 2 блока: «Execute R Script» из раздела «R language models» слева и «Writer» из Data Input And Output.
Модель, с которой мы начнём будет выглядеть гораздо скромнее, чем та, которая приведена в начальном примере:

1q5ml2z2wnotn_d9drllirf8e

В блок «Execute R Script» мы поместили код, который скачивает данные, выделяет новые свойства объектов обучает модель и делает предсказание. Единственной альтернативой запуска скрипта на локальной машине было то, что мы заменили строчку

write.csv(my_solution,file="my_solution.csv" , row.names=FALSE) 


на

maml.mapOutputPort("my_solution")


чтобы получить возможность сохранить решение в облаке и потом скачать его (об этом рассказано чуть ниже).

В конце R кода у нас была строчка, которая показывает важность различных параметров. Вывод скриптов доступен во втором «выходе» (цифра «2» на скриншоте) из блока по нажатию на пункт меню «Vizualize»:

t4e6f_56pg000zxupy64kgm0

Итак, код работает, мы увидели какие переменные являлись самыми важными для выживания пассажиров титаника, но как же получить результат и загрузить его на Kaggle?

За это отвечает первый выход из блока, в который мы положили наши предсказания при помощи строчки

maml.mapOutputPort("my_solution")


Она позволяет перенаправить выход из кода R на объект Writer, который запишет наш набор данных в хранилище данных. В качестве настроек мы указали имя хранилища, которое использует наш эксперимент (habrahabrdata1) и путь к контейнеру, в который мы хотели записать наш результат: saved-datasets/kaggle-R-titanic-dataset.csv

1v8ck2__hzuadx5tsl-d-mg42

Для удобства мы заранее создали это отдельное хранилище, чтобы не потерять данные среди служебных данных Azure ML (их можно просмотреть в хранилище experimentouput). Кстати, обратите внимание, что при создании хранилища нельзя использовать знаки подчёркивания «_» или заглавные буквы.

1av562vfoug-nwu759lgh930f

Предсказания нашей модели скачиваются сразу в csv-формате из службы облачного хранилища. При отправке этой модели мы получили результат: 0.78469

Использование средств машинного обучения Azure

Теперь, когда мы немного познакомились с интерфейсом и работой Azure ML и убедились, что всё работает, можно использовать больше встроенных в облако функций для работу с данными:

1lpad0pofn78k6smbse42_b7a

Для начала мы загрузим в облако данные для обучения и оценки результатов. Для этого переходим в раздел «Datasets» и загружаем предварительно скачанные .csv файлы:

1ckp4oe-k970m3wh_ognsysbu

В результате наши наборы данных будут выглядеть вот так:

1-axjzrmjkv71_4c6-20gzdls

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

Двигаемся от простого к сложному: теперь код на R будет отвечать только за обработку данных. Загрузку данных и разделение на набор для обучения и оценки качества мы сделаем при помощи облака.
Для этого мы дописываем две строчки в начало скрипта:

train <- maml.mapInputPort(1) # class: data.frame
test <- maml.mapInputPort(2) # class: data.frame


и после кода, который обрабатывает признаки делаем выход:

maml.mapOutputPort("all_data")


Теперь базовая схема экспримента будет выглядеть вот так:

1xlic-p873x2xyea97p2_6e8n

А условие разбиения на набор для обучения и тестовый набор будет выглядеть следующим образом:

77-tqu-oivw__9uin7lhww19

При этом на выходе 1 у нас будет тестовый набор (потому что для него выполняется условие разбиения) а на выходе 2 — для обучения.

Теперь мы готовы оценить при помощи AUC критерия эффективность работы встроенных в облако алгоритмов бинарной классификации. За основу этого эксперимента мы взяли пример Compare Binary Classifiers.

Проверка одного алгоритма выглядит следующим образом:

1r6moi3e1-_cg7x8ze9i45e5-

Каждый алгоритм получает на вход часть выборки kaggle_titanic_train для подбора наилучших параметров алгоритмов. Эти параметры перебираются при помощи блока Sweep Parameters (подробнее про него можно прочитать в статье про перебор параметров), который позволяет перебирать все параметры в заданном диапазоне, по сетке всех параметров или использоваться случайный проход. В настройках Sweep Parameters можно задать критерий оценки. Зададим AUC, как более подходящий для нас критерий.

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

1sluv1q5xu45b5zuq375hzkuv

Кликнув на первый выход из последнего блока «Execute R script» получим результат:

Наилучший результат показал Two-Class SVM. Можем посмотреть на лучшие параметры, кликнув по выходу из блока Sweep Parameters:

3f7rcgpo852gzk_38504bnhq

В результате для определения того, выживут пассажиры или нет на тестовых данных, мы можем запускать модель с оптимальными параметрами:

vydnrak_z747cpe3c0egn987

После создания эксперимента с определением лучшей модели, новая модель будет выглядеть довольно просто:

t5bjtz__3597wni3qgdzgnnd

Она использует те же самые блоки, что и все наши эксперименты до этого. На вход Train Model модель получает весь набор данных kaggle_titanic_train, а для оценки (предсказания) используется блок Score Model, на который направляется набор данных kaggle_titanic_test со всеми нужными признаками (который мы посчитали при помощи R). Затем из всего набора оставляются только колонки с ID пассажира и предсказанием выживет он или нет и результат сохраняется в Blob storage.

При отправке результатов этой модели на Kaggle получается значение 0.69856, что меньше значения, которое мы получили, используя метод решающих деревьев, делая всю работу в R.

Однако, если обучить аналогичный алгоритм из Azure ML (Two Class Decision Forest) со схожими параметрами (количество деревьев: 100), то при отправке результата на Kaggle он улучшится на 0.00957 и будет равен 0.79426.

Таким образом, «волшебный» перебор параметров не отменяет более тщательного ручного поиска и работы эксперта, который может получить лучшие результаты.

Заключение

Мы рассмотрели возможность использования облачной среды Azure ML для участия в соревнованиях по анализу данных Kaggle: как и в качестве среды для выполнения кода на R, так и с частичным использованием встроенных средств облака (оставив на R первичную обработку и генерацию новых признаков).

Эту среду вполне можно использовать для применения машинного обучения, тем более, когда результаты анализа нужно оставлять в кластере Hadoop (Microsoft предоставляет свою реализацию) или публиковать в виде веб-сервиса.

В случае положительного отклика, мы также опубликуем в этом блоге настолько же подробный пример публикации модели машинного обучения в виде веб-сервиса.

Полное решение задачи на R

# All data, both training and test set

# Assign the training set
train <- read.csv(url("http://s3.amazonaws.com/assets.datacamp.com/course/Kaggle/train.csv"))

# Assign the testing set
test <- read.csv(url("http://s3.amazonaws.com/assets.datacamp.com/course/Kaggle/test.csv"))

test$Survived <- NA
all_data = rbind (train,test)

# Passenger on row 62 and 830 do not have a value for embarkment. 
# Since many passengers embarked at Southampton, we give them the value S.
# We code all embarkment codes as factors.
all_data$Embarked[c(62,830)] = "S"
all_data$Embarked <- factor(all_data$Embarked)

# Passenger on row 1044 has an NA Fare value. Let's replace it with the median fare value.
all_data$Fare[1044] <- median(all_data$Fare, na.rm=TRUE)

#Getting Passenger Title
all_data$Name <- as.character(all_data$Name)
all_data$Title <- sapply(all_data$Name, FUN=function(x) {strsplit(x, split='[,.]')[[1]][2]})
all_data$Title <- sub(' ', '', all_data$Title)
all_data$Title[all_data$Title %in% c('Mme', 'Mlle')] <- 'Mlle'
all_data$Title[all_data$Title %in% c('Capt', 'Don', 'Major', 'Sir')] <- 'Sir'
all_data$Title[all_data$Title %in% c('Dona', 'Lady', 'the Countess', 'Jonkheer')] <- 'Lady'
all_data$Title <- factor(all_data$Title)

all_data$FamilySize <- all_data$SibSp + all_data$Parch + 1

library(rpart)


# How to fill in missing Age values?
# We make a prediction of a passengers Age using the other variables and a decision tree model. 
# This time you give method="anova" since you are predicting a continuous variable.
predicted_age <- rpart(Age ~ Pclass + Sex + SibSp + Parch + Fare + Embarked + Title + FamilySize,
                       data=all_data[!is.na(all_data$Age),], method="anova")
all_data$Age[is.na(all_data$Age)] <- predict(predicted_age, all_data[is.na(all_data$Age),])

# Split the data back into a train set and a test set
train <- all_data[1:891,]
test <- all_data[892:1309,]

library(randomForest) 
# Train set and test set 
str(train) 
str(test) 
# Set seed for reproducibility 
set.seed(111) 
# Apply the Random Forest Algorithm 
my_forest <- randomForest(as.factor(Survived) ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked + FamilySize + Title, data=train, importance = TRUE, ntree=1000) 
# Make your prediction using the test set 
my_prediction <- predict(my_forest, test, "class") 
# Create a data frame with two columns: PassengerId & Survived. Survived contains your predictions 
my_solution <- data.frame(PassengerId = test$PassengerId, Survived = my_prediction) 
# Write your solution away to a csv file with the name my_solution.csv 
write.csv(my_solution,file="my_solution.csv" , row.names=FALSE) 

varImpPlot(my_forest)


Список литературы

© Habrahabr.ru