Auswahl der Dimensionsreduktion mit Pipeline und GridSearchCV#

Dieses Beispiel konstruiert eine Pipeline, die eine Dimensionsreduktion gefolgt von einer Vorhersage mit einem Support Vector Classifier durchführt. Es demonstriert die Verwendung von GridSearchCV und Pipeline, um über verschiedene Klassen von Schätzern in einem einzigen CV-Durchlauf zu optimieren – unüberwachte PCA und NMF Dimensionsreduktionen werden während der Grid-Suche mit der univariaten Merkmalsauswahl verglichen.

Zusätzlich kann Pipeline mit dem Argument memory instanziiert werden, um die Transformer innerhalb der Pipeline zu cachen und das wiederholte Anpassen derselben Transformer zu vermeiden.

Beachten Sie, dass die Verwendung von memory zur Aktivierung von Caching interessant wird, wenn das Anpassen eines Transformers kostspielig ist.

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Illustration von Pipeline und GridSearchCV#

import matplotlib.pyplot as plt
import numpy as np

from sklearn.datasets import load_digits
from sklearn.decomposition import NMF, PCA
from sklearn.feature_selection import SelectKBest, mutual_info_classif
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import LinearSVC

X, y = load_digits(return_X_y=True)

pipe = Pipeline(
    [
        ("scaling", MinMaxScaler()),
        # the reduce_dim stage is populated by the param_grid
        ("reduce_dim", "passthrough"),
        ("classify", LinearSVC(dual=False, max_iter=10000)),
    ]
)

N_FEATURES_OPTIONS = [2, 4, 8]
C_OPTIONS = [1, 10, 100, 1000]
param_grid = [
    {
        "reduce_dim": [PCA(iterated_power=7), NMF(max_iter=1_000)],
        "reduce_dim__n_components": N_FEATURES_OPTIONS,
        "classify__C": C_OPTIONS,
    },
    {
        "reduce_dim": [SelectKBest(mutual_info_classif)],
        "reduce_dim__k": N_FEATURES_OPTIONS,
        "classify__C": C_OPTIONS,
    },
]
reducer_labels = ["PCA", "NMF", "KBest(mutual_info_classif)"]

grid = GridSearchCV(pipe, n_jobs=1, param_grid=param_grid)
grid.fit(X, y)
GridSearchCV(estimator=Pipeline(steps=[('scaling', MinMaxScaler()),
                                       ('reduce_dim', 'passthrough'),
                                       ('classify',
                                        LinearSVC(dual=False,
                                                  max_iter=10000))]),
             n_jobs=1,
             param_grid=[{'classify__C': [1, 10, 100, 1000],
                          'reduce_dim': [PCA(iterated_power=7),
                                         NMF(max_iter=1000)],
                          'reduce_dim__n_components': [2, 4, 8]},
                         {'classify__C': [1, 10, 100, 1000],
                          'reduce_dim': [SelectKBest(score_func=<function mutual_info_classif at 0x7fb4c0ad4f40>)],
                          'reduce_dim__k': [2, 4, 8]}])
In einer Jupyter-Umgebung führen Sie diese Zelle bitte erneut aus, um die HTML-Darstellung anzuzeigen, oder vertrauen Sie dem Notebook.
Auf GitHub kann die HTML-Darstellung nicht gerendert werden. Versuchen Sie bitte, diese Seite mit nbviewer.org zu laden.


import pandas as pd

mean_scores = np.array(grid.cv_results_["mean_test_score"])
# scores are in the order of param_grid iteration, which is alphabetical
mean_scores = mean_scores.reshape(len(C_OPTIONS), -1, len(N_FEATURES_OPTIONS))
# select score for best C
mean_scores = mean_scores.max(axis=0)
# create a dataframe to ease plotting
mean_scores = pd.DataFrame(
    mean_scores.T, index=N_FEATURES_OPTIONS, columns=reducer_labels
)

ax = mean_scores.plot.bar()
ax.set_title("Comparing feature reduction techniques")
ax.set_xlabel("Reduced number of features")
ax.set_ylabel("Digit classification accuracy")
ax.set_ylim((0, 1))
ax.legend(loc="upper left")

plt.show()
Comparing feature reduction techniques

Transformer im Cache speichern innerhalb einer Pipeline#

Es ist manchmal lohnenswert, den Zustand eines bestimmten Transformers zu speichern, da er wiederverwendet werden könnte. Die Verwendung einer Pipeline in GridSearchCV führt zu solchen Situationen. Daher verwenden wir das Argument memory, um das Caching zu aktivieren.

Warnung

Beachten Sie, dass dieses Beispiel jedoch nur eine Veranschaulichung ist, da für diesen speziellen Fall das Anpassen von PCA nicht unbedingt langsamer ist als das Laden des Caches. Verwenden Sie daher den Konstruktorparameter memory, wenn das Anpassen eines Transformers kostspielig ist.

from shutil import rmtree

from joblib import Memory

# Create a temporary folder to store the transformers of the pipeline
location = "cachedir"
memory = Memory(location=location, verbose=10)
cached_pipe = Pipeline(
    [("reduce_dim", PCA()), ("classify", LinearSVC(dual=False, max_iter=10000))],
    memory=memory,
)

# This time, a cached pipeline will be used within the grid search


# Delete the temporary cache before exiting
memory.clear(warn=False)
rmtree(location)

Die Anpassung von PCA wird nur bei der Auswertung der ersten Konfiguration des Parameters C des LinearSVC Klassifikators berechnet. Die anderen Konfigurationen von C lösen das Laden der gecachten PCA-Schätzerdaten aus, was zu einer Zeitersparnis führt. Daher ist die Verwendung des Cachings der Pipeline mit memory sehr vorteilhaft, wenn das Anpassen eines Transformers kostspielig ist.

Gesamtlaufzeit des Skripts: (0 Minuten 42,909 Sekunden)

Verwandte Beispiele

Inkrementelles PCA

Inkrementelles PCA

Merkmalsagglomeration vs. univariate Auswahl

Merkmalsagglomeration vs. univariate Auswahl

Verkettung mehrerer Merkmalsextraktionsmethoden

Verkettung mehrerer Merkmalsextraktionsmethoden

Caching nächster Nachbarn

Caching nächster Nachbarn

Galerie generiert von Sphinx-Gallery