练习(二)——威斯康辛乳腺癌数据集

2023-11-19

该数据集来自南斯拉夫卢布尔雅那大学医疗中心肿瘤研究所,由M. Zwitter 与
M. Soklic 二者提供,感谢。该数据集可在UCI数据库中找到。该数据库是加州大学欧文分校提出的用于机器学习的数据库,是一个常用的标准测试数据集。


在这里插入图片描述
该数据集有2大类,9个属性,共286个实例。
class:类别,分别是乳腺癌复发(recurrence-events)和未复发(no-recurrence-events)

age:年龄,有 20-29, 30-39, 40-49, 50-59, 60-69, 70-79,六个区间

menopause:绝经期,分为prememo(未绝经),ge40(40岁之后绝经),lt40(40岁之前绝经)

tumor-size:肿瘤大小

inv-nodes:淋巴结个数

node-caps:结节冒有无

deg-malig:肿瘤恶性程度,分为1、2、3三种,3恶性程度最高

breast: 分为left和right

breast-quad:所在象限

irradiat:是否有放射性治疗经历


数据清洗
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
%matplotlib inline
mpl.rcParams['font.sans-serif'] = ['simhei']
mpl.rcParams['font.serif'] = ['simhei']
plt.rc("font",family="SimHei",size="14") 
sns.set_style("darkgrid")

cancer=pd.read_csv("C:\\Users\\HP\\cancer\\cancer.txt")
cancer.columns=['class','age','menopause','tumor-size','inv-nodes','node-caps','deg-malig','breast','breast-quad','irradiat']
cancer.head()
#cancer.info()

我认为左右胸和肿瘤所在象限是重复的属性,所以把breast这个属性drop掉

cancer.loc[cancer["class"]=="no-recurrence-events","class"]=1
cancer.loc[cancer["class"]=="recurrence-events","class"]=0

cancer.loc[cancer["menopause"]=="premeno","menopause"]=0
cancer.loc[cancer["menopause"]=="lt40","menopause"]=1
cancer.loc[cancer["menopause"]=="ge40","menopause"]=2

cancer.loc[cancer["node-caps"]=="no","node-caps"]=0
cancer.loc[cancer["node-caps"]=="yes","node-caps"]=1
cancer.loc[cancer["node-caps"]=="?","node-caps"]=1
#node-caps结节冒未知就当做有

cancer.loc[cancer["irradiat"]=="no","irradiat"]=1
cancer.loc[cancer["irradiat"]=="yes","irradiat"]=0

cancer=cancer.drop(['breast'],axis=1)
cancer.head()

将字符型转换为数值型
在这里插入图片描述
这些专业名词具体是什么我也不清楚,所以进行可视化,看看哪些是主要的影响因素

fig,axes = plt.subplots(2,2,figsize=(18,13))
sns.barplot(x='age',y='class',data=cancer,ax=axes[0,0],order=["20-29","30-39","40-49","50-59","60-69","70-79"])
sns.barplot(x='menopause',y='class',data=cancer,ax=axes[0,1])
sns.countplot(x='menopause',hue='class',data=cancer[cancer.age.isin(['30-39'])],ax=axes[1,0])
sns.barplot(x='irradiat',y='class',hue='breast-quad',data=cancer,ax=axes[1,1])

在这里插入图片描述
左上图1可以看出,乳腺癌复发的概率和年龄关系不大,但在30-39这个年龄段,可能因为绝经的原因(猜测),而导致复发率相比较高,故做图3,发现30-39基本为未绝经患者。
同时图2表明,绝经时期对复发率有一定影响,但影响不大。
图4表明,经过放疗会较大程度地增加复发的概率。
当然这些只是猜测,具体还需模型验证。

fig,(ax1,ax2,ax3) = plt.subplots(1,3,figsize=(20,5))

sns.barplot(x='tumor-size',y='class',data=cancer,order=['0-4','5-9','10-14','15-19','20-24','25-29','30-34','35-39','40-44','45-49','50-54'],ax=ax1)
sns.barplot(x='inv-nodes',y='class',data=cancer,ax=ax2)
sns.barplot(x='node-caps',y='class',data=cancer,ax=ax3)

