【2】监督学习--1--分类-贝叶斯(naive_bayes)

朴素贝叶斯

朴素贝叶斯分类器是一个以贝叶斯定理为基础的多分类的分类器。 对于给定数据,首先基于特征的条件独立性假设,学习输入输出的联合概率分布,然后基于此模 型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。

sklearn中的朴素贝叶斯

在sklearn库中,实现了三个朴素贝叶斯分类器,如下表所示:

分类器 描述
naive_bayes.GussianNB 高斯朴素贝叶斯
naive_bayes.MultinomialNB 针对多项式模型的朴素贝叶斯分类器
naive_bayes.BernoulliNB 针对多元伯努利模型的朴素贝叶斯分类器

区别在于假设某一特征的所有属于某个类别的观测值符合特定分布,如,分 类问题的特征包括人的身高,身高符合高斯分布,这类问题适合高斯朴素贝叶斯

sklearn中的朴素贝叶斯

sklearn库中,可以使用sklearn.naive_bayes.GaussianNB创建一个高斯 朴素贝叶斯分类器,其参数有:

  • priors :给定各个类别的先验概率。如果为空,则按训练数据的实际情况 进行统计;如果给定先验概率,则在训练过程中不能更改。

朴素贝叶斯的使用

例1:导入 numpy 库,并构造训练数据 X 和 y。

>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]]) 
>>> Y = np.array([1, 1, 1, 2, 2, 2])

使用 import 语句导入朴素贝叶斯分类器。

from sklearn.naive_bayes import GaussianNB

使用默认参数,创建一个高斯朴素贝叶斯分类器,并将该分类器赋给变量 clf。

>>> clf = GaussianNB(priors=None)

类似的,使用 fit() 函数进行训练,并使用 predict() 函数进行预测,得到 预测结果为 1。(测试时可以构造二维数组达到同时预测多个样本的目的)

>>> clf.fit(X, Y)
>>> print(clf.predict([[-0.8, -1]]))
[1]

朴素贝叶斯是典型的生成学习方法,由训练数据学习联合概率分布,并求得 后验概率分布。 朴素贝叶斯一般在小规模数据上的表现很好,适合进行多分类任务。

算法流程

  • 需要从特征文件和标签文件中将所有数据加载到内存中,由于存在缺失值,此步骤还需要进行简单的数据 预处理。
  • 创建对应的分类器,并使用训练数据进行训练。
  • 利用测试集预测,通过使用真实值和预测值的比对,
  • 计算模型整体的准确率和召回率,来评测模型。

代码:

import pandas as pd
import numpy as np  
 
from sklearn.preprocessing import Imputer
from sklearn.cross_validation import train_test_split 
from sklearn.metrics import classification_report #导入预测结果评估模块classification_report
   
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
 
def load_datasets(feature_paths, label_paths):
    feature = np.ndarray(shape=(0,41))
    label = np.ndarray(shape=(0,1))
    for file in feature_paths:
        df = pd.read_table(file, delimiter=',', na_values='?', header=None)
        imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
        imp.fit(df)
        df = imp.transform(df)
        feature = np.concatenate((feature, df))
     
    for file in label_paths:
        df = pd.read_table(file, header=None)
        label = np.concatenate((label, df))
         
    label = np.ravel(label)
    return feature, label
 
if __name__ == '__main__':
    ''' 数据路径 '''
    featurePaths = ['A/A.feature','B/B.feature','C/C.feature','D/D.feature','E/E.feature']
    labelPaths = ['A/A.label','B/B.label','C/C.label','D/D.label','E/E.label']
    ''' 读入数据  '''
    x_train,y_train = load_datasets(featurePaths[:4],labelPaths[:4])
    x_test,y_test = load_datasets(featurePaths[4:],labelPaths[4:])
    x_train, x_, y_train, y_ = train_test_split(x_train, y_train, test_size = 0.0)
     
    print('Start training knn')
    knn = KNeighborsClassifier().fit(x_train, y_train)
    print('Training done')
    answer_knn = knn.predict(x_test)
    print('Prediction done')
     
    print('Start training DT')
    dt = DecisionTreeClassifier().fit(x_train, y_train)
    print('Training done')
    answer_dt = dt.predict(x_test)
    print('Prediction done')
     
    print('Start training Bayes')
    gnb = GaussianNB().fit(x_train, y_train)
    print('Training done')
    answer_gnb = gnb.predict(x_test)
    print('Prediction done')
     
    print('\n\nThe classification report for knn:')
    print(classification_report(y_test, answer_knn))
    print('\n\nThe classification report for DT:')
    print(classification_report(y_test, answer_dt))
    print('\n\nThe classification report for Bayes:')
    print(classification_report(y_test, answer_gnb))
  • 在所有的特征数据中,可能存在缺失值或者冗余特征。如果将这些特征不加处 理地送入后续的计算,可能会导致模型准确度下降并且增大计算量。
  • 在特征选择阶段,通常需要借助辅助软件(例如Weka)将数据进行可视化并进 行统计。
  • 请大家可以通过课外学习思考如何筛选冗余特征,提高模型训练效率,也可以 尝试调用sklearn提供的其他分类器进行数据预测。

参考资料

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn