Прогноз виживання пасажирів Титаніка за допомогою Azure Machine Learning

Висловлюємо велике спасибі за підготовку статті Кирилу Малеву з компанії Merku. Кирило більше 3х років займається практичним застосуванням машинного навчання для різних обсягів даних. У компанії вирішує завдання в області передбачення відтоку клієнтів і обробки природної мови, велику увагу приділяючи комерціалізації отриманих результатів. Закінчив магістратуру Болонського університету та НГТУ
Привіт!

Сьогодні ми розповімо вам про те, як на практиці використовувати хмарну платформу Microsoft для вирішення завдань машинного навчання для вирішення завдань машинного навчання на прикладі популярної завдання передбачення вцілілих пасажирів Титаніка.

Ми все пам'ятаємо відому картинку про сову, тому в цій статті всі кроки докладно коментуються. Якщо вам не зрозумілий будь-який крок, ви можете задати питання в коментарях.




Big Data і машиннное навчання вже підходять до плато продуктивності, згідно свіжому звіту Gartner. Це означає, що на ринку є достатньо розуміння того, як застосовувати технології обробки великих даних і до цієї теми люди звикли більше, ніж до 3D друку органів або ідеї колонізації Марса.

На Хабрахабре вже публікувалися статті, які розповідають про використання хмарної платформи Azure для машинного навчання. Вони розповідають про те, як все влаштовано, як можна використовувати цю платформу і про її переваги і недоліки. Ми доповнимо цю колекцію двома практичними прикладами.

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

Ми почнемо знайомство з Azure ML з того, що візьмемо участь у найвідомішому з них: Titanic: Machine Learning from Disaster. Ми завантажимо дані, проаналізуємо їх за допомогою моделей мови R і вбудованих функцій Microsoft ML, отримаємо результати і завантажимо їх на Kaggle.

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

Основною метою цієї статті є саме використання функціональності хмарного рішення для вирішення задачі класифікації. Якщо вам не зрозумілий синтаксис або утримання коду на R, ви можете прочитати невелике введення в рішення задач аналізу даних на прикладі задачі Титаніка мовою R блоге Тревора Стівенса або пройти інтерактивний годинний курс на datacamp. Будь-які питання з приводу самих моделей вітаються в коментарях.

Починаємо працювати з хмарою

Для роботи з Azure потрібен обліковий запис Microsoft. Реєстрація займає 5 хвилин, до того ж, якщо ви ще не реєструвалися в Azure, то пильну увагу слід звернути на Microsoft BizSpark — програму підтримки стартапів, яка дає додаткові бонуси при реєстрації. Якщо ви не потрапляєте під умови цієї програми, то при реєстрації вам виділять пробні 200$, які можна витратити на будь-які ресурси хмари Azure. Для тестування Azure ML і повторення статті їх більш ніж достатньо.

При наявності облікового запису ви можете увійти розділ Azure ML.
Вибравши у списку служб Azure зліва Комп'ютерного навчання вам буде запропоновано створити робочу область (в якій знаходиться моделі і файли проектів, які називаються «експерименти»). До неї відразу необхідно підключити обліковий запис зберігання даних або створити нову. Вона потрібна для того, щоб зберігати проміжні результати обробки даних або вивантаження результатів.



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



І тут тих, хто звик вивчати нову платформу або фреймворк на прикладах чекає чудовий подарунок — готові приклади проектів, за допомогою яких можна швидко розібратися в тому, як працює сервіс. У разі виникнення проблем, відповіді на більшість питань можна знайти в зручній онлайн-документации. З практики роботи з Azure, всю потрібну інформацію можна знайти там.



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



Ці блоки, сполучені стрілочками — процес аналізу даних в даному проекті (або експерименті, якщо користуватися термінологією 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.
Модель, з якої ми почнемо буде виглядати набагато скромніше, ніж та, яка наведена в початковому прикладі:



В блок «Execute R Script» ми помістили код, який завантажує дані, виділяє нові властивості об'єктів навчає модель і робить прогноз. Єдиною альтернативою запуску скрипта на локальній машині було те, що ми замінили рядок

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

на

maml.mapOutputPort("my_solution")

щоб отримати можливість зберегти рішення в хмарі і потім завантажити його (про це розказано трохи нижче).

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



Отже, код працює, ми побачили які змінні були самими важливими для виживання пасажирів титаніка, але як же отримати результат і завантажити його на Kaggle?

За це відповідає перший вихід з блоку, в який ми поклали наші передбачення за допомогою рядка

maml.mapOutputPort("my_solution")

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



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



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

Використання засобів машинного навчання Azure

Тепер, коли ми трохи познайомилися з інтерфейсом і роботою Azure ML і переконалися, що все працює, можна використовувати більше вбудованих в хмару функцій для роботи з даними:



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



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



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

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

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

і після коду, який обробляє ознаки робимо вихід:

maml.mapOutputPort("all_data")

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



А умова розбиття на набір для навчання і тестовий набір буде виглядати наступним чином:



При цьому на виході 1 у нас буде тестовий набір (тому що для нього виконується умова розділення) а на виході 2 — для навчання.

Тепер ми готові оцінити за допомогою AUC критерію ефективність роботи вбудованих в хмару алгоритмів бінарної класифікації. За основу цього експерименту ми взяли приклад Compare Binary Classifiers.

Перевірка одного алгоритму виглядає наступним чином:



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

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



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

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



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



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



Вона використовує ті ж самі блоки, що і всі наші експерименти до цього. На вхід 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)] = "С"
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)



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


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.