使用 Streamlit 部署 ML 模型的分步指南

已发表: 2020-12-07

目录

介绍

大多数机器学习爱好者都在报名参加一些课程和课程,以开始使用 AI 和 ML。 这些课程涵盖了许多基础知识,并巧妙地指导学习者构建和训练最先进的 ML 模型。

但是大多数初学者都在努力解决的一件事是部署部分。 机器学习项目不能在没有任何交互式应用程序的情况下保持原样。 为了让用户能够轻松地与模型交互,甚至展示我们的项目,我们需要将它们包装到 Web 应用程序、Android 应用程序或使用云服务的某种 API 结构中。

有多种方法可以为我们的模型构建这些包装器,但在本文中,我将重点介绍如何使用 Streamlit 作为该问题的解决方案,以及为什么我认为它是一个如此强大的工具。

本文将提供一步一步的指南,用于构建 ML 项目并使用 Streamlit 为其创建 Web 应用程序平台。 我们将要建设的项目是加州房价预测模型。 该网站将是动态的,学习率、神经元数量等超参数可以通过网络应用程序进行更改和试验。

如果您继续使用 Flask 或 Django 等框架构建这样的 Web 应用程序,我几乎可以肯定,首先构建该 UI 将花费大量时间,然后将其托管在服务器上还有另一个问题每个人都可以访问它。

这里提出了一个主要问题,“当机器学习爱好者可以利用宝贵的时间来学习构建更好的模型时,为什么还要浪费时间学习一些 UI 框架?”

这里将涉及很多关于如何在您的项目中使用 Streamlit 的主题。 随意跳到您想了解更多的任何部分。

  • 为什么选择流光?
  • 构建基本 ML 模型
  • 添加使用魔法的 Streamlit
  • 部署 Streamlit Web 应用程序
  • 结论

为什么选择流光?

Streamlit 让我们可以非常轻松快捷地构建机器学习网络应用程序。 可用于为 ML 模型开发此类包装器的其他方法不是很舒服。

Flask是一个 Python 框架,允许用户开发 Web 应用程序并使用 Python 语言部署它们。 它需要对python有很好的了解,我们也需要花时间学习它。 即使在那之后,与 Streamlit 相比,开发 Web 应用程序也不是一件容易的事。

Django是另一个基于 Python 的 Web 开发框架。 可以说它是 Flask 的一个更好、更复杂的版本。 学习这个框架需要大量的专门时间,最终使用它构建一个 Web 应用程序并没有我们希望的那么快。

Tensorflow.js是保存与 Web 平台兼容的模型的非常好的方法,然后这些模型可用于构建 Web 应用程序。 Tensorflow.js 尚不支持 ML 模型和高级架构的许多复杂实现。 有许多模型可以在 Python 中运行,但可能不适用于 Tensorflow.js 库中的 Javascript。

正如我之前所说,我们不应该浪费时间学习这些框架,而应该学习如何构建好的 ML 模型。 这就是 Streamlit 出现的地方。 它是开发 Web 应用程序的最简单、最快捷的方式。 使用 Streamlit 构建的 Web 应用程序具有出色的 UI 元素并且非常易于使用。

为了支持我关于 Streamlit 是构建 ML Web 应用程序的最简单、最快捷的方式的说法,让我与您分享我是如何遇到这个框架的。 我正在学习如何构建 GAN 并使用它来生成人造人脸、将黑白草图转换为彩色草图以及诸如此类的实现。

这些模型在 Jupyter notebook 中运行良好,但我想与其他人分享。 我开始寻找构建应用程序和托管模型的框架,但我不想浪费时间学习另一个框架,因为我想探索其他 GAN 实现。

我查看了我之前在本文中谈到的所有替代资源。 Sketch-To-Color 生成项目中使用的生成器模型有点复杂。 它是一个 U-Net 架构模型,需要您跳过连接。

