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에 가까울 수록 분류 정확)
728x90
'BAE(Certification)' 카테고리의 다른 글
1. 정형 데이터 분석 - 앙상블(ensemble) : 배깅(bagging) (0) | 2023.05.16 |
---|---|
1. 정형데이터 분석 - 나이브 베이즈(Naive Bayes) 분류 (0) | 2023.05.16 |
1. 정형데이터 분석 - 서포트 벡터 머신(SVM, Support Vector Machine) (0) | 2023.05.16 |
1. 정형데이터 분석 - 의사결정나무(decision tree) (0) | 2023.05.16 |
1. 정형데이터 분석 - 로지스틱 회귀 분석(Logistic Regression) (0) | 2023.05.16 |