广告区

广告区


本站消息

站长简介/公众号

关注本站官方公众号:程序员总部,领取三大福利!
福利一:python和前端辅导
福利二:进程序员交流微信群,专属于程序员的圈子
福利三:领取全套零基础视频教程(python,java,前端,php)

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2021-07(1)

2021-08(9)

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

发布于2022-06-20 23:44     阅读(35)     评论(0)     点赞(3)     收藏(2)



目录

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

 

得到的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. 数据预处理

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

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

② 将定类数据扩展为特征

③ 导出预处理后的数据

  1. import pandas as pd
  2. df = pd.read_csv('dataset/heart.csv')
  3. # 将定类特征由整数编码转为实际对应的字符串,还原为真实含义
  4. df['sex'][df['sex'] == 0] = 'female'
  5. df['sex'][df['sex'] == 1] = 'male'
  6. df['cp'][df['cp'] == 0] = 'typical angina'
  7. df['cp'][df['cp'] == 1] = 'atypical angina'
  8. df['cp'][df['cp'] == 2] = 'non-anginal pain'
  9. df['cp'][df['cp'] == 3] = 'asymptomatic'
  10. df['fbs'][df['fbs'] == 0] = 'lower than 120mg/ml'
  11. df['fbs'][df['fbs'] == 1] = 'greater than 120mg ml'
  12. df['restecg'][df['restecg'] == 0] = 'normal'
  13. df['restecg'][df['restecg'] == 1] = 'ST-T wave abnormality'
  14. df['restecg'][df['restecg'] == 1] = 'left ventricular hyper trophy'
  15. df['exang'][df['exang'] == 0] = 'no'
  16. df['exang'][df['exang'] == 1] = 'yes'
  17. df['slope'][df['slope'] == 0] = 'upsloping'
  18. df['slope'][df['slope'] == 1] = 'flat'
  19. df['slope'][df['slope'] == 1] = 'downsloping'
  20. df['thal'][df['thal'] == 0] = 'unknown'
  21. df['thal'][df['thal'] == 1] = 'normal'
  22. df['thal'][df['thal'] == 1] = 'fixed defect'
  23. df['thal'][df['thal'] == 1] = 'reversable defect'
  24. # 将离散的定类和定序特征列转为One-Hot独热编码
  25. # 将定类数据扩展为特征
  26. df = pd.get_dummies(df)
  27. # 导出预处理后的数据
  28. df.to_csv('process_heart.csv',index=False)

 

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

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

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as p1t
  4. %matplotlib inline
  5. # 忽略警告
  6. import warnings
  7. warnings.filterwarnings("ignore")
  8. df = pd.read_csv('process_heart.csv')

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

  1. # 去掉这一列 矩阵用X表示 input
  2. X = df.drop('target',axis=1)
  3. # y向量
  4. y = df['target']

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

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

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

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

 第五,将决策树可视化

  1. # 将输出特征值转为字符串
  2. feature_names = X_train.columns
  3. y_train_str = y_train.astype('str')
  4. y_train_str[y_train=='0'] = 'no disease'
  5. y_train_str[y_train=='1'] = 'disease'
  6. y_train_str = y_train_str.values
  7. # 将决策树可视化
  8. from sklearn.tree import export_graphviz
  9. export_graphviz(estimator,out_file='tree.dot',
  10. feature_names = feature_names,
  11. class_names = y_train_str,
  12. rounded = True,proportion = True,
  13. label='root',
  14. precision = 2,filled = True)
  15. from subprocess import call
  16. call(['dot','-Tpng','tree.dot','-o','tree.png','-Gdpi=600'],shell=True)
  17. from IPython.display import Image
  18. Image(filename = 'tree.png')

5. 预测测试集数据

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

  1. # 忽略警告
  2. import warnings
  3. warnings.filterwarnings("ignore")
  4. import numpy as np
  5. import pandas as pd
  6. import matplotlib.pyplot as plt
  7. %matplotlib inline
  8. #导入数据集,划分特征和标签
  9. df = pd.read_csv('process_heart.csv')
  10. X = df.drop('target',axis=1)
  11. y = df['target']
  12. #划分训练集和测试集
  13. from sklearn.model_selection import train_test_split
  14. X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.2,random_state=10)
  15. #构建随机森林模型
  16. from sklearn.ensemble import RandomForestClassifier
  17. model = RandomForestClassifier(max_depth=5,n_estimators=100)
  18. model.fit(X_train, y_train)

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

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

 第三,预测单个未知样本

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

  第四,预测整个测试样本

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

6. 构建混淆矩阵

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

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

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

8. ROC曲线、AUC曲线

  1. # ROC曲线
  2. y_pred_quant = model.predict_proba(X_test)[:,1]
  3. from sklearn. metrics import roc_curve,auc
  4. fpr,tpr,thresholds = roc_curve(y_test,y_pred_quant)
  5. plt.plot(fpr,tpr)
  6. plt.plot([0,1],[0,1],ls="--",c=".3")
  7. plt.xlim([0.0,1.0])
  8. plt.ylim([0.0,1.0])
  9. plt.rcParams['font.size'] = 12
  10. plt.title('ROC curve')
  11. plt.xlabel('False Positive Rate (1 - Specificity)')
  12. plt.ylabel('True Positive Rate (Sensitivity)')
  13. plt.grid(True)
  14. # 计算AUC曲线
  15. auc(fpr,tpr)

原文链接:https://blog.csdn.net/weixin_42322991/article/details/124857777







所属网站分类: 技术文章 > 博客

作者:可以给我吃一口吗

链接:https://www.pythonheidong.com/blog/article/1594403/1ac3a2c5b90aba1ada62/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

3 0
收藏该文
已收藏

评论内容:(最多支持255个字符)