Genealogia e Data Science. A tecnologia a benefício dos pesquisadores.

imagem: yesmagazine.org

Vamos abordar uma dificuldade que muitos pesquisadores enfrentam — os indivíduos desencontrados. Nomes que a principio não há relacionamento com os indivíduos da nossa pesquisa ou pelo menos não neste momento.

A dificuldade

Quase todos os dias recebo e-mails a procura de dados de um determinado indivíduo, geralmente este vem vinculado de nome, sobrenome, cônjuge, localidade e rara as vezes com o nome dos pais. Também adquiro planilhas públicas na web de diversas fontes de dados.

A dificuldade é, como saber se estes indivíduos podem ter algum tipo de parentesco com os meus dados já pesquisáveis? Perceba, conferir manualmente um indivíduo ou outro é uma coisa, agora como conferir centenas/milhares de indivíduo?

Exemplo
E-mail: Procuro pelo nome de meu antepassado ….
Indivíduo: João Fernandes Castelo Branco, Pernambuco. Casado com Maria Joaquina de Jesus. Ele filho de Maria Fernandes.

O que faço?

Primeiro: Uma busca em minha arvore genealógica e minha anotações.
Segundo: Uma busca nos principais players de genealogia (web).
Terceiro: Uma busca no arquivo de desencontrados (planilhas).

“ isto é, sem mencionar os homônimos, esses dão um nó a nossa cabeça…”

Se nenhuma das condições acima forem satisfeitas, acrescento os dados recebidos na planilha dos desencontrados (guarde esse nome) e deixo como um registro a ser confrontado em algum tempo, quem sabe algum dia tal dado manifeste relação aos demais indivíduos já conhecidos.

planilha dos indivíduos desencontrados

O Problema

Contudo a pesquisa não para vira e mexe vou encontrando novos indivíduos e acrescentando-os em minha pesquisa, contudo estes novos indivíduos podem estar de alguma forma correlacionados com os indivíduos da planilha dos desencontrados, seja um primo, tio avô, sobrinho, algum parente próximo. Todavia nem sempre tenho ânimo/tempo para tentar cascavilhar os novos dados com os dados desencontrados (*lembre-se, estamos falando de centenas/milhares de dados), principalmente se estes não tem relação direta com o ramo pesquisado, e esta falta de ânimo se dá por um motivo muito simples a quantidade de dados serem confrontados ao longo do tempo.

Ora só na minha base de dados [software] possuo mais de 18.000 indivíduos identificados, e nesses não estão incluso as fontes de dados de planilhas, sites, informações não catalogadas, e-mails e outros. O problema é como classificar tudo isso, revisitar os dados “desencontrados”, que talvez neste momento da pesquisa passem a fazer sentido ao todo a massa de dados já conhecida.

E se tivéssemos uma maneira de classificar cada indivíduo desencontrado, de tal modo a dizer se o mesmo tem parente próximo dos indivíduos já conhecidos? Fazer isso manualmente seria um trabalho árduo.

Pensando nesta problemática, recorri aos meus conhecimentos técnicos. E se as máquinas “computadores”, puder me auxiliar nesta tarefa.

Daqui em diante entrarei em uma parte mais técnica, contudo procurarei ser compreensivo na forma explicativa, vou tentar ….

Inteligência Artificial (IA) e algoritmos de Machine Learning (aprendizado de máquina)

Data Science, o que é?

Cientista de dados ou (em inglês, Data Science), é o responsável por transformar dados em informações, é também responsável pela formulação dos problemas, escolha de modelos, insight, estatística e a entrega de dados trabalhados.

Minha formação acadêmica é tecnologia da informação, pós-graduado em business Intelligence e uma MBA em Data Science, onde passo a aplicar conceitos de Data Science no mundo genealógico.

Sendo assim como posso tirar proveito dessas duas ciências genealogia e tecnologia?

Vamos lá ….

As tecnologias aqui aplicadas vou deixar os links no item referências.

O que pretendendo?

Existe um monte de indivíduos desencontrados alguns desses sei que tem parentesco com a minha pesquisa outros não. Batendo o olho já sei dizer quem tem ou não e a mesma coisa eu consigo treinar o computador, treinar um programa, isso mesmo, treino um programa, para dizer se [tem parente próximo] = 1 ou não = 0.

O primeiro passo

