您现在的位置是:首页 >学无止境 >大数据分析案例-基于高斯朴素贝叶斯算法构建良恶性肿瘤识别器网站首页学无止境

大数据分析案例-基于高斯朴素贝叶斯算法构建良恶性肿瘤识别器

艾派森 2024-06-17 10:13:36
简介大数据分析案例-基于高斯朴素贝叶斯算法构建良恶性肿瘤识别器

?‍♂️ 个人主页:@艾派森的个人主页

✍?作者简介:Python学习者
? 希望大家多多支持,我们一起进步!?
如果文章对你有帮助的话,
欢迎评论 ?点赞?? 收藏 ?加关注+


喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章

大数据分析案例合集
大数据分析案例-基于随机森林算法预测人类预期寿命
大数据分析案例-基于随机森林算法的商品评价情感分析
大数据分析案例-用RFM模型对客户价值分析(聚类)
大数据分析案例-对电信客户流失分析预警预测
大数据分析案例-基于随机森林模型对北京房价进行预测
大数据分析案例-基于RFM模型对电商客户价值分析
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型
大数据分析案例-基于决策树算法构建员工离职预测模型

大数据分析案例-基于KNN算法对茅台股票进行预测

大数据分析案例-基于多元线性回归算法构建广告投放收益模型
大数据分案例-基于随机森林算法构建返乡人群预测模型
大数据分析案例-基于决策树算法构建金融反欺诈分类模型

目录

1.项目背景

2.项目简介

2.1项目说明

2.2数据说明

2.3技术工具

3.算法原理

4.项目实施步骤

4.1理解数据

4.2数据预处理

4.3探索性数据分析

4.3.1分析良性/恶性肿瘤的占比情况

4.3.2分析不同肿瘤的半径和纹理的区别

4.3.3分析各变量的相关系数

4.4特征工程

4.5模型构建

4.6模型评估

4.7模型预测

5.实验总结

源代码


1.项目背景

        2015年1月,美国政府提出“精准医学倡议”,精准医学的概念随后迅速进入了公众视野和国际舞台,成为学术界关注的热点话题。精准医学被定义为“一种考虑到差异的个体“基因、环境和生活方式”的来预防和治疗疾病的新方法。“精确医学计划”的目的是将精确医学的概念转变为临床实践的科学依据,从而开创医学的新时代。

        “精准医学倡议”的提议与癌症密切相关。癌症具有世界上最高的病死率,并且随着年龄的增长而上升,其特征是“无法解释的耐药性,肿瘤的遗传异质性,未能充分评估疗效和肿瘤复发”。精准医学强调个体化药物,可以根据癌症本身的特点,通过生物信息数据库,患者的个体化检测技术,大数据分析技术和大数据分析,来创建个体化的医学。针对不同患者的治疗方案,使肿瘤治疗显得“个性化”、“精确”和“最优”。

        互联网的普及将人类带入了大数据时代。互联网带来的信息风暴正在改变我们的生活,工作和思维方式。在生物医学领域,大数据被抽象地定义为“生物医学大数据” ,“健康和医学大数据”,“医学大数据”。它为癌症的预防和治疗研究提供了重要的平台,例如“人类基因组计划”,“人类蛋白质组计划(HPP)”等。大数据不仅可以加强临床信息与分子生物学,基因组学,代谢组学等学科的整合,还可以帮助人们发现疾病背后的秘密,提高靶向药物,免疫疗法和综合治疗的研究效率。      

        人工智能(AI)是指由人类制造的机器所显示的智能,它使计算机能够模拟人类的某些思维过程和智能行为。它在心理学,哲学,语言学,生物医学领域和其他学科中具有广泛的应用。2017年,在日本使用AI诊断大肠癌的准确率高达86%,并且AI在癌症预防和治疗中的应用已变得越来越深入。 

2.项目简介

2.1项目说明

        本项目通过分析良性肿瘤(Benign cancer)和恶性肿瘤(Malignant cancer)的细胞特征差异性,最后使用机器学习中的高斯朴素贝叶斯、支持向量机、逻辑回归、随机森林等分类算法模型构建癌细胞分类器,以此判断是否为良性或恶性。

2.2数据说明

        数据来源于kaggle平台,原始数据集共有569个癌细胞和30个特征判断我们数据中的癌细胞是良性还是恶性,我们的癌症数据包含两种类型的癌症:1. 良性癌症 (B) 和 2. 恶性癌症 (M)。

2.3技术工具

Python版本:3.9

代码编辑器:jupyter notebook

3.算法原理

朴素贝叶斯算法

