朴素贝叶斯算法:
核心思维:是基于概率的算法,之所以称为朴素,是因为其假设特征之间是独立的,该算法设计比较简单,实际上使用的是全概率公式和贝叶斯公式。朴素贝叶斯在文本场景中效果非常好,例如垃圾邮件过滤,新闻分类,情感分析。
通过一个例子来说明:
还有嫁和不嫁的例子。
下面是通用的贝叶斯公式:
6、朴素贝叶斯:是一种极为简单但较为强大的预测建模算法,之所以称为朴素,是因为它假设每个变量是独立的。
朴素贝叶斯模型由两种类型的概率组成:
7、什么是类别概率:有7个棋子,3个是白色,4个是黑色,那么3/7和4/7的白色和黑色概率就是类别概率。
8、什么是条件概率:把棋子放进A,B盒子里,A盒子里放2个白旗、2个黑旗,B盒子放1个白旗、2个黑旗,那么在盒子A中抓到白色棋子的概率就是1/2,这个就是条件概率,也就是在某个条件下的概率。
在朴素贝叶斯中,我们要求的就是属性的条件概率,也就是假设取出来的是白色的棋子,它属于A盒子的概率是2/3。
9、区分贝叶斯原理、贝叶斯分类、朴素贝叶斯
10、全概率公式
先验概率:以经验进行判断;
后验概率:以结果进行判断;
条件概率:在某种条件下,发生结果的概率。
对于离散变量可以直接求概率,连续变量需要看正态分布,然后计算期望和标准差 ,来计算概率。
朴素贝叶斯适用场景:
sklearn机器学习包: 提供了3个朴素贝叶斯分类算法:
高斯朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
import numpy as np
import pandas as pd
np.random.seed(0)
x=np.random.randint(0,10,size=(6,2))
y=np.array([0,0,0,1,1,1])
data=pd.DataFrame(np.concatenate([x,y.reshape(-1,1)],axis=1),columns=["x1","x2","y"])
display(data)
gnb=GaussianNB()
gnb.fit(x,y)
#每个类别的先验概率
print("概率:",gnb.class_prior_)
#每个类别样本的数量
print("样本数量:",gnb.class_count_)
#每个类别的标签
print("标签:",gnb.classes_)
#每个特征在每个类别下的均值
print("均值:",gnb.theta_)
#每个特征在每个类别下的方差
print("方差:",gnb.sigma_)
#测试集
x_test=np.array([[6,3]])
print("预测结果:",gnb.predict(x_test))
print("预测结果概率:",gnb.predict_proba(x_test))
输出:
x1 x2 y
0 5 0 0
1 3 3 0
2 7 9 0
3 3 5 1
4 2 4 1
5 7 6 1
概率: [0.5 0.5]
样本数量: [3. 3.]
标签: [0 1]
均值: [[5. 4.]
[4. 5.]]
方差: [[ 2.66666667 14.00000001]
[ 4.66666667 0.66666667]]
预测结果: [0]
预测结果概率: [[0.87684687 0.12315313]]
#使用伯努利朴素贝叶斯\
from sklearn.naive_bayes import BernoulliNB
np.random.seed(0)
x=np.random.randint(-5,5,size=(6,2))
y=np.array([0,0,0,1,1,1])
data=pd.DataFrame(np.concatenate([x,y.reshape(-1,1)],axis=1),columns=["x1","x2","y"])
display(data)
bnb=BernoulliNB()
bnb.fit(x,y)
print("数值1出现次数:",bnb.feature_count_)
print("类别占比p(y):",np.exp(bnb.class_log_prior_))
print("特征概率:",np.exp(bnb.feature_log_prob_))
输出:
x1 x2 y
0 0 -5 0
1 -2 -2 0
2 2 4 0
3 -2 0 1
4 -3 -1 1
5 2 1 1
数值1出现次数: [[1. 1.]
[1. 1.]]
类别占比p(y): [0.5 0.5]
特征概率: [[0.4 0.4]
[0.4 0.4]]
from sklearn.naive_bayes import MultinomialNB
np.random.seed(0)
X = np.random.randint(0, 4, size=(6, 2))
y = np.array([0, 0, 0, 1, 1, 1])
data = pd.DataFrame(np.concatenate([X, y.reshape(-1, 1)], axis=1), columns=["x1", "x2", "y"])
display(data)
mnb = MultinomialNB()
mnb.fit(X, y)
# 每个类别的样本数量。
print(mnb.class_count_)
# 每个特征在每个类别下发生(出现)的次数。
print(mnb.feature_count_)
# 每个类别下,每个特征所占的比例(概率),即P(x}y)。注意,该值为概率
# 取对数之后的结果,如果需要查看原有的概率,需要使用指数还原。
print(np.exp(mnb.feature_log_prob_))
输出:
x1 x2 y
0 0 3 0
1 1 0 0
2 3 3 0
3 3 3 1
4 1 3 1
5 1 2 1
[3. 3.]
[[4. 6.]
[5. 8.]]
[[0.41666667 0.58333333]
[0.4 0.6 ]]
对于鸢尾花数据集进行分类,那种算法更好?
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
x,y=load_iris(return_X_y=True)
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.25,random_state=0)
models=[("多项式朴素贝叶斯:",MultinomialNB()),("高斯朴素贝叶斯:",GaussianNB()),("伯努利朴素贝叶斯:",BernoulliNB())]
for name,m in models:
m.fit(x_train,y_train)
print(name,m.score(x_test,y_test))
输出:
多项式朴素贝叶斯: 0.5789473684210527
高斯朴素贝叶斯: 1.0
伯努利朴素贝叶斯: 0.23684210526315788
什么是TF-IDF值?
TF-IDF值如何计算?
TF-IDF=TF*IDF
举个例子:假设一个文件夹里一共有 10 篇文档,其中一篇文档有 1000 个单词,“this”这个单词出现 20 次,“bayes”出现了 5 次。“this”在所有文档中均出现过,而“bayes”只在 2 篇文档中出现过。我们来计算一下这两个词语的 TF-IDF 值。
针对“this”,计算 TF-IDF 值:
词频TF=20/1000=0.02
逆向文档频率 IDF=log10/10+1=-0.0414
所以 TF-IDF=0.02*(-0.0414)=-8.28e-4。
针对“bayes”,计算 TF-IDF 值:
TF-IDF=0.005*0.5229=2.61e-3。
很明显“bayes”的 TF-IDF 值要大于“this”的 TF-IDF 值。这就说明用“bayes”这个单词做区分比单词“this”要好。
在sklearn中如何计算 TF-IDF值?
直接使用TfidfVectorizer类,有两个构造参数:stop_word和token_pattern。
创建好TfidfVectorizer向量类时,可以使用fit_transform帮我们计算,返回给我们文本矩阵,该矩阵表示每个单词在每个文档中的TF-IDF值。
fit_transform拟合后,可以获得更多TF-IDF属性,比如词汇对应关系(字典类型)和向量IDF值,以及stop_words。
想要计算文档里都有哪些单词,这些单词在不同文档中的TF-IDF的值是多少:
#创建TfidfVectorizer类
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec=TfidfVectorizer()
#创建4个文档的列表
documents=["this is the bayes document","this is the second second moment","and the third one","is this the document"]
tfidf_matrix=tfidf_vec.fit_transform(documents)
#输出所有不重复的词:
print("不重复的词:",tfidf_vec.get_feature_names())
输出:不重复的词: ['and', 'bayes', 'document', 'is', 'moment', 'one', 'second', 'the', 'third', 'this']
#输出每个单词对应的ID值:
print("每个单词的ID:",tfidf_vec.vocabulary_)
输出:每个单词的ID: {'this': 9, 'is': 3, 'the': 7, 'bayes': 1, 'document': 2, 'second': 6, 'moment': 4, 'and': 0, 'third': 8, 'one': 5}
#输出每个单词在文档中的TF-IDF值
print("每个单词的tfidf的值:",tfidf_matrix.toarray())
输出:
每个单词的tfidf的值: [[0. 0.60759891 0.47903796 0.38782252 0. 0.
- 0.31707032 0. 0.38782252]
[0. 0. 0. 0.25870773 0.40531566 0.
0.81063132 0.21151052 0. 0.25870773]
[0.55280532 0. 0. 0. 0. 0.55280532
- 0.28847675 0.55280532 0. ]
[0. 0. 0.60313701 0.48829139 0. 0.
- 0.39921021 0. 0.48829139]]
如何对文档进行分类
1、准备阶段:基于分词的数据准备,包括分词、单词权重计算、去掉停用词;
2、分类阶段:应用朴素贝叶斯分类进行分类,首先通过训练集得到朴素贝叶斯分类器,然后将分类器应用于测试集,并与实际结果做对比,最终得到测试集的分类准确率。