Sugestões para aprendizado sensível a custos em um ambiente altamente desequilibrado

15

Eu tenho um conjunto de dados com alguns milhões de linhas e ~ 100 colunas. Gostaria de detectar cerca de 1% dos exemplos no conjunto de dados, que pertencem a uma classe comum. Eu tenho uma restrição de precisão mínima, mas devido ao custo muito assimétrico, não estou muito interessado em nenhum recall específico (desde que eu não tenha 10 correspondências positivas!)

Quais são algumas abordagens que você recomendaria nessa configuração? (links para artigos bem-vindos, links para implementações apreciadas)

em70
fonte

Respostas:

15

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.

MattBagg
fonte
Obrigado pela resposta detalhada. Eu tentei subamostrar e falhei miseravelmente. Os modelos mostram excelente desempenho dentro da amostra, mas o desequilíbrio ainda está presente no conjunto de testes (e nos dados do mundo real que irei usar eventualmente), portanto a precisão OOS dos modelos é horrível. Também tentei pesos específicos de classe, mas meu aplicativo envolve um custo mais alto facilmente quantificável para falso positivo do que para falso negativo. Como para um classificadores classe, tentei encaixar um svm linear (os não-lineares são muito lentos) e que tem 0 de precisão mesmo em amostra ...
Em70
11
Sinto por você. Alta precisão é difícil se a grande maioria dos seus casos for negativa. Eu usaria pesos específicos de classe (como inversamente proporcional à fração de casos da classe) para aprender e salvar os pesos específicos de tipo de erro para determinar o limite de decisão. Espero que você esteja usando a validação cruzada com a precisão kappa de Cohen para a seleção do modelo. Eu visualizava a densidade de probabilidades para as classes nos dados de calibração ao longo da precisão lateral e enriquecimento (precisão / proporção de casos positivos) em todos os pontos de corte para realmente entender as compensações disponíveis.
21814 MattBagg #
Ótima resposta, obrigado. Estou usando uma técnica semelhante à mencionada EasyEnsemble há algum tempo, mas duvidei dela (apesar do desempenho sensível em dados simulados). Agora eu sei que faz sentido.
ayorgo 21/09/19
5

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

Charles
fonte
O problema de variar o limite é que é como alterar a interceptação de um modelo de regressão. Na realidade, talvez eu queira alterar o vetor de peso para manter o custo em consideração. Mas se eu fizer isso, dado o desequilíbrio já severo, terminarei com 0 de precisão! Eu não decidi por nenhum algoritmo e tenho recursos para implementar idéias de pesquisa de ponta, se forem promissoras. Vou dar uma olhada no livro que você sugeriu.
em70 16/05
O capítulo é mais ou menos. Esforço sólido, mas tópico difícil de resumir. Muitas reivindicações não suportadas foram publicadas em vários métodos. Acho que a subamostragem estratificada em florestas aleatórias é um bom começo de uma perspectiva de aprendizado de máquina. O código está no pacote do livro.
charles
0

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.

Cinza
fonte
Você pode dizer mais sobre como os pesos das classes podem ser usados ​​para atingir os objetivos do OP? Acho que isso está implícito na sua postagem, mas isso ainda não é uma resposta.
gung - Restabelece Monica
Sim, o argumento class_weight pode ter um valor 'auto' se alguém examinar a documentação ou pode ter um valor de dicionário com os pesos da classe. No caso de 'auto', o próprio algoritmo de aprendizado encontra o peso de cada classe de acordo com o número de amostras em cada uma.
Ash