반응형

안녕하세요!


저는 매일매일 딥러닝을 위해 공부를 하고 있습니다!


하지만....

요즘 너무 바빠서 블로그 운영을 가끔 포스팅하고 있네요ㅜ


더 열심히 올리도록 하겠습니다!!


사설은 여기까지!


오늘은 지도학습의 분류 방법 중  KNN알고리즘에 대해 알아보도록 하겠습니다!


지도학습이 무엇인지 궁금하시다면 여기로!



우선 KNN이란 무엇일까요?


KNN이란, k Nearest Neighbors의 약자로 k개의 가장 근처의 이웃들을 내 이웃으로 보고 분류하는 방법입니다.


즉, 유사성을 인식하여 결과를 추정하는 것이죠.


단, 같은 거리안에 여러개의 그룹이 있으면 다수결에 의해서 가장 많은 그룹을 선택하는 방법



예를들어,


 유유상종이라는 사자성어도 있듯이 사회적으로도 비슷한 사람끼리 모이는 성질이 있습니다.


또한 가구점이 모이는 상가지역이 따로 형성되어 있거나 한약방이 밀집되어 있는 지역이 따로 모여있는 경우가 있습니다.


이러한 특성을 가진 데이터를 분석목적으로 만들어진 알고리즘이 knn입니다!




머신러닝에서는 실습으로 그 방법을 알아보도록 하겠습니다!



[실습 방법]



1. 데이터 로드


2. label(정답)이 될 컬럼을 factor로 변환한다.


3. 데이터를 shuffle한다.


4. 필요없는 데이터를 정제한다.


5. 데이터를 정규화 한다.


6. train 데이터와 test 데이터로 나눈다.


7. label과 데이터를 나눈다.


8. 가장 좋은 k값을 찾는다.


9. taining 데이터로 knn모델을 훈련시킨다.


10. 모델의 정확도를 확인한다.


11. 이원 교차표를 그려서 확인한다.


12. 튜닝한다.





[코드 확인하기]



1. 데이터 로드

# 데이터를 로드할 때 디렉토리를 넣어주어야합니다.


# 매번 넣는 것이 귀찮다면 아래의 코드를 삽입하세요.(r studio기준)

# setwd("디렉토리")


# header = T: data의 header를 가져오겠다.

# stringsAsFactors = FALSE : data를 Factor로 변환하지 않겠다.

wbcd <- read.csv("wisc_bc_data.csv", header=T, stringsAsFactors = FALSE)


2. label이 될 컬럼을 factor로 변환한다.

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

> 보다 명확한 labeling을 위해 범주형 데이터인 factor로 변환하였다.


3. 데이터를 shuffle한다.

# set.seed란 랜덤한 값을 시작하기 전에 사용하면 이후에도 같은 값으로 랜덤값을 갖는다.

set.seed(123) wbcd_shuffle <- wbcd[sample(nrow(wbcd)), ]

> 데이터를 shuffle하는 이유: training 데이터와 test데이터를 보다 형평성있게 할당하기 위해서


4. 필요없는 데이터를 제거한다.

# 현재 wbcd 데이터 프레임에 id라는 컬럼이 필요없다.

# dataframe에서 컬럼을 제외하고 출력하는 방법으로

# 코드 해석: wbcd_shuffle에서 1번컬럼은 제외하고 나머지 컬럼을 wbcd2에 할당한다.

wbcd2 <- wbcd_shuffle[-1]


5. 데이터를 정규화한다.

# normalize라는 정규화함수를 사용자 정의 함수로 생성한다.

normalize <- function(x) {            return ( (x-min(x)) / (max(x) - min(x)) ) }

ncol <- which(colnames(wbcd2) == "diagnosis")

# lapply(list or vector,function): function을 수행한 결과가 리스트로 리턴됨.

# (굉장히 자주 쓰이는 함수)

# as.data.frame: dataframe으로 변환하는 함수


# factor인 label을 제외하고 normalize한다. wbcd_n <- as.data.frame(lapply(wbcd2[-ncol],normalize))


# 정규화한 data테이블과 제외한 label을 합쳐준다(SQL에서 JOIN과 같은 느낌) wbcd_n <- cbind(wbcd2[1], wbcd_n)



6. train 데이터와 test 데이터로 나눈다. (머신러닝_ 지도학습이기 때문)

# 여기서는 9:1로 나눈다.


train_num<-round(0.9*nrow(wbcd_n),0) wbcd_train<-wbcd_n[1:train_num,] wbcd_test<-wbcd_n[(train_num+1):nrow(wbcd_n),]


7. label과 데이터를 나눈다.

# train 데이터와 test 데이터의 수를 맞춰서 label을 나눈다.

wbcd_train_label <- wbcd2[1:train_num,1] wbcd_test_label <- wbcd2[(train_num+1):nrow(wbcd_n),1]


8. 가장 좋은 k값을 찾는다.

# 없다면 install한다

# install.packages("caret")

# install.packages("e1071")


library(caret) library(e1071)


# repeats가 높아지면 어떠한 max(k)에 수렴함 repeats = 10 numbers = 10 tunel = 10 # "데이터가 부정확, 불완전 또는 불합리한가 어떤가를 확인하기 위해서 사용되는 처리" set.seed(1234) x = trainControl(method = "repeatedcv", # numbers만큼 쪼개겠다. 1개를 validation, 나머지 train 반복 number = numbers, # number 한바퀴가 repeat = 1 repeats = repeats, classProbs = TRUE, summaryFunction = twoClassSummary) model1 <- train(diagnosis~. , data = wbcd_train, method = "knn", preProcess = c("center","scale"), trControl = x, metric = "ROC", tuneLength = tunel)


# 가장 좋은 k값

k_n <- max(model1$bestTune)

> 코드 출처: K Nearest Neighbor : Step by Step Tutorial


9. taining 데이터로 knn모델을 훈련시킨다.

# knn 함수가 있는 library

library(class) result1 <- knn(train=table_train, test=table_test, cl= table_train_label, k = k_n )


10. 모델의 정확도를 확인한다.

prop.table( table(ifelse(table1[(mm+1):nrow(table_n), col1]==result1,"o","x" )))


11. 이원 교차표를 그려서 확인한다.

library(gmodels) CrossTable( x= table_test_label, y= result1, prop.chisq=FALSE)

> 이원 교차표: 두 변수 간의 관련성 분석을 위해 한 변수는 열(column)에, 다른 변수는 행(row)에 배치하여 행과 열이 교차하는 칸(cell)에 필요한 빈도(frequency), 백분율(percentage) 등을 나타낸 표
(출처: PART 2. 기초데이터분석 - kocw)


12. 튜닝한다.


1. shuffle set.seed()값 변경하기

2. repeats를 높여본다.



k-NN 알고리즘을 흔히 게으르다고 하는 이유:


엄격한 학습의 정의하에 게으른 학습자는 실제 어떤것도 학습하지 않는다.

대신 훈련데이터를 글자 그대로 저장하기만 한다. (인스턴스 기반, 암기기반이라고 부름)

따라서 훈련이 매우 빠르게 일어난다.

 하지만 실제 훈련단계에서는 아무것도 훈련하지 않기 때문에

예측단계는 상대적으로 느린 경향보인다.





오늘은 여기까지!


이렇게 긴 코드를 디테일하게 설명 해본 적이 없어서

노력은 했는데 잘 전달했는지 모르겠어요~


궁금하신 점은 댓글로 달아주세요!


* 관련 데이터는 저작권확인해보고 올리도록하겠습니다!

반응형

+ Recent posts