原理:

在假定属性之间相互独立的条件下,对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,然后找出最大的条件概率对应的类别。

条件独立公式:如果X和Y相互独立,则有:

条件概率公式:

或者说:

接着看全概率公式:

然后很容易得出贝叶斯公式:

我们只要计算出所有的K个条件概率,找出最大的条件概率对应的类别,这就是朴素贝叶斯的预测了。

优点:

  • 发源于古典数学理论,有稳定的分类效果
  • 对小规模的数据表现很好,能处理多分类任务,适合增量式训练,尤其是数据量超出内存时,可以一批批的去增量训练
  • 对缺失数据不太敏感,算法也比较简单,常用于文本分类

缺点:

  • 朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是很难成立的,在属性个数比较多或是属性之间相关性较大时,分类效果不好。
  • 由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率
  • 对输入数据的表达形式很敏感。比如我们的数据有两个特征A和B,第一个特征是a,a,b,b,如果第二个特征我们用的是d,e,f,g这样的形式,那么其实还好,数据相关性不一定那么强.如果之前对数据的表达形式做了整理,比如d,e发现其实很接近,我们归成了一类de, f和g也归成了一类fg,那么第二个特征就是de,de,fg,fg,这样就和第一个特征强相关了,不独立了。也就是特征的表达形式是很敏感的,因为它会对独立性假设有影响。

三种算法:

GaussianNB:如果样本特征的分布大部分是连续值,使用GaussianNB会比较好

class sklearn.naive_bayes.GaussianNB(priors=None)
  • priors:先验概率大小,如果没有给定,模型则根据样本数据自己计算(利用极大似然法)。

对象

  • class_prior_:每个样本的概率
  • class_count:每个类别的样本数量
  • theta_:每个类别中每个特征的均值
  • sigma_:每个类别中每个特征的方差

MultinomialNB:如果样本特征的大部分是多元离散值,使用MultinomialNB比较合适

class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)

  • alpha:先验平滑因子,默认等于1,当等于1时表示拉普拉斯平滑。
  • fit_prior:是否去学习类的先验概率,默认是True
  • class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。

对象

  • class_log_prior_:每个类别平滑后的先验概率
  • intercept_:是朴素贝叶斯对应的线性模型,其值和class_log_prior_相同
  • feature_log_prob_:给定特征类别的对数概率(条件概率)。 特征的条件概率=(指定类下指定特征出现的次数+alpha)/(指定类下所有特征出现次数之和+类的可能取值个数*alpha)
  • coef_: 是朴素贝叶斯对应的线性模型,其值和feature_log_prob相同
  • class_count_: 训练样本中各类别对应的样本数
  • feature_count_: 每个类别中各个特征出现的次数

BernoulliNB:如果样本特征是二元离散值或者很稀疏的多元离散值,应该使用BernoulliNB

class sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)

  • alpha:平滑因子,与多项式中的alpha一致。
  • binarize:样本特征二值化的阈值,默认是0。如果不输入,则模型会认为所有特征都已经是二值化形式了;如果输入具体的值,则模型会把大于该值的部分归为一类,小于的归为另一类。
  • fit_prior:是否去学习类的先验概率,默认是True
  • class_prior:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。

对象

  • class_log_prior_:每个类别平滑后的先验对数概率。
  • feature_log_prob_:给定特征类别的经验对数概率。
  • class_count_:拟合过程中每个样本的数量。
  • feature_count_:拟合过程中每个特征的数量。

方法
贝叶斯的方法和其他模型的方法一致。

  • fit(X,Y):在数据集(X,Y)上拟合模型。
  • get_params():获取模型参数。
  • predict(X):对数据集X进行预测。
  • predict_log_proba(X):对数据集X预测,得到每个类别的概率对数值。
  • predict_proba(X):对数据集X预测,得到每个类别的概率。
  • score(X,Y):得到模型在数据集(X,Y)的得分情况。

import os
import jieba

folder_path = r"C:\Users\meachine learn\sample"
os.listdir(folder_path)

['C000008','C000010','C000013','C000014','C000016','C000020','C000022','C000023','C000024']

通过路径拼接依次读取各个文件夹中所有文件内容,并把读取到的内容通过jieba分词,把分词结果以所属txt文件为分割标准保存在data_list中,并把对应原文件夹保存在class_list中

