【实战 01】心脏病二分类数据集

2023-11-09

目录

1. 获取数据集

2. 数据集介绍

3. 数据预处理

4. 构建随机森林分类模型

5. 预测测试集数据

6. 构建混淆矩阵

7. 计算查全率、召回率、调和平均值

8. ROC曲线、AUC曲线


 (注:每一章节可以为一个py文件,4、5、6、7写在同一个文件中,最好用jupyter notebook)

1. 获取数据集

下面两种方式:UCI、Kaggle

UCI Machine Learning Repository: Heart Disease Data Sethttps://archive.ics.uci.edu/ml/datasets/heart+disease

 Heart Disease Dataset | KagglePublic Health Datasethttps://www.kaggle.com/datasets/johnsmith88/heart-disease-dataset

 

得到的csv文件为:

2. 数据集介绍

数据集有1025行,14列。每行表示一个病人。13列表示特征,1列表示标签(是否患心脏病)


| age      | 年龄                                                         |
| sex      | 性别,1表示男,0表示女                                       |
| cp       | 心绞痛病史,1:典型心绞痛,2:非典型心绞痛,3:无心绞痛,4:无症状 |
| trestbps | 静息血压,入院时测量得到,单位为毫米汞柱(mm Hg)              |
| chol     | 胆固醇含量,单位:mgldl                                       |
| fbs      | 空腹时是否血糖高,如果空腹血糖大于120 mg/dl,值为1,否则值为0 |
| restecg  | 静息时的心电图特征。0:正常。1:  ST-T波有异常。2:根据Estes准则,有潜在的左 |
| thalach  | 最大心率                                                     |
| exang    | 运动是否会导致心绞痛,1表示会,0表示不会                      |
| oldpeak  | 运动相比于静息状态,心电图中的ST-T波是否会被压平。1表示会,0表示不会 |
| slope    | 心电图中ST波峰值的坡度(1:上升,2:平坦,3:下降)              |
| ca       | 心脏周边大血管的个数(0-3)                                    |
| thal     | 是否患有地中海贫血症(3:无,6: fixed defect; 7: reversable defect) |
| target   | 标签列。是否有心脏病,0表示没有,1表示有                     |

3. 数据预处理

 首先要区分好:定类、定序、定距、定比、四种数据的特征

① 我们需要将定类特征由整数转为实际对应的字符串,还原为真实含义。

② 将定类数据扩展为特征

③ 导出预处理后的数据

import pandas as pd
df = pd.read_csv('dataset/heart.csv')

# 将定类特征由整数编码转为实际对应的字符串,还原为真实含义
df['sex'][df['sex'] == 0] = 'female'
df['sex'][df['sex'] == 1] = 'male'
df['cp'][df['cp'] == 0] = 'typical angina'
df['cp'][df['cp'] == 1] = 'atypical angina'
df['cp'][df['cp'] == 2] = 'non-anginal pain'
df['cp'][df['cp'] == 3] = 'asymptomatic'

df['fbs'][df['fbs'] == 0] = 'lower than 120mg/ml'
df['fbs'][df['fbs'] == 1] = 'greater than 120mg ml'

df['restecg'][df['restecg'] == 0] = 'normal'
df['restecg'][df['restecg'] == 1] = 'ST-T wave abnormality'
df['restecg'][df['restecg'] == 2] = 'left ventricular hyper trophy'

df['exang'][df['exang'] == 0] = 'no'
df['exang'][df['exang'] == 1] = 'yes'

df['slope'][df['slope'] == 0] = 'upsloping'
df['slope'][df['slope'] == 1] = 'flat'
df['slope'][df['slope'] == 2] = 'downsloping'

df['thal'][df['thal'] == 0] = 'unknown'
df['thal'][df['thal'] == 1] = 'normal'
df['thal'][df['thal'] == 2] = 'fixed defect'
df['thal'][df['thal'] == 3] = 'reversable defect'


# 将离散的定类和定序特征列转为One-Hot独热编码
# 将定类数据扩展为特征
df = pd.get_dummies(df)

# 导出预处理后的数据
df.to_csv('process_heart.csv',index=False)

 

4. 构建随机森林分类模型

 第一,要拿数据与处理后的文件。

import numpy as np
import pandas as pd
import matplotlib.pyplot as p1t
%matplotlib inline
# 忽略警告
import warnings
warnings.filterwarnings("ignore")
df = pd.read_csv('process_heart.csv')

第二,将数据分为输入和输出

# 去掉这一列  矩阵用X表示  input
X = df.drop('target',axis=1)

# y向量
y = df['target']

第三,数据划分为测试集和训练集

# 将数据划分为训练集和测试集,20%作为测试集,随机数种子
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=10)

 第四,构建随机森林分类模型,在训练集上训练模型

