使用PySpark MLlib和Streamlit在Google Cloud Platform部署机器学习模型

在本文中,将探讨如何将使用PySparkMLlib构建的机器学习模型部署到Google Cloud Platform(GCP)上,并使用Streamlit来无缝部署应用程序。PySpark在处理大型数据集方面非常高效,而Streamlit则可以让轻松部署应用程序。

准备工作

在开始之前,需要访问以下资源:

  • Google Cloud PlatformCompute Engine(虚拟机实例) - Google提供了300美元的试用信用额度,如果是学生,可能还有资格获得学生信用额度。
  • PySpark
  • Python 3以及Pandas、matplotlib等库
  • Streamlit

构建机器学习模型

在机器学习部分,使用的是纽约Airbnb数据集。将进行回归模型比较,目标变量是价格。尽管所有为这个问题构建的模型只给出了平均的评估指标分数,但为了演示目的,将继续使用这个数据集。

数据集涉及大量的预处理和特征工程。预处理和特征工程的详细步骤可以在Jupyter Notebook中找到。下面的图表将更好地说明涉及的步骤。

首先,需要对数据进行预处理。这包括处理空值、手动将字符串类型的变量编码为数值、去除异常值。然后,使用字符串索引将分类变量转换,然后使用独热编码。使用了PySpark Pipeline来完成这些。现在,所有的特征都是数值格式。还使用现有特征创建了一些额外的特征。现在可以将这些转换为向量格式,因为MLlib只接受向量格式的独立特征。如果愿意,可以将这些数据导出到文件中,以在streamlit程序中使用。建议将数据导出为parquet文件,因为数据涉及向量化格式的列,而CSV不支持向量。最后,应用了各种MLlib回归算法。这些包括线性回归、决策树回归、随机森林回归、梯度提升树回归和因子分解机器回归。以下是MLlib代码示例:

def regression_model(mllib_model, train_df, test_df): if mllib_model == 'Linear Regression': lr = LinearRegression(featuresCol='features', labelCol='label') lr_model = lr.fit(train_df) fullPredictions = lr_model.transform(test_df).cache() lr_evaluator = RegressionEvaluator(predictionCol="prediction", labelCol="label", metricName="r2") r2 = lr_evaluator.evaluate(fullPredictions) lr_evaluator = RegressionEvaluator(predictionCol="prediction", labelCol="label", metricName="rmse") rmse = lr_evaluator.evaluate(fullPredictions) pred = [int(row['prediction']) for row in fullPredictions.select('prediction').collect()] actual = [int(row['label']) for row in fullPredictions.select('label').collect()] return r2, rmse, pred, actual

设计Streamlit布局

可以在Streamlit程序中编写整个预处理代码,或者将之前保存的预处理数据文件导入到Streamlit程序中。后者将节省大量的计算成本,因为Streamlit程序在UI中更改任何变量时都会从头开始运行(除非使用@st.cache,在这种情况下,可以缓存计算量大的操作)。

df4 = sc.read.load("processed_data.parquet") splits = df4.randomSplit([0.7, 0.3], seed=12345) train_df = splits[0] test_df = splits[1] ########## SIDEBAR st.sidebar.title('MLlib 回归模型') st.sidebar.subheader('选择模型') mllib_model = st.sidebar.selectbox("回归模型", ('线性回归', '梯度提升树', '决策树回归器', '随机森林回归器', '因子分解机器回归器')) st.sidebar.text('70 - 30 分割')

登录到GCP并确保已启用Compute Engine API。如果启用了,导航到侧边栏>Compute Engine>VM实例>创建实例。在更改设置时,请注意右侧的价格估算。以下是推荐的设置:

  • CPU:通用CPU。使用的是第二代E2 CPU。其价格与第一代N1相当。
  • 操作系统:Ubuntu,10-12 GB存储
  • 启用HTTP和HTTPS流量

现在可以继续创建VM实例。如果成功,VM实例将如下所示。

现在,为了使用外部IP访问Streamlit程序,将创建一个防火墙规则。这是必要的,因为Streamlit使用端口8501。这可以通过点击“查看网络详情”,然后转到防火墙>创建防火墙规则来完成。然后设置以下值:

  • 防火墙名称为‘streamlit’
  • 流量方向为‘ingress’
  • 目标为‘网络中的所有实例’
  • 源过滤器:IP范围
  • 源IP:0.0.0.0/0
  • TCP端口:8501

确保这个新创建的规则出现在防火墙列表中。

完成上述步骤后,可以通过点击连接列中的SSH登录到新创建的VM实例。如果成功,将看到Ubuntu终端。

现在,在终端中,可以安装所需的软件。

  • Mini-conda(也包含Python 3)
  • Java 8 jdk(用于PySpark
  • PySpark和py4j
  • 其他Python库(使用pip install)

现在将Pyspark ML程序复制到VM实例。可以手动上传每个文件,或者使用git克隆文件。

git clone https://github.com/akshayhari/airbnb-price-pred

转到新克隆的程序文件夹,并使用streamlit运行python文件。

streamlit run app.py

现在可以在浏览器中打开外部URL,应用程序将显示在浏览器中。

可以在侧边栏中更改ML模型,输出将在浏览器中反映出来。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485