前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >心脏病预测模型(基于Python的数据挖据)

心脏病预测模型(基于Python的数据挖据)

作者头像
DrugAI
发布2021-01-29 07:38:57
1.8K0
发布2021-01-29 07:38:57
举报
文章被收录于专栏:DrugAI

作者:Abdullah Alrhmoun

该项目的目标是建立一个模型,该模型可以根据描述疾病的特征组合预测心脏病发生的概率。为了实现这一目标,作者使用了瑞士Cleveland Clinic Foundation收集的数据集。该项目中使用的数据集包含针对心脏病的14个特征。数据集显示不同水平的心脏病存在从1到4和0没有疾病。我们有303行人数据,13个连续观察不同的症状。此项目研究了不同的经典机器学习模型,以及它们在疾病风险中的发现。


导入依赖库

代码语言:javascript
复制
#导入依赖库import pandas as pndimport numpy as npfrom sklearn import preprocessingfrom sklearn import neighbors, datasetsfrom sklearn import cross_validationfrom sklearn.linear_model import SGDClassifierfrom sklearn import svmimport operatorfrom sklearn.cross_validation import KFold
import itertoolsimport numpy as npimport matplotlib.pyplot as plt
from sklearn import metricsfrom sklearn.metrics import confusion_matrix
from sklearn import treeimport seaborn as sns
from IPython.display import Image
%matplotlib inline

载入数据

代码语言:javascript
复制
# 添加列名header_row = ['age','sex','chest_pain','blood pressure','serum_cholestoral','fasting_blood_sugar',\               'electrocardiographic','max_heart_rate','induced_angina','ST_depression','slope','vessels','thal','diagnosis']
# 载入数据heart = pnd.read_csv('processed.cleveland.data.csv', names=header_row)heart[:5]
代码语言:javascript
复制
#查看数据维度heart.shape
代码语言:javascript
复制
(303, 14)   #303行人的数据,13个连续观察不同症状。

数据探索

代码语言:javascript
复制
# 计算统计值heart.describe()

>>计算某个特征的人数

代码语言:javascript
复制
names_descr = dict()categorical_columns = ["sex", "chest_pain", "fasting_blood_sugar", "electrocardiographic", "induced_angina", "slope", "vessels", \                       "thal", "diagnosis"]for c in categorical_columns:    print  (heart.groupby([c])["age"].count())

>>使用简单的均值插补方法预处理数据,将缺失的数据更改为平均值

代码语言:javascript
复制
for c in heart.columns[:-1]:    heart[c] = heart[c].apply(lambda x:heart[heart[c]!='?'][c].astype(float).mean() if x == "?" else x)    heart[c] = heart[c].astype(float)

>>心脏病类型发现

代码语言:javascript
复制
set(heart.loc[:, "diagnosis"].values)

(0 :没有疾病;1,2,3,4 代表不同疾病类型)

计算1,2,3,4 levels 之间的相似性

代码语言:javascript
复制
vecs_1 = heart[heart["diagnosis"] == 1 ].median().values[:-2]vecs_2 = heart[heart["diagnosis"] == 2 ].median().values[:-2]vecs_3 = heart[heart["diagnosis"] == 3 ].median().values[:-2]vecs_4 = heart[heart["diagnosis"] == 4 ].median().values[:-2]
代码语言:javascript
复制
print ("Similarity between type 1 and type 2 is ", np.linalg.norm(vecs_1-vecs_2))print ("Similarity between type 1 and type 3 is ", np.linalg.norm(vecs_1-vecs_3))print ("Similarity between type 1 and type 4 is ", np.linalg.norm(vecs_1-vecs_4))print ("Similarity between type 2 and type 3 is ", np.linalg.norm(vecs_2-vecs_3))print ("Similarity between type 2 and type 4 is ", np.linalg.norm(vecs_2-vecs_4))print ("Similarity between type 3 and type 4 is ", np.linalg.norm(vecs_3-vecs_4))
代码语言:javascript
复制
sim = {"(1,2)": np.linalg.norm(vecs_1-vecs_2), \       "(1,3)": np.linalg.norm(vecs_1-vecs_3),\       "(1,4)": np.linalg.norm(vecs_1-vecs_4),\       "(2,3)": np.linalg.norm(vecs_2-vecs_3),\       "(2,4)": np.linalg.norm(vecs_2-vecs_4),\       "(3,4)": np.linalg.norm(vecs_3-vecs_4)          }
代码语言:javascript
复制
# 根据相近值排序sorted_sim = sorted(sim.items(), key=operator.itemgetter(1))sorted_sim

