今天看啥  ›  专栏  ›  焰雨追虹

十大数据挖掘算法之朴素贝叶斯

焰雨追虹  · 简书  ·  · 2020-01-22 23:39

一、什么是朴素贝叶斯

相关名词

  • 条件概率
  • 贝叶斯准则
  • 贝叶斯决策理论
  • 极大似然估计

1.1 条件概率

在谈朴素贝叶斯之前,我们需要先回顾一下中学时候学的条件概率公式:

P(A|B) = P(AB) / P(B)

上述公式的意思是,在已知条件B的前提下,A事件的发生概率。(后面的部分熟悉条件概率的学霸可以跳过)我中学时候是个学渣,一直没搞懂条件概率的定义,做题目只会死板地套公式,还是乱用公式的那种。大学时候上概率论,概率论老师举了个例子我才知道大概意思——假设甲小组有两男两女,乙小组有一男两女,从甲乙小组随机抽选,已知从乙小组抽,那么抽中男生的概率多少?这个问题可以表示为P(男|乙),不难得出,P(男|乙)=1/3,同理,P(男|甲)=2/4。套用条件概率公式为:

P(男|乙) = P (男乙) / P(乙)

P(男乙):男 ∧ 乙,抽男的而且从乙小组抽,那么等于1 /7;
P(乙) : 抽中乙小组的概率,乙小组有三人,总共7人,所以等于3/7

(当年中学数学老师要是能举个例子我保证当时就懂了= =)

1.2 贝叶斯准则

贝叶斯准则用的其实就是以前学过的贝叶斯公式:

假设已知P(B|A),那么,
P(A|B) = P(B|A) * P(A) / P(B)

套用上述例子,P(男|乙)交换条件就是P(乙|男),即已知抽男的,那么抽中乙组人员的概率多少。

1.3 贝叶斯决策理论

没想好怎么继续用上述例子,所以重新举个例子。假设直角坐标系中有若干个点,这些点可分为类别C1和类别C2。现在有个点D坐标为(x,y),P1为点D属于C1的概率,P2为点D属于C2的概率。

  • 如果P1 > P2,那就属于C1
  • 如果P1 < P2,那就属于C2

这就是贝叶斯决策理论,利用概率进行决策。当然这里只是简单介绍,更具体的内容请自行查阅资料。

1.4 朴素贝叶斯简介

了解了前提知识点之后就可以谈谈朴素贝叶斯了。朴素贝叶斯是贝叶斯决策的一部分,其核心思想就是选择具有最高概率的决策,而之所以称之为“朴素”,是因为整个形式化过程只做独立假设,也就是特征之间相互独立。

朴素贝叶斯的优势在于只需要根据很少的训练数据估计出必要的参数(变量的均值和方差),即在数据较少的情况下仍然有效,可以处理多类别问题,另外训练和预测的速度非常快。而朴素贝叶斯的缺点就是需要先验概率以及存在一定的错误率。

基于朴素贝叶斯的特性,朴素贝叶斯通常适合作为分类的初始解,以下应用场景非常适合使用朴素贝叶斯:

  • 假设分布函数与数据匹配(然而实际中这很少见)
  • 各种类型的区分度很高,模型复杂度不重要;
  • 非常高维度的数据,模型复杂度不重要。

摘抄一下《机器学习实战》中朴素贝叶斯的一般过程:

  1. 收集数据:可以使用任何方法;
  2. 准备数据:需要数值型或者布尔型数据;
  3. 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好;
  4. 训练算法:计算不同的独立特征的条件概率;
  5. 测试算法:计算错误率;
  6. 使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本。

二、Python实现文本分类

(此处代码源自《Python数据科学手册》)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 加载sklearn.datasets中fetch_20newsgroups的数据集
from sklearn.datasets import fetch_20newsgroups
data = fetch_20newsgroups()
# 为了简化演示此处只选择四类新闻
categories = ['talk.religion.misc',
             'soc.religion.christian',
             'sci.space',
             'comp.graphics']
# 加载训练集,train是个二维嵌套列表,每个嵌套列表包含一个文本
train = fetch_20newsgroups(subset='train',categories=categories)
# 加载测试集
test = fetch_20newsgroups(subset='test',categories=categories)
# 将每个字符串内容转换成数值向量
# 创建一个管道,将TF-IDF向量化方法与多项式朴素贝叶斯分类器组合在一起
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
model = make_pipeline(TfidfVectorizer(),MultinomialNB)
# 此函数作用是返回字符串的预测结果
def predict_category(s,train=train,model=model):
    pred = model.predict([s])
    return train.target_name[pred[0]]



原文地址:访问原文地址
快照地址: 访问文章快照