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% ของอินสแตนซ์ได้อย่างถูกต้อง