Treinando uma árvore de decisão contra dados desequilibrados
Eu sou novo na mineração de dados e estou tentando treinar uma árvore de decisão contra um conjunto de dados altamente desequilibrado. No entanto, estou tendo problemas com baixa precisão preditiva.
Os dados consistem em estudantes que estudam nos cursos, e a variável da turma é o status do curso que possui dois valores - Retirado ou Atual.
No conjunto de dados, há muito mais instâncias Atual que Retirada. Instâncias retiradas representando apenas 2% do total de instâncias.
Eu quero ser capaz de construir um modelo que possa prever a probabilidade de uma pessoa se retirar no futuro. No entanto, ao testar o modelo em relação aos dados de treinamento, a precisão do modelo é terrível.
Eu tive problemas semelhantes com as árvores de decisão, onde os dados são dominados por uma ou duas classes.
Que abordagem posso usar para resolver esse problema e criar um classificador mais preciso?
Uma coisa a considerar é alterar os termos da penalidade para diferentes tipos de classificação incorreta. Você não diz que software está usando, mas acredito que todo bom software para árvores deve incluir maneiras de fazer isso.
Este é um exemplo de livro didático de Por que a precisão não é a melhor medida para avaliar modelos de classificação? Use previsões probabilísticas e avalie-as usando regras de pontuação adequadas, não precisão , e seus problemas desaparecerão.
Esse é um problema interessante e muito frequente na classificação - não apenas nas árvores de decisão, mas em praticamente todos os algoritmos de classificação.
Como você descobriu empiricamente, um conjunto de treinamento que consiste em diferentes números de representantes de qualquer classe pode resultar em um classificador tendencioso para a classe majoritária. Quando aplicado a um conjunto de testes com desequilíbrio semelhante, esse classificador produz uma estimativa de precisão otimista. Em um caso extremo, o classificador pode atribuir todos os casos de teste à classe majoritária, alcançando uma precisão igual à proporção de casos de teste pertencentes à classe majoritária. Esse é um fenômeno bem conhecido na classificação binária (e se estende naturalmente às configurações de várias classes).
Essa é uma questão importante, porque um conjunto de dados desequilibrado pode levar a estimativas de desempenho infladas. Por sua vez, isso pode levar a conclusões falsas sobre a importância com que o algoritmo teve um desempenho melhor que o acaso.
A literatura de aprendizado de máquina sobre esse tópico desenvolveu essencialmente três estratégias de solução.
Você pode restaurar o equilíbrio no conjunto de treinamento por undersampling a grande classe ou por oversampling a pequena classe, para evitar viés de surgir em primeiro lugar.
Como alternativa, você pode modificar os custos de classificação incorreta, conforme observado em uma resposta anterior, novamente para evitar distorções.
ϕ : = 12( π++ π-) ,ϕ:=12(π++π−),π+π+π−π−
Eu recomendaria considerar pelo menos duas das abordagens acima em conjunto. Por exemplo, você pode exagerar sua classe minoritária para impedir que seu classificador adquira um viés em favor da classe majoritária. Depois disso, ao avaliar o desempenho do seu classificador, você pode substituir a precisão pela precisão equilibrada. As duas abordagens são complementares. Quando aplicados em conjunto, devem ajudar a evitar o problema original e a evitar conclusões falsas.
Eu ficaria feliz em publicar algumas referências adicionais à literatura, se você gostaria de acompanhar isso.
Broder - obrigado pela informação detalhada. Isso foi realmente útil! Inicialmente, tentei usar a funcionalidade de mineração de dados no SQL Server; no entanto, seguindo seus conselhos, passei a usar R. Usei o algoritmo SMOTE para reequilibrar o conjunto de dados e tentei usar as árvores de decisão e o SVM. Os DTs fornecem uma precisão equilibrada de 81% e ainda melhor com o SVM. Porém, uma pergunta - devo testar o modelo em relação a um conjunto de dados que também contém dados rebalanceados? Ou deveria ser testado com dados mais parecidos com o original?
— Chrisb #
Isso é ótimo de ouvir. Em relação à sua pergunta: você não deseja equilibrar seus dados de teste. Isso influenciaria sua avaliação de desempenho, pois você testaria alguns exemplos duas vezes (no caso de superamostragem) ou omitiria alguns exemplos do teste (no caso de subamostragem). Em resumo, você deseja equilibrar seu conjunto de treinamento (separadamente em cada dobra de validação cruzada), mas depois testar os dados de teste não modificados (potencialmente desequilibrados).
Obrigado Broder. Isso coloca uma imagem diferente nas coisas. A precisão equilibrada cai para cerca de 56%. A sensibilidade cai para 17% no meu melhor modelo (correspondente à classe de que preciso para obter melhores previsões). Suponho que isso faça sentido porque a classe superamostrada é essa classe, de modo que esses exemplos serão contados várias vezes. Vou tentar aumentar o balanceamento do conjunto de dados de treinamento para ver se isso faz alguma diferença.
Depois de testá-lo com diferentes proporções de dados balanceados, a melhor precisão balanceada que posso obter é com o Ada Boost com 60%. Estou lutando para determinar o que é "bom". Meu principal objetivo é prever os alunos que podem desistir do curso. Com Retirada sendo minha classe positiva, tenho tentado maximizar meu número de verdadeiros positivos (isto é, aumentar a sensibilidade). O reequilíbrio dos dados faz isso em detrimento do número de falsos negativos. 60% não parece muito melhor do que aleatório para mim - mas não tenho linha de base para o que é "bom" neste caso.
@chrisb, este é um comentário um pouco tardio (!). Em uma tangente, você pode tentar a regressão de Riscos Proporcionais de Cox ( cran.r-project.org/doc/contrib/Fox-Companion/… ) para modelar a sobrevivência de seus alunos. Você pode não precisar de mais ou menos amostragem.
As quatro idéias a seguir podem ajudá-lo a resolver esse problema.
2∗Precision∗RecallPrecision+Recall2∗Precision∗RecallPrecision+Recall
Use o parâmetro 'previous' nas Árvores de Decisão para informar o algoritmo da frequência anterior das classes no conjunto de dados, ou seja, se houver 1.000 positivos em um conjunto de 1.000.000.000 de dados prior = c(0.001, 0.999)(em R).
Use o argumento 'pesos' na função de classificação usada para penalizar severamente o algoritmo por erros de classificação dos casos positivos raros
Use o argumento 'cost' em alguns algoritmos de classificação - por exemplo, rpartem R - para definir custos relativos para classificações errôneas de verdadeiros positivos e verdadeiros negativos. Naturalmente, você deve definir um alto custo para a classificação incorreta da classe rara.
Eu não sou a favor da superamostragem, pois ela introduz observações dependentes no conjunto de dados e isso viola as suposições de independência feitas tanto em Estatística quanto em Aprendizado de Máquina.
Eu dei uma resposta no tópico recente :
O que fazemos é escolher uma amostra com diferentes proporções. No exemplo mencionado, seriam 1000 casos de "SIM" e, por exemplo, 9000 de casos "NÃO". Essa abordagem fornece modelos mais estáveis. No entanto, ele deve ser testado em uma amostra real (com 1.000.000 de linhas).
Não apenas fornece uma abordagem mais estável, mas os modelos geralmente são melhores, no que diz respeito às medidas de sustentação.
Você pode pesquisá-lo como "superamostragem nas estatísticas", o primeiro resultado é muito bom: http://www.statssa.gov.za/isi2009/ScientificProgramme/IPMS/1621.pdf
— grotos
Adicionando à resposta da @Kay 1ª estratégia de solução: Oversampling de Minoria Sintética ( SMOTE ) geralmente funciona melhor do que a amostragem abaixo ou acima da minha experiência, pois acho que isso cria um compromisso entre os dois. Ele cria amostras sintéticas da classe minoritária usando os pontos de dados plotados no espaço preditivo multivariado e leva mais ou menos pontos médios entre pontos adjacentes nesse espaço para criar novos pontos sintéticos e, portanto, equilibrar os tamanhos de classe. (não tenho certeza dos pontos médios, detalhes do algoritmo aqui