《机器学习实战》学习笔记———基于概率论的分类方法:朴素贝叶斯


拟解决基本问题描述

本文拟解决iris鸢尾花所属类型的问题,其中这种花的特征有sepal length(萼片长度)、sepal width(萼片宽度)、petal length(花瓣长度)、petal width(花瓣宽度)。试使用kNN算法、决策树、朴素贝叶斯进行分类。

数据准备与数据预处理

数据准备
数据来源于iris数据集,它包含150朵花的特征sepal length(萼片长度)、sepal width(萼片宽度)、petal length(花瓣长度)、petal width(花瓣宽度)。
数据预处理
解析‘,’分割的数据行。对数据进行预处理,将文本文件中数据中的用来隔开数据的空格删除,替换为换行符。

模型基本原理与算法实现

kNN近邻算法
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序
(3)按照与当前点距离最小的k个点
(4)确定前k个点所在类别的出现频率
(5)返回前k个点出现频率最高的类别作为当前点的预测分类

决策树
划分数据集的大原则是:将无序的数据变得更加有序,可以使用信息论度量信息。在划分数据集前后信息发生的变化称为信息增益,知道如何计算信息增益,就可以计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择。
熵定义为信息的期望值,符号 的信息定义为

l(xi)=log2p(xi) l ( x i ) = − l o g 2 p ( x i )

其中

p(xi) p ( x i )
是选择该分类的概率。

为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值,通过下面的公式得到

H=i=1np(xi)log2p(xi) H = − ∑ i = 1 n p ( x i ) l o g 2 p ( x i )

其中n是分类的数目。

朴素贝叶斯算法
概率论中的经典条件概率公式:

这里写图片描述

朴素贝叶斯的经典应用是对垃圾邮件的过滤,是对文本格式的数据进行处理,因此这里以此为背景讲解朴素贝叶斯定理。设D是训练样本和相关联的类标号的集合,其中训练样本的属性集为X { X1,X2, … , Xn }, 共有n 个属性;类标号为 C{ C1,C2, … ,Cm }, 有m 中类别。朴素贝叶斯定理

这里写图片描述

其中,这里写图片描述为后验概率,这里写图片描述为先验概率,这里写图片描述为条件概率。朴素贝叶斯的两个假设:1、属性之间相互独立。2、每个属性同等重要。条件概率这里写图片描述可以简化为:

这里写图片描述

测试方法与结果

在使用朴素贝叶斯时,将数据集分成测试集和训练集,经过测试得到

这里写图片描述

总结

用朴素贝叶斯计算时,得到正确率较高。

代码

