반응형

출처: http://www.datamarket.kr/xe/board_BoGi29/9880

 

 

슬라이드2.JPG


본격적으로 KNN알고리즘을 들어가기 전에, 분류(Classification)와 군집화(Clustering)의 차이에 대해 간단히 알아보겠습니다. 


분류(Classification) - 이미 클래스(계급, 범주)를 갖은 데이터를 새로운 데이터가 들어왔을 때 구별을 위한 모델링( Suvervised learning : 지시학습 )

군집화(Clustering) - 클래스(계급, 범주)가 없는 데이터를 어떠한 기준이나 규칙에 의해 분석가가 임의의 그룹으로 나누는 모델링( Unsupervised learning : 비지시학습 )


으로, KNN알고리즘은 분류에 속하게 됩니다. 

KNN 알고리즘의 개념에 대해 간단하게 보자면 새로운 데이터의 가장 가까운 데이터들의 클래스(계급, 범주)를 따라 클래스를 정해주는 것입니다.


슬라이드3.JPG


K가 1일떄 - 1NN 가장 가까운 1개의 데이터의 클래스를 따라 새로운 데이터의 클래스를 따라간다.

빨간 외각선 원 : NEW DATA

 -> 모든 NEW DATA를 회색의 범주로 간주


슬라이드4.JPG


K가 3일떄 - 3NN 가장 가까운 3개의 데이터의 클래스를 다수결(분류기준이 0.5일 때)따라 새로운 데이터의 클래스를 따라간다.

빨간 외각선 원 : NEW DATA

 -> 왼쪽 위 NEW DATA : 주변 3개의 범주가 회색  -  NEW DATA = 회색

      가온데 아래 NEW DATA : 주변 2개의 범주가 회색, 1개가 파란색  -  NEW DATA = 회색

      오른쪽 위 NEW DATA : 주변 2개의 범주가 파란색, 1개가 회색  -  NEW DATA = 파란색


슬라이드5.JPG


위의 간단한 예를 통해, K에 따라 결과가 달라지는 것을 통해, 분석가의 소신에 따라 K를 정해주는 것이 분석에서의 중요한 요소가 될 것 입니다.


- 너무 작은 k : 과적합의 우려

- 너무 큰 k : 데이터 구조 파악의 어려움


KNN 알고리즘에 대해 조금 더 간단한 데이터를 통해 알아보겠습니다.


슬라이드10.JPG


위의 그래프는 여러가지 식품에 대해서 단맛(0~10)과 아삭거림(0~10)의 정도에 따라 2차원 산점도입니다. 

위와 같이 데이터들이 분류가 되어있을 때, 새로운 데이터가 입력이 되었을 때, 그 데이터가 어떤 범주로 분류될지 

5NN 알고리즘을 통해 분류해보겠습니다. 


슬라이드12.JPG


New Data가 단맛=6, 아삭거림=4 일때, 유클리드 거리를 통해 가장 가까운 데이터 5개를 뽑아보았습니다.

그 중 과일인 데이터가 3개임으로 새로운 데이터는 "과일"로 분류가 됩니다.


KNN 알고리즘에 대해 R 코드로 접근해 보겠습니다.



#### 데이터 EDA ####


wbcd<-read.csv("wisc_bc_data.csv",stringsAsFactors=F)

# 위스콘신 대학의 연구자들이 기부한 데이터

# 유방 암 조직 검사에 대한 569개의 데이터와 32개의 속성


str(wbcd)

# M(Malignant) : 악성 / B(Benign) : 양성

# radius : 반지름 / texture : 텍스처 / perimeter : 둘레 / area : 면적 / smmothness : 평활도 

# compactness : 다짐도 / concavity : 요면 / concave points : 요면점 / symmetry : 대칭 / fractal dimension : 프렉탈 차원


wbcd<-wbcd[-1] # id 삭제


table(wbcd$diagnosis)


wbcd$diagnosis<-factor(wbcd$diagnosis,levels=c("B","M"),labels=c("Benign","Malignant"))


summary(wbcd) # 단위가 굉장히 다름 -> 정규화가 필요



#### 데이터 표준화 ####


# 최대최소 표준화 (0~1값으로 변환)

normalize<-function(x){

  return((x-min(x))/(max(x)-min(x)))

}


wbcd_n<-as.data.frame(lapply(wbcd[2:31],normalize)) # 리스트를 데이터프레임형식으로 변환



#### 데이터 분할 #####


# 이 데이터 경우 기록물은 임의의순서로 저장되어있기 때문에, 샘플링이 단순

wbcd_train<-wbcd_n[1:469,]

wbcd_test <-wbcd_n[470:569,]


wbcd_train_labels<-wbcd[1:469,1]

wbcd_test_labels<-wbcd[470:569,1]


prop.table(table(wbcd_train_labels))

prop.table(table(wbcd_test_labels)) # 데이터 분할이 골고루 잘 되었는지 확인



#### 모델 훈련 (가중치X) ####


# install.packages("class")

library(class)


wbcd_test_pred<-knn(train=wbcd_train,

                    test=wbcd_test,

                    cl=wbcd_train_labels, # class : train 데이터의 각 행에 대한 범주인 팩터 벡터

                    k=21)

table(wbcd_test_pred)



#### 모델 성능 평가 #####


# install.packages("gmodels")

library(gmodels)


CrossTable(x=wbcd_test_labels,y=wbcd_test_pred,prop.chisq=FALSE,prop.c=FALSE)




앞에서 보았던 KNN 알고리즘은, 단순히 거리의 정도를 생각하지 않고 가장 가까운 데이터 K개 안에서 다수결에 따라 범주를 골라 주었다면, 거리에 대해서 유사성 가중치를 주는 Weighted KNN 에 대해서 알아보겠습니다.


슬라이드14.JPG


위의 데이터에서 가중치를 주지 않는 다면, 새로운 데이터가 "야채"로 분류가 됩니다.


슬라이드15.JPG


하지만, 똑같은 데이터에서 유사도를 "1/거리" 로 정의하고 가중치를 주게 된다면, 새로운 데이터는 "과일"로 분류가 됩니다.

( 주의 : 이해를 쉽게하기 위해 유사도를 1/거리 로 정의하였습니다. )


이를 R 코들를 통해 실습해 보겠습니다.



#### 모델 훈련 (가중치) ####


# install.packages("kknn")

library(kknn)


wbcd[2:31]<-lapply(wbcd[2:31],normalize)


summary(wbcd)

knn_train<-wbcd[1:469,]

knn_test<-wbcd[470:569,]


wbcd_kknn<-kknn(diagnosis~.,train=knn_train,test=knn_test,k=21,distance=2,kernel="triangular")

# distance = Minkowski 에서의 p 값  -> 클릭

# kernel = 가중치를 주는 방법  ->  클릭


kknn_fit<-fitted(wbcd_kknn)


CrossTable(x=knn_test$diagnosis,y=kknn_fit,prop.chisq=FALSE,prop.c=FALSE)



이상으로 KNN 알고리즘 포스팅을 마치도록 하겠습니다.


REFERENCE 

[1] Machine Learning with R _ Brett Lantz

[2] 투빅스 1기 김보섭 _ K근접이웃 알고리즘

반응형

+ Recent posts