【Python自然语言处理】使用SVM、随机森林法、梯度法等多种方法对病人罹患癌症预测实战(超详细 附源码)

简介: 【Python自然语言处理】使用SVM、随机森林法、梯度法等多种方法对病人罹患癌症预测实战(超详细 附源码)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~

一、数据集背景

  • 乳腺癌数据集是由加州大学欧文分校维护的 UCI 机器学习存储库。
  • 数据集包含 569 个恶性和良性肿瘤细胞样本。
  • 样本类别分布:良性357,恶性212
  • 数据集中的前两列分别存储样本的唯一 ID 编号和相应的诊断(M=恶性,B=良性)。
  • 第 3-32 列包含 30 个实值特征,这些特征是根据细胞核的数字化图像计算得出的,可用于构建模型来预测肿瘤是良性还是恶性。
  • 1= 恶性(癌性)- (M)
  • 0 = 良性(非癌性)- (B)

为每个样本计算十个实值特征:

  • 半径(从中心到周边点的平均距离)
  • 纹理(灰度值的标准偏差)
  • 周长
  • 面积
  • 平滑度(半径长度的局部变化)
  • 紧凑性(周长^2/面积 - 1.0)
  • 凹度(轮廓凹入部分的严重程度)
  • 凹点(轮廓凹入部分的数量)
  • 对称
  • 分形维数

为每张图像计算这些特征的平均值、标准误差和“最差”或最大(三个最大值的平均值),从而产生 30 个特征。 在本实例中我们仅以特征平均值为对象进行研究。

接下来导入库文件,主要包括机器学习库Sklearn中的一些模块

数据清洗和样本显示

根据实例研究的对象指标,输出部分样本的指标分布特征,如下图所示

剔除其他指标 仅保留研究对象半径 周长和面积平均值指标 结果如下

对病人诊断结果进行分类

目标数据进行归类:

  • 恶性肿瘤 - 1
  • 良性肿瘤 - 0

绘制各半径 周长 面积指标之间的相关关系如下图

选择相关性不小于68%作为阈值,分析特征值与罹患恶性肿瘤的关系 结果如下图

 

将数据划分为自变量和因变量 为后续模型分析准备数据

模型分析

下面使用不同分类方式 获得分析结果并比较分析精度

可见随机森林法和逻辑回归法的精确度较高 效果较好

梯度模型准确性变化趋势分析

选择梯度模型 分析其在迭代过程中的准确性变化规律

由下图可见  第二十一次迭代时达到极值 图形阴影部分表示置信区间

二、代码

部分代码如下 需要源码和数据集请点赞关注收藏后评论区留言私信~~~

