#1.데이터 불러오기 cre <- read.csv('credit.csv',header =T , stringsAsFactors = T)
#2.데이터 관찰하기 head(cre) ncol(cre) nrow(cre)
#3.훈련과 테스트 분할하기 library(caret) set.seed(1) k <- createDataPartition(cre$default, p=0.8 , list= F) train_data <- cre[ k, ] test_data <- cre[-k ,]
#4.모델 훈련하기 library(e1071) model<- naiveBayes(default ~., data = train_data , laplace = 0.06) model
#5.테스트 데이터 예측하기 result <- predict(model, test_data[ ,-17])
#6.모델 평가하기 library(gmodels) sum(result == test_data[ ,17])/length(test_data[ ,17])*100 CrossTable(x=result, y=test_data[ , 17], chisq = TRUE)
#7.모델 개선하기 library(e1071) library(gmodels) options(scipen = 999)
y <- 0 jumpby <- 0.001
for (i in 1:30) { y <- y + jumpby model2 <- naiveBayes(default ~ ., data = train_data, laplace = y) result2 <- predict(model2, test_data[, -17]) # 이원 교차표의 출력을 억제 ct <- capture.output(a <- CrossTable(x = result2, y = test_data[, 17], print.chisq = FALSE)) fn_value <- a$t[1, 2] # FN 값 추출 accuracy <- sum(result2 == test_data[, 17]) / length(test_data[, 17]) * 100 print(paste(y, '일때 FN 값', fn_value, '정확도는', accuracy)) }
#테스트 데이터의 실제값 actual_type <- test_data[ ,17] #테스트 데이터의 예측값 predict_type <- result # 관심범주(yes) positive_value <- 'yes' # 관심범주(no) negative_value <- 'no'
#■ 정확도 library(gmodels)#crosstable 보는 패키지 g <-CrossTable( actual_type, predict_type ) x <- sum(g$prop.tbl *diag(2)) #정확도 확인하는 코드 x #0.695
#■ 카파통계량 #install.packages("vcd") #install.packages('zoo') library(vcd) library(zoo) table(actual_type,predict_type) Kappa(table(actual_type, predict_type)) #0.2413
#■ 민감도 #install.packages("caret") library(caret) sensitivity(predict_type, actual_type, positive=positive_value) #0.4166667
#■ 특이도 specificity(predict_type, actual_type, negative=negative_value) #0.8142857
#■ 정밀도 posPredValue(predict_type, actual_type, positive=positive_value) #0.4901961
#■ 재현율 sensitivity( predict_type, actual_type, positive=positive_value) #0.4166667
#■ F1 score 구하기 library(MLmetrics) F1_Score( actual_type, predict_type, positive = positive_value) #0.4504505 |