sábado, 9 de maio de 2015

Dados Missing

Hoje falaremos de um problema que acontece quase sempre em projetos de machine learning, dados missing ou faltantes. Por ser tão comum, principalmente quando falamos em big data, não consideramos de fato um problema e sim uma etapa a mais na análise. Na literatura especializada há muitas abordagens tratando de qual a melhor forma de analisar os seus dados na presença de dados missing. Discutiremos algumas destas formas e mostraremos uma aplicação em map reduce R, que também serve como um exemplo do nosso primeiro post, R com hadoop.
                Há três tipos de dados faltantes: missing completamente aleatórios (MCAR – missing completely at random), missing aleatórios (MAR – missing at random) e missing não aleatórios (MNAR – missing not at random).
O MCAR ocorre quando os dados faltantes são completamente independentes das variáveis observadas e dos parâmetros de interesse. O MCAR acontece, por exemplo, quando o sensor de captura de dados para de funcionar por algum período de tempo. Infelizmente, este tipo de missing não é comum. A razão do infelizmente ficará clara adiante, pois o MCAR é o tipo mais fácil de ser solucionado. As vezes pode parecer que os seus dados são MCAR, mas na verdade não o são. Por exemplo, se o sensor de captura parar de funcionar por aumento demasiado de entrada de dados de uma determinada característica, não será mais um mecanismo de missing MCAR.
O MAR ocorre quando o missing é dependente de alguma outra variável explicativa. O nome missing at random confunde muito as pessoas, que, ao ouvirem, geralmente pensam no missing completely at random. Pessoas com renda alta tendem a não querer responder quantos televisores possuem em casa. Isto é um exemplo de MAR e indica que o número de televisores está relacionado com a renda.
Por fim, o MNAR ocorre quando o missing depende da própria variável. Um exemplo clássico deste tipo de missing é a estimação de renda. Pessoas com renda alta tendem a não querer informar a sua renda.
Há diversas formas de tentar contornar o problema de missing. A primeira utilizada historicamente foi simplesmente excluir das análises as observações que tinham dados faltantes. Por ser uma solução fácil, foi muito utilizada. No entanto, é fácil depreender que, excluído o MCAR, nos outros tipos de missing, as estimativas serão viesadas.
Outra alternativa é a categorização das variáveis. Assim, por exemplo, podemos transformar a variável renda em várias categorias, como de 0 a 1.000 reais, de 1.001 a 3.000 reais, maior que 3.001 reais e deixar os campos missing em uma nova categoria. Se a variável for categórica, basta adicionar uma nova categoria de missing. Esta discretização pode ser proposta por experiência prévia ou até mesmo ser feita com algum algoritmo de otimização para criar categorias mais heterogêneas entre si em relação a variável resposta. Este método também é utilizado para evitar problemas de valores aberrantes (outliers). O problema desta proposta é que perdemos toda a variância dos dados. Assim, no exemplo acima, quem tem renda igual a 3.005 reais será tratado de forma igual a quem tem uma renda de 20.000 reais.
A imputação pela média é outro método fácil que foi muito utilizado no passado. Consiste em substituir os dados faltantes pela média dos dados observados. A grande crítica deste método é que diminuímos consideravelmente a variância, por colocarmos o mesmo valor para vários campos. Assim, o erro padrão de uma regressão logística será subestimado e podemos considerar, por engano, algumas variáveis como significativas.
Outra técnica bastante conhecida é substituir os missing por algum modelo. Este procedimento, se bem executado, soluciona os casos de MAR, visto que podemos utilizar a variável dependente para estimar o valor do dado faltante. Falaremos de uma aplicação desta abordagem adiante, em que substituiremos o missing por um modelo aditivo generalizado (GAM – generalized additive models) que ajusta funções não lineares por meio de splines.
Uma outra forma de imputação que já utilizei na prática para testes foi a substituição pelo método do vizinho mais próximo. Com esta abordagem, primeiramente calculamos a distância entre todas as observações. Para cada observação com dados missing, escolhemos como o valor para a substituição, a média dos valores das k observações mais próximas. Este método até produz bons resultados, mas é complicado computacionalmente, principalmente para projetos com muitas observações.
Duas técnicas vêm ganhando destaque nos últimos anos por conseguirem bons resultados. Uma consiste em encontrar os estimadores de máxima verossimilhança, diretamente dos dados incompletos por meio do algoritmo EM (expectation-maximization). A ideia apesar de simples e elegante é computacionalmente complicada. A outra técnica é conhecida como multiple imputation e consiste em, primeiramente, criarmos várias bases de dados completos, substituindo os valores faltantes por um valor simulado da distribuição preditiva baseada nos dados observados por meio de um método de Monte Carlo. Outra forma de realizar a imputação dos dados para a formação das bases completas é por meio de uma regressão estocástica, que consiste na construção de modelos de regressão, da mesma forma que foi comentada acima, e da simulação do erro pressuposto no modelo para chegar a vários valores previstos para a formação de todas as bases, assim trazendo uma maior variabilidade aos dados imputados. Com a criação das bases, procedemos com a nossa análise em todas as bases e agrupamos os resultados obtidos. Por exemplo, se o objetivo for a construção de um modelo de regressão, calculamos a regressão em todas as bases e usamos as médias dos valores estimados como estimativa final.
Para exemplificar tudo o que discutimos até aqui, irei aplicar o método de imputação por modelo pensado para ser realizado na presença de muitas variáveis com valores missing. Nestes casos, fica inviável a construção de um modelo manual para cada uma destas variáveis. Os códigos em R, base de dados e as queries utilizadas dentro do Hive estão disponíveis em (https://github.com/carlosrelvas/Imputation).
Há 8 arquivos disponibilizados. Segue abaixo uma descrição de cada:
·         Simulation_correlation_data.R – código em R para a simulação de uma base de dados supondo uma distribuição normal multivariada. Usamos este código para a construção da base de dados com variáveis correlacionadas utilizadas neste exemplo.
·     Imputation_data.txt – base de dados com 10 variáveis simuladas construídas com o código acima.
·         Mapper_pearson.R e Reducer_pearson.R – funções mapper e reducer em R utilizadas para o cálculo da correlação de Pearson entre todas as variáveis da base de entrada.
·  Order_pearson.R – código em R utilizado para devolver as variáveis mais correlacionadas com cada uma.
·   Mapper_gam_imp.R e Reducer_gam_imp.R – funções mapper e reducer em R utilizadas para os cálculos dos modelos aditivos generalizados.
·    Queries_imputation.txt – queries utilizadas dentro do hive para executar todas as funções acima.
Como temos muitas variáveis com dados faltantes e por consequência muitos modelos a serem construídos, a primeira coisa que fazemos é calcular a correlação de Pearson entre todas as variáveis. Fazemos isso com um código em map reduce em R. Trata-se de um bom exemplo de como utilizar o R com hadoop e pode ser visto como um complemento ao primeiro post deste blog. Não entrarei em detalhes de como foi desenhada a lógica deste código, mas qualquer dúvida é só escrever ou comentar por aqui mesmo.
Com todas as correlações calculadas, utilizamos o código order_pearson.R cujo objetivo é devolver as variáveis mais correlacionadas para cada uma das variáveis. Ele possui um argumento que indica quantas variáveis desejamos utilizar nos modelos a serem construídos. No caso escolhi o valor de 3. Assim ele irá salvar um arquivo com as 3 variáveis mais correlacionadas em valor absoluto para cada uma das variáveis.
O próximo passo é a construção dos modelos, que fazemos em paralelo com a lógica map reduce. A função mapper irá passar para os reducers as variáveis com valores faltantes e as variáveis com maiores correlações. O reducer, por sua vez, irá construir o modelo aditivo generalizado para substituir os missing pelos valores previstos por estes modelos. Utilizamos o modelo aditivo generalizado para capturar possíveis relações não lineares por meio do ajuste de splines. Caso o interesse do leitor seja o ajuste de modelos de regressão, basta substituir no código esta parte.
Resumindo o que apresentamos aqui, temos o método de Pearson para fazer uma seleção automática de variáveis para serem usadas em cada um dos modelos. Fazemos isso por não ser viável a construção de todos os modelos de forma manual. É claro que a correlação de Pearson pode não ser o melhor método para se fazer isso. Aqui está apenas uma possível solução. O uso de apenas três variáveis para cada modelo também foi escolhido sem nenhum critério, mas é facilmente alterado no código.
Com estes scripts, alterando apenas a parte final do código reducer_gam_imp.R para fazer uma regressão estocástica, podemos construir diversas bases completas e continuar nossa análise com o método de multiple imputation que vem se mostrando mais eficaz.
Já testei vários destes métodos na prática e a eficiência de cada um depende muito do problema em questão.

3 comentários:

  1. Excelente post Carlos !!!

    Vc tem outros exemplos de tratamento de missing no R ?

    ResponderExcluir
  2. Betway Casino Bonus Code - JTHub
    Betway Casino no deposit 양주 출장안마 bonus codes 안동 출장마사지 & Review - Get the latest 울산광역 출장마사지 Betway casino bonus 광명 출장안마 codes 부천 출장안마 and latest promo codes at JTGhub.com.

    ResponderExcluir