Навіщо програмісту знати Machine Learning

У 2021 році назва статті може видаватися недолугою чи провокаційною. Ну справді, машинне навчання — річ поширена, доступ до Coursera є в будь-кого, і всі, хто мав бажання піти в Data Scientist’и, уже в них пішли. Про це вже навіть мемів немає: ML давно увійшов у наше життя. Але якщо вважаєте, що машинне навчання вам точно не потрібне — ви помиляєтеся. І я спробую пояснити чому.

Мене звати Андрій Лящук, я працюю в Django Stars на позиції Back-end Engineer і захоплююся машинним навчанням з 2016 року.

Якщо ви вже крутий Data Scientist, працюєте з ML як основним напрямом, то, певне, знайдете, з чим у цій статі не погодитися. Але я вважаю, що матеріал може бути корисний для того, щоб зламати кригу недовіри до машинного навчання як до інструмента повсякденної роботи.

Трохи теорії

Отже, перш ніж відповідати на питання «навіщо мені ML», поговорімо трохи про теорію.

Machine Learning — це вивчення алгоритмів, що здатні самовдосконалюватися з досвідом, або, як у нашому випадку, прикладне використання цих алгоритмів (його ще називають Predictive Data Analysis). ML перетинається з Data Mining (коли за допомогою цих алгоритмів ми намагаємося з бази даних витягнути певні інсайти) і зі статистичним аналізом (з якого, власне, ML походить), але є чимось більшим за все перелічене.

Машинне навчання буває трьох видів. Перший — «із вчителем», коли наш алгоритм має приклад результатів, яких ми від нього очікуємо, і підбирає правило, за яким із вхідних даних отримуються вихідні результати. Другий — «без вчителя», «ось тобі дані, сам з них щось витягни». Саме цим користуються датамайнери, які дають алгоритмам достобіса даних і шукають за їх допомогою приховані патерни. Третій вид — «з підкріпленням», це схоже на навчання живої нейромережі, наприклад, собаки, коли в алгоритму є умови максимізації виграшу і він адаптується таким чином, щоб за будь-яких умов власний виграш максимізувати.

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

Фух. Базову теорію закінчили (кому цікаво, є крутий базовий курс на Coursera), перейдемо до підводних каменів.

Проблеми ML

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

По-друге, треба зважати на те, що ML загалом пов’язане з науковим пошуком і побудовою гіпотези, навіть якщо наш «науковий пошук» — це пошук того, як розбити клієнтську базу за рекомендаціями (трохи пізніше я саме цей випадок розгляну як приклад). Просто так кидати в алгоритм власну базу даних, звісно, можна, але він може знайти кореляції, які не мають жодного прикладного значення, і навчитися прогнозувати саме їх. Тому перед тим, як братися до ML, треба витратити час і сили на те, щоб сформулювати власну гіпотезу щодо того, чий вплив і на що ми шукаємо.

По-третє, проблема з власне навчанням алгоритму. Алгоритм, який вже аж занадто добре відповідає конкретному набору тренувальних даних, найімовірніше, «оверфітнутий», тобто здатний аналізувати та прогнозувати не будь-які дані, а саме ті, на яких його тренували. Іншими словами, він не приносить користі.

І на фінал, головна проблема машинного навчання — дані. Для побудови та навчання моделі потрібні дані. Багато. Достобіса багато, та ще й якісних. Що більше та якісніше, то краще. Що складніша модель — то більше даних і більше у кожної одиниці датасету ступенів свободи (тобто таких змінних параметрів, які ми вважаємо важливими для моделі). Орієнтиром, прийнятим у сфері, для простих прикладів можна назвати «правило порядку»: для навчання вам потрібно щонайменше на порядок (у 10 разів) більше даних, ніж у вас є ступенів свободи в одиниць датасету. Насправді для чогось хоча б трохи складнішого даних потрібно ще більше. На скільки більше, можна спрогнозувати, як правило, із власної практики.

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

Приклад використання машинного навчання

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

  • таблиця користувачів (у користувача є ім’я, стать, вік, країна проживання, відгуки на локації, які він уже відвідував);
  • таблиця локацій (країна, регіон, набір найближчих до локації готелів);
  • таблиця відгуків (автор, рейтинг, дата відгуку, певний коментар, локація, на яку залишено відгук, готель, у якому перебував користувач, який написав відгук);
  • таблиця готелів (назва, розташування, найближчі локації, найнижча ціна за номер на кожен місяць);
  • таблиця з вішлистами («хочу відвідати локацію» для користувачів).

І ми хочемо створити нескладну рекомендаційну систему, яка за даними користувача буде йому рекомендувати готелі та локації на певний обраний місяць у певній країні. І не плануємо для цього запрошувати на проєкт окремого спеціаліста: завдання не здається складним і його можна виконати власними силами. Окей. Подивімось, як будемо готувати дані, які містяться у кількох різних таблицях, і складати в один набір, на якому тренуватимемо нашу систему. Саме у цій підготовці даних полягає половина роботи.

