Твій перший крок у Data Science. Титанік

Невелике вступне слово

Я вважаю, що більшу кількість справ ми могли б здійснювати, якби нам надавали покрокові інструкції, які скажуть що і як робити. Сам же згадую у своєму житті такі моменти, коли не міг початися якась справа через те, що було складно зрозуміти, з чого треба починати. Можливо, колись давно в інтернеті ти побачив слова Data Science і вирішив, що тобі до цього далеко, а люди, які цим займаються десь там, в іншому світі. Так ні, вони прямо тут. І, можливо, завдяки людям із цієї сфери тобі у стрічку потрапила стаття. Існує повно курсів, які допоможуть тобі освоїтись з цим ремеслом, тут же я допоможу тобі зробити перший крок.

Ну, що ти готовий? Відразу скажу, що тобі доведеться знати Python 3, оскільки його я використовуватиму тут. А також раджу заздалегідь встановити Jupyter Notebook або подивитися, як використовувати google colab.

крок перший

Твій перший крок у Data Science. Титанік

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

Наше завдання ми візьмемо звідти. Називається вона так: "Титанік". Умова така: спрогнозувати, виживе кожна окремо взята людина. Загалом кажучи, завдання людини, яка займається DS, це збирання даних, їх обробка, навчання моделі, прогноз тощо. У kaggle нам дозволяють пропустити етап збору даних - вони представлені на платформі. Нам потрібно завантажити їх і можна почати роботу!

Зробити це можна в такий спосіб:

у вкладці Data розташовані файли, в яких містяться дані

Твій перший крок у Data Science. Титанік

Твій перший крок у Data Science. Титанік

Завантажили дані, підготували наші Jupyter зошити та…

крок другий

Як нам тепер завантажити ці дані?

По-перше, імпортуємо необхідні бібліотеки:

import pandas as pd
import numpy as np

Pandas дозволить нам завантажити .csv файли для подальшої обробки.

Numpy потрібен для того, щоб подати нашу таблицю даних у вигляді матриці з числами.
Йдемо далі. Візьмемо файл train.csv і завантажимо його до нас:

dataset = pd.read_csv('train.csv')

Ми будемо посилатися до нашої вибірки train.csv даних через змінну dataset. Погляньмо, що там знаходиться:

dataset.head()

Твій перший крок у Data Science. Титанік

Функція head() дозволяє нам переглянути перші кілька рядків датафрейму.

Стобці Survived — це саме наші результати, які в цьому датафреймі відомі. Щодо завдання нам потрібно передбачити стовпець Survived для даних test.csv. У цих даних зберігається інформація про інших пасажирів Титаніка, для яких нам вирішальним завданням невідомі результати.

Отже, розділимо нашу таблицю на залежні та незалежні дані. Тут все просто. Залежні дані - це дані, які залежать від незалежних те, що знаходиться у наслідках. Незалежні дані - це дані, які впливають на результат.

Наприклад, у нас є такий набір даних:

«Вова навчав інформатику – ні.
Вова отримав з інформатики 2.

Оцінка з інформатики залежить від відповіді на запитання: чи навчав Вова інформатику? Ясно? Рухаємось далі, ми вже ближчі до мети!

Традиційна змінна для незалежних даних - Х. Для залежних - в.

Робимо наступне:

X = dataset.iloc[ : , 2 : ]
y = dataset.iloc[ : , 1 : 2 ]

Що це таке? Функцією iloc [:, 2:] ми говоримо пітон: хочу бачити в змінній Х дані, що починаються з другої стовпця (включно і за умови, що рахунок починається з нуля). У другому рядку говоримо, що хочемо бачити у даних першого стовпця.

[a:b, c:d] - це конструкція того, що ми використовуємо в дужках. Якщо не вказувати якісь змінні, вони зберігатимуться дефолтними. Тобто ми можемо вказати [:,:d] і тоді ми отримаємо у датафреймі всі стовпці, окрім тих, що йдуть, починаючи з номера d і далі. Змінні a та b визначають рядки, але вони нам усі потрібні, тому це залишаємо дефолтним.

Подивимося, що в нас вийшло:

X.head()

Твій перший крок у Data Science. Титанік

y.head()

Твій перший крок у Data Science. Титанік

Для того, щоб спростити цей невеликий урок, ми видалимо стовпці, які вимагають особливого догляду, або взагалі не впливають на виживання. Вони містять дані типу str.

count = ['Name', 'Ticket', 'Cabin', 'Embarked']
X.drop(count, inplace=True, axis=1)

