본문 바로가기
R

누구나 쉽게 시작하는 R을 활용한 기계학습 , 머신러닝 / KNN 알고리즘

by 자유코딩 2017. 12. 13.

R을 활용한 기계학습 , 머신러닝 / KNN 알고리즘

 

안녕하세요 이번 글은 R을 활용해서 데이터에 KNN 알고리즘을 적용하는 방법을 다루고 있습니다.

 

KNN 알고리즘

분류를 위한 대표적인 알고리즘.

가장 단순한 머신러닝 알고리즘 중 하나지만, 광범위하게 사용 됩니다.

 

 장점

 단점

  •  단순하고 효율적이다

  •  기저 데이터 분포에 대한 가정을 하지 않는다

  •  훈련 단계가 빠르다

  •  모델을 생성하지 않아 특징과 클래스 간의 관계를 이해하는 능력이 제약된다

  •  적절한 k의 선택이 필요하다

  •  분류 단계가 느리다

  •  명목 특징 및 누락 데이터를 위한 추가 처리가 필요하다

 

KNN 알고리즘의 특징

레이블이 없는 데이터를 분류합니다.

글자 k는 사용자가 정의하는 최근접 이웃의 개수를 의미합니다.

 

KNN알고리즘의 데이터 분석 순서

1. k를 지정한다.

2. 훈련 데이터를 기반으로 학습하고 데이터를 분류한다.

3. 새로운 테스트 인스턴스가 들어왔을때 학습 결과를 기반으로 분류한다.

 

예시와 함께 설명을 다시 보도록 하겠습니다.

 

재료

단맛 

아삭한 맛 

음식 종류 

사과 

10 

과일 

베이컨 

단백질 

바나나 

10 

과일 

당근 

10 

채소 

샐러리 

10 

채소 

치즈 

단백질

 

표와 같은 데이터를 예로 들겠습니다.

 

이런 데이터를 K-NN 알고리즘은 다음과 같은 좌표 평면으로 인식합니다.

 

데이터에 몇가지 식재료를 조금 더 추가했습니다.

 

좌표 평면을 보면 비슷한 종류의 음식들이 가까이 함께 있는 것을 확인 할 수 있습니다.

 

종류별로 묶어봤습니다.

 

여기서 토마토라는 새로운 개체가 추가되었을때 KNN 알고리즘을 사용하면 다음과 같이 분류 할 수 있습니다.

 

토마토의 단맛이 6이고 아삭한 맛이 4라고 했을때,

 

KNN알고리즘을 사용해서 다른 데이터 개체들과의 거리를 계산해보도록 하겠습니다.

 

재료 

단맛 

아삭한 맛 

음식 종류 

토마토와의 거리 

포도

과일 

sqrt((6-8)^2+(4-5)^2)=2.2 

껍질 콩

채소

sqrt((6-3)^2+(4-7)^2)=4.2 

견과

3

6

단백질

sqrt((6-3)^2+(4-6)^2)=3.6

오렌지

7

3

과일

sqrt((6-7)^2+(4-3)^2)=1.4

 

만약 여기서 토마토를 가장 가까운 1개의 데이터 개체가 속한 종류에 배정한다면 k는 1이 되고 1-nn 분류가 됩니다.

k의 크기가 1보다 더 커져서 3-nn이 된다면 3 개의 가장 가까운 데이터 개체들의 종류중에서 투표를 한다.

 

데이터에 따라서 적절한 k를 선택하는 것이 중요합니다.

 

이제 R로 KNN알고리즘을 사용해보겠습니다.

 

먼저 데이터셋을 다운로드 합니다.

https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/wisc_bc_data.csv

 

 

데이터를 드래그해서 메모장에 넣었습니다.

 

메모장에서 컬럼 이름에 붙어있는 " " 따옴표 들을 제거합니다.

 

 

따옴표를 제거한 후 파일을 csv 파일로 저장합니다.

 

 

저장된 파일을 확인했습니다.

 

※참고사항. 파일을 저장할때 UTF-8을 선택하시면 R에서 읽을때 컬럼 이름이 제대로 읽히지 않고 꿼과 같은 문자로 읽히기도 합니다.

저는 ANSI로 저장했습니다.

 

이제 R에서 파일을 읽습니다.

 

파일의 경로를 입력하고 header=T를 입력합니다.

 

header=T는 데이터의 맨 윗줄을 컬럼 이름으로 인식하기 위해 써줍니다.

 

데이터를 읽은 모습입니다.

 

 

이제 데이터의 id 컬럼을 삭제하겠습니다.

 

id컬럼을 삭제하는 이유는 KNN 알고리즘의 거리 계산에서 id 컬럼에 있는 숫자를 사용하지 않기 때문입니다.

데이터 컬럼의 B와 M값의 비중을 확률 표로 출력 했습니다.

 

다음은 데이터를 정규화 하는 과정입니다.

 

area_mean과 smooth_mean 은 값의 구간이 차이가 많이납니다.

 

이 값들을 그대로 knn 거리 계산에 사용한다면 area_mean의 영향이 아주 크고 smoothness_mean의 영향은 너무 적어지게 됩니다.

데이터를 정규화하기 위한 normalize라는 함수를 정의했습니다.

 

함수를 정의하고 데이터의 2번째 컬럼부터 31번째 컬럼까지 값을 정규화합니다.

 

lapply 함수는 괄호안의 컬럼 목록을 가리키는 함수입니다.

 

정규화 한 결과를 확인해보면 143부터 2500까지 있던 값들이 0부터 1사이로 바뀌었습니다.

 

데이터를 train과 test 셋으로 나누었습니다.

1행부터 469행까지는 train셋으로 규정했습니다.

470행부터 569행까지는 test셋으로 규정했습니다.

 

데이터셋의 label 정보를 벡터로 만들었습니다.

 

 

이제 알고리즘을 훈련시키기 위한 패키지를 다운로드 받습니다.

 

 

class 패키지의 knn()함수는 기본 knn알고리즘의 기능을 제공합니다.

 

그러면 이제 knn함수를 실행해보겠습니다.

이제 출력을 하기 위한 패키지 gmodels 를 설치하고 결과를 출력해보도록 하겠습니다.

 

 

표에서 Benign 행 Benign 열은 label이 Benign 인데 예측을 Benign으로 한 경우입니다.

 

Malignant 행 Malignant 열 역시 label이 Malignant인데 예측을 Malignant로 한 경우입니다.

 

k가 3이면 k의 값이 너무 작으니 k의 값을 21로 바꿔서도 실험을 진행해보겠습니다.

 

prop.chisq = false는 결과에 필요없는 카이 제곱 값을 제거합니다.

 

이렇게 knn알고리즘을 시행하는 방법에 대해서 알아봤습니다.

 

k의 값을 바꿔가며 예측모델의 성능을 향상시킬 수 있습니다.

 

jswoo030@gmail.com 으로 질문을 보내시면 빠른 답변을 받으실 수 있습니다.

 

 

이 글은 R을 활용한 머신러닝 2 edition (브레트 란츠) 을 참고하여 작성되었습니다.

댓글