Como usar smote para dados desequilibrados em r (com exemplo)


Muitas vezes, ao trabalhar com algoritmos de classificação de aprendizado de máquina, as classes no conjunto de dados ficam desequilibradas.

Por exemplo:

  • Um conjunto de dados contendo informações sobre se os jogadores universitários são ou não convocados para a NBA pode ter 98% dos jogadores não convocados e 2% sendo convocados.
  • Um conjunto de dados contendo informações sobre se os pacientes têm ou não câncer pode conter 99% dos pacientes sem câncer e apenas 1% com câncer.
  • Um conjunto de dados contendo informações de fraude bancária pode conter 96% de transações legítimas e 4% de transações fraudulentas.

Devido a essas classes desequilibradas, o modelo preditivo construído pode não funcionar bem na classe minoritária.

Pior ainda, a classe minoritária é muitas vezes aquela que mais queremos prever.

Uma maneira de resolver esse problema de desequilíbrio é usar a técnica de sobreamostragem minoritária sintética , geralmente abreviada como SMOTE .

Esta técnica envolve a criação de um novo conjunto de dados por meio da sobreamostragem de observações da classe minoritária, o que produz um conjunto de dados com classes mais equilibradas.

A maneira mais fácil de usar SMOTE em R é usar a função SMOTE() do pacote DMwR .

Esta função usa a seguinte sintaxe básica:

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

Ouro:

  • form : Uma fórmula que descreve o modelo que você deseja adaptar
  • data : nome do quadro de dados
  • perc.over : Número que determina quantos casos adicionais da classe minoritária são gerados
  • perc.under : Número que determina quantos casos adicionais da classe majoritária são gerados

O exemplo a seguir mostra como usar esta função na prática.

Exemplo: como usar SMOTE em R

Suponha que temos o seguinte conjunto de dados com 100 observações em R em que 90 têm uma classe “Sim” e 10 têm uma classe “Não” para a variável de resposta:

 #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

Este é um exemplo clássico de conjunto de dados desequilibrado porque a variável de resposta que estamos prevendo tem 90 observações com classe “Sim” e apenas 10 observações com classe “Não”.

Para criar um conjunto de dados mais balanceado, podemos usar a função SMOTE() do pacote 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

O conjunto de dados resultante contém 210 observações com “Não” como classe e 800 observações com “Sim” como classe.

Veja exatamente como a função SMOTE produziu esse novo conjunto de dados:

  • O argumento perc.over especificou que queríamos adicionar 2.000/100 (ou 20) vezes o número de observações minoritárias existentes ao conjunto de dados. Como existiam 10 observações no conjunto de dados original, adicionamos 20*10 = 200 observações minoritárias adicionais .
  • O argumento perc.under especificou que queríamos fazer com que o número de observações majoritárias fosse igual a 400/100 (ou 4) vezes o número de observações minoritárias adicionadas às observações minoritárias existentes. Como foram adicionadas 200 observações minoritárias adicionais, tornamos o número de observações majoritárias igual a 200 * 4 = 800 observações majoritárias .

O resultado final é um conjunto de dados que ainda contém mais classes majoritárias, mas ainda é mais equilibrado do que o conjunto de dados original.

Agora você pode adaptar o algoritmo de classificação de sua escolha a este novo conjunto de dados, que deverá ter melhor desempenho na classe minoritária, uma vez que há mais observações da classe minoritária neste novo conjunto de dados.

Nota : Sinta-se à vontade para brincar com os argumentos perc.over e perc.under na função SMOTE para obter um conjunto de dados que atenda às suas necessidades.

Recursos adicionais

Os tutoriais a seguir explicam como realizar outras tarefas comuns em R:

Como criar tabelas de resumo em R
Como normalizar dados em R
Como remover outliers em R

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *