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

Финал романтичный и грустный. Пока мы оплакивали недолгий роман Джека и Роуз, что случилось с остальными 891 пассажирами на борту Титаника в 1912 году? Чтобы ответить на этот вопрос, я использовал набор данных пассажирского манифеста из Kaggle, чтобы предсказать затруднительное положение выживания или смерти с помощью алгоритмов машинного обучения.

Это простое упражнение для сравнения результата применения двух алгоритмов машинного обучения: K ближайшего соседа (KNN) и Случайный лес. Вы можете найти копию набора данных здесь, чтобы опробовать его.

Почему KNN и Random Forest? Оба являются алгоритмами бинарной классификации, которые разделяют элементы данного набора на две группы (с предсказанием, к какой из них принадлежит каждый) на основе решений о том, обладает ли объект некоторыми качественными свойствами. Оба являются наиболее распространенными алгоритмами в этом классе; другие - просто производные от KNN и Random Forest. О других алгоритмах бинарной классификации вы можете прочитать здесь.

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

Примером может служить медицинское тестирование, чтобы определить, есть ли у пациента определенное заболевание или нет - классификационным свойством является наличие заболевания. В наборе данных Титаника моя цель - предсказать, выжил ли пассажир в трагической аварии, на основе набора свойств, таких как возраст, пол, класс билета и т. Д. Это классическая бинарная классификация, поскольку есть только два возможных исхода: выживание или смерть.

Давайте углубимся в код. Обратите внимание, что есть много способов выполнить код Python. Для простоты и простоты использования я предпочитаю записную книжку Python Jupyter.

Подготовка данных

Первая задача - загрузить обучающий набор данных из файла. Python предлагает отличный и простой способ загрузки наборов данных и управления ими с помощью библиотеки Pandas. Начнем с импорта служебных библиотек и набора обучающих данных.

import pandas as pd
df = pd.read_csv('titanic_dataset.csv')
df.head()

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

К счастью, есть методики для заполнения некоторых недостающих данных. Для проведенного анализа возраст является одним из определяющих факторов. Поэтому важно, чтобы набор данных содержал возраст для всех записей. Следующий код вычислит средний возраст из набора данных и впоследствии заполнит все отсутствующие записи вычисленным средним значением. Он также установит порт для пассажиров с неизвестным портом отправления на «S».

# Fill the missing age with mean
mean_age = df['Age'].mean()
df['Age'] = df['Age'].fillna(mean_age)
# Fill the missing embarked port with S
embarked_port = 'S'
df['Embarked'] = df['Embarked'].fillna(embarked_port)

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

# Drop Cabin & PassengerID columns
df = df.drop(['PassengerId', 'Cabin', 'Name'], axis = 1)

Хотя люди предпочитают слова, компьютеры любят работать с числами. Следующая задача в нашей подготовке данных будет заключаться в преобразовании удобочитаемых меток в числа, которые могут интерпретировать алгоритмы. Следующий код преобразует строки в целые числа, добавит новые столбцы для каждого представленного значения и присвоит значение 0 или 1 каждому столбцу в зависимости от того, представлено ли конкретное значение в строке или нет. Это изменит столбцы пол (Пол) и Embarked со строк на целые числа и добавит их обратно во фрейм данных как мужской / женский и CQS (буква означает загруженный порт отправления).

df_sex = pd.get_dummies(df['Sex'])
df_em = pd.get_dummies(df['Embarked'])
df2 = pd.concat([df, df_em, df_sex], axis = 1)
df2.head()

В таблице выше мы видим, что в первой строке пассажир - это мужчина, который сел на корабль из неизвестного порта отправления. Следовательно, столбцы S и Male установлены на 1, а C / Q / female на 0.

Ближайший сосед по K

Первый алгоритм, который мы рассмотрим, - это K-Nearest Neighbor. Более подробную информацию об алгоритме вы можете найти в Википедии.

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

# instantiating a K Nearest Neighbor model
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors = 5)
# import classes and functions from the library to be used in cross validation
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import StratifiedKFold, cross_val_score
ss = StandardScaler() 
# packages scaler and model together
pipeline = Pipeline([('transformer', ss), ('estimator', clf)])
# how we want to split up the data
skf = StratifiedKFold(n_splits=5,random_state=42)
# using cross_val_score to train 80% of data and test remaining 20%. Generate 5 scores as it tests 5 different times
scores = cross_val_score(pipeline, X, y, cv = skf)
scores

