​在可视化大屏中轻松完成机器学习建模和调参应用实例

77e486d2cc5dded56277b7d96517d841.gif

Streamlit 是一个开源 Python 库,可帮助开发人员为其系统创建交互式图形用户界面。它专为机器学习和数据科学家团队设计。使用 Streamlit,我们可以快速创建交互式 Web 应用程序并进行部署。前端工作对数据科学家来说并不重要,他们只想要一个小的交互场所供用户完成工作,且不必担心无法进行建模算法和参数。Streamlit 帮助数据科学家更加便捷地向其他用户提供 ML 模型并在 Web 应用程序中查看预测。

3178787f4b373ac578b2d3d8135239d9.png

Streamlit 入门

使用 pip 命令安装 Streamlit,可以在Streamlit的官方文档中找到有关安装的更多信息。

cb574ca6030a0452d0c3021ffdf2d280.png

使用 Python 编辑器并创建一个新的 Python 文件。使用以下命令导入 Streamlit 库并设置页面布局。

import streamlit as st
st.set_page_config(page_title='机器学习超参数调整应用程序示例',layout='wide')  #设置页面布局,页面展开到全宽

要在本地系统中运行 Streamlit 应用程序,需要在控制台中运行以下命令以确保您位于具有上述文件的同一目录中。

$ streamlit run your_app_name.py

在终端中看到一个链接;打开该链接将重定向到 Streamlit 应用程序。更改源文件时,在左上角看到重新运行选项。单击它,它会根据新代码更新应用程序。

现在我们知道如何运行 Streamlit,我们使用它来建立一个分类模型。

71c944660daf73209d9790a434b014e7.png

分类模型的预处理步骤

首先,导入必要的库来帮助构建随机森林分类模型。

import streamlit as st  # 导入streamlit以构建应用程序
import numpy as np # 进行数组操作
import pandas as pd # 加载数据集并执行预处理步骤
# scikit learn构建随机森林模型
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score,classification_report,plot_confusion_matrix
import plotly.graph_objects as go # 绘制可视化

首先使用 pandas 将 CSV 文件加载到 pandas DataFrame 中,并将数据集的一些行显示到我们的应用程序中。不要忘记将 CSV 文件重命名为Dataset。该数据集来自kaggle的心脏疾病分类数据集,不幸的是该数据集已被删除,如果需要数据集,请联系原文作者云朵君获取。

下面是该数据集每个字段的介绍。可稍作了解即可。

  1. age:年龄

  2. sex 性别 1=male  0=female

  3. cp  胸痛类型;4种取值情况

  • 1:典型心绞痛

  • 2:非典型心绞痛

  • 3:非心绞痛

  • 4:无症状

trestbps 静息血压

chol 血清胆固醇

fbs 空腹血糖 >120mg/dl  :1=true;0=false

restecg 静息心电图(值0,1,2)

thalach 达到的最大心率

exang 运动诱发的心绞痛(1=yes;0=no)

oldpeak 相对于休息的运动引起的ST值(ST值与心电图上的位置有关)

slope 运动高峰ST段的坡度

  • 1:upsloping向上倾斜

  • 2:flat持平

  • 3:downsloping向下倾斜

ca  The number of major vessels(血管) (0-3)

thal A blood disorder called thalassemia ,一种叫做地中海贫血的血液疾病(3 = normal;6 = fixed defect;;7 = reversable defect)

target 生病没有(0=no;1=yes)

st.write("""
# 机器学习超参数调整应用程序示例
### **(心脏疾病分类模型)**""")
df = pd.read_csv('dataset.csv')#加载数据到pandas数据框
#显示数据集
st.subheader('Dataset')
st.markdown('**心脏疾病** 数据集为例。')
st.write(df.head(5)) #显示数据集的前五行。

write 函数将输入字符串写入您的应用程序;您可以使用多个“#”创建不同的标题,并使用 **()** 以粗体书写单词。在浏览器中重新运行 Streamlit;您应该会看到您的网络应用程序,如下图所示。

96664e3e2e681a473be1ad236de1fe06.gif

创建一个触发构建函数的按钮,它将根据给定的输入超参数构建分类模型。