Для простоти розглянемо приклад, у якому всі дані у всіх таблицях заповнено і вони коректні. Якщо дані некоректні або їх немає, то ми або не розглядаємо ці дані, або додаємо до вибірки для навчання моделі ще більше даних, щоб компенсувати похибку, яку створюють неякісні. Якщо похибка є в 3 % даних, то похибка моделі буде меншою, ніж якщо неякісна в нас чверть всієї вибірки.

Питання, з якого потрібно завжди починати розробку будь-чого: який у нас критерій готовності, у нашому випадку — хорошої рекомендації? Порадити локацію, схожу на ті, які користувач уже відвідував і які йому сподобалися, порадити готель, який найближче розташовується до цієї локації та підходить за бюджетом. У нас спрощений випадок, ми не розглядаємо, які є фічі у кожному готелі, беремо до уваги лише ціну й розташування, але в реальному житті кількість змінних більша.

Але головне, що ми розуміємо: наша основа таблиця для тренування — це відгуки на локації. Саме за фідбеком можемо оцінити результат. Отже, нам потрібна розширена база відгуків: відгук + дані про користувача, який його залишив. Це дасть нам таку інформацію:

  • ім’я;
  • стать;
  • вік;
  • країна проживання;
  • коментар (текст);
  • дата відгуку;
  • розташування локації.

Рейтинг не входить у цей набір даних, тому що він — наш результат прогнозу, а не те, з чого ми прогноз будуємо.

Чи є щось зайве? Так, навряд чи ім’я користувача чи текст відгуку впливають на результат (у межах нашого прикладу ми не будемо розглядати випадки, коли текст відгуку та рейтинг сильно відрізняються, до того ж, щоб їх обробити, потрібно окремо проганяти текст відгуку через розпізнання). Ці два пункти можемо викинути.

Чогось бракує? Для рекомендованої системи за локаціями всього достатньо. Для рекомендації за готелями знадобиться набір даних про готелі, але тут краще не намагатися витягнути дві різні, мало пов’язані змінні водночас, а налаштувати рекомендації готелів на базі рекомендації локацій.

Є ще одна маленька проблема із зайвою деталізацією: вік людини — це варіативна річ. Навчаючи нашу модель, ми ризикуємо одразу стикнутися з тим, що варіативність віку сильно (сильніше, ніж це є насправді) впливає на результат прогнозу. Тому — з практики — краще узагальнити вік користувача, що залишив відгук. Як детально — залежить від потреб моделювання, але орієнтуймося на п’ять вікових категорій. Аналогічно з датою відгуку: ми можемо узагальнити її до місяця відгуку, тому що ми будемо давати рекомендації за місцем пошуку. І замість 365 варіантів отримаємо 12.

Отже, у результаті будемо мати такий датасет:

  • вікова категорія;
  • стать;
  • країна проживання;
  • місяць відгуку;
  • розташування локації.

А прогнозуємо ми рейтинг оцінки. Тут підійде багато різних алгоритмів, але якщо ви хоч трохи володієте Python, можете навіть не задумуватися над цим і просто обрати найкращий для вас з пакету scikit-learn. Для серйозних задач із великою кількістю даних краще брати більш спеціалізовані інструменти. Наприклад, мову R, спеціалізовану для роботи зі статистикою. Але для більшої частини повсякденних завдань середнього програміста вистачить Python.

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

Висновок

Отже, ML — не просто прикольний і популярний пункт у резюме, а й насправді простий і зручний інструмент, який може опанувати будь-який програміст. Машинне навчання дає змогу отримати неабияку користь з даних, які назбируються «самі собою» на будь-якому великому проєкті. Таким чином замість того, щоб писати багато коду, ви писатимете код, який зробить більшу частину важкої роботи за вас. Головне — бути готовим до неочікуваних результатів.

👍НравитсяПонравилось18
В избранноеВ избранном7
Подписаться на тему «ML»
LinkedIn



Підписуйтесь: Soundcloud | Google Podcast | YouTube


4 комментария

Подписаться на комментарииОтписаться от комментариев Комментарии могут оставлять только пользователи с подтвержденными аккаунтами.

В статье большое количество ошибок.

Цікаво. Давно думав над тим, щоб освоїти ML на якомусь мінімальному прикладному рівні, але все відкладав. А тут аж стимул з’явився!

В світі JS фреймворків є класична задача «ToDo List», яка дозволяє засвоїти базиси і є хорошим прикладом для подальших практичних задач.

В світі ML є щось подібне?

1. Распознавание рукописных цифр
2. Расчет вероятности выжить на Титанике

Где-то на Kaggle видел оба датасета в качестве вступления в ML как раз.

Задачи на регрессию — прогноз цен на жилье
Задачи на классификацию — Выжившие на Титанике и распознавание цифр;
Кластеризация — Iris dataset

Подписаться на комментарии