由于其高度复杂性,我无法使用 Tensorflow.js 将最终模型转换为 Javascript。 从头开始学习 Flask 或 Django 对我来说不是一个选择,所以我开始寻找其他一些框架或库。

这是我遇到 Streamlit 的时候。 在 Adrien Treuille 的一篇文章中,他展示了他如何用不到 13 行代码为 TL-GAN 构建了一个令人惊叹的 Web 应用程序。 这一切都是可能的,只是因为 Streamlit。

他们官方网站上的文档也非常精确和有用。 我尝试为我的 Sketch to Color GANs 模型制作一个 Streamlit 网络应用程序,这太棒了。 我只需要在我现有的 python 代码中添加 12 行代码。 这就是为什么我最终继续探索 Streamlit 并使用它构建其他项目的原因。

构建基本 ML 模型

如前所述,我们将在此示例中查看加利福尼亚房价预测问题。 首先,让我们看看我们通常如何为此构建模型。 这是一个回归问题。

首先,我们将为我们的简单 ML 模型导入所需的库。 在这里,我们将使用 TensorFlow、pandas 和 NumPy。

将张量流导入为 tf

将 numpy 导入为 np

将熊猫导入为 pd

现在,我们将使用来自 Scikit-Learn 的数据集来下载加州住房数据集。

从 sklearn.datasets 导入 fetch_california_housing

住房 = fetch_california_housing()

接下来,我们需要将加载的数据拆分为训练集、验证集和测试集。 有很多方法可以做到这一点。 我们将使用 Scikit-Learn 库中提供的 train_test_split 函数。 使用它两次会将数据集分为 3 组训练、验证和测试。

从 sklearn.model_selection 导入 train_test_split

X_train_full, X_test, y_train_full, y_test = train_test_split(

住房数据,住房目标

)

X_train, X_valid, y_train, y_valid = train_test_split(

X_train_full, y_train_full

)

我们可用的数据有每个条目的经度和纬度值。 为了更好地可视化这一点,我们可以在地图上制作散点图。 要使用地图,我们将导入Altair库。

将 altair 导入为 alt

map_data = pd.DataFrame(

X_train,

列=[

'医药公司',

《宅时代》,

'AveRooms',

'AveBedrms',

'人口',

'AveOccup',

'纬度',

'经度'

])

中点 = (np.average(map_data[“latitude”]), np.average(map_data[“longitude”]))

st.write(pdk.Deck(

map_style="mapbox://styles/mapbox/light-v9",

初始视图状态={

“纬度”:中点[0],

“经度”:中点[1],

“缩放”:6,

“音高”:75,

},

层=[

pdk.图层(

“六边形层”,

数据=地图数据,

get_position=[“经度”、“纬度”]、

半径=1000,

海拔尺度=4,

海拔范围=[0, 10000],

可挑选=真,

挤压=真,

),

],

))

我们现在拥有的数据没有针对模型进行很好的处理。 我们需要进行预处理以获得更好的结果。 首先,我们需要对值进行归一化,因为大多数机器学习模型在数据处于较小值范围内时效果最佳。 为此,我们将使用 sklearn 库中的 StandardScaler 类。

从 sklearn.preprocessing 导入 StandardScaler

缩放器 = 标准缩放器()

X_train = scaler.fit_transform(X_train)

X_valid = scaler.transform(X_valid)

X_test = scaler.transform(X_test)

准备好数据后,我们现在将创建一个模型。 该模型将是一个神经网络,在第一输入层具有指定数量的神经元,在最后一层具有单个神经元,因为它是一个回归问题。 这可以通过使用 TensorFlow 库来实现。

将张量流导入为 tf

模型 = tf.keras.models.Sequential([

tf.keras.layers.Dense(n_neurons, activation='relu', input_shape=X_train.shape[1:]),

tf.keras.layers.Dense(1)

])

