Приклад Feature Engineering в машинному навчанні

Привіт, хабр!



однією минулих статей ми познайомилися з таким поняттям як Feature Engineering і застосуванням його на практиці. У коментарях було озвучено побажання показати на прикладі, як мистецтво генерації ознак допомагає помітно поліпшити якість алгоритмів машинного навчання. Я пошукав завдання, в яких би це можна було наочно продемонструвати і знайшов один хороший приклад. Це завдання Forest Type Cover Prediction. Покажемо, як можна застосовуючи прості ідеї, що не містять у собі машинне навчання, відразу потрапити в топ 10% Leader Board!

Не будемо докладно описувати умову задачі, бажаючі можуть ознайомитися з ним на сторінці змагання. Віддалившись від предметної області, скажемо лише, що вирішується класична задача многоклассовой класифікації об'єктів. Не будемо в цьому місці також приводити прості рішення, які відразу приходять в голову — запуск стандартних алгоритмів на всьому безлічі ознак або з попереднім відбором останніх — все це дає відразу точність (Accuracy) не більше 0.6-0.7

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



Як бачимо, ознаки мають досить різні розподілу (про їх фізичному сенсі пропонується поміркувати читачеві), однак, можна зауважити один цікавий момент — у ознаки Vertical_Distance_To_Hydrology один з хвостів виходить за значення 0. Таким чином, згадуючи огляд по Feature Engineering напрошується ввести новий бінарний ознака, який буде дорівнює значенням логічного виразу [Vertical_Distance_To_Hydrology < 0]

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

Зрозуміло, що якщо є такі ознаки, як Horizontal_Distance_To_Hydrology та Vertical_Distance_To_Hydrology, то перше, що напрошується — це просто порахувати відстань — корінь з суми квадратів і записати це як новий ознака Distanse_to_Hydrolody

Очевидно також, що якщо є відстань від одного об'єкта до деяких двох інших, то (в даній задачі) можна в якості ознак також розглядати «відносні відстані», а саме — додати в якості ознак попарную суму/різницю наступних:

Horizontal_Distance_To_Hydrology
Horizontal_Distance_To_Roadways
Horizontal_Distance_To_Fire_Points

І того, отримавши ще +6 нових ознак. Читачеві пропонується в даному місці трохи подумати і запропонувати ще кілька варіантів того, як можна з наявних ознак згенерувати нові.

А тепер найцікавіше і наочне, з-за чого я вибрав цю задачу. Таке буває досить рідко і знайти це можна, тільки довго вдивляючись у дані. Але, помітивши очевидну закономірність, можна істотно збільшити якість алгоритму. Подивимося уважно на залежність Elevation Vertical_Distance_To_Hydrology:



У читача, напевно, виникло відчуття, що дані в деякому сенсі упорядковані і досить добре розділяються. Це якраз є одна з найкрасивіших закономірностей у даній задачі, помітити яку не так складно. Тепер зрозуміло, що необхідно в якості одного з ключових ознак розглянути різницю між Elevation та Vertical_Distance_To_Hydrology. Саме такі знахідки часто дозволяють витягати максимум з наявних даних. Фактично вже зараз можна побудувати досить якісний класифікатор. При цьому ми не застосовували ще ніяких технік машинного навчання.

Постараюся пояснити, чому це добре працює. Насправді, алгоритми машинного навчання в цілому (до грубо) вирішують так чи інакше задачу оптимізації. У разі завдання класифікації це зводиться до знаходження найкращої розділяє поверхні. Рівно це зараз у просторі ознак Elevation та Vertical_Distance_To_Hydrology ми з вами зробили. Ми можемо провести 6 поділяють ліній і отримати перше наближення нашого класифікатора

Щоб не забирати у читача інтерес до цієї задачі, зупинимося на пошуку нових неочевидних закономірностей, які в ній присутні. Використовуючи тільки наведені ознаки, і ладу них ансамбль з випадкових дерев, можна отримати якість (Accuracy) близьке до 0.8. Цим прикладом я хотів показати, як часто на практиці буває корисно просто подивитися на дані, перш ніж застосовувати складні алгоритми, оптимізувати параметри і писати код!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.