머신러닝 / 나이브베이즈 예제 연습
ㅁ 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] 공포