Sigmoidal
  • Home
  • Pós-Graduação
  • Blog
  • Sobre Mim
  • Contato
Sem Resultado
Ver Todos Resultados
  • English
  • Home
  • Pós-Graduação
  • Blog
  • Sobre Mim
  • Contato
Sem Resultado
Ver Todos Resultados
Sigmoidal
Sem Resultado
Ver Todos Resultados

Modelos de Árvore em Machine Learning: Guia Completo

Carlos Melo por Carlos Melo
julho 16, 2026
em Machine Learning, Python, Teoria, Tutoriais
0
12
VIEWS
Publicar no LinkedInCompartilhar no FacebookCompartilhar no Whatsapp

Você sabia que, em dados tabulares, os modelos de árvore ainda vencem redes neurais profundas na maioria dos problemas do mundo real?

Enquanto as manchetes celebram modelos de linguagem com bilhões de parâmetros, são as árvores de decisão e seus descendentes que sustentam sistemas de crédito, detecção de fraude e diagnóstico médico em produção. Um estudo publicado no NeurIPS, Why do tree-based models still outperform deep learning on tabular data?, confirmou o que praticantes de Kaggle observam há anos: para dados organizados em tabelas, os modelos de árvore continuam sendo o ponto de partida mais forte.

Neste artigo, quero convidar você a entender essa família de algoritmos do início: o que é uma Árvore de Decisão, por que uma árvore sozinha tem limites, e como Random Forest e Gradient Boosting transformam árvores simples em modelos de alta performance. Tudo com código em Python e resultados reais, usando o scikit-learn.

💻

Código do Artigo

Acesse o código-fonte deste artigo gratuitamente.

Informe seu email para acessar o código:

✓ Seu código está pronto!

Abrir no Google Colab →

O que é uma Árvore de Decisão?

Uma Árvore de Decisão (Decision Tree) é um modelo que aprende uma sequência de perguntas sobre os dados. Cada pergunta divide o conjunto em dois grupos mais homogêneos, e a sequência de divisões termina em uma previsão. O processo lembra um jogo de vinte perguntas: a cada resposta, o espaço de possibilidades diminui, até restar uma única conclusão.

Essa estrutura torna a árvore um dos raros modelos de Machine Learning que um ser humano consegue ler. Um médico pode auditar cada ramo de uma árvore de triagem; um analista de crédito pode justificar por que um empréstimo foi negado. Se você quiser revisitar os fundamentos com mais profundidade, temos um artigo dedicado a entender as árvores de decisão em Machine Learning.

Para ver os três algoritmos em ação, vamos usar o dataset Palmer Penguins, que reúne medidas corporais de 344 pinguins de três espécies da Antártida: Adélie, Chinstrap e Gentoo. A tarefa é classificar a espécie a partir de quatro medidas do animal.

# importar os pacotes necessários
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.metrics import accuracy_score

# carregar o dataset a partir do repositório do blog
url = "https://raw.githubusercontent.com/carlosfab/blog-sigmoidal/main/datasets/penguins.csv"
df = pd.read_csv(url).dropna()

Duas medidas do bico já revelam boa parte da estrutura do problema. No gráfico de dispersão abaixo, cada espécie ocupa uma região relativamente bem definida do espaço, com alguma sobreposição entre Adélie e Chinstrap.

Gráfico de dispersão das três espécies de pinguins por comprimento e profundidade do bico

Como a árvore aprende as suas regras?

O treinamento de uma árvore consiste em escolher, a cada nó, a pergunta que melhor separa as classes. O algoritmo avalia todas as divisões possíveis e seleciona a que produz os grupos mais puros, segundo critérios como o índice de Gini ou a entropia, descritos na documentação do scikit-learn.

No código abaixo, separamos 70% dos dados para treino e 30% para teste, e limitamos a profundidade da árvore a três níveis. A restrição é proposital: uma árvore rasa é mais fácil de interpretar e menos propensa a memorizar os dados.

# selecionar as variáveis numéricas e o alvo
atributos = ["bill_length_mm", "bill_depth_mm", "flipper_length_mm", "body_mass_g"]
X = df[atributos]
y = df["species"]

# separar em conjuntos de treino (70%) e teste (30%)
X_treino, X_teste, y_treino, y_teste = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y)