if st.button('构建模型'):#一些处理步骤dataset = pd.get_dummies(df, columns=['sex', 'cp', 'fbs', 'restecg','exang', 'slope', 'ca', 'thal'])model(dataset)

构建模型有效时(意味着单击该按钮),它将执行一些基本的预处理步骤,例如为数据集的分类数据创建虚拟列。之后将调用模型函数。

def model(df):Y = dataset['target']X = dataset.drop(['target'], axis = 1)# 数据集的划分,其中split_size在后面定义X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=split_size)sc = StandardScaler()X_train = sc.fit_transform(X_train)X_test = sc.transform(X_test)

此函数将pandas DataFrame数据框作为输入。Y是目标变量,它有 0(没有心脏病)和 1(有心脏病)二分类。X 由数据框中的所有自变量组成。我们将数据分成训练和测试两部分。在这里,用户将定义测试大小,该大小存储在 split_size 中。在下一行中,我们初始化了标准缩放器和训练数据;测试数据在训练数据所训练的缩放器(sc)上进行缩放,以确保没有数据泄漏。

6c0a54ba79adf3f94e4dd7e5ae09fadb.png

创建侧边栏

我们制作一个侧边栏,它将从用户那里获取随机森林分类器超参数的值。下面的代码将在函数之外编写。

st.sidebar.header('设置网格搜索的超参数') 
# 在侧边栏中创建标题
split_size = st.sidebar.slider('数据划分的比例为 (% 训练集)', 50, 90, 80, 5)

要将 Streamlit 组件附加到侧边栏中,我们必须在代码中使用侧边栏。Streamlit 中的滑块可以渲染范围或单个整数。上面代码中,50是最小值,90是最大值,80是默认值,5是步长值。

st.sidebar.subheader('机器学习模型参数')
parameter_n_estimators = st.sidebar.slider('随机森林评估器数 (n_estimators)',0, 500, (10,50), 50)
parameter_n_estimators_step = st.sidebar.number_input('n_estimators 的步长', 10)

n_estimator 是指随机森林中树的数量。使用滑块获得可以在 gridsearchcv 中使用的树数量的范围,默认范围为(10,50)

st.sidebar.write('---')
parameter_max_features =st.sidebar.multiselect('(你可以选择多个选项)',['auto', 'sqrt', 'log2'],['auto'])

在上面的行中,multiselect 允许来自给定选项的多个值,max_feature 超参数的默认值是 auto

parameter_max_depth = st.sidebar.slider('Maximum depth', 5, 15, (5,8), 2)
parameter_max_depth_step=st.sidebar.number_input('max_depth 的步长', 1,3)

max_depth 是随机森林中根到树的叶节点之间可能的最长路径。这里使用滑块获得了一系列 max_depth

st.sidebar.write('---')
parameter_criterion = st.sidebar.selectbox('criterion', ('gini', 'entropy'))

上面的代码给出了节点分裂的标准之一。

下面一行还返回一个介于 2 到 10 之间的值,用于交叉验证中的folds数。

st.sidebar.write('---')
parameter_cross_validation=st.sidebar.slider('交叉验证拆分的次数', 2, 10)

另外定义一些其他的超参数。

st.sidebar.subheader('其他参数')
parameter_random_state = st.sidebar.slider('随机数种子', 0, 1000, 42, 1)
parameter_bootstrap = st.sidebar.select_slider('构建树时的Bootstrap示例 (bootstrap)',options=[True, False])
parameter_n_jobs = st.sidebar.select_slider('并行运行的线程数 (n_jobs)',options=[1, -1])

estimators max_depth为必须参数,用其创建一个 numpy 数组。可以用下面的代码行来实现。定义 param_grid (不用于网格搜索的参数值字典)。

n_estimators_range = np.arange(parameter_n_estimators[0], parameter_n_estimators[1]+parameter_n_estimators_step, parameter_n_estimators_step)
"""
if   parameter_n_estimators[0] is 5 
and  parameter_n_estimators[1] 25 
and  parameter_n_estimators_step is 5
then array will be [5,10,15,20,25]
"""
max_depth_range =np.arange(parameter_max_depth[0],parameter_max_depth[1]+parameter_max_depth_step, parameter_max_depth_step)
param_grid = dict(max_features=parameter_max_features,
n_estimators=n_estimators_range,max_depth=max_depth_range)