Супер! Ідемо до наступного кроку.

крок третій

Тут нам потрібно закодувати наші дані, щоб машина краще розуміла, як ці дані впливають на результат. Але кодуватимемо не всі, а лише дані типу str, які ми залишили. Стовпець "Sex". Як ми хочемо закодувати? Представимо дані про поле людини вектором: 10 - чоловіча стать, 01 - жіноча стать.

Для початку наші таблиці переведемо в матрицю NumPy:

X = np.array(X)
y = np.array(y)

А тепер дивимося:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [1])],
                       remainder='passthrough')
X = np.array(ct.fit_transform(X))

Бібліотека sklearn це така крута бібліотека, яка дозволяє нам проводити повну роботу в Data Science. Вона містить багато цікавих моделей машинного навчання, а також дозволяє нам зайнятися підготовкою даних.

OneHotEncoder дозволить нам закодувати стать людини в тому поданні, як ми описали. Буде створено 2 класи: чоловічий, жіночий. Якщо людина - чоловік, то в стовпець "чоловічий" буде записано 1, а в "жіночий", відповідно, 0.

Після OneHotEncoder() стоїть [1] - це означає, що хочемо закодувати стовпець номер 1 (рахунок з нуля).

Супер. Рухаємось ще далі!

Як правило, таке трапляється, деякі дані залишаються незаповненими (тобто NaN — not a number). Наприклад, є інформація про людину: її ім'я, стать. А ось даних про його вік немає. У такому разі ми застосуємо такий метод: знайдемо середнє арифметичне по всіх стовпцях і, якщо дані якісь у стовпці пропущені, заповнимо порожнечу середнім арифметичним.

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer.fit(X)
X = imputer.transform(X)

А тепер візьмемо до уваги, що трапляються такі ситуації, коли дані дуже розрослені. Якісь дані знаходяться у відрізку [0:1], а якісь можуть заходити за сотні та тисячі. Щоб виключити такий розкид і комп'ютер був точнішим у розрахунках, ми проскалуємо дані, відмасштабуємо. Нехай усі числа не перевищуватимуть трьох. Для цього скористаємося функцією StandartScaler.

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X[:, 2:] = sc.fit_transform(X[:, 2:])

Тепер наші дані виглядають так:

Твій перший крок у Data Science. Титанік

Клас. Ми вже близько до нашої мети!

Крок четвертий

Навчимо нашу першу модель! З бібліотеки sklearn ми можемо знайти величезну кількість цікавостей. Я застосував до цього завдання модель Gradient Boosting Classifier. A classifier використовуємо, оскільки наше завдання – це завдання класифікації. Потрібно прогноз зарахувати до 1 (вижив) або 0 (не вижив).

from sklearn.ensemble import GradientBoostingClassifier
gbc = GradientBoostingClassifier(learning_rate=0.5, max_depth=5, n_estimators=150)
gbc.fit(X, y)

Функція fit говорить пітону: Нехай модель шукає залежності між X та у.

Менше за секунду і модель готова.

Твій перший крок у Data Science. Титанік

Як її застосувати? Зараз побачимо!

Крок п'ятий. Висновок

Тепер нам потрібно завантажити таблицю з нашими тестовими даними, для яких потрібно скласти прогноз. З цією таблицею проробимо ті самі дії, які ми робили для X.

X_test = pd.read_csv('test.csv', index_col=0)

count = ['Name', 'Ticket', 'Cabin', 'Embarked']
X_test.drop(count, inplace=True, axis=1)

X_test = np.array(X_test)

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [1])],
                       remainder='passthrough')
X_test = np.array(ct.fit_transform(X_test))

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
imputer.fit(X_test)
X_test = imputer.transform(X_test)

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_test[:, 2:] = sc.fit_transform(X_test[:, 2:])

Застосуємо вже нашу модель!

gbc_predict = gbc.predict(X_test)

Всі. Ми склали прогноз. Тепер його потрібно записати в CSV і відправити на сайт.

np.savetxt('my_gbc_predict.csv', gbc_predict, delimiter=",", header = 'Survived')

Готово. Отримали файл, що містить передбачення для кожного пасажира. Залишилося залити ці рішення на сайт та отримати оцінку прогнозу. Таке примітивне рішення дає не тільки 74% правильних відповідей на паблику, але також і деякий поштовх Data Science. Найцікавіші можуть будь-коли написати мені в особисті повідомлення і поставити запитання. Всім дякую!

Джерело: habr.com

Додати коментар або відгук