朴素贝叶斯分类器python_python实现高斯朴素贝叶斯分类器

在这篇文章中,我们将使用我最喜欢的机器学习库scikit-learn在Python中实现朴素贝叶斯分类器。接下来,我们将使用经过训练的朴素贝叶斯(监督分类法)模型来预测人口收入。
在朴素贝叶斯分类器的文章中我们讨论了贝叶斯定理,我们希望你对贝叶斯定理的基础知识有一定的了解,如果没有让我们快速地看看贝叶斯定理的基本知识。
贝叶斯定理是基于条件概率。条件概率可以帮助我们通过已经发生的事情来计算将要发生的事情。如果你不明白,让我们通过以下例子帮助你理解。
条件概率举例
下面的例子将帮助我们明白条件概率的定义。当你已经买了iPhone,你会买mac book
当你去电影院的时候,你会拿一杯清爽的饮料
当你带来一杯冰镇饮料,你会买花生

朴素贝叶斯分类器是通过贝叶斯定理来正常工作。朴素贝叶斯分类器假定所有的特征是彼此独立的,即使特征彼此依赖或者取决于其他特征的存在。 朴素贝叶斯分类器认为所有这些属性独立的为用户购买MacBook的概率做贡献。
为了学习朴素贝斯定理的关键概念。你可以阅读我们的介绍贝叶斯定理的文章。这将有助于你理解与朴素贝叶斯有关的核心概念。
在介绍朴素贝叶斯定理的文章中,我们讨论了三种流行的朴素贝叶斯算法:高斯朴素贝叶斯
多项式朴素贝叶斯
伯努利朴素贝叶斯
作为朴素贝叶斯定理文章的扩展,现在我们将在“人口收入”数据集上实现高斯朴素贝叶斯。
高斯朴素贝叶斯
高斯朴素贝叶斯算法是一种特殊类型的NB算法,它特别用于当特征具有连续值时。同时假定所有特征都遵循高斯分布,即正态分布。
人口普查收入数据集
人口普查收入数据集是预测一个人的收入是否超过$ 50K /年(大于$ 50K /年)或<= $="" 50k="" 。数据由barry="">=>
这个数据集是UCI存储库贡献的,它在这个链接公开。 数据集由15列离散和连续数据的混合组成。
Variable NameVariable Range
1.age[17 – 90]
2.workclass[‘State-gov’, ‘Self-emp-not-inc’, ‘Private’, ‘Federal-gov’, ‘Local-gov’, ‘Self-emp-inc’, ‘Without-pay’, ‘Never-worked’]
3.fnlwgt[77516- 257302]
4.education[‘Bachelors’, ‘HS-grad’, ’11th’, ‘Masters’, ‘9th’, ‘Some-college’, ‘Assoc-acdm’, ‘Assoc-voc’, ‘7th-8th’, ‘Doctorate’, ‘Prof-school’, ‘5th-6th’, ’10th’, ‘1st-4th’, ‘Preschool’, ’12th’]
5.education_num[1 – 16]
6.marital_status[‘Never-married’, ‘Married-civ-spouse’, ‘Divorced’, ‘Married-spouse-absent’, ‘Separated’, ‘Married-AF-spouse’, ‘Widowed’]
7.occupation[‘Adm-clerical’, ‘Exec-managerial’, ‘Handlers-cleaners’, ‘Prof-specialty’, ‘Other-service’, ‘Sales’, ‘Craft-repair’, ‘Transport-moving’, ‘Farming-fishing’, ‘Machine-op-inspct’, ‘Tech-support’, ‘Protective-serv’, ‘Armed-Forces’, ‘Priv-house-serv’]
8.relationship[‘Not-in-family’, ‘Husband’, ‘Wife’, ‘Own-child’, ‘Unmarried’, ‘Other-relative’]
9.race[‘White’, ‘Black’, ‘Asian-Pac-Islander’, ‘Amer-Indian-Eskimo’, ‘Other’]
10.sex[‘Male’, ‘Female’]
11.capital_gain[0 – 99999]
12.capital_loss[0 – 4356]
13.hours_per_week[1 – 99]
14.native_country[‘United-States’, ‘Cuba’, ‘Jamaica’, ‘India’, ‘Mexico’, ‘South’, ‘Puerto-Rico’, ‘Honduras’, ‘England’, ‘Canada’, ‘Germany’, ‘Iran’, ‘Philippines’, ‘Italy’, ‘Poland’, ‘Columbia’, ‘Cambodia’, ‘Thailand’, ‘Ecuador’, ‘Laos’, ‘Taiwan’, ‘Haiti’, ‘Portugal’, ‘Dominican-Republic’, ‘El-Salvador’, ‘France’, ‘Guatemala’, ‘China’, ‘Japan’, ‘Yugoslavia’, ‘Peru’, ‘Outlying-US(Guam-USVI-etc)’, ‘Scotland’, ‘Trinadad&Tobago’, ‘Greece’, ‘Nicaragua’, ‘Vietnam’, ‘Hong’, ‘Ireland’, ‘Hungary’, ‘Holand-Netherlands’]
15.income[‘<=50k’, ‘="">50K’]=50k’,>
最终目标变量由两个值组成:'<=>=>
高斯NB在人口普查收入数据集上的应用
导入python机器学习库
我们需要导入pandas, numpy 和 sklearn库,我们需要从sklearn.preprocessing导入Imputer,Imputer包有助于插补缺失值。
如果你没有安装python机器学习库,您可以先安装它再来运行本文中的代码。

