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