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.