반응형


안녕하세요~


오늘은 머신러닝 지도학습 알고리즘 중


나이브 베이즈 분류 알고리즘을 알아봅시다!!



나이브 베이지 분류란?

베이지안 기법 기반의 분류기는 훈련 데이터를 활용해 특정 값이 제공하는 증거기반으로 결과가 관측될 확률을 계산하는 방법


(사전확률을 이용해 사후확률을 알 수 있습니다.)



그렇다면,


나이브 베이즈 알고리즘은

언제 사용할까?



결과에 대한 전체 확률을 추정하기 위해 동시에 여러 속성 정보를 고려해야만 하는 문제에 가장 적합합니다.


모든 사건이 독립이라면 다른 사건을 관측해 어떤 사건을 예측하는 것은 불가능합니다. 


다시말해, 종속사건이 예측모델링에 기반이 됩니다.



<배경 지식>


조건부 확률





R 을 통해 본 나이브베이즈 분류 알고리즘


data : 영화 관람객

data설명: data frame형태의 데이터

column: 나이, 성별, 직업, 결혼여부, 이성친구, 장르(label)



[실습 순서]



1. 데이터 로드


2. 필요없는 데이터를 정제한다.


3. label(정답)이 될 컬럼을 factor로 변환한다.


4. train 데이터와 test 데이터로 나눈다.


5. library(e1071)을 이용하여

train 데이터로 naivebayes모델을 훈련시킨다.


6. 모델의 정확도를 확인한다.


7. 이원 교차표를 그려서 결과를 확인한다.


8. 튜닝한다.





직접 사용자 정의 function()으로 만들어 코드를 재사용 하고자 하였습니다.


naive_bayes_fun <- function() {

# 1. 데이터를 로드한다. # 내 컴퓨터에서 파일을 선택할 수 있는 창이 켜진다. data <- file.choose() na.string <- NA table1 <- read.csv(data, stringsAsFactors = F, na.string = na.string) # menu()를 사용하면 관련된 것의 숫자(순서)를 return한다. col <- menu(colnames(table1), title = "라벨이 될 컬럼 이름을 입력하세요 ") # readline()함수를 이용하면 사용자가 입력한 값을 읽어들일 수 있다. lap <- readline(prompt = "laplace값을 입력하세요 ")

# 2. data 정제: 매번 다르기때문에 여기서는 생략함 # 3. label을 factor로 변환한다.

# CrossTable Error 때문에 여기서는 전부 factor로 변환하였습니다.

for(i in 1:dim(table1)[2]){ table1[,i] <- factor(table1[,i]) } # 4. 훈련데이터와 테스트 데이터로 나눈다. set.seed(12) # 행의 건수 확인 train_cnt <- round(0.7 * dim(table1)[1]) # shuffle 하는 방법 중 하나 train_indx <- sample(1:dim(table1)[1], train_cnt, replace = F) table_train <- table1[train_indx,] table_test <- table1[-train_indx,]

# 5. 나이브 베이즈 함수를 이용해서 장르(label)를 분류하는 모델을 생성한다. library(e1071) # V1~: label(기준으로 사용), laplace: positive double controlling Laplace smoothing. # laplace로 공격적으로 필터링하는 정도를 조절할 수 있음 model1 <- naiveBayes(table_train[,col]~. , data = table_train, laplace = as.numeric(lap))

# 6. 모델로 테스트 데이터로 정확도 측성한다. # 예측하기 result1 <- predict(model1, table_test[, -col]) # 7. 이원 교차표로 분류의 최종 결과를 확인한다. library(gmodels) # 실제 예측 CrossTable(x = table_test[,col], y = result1)


# 정확도 확인하기

prop.table(table(ifelse(table_test[,col]==result1,"o","x" )))

}


# 8. 튜닝한다.


더 알맞은 shuffled data을 위해 set.seed()값으로 변경하고

laplace 값을 조절하여

필터링하는 정도를 조절하여 더 나은 값을 얻을 수 있습니다. (여기서는 0.1로 주어 결과를 내보았음)




[결과]




# 참고: 보시면 알 수 있듯이 여기 movie data는 굉장이 적은 데이터이기 때문에

training data 와 test data로 나눌 때 굉장히 불편했습니다.

큰데이터로 각각의 data의 비율을 변경해보세요~



[정확도]


prop.table(table(ifelse(table_test[,col]==result,"o","x" )))


 o            x 


0.75            0.25 





나이브 베이즈 알고리즘의

한계점


나이브 베이즈 알고리즘은 데이터에 대한 약간 naive(순진한)을 가정하고 있습니다.

특히 데이터 셋의 모든 특징을 동등하게 중요하고 독립적이라고 가정합니다.



이 한계점을 극복하기위한 다양한 분류 알고리즘에 대해 앞으로 알아보도록 하겠습니다!


우선 의사결정 트리부터~

반응형

+ Recent posts