朴素贝叶斯
涉及概念:
- 先验概率:通过经验来判断事情发生的概率
- 后验概率:发生结果后,推测原因的概率
- 条件概率:事件A 在另外一个事件B已经发生条件下的发生概率,记P(A|B)
- 似然函数:关于统计参数的函数
贝叶斯原理:求解后验概率
P ( B i ∣ A ) = P ( B i ) P ( A ∣ B i ) ∑ j = 1 n P ( B j ) P ( A ∣ B j ) P\left(B_{i} | A\right)=\frac{P\left(B_{i}\right) P\left(A | B_{i}\right)}{\sum_{j=1}^{n} P\left(B_{j}\right) P\left(A | B_{j}\right)} P(Bi∣A)=∑j=1nP(Bj)P(A∣Bj)P(Bi)P(A∣Bi)
朴素贝叶斯是以假设每个输入变量是独立的条件前提下。
朴素贝叶斯模型由两种类型的概率组成:
- 每个类别的概率P(Cj)
- 每个属性的条件概率P(Ai|Cj)
贝叶斯原理、贝叶斯分类和朴素贝叶斯三者之间的区别:
- 贝叶斯原理是后两者的数学基础,其解决了逆向概率的问题。贝叶斯分类器是在贝叶斯原理的基础上设计的一种模型,是贝叶斯分类器的一种。朴素贝叶斯是假设条件互相独立下的一种具体方法。
朴素贝叶斯分类器工作流程:(常用于文本分类)
-
准备阶段
确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分数据进行分类形成训练样本
-
训练阶段
生成分类器,计算每个类别在训练样本中出现频率及每个特征属性划分对每个类别的条件概率,输入时特征属性和训练样本,输出是分类器
-
应用阶段
使用分类器对新数据进行分类,输入是分类器和新数据,输出是新数据的分类结果
sklearn中提供了高斯朴素贝叶斯(GaussianNB)、多项式朴素贝叶斯(MultinomialNB)和伯努利朴素贝叶斯(BernoulliNB)3个朴素贝叶斯分类算法。
- 高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布
- 多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,在文档分类中特征变量体现在一个单词出现的次数,或者是单词的TF-IDF值等
- 伯努利朴素贝叶斯:特征变量是布尔变量,符合0/1分布,在文档分类中特征是单词是否出现
TF-IDF值:
- 用来评估某个词语对于一个文件集或文档库中的其中一份文件的重要程度
- TF计算了一个单词在文档中出现的次数
- IDF指一个单词在文档中的区分度,IDF越大就代表该单词的区分度越大
- TF-IDF是两者之间的乘积
sklearn中使用TfidfVectorizer类计算单词TF-IDF向量的值
-
创建TfidfVectorizer
TfidfVectorizer(stop_words=stop_words, token_pattern=token_pattern)
参数 作用 stop_words 自定义停用词表,list类型 token_pattern 过滤规则,正则表达式 -
fit_transform进行计算,返回文本矩阵,其表示每个单词在文档中的TF-IDF值
属性 作用 vocabulary_ 词汇表,字典形式 idf_ 返回idf值 stop_words_ 返回停用词表
对文本的分类可分为两步:
- 基于分词的数据准备,包括分词、单词权重计算、去掉停用词;
- 应用朴素贝叶斯分类进行分类,首先通过训练集得到朴素贝叶斯分类器,然后将分类器应用于测试集,并与实际结果做对比,最终得到测试集的分类准确率。
具体流程:
-
对文档进行分词
英文文档:
import nltk word_list = nltk.word_tokenize(text) #分词 nltk.pos_tag(word_list) #标注单词的词性
中文文档:
import jieba word_list = jieba.cut (text) #中文分词
-
加载停用词
stop_words = [line.strip().decode('utf-8') for line in io.open('stop_words.txt').readlines()]
-
计算单词权重
tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5) features = tf.fit_transform(train_contents)
max_df参数用来描述单词在文档中的最高出现率
-
生成朴素贝叶斯分类器
# 多项式贝叶斯分类器 from sklearn.naive_bayes import MultinomialNB clf = MultinomialNB(alpha=0.001).fit(train_features, train_labels)
alpha为平滑参数,解决概率为0的情况。当alpha=1时,使用的是Laplace平滑。当0<alpha<1时,使用的是Lidstone平滑。对于Lidstone平滑来说,alpha 越小,迭代次数越多,精度越高。
-
使用生成的分类器预测
test_tf = TfidfVectorizer(stop_words=stop_words, max_df=0.5, vocabulary=train_vocabulary) test_features=test_tf.fit_transform(test_contents) #预测 predicted_labels=clf.predict(test_features)
-
计算准确率
from sklearn import metrics print metrics.accuracy_score(test_labels, predicted_labels)