Керівництво по машинному навчанню для початківців: модель прогнозу що вижили на ” Титаніку”


Початок роботи

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

Формат роботи: ви розпочнете з введення в машинне навчання на основі написання алгоритму, який передбачатиме, скільки чоловік виживе при краху ” Титаніка”. Потім послідують дві тренувальні сесії. Керівництво направлятиме вас в подальшій роботі, але код ви повинні писатимете самостійно.

Необхідні знання: передбачається, що ви вже маєте досвід роботи з Python або знаєте його на рівні вище базового. Також передбачається, що ви знайомі з Pandas на базовому рівні. Якщо ви бажаєте підтягнути знання по Pandas, пропонуємо ознайомитися з спеціальною статтею. Також пропонуємо вам подивитися курс основам Pandas.

Розробка виконуватиметься з використанням Ipython (якщо ви раніше не працювали з цією оболонкою, можете подивитися ввідний відеоурок і ознайомитися з командною оболонкою для інтерактивних обчислень Jupyter Notebook в нашій статті). По певним причинам рекомендується використати пакет Anaconda з Python 3.

Введення в машинне навчання

Презентація до уроку

У презентації вам дано невелике завдання на перевірку логіки (чим частіше ви приділятимете час на подібні вправи, тим краще ви зможете організувати робочий процес). Слід відкрити файл titanic_train.csv і визначити, які поля, на ваш погляд, мають найбільше значення для навчання. Ви можете зробити це зараз, щоб в середині статті порівняти свій результат і результат автора.

Машинне навчання з Python

Початковий код, з яким ви працюватимете, доступний на платформі Github. Для його завантаження реєстрацію не потрібно. Titanic_Machine_Learning.ipynb – назва файлу, з яким вам належить працювати.

Розпочнемо з імпорту основних бібліотек: Pandas і Numpy.

import numpy as npimport pandas as pd

Для машинного навчання використовуватиметься алгоритм Random Forest. На даний момент вам не треба знати, як він працює (але в майбутньому обов’язково вивчите), але вам треба знати, як його слід застосовувати у справі.

#Алгоритм машинного обученияfrom sklearn.ensemble import RandomForestClassifier

Якщо ви подивилися презентацію (що дійсно варто було зробити, інакше ви не зможете наслідувати половину коду), ви знаєте, що треба розділяти дані для тесту і для тренування, щоб не сталося перенавчання. Тому треба імпортувати функцію train_test_split ().

#Імпорт функції
from sklearn.cross_validation import train_test_split

Тепер давайте відключимо попередження від Pandas.

# Відключення попереджень Pandaspd.options.mode.chained_assignment = None

Прийшов час імпортувати функцію joblib. Вона використовуватиметься для написання моделі у файлі для повторного використання.

#Використовується для запису моделі у файлfrom sklearn.externals import joblib

Тепер треба відкрити файл з розширенням csv у Pandas. (Ви можете зробити це за допомогою Excel або OpenOffice.)

data = pd.read_csv ("titanic_train.csv") data.head ()

Ви побачите щось подібне до таблиці згори (звертаємо увагу, що деякі колонки не відображені із-за надмірної ширини таблиці).

Подивіться на колонку age. У таблиці на зображенні вище немає осередків зі значенням NaN, що означає, що немає даних. У нашому випадку є просто порожні осередки. Але звернете увагу, що NaN і порожній осередок – одно і те ж.

У презентації вам було дано завдання: треба було знайти корисні, на ваш погляд, вхідні дані для алгоритму.

Очікувані вихідні дані – дані, які ми отримаємо в колонці survived (що вижили). Як щодо вхідних даних?

Ви адже дивилися фільм ” Титанік”? (Якщо ні, то зараз буде спойлер: він потоне.) Коли прийшов час розподілу людей по шлюпках, більше шансів на порятунок мали володарі квитків першого класу. Також перевага віддавалася жінкам і дітям.

Таким чином ми можемо визначити, що найбільш важливі моменти, що визначають шанс порятунку, це клас квитка, вік і стать.

Якщо ви жінка солідного віку з дітьми і з квитком першого класу, то вам повезло – вірогідність вижити збільшується.

Якщо ж йдеться про чоловіка середнього віку з квитком третього або другого класу, то шансів на виживання стає в рази менше. Все як у фільмі. Попри те, що в таблиці також вказана ціна квитка, нам важливіше знать, до якого класу відноситься цей квиток. Якщо до першого, то шанси на виживання помітно зростають.

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

Вирішення проблеми: замінюємо порожні поля медіаною.

Перед тим, як продовжити читання, переконаєтеся, що ви розумієте наступні терміни:

  • Середнє арифметичне – сума чисел ви вибірці, ділена на кількість чисел у вибірці. Приклад: ви написали 5 рядків коду, ваш друг написав 9 рядків коду, ваша подруга написала 7 рядків коду. В середньому ви усі написали по 7 рядків: 5 + 9 + 7 = 21, 21 / 3 = 7.
  • Медіана (серединне число) – це таке число вибірки, при якому половина значень вибірки більше його, а інша половина менше його. Приклад: 1, 2, 5, 10, 21, 33, 57. Медіаною в даному випадку буде 10, оскільки числа ліворуч менше, а числа справа більше і з обох боків розташована однакова кількість чисел.
  • Мода – число, що саме, що повторюється, з тих, що усіх, що повторюються.

У нашому випадку зараз використовуватимемо медіану для визначення віку.

