美文网首页程序员技术栈贝叶斯
机器学习: 贝叶斯分类器

机器学习: 贝叶斯分类器

作者: 写代码的海怪 | 来源:发表于2019-02-21 04:19 被阅读4次

    在机器学习的监督学习里,贝叶斯分类器算是很有名的一个方法了,而且这个方法效果还不错。

    贝叶斯方程

    我们先来复习一下大学里高数的贝叶斯方程

    P(A|B) = \frac{P(B|A) \times P(A)}{P(B)}

    只要记住这个方程,后面就都很容易理解 了。

    为什么要用贝叶斯

    为什么一定是贝叶斯呢?就是因为贝叶斯可以根据 P(A|B) 去推 P(B|A)。我们先看下面的数据集。

    现在你根据这个数据集去生成一个模型(现在还不知道怎么生成),然后我给 X = 0,你预测 X=0 时是 Bad 还是 Good。如果用条件概率来表示应该就是求

    P(Y=Good|X=0)

    P(Y=Bad|X=0)

    两个概率,然后比一下哪个概率大,概率大的那个就是预测值喽~。现在看傻眼了,这概率我怎么求呀,一点线索没有。OK,现在贝叶斯就出来求这两个概率了,这里就求上面的概率吧。

    P(Y=Good|X=0) = \frac{P(X=0|Y=Good) \times P(Y=Good)}{P(X=0)}

    其中,已知 Y=Good 是有 15+287+5 个了,所以

    P(X=0|Y=Good) = \frac{15}{15+287+5}=\frac{15}{307}

    P(Y=Good) = \frac{15+287+5}{15+287+5+42+338+3}=\frac{307}{690}

    P(X=0) = \frac{42+15}{42+15+338+287+3+5}=\frac{57}{690}

    整合一下概率为

    P(Y=Good|X=0) = \frac{P(X=0|Y=Good) \times P(Y=Good)}{P(X=0)} =\frac{15}{57} \approx 0.2632

    以此类推我们把其它的概率都算出来,下面最右边的表格就是我们对给定 X 值的预测概率,其中绿色为较高的概率,会分到那个类。

    贝叶斯分类器就没了,原理就是这么简单。不过,像上面使用贝叶斯在细节上会有一点问题,下面来说说这些问题。

    Normalization

    现在我们慢慢优化上面的分类器。假设现在我们的特征值变成 3 个,分别是 A,B,C 三个,数据集是这样的

    不错呀,那么撸起袖子算预测值呗。但是你有没有想到一种情况是 A,B,C 对应的值是 0 呢?如下表。换句话说我的数据集里就没 有一项是 A=0,B=0,C=0,那该怎么办呢?

    所以一般计算后的结果会加一个小数使其结果不为 0 就好了,这个过程叫做 Normalization.

    Naive Bayes

    Naive Bayes 分类器应该都很耳熟了,它主要解决的问题是贝叶斯的计算问题。刚刚也就三个特征值,那如果再多一点那计算量就很大了。公式可能写成这样

    P(Y=y∣F_1=f_1,…,F_k=f_k)=\max_y {\frac{P(F_1=f_1,…,F_k=f_k|Y=y) \times P(Y=y)}{P(F_1=f_1,…,F_k=f_k)}}

    而且我们不能保证所有特征值都会有对应的 Y 值,如有可能存在 A_1=0,A_2=0,...A_10000=0 没有对应的 Y 值。那这样就计算不了了。所以我们“大概地”,“理想化地”把所有特征值都看成是独立的,于是计算预测概率时就有

    P(F_1=f_1,…,F_k=f_k|Y=y) \approx P(F_1=f_1|Y=y) \times P(F_2=f_2|Y=y) \times ... \times P(F_k=f_k|Y=y)

    将上面的式子整理一下

    P(F_1=f_1|Y=y) \times P(F_2=f_2|Y=y) \times ... \times P(F_k=f_k|Y=y) = \prod^k_{i=1}{P(F_i=f_i|Y=y)}

    再代回原来的公式变成

    P(Y=y∣F_1=f_1,…,F_k=f_k) \approx \max_y {\frac{P(Y=y) \times \max_y {\prod^k_{i=1}{P(F_i=f_i|Y=y)}}}{P(F_1=f_1,…,F_k=f_k)}}

    因为我们只是每次对给定相同的特征值去对比预测值,所以分母是一样的,我们只需要关注分子就可以了。因此,我们直接把分母去掉,只比较分子

    要对比的预测值 \approx P(Y=y) \times \max_y {\prod^k_{i=1}{P(F_i=f_i|Y=y)}}

    因为这只是我们假想所有特征值是独立的,因此这个方法很 Naive,也就叫成了 Naive Bayes Classifier.

    Naive Bayes vs Joint Bayes

    下面通过一个例子来对比一下这两个方法

    Naive Bayes

    因为特征值是独立的,所以 \hat{p}(x_1, x_2|y=1) 不是 0 而是 \hat{p}(x_1|y=1)\hat{p}(x_2|y=1) 的乘积。

    Joint Bayes

    Joint Bayes 也就是之前的 Bayes 啦。这里特征值不是独立的,而且我们找不到 y=1 的条件下 x_1=1x_2=1 同时成立的样本,因此 \hat{p}(x_1, x_2|y=1) = 0

    从上面例子可以看到,如果不用 Naive Bayes 来做,会出现预测概率为 0 的情况,这是很不好的。Naive Bayes 就可以避免这种结果,而且在实际使用中 Naive Bayes 效果还挺不错的,虽然它是一个估算值。

    Gaussian Bayes

    下面说说高斯贝叶斯分类器。首先说下高斯模型,也就是正态分布模型。

    这里面 \mu 表示平均数, \sigma 表示方差,函数的公式是

    f(x)=\frac{1}{\sigma \sqrt{2\pi}}e^{- \frac{{(x-\mu)}^2}{2\sigma^2}}

    为什么又搞这个玩意呢?因为有些特征值是服从高斯分布的(正态分布),我们首先可以通过数据集里的特征值算出这个特征值服从高斯分布的平均值和方差,然后就得到了对应的高斯分布方程。以后在给定特征值 F_1=f1 时,我们就可以用这个方程去求对应的概率了,如下面代入 x = f_1,这里假定已经算出 \mu\sigma

    p(F_1=f_1|Y=y)=\frac{1}{\sigma \sqrt{2\pi}}e^{- \frac{{(f_1-\mu)}^2}{2\sigma^2}}

    这样就不用去找总数是多少,符合条件的有多少个,然后再一除得到概率值 。

    错误率

    最后应该要讲讲这个分类器的错误率了。在分两个种类时,一般使用下面的不等式去看属于 1 类还是 0 类。

    p(y=0|x) < p(y=1|x)
    p(y=0|x) > p(y=1|x)

    可视化这两个概率会得到图

    这里有两个相交的地方,红色阴影表示 False Negative,也就是本来应该判为 1 类的,这里判成了 0 类;蓝色阴影表示 False Positive,本来应该判为 0 类,但是判成了 1 类。所以我们有以下公式去算每个区域的概率

    • True Positive Rate: \frac{p(y=1, \hat{y}=1)}{p(y=1)}
    • False Positive Rate: \frac{p(y=1, \hat{y}=0)}{p(y=1)}
    • False Negative Rate: \frac{p(y=0, \hat{y}=1)}{p(y=0)}
    • True Negative Rate: \frac{p(y=0, \hat{y}=0)}{p(y=0)}

    相关文章

      网友评论

        本文标题:机器学习: 贝叶斯分类器

        本文链接:https://www.haomeiwen.com/subject/mesteqtx.html