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

          BML 全功能AI开发平台

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

          纽约出租车车费预测问题

          1 任务分析

          出租车车费预测任务的目标是给定大量乘客乘坐出租车的记录,预测车费,是典型的回归问题。

          任务分解为如下步骤:

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

          2 教程

          2.1 启动notebook编写代码(Blackhole)

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

          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 100MB !wget https://bj.bcebos.com/codelab-dataset/demo/yellow_tripdata_2019-12.csv 用来跑通示例代码。

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

          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用的数据集约100MB,更大量的数据集,需要下载多个月份数据)
          !wget https://bj.bcebos.com/codelab-dataset/demo/yellow_tripdata_2019-12.csv

          数据预处理:

          如若未下载Blackhole包的话,请先进入包管理对Blackhole进行下载。详见包管理

          %%time
          import blackhole.dataframe 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 = './yellow_tripdata_2019-12.csv'
          df = pd.read_csv(data_dir)
           
          import datetime as dt
          # 数据格式转换
          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)

          2.2.1 本地提交任务

          右键notebook文件,选择提交任务,具体内容详见提交训练任务

          2.2.2 云codelab提交任务

          请先将文件所属项目同步进云codelab

          进入项目列表,点击进入云codelab

          后续步骤与本地提交任务相同

          以上是使用CodeLab精选推荐高性能计算引擎Blackhole编写的训练代码。

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

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

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

          在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['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,100MB 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:一个深度学习的典型场景