Невелике вступне слово
Я вважаю, що більшу кількість справ ми могли б здійснювати, якби нам надавали покрокові інструкції, які скажуть що і як робити. Сам же згадую у своєму житті такі моменти, коли не міг початися якась справа через те, що було складно зрозуміти, з чого треба починати. Можливо, колись давно в інтернеті ти побачив слова Data Science і вирішив, що тобі до цього далеко, а люди, які цим займаються десь там, в іншому світі. Так ні, вони прямо тут. І, можливо, завдяки людям із цієї сфери тобі у стрічку потрапила стаття. Існує повно курсів, які допоможуть тобі освоїтись з цим ремеслом, тут же я допоможу тобі зробити перший крок.
Ну, що ти готовий? Відразу скажу, що тобі доведеться знати Python 3, оскільки його я використовуватиму тут. А також раджу заздалегідь встановити Jupyter Notebook або подивитися, як використовувати google colab.
крок перший
Kaggle – твій значний помічник у цій справі. В принципі, можна обійтися без нього, але про це я розповім в іншій статті. Це така платформа, в якій розміщуються змагання з Data Science. У кожному такому змаганні на ранніх етапах ти отримуватимеш нереальну кількість досвіду розв'язання задач різного роду, досвіду розробки та досвіду роботи в команді, що важливо в наш час.
Наше завдання ми візьмемо звідти. Називається вона так: "Титанік". Умова така: спрогнозувати, виживе кожна окремо взята людина. Загалом кажучи, завдання людини, яка займається DS, це збирання даних, їх обробка, навчання моделі, прогноз тощо. У kaggle нам дозволяють пропустити етап збору даних - вони представлені на платформі. Нам потрібно завантажити їх і можна почати роботу!
Зробити це можна в такий спосіб:
у вкладці Data розташовані файли, в яких містяться дані
Завантажили дані, підготували наші 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()
Функція 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()
y.head()
Для того, щоб спростити цей невеликий урок, ми видалимо стовпці, які вимагають особливого догляду, або взагалі не впливають на виживання. Вони містять дані типу 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:])
Тепер наші дані виглядають так:
Клас. Ми вже близько до нашої мети!
Крок четвертий
Навчимо нашу першу модель! З бібліотеки 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 та у.
Менше за секунду і модель готова.
Як її застосувати? Зараз побачимо!
Крок п'ятий. Висновок
Тепер нам потрібно завантажити таблицю з нашими тестовими даними, для яких потрібно скласти прогноз. З цією таблицею проробимо ті самі дії, які ми робили для 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