Big Data Analytics 简明教程

Big Data Analytics - Naive Bayes Classifier

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

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

朴素贝叶斯是一个条件概率模型:给定一个待分类的问题实例,由代表一些 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 决策规则。对应的分类器(贝叶斯分类器)是将类标签 $\hat{y} = C_k$ 分配给某个 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% 的实例。