ADP (R)

[R example] caret::knn3

멋쟁이천재사자 2022. 9. 29. 16:41

오픈북(책 대신 인쇄물도 허용)인 ADP 실기를 한 차례 겪어보니 준비한 프린트물보다는 example 코드가 더 유용할 것 같다는 생각입니다.

 

오늘은 caret 패키지 knn3 함수를 공부했습니다.

knnk 개의 가까이에 있는 이웃(nn) 들을 보고 대세에 따라가는 분류 기법이죠.

출처 :https://www.datacamp.com/tutorial/k-nearest-neighbor-classification-scikit-learn

예제 코드


library(caret)
irisFit1 <- knn3(Species ~ ., iris)

irisFit2 <- knn3(as.matrix(iris[, -5]), iris[,5])

data(iris3)
train <- rbind(iris3[1:25,,1], iris3[1:25,,2], iris3[1:25,,3])
test <- rbind(iris3[26:50,,1], iris3[26:50,,2], iris3[26:50,,3])
cl <- factor(c(rep("s",25), rep("c",25), rep("v",25)))
knn3Train(train, test, cl, k = 5, prob = TRUE)


코드해석

irisFit1 irisFit2 찍어보면 둘 결과가 동일함. 인수 사용 방법 2가지가 있는데 똑같은 결과라는 것을 보여주려는 의도인 듯 합니다.

data(iris3)
맨날 iris 만 보았는데 iris3 라는 데이터도 있었네요. 
Species 별로 숫자형만 매트릭스에 담아 그것들을 list 에 담은 구조인가 봅니다.
str 결과를 보고 해석은 아직도 익숙하지 않습니다.
str(iris3)
 num [1:50, 1:4, 1:3] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 - attr(*, "dimnames")=List of 3
  ..$ : NULL
  ..$ : chr [1:4] "Sepal L." "Sepal W." "Petal L." "Petal W."
  ..$ : chr [1:3] "Setosa" "Versicolor" "Virginica"

갑자기 iris3 를 호출한 이유는 뭘가요?
훈련셋 테스트셋을 오대오로 구분하는데, Species 별로 비중을 맞춰 구분하고자 하는 의도였나 봅니다.
그런데 createDataPartition 으로 하면 될 텐데 굳이 저렇게 한 또 다른 깊은 뜻이 있을까요?

knn3Train
Details 에 가보면 ipredknn knn3Train 는 모두 knn3와 동일하다고 합니다.

그렇다면 knn3Train(train, test, cl, k = 5, prob = TRUE) 는
knn3(train, test, cl, k = 5, prob = TRUE) 이렇게 하는 것과 동일한 것일까요?

테스트를 해보니 에러가 납니다.
Error in knn3.matrix(train, test, cl, k = 5, prob = TRUE) : 
  y must be a factor
완벽하게 동일한 것은 아닌가 봅니다.


knn 이 아니고 knn3 인 이유는 뭘까요?
혹시 k 의 디폴트 값이 3일까요?
확인해보니 디폴트는 1입니다. 그 이유는 아닙니다. 뭘까요?


knn3Train(train, test, cl, k = 5, prob = TRUE)
결과를 보면
c s v 중 하나의 값을 찍어주고, prob 에는 c s v 각각의 probability 를 보여주나 봅니다.
제가 궁금했던 것은 인접한 k개가 무엇인지 그러니깐 예시에서는 인접한 5개가 무엇인지가 궁금한데...

knn3Train(train, test, cl, k = 5, prob = TRUE)
 [1] "s" "s" "s" "s" "s" "s" "s" "s" "s" "s" "s" "s" "s" "s" "s" "s" "s"
[18] "s" "s" "s" "s" "s" "s" "s" "s" "c" "c" "v" "c" "c" "c" "c" "c" "v"
[35] "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "c" "v"
[52] "c" "c" "v" "v" "v" "v" "v" "c" "v" "v" "v" "v" "c" "v" "v" "v" "v"
[69] "v" "v" "v" "v" "v" "v" "v"
attr(,"prob")
              c s         v
 [1,] 0.0000000 1 0.0000000
 [2,] 0.0000000 1 0.0000000


table(iris$Species)
    setosa versicolor  virginica 
        50         50         50 

 

궁금한 점

iris 처음 데이터는 다음과 같은데...
1          5.1         3.5          1.4         0.2  setosa
5.1         3.5          1.4         0.2 와 가까운 3개의 항목들은 무엇일까?

knn3Train(train, test, cl, k = 5, prob = TRUE)

knn3 와 knn3Train 차이점은 무엇인가?
$k$-nearest neighbour classification that can return class votes for all classes.