Day 22 贝式分类器 Bayesian Classifier

介绍:

贝式分类器(Bayesian Classifier)是一种基於机率模型的机器学习模型。它有很多名称,又叫做贝叶斯分类器、简单贝叶斯、朴素贝叶斯...等。其根据贝氏定理(Bayes' theorem)为基础,透过机率统计来判断未知的资料类别。

贝式定理

贝氏定理描述在一些已知的一些条件下,某件事发生的机率。就像是我们能透过过去的天气状况来预测明天的天气那样。
贝式定理公式为:
https://chart.googleapis.com/chart?cht=tx&chl=P(A%7CB)%3D%5Cfrac%7BP(B%7CA)*P(A)%7D%7BP(B)%7D

P(A)为 A 事件的出现机率;P(B)为 B 事件的出现机率;
P(A|B)代表在 B 事件发生的前提下, A 事件出现的机率;
P(B|A)代表在 A 事件发生的前提下, B 事件出现的机率;
A 和 B 为皆为随机事件,且P(B)机率不为。

打个比方吧。
假设某一间大学内大一、大二、大三、大四的学生分别占了22%、28%、24%、26%;
而大一至大四女学生的占比分别为 40%、30%、20%、15%。
假设我今天在大学内遇到一位女学生,该位女学生为大一的机率是多少?

此时我们套用公式,将P(B)视为遇到女学生的机率、P(A)视为遇到大一学生的机率,因此:
遇到女学生的机率:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(B)%20%3D%200.4*0.22%20%2B%200.30*0.28%20%2B%200.2*0.24%20%2B%200.15*0.26%20%3D%200.259%24
遇到大一学生的机率:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(A)%20%3D%200.22%24
在大一的学生中遇到女生的机率:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(B%7CA)%20%3D%200.4%24
所以答案就是https://chart.googleapis.com/chart?cht=tx&chl=%24%5Cfrac%7B0.4*0.22%7D%7B0.259%7D%3D%5Cfrac%7B88%7D%7B259%7D%3D%5Cfrac%7B88%7D%7B259%7D%24≈0.34

以此类推,我们是不是就能利用这种单纯的方法应用至其他领域,推测出其他领域的资料了呢?比如说:

  1. 新闻内出现『蔡英文』,该新闻被分类为政治文章的机率
  2. 标题带有『几X亿人都震惊了!』的文章是垃圾农场文的机率
  3. 空气中有雨味,看到路边蚂蚁在搬家,接下来会下大雨的机率
  4. 花200万钻石,在《天堂M》里抽中紫布的机率

贝式分类器

从上面提出的例子我们可以知道贝式定理用来分析机率的方法。而贝式分类器就是这麽一个机率模型分类器。因此所有的模型参数都可以通过训练集的相关频率来估计。而不同的资料集自然会有不一样的训练架构,以下是几个比较常用的贝式分类架构:

1. 高斯贝式分类器 GaussianNB:
主要用於特徵为连续变数并符合符合常态分布时。像是年纪大小与罹患癌症的机率、体重大小与罹患心血管疾病的机率...等。
首先对资料进行类别分类,假设训练集中有一个连续属性 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20x%7D%24 ,然後计算每个类别中 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20x%7D%24 的均值和变异数。令 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20%5Cmu%20_%7Bc%7D%7D%24%20表示为 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20x%7D%24 在 c 类上的均值,令 https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20%5Csigma%20_%7Bc%7D%5E%7B2%7D%7D%24https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20x%7D%24 在 c 类上的变异数。

机率计算公式如下:
https://chart.googleapis.com/chart?cht=tx&chl=%24%7B%5Cdisplaystyle%20P(x%3Dv%7Cc)%3D%7B%5Cfrac%20%7B1%7D%7B%5Csqrt%20%7B2%5Cpi%20%5Csigma%20_%7Bc%7D%5E%7B2%7D%7D%7D%7D%5C%2Ce%5E%7B-%7B%5Cfrac%20%7B(v-%5Cmu%20_%7Bc%7D)%5E%7B2%7D%7D%7B2%5Csigma%20_%7Bc%7D%5E%7B2%7D%7D%7D%7D%7D%24
看不懂也没关系,总之你只要知道高斯贝式会透过这种方法将连续的数值离散化。而为什麽我们要把数值离散化?
因为当训练样本数量较少或者是已知精确分布时,通过机率分布的方法或许能表现的不错,但是在大量样本的情形下,我们可以学习到更多资料的分布,因此离散化的方法表现会更加优秀。所以单纯贝氏方法大多都会用离散化方法,而不是机率分布估计的方法。

2. 多项式贝氏分类器 MultinomialNB:
多项式贝氏分类器主要用在特徵为离散变数的情况,比方说次数、类别等等。像是公司人数与员工工作效能的关系、商品不良数与员工偷懒的机率...等。而在个模型中,会多一个 α 参数,也就是平滑化的处理。在不设定的情况下,α 预设为1.0,机率计算公式如下:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(Y_k)%3D%5Cfrac%7BN_%7BY_k%7D%2B%5Calpha%7D%7BN%2Bk_%5Calpha%7D%24%20
https://chart.googleapis.com/chart?cht=tx&chl=%24P(X_i%7CY_k)%3D%5Cfrac%7BN_%7BY_k%2Cx_i%7D%2B%5Calpha%7D%7BN_%7BY_k%7D%2Bn%5Calpha%7D%24
N 是总样本数、k 是总类别数、https://chart.googleapis.com/chart?cht=tx&chl=%24N_%7BY_k%7D%24 是类别为 https://chart.googleapis.com/chart?cht=tx&chl=%24Y_k%24 的数量、 n 是特徵的维数、https://chart.googleapis.com/chart?cht=tx&chl=%24N_%7BY_k%2Cx_i%7D%24 是类别为 https://chart.googleapis.com/chart?cht=tx&chl=%24Y_k%24 的样本中,第 i 维特徵值为 https://chart.googleapis.com/chart?cht=tx&chl=%24x_i%24 的样本数。

3. 伯努力贝氏分类器 BernoulliNB:
与多项式的模型一样,伯努力贝氏分类器也适用於离散特徵的状况,但不同的是伯努力模型的特徵取值只能是 1 和 0 的二元特徵。比方说某个单字曾在该文章内出现过,则该篇文章特徵值为 1 ,没有出现则是 0 。

其条件计算的方式为:
https://chart.googleapis.com/chart?cht=tx&chl=%24P(x_i%7Cy)%3DP(i%7Cy)x_i%20%2B%20(1-P(i%7Cy))(1-x_i)%24

实作:

一样透过iris资料集进行简单的分类实作:

from sklearn.naive_bayes import GaussianNB          # 高斯贝氏分类器 GaussianNB
from sklearn.naive_bayes import MultinomialNB     # 多项式贝氏分类器 MultinomialNB
from sklearn.naive_bayes import BernoulliNB         # 伯努力贝氏分类器 Bernoulli NB
from sklearn import datasets
from sklearn.model_selection import train_test_split

iris=datasets.load_iris()
X=iris.data
Y=iris.target

# 拆分成训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=0)

model=GaussianNB()                         # 这里使用高斯贝氏分类器
model.fit(X_train,y_train)

print(model.predict(X_test))            # 印出测试的预测结果
print(y_test)                                           # 印出测试答案
print(model.score(X_test,y_test))   # 印出预测准度

reference

https://blog.csdn.net/u012162613/article/details/48323777

https://pyecontech.com/2020/03/06/python_bayesian_classifier/

https://zh.wikipedia.org/zh-tw/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%88%86%E7%B1%BB%E5%99%A8

那假设有一群尚未分类的资料,我们要怎麽分类呢?
那就是非监督式学习的问题了。
明天就让我们聊聊非监督式学习中的K-Means吧!


<<:  Day 23 -资料库应用小程序 资料库设计(系统需求分析)

>>:  Day 33 - 实作 S3 驱动 Lambda 函数进行镜像

Day2 Android - 系统预设程序码

来记录一下自己学习的历程及遇到的问题,应该有人会觉得是废话啦~,那麽就开始今天的主题,在一开始建完p...

Day17 Mixin 後,搭配 RWD

大家好,我是乌木白,今天要和大家介绍 Mixin 和 RWD 搭配该如何使用? 原本 RWD 写法...

[Day 07] placeholder

写在前面 placeholder for test placeholder for test pla...

个人笔记 维修单派工 系统架构图

上次的画完系统流程图後,接续开始着手画系统架构图。因之前是资讯管理系毕业,专题中有画过系统架构图,所...

# Day 28 Page Migration (三)

文件 原文文件:Page migration 翻译: Non-LRU 分页迁移 ==========...