Сможете ли вы выжить на Титанике? Классическая задача Kaggle

глубокое обучение

Kaggle

Kaggle — это платформа, на которой специалисты по данным могут делиться данными, обмениваться идеями и конкурировать. Люди часто думают, что Kaggle не подходит для начинающих или что у него тернистый путь обучения.

правильный. Они представляют собой проблему для тех, кто только начинает, как вы и я. Будучи (младшим) специалистом по данным, я не мог не начать свое путешествие с поиска интересных наборов данных на Kaggle. Я узнал о наборе данных Титаника.

Титаник

Набор данных содержит информацию о пассажирах Титаника.

Я использую Python для визуализации и понимания набора данных. Я использовал scikit-learn для обучения набора классификаторов прогнозированию шансов человека на выживание. Затем используйте pickle, чтобы сохранить модель, и используйте Flask, чтобы развернуть ее как веб-приложение на локальном хосте. Наконец, я использую AWS для его размещения.

Код можно найти на GitHub.

1. Проверка данных

Перво-наперво. Я импортировал данные в DataFrame панд. Он включает личность пассажира, время выживания, класс билета, имя, пол, возраст, количество братьев и сестер и супругов на борту, количество родителей и детей на борту, номер билета, стоимость проезда, номер салона и порт посадки, первые 5 строк. данных Как показано.

Что можно сразу заметить, так это то, что: - каждая строкаPassengerIDвсе уникальны, -Survivedявляется целью, которую мы хотим вывести -Nameнаверное бесполезно -Ticketэто данные билета - еслиTicketОтсутствует помечается какNaN.

Для простоты решил пока отказатьсяTicketполе. Эти поля могут содержать полезную информацию, но для их извлечения требуется много инженерных функций. Начнем с самого простого первого шага.

С другой стороны, давайте подробнее рассмотрим недостающие данные. в переменнойEmbarkedиFareЕсть некоторые недостающие записи. С другой стороны, около 20% возрастов пассажиров не были зарегистрированы. Это может создать нам проблему, потому чтоAgeВероятно, один из ключевых предикторов в наборе данных. «Сначала женщины и дети» было кодексом поведения в то время, и отчеты показывают, что они действительно были спасены первыми.CabinБолее 77% записей отсутствуют и вряд ли будут полезны, так что давайте сначала избавимся от них.

2. Визуализация данных

Парные графики (не показаны ниже) обычно используются в начале задач визуализации данных, потому что они часто бывают полезными и требуют меньше кода. одна линияseaborn.pairplot()дает вам $n^2$ графиков (ровно $n(n+1)/2$ разных графиков), где n представляет количество переменных. Это дает вам общее представление о взаимосвязи между каждой парой переменных, а также о распределении каждой переменной. Давайте рассмотрим различные переменные.

Сначала проверьте целевую переменную и предиктор поэлементно.SurvivedОтношение. пройти черезseaborn.countplot(), мы обнаружили, что большинство людей попадает в третью категорию, что неудивительно, вообще говоря, у них меньше шансов выжить. Даже с этим единственным предиктором, все остальное неизвестно, мы можем сделать вывод, что у пассажиров первого класса больше шансов выжить, чем у пассажиров третьего класса.

В то же время у женщин и детей больше шансов выжить, что согласуется с вышеупомянутой теорией «женщины и дети в первую очередь». Если мы проверим только три переменныеPclass,SexиAge, молодые женщины-пассажиры первого класса, скорее всего, выживут.

Однако интерпретировать карты плотности может быть сложно.seaborn.kdeplot(). Для категорий «выживший» и «не выживший» они имеют широкий размах, тогда как категория «не выживший» имеет меньшие среднее значение и дисперсию. Стоит отметить, что в распределении по классу «Выживание» есть интересный попутный ветер, а именно три человека получают билеты первого класса по 512 долларов каждый. Все они поднялись на борт в порту Шербура и все выжили.

С другой стороны, посадка также, кажется, играет роль в определении того, кто выживает. Большинство высадились в порту Саутгемптона — первый этап путешествия, и у них были самые низкие показатели выживаемости. Может быть, им назначены каюты дальше от выхода, или, может быть, проведение большего количества времени в круизе может расслабить или утомить людей. Или это просто косвенно вызвано третьей переменной - например, меньшим количеством пассажиров женского/детского/первого класса, садящихся в первый порт. Требуется дальнейшее расследование.

Если вы предпочитаете таблицы вместо графиков, мы также можем передатьpandas.DataFrame.groupby()Визуализируйте данные и усредните каждый класс. Однако я не думаю, что следующееParchВ таблице есть четкая закономерность.

Зависит отseaborn.heatmap()Полученная матрица корреляции иллюстрирует силу корреляции между любыми двумя переменными. Как вы видете,SexиSurvivedимеет наибольшую корреляцию, в то время какFareиPclassВысокая корреляция.SibSpиParchКажется, это не играет большой роли в прогнозировании шансов человека на выживание, хотя наша интуиция говорит нам об обратном.

3. Отсутствует заполнение данных

