簡體   English   中英

bnlearn中的多項式朴素貝葉斯,預測澄清

[英]Multinomial Naive Bayes in bnlearn , Prediction clarification

對於大型數據集文本分類問題,我使用了各種分類器,包括LDA,RandomForest,kNN等,其准確率達78-85%。 但是,使用bnlearn的多項式朴素貝葉斯算法的准確性為97%。 研究了為什么精度如此之高並且問題似乎出在bnlearn中的預測上-也許我使用了錯誤的參數。

說明使用樣本數據集。

Long    Sweet   Yellow  Fruit

Yes Yes Yes Banana

Yes Yes Yes Banana

Yes Yes Yes Banana

Yes Yes Yes Banana

No  Yes Yes Banana

No  Yes Yes Orange

No  Yes Yes Orange

No  Yes Yes Orange

Yes Yes Yes Other

No  Yes No  Other

Yes Yes Yes Banana

Yes Yes Yes Banana

Yes No  Yes Banana

Yes No  No  Banana

No  No  Yes Banana

No  No  Yes Orange

No  No  Yes Orange

No  No  Yes Orange

Yes Yes No  Other

No  No  No  Other

Yes Yes Yes Banana

No  Yes Yes Banana

No  Yes Yes Orange

No  Yes Yes Orange

No  Yes No  Other

上面是25行的數據集,作為數據幀bn.X加載
可以將其分為20行訓練數據集和5行測試數據集。

步驟1:載入資料

Y=bn.X[,4] # Outcome column
train=1:20
cols=1:4
bn.X[,cols] <- data.frame(apply(bn.X[cols], 2, as.factor))
trainbn.X=bn.X[train,]
testbn.X=bn.X[-train,]
trainbn.Y=Y[train]
testbn.Y=Y[-train]

步驟2:使用bnlearn進行分類

library(bnlearn)

NB.fit = naive.bayes(trainbn.X, "Fruit")   

# Prediction    
NB.pred=predict(NB.fit,testbn.X,prob=TRUE)
writeLines("\n Multinomial Naive Bayes\n")
table(NB.pred, testbn.Y)
cat("Accuracy %:", mean(NB.pred == testbn.Y )*100)  

步驟3:使用LDA進行分類

library(MASS)

lda.fit=lda(Fruit~.,data=trainbn.X)

# Prediction
lda.pred=predict(lda.fit,testbn.X)
lda.class=lda.pred$class
writeLines("\n LDA \n")
table(lda.class,testbn.Y)
cat("Accuracy %:", mean(lda.class == testbn.Y )*100)  

bnlearn朴素貝葉斯和LDA都對5行給出了80%的准確度相同的預測。

但是,bnlearn似乎也將測試行的結果值用於預測。 這似乎是為什么我正在研究的文本分類方案具有較高的准確性值的原因。

如果我在進行預測之前做了以下任何一項操作,

testbn.X$Fruit=NA
testbn.X$Fruit="Orange"
testbn.X[1:3,]$Fruit="Orange"

對LDA的結果沒有影響-LDA完全忽略了測試數據的結果值(如果提供)。 這是理想的行為。

但是,對於bnlearn,情況並非如此。 在預測期間,將收到NA和所有value =“ Orange”的錯誤。 對於第三次數據操作,bnlearn預測返回的結果完全不同

問題:我使用bnlearn的預測函數的方式正確嗎? 我應該使用其他參數嗎?

看來naive.bayes函數naive.bayes並不適合網絡,它僅根據提供的數據定義了朴素貝葉斯網絡的結構 如果您希望執行樣本外預測,則需要首先使用訓練集上的bn.fit來估計網絡參數。

之所以引起混淆,是因為predict方法接受網絡結構 擬合網絡作為其object參數。 如果object僅僅是網絡結構(例如naive.bayes返回的對象),則根據提供給predict方法的data來估計網絡參數。 結果,在您的示例中獲得的預測實際上是來自測試數據的樣本內預測。 ?naive.bayes ”的“注意”部分下:

predict接受bnbn.fit對象作為其第一個參數。 對於前者,將網絡的參數擬合到data ,即,其類標記了該函數試圖預測的觀測值。

但是,如果將擬合的網絡作為object ,則將擬合的網絡參數用於預測,並且提供給predict方法的data中的training變量的值不會影響預測。 (出於某種原因, NA值似乎仍然沒有被允許用於training即使有裝網絡變量)。你可以通過調用獲得擬合網絡bn.fit用在你的網絡結構bn對象和你training_databn.fit(bn, training_data)

我以前沒有使用過bnlearn包,但是這些是我通過測試和閱讀文檔得出的結論。 根據您的工作,以下是一些我用來測試行為的代碼:

# training and testing data
set.seed(1)  # bnlearn uses stochastic tie-breaking
train_idx <- 1:20

train_fruit <- fruit[train_idx, ]
test_fruit <- fruit[-train_idx, ]

library(bnlearn)

nb.net <- naive.bayes(train_fruit, "Fruit")  # network structure
nb.fit <- bn.fit(nb.net, train_fruit)  # fit the network
nb.pred <- predict(nb.fit, test_fruit)  # oos prediction

mean(nb.pred == test_fruit$Fruit)
#    [1] 0.8

# manipulated test data
test_fruit2 <- test_fruit
test_fruit2[1:3, "Fruit"] <- "Orange"

# fitted network as predict object
nb.pred2_fit <- predict(nb.fit, test_fruit2)
identical(nb.pred2_fit, nb.pred)
#    [1] TRUE

# network structure as predict object
nb.pred2_net <- predict(nb.net, test_fruit2)
#     Warning messages:
#     1: In check.data(data, allowed.types = discrete.data.types) :
#       variable Sweet has levels that are not observed in the data.
#     2: In check.data(data, allowed.types = discrete.data.types) :
#       variable Fruit has levels that are not observed in the data.
identical(nb.pred2_net, nb.pred)
#    [1] FALSE

這是我在示例代碼中使用的fruit數據集,請閱讀您的文章:

fruit <- read.table(header = TRUE, text = "
Long    Sweet   Yellow  Fruit
Yes Yes Yes Banana
Yes Yes Yes Banana
Yes Yes Yes Banana
Yes Yes Yes Banana
No  Yes Yes Banana
No  Yes Yes Orange
No  Yes Yes Orange
No  Yes Yes Orange
Yes Yes Yes Other
No  Yes No  Other
Yes Yes Yes Banana
Yes Yes Yes Banana
Yes No  Yes Banana
Yes No  No  Banana
No  No  Yes Banana
No  No  Yes Orange
No  No  Yes Orange
No  No  Yes Orange
Yes Yes No  Other
No  No  No  Other
Yes Yes Yes Banana
No  Yes Yes Banana
No  Yes Yes Orange
No  Yes Yes Orange
No  Yes No  Other
")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM