Kaggle playground 练习项目 New York City Taxi Trip Duration

本文通过Kaggle上的纽约市出租车行驶时间预测项目,介绍数据清洗、特征工程、建模和训练的过程。特征包括行程ID、接送经纬度、乘客数量等。经过离群点处理、时间特征转换、K均值聚类等特征工程步骤,使用随机森林、LightGBM和CatBoost等模型进行训练,最终实现较好的预测效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近接触了一些机器学习知识,想在kaggle上找入门项目做做练手。于是选择了New York City Taxi Trip Duration这个预测出租车行驶时间的练习赛。

     训练集特征包括以下部分,目的是建立模型预测出租车每次行程的行驶时间。

    id - 每次旅行的唯一标识符
    vendor_id - 指示与旅行记录关联的提供者的代码
    pickup_datetime - 仪表启用的日期和时间
    dropoff_datetime - 仪表脱离的日期和时间
    passenger_count - 车辆中的乘客数量(驾驶员输入值)
    pickup_longitude - 仪表所用的经度
    pickup_latitude - 仪表所处的纬度
    dropoff_longitude - 仪表脱离的经度
    dropoff_latitude - 仪表脱离的纬度
    store_and_fwd_flag - 该标志指示在发送给供应商之前是否将行程记录保存在车辆存储器中,因为车辆没有连接到服务器

                                       Y =存储和转发; N =不是商店和前瞻旅行
    trip_duration - 行程的持续时间,以秒为单位

    评分根据为RMSE(均方根误差)。

 

        以下是一个使用随机森林预测的简单初步模型。

 

# -*- coding: utf-8 -*-

import pandas as pd

train = pd.read_csv("train.csv", header=0)
test = pd.read_csv("test.csv", header=0)

# 查看数据的字段信息, dropoff_datetime,id可以去掉
# print(train.columns)
# print(test.columns)

# 查看数据是否有缺失
# print(train.info())
# print(test.info())

# 选取特征值
X_train = train.drop(['dropoff_datetime', 'trip_duration', 'id'], axis=1)
y_train = train['trip_duration']
X_test = test.drop(['id'], axis=1)

# print(X_train.shape)
# print(X_test.shape)
# print(y_train.head())

# 特征值处理
X_train['month'] = pd.DatetimeIndex(X_train.pickup_datetime).month
X_train['day'] = pd.DatetimeIndex(X_train.pickup_datetime).dayofweek
X_train['hour'] = pd.DatetimeIndex(X_train.pickup_datetime).hour
X_train['store_and_fwd_flag'].replace('Y', 1, inplace=True)
X_train['store_and_fwd_flag'].replace('N', 0, inplace=True)
X_train = X_train.drop(['pickup_datetime'], axis=1)

X_test['month'] = pd.DatetimeIndex(X_test.pickup_datetime).month
X_test['day'] = pd.DatetimeIndex(X_test.pickup_datetime).dayofweek
X_test['hour'] = pd.DatetimeIndex(X_test.pickup_datetime).hour
X_test['store_and_fwd_flag'].replace('Y', 1, inplace=True)
X_test['store_and_fwd_flag'].replace('N', 0, inplace=True)
X_test = X_test.drop(['pickup_datetime'], axis=1)
# print(X_test['store_and_fwd_flag'].value_counts())
# print(X_train.head())
# print(X_test.head())
# print(X_train.shape)
# print(X_test.shape)

# 使用RandomForestRegressor进行回归预测
from sklearn.ensemble import RandomForestRegressor
rfr = RandomForestRegressor()
rfr.fit(X_train, y_train)
rfr_y_predict = rfr.predict(X_test)


# 输出结果
gbr_submission = pd.DataFrame({'id': test['id'], 'trip_duration': rfr_y_predict})
gbr_submission.to_csv('rfr_submission.csv', index=False)

最终分数为0.55480,还有很大的提升空间。

下面是一个进行了比较完善的特征工程,并且使用了模型融合的解法。

 导入各种计算包

import pandas as pd
pd.set_option('display.max_columns', None)
import numpy as np
import tensorflow as tf

from sklearn.ensemble import RandomForestRegressor as RFR
import lightgbm as lgb
from catboost import CatBoostRegressor

from collections import namedtuple
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay

import time
import operator
import haversine
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from datetime import timedelta
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline  

读入数据

train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

确定没有重复和错误数据

print(train.duplicated().sum())
print(train.id.duplicated().sum())
print(test.id.duplicated().sum())

