大数据分析 - Naive Bayes Classifier

朴素贝叶斯是一种构造分类器的概率技术.朴素贝叶斯分类器的特征假设是考虑到给定类变量,特定特征的值独立于任何其他特征的值.

尽管前面提到过于简单的假设,朴素的贝叶斯分类器在复杂的现实世界中具有良好的效果.朴素贝叶斯的一个优点是它只需要少量的训练数据来估计分类所需的参数,并且可以逐步训练分类器.

朴素贝叶斯是条件概率模型:给定要分类的问题实例,由向量 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 ,如果已知特征变量的值,则为常量.一个常见的规则是选择最有可能的假设;这被称为最大后验或MAP决策规则.相应的分类器,即贝叶斯分类器,是为某些k分配类别标签$ \hat {y} = C_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

从结果中可以看出,朴素贝叶斯模型的准确率为72%.这意味着模型正确地对72%的实例进行了分类.