# KNN - 최근접 알고리즘을 사용
d<-iris
head(d)
install.packages("ggvis")
library(ggvis)
#iris %>% ggvis(~Petal.Length, ~Sepal.Width, fill=~factor(Species)) %>% layer_points() # %>%
iris %>% ggvis(~Petal.Length, ~Petal.Width, fill=~factor(Species)) %>% layer_points()
#분류하기
iris[1:4]
#데이터 정규화
min_max_normal <- function(x){
num <- x - min(x)
m_n <- max(x) - min(x)
print(num/m_n)
#return(num/m_n)
}
normal_d<-as.data.frame(lapply(iris[1:4], min_max_normal)) #apply는 다른함수를 실행하는것, iris[1:4]를 가지고 min_max_normal로 가서 실행함
normal_d
summary(normal_d) #min 0 , max 1
# 정규화 데이터 + 꽃 종류
df <- data.frame(normal_d, Species= iris$Species)
head(df,3)
#학습, 검정 데이터로 분리
set.seed(123)
idx <-sample(1:nrow(df),0.7*nrow(df))
ir_train <- df[idx,]
ir_test <- df[-idx,]
nrow(ir_train); nrow(ir_test)
# KNN 모델 적용
#모델 만듬
library(class)
model <- knn(train=ir_train[,-5], test=ir_test[,-5],cl=ir_train$Species, k=3)
model
summary(model)
#모델 평가
t <-table(model,ir_test$Species)
t
(12+16+14)/nrow(ir_test) #93퍼센트
acc <-(t[1,1] + t[2,2] + t[3,3])/nrow(ir_test) #93퍼센트
acc
library(gmodels)
CrossTable(x = ir_test$Species, y=model, prop.chisq = F)
# 최적의 k값 구하기
sqrt(length(ir_train$Sepal.Length)) # k :9 , 11
model2 <-knn(train = ir_train[,-5],test = ir_test[,-5],cl=ir_train$Species,k=11)
summary(model2)
t<-table(model2,ir_test$Species)
t
acc <-(t[1,1]+t[2,2]+t[3,3])/nrow(ir_test)
acc
댓글 영역