선형 판별 분석 (LDA) 를 이용한 분류

Beginner

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

소개

이 실습에서는 선형 판별 분석 (LDA) 과 분류에 활용하는 방법을 소개합니다. 파이썬의 인기 머신러닝 라이브러리인 scikit-learn 을 사용하여 LDA 를 구현해 보겠습니다. 또한, 공분산의 Ledoit-Wolf 및 Oracle Shrinkage Approximating(OAS) 추정량이 분류를 개선하는 방법을 살펴볼 것입니다.

VM 팁

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

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

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

랜덤 데이터 생성

먼저, 구별 가능한 특징과 잡음 특징을 가진 랜덤 데이터를 생성해야 합니다. scikit-learn 의 make_blobs 함수를 사용하여 하나의 구별 가능한 특징을 가진 두 개의 데이터 클러스터를 생성합니다. 그런 다음 다른 특징에 랜덤 노이즈를 추가합니다.

import numpy as np
from sklearn.datasets import make_blobs

def generate_data(n_samples, n_features):
    """구별 가능한 특징과 잡음 특징을 가진 랜덤 데이터를 생성합니다.

    이 함수는 `(n_samples, n_features)` 모양의 입력 데이터 배열과 `n_samples` 개의 타겟 레이블 배열을 반환합니다.

    하나의 특징만 구별 가능한 정보를 포함하고, 다른 특징은 노이즈만 포함합니다.
    """
    X, y = make_blobs(n_samples=n_samples, n_features=1, centers=[[-2], [2]])

    ## 구별 불가능한 특징 추가
    if n_features > 1:
        X = np.hstack([X, np.random.randn(n_samples, n_features - 1)])
    return X, y

LDA 구현

다음으로, scikit-learn 의 LinearDiscriminantAnalysis 클래스를 사용하여 LDA 를 구현합니다. 세 가지 분류기를 생성합니다.

  • 축소 없이 LDA
  • Ledoit-Wolf 축소를 사용한 LDA
  • OAS 축소를 사용한 LDA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.covariance import OAS

clf1 = LinearDiscriminantAnalysis(solver="lsqr", shrinkage=None)
clf2 = LinearDiscriminantAnalysis(solver="lsqr", shrinkage="auto")
oa = OAS(store_precision=False, assume_centered=False)
clf3 = LinearDiscriminantAnalysis(solver="lsqr", covariance_estimator=oa)

분류기 학습 및 테스트

생성된 데이터에서 각 분류기의 성능을 확인하기 위해 학습 및 테스트를 수행합니다. 평균 정확도 점수를 얻기 위해 이 과정을 여러 번 반복합니다.

n_train = 20  ## 학습용 샘플 수
n_test = 200  ## 테스트용 샘플 수
n_averages = 50  ## 분류를 반복할 횟수
n_features_max = 75  ## 특징의 최대 개수
step = 4  ## 계산 단계 크기

acc_clf1, acc_clf2, acc_clf3 = [], [], []
n_features_range = range(1, n_features_max + 1, step)

for n_features in n_features_range:
    score_clf1, score_clf2, score_clf3 = 0, 0, 0
    for _ in range(n_averages):
        X, y = generate_data(n_train, n_features)

        clf1.fit(X, y)
        clf2.fit(X, y)
        clf3.fit(X, y)

        X, y = generate_data(n_test, n_features)
        score_clf1 += clf1.score(X, y)
        score_clf2 += clf2.score(X, y)
        score_clf3 += clf3.score(X, y)

    acc_clf1.append(score_clf1 / n_averages)
    acc_clf2.append(score_clf2 / n_averages)
    acc_clf3.append(score_clf3 / n_averages)

결과 시각화

마지막으로, 각 분류기의 분류 정확도를 특징 개수의 함수로 플롯합니다. matplotlib 을 사용하여 플롯을 생성합니다.

import matplotlib.pyplot as plt

features_samples_ratio = np.array(n_features_range) / n_train

plt.plot(
    features_samples_ratio,
    acc_clf1,
    linewidth=2,
    label="LDA",
    color="gold",
    linestyle="solid",
)
plt.plot(
    features_samples_ratio,
    acc_clf2,
    linewidth=2,
    label="LDA with Ledoit Wolf",
    color="navy",
    linestyle="dashed",
)
plt.plot(
    features_samples_ratio,
    acc_clf3,
    linewidth=2,
    label="LDA with OAS",
    color="red",
    linestyle="dotted",
)

plt.xlabel("n_features / n_samples")
plt.ylabel("분류 정확도")

plt.legend(loc="lower left")
plt.ylim((0.65, 1.0))
plt.suptitle(
    "LDA (선형 판별 분석) vs. "
    + "\n"
    + "Ledoit Wolf 을 사용한 LDA vs. "
    + "\n"
    + "OAS 를 사용한 LDA (1 개의 판별 특징)"
)
plt.show()

요약

이 실험에서 scikit-learn 을 사용하여 선형 판별 분석 (LDA) 를 구현하는 방법을 배웠습니다. 공분산의 Ledoit-Wolf 및 Oracle Shrinkage Approximating(OAS) 추정량이 분류 정확도를 개선하는 방법을 탐구했습니다. 또한 판별 특징을 가진 랜덤 데이터를 생성하고 이 데이터로 분류기를 테스트했습니다. 마지막으로 특징 개수의 함수로 분류 정확도를 시각화했습니다.