教程1:一个机器学习的典型场景
所有文档

          BML 全功能AI开发平台

          教程1:一个机器学习的典型场景

          纽约出租车车费预测问题

          1 任务分析

          出租车车费预测任务的目标是给定大量乘客乘坐出租车的记录,预测车费,是典型的回归问题。难点在于:1. 数据量很大,200G; 2. 选择合适的算法,得到更低的RMSE(均方根误差);

          任务分解为如下步骤:

          1. 从原始数据集中,选择部分数据进行清洗,完成特征工程。
          2. 分别使用Blackhole Dataframe+ML、Pandas+SKLearn完成模型的训练和评估。
          3. 对比两种方法的数据预处理时间、模型训练时间、RMSE等。

          2 教程

          2.1 启动notebook编写代码(Blackhole)

          image.png

          打开Notebook,新建1个Notebook文件:taxi_pre_Blackhole.ipynb。

          image.png

          Step1:数据预处理

          (1)纽约出租车车费数据集介绍:

          数据集名称 数据集大小 下载地址 备注
          data_A 10GB !wget https://s3.amazonaws.com/nyc-tlc/trip+data/yellow_tripdata_20{09..20}-{01..12}.csv
          下载2018-2019中17个月的数据拼成约10GB数据:newyork_taxi_10g.csv
          用来对比Blackhole与Pandas+SKlearn的训练速度差异。
          data_B 610MB !wget https://s3.amazonaws.com/nyc-tlc/trip+data/yellow_tripdata_2019-12.csv
          或使用BOS:
          !wget https://codelab-demos.bj.bcebos.com/yellow_tripdata_2019-12.csv
          用来跑通示例代码。

          数据集每行18列数据,其中17列用来描述乘客乘坐出租车记录的各种属性,1列为预测变量fare_amount(车费)。数据表结构如下:

          image.png

          18列属性标签及其含义如下:

          VendorID : 提供数据记录的供应商。 1-Creative Mobile Technologies 2-VeriFone Inc
          tpep_pickup_datetime : 上车打表的时间
          tpep_dropoff_datetime : 下车打表的时间
          Passenger_count :车辆中的乘客人数(这是驾驶员输入的值)
          Trip_distance:出租车计程器报告的经过行程距离(以英里为单位)
          PULocationID:使用出租车计程表的TLC出租车区
          DOLocationID :取消了出租车计价器的TLC出租车区
          RateCodeID:费率代码id1-标准率 2-JFK机场 3-Newark机场 4-Nassau or Westchester地名 5-议价 6-团体游
          Store_and_fwd_flag:此标志指示在将记录发送到供应商(也称为“存储转发”)之前,行程记录是否已保存在车辆内存中,因为车辆没有与服务器的连接。 Y-是 N-否
          Payment_type(付款方式):表示旅客如何支付旅程的数字代码。 1-信用卡 2-现金 3-免费 4-争议 5-不清楚 6-作废行程
          Fare_amount:计价器计算出的时距票价
          Extra :杂项附加费。 目前,这仅包括0.50美元和1美元的高峰时间以及隔夜费用
          MTA_tax :根据使用的计量费率自动触发的$ 0.50 MTA税。
          Improvement_surcharge :落旗时评估的旅行附加费为0.30美元。 2015年开始征收附加费
          Tip_amount:小费金额–此字段会自动填写信用卡小费。 不包括现金小费。
          Tolls_amount:旅途中支付的所有通行费总额。
          Total_amount:向乘客收取的总金额。 不包括现金小费。

          (2)数据预处理

          下载数据:

          # 下载测试数据(本demo用的数据集约610MB,更大量的数据集,需要下载多个月份数据)
          !wget https://codelab-demos.bj.bcebos.com/yellow_tripdata_2019-12.csv

          数据预处理:

          %%time
          import blackhole.gibbons as pd
          from blackhole.ml.ensemble import RandomForestRegressor
          from blackhole.ml.model_selection import train_test_split
          from blackhole.ml.metrics import mean_squared_error, r2_score
           
          # 读取数据及数据处理
          #data_dir = '/home/work/data/newyork_taxi_10g.csv'
          data_dir = './yellow_tripdata_2019-12.csv'
          df = pd.read_csv(data_dir)
           
          import datetime as dt
          # 数据格式转换
          df['store_and_fwd_flag'] = pd.Categorical(df['store_and_fwd_flag'])._categorical.codes
          df['tpep_pickup_datetime'] = df['tpep_pickup_datetime'].astype('datetime64').dt.dayofweek
          # 剔除不相关特征
          df = df.drop('tpep_dropoff_datetime', axis=1)
          # 剔除空值
          df = df.dropna()
          # 过滤异常值(乘客数大于6)
          df = df[(df.passenger_count < 6) & (df.fare_amount < 1000)]

          数据切分:

          %%time
           
          # 数据切分
          X = df[df.columns.difference(['fare_amount'])]
          y = df['fare_amount']
          X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

          Step2:模型训练

          %%time
           
          # 模型训练
          model = RandomForestRegressor()
          model.fit(X_train, y_train)

          Step3:预测评估

          %%time
           
          # 模型效果评估
          import numpy as np
          y_pred = model.predict(X_test)
          rmse = np.sqrt(mean_squared_error(y_test, y_pred))
          r2 = r2_score(y_test, y_pred, multioutput='variance_weighted')
          print("(rmse, r2):", rmse, r2)

          2.2 提交本地/云端任务,完成训练(Blackhole)

          编写完代码后,返回BML CodeLab桌面进入"任务"应用。

          2.2.1 提交本地任务

          image.png

          Step1:创建任务

          填写任务名称,选择相应的执行方式和启动方式,提交本地任务,详见本地任务管理

          image.png

          Step2:查看运行结果

          点击"提交"任务后,在本地任务或云端任务查看训练和评估结果。

          image.png

          2.2.2 提交云端任务

          提交云端任务也需要"创建任务"、"查看运行结果",详见云端任务管理

          与提交本地任务不同的是:

          1. 提交云端任务前,需要先把notebook文件上传到云端。

          点击"本地推送到云端"按钮。

          image.png

          选择需要上传的文件:taxi_pre_Blackhole.ipynb,点击"提交"。弹窗中将显示修改的文件,不同文件颜色代表不同含义,如标绿文件为新建文件,红色文件为已删除文件,蓝色文件为已修改文件。

          image.png

          点击"历史版本"。

          image.png

          查看新生成的版本:V17。

          image.png

          点击某一版本号将显示当前版本的详细信息。

          image.png

          如果未将文件上传至云端:

          • 首次创建云端任务时,云端文件版本将为空,无法创建云端任务;
          • 非首次创建任务时,由于无法选择含有指定文件的云端文件版本,创建任务后,任务将运行失败。如下图选择版本号V16,未包含taxi_pre_Blackhole.ipynb文件,运行将失败。

          image.png

          image.png

          2. 提交云端任务时,为保证不同任务之间的环境不会相互影响,云端会对每个任务的产出做隔离。云端在执行任务前会自动注入环境变量 OUTPUT_PATH , 用户在训练过程中产生的数据,模型、运行结果均可写入到此环境变量对应的地址中, 任务执行完成后,该地址中的数据将会自动上传。用户即可在本地浏览任务产生的数据。

          提交本地任务时,运行结果可以保存到任意位置。

          云端用法示例:

          # 云端数据输出地址,程序运行完成后,该地址下面的所有数据、模型将会被上传
          output_path = os.environ['OUTPUT_PATH']  #输出路径
          model_path = os.path.join(output_path, 'your model name') #模型保存路径
          train_data_path = os.path.join(output_path, 'train_data')#训练数据保存路径
          test_data_path = os.path.join(output_path, 'test_data')#测试数据保存路径
          
          with open(train_data_path, 'w') as fwriter:
              fwriter.write("train data")
          
          with open(test_data_path, 'w') as fwriter:
              fwriter.write("test data")

          以上是使用CodeLab内置高性能计算引擎Blackhole编写的训练代码。

          作为对比,接下来,我们也给出使用Pandas和SKlearn编写训练代码,完成同一个任务。

          2.3 启动notebook编写代码(Pandas+SKlearn)

          打开Notebook,新建1个Notebook文件:taxi_pre_Pandas+SKlearn.ipynb。

          image.png

          在taxi_pre_Pandas+SKlearn.ipynb中依次输入如下代码:

          Step1:数据预处理

          %%time
           
          import pandas as pd
          from sklearn.ensemble import RandomForestRegressor
          from sklearn.model_selection import train_test_split
          from sklearn.metrics import mean_squared_error, r2_score
           
          # 读取数据及数据处理
          data_dir = './yellow_tripdata_2019-12.csv'
          df = pd.read_csv(data_dir)
           
          import datetime as dt
          # 数据格式转换
          df['store_and_fwd_flag'] = df['store_and_fwd_flag'].astype('category').cat.codes
          df['tpep_pickup_datetime'] = df['tpep_pickup_datetime'].astype('datetime64').dt.dayofweek
          # 剔除不相关特征
          df = df.drop('tpep_dropoff_datetime', axis=1)
          # 剔除空值
          df = df.dropna()
          # 过滤异常值(乘客数大于6)
          df = df[(df.passenger_count < 6) & (df.fare_amount < 1000)]

          数据切分:

          %%time
           
          # 数据切分
          X = df[df.columns.difference(['fare_amount'])]
          y = df['fare_amount']
          X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

          Step2:模型训练

          %%time
           
          
          # 模型训练
          model = RandomForestRegressor()
          model.fit(X_train, y_train)

          Step3:模型评估

          %%time
           
          # 模型效果评估
          import numpy as np
          y_pred = model.predict(X_test)
          rmse = np.sqrt(mean_squared_error(y_test, y_pred))
          r2 = r2_score(y_test, y_pred, multioutput='variance_weighted')
          print("(rmse, r2):", rmse, r2)

          编辑好代码,数据集分别选择“data_A”和“data_B”,依次运行,即可得到训练结果和每一部分的运行时长。

          2.4 Blackhole与Pandas+SKlearn训练结果对比

          使用Blackhole编写的训练代码和使用Pandas+SKlearn编写的代码,运行在同样的硬件环境上。

          训练时长和训练结果RMSE对比如下表所示。

          硬件环境 数据集 数据预处理 模型训练和评估 端到端耗时 RMSE r2
          Pandas+SKlearn CPU:28逻辑核,Intel(R) Xeon(R)
          Gold 5117 CPU @ 2.00GHz
          内存:256G
          GPU:7卡 Tesla P40
          显存:24G
          data_A,10GB 490.0s 2054.8s 2544.8s 3.538 0.908
          data_B,610MB 21.6s 1191.2s 1212.8s 0.782 0.992
          Blackhole data_A,10GB 108.9s 564.7s 673.6s 3.794 0.888
          data_B,610MB |4.3s 146.0s 150.3s 0.779 0.996
          上一篇
          用户手册
          下一篇
          教程2:一个深度学习的典型场景