【机器学习算法】 朴素贝叶斯

来源:互联网 发布:php 数组转换字符串 编辑:程序博客网 时间:2024/06/05 23:44

【机器学习算法】 朴素贝叶斯

朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法

数学原理

这里写图片描述

其中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_nbplot(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%以上,这个模型就可以用,当然准确率越高越好。

谢谢阅读 ~

原创粉丝点击