# 构建随机森林分类模型,在训练集上训练模型
from sklearn.ensemble import RandomForestClassifier
# 最大深度为5,决策树为100,随机种子数为5
model = RandomForestClassifier(max_depth=5,n_estimators=100,random_state=5)
# fit 拟合
model.fit(X_train,y_train)
# 可以查看第7个决策树
estimator = model.estimators_[7]

 第五,将决策树可视化

# 将输出特征值转为字符串
feature_names = X_train.columns
y_train_str = y_train.astype('str')
y_train_str[y_train=='0'] = 'no disease'
y_train_str[y_train=='1'] = 'disease'
y_train_str = y_train_str.values

# 将决策树可视化
from sklearn.tree import export_graphviz
export_graphviz(estimator,out_file='tree.dot',
                feature_names = feature_names,
                class_names = y_train_str, 
                rounded = True,proportion = True,
                label='root',
                precision = 2,filled = True)

from subprocess import call
call(['dot','-Tpng','tree.dot','-o','tree.png','-Gdpi=600'],shell=True)
from IPython.display import Image
Image(filename = 'tree.png')

5. 预测测试集数据

#在训练集上训练得到随机森林模型之后,就可以对测试集上的数据进行预测,也可以对新未知数据进行预测。 将预测结果与测试集真正的标签相比#较,可以定量评估模型指标,绘制混淆矩阵,计算Precision、Recall、F1-Score等评估指标,并绘制ROC曲线。混淆矩阵、ROC曲线、F1-#Score
第一,模型准备


# 忽略警告
import warnings
warnings.filterwarnings("ignore")

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
#导入数据集,划分特征和标签
df = pd.read_csv('process_heart.csv')
X = df.drop('target',axis=1)
y = df['target']
#划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.2,random_state=10)

#构建随机森林模型
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(max_depth=5,n_estimators=100)
model.fit(X_train, y_train)

第二,将其中一个测试样本转成数组的形式


## 对数据进行位置索引,从而在数据表中提取出相应的数据。
X_test.iloc
# 筛选出未知样本
test_sample = X_test.iloc[2]
# 变成二维
test_sample = np.array(test_sample).reshape(1,-1)

 第三,预测单个未知样本

#  二分类定性分类结果
model.predict(test_sample)
# 二分类定量分类结果
model.predict_proba(test_sample)

  第四,预测整个测试样本

y_pred = model.predict(X_test)
# 得到患心脏病和不患心脏病的置信度
y_pred_proba = model.predict_proba(X_test)
# 切片操作 只获得患心脏病的置信度
model.predict_proba(X_test)[:,1]

6. 构建混淆矩阵

# 混淆矩阵
from sklearn.metrics import confusion_matrix
confusion_matrix_model = confusion_matrix(y_test, y_pred)
# 将混淆矩阵绘制出来
import itertools
def cnf_matrix_plotter(cm,classes):
    '''
    传入混淆矩阵和标签名称列表,绘制混淆矩阵
    '''
    # plt.imshow (cm, interpolation='nearest', cmap=plt.cm.Greens)
    plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Oranges)
    plt.title('Confusion Matrix')
    plt.colorbar()
    tick_marks = np.arange(len(classes))
    plt.xticks(tick_marks,classes,rotation=45)
    plt.yticks(tick_marks,classes)
    
    threshold = cm.max() / 2.
    for i, j in itertools.product(range(cm. shape[0]), range(cm.shape[1])):
        plt.text(j, i, cm[i,j],
        horizontalalignment="center",
        color="white" if cm[i,j] > threshold else "black",fontsize=25)
    plt.tight_layout()
    plt.ylabel('True Label')
    plt.xlabel(' Predicted Label')
    plt.show()
  cnf_matrix_plotter(confusion_matrix_model,['Healthy','Disease'])
 

7. 计算查全率、召回率、调和平均值

# 计算查全率、召回率、调和平均值
from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred,target_names=['Healthy', 'Disease']))

8. ROC曲线、AUC曲线

# ROC曲线
y_pred_quant = model.predict_proba(X_test)[:,1]
from sklearn. metrics import roc_curve,auc
fpr,tpr,thresholds = roc_curve(y_test,y_pred_quant)
plt.plot(fpr,tpr)
plt.plot([0,1],[0,1],ls="--",c=".3")
plt.xlim([0.0,1.0])
plt.ylim([0.0,1.0])
plt.rcParams['font.size'] = 12
plt.title('ROC curve')
plt.xlabel('False Positive Rate (1 - Specificity)')
plt.ylabel('True Positive Rate (Sensitivity)')
plt.grid(True)

# 计算AUC曲线
auc(fpr,tpr)

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

【实战 01】心脏病二分类数据集 的相关文章