(1)算法简介

        朴素贝叶斯法是基于贝叶斯定理与特征条件独立性假设的分类方法。对于给定的训练集,首先基于特征条件独立假设学习输入输出的联合概率分布(朴素贝叶斯法这种通过学习得到模型的机制,显然属于生成模型);然后基于此模型,对给定的输入 x,利用贝叶斯定理求出后验概率最大的输出 y。

(2)朴素贝叶斯分类器的公式

        假设某个体有n项特征(Feature),分别为F1、F2、…、Fn。现有m个类别(Category),分别为C1、C2、…、Cm。贝叶斯分类器就是计算出概率最大的那个分类,也就是求下面这个算式的最大值:

P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C)/P(F1F2...Fn)

由于P(F1F2…Fn) 对于所有的类别都是相同的,可以省略,问题就变成了求

P(F1F2...Fn|C)P(C)的最大值。朴素贝叶斯分类器则是更进一步,假设所有特征都彼此独立,因此

P(F1F2...Fn|C)P(C) = P(F1|C)P(F2|C) ... P(Fn|C)P(C)

上式等号右边的每一项,都可以从统计资料中得到,由此就可以计算出每个类别对应的概率,从而找出最大概率的那个类。虽然“所有特征彼此独立”这个假设,在现实中不太可能成立,但是它可以大大简化计算,而且有研究表明对分类结果的准确性影响不大。

(3)朴素贝叶斯常用的三个模型

高斯模型:处理特征是连续型变量的情况

多项式模型:最常见,要求特征是离散数据

伯努利模型:要求特征是离散的,且为布尔类型,即true和false,或者1和0

(4) 朴素贝叶斯法的评价

朴素贝叶斯法的优点:

朴素贝叶斯算法假设了数据集属性之间是相互独立的,因此算法的逻辑性十分简单,并且算法较为稳定,当数据呈现不同的特点时,朴素贝叶斯的分类性能不会有太大的差异。换句话说就是朴素贝叶斯算法的健壮性比较好,对于不同类型的数据集不会呈现出太大的差异性。当数据集属性之间的关系相对比较独立时,朴素贝叶斯分类算法会有较好的效果。

朴素贝叶斯法的缺点:

属性独立性的条件同时也是朴素贝叶斯分类器的不足之处。数据集属性的独立性在很多情况下是很难满足的,因为数据集的属性之间往往都存在着相互关联,如果在分类过程中出现这种问题,会导致分类的效果大大降低。

4.项目实施步骤

4.1理解数据

首先使用pandas库导入我们的癌症数据集并查看数据前五行

使用.shape数据查看数据大小,发现数据共有569行,33列 

 

使用. info()方法查看数据基本信息

 

 从数据基本信息中,我们可以看到各列特征的数据类型以及缺失情况,最后还有占用的内存大小。

使用.describe()查看数据描述性统计

 从描述性统计结果中,我们可以得出各列变量的均值、方差、最大最小值、四分位数等信息。

4.2数据预处理

统计一下各列特征的总缺失值数

 从结果中可以发现,最后一列“Unnamed:32”明显是异常的一列,后面删除即可。

使用any()检验原始数据集是否有重复值 

结果为False说明数据不存在重复值情况,反之则说明存在。

删除最后异常的那一列,同时将目标变量列diagnosis中的B和M用0 1进行表示

4.3探索性数据分析

4.3.1分析良性/恶性肿瘤的占比情况

 通过饼图我们发现该数据集中良性肿瘤数据占多数,具体数量是多少,我们用条形图来展示。

 4.3.2分析不同肿瘤的半径和纹理的区别

 从图中我们看出,恶性肿瘤在细胞半径大小和纹理都大于良性肿瘤。

4.3.3分析各变量的相关系数

 当然我们也可以将相关系数值打印出来

4.4特征工程

在选择特征变量的时候,我们将id和diagnosis删除,然后作为特征变量X,将diagnosis作为目标变量y,最后拆分数据集为训练集和测试集,其中测试集比例为0.2。

4.5模型构建

首先导入本次需要用到的模型库

 接着构建模型,并打印模型准确率

 将以上模型准确率进行汇总统计

从结果中我们可以看出高斯朴素贝叶斯算法模型的准确率最高,故我们采用其作为最终的算法模型。 

4.6模型评估

模型评估我们使用混淆矩阵、分类报告、ROC曲线最为评估指标

 从混淆矩阵中,我们可以看出模型在0分类上全部正确,在1分类上预测正确40个,错误3个。在分类报告中,我们可以得出模型在0和1分类上的精确率、召回率、F1值等信息。最后ROC曲线趋向于左上方,面积越大,表示模型效果越好。综合以上结果看出,模型效果整体不错。

