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

本文涉及的产品
NLP自然语言处理_高级版,每接口累计50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_基础版,每接口每天50万次
简介: 【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[ ]:

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

相关文章
|
5月前
|
数据采集 机器学习/深度学习 自然语言处理
NLP助力非结构化文本抽取:实体关系提取实战
本文介绍了一套基于微博热帖的中文非结构化文本分析系统,通过爬虫代理采集数据,结合NLP技术实现实体识别、关系抽取及情感分析。核心技术包括爬虫模块、请求配置、页面采集和中文NLP处理,最终将数据结构化并保存为CSV文件或生成图谱。代码示例从基础正则规则到高级深度学习模型(如BERT-BiLSTM-CRF)逐步演进,适合初学者与进阶用户调试与扩展,展现了中文NLP在实际场景中的应用价值。
308 3
NLP助力非结构化文本抽取:实体关系提取实战
|
4月前
|
数据采集 缓存 自然语言处理
NLP驱动网页数据分类与抽取实战
本文探讨了使用NLP技术进行网页商品数据抽取时遇到的三大瓶颈:请求延迟高、结构解析慢和分类精度低,并以目标站点goofish.com为例,展示了传统方法在采集商品信息时的性能问题。通过引入爬虫代理降低封禁概率、模拟真实用户行为优化请求,以及利用关键词提取提升分类准确性,实现了请求成功率从65%提升至98%,平均请求耗时减少72.7%,NLP分类错误率下降73.6%的显著优化效果。最终,代码实现快速抓取并解析商品数据,支持价格统计与关键词分析,为构建智能推荐模型奠定了基础。
NLP驱动网页数据分类与抽取实战
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
从词袋到Transformer:自然语言处理的演进与实战
自然语言处理(NLP)是人工智能的重要分支,从早期的规则系统发展到如今的深度学习模型,经历了词袋模型、词嵌入、RNN/LSTM/GRU,再到革命性的Transformer架构。本文通过代码和案例详细介绍了这些技术的演进,并展示了如何从简单的词袋模型过渡到强大的Transformer,涵盖文本分类等实战应用,帮助读者深入理解NLP的核心技术和未来发展潜力。
|
12月前
|
自然语言处理 PyTorch 算法框架/工具
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
【10月更文挑战第1天】随着深度学习技术的进步,预训练模型已成为自然语言处理(NLP)领域的常见实践。这些模型通过大规模数据集训练获得通用语言表示,但需进一步微调以适应特定任务。本文通过简化流程和示例代码,介绍了如何选择预训练模型(如BERT),并利用Python库(如Transformers和PyTorch)进行微调。文章详细说明了数据准备、模型初始化、损失函数定义及训练循环等关键步骤,并提供了评估模型性能的方法。希望本文能帮助读者更好地理解和实现模型微调。
815 2
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
|
11月前
|
人工智能 自然语言处理 语音技术
利用Python进行自然语言处理(NLP)
利用Python进行自然语言处理(NLP)
157 1
|
12月前
|
人工智能 自然语言处理 语音技术
利用Python进行自然语言处理(NLP)
利用Python进行自然语言处理(NLP)
266 3
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
296 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】python之人工智能应用篇——文本生成技术
文本生成是指使用自然语言处理技术,基于给定的上下文或主题自动生成人类可读的文本。这种技术可以应用于各种领域,如自动写作、聊天机器人、新闻生成、广告文案创作等。
621 8
|
机器学习/深度学习 前端开发 数据挖掘
基于Python Django的房价数据分析平台,包括大屏和后台数据管理,有线性、向量机、梯度提升树、bp神经网络等模型
本文介绍了一个基于Python Django框架开发的房价数据分析平台,该平台集成了多种机器学习模型,包括线性回归、SVM、GBDT和BP神经网络,用于房价预测和市场分析,同时提供了前端大屏展示和后台数据管理功能。
315 9
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
540 2

热门文章

最新文章

推荐镜像

更多