现在我们的应用程序应该如下图所示。

c15f78c71476d6c0c0dea2aaed747516.png

ea54dc945268290c7647562b5a911686.png

随机森林分类器

现在完成上面定义的模型函数。

rf = RandomForestClassifier(random_state=parameter_random_state,bootstrap=parameter_bootstrap,n_jobs=parameter_n_jobs)
grid = GridSearchCV(estimator=rf, param_grid=param_grid, cv=parameter_cross_validation)
grid.fit(X_train,Y_train)
st.subheader('模型的性能')
Y_pred_test = grid.predict(X_test)

我们使用 RandomForestClassifier() 初始化模型,并将一些超参数传递给它,这些超参数由用户通过侧边栏给出。在此之下,我们将搜索空间定义为超参数值网格,GridSearchCV 评估网格中的每个位置。选择随机森林作为本次分类任务的模型;param_grid 由不同的参数组成,没有像 cv 那样的 folds。最后,使用训练完成的模型预测了测试数据的输出类别。

st.write('给定模型的accuracy 评分')
st.info(accuracy_score(Y_test, Y_pred_test))

accuracy_score() 返回我们模型在测试数据上的准确性,我们将使用 st.info() 在我们的应用程序上显示它。

st.write("最佳参数是 %s,评分为 %0.2f" % (grid.best_params_, grid.best_score_))

grid.best_params_ 将返回从 param_grid 的参数中给出最佳结果的参数。

st.subheader('模型参数')
st.write(grid.get_params())

上述函数将返回用于构建模型的所有参数。

09f756888d7aaafe2017bc3e80703266.png

构建3D可视化工具

#-----处理网格数据-----#
grid_results=pd.concat([pd.DataFrame(grid.cv_results_["params"]),pd.DataFrame(grid.cv_results_["mean_test_score"],columns=["accuracy"])],axis=1)

我们将使用参数和精度创建 pandas DataFrame,将它们 concat 连接起来,并存储在 grid_results 变量中。使用 2 个参数 max_depthn_estimators 对数据进行分组。因为我们想要开发这 2 个参数与精度的 3D 图。

grid_contour = grid_results.groupby(['max_depth','n_estimators']).mean()
grid_reset = grid_contour.reset_index()
grid_reset.columns = ['max_depth', 'n_estimators', 'accuracy']
grid_pivot = grid_reset.pivot('max_depth', 'n_estimators')
x = grid_pivot.columns.levels[1].values
y = grid_pivot.index.values
z = grid_pivot.values

现在为绘图创建 x、y 和 z 索引;x 轴是估计器的数量,y 轴是最大深度,z 轴代表模型的精度。

#定义布局和轴
layout = go.Layout(xaxis=go.layout.XAxis(title=go.layout.xaxis.Title(text='n_estimators')),yaxis=go.layout.YAxis(title=go.layout.yaxis.Title(text='max_depth')) )
fig = go.Figure(data= [go.Surface(z=z, y=y, x=x)], layout=layout )
fig.update_layout(title='Hyperparameter tuning',scene = dict(xaxis_title='n_estimators',yaxis_title='max_depth',zaxis_title='accuracy'),autosize=False,width=800, height=800,margin=dict(l=65, r=50, b=65, t=90))
st.plotly_chart(fig)

这里使用 plotly 库来绘制模型的 3d 图。plotly 可以使用 plotly_chart() 函数与 Streamlit 一起使用,我们必须在此函数中传递 fig。现在使用 scikit-learn 内置的函数分类报告打印两个类的精度precision、召回率recall和 f1-score。可以使用类名和不同的分数访问每个元素,将它们作为键传递。使用 st. write() 将它们写入应用程序。

