Técnicas de Validação Cruzada e Árvores de Decisão com Scikit-learn

Este documento explora funções essenciais do scikit-learn para geração de dados, pré-processamento, validação cruzada e implementação de árvores de decisão, com exemplos práticos.

Geração de Datasets para Classificação

A função make_blobs permite criar conjuntos de dados sintéticos para tarefas de agrupamento e classificação. O exemplo abaixo gera 150 amostras com 3 centros distintos e 2 características.

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

features, targets = make_blobs(n_samples=150, centers=3, n_features=2, random_state=17, cluster_std=1.2)
plt.scatter(features[:, 0], features[:, 1], c=targets, cmap='viridis', edgecolor='k')
plt.xlabel('Característica 1')
plt.ylabel('Característica 2')
plt.show()

É possível ajustar parâmetros como random_state para garantir a reprodutibilidade e cluster_std para controlar a dispersão dos clusters.

Escala e Normalização de Dados

O MinMaxScaler transforma as características para um entervalo específico, como (0, 1). O MaxAbsScaler escala os dados pelo seu valor máximo absoluto, resultando em valores no intervalo [-1, 1].

from sklearn.preprocessing import MinMaxScaler, MaxAbsScaler, normalize
import numpy as np

# Escala usando MinMaxScaler
scaler = MinMaxScaler(feature_range=(-2, 2))
data_scaled = scaler.fit_transform(np.array([[20, 2], [30, 4], [40, 6]]))

# Normalização L2 (vetor unitário)
samples = [[3, 4], [1, 2], [5, 0]]
normalized_data, norms = normalize(samples, norm='l2', return_norm=True)

Para dados com outliers, o RobustScaler utiliza mediana e intervalo interquartil, tornando-o mais resistente a valores extremos.

Validação Cruzada para Avaliação de Modelos

Os dados são particionados em conjuntos de treino e teste usando train_test_split. É crucial garantir a aleatoriedade para evitar viés.

from sklearn.model_selection import train_test_split, cross_val_score, cross_validate
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
import numpy as np

boston = load_boston()
X, y = boston.data, boston.target

# Embaralhamento dos índices para uma divisão aleatória
idx = np.random.permutation(len(y))
X_shuffled, y_shuffled = X[idx], y[idx]

# Divisão treino/teste
X_train, X_test, y_train, y_test = train_test_split(X_shuffled, y_shuffled, test_size=0.25)

# Validação cruzada com 10 folds
model = LinearRegression()
scores = cross_val_score(model, X_shuffled, y_shuffled, cv=10, scoring='neg_mean_squared_error')

# Validação cruzada com múltiplas métricas
metrics = ['r2', 'neg_mean_absolute_error']
detailed_scores = cross_validate(model, X_shuffled, y_shuffled, cv=10, scoring=metrics)

Outras abordagens incluem K-Fold estratificado (para preservar a proporção de classes) e Leave-One-Out para datasets muito pequenos.

Classificação com Árvores de Decisão

O DecisionTreeClassifier é um modelo poderoso para tarefas de classificação. A parametrização adequada é essencial para evitar overfitting.

from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.datasets import load_iris
import seaborn as sns
import matplotlib.pyplot as plt

iris = load_iris()
X_iris, y_iris = iris.data, iris.target

# Divisão e treino
X_tr, X_te, y_tr, y_te = train_test_split(X_iris, y_iris, test_size=0.3, stratify=y_iris, random_state=42)
clf = DecisionTreeClassifier(criterion='entropy', max_depth=4, min_samples_leaf=5)
clf.fit(X_tr, y_tr)

# Avaliação
predictions = clf.predict(X_te)
print(classification_report(y_te, predictions))

# Matriz de confusão
cm = confusion_matrix(y_te, predictions, labels=clf.classes_)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Previsto')
plt.ylabel('Verdadeiro')
plt.show()

# Exportar a árvore para visualização (requer Graphviz)
export_graphviz(clf, out_file='arvore.dot', feature_names=iris.feature_names, class_names=iris.target_names, filled=True, rounded=True)

A importância das características pode ser acessada via clf.feature_importances_, ajudando na interpretação do modelo.

Tags: scikit-learn validação-cruzada arvore-de-decisao pré-processamento-de-dados classificação

Publicado em 7-22 03:46