Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Выбор метода снижения размерности с помощью Pipeline и GridSearchCV
В этом примере создается конвейер, который выполняет снижение размерности, а затем прогнозирование с помощью классификатора на основе опорных векторов. В нем демонстрируется использование GridSearchCV и Pipeline для оптимизации по различным классам оценщиков в рамках одного запуска перекрестной проверки: методы снижения размерности без учителя 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 0x7841675022a0>)],
'reduce_dim__k': [2, 4, 8]}])
В среде Jupyter повторно запустите эту ячейку, чтобы отобразить HTML-представление, или доверьте работу ноутбуку. На GitHub HTML-представление не отображается; попробуйте загрузить эту страницу с помощью nbviewer.org.
Параметры
Обученные атрибуты
Параметры
Атрибуты после обучения
64 признака
| x0 |
| x1 |
| x2 |
| x3 |
| x4 |
| x5 |
| x6 |
| x7 |
| x8 |
| x9 |
| x10 |
| x11 |
| x12 |
| x13 |
| x14 |
| x15 |
| x16 |
| x17 |
| x18 |
| x19 |
| x20 |
| x21 |
| x22 |
| x23 |
| x24 |
| x25 |
| x26 |
| x27 |
| x28 |
| x29 |
| x30 |
| x31 |
| x32 |
| x33 |
| x34 |
| x35 |
| x36 |
| x37 |
| x38 |
| x39 |
| x40 |
| x41 |
| x42 |
| x43 |
| x44 |
| x45 |
| x46 |
| x47 |
| x48 |
| x49 |
| x50 |
| x51 |
| x52 |
| x53 |
| x54 |
| x55 |
| x56 |
| x57 |
| x58 |
| x59 |
| x60 |
| x61 |
| x62 |
| x63 |
Параметры
Атрибуты после обучения
8 признаков
| pca0 |
| pca1 |
| pca2 |
| pca3 |
| pca4 |
| pca5 |
| pca6 |
| pca7 |
Параметры
Атрибуты обученной модели
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()

Кэширование преобразователей в 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 минут 52.337 секунды)
Связанные примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/compose/plot_compare_reduction.html