Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

docs: polish taxi_tour_duration_prediction.md #2993

Merged
merged 17 commits into from
Mar 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/zh/about/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ OpenMLDB 完成从特征的离线开发到上线部署,只需要以下三个

**OpenMLDB 为什么选择 SQL 作为开发语言?**

SQL 具备表达语法简洁且功能强大的特点,选用 SQL 和数据库开发体验一方面降低开发门槛,另一方面更易于跨部门之间的协作和共享。此外,基于 OpenMLDB 的实践经验表明,经过优化过的 SQL 在特征计算的表达上功能完备,已经经历了长时间的实践考验。
SQL 具备表达语法简洁且功能强大的特点,选用 SQL 作为开发语言一方面降低开发门槛,另一方面更易于跨部门之间的协作和共享。此外,基于 OpenMLDB 的实践经验表明,经过优化过的 SQL 在特征计算的表达上功能完备,已经经历了长时间的实践考验。


## 学术论文
Expand Down
3 changes: 1 addition & 2 deletions docs/zh/quickstart/openmldb_quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ OpenMLDB 的主要使用场景为作为机器学习的实时特征平台。其

![modes-flow](concepts/images/modes-flow.png)


可以看到,OpenMLDB 会覆盖机器学习的特征计算环节,从离线开发到线上实时请求服务的完整流程。可以参考文档 [使用流程和执行模式](concepts/modes.md) 来详细了解。本文将按照基本使用流程,逐步演示一个快速上手的例子。
可以看到,OpenMLDB 会覆盖机器学习的特征计算环节,从离线开发到线上实时请求服务的完整流程。可以参考文档[使用流程和执行模式](concepts/modes.md)来详细了解。本文将按照基本使用流程,逐步演示一个快速上手和了解 OpenMLDB 的例子。

## 准备

Expand Down
4 changes: 2 additions & 2 deletions docs/zh/use_case/JD_recommendation.md
Original file line number Diff line number Diff line change
Expand Up @@ -143,13 +143,13 @@ echo "show jobs;" | /work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk

#### 2.2.3 特征设计

通常在设计特征前,用户需要根据机器学习的目标对数据进行分析,然后根据分析设计和调研特征。机器学习的数据分析和特征研究不是本文讨论的范畴,我们将不作展开。本文假定用户具备机器学习的基本理论知识,有解决机器学习问题的能力,能够理解SQL语法,并能够使用SQL语法构建特征。针对本案例,用户经过分析和调研设计了若干特征
通常在设计特征前,需要根据机器学习的目标对数据进行分析,然后根据分析设计和调研特征。机器学习的数据分析和特征研究不是本文讨论的范畴,我们将不作展开。本文假定用户具备机器学习的基本理论知识,有解决机器学习问题的能力,能够理解SQL语法,并能够使用SQL语法构建特征。针对本案例,经过分析和调研设计了若干特征

请注意,在实际的机器学习特征调研过程中,科学家对特征进行反复试验,寻求模型效果最好的特征集。所以会不断的重复多次特征设计->离线特征抽取->模型训练过程,并不断调整特征以达到预期效果。

#### 2.2.4 离线特征抽取

