저번 시간에 이어서 KNN 구현을 마무리해자.


지금부터는 본격적으로 관련 라이브러리를 활용하여 완성을 할 것이다.


1
2
3
4
5
6
7
8
9
## Step.2 Training a model on the data ###
 
"class" 라이브러리 로드
install.packages("class")
library(class)
wbcd_test_pred<-knn(train=wbcd_train,
                    test=wbcd_test,
                    cl=wbcd_train_labels,
                    k=21)
cs


class 라이브러리의 knn 함수를 사용하여 KNN 알고리즘을 시행하게 된다. 


여기서 train은 위에서 나눈 학습 데이터, train은 검증 데이터, cl은 우리가 Target 변수로 하고 있는

Diagnosis 칼럼을 뜻하는데, 여기서 train_labels는 train data의 diagnosis 칼럼만 따로 추출해 놓은 것을 뜻한다. 


여기서 K는 전 포스팅 인트로에 설명하였던, 몇 개의 데이터를 계산에 포함시킬거냐에 관한 것이다.


보통 총 데이터셋의 제곱근의 값으로 계산하며, 여기서는 21로 지정하여 진행하도록 하겠다.



1
2
3
4
5
6
"gmodels" 라이브러리 로드
library(gmodels)
 
# 예측값과 실제값의 교차표 생성
CrossTable(x=wbcd_test_labels,y=wbcd_test_pred,prop.c=FALSE)
 #2개가 오분류 
cs


이렇게 생성한 예측값의 정확도를 확인해보기 위해서, gmodels 라이브러리의 크로스테이블을 사용한다. 



아래에서 확인할 수 있는 것처럼 약 98퍼센트의 예측 정확도를 보여주고 있다. 


이상으로 KNN알고리즘 구현을 마무리 할 수 있지만, 전 포스팅에서 진행하였던 최대최소 정규화 외에, 

다른 정규화 방법중 하나인 Z점수 표준화 공식을 간단히 설명하고 마무리하도록 하겠다.





공식은 X-평균 / 표준편차 이며, R에서는 아래와 같이 구현한다.


1
2
3
4
5
6
# 데이터 프레임를 z-score 표준화하기 위해 scale() 함수 사용
wbcd_z<-as.data.frame(scale(wbcd[-1]))
 
# 변환이 정확하게 적용되었는지 확인
summary(wbcd_z$area_mean)
  ## z는 평균이 0 
cs


R에서는 scale함수로 이를 간단하게 시행할 수 있으며, 아래처럼 summary 함수를 통해 성공적으로 변환이 되었는지

확인할 수 있다.


다른 과정은 동일하며 wbcd_n 자리에 wbcd_z를 넣어서 동일하게 진행하면 된다.





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