news 2026/10/30 6:51:34

731天共享单车数据集 | 日级+小时级 | 需求预测实操 | 机器学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
731天共享单车数据集 | 日级+小时级 | 需求预测实操 | 机器学习

封面:慧数研析社原创 AI 插画。正文曲线与误差图为真实数据计算图,不是官方效果展示。

共享单车运力安排涉及两个不同的问题:明天整体会有多少次租赁,以及某个小时会出现多大的需求。前者帮助理解日常资源规模,后者关系到更细的时段安排。对刚开始学习计数回归的开发者而言,一份同时提供日级、小时级记录的数据,可以把业务问题、表格字段和评估粒度连起来,也便于观察同一套方法在不同任务中的表现。

但找数据时,困难往往不在模型选择。原始出行明细可能涉及隐私,聚合表又容易丢失字段含义;下载后如果不了解标签和时间范围,就可能把历史实测信息当作未来输入,或者把随机拆分分数当作实际预测能力。教程若只给读取代码、不给许可与划分依据,读者仍然无法判断数据是否适合自己,更难确认结果能否复现。

UCI 的 Bike Sharing 提供历史租赁聚合计数、日历和天气字段,适合练习这些基本判断。本文先核对规模、格式、许可、优势及局限,再完成下载检查、预处理、日级与小时级预测和误差解读。目标是让你拿到一条可以复制、能够解释的学习流程;它不包含站点库存,也不直接提供今天某座城市的可用调度方案。

一、数据集核心信息:先判断是否适合你的任务

以下依据 UCI 原始数据卡、ZIP 内 Readme 与本文 2026-10-28 实际读取。表中“未说明”表示所核对来源没有给出,不代表该属性不存在。

信息类别已核对内容
基础属性:规模与类型表格型租赁聚合计数;day.csv 实读731行、16列,hour.csv 实读17,379行、17列,分别是日级与小时级记录,不能相加后称为独立出行样本数
基础属性:采集时间2011–2012年;日文件日期为2011-01-01至2012-12-31
采集信息:设备具体采集设备、传感器型号未说明
采集信息:场景、环境Capital Bikeshare 运营系统历史租赁记录;随记录提供季节、日历与天气信息,具体采集硬件环境未说明
标注情况:类型目标cnt为租赁总次数;casual、registered为对应分项计数;不属于图像框或掩码标注
标注情况:精度与工具独立标注准确率、人工审核精度、标注工具未说明;不能据此声称“高精度人工标注”
格式与规格CSV;日文件16列、小时文件17列,小时文件多hr字段;图像分辨率不适用
文件大小本次下载ZIP为279,992字节;解压day.csv为57,569字节、hour.csv为1,156,736字节、Readme为5,607字节;均为本文读取值
数据划分官方文件没有本文这样的训练/验证/测试预分区;本文自定义2011年训练、2012年测试,不另设验证集,不做参数搜索
数据增强来源未说明提供增强样本;本文不合成、不复制数据来扩增训练集
来源与维护UCI ID275,DOI 10.24432/C5W894;页面捐赠日期2013-12-19;独立版本号、最近更新时间未说明
许可、访问、引用当前数据卡标注CC BY 4.0,官方ZIP本次无需账号可下载;保留来源、作者与许可,按Readme引用相关论文
隐私与应用边界本文读取的字段为聚合计数、日期和环境变量,没有用户身份、逐车轨迹或站点库存字段;这不等于对所有下游使用作隐私合规保证

有一处口径冲突必须保留:UCI 页面顶部的实例数是17,389;ZIP 的 Readme 与本次解析的小时文件均为17,379行。本文采用原文件实读行数,日级731行另行核对;不把网页摘要数字直接替换成代码的预期结果。ZIP 的校验值写在获取代码中,用于识别本次文件,不是官方版本号。

二、核心优势与限制:它的学习价值在哪里

这份数据适合用较小的表格材料,完整练习从业务粒度、字段理解到预测评估的流程。其特点有四项,以下不作缺少同条件证据的“优于所有同类”比较。

  • 日级与小时级配套,能比较两种需求问题。原始包同时给出day.csv与hour.csv,小时文件新增hr。读者既可练习每日总需求,也可把目标细化到时段;两种误差单位不同,不能直接比较分数大小判断哪个模型更强。
  • 字段解释可追溯,便于决定输入边界。Readme说明了日期、工作日、天气和租赁计数等含义。本文据此挑选预测前可知的日历字段,并识别casual、registered是目标组成部分;“有字段说明”不代表所有字段都可直接拿来预测。
  • 标准CSV降低读取门槛。本次原始ZIP为279,992字节,pandas可直接读取,无需准备图像解码或深度学习训练流水线。训练演示使用scikit-learn的编码器与回归器,不要求GPU;不据此承诺具体电脑上的耗时。
  • 分项与总量可核对,适合训练质量审查习惯。两份文件均可验证casual+registered=cnt,并检查主键、缺失和非负计数。这能提供具体审查练习,但恒等式成立不等于所有记录都没有采集误差,也不是独立标注准确率证明。