folder_list = os.listdir(folder_path)
data_list = []
class_list = []
for folder in folder_list:
    new_folder_path = os.path.join(folder_path, folder)   #路径拼接
    files = os.listdir(new_folder_path)
    j = 1
    for file in files:
        if j > 100:
            break
        with open(os.path.join(new_folder_path, file), 'r', encoding='ANSI') as f:
            raw = f.read()
        word_cut = jieba.cut(raw, cut_all=False)  # jieba.cut():第一个参数为需要分词的字符串,第二个cut_all控制是否为全模式。
        word_list = list(word_cut)
        data_list.append(word_list)
        class_list.append(folder)
        j += 1

把原来的文件次序打乱

import numpy as np
data_class_list = list(zip(data_list, class_list))   #数据集和标签对应压缩
np.random.shuffle(data_class_list)   #打乱次序

#切分测试集和训练集
index = int(len(data_class_list) * .2) + 1
train_list = data_class_list[:-index]
test_list = data_class_list[index:]
train_data_list, train_class_list = zip(*train_list)   #测试数据、测试标签对应解压缩
test_data_list, test_class_list = zip(*test_list)

#统计训练集中所有词的词频
all_word_dict = {}
for word_list in train_data_list:
    for word in word_list:
        if word in all_word_dict.keys():
            all_word_dict[word] += 1
        else:
            all_word_dict[word] = 1

根据字典的值降序排列

#这里的d.items()实际上是将d转换为可迭代对象,items()方法将字典的元素 转化为了元组,而这里key参数对应的lambda表达式的意思则是选取元组中的第二个元素作为比较参数(如果写作key=lambda item:item[0]的话则是选取第一个元素作为比较对象,也就是key值作为比较对象。lambda x:y中x表示输出参数,y表示lambda 函数的返回值),所以采用这种方法可以对字典的value进行排序。注意排序后的返回值是一个list,而原字典中的名值对被转换为了list中的元组。
all_word_tuple_list = sorted(all_word_dict.items(), key=lambda item:item[1], reverse=True)  
all_word_list, all_word_nums = zip(*all_word_tuple_list)  
all_word_list = list(all_word_list)   #转换成列表

读取常用介词

import pandas as pd
words_set = set()
words_file = r"C:\Users\meachine learn\stopwords_cn.txt"
with open(words_file, 'r',encoding='ANSI') as f:
    for line in f.readlines():
        word = line.strip()
        if len(word) > 0:
            words_set.add(word)

文本特征选取

def words_dict(all_words_list, N, stopwords_set=set()):
    feature_words = []
    n = 1
    for t in range(N, len(all_words_list)):
        if n > 1000:
            break
        if not all_words_list[t].isdigit() and all_words_list[t] not in stopwords_set and 1 < len(all_words_list[t]) < 5:
            feature_words.append(all_words_list[t])
        n += 1
    return feature_words

feature_words = words_dict(all_word_list, 100, words_set)

获取特征列表

def textfeatures(text, feature_words):
    text_words = set(text)
    features = [1 if word in text_words else 0 for word in feature_words]
    return features

train_feature_list = [textfeatures(text, feature_words) for text in train_data_list]   #训练特征列表
test_feature_list = [textfeatures(text, feature_words) for text in test_data_list]    #测试特征列表

from sklearn.naive_bayes import MultinomialNB
import matplotlib.pyplot as plt
%matplotlib inline

朴素贝叶斯分类器

NB = MultinomialNB()    
NB.fit(train_feature_list, train_class_list)
test_accuracy = NB.score(test_feature_list, test_class_list)

print(test_accuracy)   #分类器精度

0.8732394366197183

删除前N个高频词汇后得到的特征列表在分类器中的得分与N的关系图

test_accuracy_list = []
deleteN = range(0, 1000, 20)
for N in deleteN:
    feature_words = words_dict(all_word_list, N, words_set)
    train_feature_list = [textfeatures(text, feature_words) for text in train_data_list]
    test_feature_list = [textfeatures(text, feature_words) for text in test_data_list]
    NB.fit(train_feature_list, train_class_list)
    test_accuracy = NB.score(test_feature_list, test_class_list)
    test_accuracy_list.append(test_accuracy)