4.7模型预测

将真实值和预测值进行汇总,然后随机挑选10个来看看结果

 从结果看出,随机挑选10个中,全部预测正确。

5.实验总结

        本次实验我们通过分析癌细胞的特征差异最后使用高斯朴素贝叶斯算法模型构建了癌细胞识别器,以此来识别是否为良/恶性,识别器的准确率为97%,效果不错。

心得与体会:

通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。

在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等

在此次实战中,我还学会了下面几点工作学习心态:

1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。

2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。

3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。

这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。

源代码

import pandas as pd
import warnings
warnings.filterwarnings('ignore')

data = pd.read_csv("Cancer_Data.csv")
data.head()
data.shape
data.info()
data.describe().T
print('Train columns with null values:
', data.isnull().sum())
any(data.duplicated())
# 删除缺失列-'Unnamed: 32'
data.drop('Unnamed: 32',axis=1,inplace=True)
# 将目标变量列diagnosis中的B和M用0 1进行表示
data['diagnosis'].replace(['B', 'M'],[0, 1], inplace=True)
data.head()
# 分析目标变量B和M的占比情况
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style("whitegrid")
plt.pie(data['diagnosis'].value_counts(),autopct='%1.2f%%', startangle=90,labels=['B','M'])
plt.axis('equal')
plt.title("B x M")
plt.show()
# 分析目标变量B和M的数量分布
ax = sns.countplot(data=data, x='diagnosis')
plt.title('Total B x M cells')
ax.bar_label(ax.containers[0], label_type='edge')
plt.show()
# 分析不同肿瘤的半径和纹理的区别特征
M_data = data[data.diagnosis == 1] # 取出恶性肿瘤M的数据
B_data = data[data.diagnosis == 0] # 取出良性肿瘤B的数据
plt.scatter(M_data.radius_mean,M_data.texture_mean, label = "Malignant", alpha = 0.3)
plt.scatter(B_data.radius_mean,B_data.texture_mean,label = "Benign", alpha = 0.3)
plt.xlabel("radius_mean")
plt.ylabel("texture_mean")
plt.legend()
plt.show()
plt.figure(figsize=(20,20))
sns.heatmap(data.corr(),cbar=True,annot=True,cmap='Blues')
plt.show()
data.corr()
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from xgboost import XGBClassifier
# 准备特征变量和目标变量
X = data.drop(['id','diagnosis'],axis=1)
y = data['diagnosis']
# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建一个来存储模型准确率的字典
model_dict = {}
# 构建逻辑回归模型
lg = LogisticRegression()
lg.fit(X_train, y_train)
acc_score = lg.score(X_test,y_test)
model_dict['LogisticRegression'] = acc_score
print(acc_score)
# 构建高斯朴素贝叶斯模型
gnb = GaussianNB()
gnb.fit(X_train, y_train)
acc_score = gnb.score(X_test,y_test)
model_dict['GaussianNB'] = acc_score
print(acc_score)
# 构建SVC支持向量机模型
svc = SVC()
svc.fit(X_train, y_train)
acc_score = svc.score(X_test,y_test)
model_dict['SVC'] = acc_score
print(acc_score)
# 构建随机森林模型
forest = RandomForestClassifier()
forest.fit(X_train, y_train)
acc_score = forest.score(X_test,y_test)
model_dict['RandomForestClassifier'] = acc_score
print(acc_score)
# 构建决策树模型
tree = DecisionTreeClassifier()
tree.fit(X_train, y_train)
acc_score = tree.score(X_test,y_test)
model_dict['DecisionTreeClassifier'] = acc_score
print(acc_score)
# 构建XGBoost模型
xgb = XGBClassifier()
xgb.fit(X_train, y_train)
acc_score = xgb.score(X_test,y_test)
model_dict['XGBClassifier'] = acc_score
print(acc_score)
model_accuracies_df = pd.DataFrame(columns=['Model', 'Accuracy'])
model_accuracies_df['Model'] = model_dict.keys()
model_accuracies_df['Accuracy'] = model_dict.values()
model_accuracies_df.sort_values(by = "Accuracy", ascending=False)
from sklearn.metrics import confusion_matrix,classification_report,auc,roc_curve
# 模型评估
y_pred = gnb.predict(X_test)
print('模型混淆矩阵:','
',confusion_matrix(y_test,y_pred))
print('模型分类报告:','
',classification_report(y_test,y_pred))
# 画出ROC曲线
y_prob = gnb.predict_proba(X_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob) 
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
res = pd.DataFrame()
res['真实值'] = y_test
res['预测值'] = y_pred
res.sample(10)
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。