Big Data Analytics - Naive Bayes Classifier

Naive Bayes เป็นเทคนิคที่น่าจะเป็นในการสร้างลักษณนาม สมมติฐานลักษณะเฉพาะของลักษณนามเบย์ไร้เดียงสาคือการพิจารณาว่าค่าของคุณลักษณะเฉพาะนั้นไม่ขึ้นอยู่กับค่าของคุณลักษณะอื่นใดโดยพิจารณาจากตัวแปรคลาส

แม้จะมีสมมติฐานที่เข้าใจง่ายมากเกินไปที่กล่าวไว้ก่อนหน้านี้ แต่ลักษณนาม Bayes ที่ไร้เดียงสาก็มีผลลัพธ์ที่ดีในสถานการณ์จริงที่ซับซ้อน ข้อได้เปรียบของ naive Bayes คือต้องการข้อมูลการฝึกอบรมเพียงเล็กน้อยในการประมาณค่าพารามิเตอร์ที่จำเป็นสำหรับการจำแนกประเภทและสามารถฝึกลักษณนามได้ทีละน้อย

Naive Bayes เป็นแบบจำลองความน่าจะเป็นแบบมีเงื่อนไข: กำหนดให้อินสแตนซ์ปัญหาถูกจัดประเภทโดยแสดงด้วยเวกเตอร์ x= (x 1 , …, x n ) แทนคุณสมบัติ n บางอย่าง (ตัวแปรอิสระ) ซึ่งกำหนดให้กับความน่าจะเป็นของอินสแตนซ์นี้สำหรับแต่ละผลลัพธ์หรือคลาสที่เป็นไปได้ของ K

$$ p (C_k | x_1, ..... , x_n) $$

ปัญหาเกี่ยวกับสูตรข้างต้นคือถ้าจำนวนของคุณสมบัติ n มีขนาดใหญ่หรือหากคุณสมบัติสามารถรับค่าได้เป็นจำนวนมากการใช้โมเดลดังกล่าวบนตารางความน่าจะเป็นนั้นเป็นไปไม่ได้ เราจึงปรับรูปแบบใหม่เพื่อให้ง่ายขึ้น การใช้ทฤษฎีบทของเบย์ความน่าจะเป็นแบบมีเงื่อนไขสามารถถูกย่อยสลายเป็น -

$$ p (C_k | x) = \ frac {p (C_k) p (x | C_k)} {p (x)} $$

ซึ่งหมายความว่าภายใต้สมมติฐานความเป็นอิสระข้างต้นการแจกแจงแบบมีเงื่อนไขเหนือตัวแปรคลาส C คือ -

$$ p (C_k | x_1, ..... , x_n) \: = \: \ frac {1} {Z} p (C_k) \ prod_ {i = 1} ^ {n} p (x_i | C_k) $$

โดยที่หลักฐาน Z = p (x) เป็นปัจจัยการปรับขนาดขึ้นอยู่กับ x 1 , …, x nเท่านั้นซึ่งเป็นค่าคงที่หากทราบค่าของตัวแปรคุณลักษณะ กฎทั่วไปข้อหนึ่งคือการเลือกสมมติฐานที่น่าจะเป็นไปได้มากที่สุด สิ่งนี้เรียกว่ากฎการตัดสินใจหลังหรือแผนที่สูงสุด ลักษณนามที่เกี่ยวข้องซึ่งเป็นลักษณนามแบบเบย์คือฟังก์ชันที่กำหนดป้ายกำกับคลาส $ \ hat {y} = C_k $ สำหรับ k บางตัวดังนี้ -

$$ \ hat {y} = argmax \: p (C_k) \ prod_ {i = 1} ^ {n} p (x_i | C_k) $$

การใช้อัลกอริทึมใน R เป็นกระบวนการที่ตรงไปตรงมา ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีฝึกตัวแยกประเภท Naive Bayes และใช้สำหรับการคาดคะเนในปัญหาการกรองสแปม

สคริปต์ต่อไปนี้มีอยู่ในไฟล์ bda/part3/naive_bayes/naive_bayes.R ไฟล์.

# Install these packages 
pkgs = c("klaR", "caret", "ElemStatLearn") 
install.packages(pkgs)  
library('ElemStatLearn') 
library("klaR") 
library("caret")  

# Split the data in training and testing 
inx = sample(nrow(spam), round(nrow(spam) * 0.9)) 
train = spam[inx,] 
test = spam[-inx,]  

# Define a matrix with features, X_train 
# And a vector with class labels, y_train 
X_train = train[,-58] 
y_train = train$spam  
X_test = test[,-58] 
y_test = test$spam  
# Train the model 
nb_model = train(X_train, y_train, method = 'nb',  
   trControl = trainControl(method = 'cv', number = 3)) 

# Compute  
preds = predict(nb_model$finalModel, X_test)$class 
tbl = table(y_test, yhat = preds) 
sum(diag(tbl)) / sum(tbl) 
# 0.7217391

ดังที่เราเห็นจากผลลัพธ์ความแม่นยำของแบบจำลอง Naive Bayes คือ 72% ซึ่งหมายความว่าโมเดลจำแนก 72% ของอินสแตนซ์ได้อย่างถูกต้อง