Вы бы выжили на Титанике?

Титаник был известен как непотопляемый корабль и был самым большим и роскошным пассажирским судном своего времени. К сожалению, британский океанский лайнер затонул 15 апреля 1912 года, в результате чего погибло более 1500 человек, а выжило лишь 705 человек.

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

Описание столбцов набора данных

  • pclass: пассажирский класс (1 = 1-й; 2 = 2-й; 3 = 3-й)
  • выжил: выживаемость (0 = нет; 1 = да)
  • name: Имя
  • sex: секс
  • возраст: возраст
  • sibsp: количество братьев и сестер / супругов на борту.
  • parch: количество родителей / детей на борту
  • тариф: пассажирский тариф (британский фунт стерлингов).
  • Посадка: порт посадки (C = Шербур; Q = Квинстаун; S = Саутгемптон)
  • adult_male: мужчина 18 лет и старше (0 = нет, 1 = да)
  • палуба: палуба корабля.
  • кто: мужчина (18+), женщина (18+), ребенок (‹18)
  • жив: да, нет
  • embarked_town: порт посадки (Шербур, Квинстаун, Саутгемптон)
  • класс: пассажирский класс (1-й; 2-й; 3-й)
  • один: 1 = один, 0 = не один (на борту есть как минимум 1 брат, сестра, супруг (а), родитель или ребенок)

возраст

Возраст считается дробным, если он меньше 1. Если возраст оценен, он должен быть в форме xx.5

sibsp

Набор данных определяет семейные отношения следующим образом:

  • Сиблинг = брат, сестра, сводный брат, сводная сестра
  • Супруг = муж, жена (любовницы и женихи игнорировались)

пергамент

Набор данных определяет семейные отношения следующим образом:

  • Родитель = мать, отец
  • Ребенок = дочь, сын, падчерица, пасынок
    Некоторые дети путешествовали только с няней, поэтому для них parch = 0.

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

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

Начать программирование

Первое, что я люблю делать перед написанием единственной строчки кода, - это помещать в комментарии описание того, что делает код. Таким образом, я могу оглянуться на свой код и точно знать, что он делает.

# Description: This program predicts if a passenger will survive on the titanic

Теперь импортируйте пакеты / библиотеки, чтобы упростить написание программы.

#Import Libraries
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

Загрузите данные из пакета seaborn и выведите несколько строк.

#Load the data
titanic = sns.load_dataset('titanic')
#Print the first 10 rows of data
titanic.head(10)

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

Получите количество строк и столбцов в наборе данных. Обратите внимание, что каждая строка - это пассажир на борту корабля, а столбцы - это точки данных для каждого пассажира.

В наборе данных 891 строка / пассажира и 15 столбцов / точек данных.

#Count the number of rows and columns in the data set 
titanic.shape

Получите некоторую статистику по набору данных, такую ​​как количество, среднее значение, стандартное отклонение и т. Д.

После получения этой статистики я вижу, что максимальная цена / тариф, который пассажир заплатил за билет в этом наборе данных, составляла 512,3292 британских фунта, а минимальная цена / тариф составляла 0 британских фунтов.

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

Средний возраст составляет 29,699 лет, а самому старому пассажиру в этом наборе данных было 80 лет, а самому младшему было всего 0,42 года (около 5 месяцев).

titanic.describe()

Получите подсчет количества выживших на борту «Титаника» в этом наборе данных. Обратите внимание, что в этом наборе данных было больше пассажиров, которые не выжили (549), чем (343).

#Get a count of the number of survivors  titanic['survived'].value_counts()

Визуализируйте количество выживших на борту «Титаника» в этом наборе данных.

#Visualize the count of number of survivors
sns.countplot(titanic['survived'],label="Count")

Визуализируйте количество оставшихся в живых для столбцов who , sex , pclass , sibsp , parch , и embarked .

  • Из диаграмм ниже мы видим, что мужчина (мужчина 18 лет и старше) вряд ли выживет из диаграммы who.
  • Самки, скорее всего, выживут из таблицы sex.
  • Согласно диаграмме pclass, третий класс, скорее всего, не выживет.
  • Если у вас на борту нет братьев, сестер или супругов, вы вряд ли выживете в соответствии с таблицей sibsp.
  • Если у вас на борту нет родителей или детей, вы вряд ли выживете в соответствии с parch таблицей.
  • Если вы отправились из Саутгемптона (Южная), вы вряд ли выживете согласно embarked карте.

