封面慧数研析社原创 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 ID275DOI 10.24432/C5W894页面捐赠日期2013-12-19独立版本号、最近更新时间未说明许可、访问、引用当前数据卡标注CC BY 4.0官方ZIP本次无需账号可下载保留来源、作者与许可按Readme引用相关论文隐私与应用边界本文读取的字段为聚合计数、日期和环境变量没有用户身份、逐车轨迹或站点库存字段这不等于对所有下游使用作隐私合规保证有一处口径冲突必须保留UCI 页面顶部的实例数是17,389ZIP 的 Readme 与本次解析的小时文件均为17,379行。本文采用原文件实读行数日级731行另行核对不把网页摘要数字直接替换成代码的预期结果。ZIP 的校验值写在获取代码中用于识别本次文件不是官方版本号。二、核心优势与限制它的学习价值在哪里这份数据适合用较小的表格材料完整练习从业务粒度、字段理解到预测评估的流程。其特点有四项以下不作缺少同条件证据的“优于所有同类”比较。日级与小时级配套能比较两种需求问题。原始包同时给出day.csv与hour.csv小时文件新增hr。读者既可练习每日总需求也可把目标细化到时段两种误差单位不同不能直接比较分数大小判断哪个模型更强。字段解释可追溯便于决定输入边界。Readme说明了日期、工作日、天气和租赁计数等含义。本文据此挑选预测前可知的日历字段并识别casual、registered是目标组成部分“有字段说明”不代表所有字段都可直接拿来预测。标准CSV降低读取门槛。本次原始ZIP为279,992字节pandas可直接读取无需准备图像解码或深度学习训练流水线。训练演示使用scikit-learn的编码器与回归器不要求GPU不据此承诺具体电脑上的耗时。分项与总量可核对适合训练质量审查习惯。两份文件均可验证casualregisteredcnt并检查主键、缺失和非负计数。这能提供具体审查练习但恒等式成立不等于所有记录都没有采集误差也不是独立标注准确率证明。限制也很明确数据属于较早时期的一个运营系统不能代表今天所有城市聚合记录不能回答逐车路径、站点剩余车辆等问题。历史天气通常是当时的实际观测不能在“未来需求预测”中假装已经拿到当天实测值。本文两个任务只用日历信息结果用于学习不作线上调度效果承诺。三、数据样例先读懂一行代表什么下表为day.csv最前面的三条真实记录仅选取部分字段代码会打印同样的内容。weekday保留原文件编码不自行改成另一套星期编号。dtedaymnthweekdayworkingdaycnt2011-01-011609852011-01-021008012011-01-031111349cnt统计租赁次数不是独立骑行人数。日级每行是一天小时级每行是某天某小时。小时文件的“日期小时”才是本实验使用的记录键不能只按日期去重否则会错误删除同一天的大部分小时记录。四、环境、获取与预处理先让输入可信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-mpipinstallnumpy2.5.4pandas3.1.0 scikit-learn1.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 URLhttps://archive.ics.uci.edu/static/public/275/bikesharingdataset.zipwithurllib.request.urlopen(URL,timeout60)asresponse:rawresponse.read()asserthashlib.sha256(raw).hexdigest()(b70182d0d0508e9abbb79306ce5c0cec34869000f8220175ac83d11dbe845401),File changed: inspect the official source before continuing.withzipfile.ZipFile(io.BytesIO(raw))asarchive:daypd.read_csv(archive.open(day.csv),parse_dates[dteday])hourpd.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()dayday.sort_values(dteday).reset_index(dropTrue)hourhour.sort_values([dteday,hr]).reset_index(dropTrue)print(day[[dteday,mnth,weekday,workingday,cnt]].head(3))2. 为什么这样预处理代码先检查键是否重复、是否有缺失、目标是否非负以及分项能否加回总量然后按日期或“日期小时”排序。此次检查通过因此不额外填补或删行表格也不需要图像缩放、通道转换。机械套用图像增强会改变这里的业务意义。小时文件与完整的731天×24小时网格相比少165个日历时段这是本文按原文件行数计算的差额来源未逐条解释原因。缺少记录不能直接等于零需求本例只对现有记录做评估不自动补零也不声称覆盖完整连续小时序列。两个任务都按2011年训练、2012年测试。独热编码器只在训练集拟合并与模型组成Pipeline避免预处理跨越测试边界。未设置验证集是因为本例不选参数后续调参应在训练期内部划出时间窗口不能反复拿2012年的分数挑配置。来源UCI day.csv慧数研析社实际计算绘图。虚线是本文选择的切分不是官方规定。此图沿用此前同一文件、同一划分的已执行绘图结果。五、两个核心任务从日需求到小时需求1. 共用训练函数先给简单基线留位置每个任务都比较训练期目标中位数与日历Poisson回归。中位数模型回答“不学习日历规律能做到什么”Poisson回归提供非负计数均值的建模示例不要求真实数据严格符合理想Poisson分布也不保证它是最优模型。alpha1.0是本文选择的正则化强度max_iter1000为迭代上限均不是数据集官方推荐参数。月份、星期和小时采用类别编码handle_unknownignore避免未知类别转换时报错但不代表模型学到了该类别的效果。MAE按绝对误差平均RMSE对大误差惩罚更重。# Shared training function: fit both preprocessing and model on 2011 only.defevaluate(frame,features):trainframe[dteday]2012-01-01X,yframe[features],frame[cnt]models{median:DummyRegressor(strategymedian),calendar_poisson:make_pipeline(OneHotEncoder(handle_unknownignore,sparse_outputFalse),PoissonRegressor(alpha1.0,max_iter1000),),}scores{}forname,modelinmodels.items():model.fit(X[train],y[train])predmodel.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_resultevaluate(day,calendar)print(DAILY,json.dumps(daily_result,indent2))实际划分为365条训练记录、366条测试记录。结果如下保留到两位小数方法测试MAE次/天测试RMSE次/天训练期中位数2260.842578.75日历Poisson回归2345.642568.89日历模型MAE没有赢过简单基线RMSE略低不能写成全面提升。这些输入未包含运营规模变化等信息且没有参数搜索它们可能限制跨年预测但本文没有用消融实验证明各因素的贡献原因分析不能冒充因果结论。3. 任务B预测指定小时的租赁需求使用hour.csv以小时cnt为目标在同一日历特征基础上加入目标时段hr。比如计划某日某小时的需求时小时编号本来就已知不能加入那个小时结束后才有的分项计数。这是另一种输出粒度的应用任务仍属于计数回归不冒充一种新的算法任务类型。# Task B: an hours demand, adding the known target hour, not future counts.hourly_resultevaluate(hour,calendar[hr])print(HOURLY,json.dumps(hourly_result,indent2))实际划分为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(orientrecords,date_formatiso)),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_asciiFalse,indent2),encodingutf-8)六、效果解释与部署建议别把数据审查误当模型成绩来源慧数研析社此前对同一day.csv的实际计算日级两模型与本次重跑结果一致。前两项为2012年测试误差第三项为全体日记录casualregistered与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 knowledgeHadi Fanaee-T与João Gama。数据集DOI。scikit-learn PoissonRegressor官方文档解释模型与参数不作为本文效果来源。scikit-learn常见陷阱与数据泄漏训练/测试边界及Pipeline原则。正文代码已在列明环境实际执行数值来自本次保存的two-scales-results.json图表来自同一原始文件的已执行计算。正文由慧数研析社使用AI辅助整理。没有进行线上调度验证。
阅读完成 · 觉得有帮助?