sum(train.dropoff_datetime < train.pickup_datetime)

数据清洗

train = train.drop('dropoff_datetime',1)
train.trip_duration.describe()

# Values are in minutes
print(np.percentile(train.trip_duration, 99)/60)
print(np.percentile(train.trip_duration, 99.5)/60)
print(np.percentile(train.trip_duration, 99.6)/60)
print(np.percentile(train.trip_duration, 99.8)/60)
print(np.percentile(train.trip_duration, 99.85)/60)
print(np.percentile(train.trip_duration, 99.9)/60)
print(np.percentile(train.trip_duration, 99.99)/60)
print(np.percentile(train.trip_duration, 99.999)/60)
print(np.percentile(train.trip_duration, 99.9999)/60)
print(train.trip_duration.max() / 60)

通过上面的操作可以看见,有些旅程记录耗费时间太多,应该作为离群点删去,否则会对模型预测造成影响。

# Check how many trips remain with each limit
print(len(train[train.trip_duration <= np.percentile(train.trip_duration, 99.9)]))
print(len(train[train.trip_duration <= np.percentile(train.trip_duration, 99.99)]))
print(len(train[train.trip_duration <= np.percentile(train.trip_duration, 99.999)]))

# Remove outliers
train = train[train.trip_duration <= np.percentile(train.trip_duration, 99.999)]

对训练集作图,查找离群点。

# Plot locations - look for outliers
n = 100000 # number of data points to display

f, (ax1, ax2) = plt.subplots(1, 2, sharey=True, figsize=(10, 5))
ax1.scatter(train.pickup_longitude[:n], 
            train.pickup_latitude[:n],
            alpha = 0.1)
ax1.set_title('Pickup')
ax2.scatter(train.dropoff_longitude[:n], 
            train.dropoff_latitude[:n],
            alpha = 0.1)
ax2.set_title('Dropoff')

图像如下所示

### 数据预处理 在进行纽约市出租车行程时间预测之前,数据预处理是一个重要的环节。这一步骤通常涉及清洗原始数据集中的缺失值、异常值以及冗余特征[^1]。例如,在Kaggle项目的NYC Taxi Trip Duration案例中,可以发现一些不合理的经纬度坐标或者极端的行驶距离。这些都需要被识别并剔除。 对于日期时间字段,可以通过提取小时数、星期几等信息来增强模型的表现力。因为交通状况往往受到一天中的时间段和工作日/周末的影响显著。 ```python import pandas as pd def preprocess_data(df): df['pickup_datetime'] = pd.to_datetime(df['pickup_datetime']) df['dropoff_datetime'] = pd.to_datetime(df['dropoff_datetime']) # 提取时间和日期特性 df['hour'] = df.pickup_datetime.dt.hour df['day_of_week'] = df.pickup_datetime.dt.dayofweek return df ``` ### 特征工程 为了提高机器学习算法的效果,可以从现有变量派生新的有意义的特征。比如计算两点之间的直线距离(Haversine Distance),这是一个衡量两个地理坐标的简单方法;还可以考虑曼哈顿距离作为替代方案之一,因为它更贴近城市道路网格布局下的实际驾驶路径长度。 另外,利用聚类技术将起点终点位置分组也可能带来额外收益。通过这种方式能够捕捉到某些特定区域间的频繁交互模式。 ```python from math import radians, sin, cos, sqrt, atan2 def haversine_distance(lat1, lon1, lat2, lon2): R = 6371.0 # 地球半径 千米 phi_1 = radians(lat1) phi_2 = radians(lat2) delta_phi = radians(lat2 - lat1) delta_lambda = radians(lon2 - lon1) a = (sin(delta_phi / 2)**2 + cos(phi_1) * cos(phi_2) * sin(delta_lambda / 2)**2) c = 2 * atan2(sqrt(a), sqrt(1-a)) distance_km = R * c return distance_km ``` ### 建模与评估 选择合适的回归模型来进行预测至关重要。常见的做法是从简单的线性回归开始尝试,逐步过渡至更加复杂的随机森林或梯度提升树等集成方法。考虑到本问题可能存在大量样本量级较大的情况,XGBoost 和 LightGBM 这样的高效实现会成为不错的选择。 最后不要忘记采用交叉验证策略以获得稳健可靠的性能估计指标如均方误差(MSE),平均绝对误差(MAE) 或者R²分数等等。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值