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

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


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

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

朴素贝叶斯是一个条件概率模型:给定一个要分类的问题实例,用向量x = (x1, …, Xn) 代表一些 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, …, 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% 的实例。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