#导入库
import matplotlib
import matplotlib.pyplot as plt 
import seaborn as sn 
from sklearn.svm import SVC
import numpy as np
import pandas as pds 
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
import xgboost as xgb
from matplotlib import font_manager
from sklearn.neighbors import LocalOutlierFactor
from sklearn.model_selection import train_test_split
#from sklearn.neighbors import NeighborhoodComponentsAnalysis
fontP = font_manager.FontProperties()
fontP.set_family('SimHei')
fontP.set_size(14)
# In[2]:
# 加载数据
dr = pds.read_csv('./data/data.csv')
# In[3]:
dr.head(5)
# In[4]:
dr.info()
# In[5]:
#dr.drop(['id','Unnamed: 32','fractal_dimension_worst','symmetry_worst','concave points_worst','concavity_worst','compactness_worst','smoothness_worst','area_worst','perimeter_worst','texture_worst','radius_worst','fractal_dimension_se','symmetry_se','concave points_se','concavity_se','compactness_se','smoothness_se','area_se','perimeter_se','texture_se','radius_se','radius_se'], axis = 1 , inplace=True)
dr.drop(['id','Unnamed: 32','texture_mean','smoothness_mean','compactness_mean','concavity_mean','concave points_mean','symmetry_mean','fractal_dimension_mean','fractal_dimension_worst','symmetry_worst','concave points_worst','concavity_worst','compactness_worst','smoothness_worst','area_worst','perimeter_worst','texture_worst','radius_worst','fractal_dimension_se','symmetry_se','concave points_se','concavity_se','compactness_se','smoothness_se','area_se','perimeter_se','texture_se','radius_se','radius_se'], axis = 1 , inplace=True)
dr.info()
# In[6]:
dr.diagnosis.replace({"B":0,"M":1},inplace=True)
# **目标数据进行归类:**
# 
# * 恶性肿瘤 - 1
# * 良性肿瘤 - 0
# In[7]:
correlation = dr.corr()
plt.figure(figsize=(7,7))
sn.set(font_scale=1.2)
sn.set(font='SimHei')
sn.heatmap(correlation, cmap='Purples',annot = True,annot_kws={"size": 12}, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False)
# In[8]:
sn.heatmap(correlation, cmap='Purples', xticklabels=['诊断结果', '半径均值', '周长均值', '面积均值'],yticklabels=['诊断结果','半径均值','周长均值', '面积均值'],annot = True,annot_kws={"size": 10}, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False)
# In[9]:
correlation[abs(correlation['diagnosis']) > 0.68].index
# In[10]:
dr.drop('diagnosis', axis=1).corrwith(dr.diagnosis).plot(kind='bar', grid=True, figsize=(6, 6), title="Correlation",color="purple");
# **相关性** 
# * 选择相关性不小于68%作为阈值,分析特征值与罹患恶性肿瘤的关系.
# 
# In[11]:
correlation = dr.corr()
cancer_threshold = 0.68 
filter = np.abs(correlation["diagnosis"]) >= cancer_threshold
correlation.filter = correlation.columns[filter].tolist()
sn.set(font_scale=5.5)
sn.set(font='SimHei')
#sn.clustermap(dr[cf].corr(), figsize=(6, 6), xticklabels=['诊断结果', '面积均值','半径均值', '周长均值'],yticklabels=['周长均值', '半径均值', '面积均值', '诊断结果'],annot = True, annot_kws={"size": 12},cmap="Purples").fig.suptitle("罹患肿瘤相关性分析", fontproperties=fontP,x=0.6, y=1.0) 
res=sn.clustermap(dr.corr(), figsize=(6, 6),annot = True, annot_kws={"size": 16},cmap="Purples").fig.suptitle("罹患肿瘤相关性分析", fontproperties=fontP,x=0.6, y=1.0) 
# In[ ]:
# In[12]:
#组图
sn.set(font_scale=1.5)
sn.set_style(style='white')
sn.pairplot(dr[correlation.filter],dropna=True,grid_kws=None,  diag_kind = "kde", markers = ".", hue = "diagnosis", palette='Purples')
# **去除异常节点** 
# In[13]:
from sklearn.neighbors import LocalOutlierFactor
# 将数据划分为自变量和因变量
y=dr["diagnosis"]
x=dr.drop(["diagnosis"],axis=1)
# In[14]:
# -1代表异常节点
outlier= LocalOutlierFactor()
y.predict=outlier.fit_predict(x)
y.predict[0:10]
# In[15]:
x_factor= outlier.negative_outlier_factor_
pds.dataframe= pds.DataFrame()
pds.dataframe["score"]=x_factor
threshold= -2.5
data_filter= pds.dataframe["score"]< threshold
pds_filter_tolist= pds.dataframe[data_filter].index.tolist()
# In[17]:
x= x.drop(pds_filter_tolist)
y= y.drop(pds_filter_tolist).values
# In[18]:
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=42)
scaler = StandardScaler()
x_nsform(x_test)
# In[19]:
index = ['梯度法','逻辑回归法','近邻法','支持向量机法','决策树法','随机森林法']
model_list = [GradientBoostingClassifier(),LogisticRegression(), KNeighborsClassifier(n_neighbors = 4), SVC(kernel="rbf"), DecisionTreeClassifier(), RandomForestClassifier(n_estimators=600)]
model_dict = dict(zip(index,model_list))
model_dict
# In[20]:
pediction_outcome_list =[]
for i,j in model_dict.items():
    j.fit(x_train,y_train)
    x_prediction = j.predict(x_test)
    accuracy = accuracy_score(y_test, x_prediction)
    pediction_outcome_list.append(accuracy)
    print(i,"{:.4f}".format(accuracy))