# treinar a árvore de decisão com profundidade limitada
arvore = DecisionTreeClassifier(max_depth=3, random_state=42)
arvore.fit(X_treino, y_treino)

# avaliar a acurácia no conjunto de teste
acc_arvore = accuracy_score(y_teste, arvore.predict(X_teste))
print(f"Acurácia da Árvore de Decisão (teste): {acc_arvore:.4f}")

# Acurácia da Árvore de Decisão (teste): 0.9400

Com apenas três níveis de perguntas, o modelo acerta 94% das classificações no conjunto de teste. E o melhor: podemos desenhar exatamente o que ele aprendeu.

Estrutura da árvore de decisão treinada com profundidade máxima 3

Cada nó mostra a pergunta feita, quantas amostras chegam até ali e qual classe predomina. A primeira divisão usa o comprimento da nadadeira; as seguintes refinam a separação com as medidas do bico. Essa transparência é o grande patrimônio das árvores de decisão.

Onde uma árvore única falha?

Se uma árvore rasa funciona bem, por que não deixá-la crescer sem limites? Porque uma árvore com profundidade livre continua dividindo os dados até isolar praticamente cada exemplo do treino. O modelo deixa de aprender padrões e passa a memorizar casos.

# treinar uma árvore sem limite de profundidade
arvore_profunda = DecisionTreeClassifier(random_state=42)
arvore_profunda.fit(X_treino, y_treino)

acc_treino = accuracy_score(y_treino, arvore_profunda.predict(X_treino))
acc_teste = accuracy_score(y_teste, arvore_profunda.predict(X_teste))

print(f"Acurácia no treino: {acc_treino:.4f}")
print(f"Acurácia no teste:  {acc_teste:.4f}")

# Acurácia no treino: 1.0000
# Acurácia no teste:  0.9500

O resultado expõe o problema clássico de sobreajuste (overfitting): a árvore acerta 100% do conjunto de treino, mas apenas 95% do teste. O modelo construiu regras específicas demais, que descrevem os dados vistos e generalizam mal para dados novos.

A visualização das fronteiras de decisão torna o fenômeno evidente. Treinando os modelos apenas com as duas medidas do bico, a árvore única produz regiões recortadas, com estrias estreitas criadas para acomodar pontos individuais. O Random Forest, ao lado, desenha fronteiras mais suaves e plausíveis.

Comparação das fronteiras de decisão entre uma árvore única e um Random Forest

O que muda quando combinamos centenas de árvores?

O Random Forest, proposto por Leo Breiman no paper Random Forests (2001), ataca o sobreajuste com uma ideia elegante: em vez de confiar em uma única árvore, o algoritmo treina centenas delas e combina as respostas por votação.

A analogia clássica é a sabedoria das multidões. Cada árvore da floresta é treinada com uma amostra aleatória dos dados (bootstrap) e, a cada divisão, considera apenas um subconjunto aleatório das variáveis. As árvores individuais erram, mas erram de formas diferentes; na média, os erros se cancelam. O conceito é o mesmo que exploramos no artigo sobre métodos de ensemble.

# treinar o random forest com 100 árvores
floresta = RandomForestClassifier(n_estimators=100, random_state=42)
floresta.fit(X_treino, y_treino)

acc_floresta = accuracy_score(y_teste, floresta.predict(X_teste))
print(f"Acurácia do Random Forest (teste): {acc_floresta:.4f}")

# Acurácia do Random Forest (teste): 0.9700

A floresta alcança 97% de acurácia no teste, superando as duas versões da árvore única. Além da performance, o Random Forest oferece um subproduto valioso: a importância das variáveis, que mede quanto cada atributo contribui para as decisões do conjunto.

Importância relativa das variáveis segundo o Random Forest

O gráfico mostra que o comprimento do bico e o comprimento da nadadeira concentram a maior parte do poder preditivo. Em projetos reais, essa análise orienta a coleta de dados e a conversa com especialistas do domínio.

E se cada árvore aprendesse com os erros da anterior?

O Gradient Boosting organiza as árvores de outra maneira. Em vez de treiná-las em paralelo e votar, o algoritmo as constrói em sequência: cada nova árvore é ajustada para corrigir os erros residuais do conjunto anterior. O modelo final é uma soma ponderada de árvores rasas, refinada iteração após iteração.

# treinar o gradient boosting
boosting = GradientBoostingClassifier(n_estimators=100, random_state=42)
boosting.fit(X_treino, y_treino)

acc_boosting = accuracy_score(y_teste, boosting.predict(X_teste))
print(f"Acurácia do Gradient Boosting (teste): {acc_boosting:.4f}")

# Acurácia do Gradient Boosting (teste): 0.9800

Com 98% de acurácia no teste, o Gradient Boosting entrega o melhor resultado desta divisão treino/teste. Essa família de algoritmos deu origem a implementações otimizadas como o XGBoost e o LightGBM, dominantes em competições de dados tabulares. Se você quiser ir além da versão do scikit-learn, temos um tutorial completo de XGBoost em Python.

Qual modelo de árvore escolher?

Uma única divisão treino/teste pode favorecer um modelo por sorte. Para uma comparação mais robusta, avaliamos os três algoritmos com validação cruzada de 5 partições sobre o dataset completo.

# comparar os três modelos com validação cruzada (5 folds)
modelos = {
    "Árvore de Decisão": DecisionTreeClassifier(max_depth=3, random_state=42),
    "Random Forest": RandomForestClassifier(n_estimators=100, random_state=42),
    "Gradient Boosting": GradientBoostingClassifier(n_estimators=100, random_state=42),
}

for nome, modelo in modelos.items():
    scores = cross_val_score(modelo, X, y, cv=5)
    print(f"{nome}: {scores.mean():.4f} (+/- {scores.std():.4f})")

# Árvore de Decisão: 0.9429 (+/- 0.0239)
# Random Forest: 0.9790 (+/- 0.0154)
# Gradient Boosting: 0.9760 (+/- 0.0153)
Comparação da acurácia média dos três modelos com validação cruzada

Os números contam uma história consistente. Os dois métodos de conjunto superam a árvore única por uma margem clara, com acurácias médias de 97,9% para o Random Forest e 97,6% para o Gradient Boosting, contra 94,3% da Árvore de Decisão. Entre os dois ensembles, a diferença fica dentro do desvio padrão: neste dataset, eles empatam na prática.

A escolha, portanto, depende do contexto do seu problema:

  • Árvore de Decisão: quando a interpretabilidade é requisito, como em decisões regulatórias e sistemas auditáveis.
  • Random Forest: quando você busca robustez com pouco ajuste de hiperparâmetros; é um excelente primeiro modelo de referência.
  • Gradient Boosting: quando cada fração de acurácia importa e há tempo para ajustar taxa de aprendizado, profundidade e número de estimadores.

Takeaways

  • Árvores de decisão aprendem perguntas, e por isso são interpretáveis: cada previsão pode ser auditada nó a nó, uma propriedade rara em Machine Learning.
  • Uma árvore sem limites memoriza o treino: no nosso experimento, a acurácia de 100% no treino caiu para 95% no teste, o retrato clássico do sobreajuste.
  • Ensembles convertem árvores fracas em modelos fortes: o Random Forest reduz a variância pela votação de árvores independentes; o Gradient Boosting refina os erros em sequência.
  • Em dados tabulares, comece por modelos de árvore: a literatura recente e a prática em competições confirmam que eles seguem sendo a referência a ser batida.
  • Valide com mais de uma partição: a validação cruzada revelou um empate técnico entre os ensembles que uma única divisão treino/teste esconderia.

Se este artigo ajudou você a organizar o mapa dos modelos de árvore, o notebook completo está disponível no botão do início da página. Execute, modifique os hiperparâmetros e observe como as fronteiras de decisão reagem: a intuição que você constrói experimentando vale mais do que qualquer leitura passiva.

CompartilharCompartilharEnviar
Post Anterior

Análise de ECG com Python: do sinal ao diagnóstico automático

Carlos Melo

Carlos Melo

Engenheiro de Visão Computacional graduado em Ciências Aeronáuticas pela Academia da Força Aérea (AFA) e Mestre em Engenharia Aeroespacial pelo Instituto Tecnológico de Aeronáutica (ITA).

Relacionado Artigos

Data Science

Análise de ECG com Python: do sinal ao diagnóstico automático

por Carlos Melo
julho 13, 2026
Data Science

Imputação de Dados Ausentes com Scikit-Learn

por Carlos Melo
julho 9, 2026
Machine Learning

Pipelines no Scikit-Learn: Transformações sem Data Leakage

por Carlos Melo
julho 6, 2026
Data Science

Binary Cross-Entropy e Regressão Logística do Zero

por Carlos Melo
junho 1, 2026
Gradient Descent e Loss Function: a Origem do MSE
Data Science

Gradient Descent e Loss Function: a Origem do MSE

por Carlos Melo
maio 27, 2026

Deixe um comentário Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Pós em Visão Computacional Pós em Visão Computacional Pós em Visão Computacional

Mais Populares

  • Cientista de Dados: Salário em 2026 (Júnior, Pleno e Sênior)

    92 compartilhamentos
    Compartilhar 37 Tweet 23
  • Geometria da Formação de Imagens: Matrizes, Transformações e Sistemas de Coordenadas

    440 compartilhamentos
    Compartilhar 176 Tweet 110
  • Introdução ao MediaPipe e Pose Estimation

    571 compartilhamentos
    Compartilhar 228 Tweet 143
  • 6 Livros de Visão Computacional e Deep Learning

    26 compartilhamentos
    Compartilhar 10 Tweet 7
  • ORB-SLAM 3: Tutorial Completo para Mapeamento 3D e Localização em Tempo Real

    481 compartilhamentos
    Compartilhar 192 Tweet 120
  • Em Alta
  • Comentários
  • Mais Recente
Como Tratar Dados Ausentes com Pandas

Como Tratar Dados Ausentes com Pandas

agosto 13, 2019
Introdução ao MediaPipe e Pose Estimation

Introdução ao MediaPipe e Pose Estimation

julho 15, 2023
Como usar o DALL-E 2 para gerar imagens a partir de textos

Como usar o DALL-E 2 para gerar imagens a partir de textos

dezembro 25, 2022

ORB-SLAM 3: Tutorial Completo para Mapeamento 3D e Localização em Tempo Real

abril 10, 2023
Como Analisar Ações da Bolsa com Python

Como Analisar Ações da Bolsa com Python

15
Setembro Amarelo: Análise do Suicídio no Brasil, com Data Science

Setembro Amarelo: Análise do Suicídio no Brasil, com Data Science

13
Como Aprender Data Science?

Como Aprender Data Science?

9
Qual o Cenário de Data Science no Brasil hoje?

Qual o Cenário de Data Science no Brasil hoje?

8

Modelos de Árvore em Machine Learning: Guia Completo

julho 16, 2026

Análise de ECG com Python: do sinal ao diagnóstico automático

julho 13, 2026

Imputação de Dados Ausentes com Scikit-Learn

julho 9, 2026

Pipelines no Scikit-Learn: Transformações sem Data Leakage

julho 6, 2026
Instagram Youtube LinkedIn Twitter
Sigmoidal

O melhor conteúdo técnico de Data Science, com projetos práticos e exemplos do mundo real.

Seguir no Instagram

Categorias

  • Aeroespacial
  • Artigos
  • Blog
  • Carreira
  • Cursos
  • Data Science
  • Deep Learning
  • Destaques
  • Entrevistas
  • IA Generativa
  • Livros
  • Machine Learning
  • Notícias
  • Python
  • Sinais Biomédicos
  • Teoria
  • Tutoriais
  • Visão Computacional
  • Youtube

Navegar por Tags

algebra-linear camera calibration carreira chatgpt cientista de dados cnn computer vision Cursos dados desbalanceados data science data science na prática decision tree deep learning deploy gpt-3 gradient descent IA generativa inteligência artificial jupyter kaggle keras livros machine learning matplotlib openai opencv pandas profissão python pytorch random forest reconstrução 3d redes neurais redes neurais convolucionais regressão linear regressão logística salário scikit-learn sklearn tensorflow tutorial visão computacional vídeo youtube árvore de decisão

© 2024 Sigmoidal - Aprenda Data Science, Visão Computacional e Python na prática.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In

Add New Playlist

Sem Resultado
Ver Todos Resultados
  • Home
  • Pós-Graduação
  • Blog
  • Sobre Mim
  • Contato
  • English

© 2024 Sigmoidal - Aprenda Data Science, Visão Computacional e Python na prática.