源数据准备好以后,就可以进行离线特征抽取,我们将特征结果输出到`'/work/oneflow_demo/out/1'`目录下保存(对应映射为`$demodir/out/1`,方便容器外部使用特征数据),以供后续的模型训练。 `SELECT` 命令对应了基于上述特征设计所产生的 SQL 特征计算脚本。
源数据准备好以后,就可以进行离线特征抽取,我们将特征结果输出到 `'/work/oneflow_demo/out/1'` 目录下保存(对应映射为 `$demodir/out/1`,方便容器外部使用特征数据),以供后续的模型训练。 `SELECT` 命令对应了基于上述特征设计所产生的 SQL 特征计算脚本。
```sql
> USE JD_db;
> select * from
Expand Down
177 changes: 93 additions & 84 deletions docs/zh/use_case/taxi_tour_duration_prediction.md
Original file line number Diff line number Diff line change
@@ -1,81 +1,80 @@
# 出租车行程时间预测OpenMLDB + LightGBM
# 出租车行程时间预测 (OpenMLDB + LightGBM)

本文我们将以[Kaggle上的出租车行车时间预测问题为例](https://www.kaggle.com/c/nyc-taxi-trip-duration/overview),示范如何使用[OpenMLDB](https://github.com/4paradigm/OpenMLDB)和 LightGBM 联合来打造一个完整的机器学习应用。本案例基于 OpenMLDB 集群版进行教程演示
本文将以 [Kaggle 上的出租车行车时间预测问题](https://www.kaggle.com/c/nyc-taxi-trip-duration/overview)为例,示范如何使用 OpenMLDB 和 LightGBM 联合来打造一个完整的机器学习应用。

注意,本文档使用的是预编译好的 docker 镜像。如果希望在自己编译和搭建的 OpenMLDB 环境下进行测试,需要配置使用我们[面向特征工程优化的 Spark 发行版](../tutorial/openmldbspark_distribution.md)。请参考相关[编译](../deploy/compile.md)(参考章节:“针对OpenMLDB优化的Spark发行版”)和[安装部署文档](../deploy/install_deploy.md)(参考章节:“部署TaskManager” - “2 修改配置文件conf/taskmanager.properties”)
注意,本文档使用的是预编译好的 Docker 镜像。如果希望在自己编译和搭建的 OpenMLDB 环境下进行测试,需要配置使用[面向特征工程优化的 Spark 发行版](https://openmldb.ai/docs/zh/main/tutorial/openmldbspark_distribution.html)。请参考[针对 OpenMLDB 优化的 Spark 发行版文档](../tutorial/openmldbspark_distribution.md#openmldb-spark-发行版)和[安装部署文档](../deploy/install_deploy.md#2-修改配置文件conftaskmanagerproperties)

## 1. 环境准备和预备知识
## 准备和预备知识

### 1.1 拉取和启动 OpenMLDB Docker 镜像
本文基于 OpenMLDB CLI 进行开发和部署,首先需要下载样例数据并且启动 OpenMLDB CLI。推荐使用 Docker 镜像来快速体验。

- 注意,请确保 Docker Engine 版本号 >= 18.03
- 拉取 OpenMLDB docker 镜像,并且运行相应容器:
- Docker 版本:>= 18.03

### 拉取镜像

在命令行执行以下命令拉取 OpenMLDB 镜像,并启动 Docker 容器:

```bash
docker run -it 4pdosc/openmldb:0.7.2 bash
```

该镜像预装了OpenMLDB,并预置了本案例所需要的所有脚本、三方库、开源工具以及训练数据。

```{note}
注意,本教程以下的所有演示命令默认均在该已经启动的 docker 容器内运行。
注意,本教程以下的 OpenMLDB 部分的演示命令默认均在启动的 Docker 容器内运行。
```

### 1.2 初始化环境
### 初始化环境

```bash
./init.sh
cd taxi-trip
```
我们在镜像内提供了init.sh脚本帮助用户快速初始化环境,包括:
镜像内提供的 init.sh 脚本帮助用户快速初始化环境,包括:

- 配置 zookeeper
- 启动集群版 OpenMLDB

### 1.3 启动 OpenMLDB CLI 客户端
### 启动 OpenMLDB CLI

```bash
/work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client
```
```{note}
注意,本教程大部分命令在 OpenMLDB CLI 下执行,为了跟普通 shell 环境做区分,在 OpenMLDB CLI 下执行的命令均使用特殊的提示符 `>` 。
```

### 1.4 预备知识:集群版的非阻塞任务
### 预备知识:异步任务

集群版的部分命令是非阻塞任务,包括在线模式的 `LOAD DATA`,以及离线模式的 `LOAD DATA``SELECT``SELECT INTO` 命令。提交任务以后可以使用相关的命令如 `SHOW JOBS`, `SHOW JOB` 来查看任务进度,详情参见[离线任务管理文档](../openmldb_sql/task_manage)。
OpenMLDB 部分命令是异步的,如:在线/离线模式的 `LOAD DATA``SELECT``SELECT INTO` 命令。提交任务以后可以使用相关命令如 `SHOW JOBS``SHOW JOB` 来查看任务进度,详情参见[离线任务管理文档](../openmldb_sql/task_manage/index.rst)。

## 2. 机器学习全流程
## 机器学习全流程

### 2.1 创建数据库和数据表
### 步骤 1:创建数据库和表

以下命令均在 OpenMLDB CLI 环境下执行。
创建数据库 `demo_db` 和数据表 `t1`:

```sql
> CREATE DATABASE demo_db;
> USE demo_db;
> CREATE TABLE t1(id string, vendor_id int, pickup_datetime timestamp, dropoff_datetime timestamp, passenger_count int, pickup_longitude double, pickup_latitude double, dropoff_longitude double, dropoff_latitude double, store_and_fwd_flag string, trip_duration int);
--OpenMLDB CLI
CREATE DATABASE demo_db;
USE demo_db;
CREATE TABLE t1(id string, vendor_id int, pickup_datetime timestamp, dropoff_datetime timestamp, passenger_count int, pickup_longitude double, pickup_latitude double, dropoff_longitude double, dropoff_latitude double, store_and_fwd_flag string, trip_duration int);
```

### 2.2 离线数据准备

首先,切换到离线执行模式。接着,导入样例数据 `/work/taxi-trip/data/taxi_tour_table_train_simple.csv` 作为离线数据,用于离线特征计算。
### 步骤 2:导入离线数据

以下命令均在 OpenMLDB CLI 下执行
首先,切换到离线执行模式。接着,导入样例数据 `/work/taxi-trip/data/taxi_tour_table_train_simple.snappy.parquet` 作为离线数据,用于离线特征计算

```sql
> USE demo_db;
> SET @@execute_mode='offline';
> LOAD DATA INFILE '/work/taxi-trip/data/taxi_tour_table_train_simple.snappy.parquet' INTO TABLE t1 options(format='parquet', header=true, mode='append');
--OpenMLDB CLI
USE demo_db;
SET @@execute_mode='offline';
LOAD DATA INFILE '/work/taxi-trip/data/taxi_tour_table_train_simple.snappy.parquet' INTO TABLE t1 options(format='parquet', header=true, mode='append');
```
```{note}
注意,集群版 `LOAD DATA` 为非阻塞任务,可以使用命令 `SHOW JOBS` 查看任务运行状态,请等待任务运行成功( `state` 转至 `FINISHED` 状态),再进行下一步操作 。
`LOAD DATA` 为异步任务,请使用命令 `SHOW JOBS` 查看任务运行状态,等待任务运行成功( `state` 转至 `FINISHED` 状态),再进行下一步操作 。
```

### 2.3 特征设计
### 步骤 3:特征设计

通常在设计特征前,用户需要根据机器学习的目标对数据进行分析,然后根据分析设计和调研特征。机器学习的数据分析和特征研究不是本文讨论的范畴,我们将不作展开。本文假定用户具备机器学习的基本理论知识,有解决机器学习问题的能力,能够理解SQL语法,并能够使用SQL语法构建特征。

针对本案例,用户经过分析和调研设计了若干特征:
通常在设计特征前,用户需要根据机器学习的目标对数据进行分析,然后根据分析设计和调研特征。然而,机器学习的数据分析和特征研究并不是本文讨论的范畴。本文假定用户具备机器学习的基本理论知识,有解决机器学习问题的能力,能够理解 SQL 语法,并能够使用 SQL 语法构建特征。针对本案例,假设用户经过分析和调研设计了以下若干特征:

| 特征名 | 特征含义 | SQL特征表示 |
| --------------- | --------------------------------------------------------- | --------------------------------------- |
Expand All @@ -92,16 +91,17 @@ cd taxi-trip
| pc_cnt | 最近1天时间窗口内,相同载客量trips总数 | `count(vendor_id) OVER w2` |
| vendor_cnt | 最近1天时间窗口内,同品牌出租车trips总数 | `count(vendor_id) OVER w AS vendor_cnt` |

请注意,在实际的机器学习特征调研过程中,科学家对特征进行反复试验,寻求模型效果最好的特征集。所以会不断的重复多次[特征设计](#2.3-特征设计)->[离线特征抽取](#2.4-离线特征抽取)->[模型训练](#2.5-模型训练)过程,并不断调整特征以达到预期效果。
在实际的机器学习特征调研过程中,科学家对特征进行反复试验,寻求模型效果最好的特征集。所以会不断地重复多次“特征设计->离线特征抽取->模型训练过程,并不断调整特征以达到预期效果。

### 2.4 离线特征抽取
### 步骤 4:离线特征抽取

用户在离线模式下,进行特征抽取,并将特征结果输出到`/tmp/feature_data`目录下保存,以供后续的模型训练。 `SELECT` 命令对应了基于上述特征设计所产生的 SQL 特征计算脚本。以下命令均在 OpenMLDB CLI 下执行
用户在离线模式下,进行特征抽取,并将特征结果输出到 `/tmp/feature_data` 目录下保存,以供后续的模型训练。 `SELECT` 命令对应了基于上述特征设计所产生的 SQL 特征计算脚本。

```sql
> USE demo_db;
> SET @@execute_mode='offline';
> SELECT trip_duration, passenger_count,
--OpenMLDB CLI
USE demo_db;
SET @@execute_mode='offline';
SELECT trip_duration, passenger_count,
sum(pickup_latitude) OVER w AS vendor_sum_pl,
max(pickup_latitude) OVER w AS vendor_max_pl,
min(pickup_latitude) OVER w AS vendor_min_pl,
Expand All @@ -118,74 +118,83 @@ w2 AS (PARTITION BY passenger_count ORDER BY pickup_datetime ROWS_RANGE BETWEEN
```

```{note}
注意,集群版 `SELECT INTO` 为非阻塞任务,可以使用命令 `SHOW JOBS` 查看任务运行状态,请等待任务运行成功( `state` 转至 `FINISHED` 状态),再进行下一步操作 。
`SELECT INTO` 为异步任务,请使用命令 `SHOW JOBS` 查看任务运行状态,等待任务运行成功( `state` 转至 `FINISHED` 状态),再进行下一步操作 。
```

### 2.5 模型训练
### 步骤 5:模型训练

1. 模型训练不在 OpenMLDB 内完成,因此首先通过以下 `quit` 命令退出 OpenMLDB CLI。

```
> quit
```
```
quit;
```

2. 在普通命令行下,执行 train.py(`/work/taxi-trip`目录中),使用开源训练工具 `lightgbm` 基于上一步生成的离线特征表进行模型训练,训练结果存放在 `/tmp/model.txt`中。
2. 在普通命令行下,执行 train.py`/work/taxi-trip` 目录中,使用开源训练工具 `LightGBM` 基于上一步生成的离线特征表进行模型训练,训练结果存放在 `/tmp/model.txt` 中。

```bash
python3 train.py /tmp/feature_data /tmp/model.txt
```
### 2.6 特征抽取SQL脚本上线
```bash
python3 train.py /tmp/feature_data /tmp/model.txt
```

### 步骤 6:特征抽取 SQL 脚本上线

假定[2.3节中所设计的特征](#2.3-特征设计)在上一步的模型训练中产出的模型符合预期,那么下一步就是将该特征抽取SQL脚本部署到线上去,以提供在线的特征抽取
假定[步骤 3 所设计的特征](#步骤-3特征设计)在上一步的模型训练中产出的模型符合预期,那么下一步就是将该特征抽取 SQL 脚本部署到线上去,以提供在线特征抽取服务
selenachenjingxin marked this conversation as resolved.
Show resolved Hide resolved

1. 重新启动 OpenMLDB CLI,以进行 SQL 上线部署
1. 重新启动 OpenMLDB CLI,以进行 SQL 上线部署

```bash
/work/openmldb/bin/openmldb --zk_cluster=127.0.0.1:2181 --zk_root_path=/openmldb --role=sql_client
```

2. 执行上线部署,以下命令在 OpenMLDB CLI 内执行。
2. 执行上线部署:

```sql
--OpenMLDB CLI
USE demo_db;
SET @@execute_mode='online';
DEPLOY demo SELECT trip_duration, passenger_count,
sum(pickup_latitude) OVER w AS vendor_sum_pl,
max(pickup_latitude) OVER w AS vendor_max_pl,
min(pickup_latitude) OVER w AS vendor_min_pl,
avg(pickup_latitude) OVER w AS vendor_avg_pl,
sum(pickup_latitude) OVER w2 AS pc_sum_pl,
max(pickup_latitude) OVER w2 AS pc_max_pl,
min(pickup_latitude) OVER w2 AS pc_min_pl,
avg(pickup_latitude) OVER w2 AS pc_avg_pl,
count(vendor_id) OVER w2 AS pc_cnt,
count(vendor_id) OVER w AS vendor_cnt
FROM t1
WINDOW w AS (PARTITION BY vendor_id ORDER BY pickup_datetime ROWS_RANGE BETWEEN 1d PRECEDING AND CURRENT ROW),
w2 AS (PARTITION BY passenger_count ORDER BY pickup_datetime ROWS_RANGE BETWEEN 1d PRECEDING AND CURRENT ROW);
```

### 步骤 7:导入在线数据

首先,请切换到**在线**执行模式。接着在在线模式下,导入样例数据 `/work/taxi-trip/data/taxi_tour_table_train_simple.csv` 作为在线数据,用于在线特征计算。

```sql
> USE demo_db;
> SET @@execute_mode='online';
> DEPLOY demo SELECT trip_duration, passenger_count,
sum(pickup_latitude) OVER w AS vendor_sum_pl,
max(pickup_latitude) OVER w AS vendor_max_pl,
min(pickup_latitude) OVER w AS vendor_min_pl,
avg(pickup_latitude) OVER w AS vendor_avg_pl,
sum(pickup_latitude) OVER w2 AS pc_sum_pl,
max(pickup_latitude) OVER w2 AS pc_max_pl,
min(pickup_latitude) OVER w2 AS pc_min_pl,
avg(pickup_latitude) OVER w2 AS pc_avg_pl,
count(vendor_id) OVER w2 AS pc_cnt,
count(vendor_id) OVER w AS vendor_cnt
FROM t1
WINDOW w AS (PARTITION BY vendor_id ORDER BY pickup_datetime ROWS_RANGE BETWEEN 1d PRECEDING AND CURRENT ROW),
w2 AS (PARTITION BY passenger_count ORDER BY pickup_datetime ROWS_RANGE BETWEEN 1d PRECEDING AND CURRENT ROW);
--OpenMLDB CLI
USE demo_db;
SET @@execute_mode='online';
LOAD DATA INFILE 'file:///work/taxi-trip/data/taxi_tour_table_train_simple.csv' INTO TABLE t1 options(format='csv', header=true, mode='append');
```
### 2.7 在线数据准备

首先,请切换到**在线**执行模式。接着在在线模式下,导入样例数据 `/work/taxi-trip/data/taxi_tour_table_train_simple.csv` 作为在线数据,用于在线特征计算。以下命令均在 OpenMLDB CLI 下执行。

```sql
> USE demo_db;
> SET @@execute_mode='online';
> LOAD DATA INFILE 'file:///work/taxi-trip/data/taxi_tour_table_train_simple.csv' INTO TABLE t1 options(format='csv', header=true, mode='append');
```
```{note}
注意,集群版 `LOAD DATA` 为非阻塞任务,可以使用命令 `SHOW JOBS` 查看任务运行状态,请等待任务运行成功( `state` 转至 `FINISHED` 状态),再进行下一步操作
`LOAD DATA` 为异步任务,请使用命令 `SHOW JOBS` 查看任务运行状态,等待任务运行成功( `state` 转至 `FINISHED` 状态),再进行下一步操作。
```

### 2.8 启动预估服务
### 步骤 8:启动预估服务

1. 如果尚未退出 OpenMLDB CLI,请使用 `quit` 命令退出 OpenMLDB CLI。
1. 如果尚未退出 OpenMLDB CLI,先退出 OpenMLDB CLI。

```
quit;
```
2. 在普通命令行下启动预估服务:

```bash
./start_predict_server.sh 127.0.0.1:9080 /tmp/model.txt
```
### 2.9 发送预估请求
```bash
./start_predict_server.sh 127.0.0.1:9080 /tmp/model.txt
```
### 步骤 9:发送预估请求

在普通命令行下执行内置的 `predict.py` 脚本。该脚本发送一行请求数据到预估服务,接收返回的预估结果,并打印出来。

Expand Down