跳转至

使用 VerticaPy 实现 Vertica 与 Domino Data Lab 的端到端机器学习方案

Domino Data Lab 是一个平台,使组织中的数据科学家能够协作、构建和部署数据科学应用、训练 ML 模型、监控性能,以及治理机器学习模型。

本文档提供一套端到端方案,涵盖从将数据加载到 Vertica、使用 VerticaPy 连接 Vertica 和 Domino Data Lab,到执行数据科学操作的完整流程。

VerticaPy 是一个 Python 库,具备类似 scikit-learn 的功能,用于 Vertica 上的机器学习和高级分析。

Vertica 与 Domino Data Lab 高层架构设计

以下是 Domino Data Lab 如何通过 VerticaPy 及其他组件连接到 Vertica 进行机器学习和模型训练的高层架构设计。您可以从 Domino 提供的 IDE 连接到 Vertica。Domino 提供 4 种 IDE——Jupyter Notebook、Jupyter Lab、VSCode 和 RStudio——您可以使用 VerticaPy 或 RJDBC 从这些 IDE 连接到 Vertica,如架构图所示。然后您可以可视化数据以识别趋势,并训练模型进行预测。后续章节将提供分步说明,涵盖:

  • 使用示例数据集
  • 加载数据到 Vertica
  • 在 Jupyter Notebook 中创建工作区并使用 VerticaPy 连接到 Vertica
  • 探索数据以识别趋势
  • 训练和构建模型进行预测分析

Domino 图片 1

环境

开始之前,您需要搭建以下环境:

  • Domino Data Lab 云实例
  • Vertica 分析数据库 12.0.0
  • 在 Domino Data Lab 环境中安装 VerticaPy 库
  • DBVizualizer 或其他任意 ETL 工具,用于将数据加载到 Vertica

假设条件与前置要求

  • Domino Data Lab 已搭建完成(云端或本地均可),且实例正常运行。
  • Domino 实例与 Vertica 实例之间不存在防火墙/连接问题。

预测医疗费用的分步机器学习方案

本方案的目标是构建和训练一个模型,用于分析和预测医疗费用。

该示例说明了如何开始在 Vertica 中使用数据集,并利用 VerticaPy 功能在 Domino 中使用各种可视化特性来识别数据集中的趋势。该示例还描述了对分类特征进行编码,以帮助模型理解分类变量。最后,您可以创建一个回归模型,并使用数据集对其进行训练,以预测医疗费用。

注意:以下部分可折叠/展开。请务必点击相应主题以阅读更多内容。

使用示例数据集

在我们的方案中,我们使用了 CSV 格式的个人医疗费用数据集。该数据集包含七个列:受益人年龄、性别、BMI、保险覆盖的子女数量、吸烟习惯、受益人居住地区以及健康保险已收取的现有医疗费用。

目标是了解这些预测变量如何影响医疗费用,以及如何使用 VerticaPy 功能预测未来的医疗账单。

如果您想探索这些数据,可以在 Kaggle 网站上注册并下载相同文件:Medical Cost Personal Datasets。

在接下来的章节中,我们将带您了解使用 Jupyter Notebook 创建模型以预测医疗费用的完整流程。

加载数据到 Vertica

我们使用 DBVisualizer 将示例数据集加载到 Vertica。您可以选择使用任意 ETL 工具。

  • 启动 DBVisualizer 并连接到 Vertica 实例。
  • 打开一个新的 SQL Commander 窗口,执行以下命令在 Vertica 中创建名为 insurance 的新 schema:
CREATE SCHEMA INSURANCE;
  • 运行以下 SQL 查询在 Vertica 中创建 insurance 表:
CREATE TABLE insurance.insurance
(
 age int,
 sex varchar(20),
 bmi numeric(8,4),
 children int,
 smoker boolean,
 region varchar(20),
 charges float
);
  • 表创建成功后,右键单击该表并选择 Import Table Data
  • 在 Import Table Data 窗口中,选择已下载的 insurance 数据集的位置,然后点击 Next

Domino 图片 14

  • 在 Column delimiter 部分,选择 Auto Detect,并按图示在 Options 部分提供值,然后点击 Next

Domino 图片 15

  • 确认数据类型正确无误,通过数据预览部分进行验证,然后点击 Next

Domino 图片 16

  • 验证数据将要导入的 table 和 schema 名称,然后点击 Next
  • 点击 Import 将数据集导入 insurance 表。
  • 导入完成后,关闭 Import table 窗口,并验证数据是否正确导入到 Vertica 的表中。

Domino 图片 17

更多信息,请参见 Importing Table Data,了解将 CSV 数据加载到新表或现有表的步骤。

在 Domino Data Lab 创建工作流

  • 通过 Domino 提供的链接登录 Domino Data Lab 云实例。

Domino 图片 2

  • 登录后,Domino 仪表盘将打开。 您可以查看 Domino 实例中的现有项目。

Domino 图片 3

  • 点击 New Project 创建新项目。 此时将出现 Create New Project 窗口。

  • 提供项目名称,在 Project Visibility 选项中选择 Private,然后点击 Next

  • 在 Hosted By 部分点击 Domino File System,将项目创建在 Domino 文件系统中,然后点击 Create。 现在您可以查看项目仪表盘。

Domino 图片 4

  • 要在此项目中创建工作区,请点击 Run 部分的 Workspaces
  • 您将可以从以下 4 种 IDE 中选择一种:
  • Jupyter Notebook
  • Jupyter Lab
  • VSCode
  • RStudio
  • 选择一种 IDE 开始创建工作区。在我们的方案中,我们选择了 Jupyter 作为 IDE。 此时将出现 Launch New Workspace 窗口。

Domino 图片 5

  • 提供工作区名称,从下拉菜单中选择 Workspace Environment。选择执行数据科学操作所需的 Hardware Tier 和 volume size,然后点击 Next
  • 在 compute cluster 部分,将 Attach Compute Cluster 设置为 None
  • 要查看数据集在 Domino 实例中存储路径的详细信息,点击 Next。或者,您也可以直接点击 Launch
  • 创建新的 notebook。

以下章节将使用 Jupyter notebook 示例,涵盖使用 Jupyter Notebook、连接 Vertica、探索数据和趋势、编码,以及训练和预测模型。

启动 Jupyter Notebook

Domino 提供了 Jupyter IDE 环境,使您可以快速创建 Jupyter Notebook 并开始数据科学操作。

Domino 图片 6

  • 要启动 Jupyter IDE 实例,点击 New > Python 3 创建新的 notebook 并打开它。
  • 要连接到 Vertica,您需要在环境中安装 VerticaPy。可以在您创建的 notebook 中运行包含 pip install verticapy 的单元格来安装。

Domino 图片 7

  • 运行该单元格后,点击 Kernel > Restart 重启内核。

初始化

  • 首先,您需要连接到 Vertica,该连接将在 notebook 的其余部分中使用。
import verticapy as vp

# 创建新连接
vp.new_connection({"host": "<Verticahost>", 
 "port": "5433", 
 "database": "<Verticadbname>", 
 "password": <password>, 
 "user": "dbadmin"},
 name = "<Verticauser>")
# 连接到数据库
vp.connect("MyVerticaConnection")
  • 从 insurance schema 加载数据,并将数据赋给 vDataFrame 对象。要了解更多关于 vDataFrame 的信息,请参见 vDataFrame。
from verticapy import vDataFrame
data = vDataFrame(input_relation = "insurance", schema = "insurance")
display(data)

Domino 图片 18

表已成功创建。

更多信息,请参见 Creating a Connection。

数据探索

在机器学习中,在使用数据集训练模型之前,检查是否存在缺失数据非常重要。

data.count_percent()

Domino 图片 37

VerticaPy 有许多函数可以帮助您理解数据集。上面的代码片段提供了每一列的非空条目数量的详细信息。可以看出,该数据集中没有缺失值。

您还可以获取每个特征的摘要数据。使用以下 VerticaPy 函数可以获取 max、min、标准差、数据类型 top count 等信息。

data.describe(method='all')

Domino 图片 19

直方图是观察任何数据集中趋势的绝佳方式。VerticaPy 支持显示直方图图表,以观察我们数据集中的趋势。

让我们显示 age 列的直方图,看看是否能观察到任何趋势:

data["age"].hist(method = "count", color = "#0073E7", h = 1)

Domino 图片 20

从上图直方图可以看出,18 和 19 岁年龄组的人数比任何其他组都多。其他组的总人数在 20 到 30 岁之间。

现在让我们以宽度为 5 的等宽分箱对 age 列进行离散化处理。看看能否观察到不同年龄组的某种模式。

data["age"].discretize(method = "same_width", h = 5)

Domino 图片 21

