머신러닝 & 딥러닝
1. [지도학습] KNN (K-Nearest Neighborhood) (1)
김초송
2023. 3. 13. 15:31
머신러닝 종류
- 지도학습
- 정답이 있는 데이터로 학습
- 분류 :
KNN, naivebasyes, decision tree, 신경망, SVM(support vector machine), 앙상블 - 회귀 :
단순 회귀, 다중 회귀
- 비지도학습
- 정답이 없는 데이터를 스스로 학습
- 강화학습
- 기계가 스스로 데이터를 만들면서 학습
KNN (K-Nearest Neighborhood)
- 분류문제란 새로운 데이터가 들어왔을 때 이 데이터가 기존에 있던 데이터의 그룹 중에 어느 그룹에 속한건지 분류하는 것
- 기존 데이터들과 가장 가까운 거리의 그룹으로 분류
- k 는 몇 개의 최근접 데이터를 살펴볼 것인가를 정한 숫자
- k가 다수일 경우 가장 많은 그룹(다수결)로 분류
-> k의 개수는 의사결정을 해야하기 때문에 항상 홀수를 선택 - k 가 너무 작으면 overfitting, 많으면 underfitting 문제가 생김
- 여러 개 k에 대한 에러율을 구함 -> 가장 에러율이 낮은 k 를 선택
- 거리 공식
- 유클리드 거리 (노름=norm)
: d(p, q) = √(p1 - q1) ^ 2 + (p2 - q2) ^ 2
- R 로 구현하기
# 1. 2차원에서 좌표 거리 구하기
a <- c(2, 4)
b <- c(5, 6)
dist <- sqrt(sum((a-b)^2))
dist
# 2. 3차원에서 좌표 거리 구하기
a <- c(0, 3, 2)
b <- c(2, 0, 0)
dist <- sqrt(sum((a-b)^2))
dist
KNN 모델 생성 과정
- 데이터 수집
: 데이터셋 불러오기 - 데이터 탐색
: 결측치, 이상치, 분포 확인(히스토그램), 정규화 또는 표준화 - 모델 훈련
: 모델 설정 / 훈련 / 예측, 분류 - 모델 성능 평가
: 이원교차표를 통해 정확도 확인 - 모델 성능 개선
: 모델의 예측 / 분류 성능 개선
- 데이터 수집
# 실습 : 유방암 데이터로 분류 모델 생성
wbcd <- read.csv("C:/Data/wisc_bc_data.csv")
wbcd
nrow(wbcd) # 데이터 건수
ncol(wbcd) # 컬럼 갯수
- 데이터 569 개
- 종속변수 : diagonsis = 양성 / 음성
- 독립변수 32 개
: 반지름, 질감, 둘레, 넓이, 매끄러움, 조밀성, 오목함, 오목점, 대칭성, 프랙탈 차원 등
table(wbcd$diagnosis) # 양성 악성
prop.table(table(wbcd$diagnosis)) # 양성 악성 비율로 보기
- 양성 데이터가 62%, 음성이 37% 이므로 양성을 더 잘 학습할 것
# 데이터 구조 확인
str(wbcd)
- diagnosis 컬럼 제외 모두 숫자형
- 데이터 탐색
# 결측치 확인
colSums(is.na(wbcd))
# 분포 확인
hist(wbcd$area_mean)
hist(wbcd$dimension_se)
hist(wbcd$symmetry_se)
- 데이터가 정규 분포 형태인지 히스토그램 그래프로 확인
- 모델 훈련
- 정답 데이터는 factor 형태로 제공
factor : 순서가 있는 벡터
wbcd <- read.csv("C:/Data/wisc_bc_data.csv", stringsAsFactors=TRUE)
str(wbcd) # factor 형으로 바뀌었는지 확인
# 정규화 : 0 에서 1 사이 값으로 변환
wbcd2 <- wbcd[, c(-1, -2)] # 환자 번호, 정답 제외하고 wbcd2 구성
normalize <- function(x){
return ((x - min(x)) / (max(x) - min(x)))
}
wbcd_n <- as.data.frame(lapply(wbcd2, normalize))
summary(wbcd_n) # 요약 통계값
# train data / test data 구성
num <- round(0.9 *nrow(wbcd_n))
train <- wbcd_n[1:num, ]
test <- wbcd_n[(num+1):nrow(wbcd), ]
train_label <- wbcd[1:num, 2] # 2번 컬럼 (양성/음성 컬럼)만 가지고 옴 (벡터)
test_label <- wbcd[(num+1):nrow(wbcd), 2]
nrow(train)
length(train_label)
- nrow 와 length 길이 같음
# knn 모델 생성
library(class)
result <- knn(train=train, test=test, cl=train_label, k=1)
- knn(train=훈련 데이터, test=테스트 데이터, cl=훈련 데이터 정답, k=k의 갯수)
- result 의 길이는 57
- 모델 성능 평가
sum(result == test_label)
sum(result == test_label) / length(test_label) * 100 # accuracy (정확도)
- 모델 성능 개선
result3 <- knn(train=train, test=test, cl=train_label, k=3)
result5 <- knn(train=train, test=test, cl=train_label, k=5)
result7 <- knn(train=train, test=test, cl=train_label, k=7)
sum(result3 == test_label) / length(test_label) * 100
# [1] 96.49123
sum(result5 == test_label) / length(test_label) * 100
# [1] 98.24561
sum(result7 == test_label) / length(test_label) * 100
# [1] 98.24561
- k=5 가 제일 적절한 듯
본 내용은 아이티윌 '빅데이터&머신러닝 전문가 양성 과정' 을 수강하며 작성한 내용입니다.