限制也很明确:数据属于较早时期的一个运营系统,不能代表今天所有城市;聚合记录不能回答逐车路径、站点剩余车辆等问题。历史天气通常是当时的实际观测,不能在“未来需求预测”中假装已经拿到当天实测值。本文两个任务只用日历信息,结果用于学习,不作线上调度效果承诺。

三、数据样例:先读懂一行代表什么

下表为day.csv最前面的三条真实记录,仅选取部分字段;代码会打印同样的内容。weekday保留原文件编码,不自行改成另一套星期编号。

dtedaymnthweekdayworkingdaycnt
2011-01-01160985
2011-01-02100801
2011-01-031111349

cnt统计租赁次数,不是独立骑行人数。日级每行是一天,小时级每行是某天某小时。小时文件的“日期+小时”才是本实验使用的记录键,不能只按日期去重,否则会错误删除同一天的大部分小时记录。

四、环境、获取与预处理:先让输入可信

1. 建环境并获取原文件

核心代码已在Python 3.14.0、NumPy 2.5.4、pandas 3.1.0、scikit-learn 1.9.1实际执行。下面是macOS/Linux环境命令;其他操作系统的安装没有逐一验证。无需GPU。

python3-mvenv .venvsource.venv/bin/activate python-mpipinstallnumpy==2.5.4pandas==3.1.0 scikit-learn==1.9.1

下列Python代码块按顺序拼接,保存为bike_two_scales.py,再执行python bike_two_scales.py。所有数据从UCI官方地址获取;若哈希断言失败,先回原页核对版本与文件变化,不能直接删断言后继续沿用本文数字。

"""UCI Bike Sharing: daily/hourly demand tutorials, not official benchmarks."""importhashlibimportioimportjsonimportplatformimporturllib.requestimportzipfilefrompathlibimportPathimportnumpyasnpimportpandasaspdimportsklearnfromsklearn.dummyimportDummyRegressorfromsklearn.linear_modelimportPoissonRegressorfromsklearn.metricsimportmean_absolute_error,root_mean_squared_errorfromsklearn.pipelineimportmake_pipelinefromsklearn.preprocessingimportOneHotEncoder URL="https://archive.ics.uci.edu/static/public/275/bike+sharing+dataset.zip"withurllib.request.urlopen(URL,timeout=60)asresponse:raw=response.read()asserthashlib.sha256(raw).hexdigest()==("b70182d0d0508e9abbb79306ce5c0cec34869000f8220175ac83d11dbe845401"),"File changed: inspect the official source before continuing."withzipfile.ZipFile(io.BytesIO(raw))asarchive:day=pd.read_csv(archive.open("day.csv"),parse_dates=["dteday"])hour=pd.read_csv(archive.open("hour.csv"),parse_dates=["dteday"])sizes={name:archive.getinfo(name).file_sizefornameinarchive.namelist()}forframe,keysin[(day,["dteday"]),(hour,["dteday","hr"])]:assertnotframe.duplicated(keys).any()assertnotframe.isna().any().any()assert(frame["casual"]+frame["registered"]==frame["cnt"]).all()assert(frame["cnt"]>=0).all()day=day.sort_values("dteday").reset_index(drop=True)hour=hour.sort_values(["dteday","hr"]).reset_index(drop=True)print(day[["dteday","mnth","weekday","workingday","cnt"]].head(3))

2. 为什么这样预处理

代码先检查键是否重复、是否有缺失、目标是否非负,以及分项能否加回总量,然后按日期或“日期+小时”排序。此次检查通过,因此不额外填补或删行;表格也不需要图像缩放、通道转换。机械套用图像增强会改变这里的业务意义。

小时文件与完整的731天×24小时网格相比,少165个日历时段,这是本文按原文件行数计算的差额;来源未逐条解释原因。缺少记录不能直接等于零需求,本例只对现有记录做评估,不自动补零,也不声称覆盖完整连续小时序列。

两个任务都按2011年训练、2012年测试。独热编码器只在训练集拟合,并与模型组成Pipeline,避免预处理跨越测试边界。未设置验证集是因为本例不选参数;后续调参应在训练期内部划出时间窗口,不能反复拿2012年的分数挑配置。

