机器学习sklearn(7)朴素贝叶斯分类
原理:
在假定属性之间相互独立的条件下,对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,然后找出最大的条件概率对应的类别。
条件独立公式:如果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. 从统计角度看分类问题 2. 贝叶斯公式的基本思想 贝叶斯的基本逻辑 3. 用贝叶斯公式进行选择 贝叶斯版的预测未来 二.朴素贝叶斯分类的算法原理 1. 朴素贝叶斯分 ...
- 机器学习经典算法——朴素贝叶斯分类算法
目录 简介 基本概念 贝叶斯定理 贝叶斯公式的本质内涵 代码 托马斯·贝叶斯 简介 朴素贝叶斯分类算法作为机器学习最经典的算法之一,该算法是一种有监督学习算法.其理论基础是"贝叶斯定理&qu ...
- 机器学习笔记之朴素贝叶斯分类算法
朴素贝叶斯分类算法: 优点:在数据较少的情况下仍然有效,可以处理多分类问题. 缺点:对于输入数据的准备方式较为敏感. 适用数据类型:标称型数据(离散型数据) 算法原理: 对于某一个条件,这个条件下哪个 ...
- 机器学习实战_朴素贝叶斯分类器_预测疾病
import numpy as np""" 函数说明:创建实验样本 Parameters:无 Returns:postingList - 实验样本切分的词条classLi ...
- 机器学习基础:朴素贝叶斯分类器及其应用示例
贝叶斯定理 \[ { P(h|D)=\frac{P(D|h)P(h)}{P(D)} \tag{1}} \] 贝叶斯分类 假设每一个实例\(x\)可以用\(n\)项特征来描述,分别为\(a_1,a_2, ...
- sklearn朴素贝叶斯分类器_机器学习06——朴素贝叶斯
一.概率公式: 条件概率公式: 事件A发生的条件下,事件B发生的概率=事件A和事件B同时发生的概率/事件A发生的概率 P(AB)=P(A)*P(B|A) 事件A和事件B同时发生的概率=事件A发生的概率 ...
- 朴素贝叶斯分类器简介及C++实现(性别分类)
贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器. 在机器学习中,朴素贝叶斯分类器是一系列以假设特征之间强(朴素)独立下运用贝叶斯定理为基础的简单概率分类器.朴素贝叶斯是文本分类的一种热门(基准)方法 ...
- 《机器学习实战》——朴素贝叶斯
一 前言 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失.是否值得投资.信用等级评定等多分类问题.该算法的优点在于简单易懂.学习效率高.在某些领域的分类问题中能够与决策树.神经网络 ...
- 机器学习之朴素贝叶斯(一):朴素贝叶斯的介绍、概率基础(拉普拉斯平滑)、sklearn朴素贝叶斯实现API、朴素贝叶斯分类的优缺点、文本的特征工程
朴素贝叶斯 文章目录 朴素贝叶斯 一.介绍 1.1 文本分类的应用 词云的例子 垃圾邮件分类 文章类别的概率 二.概率基础 2.1 概率例题 2.2 联合概率和条件概率 2.3 朴素贝叶斯-贝叶斯公式 ...
最新文章
- 用Zend Stuido 的WSDL编辑器
- 软件工程与软件测试基础知识_这是我在软件工程工作九个月中学到的知识
- 手动部署OpenStack环境(二:CentOS6.6虚拟机的安装及配置)
- 互联网人年终总结扎心指南
- 部署在IIS上的网站如何调试
- java Thread sleep 和obj.wait,以及sychronized,minor源码
- 疯狂的ASP.NET系列-第一篇:啥是ASP.NET
- python两个时间点比较大小_python中如何比较两个时间点
- Springboot Excle导入导出
- 使用AsyncDisplayKit提升UICollectionView和UITableView的滚动性能
- python 数据流中的移动平均值_Python实现数据流中的中位数【堆】
- java filechannel 并发_java.nio中的Channel系列(2)-FileChannel与零拷贝原理
- 如何配置JLINK给STM32单片机下载程序
- 使用 Arduino 烧录全新的 ATmega328P
- 推荐一个php Zend Guard解密工具 G-DeZender 本地版
- y=asin(wx+φ)的对称中心_y=asin(wx+φ)怎么求
- STM32F103C8T6最小系统
- 最新php淘宝客优惠券网站源码
- 无法处理文件 Snoop\Forms\BindingMap.resx,因为它位于 Internet 或受限区域中,或者文件上具有 Web 标记。要想处理这些文件,请删除 Web 标记。
- html姓名签到,方案二-签到搜索界面-姓名.html