年龄可能会影响一个人的 BMI,因此让我们比较各组的平均 BMI,看看是否存在某种模式:

# 各年龄组的平均 BMI
data.hchart(x = "age",
 y = "AVG(bmi)", 
 aggregate = True,
 kind = "bar")

Domino 图片 22

从上面的图表中我们可以观察到一个趋势:年龄较大的人往往具有较高的 BMI。

深入了解其他特征——让我们检查各组的平均吸烟人数,但在此之前,我们需要将 smoker 列特征转换为更方便的布尔值:将 True/False 转换为 1 或 0。

# 导入 stats 模块
import verticapy.stats as st

# 应用 decode 函数
data["smoker_int"] = st.decode(data["smoker"], True, 1, 0)

现在我们可以绘制各年龄组的平均吸烟人数。

# 各年龄组的平均吸烟人数
data.hchart(x = "age",
 y = "AVG(smoker_int)", 
 aggregate = True,
 kind = "bar")

Domino 图片 23

遗憾的是,这里没有明显的模式。可以看出,个人的吸烟习惯并不依赖于年龄。

类似地,让我们看看吸烟习惯是否与个人的性别相关。

# 各性别的平均吸烟人数
data.hchart(x = "sex",
 y = "AVG(smoker_int)", 
 aggregate = True,
 kind = "bar")

Domino 图片 24

从该图中可以看出,男性吸烟者多于女性吸烟者。

让我们看看是否能在性别和 BMI 之间建立关系。

# 各性别的平均 BMI
data.hchart(x = "sex",
 y = "AVG(bmi)", 
 aggregate = True,
 kind = "bar")

Domino 图片 25

可以看出,男性的 BMI 略高,但从这么小的差异中我们无法建立任何趋势。

回到我们之前的模式,让我们检查各年龄组中的性别分布,看看之前识别的模式是否偏向某一性别。

# 各年龄组各性别人数的 pivot 表
data.pivot_table(['age','sex'])

Domino 图片 26

从图表来看,性别在各年龄组中的分布相当均匀。

让我们继续,看看人们在医疗费用上的支出模式。

data["charges"].hist(method = "count", color = "#0073E7")

Domino 图片 27

根据图表,大多数拥有保险的人支出低于 1500 美元。只有少数人支出超过 5000 美元。

编码

由于各特征的类型不同,对分类特征进行编码是合理的。在数据集中,sex、region 和 age 是分类列,我们将对这些特征进行标签编码。注意,我们之前已经将 'smoker' 从布尔值进行了标签编码。

# 编码 sex
data["sex"].label_encode()

# 编码 region
data["region"].label_encode()

# 编码 age
data["age"].label_encode()

Domino 图片 28

让我们检查 'charges' 列与表中其他列之间的相关性。

# 查找与 charges 的相关性
data.corr(focus = 'charges')

Domino 图片 29

现在,将新的修改后的数据集保存到 Vertica 数据库中。

# 将修改后的数据集保存到数据库
data.to_db("insurance.final_ins_data", relation_type = "table")

Domino 图片 30

预测保险费用

由于我们的响应变量是连续的,我们可以使用回归来预测它。让我们使用随机森林回归来预测保险费用。

from verticapy.learn.ensemble import RandomForestRegressor

# 定义随机森林模型
rf_model = RandomForestRegressor(name = "insurance.randf_insurance",
 n_estimators = 20,
 max_features = "auto",
 max_leaf_nodes = 32, 
 sample = 0.7,
 max_depth = 3,
 min_samples_leaf = 5,
 min_info_gain = 0.0,
 nbins = 32)

# 训练模型
rf_model.fit("insurance.final_ins_data", 
 ["age", "sex", "bmi", "children", "smoker", "region"], 
 "charges")

Domino 图片 31

要获取回归模型的报告和性能指标:

# 模型的回归报告
rf_model.report()

Domino 图片 32

上述结果看起来令人信服,因为我们得到的解释方差约为 0.8。我们可以将预测费用与实际费用进行比较,以验证模型的准确性。

# 绘制预测值和实际值
result = rf_model.predict(data, 
 name = "pred_charges")

# 添加索引
result["id"] = "ROW_NUMBER() OVER()"

# 按 id 绘制
result.plot(ts = 'id',
 columns = ['charges', 'pred_charges'])

Domino 图片 33

要检查每个预测变量对模型的重要性,我们使用内置的 Vertica 函数 RF_PREDICTOR_IMPORTANCE(),通过平均不纯度减少(MDI)来计算重要性。