Затем я хочу взглянуть на выживаемость по полу.

Из приведенной ниже таблицы видно, что выжило около 74,2% самок и около 18,89% самцов.

#Look at survival rate by sex
titanic.groupby('sex')[['survived']].mean()

Посмотрите на коэффициент выживаемости по полу и классу.

Из сводной таблицы ниже мы видим, что выживаемость самок первого класса составила около 96,8%, что означает, что большинство из них выжило.

Самцы третьего класса имели самую низкую выживаемость - около 13,54%, что означает, что большинство из них не выжило.

#Look at survival rate by sex and class
titanic.pivot_table('survived', index='sex', columns='class')

Давайте визуализируем выживаемость по полу и классу.

#Look at survival rate by sex and class visually
titanic.pivot_table('survived', index='sex', columns='class').plot()

Визуализируйте выживаемость по классам с помощью столбчатой ​​диаграммы.

Чуть более 60% пассажиров первого класса выжили. Выжило менее 30% пассажиров третьего класса. Это означает, что выжило менее половины пассажиров третьего класса по сравнению с пассажирами первого класса.

#Plot the survival rate of each class.
sns.barplot(x='class', y='survived', data=titanic)

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

Обратите внимание, что в этом наборе данных самому старому человеку 80 лет, так что это будет наш возрастной предел.

Из приведенной ниже таблицы видно, что женщины в первом классе в возрасте 18 лет и старше имели самый высокий коэффициент выживаемости - 97,2973%, в то время как мужчины 18 лет и старше во втором классе имели самый низкий коэффициент выживаемости - 7,1429%.

#Look at survival rate by sex, age and class
age = pd.cut(titanic['age'], [0, 18, 80])
titanic.pivot_table('survived', ['sex', age], 'class')

Нанесите на график цены, уплаченные для каждого класса.

Проверьте, какие столбцы содержат пустые значения (NaN, NAN, na). Похоже, в столбцах age, embarked, deck и embarked_town отсутствуют некоторые значения.

Во всех остальных столбцах отсутствуют значения.

#Count the empty (NaN, NAN, na) values in each column titanic.isna().sum()

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

#Look at all of the values in each column & get a count 
for val in titanic:
   print(titanic[val].value_counts())
   print()

Затем я удалю лишние столбцы, которые не являются числовыми, и удаляю строки с пропущенными значениями.

Я также решил удалить столбец с именем deck, потому что в нем отсутствуют 688 строк данных, что означает, что 688/891 = 77,22% данных для этого столбца отсутствуют.

# Drop the columns
titanic = titanic.drop(['deck', 'embark_town', 'alive', 'class', 'alone', 'adult_male', 'who'], axis=1)

#Remove the rows with missing values
titanic = titanic.dropna(subset =['embarked', 'age'])

Теперь давайте посмотрим на новое количество строк и столбцов в наборе данных Titanic.

#Count the NEW number of rows and columns in the data set
titanic.shape

Посмотрите на типы данных, чтобы увидеть, какие столбцы нужно преобразовать / закодировать в число. Похоже, что столбцы sex и embarked - единственные два столбца, которые необходимо преобразовать.

titanic.dtypes

Выведите уникальные значения нечисловых данных.

#Print the unique values in the columns
print(titanic['sex'].unique())
print(titanic['embarked'].unique())

Измените нечисловые данные на числовые и распечатайте новые значения.

#Encoding categorical data values (Transforming object data types to integers)
from sklearn.preprocessing import LabelEncoder
labelencoder = LabelEncoder()

#Encode sex column
titanic.iloc[:,2]= labelencoder.fit_transform(titanic.iloc[:,2].values)
#print(labelencoder.fit_transform(titanic.iloc[:,2].values))

#Encode embarked
titanic.iloc[:,7]= labelencoder.fit_transform(titanic.iloc[:,7].values)
#print(labelencoder.fit_transform(titanic.iloc[:,7].values))