在 TensorFlow 中,我们必须在构建模型后对其进行编译。 在这里,我们必须提到我们将使用的损失函数以及我们想要的优化器。 我们将使用均方误差损失函数和具有特定学习率的 SGD 优化器。

模型.编译(

损失='mean_squared_error',

优化器=tf.keras.optimizers.SGD(l_rate)

)

现在一切就绪。 我们所要做的就是训练模型。 在 TensorFlow 中,这可以通过简单地调用 fit() 方法来完成。 我们可以将所有日志保存在变量history中。

历史 = model.fit(

X_train,

y_train,

epochs=n_epochs,

验证数据=(X_valid,y_valid)

)

训练结束后,我们还可以使用 evaluate() 方法评估模型的准确性和损失。

评估 = model.evaluate(X_test, y_test)

现在,如果我们想使用这个模型来预测任何房价,我们可以通过调用方法predict()来完成

X_new = X_test[:3]

预测 = model.predict(X_new)

这是使用 TensorFlow、scikit-learn 和 pandas 构建简单房价预测模型的方法。 但是你可以看到的问题是,没有办法向其他用户展示这个模型,他们可以与之交互,这只是 Jupyter Notebook 中的一个模型。 所以现在让我们用 Streamlit 添加一些魔法!

另请阅读:机器学习项目理念

使用 Streamlit 添加魔法

要制作机器学习 Web 应用程序,您只需为 Streamlit 函数调用添加几行代码即可。 您不需要任何 HTML、CSS 或 Javascript。 只是纯蟒蛇!

是的,你没看错。 您不必担心其他任何事情。 只需将 Streamlit 安装到您的系统上,您就可以开始使用了。 在终端中使用以下命令:

点安装流光

您可以使用以下命令在他们的 hello world 应用程序中进行探索。 这是一个很好的例子,展示了使用 Streamlit 的 Web 应用程序的外观。:

流光你好

在本地安装 Streamlit 并将神奇的行添加到代码后,您只需执行以下命令即可在本地运行应用程序:

流光运行 file_name.py

所以现在的问题是,“那些神奇的代码行是什么?” 它们很简单。 我将首先解释 Streamlit 中使用的基本功能,然后我将展示代码,以便您可以直接将其与示例联系起来。

首先,我们将使用以下代码行导入 streamlit 库:

导入 streamlit 作为 st

第一个重要功能是您可以简单地在 3 个双引号中键入任何内容,它只会显示 Web 应用程序上的文本。 它支持markdown语言语法。 所以你可以做很多事情,比如标题、项目符号、表格等等。 您也可以使用st.write()函数代替此表示法。 它具有相同的功能。

接下来是with st.echo():函数。 这基本上会执行其中编写的 python 代码,然后它还会在 Web 应用程序上显示它。 通过这种方式,我们可以构建一个展示其构建方式的 Web 应用程序。

st.empty()是稍后为某些动态内容保留的区域。

当执行一段代码有一些延迟时, st.spinner() 会显示一个加载元素。

st.success()以绿色显示一条消息。 这具有成功对话的一个很好的设计方面。

st.sidebar()默认在左侧边栏中显示内容。

st.sidebar.slider()在侧边栏中提供一个滑块,用于从给定数字范围内选择值。 st.sidebar.selectbox()允许您从给定列表中选择一个值,而Streamlit 还包含更多精彩的功能和特性。 部分功能如下:

  • 保存文件时实时更改
  • 只需按键盘上的 R 即可重新运行应用程序
  • 只需按键盘上的 C 即可清除缓存
  • 录制网络应用程序并在本地保存视频文件以与所有人共享

…以及更多

必读:机器学习职业

代码

导入 streamlit 作为 st

将 altair 导入为 alt

将 pydeck 导入为 pdk

train_area = st.empty()

“”

# 加州房价

这是加利福尼亚房价数据集,其中包含来自 1990 年美国人口普查的数据。 下表提供了数据集中每个特征的描述、数据范围和数据类型。

##我们先来看看imports

