원래코드로 했을때
seed 수정했을 때
wbcd <- read.csv("c:\\data\\wisc_bc_data.csv", stringsAsFactors=TRUE)
str(wbcd) # factor 형 컬럼이 있는지 꼭 확인합니다.
nrow(wbcd) # 569
ncol(wbcd) # 32
#View(wbcd)
#2단계 : 데이터 탐색
# 1.결측치 확인:
colSums( is.na(wbcd) ) # 결측치가 없는 예쁜 데이터 입니다.
# 결측치가 있다면 결측치를 다른 값으로 채워넣는 작업등을 해주어야합니다.
# 2. 종속변수의 데이터의 비율
table(wbcd$diagnosis)
#B M
#357 212
prop.table(table(wbcd$diagnosis))
#0.6274165 0.3725835
# 설명: 양성은 60% 이고 악성은 40% 로 구성되어있음이 확인됩니다.
# 기계학습 시키기 제일 좋은 상태는 둘다 50% 여야합니다.
# 기계학습 시킬때 좋은 정확도를 기대하려면 가급적 두개의 비율이 각각 반반으로 구성되어야함
#3. 데이터 스케일링 ( 최대최소 정규화 )
# 키와 체중이라는 독립변수가 있으면 키는 체중보다 숫자가 크므로 기계가 체중보다는
# 키가 더 중요하다고 잘못 판단할 수 있으므로 모든 독립변수들을 0 ~ 1사이로 변경합니다.
wbcd2 <- wbcd[ , c(-1,-2) ] # 환자번호(id) 와 정답컬럼(diagnosis)를 제외
normalize <- function(x) { return ( (x-min(x) ) / (max(x) - min(x) ) ) } # 최대최소 정규화 함수
summary(wbcd2)
wbcd_n <- as.data.frame( lapply( wbcd2, normalize) )
summary(wbcd_n)
#3단계 : 모델 훈련
# 훈련 데이터와 테스트 데이터를 분리 합니다. 90% 학습, 10% 실제 시험
set.seed(10) # 랜덤 난수를 생성할 때 어느 컴퓨터에서든 똑같은 난수가 생성될 수 있도록 지정
#install.packages("caret")
library(caret)
train_indx <- createDataPartition(wbcd$diagnosis, p=0.9, list=FALSE)
train_indx # 총 569개중에 90% 에 해당하는 데이터 인덱스 번호를 랜덤으로 추출
# 기계를 학습 시킬 훈련 데이터와 테스트 데이터 생성
wbcd_train <- wbcd_n[ train_indx, ] # 훈련 데이터 생성
wbcd_test <- wbcd_n[ -train_indx, ] # 테스트 데이터 생성
nrow(wbcd_train) # 513
nrow(wbcd_test) # 56
# 기계를 학습 시킬 훈련 데이터의 정답과 테스트 데이터의 정답 생성
wbcd_train_label <- wbcd$diagnosis[ train_indx ]
wbcd_test_label <- wbcd$diagnosis[ -train_indx ]
length(wbcd_train_label) # 513
length(wbcd_test_label) # 56
# knn 모델을 생성 및 예측
library(class) # 오스트리아 빈 대학교에서 생성
set.seed(10)
result1 <- knn ( train= wbcd_train, test=wbcd_test, cl = wbcd_train_label, k = 1 )
# 설명: knn( train=훈련 데이터, test= 테스트 데이터, cl=훈련 데이터 정답, k = 숫자)
result1
#4단계: 모델 성능 평가
sum( result1 == wbcd_test_label ) / length(wbcd_test_label) *100
# k = 1 일때 정확도 94.6 % 의 정확도를 출력했습니다.
# 5단계: 모델 성능 개선
accuracies <- data.frame(k = integer(), accuracy = numeric())
for (i in seq(1, 27, 2)) {
result1 <- knn(train = wbcd_train, test = wbcd_test, cl = wbcd_train_label, k = i)
accuracy <- sum(result1 == wbcd_test_label) / length(wbcd_test_label) * 100
accuracies <- rbind(accuracies, data.frame(k = i, accuracy = accuracy))
print(paste(i, '개 일때 정확도 ', accuracy))
}