高斯朴素贝叶斯分类器教程

在本教程中,将探讨如何使用Python实现高斯朴素贝叶斯分类器。这需要对Python有一定的了解,并且对机器学习分类器的基本原理有所掌握。将涉及到Pandas(面板数据)和NumPy(数值Python)包的基本概念。在统计学中,特别是涉及到概率时,高斯朴素贝叶斯定理是一个非常流行且引人入胜的理论。贝叶斯定理允许在拥有与特定事件相关的先验知识和信息的情况下,计算事件发生的概率。

机器学习背景下,朴素贝叶斯公式略有不同,但其核心思想仍然保持不变。由于机器学习中可能存在多个特征,高斯朴素贝叶斯公式已经演变为以下形式:

为了本练习,将使用“鸢尾花数据集”。这个数据集可以在UCI机器学习库中下载。首先导入必要的包:

import pandas as pd import numpy as np

然后,使用pandas的“read_csv”方法将数据加载到系统中。pandas的“read_csv”方法默认会将数据转换为dataframe。Dataframe是一个类似电子表格的对象,具有行和列以及行索引和列名。

dataframe = pd.read_csv('iris_dataset.csv')

在查看数据之前,先查看dataframe的一些属性,间接地了解数据。查看dataframe的形状。“shape”方法将返回一个包含两个整数值的元组——第一个值表示行数,第二个值表示列数。

print('The DataFrame Contains %d Rows And %d Columns' % (dataframe.shape))

接下来,将检查每个特征包含的数据类型。使用“dtypes”方法。从下面的图像中,可以看到dataframe包含五个特征。其中四个特征包含浮点值,一个包含对象数据类型。

print(dataframe.dtypes)

然后,将检查列是否包含空值。“空”值指的是缺失的值或记录。为此,使用“info”方法。此方法为提供了关于dataframe的有趣信息。

print(dataframe.info())

现在已经对数据有了足够的了解,让查看dataframe的一部分。为此,pandas有一个内置方法叫做“head”。默认情况下,此方法将返回dataframe的前五行。但是,可以通过在括号内显式输入一个值来选择想要返回的行数。

print(dataframe.head(7))

如上所述,现在能够查看dataframe中的原始值。对于这个问题,希望根据其他特征的值来预测一朵花可能属于的物种。因此,是时候将dataframe分割成特征矩阵和目标向量了。这需要操作dataframe,正是在这种情况下,pandas的索引器非常有用。特别是“loc”和“iloc”索引器。

features = dataframe.iloc[:, 0:4]

如上所述,特征矩阵已经创建。它通过选择dataframe的所有行(冒号(:)表示全部)从第零列(记住Python是从零开始索引的,这意味着第一个元素被赋予值为0而不是1)直到第四列来创建的,正如所知,Python不包括结束值。因此,实际上选择了所有行和第零列到第三列。让现在打印特征矩阵的前几行。

print(features.head())

正如预期的那样,观察到特征矩阵中只有四个特征/列。现在,继续到目标向量——是时候隔离这些值了。

target = dataframe.iloc[:, -1]

再次,使用“iloc”索引器。然而,这次选择dataframe的所有行,但只有最后一列。在Python的列表、数组等中,可以使用负索引值从列表、数组等的末尾索引元素——如果从反向索引,可以从负一开始(-1)。因此,只选择最后一列的所有行作为目标向量。让查看目标向量中存储的数据。

print(target.head())

如上所述,可以确认到目前为止已经走在正确的道路上。已经成功地将数据加载到系统中,对数据有了洞察,看到了正在处理的数据的性质和类型,并且配置了特征矩阵和目标向量。让确认最初的dataframe、新特征矩阵和目标向量的形状。

print('The Initial DataFrame Contained %d Rows And %d Columns' % (dataframe.shape)) print('The Features Matrix Contains %d Rows And %d Columns' % (features.shape)) print('The Target Vector Contains %d Rows And %d Columns' % (np.array(target).reshape(-1, 1).shape))

如预期,dataframe最初包含五个列,决定预测“物种”,因此给目标向量——它包含一列,因此留下四个特征,在特征矩阵中看到。现在将实例化一个高斯朴素贝叶斯,但首先,需要导入所需的包。

from sklearn.naive_bayes import GaussianNB algorithm = GaussianNB(priors=None, var_smoothing=1e-9)

已经设置了想要的参数和超参数(默认值)。接下来,进行训练过程。为此训练过程,使用“fit”方法,传入希望训练模型的数据,即特征矩阵和目标向量。在此过程中,模型学习如何尽可能好地利用特征矩阵中的值以达到最接近的预期结果。

algorithm.fit(features, target)

一旦训练过程完成,可以查看模型训练预测的不同类别的数量。使用“classes_”方法。

print(algorithm.classes_)

从上述输出中,观察到模型被训练来预测一朵花可能属于的鸢尾花物种。数据集中存在三种不同的物种,分别是“Setosa”,“Versicolor”,“Virginia”。为了信息,让查看训练模型的准确性。为此,有“score”方法。

print('The Gaussian Model Has Achieved %.2f Percent Accuracy' % (algorithm.score(features, target)))

现在,让创建一个随机观测来测试模型是否有效。创建一个观测并使用“predict”方法来预测未来的问题。有两个维度的数组中有四个值的原因是必须为特征矩阵中的每个特征传入一个值——特征矩阵包含四个特征——因此为每个特征传入一个值。根据传递给模型的值,模型使用概率公式来识别它最有可能属于哪个物种。

observation = [[5.0, 3.7, 1.6, 0.1]] predictions = algorithm.predict(observation) print(predictions)

现在将打印出预测的植物物种。模型预测这朵花属于“Setosa”物种的鸢尾花。让看看模型的确定性。

print(algorithm.predict_proba(observation).round())
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485