大数跨境
0
0

如何通俗理解朴素贝叶斯

如何通俗理解朴素贝叶斯 数据分析学习与实践
2024-03-08
0
导读:用 scikit-learn 中的高斯方法解决鸢尾花数据集问题。在这篇文章中,我们将深入研究一种特殊的分类器--朴素贝叶斯分类器。

用 scikit-learn 中的高斯方法解决鸢尾花数据集问题。

在这篇文章中,我们将深入研究一种特殊的分类器--朴素贝叶斯分类器。这些方法依赖于贝叶斯定理和朴素假设,即在给定类别标签的条件下,特征之间都是条件独立的。如果这对你来说不太理解,继续阅读吧!

作为一个Demo示例,我们将使用总所周知的鸢尾花数据集,以及特殊类型的朴素贝叶斯分类器,称为高斯朴素贝叶斯分类器。请记住,鸢尾花数据集由 4 个数值特征组成,目标可以是 3 种鸢尾花的任何一种(山鸢尾、杂色鸢尾、维吉尼亚鸢尾)。

我们将把这个方法分解为以下步骤:

1_LWbqBJ_LsZNbBEiF8DN_eQ.png
  1. 回顾贝叶斯定理:该定理提供了一个数学公式,使我们能够估计一个给定样本属于任何类别的概率。

  2. 我们可以通过比较该样本属于每个类别的概率来创建一个分类器,这是一种返回输入样本预测类别的工具。

  3. 利用链式法则和条件独立性假设,我们能够简化概率公式。为了计算这些概率,我们再使用另一个假设:特征分布是高斯的。

  4. 通过使用训练集,我们可以估计这些高斯分布的参数。最终,我们拥有了所有需要预测新样本类别的工具。

步骤 1:贝叶斯定理

贝叶斯定理是一个概率定理,其内容如下:

  • P(A|B) 是在已知 B 为真(或 B 发生)的条件下 A 为真(或 A 发生)的概率,也被称为在已知 B 为真之后 A 为真的后验概率(后验:在我们知道 B 为真之后更新了 A 为真的概率)。
  • P(B|A) 是在已知 A 为真的条件下 B 为真的概率。
  • P(A)P(B) 是在不知道其他任何信息的情况下 AB 为真的概率,也被称为先验概率和边际概率。

我们也把它写成:

让我们用不同的字母写出相同的等式:

其中:

  • ,事实上 y 为 类的概率
  • X  ( )  表示矢量样本等于考虑样本的事件 ( )

因此,我们可以用以下方法计算样本 属于 类别的概率:

如果我们知道每个 , and

步骤 2:利用贝叶斯定理预测

正如我们将看到的更多细节,朴素分类器的工作方式只是计算所有已知类别 的概率 ,再返回概率最高的类别。

假设我们正在处理虹膜数据集, 其中一朵花可以属于 3 个类别,我们必须计算一个样本 x=( ,并进行对比。

步骤 3: 简化概率公式

在这一步中,我们的目标是通过移除 项并计算类别先验概率来简化概率公式。此外,我们将利用条件独立性假设来简化剩余的项。

获取 p(x)

首先,我们可以注意到分母对于所有类别都是相同的:P(X)。由于这对所有类别都相同,并且我们只关心比较每个类别的条件概率,我们可以舍弃这一项。

另一种表达方式是在二分类问题的背景下:为了比较给定样本x 的条件概率,我们可以计算两个可能类别之间的比率:

那么预测规则就是:

由于我们可以舍弃分母,我们的鸢尾花分类问题变成了计算和比较:

计算群体的先验

最简单的方法是只使用类的数量计算每个类的先验 ,并假设类是等价的:对于 3 个类,

但这种方法对我们的问题没有任何价值,因为在比较条件概率时,这个项会消失(或抵消)。

相反,我们可以使用训练集中的数据来估计概率,方法是:

对于我们的鸢尾花问题:

条件概率和天真拯救了我们

最终,我们需要计算所有 对应的似然项

在这里,x 是一个多变量变量,我们可以递归地使用链式法则(不做特殊假设)来写出:

然后,利用条件独立性假设,乘积中的每一项都被简化为:

因此,请记住,只使用条件独立假设,我们就可以得到:

第 4 步:根据高斯假设计算似然值

通过高斯分布进行简化:

因此,为了得到我们想要比较的给定样本 x 属于3个类别的概率,我们需要计算所有 ,这样我们就可以计算乘积:

因此,问题是:我们如何计算对于所有特征 ,对于所有类别

这些术语可以翻译成通俗易懂的话:在样本属于 类的情况下,样本等于 的概率是多少。

例如,p(萼片长度=1.2|setosa)是setosa 样本的萼片长度等于 1.2 的概率。

为了用数字计算这种概率,我们将依赖于一个额外的假设:我们将假定每个类别的分布都是由(多元)高斯分布给出的。

例如,在具有 4 个特征的分类问题中,我们假设每个类别的每个特征都遵循高斯分布。也就是说,仅萼片长度特征就有 3 个高斯分布。

其他三个特征也是如此。

步骤 5:估计高斯参数

1_MZEZAGGRVblnFH-cW5StoQ.png

粗略地说,这个过程有两个方面,利用训练集来"学习"分布:

  1. 将训练集按类别分成 3 个训练子集(setosa 训练样本、versicolor 训练样本和 virginica 训练样本)。
  2. 估算高斯分布参数:为每个子集和每个特征计算平均值和标准偏差。这样做的目的是为了估算每个类别中每个特征的假定高斯分布的基本真实平均值和标准偏差。
1_vod2Qzt5jhY3hUVQVVEAmA.png

步骤 6:预测新样本的类别

1_-6TxQ5K_s6L500CJGKCzCQ.png

事实上,我们可以使用样本值(x_1, x_2, ...)和假定的概率密度函数计算条件概率。换句话说,在我们的高斯朴素贝叶斯中,我们可以计算:

由于我们已经知道了先验概率,因此我们可以计算、比较并选择最高概率:我们刚刚使用高斯直觉贝叶斯分类器进行了预测。

Let's python!

让我们用 python 将上述过程可视化。

首先,让我们加载数据集,将其分为训练集和测试集,然后用 seaborn 绘制训练数据:

%matplotlib qt  import numpy as np  import pandas as pd  import matplotlib.pyplot as plt  import seaborn as sns  from sklearn.datasets import load_iris  from sklearn.model_selection import train_test_split    X, y = load_iris(return_X_y=True, as_frame=True)  target_map = {0:"setosa",1:"versicolor",2:"virginica"}  y = y.map(target_map).astype('category')    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=3, stratify=y)    df_train = pd.concat([X_train, y_train], axis=1)  g = sns.pairplot(df_train, hue='target')
1_CB6MkuPoYcR62xTHyfpWOA.png