Мы обнаружили, что многие элементы данных отсутствовали в нашей предыдущей проверке данных. Например, мы, похоже, не знаем, сколько 60-летний Томас Стори потратил на билеты. Интуиция подсказывает нам, что цена билета во многом зависит от класса билета и порта посадки, и мы можем провести перекрестную проверку с помощью приведенной выше корреляционной матрицы. Поэтому мы берем только среднее значение стоимости проезда в Саутгемптоне в третьем классе. Это всего лишь обоснованное предположение, и оно может быть ошибочным, но оно достаточно хорошее. Помните, что невозможно получить данные без шума, и модель машинного обучения должна быть устойчива к шуму.

Были также две женщины, мы не знали, что они сели на лодку. Класс билета тесно связан с ценой билета. Поскольку они оба заплатили 80 долларов за место в первом классе, я предполагаю, что в Шербуре (C на картинке).

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

То, что мы можем предположить на данный момент, уже угадано. Поскольку мы отказалисьCabin, и заполните другие отсутствующие записи, чтобы мы могли использовать все остальные переменные для вывода отсутствующих с помощью регрессора случайного леса.Age. 80% данных «обучения» могут вывести оставшиеся 20%.

4. Разработка функций

Хотя большинство из этих титулов — «мистер», «миссис» и «мисс», есть несколько менее распространенных титулов — «Доктор», «Священник», «Полковник» и т. д., некоторые из которых появляются только один раз. такие как «Мисс», «Дорнер», «Полковник» и т. д. Их редкие титулы не сильно помогают моделировать обучение. Чтобы найти закономерности, вам нужны данные. Давайте классифицировать эти относительно редкие названия как «редкие».

Категориальные данные требуют особой осторожности перед обучением модели. Классификатор не может обрабатывать строковые входные данные, такие как «мистер», «Саутгемптон» и т. д. Хотя мы можем сопоставить их с целыми числами, такими как («мистер», «мисс», «миссис», «редкий») → (1,2,3,4), не должно быть концепции ранга титула. Если ты врач, это не значит, что ты лучше. Чтобы не вводить машины в заблуждение и случайно не сконструировать сексистский ИИ, мы должны кодировать их в горячем режиме. Они становятся:

((1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1))

С другой стороны, я решил добавить две переменные —FamilySizeиIsAlone. Добавление FamilySize=SibSp+Parch+1 имеет больше смысла, так как вся семья будет оставаться вместе в круизе. Кроме того, одиночество может быть ключевым фактором. Вы можете быть более склонны к безрассудным решениям или быть более гибкими в случае бедствия, не заботясь о своей семье. Добавляя переменные по одной, я обнаружил, что их присутствие в модели улучшает общую предсказуемость.

5. Оценка модели

Я попробовал самые популярные известные мне классификаторы — Random Forest, SVM, KNN, AdaBoost и т. д.

XGBoost, наконец, выделяется точностью теста 87%. Чтобы повысить надежность классификатора, мы обучаем набор классификаторов с разными свойствами и получаем окончательный результат большинством голосов.

Наконец, я отправил его на Kaggle и получил точность 80%. неплохо. Всегда есть возможности для улучшения.

Например, в Cabin и Ticket определенно скрыта некоторая полезная информация, но мы опустили ее для простоты. Мы также можем создать больше функций

Но пока оставлю это в стороне.

6. Разверните как веб-приложение

В Python Flask представляет собой простой в использовании веб-фреймворк.

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return "<h1>Write something here.</h1>"
app.run(host='0.0.0.0', port=60000)

Вы можете просмотреть его на локальном хосте.

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

Мы будем использовать WTForms для создания формы в Python, одна форма определяется классом, который выглядит следующим образом:

from wtforms import Form, TextField, validators, SubmitField,  DecimalField, IntegerField, SelectField
class ReusableForm(Form):
sex = SelectField('Sex:',choices=[('1', 'Male'), ('0', 'Female') ],
                   validators=[validators.InputRequired()])
fare = DecimalField('Passenger Fare:',default=33,places=1,
                     validators=[validators.InputRequired(),
                                 validators.NumberRange(min=0,
                                                        max=512,
                                                          
                         message='Fare must be between 0 and 512')])
submit = SubmitField('Predict')

Я нашел HTML-шаблон от WillKoehrsen и построил его.

7. Облачный хостинг

Теперь веб-страницу можно просматривать через мой локальный хост, и все работает нормально. Последним этапом является онлайн-хостинг. В настоящее время существует три основных сервиса облачного хостинга — AWS, GCP и Azure. AWS, безусловно, самый популярный, поэтому я выбрал 12 месяцев бесплатного обслуживания.

Я использовал свой закрытый ключ для подключения к экземпляру сервера Linux, перенес свой репозиторий на сервер, запустил свой скрипт, и это сработало!

Не очень хорошо для меня...

Сводная станция блога о технологиях искусственного интеллекта Panchuang: http://docs.panchuang.net/PyTorch, официальная китайская учебная станция: http://pytorch.panchuang.net/OpenCV, официальный китайский документ: http://woshicver.com/