《机器学习实战》—navie bayes(Decision Tree and KNN)

机器学习实战—navie bayes (朴素贝叶斯)

(一)问题描述

朴素贝叶斯模型是一种基于贝叶斯定理与特征条件独立假设的分类方法,是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。朴素贝叶斯分类器不同于kNN和决策树这类分类需要做出艰难决策。贝叶斯决策理论的核心思想是选择高概率的对应类别。朴素贝叶斯算法也属于监督学习范畴。在这里我们分别使用kNN,决策树和朴素贝叶斯算法对鸢尾花数据集进行分类。

(二)数据准备与预处理

2.1数据来源

选择鸢尾花数据集(Irisdate set),这是被最广泛使用的四个数据集之一。可以从UCI中下载得到。数据集中含有150条数据,包括4项独立的数值型属性分别为花萼长度(Sepal length),花萼宽度(Sepalwidth),花瓣长度(Patel length),花瓣宽度(Patel width)以及三种分类(setosa, versicolor, virginica)。Sklearn包囊括很多机器学习的算法,也自带了鸢尾花数据集。

2.2数据预处理

为了便于计算,把类别属性的字符型数据转化成和特征属性一样的浮点型数据。将setosa,versicolor,virginica转化为1.0,2.0,3.0。而其他四项特性属性均是浮点型数据,不需要外加数据预处理。

(三)数据可视化

鸢尾花数据集有150个样本,每个样本有四个特征,可将其可视化。但是四个特征不能同时在一张平面图中显示出来,所以我们采用两两组合的方式,则可以得出6张平面图。由结果可以得到有一种鸢尾花和其他两种的区分度较好,而要区分那两种较难分辨的鸢尾花则需要画三维图。

from sklearn import datasets
iris =datasets.load_iris()

dataset.plot(x='sepal-length', y='sepal-width', kind='scatter')
dataset.plot(x='sepal-length', y='petal-length', kind='scatter')
dataset.plot(x='sepal-length', y='petal-width', kind='scatter')
dataset.plot(x='sepal-width', y='petal-length', kind='scatter')
dataset.plot(x='sepal-width', y='petal-width', kind='scatter')
dataset.plot(x='petal-length', y='petal-width', kind='scatter')

(四)算法基本原理及代码实现

4.1基本原理(基于朴素贝叶斯)

朴素贝叶斯模型是基于概率的机器学习分类器模型,所以最主要的是计算概率。在鸢尾花数据集中,就是要计算训练集中每个特征属性的平均值和标准差,然后计算测试集中的对应特征属性对比计算其概率。当然,我们在这里认为每个特征值之间是相互独立的且每个特征同等重要,这也是“朴素”一词所要求的。计算出来的测试集中的每个特征属于每个类别的概率,然后把这些概率相乘,所得到的就是属于这个类别的概率。然后运用分类基本原理

,则属于p1类。在属于3个类别的概率中,我们取概率最高的那个类别。同时,为了便于计算,我们把鸢尾花类别用三个浮点数来表示。

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

4.2基本原理(基于KNN算法)

kNN算法是监督学习中较为简单的算法之一,对于测试集中的每一条数据属于哪一个类别的,要在训练集中找到K个最近的点,看这K个邻居所属的类别来判断该数据属于哪一个类别。同时在这里暂时取K值为3。

def knn(train,test,k=3):
    result=[];
    rightNumber=0;
    for testItem in test:
        item=testItem.tolist()
        distArr=[]
        for trainItem in train:
            distArr.append((trainItem[-1],((testItem[0:-1]-trainItem[0:-1])**2).sum())) 
        distArr=sort(distArr)[0:k]
        distArr=[x[0] for x in distArr] 
        countType={}
        for distItem in distArr:
            if distItem in countType:
                countType[distItem]+=1
            else:
                countType[distItem]=1    
        resultType=None
        if len(countType)==1 or len(countType)==k: 
            resultType=distArr[0]
        else:
            
            typeArr=[]
            for countItem in countType:
                typeArr.append((countItem,countType[countItem]))
            typeArr=sort(typeArr)
            resultType=typeArr[-1][0]

        if resultType==item[-1]:rightNumber+=1 

    return rightNumber

4.3基本原理(基于决策树)

决策树算法的主要思想是选择一个最好的特征属性,划分数据集。学习书中的决策树代码发现实现不了,便学习了网上的决策树实现,但是也是知其然而不知其所以然。

(五)测试方法与结果

5.1朴素贝叶斯

因为鸢尾花数据集的原始数据是3种类别的各50组数据,且是顺序排序的,所以我们采用随机分配训练集和测试集的方法来划分数据集。总体上来说训练集占70%,测试集占30%。

共测试10次,我们发现有个别几次测试效果特别好,正确率达到100%,平均正确率为:96.39023%。基本上正确率较高且较稳定。

5.2KNN算法

对于训练集和测试集的划分同上文朴素贝叶斯算法相同,有关于k的取值,我采用取几个k值,分别计算其正确率,然后画出其随k值变化的图像。

以下为k等于3的测试情况:

在这里我也是测试了十次,且选择的k值为3,其中也发现出现了正确率为100%的情况。十次平均正确率为:96.468%,和朴素贝叶斯正确率几乎没有差别。我不断改变K值,发现k<10,平均正确率基本上稳定在95%及以上,在K取10-40是,平均正确率在90%-95%之间。再往上取的时候,平均正确率会下降,但是会出现正确率很高和正确率很低的测试结果。

5.3决策树算法

划分训练集和测试集的方法和上面不无二致,主要就是打乱原有数据的顺序,再随机按照一定的比例划分。

测试结果:使用决策树的测试结果所得到的正确率十分好,可以达到99.47277%的正确率。

(六)总结

总的比较kNN,决策树和朴素贝叶斯算法,最大的区别就说前两者是需要分类器做出艰难决策的,但是对于分类而言,使用概率有时候比使用硬规则更为有效,所以朴素贝叶斯提供了一种利用已知值来估计未知概率的有效方法。

对于朴素贝叶斯算法,“朴素”一次的理解比较重要,书中的解释是:每个特征的重要程度相同。另外对于“独立”概念的假设,书中提到,如果每个特征需要N个样本,那么10个特征将需要 个样本,随着特征的增加,所需样本数会以指数增加,但若特征独立,这只需要10*N个样本,这让我想到在独立和不独立之间会不会有某种状态,可以用某些量来量化。对于“朴素”也是,若每个特征的重要程度不等,是不是可以用所占比重来重新决策。

到现在为止所学的三种分类器有给我很多东西,但是囿于对python语言的不熟悉,还需要花更多的时间去学习和消化。

(七)参考文献

【1】Peter Harrington, Machine Learning inAction[M] . US 2007






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值