#Print the NEW unique values in the columns
print(titanic['sex'].unique())
print(titanic['embarked'].unique())

Разделите данные на независимые «X» и зависимые «Y» наборы данных.

#Split the data into independent 'X' and dependent 'Y' variables
X = titanic.iloc[:, 1:8].values 
Y = titanic.iloc[:, 0].values 

Снова разделите данные, на этот раз на наборы данных 80% обучения (X_train и Y_train) и 20% тестирования (X_test и Y_test).

# Split the dataset into 80% Training set and 20% Testing set
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 0)

При желании мы можем масштабировать данные, это означает, что данные будут в определенном диапазоне, например 0–100 или 0–1.

#Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

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

Получите и обучите все модели и сохраните их в переменной model.

Модель, которая была наиболее точной на данных обучения, была классификатором дерева решений с точностью 99,29%, согласно рис.16.

#Get and train all of the models
model = models(X_train,Y_train)

Покажите матрицу неточностей и точность для всех моделей на тестовых данных.

Модель, которая была наиболее точной на тестовых данных, - это модель в позиции 0, которая является моделью логистической регрессии с точностью 81,11%, согласно рис. 18.

  • Ложно-положительный результат (FP) = результат теста, который неверно указывает на наличие определенного условия или атрибута.
  • Истинно положительный результат (TP) = Чувствительность (также называемая истинно положительным уровнем или вероятностью обнаружения в некоторых полях), измеряет долю фактических положительных результатов, которые правильно определены как таковые. .
  • Истинно отрицательные (TN) = специфичность (также называемая истинно отрицательным показателем), измеряет долю фактических отрицательных результатов, которые правильно идентифицированы как таковые.
  • Ложноотрицательный (FN) = результат теста, который указывает на то, что условие не выполняется, хотя на самом деле оно выполняется. Например, результат теста, указывающий на то, что человек не выживает, хотя он действительно выживает.

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

Я выбрал эту модель, потому что она показала второй результат по данным обучения и тестирования и имеет точность 80,41% по данным тестирования и 97,53% по данным обучения.

Теперь мы можем получить важные функции.

Визуализируйте важные особенности.

#Visualize the importance
importances.plot.bar()

Распечатайте прогнозы модели случайного лесного классификатора для каждого пассажира, а под ним выведите фактические значения. Помните, что «1» означает, что пассажир выжил, а «0» означает, что пассажир не выжил.

Распечатав оба, мы можем визуально увидеть, насколько хорошо модель работает на тестовых данных, но помните, что модель была 80,41% точной на тестовых данных.

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

Я создам переменную с именем my_survival.

  • В нем у меня будет pclass = 3, что означает, что я, вероятно, попал бы в третий класс из-за более низкой цены.
  • Я мужчина, поэтому sex = 1.
  • Мне больше 18 лет, поэтому поставлю age = 21.
  • Скорее всего, я бы не был на корабле с братьями и сестрами или супругами, поэтому sibsp = 0.
  • Ни с детьми, ни с родителями, поэтому parch = 0 .
  • Я бы постарался заплатить минимальную плату за проезд, так что fare = 0.
  • Я бы сел из Квинстауна, так что embarked = 1.

Помещение этих значений в массив дает мне [3,1,21,0, 0, 0, 1]. Но, чтобы поместить это в метод прогнозирования модели, это должен быть список списков или 2D-массив, например [[3,1,21,0, 0, 0, 1]].

Похоже, я бы не выжил на Титанике, если бы был на борту.

Заключение и ресурсы

Вот и все, вы закончили создавать свою программу, чтобы предсказать, выживет ли пассажир на Титанике или нет!

Опять же, если хотите, можете посмотреть и послушать, как я объясняю весь код в моем YouTube-видео .

Если вам интересно узнать больше о машинном обучении, чтобы сразу приступить к работе с проблемами и примерами, я рекомендую вам прочитать Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем.

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

Спасибо, что прочитали эту статью, надеюсь, она вам помогла!

Другие источники

  1. Навстречу науке о данных: прогнозирование выживания пассажиров Титаника.
  2. Titanic Datasets.
  3. Справочник по науке о данных Python.