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


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

尽管前面提到的假设过于简单,但朴素贝叶斯分类器在复杂的现实情况中仍具有良好的结果。朴素贝叶斯的优点是它只需要少量的训练数据来估计分类所需的参数,并且可以增量地训练分类器。

朴素贝叶斯是一种条件概率模型:给定一个要分类的问题实例,由表示某些 n 个特征(自变量)的向量x = (x 1 , …, x 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 中实现该算法是一个简单的过程。以下示例演示了如何训练朴素贝叶斯分类器并将其用于垃圾邮件过滤问题中的预测。

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