단변량 특징 선택

Beginner

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

소개

이 실험은 단변량 특징 선택을 사용하여 잡음이 많은 데이터 세트에서 분류 정확도를 개선하는 방법을 보여줍니다. 서포트 벡터 머신 (SVM) 은 단변량 특징 선택을 적용하기 전후로 데이터 세트를 분류하는 데 사용됩니다. 각 특징에 대해 단변량 특징 선택의 p-값과 해당 SVM 의 가중치를 플롯합니다. 이를 통해 모델 정확도를 비교하고 단변량 특징 선택이 모델 가중치에 미치는 영향을 검토할 수 있습니다.

VM 팁

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

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

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

샘플 데이터 생성

먼저, 이 데모를 위해 샘플 데이터를 생성합니다. 아이리스 (iris) 데이터 세트를 사용하고 상관 관계가 없는 일부 잡음 데이터를 추가합니다.

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

## 아이리스 데이터 세트
X, y = load_iris(return_X_y=True)

## 상관 관계가 없는 일부 잡음 데이터
E = np.random.RandomState(42).uniform(0, 0.1, size=(X.shape[0], 20))

## 정보 특징에 잡음 데이터 추가
X = np.hstack((X, E))

## 특징 선택 및 분류기 평가를 위해 데이터 세트 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)

단변량 특징 선택

다음으로, F-검정을 사용하여 단변량 특징 선택을 수행합니다. 기본 선택 함수를 사용하여 가장 중요한 네 가지 특징을 선택합니다.

from sklearn.feature_selection import SelectKBest, f_classif

selector = SelectKBest(f_classif, k=4)
selector.fit(X_train, y_train)
scores = -np.log10(selector.pvalues_)
scores /= scores.max()

특징 단변량 점수 시각화

각 특징의 단변량 점수를 플롯하여 어떤 특징이 중요한지 확인할 수 있습니다.

import matplotlib.pyplot as plt

X_indices = np.arange(X.shape[-1])
plt.figure(1)
plt.clf()
plt.bar(X_indices - 0.05, scores, width=0.2)
plt.title("특징 단변량 점수")
plt.xlabel("특징 번호")
plt.ylabel(r"단변량 점수 ($-Log(p_{value})$)")
plt.show()

SVM 과 비교

이제 단변량 특징 선택을 적용했을 때와 하지 않았을 때 SVM 분류 정확도를 비교합니다.

단변량 특징 선택 없이
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import LinearSVC

clf = make_pipeline(MinMaxScaler(), LinearSVC(dual="auto"))
clf.fit(X_train, y_train)
print(
    "특징 선택 없이 분류 정확도: {:.3f}".format(
        clf.score(X_test, y_test)
    )
)

svm_weights = np.abs(clf[-1].coef_).sum(axis=0)
svm_weights /= svm_weights.sum()
단변량 특징 선택 후
clf_selected = make_pipeline(
    SelectKBest(f_classif, k=4), MinMaxScaler(), LinearSVC(dual="auto")
)
clf_selected.fit(X_train, y_train)
print(
    "단변량 특징 선택 후 분류 정확도: {:.3f}".format(
        clf_selected.score(X_test, y_test)
    )
)

svm_weights_selected = np.abs(clf_selected[-1].coef_).sum(axis=0)
svm_weights_selected /= svm_weights_selected.sum()

특징 선택 비교 플롯

각 특징의 특징 점수와 가중치를 플롯하여 단변량 특징 선택의 영향을 시각적으로 확인할 수 있습니다.

plt.bar(
    X_indices - 0.45, scores, width=0.2, label=r"단변량 점수 ($-Log(p_{value})$)"
)

plt.bar(X_indices - 0.25, svm_weights, width=0.2, label="SVM 가중치")

plt.bar(
    X_indices[selector.get_support()] - 0.05,
    svm_weights_selected,
    width=0.2,
    label="선택 후 SVM 가중치",
)

plt.title("특징 선택 비교")
plt.xlabel("특징 번호")
plt.yticks(())
plt.axis("tight")
plt.legend(loc="upper right")
plt.show()

요약

이 실험에서는 잡음이 많은 데이터셋에서 분류 정확도를 향상시키기 위해 단변량 특징 선택을 어떻게 사용하는지 보여주었습니다. 샘플 데이터를 생성하고, 단변량 특징 선택을 수행하며, 단변량 특징 선택을 적용했을 때와 하지 않았을 때 SVM 분류 정확도를 비교했습니다. 또한 각 특징의 특징 점수와 가중치를 플롯하여 단변량 특징 선택의 영향을 시각적으로 확인했습니다.