# In[21]:
plt.figure(figsize = (10,4))
sn.barplot(x =index , y =pediction_outcome_list, palette="vlag",  ci=95,edgecolor='purple',n_boot=1000, dodge=False)
# In[22]:
gradient_boost = GradientBoostingClassifier(loss='deviance',  learning_rate=0.1)
result_list = []
accuracy = []
for j in range(1,28,1):
    x_train,x_test,y_train,y_test = train_test_split(x, y, test_size = 0.25, random_state = j)    
    gradient_boost_fit = gradient_boost.fit(x_train, y_train)
    fit_predict_x = gradient_boost_fit.predict(x_test)
    accuracy.append(accuracy_score(y_test, fit_predict_x))
    result_list.append(j)
# In[23]:
plt.figure(figsize=(10,8))
plt.xlabel("迭代次数",fontsize=14)
plt.
# In[ ]:

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
7月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
1131 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
7月前
|
机器学习/深度学习 存储 自然语言处理
NLP参数高效迁移学习:Adapter方法——论文简读
本研究深入探讨了自然语言处理中参数高效的迁移学习方法——Adapter。通过在预训练模型中引入小型可训练模块,仅调整少量额外参数即可完成模型适配。理论分析表明,该方法在初始化时保持网络行为稳定,并通过瓶颈结构大幅压缩参数规模。实验结果显示,Adapter在GLUE基准上仅用3.6%的参数便达到接近全微调的性能,且对学习率具有更强的鲁棒性。相比传统微调和其他参数高效方法,Adapter在多任务场景下展现出更优的存储效率与泛化能力,为大规模模型的实际部署提供了高效可行的解决方案。
513 7
|
7月前
|
机器学习/深度学习 数据采集 算法
基于mediapipe深度学习的运动人体姿态提取系统python源码
本内容介绍了基于Mediapipe的人体姿态提取算法。包含算法运行效果图、软件版本说明、核心代码及详细理论解析。Mediapipe通过预训练模型检测人体关键点,并利用部分亲和场(PAFs)构建姿态骨架,具有模块化架构,支持高效灵活的数据处理流程。
|
7月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
9月前
|
API 数据安全/隐私保护 开发者
企业微信自动加好友软件,导入手机号批量添加微信好友,python版本源码分享
代码展示了企业微信官方API的合规使用方式,包括获取access_token、查询部门列表和创建用户等功能
|
8月前
|
并行计算 算法 Java
Python3解释器深度解析与实战教程:从源码到性能优化的全路径探索
Python解释器不止CPython,还包括PyPy、MicroPython、GraalVM等,各具特色,适用于不同场景。本文深入解析Python解释器的工作原理、内存管理机制、GIL限制及其优化策略,并介绍性能调优工具链及未来发展方向,助力开发者提升Python应用性能。
493 0
|
存储 人工智能 自然语言处理
Pandas数据应用:自然语言处理
本文介绍Pandas在自然语言处理(NLP)中的应用,涵盖数据准备、文本预处理、分词、去除停用词等常见任务,并通过代码示例详细解释。同时,针对常见的报错如`MemoryError`、`ValueError`和`KeyError`提供了解决方案。适合初学者逐步掌握Pandas与NLP结合的技巧。
542 20
|
自然语言处理 API C++
阿里通义推出SmartVscode插件,自然语言控制VS Code,轻松开发应用,核心技术开源!
SmartVscode插件深度解析:自然语言控制VS Code的革命性工具及其开源框架App-Controller
2380 1
阿里通义推出SmartVscode插件,自然语言控制VS Code,轻松开发应用,核心技术开源!
|
自然语言处理 算法 Python
自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
【10月更文挑战第9天】自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
476 4
|
机器学习/深度学习 人工智能 自然语言处理
探索AI在自然语言处理中的创新应用
【10月更文挑战第7天】本文将深入探讨人工智能在自然语言处理领域的最新进展,揭示AI技术如何改变我们与机器的互动方式,并展示通过实际代码示例实现的具体应用。
285 1

推荐镜像

更多