来源:UCI day.csv;慧数研析社实际计算绘图。虚线是本文选择的切分,不是官方规定。此图沿用此前同一文件、同一划分的已执行绘图结果。

五、两个核心任务:从日需求到小时需求

1. 共用训练函数:先给简单基线留位置

每个任务都比较训练期目标中位数与日历Poisson回归。中位数模型回答“不学习日历规律能做到什么”;Poisson回归提供非负计数均值的建模示例,不要求真实数据严格符合理想Poisson分布,也不保证它是最优模型。

alpha=1.0是本文选择的正则化强度,max_iter=1000为迭代上限,均不是数据集官方推荐参数。月份、星期和小时采用类别编码;handle_unknown="ignore"避免未知类别转换时报错,但不代表模型学到了该类别的效果。MAE按绝对误差平均,RMSE对大误差惩罚更重。

# Shared training function: fit both preprocessing and model on 2011 only.defevaluate(frame,features):train=frame["dteday"]<"2012-01-01"X,y=frame[features],frame["cnt"]models={"median":DummyRegressor(strategy="median"),"calendar_poisson":make_pipeline(OneHotEncoder(handle_unknown="ignore",sparse_output=False),PoissonRegressor(alpha=1.0,max_iter=1000),),}scores={}forname,modelinmodels.items():model.fit(X[train],y[train])pred=model.predict(X[~train])scores[name]={"MAE":float(mean_absolute_error(y[~train],pred)),"RMSE":float(root_mean_squared_error(y[~train],pred)),}return{"rows":len(frame),"columns":len(frame.columns),"train_rows":int(train.sum()),"test_rows":int((~train).sum()),"features":features,"scores":scores,}

2. 任务A:预测某天的总租赁需求

目标是在该日开始前,用月份、星期、工作日与假日信息估计当日cnt。预测时假设这些日历信息已知;不使用当天实测天气,不把casual和registered作为输入。该任务适合练习总体需求规划问题,输出单位为“次/天”。

# Task A: next-day total demand, using calendar inputs available in advance.calendar=["mnth","weekday","workingday","holiday"]daily_result=evaluate(day,calendar)print("DAILY",json.dumps(daily_result,indent=2))

实际划分为365条训练记录、366条测试记录。结果如下,保留到两位小数:

方法测试MAE,次/天测试RMSE,次/天
训练期中位数2260.842578.75
日历Poisson回归2345.642568.89

日历模型MAE没有赢过简单基线,RMSE略低,不能写成全面提升。这些输入未包含运营规模变化等信息,且没有参数搜索;它们可能限制跨年预测,但本文没有用消融实验证明各因素的贡献,原因分析不能冒充因果结论。

3. 任务B:预测指定小时的租赁需求

使用hour.csv,以小时cnt为目标,在同一日历特征基础上加入目标时段hr。比如计划某日某小时的需求时,小时编号本来就已知;不能加入那个小时结束后才有的分项计数。这是另一种输出粒度的应用任务,仍属于计数回归,不冒充一种新的算法任务类型。

# Task B: an hour's demand, adding the known target hour, not future counts.hourly_result=evaluate(hour,calendar+["hr"])print("HOURLY",json.dumps(hourly_result,indent=2))

实际划分为8,645条训练记录、8,734条测试记录:

方法测试MAE,次/小时测试RMSE,次/小时
训练期中位数176.33243.78
日历Poisson回归118.60171.09

在这个留出切分上,小时模型两项误差都低于中位数基线。但日级与小时级目标单位、范围不同,118.60与2345.64不能拿来直接比较模型优劣。本例也没有通过额外消融,把改善全部归因于小时字段;它只证明当前小时配置优于当前小时基线。

4. 保存复现记录

最后一段写出two-scales-results.json,包含版本、哈希、两任务的划分和分数、样例与原文件体积。它记录的是本文计算,不是UCI榜单。

report={"python":platform.python_version(),"numpy":np.__version__,"pandas":pd.__version__,"sklearn":sklearn.__version__,"zip_bytes":len(raw),"sha256":hashlib.sha256(raw).hexdigest(),"uncompressed_bytes":sizes,"daily":daily_result,"hourly":hourly_result,"daily_first3":json.loads(day[["dteday","mnth","weekday","workingday","cnt"]].head(3).to_json(orient="records",date_format="iso")),"hourly_missing_calendar_slots":int(len(pd.date_range(day.dteday.min(),day.dteday.max()))*24-len(hour)),}Path(__file__).with_name("two-scales-results.json").write_text(json.dumps(report,ensure_ascii=False,indent=2),encoding="utf-8")

