赵走x博客
网站访问量:151921
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出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机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
资源编号:75899
人工智能
深入浅出Python机器学习
热度:90
接下来,我们将使用朴素贝叶斯算法来进行一个小的项目实战一一判断一个患者的肿瘤是良性还是恶性。
接下来,我们将使用朴素贝叶斯算法来进行一个小的项目实战一一判断一个患者的肿瘤是良性还是恶性。这里我们会用到一个来自真实世界的数据集一一威斯康星乳腺肿瘤数据集。 # 1、 对数据集进行分析 威斯康星乳腺肿瘤数据集是一个非常经典的用于医疗病情分析的数据集,它包括569 个病例的数据样本,每个样本具有30 个特征值,而样本共分为两类: 分别是恶性( Malignant)和良性CBenign )。下面我们就载入这个数据集并了解一下它的样子,输入代码如下: ``` # 导人威斯康星乳腺肿瘤数据集 from sklearn.datasets import load_breast_cancer cancer = load_breast_cancer() # 打印数据集键值 print(cancer.keys()) ``` 结果· ``` dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename']) ``` [结果分析] 从这个结果中可以看到,数据集包含的信息有特征数据data、分类值target 、分类名称target names 、数据描述DESCR,以及特征名称feature names 。 下面我们来看一下分类的名称和特征的名称,输入代码如下: ``` print('肿瘤的分类', cancer['target_names']) print('肿瘤的特征', cancer['feature_names']) ``` 结果: ``` 肿瘤的分类 ['malignant' 'benign'] 肿瘤的特征 ['mean radius' 'mean texture' 'mean perimeter' 'mean area' 'mean smoothness' 'mean compactness' 'mean concavity' 'mean concave points' 'mean symmetry' 'mean fractal dimension' 'radius error' 'texture error' 'perimeter error' 'area error' 'smoothness error' 'compactness error' 'concavity error' 'concave points error' 'symmetry error' 'fractal dimension error' 'worst radius' 'worst texture' 'worst perimeter' 'worst area' 'worst smoothness' 'worst compactness' 'worst concavity' 'worst concave points' 'worst symmetry' 'worst fractal dimension'] ``` [结果分析] 就像我们之前所说,该数据集中肿瘤的分类包括恶性( Malignant )和良性( Benign ),而特征值就多了很多,如半径、表面纹理的灰度值、周长值、表面积值、平滑度等。当然这些都涉及一定的医学知识,我们就不逐一展开了。下面我们开始使用朴素贝叶斯算法进行建模。 # 2、使用高斯朴素贝叶斯进行建模 用我们的直觉来分析的话,这个数据集的特征值并不属于二项式分布,也不属于多项式分布,所以这里我们选择使用高斯朴素贝叶斯( GaussianNB )。不过首先,我们要将数据集拆分为训练集和测试集,输入代码如下: ``` # 导人威斯康星乳腺肿瘤数据集 from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split cancer = load_breast_cancer() # 将数据集的数值和分类目标赋值给x手的 X, y = cancer.data, cancer.target # 使用数据集拆分工具拆分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=38) # 打印训练集和测试集的数据形态 print("训练集数据形态:", X_train.shape) print("测试集数据形态:", X_test.shape) ``` 代码运行结果: ``` 训练集数据形态: (426, 30) 测试集数据形态: (143, 30) ``` [结果分析]从结果中我们可以看到,通过使用train_test_ split 王具进行拆分,现在的训练集中有426 个样本,而测试集中有143 个样本, 当然,特征数量都是30 个。 下 面我们开始用高斯朴素贝叶斯对训练数据集进行拟合,输入代码如下: ``` # 导人威斯康星乳腺肿瘤数据集 from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB cancer = load_breast_cancer() # 将数据集的数值和分类目标赋值给x手的 X, y = cancer.data, cancer.target # 使用数据集拆分工具拆分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=38) # 使用高斯朴素贝叶斯拟合数据 gnb = GaussianNB() gnb.fit(X_train, y_train) print("训练得分:{:.3f}".format(gnb.score(X_train, y_train))) print("测试得分:{:.3f}".format(gnb.score(X_test, y_test))) ``` 运行几个: ``` 训练得分:0.948 测试得分:0.944 ``` {结果分析]从结果中可以看到, GaussianNB 在训练集和测试集的得分都非常不错,均在95% 左右。 下面我们随便用其中一个样本( 如第312 个样本)让模型进行一下预测, 看是否可以分到正确的分类中,输入代码如下: ``` # 导人威斯康星乳腺肿瘤数据集 from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB cancer = load_breast_cancer() # 将数据集的数值和分类目标赋值给x手的 X, y = cancer.data, cancer.target # 使用数据集拆分工具拆分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=38) # 使用高斯朴素贝叶斯拟合数据 gnb = GaussianNB() gnb.fit(X_train, y_train) # 打印模型预测的分类和真实的分类 print('模型预测的分类是{}'.format(gnb.predict([X[312]]))) print('样本的正确分类是', y[312]) ``` 代码运行结果: ``` 模型预测的分类是[1] 样本的正确分类是 1 ``` [结果分析] 从结果中我们看到,模型对第312 个样本所进行的分类和正确的分类完全一致,都是分类1 , 也就是说,这个样本的肿瘤是一个良性的肿瘤。 # 3、高斯朴素贝叶斯的学习曲线 在机器学习中,有一个概念称为学习曲线( learning curve ),指的是随着数据集样本数量的增加, 模型的得分变化情况。下面我们一起来绘制一下高斯朴素贝叶斯在威斯康星乳腺肿瘤数据集中的学习曲线,输入代码如下: ``` # 导人学习曲线库 from sklearn.datasets import load_breast_cancer from sklearn.model_selection import learning_curve # 导人随机拆分工具 from sklearn.model_selection import ShuffleSplit import numpy as np import matplotlib.pyplot as plt # 定义一个函数绘制学习曲线 from sklearn.naive_bayes import GaussianNB cancer = load_breast_cancer() X, y = cancer.data, cancer.target def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)): plt.figure() plt.title(title) if ylim is not None: plt.ylim(*ylim) # 设定横轴标签 plt.xlabel("Training examples") # 设定纵轴标签 plt.ylabel("Score") train_sizes, train_scores, test_scores = learning_curve( estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes) train_scores_mean = np.mean(train_scores, axis=1) test_scores_mean = np.mean(test_scores, axis=1) plt.grid() plt.plot(train_sizes, train_scores_mean, 'o-', color="r", label="Training Scores") plt.plot(train_sizes, test_scores_mean, 'o-', color="g", label="Cross-validation Scores") plt.legend(loc="lower right ") return plt # 设定图题 title = "Learning Curves (Naive Bayes )" # 设定拆分数量 cv = ShuffleSplit(n_splits=100, test_size=0.2, random_state=0) # 设定模型为高斯朴素贝叶斯 estimator = GaussianNB() # 调用我们定义好的函数 plot_learning_curve(estimator, title, X, y, ylim=(0.9, 1.01), cv=cv, n_jobs=4) # 显示图片 plt.show() ``` 运行结果:  [结果分析]从图 中可以看到,在训练数据集中,随着样本量的增加,模型的得分是逐渐降低的。这是因为随着样本数量增加, 模型要拟合的数据越来越多,难度也越来越大。而模型的交叉验证得分的变化相对没有那么明显,从10 个样本左右一直到接近500 个样本为止,分数一直在0.94 左右浮动。这说明高斯朴素贝叶斯在预测方面,对于样本数量的要求并没有那么苛刻。所以如果你的样本数量比较少的话, 应该可以考虑使用朴素贝叶斯算法来进行建模。 # 4、小结 在本章中,我们一起学习了朴素贝叶斯算法和它的几种变体一一贝努利朴素贝叶斯、高斯朴素贝叶斯和多项式朴素贝叶斯。贝努利朴素贝叶斯适合与二项式分布的数据集,而多项式朴素贝叶斯适合计数类型的数据集,即非负、离散数值的数据集,而高斯朴素贝叶斯适用的面就要广得多,它可以应用于任何连续数值型的数据集当中, 当然如果是符合正态分布的数据集的话,高斯朴素贝叶斯模型的得分会更高。 相比起线性模型算法来说,朴素贝叶斯算法的效率要高一些,这是因为朴素贝叶斯算法会把数据集中的各个特征看作完全独立的,而不考虑特征之间的关联关系。但同时模型泛化的能力会稍微弱一点,不过一般情况下并不太影响实际的使用。尤其是在现在这个大数据时代,很多数据集的样本特征可能成千上万,这种情况下,模型的效率要比模型泛化性能多零点几个百分点的得分重要得多。在这种超高维度的数据集中, 训练一个线性模型的时间可能会非常长, 因此在这种情况下, 朴素贝叶斯算法往往是一个更好的选择。 下面,我们会一起学习决策树和随机森林算法,它们也是目前非常流行的算法之一, 接下来我们马上开启新的旅程。