前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Streamlit构建机器学习应用

用Streamlit构建机器学习应用

作者头像
AiTechYun
发布2019-11-11 13:03:25
1.1K0
发布2019-11-11 13:03:25
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号
编辑 | sulei 发布 | ATYUN订阅号

Streamlit是一个开放源码的Python库,它可以轻松地为机器学习建模漂亮的应用程序。你可以很容易地通过pip在你的终端上安装它,然后开始用Python编写你的网络应用程序。

在这里中,我将展示关于Streamlit的一些有趣的特性,并构建一个应用程序来检查数据并在其上生成ML模型。否则,我将使用非常基本的Iris数据集并执行一些分类。但是,如果您对这个工具的高级功能研究,我建议您阅读本教程。

说到这里,让我们开始构建我们的应用程序。我将在一个名为iris.py的文件中编写所有代码,这样我就可以通过streamlit iris.py从终端运行它。

最后,我的应用程序的完整代码如下:

代码语言:javascript
复制
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.graph_objects as gost.title('Iris')df = pd.read_csv("iris.csv")if st.checkbox('Show dataframe'):
    st.write(df)st.subheader('Scatter plot')species = st.multiselect('Show iris per variety?', df['variety'].unique())
col1 = st.selectbox('Which feature on x?', df.columns[0:4])
col2 = st.selectbox('Which feature on y?', df.columns[0:4])new_df = df[(df['variety'].isin(species))]
st.write(new_df)
# create figure using plotly express
fig = px.scatter(new_df, x =col1,y=col2, color='variety')
# Plot!st.plotly_chart(fig)st.subheader('Histogram')feature = st.selectbox('Which feature?', df.columns[0:4])
# Filter dataframe
new_df2 = df[(df['variety'].isin(species))][feature]
fig2 = px.histogram(new_df, x=feature, color="variety", marginal="rug")
st.plotly_chart(fig2)st.subheader('Machine Learning models')from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix
from sklearn.svm import SVCfeatures= df[['sepal.length', 'sepal.width', 'petal.length', 'petal.width']].values
labels = df['variety'].valuesX_train,X_test, y_train, y_test = train_test_split(features, labels, train_size=0.7, random_state=1)alg = ['Decision Tree', 'Support Vector Machine']
classifier = st.selectbox('Which algorithm?', alg)
if classifier=='Decision Tree':
    dtc = DecisionTreeClassifier()
    dtc.fit(X_train, y_train)
    acc = dtc.score(X_test, y_test)
    st.write('Accuracy: ', acc)
    pred_dtc = dtc.predict(X_test)
    cm_dtc=confusion_matrix(y_test,pred_dtc)
    st.write('Confusion matrix: ', cm_dtc)elif classifier == 'Support Vector Machine':
    svm=SVC()
    svm.fit(X_train, y_train)
    acc = svm.score(X_test, y_test)
    st.write('Accuracy: ', acc)
    pred_svm = svm.predict(X_test)
    cm=confusion_matrix(y_test,pred_svm)
    st.write('Confusion matrix: ', cm)

现在,让我们检查每一段代码。首先,一旦引入了所需的包,我想设置我的应用程序的标题并导入我的数据:

代码语言:javascript
复制
import streamlit as st
import pandas as pd
import numpy as np
import plotly.express as px
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.graph_objects as go
st.title('Iris')
df = pd.read_csv("iris.csv")

现在我想要第一个选项,允许用户决定是否显示整个数据集我可以使用以下语法来完成此操作(以及许多其他交互小部件)。:

代码语言:javascript
复制
if st.checkbox('Show dataframe'): 
     st.write(df)

尽管很幼稚,但我们已经可以启动baby应用程序,并在本地主机:8501上看到结果:

正如您所看到的,我决定显示我的数据集,但是,在任何时候,我都可以通过取消替换来隐藏它。

现在让我们转向一些可视化工具。假设我想对数据进行散点绘图,可以选择我发现的特性和标签。

代码语言:javascript
复制
species = st.multiselect('Show iris per variety?', 
df['variety'].unique())
col1 = st.selectbox('Which feature on x?', df.columns[0:4])
col2 = st.selectbox('Which feature on y?', df.columns[0:4])
new_df = df[(df['variety'].isin(species))]
st.write(new_df)
fig = px.scatter(new_df, x =col1,y=col2, color='variety')
st.plotly_chart(fig)
<p style="text-align: center;"><img src="http://imgcdn.atyun.com/2019/11/0_YJj9bdspKByQ1TR2.png" alt="用 Streamlit 构建机器学习应用" width="784" height="1024"></p>

正如你所看到的,在这个例子中,我选择了Versicolor和Virginica作为样本,它们的特征是花瓣片的长度和宽度,但我能够随时更改它们,并实时更新我的所有图表。

现在,我想用同样的逻辑,添加一个直方图来显示任何特性的分布变化,我想有可能出现每个特征的3个条件分布,相对于之前选择的变化。因此:

代码语言:javascript
复制
feature = st.selectbox('Which feature?', df.columns[0:4])
# Filter dataframe
new_df2 = df[(df['variety'].isin(species))][feature]
fig2 = px.histogram(new_df, x=feature, color="variety",

marginal="rug")
st.plotly_chart(fig2)

这两个物种和我上面选择的一样,同样,我可以随时改变它们。

现在,我们进入最后一部分,即训练实时ML算法并让用户决定应用该算法。逐步,我将在支持矢量机和决策树这两种分类算法之间进行选择。对于每一个,我都会要求我的应用打印准确率(正确分类的数量/观察总数)和替代矩阵:

代码语言:javascript
复制
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix
from sklearn.svm import SVCfeatures= df[['sepal.length', 'sepal.width', 'petal.length', 'petal.width']].values
labels = df['variety'].valuesX_train,X_test, y_train, y_test = train_test_split(features, labels, train_size=0.7, random_state=1)alg = ['Decision Tree', 'Support Vector Machine']
classifier = st.selectbox('Which algorithm?', alg)
if classifier=='Decision Tree':
    dtc = DecisionTreeClassifier()
    dtc.fit(X_train, y_train)
    acc = dtc.score(X_test, y_test)
    st.write('Accuracy: ', acc)
    pred_dtc = dtc.predict(X_test)
    cm_dtc=confusion_matrix(y_test,pred_dtc)
    st.write('Confusion matrix: ', cm_dtc)elif classifier == 'Support Vector Machine':
    svm=SVC()
    svm.fit(X_train, y_train)
    acc = svm.score(X_test, y_test)
    st.write('Accuracy: ', acc)
    pred_svm = svm.predict(X_test)
    cm=confusion_matrix(y_test,pred_svm)
    st.write('Confusion matrix: ', cm)

那么,如果我选择SVM:

所以我们能够立即比较两个分类器的性能,以一种非常友好的方式。

Streamlit是一个非常强大的工具,尤其是当您希望提供一种相互之间的方式来理解您的分析结果时更精确:它允许对数据进行实时可视化,并允许对数据进行过滤,还允许提供的表示。

在这里,我向您展示了您可以使用Streamlit实现的非常基本的实现,因此,如果您想更深入地研究这个工具,我建议您阅读参考资料中的进一步阅读资料。

参考文献:

https://streamlit.io/docs/

https://streamlit.io/docs/tutorial/index.html

链接:

http://towardsdatascience.com/building-machine-learning-apps-with-streamlit-667cef3ff509

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

本文分享自 ATYUN订阅号 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档