import pandas as pd
import numpy as np  
data='''5.1,3.5,1.4,0.2,Iris-setosa  
        4.9,3.0,1.4,0.2,Iris-setosa  
        4.7,3.2,1.3,0.2,Iris-setosa  
        4.6,3.1,1.5,0.2,Iris-setosa  
        5.0,3.6,1.4,0.2,Iris-setosa  
        5.4,3.9,1.7,0.4,Iris-setosa  
        4.6,3.4,1.4,0.3,Iris-setosa  
        5.0,3.4,1.5,0.2,Iris-setosa  
        4.4,2.9,1.4,0.2,Iris-setosa  
        4.9,3.1,1.5,0.1,Iris-setosa  
        5.4,3.7,1.5,0.2,Iris-setosa  
        4.8,3.4,1.6,0.2,Iris-setosa  
        4.8,3.0,1.4,0.1,Iris-setosa  
        4.3,3.0,1.1,0.1,Iris-setosa  
        5.8,4.0,1.2,0.2,Iris-setosa  
        5.7,4.4,1.5,0.4,Iris-setosa  
        5.4,3.9,1.3,0.4,Iris-setosa  
        5.1,3.5,1.4,0.3,Iris-setosa  
        5.7,3.8,1.7,0.3,Iris-setosa  
        5.1,3.8,1.5,0.3,Iris-setosa  
        5.4,3.4,1.7,0.2,Iris-setosa  
        5.1,3.7,1.5,0.4,Iris-setosa  
        4.6,3.6,1.0,0.2,Iris-setosa  
        5.1,3.3,1.7,0.5,Iris-setosa  
        4.8,3.4,1.9,0.2,Iris-setosa  
        5.0,3.0,1.6,0.2,Iris-setosa  
        5.0,3.4,1.6,0.4,Iris-setosa  
        5.2,3.5,1.5,0.2,Iris-setosa  
        5.2,3.4,1.4,0.2,Iris-setosa  
        4.7,3.2,1.6,0.2,Iris-setosa  
        4.8,3.1,1.6,0.2,Iris-setosa  
        5.4,3.4,1.5,0.4,Iris-setosa  
        5.2,4.1,1.5,0.1,Iris-setosa  
        5.5,4.2,1.4,0.2,Iris-setosa  
        4.9,3.1,1.5,0.1,Iris-setosa  
        5.0,3.2,1.2,0.2,Iris-setosa  
        5.5,3.5,1.3,0.2,Iris-setosa  
        4.9,3.1,1.5,0.1,Iris-setosa  
        4.4,3.0,1.3,0.2,Iris-setosa  
        5.1,3.4,1.5,0.2,Iris-setosa  
        5.0,3.5,1.3,0.3,Iris-setosa  
        4.5,2.3,1.3,0.3,Iris-setosa  
        4.4,3.2,1.3,0.2,Iris-setosa  
        5.0,3.5,1.6,0.6,Iris-setosa  
        5.1,3.8,1.9,0.4,Iris-setosa  
        4.8,3.0,1.4,0.3,Iris-setosa  
        5.1,3.8,1.6,0.2,Iris-setosa  
        4.6,3.2,1.4,0.2,Iris-setosa  
        5.3,3.7,1.5,0.2,Iris-setosa  
        5.0,3.3,1.4,0.2,Iris-setosa  
        7.0,3.2,4.7,1.4,Iris-versicolor  
        6.4,3.2,4.5,1.5,Iris-versicolor  
        6.9,3.1,4.9,1.5,Iris-versicolor  
        5.5,2.3,4.0,1.3,Iris-versicolor  
        6.5,2.8,4.6,1.5,Iris-versicolor  
        5.7,2.8,4.5,1.3,Iris-versicolor  
        6.3,3.3,4.7,1.6,Iris-versicolor  
        4.9,2.4,3.3,1.0,Iris-versicolor  
        6.6,2.9,4.6,1.3,Iris-versicolor  
        5.2,2.7,3.9,1.4,Iris-versicolor  
        5.0,2.0,3.5,1.0,Iris-versicolor  
        5.9,3.0,4.2,1.5,Iris-versicolor  
        6.0,2.2,4.0,1.0,Iris-versicolor  
        6.1,2.9,4.7,1.4,Iris-versicolor  
        5.6,2.9,3.6,1.3,Iris-versicolor  
        6.7,3.1,4.4,1.4,Iris-versicolor  
        5.6,3.0,4.5,1.5,Iris-versicolor  
        5.8,2.7,4.1,1.0,Iris-versicolor  
        6.2,2.2,4.5,1.5,Iris-versicolor  
        5.6,2.5,3.9,1.1,Iris-versicolor  
        5.9,3.2,4.8,1.8,Iris-versicolor  
        6.1,2.8,4.0,1.3,Iris-versicolor  
        6.3,2.5,4.9,1.5,Iris-versicolor  
        6.1,2.8,4.7,1.2,Iris-versicolor  
        6.4,2.9,4.3,1.3,Iris-versicolor  
        6.6,3.0,4.4,1.4,Iris-versicolor  
        6.8,2.8,4.8,1.4,Iris-versicolor  
        6.7,3.0,5.0,1.7,Iris-versicolor  
        6.0,2.9,4.5,1.5,Iris-versicolor  
        5.7,2.6,3.5,1.0,Iris-versicolor  
        5.5,2.4,3.8,1.1,Iris-versicolor  
        5.5,2.4,3.7,1.0,Iris-versicolor  
        5.8,2.7,3.9,1.2,Iris-versicolor  
        6.0,2.7,5.1,1.6,Iris-versicolor  
        5.4,3.0,4.5,1.5,Iris-versicolor  
        6.0,3.4,4.5,1.6,Iris-versicolor  
        6.7,3.1,4.7,1.5,Iris-versicolor  
        6.3,2.3,4.4,1.3,Iris-versicolor  
        5.6,3.0,4.1,1.3,Iris-versicolor  
        5.5,2.5,4.0,1.3,Iris-versicolor  
        5.5,2.6,4.4,1.2,Iris-versicolor  
        6.1,3.0,4.6,1.4,Iris-versicolor  
        5.8,2.6,4.0,1.2,Iris-versicolor  
        5.0,2.3,3.3,1.0,Iris-versicolor  
        5.6,2.7,4.2,1.3,Iris-versicolor  
        5.7,3.0,4.2,1.2,Iris-versicolor  
        5.7,2.9,4.2,1.3,Iris-versicolor  
        6.2,2.9,4.3,1.3,Iris-versicolor  
        5.1,2.5,3.0,1.1,Iris-versicolor  
        5.7,2.8,4.1,1.3,Iris-versicolor  
        6.3,3.3,6.0,2.5,Iris-virginica  
        5.8,2.7,5.1,1.9,Iris-virginica  
        7.1,3.0,5.9,2.1,Iris-virginica  
        6.3,2.9,5.6,1.8,Iris-virginica  
        6.5,3.0,5.8,2.2,Iris-virginica  
        7.6,3.0,6.6,2.1,Iris-virginica  
        4.9,2.5,4.5,1.7,Iris-virginica  
        7.3,2.9,6.3,1.8,Iris-virginica  
        6.7,2.5,5.8,1.8,Iris-virginica  
        7.2,3.6,6.1,2.5,Iris-virginica  
        6.5,3.2,5.1,2.0,Iris-virginica  
        6.4,2.7,5.3,1.9,Iris-virginica  
        6.8,3.0,5.5,2.1,Iris-virginica  
        5.7,2.5,5.0,2.0,Iris-virginica  
        5.8,2.8,5.1,2.4,Iris-virginica  
        6.4,3.2,5.3,2.3,Iris-virginica  
        6.5,3.0,5.5,1.8,Iris-virginica  
        7.7,3.8,6.7,2.2,Iris-virginica  
        7.7,2.6,6.9,2.3,Iris-virginica  
        6.0,2.2,5.0,1.5,Iris-virginica  
        6.9,3.2,5.7,2.3,Iris-virginica  
        5.6,2.8,4.9,2.0,Iris-virginica  
        7.7,2.8,6.7,2.0,Iris-virginica  
        6.3,2.7,4.9,1.8,Iris-virginica  
        6.7,3.3,5.7,2.1,Iris-virginica  
        7.2,3.2,6.0,1.8,Iris-virginica  
        6.2,2.8,4.8,1.8,Iris-virginica  
        6.1,3.0,4.9,1.8,Iris-virginica  
        6.4,2.8,5.6,2.1,Iris-virginica  
        7.2,3.0,5.8,1.6,Iris-virginica  
        7.4,2.8,6.1,1.9,Iris-virginica  
        7.9,3.8,6.4,2.0,Iris-virginica  
        6.4,2.8,5.6,2.2,Iris-virginica  
        6.3,2.8,5.1,1.5,Iris-virginica  
        6.1,2.6,5.6,1.4,Iris-virginica  
        7.7,3.0,6.1,2.3,Iris-virginica  
        6.3,3.4,5.6,2.4,Iris-virginica  
        6.4,3.1,5.5,1.8,Iris-virginica  
        6.0,3.0,4.8,1.8,Iris-virginica  
        6.9,3.1,5.4,2.1,Iris-virginica  
        6.7,3.1,5.6,2.4,Iris-virginica  
        6.9,3.1,5.1,2.3,Iris-virginica  
        5.8,2.7,5.1,1.9,Iris-virginica  
        6.8,3.2,5.9,2.3,Iris-virginica  
        6.7,3.3,5.7,2.5,Iris-virginica  
        6.7,3.0,5.2,2.3,Iris-virginica  
        6.3,2.5,5.0,1.9,Iris-virginica  
        6.5,3.0,5.2,2.0,Iris-virginica  
        6.2,3.4,5.4,2.3,Iris-virginica  
        5.9,3.0,5.1,1.8,Iris-virginica''' 
