在本文中,将探讨如何将使用PySparkMLlib构建的机器学习模型部署到Google Cloud Platform(GCP)上,并使用Streamlit来无缝部署应用程序。PySpark在处理大型数据集方面非常高效,而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程序在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实例>创建实例。在更改设置时,请注意右侧的价格估算。以下是推荐的设置:
现在可以继续创建VM实例。如果成功,VM实例将如下所示。
现在,为了使用外部IP访问Streamlit程序,将创建一个防火墙规则。这是必要的,因为Streamlit使用端口8501。这可以通过点击“查看网络详情”,然后转到防火墙>创建防火墙规则来完成。然后设置以下值:
确保这个新创建的规则出现在防火墙列表中。
完成上述步骤后,可以通过点击连接列中的SSH登录到新创建的VM实例。如果成功,将看到Ubuntu终端。
现在,在终端中,可以安装所需的软件。
现在将Pyspark ML程序复制到VM实例。可以手动上传每个文件,或者使用git克隆文件。
git clone https://github.com/akshayhari/airbnb-price-pred
转到新克隆的程序文件夹,并使用streamlit运行python文件。
streamlit run app.py
现在可以在浏览器中打开外部URL,应用程序将显示在浏览器中。
可以在侧边栏中更改ML模型,输出将在浏览器中反映出来。