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

10-1. k-인접기법과 판별분석-k-인접기법(k-Nearest Neighbor)

by 드인 2020. 2. 26.

10. k-인접기법과 판별분석

10-1. k-인접기법(k-Nearest Neighbor)


1) 분류 (Classification)

- 분류(Classification) - 지도학습(Supervised Learning). 타켓범주를 알고 있는 데이터로 분류규칙을 생성하고 새로운 데이터를 특정범주에 분류하는 기법

- 군집화(Clustering) - 비지도학습(Unsupervised Learning). 독립변수들의 속성을 기반으로 객체들을 그룹화하는 방법

2) k-인접기법 (k-nearest neighbor method)

k-인접방법 (kNN) : k개의 가장 가까운 이웃들을 사용해서 분류하는 방법

최적 k는?

- k가 너무 크면 데이터 구조를 파악하기 어렵고, 너무 작으면 과적합(overfitting) 위험이 있음

- 교차검증(cross-validation)으로 정확도가 높은 k를 선정

 

장점

- 단순하며 효율적

- 데이터 분산을 추정할 필요 없음

- 빠른 훈련 단계

단점

- 모델을 생성하지 않음

- 느린 분류 단계

- 많은 메모리 필요

- 결측치는 추가 작업 필요

 

kNN을 수행하기 위한 추가 패키지 설치

install.packages("class") 
install.packages("gmodels")
install.packages("scales")

- kNN 수행을 위한 패키지 : "class"

- 분류분석 후 검증에 사용되는 cross table을 위한 패키지 : "gmodels"

- 최적 k 등 그래프를 위한 패키지 : "scales"

 

3) train/test 데이터 분할 (cross-validation)

- Iris 데이터 (데이터 불러들이기, 학습데이터와 검증데이터의 분할)

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]

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

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

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

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

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

 

4) kNN의 수행과 결과

kNN함수 : knn(train=학습데이터, test=검증데이터, cl=타겟변수, k= )

md1<-knn(train=iris.train,test=iris.test,cl=trainLabels,k=5)
md1

k=5를 한 kNN의 결과 : md1에는 test 데이터(50개)들을 예측한 결과가 저장되어있음

 

- knn의 매뉴얼 : help(knn)

 

5) kNN(k=5)의 결과 - 정확도

CrossTable(x=testLabels, y=md1, prop.chisq=FALSE)

       타겟변수의 실제값    예측값

 

[출력 결과]
Cell Contents
  |--------------------------|
  |                       N     |
  |           N / Row Total |
  |           N / Col Total   |
  |         N / Table Total  |
  |--------------------------|
  
  
  Total Observations in Table:  50 


                 | md1 
    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 |          17 |           2 |           19 | 
                 |      0.000 |      0.895 |      0.105 |       0.380 | 
                 |      0.000 |      0.944 |      0.154 |               | 
                 |      0.000 |      0.340 |      0.040 |               | 
  -------------|------------|------------|------------|------------|
      virginica |           0 |           1 |          11 |          12 | 
                 |      0.000 |      0.083 |      0.917 |       0.240 | 
                 |      0.000 |      0.056 |      0.846 |               | 
                 |      0.000 |      0.020 |      0.220 |               | 
  -------------|------------|------------|-------------|------------|

Column Total |          19 |          18 |          13 |         50 | 
                  |      0.380 |      0.360 |      0.260 |              | 
   -------------|------------|------------|------------|------------|
  

- 정확도 : 47/50 -> 94%

- versicolor를 virginica로 오분류(2개)

- virginica를 versicolor로 오분류(1개)

- 오분류율 : 3/50 -> 6%