然后,我们可以直观地看到每个类别、每个特征的高斯拟合分布。这样,我们就可以检查这些分布是否真的像高斯分布,并估算出它们的均值/方差。现在,我们自己来做这件事,但使用 scikit-learn 的高斯奈何贝叶斯模型,均值和 std 会在引擎盖下计算,并作为系数存储在模型中。

df_melt = df_train.melt(  id_vars=["target"], value_vars=['petal length (cm)', 'petal width (cm)', 'sepal length (cm)', 'sepal width (cm)'],  value_name='value', var_name='feature')    g = sns.FacetGrid(df_melt, col="feature", hue="target", sharex=False, sharey=False)  g.map(sns.kdeplot, 'value', linestyle="--", legend=True)    from scipy.stats import norm    def fit_gaussian(data, color, **kwargs):  mu, std = norm.fit(data)  xmin, xmax = data.min(), data.max()  x = np.linspace(xmin, xmax, 100)  p = norm.pdf(x, mu, std)  plt.plot(x, p, 'k', linewidth=2, color=color)  x_max = x[np.argmax(p)]  y_max = norm.pdf(x_max, mu, std)  plt.text(x_max, y_max, f"({mu:.1f};{std**2:.1f})", color=color, size=8, ha='center', va='bottom')    g.map(fit_gaussian, 'value')    for ax in g.axes.flatten():  ax.set_xlabel('')  ax.set_ylabel('')  g.add_legend()

现在让我们使用 scikit-learn 的高斯天真贝叶斯模型进行拟合和预测。首先,我们只需导入并拟合模型。然后我们可以回顾一下

  • 类的先验(在 `.class_prior_` 中
  • .var_`中每个(特征/类)的方差
  • .theta//`中每个(特征/类)的平均值

请记住,在 scikit-learn 中,学习到的参数是以 _ 结尾的属性存储的。

from sklearn.naive_bayes import GaussianNB    gnb = GaussianNB()  gnb.fit(X_train, y_train)  print(gnb.class_prior_)  print(gnb.var_)  print(gnb.theta_)
[0.33333333 0.33333333 0.33333333]  [[0.12406498 0.14367347 0.03012912 0.01106206]  [0.26634736 0.09020408 0.21961683 0.03754269]  [0.37859226 0.1033736 0.27714286 0.07541858]]  [[5.00408163 3.42857143 1.46122449 0.24693878]  [5.93469388 2.75714286 4.25510204 1.32040816]  [6.56530612 2.97755102 5.52857143 2.02653061]]

您可以将这些值与上述拟合分布图上显示的值进行比较。

为了完整起见,让我们使用交叉验证来估算高斯直觉贝叶斯模型的准确性。请注意,数据集不需要太多预处理,因为特征已经是数值型的,不包含缺失值或异常值,而且看起来像高斯分布。

from sklearn.naive_bayes import GaussianNB  from sklearn.datasets import load_iris  from sklearn.model_selection import cross_validate, StratifiedKFold    X, y = load_iris(return_X_y=True, as_frame=True)    cv_results = cross_validate(  GaussianNB(),  X,  y,  scoring="balanced_accuracy",  cv=StratifiedKFold(n_splits=10, shuffle=True),  )    print(cv_results['test_score'])  [0.73333333 1. 0.93333333 0.93333333 1. 1.  1. 0.93333333 1. 1. ]

对于这样一个简单的管道来说,这些性能已经相当不错了!需要注意的是,大多数 Naive Bayes 模型并不提供很多超参数(如果有的话,就像本例中一样)。对于其他数据集,如有必要,记得添加预处理步骤。

总结

如果您喜欢本文章,请为它点赞。

以下是本篇文章中你应该记住的内容:

  • 朴素贝叶斯分类器使用贝叶斯定理奠定数学基础,朴素假设将其简化,这样我们就可以用数字计算概率。
  • 对于任何新样本,模型都会计算它属于所有可能类别的概率,并返回概率最高的类别(这被称为最大后验决策规则)。
  • 高斯直觉贝叶斯模型(Gaussian Naive Bayes model)就是这些模型中的一种,我们假设每个特征/类别的分布都是高斯分布。这样,我们就可以轻松地学习这些分布,并将其用于以后的预测。


【声明】内容源于网络
0
0
数据分析学习与实践
数据分析,数据科学,线性代数,统计学,AI,python,可视化,excel
内容 343
粉丝 0
数据分析学习与实践 数据分析,数据科学,线性代数,统计学,AI,python,可视化,excel
总阅读65
粉丝0
内容343