본문 바로가기
공부/R & Python

10-3. 판별분석(Discriminant Analysis) 1 -선형판별분석-

by 드인 2020. 3. 3.

10-3. 판별분석(Discriminant Analysis) 1

-선형판별분석-


1) 판별분석

· 판별분석(Discriminant Analysis)

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

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

2) 예제 데이터

- Iris 데이터 train/test 분할

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

데이터 불러들이기

 

set.seed(1000)

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

데이터분할 (학습데이터 2/3, 검증데이터 1/3)

 

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

trainLabels<-iris[tr.idx,5]
testLabels<-iris[-tr.idx,5]

iris.train (독립변수4개를 포함한 100개의 데이터)

iris.test (독립변수4개를 포함한 50개의 데이터)

trainLabels (학습데이터의 타겟변수)

testLabels (검증데이터의 타겟변수)

 

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

 

3) 선형판별분석(LDA)

- 패키지(MASS) 설치

- LDA 함수 : lda(종속변수 ~ 독립변수, data=학습 데이터 이름, prior=사전 확률)

iris.lda <- lda(Species ~ ., data=train, prior=c(1/3,1/3,1/3))

           동일한 의미 : Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

           전체 매개변수 모두 사용한다는 의미

iris.lda

사전 확률(prior probablity) : 원인 A가 발생할 확률인 P(A)와 같이 결과가 나타나기 전 결정되어있는 확률

 

- 학습 데이터 LDA 결과

Call:
lda(Species ~ ., data = train, prior = c(1/3, 1/3, 1/3))

Prior probabilities of groups:
     setosa  versicolor     virginica 
0.3333333  0.3333333  0.3333333 

Group means:
              Sepal.Length Sepal.Width Petal.Length  Petal.Width 
setosa         5.051613    3.461290     1.480645      0.2387097
versicolor     5.935484    2.745161     4.267742      1.3129032 
virginica       6.634211    2.965789     5.597368      2.0289474

Coefficients of linear discriminants:
                           LD1        LD2
Sepal.Length  0.8907558 -0.1072740
Sepal.Width   1.7077575 -2.2338358
Petal.Length -2.1513701  0.7355423
Petal.Width  -2.9073216 -2.3919728

Proportion of trace:
    LD1    LD2 
0.9905 0.0095 

 

첫 번째 범주 판별 함수

LD1 = 0.89 Sepal.Length + 1.71 Sepal.Width - 2.15 Petal.Length - 2.91 Petal.Width

 

두 번째 범주 판별 함수

LD2 = - 0.11 Sepal.Length - 2.23 Sepal.Width + 0.74 Petal.Length - 2.39 Petal.Width

 

LD1이 between-group variance의 99%를 설명

LD2가 between-group variance의 1%를 설명

 

- 검증 데이터에 LDA 결과를 적용하여 범주 추정

testpred <- predict(iris.lda, test)
testpred

 

[출력 결과]

$class
[1] setosa     setosa     setosa     setosa    
[5] setosa     setosa     setosa     setosa    
[9] setosa     setosa     setosa     setosa    
[13] setosa     setosa     setosa     setosa    
[17] setosa     setosa     setosa     versicolor
[21] versicolor versicolor versicolor versicolor
[25] virginica  versicolor versicolor versicolor
[29] versicolor versicolor versicolor versicolor
[33] versicolor versicolor versicolor versicolor
[37] versicolor versicolor virginica  virginica 
[41] virginica  virginica  virginica  virginica 
[45] virginica  virginica  virginica  virginica 
[49] virginica  virginica 
Levels: setosa versicolor virginica

추정 범주


$posterior
               setosa      versicolor       virginica
2   1.000000e+00 1.173765e-17 9.991990e-37     setosa
8   1.000000e+00 2.526721e-20 7.057281e-40
14  1.000000e+00 2.742945e-19 4.300404e-39
16  1.000000e+00 8.883431e-29 9.438773e-50
19  1.000000e+00 3.299737e-23 3.645303e-43
20  1.000000e+00 8.229374e-23 1.526981e-42

세 개 범주의 사후 확률(posterior probability)을 구한 후 max값의 범주로 할당

 

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

CrossTable(x=testLabels,y=testpred$class, prop.chisq=FALSE)

 

[출력 결과]

Cell Contents
|-------------------------|

|                       N    |
|         N / Row Total  |
|         N / Col Total   |
|        N / Table Total  |
|-------------------------|
  
  
  Total Observations in Table:  50 


               | testpred$class 
  testLabels |     setosa | versicolor |  virginica |  Row Total | 

-------------|------------|------------|------------|------------|
       setosa |         19 |          0   |          0  |         19 | 
  |      1.000 |      0.000 |      0.000 |    0.380   | 
  |      1.000 |      0.000 |      0.000 |              | 
  |      0.380 |      0.000 |      0.000 |              | 
  -------------|------------|------------|------------|------------|
   versicolor |          0 |           18 |            1 |         19  | 
  |      0.000 |      0.947 |      0.053 |      0.380 | 
  |      0.000 |      1.000 |      0.077 |              | 
  |      0.000 |      0.360 |      0.020 |              | 
  -------------|------------|------------|------------|------------|
     virginica |          0  |          0  |         12   |         12  | 
  |      0.000 |      0.000 |      1.000 |      0.240 | 
  |      0.000 |      0.000 |      0.923 |              | 
  |      0.000 |      0.000 |      0.240 |              | 
  -------------|------------|------------|------------|------------|
  Column Total |         19 |          18 |          13 |         50 | 
                    |      0.380 |      0.360 |      0.260 |             | 
     -------------|------------|------------|------------|------------|

- 정확도 : 49/50 -> 98%

- versicolor를 virginica로 잘못 예측

- 오분류율 : 1/50 -> 2%