Skip to content

Commit

Permalink
docs: polish taxi_tour_duration_prediction.md (#2993)
Browse files Browse the repository at this point in the history
  • Loading branch information
selenachenjingxin authored Mar 5, 2023
1 parent 0af6d5e commit 9f72598
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 89 deletions.
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 脚本部署到线上去,以提供在线特征抽取服务
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

0 comments on commit 9f72598

Please sign in to comment.