Як використовувати smote для незбалансованих даних у r (з прикладом)


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

Наприклад:

  • Набір даних, що містить інформацію про те, чи були задрафтовані гравці коледжу в НБА, може містити 98% гравців, які не пройшли драфт, і 2% були задрафтовані.
  • Набір даних, що містить інформацію про те, чи є у пацієнтів рак, може містити 99% пацієнтів без раку та лише 1% пацієнтів із раком.
  • Набір даних, що містить інформацію про банківське шахрайство, може містити 96% законних транзакцій і 4% шахрайських транзакцій.

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

Що ще гірше, клас меншості часто є тим, кого ми найбільше хочемо передбачити.

Одним із способів вирішення цієї проблеми дисбалансу є використання техніки передискретизації синтетичної меншості , яку часто називають абревіатурою SMOTE .

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

Найпростіший спосіб використання SMOTE у R — це використання функції SMOTE() із пакету DMwR .

Ця функція використовує такий базовий синтаксис:

 SMOTE(form, data, perc. over = 200 , perc. under = 200 , ...)

золото:

  • форма : формула, що описує модель, яку ви хочете адаптувати
  • data : назва кадру даних
  • perc.over : число, яке визначає, скільки додаткових випадків генерується класу меншості
  • perc.under : число, яке визначає, скільки додаткових випадків генерується мажоритарного класу

У наступному прикладі показано, як використовувати цю функцію на практиці.

Приклад: як використовувати SMOTE у R

Припустімо, що ми маємо наступний набір даних із 100 спостереженнями в R, у яких 90 мають клас «Так», а 10 мають клас «Ні» для змінної відповіді:

 #make this example reproducible
set. seed ( 0 )

#create data frame with one response variable and two predictor variables
df <- data. frame (y=rep(as. factor (c(' Yes ', ' No ')), times=c( 90 , 10 )),
                 x1=rnorm( 100 ),
                 x2=rnorm( 100 ))

#view first six rows of data frame
head(df)

    y x1 x2
1 Yes 1.2629543 0.7818592
2 Yes -0.3262334 -0.7767766
3 Yes 1.3297993 -0.6159899
4 Yes 1.2724293 0.0465803
5 Yes 0.4146414 -1.1303858
6 Yes -1.5399500 0.5767188
 
#view distribution of response variable
table(df$y)

 Drowned 
 10 90

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

Щоб створити більш збалансований набір даних, ми можемо використати функцію SMOTE() із пакету DMwR :

 library ( DMwR)

#use SMOTE to create new dataset that is more balanced
new_df <- SMOTE(y ~ ., df, perc. over = 2000 , perc. under = 400 )

#view distribution of response variable in new dataset
table(new_df$y)

 Drowned 
210,800

Отриманий набір даних містить 210 спостережень із класом «Ні» та 800 спостережень із класом «Так».

Ось як саме функція SMOTE створила цей новий набір даних:

  • Аргумент perc.over вказав, що ми хочемо додати 2000/100 (або 20) разів кількість існуючих спостережень меншості до набору даних. Оскільки у вихідному наборі даних існувало 10 спостережень, ми додали 20*10 = 200 додаткових незначних спостережень .
  • Аргумент perc.under вказує, що ми хочемо, щоб кількість спостережень більшості дорівнювала 400/100 (або 4) кількості спостережень меншості, доданих до наявних спостережень меншості. Оскільки було додано 200 додаткових спостережень меншості, ми зробили кількість спостережень більшості рівною 200 * 4 = 800 спостережень більшості .

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

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

Примітка . Не соромтеся грати з аргументами perc.over і perc.under у функції SMOTE, щоб отримати набір даних, який відповідає вашим потребам.

Додаткові ресурси

У наступних посібниках пояснюється, як виконувати інші типові завдання в R:

Як створити зведені таблиці в R
Як нормалізувати дані в R
Як видалити викиди в R

Додати коментар

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