“”

使用 st.echo():

将张量流导入为 tf

将 numpy 导入为 np

将熊猫导入为 pd

“”

## 加载数据集

我们将使用 scikit-learn 的数据集模块来引导已经为我们清理过且仅具有数字特征的数据。

“”

使用 st.echo():

从 sklearn.datasets 导入 fetch_california_housing

住房 = fetch_california_housing()

“”

这会将整个数据加载到 `housing` 变量中,如下所示

“”

st.subheader('输入特征')

住房数据

st.subheader('输出标签')

住房.目标

“”

## 将数据拆分为训练集、测试集和开发集

这是任何机器学习解决方案开始时最重要的事情之一,因为任何模型的结果都很大程度上取决于您将数据分配到这些集合中的程度。

对我们来说幸运的是,我们有 scikit-learn 来拯救它,它变得像 2 行代码一样简单。

“”

使用 st.echo():

从 sklearn.model_selection 导入 train_test_split

X_train_full, X_test, y_train_full, y_test = train_test_split(

住房数据,住房目标

)

X_train, X_valid, y_train, y_valid = train_test_split(

X_train_full, y_train_full

)

“”

`train_test_split()` 函数将数据分成 2 个集合,其中测试集占总数据集的 25%。 我们在 train_full 上再次使用相同的函数将其拆分为训练集和验证集。 25% 是默认参数,您可以根据需要对其进行调整。 从 [Scikit-Learn 的文档](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html) 中查看它。

##看一下火车数据

这些列代表以下数据:

“”

st.write(housing.feature_names)

“”

现在让我们通过使用纬度和经度值将其绘制在地图上来查看房屋的位置:

“”

使用 st.echo():

map_data = pd.DataFrame(

X_train,

列=[

'医药公司',

《宅时代》,

'AveRooms',

'AveBedrms',

'人口',

'AveOccup',

'纬度',

'经度'

])

中点 = (np.average(map_data[“latitude”]), np.average(map_data[“longitude”]))

st.write(pdk.Deck(

map_style="mapbox://styles/mapbox/light-v9",

初始视图状态={

“纬度”:中点[0],

“经度”:中点[1],

“缩放”:6,

“音高”:75,

},

层=[

pdk.图层(

“六边形层”,

数据=地图数据,

get_position=[“经度”、“纬度”]、

半径=1000,

海拔尺度=4,

海拔范围=[0, 10000],

可挑选=真,

挤压=真,

),

],

))

“”

**在按 ALT 键的同时随意放大或拖动以根据需要更改地图的 3D 视角。**

## 预处理

正如前面所指出的,这个数据集已经被 scikit-learn 很好地预处理了,我们可以直接使用,而不用担心任何 NaN 值和其他东西。

虽然,我们将通过使用“StandardScaler”来缩放特定范围内的值,以帮助我们的模型有效地工作。

“”

使用 st.echo():

从 sklearn.preprocessing 导入 StandardScaler

缩放器 = 标准缩放器()

X_train = scaler.fit_transform(X_train)

X_valid = scaler.transform(X_valid)

X_test = scaler.transform(X_test)

“”

## 创建模型

我们将创建一个简单的序列模型,第一层包含 30 个神经元和 RELU 的激活函数。

下一层将是没有激活函数的单个神经元层,因为我们希望模型预测一系列值,而不仅仅是分类问题之类的二元或多类结果。

“”

st.sidebar.title('超参数')

n_neurons = st.sidebar.slider('神经元', 1, 128, 30)

l_rate = st.sidebar.selectbox('学习率', (0.0001, 0.001, 0.01), 1)

n_epochs = st.sidebar.number_input('历元数', 1, 50, 20)

#n_neurons、l_rate 和 _nepochs 是从用户那里获取的用于训练模型的输入。 还设置了它们的默认值。 n_neurons 的默认值是 30,l_rate 的默认值是 0.01,n_epochs 的默认值是 20。所以一开始模型将在第一层有 30 个神经元,学习率为 0.01,epoch 数为模型将训练的对象是 20。