Organizar os dados, ou seja os dados já conhecidos, embora sejam conhecidos mas não quer dizer que estejam organizados ou padronizados. Para isso utilizarei da técnica de classificação (modelo), esta vou aplicar primeiro na minha base de dados, fazendo com que o programa (computador) passe a compreender “pensar” o que pretendo ensinar, isso mesmo ensinar a máquina, vou falar mais sobre isso.

Algoritmo de Classificação

Um modelo de classificação binária tem como objetivo decidir em qual classe uma nova observação pertence dentre duas classes possíveis. Em geral as duas classes, denominadas de 0 e 1, indicam a ocorrência ou não de um determinado evento. No meu caso estarei utilizando para classificar se um determinado indivíduo desencontrado possui algum parentesco com os demais já conhecidos =1 ou não =0, dado uma amostra de observação classificarei entre 0 ou 1.

A avaliação de um modelo de classificação é feita a partir da comparação entre as classes preditas pelo modelo e as classes verdadeiras de cada exemplo. Todas as métricas de classificação têm como objetivo comum medir quão distante o modelo está da classificação perfeita, porém fazem isto de formas diferentes.

Então vamos lá… mão na massa com os dados, vou dividir os processos em duas grandes etapas e ambas incluem subetapas:

1. Limpeza dos dados.
2. Modelo de classificação

01. LIMPEZA DOS DADOS

Essa etapa consiste em tratar dos dados que serão avaliados, da seguinte forma: importando, padronizando, definindo o seu tipo, tratados os ausentes, remover os possíveis duplicados, discretização e remover os discrepantes dos demais.

Leitura do arquivo

Primeiro passo exportar os meus dados que para estes possam ser importados, o formato que escolhido tanto a exportação quanto a importar dos dados é o formato *.CSV [1], do qual dei o nome de familias.csv.

1.1 — importando arquivo familia.csv

arquivo no formato .csv

1.2 — Lendo o arquivo importado, podemos perceber que o arquivo é composto de 18632 linhas e 32 colunas.

tabela importada e sem tratamento

1.3 — Renomeando as colunas.

tipo de cada coluna (object)

1.4 — Verificando os dados nulos.

quantidade de dados nulos

1.5 — Tratando os dados ausentes.

dados ausentes ou nulos colocado em branco

1.6— Checando os dados duplicados.

não há registros duplicados

1.7 — Padronização de nomes, coluna de prefixo e outras.

coluna de prefixo padronizada

1.8 —Criando novas colunas e separando dia, mês e ano das colunas: nascimento, falecimento e casamento.

inserindo novas colunas
colunas com as datas separadas

1.9 — Discretização dos dados, categorizando o ano de nascimento dos indivíduos em relação ao século do nascimento.

categorizando o individuo dentro do século de seu nascimento.

1.10 — Modelo preparado para ser submetido ao aprendizado de máquina.

modelo limpo e preparado para ser submetido ao aprendizado de máquina.

Modelo preparado.

Neste ponto os dados já estão refinados “limpos”, ou seja, estão prontos para serem aplicados ao modelo de classificação. Vale destacar que a etapa de limpeza de dados, corresponde ao maior trabalho dentro de todas as etapas, pois demanda analisar cada variável, seu tipo além da matriz de correlação, confusão, calor entre outros.

Dito isso segunda fase, modelo de classificação.

02. MODELO DE CLASSIFICAÇÃO

Essa etapa consiste em métricas de avaliação em Machine Learning: Classificação, métricas, treinos, testes, validações, desempenho dos algoritmos e o modo de combinação dos dados. Para utilização dos algoritmos utilizarei a biblioteca scikit-learn da linguagem python. [2]

Machine Learning

Ao desenvolver projetos de Machine Learning e Data Science, é essencial a utilização de métricas apropriadas para cada problema. O valor delas reflete a qualidade de um modelo, portanto se forem mal escolhidas, será impossível avaliar se o modelo de fato está atendendo os requisitos necessários. Além disto, também é importante considerar quão interpretável as variáveis, para que os resultados de precisão, acurácia estejam mais próximas das características definida

“Conversando” com o programa

Uma vez que os dados estão prontos “limpos”, e um programa criado para lê-los, devo fazer o seguinte:

Envio para o programa um conjunto de dados os indivíduos conhecidos da minha base de dados e um outro conjunto de dados os indivíduos dos desencontrados e “digo” para o programa: “Tá aí, aprenda!”.

É assim, dados um novo indivíduo “desconhecido”, eu com a minha experiência de conhecer os meus dados, sei dizer se este novo indivíduo tem parente próximo ou não com os demais da minha pesquisa, de alguma forma eu aprendi a dizer se o indivíduo tem parente próximo ou não, baseado em análise e em características.

