Scikit-learn 을 이용한 다항식 커널 근사

Beginner

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

소개

이 실습에서는 scikit-learn 에서 다항식 커널 근사를 사용하여 효율적으로 다항식 커널 특징 공간 근사를 생성하는 방법을 보여줍니다. 이는 커널 기반 분류기의 정확도를 근사하는 선형 분류기를 학습하는 데 사용됩니다. 우리는 각각 54 개의 특징을 가진 6 개의 클래스로 분류된 581,012 개의 샘플을 포함하는 Covtype 데이터셋을 사용할 것입니다. 이 데이터셋의 목표는 지형도 변수만 (원격 탐사 데이터 없음) 으로부터 산림 피복 유형을 예측하는 것입니다. 로드한 후, LIBSVM 웹페이지의 데이터셋 버전과 일치하도록 이진 분류 문제로 변환합니다. 이 버전은 원본 논문에서 사용된 버전입니다.

VM 팁

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

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

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

데이터 로드 및 준비

먼저 Covtype 데이터셋을 로드하고, 하나의 클래스만 선택하여 이진 분류 문제로 변환합니다. 그런 다음 데이터를 학습 세트와 테스트 세트로 분할하고 특징을 정규화합니다.

from sklearn.datasets import fetch_covtype
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, Normalizer

## Covtype 데이터셋을 로드하고, 하나의 클래스만 선택
X, y = fetch_covtype(return_X_y=True)
y[y != 2] = 0
y[y == 2] = 1

## 데이터를 학습 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(
    X, y, train_size=5000, test_size=10000, random_state=42
)

## 특징 정규화
mm = make_pipeline(MinMaxScaler(), Normalizer())
X_train = mm.fit_transform(X_train)
X_test = mm.transform(X_test)

기준 모델 설정

원본 특징에 대한 선형 SVM 을 학습하여 기준 모델을 설정하고 정확도를 출력합니다.

from sklearn.svm import LinearSVC

## 원본 특징에 대한 선형 SVM 학습
lsvm = LinearSVC(dual="auto")
lsvm.fit(X_train, y_train)
lsvm_score = 100 * lsvm.score(X_test, y_test)

## 기준 모델의 정확도 출력
print(f"원본 특징에 대한 선형 SVM 점수: {lsvm_score:.2f}%")

커널 근사 모델 설정

이제 PolynomialCountSketch 를 사용하여 생성된 특징에 대해 서로 다른 n_components 값으로 선형 SVM 을 학습합니다. n_components 의 다양한 값을 반복하는 루프를 사용하여 각 모델의 정확도를 출력합니다.

from sklearn.kernel_approximation import PolynomialCountSketch

n_runs = 1
N_COMPONENTS = [250, 500, 1000, 2000]

for n_components in N_COMPONENTS:
    ps_lsvm_score = 0
    for _ in range(n_runs):
        ## PolynomialCountSketch 로 생성된 특징에 대한 선형 SVM 학습
        pipeline = make_pipeline(
            PolynomialCountSketch(n_components=n_components, degree=4),
            LinearSVC(dual="auto"),
        )
        pipeline.fit(X_train, y_train)
        ps_lsvm_score += 100 * pipeline.score(X_test, y_test)

    ps_lsvm_score /= n_runs

    ## 모델의 정확도 출력
    print(f"{n_components} PolynomialCountSketch 특징에 대한 선형 SVM 점수: {ps_lsvm_score:.2f}%")

커널 기반 SVM 모델 설정

커널의 성능을 PolynomialCountSketch 가 얼마나 잘 근사하는지 확인하기 위해 커널 기반 SVM 을 학습합니다.

from sklearn.svm import SVC

## 커널 기반 SVM 학습
ksvm = SVC(C=500.0, kernel="poly", degree=4, coef0=0, gamma=1.0)
ksvm.fit(X_train, y_train)
ksvm_score = 100 * ksvm.score(X_test, y_test)

## 커널 기반 SVM 의 정확도 출력
print(f"원본 특징에 대한 커널-SVM 점수: {ksvm_score:.2f}%")

결과 비교

다양한 방법의 결과를 학습 시간과 함께 플롯하여 성능을 비교합니다.

import matplotlib.pyplot as plt

## 다양한 방법의 결과 플롯
fig, ax = plt.subplots(figsize=(7, 7))
ax.scatter(
    [
        lsvm_time,
    ],
    [
        lsvm_score,
    ],
    label="선형 SVM",
    c="green",
    marker="^",
)

for n_components in N_COMPONENTS:
    ax.scatter(
        [
            results[f"LSVM + PS({n_components})"]["time"],
        ],
        [
            results[f"LSVM + PS({n_components})"]["score"],
        ],
        c="blue",
    )
    ax.annotate(
        f"n_comp.={n_components}",
        (
            results[f"LSVM + PS({n_components})"]["time"],
            results[f"LSVM + PS({n_components})"]["score"],
        ),
        xytext=(-30, 10),
        textcoords="offset pixels",
    )

ax.scatter(
    [
        ksvm_time,
    ],
    [
        ksvm_score,
    ],
    label="커널 SVM",
    c="red",
    marker="x",
)

ax.set_xlabel("학습 시간 (초)")
ax.set_ylabel("정확도 (%)")
ax.legend()
plt.show()

요약

이 실험에서는 scikit-learn 에서 다항식 커널 근사를 효율적으로 사용하여 다항식 커널 특징 공간 근사를 생성하는 방법을 보여주었습니다. 이 기술을 Covtype 데이터셋에 적용하여 이를 이진 분류 문제로 변환하고, 커널 기반 분류기의 정확도를 근사하는 선형 분류기를 학습했습니다. 또한, 다양한 방법의 성능을 비교하고 학습 시간에 따른 결과를 플롯했습니다.