#1단계.
if (!require("mlbench")) install.packages("mlbench")
library(mlbench)
# Digits 데이터셋 로드
data("Glass", package = "mlbench")
# 데이터셋의 특성 출력
str(Glass)
# 데이터셋의 행과 열의 수 출력
print(dim(Glass)) # 행과 열의 수 출력
print(summary(Glass)) # 데이터셋 요약 정보 출력
head(Glass)
nrow(Glass)
unique(Glass$Type)
요약
RI: 굴절률 (Refractive Index)
Na: 나트륨 함량 (Sodium)
Mg: 마그네슘 함량 (Magnesium)
Al: 알루미늄 함량 (Aluminum)
Si: 실리콘 함량 (Silicon)
K: 칼륨 함량 (Potassium)
Ca: 칼슘 함량 (Calcium)
Ba: 바륨 함량 (Barium)
Fe: 철 함량 (Iron)
Type: 유리의 종류 (Type)
----
# 2단계: 데이터 탐색
# 1. 결측치 확인
colSums(is.na(Glass))
# 2. 종속변수의 데이터 비율
table(Glass$Type)
prop.table(table(Glass$Type))
# 3. 데이터 스케일링 (최대최소 정규화)
Glass2 <- Glass[, c(-10)] #정답컬럼(Type)을 제외
normalize <- function(x) { return((x - min(x)) / (max(x) - min(x))) }
Glass_n <- as.data.frame(lapply(Glass2, normalize))
summary(Glass_n)
# 3단계: 모델 훈련
# 훈련 데이터와 테스트 데이터를 분리합니다. 90% 학습, 10% 시험
set.seed(10)
train_indx <- createDataPartition(Glass$Type, p=0.9, list=FALSE)
# 기계를 학습 시킬 훈련 데이터와 테스트 데이터 생성
Glass_train <- Glass_n[train_indx, ]
Glass_test <- Glass_n[-train_indx, ]
nrow(Glass_train) # 513
nrow(Glass_test) # 56
# 기계를 학습 시킬 훈련 데이터의 정답과 테스트 데이터의 정답 생성
Glass_train_label <- Glass$Type[train_indx]
Glass_test_label <- Glass$Type[-train_indx]
length(Glass_train_label) # 513
length(Glass_test_label) # 56
# 4단계: 모델 성능 평가
accuracies <- data.frame(k = integer(), accuracy = numeric())
set.seed(10)
for (i in seq(1, 57, 2)) {
result1 <- knn(train = Glass_train, test = Glass_test, cl = Glass_train_label, k = i)
accuracy <- sum(result1 == Glass_test_label) / length(Glass_test_label) * 100
accuracies <- rbind(accuracies, data.frame(k = i, accuracy = accuracy))
print(paste(i, '개 일때 정확도 ', accuracy))
}
# 정확도 데이터 프레임 확인
accuracies
# plotly로 라인 그래프 시각화
fig <- plot_ly(accuracies, x = ~k, y = ~accuracy, type = 'scatter', mode = 'lines+markers', line = list(color = 'red'))
fig <- fig %>% layout(title = "K 값에 따른 정확도",
xaxis = list(title = "K 값"),
yaxis = list(title = "정확도"))
fig
k=3일때 정확도가 제일 높음