机器学习之朴素贝叶斯算法

it2022-05-05  96

朴素贝叶斯算法

什么是朴素贝叶斯算法:

朴素+贝叶斯 朴素:假定特征与特征之间是相互独立的。 贝叶斯:贝叶斯公式 如下图:根据贝叶斯公式求出某个邮件是某个类别的概率,可以看出是产品类别的概率最高,因此判断该邮件是产品类的垃圾邮件。

概率基础
概率(Probablity)定义 概率定义为一件事情发生的可能性,P(X):取值在[0,1]女生是否喜欢的计算案例(二分类问题) 训练集: 样本数职业体型女生是否喜欢1程序员超重不喜欢2产品匀称喜欢3程序员匀称喜欢4程序员超重喜欢5美工匀称不喜欢6美工超重不喜欢7产品匀称喜欢

测试集:

样本职业体型女生是否喜欢小明产品超重?

      已知小明的特征,预测他是否被女生喜欢。       问题如下:       1.女生喜欢的概率:       P(喜欢)=4/7       2.职业是程序员并且体重匀称的概率:       P(程序员,匀称)=1/7--------联合概率       3.在女生喜欢的条件下,职业是程序员的概率:       P(程序员|喜欢)=(2/7)/(4/7)= 1/2-----------条件概率       4.在女生喜欢的条件下,职业是程序员,体重是超重的概率:       P(程序员,超重|喜欢)(1/7)/(4/7)=1/4

联合概率、条件概率与相互独立
联合概率:包含多个条件,且所有条件同时成立的概率,记作:P(A,B)条件概率:就是事件A在另外一个事件B已经发生条件下发生的概率,记作:P(A|B)相互独立:如果P(A,B)=P(A)P(B)<==>事件A与事件B相互独立。
贝叶斯公式
公式 注:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别计算案例       P(喜欢|产品,超重)= P ( 产 品 , 超 重 ∣ 喜 欢 ) ∗ P ( 喜 欢 ) P ( 产 品 , 超 重 ) \frac{P(产品,超重|喜欢)*P(喜欢)}{P(产品,超重)} PPP       上面的式子中,P(产品,超重|喜欢)和P(产品,超重)的结果均为0,导致无法计算。这是因为样本太少,不具有代表性。并且现实生活中,P(产品,超重|喜欢)和P(产品,超重)不可能为0,而且事件“职业是产品经理”和事件“体重超重”通常被认为是相互独立的事件,但是,根据样本计算是不成立的。       但是朴素贝叶斯可以解决这个问题:       朴素贝叶斯简单理解,就是假定特征与特征之间相互独立,所以,P(喜欢|产品,超重)使用朴素贝叶斯的思路来解决,过程如下: P(产品,超重)= P ( 产 品 ) ∗ P ( 超 重 ) = ( 2 / 7 ) ∗ ( 3 / 7 ) = 6 / 49 P(产品)*P(超重)=(2/7)*(3/7)=6/49 PP=2/73/7=6/49 P(产品,超重|喜欢)=$P(产品|喜欢)P(超重|喜欢)=(1/2)(1/4)=1/8 P ( 喜 欢 ∣ 产 品 , 超 重 ) = P ( 产 品 , 超 重 ∣ 喜 欢 ) ∗ P ( 喜 欢 ) P ( 产 品 , 超 重 ) = 1 / 8 ∗ 4 / 7 6 / 49 = 7 / 12 P(喜欢|产品,超重)=\frac{P(产品,超重|喜欢)*P(喜欢)}{P(产品,超重)}=\frac{1/8*4/7}{6/49}=7/12 P=PPP=6/491/84/7=7/12 3. 这个公式如果应用在文章分类的场景中: 公式可以理解为: P ( C ∣ F 1 , F 2 , . . . ) = P ( F 1 , F 2 , . . . ∣ C ) P ( C ) P ( F 1 , F 2 , . . . ) P(C|F1,F2,...)=\frac{P(F1,F2,...|C)P(C)}{P(F1,F2,...)} PCF1F2,...=P(F1,F2,...)P(F1,F2,...C)P(C) 公式分为三个部分: (1)P(C):每个文档类别的概率(某文档类别数/总文档数量) (2)P(W|C):给定类别下特征(被预测文档中出现的词)的概率 计算方法:P(F1|C)=Ni/N(训练文档中计算) Ni为该F1词在C类别所有文档中出现的次数 N为所属类别C下的文档所有词出现的次数和 (3)P(F1,F2…):预测文芳中每个词的概率 如果计算两个类别概率比较:只要比较前面的大小就可以,得出谁的概率大。应用场景:文本分类(以单词作为特征)