st.subheader("Classification Report")
#它将以字典的形式返回输出
clf=classification_report(Y_test, Y_pred_test, labels=[0,1],output_dict=True)
st.write("""### 类别 0(没有心脏病) :Precision : %0.2f     Recall : %0.2f      F1-score  : %0.2f"""%(clf['0']['precision'],clf['0']['recall'],clf['0']['f1-score']))
st.write("""### 类别 1(有心脏病) :Precision : %0.3f    Recall : %0.3f      F1-score  : %0.3f"""%(clf['1']['precision'],clf['1']['recall'],clf['1']['f1-score']))
st.subheader("Confusion Matrix")plot_confusion_matrix(grid, X_test, Y_test,display_labels=['没有心脏病','有心脏病'])st.pyplot()

有了以上几行代码,我们就完成了我们的模型功能。现在我们的应用程序可以使用了;保存所有更改并重新运行应用程序;之后,设置超参数的范围并点击构建;应该将 3D 图形如下图所示。

795831dc38a076062892d93cee1fb1df.gif

25b5271b6f3218d4013cb272768e3ffd.png

写在最后

只需在机器学习项目中添加几行代码,就可以在 Streamlit 的帮助下构建如此出色的前端应用程序。从真正意义上讲,Streamlit 让机器学习从业者的工作变得更轻松。本文为了演示,使用了一个非常简单的机器学习项目,但从数据处理、超参数调整、模型构建及预测到结果可视化、模型评价整个机器学习管道都有设计,希望对你有所帮助,记得点个赞和在看呀。

参考资料

[1]Streamlit 的官方文档: https://docs.streamlit.io/


[2]有关超参数调整和不同技术的更多信息: https://machinelearningmastery.com/hyperparameter-optimization-with-random-search-and-grid-search/

[3]Scikit 学习文档: https://scikit-learn.org/stable/user_guide.html

de97a3f00308fc7616dbc6f5cb62a0eb.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EventBridge 事件总线及 EDA 架构解析

简介:EventBridge 是事件驱动的具体落地产品,也是 EDA 的最佳实践方式。 作者:肯梦 作为 Gartner 定义的 10 大战略技术趋势之一,事件驱动架构(EDA)逐渐成为主流技术架构。根据 Gartner 的预估&#xff0…

开发者驱动的软件公司,如何赚取万亿美元?

【CSDN 编者按】在过去二十年中,诞生了两个价值数万亿美元的企业软件行业:SaaS(Software as a Service,软件即服务)软件和公有云。如今,第三个以开发者为核心的万亿美元软件浪潮正在来袭,企业该…

解决vue路由守卫报错信息

//在router文件中写入,修改报错信息 const originalPush VueRouter.prototype.push VueRouter.prototype.push function push(location, onResolve, onReject) {if (onResolve || onReject) {return originalPush.call(this, location, onResolve, onReject)}retu…

好云推荐官丨飞天加速之星怎样选择云服务器ECS?

编者按:本文来自“好云推荐官”活动的技术博主投稿,作者(昵称天狼)曾入选首届“飞天加速之星”,获得飞天人气奖。 ​你是否还在苦苦地寻找一家合适的云厂商,寻找合适的服务器来部署你开发的网站、程序&…

2022钉钉发布会|云钉低代码新模式、新能力、新机遇

简介:宜搭重磅发布酷应用工厂、连接器、AIFaaS扩展等新功能! 3月22日,以“科技向实,万物生长”为主题的2022钉钉发布会在杭州举行。 阿里巴巴资深技术专家,钉钉宜搭创始人叶周全出席发布会,并在 “人人都…

最佳实践|Spring Boot 应用如何快速接入 Prometheus 监控

简介:SpringBoot 微服务的开发、发布与部署只占其生命周期的一小部分,应用和系统运维才是重中之重。而运维过程中,监控工作更是占据重要位置。那么,为了对系统的状态进行持续地观测,面向Spring Boot应用我们该如何快速…

容器进程调度时是该优先考虑CPU资源还是内存资源?

大家好,我是飞哥!前几天看到一个有意思的问题,我前几天在朋友圈分享了,今天再在公众号里给大家发一下。问题是这样的:有 A B 两台服务器,其中 A 服务器 cpu 快满了,内存很空闲。另外一台 B 服务…

基于容器服务 ACK 发行版打造 CNStack 社区版

