Seleção de Características Univariadas

Beginner

This tutorial is from open-source community. Access the source code

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.