Sélection de caractéristiques univariées

Machine LearningMachine LearningBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Ce laboratoire montre comment utiliser la sélection de caractéristiques univariées pour améliorer la précision de classification sur un ensemble de données bruité. La machine à vecteurs de support (SVM) est utilisée pour classifier l'ensemble de données avant et après l'application de la sélection de caractéristiques univariées. Pour chaque caractéristique, nous traçons les valeurs p pour la sélection de caractéristiques univariées et les poids correspondants des SVM. Ainsi, nous comparerons la précision du modèle et examinerons l'impact de la sélection de caractéristiques univariées sur les poids du modèle.

Conseils sur la machine virtuelle

Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder à Jupyter Notebook pour la pratique.

Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limites de Jupyter Notebook.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session, et nous réglerons rapidement le problème pour vous.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL 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(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) 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{{"Sélection de caractéristiques univariées"}} sklearn/preprocessing -.-> lab-49127{{"Sélection de caractéristiques univariées"}} sklearn/feature_selection -.-> lab-49127{{"Sélection de caractéristiques univariées"}} sklearn/pipeline -.-> lab-49127{{"Sélection de caractéristiques univariées"}} sklearn/model_selection -.-> lab-49127{{"Sélection de caractéristiques univariées"}} sklearn/datasets -.-> lab-49127{{"Sélection de caractéristiques univariées"}} ml/sklearn -.-> lab-49127{{"Sélection de caractéristiques univariées"}} end

Générer des données d'échantillonnage

Tout d'abord, nous allons générer quelques données d'échantillonnage pour la démonstration. Nous utiliserons l'ensemble de données iris et y ajouterons des données bruitées non corrélées.

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

## L'ensemble de données iris
X, y = load_iris(return_X_y=True)

## Quelques données bruitées non corrélées
E = np.random.RandomState(42).uniform(0, 0.1, size=(X.shape[0], 20))

## Ajoutez les données bruitées aux caractéristiques informatives
X = np.hstack((X, E))

## Divisez l'ensemble de données pour sélectionner les caractéristiques et évaluer le classifieur
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

Sélection de caractéristiques univariées

Ensuite, nous effectuerons une sélection de caractéristiques univariées avec le test F pour la notation des caractéristiques. Nous utiliserons la fonction de sélection par défaut pour sélectionner les quatre caractéristiques les plus significatives.

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()

Tracer le score univarié des caractéristiques

Nous pouvons tracer les scores univariés de chaque caractéristique pour voir lesquelles sont significatives.

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("Score univarié des caractéristiques")
plt.xlabel("Numéro de la caractéristique")
plt.ylabel(r"Score univarié ($-Log(p_{valeur})$)")
plt.show()

Comparaison avec les SVM

Nous allons maintenant comparer la précision de classification des SVM avec et sans sélection de caractéristiques univariées.

Sans sélection de caractéristiques univariées
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(
    "Précision de classification sans sélection de caractéristiques : {:.3f}".format(
        clf.score(X_test, y_test)
    )
)

svm_weights = np.abs(clf[-1].coef_).sum(axis=0)
svm_weights /= svm_weights.sum()
Après sélection de caractéristiques univariées
clf_selected = make_pipeline(
    SelectKBest(f_classif, k=4), MinMaxScaler(), LinearSVC(dual="auto")
)
clf_selected.fit(X_train, y_train)
print(
    "Précision de classification après sélection de caractéristiques univariées : {:.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()

Tracer la comparaison de la sélection de caractéristiques

Nous pouvons tracer les scores et les poids des caractéristiques pour chaque caractéristique pour voir l'impact de la sélection de caractéristiques univariées.

plt.bar(
    X_indices - 0.45, scores, width=0.2, label=r"Score univarié ($-Log(p_{valeur})$)"
)

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

plt.bar(
    X_indices[selector.get_support()] - 0.05,
    svm_weights_selected,
    width=0.2,
    label="Poids SVM après sélection",
)

plt.title("Comparaison de la sélection de caractéristiques")
plt.xlabel("Numéro de la caractéristique")
plt.yticks(())
plt.axis("tight")
plt.legend(loc="upper right")
plt.show()

Sommaire

Ce laboratoire a démontré comment utiliser la sélection de caractéristiques univariées pour améliorer la précision de classification sur un ensemble de données bruité. Nous avons généré des données d'échantillonnage, effectué une sélection de caractéristiques univariées et comparé la précision de classification des SVM avec et sans sélection de caractéristiques univariées. Nous avons également tracé les scores et les poids des caractéristiques pour chaque caractéristique pour voir l'impact de la sélection de caractéristiques univariées.