简介:本文将介绍如何使用 ACK Distro 作为基础镜像打造 CNStack 社区版以及CNStack 社区版中的容器服务 ACK 敏捷版产品如何帮助用户更好的使用容器平台能力。 作者:临石 CNStack 社区版(CNStack Community Edition, CNStack CE&#xff09…

阿里云云原生微服务可观测实践

简介:如果说监控可以告诉我们系统出问题了,那么可观测就可以告诉我们系统哪里出问题了,什么原因导致的问题。可观测不但可以判断系统是否正常,还可以在系统出现问题之前,主动发现系统风险。 作者:十眠、水…

“合”而不同,持“智”以恒,幂律智能2022产品升级发布会全程回顾!

今天,“合”而不同,持“智”以恒,幂律智能2022产品升级发布会正式和大家见面。 发布会共分为「嘉宾致辞」、「产品分享」、「客户实例」等部分,多位行业专家、学者大咖等纷纷发来视频,表达对幂律本次活动的祝愿。 清华…

EMR StarRocks 极速数据湖分析原理解析

简介:数据湖概念日益火热,本文由阿里云开源大数据 OLAP 团队和 StarRocks 数据湖分析团队共同为大家介绍“ StarRocks 极速数据湖分析 ”背后的原理。 【首月99元】EMR StarRocks 数据湖极速分析体验,试用火热进行中,快来申请吧 -…

图解 React 的 diff 算法:核心就两个字 —— 复用

React 是基于 vdom 的前端框架,组件 render 产生 vdom,然后渲染器把 vdom 渲染出来。state 更新的时候,组件会重新 render,产生新的 vdom,在浏览器平台下,为了减少 dom 的创建,React 会对两次的…

基于Confluent+Flink的实时数据分析最佳实践

简介:在实际业务使用中,需要经常实时做一些数据分析,包括实时PV和UV展示,实时销售数据,实时店铺UV以及实时推荐系统等,基于此类需求,Confluent实时计算Flink版是一个高效的方案。 业务背景 在…

深度解读「无影云电脑远程办公解决方案」

简介:疫情常态化,企业如何应对「远程」带来的挑战? 疫情之下,很多企业选择远程办公来保证业务的正常运营,而远程办公解决方案需要具备哪些技术能力来应对“远程”带来的挑战呢? 一,弹性伸缩能…

疯了?黑客公开“25美元入侵星链”法,SpaceX给他钱,还诚邀大家一起来“黑”?...

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近日,国外论坛 Reddit 上的一则热帖给人看“懵”了:SpaceX 诚邀大家来入侵自家的星链(Starlink),成功者有赏。这令人不由感慨:居然…

车脉科技:业内首创“车企体验式营销”

随着新能源汽车不断得到人们的广泛关注,车企在新车型、新市场、新认知下如何提升销量以及用户如何选购一款合心意的智能电动车成为新能源智能时代的汽车营销难题。 车脉科技创业初衷 车脉科技的创始人孙泽锋说道:“创立车脉的初衷,我们一端想…

专访香侬科技:致力于让世界听到中文NLP的声音

像所有的创业者一样,香侬科技的初创团队胸怀梦想,期待有一天当人们提起香侬的时候,除了“信息论之父”,还能想起来有一家用技术在链接大千世界的科技公司——香侬科技。 新生的香侬科技选择“长在云上” 香侬科技的CTO王思宽说起…

驭数有道,天翼云数据库 TeleDB 全新升级

8月16日,以“红云天翼 安全普惠”为主题的天翼云TeleDB系列产品升级发布会在线上顺利举办。此次发布的天翼云自主研发云原生数据库进行了全新升级,推出一站式HTAP融合数据库,以及TeleDB数据库容灾双活方案,同时也展示了TeleDB数据…

如何构建一个流量无损的在线应用架构 | 专题尾篇

简介:我们将这些年在每一个环节中的相应解决方案,以产品化的方式沉淀到企业级分布式应用服务(EDAS)中。EDAS 致力于解决在线应用的全流程流量无损,经过 6 年的精细打磨,已经在流量接入与流量服务两个关键位…

云原生微服务技术趋势解读

简介:随着微服务技术门槛大幅下降,随着企业数字化升级步伐加速,随着云计算的迅速发展,微服务将无处不在;随着行业成熟度逐步提升,随着开源和标准推进,微服务的标准逐步形成,标准形成…