1、背景
应用在跟文本相关的分类,分类效果较好
根据 先验信息判断
2、贝叶斯定理
P(H|X )给定观测数据样本X ,假设H是成立的概率
比如X是一份具有特定特征的邮件, H是垃圾邮件。它里面包含很多的单词(特征) , 然后我们判断这封邮件属于垃圾邮件的概率是多少。
P(H|X)是后验概率。比如一份特定邮件中,是垃圾邮件的概率。
P(H)是H的先验概率。比如总体邮件中垃圾邮件的概率。
P(X )是X的先验概率。比如总体邮件中带有特定特征的邮件概率。
可以通过抽样来计算先验概率。抽样的数量越大,得到的结果越接近于真实的概率分布-大数定理。
举例1:
举例2:
多个特征计算量太大,可以采用朴素贝叶斯方法
朴素贝叶斯:假设X1,X2,X3,,,,之间相互独立
大脑中的贝叶斯比如:
3、实践贝叶斯简单程序
sklearn中的classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息。
#%%
# 导入算法包以及数据集
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
from sklearn.naive_bayes import MultinomialNB,BernoulliNB,GaussianNB
#%%
# 载入数据
iris = datasets.load_iris()
x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target)
#%%
mul_nb = GaussianNB()
mul_nb.fit(x_train,y_train)
#%%
print(classification_report(mul_nb.predict(x_test),y_test))
#%%
print(confusion_matrix(mul_nb.predict(x_test),y_test))
#%%
4、实践贝叶斯-新闻分类-词袋模型
Bag-of-words model (BoW model)最早出现在自然语言处理( Natural Language Processing )和信息检索( Information Retrieval )领域。该模型忽略掉文本的语法和语序等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的。BoW使用一-组无序的单词(words)来表达一段文字或一个文档。
![](https://img-blog.csdnimg.cn/17caa4dad6a445acaba9937fae80cb5b.png)
#%%
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
#%%
news = fetch_20newsgroups(subset='all')
print(news.target_names)
print(len(news.data))
print(len(news.target))
#%%
print(len(news.target_names))
#%%
news.data[0]
#%%
print(news.target[0])
print(news.target_names[news.target[0]])
#%%
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target)
#%% md
CountVectorizer方法构建单词的字典,每个单词实例被转换为特征向量的一个数值特征,每个元素是特定单词在文本中出现的次数
#%%
from sklearn.feature_extraction.text import CountVectorizer
texts=["dog cat fish","dog cat cat","fish bird", 'bird']
cv = CountVectorizer() #实例化这个方法
cv_fit=cv.fit_transform(texts) #调用fit_transform方法
#
print(cv.get_feature_names()) #统计不同的单词名称
print(cv_fit.toarray())
print(cv_fit.toarray().sum(axis=0))
#%%
from sklearn import model_selection
from sklearn.naive_bayes import MultinomialNB
cv = CountVectorizer()
cv_data = cv.fit_transform(x_train)
mul_nb = MultinomialNB()
scores = model_selection.cross_val_score(mul_nb, cv_data, y_train, cv=3, scoring='accuracy')
print("Accuracy: %0.3f" % (scores.mean()))
5、 TF-IDF算法
我们需要一个重要性调整系数,衡量一个词是不是常见词。如果某个词比较少见,但是它在这篇文章中多次出现那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。
用统计学语言表达,就是在词频的基础上, 要对每个词分配一个"重要性"权重。最常见的词( "的"、"是"、 "在")给予最小的权重,较常见的词( "中国" )给予较小的权重,较少见的词( "蜜蜂"、"养殖" )给予较大的权重。这个权重叫做"逆文档频率" ( Inverse Document Frequency ,缩写为IDF) ,它的大小与一个词的常见程度成反比。
举例:
代码:
TfidfVectorizer使用了一个高级的计算方法,称为Term Frequency Inverse
Document Frequency (TF-IDF)。这是一个衡量一个词在文本或语料中重要性的统计方法。直觉上讲,该方法通过比较在整个语料库的词的频率,寻求在当前文档中频率较高的词。这是一种将结果进行标准化的方法,可以避免因为有些词出现太过频繁而对一个实例的特征化作用不大的情况(我猜测比如a和and在英语中出现的频率比较高,但是它们对于表征一个文本的作用没有什么作用)
#%%
from sklearn.feature_extraction.text import TfidfVectorizer
# 文本文档列表
text = ["The quick brown fox jumped over the lazy dog.",
"The dog.",
"The fox"]
# 创建变换函数
vectorizer = TfidfVectorizer()
# 词条化以及创建词汇表
vectorizer.fit(text)
# 总结
print(vectorizer.vocabulary_) #生成一个字典
print(vectorizer.idf_)
# 编码文档
vector = vectorizer.transform([text[0]])
# 总结编码文档
print(vector.shape)
print(vector.toarray())
#%%
# 创建变换函数
vectorizer = TfidfVectorizer()
# 词条化以及创建词汇表
tfidf_train = vectorizer.fit_transform(x_train)
scores = model_selection.cross_val_score(mul_nb, tfidf_train, y_train, cv=3, scoring='accuracy')
print("Accuracy: %0.3f" % (scores.mean()))
#%%
def get_stop_words():
result = set()
for line in open('stopwords_en.txt', 'r').readlines():
result.add(line.strip())
return result
# 加载停用词
stop_words = get_stop_words()
# 创建变换函数
vectorizer = TfidfVectorizer(stop_words=stop_words)
mul_nb = MultinomialNB(alpha=0.01)
# 词条化以及创建词汇表
tfidf_train = vectorizer.fit_transform(x_train)
scores = model_selection.cross_val_score(mul_nb, tfidf_train, y_train, cv=3, scoring='accuracy')
print("Accuracy: %0.3f" % (scores.mean()))
#%%
# 切分数据集
tfidf_data = vectorizer.fit_transform(news.data)
x_train,x_test,y_train,y_test = train_test_split(tfidf_data,news.target)
mul_nb.fit(x_train,y_train)
print(mul_nb.score(x_train, y_train))
print(mul_nb.score(x_test, y_test))
#%%