机器学习-贝叶斯分类器附Python代码

1. 贝叶斯原理

Naive Bayes 官方网址:
https://scikit-learn.org/stable/modules/naive_bayes.html

贝叶斯分类是以贝叶斯定理为基础的一种分类算法,其主要思想为:先验概率+新的数据=后验概率
已知某条件概率,如何得到事件交换后的概率;即在已知P(B|A)的情况下求得P(A|B)。条件概率P(B|A)表示事件A已经发生的前提下,事件B发生的概率。其基本求解公式为:P(B|A)=P(AB)/P(A)。
贝叶斯定理:

在这里插入图片描述

例如:
从家里去公司上班有三种交通方式打车、坐地铁和乘公交,对应概率为P(A1)=0.5、P(A2)=0.3、P(A3)=0.2,在已知每种方式下上班迟到的概率分别为:打车迟到:P(B|A1)=0.2,坐地铁迟到:P(B|A2)=0.4,乘公交迟到P(B|A3)=0.7,求解,若上班迟到了,是打车方式的概率是多少,即求解P(A1|B)。

在这里插入图片描述

其中:

  • P(A1)、P(A2)、P(A3)为先验概率
  • 加入新的条件,即上班迟到了P(B)
  • P(A1|B)为后验概率

全概率公式:

在这里插入图片描述

随机事件A1,A2,…An构成完备事件(互斥,且至少有一个发生),随机事件B伴随着该完备事件的发生而发生

在这里插入图片描述

故:
迟到的概率

在这里插入图片描述

迟到且采用打车方式上班的概率

在这里插入图片描述

2. 贝叶斯分类器

朴素贝叶斯方法是基于贝叶斯定理的一组有监督学习算法,即“简单”地假设每对特征之间相互独立。 给定一个类别 y 和一个从 x_1 到 x_n 的相关的特征向量, 贝叶斯定理阐述了以下关系:

在这里插入图片描述

使用简单(naive)的假设-每对特征之间都相互独立:

P(x_i | y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i | y) ,

对于所有的 :i 都成立,这个关系式可以简化为

在这里插入图片描述

由于在给定的输入中 P(x_1, \dots, x_n) 是一个常量,我们使用下面的分类规则:

在这里插入图片描述

我们可以使用最大后验概率(Maximum A Posteriori, MAP) 来估计 P(y) 和 P(xi | y) ; 前者是训练集中类别 y 的相对频率。

各种各样的的朴素贝叶斯分类器的差异大部分来自于处理 P(xi | y)分布时的所做的假设不同。

尽管其假设过于简单,在很多实际情况下,朴素贝叶斯工作得很好,特别是文档分类和垃圾邮件过滤。这些工作都要求 一个小的训练集来估计必需参数。

相比于其他更复杂的方法,朴素贝叶斯学习器和分类器非常快。 分类条件分布的解耦意味着可以独立单独地把每个特征视为一维分布来估计。这样反过来有助于缓解维度灾难带来的问题。

另一方面,尽管朴素贝叶斯被认为是一种相当不错的分类器,但却不是好的估计器(estimator),所以不能太过于重视从 predict_proba 输出的概率。

朴素贝叶斯分类器是一种有监督学习,常见有五种算法,这五种算法适合应用在不同的数据场景下,我们应该根据特征变量的不同选择不同的算法,下面是一些常规的区别和介绍。

2.1. 高斯朴素贝叶斯

GaussianNB 实现了运用于分类的高斯朴素贝叶斯算法,特征的可能性(即概率)假设为高斯分布,适用于连续变量。

在这里插入图片描述

2.2. 多项分布朴素贝叶斯

MultinomialNB 实现了服从多项分布数据的朴素贝叶斯算法,适用于离散变量。在计算先验概率和条件概率时,使用平滑过的最大似然估计法来估计,为在学习样本中没有出现的特征而设计,以防在将来的计算中出现0概率输出。

2.3. 补充朴素贝叶斯

ComplementNB 实现了补充朴素贝叶斯(CNB)算法。CNB是标准多项式朴素贝叶斯(MNB)算法的一种改进,适用于不平衡数据集。具体来说,CNB使用来自每个类的补数的统计数据来计算模型的权重。CNB的发明者的研究表明,CNB的参数估计比MNB的参数估计更稳定。此外,CNB在文本分类任务上通常比MNB表现得更好(通常有相当大的优势)。

2.4. 伯努利朴素贝叶斯

BernoulliNB 实现了用于多重伯努利分布数据,要求样本以二元值特征向量表示,如果样本含有其他类型的数据, 一个 BernoulliNB 实例会将其二值化(取决于 binarize 参数)。

伯努利朴素贝叶斯的决策规则基于:

在这里插入图片描述

与多项分布朴素贝叶斯的规则不同 伯努利朴素贝叶斯明确地惩罚类 y 中没有出现作为预测因子的特征 i ,而多项分布分布朴素贝叶斯只是简单地忽略没出现的特征。

2.5. 基于外存的朴素贝叶斯模型拟合

朴素贝叶斯模型可以解决整个训练集不能导入内存的大规模分类问题。 为了解决这个问题, MultinomialNB, BernoulliNB, 和 GaussianNB 实现了 partial_fit 方法,可以动态的增加数据,使用方法与其他分类器的一样,使用示例见 Out-of-core classification of text documents 。所有的朴素贝叶斯分类器都支持样本权重。

与 fit 方法不同,首次调用 partial_fit 方法需要传递一个所有期望的类标签的列表。

3.代码示例

本例使用高斯朴素贝叶斯分类器对iris数据集进行花分类,具体代码如下:

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from sklearn import metrics
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn import datasets

class bayes_model():
    def __int__(self):
        pass
    def load_data(self):
        data = datasets.load_iris()
        iris_target = data.target
        iris_features = pd.DataFrame(data=data.data, columns=data.feature_names)
        train_x, test_x, train_y, test_y = train_test_split(iris_features, iris_target, test_size=0.3, random_state=123)
        return train_x, test_x, train_y, test_y
    def train_model(self, train_x, train_y):
        clf = GaussianNB()
        clf.fit(train_x, train_y)
        return clf
    def proba_data(self, clf, test_x, test_y):
        y_predict = clf.predict(test_x)
        y_proba = clf.predict_proba(test_x)
        accuracy = metrics.accuracy_score(test_y, y_predict) * 100
        tot1 = pd.DataFrame([test_y, y_predict]).T
        tot2 = pd.DataFrame(y_proba).applymap(lambda x: '%.2f' % x)
        tot = pd.merge(tot1, tot2, left_index=True, right_index=True)
        tot.columns=['y_true', 'y_predict', 'predict_0', 'predict_1', 'predict_2']
        print('The accuracy of Testset is: %d%%' % (accuracy))
        print('The result of predict is: \n', tot.head())
        return accuracy, tot
    def exc_p(self):
        train_x, test_x, train_y, test_y = self.load_data()
        clf = self.train_model(train_x, train_y)
        res = self.proba_data(clf, test_x, test_y)
        return res

if __name__ == '__main__':
    bayes_model().exc_p()

部分结果截图:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340