【R的机器学习】模型性能提升探索:朴素贝叶斯
来源:互联网 发布:协同过滤 稀疏矩阵 编辑:程序博客网 时间:2023/12/03 08:15
本章强行带入朴素贝叶斯的算法进行分类。
为什么说是强行,因为NB(朴素贝叶斯)算法其实不算是一个好的对于数值型分类的方法,一般应用的部分的特征值通常是因子型;举个例子,对于我们的iris数据集:
head(iris_train) Sepal.Length Sepal.Width Petal.Length Petal.Width75 6.4 2.9 4.3 1.316 5.7 4.4 1.5 0.4120 6.0 2.2 5.0 1.591 5.5 2.6 4.4 1.293 5.8 2.6 4.0 1.2127 6.2 2.8 4.8 1.8 Species75 versicolor16 setosa120 virginica91 versicolor93 versicolor127 virginica
我们看到,除了结果分类的Species以外,其他的四个分类都是连续的数值型,因为朴素贝叶斯的主要思想是求一件事情发生的条件概率,而没有分类的连续数值型是无法求出条件概率的。举个例子,下雨天路上车少的概率是80%,这个很容易表达成条件概率:
P(车少|下雨天)=0.8
扩展下,某一个区域下雨的概率是50%,车少的概率是10%:
P(下雨天)=0.5P(车少)=0.1
如果有一天我们大侦探福尔摩斯听到这一天车很少,脑海中迅速会回想起这一天的天气以及作案手段,他的计算方式是这样的:
P(车少|下雨天)*P(下雨天)=P(车少)*P(下雨天|车少)
左右两边相等,是因为求得结果都是下雨天且车少的概率,说到这了,求出:
P(下雨天|车少)=40%
但是,如果我们这里不是车少,比如我们看到下雨天车辆<100辆,然后我们看到120辆车,问这个概率的话,我们是没有先验条件的,也就是我们不知道120辆车的时候,下不下雨,所以从这个意义上说,NB算法针对于那些给定发生的、因子型的特征值处理的要更好,否则如果我们在做处理的时候(后面会具体模拟下),会损失掉一些数据,比如我们把数据分段,100辆以下的是少,120辆以上的是多,100-120是中,等等。所以NB也很适合文本分类,因为文本是一类典型的已知的因子。
再回到我们的iris数据集,看看每个参数的分布情况:
summary(iris)
Sepal.Length Sepal.Width Petal.Length Min. :4.300 Min. :2.000 Min. :1.000 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 Median :5.800 Median :3.000 Median :4.350 Mean :5.843 Mean :3.057 Mean :3.758 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 Max. :7.900 Max. :4.400 Max. :6.900 Petal.Width Species Min. :0.100 setosa :50 1st Qu.:0.300 versicolor:50 Median :1.300 virginica :50 Mean :1.199 3rd Qu.:1.800 Max. :2.500
我们按照最简单的方式,按照三个分位数(25,50,75)把每列数据分成四类,在这里需要新建个数据集,并且用循环的方式,具体的代码如下:
iris1<-irisfor (j in 1:4){ for (i in 1:nrow(iris1)){ if (iris1[i,j]<=quantile(iris[,j])[2]){ iris1[i,j]<-'L' }else if(iris1[i,j]<=quantile(iris[,j])[3]){ iris1[i,j]<-'M' }else if(iris1[i,j]<=quantile(iris[,j])[4]){ iris1[i,j]<-'H' }else { iris1[i,j]<-'G' } }}
我们把数据最小的设定为Low,然后是Medium,High,Great四个分类;
看下数据集:
str(iris1)'data.frame': 150 obs. of 5 variables: $ Sepal.Length: chr "L" "L" "L" "L" ... $ Sepal.Width : chr "G" "M" "H" "H" ... $ Petal.Length: chr "L" "L" "L" "L" ... $ Petal.Width : chr "L" "L" "L" "L" ... $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
好,貌似我们的数据准备已经完成,那么我们开始进行模型拟合:
library(e1071)m_nb<-naiveBayes(iris1_train,iris1_train$Species,laplace=0.01)
这里的贝叶斯模型采用e1071的包,顺便说一下其中的laplace,也就是拉普拉斯估计;考虑之前下雨天的概率,这个概率是计算出来的,我们说
P(车少)=0.1
其实是我们在训练集中看了10次,只有一辆车通过,那么在极端点,可能会没有车,但是没有车(是我们的估计概率)不一定是真实的;
再举个例子,比如计算抛硬币是正面且有声音,我们只抛了10次,一次都没有正面,但是如果我们说这个概率为0,那么有声音概率再大,这个概率也是0;拉普拉斯估计就是避免这种情况,在每一个为0的概率上加上一点点数据,让这个数不为0。这里加上0.01。
然后看下我们的模型:
m_nbNaive Bayes Classifier for Discrete PredictorsCall:naiveBayes.default(x = iris1_train, y = iris1_train$Species, laplace = 0.01)A-priori probabilities:iris1_train$Species setosa versicolor virginica 0.3523810 0.3238095 0.3238095 Conditional probabilities: Sepal.Lengthiris1_train$Species G H L setosa 0.0002702703 0.0002702703 0.7029729730 versicolor 0.2061764706 0.3532352941 0.0885294118 virginica 0.5002941176 0.3238235294 0.0297058824 Sepal.Lengthiris1_train$Species M setosa 0.2975675676 versicolor 0.3532352941 virginica 0.1473529412 Sepal.Widthiris1_train$Species G H L setosa 0.62189189 0.21648649 0.02729730 versicolor 0.02970588 0.14735294 0.50029412 virginica 0.08852941 0.26500000 0.41205882 Sepal.Widthiris1_train$Species M setosa 0.13540541 versicolor 0.32382353 virginica 0.23558824 Petal.Lengthiris1_train$Species G H L setosa 0.0002702703 0.0002702703 0.8921621622 versicolor 0.0002941176 0.5297058824 0.0002941176 virginica 0.6179411765 0.3826470588 0.0002941176 Petal.Lengthiris1_train$Species M setosa 0.1083783784 versicolor 0.4708823529 virginica 0.0002941176 Petal.Widthiris1_train$Species G H L setosa 0.0002702703 0.0002702703 0.7570270270 versicolor 0.0002941176 0.4414705882 0.0002941176 virginica 0.7355882353 0.2650000000 0.0002941176 Petal.Widthiris1_train$Species M setosa 0.2435135135 versicolor 0.5591176471 virginica 0.0002941176 Speciesiris1_train$Species setosa versicolor virginica setosa 0.9994598974 0.0002700513 0.0002700513 versicolor 0.0002938584 0.9994122833 0.0002938584 virginica 0.0002938584 0.0002938584 0.9994122833
先看开始的:
iris1_train$Species setosa versicolor virginica 0.3523810 0.3238095 0.3238095
说明三个类别整体概率还是挺均匀的,基本都是1/3;下面的每个参数变量结果都是差不多的,取第一个解释下
Conditional probabilities:Sepal.Lengthiris1_train$Species G H L setosa 0.0002702703 0.0002702703 0.7029729730 versicolor 0.2061764706 0.3532352941 0.0885294118 virginica 0.5002941176 0.3238235294 0.0297058824 Sepal.Lengthiris1_train$Species M setosa 0.2975675676 versicolor 0.3532352941 virginica 0.1473529412
条件概率(Conditional probabilities)的含义是出现结果(列)中行的概率,比如出现setosa的时候,Sepal.Length=G的概率是0.0002702703,也就是
P(G|setosa)=0.0002702703P(G|versicolor)=0.2061764706P(G|virginica)=0.5002941176
单纯看这个,也就是当virginica条件下,G的概率将近50%,那么按照贝叶斯定理:
P(virginica)*P(G|virginica)=P(G)*P(virginica|G)
最后求解test中的virginica概率需要知道:
P(virginica|G)P(G)P(G|virginica)
而这三个在训练集中都是已知的;
最后预测下结果:
m_nbp<-predict(m_nb,iris1_test)[1] versicolor versicolor virginica virginica versicolor [6] versicolor setosa setosa virginica versicolor[11] versicolor versicolor versicolor setosa setosa [16] versicolor virginica virginica virginica versicolor[21] virginica setosa setosa virginica versicolor[26] setosa versicolor versicolor virginica setosa [31] virginica versicolor setosa virginica setosa [36] setosa setosa versicolor versicolor virginica [41] virginica virginica setosa virginica virginica Levels: setosa versicolor virginica
让我们吃惊的是,这个模型拟合的非常好,几乎是100%准确
table(iris1_test$Species,m_nbp)m_nbp setosa versicolor virginica setosa 13 0 0 versicolor 0 16 0 virginica 0 0 16
看下概率
m_nbp_p<-predict(m_nb,iris1_test,type='raw')m_nbp_p setosa versicolor virginica [1,] 0.002917515 0.994167039 0.002915446 [2,] 0.002917515 0.994167039 0.002915446 [3,] 0.002917515 0.002915446 0.994167039 [4,] 0.002917515 0.002915446 0.994167039 [5,] 0.002917515 0.994167039 0.002915446 [6,] 0.002917515 0.994167039 0.002915446 [7,] 0.994641852 0.002679074 0.002679074 [8,] 0.994641852 0.002679074 0.002679074 [9,] 0.002917515 0.002915446 0.994167039[10,] 0.002917515 0.994167039 0.002915446[11,] 0.002917515 0.994167039 0.002915446[12,] 0.002917515 0.994167039 0.002915446[13,] 0.002917515 0.994167039 0.002915446[14,] 0.994641852 0.002679074 0.002679074[15,] 0.994641852 0.002679074 0.002679074[16,] 0.002917515 0.994167039 0.002915446[17,] 0.002917515 0.002915446 0.994167039[18,] 0.002917515 0.002915446 0.994167039[19,] 0.002917515 0.002915446 0.994167039[20,] 0.002917515 0.994167039 0.002915446[21,] 0.002917515 0.002915446 0.994167039[22,] 0.994641852 0.002679074 0.002679074[23,] 0.994641852 0.002679074 0.002679074[24,] 0.002917515 0.002915446 0.994167039[25,] 0.002917515 0.994167039 0.002915446[26,] 0.994641852 0.002679074 0.002679074[27,] 0.002917515 0.994167039 0.002915446[28,] 0.002917515 0.994167039 0.002915446[29,] 0.002917515 0.002915446 0.994167039[30,] 0.994641852 0.002679074 0.002679074[31,] 0.002917515 0.002915446 0.994167039[32,] 0.002917515 0.994167039 0.002915446[33,] 0.994641852 0.002679074 0.002679074[34,] 0.002917515 0.002915446 0.994167039[35,] 0.994641852 0.002679074 0.002679074[36,] 0.994641852 0.002679074 0.002679074[37,] 0.994641852 0.002679074 0.002679074[38,] 0.002917515 0.994167039 0.002915446[39,] 0.002917515 0.994167039 0.002915446[40,] 0.002917515 0.002915446 0.994167039[41,] 0.002917515 0.002915446 0.994167039[42,] 0.002917515 0.002915446 0.994167039[43,] 0.994641852 0.002679074 0.002679074[44,] 0.002917515 0.002915446 0.994167039[45,] 0.002917515 0.002915446 0.994167039
一般来说,NB丢失了数据的数值,会让准确度下降;同时NB的前提假设是特征值之间是相互独立的;这对于很多现实情况来说,是不成立的;比如偿还贷款的案例中,特征值是房、车、收入,但是这三者本身就是比较相关的,所以不太适用于贝叶斯,而本文的例子来看,iris中这几个变量应该是相互独立,而且变量数量比较少,所以NB有如此高的准确率。
- 【R的机器学习】模型性能提升探索:朴素贝叶斯
- 【R的机器学习】模型性能提升探索:随机森林
- 【R的机器学习】模型性能提升探索:神经网络
- 【R的机器学习】模型性能提升探索:R的其他神经网络包-neuralnet
- 【R的机器学习】模型性能提升探索:支持向量机
- 【R的机器学习】决策树性能提升
- R中模型性能的提升
- 机器学习实战笔记(3.3)-朴素贝叶斯算法(多项式模型的朴素贝叶斯实现)
- 机器学习与R之朴素贝叶斯分类器
- 机器学习算法的R语言实现(三):朴素贝叶斯分类器
- (斯坦福机器学习课程笔记)混合高斯模型,朴素贝叶斯,混合朴素贝叶斯模型,因子分析
- 机器学习--朴素贝叶斯
- 机器学习-朴素贝叶斯
- 机器学习---朴素贝叶斯
- 【机器学习】朴素贝叶斯
- 机器学习 朴素贝叶斯
- 机器学习-朴素贝叶斯
- 【机器学习】朴素贝叶斯
- FFMPEG学习【libavutil】:Crypto and Hashing(一)
- Objective-C消息机制的原理
- iOS学习笔记——UIViewController学习
- CoreData的简单使用
- HTTP请求报文和HTTP响应报文
- 【R的机器学习】模型性能提升探索:朴素贝叶斯
- 谷歌浏览器访问网站提示“您要访问的网站包含恶意软件”
- 知识收集
- iOS开发调试概述
- 【转】NSCoding协议
- 【转】TableViewCell不重用
- Apache无法启动提示the requested operation has failed
- iOS开发的三种定时器
- nginx教程1:location 匹配规则