Испытание

Предсказать, выжил бы пассажир Титаника или нет

Данные

Этапы рабочего процесса

Рабочий процесс конкурентного решения проходит семь этапов, описанных в книге Data Science Solutions.

1. Вопрос или определение проблемы
2. Обработка, подготовка, очистка данных
3. Исследовательский анализ данных
4. Сбор данных для обучения и тестирования
5. Моделирование, прогнозирование и решение проблема

1. Вопрос или определение проблемы

Соревнование простое: используйте данные пассажиров «Титаника» (имя, возраст, стоимость билета и т. д.), чтобы попытаться предсказать, кто выживет, а кто умрет. Это бинарная классификация.

Двоичная классификация — это задача классификации элементов множества на две группы на основе правила классификации.

Печать первых 5 строк набора данных.

train_df.head(5)

Значения во втором столбце ("Выжил") можно использовать, чтобы определить, выжил ли каждый пассажир:

  • если это «1», пассажир выжил.
  • если «0», пассажир умер.

2. Поспорить, подготовить, очистить данные

Вот мой рабочий процесс для очистки данных. Я не буду показывать здесь весь шаг, вы можете проверить мой Kaggle для получения полного кода. Проверьте мои Kaggle и GitHub, чтобы взглянуть на все мои проекты🍀

Дублирующиеся записи

#Find the number duplicate record
print('train_df - Number of duplicate Record:', train_df.duplicated().sum())

print('test_df - Number of duplicate Record:', test_df.duplicated().sum())

train_df — количество повторяющихся записей: 0
test_df — количество повторяющихся записей: 0

Отсутствующие значения

#Find the number of null per each columns
print('Columns in train_df with null values:\n')
print(train_df.isnull().sum())
print("-"*30)

print('Columns in test_df with null values:\n')
print(test_df.isnull().sum())
print("-"*30)

Возраст: содержит 177 пустых значений из 891 записи. Вменено с медианными значениями для возраста по наборам комбинаций признаков Pclass и Gender.

for dataset in combine:
    for i in range(0, 2):
        for j in range(0, 3):
            guess_df = dataset[(dataset['Sex'] == i) & (dataset['Pclass'] == j+1)]['Age'].dropna()

            # age_mean = guess_df.mean()
            # age_std = guess_df.std()
            # age_guess = rnd.uniform(age_mean - age_std, age_mean + age_std)

            age_guess = guess_df.median()

            # Convert random age float to nearest .5 age
            guess_ages[i,j] = int( age_guess/0.5 + 0.5 ) * 0.5
            
    for i in range(0, 2):
        for j in range(0, 3):
            dataset.loc[ (dataset.Age.isnull()) & (dataset.Sex == i) & (dataset.Pclass == j+1),'Age'] = guess_ages[i,j]

    dataset['Age'] = dataset['Age'].astype(int)

Embarked: содержит 2 пустых значения. Вмененный режим обучающих данных.

#Fill the null value of Embarked with the most common occurance

for dataset in combine:
    dataset['Embarked'] = dataset['Embarked'].fillna(freq_port)

Тариф: содержит 1 пустое значение. Вменено со средним значением обучающих данных.

for dataset in combine:
    dataset['Fare'].fillna(dataset['Fare'].dropna().mean(), inplace=True)
    dataset['Fare'] = dataset['Fare'].astype(np.int64)

Кабина : 687 из 891 записи кабины пусты , т. е. существует более 50 % всех данных. Палуба создается потому, что она немного более общая, чем Каюта.

for dataset in combine:
    dataset['Deck'] = dataset['Cabin'].str.slice(0,1) 
    dataset['Deck'] = dataset['Deck'].map({"A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F":6,"G":7, "T":8})
    dataset['Deck'] = dataset['Deck'].fillna(0)
    dataset['Deck'] = dataset['Deck'].astype(np.int64)

Создание новой функции путем извлечения из существующей (Добавить вычисляемый столбец)

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

for dataset in combine:
    dataset['Title']  = dataset.Name.str.extract(' ([A-Za-z]+)\.', expand=False)
pd.crosstab(train_df["Title"], train_df['Sex'])

Я заменяю многие названия более распространенными именами или классифицирую их как редкие.

for dataset in combine:
    dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
    dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')
