Como construir um jogo que adivinha usando árvores de decisão
Você já deve ter visto aqueles sites onde você pensa em um animal e ele "adivinha" o que é. O mecanismo por trás disso raramente é inteligência artificial sofisticada. Na maioria das vezes é uma árvore de decisão binária com perguntas sim/não, eventualmente apoiada por uma base de dados de respostas. Eu construí um desses projetos para um trabalho independente em 2019, e vou explicar exatamente como funciona sem enrolação.
O que um jogo que adivinha realmente é
No fundo, um jogo que adivinha é um sistema de classificação incremental. Cada pergunta do jogador elimina uma fração dos candidatos restantes. Quanto mais eficiente for a seleção da pergunta seguinte, menos rodadas são necessárias. A ingenuidade popular acredita que isso exige machine learning pesado. Na prática, uma estrutura de decisão bem construída com cerca de 20 a 30 perguntas já alcança uma taxa de acerto razoável para domínios limitados como animais, frutas ou objetos do cotidiano. O segredo não está em perguntar coisas óbvias como "é maior que um pão?". O segredo está em encontrar a pergunta que divide o espaço de candidatos ao meio o mais próximo possível a cada passo. Isso é basicamente o conceito de entropia da informação aplicado de forma prática. Um algoritmo simples de ganho de informação pode calcular qual pergunta reduziria a incerteza máxima a cada iteração.
Implementando do zero
Vou descrever o processo de construção. Você começa com uma lista de entidades. Digamos 500 animais. Para cada animal, você mapeia atributos booleanos: tem pelagem, vive na água, voa, é venenoso, etc. A qualidade do seu conjunto de atributos determina diretamente quão bom o jogo será. O algoritmo seguinte escolhe recursivamente o melhor atributo para perguntar:
1. Calcule a entropia do conjunto atual de candidatos. Se a entropia for zero, todos os candidatos são idênticos e você retornou a resposta. 2. Para cada atributo disponível, calcule quantas respostas positivas e negativas cada um produziria no conjunto atual.
👉 Clique no botão abaixo para saber mais sobre o assunto!
3. Selecione o atributo que maximiza o ganho de informação, ou seja, o que mais reduz a entropia esperada. 4. Faça a pergunta ao jogador, ramifique o conjunto nos candidatos compatíveis com a resposta e repita.
Em Python, com poucas linhas usando numpy e itertools, esse processo leva menos de uma hora para funcionar. A parte demorada não é o código. É montar o dataset de atributos com qualidade.
O problema que eu encontrei na prática
Achei que tinha tudo sob controle quando cheguei ao teste final. Meu jogo funcionava perfeitamente para os 500 animais que eu havia mapeado. Até que um jogador testou com "polvo". O polvo não tinha um atributo bem definido no meu dataset. Ele não tem pelagem, não voa, vive na água, mas não é um peixe. O algoritmo caiu numa folha de decisão com dois candidatos restantes: lula e polvo. Como o custo computacional para resolver isso em tempo real estava ficando alto demais, eu simplesmente adicionhei um mecanismo de fallback que, quando a profundidade máxima da árvore era atingida sem resolução única, o jogo apresentava os candidatos finais e pedia ao usuário para escolher. Essa solução é simples e funciona na maioria dos casos. Mas ela mostra uma limitação real: jogos que adivinham baseados em atributos fixos nunca escalam bem para domínios muito amplos. Você precisa de milhares de atributos e centenas de milhares de entidades para cobrir um leque amplo, e o custo de manutenção desse dataset cresce exponencialmente.
Vantagens e limitações reais
A principal vantagem de um jogo que adivinha baseado em árvore de decisão é a transparência. Você sabe exatamente por que ele chegou a determinada resposta. Cada pergunta é rastreável. Isso é algo que modelos de deep learning não oferecem de graça. A desvantagem é evidente: ele precisa de um dataset bem estruturado, as perguntas podem se tornar repetitivas se o algoritmo não for bem calibrado, e o desempenho degrada rapidamente fora do domínio para o qual foi treinado. Um erro comum de iniciantes é tentar treinar um modelo de rede neural para isso desde o início. Isso é ineficiente. Uma árvore de decisão com poda adequada resolve o mesmo problema com muito menos dados, treinamento mais rápido e Interpretabilidade total. Use redes neurais apenas se o seu domínio tiver milhares de entidades com atributos não estruturados, o que é raro em jogos desse tipo.
Recursos para começar
Para implementar seu próprio jogo que adivinha, as bibliotecas padrão de Python já resolvem a maior parte do problema. Scikit-learn oferece DecisionTreeClassifier com suporte nativo a ganho de informação e entropia de Shannon. Se quiser algo mais ligero, você pode escrever o algoritmo de seleção de atributos do zero em poucas dezenas de linhas. Existem datasets públicos como o Animal Dataset do UCI Machine Learning Repository que já vêm com atributos pré-definidos para centenas de espécies, economizando semanas de trabalho de mapeamento manual. O que eu recomendo é começar pequeno. Mapeie 50 entidades com 15 atributos cada. Teste o algoritmo. Ajuste a estratégia de seleção de perguntas. Só depois amplie o escopo. O resultado final será um jogo que adivinha funcional, rápido e previsível, e você entenderá exatamente como cada decisão foi tomada.