train_test_split模块用于将数据集拆分成训练和测试集。accuracy_score模块将用于计算我们的高斯朴素贝叶斯算法的精度。
数据导入
对于人口普查的数据导入,我们使用pandas read_csv方法。 这是一种非常简单和快速的导入数据的方法。
我们传递四个参数。 'adult.data'参数是文件名。 header参数用于向pandas提供有关第一行数据是否包含头的详细信息。 在我们的数据集中,没有标题。 所以,我们传递None。
delimiter参数用于为信息提供分隔数据的定界符。 这里,我们使用'*,*'分隔符。 此分隔符包含了数据值前后的空格。 当与数据值一起使用的空格不总是相同个数时,这是非常有帮助。
让我们向我们的数据框架添加标题。 以下代码段可用于执行此任务
处理缺失数据
让我们测试在我们的数据集中是否有任何空值。 我们可以使用is方法。
脚本输出

上面的输出显示在我们的数据集中没有空值。
让我们测试任何分类属性是否包含'?'。 有时存在'?'或' '代替缺失值。使用下面的代码片段,我们将测试我们的adult_df数据框架是否由具有值为'?'的分类变量组成。
脚本输出
上面的代码片段的输出显示工作类属性中有1836个缺失值。 职业属性中1843个,祖国属性中有583个缺失值。
数据预处理
对于预处理,我们将制作一份原始数据帧的副本。我们将adult_df复制为adult_df_rev数据帧。
因为我们要对缺失值执行一些添补。 在这之前,我们需要一些我们的数据框架的概要统计。 为此,我们可以使用describe方法。 它可以用于生成各种汇总统计,不包括NaN值。
我们传递一个“include”参数,值为“all”,这用于指定我们想要的是所有属性的汇总统计。
在运行上述命令后,可以检查数据集的基本统计信息。 你可以花一些时间在这里了解每个提供的统计数据的详细信息。
数据添补步骤
现在,是时候估算缺失值了。 我们的一些分类中缺少值,即'?'。 我们将用上面描述的方法替换'?'为顶行的值。 例如,我们要用Private值替换工作区属性的?值。
我们已经执行了数据添补步骤。 ??
您可以通过打印adult_df_rev来检查数据帧中的更改
对于朴素贝叶斯定理,我们需要将所有数据值转换成一种数据格式。我们将对所有标签进行编码,其值介于0和n_classes-1之间。
独热编码器
为了实现这一点,我们将使用LabelKeeper的SciKit学习库的LabelEncoder。对于编码,我们还可以使用One-Hot编码器。它将数据编码为二进制格式。
使用上面的代码片段,我们创建了多个分类列,例如“marital_cat”,“race_cat”等。你可以使用adult_df_rev.head查看数据框的前6行。
通过打印adult_df_rev.head结果,您将能够看到所有的列都应该重新索引。他们不是正确的顺序。要重新索引这些列,您可以使用下面提供的代码段:

上述代码片段的输出将显示所有列都正确地重建索引。我已经将列名列表作为参数传递,axis = 1用于重新索引列。
数据标准化
我们的数据帧的所有数据值都是数字。现在,我们需要转换它们到统一尺度。我们可以标准化值,使用下面的公式进行标准化。

我们已将数据值转换为标准化值。您可以打印并检查dataframe的输出。
数据切片
让我们将数据分成训练和测试集。我们可以使用sklearn的train_test_split方法轻松地执行此步骤。
使用上面的代码片段,我们已经将数据划分为要素和目标集。特征集由14个列组成,即预测变量和目标集由1个具有类值的列组成。
features_train和target_train由训练数据组成,features_test和target_test由测试数据组成。
高斯朴素贝叶斯实现
完成数据预处理后。是时候实现机器学习算法了。我们将使用sklearn的GaussianNB模块。
我们已经构建了一个GaussianNB分类器。使用训练数据训练分类器。我们可以使用fit方法来训练它。在构建分类器之后,我们准备好模型进行预测。我们可以使用predict方法,测试集特征作为其参数。
我们的高斯朴素贝叶斯模型的准确性
现在是时候测试我们的模型的质量,我们做了一些预测。让我们将模型的预测与测试集的实际目标值进行比较。遵循这个方法,我们将计算我们的模型的准确性。
脚本输出
0.80141447980643965
真棒!我们的模型给出的精度为80%。这不是一个简单的实现。您可以创建随机测试数据集并测试模型,以了解训练的高斯朴素贝叶斯模型的表现。
【朴素贝叶斯分类器python_python实现高斯朴素贝叶斯分类器】我们可以用Python pickle保存训练有素的scikit-learn模型。你可以查看如何使用Python Pickle保存训练有素的scikit-learn模型。英文原文:http://dataaspirant.com/2017/02/20/gaussian-naive-bayes-classifier-implementation-python/

    推荐阅读