六、效果解释与部署建议:别把数据审查误当模型成绩

来源:慧数研析社此前对同一day.csv的实际计算,日级两模型与本次重跑结果一致。前两项为2012年测试误差;第三项为全体日记录casual+registered与cnt的恒等式校验,MAE为0,是把答案加回来,非模型成绩,不能与前两项作同条件性能比较。

如果把这两个分项放进输入,分数可能非常漂亮,但在预测时点它们尚未发生。日期切分不能自动修复这种语义泄漏;改模型也不能让未来信息提前存在。数据集同时适合练习预测与审查,前提是分清两者。

若准备部署,先固定预测提前量、可用日历与天气预报的发布时间,再用训练期滚动验证比较配置。小时应用还需确认缺失时段如何处理,监控新数据的规模变化,并考虑调度业务对高峰误差的容忍度。本文未执行上线、滞后特征、天气预报接入或滚动验证,不提供虚构的部署提升。

七、获取、常见问题与下一步

获取与使用:从文末 UCI 原页下载 ZIP,按顺序运行正文代码。保留作者、数据来源、CC BY 4.0 许可及 Readme 要求的论文引用;先确认该历史聚合数据符合你的用途。本文未上传网盘副本,完整代码无需额外领取。

FAQ:需要账号吗?本文官方 ZIP 下载不需要。能预测站点库存吗?文件没有站点库存字段。小时记录能补零吗?缺少的时段不等于已证实的零需求,应先调查来源。

下一步可在训练期设计滚动验证,再比较更丰富的事前可用特征。你更关心按天规划还是按小时安排?可以从其中一个任务开始,记录字段产生时刻、切分依据和误差,再讨论如何改进。

来源与实测说明

  • UCI Bike Sharing数据卡、字段与许可,访问日期2026-10-28;来源事实与本文原文件统计在信息表中分列。
  • UCI官方ZIP及Readme,本次解析与校验的原始文件;请按其中要求引用论文Event labeling combining ensemble detectors and background knowledge,Hadi Fanaee-T与João Gama。
  • 数据集DOI。
  • scikit-learn PoissonRegressor官方文档,解释模型与参数,不作为本文效果来源。
  • scikit-learn常见陷阱与数据泄漏,训练/测试边界及Pipeline原则。

正文代码已在列明环境实际执行;数值来自本次保存的two-scales-results.json,图表来自同一原始文件的已执行计算。正文由慧数研析社使用AI辅助整理。没有进行线上调度验证。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 6:48:18

陶哲轩实分析第4版有哪些新增内容

陶哲轩《实分析&#xff08;第4版&#xff09;》相比第3版的新增内容&#xff0c;核心集中在主题拓展、生态配套与细节优化三大方向&#xff0c;具体如下&#xff1a; &#x1f4da; 核心高等主题新增 首次在《Analysis I》主卷中加入傅里叶分析入门板块&#xff0c;系统讲解…

作者头像 李华
网站建设 2026/10/30 6:45:28

autoHotKey、windows自动化快捷键工具

文章目录2.0和1.0版本的区别示例-剪映中f1映射右方向键示例-剪映中按f9触发弹框示例-拳皇97站a下b(难)前冲示例-帧数计数器常见用法#(井号)的作用::(双冒号)的作用常用指令注释特殊键有哪些是否支持多开?其他文档autoHotKey是一款windows自动化快捷键工具&#xff0c;有1.0和2…

作者头像 李华
网站建设 2026/10/30 6:45:25

健身器材批发行业客户筛选的技术思路和实践方法

健身器材批发行业的客户筛选&#xff0c;可以用行业和地区组合筛选的思路来实现。刚入行健身器材批发销售&#xff0c;找客户最主要的难点是什么&#xff1f;健身器材批发的客户主要是健身房、健身工作室这类需要采购跑步机、哑铃架的场所&#xff0c;不像写字楼企业那样集中在…

作者头像 李华
网站建设 2026/10/30 6:44:26

实验2:基于TuGraph的Epinions电商信任网络图查询与图算法分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/30 6:40:37

NC|微尺度空间碎片化改变细菌对抗生素的响应

摘要 多数细菌生活在碎片化的微尺度环境中&#xff0c;而抗生素效力通常在充分混合的体系中定义。本研究表明&#xff0c;仅微尺度空间碎片化本身&#xff0c;就能以确定性的方式促进抗生素暴露下的细菌存活。粗粒化理论模型预测&#xff0c;在总体细胞密度和抗生素浓度固定时&…

作者头像 李华