Study/class note

머신러닝 / 나이브베이즈 예제 연습

chanzae 2022. 2. 4. 14:27

ㅁ e1071패키지는 오스트리아 빈 대학교에서 만든 패키지인데 이 패키지는 결과로 확률을 볼 수 없음. 확률을 봐야 정확하게 설명할 수 있음. 파이썬은 predict_proba라는 함수가 있어서 독감일 확률이 몇 퍼센트다라고 출력해줌. predict함수는 확률을 출력할 수 없음.

이 책에 나온 것 말고 확률을 출력해주는 패키지가 있음 = > naivebayes 패키지

 

문제243. naivebayes 패키지를 이용해서 아래의 환자가 독감일 확률이 어떻게 되는지 출력하시오.

오한(chills)이 있고 콧물(runny_nose)가 없으며 두통(headache)가 없으며 열(fever)이 있는 환자

test_data2 <- data.frame(chills = 'Y',runny_nose='N',headache='NO',fever='Y')
# 1. 데이터 로드
flu <- read.csv("c:\\data\\flu.csv", stringsAsFactors = TRUE)
flu

# 2. 결측치 확인
colSums(is.na(flu))

# 3. 데이터타입 확인
str(flu)

# 4. 훈련데이터와 테스트 데이터 분리
train_data <- flu[1:7,-1] # -1은 patient_id컬럼을 제외시키는 것, 환자 1~7번까지 가져옴
test_data <- flu[8,-1]

# 5. naivebayes패키지 설치
install.packages("naivebayes")
library(naivebayes)

# 훈련 데이터로 모델 생성
model_flu2 <- naive_bayes(flue ~ ., data = train_data)

model_flu2

# 6. 모델에 훈련 데이터를 넣고 예측 결과를 출력
p <- predict(model_flu2, train_data)
p == train_data$flue  # 정확도가 높아보이진 않음

# 7. 위의 만든 모델에 훈련 데이터를 넣고 예측 확률을 출력
p2 <- predict(model_flu2, train_data, type='prob')
p2

# 8. 아래의 환자가 독감일 확률이 어떻게 되는지 출력하시오
test_data2 <- data.frame(chills = 'Y',runny_nose='N',headache='NO',fever='Y')

p3 <- predict(model_flu2, test_data2, type='prob')
p3

             N         Y
[1,] 0.4413793 0.5586207   > 이런식으로 확률을 출력할 수 있음.

 

 

문제244. (점심시간 문제) 아래의 환자가 독감일 확률이 어떻게 되는지 출력하시오.

오한(chills)이 없고 콧물(runny_nose)가 있으며 두통(headache)이 없고 열(fever)이 있는 환자

test_lunchtime <- data.frame(chills = 'N',runny_nose='Y',headache='NO',fever='Y')

p4 <- predict(model_flu2, test_lunchtime, type='prob')
p4

             N         Y
[1,] 0.2084691 0.7915309

 

+) 라플라스 값을 준 독감 데이터 나이브베이즈 확률

# 1. 데이터를 로드합니다.

flu <- read.csv("d:\\data\\flu.csv",  stringsAsFactors=TRUE)
flu

# 2. 결측치가 있는지 확인합니다.
colSums(is.na(flu) )

# 3. 데이터의 구조를 확인합니다. 

str(flu)


# 4. 훈련 데이터와 테스트 데이터를 나눕니다.

train_data <- flu[ 1:7, -1 ]   # -1은 환자번호를 제외합니다. 1행~7행까지 가져옵니다.
test_data <- flu[ 8, -1 ]  # 8번째 행만 가져옵니다.


# 5. 확률이 나오는 나이브 베이즈 패키지를 설치하고 모델을 생성합니다.

library(naivebayes)


model_flu2 <- naive_bayes(flue ~ ., data = train_data, laplace=0.00001)
model_flu2

# 6. 생성한 모델로 훈련 데이터의 정답을 예측합니다.

p <- predict( model_flu2,  train_data[ , -5])
p


#7. 예측한 결과로 이원 교차표를 출력하여 훈련 데이터에 대한 성능을 확인합니다.

prob <- predict( model_flu2,  train_data[ , -5], type='prob')
prob
cbind(train_data,p,prob)

a <- CrossTable(train_data[ , 5], p)
a$t

#8. 8번째 테스트 데이터를 잘 예측하는지 확인합니다.

p2 <- predict( model_flu2,  test_data[ , -5], type='prob')
p2

#9. 새로운 환자에 대한 독감 여부 확률을 출력해봅니다.
#오한(chills) 이 없고 콧물(runny_nose) 이 있으며 두통(headache) 이 없고 열(fever) 이 있는 환자

test_data3 <- data.frame(chills='N', runny_nose='Y', headache='NO', fever='Y')
test_data3

p3 <- predict( model_flu2,  test_data3, type='prob')
p3

 

 

문제245. 영화 장르에 예측하는 나이브 베이즈 모델을 생성하시오

데이터 : movie2.csv

# 1. 데이터 로드

movie <- read.csv("c:\\data\\movie2.csv", stringsAsFactors = TRUE)
head(movie)
dim(movie)

