Python时间序列梯度提升模型预测优化共享单车调度

梯度提升模型在机器学习社区中脱颖而出,因为它们在众多用例(回归和分类)中取得了良好的效果。 尽管它们在预测中的使用受到限制,但近年来,已经表明它们可以取得非常有竞争力的结果。 使用这种类型的模型的一些优点是:

  • 除了自回归变量之外,易于包括外生变量。
  • 它们允许在模型中包含非线性关系。
  • 高可扩展性,允许在大量数据可用时应用它们。

尽管它们具有潜在的优势,但在将机器学习模型应用于预测问题时,会出现一些问题,使分析师不愿意使用它们,主要是:

  • 重塑数据,使其可以像回归问题一样使用。
  • 根据需要多少未来预测(预测范围),必须对迭代过程进行编程,其中每个新预测都依赖于先前的预测。
  • 模型验证需要特定的策略,例如回溯测试、前向验证或时间序列交叉验证。不能应用传统的交叉验证。

共享单车调度

共享单车系统是一种共享交通服务,其中单车可在短期内供个人共享使用。 许多单车共享系统允许人们从码头借用单车,然后在属于同一系统的另一个码头归还。 码头是特殊的单车位,可以锁定单车,只能通过计算机控制释放。

管理这些系统的主要挑战之一是需要重新分配自行车,以确保在所有码头都有可用的单车以及可供归还的空闲空间。

为了改进单车配送的规划和执行,建议创建一个能够预测未来 36 小时内用户数量的模型。 这样,在每天 12:00 时,负责管理系统的公司将能够了解当天剩余时间(12 小时)和次日(24 小时)的预期需求。 为了简化本文档中显示的示例,假设正在对单个站进行建模。

数据集

本文档中的数据代表 2011 年和 2012 年自行车租赁系统的每小时使用情况。除了每小时的用户数量外,还提供有关天气状况和节假日的信息。 原始数据已从机器学习存储库中获得,并且之前已应用以下修改进行了清理(代码):

  • 使用更具描述性的名称重命名列。
  • 重命名天气变量的类别。大雨的类别已与雨的类别合并。
  • 非归一化的温度、湿度和风变量。
  • 创建变量 date_time 并设置为索引。
  • 通过前向填充填补缺失值。

生成的数据集包含以下列:

  • date_time:日期和时间。
  • month:1月~12月。
  • hour:0时~23时。
  • holiday:如果当天是假期
  • weekday:星期几(星期一 = 0,星期日 = 6)。
  • workingday:如果是工作日。
  • weathersit:当天的天气(晴、雾、雨)。
  • temp:注册温度。
  • atemp:热感觉。
  • hum:记录的湿度。
  • windspeed:记录的风速。
  • users:单车租赁服务的用户总数。
# Split train-val-test
# ==============================================================================
end_train = '2012-03-31 23:59:00'
end_validation = '2012-08-31 23:59:00'
data_train = data.loc[: end_train, :]
data_val   = data.loc[end_train:end_validation, :]
data_test  = data.loc[end_validation:, :]

print(f"Dates train      : {data_train.index.min()} --- {data_train.index.max()}  (n={len(data_train)})")
print(f"Dates validacion : {data_val.index.min()} --- {data_val.index.max()}  (n={len(data_val)})")
print(f"Dates test       : {data_test.index.min()} --- {data_test.index.max()}  (n={len(data_test)})")

图形绘制

时间序列的图形探索对于识别趋势、模式和季节性非常有用,这有助于指导选择可能是良好预测指标的滞后。

data_train['users'].plot(ax=main_ax, label='train', alpha=0.5)
data_val['users'].plot(ax=main_ax, label='validation', alpha=0.5)
data_test['users'].plot(ax=main_ax, label='test', alpha=0.5)
min_y = min(data['users'])
max_y = max(data['users'])
main_ax.fill_between(zoom, min_y, max_y, facecolor='blue', alpha=0.5, zorder=0)
main_ax.set_xlabel('')
main_ax.legend(loc='lower center', ncol=3, bbox_to_anchor=(0.5, -0.8))

data.loc[zoom[0]: zoom[1]]['users'].plot(ax=zoom_ax, color='blue', linewidth=2)

main_ax.set_title(f'Number of users: {data.index.min()}, {data.index.max()}', fontsize=14)
zoom_ax.set_title(f'Number of users: {zoom}', fontsize=14)
plt.subplots_adjust(hspace=1)

季节绘图

自相关图

极端梯度提升

外生变量

LightGBM | CatBoost

源代码

详情参阅 - 亚图跨际

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值