在这里插入图片描述
上面三个可知,肿块大小,淋巴个数多少,结节冒有无,都影响着复发率

sns.barplot(x='deg-malig',y='class',data=cancer)

在这里插入图片描述
恶化程度越深,复发率越高


经过可视化可以对这些特征有个初步认识,如放疗、结节冒、恶化程度等对乳腺癌复发影响程度较大
接下来对数据进行标签化

数据标签化
from sklearn import preprocessing
le = preprocessing.LabelEncoder()

features = ['age','tumor-size','inv-nodes','breast-quad']
#print("encoding....")
for feature in features:  
    #非数字型和数字型标签值标准化
    le.fit(cancer[feature])
    cancer[feature] = le.transform(cancer[feature])
#print("over....")
cancer.head()

在这里插入图片描述

分割数据
from sklearn.model_selection import train_test_split

predictors=cancer.columns[1:]
X_train,X_test,y_train,y_test=train_test_split(cancer[predictors],cancer['class'],test_size=0.2,random_state=1)
构建模型

采用三种模型进行预测:决策树、随机森林和支持向量机

决策树
###下为决策树代码
from sklearn.model_selection import GridSearchCV 
from sklearn.tree import DecisionTreeClassifier
from sklearn import metrics 

max_depth=range(4,10,1) 
min_samples_split=range(2,12,1) 
min_samples_leaf=range(2,12,1) 
parameters_dtc={'max_depth':max_depth,'min_samples_split':min_samples_split,'min_samples_leaf':min_samples_leaf}

grid_search=GridSearchCV(estimator=DecisionTreeClassifier(),param_grid=parameters_dtc,cv=10,n_jobs=-1) 
grid_search.fit(X_train,y_train) 
grid_search.best_params_

{‘max_depth’: 5, ‘min_samples_leaf’: 9, ‘min_samples_split’: 2}

import pydotplus
from sklearn.tree import export_graphviz

#根据调参结果构建决策树 
dtc=DecisionTreeClassifier(max_depth=5,min_samples_split=2,min_samples_leaf=9) 
dtc.fit(X_train,y_train) 
y_predict=dtc.predict(X_test) 

print("决策树模型在测试集上的准确率为:",metrics.accuracy_score(y_test,y_predict))

