机器学习——贝叶斯分类(Bayesian Classification)

一、贝叶斯分类

1、贝叶斯分类

贝叶斯分类属于有监督学习算法,基于贝叶斯公式。

2、适用场景

不能被线性分离,但是具有明显的概率分布

二、贝叶斯分类要素

1、数据

贝叶斯分类的数据即一系列自变量以及对应的因变量(分类标签)。

2、模型

  • 贝叶斯公式 

P(C_{i}|x)=\frac{P(C_{i})P(x|C_{i})}{P(x)}

其中, x为自变量,C_{i}为第i个类别,P(C_{i}|x)为x发生后属于C_{i}的后验概率,P(C_{i})为属于C_{i}的先验概率,P(x|C_{i})为x在C_{i}中的概率,P(x)为x发生的概率。

  • 模型

根据最大后验估计(MAP)

C_{i}=argmax_{i}P(C_{i}|x),

由于 P(x)为常量,所以:

 C_{i}=argmax_{i}P(C_{i})P(x|C_{i}).

对于n维自变量

x=\begin{bmatrix} x_{1} & x_{2} & ...... & x_{n} \end{bmatrix},

 P(x|C_{i})=P(x_{1},x_{2},...,x_{n}|C_{i})=P(x_{1}|C_{i})P(x_{2}|x_{1},C_{i})...P(x_{n}|x_{1},x_{2}...x_{n-1},C_{i}),

 根据朴素贝叶斯独立假设,假设所有自变量条件独立,则有:

P(x|C_{i})=P(x_{1},x_{2},...,x_{n}|C_{i})=\prod_{j=1}^{n}P(x_{j}|C_{i}),

所以朴素贝叶斯模型为:

C_{i}=argmax_{i}P(C_{i})\prod_{j=1}^{n}P(x_{j}|C_{i}).

 当类别C_{i}中存在自变量x_{j}的数量为零的属性值x_{j}^{(k)}时,则会出现零数问题,即:

P(x_{j}^{(k)}|C_{i})=0,

\prod_{j=1}^{n}P(x_{j}|C_{i})=0,

因此,通常使用拉普拉斯平滑(Laplace Smoothing),给每个属性值增加一个数量:

P(x_{j}|C_{i})=\frac{count(x_{j}^{(k)},C_{i})+1}{\sum_{x\epsilon\left | x_{j} \right |}(count(x,C_{i})+1)}

其中, count(x_{j}^{(k)},C_{i})为类别C_{i}中自变量x_{j}值为 k 时的数据数量,x为自变量x_{j}中所有的可能值情况。

3、 朴素贝叶斯算法

  • 训练阶段
  1. 外层循环:对于每一个类别C_{i} \epsilon C,计算P(C_{i})
  2. 内层循环:对于C_{i}中每一个属性x_{j}\epsilon x的每一个属性值x_{j}^{(k)},计算P(x_{j}^{(k)}|C_{i})
  • 测试阶段

C_{i}=argmax_{i}P(C_{i})\prod_{j=1}^{n}P(x_{j}|C_{i})

三、朴素贝叶斯分类实践(sklearn)

以kaggle中数据集"Ionosphere"为例

1、数据准备

直接下载使用"Ionosphere"数据集,并读取数据

import pandas as pd

dataset = pd.read_csv('./ionosphere_data.csv')  # 读取数据集ionosphere_data.csv

独热编码,相较于序数编码,可以消除数值关系,降低噪声

import category_encoders as ce

encoder = ce.OneHotEncoder(cols=['column_a', 'column_b'], use_cat_names=True).fit(
    dataset)  # 对column_a和column_b两列进行独热编码

encoder_dataset = encoder.transform(dataset)

离散化连续变量

# 对数据集中第2到第33列离散化,将每列的数值分成10个区间,并用0到9的标签替换
for i in range(2, 34):
    col = dataset.columns[i]
    encoder_dataset[col] = pd.cut(dataset[col], bins=10, labels=range(0, 10))

2、训练模型

Hold-out,划分训练集和测试集

from sklearn.model_selection import train_test_split

X = encoder_dataset.drop(['column_ai'], axis=1)  # 删除column_ai,作为特征X
y = encoder_dataset['column_ai']  # 将column_ai作为目标y

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33,
                                                    random_state=11)  # 将数据集按照33%的比例划分为训练集和测试集,设置随机种子为11

训练一个分类朴素贝叶斯分类器,强制使用拉普拉斯平滑

from sklearn.naive_bayes import CategoricalNB

CNB = CategoricalNB(force_alpha=True)  # 创建一个CategoricalNB对象,指定强制使用拉普拉斯平滑

CNB.fit(X_train, y_train)  # 使用训练集拟合分类器

3、评估模型

输出分类器分别在训练集和测试集上的准确率

print("Score of train-set : {:.4f}".format(CNB.score(X_train, y_train)))  # 打印分类器在训练集上的准确率
print("Score of test-set : {:.4f}".format(CNB.score(X_test, y_test)))  # 打印分类器在测试集上的准确率

结果如下:

Score of train-set : 0.9191
Score of test-set : 0.9310

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
贝叶斯分类算法是一种基于贝叶斯定理的统计算法,常用于文本分类、垃圾邮件过滤和数据挖掘等任务中。在对wine数据集进行分类时,我们可以使用贝叶斯分类算法。 首先,我们需要了解wine数据集的特征和标签。根据数据集的描述,wine数据集包含了一些葡萄酒的化学分析结果作为特征,以及该葡萄酒所属的类别作为标签。这些特征可以包括酒精含量、苹果酸含量、灰分含量等。 贝叶斯分类算法的核心思想是基于训练集计算每个类别的先验概率和条件概率,然后使用贝叶斯定理来计算给定特征时,每个类别的后验概率,最终选择后验概率最大的类别作为预测结果。 为了使用贝叶斯分类算法对wine数据集进行分类,我们需要进行以下步骤: 1. 数据预处理:对原始数据进行清洗和处理,包括去除缺失值、标准化特征等。 2. 特征选择:根据具体问题的要求,选择合适的特征来训练模型,可以使用相关性分析等方法进行特征选择。 3. 训练模型:将数据集分成训练集和测试集,使用训练集来计算每个类别的先验概率和条件概率。 4. 预测分类:对测试集中的每个样本,根据贝叶斯定理计算该样本属于每个类别的后验概率,选择后验概率最大的类别作为预测结果。 5. 模型评估:使用测试集评估模型的性能,可以使用准确率、精确率、召回率等指标来评估模型的好坏。 贝叶斯分类算法的优点是简单、直观,能够处理多分类问题和高维数据。然而,贝叶斯分类算法也有一些限制,例如对特征之间的关联性要求较高,对输入的先验概率分布有一定假设等。 在应用贝叶斯分类算法对wine数据集进行分类时,我们需要根据具体情况选择适合的特征和合适的先验分布,对模型进行调优,以获得更好的分类结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习啊ZzZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值