KNN알고리즘은 게으른 학습의 한 종류다. 


게으른 학습의 특징은 다음과 같은데, 


  • 모형을 미리 만들지 않는다

  • 새로운 데이터가 들어오면 그때부터 계산하기 시작함


으로 정리할 수 있다.

이를 KNN에 적용시켜보면 다음과 같다.

KNN은 새로운 데이터가 들어오면 K-nearest neighbor K개의 가까운 이웃들을 참고한다.

K가 2면 두 개를 찾고 3은 세 개를 찾는데 데이터에서 가까운 순서대로 찾게된다.


만약 가까운걸 찾앗는데 검은 것이 3개면 똑같이 검은색으로 분류

만약 가까운 것 세개중 두 개가 검은거면 다수결에 따라 검은색으로 분류

(실제로는 자신을 제외한 모든 데이터들과의 거리를 구하고 가까운 순서대로 정렬해서 K개를 바탕으로 한 다수결로 결과를 도출함)

 

이 거리를 어떻게 구하냐? 유클리드 거리 (다차원 공간에서 거리를 구하기 위한 방법)를 사용한다.


이 때 K가 커지면 커질수록 안정적으로 분류하는 모형을 만들수 있고(직선 형태)

K가 작으면 작을수록 세부적으로 분류할 수 있는 모형(곡선)을 만들 수 있다.


보통 K 선정은 훈련 데이터 개수에 제곱근을 씌운다움 1`부터 k까지 테스트해보고 제일 맞는거를 k로 선정해서 진행하게 된다.


이제 실습으로 들어가보자.



오늘은 UCI에서 제공하는 유방암 진단 관련 데이터를 사용할 것이다. 다운로드 링크는 아래와 같다.


 https://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic) 


타겟변수는 Diagnosis(진단)이며 M은 malignant(양성), B(benign(음성)) 을 뜻한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# CSV file import
wbcd<-read.csv("cancer.csv",stringsAsFactors = FALSE)
 
# wbcd 데이터 프레임의 구조
View(wbcd)
str(wbcd)
 
# id 속성 제거
wbcd<-wbcd[-1]
 
# 진단 테이블
table(wbcd$diagnosis)
##B는 양성 M는 음성 
 
# 팩터로서 진단 변수 변환
wbcd$diagnosis<-factor(wbcd$diagnosis, levels=c("B","M"),
                       labels=c("Benign","Malignant"))
                                                
cs


데이터셋에 대한 간단한 전처리를 진행한다.



1
2
3
# 세 속성에 대한 요약
summary(wbcd[c("radius_mean","area_mean","smoothness_mean")])
  #속성에 대한 관찰  - 편차가 크기때문에 정규화 필요 
cs

세 속성에 대해 탐색해보기로 한다. 아래에서 확인 할 수 있는 것처럼 변수내의 편차가 매우 크며,
따라서 정확한 분석을 위해 정규화를 진행하기로 한다. 



해보기로 한다. 아래에서 확인 할 수 있는 것처럼 변수내의 편차가 매우 크며,
따라서 정확한 분석을 위해 정규화를 진행하기로 한다. 



1
2
3
4
5
6
7
8
9
10
# 정규화 함수
normalize<-function(x){
  return ((x-min(x))/(max(x)-min(x)))
}
 
 
# wbcd 데이터 정규화
wbcd_n<-as.data.frame(lapply(wbcd[2:31],normalize))
  ##lapply는 리스트를 입력받아서 리스트의 각원소에 함수를 적용함 
  ## 즉 wbcd에 있는 모든 numeric data 정규화 한것 0 - 1 
cs

 

R에서 함수를 생성하는 방법은 위와 같으며, 정규화 함수를 생성한 후 

이를 wbcd 데이터에 적용시켜주고, 이를 wbcd_n변수에 담는다. 



1
2
3
4
5
6
7
8
9
10
11
# 훈련 데이터와 테스트 데이터 생성
wbcd_train<-wbcd_n[1:469,]
wbcd_test<-wbcd_n[470:569,]
 
 
# 훈련 데이터와 테스트 데이터에 대한 라벨 생성
wbcd 
wbcd_train_labels<-wbcd[1:469,1] ###,1 은 diagnosis 
wbcd_test_labels<-wbcd[470:569,1]
wbcd_train_labels
wbcd_test_labels 
cs


위와 같이 훈련데이터와 검증데이터를 분류하고 전처리를 끝낸다. 



+ Recent posts