A mesma ideia aplica-se ao programa, dado um conjunto de dados para ele ou seja novos indivíduos “desconhecidos” o programa também aprenderá assim como eu aprendi, baseado nas mesmas análises e características, avalia os indivíduos e diz: “tem parente próximo”, avalia o próximo indivíduo e diz: “não tem parente próximo”.

E é assim que funciona um programa de classificação, ele classifica entre 0 ou 1. Ele responde qualquer pergunta do gênero que vai classificar alguma coisa entre 0 e 1, o que quer dizer 0? O que quer dizer 1?

No meu caso quer dizer se o individuo tem parente próximo ou não, poderia querer dizer outra coisa? Com certeza! Podemos usar a classificação entre 0 e 1 para diversas coisas, primeiro classificar a proximidade do individuo com os demais, reduzimos o problema para classificar entre 1 ou 0 e ensinar o programa a classificar.

Definindo as classes e suas características

Antes de submeter os dados ao programa, aquelas 18632 linhas, é preciso criar variáveis que corresponderam ao critério de avaliação ou seja quais são as características que o meu programa deve classificar entre 0 ou 1.

Implementando as seguintes características para cada individuo:

1 = Tem pelo menos algum sobrenome conhecido na minha base de dados.
2 = Tem nome o da mãe.
3 = Tem nome o do pai.
4 = Tem o nome de cônjuge.

Ao submeter os dados, o programa estará classificando cada uma dessas variáveis entre 0 ou 1, encontrou = 1, não encontrou = 0. De tal forma que o próprio programa avalia cada uma dessas variáveis e classifica um nova classe, tem parente próximo.

Métrica de avaliação

Tem Parente Próximo, está nova classe é baseada nas outras quatro variáveis “setadas” e calculada uma média simples. A soma das variáveis dividida pela quantidade das mesmas, se for 50+, classifico como tem parente próximo = 1 ou não tem parente próximo = 0.

((Tem_pelo_menos_um_sobrenome_Identificado + Tem_nome_da_mae +
Tem_nome_da_pai + Tem_pelo_menos_um_conjuge) / 4) ≥ 0.50, 1, 0)

Então a avaliação se resume a quê?

Feito isso, eu ou programa tomamos uma decisão baseados em toda experiência anterior que tivemos, baseados em toda experiência que o programa teve, todo treino que já foi feito, o programa vai avaliar as características desse individuo e toma uma decisão de [tem_parente_próximo] ou não.

Resumindo, os algoritmos serão baseados em características e iremos usar essas características entre 0 e 1, para treinarmos, testar e validar conforme os algoritmos escolhidos.

Machine Learning — (Aprendizado de máquina)

O aprendizado de máquina ou aprendizagem de máquina é um subcampo da Engenharia e da ciência da computação que evoluiu do estudo de reconhecimento de padrões e da teoria do aprendizado computacional em inteligência artificial

Aprendizagem supervisionada

O aprendizado supervisionado é a tarefa de aprendizado de máquina que consiste em aprender uma função que mapeia uma entrada para uma saída que busca responder um target, ou seja, há uma variável explícita a ser respondida. No meu caso quero que o programa responsa a variável Tem Parente Próximo?

Variáveis de entrada:
1 = Tem pelo menos algum sobrenome identificado.
2 = Tem nome o da mãe.
3 = Tem nome o do pai.
4 = Tem o nome de cônjuge.

Variável de Saída: Tem Parente Próximo = 1 ou 0

Treinando a máquina

O Python [3] é uma linguagem muito utilizada para análise de dados e aprendizagem de máquina, por isso, vou utilizá-la para criar os modelos.

Os algoritmos precisam conhecer os dados para começar a “adivinhar” os resultados. Esses dados já estão prontos conforme já demostrado.

Mas como os algoritmos vão conseguir classificar?

Existem vários algoritmos para o aprendizado de máquinas, um bem conhecido é o Multinomial e AdaBoost. Com esses algoritmos, vamos conseguir classificar o individuo se tem parente próximo ou não, também iremos comparar ambos os algoritmos para ver qual apresenta melhor resultado. Com biblioteca Scikit-learn podemos fazer a implementação dos algoritmos o Python importa da Scikit-learn naive_bayes o algoritmo Multinomial, que é uma das implementações do algoritmo Bayesiano.

bibliotecas
instanciando os algoritmos
dados e classes

