机器学习之路9

朴素贝叶斯算法

概率

概率定义为一件事情发生的可能性。

下面我们来看一个小例子:

1 显然等于4/7.因为一共有7个样本,而“喜欢”的样本占4个。

2 显然等于1/7.因为一共有7个样本,而“是程序员并且匀称”的样本占1个。

3 为1/2.因为在喜欢的条件下是程序员,这加了条件,缩小了分母范围,“喜欢”占4个,其中有程序员2个,即为2/4=1/2。

4 同3的分析,为1/4。

联合概率,条件概率与相互独立

联合概率:包含多个条件,且所有条件同时成立的概率。

条件概率:事件A在事件B已经发生条件下的发生概率。

相互独立:若p(A,B) = p(A)*p(B),则称事件A与事件B相互独立。

贝叶斯公式

w为给定文档的特征值,c为文档类别。

所谓“朴素”,就是指特征与特征之间是相互独立的。

应用场景:单词作为特征的文本分类。 

在实际应用中,贝叶斯公式可变为以下公式:

那么接下来,我们看一个公式应用的小例子:

 代入公式,我们发现利用贝叶斯求C与非C的概率时,分母是一样的,所以我们只计算分子即可。

概率出现0的根本原因就是样本量太少了,避免0概率的出现,要引入拉普拉斯平滑系数α(不只是概率为0的加入平滑系数,概率不为0的也要加)

这样,最后的结果是

代码实现朴素贝叶斯对文本分类

#导入新闻数据集
from sklearn.datasets import fetch_20newsgroups
#导入文本的特征抽取模块
from sklearn.feature_extraction.text import TfidfVectorizer
#导入贝叶斯算法模块
from sklearn.naive_bayes import MultinomialNB
#朴素贝叶斯算法
def nb_news():
    '''
    用朴素贝叶斯算法对新闻进行分类
    :return:
    '''
    #1 获取数据,第一个参数是数据集的下载位置,第二个是你需要什么,模式是只有训练集,这里选择所有
    news = fetch_20newsgroups('F:/BaiduNetdiskDownload',subset="all")
    #2 划分数据集,参数:数据集的特征值,数据集的目标值。返回值:
    x_train,x_test,y_train,y_test = train_test_split(news.data,news.target)
    #3 特征工程:文本特征抽取——TfIdf
    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 模型评估
    # 方法1:直接比对真实值和预测值
    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

结果:

朴素贝叶斯算法的总结

优点:

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

对缺失数据不太敏感,算法也比较简单,常用于分本分类。

分类的准确度高,数度快。

缺点:

由于使用了样本属性独立性的假设,所以当特征属性有关联时其效果不好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值