Skip to content

Modelo de Classificação com Random Forest — Breast Cancer Dataset

✅ Accuracy: 0.9708 2026-01-20T18:12:09.117567 image/svg+xml Matplotlib v3.10.8, https://matplotlib.org/

import pandas as pd
import matplotlib.pyplot as plt
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
from io import StringIO


df = pd.read_csv('https://raw.githubusercontent.com/MariaLuizazz/MACHINE-LEARNING-PESSOAL/refs/heads/main/dados/breast-cancer.csv')

# Remover coluna irrelevante
df = df.drop(columns=['id'])

# Conversão de letra para número (diagnosis: M=1, B=0)
label_encoder = LabelEncoder()
df['diagnosis'] = label_encoder.fit_transform(df['diagnosis'])

# Imputação com mediana para valores nulos
df['concavity_mean'].fillna(df['concavity_mean'].median(), inplace=True)
df['concave points_mean'].fillna(df['concave points_mean'].median(), inplace=True)

# Separação entre variáveis independentes e alvo
x = df.drop(columns=['diagnosis'])
y = df['diagnosis']

# Divisão treino/teste
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.3, random_state=42, stratify=y
)


# Criação e treino do modelo Random Forest
rf = RandomForestClassifier(
    n_estimators=100,
    max_depth=5,
    max_features='sqrt',
    random_state=42
)
rf.fit(x_train, y_train)

# Avaliação
predictions = rf.predict(x_test)
print(f"✅ Accuracy: {accuracy_score(y_test, predictions):.4f}")

# Importância das variáveis
importances = pd.DataFrame({
    'Feature': x.columns,
    'Importance': rf.feature_importances_
}).sort_values(by='Importance', ascending=False)
#print("\n📊 Importância das Features:")
#print(importances.head(10))

# Plot de uma árvore individual
fn = list(x.columns)             # nomes das features
cn = ['Benigno', 'Maligno']      # classes do diagnóstico

fig, ax = plt.subplots(figsize=(20,10), dpi=150)
tree.plot_tree(
    rf.estimators_[0],
    feature_names=fn,
    class_names=cn,
    filled=True,
    rounded=True,
    fontsize=8,
    ax=ax
)


plt.title("🌲 Árvore Individual da Random Forest")
plt.show()

buffer = StringIO()
plt.savefig(buffer, format="svg", transparent=True)
print(buffer.getvalue())

Exploração dos Dados

A base utilizada corresponde ao Breast Cancer Dataset, amplamente utilizado em estudos de Machine Learning para diagnóstico de câncer de mama. Cada linha representa uma amostra de tecido mamário, e cada coluna descreve características morfológicas das células, como raio, textura, perímetro, área, concavidade e simetria. O objetivo é prever se o diagnóstico é benigno ou maligno.

🔍 Natureza dos dados

Tipo: dados tabulares Total de amostras: 569 registros Variável alvo (diagnosis): Maligno (1) Benigno (0)

Total de atributos: 30 variáveis numéricas contínuas

Análise descritiva

As variáveis numéricas apresentaram médias e desvios-padrão variados, refletindo diferentes escalas de medição. Por exemplo:

radius_mean, area_mean e perimeter_mean possuem valores mais altos e correlação entre si;

  • Variáveis como concave points_mean e concavity_mean estão fortemente associadas à probabilidade de malignidade.

Pré-processamento

O pré-processamento envolveu limpeza, codificação e tratamento de valores ausentes.

df = pd.read_csv('https://raw.githubusercontent.com/MariaLuizazz/MACHINE-LEARNING-PESSOAL/refs/heads/main/dados/breast-cancer.csv')
df = df.drop(columns=['id'])

# Codificação da variável alvo
label_encoder = LabelEncoder()
df['diagnosis'] = label_encoder.fit_transform(df['diagnosis'])

# Imputação de valores ausentes com a mediana
df['concavity_mean'].fillna(df['concavity_mean'].median(), inplace=True)
df['concave points_mean'].fillna(df['concave points_mean'].median(), inplace=True)

A coluna id foi removida por não conter informação relevante para o modelo.

A variável alvo diagnosis foi codificada com LabelEncoder, onde:

M → 1 (Maligno)

B → 0 (Benigno)

As variáveis com valores ausentes (concavity_mean e concave points_mean) foram imputadas com a mediana de cada respectiva coluna, garantindo consistência sem distorcer a distribuição.

Todas as features numéricas foram mantidas em sua escala original, visto que a Random Forest não é sensível a normalização ou padronização.

Resultado: base limpa, numérica e pronta para o treino do modelo.

Divisão dos Dados

O dataset foi dividido em:

  • 70% para treino
  • 30% para teste
x = df.drop(columns=['diagnosis'])
y = df['diagnosis']

x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=0.3, random_state=42, stratify=y
)

A divisão utilizou o parâmetro stratify=y, garantindo que a proporção de diagnósticos malignos e benignos fosse preservada em ambas as amostras. O parâmetro random_state=42 assegurou a reprodutibilidade dos resultados.

Treinamento do modelo

  • O modelo implementado foi o Random Forest Classifier, um ensemble de múltiplas árvores de decisão. A configuração utilizada foi a seguinte:
rf = RandomForestClassifier(
    n_estimators=100,     # número de árvores
    max_depth=5,          # profundidade máxima
    max_features='sqrt',  # número de variáveis avaliadas por split
    random_state=42
)
rf.fit(x_train, y_train)

Essas configurações equilibram precisão e interpretabilidade, evitando sobreajuste (overfitting) e mantendo uma boa capacidade de generalização.

Durante o treinamento, cada árvore foi construída a partir de um subconjunto aleatório de dados e variáveis, característica que torna o modelo robusto e estável frente a ruídos.

Avaliação do Modelo

✅ Accuracy: 0.9708 2026-01-20T18:12:10.520009 image/svg+xml Matplotlib v3.10.8, https://matplotlib.org/

✅ Accuracy: 0.9708 2026-01-20T18:12:12.032538 image/svg+xml Matplotlib v3.10.8, https://matplotlib.org/

predictions = rf.predict(x_test)
accuracy = accuracy_score(y_test, predictions)
print(f"Accuracy: {accuracy:.4f}")

O modelo atingiu 97,08% de acurácia na base de teste, indicando excelente desempenho na classificação entre tumores benignos e malignos.

📊 Importância das Variáveis

A análise da importância das variáveis mostrou que o modelo se baseia fortemente em características geométricas e de textura das células. As 10 variáveis mais relevantes foram:

Posição Variável Importância
1 area_worst 0.171
2 concave points_mean 0.108
3 concave points_worst 0.103
4 radius_worst 0.084
5 peripheral_worst 0.082
6 peripheral_mean 0.076
7 area_mean 0.060
8 concavity_mean 0.057
9 radius_mean 0.047
10 concavity_worst 0.029
  • As variáveis relacionadas a área e concavidade são determinantes para o diagnóstico. Tumores malignos apresentam contornos mais irregulares e áreas maiores — o que justifica o peso elevado dessas variáveis.

Relatório Final e Considerações

Conclusões

O modelo de Random Forest apresentou excelente desempenho, com acurácia de 97%, interpretabilidade satisfatória e estabilidade nos resultados. A importância das variáveis reforça a coerência clínica dos dados — características morfológicas das células são realmente indicativas da natureza do tumor.