본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Discriminant Analysis; 판별분석
집단(범주)이 알려진 자료로 판별 함수를 만들고, 새 관측값이 어느 집단에 속하는지 분류하는 다변량 분석 기법

종속변수가 범주형이고 독립변수가 연속형일 때 쓰는 지도 학습 분류 방법이다. 각 집단의 자료가 다변량 정규 분포를 따른다고 보고, 베이즈 정리로 사후확률이 가장 큰 집단에 배정한다. 모든 집단의 공분산 행렬이 같다고 두면 선형 판별 분석(LDA), 집단마다 다르게 두면 이차 판별 분석(QDA)이 된다. Fisher(1936)가 붓꽃(iris) 자료로 처음 제시한 방법이 LDA의 출발점이다.

  • 집단별로 독립변수가 다변량 정규 분포를 따른다.
  • LDA는 모든 집단의 공분산 행렬이 같다(Σk = Σ). 이 가정은 Box의 M 검정 등으로 확인한다. 가정이 맞지 않으면 QDA를 고려한다.
  • 독립변수 사이에 심한 다중 공선성이 없어야 공분산 행렬의 역행렬을 안정적으로 구할 수 있다.
  • 이상치에 민감하므로 미리 점검한다.

Fisher의 방법은 집단 간 변동(SB)과 집단 내 변동(SW)의 비가 가장 커지는 투영 방향 w를 찾는다.

J(w)=wTSBwwTSWw

확률 모형으로 본 LDA는 집단 k의 사전확률 πk, 평균 μk, 공통 공분산 Σ로 판별 점수를 계산해 가장 큰 집단에 배정한다. x에 대해 1차식이므로 경계가 직선(초평면)이다.

δk(x)=xTΣ−1μk−12μkTΣ−1μk+log⁡πk

QDA는 집단마다 공분산 Σk를 따로 추정하므로 x의 2차식이 되고 경계가 곡선이다.

δk(x)=−12log⁡|Σk|−12(x−μk)TΣk−1(x−μk)+log⁡πk

LDA, QDA, 로지스틱 회귀 비교

편집 원본 편집
항목 LDA QDA 로지스틱 회귀
공분산 가정 모든 집단 동일 집단마다 다름 분포 가정 없음
결정 경계 선형 이차 곡선 선형(로짓에 대해)
추정할 모수 적다 많다(집단 수 × 공분산) 적다
소표본·변수가 많을 때 비교적 안정적 과적합 위험 비교적 안정적
정규성 가정이 맞을 때 효율적 효율적 덜 효율적
정규성이 깨질 때(범주형 변수 포함 등) 성능 저하 성능 저하 강건
다범주 자연스럽게 확장 자연스럽게 확장 다항 로지스틱으로 확장
차원 축소 가능(최대 집단 수 − 1개 축) 불가 불가

차원 축소 용도

편집 원본 편집

LDA는 분류기이면서 지도 학습 방식의 차원 축소 방법이기도 하다. 집단 수가 K이면 판별 축은 최대 K − 1개이다. 주성분 분석이 집단 정보 없이 전체 분산을 가장 잘 보존하는 축을 찾는 데 비해, LDA는 집단을 가장 잘 갈라놓는 축을 찾는다. 판별 축으로 투영한 점수를 시각화하거나 다른 분류기의 입력으로 쓴다.

library(MASS)
fit <- lda(Species ~ ., data = iris)
fit                                   # 사전확률, 집단 평균, 판별계수, 판별축 비율
pred <- predict(fit)
table(iris$Species, pred$class)       # 혼동 행렬
head(pred$x)                          # 판별 점수(LD1, LD2)

cv <- lda(Species ~ ., data = iris, CV = TRUE)   # LOOCV 예측
mean(cv$class == iris$Species)

qfit <- qda(Species ~ ., data = iris)            # 이차 판별 분석
import numpy as np
from sklearn.datasets import load_iris
from sklearn.discriminant_analysis import (LinearDiscriminantAnalysis,
                                           QuadraticDiscriminantAnalysis)
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

X, y = load_iris(return_X_y=True)

lda = LinearDiscriminantAnalysis()
Z = lda.fit(X, y).transform(X)          # 판별 함수 축으로 투영 (차원 축소)
print("투영 후 shape:", Z.shape)
print("판별축 설명 비율:", np.round(lda.explained_variance_ratio_, 4))
print("사전확률:", np.round(lda.priors_, 3))
print("첫 표본 사후확률:", np.round(lda.predict_proba(X[:1]), 4))

models = {"LDA": lda,
          "QDA": QuadraticDiscriminantAnalysis(),
          "Logistic": LogisticRegression(max_iter=1000)}
for name, m in models.items():
    acc = cross_val_score(m, X, y, cv=5)
    print(f"{name}: 5-fold 정확도 평균={acc.mean():.4f}")

실행 결과:

투영 후 shape: (150, 2)
판별축 설명 비율: [0.9912 0.0088]
사전확률: [0.333 0.333 0.333]
첫 표본 사후확률: [[1. 0. 0.]]
LDA: 5-fold 정확도 평균=0.9800
QDA: 5-fold 정확도 평균=0.9800
Logistic: 5-fold 정확도 평균=0.9733
  • 붓꽃 자료는 변수 4개, 집단 3개이므로 판별 축은 최대 2개이고, 투영 후 자료가 150 × 2가 된다.
  • 첫 번째 판별 축(LD1)이 집단 간 분산의 약 99.1%를 설명한다. 사실상 LD1 하나로 세 품종이 갈린다.
  • 사전확률은 학습 자료의 집단 비율(각 1/3)로 정해진다. 첫 표본은 setosa일 사후확률이 1에 가까워 setosa로 분류된다.
  • 5겹 교차 검증 정확도는 LDA와 QDA가 0.98, 로지스틱 회귀가 0.9733으로 비슷하다. 이처럼 성능이 비슷하면 모수가 적고 해석이 쉬운 LDA를 고를 수 있다.
  • LDA는 집단별 공분산이 같다고 가정해 선형 경계를, QDA는 다르다고 두어 이차 경계를 만든다.
  • 판별 분석은 다변량 정규성을 가정하지만 로지스틱 회귀는 분포 가정이 없다는 차이를 서술할 수 있어야 한다.
  • LDA의 판별 축 수는 최대 min(집단 수 − 1, 변수 수)이며, 지도 학습 차원 축소로 쓸 수 있다. 주성분 분석과의 차이(집단 정보 사용 여부)를 묻는다.
  • 실기에서는 판별 결과를 혼동 행렬과 정확도로 평가하고 다른 분류 모형과 비교하는 흐름으로 쓴다.