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



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

尽管前面提到了过于简化的假设,但朴素贝叶斯分类器在复杂的现实世界情况下仍然取得了良好的结果。朴素贝叶斯的优势在于,它只需要少量训练数据来估计分类所需的参数,并且可以增量式地训练分类器。

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

广告
© . All rights reserved.