Programming Language/R

[R] Discriminant Analysis

jiachoi 2023. 7. 3. 12:08

1. Discriminant Analysis (판별분석)

- 객체를 몇 개의 범주로 분류

- 범주들을 가장 잘 구분하는 변수 파악 및 범주 간 차이를 가장 잘 표현하는 함수 도출.

위의 값들을 잘 분리하기 위한 선형 식을 찾기 위함.

- 선형 판별분석 : 공분산 행렬이 범주에 관계 없이 동일한 경우

- 이차 판별분석 : 공분산 행렬이 각각 다른 경우

 

2. Discriminant Analysis with R

1) Iris 데이터 train/test 분할

# set working directory
setwd("/Users/choijia/postech_ai/ML/AdR_week10-3_new")

# read csv file
iris<-read.csv("iris.csv")
attach(iris)

# training/ test data : n=150

set.seed(1000,sample.kind="Rounding")

N=nrow(iris)
tr.idx=sample(1:N, size=N*2/3, replace=FALSE)

# attributes in training and test
iris.train<-iris[tr.idx,-5]
iris.test<-iris[-tr.idx,-5]
# target value in training and test
trainLabels<-iris[tr.idx,5]
testLabels<-iris[-tr.idx,5]

train<-iris[tr.idx,]
test<-iris[-tr.idx,]

2) 선형 판별분석을 하기 위한 패키지 설치 ; MASS

# install the MASS package for LDA
install.packages("MASS")
library(MASS)

# install.packages("gmodels") #crosstable
library(gmodels)

3) 선형 판별분석(LDA ; Linear Discriminant Analysis)를 하기 위한 함수 = LDA 함수

- lda(종속변수 ~ 독립변수, data=, prior=사전 확률)

# Linear Discriminant Analysis (LDA) with training data n=100
iris.lda <- lda(Species ~ ., data=train, prior=c(1/3,1/3,1/3))
iris.lda

- 학습 데이터 LDA 결과

4) 검증 데이터에 LDA 결과를 적용해 범주 추정

# predict test data set n=50
testpred <- predict(iris.lda, test)
testpred

class : assign된 변수들, posterior : 사후 확률

: 세 개 범주의 사후확률을 구한 후 max값의 범주로 할당

5) 정확도 산정 : 오분류율(검증데이터)

# accuracy of LDA
CrossTable(x=testLabels,y=testpred$class, prop.chisq=FALSE)

 

2. 선형판별분석(LDA) vs 이차판별분석(QDA)

▶ LDA : 분산, 공분산 행렬이 범주 관계없이 동일한 경우

- 장점 : 적은 파라미터 사용, 낮은 분산

- 단점 : 낮은 유연성

▶ QDA : 분산, 공분산 행렬이 범주별로 다른 경우

- 단점 : 많은 파라미터 사용, 높은 분산

- 장점 : 높은 유연성