data = data.replace(' ','').replace("Iris-setosa","1.0").replace("Iris-versicolor","2.0").replace("Iris-virginica","3.0").split('\n')  
data = list(filter(lambda x: len(x) > 0,data))  
data = [x.split(',') for x in data]  
data = np.array(data).astype(np.float16)  

def splitData(trainPrecent=0.7):  
    train = []  
    test = []  
    for i in data:  
        (train if np.random.random() < trainPrecent else test).append(i)  
    return np.array(train),np.array(test)  
trainData,testData = splitData()  
print("共有%d条数据,分解为%d条训练集与%d条测试集"%(len(data),len(trainData),len(testData)))  

clf=set(trainData[:,-1]) 
trainClfData={} 
for x in clf:  
    clfItems=np.array(list(filter(lambda i:i[-1]==x ,trainData)))[:,:-1]
    mean=clfItems.mean(axis=0)
    stdev= np.sqrt(np.sum((clfItems-mean)**2,axis=0)/float(len(clfItems)-1))
    trainClfData[x]=np.array([mean,stdev]).T 

result=[]  
for testItem in testData:  
    itemData=testItem[0:-1]
    itemClf=testItem[-1] 

    prediction={} 
    for clfItem in trainClfData:  

        probabilities= np.exp(-1*(testItem[0:-1]-trainClfData[clfItem][:,0])**2/(trainClfData[clfItem][:,1]**2*2)) / (np.sqrt(2*np.pi)*trainClfData[clfItem][:,1])  

        clfPrediction=1  
        for proItem in probabilities:  
            clfPrediction*=proItem  
        prediction[clfItem]=clfPrediction  


    maxProbablity=None  
    for x in prediction:  
        if maxProbablity==None or prediction[x]>prediction[maxProbablity]:  
            maxProbablity=x  


    result.append({'数据':itemData.tolist()  
                    ,'实际分类':itemClf  
                    ,'各类别概率':prediction  
                    ,'测试分类(最大概率类别)':maxProbablity  
                    ,'是否正确': 1 if itemClf==maxProbablity else 0})  
rightCount=0;  
for x  in result:  
    rightCount+=x['是否正确']  
print('共%d条测试数据,测试正确%d条,正确率%2f:'%(len(result),rightCount,rightCount/len(result)))

参考文献

【1】《机器学习实战》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值