Осторожно, спойлер: Мой ответ на 1 глупый

Шаг 1: Понимание постановки задачи

В этом посте я собираюсь объяснить, как мне удалось улучшить оценку с 0,72 до 0,83 (топ-3% на момент отправки), а затем с 0,83 до 1 Титаникское машинное обучение после катастрофы.

Хорошо, что проблема Титаника — это бесконечный конкурс. Итак, если вы хотите понять, где вы стоите как специалист по данным, эта задача будет очень полезна.

Шаг 2: понимание данных

Всегда помните эту цитату

Если вы будете пытать данные достаточно долго, они признают правду
- Рональд Х. Коуз

Kaggle предоставляет вам 3 файла, которые вы можете найти здесь. Возможности, доступные для анализа

  1. PassengerID — Идентификатор пассажира
  2. Survived — Выживание → 0 = Нет, 1 = Да
  3. Pclass — Класс билета → 1 = 1-й, 2 = 2-й, 3 = 3-й
  4. Sex — Пол человека → 0 = женский, 1 = мужской
  5. Age — Возраст → в годах
  6. Sibsp — # братьев и сестер или супругов на борту корабля
  7. Parch — # родителей или детей на борту корабля
  8. Ticket — Номер билета
  9. Fare — Пассажирский тариф
  10. Cabin — Номер каюты
  11. Embarked — Порт посадки → C = Шербур, Q = Квинстаун, S = Саутгемптон

Гипотеза. Функция Pclass коррелирует с выживанием.

Вывод: Да

Объяснение: я использовал график подсчета для изучения корреляции между столбцами «Pclass» и «Выживший», который ясно показал, что первый влияет на более поздний.

sns.countplot(x = 'Pclass',hue = 'Survived',data=train);

Гипотеза. Пол влияет на выживаемость.

Вывод: Да. Самки выживают больше, чем самцы

Объяснение. При использовании гистограммы для визуализации коэффициента выживаемости самцов и самок по данным. У самок больше шансов выжить

import matplotlib.pyplot as plt
from matplotlib import style
style.use('ggplot')
fig,axes = plt.subplots(nrows=1,ncols=2,figsize = (10,4))
ax = sns.distplot(female_passengers[female_passengers.Survived == 1].Age.dropna(),bins=18,
                  ax = axes[0],kde=False,label = lbl_survived)
ax = sns.distplot(female_passengers[female_passengers.Survived == 0].Age.dropna(),bins=40,
                 ax = axes[0],kde=False,label = lbl_not_survived)
ax.legend()
ax.set_title('Female')
ax = sns.distplot(male_passengers[male_passengers.Survived == 1].Age.dropna(),bins=18,
                  ax = axes[1],kde=False,label = lbl_survived)
ax = sns.distplot(male_passengers[male_passengers.Survived == 0].Age.dropna(),bins=40,
                 ax = axes[1],kde=False,label = lbl_not_survived)
ax.legend()
_ = ax.set_title('Male')

Гипотеза: название влияет на выживаемость

Вывод: Да

Объяснение.Имя в наборе данных имеет следующую структуру: ‹Фамилия›, ‹Название›. ". Хотя это в основном игнорируется начинающими исследователями данных, простой анализ даст много полезной информации. Пассажирам с титулом «мистер» явно не повезло.

# Handling Title information
data = [train,test]
title = {"Mr" : 1, "Miss" : 2,"Mrs" : 3, "Master" : 4, "Rare" : 5}
for dataset in data:
    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')
    dataset['title'] = dataset['title'].map(title)
    del dataset['Name']
    
    dataset.title.fillna(0,inplace=True)
sns.countplot(x = 'title',hue = 'Survived',data=train);

Хотя это одна из представленных мной версий анализа, есть много статей, в которых показана связь между именем и выживанием. Хотя я сам использовал это в своей модели, я оставляю это для вас.

Отсутствующие значения. Данные о поездах имеют нулевые значения в столбцах «Возраст», «Кабина» и «Отправлено». Хотя существует множество методов для заполнения пропущенных значений. Я использовал медиану для столбца возраста, так как разброс в этом столбце больше. Заполнено наиболее частое значение для Embarked и заполнено «S» для кабины, когда оно равно нулю.

# Handling Age information
data = [train, test]
for dataset in data:
    missing_age = train.Age.median()
    dataset.Age.fillna(missing_age,inplace = True)
    dataset.Age = dataset.Age.astype(int)

Шаг 3: Генерация модели

Я попробовал RandomForest Classifer, SGDClassifer и XGBoost, причем RandomForest дал мне наилучшую точность.

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

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)

Чтобы знать, как работает наша модель, нам нужна стратегия оценки. Я выбрал 10-кратную перекрестную проверку и оценку по умолчанию Out of Bag, предоставленную классом модели sklearn.

randomforest_classifier = RandomForestClassifier(criterion='gini',min_samples_leaf=5,min_samples_split=2,n_estimators=400,random_state=42)
randomforest_classifier.fit(X_train_scaled,y_train)
y_pred = randomforest_classifier.predict(X_test_scaled)
acc_random_forest = round((randomforest_classifier.score(X_test_scaled,y_test)*100),2)
acc_random_forest

Это дало мне средний балл перекрестной проверки около 87,5 для данных поезда. Окончательный прогноз дал мне оценку 82,7%.

Настройка гиперпараметров. Это процесс выбора правильных параметров для повышения эффективности алгоритма обучения. Вы можете использовать «GridSearchCV», чтобы получить наилучшие параметры для вашей модели. Код можно увидеть ниже:

#Hyper-parameter tuning
from sklearn.ensemble import RandomForestClassifier
param_grid = {
    "criterion" : ['gini','entropy'],
    "min_samples_leaf" : [1,5,8,10],
    "min_samples_split" : [2,4,10,12,16],
    "n_estimators" : [100,200,400,800]
}
randomforest_classifier = RandomForestClassifier(random_state=42,oob_score=True)
clf = GridSearchCV(estimator=randomforest_classifier,n_jobs=-1,param_grid=param_grid)
clf.fit(X_train_scaled,y_train)
clf.best_params_

Вывод

Не может быть какого-либо одного письменного ответа, когда дело доходит до моделирования. Одно из предложений — прочитать много сообщений и проверить общедоступные блокноты Kaggle, если вы застряли с чем-то.

Переходя к вопросу о том, как мы можем добиться идеального результата для этой задачи. Не существует модели ML, которая дает высший балл, если вы все еще хотите достичь 1 (ваша модель может быть богом, если это достижимо), вы можете получить список пассажиров здесь и можете использовать их непосредственно для прогнозирования результатов.

Интересно, что я не нашел общедоступных блокнотов или сообщений от кандидатов, набравших 1 балл.

Надеюсь, эта статья помогла вам. Вы можете получить полный код здесь