-
[R 데이터 분석] 나이브 베이즈 분류 (Naive Bayes Classification)머신러닝 with R 2019. 11. 3. 14:16
베이즈 정리
- 나이브 베이즈 분류는 베이즈 정리를 이용한 확률 분포 모형이다.
- 조건부 확률을 기반으로 한다.
- 조건부 확률 P(A|B) : 사건 B가 발생한 경우 A가 발생할 확률을 의미
맑은 날인데 비가 왔을 때의 확률은?
비가 왔는가? 옴 안옴 합계 맑은날 2 8 10 흐린날 5 5 10 합계 7 13 20 - 전체 중 비가 안올 확률 P(비) = 7/20
- 전체 중 비가 안올 확률 P(~비) = 13/20
- P(비 | 맑은날) = P(맑은날 | 비) * P(비) / P(맑은날)
- P(맑은날 | 비) = 2/7
- P(비 | 맑은날) = 2/7 * 7/20 / 0.5 = 0.2
나이브 베이즈 분류
- 확률 값의 조합으로 목표 변수의 두 집단 중 높은 쪽으로 분류한다.
- 나이브: "단순한"의 의미로 여러 변수의 상호작용 생각 X, 모든 변수가 독립이라 가정함.
- 속도가 매우 빠르고 분류에 필요한 파라미터 추정을 위한 데이터 양이 매우 작음.
- 복잡한 조합에서도 데이터만 충분하면 잘 작동
- 변수(column)의 수가 개체(raw)의 수보다 많더라도 사용 가능한 알고리즘! 즉, high dimension에서도 사용 가능.
- 로지스틱 회귀분석에서는 불가능해서 차원을 축소하는 과정이 필요하다.
고려해야할 변수가 늘어난다면...?
- 계산을 하기가 어려워짐
- 이를 회피하기 위해 결합 확률이 단순하게 확률의 곱이 되도록 함 (나이브 = 독립가정)
- 조건부 확률 값을 곱의 확률 값으로 대체하여 해결
- 빈 경우가 생길 수 있음.
- 변수가 10개고, 값이 2개씩만 있더라도 2의 10제곱 만큼의 조합이 나올 수 있음.
- 만약 조합 중 비어있는 경우가 있을 때 그냥 쓰게 되면 확률이 0이 됨.
- 이를 회피하기 위해서는 라플라스(laplace) 옵션을 사용
- 확률 추정 시 빈셀이 있을 경우가 多
- 이럴경우 α 값 (1) 을 더하여 계산해 모형 추정을 안정화
- 입력 변수가 숫자 (연속형)인 경우?
- 변수의 정규 분포를 가정
# 실습하기
Data : HouseVotes84 (in mlbench package)
- 453명 * 17개 변수
- 가설: 1984년 미국 하원의원 16개 법안의 찬성반대 기록과 당 (민주당 vs. 공화당) 투표형태에 따라 당이 다를 것이다
- 데이터는 모두 binary (yes or no)로 구성
- training vs. test 셋 구분
- 나이브 베이즈 모형 적용 VS.나이브베이즈 + 라플라스 옵션
- 성과평가
##################################### # # # 39. 나이브 베이즈 # # # # # # # ##################################### #packages install if(require("mlbench") == F) install.packages("mlbench") if(require("dplyr") == F) install.packages("dplyr") if(require("MASS") == F) install.packages("MASS") if(require("e1071") == F) install.packages("e1071") library(mlbench) library(dplyr) library(MASS) library(e1071) set.seed(1234) data("HouseVotes84") ?HouseVotes84 str(HouseVotes84) dim(HouseVotes84) # 학습, 평가 데이터셋 분할 idx = sample(2, nrow(HouseVotes84), replace = T, prob = c(0.7,0.3)) train_house <- HouseVotes84[idx == 1, ] nrow(train_house) test_house <- train_house[idx == 2, ] nrow(test_house) ##### 모델링 , 나이브 베이즈 #### ?naiveBayes #나이브베이즈 기본 NB_1 <- naiveBayes(Class~., data = train_house) print(NB_1) test_house$NB_1 <- predict(NB_1, newdata = test_house) ## predict(NB_1, newdata = test_house , type ="raw") #모형 평가 temp <- table(test_house$NB_1, test_house$Class ,dnn =c("preidicted","observed")) # accuracy check result_summary <- data.frame( modle = "NaiveBayes", accuracy = (temp[1,1] + temp[2,2]) /sum(temp) , precision = temp[2,2] / (temp[2,1] + temp[2,2]), recall = temp[2,2] / (temp[1,2] + temp[2,2])) # AUROC = performance(pred_knn,"auc")@y.values[[1]]) result_summary <- result_summary %>% mutate(F1 = 2 * precision * recall /(precision + recall)) #나이브베이즈 + laplace option NB_2 <- naiveBayes(Class~., data = train_house, laplace = 3) print(NB_2) test_house$NB_2 <- predict(NB_2, newdata = test_house) #모형 평가 temp <- table(test_house$NB_2, test_house$Class ,dnn =c("preidicted","observed")) # accuracy check result_temp <- data.frame( modle = "NaiveBayes+LPLC", accuracy = (temp[1,1] + temp[2,2]) /sum(temp) , precision = temp[2,2] / (temp[2,1] + temp[2,2]), recall = temp[2,2] / (temp[1,2] + temp[2,2])) # AUROC = performance(pred_knn,"auc")@y.values[[1]]) result_temp <- result_temp %>% mutate(F1 = 2 * precision * recall /(precision + recall)) result_summary <- bind_rows(result_summary,result_temp) print(result_summary)
[참고]
https://gomguard.tistory.com/69
반응형'머신러닝 with R' 카테고리의 다른 글
[R 데이터 분석/ 기초 통계] 확률변수, 확률질량함수, 누적분포함수, 이항분포, 포아송분포 (random variable, probability mass function, cumulative distribution function) (0) 2020.04.25 머신러닝(machine learning)의 기본 개념과 원리 (인공지능 vs. 머신러닝 vs. 딥러닝) (0) 2020.02.22 [R 데이터 분석] 분류모형, 서포트 벡터 머신 (SVM) 분석 (1) 2019.09.18 [R 데이터 분석] 최근접 이웃 (K-Nearest Neighbor, KNN) 분석 (0) 2019.09.15 [R 데이터 분석] 연관성 분석 (Association Rules), 장바구니 분석 (0) 2019.09.08