본문 바로가기

데이터 다루기/Base of R

[R] K-nearest neighbor (KNN) method

728x90
반응형
## 데이터 불러오기.
german <- read.csv('German_credit.csv')
table(german$Credit_status)

  N   Y 
700 300

우선 데이터를 불러오도록 하겠습니다.

German_credit 데이터로, 22의 column과 1000개의 관측치로 구성된 데이터셋입니다.

Class 불균형이 살짝 존재하네요.

 

# stratified_sampling
library(sampling)
ss <- strata(german, stratanames = c("Credit_status"), size =c(300,300), method="srswor")
ss <- getdata(german, ss)

strata 함수를 통해, 층화추출을 진행합니다.

Y와 N을 각각 300개 랜덤하게 추출합니다.

 

# data partition
library(caret)
train <- createDataPartition(ss$ID, p=0.7, list=FALSE)
valid <- ss[-train,]
train <- ss[train,]

table(train$Credit_status)

  N   Y 
210 210 

table(valid$Credit_status)

 N  Y 
90 90 

이제 훈련 데이터셋과 검증 데이터셋으로 7:3의 비율을 가지도록 분할하였습니다.

 

# CBR
library(FNN)
# Classification
knn(train=train[, c(2:21)], test=valid[, c(2:21)], cl=train$Credit_status, k = 5,
    prob = FALSE, algorithm=c("kd_tree")) # "cover_tree", "brute", "CR"

  [1] Y N Y Y N N N Y Y Y Y N Y N Y Y Y Y N N Y N N Y N N N N Y Y Y N N Y N N Y Y N N Y Y N Y Y N Y N N Y N N N N N N Y N N Y Y N Y Y N N N N N Y Y N
 [73] Y N Y N Y Y N Y N N N Y N Y N N N Y Y Y N Y Y Y Y N N Y Y Y N N Y Y N Y Y Y Y N Y N N Y N Y Y Y N Y Y N Y N Y Y Y Y Y Y Y Y Y Y N N Y N N N N Y
[145] N Y N Y N Y Y Y Y Y Y Y N Y N Y Y Y N Y Y N N N N Y N Y N N N N N Y Y N
attr(,"nn.index")
       [,1] [,2] [,3] [,4] [,5]
  [1,]  144  242  329  287  219
  [2,]  298   65  164  276   75
  [3,]  244  382  267  177  263
  [4,]   67   34  399  218  297
  [5,]  100  313   69  346   63
 
attr(,"nn.dist")
             [,1]       [,2]       [,3]       [,4]       [,5]
  [1,]  12.369317  17.916473   32.46537   33.80828   34.38023
  [2,]  12.649111  14.071247   16.21727   19.89975   23.00000
  [3,]   9.327379  63.584589  168.10711  284.13025  588.61023
  [4,]  40.336088  40.828911   45.63989   49.71921   51.95190
  [5,]   9.591663  14.662878   38.24918   38.54867   41.25530

FNN 라이브러리에서 제공하는 knn 함수를 사용하겠습니다.

훈련 데이터셋과, 테스트 데이터셋을 집어 넣으시고, 훈련 데이터셋의 class를 입력으로 합니다.

알고리즘은 다양하게 있으며, 해당 함수 문서를 찾아보시면 각 알고리즘에 대해 공부하실 수 있습니다.

결과 값으로는, 테스트 데이터셋에 대한 labeling 결과, 가장 가까운 5개에 대한 관측치 번호, 그리고 그에 따른 거리가 출력됩니다.

 

knn.cv(train=train[, c(2:21)], cl=train$Credit_status, k = 5,
       prob = FALSE, algorithm=c("kd_tree")) # "cover_tree", "brute"

위 코드는, 훈련 데이터셋에 대해서, cross validation을 해준 결과를 출력합니다.

 

# Regression
train_reg <- cbind(train[, c(2:13)], train[, c(15:21)])
reg <- knn.reg(train=train_reg, test = NULL, y=train$Age, k = 5,
               algorithm=c("kd_tree")) # "cover_tree", "brute"
reg$pred

  [1] 31.4 28.4 46.8 41.4 30.0 33.0 38.4 39.4 37.4 32.0 30.2 38.0 42.6 38.4 32.8 37.8 35.0 39.0 44.2 41.0 36.6 37.8 31.4 36.2 33.4 36.2 33.4 36.0 26.0
 [30] 43.0 30.2 26.0 38.4 37.6 31.2 41.0 36.0 36.0 37.0 27.0 34.4 35.6 36.4 34.8 32.6 33.0 35.2 36.8 37.6 27.8 35.4 36.4 43.8 47.2 44.8 43.8 33.8 44.0
 [59] 36.8 43.0 34.2 32.2 34.0 33.6 36.6 31.0 32.4 37.2 34.8 30.2 35.2 38.2 44.2 45.4 35.6 40.4 34.0 30.2 36.8 41.6 27.4 32.8 30.2 33.8 29.8 29.4 36.4
 [88] 27.2 32.4 36.6 44.2 46.0 37.8 40.4 39.2 39.6 39.0 33.4 37.4 38.8 32.6 33.4 37.2 46.2 29.6 30.8 37.4 38.4 32.8 34.2 33.2 42.6 40.0 38.0 32.8 37.0
