본문 바로가기
Business Analytics/R로 기본내용 공부하기

머신러닝 알고리즘 공부하기 (1) - R을 통한 knn(K nearest neighbor)

by BA815 2021. 1. 5.
728x90
반응형

머신러닝 방법 중에는 KNN(K Nearest Neighbor) 기법이 있다. 

 

이는 쉽게 생각해서 K번째 최근접 이웃이라는 뜻이다. 

 

여기서 근접의 개념을 이해하기 위해서는 거기를 어떻게 구할 것이냐의 이해가 있어야 하는데, 여기에서는 유클리디언 거리를 사용한다. 

 

유클리디언 거리공식은 아래와 같다. 

 

유클리디언 거리 공식

그림을 통해 생각해보자

 

knn 예시사진

이미 파란색, 빨간색, 초록색 그룹으로 구별되어 있는 집단이 있다고 생각해보자. 

 

여기서 새로운 노란색 점이 생기면, 이를 어떤 집단으로 구별해야 하는지를 정해야 한다. 

이때 가장 가까운 k개의 점을 봐서 노란점은 무슨 집단에 들어가야 한다고 정해주는 것이 knn 방법이다. 

위의 그림의 경우 파란색 집단과는 3개, 노란색과는 2개, 초록색과는 1개의 최근접 점이 있으므로 파란색으로 분류가 될 것이다. 

또한 이때의 제약 사항으로는 유클리디언 거리를 사용하기 위해서 피쳐는 연속형 변수여야 한다는 점이다. 

 

자 이런 기본적인 사항을 알았다면, R코드를 통해 실습을 해보자! 

 


1. 데이터 받기 

나는 간단한 실습을 해보기 위해 

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

 

UCI Machine Learning Repository: Breast Cancer Wisconsin (Diagnostic) Data Set

Breast Cancer Wisconsin (Diagnostic) Data Set Download: Data Folder, Data Set Description Abstract: Diagnostic Wisconsin Breast Cancer Database Data Set Characteristics:   Multivariate Number of Instances: 569 Area: Life Attribute Characteristics: Real N

archive.ics.uci.edu

상기 링크를 통해 데이터를 받았다.

 

머신러닝을 위한 교육용 데이터가 많이 저장되어 있으니 혼자서 공부할 때 참고하면 좋을 것이다.

 

머신러닝을 위한 각종 데이터들을 저장되어 있는 곳! 

  

여기서 데이터 폴더에 들어가면, 데이터 및 데이터명이 담긴 파일을 받을 수 있다. 

 

2. R에 코드 입력해보기 

#breast cancer data로 연습
install.packages("caret", dependencies = T) 
#caret package는 다른 패키지와 연계되어 사용할 때가 있으므로 depedencies= T로 설정해준다.
library(caret)
rawdata <- read.csv(file = "본인의 working directory/wdbc", header = F) 
#파일을 불러온다. 여기서 header가 F인 이유는 첫번째 행이 열이름이 아니기 때문

여기까지는 caret 패키지에 대한 다운과 library에서 불러오는 것을 완료하고, 데이터를 R안으로 분석하기 위해 분석하는 것까지 완료된 상태이다. 

 

data_total <- sort(sample(nrow(analdata), nrow(analdata)*0.7))

train <- analdata[data_total,]
train <- train[,-1]
test <- analdata[-data_total,]
test <- test[,-1]

이후에 해야하는 것은 데이터를 train data와 test data로 나누는 것이다. 

 

이를 위해서 랜덤으로 70%을 설정해주고, 70%는 train data에, 나머지 30%는 test data에 할당해준다. 

이때 첫번째 열을 제외한 이유는 데이터를 확인했을 때 첫번째 열은 ID로 크게 의미가 없는 열이기 때문이다. 

(데이터를 처음 받았을 때 확인해보고, 무엇을 어떻게 분석해야하는지 확인해봐야 한다.)

 

이후에는 knn을 위한 간단한 수식작업을 해준다. 

ctrl <- trainControl(method = "repeatedcv", number = 10, repeats = 5)
#여기서 trainControl 함수는 데이터 훈련(train) 과정의 파라미터(parameter)을 설정해주는 것이다.
#위와 같이 하면, method는 crossvalidation을 반복하는 것이고, number는 훈련 데이터 fold 갯수이며,
#repeat은 crossvalidation 반복횟수이다. 

customGrid <- expand.grid(k=1:10) # 모든 벡터 또는 인자(factor) 조합인 데이터프레인 생성

 

이후에는 train data를 통해 모형을 만들어 본다. 

knnfit <- train(X2 ~., #타겟 ~ 피처 (여기서는 모든 피처에 대해 살펴보기 때문에 .을 찍는다)    
                data =train,  # train data 활용 -> why? 현재는 모델을 생성하는 단계이기 때문에
                method ="knn", # 사용하고 싶은 머신러닝 방법 
                trControl = ctrl, #학습방법 
                preProcess = c("center", "scale"), #표준화(standardization): 평균을 빼고 표준편차로 나눔 
                tuneGrid= customGrid, # 튜닝 파라미터 값 목록 
                metric = "Accuracy") #모형평가 방식

이후에는 생성된 모델을 확인해보고, 이를 plot으로 확인해본다. 

knnfit

plot(knnfit)

이렇게 하면, k가 무엇일때 가장 좋은 모형이 형성되는지 알 수 있다. 

 

이렇게 모델이 생성되고 나면 이를 바탕으로 test data에 적용해본다. 

pred_test <- predict(knnfit, newdata = test) #predict 함수는 예측할 때 사용/ predict(우리의 모형, newdata = 테스트 데이터)
##### 이 과정을 넣어준 이유는 Error: `data` and `reference` should be factors with the same levels 이런 오류가 떴기 때문
##### 아마도 factor을 맞춰주지 않았기 때문인 것 같은데, 이는 나중에 factor을 맞춰주는 연습할 때 해볼 것 
test$X2
test_A <- ifelse(test$X2 == "M", 1,2)
test_A <- as.factor(test_A)
test_B <- ifelse(pred_test =="M", 1 ,2)
test_B <- as.factor(test_B)

confusionMatrix(test_B,test_A) #confusion matrix(분할표)안에 넣기

이렇게 test data을 통해서 확인해보고, 그때도 train data와 같이 좋은 결과값이 나온다면, 모형의 형성이 잘 된것으로 판단할 수 있다! 

 

여기까지 R을 통해 해보는 머신러닝 (1) KNN 방법이다! 

728x90
반응형

댓글