大数据分析 - 朴素贝叶斯分类器

朴素贝叶斯是一种用于构建分类器的概率技术。 朴素贝叶斯分类器的特征假设是在给定类变量的情况下,考虑特定特征的值独立于任何其他特征的值。

尽管前面提到了过度简化的假设,朴素贝叶斯分类器在复杂的现实世界情况下有很好的结果。 朴素贝叶斯的一个优点是它只需要少量的训练数据来估计分类所需的参数,并且分类器可以增量训练。

朴素贝叶斯是一个条件概率模型:给定一个要分类的问题实例,由表示一些 n 个特征(自变量)的向量 x = (x1, …, xn) 表示,它为该实例分配 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) 是仅取决于 x1, …, xn 的比例因子,如果特征变量的值已知,则它是一个常数。 一个常见的规则是选择最可能的假设; 这被称为最大后验或 MAP 决策规则。 相应的分类器,贝叶斯分类器,是为一些 k 分配类标签 $\hat{y} = C_k$ 的函数,如下所示 −

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

在 R 中实现算法是一个简单的过程。 以下示例演示了如何训练朴素贝叶斯分类器并将其用于垃圾邮件过滤问题的预测。

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% 的实例。