Criamos nosso modelo, precisamos treiná-lo agora. Mas se nós usamos todos os dados para treinar o nosso modelo, como podemos validar depois?

Dividir entre treino, teste e validação

Se nós utilizarmos todos os nossos dados para treinamento, não conseguiremos validar o nosso algoritmo. Quer dizer, até conseguimos utilizar os mesmos dados para testar o aprendizado, mas o algoritmo já os conhecerá, ou seja, não teremos um cenário “desconhecido” para realizar o teste.

Pensando nisso, separei uma parte dos dados em dados de treino, dados de teste e dados de validação, com seguintes percentuais:

Total de dados: 18832
Treino 0.8 : 14904
Testes: 0.1: 1864
Validação: 0.1: 1864

etapas: treino, teste e validação

Agora basta invocar a função para nosso algoritmo treinar [fit], predizer o resultado do conjunto de teste e, com base nas nossas marcações, validar o tanto que o nosso algoritmo acertou (acurácia):

função para predizer os modelos

Rodando esse código, vemos que o algoritmo acertou cerca de 67% das vezes no Multinominal, 100% das vezes no AdaBoost.

resultado de comparação entre os algoritmos Multinominal e AdaBoost

Legal, a minha base de dados sofreu treino, teste e validações ou seja o programa já a conhecer. Mas o que acontece se eu submeter agora uma planilha desencontrada, lembra-se dela? Dados que o meu programa não tem ideia de quem sejam, como o algoritmo irá se comportar?

Vejamos:

classificação dos dados desconhecidos

Após rodar com os mesmos parâmetros de 0.80 para treino, 0.10 para testes e 0.10 para validações. Neste caso algoritmo acertou cerca de 92% das vezes no Multinominal e no Adaboost 100% das vezes. Percebemos que o primeiro algoritmo ficou até melhor do que no primeiro caso, porque isso aconteceu?

Total de dados: 399
Treino 0.8 : 317
Testes: 0.1: 41
Validação: 0.1: 41

resultados dos novos dados

Avaliação

Toda vez que enviamos um “novo” conjunto de dados para o programa, o algoritmo irá classifica-lo, baseado nas experiências anteriores que mesmo teve. Após isso nos devolve a variável se tem parente próximo ou não.

Percebemos que no primeiro caso tivemos como melhor desempenho o algoritmo AdaBoost com uma taxa de acerto de 100%, esse percentual é um pouco duvidoso pois acertar tudo me parece ser mais chute “algoritmo burro” do que matemática. Contudo o algoritmo MultinominalNB, nos trouxe uma taxa de acerto de 67% na primeira massa de dados e na segunda 92%. Porque a diferença sendo que estamos utilizando os mesmos critérios para avaliação?

Porque depende da quantidade de dados que estamos submetendo ao algoritmo, além da classificação das características e assim também como o mesmo foi treinado, lembrando no primeiro caso temo mais de 18.000 registros, no segundo caso apenas 399 registros desconhecidos, podemos ir “calibrando” as variáveis e assim como os percentuais de treino, teste e validações até chegar a uma taxa de acerto satisfatória para o meu problema, cada caso é um caso.

Conclusão

O uso de métricas apropriadas em um problema de classificação é crucial para o sucesso de um projeto de Machine Learning. A escolha da métrica deve levar em conta o objetivo do modelo no mundo real, o custo de cada tipo de erro, o quão interpretável ela deve ser, dentre outros fatores. É sempre importante ter uma visão crítica da avaliação de um modelo, e questionar se a escolha de métricas de fato reflete a definição de valor que a sua aplicação de Machine Learning necessita.

Os dados são muito importantes para construir os modelos, mais que isso, são eles que moldam o quão acurado nosso modelo preditivo pode ser.
Existem tipos de dados que dão mais trabalho de processamento e que precisam ser classificados para poder gerar algum valor.

Após a implementação desses modelos posso sujeitar ao programa a planilha dos desencontrados, assim como outros indivíduos que eventualmente aparecem. Baseando-se nas análises e características já conhecidas pelo meu modelo, o programa tem condição de predizer se tal individuo tem parente próximo ou não com os demais indivíduos já classificados.

Por fim, vou testar mais o modelo, testar com diferentes técnicas e testar de maneira adequada ao meu problema.

--

--

Eduardo Padilha dos Santos
Meu Legado - Genealogia Comprovada

Product Manager na Venture Negócios — Construindo a nova Era Digital | Data Science | Openbank | Python | Big Data). https://www.linkedin.com/in/eduardo-padilha