【机器学习算法】 朴素贝叶斯
朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法
数学原理
其中C叫做类别集合,其中每一个元素是一个类别,而I叫做项集合(特征集合),其中每一个元素是一个待分类项,f叫做分类器。分类算法的任务就是构造分类器f。
分类算法的内容是要求给定特征,让我们得出类别,这也是所有分类问题的关键。
当我们用A替换类别,用B替换特征,整个公式就明朗了许多。
适用情况
算法前提:
(1)自变量是独立的。
(2)样本发生的概率是已知的,即知道先验概率。
核心:
通过事件发生的先验概率来预测新事件发生的后验概率,并进行相应的惩罚和优化,从而较高正确率地进行分类。朴素贝叶斯预测模型是一种概率分类器。
当有许多自变量,一个因变量,因变量的标签很多时,我们可以这样做 :
(1)用随机森林函数和10重交叉验证抽样方法进行变量的特征选择,进行变量筛选。
(2)分出训练集和预测集,用于模型的正确性的验证。
(3)用朴素贝叶斯算法,计算根据自变量的取值来预测因变量的标签取值。
(4)评价模型,计算模型的正确性,AUC值,ROC 值。
R软件安装包 https://mirror.lzu.edu.cn/CRAN/bin/windows/base/R-3.4.2-win.exe
## 大神写的代码:
## R 语言
# 准备工作
# 下载并加载所需的应用包
if(!suppressWarnings(require(‘caret’))){
install.packages(‘caret’)
require(‘caret’)
}
if(!suppressWarnings(require(‘klaR’))){
install.packages(‘klaR’)
require(‘klaR’)
}
if(!suppressWarnings(require(‘pROC’))){
install.packages(‘pROC’)
require(‘pROC’)
}
# 读取蘑菇数据集
mydata <- read.csv(file = file.choose())
# 简单的了解一下数据
str(mydata)
summary(mydata)
# step 1
# 抽样,并将总体分为训练集和测试集
set.seed(12)
index <- sample(1:nrow(mydata), size = 0.75*nrow(mydata))
train <- mydata[index,]
test <- mydata[-index,]
# 大致查看抽样与总体之间是否吻合
prop.table(table(mydata$type))
prop.table(table(train$type))
prop.table(table(test$type))
# 抽样,并将总体分为训练集和测试集
set.seed(12)
index <- sample(1:nrow(mydata), size = 0.75*nrow(mydata))
train <- mydata[index,]
test <- mydata[-index,]
# 大致查看抽样与总体之间是否吻合
prop.table(table(mydata$type))
prop.table(table(train$type))
prop.table(table(test$type))
#构建rfe函数的控制参数(使用随机森林函数和10重交叉验证抽样方法,并抽取5组样本)
rfeControls_rf <- rfeControl(
functions = rfFuncs,
method = ‘cv’,
repeats = 5)
#使用rfe函数进行特征选择
fs_nb <- rfe(x = train[,-1],
y = train[,1],
sizes = seq(4,21,2),
rfeControl = rfeControls_rf)
fs_nb
plot(fs_nb, type = c(‘g’,’o’))
fs_nb$optVariables
结果显示,21个变量中,只需要选择6个变量即可
# step 2
接下来,我们就针对这6个变量,使用朴素贝叶斯算法进行建模和预测:
# 使用klaR包中的NaiveBayes函数构建朴素贝叶斯算法
vars <- c(‘type’,fs_nb$optVariables)
fit <- NaiveBayes(type ~ ., data = train[,vars])
# 预测
pred <- predict(fit, newdata = test[,vars][,-1])
# 构建混淆矩阵
freq <- table(pred$class, test[,1])
freq
#step3
# 模型的准确率
accuracy <- sum(diag(freq))/sum(freq)
accuracy
# 模型的AUC值
modelroc <- roc(as.integer(test[,1]),
as.integer(factor(pred$class)))
# 绘制ROC曲线
plot(modelroc, print.auc = TRUE, auc.polygon = TRUE,
grid = c(0.1,0.2), grid.col = c(‘green’,’red’),
max.auc.polygon = TRUE, auc.polygon.col = ‘steelblue’)
通过朴素贝叶斯模型,在测试集中,模型的准确率约为97%,而且AUC的值也非常高,一般超过0.8就说明模型比较理想了。
一般模型的准确率在80%以上,这个模型就可以用,当然准确率越高越好。