使用 st.echo():

将张量流导入为 tf

模型 = tf.keras.models.Sequential([

tf.keras.layers.Dense(n_neurons, activation='relu', input_shape=X_train.shape[1:]),

tf.keras.layers.Dense(1)

])

“”

##编译模型

Tensorflow keras API 为我们提供了“model.compile()”函数来为模型分配优化器、损失函数和一些其他细节。

“”

使用 st.echo():

模型.编译(

损失='mean_squared_error',

优化器=tf.keras.optimizers.SGD(l_rate)

)

“”

## 训练模型

为了训练模型,您只需在模型上调用“fit()”函数,并使用训练和验证集以及您希望模型训练的多个时期。

**尝试使用左侧边栏中的超参数,然后单击下面给出的“训练模型”按钮开始训练。**

“”

train = st.button('火车模型')

如果火车:

使用 st.spinner('训练模型...'):

使用 st.echo():

model.summary(print_fn=lambda x: st.write(“{}”.format(x)))

历史 = model.fit(

X_train,

y_train,

epochs=n_epochs,

验证数据=(X_valid,y_valid)

)

st.success('模型训练完成!')

“”

## 模型性能

“”

使用 st.echo():

st.line_chart(pd.DataFrame(history.history))

“”

## 在测试集上评估模型

另一个重要但简单的步骤是根据以前从未见过的测试数据评估您的模型。 请记住,只有在您对所构建的模型有足够的把握之后才应该这样做,并且在评估测试集上的模型之后,您应该拒绝进行任何超参数调整,因为它只会使测试集变得更好,并且会再次出现当模型将在生产阶段看到新数据时,这是一个泛化问题。

“”

使用 st.echo():

评估 = model.evaluate(X_test, y_test)

评估

“”

> 测试集上的这种损失比验证集上的损失要差一些,这与预期的一样,因为模型从未见过来自测试集的图像。

“”

“”

## 使用模型的预测

“”

使用 st.echo():

X_new = X_test[:3]

预测 = model.predict(X_new)

“”

### 预测

“”

预测

“”

### 基本事实

“”

y_test[:3]

就是这样! 只需几行额外的代码,您就已经构建了一个很棒的 Web 应用程序,它看起来很漂亮,并且还具有动态内容。 没那么难,不是吗? 尝试从他们的文档中构建不同的项目并使用 Streamlit 的其他功能。 它非常简单直观。

阅读:使用 Python 进行机器学习

部署 Streamlit Web 应用程序

Streamlit Web 应用程序可以通过 Internet 上的各种可用选项直接使用。 我们可以简单地浏览一下它们,看看它是如何完成的。

在进入任何其他可以帮助我们部署 Web 应用程序的平台之前,让我们看看 Streamlit 可以为我们提供什么。 他们最近发布的一个功能版本是 Streamlit Sharing。 这允许用户单击一下即可部署他们的 Streamlit Web 应用程序。

如果您将代码上传到 GitHub 存储库,您只需从 Streamlit 的仪表板中选择存储库,它就会自动为您托管。 到目前为止,它非常棒并且完全免费。 部署机器学习 Web 应用程序之前没有任何更简单的方法。

Heroku是另一种部署 Streamlit Web 应用程序的好方法。 这样您就不必选择任何云服务器,然后在其中设置虚拟实例。 这一切都由 Heroku 负责。

Heroku 有一个简单的缺点,它的免费版本不允许您在免费版本中拥有超过 512MB 大小的所有包。 我用于项目的 TensorFlow 2.2.0 比指定的空间大一点,所以我不得不使用其他服务。

AWS(亚马逊网络服务)也是部署 Streamlit 应用程序的好方法。 对于初学者来说有点复杂,但是当你使用它时,它会变得更容易设置。 他们为新用户提供免费的 EC2 实例。 您可以使用 Ubuntu 18.04 或更高版本启动一个并安装该应用程序所需的所有依赖项。