Выход: массив ([0,79888268, 0,78212291, 0,82022472, 0,84269663, 0,83050847])

Функция cross_val_score разбила исходный набор данных, который мы загрузили ранее из файла, на 5 подмножеств и запустила алгоритм KNN для каждого из подмножеств. А затем вычислил точность алгоритма. Другими словами, он проверяет, успешно ли алгоритм вычислил результат, как это происходит на самом деле. Массив показывает, что для каждого подмножества алгоритм имел точность 79–84%.

Когда использовать KNN:

  • Данные помечены
  • Данные без шума
  • Набор данных невелик, так как алгоритм считается «ленивым учеником».

Случайный лес

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

Использовать алгоритм в Python довольно просто. Снова мы используем функцию cross_val_score с тем же вводом и ожидаемым выводом.

# instantiating a K Random Forest model with the default arguments
from sklearn.ensemble import RandomForestClassifier
clf_rf = RandomForestClassifier()
from sklearn.model_selection import cross_val_score, StratifiedKFold  
# how we want to split up the data 
skf_rf = StratifiedKFold(n_splits = 5, shuffle = True, random_state = 42)
# using cross_val_score to train 80% of data and test remaining 20%. Generate 5 scores as it tests 5 different times
score_rf = cross_val_score(clf_rf, X, y, cv = skf_rf)
score_rf

Выход: массив ([0.81005587, 0.77094972, 0.80898876, 0.85393258, 0.82485876])

Как упоминалось для KNN, функция cross_val_score работала аналогично для случайного леса. Он разделил исходный набор данных, запустил алгоритм для каждого из подмножеств, а затем вычислил точность алгоритма. Массив показывает, что для каждого подмножества алгоритм имел точность 77–85%.

Когда использовать Random Forrest:

  • Большой набор данных
  • Нет переобучения
  • Набор данных содержит недостающие данные, так как алгоритм может их автоматически оценить. Другие метрики, которые можно использовать: Чебышев, косинус и т. Д.

Выводы:

Примечательным наблюдением в моей модели KNN является включение StandardScaler, необходимого шага в набор данных, который содержит переменные, различающиеся по масштабу. В Титанике столбец возраста со значениями от 5 до 50 имеет другой масштаб по сравнению со столбцом стоимости билета от 3 до 125 долларов. StandardScaler выполняет задачу Стандартизации. Я считаю, что это использование значительно увеличивает точность моей модели KNN с базовых 62% до среднего значения 81%.

KNN с минимальной фазой обучения идеально подходит для небольшого набора данных, такого как Titanic, потому что KNN сохраняет все данные обучения на этапе тестирования. В большом наборе данных, содержащем более 100 тыс. Строк, возможно, более идеальным вариантом будет случайный лес. Первоначальное время обучения занимает больше времени у модели случайного леса для установки метки / классификации, чем у модели KNN. Однако приложение работает намного быстрее, поскольку модель фактов уже создается по мере прохождения новых объектов.

Одна из причин, по которой кораблекрушение привело к гибели людей, заключалась в том, что не хватало спасательных шлюпок для пассажиров и экипажа. Хотя в выживании был определенный элемент удачи, некоторые группы людей имели больше шансов выжить, чем другие. Между женским полом и выживанием существует сильная корреляция. Выживших было больше женщин, чем мужчин, несмотря на то, что мужчин было больше пассажиров-женщин на 84%.

Типичный вопрос, который задает новичок, сталкиваясь с широким спектром алгоритмов машинного обучения: «Какой алгоритм мне следует использовать?» Ответ на вопрос зависит от многих факторов, включая: (1) размер, качество и характер данных; (2) доступное вычислительное время; (3) Актуальность задачи; и (4) что вы хотите делать с данными.

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

Ссылки:

Бинарная классификация. В Википедии. Получено 23 февраля 2019 г. с сайта https://en.wikipedia.org/wiki/Binary_classification.

Выбор подходящего оценщика. В Scitkit-Learn. Получено 23 февраля 2019 г. с сайта https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html.

Scikit-learn: машинное обучение в Python, Педрегоса и др., JMLR 12, стр. 2825–2830, 2011.