for dataset in combine:
    dataset['Title'] = dataset['Title'].map({"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5})
    dataset['Title'] = dataset['Title'].fillna(0)

FamilySize. Я создаю новую функцию для FamilySize, которая объединяет Parch и SibSp. Это позволит нам удалить Parch и SibSp из наших наборов данных.

for dataset in combine:
    dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1
for dataset in combine:
    dataset['IsAlone'] = 0
    dataset.loc[dataset['FamilySize'] == 1, 'IsAlone'] = 1

3. Исследовательский анализ данных

Анализируйте, выявляйте закономерности и исследуйте данные Анализ

Только 350из 891 пассажира (38,4%) выжили в обучающей выборке.

Секс

  • Количество мужчин на борту корабля намного превышает количество женщин, но количество спасенных женщин более чем в два раза превышает количество выживших мужчин.
  • Выживаемость женщин на корабле составляет около 75%, а мужчин - около 19%.

P-класс

  • Пассажиры P-класса 1 имеют очень высокий приоритет, чтобы выжить.
  • Количество пассажиров в P-классе 3 было намного выше, чем в P-классе 1 и P-классе 2, но все же количество выживших из P-класса 3 невелико по сравнению с ними.
  • % выживших Pкласса 1 составляет около 63%, для Pкласса 2 - около 48%, а выживших Pкласса 3 - около 25%.

Пол и классовая принадлежность являются важными факторами выживания. Давайте вместе определим выживаемость в зависимости от пола и класса

  • Самка высшего класса выжила примерно на 95–96%. Только 3 из 94 женщин высшего класса умерли.
  • Женский высший класс имеет высокий приоритет, чтобы выжить
  • У женщин низшего класса выживаемость выше, чем у мужчин высшего класса.

Корреляция характеристик с выжившими:

heatmap = sns.heatmap(train_df.corr()[[‘Survived’]].sort_values(by=’Survived’, ascending=False), vmin=-1, vmax=1, annot=True, cmap=’BrBG’)
heatmap.set_title(‘Features Correlating with Survived’, fontdict={‘fontsize’:18}, pad=16);

  • Пол положительно коррелирует с выжившими (коэффициент корреляции человека 0,54); Женщина имеет больше шансов выжить
  • Pclass отрицательно коррелирует с выжившими (с коэффициентом корреляции Пирсона -0,34); Очевидно, чем лучше класс билета (1 = 1-й/верхний, 2 = 2-й/средний, 3 = 3-й/нижний), тем выше шанс выжить.
  • Те важные признаки для предсказания выживших людей

4. Получите данные для обучения и тестирования

X_train = train_df.drop("Survived", axis=1)
Y_train = train_df["Survived"]
X_test  = test_df.drop("PassengerId", axis=1).copy()
X_train.shape, Y_train.shape, X_test.shape

5. Смоделируйте, предскажите и решите проблему

Обучение нашей модели с заданным набором данных с использованием контролируемого обучения (классификация и регрессия)

# Logistic Regression
logreg = LogisticRegression()
logreg.fit(X_train, Y_train)
Y_pred = logreg.predict(X_test)
acc_log = round(logreg.score(X_train, Y_train) * 100, 2)
acc_log
# Support Vector Machines
svc = SVC()
svc.fit(X_train, Y_train)
Y_pred = svc.predict(X_test)
acc_svc = round(svc.score(X_train, Y_train) * 100, 2)
acc_svc
knn = KNeighborsClassifier(n_neighbors = 3)
knn.fit(X_train, Y_train)
Y_pred = knn.predict(X_test)
acc_knn = round(knn.score(X_train, Y_train) * 100, 2)
acc_knn
# Gaussian Naive Bayes
gaussian = GaussianNB()
gaussian.fit(X_train, Y_train)
Y_pred = gaussian.predict(X_test)
acc_gaussian = round(gaussian.score(X_train, Y_train) * 100, 2)
acc_gaussian
# Perceptron
perceptron = Perceptron()
perceptron.fit(X_train, Y_train)
Y_pred = perceptron.predict(X_test)
acc_perceptron = round(perceptron.score(X_train, Y_train) * 100, 2)
acc_perceptron
# Linear SVC
linear_svc = LinearSVC()
linear_svc.fit(X_train, Y_train)
Y_pred = linear_svc.predict(X_test)
acc_linear_svc = round(linear_svc.score(X_train, Y_train) * 100, 2)
acc_linear_svc
# Stochastic Gradient Descent
sgd = SGDClassifier()
sgd.fit(X_train, Y_train)
Y_pred = sgd.predict(X_test)
acc_sgd = round(sgd.score(X_train, Y_train) * 100, 2)
acc_sgd
# Decision Tree
decision_tree = DecisionTreeClassifier()
decision_tree.fit(X_train, Y_train)
Y_pred = decision_tree.predict(X_test)
acc_decision_tree = round(decision_tree.score(X_train, Y_train) * 100, 2)
acc_decision_tree
# Random Forest
random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, Y_train)
Y_pred = random_forest.predict(X_test)
random_forest.score(X_train, Y_train)
acc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2)
acc_random_forest

Выбор модели

models = pd.DataFrame({
    'Model': ['Support Vector Machines', 'KNN', 'Logistic Regression', 
              'Random Forest', 'Naive Bayes', 'Perceptron', 
              'Stochastic Gradient Decent', 'Linear SVC', 
              'Decision Tree'],
    'Score': [acc_svc, acc_knn, acc_log, 
              acc_random_forest, acc_gaussian, acc_perceptron, 
              acc_sgd, acc_linear_svc, acc_decision_tree]})
models.sort_values(by='Score', ascending=False)

Случайные леса и деревья решений являются наиболее точными (96,97%) в прогнозировании выживания пассажиров, и они выбраны для прогнозирования данных тестирования.

Визуализируйте дерево решений

import graphviz

dot_data = tree.export_graphviz(clf, out_file=None, 
                                feature_names=X_train.columns.values,  
                                class_names='Survived',  
                                filled=True)

# Draw graph
graph = graphviz.Source(dot_data, format="png") 
graph

Нахождение:

Согласно анализу, у пассажиров было больше шансов выжить, если:

  • Билет высшего класса
  • Женщины/леди

Наоборот, быть стариком из низшего сословия снижало шансы на выживание.

Похлопайте, если считаете мою статью полезной.👏👏👏

Ссылка:

Я получил идею для анализа временных рядов ниже из следующего.

https://medium.com/analytics-vidhya/titanic-dataset-analysis-80-accuracy-9480cf3db538



Прогнозирование выживания пассажиров «Титаника
В этом сообщении в блоге я расскажу о всем процессе создания модели машинного обучения на знаменитом Титаникев направлении науки о данных .com»



https://www.kaggle.com/code/startupsci/titanic-data-science-solutions

https://documentation.sas.com/doc/en/vdmmlcdc/8.1/caspg3/n0c8k27l2vkwlin196w5qptqsjqx.htm

https://www.kaggle.com/code/aaysbt/titanic-datasets-eda-fe-dc-model-predictions

https://www.kaggle.com/code/ldfreeman3/a-data-science-framework-to-achieve-99-accuracy#Step-7:-Optimize-and-Strategize