plt.plot(deleteN, test_accuracy_list)
plt.title("Relationship of deldteN and test_accuracy_list")
plt.xlabel("deleteN")
plt.ylabel("test_accuracy_list")
plt.show()

NB_pred = NB.predict(test_feature_list)   用分类器对测试集预测
print(NB_pred)

['C000023' 'C000008' 'C000016' 'C000010' 'C000023' 'C000020' 'C000010''C000024' 'C000008' 'C000024' 'C000020' 'C000020' 'C000022' 'C000010''C000016' 'C000023' 'C000008' 'C000013' 'C000010' 'C000014' 'C000013''C000020' 'C000020' 'C000014' 'C000010' 'C000013' 'C000008' 'C000010''C000008' 'C000023' 'C000022' 'C000016' 'C000022' 'C000014' 'C000010''C000016' 'C000024' 'C000016' 'C000020' 'C000020' 'C000014' 'C000013''C000008' 'C000022' 'C000014' 'C000023' 'C000008' 'C000016' 'C000014''C000024' 'C000014' 'C000024' 'C000023' 'C000022' 'C000020' 'C000010''C000022' 'C000010' 'C000020' 'C000016' 'C000016' 'C000023' 'C000022''C000016' 'C000020' 'C000010' 'C000022' 'C000024' 'C000024' 'C000014''C000023']

构建新闻类型代码与类型名称的字典,并用该字典对上述预测结果进行映射,把预测类型代码转换成类型名称

names = ['Code', 'Name']
data_trans = pd.read_csv(r"C:\Users\meachine learn\classlist.txt", sep='\t',engine='python', names=names, encoding='ANSI')
data_trans = np.array(data_trans)
dict_trans = {}
for i in range(0, len(data_trans)):
    dict_trans[data_trans[i][0]] = data_trans[i][1]
print(dict_trans)

{'C000008': '财经', 'C000010': 'IT', 'C000013': '健康', 'C000014': '体育', 'C000016': '旅游', 'C000020': '教育', 'C000022': '招聘', 'C000023': '文化', 'C000024': '军事'}

np.vectorize(dict_trans.get)(NB_pred)  #矩阵映射

array(['文化', '财经', '旅游', 'IT', '文化', '教育', 'IT', '军事', '财经', '军事', '教育','教育', '招聘', 'IT', '旅游', '文化', '财经', '健康', 'IT', '体育', '健康', '教育','教育', '体育', 'IT', '健康', '财经', 'IT', '财经', '文化', '招聘', '旅游', '招聘','体育', 'IT', '旅游', '军事', '旅游', '教育', '教育', '体育', '健康', '财经', '招聘','体育', '文化', '财经', '旅游', '体育', '军事', '体育', '军事', '文化', '招聘', '教育','IT', '招聘', 'IT', '教育', '旅游', '旅游', '文化', '招聘', '旅游', '教育', 'IT','招聘', '军事', '军事', '体育', '文化'], dtype='<U2')