文章分类计算

文档ID文档中的词属于c =China类训练集1Chinese Beijing ChineseYes2Chinese Chinese ShanghaiYes3Chinese MacaoYes4Tokyo Japan ChineseNo测试集5Chinese Chinese Chinese Tokyo Japan?

计算结果: P(c|Chinese,Chinese,Chinese,Tokyo,Japan)= P ( C h i n e s e , C h i n e s e , C h i n e s e , T o k y o , J a p a n ∣ c ) ∗ P ( c ) P ( C h i n e s e C h i n e s e C h i n e s e T o k y o J a p a n ) \frac{P(Chinese,Chinese,Chinese,Tokyo,Japan|c)*P(c)}{P(Chinese Chinese Chinese Tokyo Japan)} P(ChineseChineseChineseTokyoJapan)P(Chinese,Chinese,Chinese,Tokyo,Japanc)P(c) P(c)= 3 4 \frac{3}{4} 43 P(Chinese,Chinese,Chinese,Tokyo,Japan)=P(Chinese|c)^3*P(Tokyo|c)*P(Japan|c)= 0. 5 3 ∗ 0 ∗ 0 0.5^3*0*0 0.5300 P(F1|C)= N i N \frac{Ni}{N} NNi      N=8 此时,计算出来某个概率为0,这时怎么做?

为了解决上述问题,引入拉普拉斯平滑系数

目的:防止计算出的分类概率为0

P(F1|C)= N i + α N + α m \frac{Ni+α}{N+αm} N+αmNi+α

α为指定的系数一般为1,m为训练文档中统计出的特征词个数。

P(Chinese|c)= 5 + 1 8 + 1 ∗ 6 \frac{5+1}{8+1*6} 8+165+1= 3 7 \frac{3}{7} 73

P(Tokyo|c)= 0 + 1 8 + 1 ∗ 6 \frac{0+1}{8+1*6} 8+160+1= 1 14 \frac{1}{14} 141

P(Japan|c)= 0 + 1 8 + 1 ∗ 6 \frac{0+1}{8+1*6} 8+160+1= 1 14 \frac{1}{14} 141

P(Chinese,Chinese,Chinese,Tokyo,Japan)=P(Chinese|c)^3*P(Tokyo|c)*P(Japan|c)= ( 3 7 ) 3 ∗ 1 14 ∗ 1 14 (\frac{3}{7})^3*\frac{1}{14}*\frac{1}{14} 733141141

朴素贝叶斯API

sklearn.naive_bayes MultinomialNB(aipha=1.0) 朴素贝叶斯分类 aipha:拉普拉斯平滑系数

案例:20类新闻分类
流程分析: (1)获取数据 (2)划分数据集 (3)特征工程:文本特征抽取 (4)模型训练:朴素贝叶斯预估流程 (5)模型评估代码: (1)导入包: from sklearn.model_selection import train_test_split from sklearn.datasets import fetch_20newsgroups from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import TfidfVectorizer

(2)编写nb_news()函数:

def nb_news(): ''' #用朴素贝叶斯算法对新闻进行分类 :return: ''' # 1.获取数据 news = fetch_20newsgroups("E:\Python37\my code\\skearncode",subset= "all" ) # 2.划分数据集 x_train,x_test,y_train,y_test = train_test_split(news.data,news.target) # 3.特征工程:文本特征抽取 transfer = TfidfVectorizer() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4.模型训练:朴素贝叶斯预估流程 estimator = MultinomialNB() estimator.fit(x_train,y_train) # 5.模型估计 y_predict = estimator.predict(x_test) print("y_predict:\n", y_predict) print("比对真实值和预测值:\n", y_test == y_predict) # (2)计算准确率 score = estimator.score(x_test, y_test) print("准确率为:\n", score) return None

(3)调用nb_news()函数:

if __name__ == "__main__": # 代码3:用朴素贝叶斯算法对新闻进行分类 nb_news()

(4)结果:

朴素贝叶斯算法总结

优点:

朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。对缺失数据不太敏感,算法比较简单,常用于文本分类。分类准确率高,速度快 缺点:由于使用了样本属性独立性的假设,所以如果特征属性有关联时其效果不好。如果给定的数据集的概率不准确,也会对结果造成影响。 应用场景:文本分类。

最新回复(0)