在数据科学领域,交互式计算平台因其在数据整理、数据可视化以及机器学习模型原型设计中的便捷性而被广泛使用。这些平台支持多种编程语言,如Python、Julia和R等。默认情况下,它们配备有IPython内核,并且可以根据需要安装其他语言的内核。然而,为了在生产环境中评估原型模型的性能以及在仪表板中查看可视化效果,需要掌握更多的工具,并投入精力开发应用程序和仪表板。
设想一下,如果能够不写一行代码就将Jupyter笔记本转换成应用程序,并且能够将这样的应用程序部署在服务器上,作为Web应用使用,那将是多么方便的事情。Mercury就是这样一个库,它可以将Jupyter笔记本转换成交互式Web应用程序。本文将展示如何将Jupyter笔记本转换成应用程序,并在Heroku平台上部署。
Mercury是一个开源库,通过在笔记本的第一个单元格中添加YAML参数,可以将Jupyter笔记本转换成Web应用程序。它由MLJAR Inc.开发,并且有一个功能更全的Pro版本,提供额外特性和支持,但需要支付一定的费用。可以在这个找到这个库的文档。
将使用随机森林算法在Jupyter笔记本上创建一个分类模型,然后通过添加YAML参数使用Mercury将该笔记本转换成应用程序。这个应用程序将允许调整随机森林算法的超参数,并查看不同超参数下模型的结果和图表。将使用蘑菇数据集来完成这个任务。请使用这个下载数据集。
首先,需要安装Mercury库,可以使用以下命令:
pip install mljar-mercury
或者,如果想要使用conda安装,可以使用以下命令:
conda install -c conda-forge mljar-mercury
接下来,打开Jupyter笔记本,将导入所有必要的库,如下所示:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import plot_confusion_matrix, plot_roc_curve, plot_precision_recall_curve
from sklearn.metrics import precision_score, recall_score, accuracy_score
from termcolor import colored
import warnings
warnings.filterwarnings("ignore")
在下一个单元格中,为交互式Web应用程序创建参数并给出默认值,如下所示:
n_estimators = 100
max_depth = 1
bootstrap = 'True'
metrics_list = 'Confusion Matrix'
‘n_estimators’, ‘max_depth’, ‘bootstrap’是将要调整的超参数,将检查它们对准确率、精确率、召回率等不同评估指标的影响。同时,‘metrics_list’是一个参数,它接受不同的图表,如混淆矩阵、ROC曲线、精确率-召回率曲线,并绘制它们。接下来,加载数据集并创建三个函数,分别是‘load_data()’, ‘split(df)’, ‘plot_metrics(metrics_list)’。
‘load_data()’函数加载数据集并进行标签编码。‘split(df)’函数将数据集分割成训练集和测试集,并将目标列从原始数据集中分离出来。‘plot_metrics(metrics_list)’函数绘制不同的指标图表,如混淆矩阵、ROC曲线和精确率-召回率曲线。如果想要更多的图表,可以将其添加到这个函数中。
按照以下方式编写上述函数:
data = pd.read_csv('mushroom.csv')
print(colored('Overview of Dataset', 'green', attrs=['bold']))
def load_data():
label = LabelEncoder()
for col in data.columns:
data[col] = label.fit_transform(data[col])
return data
def split(df):
y = df.type
x = df.drop(columns=['type'])
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.3,random_state=0)
return x_train, x_test, y_train, y_test
def plot_metrics(metrics_list):
if 'Confusion Matrix' in metrics_list:
plot_confusion_matrix(model, x_test, y_test, display_labels=class_names)
plt.title("Confusion Matrix")
plt.show()
if 'ROC Curve' in metrics_list:
plot_roc_curve(model, x_test, y_test)
plt.title("ROC Curve")
plt.show()
if 'Precision-Recall Curve' in metrics_list:
plot_precision_recall_curve(model, x_test, y_test)
plt.title("Precision-Recall Curve")
plt.show()
现在已经加载了数据集并编写了所有必要的函数,让加载数据并将其分割为训练集,并定义类名称如下:
df = load_data()
x_train, x_test, y_train,y_test = split(df)
class_names = ['edible', 'poisonous']
现在创建随机森林模型,训练它并获取测试预测如下:
model = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth,bootstrap=bootstrap,n_jobs=-1)
model.fit(x_train,y_train)
y_pred = model.predict(x_test)
在下一个单元格中创建一个标题‘模型的准确率’,在下一个单元格中编写以下代码以获取准确率:
print("Accuracy: ", accuracy_score(y_test,y_pred).round(2))
类似地,分别为‘模型的精确率’、‘模型的召回率’和‘绘制指标’在单独的单元格中进行操作:
print("Precision: ", precision_score(y_test, y_pred, labels=class_names).round(2))
print("Recall: ",recall_score(y_test, y_pred, labels=class_names).round(2))
plot_metrics(metrics_list)
上述代码给出了模型的精确率、召回率,并且根据‘plot_metrics’函数的输入绘制了不同的图表。到目前为止,已经在Jupyter笔记本上创建了所有内容。现在,是时候将Jupyter笔记本转换成机器学习Web应用程序了。
为此,需要在笔记本的第一个单元格中创建YAML参数。转到笔记本的顶部,并在顶部插入一个单元格,并将单元格类型更改为‘Raw NBConvert’。这很重要。这个单元格的类型应该是‘Raw NBConvert’。接下来,为这个Web应用程序创建参数,如下所示:
---
title: Classification - Random Forest Analysis
description: My first notebook in Mercury
show-code: False
params:
n_estimators:
label: Number of trees in the forest
input: slider
value: 100
min: 10
max: 200
max_depth:
label: The maximum depth of the tree
input: slider
value: 1
min: 1
max: 6
bootstrap:
label: Bootstrap
input: checkbox
value: True
metrics_list:
label: Choose the metrics evaluation plot
input: select
value: Confusion Matrix
choices: [Confusion Matrix, ROC Curve, Precision-Recall Curve]
multi: True
---
这里重要的是以连字符开始并以连字符结束,如上所示。除此之外,YAML配置中允许的参数有‘title’, ‘author’, ‘description’, ‘show-code’, ‘show-prompt’, ‘params’。此外,还有不同的小部件可用。有关更多信息,请查看这个和这个。
在‘params’下定义参数,如上所示。可以看到每个参数都有一个‘label’,它给出了小部件的标题。接下来是‘input’,它给出了小部件的类型,然后是‘value’,它取参数的默认值,以及‘min’, ‘max’,它定义了参数的最小值和最大值。
到目前为止,已经在Jupyter笔记本上创建了原型模型,并在YAML配置中添加了参数。现在打开终端,输入以下代码,并在设备上运行Mercury应用程序:
mercury watch 'address of the notebook.ipynb'
这将在‘http://127.0.0.1:8000/app/1’打开应用程序。或者可以在‘http://127.0.0.1:8000’找到所有的Mercury应用程序。
打开应用程序后,它看起来像这样:
(此处应有图片或示例链接,但本文不包含媒体内容。)
可以更改参数值并点击‘Run’以查看笔记本显示结果。通过这种方式,可以不使用太多代码就从Jupyter笔记本创建Web应用程序。只需要在YAML配置中添加几行代码。现在已经将Jupyter笔记本转换成了机器学习Web应用程序,让将其部署在Heroku上,以便可以随时访问它,并通过点击‘Run’按钮并在调整值后进行操作。
部署到Heroku:
可以将应用程序部署到Heroku。为此,需要创建一个‘Procfile’,‘requirements.txt’文件,并将Jupyter笔记本、数据集文件以及刚刚创建的两个文件上传到Github。
首先,在Github上创建一个仓库,并创建一个名为‘Procfile’的文件,并输入以下内容并提交更改:
web: mercury run 0.0.0.0:$PORT
接下来,创建一个名为‘requirements.txt’的文件,并在该文件中输入以下内容并提交更改。这个文件主要是告诉Heroku需要安装哪些文件来运行应用程序。
mljar-mercury
matplotlib
scikit-learn
termcolor
ipython-genutils
pandas
numpy
接下来上传刚刚创建的Jupyter笔记本和用于此项目的数据集。
现在创建一个账户,如果还没有的话,点击‘create new app’。然后按照下一步操作,选择连接GitHub仓库以部署应用程序,然后点击‘Deploy’。Heroku会为完成其余的工作,并提供应用程序的链接。所以最后创建了应用程序并将其部署在Heroku上。