再來一個應用情境: 我們要準備各個分類(汽車、運動、科技)的數篇新聞集合,然後比對計算特徵關鍵字字詞頻率向量。
資料來源: http://enginebai.logdown.com/posts/241677/bayes-classification
(P:汽車 S:運動 T:科技)
> #載入套件 貝式分類
> library(e1071)
#去除 變數:新聞
> bayes <- bayes[,-c(1)]
> colnames(bayes) <- c("class","benz","horse","baseketball","run","phone","app") --欄位名稱轉成英文
>
> bayes$class <- as.factor(bayes$class) --分類class轉成因子
> str(bayes)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 7 obs. of 7 variables:
$ class : Factor w/ 3 levels "P","S","T": 1 1 2 2 3 2 3 <<-因子
$ benz : num 15 35 5 1 10 2 1
$ horse : num 25 40 1 5 5 1 1
$ baseketball: num 1 1 35 32 7 20 1
$ run : num 5 3 50 15 1 22 1
$ phone : num 8 3 1 1 2 1 10
$ app : num 3 2 1 1 30 1 8
> n <- nrow(bayes)
> n
[1] 7
> set.seed(20170703)
> x_idx <- sample(seq_len(n),size=round(0.7*n))
> bayestraindata <- bayes[x_idx,] --訓練資料
> bayestestdata <-bayes[-x_idx,] --測試資料
# 建立模型
> bayesM <- naiveBayes(class ~ ., data = bayestraindata)
> results <- predict(bayesM, bayestestdata)
#評估
> cm <- table(x = bayestestdata$class, y = results ,dnn = c("實際","預測"))
> cm
預測
實際 P S T
P 0 0 1
S 0 1 0
T 0 0 0
有一個實際是P但被預測成T
#準確率 =0.5
> accuracy <- sum(diag(cm)) / sum(cm)
> accuracy
[1] 0.5
來一筆測試資料:
> newdata <- data.frame(benz=0,horse=20,baseketball=50,run=5,phone=5,app=1)
> newdata
benz horse baseketball run phone app <<--提高運動類的字詞頻率
1 0 20 50 5 5 1
>
> predict(bayesM,newdata = newdata)
[1] S
Levels: P S T
分類結果是:S (運動)
好像滿準的 哈哈
這只是嘗試其他應用情境,資料量有點少 就看看囉~~