一切设置好后,您可以使用命令 - streamlit run filename.py 运行应用程序。 在这里,您将获得一个可以与所有人共享的公共 URL。 这里的一个主要缺点是,如果您关闭实例,该应用程序将无法在线使用。 所以免费实例会有一些限制。

如果您在 GitHub 存储库中有代码,还有另一种很酷的方式来托管您的应用程序。 它不是很专业和合法,因为用户也需要在他们的系统上安装 Streamlit。

如果 Streamlit 在系统上可用,并且您有 Streamlit 应用程序的 python 文件的链接,那么您只需执行以下命令即可运行 Web 应用程序: streamlit run url 如果您安装了 Streamlit,您可以在本地查看我的应用程序。 在终端中使用以下命令:

流光运行 https://raw.githubusercontent.com/tejasmorkar/housing_price_prediction_aws/master/CaliforniaHousingPrices.py

结论

您已经看到 Streamlit 是多么简单而强大。 在此之前我还没有遇到过这样的工具,它对我有这么大的帮助,让我的开发生活更轻松。 所以,这就是为什么我觉得 Streamlit 是一个令人印象深刻的框架,它可以帮助每个人专注于机器学习开发的重要部分,并帮助我们更多地专注于 AI 和 ML 的主要学习。 这使学习曲线变得更加容易,并使我们能够轻松地构建和部署爱好项目。

使这个框架的实现如此简单的一件事是他们的官方文档。 文档中写的所有内容都是精确而简单的。 我建议您应该浏览一下文档并尝试实施一个新项目。 这是开始使用任何新框架的最佳方式。 在以下链接中找到 Streamlit 官方文档 — https://docs.streamlit.io/en/stable/ target=”_blank” rel=”nofollow”

社区始终是学习事物和发现我们解决方案问题的最佳资源。 Streamlit 有一个精彩的讨论论坛,您可以在其中发布有关 Streamlit 应用程序开发过程的任何问题、有关部署的任何疑问、功能请求、错误报告以及任何其他可能帮助您成功构建应用程序的内容。 通过以下链接加入讨论论坛 — https://discuss.streamlit.io/

如果您有兴趣了解有关机器学习的更多信息,请查看 IIIT-B 和 upGrad 的机器学习和人工智能 PG 文凭,该文凭专为工作专业人士设计,提供 450 多个小时的严格培训、30 多个案例研究和作业、IIIT- B 校友身份、5 个以上实用的实践顶点项目和顶级公司的工作协助。

部署机器学习项目的最大困难是什么?

部署机器学习项目的最大困难是数据收集的不完整。 大多数时候,时间和金钱不足以收集进行准确分析所需的所有数据。 因此,收集的数据必须可靠且质量好。 此外,必须选择正确的数据。 数据的选择是项目部署的关键。

机器学习中的 Streamlit 是什么?

Streamlit 是一种用于机器学习的增量算法。 它利用了神经网络的搜索空间很大,训练速度快的特点,因此不需要搜索整个空间,而是可以在本地建立一个神经网络。 StreamLit 是一种用于处理顺序数据的长短期内存。 它是一种深度学习算法,使用 RNN 将数据编码为数字向量。 这些向量可用于表示图形或文本中的数据。 它还可用于生成自然语言文本。

如何使用 Streamlit 进行部署?

使用 Streamlit 进行部署很简单。 首先,您必须有一个 Streamlit 帐户。 其次,您需要可以部署的软件。 例如,Beanstalk、S3 或 rsync。 第三,您需要为部署准备软件。 使用 rsync 将您的应用程序复制到您的 Web 服务器。 如果您正在部署一个新网站,那么该网站就是您复制的目录。 如果您正在部署现有网站,则上传的网站就是您复制的目录。 在屏幕左侧下方