机器学习算法平台alink_机器学习分类算法之朴素贝叶斯算法

朴素贝叶斯算法是机器学习里的重要算法。本文将会介绍它的原理和实例应用。

想要了解它的原理需要一定的概率基础,下面将简单的介绍概率的基础知识后深入解释朴素贝叶斯算法。

概率

定义

概率定义为一件事情发生的可能性。如:扔出一个硬币,结果头像朝上是百分之五十。

联合概率和条件概率

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

记作:P(A,B)

特性:P(A,B)=P(A)P(B)

条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率

记作:P(A|B)

特性:P(A1,A2|B) = P(A1|B)P(A2|B)

注意两个的联合和条件事件的前提都是A1,A2相互独立,各个条件互不影响

42f5887ddaddcc8e9cd9152d8572567d.png

案例示例

1、女神喜欢的概率?解:P(喜欢)=4/72、职业是程序员并且体型匀称的概率?解:各个条件都独立且所有条件都同时发生,所以为联合概率P(程序员,匀称)=P(程序员)*P(匀称)=3/7*4/7=12/493、在女神喜欢的条件下,职业是程序员的概率?解:P(程序员|喜欢)=2/4=1/24、在女神喜欢的条件下,职业是产品,体重是超重的概率?解:各个条件都独立,且在某前提下发生另一件事情的概率P(产品,超重|喜欢)= P(产品|喜欢)* P(超重|喜欢)=1/2 * 1/4=1/8

贝叶斯公式

1708224a6660faf0d1d1290becd9e93b.png

贝叶斯公式

注:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别

公式可以理解为:

01e6344918412ef32d7488170e394431.png

贝叶斯公式简化

其中c可以是不同类别。公式分为三个部分:

P(C):每个文档类别的概率(某文档类别词数/总文档词数)P(W|C):给定类别下特征(被预测文档中出现的词)的概率在C类别所有文档中出现的次数N为所属类别C下的文档所有词出现的次数和预测文档中每个词的概率

示例

4205d5c4802e1d27e308c69e0caee5f9.png

现有一篇被预测文档:出现了影院,支付宝,云计算,计算属于科技、娱乐的

类别概率?

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

娱乐:P(影院,支付宝,云计算|科技)*P(娱乐)=(56/121)*(15/121)*(0/121)*(121/221)=0

从上面的例子我们得到娱乐概率为0,这是不合理的,如果词频列表里面有很多出现次数都为0,很可能计算结果都为零。解决方法拉普拉斯平滑系数

714faa8086605e0a9374a617dfbe5d06.png

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

示例的娱乐概率为:

((56+1)/(121+1*4))*((15+1)/(121+1*4))*((1+0)/(121+1*4))*((121+1)/(221+1*4))=0.001

科技概率也做对应的修改。

实例

朴素贝叶斯案例流程

1、加载20类新闻数据,并进行分割

2、生成文章特征词

3、朴素贝叶斯estimator流程进行预估

def naviebayes():    """    朴素贝叶斯进行文本分类    :return: None    """    news = fetch_20newsgroups(subset='all')    # 进行数据分割    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)    # 对数据集进行特征抽取    tf = TfidfVectorizer()    # 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']    x_train = tf.fit_transform(x_train)    print(tf.get_feature_names())    x_test = tf.transform(x_test)    # 进行朴素贝叶斯算法的预测    mlt = MultinomialNB(alpha=1.0)    print(x_train.toarray())    mlt.fit(x_train, y_train)    y_predict = mlt.predict(x_test)    print("预测的文章类别为:", y_predict)    # 得出准确率    print("准确率为:", mlt.score(x_test, y_test))    print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names))    return None

准确率为: 0.840195246179966

相比上篇文章的k-近邻算法准确率提高了很多。朴素贝叶斯算法没有超参数,是无法从参数上调优的,它想要提高准确率是从样本数量和质量中调优。

后续会持续更新由浅入深机器学习的技术文章,有兴趣的朋友可看我之前的文章,关注我随时了解人工智能

991e1cb54d1cb1cc8e12d099e24dfd52.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值