(一)朴素贝叶斯算法简介。

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。算法的基础是概率问题,分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。朴素贝叶斯假设是约束

性很强的假设,假设特征条件独立,但朴素贝叶斯算法简单,快速,具有较小的出错率。

在朴素贝叶斯的应用中,主要研究了电子邮件过滤以及文本分类研究。

在预示变量间相互独立的前提下,根据贝叶斯定理可以得到朴素贝叶斯这个分类

方法。用更简单的话来说,一个朴素贝叶斯分类器假设一个分类的特性与该分类的其它特性不相关。举个例子,如果一封邮件,出现单词有:。即便这些特性互相依赖,或者依赖于别的特性的存在,朴素贝叶斯分类器还是会假设这些特性分别独立地暗示这个水果是个苹果。

朴素贝叶斯模型易于建造,且对于大型数据集非常有用。虽然简单,但是朴素贝叶斯的表现却超越了非常复杂的分类方法。

贝叶斯定理提供了一种从P(h)、P(D)和 P(D|h) 计算后验概率 P(h|D) 的方法。

请看以下等式:

                                                 P(h|D)=\frac{P(D|h)P(h)}{P(D)}

在这里,

 P ( h|D) 是已知预示变量(属性)的前提下,类(目标)的后验概率

 P ( h ) 是类的先验概率

 P ( D|h) 是可能性,即已知类的前提下,预示变量的概率

 P ( D ) 是预示变量的先验概率

P(D)表示训练数据D的先验概率,P(D|h)表示假设h成立时D的概率。

机器学习中,我们关心的是P(h|D),即给定D时h的成立的概率,称为h的后验概率

算法优点:

1.        优点:对于在小数据集上有显著特征的相关对象,朴素贝叶斯方法可对其进行快速分类

2.        场景举例:情感分析、消费者分类

(二)朴素贝叶斯算法基本步骤:

   1)、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。

     2)、统计得到在各类别下各个特征属性的条件概率估计。

即。P(a1|y1),P(a2|y1),…,P(am|y1),P(a1|y2),P(a1|y2),P(am|y2),…,P(am|y2)

     3)、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:

P(y_{i}|x)=\frac{P(x|y_{i})P(y_{i})}{P(x)}

     因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,所以有:

P(x|y_{i})P(y_{i})=P(a_{1}|y_{i})P(a_{2}|y_{i})...P(a_{m}|y_{i})=P(y_{i})\prod_{j=1}^{m}P(a_{j}|y_{j})

(三)、Sklearn中朴素贝叶斯算法思路:

①选择数据:将你的数据分成三组:训练数据、验证数据和测试数据

②模型数据:使用训练数据来构建使用相关特征的模型

③验证模型:使用你的验证数据接入你的模型

④测试模型:使用你的测试数据检查被验证的模型的表现

⑤使用模型:使用完全训练好的模型在新数据上做预测

⑥调优模型:使用更多数据、不同的特征或调整过的参数来提升算法的性能表现

  编写了一个类MyBayesClassifier,封装了很多函数和过程,更易于理解,读者好好体会体会。

# -*- coding: utf-8 -*-
"""
Created on 6.4 2018
jcy
"""
import numpy as np
from numpy import *
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB
class MyBayesClassifier:
    def__init__(self,moudle=GaussianNB()):
        self.moudle=moudle
    def loadSet(self):
        input_file ='d:\\test.txt'
        X = []
        y = []
        with open(input_file,'r') as f:
            for line inf.readlines():
                data =[float(x) for x in line.split(',')]
               X.append(data[:-1])
               y.append(data[-1]) 
        self.X = np.array(X)
        self.y = np.array(y)
    defdata_select_train_test(self):  
        from sklearn importcross_validation
        self.X_train,self.X_test, self.y_train, self.y_test =cross_validation.train_test_split(self.X,self.y, test_size=0.25, random_state=5)
    deffit_X_Complete(self):    
       self.moudle.fit(self.X, self.y)
        self.y_pred =self.moudle.predict(self.X)
    deffit_X_train(self):    
       self.moudle.fit(self.X_train, self.y_train)
        self.y_test_pred =self.moudle.predict(self.X_test)
    def__plot_classifier(self,X,y):    
        x_min, x_max =min(X[:, 0]) - 1.0, max(X[:, 0]) + 1.0
        y_min, y_max =min(X[:, 1]) - 1.0, max(X[:, 1]) + 1.0
        step_size = 0.01
        x_values, y_values =np.meshgrid(np.arange(x_min, x_max, step_size), np.arange(y_min, y_max,step_size))
        mesh_output =self.moudle.predict(np.c_[x_values.ravel(), y_values.ravel()])
        mesh_output =mesh_output.reshape(x_values.shape)
        plt.figure()
       plt.pcolormesh(x_values, y_values, mesh_output, cmap=plt.cm.gray)
        plt.scatter(X[:, 0],X[:, 1], c=y, s=80, edgecolors='black', linewidth=1, cmap=plt.cm.Paired)
       plt.xlim(x_values.min(), x_values.max())
        plt.ylim(y_values.min(),y_values.max())
       plt.xticks((np.arange(int(min(X[:, 0])-1), int(max(X[:, 0])+1), 1.0)))
       plt.yticks((np.arange(int(min(X[:, 1])-1), int(max(X[:, 1])+1), 1.0)))
        plt.show()    
    defassess_module_plot(self,isComplete=True): #isComplete表示是否为全集还是训练集。
        if isComplete:
            accuracy = 100.0 *(self.y ==self.y_pred).sum() / self.X.shape[0]
           print("Accuracy of the classifier =", round(accuracy, 2),"%")
           self.__plot_classifier(self.X, self.y)
        else:
            accuracy = 100.0 *(self.y_test ==self.y_test_pred).sum() / self.X_test.shape[0]
           print("Accuracy of the classifier =", round(accuracy, 2),"%")
           self.__plot_classifier(self.X_test, self.y_test)            
    defasscess_module_score(self,isComplete=True):
        from sklearn importcross_validation
        num_validations = 5
       MethodList=['accuracy','f1_weighted','precision_weighted','recall_weighted']
        if isComplete:
            for yy inMethodList:
               tt=cross_validation.cross_val_score(self.moudle,self.X, self.y,scoring=yy, cv=num_validations)
               print(yy+" "+ str(round(100*tt.mean(), 2)) + "%\n")
        else:
            for yy in MethodList:
               tt=cross_validation.cross_val_score(self.moudle,self.X_test,self.y_test,scoring=yy, cv=num_validations)
               print(yy+" "+ str(round(100*tt.mean(), 2)) +"%\n")            
moudle=GaussianNB()
MyBayes=MyBayesClassifier(moudle)
MyBayes.loadSet()
 
MyBayes.data_select_train_test()
 
MyBayes.fit_X_Complete()
MyBayes.fit_X_train()
 
MyBayes.assess_module_plot(True)
MyBayes.asscess_module_score(True)
 
MyBayes.assess_module_plot(False)
MyBayes.asscess_module_score(False)