SMOTE для балансировки более 200 классов в R

У меня есть набор данных из двух столбцов (функция и класс) с более чем 200 классами, к которым должны быть классифицированы входные функции. Встречаемость классов колеблется от 1 до нескольких тысяч для некоторых классов. Столбец функций содержит текст и числа. Я попробовал следующий способ:

СМОТ из УБЛ

SmoteClassif(lab ~ ., dat, C.perc = "balance",dist="HEOM")

Это дает предупреждения:

Warning messages:
1: SmoteClassif :: Nr of examples is less or equal to k.
 Using k = 1 in the nearest neighbours computation in this bump.
2: SmoteClassif :: Nr of examples is less or equal to k.
 Using k = 1 in the nearest neighbours computation in this bump.
3: SmoteClassif :: Nr of examples is less or equal to k.
 Using k = 2 in the nearest neighbours computation in this bump.
4: SmoteClassif :: Nr of examples is less or equal to k.
 Using k = 2 in the nearest neighbours computation in this bump.

Но все же это прекрасно уравновешивает все классы lab одинаково. Однако не все функции присутствуют в наборе данных SMOTED. Разве это не потеря данных, то есть отсутствуют функции, необходимые для обучения модели? Я новичок в этой области. Объясняют ли предупреждения проблему? Я пробовал с k=1, и все равно конечный результат тот же.

Любые предложения помогут.


person chas    schedule 28.11.2018    source источник


Ответы (1)


Функция SmoteClassif, реализованная в пакете UBL, сочетает избыточную выборку с использованием процедуры SMOTE со случайной недостаточной выборкой.

Это означает, что при использовании опции «баланс» функция будет генерировать новые дела для самых редких классов и удалять дела из самых населенных классов. В конце концов, цель состоит в том, чтобы получить новый сбалансированный набор данных, который имеет примерно тот же размер, что и исходный набор данных. Поэтому, когда вы используете опцию «баланс», вы будете генерировать новые синтетические случаи и удалять наблюдения из наиболее частых классов, чтобы в итоге вы получили набор данных с размером, аналогичным исходному.

Если вы хотите применить только процедуру передискретизации, то вам нужно будет указать в параметре C.perc, сколько передискретизации вы хотите применить к каждому классу. Например, вы можете установить

C.perc = list(A = 2, B=3)

Это приведет к дублированию элементов класса A и утроению элементов класса B, в то время как оставшийся набор данных останется неизменным (все остальные классы сохранят свою частоту). В этом случае ваш набор данных расширяется за счет нового синтеза, и никакая информация не отбрасывается!

Простой пример:

library(MASS)
data(cats)
table(cats$Sex)

F  M  
47 97 

# class M is duplicated
mysmote.cats <- SmoteClassif(Sex~., cats, list(M = 2))
table(mysmote.cats$Sex)

F   M 
 47 194 

#class M is oversampled by 150% and class F is undersampled by 50%
mysmote.cats <- SmoteClassif(Sex~., cats, list(M = 1.5, F=0.5))
table(mysmote.cats$Sex)

F   M 
 23 145 

Что касается предупреждений, функция по умолчанию использует k=5 при вычислении ближайших соседей примеров из одного определенного класса. Однако в некоторых наборах данных невозможно вычислить выбранное количество соседей из-за недостаточного количества примеров. Например, если у вас есть только 3 примера класса A, когда вы выбираете случай из этого класса, вы сможете найти не более 2 ближайших соседей из этого класса!

Таким образом, когда выбранное число k слишком велико для определения конкретного числа соседей случая, отображается предупреждение.

person paobranco    schedule 21.12.2018