-
[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
[머신러닝] 나이브 베이즈 (Naive Bayes)
지도학습 알고리즘 지도학습 관련 알고리즘들로는 최근접 이웃 (Nearest Neighbor) 나이브 베이즈 (Naive Bayes) 의사결정 트리 (Decision Trees) 분류 규칙 학습자 (Classification Rule Learners) 선형 회귀 (L..
gomguard.tistory.com
반응형'머신러닝 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