SMOTE gera erro por problema de desequilíbrio de várias classes


9

Estou tentando usar o SMOTE para corrigir o desequilíbrio no meu problema de classificação de várias classes. Embora o SMOTE funcione perfeitamente no conjunto de dados da íris conforme o documento de ajuda do SMOTE, ele não funciona em um conjunto de dados semelhante. Aqui está a aparência dos meus dados. Observe que ele possui três classes com os valores 1, 2, 3.

> data
   looking risk every status
1        0    1     0      1
2        0    0     0      1
3        0    0     0      2
4        0    0     0      1
5        0    0     0      1
6        3    0     0      1
7        0    0     0      1
8        0    0     0      1
9        0    1     0      1
10       0    0     0      1
11       0    0     0      3
12       0    0     0      1
13       0    0     0      1
14       0    0     0      1
15       0    0     0      2

É na forma de dataframe, o mesmo que iris:

> class(data)
[1] "data.frame"

Aqui está o meu código usando SMOTE e o erro que ele lança:

> newData <- SMOTE(status ~ ., data, perc.over = 600,perc.under=100)
Error in scale.default(T, T[i, ], ranges) : subscript out of bounds
In addition: Warning messages:
1: In FUN(newX[, i], ...) :
  no non-missing arguments to max; returning -Inf
2: In FUN(newX[, i], ...) :
  no non-missing arguments to max; returning -Inf
3: In FUN(newX[, i], ...) :
  no non-missing arguments to max; returning -Inf
4: In FUN(newX[, i], ...) : no non-missing arguments to min; returning Inf
5: In FUN(newX[, i], ...) : no non-missing arguments to min; returning Inf
6: In FUN(newX[, i], ...) : no non-missing arguments to min; returning Inf

tente converter sua coluna de destino (ou seja, "status") em fator e considere marcar a postagem de @ xing abaixo como resposta.
Esverdeado

Respostas:


13

Eu encontrei um problema semelhante e resolvi transferindo os valores da classe ("status" no seu caso) para o tipo de fator. Após o uso data$status=factor(data$status), newDataimprime da seguinte maneira:

     looking risk every status
7          0    0     0      1
2          0    0     0      1
7.1        0    0     0      1
12         0    0     0      1
4          0    0     0      1
12.1       0    0     0      1
11         0    0     0      3
8         NA   NA    NA      3
9         NA   NA    NA      3
10        NA   NA    NA      3
111       NA   NA    NA      3
121       NA   NA    NA      3
13        NA   NA    NA      3

Sem erros!


É uma pena que não esteja mencionado na SMOTEdocumentação que ele funcione apenas se os rótulos forem um fator!
Pop

para mim, chega. convertendo em fator corrigido.
Esverdeado
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.