Selección de Características Univariadas

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demuestra cómo utilizar la selección de características univariadas para mejorar la precisión de clasificación en un conjunto de datos ruidoso. Se utiliza el clasificador de vectores de soporte (SVM) para clasificar el conjunto de datos antes y después de aplicar la selección de características univariadas. Para cada característica, se traza el valor p de la selección de características univariadas y los pesos correspondientes de los SVM. Con esto, se comparará la precisión del modelo y se examinará el impacto de la selección de características univariadas en los pesos del modelo.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargar. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/feature_selection("Feature Selection") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49127{{"Selección de Características Univariadas"}} sklearn/preprocessing -.-> lab-49127{{"Selección de Características Univariadas"}} sklearn/feature_selection -.-> lab-49127{{"Selección de Características Univariadas"}} sklearn/pipeline -.-> lab-49127{{"Selección de Características Univariadas"}} sklearn/model_selection -.-> lab-49127{{"Selección de Características Univariadas"}} sklearn/datasets -.-> lab-49127{{"Selección de Características Univariadas"}} ml/sklearn -.-> lab-49127{{"Selección de Características Univariadas"}} end

Generar datos de muestra

Primero, generaremos algunos datos de muestra para la demostración. Utilizaremos el conjunto de datos iris y le agregaremos algunos datos ruidosos no correlacionados.

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

## El conjunto de datos iris
X, y = load_iris(return_X_y=True)

## Algunos datos ruidosos no correlacionados
E = np.random.RandomState(42).uniform(0, 0.1, size=(X.shape[0], 20))

## Agregar los datos ruidosos a las características informativas
X = np.hstack((X, E))

## Dividir el conjunto de datos para seleccionar características y evaluar el clasificador
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

Selección de características univariadas

A continuación, realizaremos la selección de características univariadas con una prueba F para la puntuación de características. Utilizaremos la función de selección predeterminada para seleccionar las cuatro características más 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()

Graficar la puntuación univariada de las características

Podemos graficar las puntuaciones univariadas de cada característica para ver cuáles son las características 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("Puntuación univariada de la característica")
plt.xlabel("Número de característica")
plt.ylabel(r"Puntuación univariada ($-Log(p_{valor})$)")
plt.show()

Comparar con SVMs

Ahora compararemos la precisión de clasificación de SVM con y sin selección de características univariadas.

Sin selección 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(
    "Precisión de clasificación sin seleccionar 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()
Después de la selección 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(
    "Precisión de clasificación después de la selección 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()

Graficar la comparación de la selección de características

Podemos graficar las puntuaciones y pesos de cada característica para ver el impacto de la selección de características univariadas.

plt.bar(
    X_indices - 0.45, scores, width=0.2, label=r"Puntuación univariada ($-Log(p_{valor})$)"
)

plt.bar(X_indices - 0.25, svm_weights, width=0.2, label="Peso de SVM")

plt.bar(
    X_indices[selector.get_support()] - 0.05,
    svm_weights_selected,
    width=0.2,
    label="Pesos de SVM después de la selección",
)

plt.title("Comparando la selección de características")
plt.xlabel("Número de característica")
plt.yticks(())
plt.axis("tight")
plt.legend(loc="upper right")
plt.show()

Resumen

Esta práctica mostró cómo utilizar la selección de características univariadas para mejorar la precisión de clasificación en un conjunto de datos ruidosos. Generamos datos de muestra, realizamos la selección de características univariadas y comparamos la precisión de clasificación de SVM con y sin selección de características univariadas. También graficamos las puntuaciones y pesos de cada característica para ver el impacto de la selección de características univariadas.