机器学习-------算法(五)

分类算法----朴素贝叶斯算法

贝叶斯公式:

 P(C):每个文档类别的概率(某文档类别词数/总文档词数)
 
 P(W│C):给定类别下特征(被预测文档中出现的词)的概

计算方法𝑃𝐹1𝐶=𝑁𝑖/𝑁方法:P(F1│C)=Ni/N  (训练文档中去计算)

       𝑁𝑖𝐹1Ni为F1词C类别所有文档中出现的次数

        N为所属类别C下的文档所有词出现的次数和

𝑃𝐹1,𝐹2,…    预测文档每个词概率 P(F1,F2,…)     预测文档中每个词的概率

例如:求一篇文章是属于科技还是属于娱乐,分别求他的朴素贝叶斯值进行判别属于哪一类别:

特征\统计

科技

娱乐

汇总(求和)

影院

8

56

64

支付宝

20

15

35

云计算

63

0

63

汇总(求和)

100

121

221

科技: P(影院,支付宝,云计算 │科技)∗P(科技)=8/100∗20/100∗63/100∗(100/221) =0.00456109

 

娱乐: P(影院,支付宝,云计算│娱乐)∗P(娱乐)=56/121∗15/121∗0/121∗(121/221)=0

上面显示娱乐概率为0,这显然不合理,为解决这个问题,我们需要新的方法-----拉普拉斯平滑

拉普拉斯平滑:

           P(F1│C)=(Ni+α)/(N+αm)                        

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

API:

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

 

算法:

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB


def naviebayes():
    """朴素贝叶斯"""
    # 获取数据
    news = fetch_20newsgroups(subset="all")
    # 进行数据分割  特征值 = 文章,目标值 = 文章匪类
    train_x, test_x, train_y, test_y = train_test_split(news.data, news.target, test_size=0.25)
    # 特征抽取
    tf = TfidfVectorizer()
    # 以训练集中的词的列表进行每篇文章的重要性统计
    train_x = tf.fit_transform(train_x)
    # 因为都是以训练集进行统计,所以测试集只需要统计训练集中的关键词就可以啦
    test_x = tf.transform(test_x)
    # 进行朴素贝叶斯计算
    # 实例化贝叶斯
    mlt = MultinomialNB(alpha=1.0)
    # 对训练集进行训练
    mlt.fit(train_x, train_y)
    # 测试集进行结果判断,得出预测类别
    y_predict = mlt.predict(test_x)
    print("预测类别:", y_predict)
    # 准确率,模型的准确率
    print(mlt.score(test_x, test_y))


if __name__ == '__main__':
    naviebayes()

 

优点:
朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。

 

对缺失数据不太敏感,算法也比较简单,常用于文本分类。
分类准确度高,速度快
缺点:
需要知道先验概率P(F1,F2,…|C),因此在某些时候会由于假设的先验

模型的原因导致预测效果不佳。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章