贝叶斯分类是一种统计学分类方法,基于贝叶斯定理,对给定的数据集进行分类。
它的历史可以追溯到18世纪,当时英国统计学家托马斯·贝叶斯发展了贝叶斯定理,这个定理为统计决策提供了理论基础。

不过,贝叶斯分类在实际应用中的广泛使用是在20世纪80年代,当时计算机技术的进步使得大规模数据处理成为可能。

1. 算法概述

贝叶斯分类基于贝叶斯公式,通过已知样本信息来计算未知样本属于各个类别的概率,然后选择概率最大的类别作为未知样本的分类结果。

贝叶斯公式的简化公式:\(P(A|B) = \frac{P(B|A)P(A)}{P(B)}\)
其中:

  1. \(P(A)\):事件A发生的概率
  2. \(P(B)\):事件A发生的概率
  3. \(P(A|B)\):在事件B出现的前提下,A发生的概率
  4. \(P(B|A)\):在事件A出现的前提下,B发生的概率

贝叶斯分类就是基于这个公式扩展而来。
比如,一个具有\(n\)个特征的样本\(x = (x_1, x_2, ..., x_n)\),该样本属于K个可能的类别\(y_1,y_2,...,y_k\)。
那么,任一个样本\(x\)属于某个类别\(y_k\)的概率为:\(P(y_k|x) = \frac{P(X|y_k)P(y_k)}{P(x)}\)
根据这个模型,训练样本之后,就可以根据模型来预测某个样本属于哪个类别概率最大

这里讨论的贝叶斯分类算法,并没有考虑特征之间的关联关系,我们假设每个特征之间是相互独立的。
所以,这个算法也叫做朴素贝叶斯分类

2. 创建样本数据

贝叶斯分类可以
这次用scikit-learn中的样本生成器make_classification来生成分类用的样本数据。

import matplotlib.pyplot as plt
from sklearn.datasets import make_classification # 分类数据的样本生成器
X, y= make_classification(n_samples=1000, n_classes=4, n_informative=3)
plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25) plt.show()


关于样本生成器的详细内容,请参考:TODO

3. 模型训练

训练之前,为了减少算法误差,先对数据进行标准化处理(将数据缩放到0~100之间)。

from sklearn import preprocessing as pp

# 数据标准化
X = pp.minmax_scale(X, feature_range=(1, 100))
y = pp.minmax_scale(y, feature_range=(1, 100))

然后,分割训练集测试集

from sklearn.model_selection import train_test_split

# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

按照8:2的比例来划分训练集和测试集。

scikit-learn中的朴素贝叶斯算法支持多种不同的分类器,
这些分类器基于不同的先验概率分布,适用于不同的数据类型和问题场景。
我们训练模型的时候要根据数据情况选择合适的分类器。

from sklearn.naive_bayes import (
GaussianNB,
MultinomialNB,
ComplementNB,
BernoulliNB,
CategoricalNB,
) reg_names = [
"高斯朴素贝叶斯",
"多项式朴素贝叶斯",
"补码朴素贝叶斯",
"伯努利朴素贝叶斯",
"分类朴素贝叶斯",
] # 定义
regs = [
GaussianNB(),
MultinomialNB(),
ComplementNB(),
BernoulliNB(),
CategoricalNB(min_categories=101),
] # 训练模型
for reg in regs:
reg.fit(X_train, y_train)

各个分类器的简要说明:

  1. GaussianNB:基于高斯分布的朴素贝叶斯分类器。它假设每个特征服从高斯分布,即正态分布。这种分类器适用于连续型数据,特别是对于数值型特征。
  2. MultinomialNB:基于多项式分布的朴素贝叶斯分类器。它假设每个特征服从多项式分布,适用于离散型数据,特别是对于类别型特征。
  3. ComplementNB:基于互补分布的朴素贝叶斯分类器。它适用于离散型数据,特别是对于二元分类问题。
  4. BernoulliNB:基于伯努利分布的朴素贝叶斯分类器。它适用于二元分类问题,特别是对于二元特征或者二元输出。
  5. CategoricalNB:基于分类分布的朴素贝叶斯分类器。它适用于离散型数据,特别是对于类别型特征。

最后验证各个分类器的模型的训练效果:

# 在测试集上进行预测
y_preds = []
for reg in regs:
y_pred = reg.predict(X_test)
y_preds.append(y_pred) for i in range(len(y_preds)):
correct_pred = np.sum(y_preds[i] == y_test)
print("【{}】 预测正确率:{:.2f}%".format(reg_names[i],
correct_pred / len(y_pred) * 100)) # 运行结果
【高斯朴素贝叶斯】 预测正确率:82.50%
【多项式朴素贝叶斯】 预测正确率:75.00%
【补码朴素贝叶斯】 预测正确率:72.50%
【伯努利朴素贝叶斯】 预测正确率:22.00%
【分类朴素贝叶斯】 预测正确率:50.50%

这里虽然高斯朴素贝叶斯分类器的正确率最高,但不能就认为这种分类器是最好的。
只能说明高斯朴素贝叶斯分类器最适合分类上面随机生成的样本数据。
换成其他的样本数据,高斯朴素贝叶斯分类器的正确率就不一定是最高的了。