median_age = data['age'].median () print ("Median age is {}".format (median_age)) Median age is 29.0

Можна підрахувати медіану за допомогою функції median () у Pandas, з прикладу вище видно, що медіаною є число 29.

Тепер треба замінити порожні значення в колонці age на значення медіани. Для цього слід використати функцію fillna ().

data['age'].fillna (median_age, inplace = True) data['age'].head () 0 291 652 593 464 29

Пам’ятайте порожні (NaN) значення? Тепер вони замінені на 29.

Тепер треба витягнути три потрібних нам поля: class (клас), age (вік), sex (підлога).

Для чого це треба робити?

Це робиться для того, щоб не заплутати алгоритм і не створювати зайвий шум.

data_inputs = data[[" pclass", " age", " sex"]]data_inputs.head ()

Очікувані вихідні дані:

expected_output = data[[" survived"]]expected_output.head ()

Як бачите, у нас виникла проблема. Алгоритми у бібліотеці Scikit, яка використовується, працюють тільки з числами. Інакше кажучи, алгоритм не розуміє, що 1st – перший клас.

Давайте виправимо проблему. Просто замінимо 1st на 1, 2nd на 2, 3d на 3. Елементарно!

data_inputs["pclass"].replace ("3rd", 3, inplace = True) data_inputs["pclass"].replace ("2nd", 2, inplace = True) data_inputs["pclass"].replace ("1st", 1, inplace = True) data_inputs.head ()

Тепер проблема з класом виправлена. Вік виставлений правильно. Залишається поправити проблему з підлогою.

Використовуватимемо функцію np.where (), яка не є інтуїтивною.

data_inputs["sex"] = np.where (data_inputs["sex"] == "female", 0, 1) data_inputs.head ()

Функція замінила female на 0 і male на 1.

Тестування для відвертання перенавчання

Як ви могли запам’ятати з презентації, дані були розділені на набір для тестування і на набір для навчання. Учбовий набір використовується для тренування алгоритму, тоді як набір для тесту використовується для виявлення точності алгоритму. (Оскільки у нас є передбачувані вихідні дані, ми можемо порівняти їх з результатами алгоритму і вичислити відсоток неточності.)

Прийшов час розділити набори даних. Хоча це і можна зробити вручну, в керівництві це буде виконано за допомогою вбудованої функції. Вона також виконуватиме інші завдання. Наприклад, перетасовувати дані для нас.

inputs_train, inputs_test, expected_output_train, expected_output_test = train_test_split (data_inputs, expected_output, test_size = 0.33, random_state = 42)

Функція повертає учбові вхідні і вихідні дані, а також вихідний набір даних.

test_size=0.33 значить, що 33% набору даних використовуватиметься для тестування, решта – для навчання. random_state використовується для запуску вбудованого генератора випадкових вибірок.

Давайте виведемо декілька значень:

print (inputs_train.head()) print (expected_output_train.head()) pclass age sex618 3 19 1169 3 29 1830 1 54 1140 3 29 1173 2 28 1 survived618 0169 0830 1140 0173 0

Тепер треба запустити машинне навчання.

rf = RandomForestClassifier (n_estimators=100)

Створюємо зразок алгоритму Random forest.

rf.fit (inputs_train, expected_output_train)

Функція fit () використовується для навчання нашого алгоритму. Він бере частину вихідних даних і намагається наблизити свій результат до них. Тому ми і звузили поля для сканування, тепер у алгоритму немає серйозних перешкод, які могли б бути із-за іншої інформації.

У ідеалі зразок алгоритму навчиться передбачати кількість тих, що вижили кораблі. Давайте перевіримо точність алгоритму.

accuracy = rf.score (inputs_test, expected_output_test) print ("Accuracy ={}%".format (accuracy * 100)) Accuracy = 79.60526315789474%

Функція score () працює з тестовими вхідними даними і з’ясовує, наскільки точним є прогноз на основі відомих вихідних тестових даних.

У прикладі вище показана точність, яка склала 79%. Ми дізнаємося, на скільки це добре, тільки коли зможемо порівняємо з чим-небудь.

Останній крок близький. Весь цей час тренувався алгоритм. Але нам адже не треба, щоб він увесь час повторював цей процес. (Якщо щодня складати одні і ті ж числа, то розумніше людина не стане, вірна?) Наступна частина статті не відніме у вас багато часу, оскільки наш набір даних невеликий.

Ми можемо записати модель машинного навчання у файл, щоб в майбутньому мати можливість використати її повторно.

joblib.dump (rf, "titanic_model1", compress=9)

Раніше для цього використовувалася бібліотека Pickle, але функція joblib.dump набагато простіше. Застосування compress=9 є необхідною умовою, інакше будуть створені десятки файлів.

Практика

У цій секції створений алгоритм машинного навчання буде запущений в новому файлі.

Працювати належить з новим файлом, який раннє не використовувався, – titanic_test.csv. Він був створений з використанням оригінальних даних, від яких були відсічені 30% даних.

Витягніть з набору дані класу і підлоги, як ми це зробили для першої практики.

rf = joblib.load ("titanic_model2")

Тепер треба узяти вхідні дані і пропустити їх через прогнозуючу функцію:

pred = rf.predict ()# помістите сюди ваші змінні дані

Згори ви бачите порожню функцію predict (). Вам треба зробити predict (data), щоб прогнозування запустити.

На цьому урок закінчений. Спасибі за увагу!

Переклад статті “Machine Learning For Complete Beginners”

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *