Modelo de Classificação com Random Forest — Breast Cancer Dataset
✅ Accuracy: 0.9708
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
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:
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
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.