纽约出租车乘坐时长

通过乘车信息预测乘客会在出租车上面呆多久

Link:https://www.kaggle.com/c/nyc-taxi-trip-duration

题目描述

本项目旨在预测在纽约乘坐出租车进行一次出行的时长。

出租车的出行时长和很多因素有关,比如起点和终点的位置,不同厂家所生产的出租车的各种性能也会不同,也会或多或少的影响单次出行时长。通过这些信息能否捕捉到出行时长呢?如何提取出有效的特征?这些问题真的需要认真考虑。

你的数据集来自于NYC Taxi and Limousine Commission (纽约出租车协会),内容包括乘客上车时间,地理坐标,乘客数量,和其他相关数据。

小提示

  • 可以先对相对独立的特征值进行分析,如时间和地理坐标等等,适当地进行视觉化处理,找出一些规律。
  • 模型可以使用常用的回归模型,如Random forest, Decision tree, XGBoost等。
  • 可以结合一定的外部数据集,如季节、天气和路线等数据。

先修技能

  • 数据可视化相关函数库,如matplotlip, seaborn
  • 懂得基本的机器学习回归模型的原理和使用。

解释术语

  • Random Forest(随机森林):指的是利用多棵树对样本进行训练并预测的一种算法。在机器学习领域,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
  • Decision Tree(决策树):是一种十分常用的机器学习方法。在机器学习领域,决策树是一个监督学习模型,他代表的是对象属性与对象值之间的一种映射关系,通常用来进行分类以及回归分析。
  • XGBoost:XGBoost是Gradient Boosting的一种高效系统实现,并不是一种单一算法。xgboost里面的基学习器除了用tree(gbtree),也可用线性分类器(gblinear)。

输入格式

数据分为训练数据和测试数据,分别保存在train.csv和test.csv两个文件中。

其中训练数据主要包括1,021,051条记录,每行代表一次出租车出车记录。字段一共11列,包括:

  • 出车记录id(id)
  • 出租车公司(vendor_id):一共两家出租车公司,分别记为1和2
  • 载客时间(pickup_datetime):包含日期和时间
  • 载客地点经度(pickup_longitude)
  • 载客地点纬度(pickup_latitude)
  • 卸客时间(dropoff_datetime):包含日期和时间
  • 卸客地点经度(dropoff_longitude)
  • 卸客地点纬度(dropoff_latitude)
  • 乘客数量(passenger_count)
  • 数据发送存储标记(store_and_fwd_flag):数据如果及时发送给出租车公司服务器,则标记为N,若存储在出租车设备内存中,未发送给服务器,则标记为Y
  • 出车时长(trip_duration):单位为秒,即为所预测的值

测试数据一共437,593条记录,包括9列,其中不含卸客时间和出车时长。

输出格式

你提交的csv文件应包含两列,第一列为出车记录id,第二列为预测到的出车时长(单位为秒):

id,trip_duration
id00001,978
id00002,978
id00003,978
id00004,978
etc.

评价

对于提交的文件,我们将使用RMSLE (Root Mean Squared Logarithmic Error)作为评价指标,公式如下:

$$ \epsilon =\sqrt{\frac{1}{n}\sum{i=1}^{n}(log(p{i}+1)-log(a_{i}+1))^2}

$$

其中$$\epsilon$$是RMSLE值,n是测试集的记录数,$$p{i}$$是你预测出来的时长,$$a{i}$$是实际时长。

代码与数据

训练和测试集过大,保存至百度网盘 https://pan.baidu.com/s/1bqos88n,密码:m8a9。 https://pan.baidu.com/s/1pMW9wQR 密码:ea1i

压缩包中包括:

  • train.csv:训练集
  • test.csv:测试集
  • sample_submission.csv:预测结果示例
  • correct_submission.csv:正确预测结果

评测配置环境

python

pip install numpy
pip install pandas
pip install scikit-learn

测评代码

import pandas as pd
import numpy as np

test = pd.read_csv("./correct_submission.csv").sort_values('shot_id')
pred = pd.read_csv("./predict_submission.csv").sort_values('shot_id')

loss = (((np.log(test['trip_duration'] + 1) - np.log(pred['trip_duration'] + 1)) ** 2).mean()) ** 0.5
# loss越小越好,最小为0,无理论上限,一般做到个位数算正常,超过10就已经不正常了,极大概率不超过100

results matching ""

    No results matching ""