Python+sklearn练习朴素贝叶斯算法

朴素贝叶斯(Naive Bayes)的定义

朴素贝叶斯是基于贝叶斯定理特征条件独立假设的分类方法。在了解朴素贝叶斯之前,我们一起回顾一下概率的一些基础知识。

概率(Probability)的基础知识

概率就是随机事件出现的可能性的量度,记作P(X) ,取值为0~1之间
如:扔一枚普通的硬币,正面朝上的概率和反面朝上的概率都为1/2:P(正) =1/2、P(反)=1/2
联合概率:多个事件同时发生的概率,P(A,B)
条件概率:事件A在事件B已经发生的条件下发生的概率,P(A|B)
相互独立:如果P(A,B) = P(A)P(B), 则称事件A与事件B相互独立,朴素贝叶斯的条件假设就事件相互独立

贝叶斯公式

Python+sklearn练习朴素贝叶斯算法_第1张图片
贝叶斯公式+相互独立假设 = 朴素贝叶斯

朴素贝叶斯的实际应用-文本分类

如何使用朴素贝叶斯算法对文本进行分类呢?其原理是通过求一个文本中同时出现某些词的情况下属于各文本类别的概率,概率最高的则为预测类别。
Python+sklearn练习朴素贝叶斯算法_第2张图片
以上图为例(我对中文文本进行了简单的手动分词,专业的分词以后再学习分享),要预测出测试集新闻类型,则转化为求以下几个概率,概率最大的则为预测所得的新闻类型(假设“与”不作为特征词)
P(体育|武磊,C罗,互换,球衣)
P(历史|武磊,C罗,互换,球衣)
P(娱乐|武磊,C罗,互换,球衣)

经过贝叶斯公式转化则为
P(武磊,C罗,互换,球衣|体育)*P(体育)/P(武磊,C罗,互换,球衣)
P(武磊,C罗,互换,球衣|历史)*P(历史)/P(武磊,C罗,互换,球衣)
P(武磊,C罗,互换,球衣|娱乐)*P(娱乐)/P(武磊,C罗,互换,球衣)

以P(武磊,C罗,互换,球衣|体育)为例根据朴素贝叶斯的相关独立假设可以转化为:
P(武磊,C罗,互换,球衣|体育)=P(武磊|体育)*P(C罗|体育)*P(互换|体育)*P(球衣|体育)

当然了,这儿的测试集数据量太少,会导致 P(球衣|体育)=0/9=0,但体育新闻中出现球衣的概率为0是不符合常理的,这时我们需要引入拉普拉斯平滑系数,公式如下。那么P(球衣|体育)= (0+1)/(9+19) = 1/28
在这里插入图片描述
后面详细的计算我们就忽略了。

机器学习开发流程-实现20种新闻分类

我们了解了朴素贝叶斯算法,如何利用已有的算法库完成我们的实际案例开发呢?我们先了解一下机器学习开发流程:
1)获取数据
这儿我们选择经典的数据集20news进行练习
2)数据处理
对数据进行了训练集测试集的划分
3)特征工程
采用TF-IDF提取词语的出现的频率作为特征值
4)机器学习算法训练-模型
调用Sklearn的朴素贝叶斯算法进行模型训练
5)模型评估
通过准确率进行简单模型评估
6)应用

根据开发流程,代码实现如下:

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 nb_20newsgroups():
    """
    Naive bayes demo
    :return:
    """
    #1 获取数据
    news = fetch_20newsgroups(subset="all")

    #2 划分数据集
    x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.2,random_state=21)

    #3 特征工程,文本特征抽取-TF-IDF
    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:",y_predict)
    print("预测值是否正确:",y_test == y_predict)

    score = estimator.score(x_test,y_test)
    print("准确率:",score)

    return None


if __name__ == "__main__":
    nb_20newsgroups()

运行结果:
y_predict: [ 3 4 17 … 16 2 13]
预测值是否正确: [ True True True … True True True]
准确率: 0.8506631299734748

这儿的准确率并不高,不过这也算是迈出了Machine Learning学习的第一步!后面我将继续分享我在大数据AI学习中总结的干货

你可能感兴趣的:(机器学习)