4. 总结

总的来说,贝叶斯分类是一种有效的分类方法,适用于对未知样本进行分类的问题。
它的应用范围广泛,可以处理多分类问题,也可以用于连续变量的分类。

贝叶斯分类算法的主要优势在于:

  1. 是一种概率模型,可以给出分类结果的概率,因此更加可靠和稳定。
  2. 可以处理多分类问题,也可以用于连续变量的分类
  3. 实现相对简单,可以在较短的时间内训练出模型并进行预测。

贝叶斯分类算法也有其不足之处:

  1. 假设所有特征之间相互独立,但在实际应用中这个假设往往不成立,因此会影响分类结果的准确性。
  2. 对于大规模的数据集,训练时间和预测时间可能会较长
  3. 对于数据的缺失和异常值处理不够鲁棒,可能会对分类结果产生影响。

【scikit-learn基础】--『监督学习』之 贝叶斯分类的更多相关文章

  1. Python基础『一』

    内置数据类型 数据名称 例子 数字: Bool,Complex,Float,Integer True/False; z=a+bj; 1.23; 123 字符串: String '123456' 元组: ...

  2. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  3. 『cs231n』计算机视觉基础

    线性分类器损失函数明细: 『cs231n』线性分类器损失函数 最优化Optimiz部分代码: 1.随机搜索 bestloss = float('inf') # 无穷大 for num in range ...

  4. Scikit Learn: 在python中机器学习

    转自:http://my.oschina.net/u/175377/blog/84420#OSC_h2_23 Scikit Learn: 在python中机器学习 Warning 警告:有些没能理解的 ...

  5. [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装

    [原创] [2014.12.02更新网盘链接]基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装 joinlidong 发表于 2014-11-29 14:25:50 ...

  6. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  7. 『TensorFlow』批处理类

    『教程』Batch Normalization 层介绍 基础知识 下面有莫凡的对于批处理的解释: fc_mean,fc_var = tf.nn.moments( Wx_plus_b, axes=[0] ...

  8. 『TensorFlow』梯度优化相关

    tf.trainable_variables可以得到整个模型中所有trainable=True的Variable,也是自由处理梯度的基础 基础梯度操作方法: tf.gradients 用来计算导数.该 ...

  9. 『TensorFlow』模型保存和载入方法汇总

    『TensorFlow』第七弹_保存&载入会话_霸王回马 一.TensorFlow常规模型加载方法 保存模型 tf.train.Saver()类,.save(sess, ckpt文件目录)方法 ...

  10. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

随机推荐

  1. 好用!这些工具国庆一定要研究下「GitHub 热点速览」

    再过 3 天就要开始一年最长的假期--国庆长假了,这次除了宅家.出游之外,多了一个新选项:研究下哪些项目可以安排上,来辅助自己的日常开发. 你觉得一周获得 4k star 的 hyperdx 如何,它 ...

  2. DevOps平台建设的关键点是什么?

    关键还是在人 找到一个「吃过猪肉,见过猪跑的」,你问他什么是猪,他自然比「没吃过猪肉,没见过猪跑的人」更了解猪.海豚海豚,你知道猪是什么样么?它都没上过陆地,这辈子都没见过猪,它哪知道猪是什么样. 有 ...

  3. 【开源】给ChatGLM写个,Java对接的SDK

    作者:小傅哥 - 百度搜 小傅哥bugstack 博客:bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 大家好,我是技术UP主小傅哥. 清华大学计算机系的超大规模训练模型 Cha ...

  4. salesforce零基础学习(一百三十三)ListView的button思考

    本篇参考: salesforce零基础学习(九十五)lightning out salesforce零基础学习(一百一十)list button实现的一些有趣事情 https://help.sales ...

  5. 手撕Vue-实现事件相关指令

    经过上一篇文章的学习,实现了界面驱动数据更新,接下来实现一下其它相关的指令,比如事件相关的指令,v-on 这个指令的使用频率还是很高的,所以我们先来实现这个指令. v-on 的作用是什么,是不是可以给 ...

  6. 使用 mt19937 生成区间随机数

    #include <cstdio> #include <random> #include <ctime> using namespace std; int main ...

  7. win10如何美化cmd[添加新字体+配色方案+窗口栏样式]

    最近学mysql的时候用到很多cmd操作,但是cmd那默认界面实在是丑到没朋友.在网上收集了些资料最后把cmd美化成这样: 修改方法: 1.修改字体,新建一个txt文件,里面粘贴以下代码: Windo ...

  8. ics-06

    打开题目界面有点科技感,然后找到报表中心的位置 url地方出现了一个奇怪的id,试了下sql注入但是没报错,判断应该不是sql注入,然后就坐牢了 看了wp得在id的地方进行爆破 爆破了1-2500可以 ...

  9. Java 删除PDF页面 (免费工具分享)

    对PDF页面的增删通常需要借助专门的工具,而这些工具一般需要付费才能使用.那么我们可以通过Java代码免费实现这一功能吗?答案是肯定的.这篇文章就教大家如何使用一个免费的国产Java库来删除PDF中的 ...

  10. js判断字符串数据类型

    mounted() { this.isJSON('{"key":1232,"a":2},{"key":1232,"a": ...