从零开始构建用于预测的Web应用程序的生命周期
?他的数据生命周期的科学专为大数据问题和数据科学项目。通常,数据科学项目包含七个步骤,分别是问题定义,数据收集,数据准备,数据探索,数据建模,模型评估和模型部署。本文介绍了数据科学生命周期,以便构建用于心脏病分类的Web应用程序。
如果您想查看生命周期中的特定步骤,则可以阅读它而无需深入了解其他步骤。
问题定义
临床决策通常基于医生的经验和直觉,而不是基于数据中隐藏的丰富知识。这会导致错误和许多影响医疗服务质量的成本。使用分析工具和数据建模可以帮助增强临床决策。因此,这里的目标是建立一个Web应用程序来帮助医生诊断心脏病。的完整代码可在我的GitHub存储库中找到。
数据采集
我从UCI ML收集了心脏病数据集。数据集具有以下14个属性:
年龄:以年为单位的年龄。
性别:性别(1 =男性; 0 =女性)。
cp:胸痛类型(0 =典型心绞痛; 1 =非典型心绞痛; 2 =非心绞痛; 3:无症状)。
trestbps:入院时的静息血压,单位为毫米汞柱。
chol:血清胆固醇,mg / dl。
fbs:空腹血糖> 120 mg / dl(1 =真; 0 =假)。
restecg:静息心电图检查结果(0 =正常; 1 = ST-T波异常; 2 =可能或确定的左心室肥大)。
丘脑:达到最大心率。
exang:运动引起的心绞痛(1 =是; 0 =否)。
oldpeak:运动引起的ST抑郁相对于休息。
斜率:最高运动ST段的斜率(0 =向上倾斜; 1 =平坦; 2 =向下倾斜)。
ca:含氟染料着色的主要血管的数量(0–3)。
thal:地中海贫血(3 =正常; 6 =固定缺损; 7 =可逆缺损)。
目标:心脏病(1 =否,2 =是)。
数据准备与探索
这是数据头的快照。
Web应用程序-数据头心脏病数据集的标题
乍看之下,数据集包含14列,其中5列包含数值,其中9列包含类别值。
数据集是干净的,并且包含每个变量所需的所有信息。通过使用info(),describe(),isnull()检测功能,没有任何错误,遗漏值,和不一致的值。
#检查空值
df.isnull()。sum()
图片发布
数据集中的空值
通过检查患有和不患有心脏病的人的百分比,发现数据集中56%的人患有心脏病。因此,数据集是相对平衡的。
Web应用程序-数据分发数据集中有无心脏病的人
属性关联
Web应用程序-关联
此热图显示了数据集属性之间的相关性,以及这些属性之间如何相互作用。从热图中,我们可以观察到胸痛类型(cp),运动诱发的心绞痛(exang),运动引起的相对于休息的ST压抑(oldpeak),运动ST段的峰值斜率(slope),运动次数带有荧光素(ca)和地中海贫血(thal)的主要血管(0–3)与心脏病(目标)高度相关。我们还观察到,心脏病与最大心率(thalch)之间存在反比。
此外,我们可以看到,年龄与以浮雕(ca)和最大心率(thalch)着色的主要血管数量(0–3)相关。运动引起的ST相对于静止状态的压抑(老峰)与运动ST段高峰的斜率(斜率)之间也存在关系。此外,胸痛类型(cp)与运动诱发的心绞痛(exang)之间存在关系。
接下来,我们将进一步分析这些功能之间的这些相关性。
1.年龄和最大心率
Web应用程序-年龄和心率之间的散点图
心脏病在老年人中经常发生,而患有心脏病的老年人的最大心率较低。
2.胸痛
Web应用程序-胸痛
胸痛有四种类型:典型的心绞痛,非典型性心绞痛,非心绞痛和无症状。发现大多数心脏病患者有无症状的胸痛。
2.胸痛和运动诱发的心绞痛
Web应用程序-心绞痛
图片发布
患有运动性心绞痛的人;他们通常患有无症状的胸痛,而且更容易患心脏病。
3.地中海贫血
Web应用程序-地中海贫血
具有可逆缺陷的人可能患有心脏病。
4. ST凹陷和峰值运动ST段的斜率。
Web应用程序-opeak和坡度之间的关联
ST段下坡的人ST抑郁的值更高,感染心脏病的机会也更多。ST抑郁症越大,患病的机会越大。
5.主要活动的年龄和数量(0–3),用萤火虫着色。
Web应用程序 -
大多数心脏病患者年龄较大,并且有一个或多个由萤石色着色的主要血管。
资料建模
让我们创建
机器学习模型。我们正在尝试预测一个人是否患有心脏病。我们将' target '列用作类,并将所有其他列用作模型的功能。
#初始化数据和目标
目标= df ['目标']
功能= df.drop(['target'],轴= 1)
–数据分割
我们将数据分为训练集和测试集。80%的数据用于培训,而20%的数据用于测试。
#将数据分为训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(功能,目标,test_size = 0.2,random_state = 0)
–机器学习模型
在这里,我们将尝试以下机器学习算法,然后根据其分类报告选择最佳算法。
支持向量机
随机森林
艾达助推器
梯度提升
以下功能用于训练和评估分类器。
def fit_eval_model(model,train_features,y_train,test_features,y_test): 结果= {} #训练模型
model.fit(train_features,y_train) #测试模型
train_predicted = model.predict(train_features)
test_predicted = model.predict(test_features) #分类报告和混淆矩阵
结果['classification_report'] =分类_报告(y_test,test_predicted)
结果['confusion_matrix'] = confusion_matrix(y_test,test_predicted) 返回结果
初始化模型,训练和评估。
#初始化模型
sv = SVC(random_state = 1)
射频= RandomForestClassifier(random_state = 1)
ab = AdaBoostClassifier(random_state = 1)
gb = GradientBoostingClassifier(random_state = 1)#拟合并评估模型
结果= {}
对于[sv,rf,ab,gb]中的cls:
cls_name = cls .__ class __.__ name__
结果[cls_name] = {}
结果[cls_name] = fit_eval_model(cls,X_train,y_train,X_test,y_test)
现在,我们将打印评估结果。
#打印分类器结果
结果:
打印(结果)在结果中为我
打印()[结果]:
打印(i,':')
打印(结果[结果] [i])
打印()
打印('— —-')
打印()
结果如下:
图片发布支持向量机结果
图片发布随机森林结果
图片发布Ada Boost结果
图片发布梯度提升结果
根据以上结果,最好的模型是Gradient Boosting。因此,我将保存此模型以将其用于Web应用程序。
–保存预测模型
现在,我们将腌制模型,以便可以将其保存在磁盘上。
#将模型另存为序列化的对象pickle
使用open('model.pkl','wb')作为文件:
pickle.dump(gb,文件)
模型部署
现在该开始使用Flask Web应用程序框架部署和构建Web应用程序。对于Web应用程序,我们必须创建:
1. Web应用程序python代码(API),用于加载模型,从HTML模板获取用户输入,进行预测并返回结果。
2.用于前端的HTML模板,允许用户输入患者的心脏病症状并显示患者是否患有心脏病。
文件的结构如下所示:
/
├──model.pkl
├──heart_disease_app.py
├──模板/
└──心脏病Classifier.html
Web App Python代码
您可以在此处找到该Web应用程序的完整代码。
第一步,我们必须导入必要的库。
将numpy导入为np
进口泡菜
从烧瓶导入烧瓶,请求,render_template
然后,我们创建app对象。
#创建应用
app = Flask(__ name__)
之后,我们需要将保存的模型加载model.pkl到应用程序中。
#加载机器学习模型
模型= pickle.load(open('model.pkl','rb'))
home()当根端点‘/’被点击时,该函数被调用。该功能重定向到Heart Disease Classifier.html网站的主页。
#将home函数绑定到URL
@ app.route('/')
def home():
return render_template('Heart Disease Classifier.html')
现在,predict()为端点创建函数‘/predict’.。函数通过POSTmethod定义为该端点。当用户提交表单时,API会收到一个POST请求,API会使用flask.request.form函数从表单中提取所有数据。然后,API使用该模型来预测结果。最后,该函数呈现Heart Disease Classifier.html模板并返回结果。
#将预测功能绑定到URL
@ app.route('/ predict',方法= ['POST'])
defdict():
#将所有表单条目值放在列表中
功能= [float(i)for request.form.values()中的i]
#将要素转换为数组
array_features = [np.array(features)]
#预测功能
预测= model.predict(array_features)
输出=预测
#检查输出值,并根据该值使用html标签检索结果
如果输出== 1:
return render_template('Heart Disease Classifier.html',
结果=“患者不太可能患有心脏病!”)
其他:
return render_template('Heart Disease Classifier.html',
结果=“患者可能患有心脏病!”)
最后,启动flask服务器,并通过调用在计算机上本地运行我们的网页app.run(),然后http://localhost:5000 在浏览器中输入。
如果__name__ =='__main__':
#运行应用程序
app.run()
HTML模板
下图显示了HTML表单。您可以在此处找到代码。
图片发布
该表格有13个功能的13个输入和一个按钮。该按钮将POST请求/predict与输入数据一起发送到端点。在表单标签中,action属性predict在提交表单时调用函数。
<form action =“ {{url_for('predict')}}}”方法=“ POST”>
最后,HTML页面在result参数中显示存储的结果。
<strong style =“ color:red”> {{result}} </ strong>
图片发布
概要
在本文中,您学习了如何创建Web应用程序以从头开始进行预测。首先,我们从问题定义和数据收集开始。然后,我们进行了数据准备,数据探索,数据建模和模型评估。最后,我们使用烧瓶部署了该模型。
题库