소개
이 실습에서는 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 데이터셋에 적용하여 이를 이진 분류 문제로 변환하고, 커널 기반 분류기의 정확도를 근사하는 선형 분류기를 학습했습니다. 또한, 다양한 방법의 성능을 비교하고 학습 시간에 따른 결과를 플롯했습니다.