赵走x博客
网站访问量:151879
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
资源编号:75898
人工智能
深入浅出Python机器学习
热度:181
朴素贝叶斯算法包含多种方法,在scikit-leam 中,朴素贝叶斯有三种方法,分别是贝努利朴素贝叶斯( Bernoulli Naive Bayes )、高斯贝叶斯( Gaussian Nalve Bayes )和多项式朴素贝叶斯( Multinomial Naive Bayes ), 本节将对这几种方法进行介绍。
朴素贝叶斯算法包含多种方法,在scikit-leam 中,朴素贝叶斯有三种方法,分别是贝努利朴素贝叶斯( Bernoulli Naive Bayes )、高斯贝叶斯( Gaussian Nalve Bayes )和多项式朴素贝叶斯( Multinomial Naive Bayes ), 本节将对这几种方法进行介绍。 # 1、 贝努利朴素贝叶斯 在上面的例子当中,我们使用了朴素贝叶斯算法中的一种方法,称为贝努利朴素贝叶斯(Bemoulli Naive Bayes ),这种方法比较适合于符合贝努利分布的数据集,贝努利分布也被称为“ 二项分布”或者是“ 0-1 分布”,比如我们进行抛硬币的游戏,硬币落下来只有两种可能的结果:正面或者反面,这种情况下,我们就称抛硬币的结果是贝努利分布的。 在刚才我们举的例子当中,数据集中的每个特征都只有0 和1 两个数值,在这种情况下,贝努利贝叶斯的表现还不错。但如果我们用更复杂的数据集,结果可能就不一样了,下面我们动手来试一试,输入代码如下: ``` # 导入数据集生成工具 from sklearn.datasets import make_blobs # 导入数据集拆分工具 from sklearn.model_selection import train_test_split from sklearn.naive_bayes import BernoulliNB # 生成样本数量为500 ,分类数为5的数据集 X, y = make_blobs(n_samples=500, centers=5, random_state=8) # 将数据集拆分成训练集和训练集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用贝努利贝叶斯拟合数据 nb = BernoulliNB() nb.fit(X_train, y_train) # 打印模型得分 print('模型得分{:.3f}'.format(nb.score(X_test, y_test))) ``` 这里我们还是使用了非常熟悉的make blobs 来生成手工数据集,为了加大难度,我 们令样本数量为500 ,而分类的数量为5 个,也就是centers 参数等于5 , 运行结果: ``` 模型得分0.544 ``` [结果分析]可以看到,在我们手工生成的相对复杂的数据集中,贝努利朴素贝叶斯的得分相当糟糕,只有大约一半的数据被放进了正确的分类,这是为什么呢? 下面我们通过图像来了解一下贝努利朴素贝叶斯的工作过程,输入代码如下: ``` # 导入数据集生成工具 from sklearn.datasets import make_blobs # 导入数据集拆分工具 from sklearn.model_selection import train_test_split from sklearn.naive_bayes import BernoulliNB import matplotlib.pylab as plt import numpy as np # 生成样本数量为500 ,分类数为5的数据集 X, y = make_blobs(n_samples=500, centers=5, random_state=8) # 将数据集拆分成训练集和训练集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用贝努利贝叶斯拟合数据 nb = BernoulliNB() nb.fit(X_train, y_train) # 限定横轴与纵轴的最大值 x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5 y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5 # 用不同的背景色表示不同的分类 xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02)) z = nb.predict(np.c_[(xx.ravel(), yy.ravel())]).reshape(xx.shape) plt.pcolormesh(xx, yy, z, cmap=plt.cm.Pastel1) # 将训练集和测试集用散点图表示 plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=plt.cm.cool, edgecolors='k') plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=plt.cm.cool, marker='*', edgecolors='k') plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) # 定义图题 plt.title('Classifier BernoulliNB') # 显示图片 plt.show() ``` 运行结果:  [结果分析] 在图5-7 中,我们可以看到贝努利朴素贝叶斯的模型十分简单,它分别在横轴等于0 和纵轴等于0 的位置画了两条直线,再用这两条直线形成的4 个象限对数据进行分类。这是因为我们使用了贝努利朴素贝叶斯的默认参数binarize= 0.0 ,所以模型对于数据的判断是,如果特征1大于或等于0 ,且特征2 大于或等于0 ,则将数据归为一类:如果特征1小于0 , 且特征2 也小于0,则归为另一类而其余的数据全部归为第三类,难怪模型的得分这么差了。 所以在这种情况下,我们就不能再使用贝努利朴素贝叶斯,而要用其他的方法,例如下面要讲到的高斯朴素贝叶斯方法。 # 2、高斯朴素贝叶斯 高斯朴素贝叶斯,顾名思义,是假设样本的特征符合高斯分布,或者说符合正态分布时所用的算法。接下来我们尝试用高斯朴素贝叶斯对刚刚生成的数据集进行拟合,看看结果如何,输入代码如下: ``` # 导入数据集生成工具 from sklearn.datasets import make_blobs # 导入数据集拆分工具 from sklearn.model_selection import train_test_split # 导入高斯贝叶斯 from sklearn.naive_bayes import GaussianNB # 生成样本数量为500 ,分类数为5的数据集 X, y = make_blobs(n_samples=500, centers=5, random_state=8) # 将数据集拆分成训练集和训练集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用高斯贝叶斯拟合数据 gnb = GaussianNB() gnb.fit(X_train, y_train) # 打印模型得分 print('模型得分{:.3f}'.format(gnb.score(X_test, y_test))) ``` 代码运行结果: ``` 模型得分0.968 ``` [结果分析] 看起来,使用高斯朴素贝叶斯方法建立的模型得分要好了很多,准确率达到了96.8% ,这说明我们生成的手工数据集的特征基本上符合正态分布的情况。 下面我们再次用图像来进行演示,以便了解高斯朴素贝叶斯的工作工程,输入代码如下: ``` # 导入数据集生成工具 from sklearn.datasets import make_blobs # 导入数据集拆分工具 from sklearn.model_selection import train_test_split # 导入高斯贝叶斯 from sklearn.naive_bayes import GaussianNB import numpy as np import matplotlib.pylab as plt # 生成样本数量为500 ,分类数为5的数据集 X, y = make_blobs(n_samples=500, centers=5, random_state=8) # 将数据集拆分成训练集和训练集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用高斯贝叶斯拟合数据 gnb = GaussianNB() gnb.fit(X_train, y_train) # 限定横轴与纵轴的最大值 x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5 y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5 # 用不同的背景色表示不同的分类 xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02)) # 用不同色块来表示不同的分类 z = gnb . predict(np . c_[(xx . ravel() , yy . ravel())]) . reshape (xx.shape) plt . pcolormesh(xx , yy, z , cmap=plt.cm . Pastel1) # 用散点图画出训练集和测试集数据 plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=plt.cm.cool, edgecolors='k') plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=plt.cm.cool, marker='*', edgecolors='k') plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) # 定义图题 plt.title('Classifier BernoulliNB') # 显示图片 plt.show() ``` 运行结果:  [结果分析] 从图5-9 中我们可以看到, 高斯朴素贝叶斯的分类边界比贝努利朴素贝叶斯的分类边界要复杂得多,也基本上把数据点都放进了正确的分类当中了。 事实上, 高斯朴素贝叶斯也确实是能够胜任大部分的分类任务, 这是因为在自然科学和社会科学领域,有大量的现象都是呈现出正态分布的状态。接下来, 我们要介绍第三种方法一一多项式朴素贝叶斯。 # 3、多项式朴素贝叶斯 多项式朴素贝叶斯, 从名字也可以推断出它主要是用于拟合多项式分布的数据集。 可能多项式分布相对于二项式分布和高斯分布来说, 我们会接触得少一些。但如果我们可以理解二项式分布,那么理解多项式分布也会非常简单。二项式分布可以通过抛硬币的例子来进行理解,那么多项式分布都可以用骰子来理解。 我们知道硬币只有两个面, 正面和反面,而假子有6 个面, 因此每掷一次假子,结果都可能是从1 ~ 6 这6 个数字,如果我们掷n 次假子,而每个面朝上的次数的分布情况,就是一个多项式分布。 现在我们继续使用生成的手工数据集来对多项式朴素贝叶斯进行实验,输入代码如下: ``` # 导人多项式朴素贝叶斯 from sklearn.naive_bayes import MultinomialNB from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split # 生成样本数量为500 ,分类数为5的数据集 X, y = make_blobs(n_samples=500, centers=5, random_state=8) # 将数据集拆分成训练集和训练集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 用多项式朴素贝叶斯拟合数据 mnb = MultinomialNB() mnb.fit(X_train, y_train) mnb.score(X_test, y_test) ``` 上面这段代码和我们使用贝努利朴素贝叶斯或是高斯朴素贝叶斯看起来没有什么区别,但是这样使用多项式朴素贝叶斯是错误的。 报错信息: ``` ValueError: Input X must be non-negative ``` 也就是:X值必须是非负数的 [结果分析] 提示信息告诉我们,输入的X 值必须是非负的,这样的话,我们需要对数据进行一下预处理才行。 所以我们需要把代码改成如下的样子: ``` # 导人多项式朴素贝叶斯 from sklearn.naive_bayes import MultinomialNB from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split # 导入数据预处理工具MinMaxScaler from sklearn.preprocessing import MinMaxScaler # 生成样本数量为500 ,分类数为5的数据集 X, y = make_blobs(n_samples=500, centers=5, random_state=8) # 将数据集拆分成训练集和训练集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用MinMaxScaler对数掘进行预处理,使数据全部为非负值 scaler = MinMaxScaler() scaler.fit(X_train) scaler.fit(X_test) X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) # 用多项式朴素贝叶斯拟合数据 mnb = MultinomialNB() mnb.fit(X_train_scaled, y_train) # 打印模型得分 print('模型得分:{:.3f}'.format(mnb.score(X_test_scaled, y_test))) ``` 运行结果: ``` 模型得分:0.312 ``` [结果分析] 从结果中可以看出,虽然经过了预处理将所有特征值转化为非负的,但是多项式朴素贝叶斯还是不能获得较高的分数, 31.2 % 的准确率甚至比贝努利朴素贝叶斯的得分还要更糟糕一点。 如果我们用图形来表示的话,也可以直观地看出多项式朴素贝叶斯并不适合用来拟合这个数据集,输入代码如下: ``` # 导人多项式朴素贝叶斯 from sklearn.naive_bayes import MultinomialNB from sklearn.datasets import make_blobs from sklearn.model_selection import train_test_split # 导入数据预处理工具MinMaxScaler from sklearn.preprocessing import MinMaxScaler import numpy as np import matplotlib.pyplot as plt # 生成样本数量为500 ,分类数为5的数据集 X, y = make_blobs(n_samples=500, centers=5, random_state=8) # 将数据集拆分成训练集和训练集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 使用MinMaxScaler对数掘进行预处理,使数据全部为非负值 scaler = MinMaxScaler() scaler.fit(X_train) scaler.fit(X_test) X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) # 用多项式朴素贝叶斯拟合数据 mnb = MultinomialNB() mnb.fit(X_train_scaled, y_train) # 限定横轴与纵轴的最大值 x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5 y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5 # 用不同的背景色表示不同的分类 xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02)) # 用不同色块来表示不同的分类 z = mnb . predict(np . c_[(xx . ravel() , yy . ravel())]) . reshape (xx.shape) plt . pcolormesh(xx , yy, z , cmap=plt.cm . Pastel1) # 用散点图画出训练集和测试集数据 plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=plt.cm.cool, edgecolors='k') plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=plt.cm.cool, marker='*', edgecolors='k') # 设定横纵轴范围 plt.xlim(xx.min(), xx.max()) plt.ylim(yy.min(), yy.max()) # 定义图题 plt.title('Classifier BernoulliNB') # 显示图片 plt.show() ``` 运行结果:  {结果分析] 从图 中可以看出多项式朴素贝叶斯所进行的分类确实比贝努利朴素贝叶斯的还要差一些,大部分数据点都被放到了错误的分类中。这是因为,多项式朴素贝叶斯只适合用来对非负离散数值特征进行分类,典型的例子就是对转化为向量后的文本数据进行分类。文本数据的处理我们将会在第13 章中向大家介绍,这里我们暂时略过。 >⚠️: 在本例中,我们使用了MinMaxScaler 对数据进行预处理, MinMaxScaler 的作用是将数据集中的特征值全部转化为0 ~ 1 。更多关于数据预处理的内容,我们将在后面的章节进行讲解。