###保存图像到pdf文件
dot_data = export_graphviz(dtc,out_file=None,feature_names=predictors,class_names="class",filled=True, rounded=True,special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("cancer_tree.pdf")

决策树模型在测试集上的准确率为: 0.8070175438596491

随机森林
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import make_scorer, accuracy_score
from sklearn.model_selection import GridSearchCV

#选择分类器的类型
RF = RandomForestClassifier()

#可以通过定义树的各种参数,限制树的大小,防止出现过拟合现象
parameters = {'n_estimators': [50,100,200], 
              'criterion': ['entropy', 'gini'],        
              'max_depth': [4,5,6], 
              'min_samples_split': [2,4,6,8],
              'min_samples_leaf': [2,4,6,8,10]
             }

#自动调参,通过交叉验证确定最优参数。
grid_obj = GridSearchCV(RF,parameters,cv=10,n_jobs=1)
grid_obj = grid_obj.fit(X_train,y_train)

clf = grid_obj.best_estimator_
clf.fit(X_train,y_train)

RandomForestClassifier(bootstrap=True, class_weight=None, criterion=‘entropy’,
max_depth=4, max_features=‘auto’, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=8, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1,
oob_score=False, random_state=None, verbose=0,
warm_start=False)

predictions = clf.predict(X_test)
print("随机森林模型在测试集上的准确率为:",accuracy_score(y_test,predictions))

随机森林模型在测试集上的准确率为: 0.8421052631578947

#影响乘客是否幸存的重要因素
importance=clf.feature_importances_
series=pd.Series(importance,index=X_train.columns)
series.sort_values(ascending=True).plot('barh')
plt.show()

在这里插入图片描述
由图可知,肿瘤恶性程度、肿瘤大小以及淋巴结个数是导致乳腺癌复发的主要因素
这与前文可视化的图相一致

SVM
#支持向量机
from sklearn.svm import SVC

svr=SVC()
parameters_SVM={'kernel':['rbf','linear'],'C':range(4,5,6),'gamma':[0.1,0.5,1]}

grid_SVM=GridSearchCV(svr,parameters_SVM,cv=10)
grid_SVM.fit(X_train,y_train)
clf_SVM=grid_SVM.best_estimator_
clf_SVM.fit(X_train,y_train)

print(clf_SVM)
print("支持向量机在训练集上的准确率为:",clf_SVM.score(X_train,y_train))
print("支持向量机在测试集上的准确率为:",clf_SVM.score(X_test,y_test))

SVC(C=4, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape=‘ovr’, degree=3, gamma=0.1, kernel=‘rbf’,
max_iter=-1, probability=False, random_state=None, shrinking=True,
tol=0.001, verbose=False)
支持向量机在训练集上的准确率为: 0.8596491228070176
支持向量机在测试集上的准确率为: 0.7543859649122807


总结

随机森林模型在测试集上的准确率为: 0.8421052631578947,是三者之中最好的,并且准确率有84%,预测效果还是挺准确的,但对于医疗疾病来说,准确率还需要提升,可能还有其他的算法能提高准确率,由于还没学到,这里就不讨论了。
最后,祝愿全世界患者能够早日康复~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

练习(二)——威斯康辛乳腺癌数据集 的相关文章

  • 查询目标服务器系统,查看目标服务器的操作系统

    查看目标服务器的操作系统 内容精选 换一换 云硬盘挂载至云服务器时 无法挂载 以下排查思路根据原因的出现概率进行排序 建议您从高频率原因往低频率原因排查 从而帮助您快速找到问题的原因 如果解决完某个可能原因仍未解决问题 请继续排查其他可能原

随机推荐

  • Linux-乌班图常用命令

    Linux提供了大量的命令 利用它可以有效地完成大量的工作 如磁盘操作 文件存取 目录操作 进程管理 文件权限设定等 所以 在Linux系统上工作离不开使用系统提供的命令 要想真正理解Linux系统 就必须从Linux命令学起 通过基础的命
  • Android框架体系架构的知识,值得收藏!

    一 概述 随着业务的发展 工程的逐渐增大与开发人员增多 很多工程都走向了模块化 组件化 插件化道路 来方便大家的合作开发与降低业务之间的耦合度 现在就和大家谈谈模块化的交互问题 首先看下模块化的几个优势 模块化的优势 结构清晰 业务独立 代
  • BUUCTF Web [极客大挑战 2019]Knife

    作者主页 士别三日wyx 此文章已录入专栏 网络攻防 持续更新热门靶场的通关教程 未知攻 焉知收 在一个个孤独的夜晚 你完成了几百个攻防实验 回过头来才发现 已经击败了百分之九十九的同期选手 极客大挑战 2019 Knife 一 题目简介
  • Android Context

    1 Context概念 Context 中文直译为 上下文 小学读语文的时候我们知道 有时候理解一个句子 需要看看上下文 这里上下文有时需要看看上下临接着的几段话就可以理解他的意思 有时候呢 我们需要把整篇文章都读取一遍才能知道他的意思 一
  • 【基于Leaflet和Canvas绘图的前端大量栅格数据渲染】

    1 需求 有包含30万坐标点的json文件 每个坐标点包含经度 纬度 行值 列值 数值 现需要根据数值分级进行不同颜色的显示 并在地图的正确位置进行渲染 最终效果如下 2 环境和工具 2 1 使用Edge Chrome 实测采用Chromi
  • 深度学习 -- Faster rcnn 算法流程详解

    经典论文 后续很多论文以此为基础 所以搞懂流程比较重要 中间如果 有写的不对 有问题或者看不懂的地方 还望指正 如果有了新的理解 我会持续更新 Faster Rcnn是目前学术上用的非常多的目标检测算法 这里来认真的梳理一遍该算法的流程 主
  • 2020年度全球人工智能十大事件

    当前 新一代人工智能技术在全球蓬勃兴起 迅猛发展 与大数据 区块链 5G等新技术相互融合 相互因应 为经济社会发展尤其是数字经济发展注入新动能 正在深刻改变社会生产生活方式 与此同时 如何在新技术变革浪潮中始终立于主动 实现人工智能等前沿科
  • Nerf(Representing Scenes as Neural Radiance Fields for View Synthesis)代码复现笔记

    前言 本文旨在帮助小白快速了解or学习复现出Nerf的代码 整体结构保持不变 不过会针对部分细节为了更好理解进行了修改 本文会相应更新讲解视频于B站 id 出门吃三碗饭 有问题到b站评论区留言 同步更新于 公众号 AI知识物语 B站讲解视频
  • 向ChatGPT高效提问模板

    我想请你XXXX 请问我应该如何向你提问才能得到最满意的答案 请提供全面 详细的建议 针对每一个建议请你提供具体的提问范例 注意这些范例都是关于如何向你提问获取做这件事的建议的 最后根据你所有的建议 再综合提供一个总的提问范例 注意这个范例
  • 车辆强制降速系统讨论

    近期发生了不少的汽车恶意撞人的事故 造成了严重的人员伤亡 如 江苏盐城警方通报轿车撞人事故致2死6伤 涉事司机已被控制 在当前的科技水平下 这样的事件是可以通过技术手段来避免的 这就是车辆强制降速系统 FRS 通过摄像头 雷达等传感器来判断
  • QQ个人文件夹保存位置无效

    必须写文章谴责QQ这种垃圾软件 B 了 dog 腾讯家的QQ真没几个好用的 之前是PC版QQ群文件跳转回来显示错误bug 之后是手机QQ看点等各种消息bug 现在隔了几年了还有 个人文件夹保存位置无效 根本没有改进 QQ个人文件夹保存位置无
  • $emit传递参数

    emit传递一个参数时 子组件代码 let data name 王五 age 50 this emit change data 父组件代码
  • python traceback安装_Fedora 25工作站:Anaconda在安装过程中抛出Traceback错误

    我正在尝试在联想Ideapad上安装Fedora 25 Workstation 使用具有20GB HDD空间的VMWare Player 2GB RAM 2个处理器核心 安装顺利到第2阶段 Anaconda试图创建用户 然后 它显示弹出错误
  • 从零开始,手把手教你搭建Spring Boot后台工程并说明

    文章目录 前言 一 JDK 二 开发软件 三 项目管理 1 maven安装 2 连接至仓库 3 开发软件配置 四 建立工程 1 Spring initializr方式建立 2 简易的Demo 3 Demo的代码层级解析 4 Mapper资源
  • Python 列表(List)操作方法详解

    本文转载至 http www jb51 net article 47978 htm 列表是Python中最基本的数据结构 列表是最常用的Python数据类型 列表的数据项不需要具有相同的类型 列表中的每个元素都分配一个数字 它的位置 或索引
  • 9.14黄金是否会继续下跌?后市如何布局?

    近期有哪些消息面影响黄金走势 今日黄金多空该如何研判 黄金消息面解析 周四 9月14日 现货黄金小幅上涨 现报1912美元 盎司附近 美元指数维持在104 76多头走势不变 美国消费者物价指数 CPI 爆出大量 通胀月率上涨0 6 年率反弹
  • LeetCode 142. 环形链表 II

    题目链接 https leetcode cn problems linked list cycle ii 思路如下 用两个指针 fast slow 同时从起点开始走 fast 每次走两步 slow 每次走一步 如果过程中 fast 走到 n
  • UDP服务recvfrom函数设置非阻塞

    基本概念 其实UDP的非阻塞也可以理解成和TCP是一样的 都是通过socket的属性去做 方法一 通过fcntl函数将套接字设置为非阻塞模式 方法二 通过套接字选项SO RECVTIMEO设置超时 方法一源码 编译 g udp server
  • pyqt5

    简介 PyQt5 tutorial 2023 Create a GUI with Python and Qt 官方提供了几本书 我没钱买 有钱买了的大哥 可不可以提供一份拷贝本 这是一个前端框架 特点是跨平台 Windows Mac or
  • 练习(二)——威斯康辛乳腺癌数据集

    该数据集来自南斯拉夫卢布尔雅那大学医疗中心肿瘤研究所 由M Zwitter 与 M Soklic 二者提供 感谢 该数据集可在UCI数据库中找到 该数据库是加州大学欧文分校提出的用于机器学习的数据库 是一个常用的标准测试数据集 该数据集有2