Introdução
Este laboratório demonstra como usar a seleção de características univariada para melhorar a precisão de classificação em um conjunto de dados ruidoso. A máquina de vetores de suporte (SVM) é usada para classificar o conjunto de dados antes e depois da aplicação da seleção de características univariada. Para cada característica, plotamos os valores p para a seleção de características univariada e os pesos correspondentes das máquinas de vetores de suporte. Com isso, compararemos a precisão do modelo e examinaremos o impacto da seleção de características univariada nos pesos do modelo.
Dicas da Máquina Virtual
Após o início da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.
Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.
Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para você.
Gerar Dados de Amostra
Primeiro, geraremos alguns dados de amostra para a demonstração. Usaremos o conjunto de dados iris e adicionaremos alguns dados ruidosos não correlacionados a ele.
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
## O conjunto de dados iris
X, y = load_iris(return_X_y=True)
## Alguns dados ruidosos não correlacionados
E = np.random.RandomState(42).uniform(0, 0.1, size=(X.shape[0], 20))
## Adiciona os dados ruidosos às características informativas
X = np.hstack((X, E))
## Divide o conjunto de dados para selecionar a característica e avaliar o classificador
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
Seleção de Características Univariada
Em seguida, realizaremos a seleção de características univariada com o teste F para pontuação das características. Usaremos a função de seleção padrão para selecionar as quatro características mais significativas.
from sklearn.feature_selection import SelectKBest, f_classif
selector = SelectKBest(f_classif, k=4)
selector.fit(X_train, y_train)
scores = -np.log10(selector.pvalues_)
scores /= scores.max()
Plotar Pontuação Univariada das Características
Podemos plotar as pontuações univariadas para cada característica para ver quais características são significativas.
import matplotlib.pyplot as plt
X_indices = np.arange(X.shape[-1])
plt.figure(1)
plt.clf()
plt.bar(X_indices - 0.05, scores, width=0.2)
plt.title("Pontuação univariada das características")
plt.xlabel("Número da característica")
plt.ylabel(r"Pontuação univariada ($-Log(p_{value})$)")
plt.show()
Comparar com Máquinas de Vetores de Suporte (SVMs)
Agora, vamos comparar a precisão da classificação SVM com e sem seleção de características univariadas.
Sem Seleção de Características Univariadas
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import LinearSVC
clf = make_pipeline(MinMaxScaler(), LinearSVC(dual="auto"))
clf.fit(X_train, y_train)
print(
"Precisão da classificação sem seleção de características: {:.3f}".format(
clf.score(X_test, y_test)
)
)
svm_weights = np.abs(clf[-1].coef_).sum(axis=0)
svm_weights /= svm_weights.sum()
Após a Seleção de Características Univariadas
clf_selected = make_pipeline(
SelectKBest(f_classif, k=4), MinMaxScaler(), LinearSVC(dual="auto")
)
clf_selected.fit(X_train, y_train)
print(
"Precisão da classificação após a seleção de características univariadas: {:.3f}".format(
clf_selected.score(X_test, y_test)
)
)
svm_weights_selected = np.abs(clf_selected[-1].coef_).sum(axis=0)
svm_weights_selected /= svm_weights_selected.sum()
Plotando a Comparação da Seleção de Características
Podemos plotar as pontuações e pesos das características para cada uma, a fim de visualizar o impacto da seleção de características univariadas.
plt.bar(
X_indices - 0.45, scores, width=0.2, label=r"Pontuação univariada ($-Log(p_{value})$)"
)
plt.bar(X_indices - 0.25, svm_weights, width=0.2, label="Peso SVM")
plt.bar(
X_indices[selector.get_support()] - 0.05,
svm_weights_selected,
width=0.2,
label="Pesos SVM após seleção",
)
plt.title("Comparando a seleção de características")
plt.xlabel("Número da característica")
plt.yticks(())
plt.axis("tight")
plt.legend(loc="upper right")
plt.show()
Resumo
Este laboratório demonstrou como utilizar a seleção de características univariadas para melhorar a precisão da classificação em um conjunto de dados ruidoso. Geramos dados de amostra, realizamos a seleção de características univariadas e comparamos a precisão da classificação SVM com e sem a seleção de características univariadas. Também plotamos as pontuações e pesos das características para cada uma, a fim de visualizar o impacto da seleção de características univariadas.