采用朴素贝叶斯方法,对美国威斯康星州的乳腺癌诊断数据集进行分类,实现针对乳腺癌检测的分类器,以判断一个患者的肿瘤是良性还是恶性。
1.导入sklearn自带的数据集:威斯康星乳腺肿瘤数据集(load_breast_cancer)。
2.打印数据集键值(keys),查看数据集包含的信息。
3.打印查看数据集中标注好的肿瘤分类(target_names)、肿瘤特征名称(feature_names)。
4.将数据集拆分为训练集和测试集,打印查看训练集和测试集的数据形态(shape)。
5.配置高斯朴素贝叶斯模型。
6.训练模型。
7.评估模型,打印查看模型评分(分别打印训练集和测试集的评分)。
8.模型预测:选取某一样本进行预测。(可以进行多次不同样本的预测)
参考方法:可以打印模型预测的分类和真实的分类,进行对比,看是否一致,如果一致,判断这个样本的肿瘤是一个良性的肿瘤,否则结果相反。
也可以用其他方法进行预测。
9.扩展(选做):绘制高斯朴素贝叶斯在威斯康星乳腺肿瘤数据集中的学习曲线。
该数据集中肿瘤是一个非常经典的用于医疗病情分析的数据集,包括569个病例的数据样本,每个样本具有30个特征。
样本共分为两类:恶性(Malignant)和良性(Benign)。
该数据集的特征是从一个乳腺肿块的细针抽吸(FNA)的数字化图像计算出来的。它们描述了图像中细胞核的特征。
特征值很多,涉及一定的医学知识。(具体特征及含义见此节实验指导书)
#导入数据集拆分工具
from sklearn.model_selection import train_test_split
#导入威斯康星乳腺肿瘤数据集
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
print('\n\n\n')
print('代码运行结果:')
print('====================================\n')
#打印数据集键值
print(cancer.keys())
print('\n====================================')
print('\n\n\n')
#打印数据集中标注好的肿瘤分类
print('肿瘤的分类:',cancer['target_names'])
#打印数据集中的肿瘤特征名称
print('\n肿瘤的特征:\n',cancer['feature_names'])
#将数据集的数值和分类目标赋值给X和y
X,y = cancer.data,cancer.target
#使用数据集拆分工具拆分为训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=38)
print('\n\n\n')
print('代码运行结果:')
print('====================================\n')
#打印训练集和测试集的数据形态
print('训练集数据形态:',X_train.shape)
print('测试集数据形态:',X_test.shape)
print('\n====================================')
print('\n\n\n')
#导入高斯朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
#使用高斯朴素贝叶斯拟合数据
gnb = GaussianNB()
gnb.fit(X_train,y_train)
print('\n\n\n')
print('代码运行结果:')
print('====================================\n')
#打印模型评分
print('训练集得分:{:.3f}'.format(gnb.score(X_train,y_train)))
print('测试集得分:{:.3f}'.format(gnb.score(X_test,y_test)))
print('\n====================================')
print('\n\n\n')
print('\n\n\n')
print('代码运行结果:')
print('====================================\n')
#打印模型评分
print('模型预测的分类:{}'.format(gnb.predict([X[312]])))
print('样本的正确分类是:',y[312])
print('\n====================================')
print('\n\n\n')
#导入学习曲线库
from sklearn.model_selection import learning_curve
#导入随机拆分工具
from sklearn.model_selection import ShuffleSplit
#导入numpy
import numpy as np
#导入高斯朴素贝叶斯
from sklearn.naive_bayes import GaussianNB
#导入画图工具
import matplotlib.pyplot as plt
#定义一个函数绘制学习曲线
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 score")
plt.plot(train_sizes,test_scores_mean,'o-',color="g",label="Cross-valldation score")
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()
代码运行结果:
====================================
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
====================================
肿瘤的分类: ['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']
代码运行结果:
====================================
训练集数据形态: (426, 30)
测试集数据形态: (143, 30)
====================================
代码运行结果:
====================================
训练集得分:0.948
测试集得分:0.944
====================================
代码运行结果:
====================================
模型预测的分类:[1]
样本的正确分类是: 1
====================================
from sklearn.datasets import load_breast_cancer
cancer=load_breast_cancer()
from sklearn.model_selection import train_test_split
X,y=cancer.data,cancer.target
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=1)
from sklearn.naive_bayes import GaussianNB
nb=GaussianNB()
nb.fit(X_train,y_train)
print('训练集得分:{}'.format(nb.score(X_train,y_train)))
print('测试集得分:{}'.format(nb.score(X_test,y_test)))
训练集得分:0.9413145539906104
测试集得分:0.9440559440559441