[117] 45.4 43.6 32.8 26.6 39.4 40.8 40.8 33.2 32.8 40.4 38.2 44.4 35.8 32.8 35.6 36.6 31.0 33.2 34.8 30.6 32.6 30.0 41.2 38.8 44.8 43.4 35.6 35.6 36.6
[146] 44.6 43.4 30.2 38.2 35.0 36.8 29.6 34.8 31.2 34.0 27.0 27.2 40.2 39.0 36.6 31.6 29.0 34.0 35.6 31.8 31.4 33.2 30.4 44.6 36.2 30.6 35.6 41.0 43.2
[175] 32.2 31.4 29.6 36.0 34.0 39.6 48.0 34.0 35.8 35.0 36.6 47.2 41.6 32.8 29.8 35.8 32.8 29.6 29.4 41.2 35.6 32.4 37.0 26.0 41.8 40.8 37.8 40.4 34.0
[204] 44.2 34.2 31.2 39.0 37.6 37.2 36.4 38.2 32.4 34.0 27.8 40.4 37.4 43.6 35.8 34.0 31.2 34.4 36.0 48.8 31.4 38.2 34.2 36.8 38.2 41.0 28.4 40.2 38.4
[233] 43.8 28.0 36.2 32.2 44.2 51.0 30.8 32.8 36.4 32.6 44.2 38.8 31.4 40.8 32.2 32.8 31.0 32.6 35.2 31.4 31.4 38.6 32.4 49.2 31.2 37.6 42.8 27.8 29.6
[262] 37.4 36.6 36.6 29.4 35.4 35.0 36.6 41.6 43.6 30.2 32.8 49.8 31.4 40.4 34.2 35.0 38.8 31.0 31.2 36.0 35.4 31.4 39.8 42.4 38.6 34.2 40.0 29.8 38.4
[291] 31.8 28.2 47.0 41.6 33.0 32.8 43.0 36.0 43.0 42.6 34.0 32.6 41.4 34.0 38.0 31.6 40.2 43.4 38.2 28.4 32.2 32.0 39.0 35.0 34.6 43.2 41.4 28.6 39.0
[320] 41.4 45.8 37.2 42.4 28.4 58.0 33.6 36.0 29.4 34.6 33.4 35.6 41.4 29.6 37.6 35.4 28.6 37.4 34.4 37.6 42.4 35.8 37.2 44.0 31.0 33.2 31.6 33.2 39.2
[349] 32.2 35.0 26.2 41.4 36.0 35.0 35.8 40.6 31.2 34.8 40.6 40.2 31.8 45.0 40.2 49.0 43.0 38.6 41.2 40.2 39.8 31.2 31.6 28.6 32.8 30.4 41.6 36.2 31.6
[378] 37.8 29.0 44.8 41.2 39.6 35.0 33.0 38.2 30.4 33.2 36.2 41.6 38.0 50.6 42.8 41.4 34.8 29.8 29.8 36.0 33.2 35.6 46.2 40.2 32.2 33.8 45.2 39.4 38.6
[407] 38.6 41.2 35.6 27.0 35.0 35.6 33.0 37.6 31.8 38.4 32.6 42.6 37.2 32.0

KNN을 사용하여 regression하는 함수도 제공합니다.

Age를 예측할 때, knn.reg 함수를 사용합니다.

 

# Weighted KNN
library(kknn)
require(igraph)
wknn <- kknn(train[,c(2:22)]$Credit_status~., train = train[,c(2:22)], test = valid[,c(2:21)],
             k = 5, distance = 1, kernel = "triangular")

wknn$fitted.values
  [1] N N Y N N N N Y N Y N N N N N N N Y Y Y N N N N Y Y N N N Y Y N Y N Y N N N Y N N N Y N N N N N N Y N N Y Y N N N N Y N N N N N N N N N N N N Y
 [73] N N N N N N N Y N N N N Y Y N N N Y N N N N N N N N Y Y Y N Y N Y Y Y Y N Y Y Y Y Y N Y N Y Y Y Y N N N Y N N N N N N Y Y Y Y Y Y N Y Y Y Y N N
[145] Y N Y Y Y N N Y N N Y Y Y Y Y Y Y N Y Y N Y N Y Y Y Y Y N Y Y Y N Y Y Y

마지막으로 kknn 라이브러리는 weight KNN 기법을 제공합니다.

kernel 함수를 활용하는데, 정확한 내용은 해당 패키지 문서에서 확인하실 수 있습니다.

반응형