随机推荐

  • Flink执行流程

    1 flink关键字对比spark flink spark operator RDD operator chain stage data flow DAG one to one 窄依赖 redistribute 宽依赖 subtask ta
  • 如何使用 Parallels Desktop 虚拟机在 Mac 上安装 Windows 系统!

    一 下载安装 Parallels Desktop for Mac 如果您刚开始接触 Parallels Desktop for Mac 请点击下载最新版本 访问 如果已是 Parallels Desktop 用户 请继续执行后续步骤 二 自
  • STM32使用bool型变量

    环境Keil5 编译器 include
  • facebook 获取好友列表

    直接上函数 public void getfriends if Session getActiveSession null Session getActiveSession isOpened new Request Session getA
  • javamail发送邮件

    废话不多说 直接上代码 以下三段代码是我的全部代码 朋友们如果想用 直接复制即可 jar包因为我不知道怎么传到javaeye上 所以朋友们回去自己打吧 我的代码有三个类 第一个类 MailSenderInfo java package co
  • Win10 AMD显卡不兼容造成的开机黑屏问题解决

    1 将以下文本粘贴到文本文件中 保存为ULPS Disable reg Windows Registry Editor Version 5 00 HKEY LOCAL MACHINE SYSTEM ControlSet001 Control
  • 根据点云高度赋色(附open3d python代码)

    绘制点云图时用颜色来表征其高度 我们先计算了点云的高度范围 然后把每个点的颜色根据高度来进行映射 稍微修改代码 我们也可以让高度颜色渐变转换为 X 轴距离颜色渐变 稍微修改代码 我们也可以让高度颜色渐变转换为 X 轴距离颜色渐变 codin
  • Promise 实现原理

    文章目录 一 Promise 介绍 二 promise 源码实现 一 Promise 介绍 定义 Promise 是异步编程的一种解决方法 比传统的回调函数和事件更合理 它是由社区提出和实现经由 ES6 将其写进语言标准 并在原生提供了 P
  • Linux安装python3和pip3

    安装python3 yum y install zlib devel bzip2 devel openssl devel ncurses devel sqlite devel readline devel tk devel gdbm dev
  • python serial打开M5串口重启问题

    使用比较常用的方法打开串口 import serial ser serial Serial COM3 115200 使用上述代码 第一次打开会导致m5重启 重启的原因可能跟烧录类似 在烧录程序完毕以后都会重启 解决方法 import ser
  • 问题/lib64/libc.so.6: version `GLIBC_2.18‘ not found

    1 首先下载GLIBC 2 18到本地 2 解压压缩包 3 cd进入到解压好的文件夹内 mkdir build 4 cd build 执行该命令 configure prefix usr disable profile enable add
  • python 绘制正弦余弦函数 matplotlib的基本使用

    matplotlib的基本使用 import matplotlib pyplot as mp import numpy as np x np linspace 0 2 np pi 1000 y sin np sin x y cos np c
  • [初学python]新类(new-style class)

    类 class 也是对象在python之中 万物皆对象 类也是对象 类的类 就被称为元类 即类是元类的实例 正如类的实例的行为取决于类 元类的实例 类 的行为也取决于元类 new style classes的由来new style clas
  • 华为OD机试真题Java_2022-2023-题目0189-最多等和不相交连续子序列

    最多等和不相交连续子序列 题目描述 给定一个数组 我们称其中连续的元素为连续子序列 称这些元素的和为连续子序列的和 数组中可能存在几组连续子序列 组内的连续子序列互不相交且有相同的和 求一组连续子序列 组内子序列的数目最多 输出这个数目 输
  • 笔记24-2(C语言进阶 程序环境和预处理)

    目录 注 预定义详解 预处理符号 举例 使用例 define define 定义标识符 define定义宏 括号很重要 define 替换规则 和 带副作用的宏参数 宏和函数的对比 命名约定 undef 命名行定义 条件编译 常见的条件编译
  • 宏定义 类模板 及类模板的全特化

    如下所示 定义一个宏函数 只要传入类型名 即可生成一个类模板 include
  • 图灵1月书讯:阅新书辞旧岁,览经典迎新年

    原文链接 本期小编为您特别推荐的是 说服人要懂心理学 著名行为心理学家 演讲大师最新力作 七大动力 丰富实例 教你做个说服高手 Susan M Weinschenk拥有行为心理学博士学位 在35年的职业生涯中 她一直致力于把心理学领域对人类
  • c语言把一个数组里面的部分值直接复制到另外一个数组

    头文件是 include
  • MATLAB实现费诺编码的计算与分析

    一 实验目的 1 理解霍费诺编码的原理 2 掌握费诺编码的方法和步骤 3 熟悉费诺编码的效率 4 本实验用Matlab语言编程实现费诺 Fano 编码 二 实验环境 windows XP MATLAB 7 三 实验原理 费诺编码算法如下 在
  • 【实战 01】心脏病二分类数据集

    目录 1 获取数据集 2 数据集介绍 3 数据预处理 4 构建随机森林分类模型 5 预测测试集数据 6 构建混淆矩阵 7 计算查全率 召回率 调和平均值 8 ROC曲线 AUC曲线 注 每一章节可以为一个py文件 4 5 6 7写在同一个文