python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析

#2018-04-06 13:52:30 April Friday the 14 week, the 096 day SZ SSMR
python数据挖掘课程】二十一.朴素贝叶斯分类器详解及中文文本舆情分析 
1.朴素贝叶斯数学原理知识
    2.naive_bayes用法及简单案例
    3.中文文本数据集预处理
    4.朴素贝叶斯中文文本舆情分析
朴素贝叶斯(Naive Bayesian)是基于贝叶斯定理和特征条件独立假设的分类方法,它通过特征计算分类的概率
,选取概率大的情况,是基于概率论的一种机器学习分类(监督学习)方法,被广泛应用于情感分类领域的分类器。
1.什么是基于概率论的方法?
通过概率来衡量事件发生的可能性。概率论和统计学是两个相反的概念,统计学是抽取部分样本统计来估算总体情况,
而概率论是通过总体情况来估计单个事件或部分事情的发生情况。概率论需要已知数据去预测未知的事件。
2.条件概率

若Ω是全集,A、B是其中的事件(子集),P表示事件发生的概率,则条件概率表示某个事件发生时另一个事件发生的概率。
假设事件B发生后事件A发生的概率为:
3.全概率公式
设Ω为试验E的样本空间,A为E的事件,B1、B2、....、Bn为Ω的一个划分,且P(Bi)>0,其中i=1,2,...,n,则:
P(A) = P(AB1)+P(AB2)+...+P(ABn)
        = P(A|B1)P(B1)+P(A|B2)P(B2)+...+P(A|Bn)P(Bn)
全概率公式主要用途在于它可以将一个复杂的概率计算问题,分解为若干个简单事件的概率计算问题,最后应用概率的可加性求出最终结果

4.贝叶斯公式
设Ω为试验E的样本空间,A为E的事件,如果有k个互斥且有穷个事件,即B1、B2、....、Bk为Ω的一个划分,
且P(B1)+P(B2)+...+P(Bk)=1,P(Bi)>0(i=1,2,...,k),则:
P(A):事件A发生的概率;
P(A∩B):事件A和事件B同时发生的概率;
P(A|B):事件A在时间B发生的条件下发生的概率;
意义:现在已知时间A确实已经发生,若要估计它是由原因Bi所导致的概率,则可用Bayes公式求出。
5.先验概率和后验概率
先验概率是由以往的数据分析得到的概率,泛指一类事物发生的概率,根据历史资料或主观判断未经证实所确定的概率。
后验概率而是在得到信息之后再重新加以修正的概率,是某个特定条件下一个具体事物发生的概率。
6.朴素贝叶斯分类
贝叶斯分类器通过预测一个对象属于某个类别的概率,再预测其类别,是基于贝叶斯定理而构成出来的。在处理大规模数据集时,贝叶斯分类器表现出较高的分类准确性。
假设存在两种分类:
  1) 如果p1(x,y)>p2(x,y),那么分入类别1
  2) 如果p1(x,y)<p2(x,y),那么分入类别2
其中,x、y表示特征变量,ci表示分类,p(ci|x,y)表示在特征为x,y的情况下分入类别ci的概率,因此,结合条件概率和贝叶斯定理有:
  1) 如果p(c1|x,y)>p(c2,|x,y),那么分类应当属于类别c1
  2) 如果p(c1|x,y)<p(c2,|x,y),那么分类应当属于类别c2

贝叶斯定理最大的好处是可以用已知的概率去计算未知的概率,而如果仅仅是为了比较p(ci|x,y)和p(cj|x,y)的大小,只需要已知两个概率即可,分母相同,
比较p(x,y|ci)p(ci)和p(x,y|cj)p(cj)即可。
7.示例讲解
假设存在14天的天气情况和是否能打网球,包括天气、气温、湿度、风等,现在给出新的一天天气情况,需要判断我们这一天可以打网球吗?首先统计出各种天气情况下打网球的概率,如下图所示

8.优缺点
•监督学习,需要确定分类的目标 
•对缺失数据不敏感,在数据较少的情况下依然可以使用该方法
•可以处理多个类别 的分类问题
•适用于标称型数据 
•对输入数据的形势比较敏感
•由于用先验数据去预测分类,因此存在误差
二. naive_bayes用法及简单案例




scikit-learn机器学习包提供了3个朴素贝叶斯分类算法:

•GaussianNB(高斯朴素贝叶斯)
•MultinomialNB(多项式朴素贝叶斯)

•BernoulliNB(伯努利朴素贝叶斯)
1.高斯朴素贝叶斯
调用方法为:sklearn.naive_bayes.GaussianNB(priors=None)。
下面随机生成六个坐标点,其中x坐标和y坐标同为正数时对应类标为2,
x坐标和y坐标同为负数时对应类标为1。通过高斯朴素贝叶斯分类分析的代码如下:
# -*- coding: utf-8 -*-
import numpy as np
from sklearn.naive_bayes import GaussianNB
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
Y = np.array([1, 1, 1, 2, 2, 2])
clf = GaussianNB()
clf.fit(X, Y)      
pre = clf.predict(X)
print (u"数据集预测结果:", pre)
print (clf.predict([[-0.8, -1]]))

clf_pf = GaussianNB()
clf_pf.partial_fit(X, Y, np.unique(Y)) #增加一部分样本
print(clf_pf.predict([[-0.8, -1]]))
2.多项式朴素贝叶斯
多项式朴素贝叶斯:sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)主要用于离散特征分类,例如文本分类单词统计,以出现的次数作为特征值。
参数说明:alpha为可选项,默认1.0,添加拉普拉修/Lidstone平滑参数;fit_prior默认True,表示是否学习先验概率,参数为False表示所有类标记具有相同的先验概率;class_prior类似数组,数组大小为(n_classes,),默认None,类先验概率。



3.伯努利朴素贝叶斯
伯努利朴素贝叶斯:sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True,class_prior=None)。类似于多项式朴素贝叶斯,也主要用于离散特征分类,
和MultinomialNB的区别是:MultinomialNB以出现的次数为特征值,BernoulliNB为二进制或布尔型特性

Sklearn机器学习包常用的扩展类。
#监督学习
sklearn.neighbors #近邻算法
sklearn.svm #支持向量机
sklearn.kernel_ridge #核-岭回归
sklearn.discriminant_analysis #判别分析
sklearn.linear_model #广义线性模型
sklearn.ensemble #集成学习
sklearn.tree #决策树
sklearn.naive_bayes #朴素贝叶斯
sklearn.cross_decomposition #交叉分解
sklearn.gaussian_process #高斯过程
sklearn.neural_network #神经网络
sklearn.calibration #概率校准
sklearn.isotonic #保守回归
sklearn.feature_selection #特征选择
sklearn.multiclass #多类多标签算法

#无监督学习
sklearn.decomposition #矩阵因子分解sklearn.cluster # 聚类
sklearn.manifold # 流形学习
sklearn.mixture # 高斯混合模型
sklearn.neural_network # 无监督神经网络
sklearn.covariance # 协方差估计

#数据变换
sklearn.feature_extraction # 特征提取sklearn.feature_selection # 特征选择
sklearn.preprocessing # 预处理
sklearn.random_projection # 随机投影
sklearn.kernel_approximation # 核逼近

三. 中文文本数据集预处理


假设现在需要判断一封邮件是不是垃圾邮件,其步骤如下:

•数据集拆分成单词,中文分词技术
•计算句子中总共多少单词,确定词向量大小
•句子中的单词转换成向量,BagofWordsVec
•计算P(Ci),P(Ci|w)=P(w|Ci)P(Ci)/P(w),表示w特征出现时,该样本被分为Ci类的条件概率
•判断P(w[i]C[0])和P(w[i]C[1])概率大小,两个集合中概率高的为分类类标
四. 朴素贝叶斯中文文本舆情分析
# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
import jieba

#http://blog.csdn.net/eastmount/article/details/50323063
#http://blog.csdn.net/eastmount/article/details/50256163
#http://blog.csdn.net/lsldd/article/details/41542107

####################################
#         第一步 读取数据及分词
#
data = pd.read_csv("data.csv",encoding='gbk')
print data

#取表中的第1列的所有值
print u"获取第一列内容"
col = data.iloc[:,0]  
#取表中所有值  
arrs = col.values

#去除停用词  
stopwords = {}.fromkeys([',', '。', '!', '这', '我', '非常'])

print u"\n中文分词后结果:"
corpus = []
for a in arrs:
    #print a
    seglist = jieba.cut(a,cut_all=False)     #精确模式  
    final = ''
    for seg in seglist:
        seg = seg.encode('utf-8')
        if seg not in stopwords: #不是停用词的保留
            final += seg
    seg_list = jieba.cut(final, cut_all=False) 
    output = ' '.join(list(seg_list))         #空格拼接
    print output
    corpus.append(output)

####################################
#         第二步 计算词频
#
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
  
vectorizer = CountVectorizer() #将文本中的词语转换为词频矩阵  
X = vectorizer.fit_transform(corpus) #计算个词语出现的次数    
word = vectorizer.get_feature_names() #获取词袋中所有文本关键词  
for w in word: #查看词频结果
    print w,
print ''
print X.toarray()  


####################################
#         第三步 数据分析
#
from sklearn.naive_bayes import MultinomialNB  
from sklearn.metrics import precision_recall_curve  
from sklearn.metrics import classification_report

#使用前8行数据集进行训练,最后两行数据集用于预测
print u"\n\n数据分析:"
X = X.toarray()
x_train = X[:8]
x_test = X[8:]
#1表示好评 0表示差评
y_train = [1,1,0,0,1,0,0,1]
y_test = [1,0]

#调用MultinomialNB分类器  
clf = MultinomialNB().fit(x_train, y_train)
pre = clf.predict(x_test)
print u"预测结果:",pre
print u"真实结果:",y_test

from sklearn.metrics import classification_report
print(classification_report(y_test, pre))


最后补充一段降维绘制图形的代码,如下:
#降维绘制图形
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
newData = pca.fit_transform(X)
print newData

pre = clf.predict(X)
Y = [1,1,0,0,1,0,0,1,1,0]
import matplotlib.pyplot as plt
L1 = [n[0] for n in newData]
L2 = [n[1] for n in newData]
plt.scatter(L1,L2,c=pre,s=200)
plt.show()


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值