Usando Machine Learning para descobrir até quando você viveria em GoT

Vinícius Veríssimo
5 min readApr 14, 2019

--

Nas minhas andanças pela internet em busca de um conjunto de dados para fazer algo interessante eu acabei achando uma API com dados do universo de Game of Thrones e logo quis fazer algo interessante com ela.

Dentre os vários conjuntos de dados aquele que mais me chamou atenção foi a lista de todos os personagens que apareceram na história, com todas as informações importantes dele como: ano de nascimento e de morte (caso estivesse morto), casa, pais, filhos, entre outras.

E pensei comigo: “Será que dá pra prever a idade da morte de algum personagem a partir do nome dele?”

Apesar de não haver uma correlação entre o nome da pessoa e idade da morte dela, valia a pena usar os dados para fazer uma brincadeira.

Não seria algo simples como pegar o sobrenome de alguém e verificar se era um Targaryen e automaticamente dizer que estava morto, queria fazer algo que qualquer um pudesse colocar o seu próprio nome e verificar até que idade ela viveria em GoT. E como estou estudando algumas coisas de Machine Learning, por que não fazer um modelo para brincar com isso?

Então vamos lá!

Adquirindo os dados

A API é bem simples de utilizar, basta fazer uma requisição GET para o URL certa e ela retornará um JSON com todo os personagens. Mas nem sempre a API está funcionando corretamente, por isso em um dos momentos em que estava funcionando eu salvei o conteúdo num arquivo para evitar problemas.

Existem outras APIs e repositórios de dados da série por aí, mas dos que eu olhei esse era o que possuía mais personagens cadastrados, para ser mais exato, o arquivo que estou utilizando possui 2028 personagens.

Exemplos dos dados de um personagem

Pegando apenas os dados necessários

Apenas alguns desses dados serão importantes para realizarmos as predições. Coisas como id, data de criação e títulos são informações inúteis para o nosso caso, apenas utilizaremos os campos name, dateOfDeath e dateOfBirth.

Pré-processando os dados

Os dados não estão lindos, belos e prontos parem serem usados num algoritmo de Machine Learning, antes precisando fazer alguns tratamentos neles.

Pré-processando os nomes

Serão aplicados 3 etapas de pré-processamento dos nomes

  • Remoção de acentuações, são informações não muito relevantes para o caso, por exemplo: Í será substituído por I;
  • Remoção de símbolos e espaços em branco, estas também são informações desnecessárias. Alguns nomes possuem parênteses para diferenciar de outros personagens com o mesmo nome. Espaços em branco não são informações relevantes;
  • Deixar todos os nomes em minúsculo, a diferenciação de palavras maiúsculas e minúsculas não é relevante para o caso.

Pré-processamento das idades

No pré-processamento das idades irei substituir os campos de dateOfBirth e dateOfDeath pela idade do personagem. Existem 4 casos no dataset quando se trata das idades dos personagens:

  • Não possui o campo dateOfBirth;
  • Não possui o campo dateOfDeath;
  • Não possui ambos;
  • Possui ambos.

No primeiro caso não tem o que fazer, todos os personagens sem o campo dateOfBirth foram descartados.

No segundo caso, se o personagem possuir o campo dateOfBirth e não o dateOfDeath significa que ele ainda está vivo, nesse caso eu defini a idade deles como sendo -1, esse valor representará os personagens vivos (ou sortudos).

O terceiro caso cai na mesma condição do primeiro, os personagens são removidos.

O quarto caso é bem simples, com os campos dateOfBirth e dateOfDeath preenchidos corretamente é fácil descobrir a idade que um personagem tinha quando morreu, basta apenas calcular a diferença das datas.

As remoções aplicadas nesse passo deixou o dataset com apenas 478 personagens.

Encoding

Agora sim vamos preparar os dados para que possam entrar de vez na nossa rede neural.

Encoding dos nomes

Essa etapa é bem simples, basicamente aplicarei o One Hot Encoding nos nomes, usando como dicionário o próprio alfabeto. Além disso, será definido um tamanho fixo para os vetores dos nomes, aqueles menores que o tamanho máximo serão preenchidos com 0’s.

Encoding das idades

Essa parte também é bem simples caso você utilize uma biblioteca para te auxiliar, como eu fiz usando o Scikit-learn. Basicamente irei normalizar os valores das idades utilizando como base a menor e a maior idade do dataset.

Agora as idades irão variar entre 0 e 1, isso não faz com que percamos informação, muito pelo contrário para a rede é melhor que a variação dos valores seja pequena, além disso, é possível utilizar uma função inversa para recuperar o valor original.

A Rede Neural

O código foi feito totalmente em Python e utilizando o Keras (com TensorFlow) para a criação da rede neural.

Como eu disse anteriormente, não há uma correlação direta entre o nome de alguém e a sua idade de morte, logo, a rede provavelmente não convergirá para um resultado ótimo. Por isso não vale muito a pena testar várias arquiteturas diferentes. Vale lembrar que é só uma brincadeira com os dados, tanto que nem defini um conjunto de teste e validação, utilizei todos os dados como treinamento.

Modelo utilizado

Treinando com 100 épocas, a accuracy travou em 65,69% depois de pouco tempo.

Resultado

Agora é a hora da verdade! Com que idade será que eu morreria em GoT? Ou será que eu ainda estaria vivo?

Infelizmente eu não consegui passar da infância, espero que você tenha mais sorte.

>>> 💻 Repositório do código

>>> 🌐 Post no blog

🐙 Github

👤 Lattes

👦 LinkedIn

--

--

Vinícius Veríssimo

Bacharel em Ciência da Computação pela UFPB. Estudante de Mestrado em Computação na UFPB.