# 2. 결측치 확인

colSums(is.na(movie))

> 결측치 없음 확인

 

# 3. 이상치 확인

> 문자형 데이터라 확인 불필요

 

# 4. 문자형 확인

str(movie)

 

# 5. 데이터 정규화

> 문자형 데이터라 정규화 불필요

 

# 6. 훈련데이터와 테스트 데이터 분리

library(caret)
set.seed(1)
k <- createDataPartition(movie$장르, p=0.8, list = F)
train_data <- movie[k,]
test_data <- movie[-k,]

# 데이터가 균등하게 잘 나누어졌는지 확인
dim(train_data)
dim(test_data)
prop.table(table(train_data$장르))
prop.table(table(test_data$장르))

 

# 7. 훈련데이터로 나이브베이즈 모델 생성

# e1071
library(e1071)
model_e <- naiveBayes(장르~ ., data=train_data)
model_e

# 8. 훈련된 모델로 테스트 데이터 예측

result <- predict(model, test_data[ ,-6])

# 9. 모델 성능 평가

result == test_data[,6]
sum(result == test_data[,6]) / length(test_data[,6])*100

이원교차표 확인

library(gmodels)
a <- CrossTable(test_data[,6],result)
a$t

 

 

문제246. 직업이 학생이고, 미혼, 이성친구가 없는 20대 남자가 선호하는 영화 장르가 무엇으로 예측되는지 방금 만든 정확도 100%의 나이브 베이즈 모델에 데이터를 입력해서 예측하시오.

movie_test <- data.frame(나이 = '20대',성별='남',직업='학생',결혼여부='NO',이성친구='NO')

result_test <- predict(model_e, movie_test)
print(paste('예측결과는',result_test,'입니다.'))

[1] "예측결과는 코미디 입니다."

> 위의 과정은 e1071패키지의 나이브베이즈 예측(predict)을 사용한 것

 

 

문제247. 확률도 출력이 되는 naive_bayes함수로 코미디를 좋아할 확률을 출력하시오.

(naivebayes 패키지의 predict함수를 사용)

# naive_bayes
library(naivebayes)
new_model <- naive_bayes(장르 ~ ., data=train_data, laplace = 0.00001 )
movie_test <- data.frame(나이 = '20대',성별='남',직업='학생',결혼여부='NO',이성친구='NO')
new_p <- predict(new_model, movie_test, type = 'prob')
new_p

문제248. 나이가 40대이고 성별이 남자, 직업이 있고 결혼을 했으며 이성친구가 없는 사람이 공포영화를 좋아할 확률을 출력하시오.

library(naivebayes)
new_model <- naive_bayes(장르 ~ ., data=train_data, laplace = 0.00001 )
movie_test2 <- data.frame(나이 = '40대',성별='남',직업='언론',결혼여부='YES',이성친구='NO')
new_p <- predict(new_model, movie_test, type = 'prob')
new_p

> 공포영화를 좋아할 확률 0.00000000002499943 

 

문제249. movie 데이터 프레임에 직업 유무에 대한 컬럼을 새로 추가하시오.

컬럼명 : 직업유무, 데이터 : 있다/없다

movie$직업유무 <- ifelse(movie$직업 == '무직','없다','있다')
movie

문제250. 직업유무가 포함된 movie 데이터 프레임으로 장르를 예측하는 나이브베이즈 모델을 생성하시오.

movie$직업유무 <- ifelse(movie$직업 == '무직','없다','있다')
movie

library(caret)
set.seed(1)
k <- createDataPartition(movie$장르, p=0.8, list = T)$Resample1
train_data <- movie[k,-3] # 기존 직업 컬럼 제외
test_data <- movie[-k,-3]

dim(train_data)
dim(test_data)
prop.table(table(train_data$장르))
prop.table(table(test_data$장르))

library(e1071)
model_movie <- naiveBayes(장르~ ., data=train_data)
model_movie

result <- predict(model_movie, test_data[ ,-5])

result == test_data[,5]
sum(result == test_data[,5]) / length(test_data[,5])*100

table(x=result, y = test_data[,5])  # 이원교차표의 역할

> 정확도가 낮음

 

문제251. 나이40대, 성별 남자, 직업이 있고, 미혼, 이성친구가 있는 남자가 좋아하는 영화장르를 예측하시오.

movie$직업유무 <- ifelse(movie$직업 == '무직','없다','있다')
movie

library(caret)
set.seed(1)
k <- createDataPartition(movie$장르, p=0.8, list = T)$Resample1
train_data <- movie[k,-3]
test_data <- movie[-k,-3]


library(e1071)
model_movie <- naiveBayes(장르~ ., data=train_data, laplace = 0.00001)
model_movie

result <- predict(model_movie, test_data[ ,-5])

result == test_data[,5]
sum(result == test_data[,5]) / length(test_data[,5])*100

table(x=test_data[,5], y = result)  # 이원교차표 $t와 같음

movie_test3 <- data.frame(나이 = '40대',성별='남',결혼여부='NO',이성친구='YES',직업유무='있다')
p_movie <- predict(model_movie, movie_test3)
p_movie

[1] 공포

 

반응형