可以分别使用每个特征的值来比较心脏病的类型

代码语言:javascript
复制
heart_d = heart[heart["diagnosis"] >= 1 ]heart_d[:5]

数据预处理

代码语言:javascript
复制
# if "diagnosis" == 0, 没有疾病# if "diagnosis" >= 1, 有疾病heart.loc[:, "diag_int"] = heart.loc[:, "diagnosis"].apply(lambda x: 1 if x >= 1 else 0)
代码语言:javascript
复制
#数据标准化preprocessing.Normalizer().fit_transform(heart)
代码语言:javascript
复制
#划分数据集heart_train, heart_test, goal_train, goal_test = cross_validation.train_test_split(heart.loc[:,'age':'thal'], \                                                 heart.loc[:,'diag_int'], test_size=0.33, random_state=0)  
代码语言:javascript
复制
#计算相关系数corr = heart.corr()heart.corr()
代码语言:javascript
复制
#绘制热图cmap = sns.diverging_palette(250, 10, n=3, as_cmap=True)
def magnify():    return [dict(selector="th",                 props=[("font-size", "7pt")]),            dict(selector="td",                 props=[('padding', "0em 0em")]),            dict(selector="th:hover",                 props=[("font-size", "12pt")]),            dict(selector="tr:hover td:hover",                 props=[('max-width', '200px'),                        ('font-size', '12pt')])]
corr.style.background_gradient(cmap, axis=1)\    .set_properties(**{'max-width': '80px', 'font-size': '10pt'})\    .set_caption("Hover to magify")\    .set_precision(2)\    .set_table_styles(magnify())

探索可视化

代码语言:javascript
复制
#年龄与血压关系import matplotlib.pyplot as plt%matplotlib inline
plt.xlabel("age")plt.ylabel("blood pressure")
# define titleplt.title("Relationship between age and blood pressure")
# plotplt.scatter(heart['age'], heart['blood pressure'])plt.show()

建立训练模型并评估LSS参数

代码语言:javascript
复制
# add parameters for grid searchloss = ["hinge", "log"]penalty = ["l1", "l2"]alpha = [0.1, 0.05, 0.01]n_iter = [500, 1000]
# build the models with different parameters and select the best combination for the highest Accuracybest_score = 0best_param = (0,0,0,0)for l in loss:    for p in penalty:        for a in alpha:            for n in n_iter:                print("Parameters for model", (l,p,a,n))                lss = SGDClassifier(loss=l, penalty=p, alpha=a, n_iter=n)                lss.fit(heart_train, goal_train)                print("Linear regression SGD Cross-Validation scores:")                scores = cross_validation.cross_val_score(lss, heart.loc[:,'age':'thal'], heart.loc[:,'diag_int'], cv=10)                print (scores)                print("Mean Linear regression SGD Cross-Validation score = ", np.mean(scores))
                if np.mean(scores) > best_score:                    best_score = np.mean(scores)                    best_param = (l,p,a,n)

print("The best parameters for model are ", best_param)print("The Cross-Validation score = ", best_score)
代码语言:javascript
复制
lss_best = SGDClassifier(alpha=0.05, fit_intercept=True, loss='log', n_iter=1000,penalty='l1')lss_best.fit(heart_train, goal_train)print("Linear regression SGD Test score:")print(lss_best.score(heart_test, goal_test))   

模型验证

代码语言:javascript
复制
# Compute confusion matrixcnf_matrix = confusion_matrix(goal_test, lss_best.predict(heart_test))np.set_printoptions(precision=2)
# Plot non-normalized confusion matrixplt.figure()plot_confusion_matrix(cnf_matrix, classes=["Heart disease", "No heart disease"],                      title='Confusion matrix, without normalization')plt.show()  

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DrugAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导入依赖库
  • 载入数据
  • 数据探索
  • 计算1,2,3,4 levels 之间的相似性
  • 数据预处理
  • 探索可视化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档