Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец для загрузки полного примера кода. или для запуска этого примера в вашем браузере через JupyterLite или Binder

Выбор уменьшения размерности с помощью Pipeline и GridSearchCV

В этом примере создаётся конвейер, который выполняет уменьшение размерности, а затем прогнозирование с помощью классификатора опорных векторов. Он демонстрирует использование GridSearchCV и Pipeline для оптимизации по разным классам оценщиков в одном запуске CV – без учителя PCA и NMF методы уменьшения размерности сравниваются с отбором признаков по единичным значениям во время поиска по сетке.

Кроме того, Pipeline можно инициализировать с аргументом memory, чтобы запоминать преобразователи в конвейере, избегая повторной подгонки тех же преобразователей снова и снова.

Обратите внимание, что использование memory для включения кэширования становится интересным, когда подгонка преобразователя является дорогостоящей.

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

Иллюстрация Pipeline и 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 0x7656c9c539d0>)],
                          'reduce_dim__k': [2, 4, 8]}])
В среде Jupyter, пожалуйста, перезапустите эту ячейку, чтобы отобразить HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может быть отображено, пожалуйста, попробуйте загрузить эту страницу с nbviewer.org.
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 0x7656c9c539d0>)],
                          'reduce_dim__k': [2, 4, 8]}])
Pipeline(steps=[('scaling', MinMaxScaler()),
                ('reduce_dim', PCA(iterated_power=7, n_components=8)),
                ('classify', LinearSVC(C=1, dual=False, max_iter=10000))])
MinMaxScaler()
PCA(iterated_power=7, n_components=8)
LinearSVC(C=1, dual=False, max_iter=10000)


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

Кэширование преобразователей в Pipeline

Иногда стоит сохранить состояние конкретного преобразователя, так как он может быть использован повторно. Использование конвейера в GridSearchCV вызывает такие ситуации. Поэтому мы используем аргумент memory для включения кэширования.

Предупреждение

Обратите внимание, что этот пример является только иллюстрацией, поскольку в этом конкретном случае подгонка PCA не обязательно медленнее, чем загрузка кэша. Следовательно, используйте параметр конструктора memory, когда подгонка преобразователя является дорогостоящей.

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)

Подгонка PCA вычисляется только при оценке первой конфигурации параметра C классификатора LinearSVC. Другие конфигурации C приведут к загрузке кэшированных данных оценщика PCA, что позволит сэкономить время обработки. Таким образом, использование кэширования конвейера с помощью memory очень полезно, когда подгонка преобразователя является дорогостоящей.

Общее время выполнения скрипта: (0 минут 46.960 секунд)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_compare_reduction.ipynb

Download Python source code: plot_compare_reduction.py

Download zipped: plot_compare_reduction.zip

Связанные примеры

Инкрементный PCA

Баланс сложности модели и перекрестной оценки

Конкатенация нескольких методов извлечения признаков

Агломерация признаков против отбора по единичным значениям

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/compose/plot_compare_reduction.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API