# 随机森林模型的特征重要性
rf_model.features_importance()

Domino 图片 34

讨论核心问题——什么影响了医疗费用?

  • 从上图我们可以确定,吸烟习惯显著影响医疗费用。
  • BMI 是影响医疗费用的下一个因素。
  • 地区和性别与医疗费用的相关性几乎为零。

让我们看看使用贝叶斯信息准则(BIC)作为选择标准的向前逐步回归模型能给我们带来什么发现。

from verticapy.learn.linear_model import LinearRegression
model = LinearRegression(name = "step_lr_insurance_f")

# 向后回归
from verticapy.learn.model_selection import stepwise
stepwise(model,
 input_relation = "insurance.final_ins_data", 
 direction = "forward",
 X = ["age","sex", "bmi", "children", "smoker", "region"], 
 y = "charges",)

Domino 图片 35

Domino 图片 36

我们看到与之前相同的特征对医疗费用有显著影响。我们可以使用多种方法来识别影响保险费用的因素。

在 Domino Data Lab 中共享与协作

Domino Data Lab 还为您提供了一个与组织内多个用户协作项目的平台,以确保验证、提高构建管线的效率以及实现正确的代码文档化。

邀请其他用户协作您的项目

  • 前往您想要共享的项目仪表盘,点击 Settings

Domino 图片 38

  • 在 Project settings 窗口中,点击 Access & Sharing 以查看项目可见性和权限。

Domino 图片 39

  • 在 Collaborators and permissions 部分,提供用户名。 您也可以使用用户的名字、姓氏或组织名称来查找用户。

  • 向您希望与之协作的用户提供欢迎消息,然后点击 Invite

Domino 图片 40

  • 将显示一条消息,表明邀请已发送给该用户,该用户将被添加到项目中。 现在您可以通过检查 Collaborators and permissions 部分来验证用户是否已添加到项目中。

Domino 图片 41

  • 为用户分配角色。默认情况下,用户被分配为 Contributor(贡献者)角色。
  • 您也可以通过点击 Remove 移除用户。
  • 被邀请的用户可以在其 Domino 仪表盘的 Collaborating Projects 标签页中查看该项目。

Domino 图片 42

更多信息,请参见 Domino Data Lab 文档中的 Share and Collaborate。

其他 Domino IDE 环境概述

您还可以使用以下 IDE 环境来执行相同的方案。

Jupyter Lab

Jupyter Lab 是一个基于 Web 的交互式开发环境,适用于 notebook、数据和代码。

Domino 图片 9

您可以打开 Jupyter Notebook 并按照 VerticaPy 示例开始机器学习。

VSCode

VSCode 是另一种流行的 IDE,您可以选择它来开始执行 Python 代码。您可以创建一个 Python 文件并执行 Python 代码。

Domino 图片 10

RStudio

Domino 也支持 RStudio。不过,您需要自行创建用于训练和预测模型的方案。

RStudio 是一个专用于 R 语言的开发环境,常用于统计计算和图形处理。加载开发环境后,点击 New Blank File > R Script 开始 R 语言编程。

  • 您需要将 Vertica JDBC 文件上传到环境中以连接到 Vertica。打开终端并执行 $wget https://www.vertica.com/client_drivers/12.0.x/12.0.1-0/vertica-jdbc-12.0.1-0.jar 下载 JDBC jar 包。

Domino 图片 12

  • 在 R 文件中输入以下代码以安装必要的依赖项,通过 JDBC 驱动连接到 Vertica,并通过执行 SQL 查询获取数据。
install.packages('RJDBC',dep=TRUE)
install.packages('DBI',dep=TRUE)
install.packages('rJava',dep=TRUE)

library(RJDBC)
vDriver = JDBC(driverClass='com.vertica.jdbc.Driver', classPath='/mnt/vertica-jdbc-12.0.1-0.jar')
vertica = dbConnect(vDriver, 'jdbc:vertica://<IPAddress>:5433/PartPub80DB', 'dbadmin', 'vert1caBdp')
# 现在运行您的查询
myresults = dbSendQuery(vertica, 'select * from insurance.insurance')
dbFetch(myresults)

Domino 图片 13

更多信息

  • Domino Data Lab 网站
  • Domino Data Lab 文档
  • Vertica Community Edition
  • Vertica 文档
  • Vertica 用户社区