파이프라인과 GridSearchCV 를 이용한 차원 축소

Beginner

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

소개

이 실습에서는 scikit-learn 의 PipelineGridSearchCV를 사용하여 단일 CV 실행에서 다양한 추정기 클래스를 최적화하는 방법을 보여줍니다. MNIST 데이터셋에서 손으로 쓴 숫자를 예측하기 위해 서포트 벡터 분류기를 사용할 것입니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습용 Jupyter Notebook에 접근할 수 있습니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업 검증을 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에게 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

필요한 라이브러리 가져오기 및 데이터 로드

필요한 라이브러리를 가져오고 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)
## 플롯을 쉽게 하기 위해 데이터프레임을 생성합니다.
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)

요약

이 실습에서는 scikit-learn 의 PipelineGridSearchCV를 사용하여 단일 교차 검증 (CV) 실행에서 서로 다른 추정기 클래스를 최적화했습니다. 또한, 변환기의 적합 (fitting) 비용이 많을 때 유용할 수 있도록 memory 인수를 사용하여 특정 변환기의 상태를 저장하는 방법을 보여주었습니다.