机器学习sklearn(7)朴素贝叶斯分类相关推荐

  1. 【机器学习原理】朴素贝叶斯分类算法

    文章目录 一.朴素贝叶斯公式 1. 从统计角度看分类问题 2. 贝叶斯公式的基本思想 贝叶斯的基本逻辑 3. 用贝叶斯公式进行选择 贝叶斯版的预测未来 二.朴素贝叶斯分类的算法原理 1. 朴素贝叶斯分 ...

  2. 机器学习经典算法——朴素贝叶斯分类算法

    目录 简介 基本概念 贝叶斯定理 贝叶斯公式的本质内涵 代码 托马斯·贝叶斯 简介 朴素贝叶斯分类算法作为机器学习最经典的算法之一,该算法是一种有监督学习算法.其理论基础是"贝叶斯定理&qu ...

  3. 机器学习笔记之朴素贝叶斯分类算法

    朴素贝叶斯分类算法: 优点:在数据较少的情况下仍然有效,可以处理多分类问题. 缺点:对于输入数据的准备方式较为敏感. 适用数据类型:标称型数据(离散型数据) 算法原理: 对于某一个条件,这个条件下哪个 ...

  4. 机器学习实战_朴素贝叶斯分类器_预测疾病

    import numpy as np""" 函数说明:创建实验样本 Parameters:无 Returns:postingList - 实验样本切分的词条classLi ...

  5. 机器学习基础:朴素贝叶斯分类器及其应用示例

    贝叶斯定理 \[ { P(h|D)=\frac{P(D|h)P(h)}{P(D)} \tag{1}} \] 贝叶斯分类 假设每一个实例\(x\)可以用\(n\)项特征来描述,分别为\(a_1,a_2, ...

  6. sklearn朴素贝叶斯分类器_机器学习06——朴素贝叶斯

    一.概率公式: 条件概率公式: 事件A发生的条件下,事件B发生的概率=事件A和事件B同时发生的概率/事件A发生的概率 P(AB)=P(A)*P(B|A) 事件A和事件B同时发生的概率=事件A发生的概率 ...

  7. 朴素贝叶斯分类器简介及C++实现(性别分类)

    贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器. 在机器学习中,朴素贝叶斯分类器是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器.朴素贝叶斯是文本分类的一种热门(基准)方法 ...

  8. 《机器学习实战》——朴素贝叶斯

    一 前言 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失.是否值得投资.信用等级评定等多分类问题.该算法的优点在于简单易懂.学习效率高.在某些领域的分类问题中能够与决策树.神经网络 ...

  9. 机器学习之朴素贝叶斯(一):朴素贝叶斯的介绍、概率基础(拉普拉斯平滑)、sklearn朴素贝叶斯实现API、朴素贝叶斯分类的优缺点、文本的特征工程

    朴素贝叶斯 文章目录 朴素贝叶斯 一.介绍 1.1 文本分类的应用 词云的例子 垃圾邮件分类 文章类别的概率 二.概率基础 2.1 概率例题 2.2 联合概率和条件概率 2.3 朴素贝叶斯-贝叶斯公式 ...

最新文章

  1. 用Zend Stuido 的WSDL编辑器
  2. 软件工程与软件测试基础知识_这是我在软件工程工作九个月中学到的知识
  3. 手动部署OpenStack环境(二:CentOS6.6虚拟机的安装及配置)
  4. 互联网人年终总结扎心指南
  5. 部署在IIS上的网站如何调试
  6. java Thread sleep 和obj.wait,以及sychronized,minor源码
  7. 疯狂的ASP.NET系列-第一篇:啥是ASP.NET
  8. python两个时间点比较大小_python中如何比较两个时间点
  9. Springboot Excle导入导出
  10. 使用AsyncDisplayKit提升UICollectionView和UITableView的滚动性能
  11. python 数据流中的移动平均值_Python实现数据流中的中位数【堆】
  12. java filechannel 并发_java.nio中的Channel系列(2)-FileChannel与零拷贝原理
  13. 如何配置JLINK给STM32单片机下载程序
  14. 使用 Arduino 烧录全新的 ATmega328P
  15. 推荐一个php Zend Guard解密工具 G-DeZender 本地版
  16. y=asin(wx+φ)的对称中心_y=asin(wx+φ)怎么求
  17. STM32F103C8T6最小系统
  18. 最新php淘宝客优惠券网站源码
  19. 无法处理文件 Snoop\Forms\BindingMap.resx,因为它位于 Internet 或受限区域中,或者文件上具有 Web 标记。要想处理这些文件,请删除 Web 标记。
  20. html姓名签到,方案二-签到搜索界面-姓名.html

热门文章

  1. adb调试app中java环境变量配置(详细版)
  2. 荣耀v20不支持鸿蒙,华为鸿蒙系统下月推送,这44款手机有福了!荣耀V20无缘升级...
  3. pre标签导致打印页面出现大片空白
  4. unity 代码创建控制骨络动画
  5. JAVA 输入年份月份打印该月的日历
  6. 挺难过的,测完后发现自已有点色盲--色盲、色弱测试图
  7. 网站服务器数据丢失怎么补,服务器数据丢失原因,如何做服务器数据恢复?
  8. NLP中常用的相似度计算方法
  9. 如何使用ffmpeg将BDMV(m2ts)转换成MKV、MP4等其他格式的文件
  10. Jmeter持续断言响应时间