Простое для понимания руководство по началу работы с соревнованиями, успешному моделированию и отправке вашей первой заявки.

В мире Data Science использование Kaggle практически необходимо. Вы используете его, чтобы получать наборы данных для своих проектов, просматривать и учиться на различных записных книжках, которыми щедро делятся люди, которые хотят видеть, как вы преуспеваете в создании хороших моделей машинного обучения, открывать новые идеи о том, как подходить к сложным задачам машинного обучения, список можно продолжить.

Один из лучших способов проверить свои навыки в реальном мире - принять участие в соревнованиях, проводимых на сайте. Соревнования на Титанике - это самый полезный, удобный для новичков способ начать и получить хорошее представление о том, чего ожидать и как наилучшим образом подойти к проблеме.

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

Пойдем!

Понимание данных

Сначала - откройте страницу конкурса. Вам нужно будет время от времени ссылаться на него.

Для этой конкретной задачи наша формулировка проблемы и конечная цель четко определены на самой странице конкурса:

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

Результат оценивается как 0 (не выжил) и 1 (выжил). Это явный признак того, что перед нами стоит проблема бинарной классификации.

Итак, запустите свой блокнот jupyter, и давайте посмотрим, как выглядят данные!

df = pd.read_csv(‘data/train.csv’)
df.head()

На первый взгляд - это смесь категориальных и сплошных признаков. Давайте посмотрим на типы данных для столбцов:

df.info()

Я не буду вдаваться в подробности о том, что каждая из этих характеристик на самом деле представляет для пассажира Титаника - я предполагаю, что вы уже читали об этом на веб-сайте Kaggle (что вам стоит, если вы еще не читали).

Очистка данных

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

  1. Точность
  2. Последовательность
  3. Единообразие и
  4. Полнота

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

Точно так же изучите тестовые данные. Я называю это df_test.

Теперь давайте составим объединенный список данных поезда и тестов, чтобы начать очистку.

data = pd.concat(objs = [df, df_test], axis = 0).reset_index(drop = True)

Наша целевая переменная будет столбцом Survived - давайте оставим его в стороне.

target = ['Survived']

Сначала мы проверяем нулевые значения в столбцах обучающих данных.

df.isnull().sum()

Сразу можно заметить, что три столбца кажутся совершенно неуместными для моделирования. Также довольно редко представлена ​​колонна кабины. Мы могли сохранить его и извлечь из него какую-то пользу, но пока давайте будем простыми.

data = data.drop(['PassengerId', 'Ticket', 'Cabin'], axis = 1)

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

Мы заменяем медианные значения на Возраст и Стоимость, а значение режима на В пути (которое будет S). .

data.Age.fillna(data.Age.median(), inplace = True)
data.Fare.fillna(data.Fare.median(), inplace = True)
data.Embarked.fillna(data.Embarked.mode()[0], inplace = True)

Таким образом, у нас теперь нет нулевых значений в наших данных. Работа сделана хорошо!

Функциональная инженерия

Теперь давайте создадим несколько новых функций для наших данных.

Мы создаем столбец под названием «familySize», в котором будет сумма наших родителей + братьев и сестер + детей.

data['FamilySize'] = data.SibSp + data.Parch

Кроме того, нам нужен новый столбец под названием «isAlone», который в основном означает, что пассажир Титаника путешествовал один на борту.

data['IsAlone'] = 1 #if alone
data['IsAlone'].loc[data['FamilySize'] > 1] = 0 #if not alone

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

Давайте сначала создадим новый столбец.

data['Title'] = data['Name'].str.split(", ", expand=True)[1].str.split(".", expand=True)[0]

Теперь посмотрим, сколько уникальных названий было создано.

data[Title].value_counts()

Это довольно много! Нам не нужно столько титулов.

Итак, давайте продолжим и объединим все титулы с менее чем 10 пассажирами в отдельную категорию «Другое».

title_names = (data.Title.value_counts() < 10) 
data[‘Title’] = data[‘Title’].apply(lambda x: ‘Other’ if title_names.loc[x] == True else x) 
# data.drop(‘Name’, axis = 1, inplace= True) # uncomment this later

Теперь посмотрим на измененный столбец.

Так выглядит лучше.

Хорошо, давайте наконец превратим наши два непрерывных столбца - Возраст и Стоимость проезда в квартили. Подробнее об этой функции здесь.

data['AgeBin'] = pd.qcut(data['Age'].astype(int), 5)
data['FareBin'] = pd.qcut(data['Fare'], 4)

Это делает эти два столбца категориальными, что нам и нужно. А теперь давайте еще раз взглянем на наши данные.

data.head()

Этикетка, кодирующая наши данные

Все наши категориальные столбцы теперь можно закодировать в метки 0, 1, 2… и т. Д. С помощью удобной функции, предоставляемой sklearn.

from sklearn.preprocessing import LabelEncoder
label = LabelEncoder()
data['Sex'] = label.fit_transform(data['Sex'])
data['Embarked'] = label.fit_transform(data['Embarked'])
data['Title'] = label.fit_transform(data['Title'])
data['Age'] = label.fit_transform(data['AgeBin'])
data['Fare'] = label.fit_transform(data['FareBin'])

Хорошо! Осталось еще два шага. Сначала отбрасываем ненужные столбцы.

data.drop(['FareBin', 'AgeBin'], axis = 1, inplace = True)

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

columns_train = [col for col in data.columns.tolist() if col not in target]
data = pd.get_dummies(data, columns = columns_train)

Давайте теперь еще раз взглянем на наши данные, не так ли?

Потрясающие! Теперь мы можем приступить к моделированию!

Создание модели SVM

Разделите наши данные на наборы для обучения и проверки.

train_len = len(df)
train = data[:train_len]
# to submit 
test = data[train_len:]
test.drop(labels=["Survived"],axis = 1,inplace=True)

Теперь наши обучающие данные будут иметь форму:

train.shape
Output:
(891, 49)

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

train["Survived"] = train["Survived"].astype(int)

и, наконец, мы отделяем столбец label от других столбцов.

columns_train = [col for col in data.columns.tolist() if col not in target]
label = train['Survived']
train = train[columns_train]
train.shape

Output:
(891, 48)

С помощью функции разделения sklearn мы разделяем наши обучающие данные на обучающие и проверочные наборы с разделением 80–20.

X_train, X_test, y_train, y_test = model_selection.train_test_split(train, label, test_size = 0.20, random_state = 13)

Давайте еще раз посмотрим на фигуру данных.

X_train.shape, y_train.shape, X_test.shape, y_test.shape
Output:
((712, 48), (712,), (179, 48), (179,))

Идеально! Мы готовы обучить нашу модель svm.

Обучение модели

Мы импортируем нашу модель опорной векторной машины:

from sklearn import svm

Затем мы создаем из него простой классификатор и помещаем его в наши обучающие данные и метки:

clf = svm.SVC(kernel='linear') # Linear Kernel
clf.fit(X_train, y_train)

Хороший! Мы очень близки к тому, чтобы сделать наши окончательные прогнозы по отправке. Отличная работа!

Теперь давайте проверим нашу модель на наборе проверки.

y_pred = clf.predict(X_test)
print("Accuracy: ", metrics.accuracy_score(y_test, y_pred))

Output:
Accuracy:  0.8379888268156425

Это выглядит неплохо для простой линейной модели SVM.

Делаем прогнозы для отправки

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

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

test_Survived = pd.Series(clf.predict(test), name="Survived")

Наконец, мы делаем

ID_column = df_test["PassengerId"]
results = pd.concat([ID_column, test_Survived], axis=1)

Мы проверяем форму нашего окончательного выходного фрейма данных прогноза:

results.shape
Output:
(418, 2)

Потрясающие! Это именно то, что нам нужно.

Последний шаг - создать файл csv из этого фрейма данных:

results.to_csv("svm_linear.csv",index = False)

Готово!

Оформление представления

Перейдите на веб-сайт конкурса и найдите страницу ниже, чтобы загрузить файл csv.

Весь код из этой статьи доступен в моем репо здесь. Хотя, если вы до сих пор следили за этим, у вас уже будет рабочая база кода + файл для отправки.

Файл README также помогает с дополнительными вещами, такими как создание виртуальной среды и многое другое, поэтому не забудьте проверить его, если хотите.



Изучение науки о данных само по себе может быть трудным. Следуй за мной, и давайте вместе повеселимся. 😁

Свяжитесь со мной в Твиттере.

Также ознакомьтесь с другой моей статьей, которая может вас заинтересовать: