Descobri que He e Garcia (2009) são uma revisão útil da aprendizagem em problemas de classe desequilibrados. Aqui estão algumas coisas definitivamente não-abrangentes a serem consideradas:
Abordagens baseadas em dados:
Pode-se subamostrar a classe majoritária ou superexaminar a classe minoritária. (Breiman apontou que isso é formalmente o equivalente a atribuir custos não uniformes de classificação incorreta.) Isso pode causar problemas: A subamostragem pode fazer com que o aluno perca aspectos da classe majoritária; oversampling aumenta o risco de super ajuste.
Existem métodos de "subamostragem informada" que reduzem esses problemas. Um deles é o EasyEnsemble , que coleta amostras de vários subconjuntos da classe majoritária e faz vários classificadores combinando cada subconjunto com todos os dados da classe minoritária.
O SMOTE (técnica de superamostragem de minoria sintética) ou SMOTEBoost (combinando SMOTE com reforço) cria instâncias sintéticas da classe minoritária, tornando os vizinhos mais próximos no espaço de recursos. O SMOTE é implementado em R no pacote DMwR (que acompanha o livro de Luis Torgo “Mineração de dados com R, aprendendo com estudos de caso” CRC Press 2016 ).
Abordagens de adaptação do modelo
Aplique pesos específicos de classe em sua função de perda (pesos maiores para casos minoritários).
Para abordagens baseadas em árvore, você pode usar a distância de Hellinger como uma função de impureza do nó, conforme preconizado por Cieslak et al. "As árvores de decisão à distância Hellinger são robustas e insensíveis à inclinação" ( código Weka aqui .)
Use um classificador de uma classe , aprendendo (dependendo do modelo) uma densidade ou limite de probabilidade para uma classe e tratando a outra classe como discrepantes.
Obviamente, não use a precisão como métrica para a construção de modelos. O kappa de Cohen é uma alternativa razoável.
Abordagens de avaliação de modelos
Se o seu modelo retornar probabilidades previstas ou outras pontuações, escolha um ponto de decisão que faça uma troca apropriada de erros (usando um conjunto de dados independente do treinamento e teste). Em R, o pacote OptimalCutpoints implementa vários algoritmos, incluindo os sensíveis a custo, para decidir um ponto de corte.
Meu entendimento é que essa é uma área ativa de pesquisa na comunidade de aprendizado de máquina e não há grandes respostas, mas um número grande e crescente de possíveis soluções. É provável que você obtenha respostas melhores se especificar os algoritmos específicos que está considerando.
Se você estiver usando um modelo paramétrico (regressão logística), isso deve ser um problema menor e você pode apenas variar o limite com base na sua função de perda (custo de falsos negativos para falsos positivos)
Se você estiver usando algoritmos de aprendizado de máquina, isso pode ser mais complicado. Max Kuhn faz uma tentativa justa de resumir a questão no capítulo 16 de "Modelagem Preditiva Aplicada". Mas tópico desafiador para resumir. Se você não deseja comprar o livro, o código R está disponível no pacote AppliedPredictiveModeling deste capítulo e pode ser suficiente, dependendo da sua familiaridade com R e os algoritmos usados.
Geralmente, a discussão gira em torno de algoritmos com subamostragem / superamostragem +/- sensíveis a custos. Com variações como jous-boost também é possível.
Um exemplo desse tipo de discussão: Chen et al "Usando a floresta aleatória para aprender dados desequilibrados" http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf
fonte
Você pode dar uma olhada na implementação do scikit-learn. preste atenção ao argumento class_ weight, que pode ter valores de um dicionário de pesos de classe ou 'auto':
classe sklearn.svm.SVC (C = 1.0, kernel = 'rbf', grau = 3, gama = 0,0, coef0 = 0,0, encolhendo = Verdadeiro, probabilidade = Falso, tol = 0,001, cache_size = 200, class_weight = Nenhum, detalhado = Falso, max_iter = -1, random_state = Nenhum)
Você pode jogar com o valor do argumento class_weight, que pode ser um dicionário de peso de classe ou 'automático'. No modo 'automático', o algoritmo de aprendizado atribui pesos automaticamente a cada classe com base no número de amostras dentro de cada uma delas.
O scikit-learn possui vários outros algoritmos de classificação, alguns dos quais aceitam pesos de classe.
fonte