Снижение размерности с использованием Pipeline и GridSearchCV

Machine LearningMachine LearningBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии демонстрируется использование Pipeline и GridSearchCV в scikit-learn для оптимизации различных классов оценщиков в одном запуске кросс-валидации. Будем использовать классификатор на основе векторов поддержки для предсказания рукописных цифр из популярного набора данных MNIST.

Советы по использованию ВМ

После запуска ВМ перейдите в левый верхний угол и переключитесь на вкладку Notebook, чтобы приступить к практике с использованием Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


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/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) 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/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/decomposition("Matrix Decomposition") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49092{{"Снижение размерности с использованием Pipeline и GridSearchCV"}} sklearn/preprocessing -.-> lab-49092{{"Снижение размерности с использованием Pipeline и GridSearchCV"}} sklearn/feature_selection -.-> lab-49092{{"Снижение размерности с использованием Pipeline и GridSearchCV"}} sklearn/pipeline -.-> lab-49092{{"Снижение размерности с использованием Pipeline и GridSearchCV"}} sklearn/model_selection -.-> lab-49092{{"Снижение размерности с использованием Pipeline и GridSearchCV"}} sklearn/decomposition -.-> lab-49092{{"Снижение размерности с использованием Pipeline и GridSearchCV"}} sklearn/datasets -.-> lab-49092{{"Снижение размерности с использованием Pipeline и GridSearchCV"}} ml/sklearn -.-> lab-49092{{"Снижение размерности с использованием Pipeline и GridSearchCV"}} end

Импортируем необходимые библиотеки и загружаем данные

Начнем с импорта необходимых библиотек и загрузки набора данных цифр из scikit-learn.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
from sklearn.decomposition import PCA, NMF
from sklearn.feature_selection import SelectKBest, mutual_info_classif
from sklearn.preprocessing import MinMaxScaler

X, y = load_digits(return_X_y=True)

Создаем конвейер и определяем сетку параметров

Создадим конвейер, который будет выполнять уменьшение размерности, за которым следует предсказание с использованием классификатора на основе векторов поддержки. Будем использовать методы безнадзорной уменьшения размерности PCA и NMF, а также отбор признаков с использованием одномерной статистики в ходе сеточного поиска.

pipe = Pipeline(
    [
        ("scaling", MinMaxScaler()),
        ## этап reduce_dim заполняется 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)"]

Создаем объект GridSearchCV и подгоняем данные

Создадим объект GridSearchCV с использованием конвейера и сетки параметров, определенных на предыдущем этапе. Затем подгоним данные к этому объекту.

grid = GridSearchCV(pipe, n_jobs=1, param_grid=param_grid)
grid.fit(X, y)

Построение графиков результатов

Построим результаты GridSearchCV с использованием столбчатой диаграммы. Это позволит сравнить точность различных методов уменьшения размерности признаков.

import pandas as pd

mean_scores = np.array(grid.cv_results_["mean_test_score"])
## оценки расположены в порядке итерации param_grid, то есть в алфавитном порядке
mean_scores = mean_scores.reshape(len(C_OPTIONS), -1, len(N_FEATURES_OPTIONS))
## выбираем оценку для наилучшего значения C
mean_scores = mean_scores.max(axis=0)
## создаем DataFrame для удобства построения графика
mean_scores = pd.DataFrame(
    mean_scores.T, index=N_FEATURES_OPTIONS, columns=reducer_labels
)

ax = mean_scores.plot.bar()
ax.set_title("Сравнение методов уменьшения размерности признаков")
ax.set_xlabel("Уменьшенное количество признаков")
ax.set_ylabel("Точность классификации цифр")
ax.set_ylim((0, 1))
ax.legend(loc="upper left")

plt.show()

Кэширование трансформеров внутри конвейера

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

from joblib import Memory
from shutil import rmtree

## Создаем временную папку для хранения трансформеров конвейера
location = "cachedir"
memory = Memory(location=location, verbose=10)
cached_pipe = Pipeline(
    [("reduce_dim", PCA()), ("classify", LinearSVC(dual=False, max_iter=10000))],
    memory=memory,
)

## На этот раз в сеточном поиске будет использоваться кэшированный конвейер

## Удаляем временный кэш перед выходом
memory.clear(warn=False)
rmtree(location)

Резюме

В этом практическом занятии мы использовали Pipeline и GridSearchCV из scikit - learn для оптимизации различных классов оценщиков в одном запуске кросс - проверки. Также мы показали, как сохранять состояние определенного трансформера с использованием аргумента memory для включения кэширования. Это может быть особенно полезно, когда подгонка трансформера требует значительных вычислительных ресурсов.