📅  最后修改于: 2020-12-02 06:44:21             🧑  作者: Mango
朴素贝叶斯是一种构造分类器的概率技术。朴素贝叶斯分类器的特征假设是考虑给定类变量,特定特征的值独立于任何其他特征的值。
尽管前面提到的假设过于简单,但朴素的贝叶斯分类器在复杂的现实情况下仍具有良好的结果。朴素贝叶斯的一个优点是它只需要少量训练数据即可估计分类所需的参数,并且可以逐步训练分类器。
朴素贝叶斯是一个条件概率模型:给定要分类的问题实例,用代表某些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中实现算法是一个简单的过程。以下示例演示了如何训练Naive Bayes分类器并将其用于垃圾邮件过滤问题中的预测。
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%的实例。