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 |
위와 같이 훈련데이터와 검증데이터를 분류하고 전처리를 끝낸다.
'데이터분석 > with R' 카테고리의 다른 글
[R] 유클리드 거리 정의와 계산법 (0) | 2017.12.17 |
---|---|
[R] R로 구현하는 KNN(게으른 학습) 알고리즘 - (2) (0) | 2017.12.16 |
[R] 부스팅(앙상블)을 활용한 의사결정나무 정확도 향상 (4) | 2017.11.19 |
[R] R로 구현하는 의사결정나무(Decision Tree) (0) | 2017.11.12 |
[R] csv파일 입출력 및 기초통계 확인하기 (0) | 2017.11.04 |