SMOTE, чтобы сбалансировать более 200 классов в R - PullRequest
0 голосов
/ 28 ноября 2018

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

SMOTE из UBL

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 и все же конечный результат такой же.

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

1 Ответ

0 голосов
/ 21 декабря 2018

Функция 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 слишком великочтобы определить это конкретное число соседей по делу, отображается предупреждение.

...