Осторожно, спойлер: Мой ответ на 1 глупый
Шаг 1: Понимание постановки задачи
В этом посте я собираюсь объяснить, как мне удалось улучшить оценку с 0,72 до 0,83 (топ-3% на момент отправки), а затем с 0,83 до 1 Титаникское машинное обучение после катастрофы.
Хорошо, что проблема Титаника — это бесконечный конкурс. Итак, если вы хотите понять, где вы стоите как специалист по данным, эта задача будет очень полезна.
Шаг 2: понимание данных
Всегда помните эту цитату
Если вы будете пытать данные достаточно долго, они признают правду
- Рональд Х. Коуз
Kaggle предоставляет вам 3 файла, которые вы можете найти здесь. Возможности, доступные для анализа
PassengerID —
Идентификатор пассажираSurvived —
Выживание → 0 = Нет, 1 = ДаPclass —
Класс билета → 1 = 1-й, 2 = 2-й, 3 = 3-йSex —
Пол человека → 0 = женский, 1 = мужскойAge —
Возраст → в годахSibsp —
# братьев и сестер или супругов на борту корабляParch —
# родителей или детей на борту корабляTicket —
Номер билетаFare —
Пассажирский тарифCabin —
Номер каюты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 балл.
Надеюсь, эта статья помогла вам. Вы можете получить полный код здесь