Испытание
Предсказать, выжил бы пассажир Титаника или нет
Данные
Этапы рабочего процесса
Рабочий процесс конкурентного решения проходит семь этапов, описанных в книге 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