728x90

K-NN 알고리즘은 해당 데이터와 가장 가까운 k개의 데이터들의 클래스로 분류하는 알고리즘이다.

보통 유클리드 거리, 맨하탄 거리, 민코우스키 거리 등을 사용하며, 기본적으로는 유클리드 거리를 사용한다.

근접 이웃 수는 k로 학습 난도와 훈련 데이터 개수에 따라 결정하며, 일반적으로 훈련 데이터 개수의 제곱근으로 설정한다.

 

knn(train, test, cl, k) : cl - 훈련  데이터의 종속변수, k - 근접 이웃 수(기본 1)

 

data = iris[, c("Sepal.Length", "Sepal.Width", "Species")]

idx = sample(x=c("train", "valid", "test"), #학습, 검증, 테스트 데이터로 분할
				size = nrow(data)
                replace = T, #복원추출
                prob = c(3, 1, 1))
train = data[idx=="train",]
valid = data[idx=="valid",]
test = data[idx=="test",]

#3열(y데이터) 제외하고 2열을 x데이터로 선택
train_x = train[, -3]
valid_x = valid[, -3]
test_x = test[, -3]

#3열을 y데이터로 선택
train_y = train[, 3]
valid_y = valid[, 3]
test_y = test[, 3]

#이웃 수 별 KNN모형 생성
knn_1 = knn(train = train_x,
			test = valid_x,
            cl = train_y,
            k = 1) #이웃 수를 1로 설정한 KNN모형 생성
knn_2 = knn(train = train_y,
			test = valid_y,
            cl = train_y,
            k = 2) #이웃 수를 2로 설정한 KNN모형 생성

accuracy_k  = NULL
for(i in c(1:nrow(train_x))){
	knn_k = knn(train = train_x,
    			test = valid_x,
                cl = train_y,
                k = i)
    accuracy_k = c(accurary_k, sum(knn_k == valid_y) / length(valid_y))
}

#최적의 분류 정확도를 데이터프레임 형태로 변환
vaild_k = data.frame(k = c(1:nrow(train_x)),
						accuracy = accuracy_k)

#그래프로 출력
plot(formula = accuracy ~ k,
data = valid_k,
        type = "o",
        pch = 20,
        main = "validation - optimal k")
        
min(valid_k[valid_k$accuracy %in% max(accuracy_k), "k"]) #분류 정확도가 제일 높으면서, 가장 작은 k값 출력
max(accuracy) #가장 높은 정확도 출력
#결과로 k=13일때, 가장 높은 정확도를 보임

# k=13인 knn 모형 생성
knn_13 = knn(train = train_x,
				test = test_x,
                cl = train_y,
                k = 13)
                
library(caret)
confusionMatrix(knn_13,
				reference = test_y) # 모형평가
#정확도가 0.7714로 높진 않은 KNN 모형 생성
#카파통계량이 0.6429로 분류도는 높지 않은 상황(1에 가까울 수록 분류 정확)

Predicted kappa for two categories

 

728x90