朴素+贝叶斯 朴素:假定特征与特征之间是相互独立的。 贝叶斯:贝叶斯公式 如下图:根据贝叶斯公式求出某个邮件是某个类别的概率,可以看出是产品类别的概率最高,因此判断该邮件是产品类的垃圾邮件。
测试集:
样本职业体型女生是否喜欢小明产品超重?已知小明的特征,预测他是否被女生喜欢。 问题如下: 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(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,Japan∣c)∗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.53∗0∗0 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+1∗65+1= 3 7 \frac{3}{7} 73
P(Tokyo|c)= 0 + 1 8 + 1 ∗ 6 \frac{0+1}{8+1*6} 8+1∗60+1= 1 14 \frac{1}{14} 141
P(Japan|c)= 0 + 1 8 + 1 ∗ 6 \frac{0+1}{8+1*6} 8+1∗60+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} (73)3∗141∗141
sklearn.naive_bayes MultinomialNB(aipha=1.0) 朴素贝叶斯分类 aipha:拉普拉斯平滑系数
(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)结果:
优点:
朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。对缺失数据不太敏感,算法比较简单,常用于文本分类。分类准确率高,速度快 缺点:由于使用了样本属性独立性的假设,所以如果特征属性有关联时其效果不好。如果给定的数据集的概率不准确,也会对结果造成影响。 应用场景:文本分类。